/// <summary> /// 将资源配置字符串转化为游戏资源列表(GameResourceTypeSub,ModelID,Count||GameResourceTypeSub,ModelID,Count||GameResourceTypeSub,ModelID,Count) /// </summary> /// <param name="strGameResource">资源配置字符串</param> /// <param name="isLock">是否锁定创建的资源</param> /// <returns>游戏资源列表</returns> public static List <GameResourceObject> ConvertToGameResourceObject(String strGameResource, Boolean isLock = true) { // 检查输入字符串 if (String.IsNullOrEmpty(strGameResource)) { throw new Exception("参数为空"); } // 将字符串切割 var strArray = StringUtil.Split(strGameResource, new String[] { ",", "||" }); // 判断数量是否足够 if (strArray.Length % 3 != 0) { throw new Exception($"参数{strGameResource}的格式不正确"); } // 处理切割后的字符串 var gameResourceList = new List <GameResourceObject>(strArray.Length / 3); for (Int32 i = 0; i < strArray.Length; i += 3) { // 取出对应的值 var resourceTypeSub = 0; var modelId = 0; var count = 0; if (ConvertUtil.TryParseToInt32(strArray[i], out resourceTypeSub) == false || ConvertUtil.TryParseToInt32(strArray[i + 1], out modelId) == false || ConvertUtil.TryParseToInt32(strArray[i + 2], out count) == false ) { throw new Exception($"参数{strGameResource}的格式不正确"); } // 判断数量是否正确 if (count == 0) { throw new Exception($"数量:{count}不正确"); } // 判断模型数据是否存在,此处不用throw,因为内部会进行throw if (IfGameResourceModelExists((ResourceTypeSubEnum)resourceTypeSub, modelId) == false) { throw new Exception($"资源类型对应的模型不存在,ResourceType={resourceTypeSub.ToString()},ModelId={modelId}"); } // 构造对象,并添加到列表中 var gameResourceObject = new GameResourceObject((ResourceTypeSubEnum)resourceTypeSub, modelId, count, isLock); gameResourceList.Add(gameResourceObject); } return(gameResourceList); }
/// <summary> /// 组装消耗数据的实体id /// </summary> /// <param name="player">玩家对象</param> /// <param name="obj">要组装的消耗资源</param> /// <param name="consumeIds">要消耗的实体id</param> /// <returns>组装之后的资源</returns> internal virtual List <GameResourceObject> BuildConsumeResource(Player player, GameResourceObject obj, Guid[] consumeIds) { throw new Exception($"未实现的资源组装。ResourceTypeSub={obj.ResourceTypeSub.ToString()}"); }
/// <summary> /// 获取可以消耗的资源 /// </summary> /// <param name="player">玩家对象</param> /// <param name="obj">要组装的消耗资源</param> /// <returns>组装之后的资源</returns> internal abstract List <GameResourceObject> BuildCanConsumeResource(Player player, GameResourceObject obj);
/// <summary> /// 资源是否足够 /// </summary> /// <param name="player">玩家对象</param> /// <param name="obj">资源对象</param> /// <returns>ture:足够,反之不足够(最好换成自己的错误码,提示更准确的信息)</returns> internal abstract Boolean IsEnough(Player player, GameResourceObject obj);
/// <summary> /// 组装客户端数据 /// </summary> /// <param name="player">玩家对象</param> /// <param name="obj">资源对象</param> /// <returns>组装客服端数据</returns> internal abstract Dictionary <String, Object> AssembleToClient(Player player, GameResourceObject obj);