public GoodsAbility(EnumGoodsAbility abilityKind, int val, string explain) { this.AbilibityKind = abilityKind; this.Value = val; this.Explain = explain; }
/// <summary> /// 创建物品并将物品保存到存档中 /// </summary> /// <param name="playerState"></param> /// <param name="goodsMetaInfoMations"></param> /// <param name="baseGoodsType"></param> /// <param name="minQuality"></param> /// <param name="maxQuality"></param> /// <param name="count"></param> /// <returns></returns> public static PlayGoods CreatePlayGoodsAddToPlayData(PlayerState playerState, GoodsMetaInfoMations goodsMetaInfoMations, EnumGoodsType baseGoodsType, EnumQualityType minQuality, EnumQualityType maxQuality, int count) { PlayGoods playGoods = new PlayGoods(); Goods addGoods = goodsMetaInfoMations[baseGoodsType].Clone(true);//获取需要添加物品的原始属性 //如果是道具或炼金物品则可以叠加,但是没有品质 if (baseGoodsType > EnumGoodsType.Item && baseGoodsType < EnumGoodsType.SpecialItem) { int addGoodsID = playerState.PlayerAllGoods.Where(temp => temp.GoodsInfo.EnumGoodsType == baseGoodsType).Select(temp => temp.ID).FirstOrDefault(); if (addGoodsID == 0) { addGoodsID = NowTimeToID.GetNowID(DataCenter.Instance.GetEntity <GameRunnedState>()); playGoods = new PlayGoods(addGoodsID, addGoods, GoodsLocation.Package); playGoods.Count = count; playGoods.QualityType = EnumQualityType.White; playerState.PlayerAllGoods.Add(playGoods); } else { playGoods.Count += count; } } else { int addGoodsID = NowTimeToID.GetNowID(DataCenter.Instance.GetEntity <GameRunnedState>()); EnumQualityType qualityType = (EnumQualityType)UnityEngine.Random.Range((int)minQuality, (int)maxQuality + 1); float minRate = ((int)qualityType) * 0.2f + 0.8f; float maxRate = minRate + 0.2f; // 根据品质设置属性 if (qualityType != EnumQualityType.Red)//如果是唯一的则不用改变属性 { //将所有属性随机(根据品质) addGoods.goodsAbilities.ForEach(temp => { float min = temp.Value * minRate; float max = temp.Value * maxRate; temp.Value = (int)UnityEngine.Random.Range(min, max); }); //取出用于分割固定属性以及随机属性的条目 GoodsAbility goodsAbility_nothing = addGoods.goodsAbilities.FirstOrDefault(temp => temp.AbilibityKind == EnumGoodsAbility.Nothing); int index = -1; if (goodsAbility_nothing != null) { index = addGoods.goodsAbilities.IndexOf(goodsAbility_nothing); } //存在分割属性 if (index > -1 && index + 1 < addGoods.goodsAbilities.Count) { //取出分割项后的可变项 List <EnumGoodsAbility> randomAbilitys = Enumerable.Range(index + 1, addGoods.goodsAbilities.Count - index - 1). Select(temp => addGoods.goodsAbilities[temp]).Select(temp => temp.AbilibityKind).ToList(); int saveAbilityCount = (int)qualityType;//可保留的属性 while (randomAbilitys.Count > saveAbilityCount) { int removeIndex = UnityEngine.Random.Range(0, randomAbilitys.Count); EnumGoodsAbility removeGoodsAbility = randomAbilitys[removeIndex]; addGoods.goodsAbilities.RemoveAll(temp => temp.AbilibityKind == removeGoodsAbility); randomAbilitys.RemoveAt(removeIndex); } } addGoods.goodsAbilities.RemoveAll(temp => temp.AbilibityKind == EnumGoodsAbility.Nothing); playGoods = new PlayGoods(addGoodsID, addGoods, GoodsLocation.Package); playGoods.QualityType = qualityType; playGoods.Count = 1; playerState.PlayerAllGoods.Add(playGoods); } } return(playGoods); }
/// <summary> /// 更新商人的道具 /// </summary> protected void UpdateBusinessman() { //获取当前商人 businessman = businessmanStates.BusinessmanList.FirstOrDefault(temp => temp.BusinessmanID == iInteractiveState.ClickInteractiveNPCID && string.Equals(iGameState.SceneName, temp.BusinessmanScene)); NPCDataInfo npcDataInfo = npcData.GetNPCDataInfo(iGameState.SceneName, iInteractiveState.ClickInteractiveNPCID); if (businessman == null && npcDataInfo != null) { businessman = new Businessman(); businessman.BusinessManDataInfo = BusinessmanDataInfo.DeSerializeNow <BusinessmanDataInfo>(npcDataInfo.OtherValue); businessman.BusinessmanID = iInteractiveState.ClickInteractiveNPCID; businessman.BusinessmanScene = iGameState.SceneName; businessmanStates.BusinessmanList.Add(businessman); } if (businessman != null) { #region 刷新商品 //如果商人的基础道具不足则刷新 EnumGoodsType[] baseGoodsTypes = businessman.BusinessManDataInfo.GoodsDic.Select(temp => temp.Key).ToArray();//商人基础的物品 foreach (EnumGoodsType baseGoodsType in baseGoodsTypes) { //如果不存在该物品则添加 if (businessman.BaseList.FirstOrDefault(temp => temp.GoodsInfo.EnumGoodsType == baseGoodsType) == null) { Goods addGoods = goodsMetaInfoMations[baseGoodsType].Clone(true);//获取需要添加物品的原始属性 BusinessmanDataInfo.GoodsDataInfoInner mustAddDataInfoInner = businessman.BusinessManDataInfo.GoodsDic[baseGoodsType]; EnumQualityType qualityTypeMin = mustAddDataInfoInner.MinQualityType; EnumQualityType qualityTypeMax = mustAddDataInfoInner.MaxQualityType; int count = mustAddDataInfoInner.Count; //如果是道具或炼金物品则可以叠加,但是没有品质 if (baseGoodsType > EnumGoodsType.Item && baseGoodsType < EnumGoodsType.SpecialItem) { //尝试从玩家道具中获取id,如果没有则新建一个(这个id并没有什么卵用) int addGoodsID = playerState.PlayerAllGoods.Where(temp => temp.GoodsInfo.EnumGoodsType == baseGoodsType).Select(temp => temp.ID).FirstOrDefault(); if (addGoodsID == 0) { addGoodsID = NowTimeToID.GetNowID(DataCenter.Instance.GetEntity <GameRunnedState>()); } PlayGoods playGoods = new PlayGoods(addGoodsID, addGoods, GoodsLocation.None); playGoods.QualityType = EnumQualityType.White; playGoods.Count = count; businessman.BaseList.Add(playGoods); } //如果不是道具和炼金物品则不可以叠加,但是存在品质 else { int addGoodsID = NowTimeToID.GetNowID(DataCenter.Instance.GetEntity <GameRunnedState>()); EnumQualityType qualityType = (EnumQualityType)UnityEngine.Random.Range((int)qualityTypeMin, (int)qualityTypeMax + 1); // 根据品质设置属性 if (qualityType != EnumQualityType.Red)//如果是唯一的则不用改变属性 { float minRate = ((int)qualityType) * 0.2f + 0.8f; float maxRate = minRate + 0.2f; //将所有属性随机 addGoods.goodsAbilities.ForEach(temp => { float min = temp.Value * minRate; float max = temp.Value * maxRate; temp.Value = (int)UnityEngine.Random.Range(min, max); }); //取出用于分割固定属性以及随机属性的条目 GoodsAbility goodsAbility_nothing = addGoods.goodsAbilities.FirstOrDefault(temp => temp.AbilibityKind == EnumGoodsAbility.Nothing); int index = -1; if (goodsAbility_nothing != null) { index = addGoods.goodsAbilities.IndexOf(goodsAbility_nothing); } //存在分割属性 if (index > -1 && index + 1 < addGoods.goodsAbilities.Count) { //取出分割项后的可变项 List <EnumGoodsAbility> randomAbilitys = Enumerable.Range(index + 1, addGoods.goodsAbilities.Count - index - 1). Select(temp => addGoods.goodsAbilities[temp]).Select(temp => temp.AbilibityKind).ToList(); int saveAbilityCount = (int)qualityType;//可保留的属性 while (randomAbilitys.Count > saveAbilityCount) { int removeIndex = UnityEngine.Random.Range(0, randomAbilitys.Count); EnumGoodsAbility removeGoodsAbility = randomAbilitys[removeIndex]; addGoods.goodsAbilities.RemoveAll(temp => temp.AbilibityKind == removeGoodsAbility); randomAbilitys.RemoveAt(removeIndex); } } } addGoods.goodsAbilities.RemoveAll(temp => temp.AbilibityKind == EnumGoodsAbility.Nothing); //-------------------- PlayGoods playGoods = new PlayGoods(addGoodsID, addGoods, GoodsLocation.None); playGoods.QualityType = qualityType; playGoods.Count = 1; businessman.BaseList.Add(playGoods); } } } #endregion } }
public override void ActionTrigger() { base.ActionTrigger(); if (!treasureBoxState) { //触发宝箱 treasureBoxState = true; if (animator != null) { animator.SetBool("TreasureBox", treasureBoxState); } //保存状态 SaveDataAction(true); //发放道具 Dictionary <EnumGoodsType, ActionInteractiveDataInfo.TreasureBoxStruct> dataDic = ActionInteractiveDataInfo.OtherValue as Dictionary <EnumGoodsType, ActionInteractiveDataInfo.TreasureBoxStruct>; if (dataDic != null) { //实例化数据并填入存档中 GoodsMetaInfoMations goodsMetaInfoMations = DataCenter.Instance.GetMetaData <GoodsMetaInfoMations>(); PlayerState playerState = DataCenter.Instance.GetEntity <PlayerState>(); foreach (KeyValuePair <EnumGoodsType, ActionInteractiveDataInfo.TreasureBoxStruct> data in dataDic) { EnumGoodsType baseGoodsType = data.Key; EnumQualityType qualityTypeMin = data.Value.MinQualityType; EnumQualityType qualityTypeMax = data.Value.MaxQualityType; Goods addGoods = goodsMetaInfoMations[baseGoodsType].Clone(true);//获取需要添加物品的原始属性 //如果是道具或炼金物品则可以叠加,但是没有品质 if (baseGoodsType > EnumGoodsType.Item && baseGoodsType < EnumGoodsType.SpecialItem) { //尝试从玩家道具中获取id,如果没有则新建一个(这个id并没有什么卵用) int addGoodsID = playerState.PlayerAllGoods.Where(temp => temp.GoodsInfo.EnumGoodsType == baseGoodsType).Select(temp => temp.ID).FirstOrDefault(); if (addGoodsID == 0) { addGoodsID = NowTimeToID.GetNowID(DataCenter.Instance.GetEntity <GameRunnedState>()); PlayGoods playGoods = new PlayGoods(addGoodsID, addGoods, GoodsLocation.Package); playGoods.QualityType = EnumQualityType.White; playGoods.Count = data.Value.Count; playerState.PlayerAllGoods.Add(playGoods); } else { PlayGoods playGoods = playerState.PlayerAllGoods.FirstOrDefault(temp => temp.ID == addGoodsID); playGoods.Count += data.Value.Count; } } //如果不是道具和炼金物品则不可以叠加,但是存在品质 else { int addGoodsID = NowTimeToID.GetNowID(DataCenter.Instance.GetEntity <GameRunnedState>()); EnumQualityType qualityType = (EnumQualityType)UnityEngine.Random.Range((int)qualityTypeMin, (int)qualityTypeMax + 1); // 根据品质设置属性 if (qualityType != EnumQualityType.Red)//如果是唯一的则不用改变属性 { //将所有属性随机 addGoods.goodsAbilities.ForEach(temp => { float min = temp.Value * 0.8f; float max = temp.Value * 1.2f; temp.Value = (int)UnityEngine.Random.Range(min, max); }); //取出用于分割固定属性以及随机属性的条目 GoodsAbility goodsAbility_nothing = addGoods.goodsAbilities.FirstOrDefault(temp => temp.AbilibityKind == EnumGoodsAbility.Nothing); int index = -1; if (goodsAbility_nothing != null) { index = addGoods.goodsAbilities.IndexOf(goodsAbility_nothing); } //存在分割属性 if (index > -1 && index + 1 < addGoods.goodsAbilities.Count) { //取出分割项后的可变项 List <EnumGoodsAbility> randomAbilitys = Enumerable.Range(index + 1, addGoods.goodsAbilities.Count - index - 1). Select(temp => addGoods.goodsAbilities[temp]).Select(temp => temp.AbilibityKind).ToList(); int saveAbilityCount = (int)qualityType;//可保留的属性 while (randomAbilitys.Count > saveAbilityCount) { int removeIndex = UnityEngine.Random.Range(0, randomAbilitys.Count); EnumGoodsAbility removeGoodsAbility = randomAbilitys[removeIndex]; addGoods.goodsAbilities.RemoveAll(temp => temp.AbilibityKind == removeGoodsAbility); randomAbilitys.RemoveAt(removeIndex); } } } addGoods.goodsAbilities.RemoveAll(temp => temp.AbilibityKind == EnumGoodsAbility.Nothing); PlayGoods playGoods = new PlayGoods(addGoodsID, addGoods, GoodsLocation.Package); playGoods.QualityType = qualityType; playGoods.Count = 1; playerState.PlayerAllGoods.Add(playGoods); } } } } }