/// <summary> /// 是否有某奖励的位置 /// </summary> public bool hasRewardPlace(int rewardID, int num = 1) { RewardConfig config = RewardConfig.get(rewardID); //没有随机 if (config.randomListID <= 0) { int n = 0; int sMax; foreach (DIntData v in config.items) { if ((sMax = ItemConfig.get(v.key).singlePlusMax) > 0) { n += (v.value * num + sMax - 1) / sMax; } else { n += 1; } } return(hasFreeGrid(n)); } else { return(hasFreeGrid(RewardConfig.get(rewardID).needGrid *num)); } }
/** 判断是否有单个物品位置(核心) */ protected override bool doHasItemPlaceC(int id, int num, ItemData data) { ItemConfig config; if (data != null) { data.makeConfig(); config = data.config; } else { config = ItemConfig.get(id); } //自动使用道具 if (config.type == ItemType.Tool && config.passEnterBag) { return(true); } int totalNum = _itemNums.get(id); //超出总上限 if (config.totalPlusMax > 0 && (totalNum + num) > config.totalPlusMax) { return(false); } return(true); }
protected void onGUIFieldItem() { if (_currentSceneData == null) { return; } GUILayout.Label("物品ID:", GUILayout.Width(60)); _chooseFieldItemIDStr = GUILayout.TextField(_chooseFieldItemIDStr, GUILayout.Width(100)); if (GUILayout.Button("选择物品", GUI.skin.button, GUILayout.Width(60), GUILayout.Height(20))) { int itemID; if (int.TryParse(_chooseFieldItemIDStr, out itemID)) { ItemConfig itemConfig = ItemConfig.get(itemID); if (itemConfig == null) { Ctrl.print("找不到物品数据", itemID); } else { chooseFieldItem(itemConfig); } } else { Ctrl.print("输入错误"); } } }
/// <summary> /// 初始化身份 /// </summary> public void makeConfig() { if (config == null) { config = ItemConfig.get(id); } }
/// <summary> /// 执行使用物品 /// </summary> public void toUseItem(int id, int num, UseItemArgData arg) { int[][] actions; if ((actions = ItemConfig.get(id).useActions) != null) { doItemUseActions(actions, num, arg); } toLogRemoveItem(id, num, CallWayType.UseItem); onItemUse(id, num, null, arg); }
/** 是否有物品位置 */ public bool hasItemPlace(DIntData[] dataArr) { DIntData data; if (dataArr.Length == 1) { data = dataArr[0]; return(hasItemPlace(data.key, data.value)); } _tempDic.clear(); for (int i = 0, len = dataArr.Length; i < len; ++i) { data = dataArr[i]; if (!ensureNum(data.value)) { _tempDic.clear(); return(false); } //有必要 if (ItemConfig.get(data.key).totalPlusMax > 0) { _tempDic.put(data.key, data.value); } } if (!_tempDic.isEmpty()) { ItemConfig config; foreach (var kv in _tempDic.entrySet()) { config = ItemConfig.get(kv.key); //超出总上限 if ((getItemNum(kv.key) + kv.value) > config.totalPlusMax) { return(false); } } } return(hasFreeGrid(dataArr.Length)); }
/** 是否有物品位置 */ public bool hasItemPlace(SList <ItemData> list) { if (list.size() == 1) { return(hasItemPlace(list.get(0))); } _tempDic.clear(); ItemData[] values = list.getValues(); ItemData data; for (int i = 0, len = list.size(); i < len; ++i) { data = values[i]; if (!ensureNum(data.num)) { _tempDic.clear(); return(false); } //有必要 if (ItemConfig.get(data.id).totalPlusMax > 0) { _tempDic.put(data.id, data.num); } } if (!_tempDic.isEmpty()) { ItemConfig config; foreach (var kv in _tempDic.entrySet()) { config = ItemConfig.get(kv.key); //超出总上限 if ((getItemNum(kv.key) + kv.value) > config.totalPlusMax) { return(false); } } } return(hasFreeGrid(list.size())); }
/// <summary> /// 创建物品数据 /// </summary> public ItemData createItem(int id, int num) { ItemConfig config = ItemConfig.get(id); ItemData data = createItemByType(config.type); data.id = id; data.num = num; data.config = config; //失效时间 data.disableTime = config.enableTimeT.getNextTime(); //额外初始化 BaseC.logic.initItem(data, id); return(data); }
/** 创建物品数据(如id<=0则为空) */ public ItemData createItem(int id, int num) { if (id <= 0) { return(null); } ItemConfig config = ItemConfig.get(id); ItemData data = GameC.pool.createItemData(config.type); data.initIdentityByType(config.type); data.id = id; data.num = num; data.config = config; //失效时间 data.disableTime = config.enableTimeT.getNextTime(); //额外初始化 initItem(data, id); return(data); }
private void makeElementModel(SceneElementEditorData data) { switch (data.config.type) { case SceneElementType.Npc: { } break; case SceneElementType.Monster: { MonsterConfig monsterConfig = MonsterConfig.get(data.config.id); data.gameObject = createModel(FightUnitConfig.get(monsterConfig.fightUnitID).modelID, data); } break; case SceneElementType.Operation: { OperationConfig operationConfig = OperationConfig.get(data.config.id); data.gameObject = createModel(operationConfig.modelID, data); } break; case SceneElementType.FieldItem: { ItemConfig itemConfig = ItemConfig.get(data.config.id); data.gameObject = createModel(itemConfig.fieldItemModelID, data); } break; } setPosToGameObject(data); }
/** 执行添加一个物品(核心) */ protected override bool doAddItemC(int id, int num, ItemData data) { ItemConfig config; if (data != null) { data.makeConfig(); config = data.config; } else { config = ItemConfig.get(id); } if (config.type == ItemType.Tool && config.passEnterBag) { _operateRecordAddListForAutoUse.add2(id, num); return(true); } ItemRecordData rData = getRecordDataAbs(id); //超出总上限 if (config.totalPlusMax > 0 && (rData.num + num) > config.totalPlusMax) { return(false); } //是否单个叠加 bool isSingleOne = config.singlePlusMax == 1; //是否绑定 bool isBind = config.bindByGet || (data != null && data.isBind); //失效时间 long disableTime = config.enableTimeT == null ? -1L : (data != null ? data.disableTime : config.enableTimeT.getNextTime()); int itemPos; int index = -1; int tempIndex; ItemData tData; int dNum; while (true) { //单个叠加 if (isSingleOne) { if (isGridFull()) { return(false); } index = _nextFreeGridIndex; tData = null; } else { //没找到添加位置 if ((itemPos = rData.addIndex) == -1) { if (isGridFull()) { return(false); } index = _nextFreeGridIndex; tData = null; } else { //新值 if (index < itemPos) { index = itemPos; } //找不到添加位置 if ((tempIndex = findNextItemAddPos(id, index, isBind, disableTime, data)) == -1) { if (isGridFull()) { return(false); } index = _nextFreeGridIndex; tData = null; } else { tData = _list.get(index = tempIndex); } } } //要叠加 if (tData != null) { //装的下 if (config.singlePlusMax <= 0 || (dNum = (config.singlePlusMax - tData.num)) >= num) { dNum = num; num = 0; } else { num -= dNum; } tData.num += dNum; //计数加 //操作记录 _operateRecordList.add2(index, dNum); doAddItemPartial(index, rData, dNum, tData); //完了 if (num == 0) { return(true); } } //新位置 else { //单包上限都超的 if (config.singlePlusMax > 0 && num > config.singlePlusMax) { dNum = config.singlePlusMax; num -= dNum; } else { dNum = num; num = 0; } //最后的一次加 if (data != null && num == 0 && isSingleOne) { tData = data; tData.num = dNum; //数目再赋值 } else { tData = createItemByType(config.type); tData.id = id; tData.num = dNum; tData.config = config; tData.canRelease = true; //标记可回收 //额外初始化 BaseC.logic.initItem(tData, id); } //赋值 tData.isBind = isBind; tData.disableTime = disableTime; _operateRecordList.add2(index, dNum); doAddItemNew(index, rData, dNum, tData); //完了 if (num == 0) { return(true); } } } }
/** 判断是否有单个物品位置(核心) */ protected override bool doHasItemPlaceC(int id, int num, ItemData data) { ItemConfig config; if (data != null) { data.makeConfig(); config = data.config; } else { config = ItemConfig.get(id); } ItemRecordData rData = getRecordData(id); //自动使用道具 if (config.type == ItemType.Tool && config.passEnterBag) { return(true); } //超出总上限 if (config.totalPlusMax > 0 && ((rData != null ? rData.num : 0) + num) > config.totalPlusMax) { return(false); } //无上限 if (_gridNum <= 0) { return(true); } //超单个上限的 if (config.singlePlusMax > 0 && num >= config.singlePlusMax) { int needGridNum = (int)Mathf.Ceil((float)num / config.singlePlusMax); return(needGridNum <= doGetFreeGridNum()); } //有空余格子 if (!isGridFull()) { return(true); } if (config.singlePlusMax == 1 || config.enableTimeT != null) { return(false); } int itemPos = rData != null ? rData.addIndex : -1; //没找到添加位置 if (itemPos == -1) { return(false); } else { ItemData tData = _list.get(itemPos); //是否绑定 bool isBind = config.bindByGet || (data != null && data.isBind); if (tData.isBind != isBind) { return(false); } if (config.singlePlusMax <= 0) { return(true); } return(config.singlePlusMax - tData.num >= num); } }
/// <summary> /// 读完所有表后处理 /// </summary> public static void afterReadConfigAll() { if (_dic == null) { return; } RandomItemListConfig[] values; RandomItemListConfig v; for (int i = (values = _dic.getValues()).Length - 1; i >= 0; --i) { if ((v = values[i]) != null) { switch (v.type) { case RandomItemListType.SingleItem: { int itemID = v.args[0][0]; if (itemID > 0 && ItemConfig.get(itemID) == null) { Ctrl.throwError("找不到物品ID", itemID); return; } } break; case RandomItemListType.SingleRandomItem: { int randomItemID = v.args[0][0]; if (randomItemID > 0 && RandomItemConfig.get(randomItemID) == null) { Ctrl.throwError("找不到随机物品ID", randomItemID); return; } } break; case RandomItemListType.SumProbRandomItem: { foreach (int[] v2 in v.args) { if (v2[1] > 0 && RandomItemConfig.get(v2[1]) == null) { Ctrl.throwError("找不到随机物品ID", v2[1]); return; } } } break; case RandomItemListType.WeightRandomList: { foreach (int[] v2 in v.args) { if (v2[1] > 0 && RandomItemListConfig.get(v2[1]) == null) { Ctrl.throwError("找不到随机物品组ID", v2[1]); return; } } } break; } //直接算出统计 v.getNeedGridNum(); } } }
/// <summary> /// 重载配置 /// </summary> public void reloadConfig() { config = ItemConfig.get(id); }
/** 执行添加一个物品(核心) */ protected override bool doAddItemC(int id, int num, ItemData data) { ItemConfig config; if (data != null) { data.makeConfig(); config = data.config; } else { config = ItemConfig.get(id); } if (config.type == ItemType.Tool && config.passEnterBag) { _operateRecordAddListForAutoUse.add2(id, num); return(true); } int totalNum = _itemNums.get(id); //超出总上限 if (config.totalPlusMax > 0 && (totalNum + num) > config.totalPlusMax) { return(false); } //是否单个叠加 bool isSingleOne = config.singlePlusMax == 1; //是否绑定 bool isBind = config.bindByGet || (data != null && data.isBind); //失效时间 long disableTime = data != null ? data.disableTime : config.enableTimeT.getNextTime(); int itemPos; int index = -1; int tempIndex; ItemData tData; int dNum; IntObjectMap <ItemData> itemDic = getItemDicByIDAbs(id); //非单个 if (!isSingleOne) { ItemData[] values; ItemData v; for (int i = (values = itemDic.getValues()).Length - 1; i >= 0; --i) { if ((v = values[i]) != null) { //满足叠加规则 if (!v.isSingleNumMax() && v.isBind == isBind && v.disableTime == disableTime && (data == null || canPlusEx(v, data))) { //装的下 if (config.singlePlusMax <= 0 || (dNum = (config.singlePlusMax - v.num)) >= num) { dNum = num; num = 0; } else { num -= dNum; } v.num += dNum; //计数加 //序号 index = v.index; //操作记录 _operateRecordList.add2(index, dNum); doAddItemPartial(index, dNum, v); //完了 if (num == 0) { return(true); } } } } } if (num > 0) { while (true) { //单包上限都超的 if (config.singlePlusMax > 0 && num > config.singlePlusMax) { dNum = config.singlePlusMax; num -= dNum; } else { dNum = num; num = 0; } //最后的一次加,或者新添加,并且单个叠加的才可直接使用原数据 if (data != null && num == 0 && isSingleOne) { tData = data; tData.num = dNum; //数目再赋值 } else { tData = createItemByType(config.type); tData.id = id; tData.num = dNum; tData.config = config; tData.canRelease = true; //标记可回收 //额外初始化 BaseC.logic.initItem(tData, id); } //获得新序号 index = tData.index = getNewIndex(); //赋值 tData.isBind = isBind; tData.disableTime = disableTime; _operateRecordList.add2(index, dNum); doAddItemNew(index, dNum, tData); //完了 if (num == 0) { return(true); } } } return(true); }
/// <summary> /// 读完所有表后处理 /// </summary> public static void afterReadConfigAll() { if (_dic == null) { return; } RandomItemConfig[] values; RandomItemConfig v; for (int i = (values = _dic.getValues()).Length - 1; i >= 0; --i) { if ((v = values[i]) != null) { switch (v.type) { case RandomItemType.Single: { int itemID = v.args[0][0]; if (itemID > 0 && ItemConfig.get(itemID) == null) { Ctrl.throwError("找不到物品ID", itemID); return; } } break; case RandomItemType.AverageItem: { foreach (int[] v2 in v.args) { if (v2[0] > 0 && ItemConfig.get(v2[0]) == null) { Ctrl.throwError("找不到物品ID", v2[0]); return; } } } break; case RandomItemType.WeightItem: { foreach (int[] v2 in v.args) { if (v2[1] > 0 && ItemConfig.get(v2[1]) == null) { Ctrl.throwError("找不到物品ID", v2[1]); return; } } } break; case RandomItemType.WeightCreateItem: { foreach (int[] v2 in v.args) { if (v2[1] > 0 && CreateItemConfig.get(v2[1]) == null) { Ctrl.throwError("找不到创建物品ID", v2[1]); return; } } } break; case RandomItemType.WeightRandomItem: { foreach (int[] v2 in v.args) { if (v2[1] > 0 && RandomItemConfig.get(v2[1]) == null) { Ctrl.throwError("找不到随机物品ID", v2[1]); return; } } } break; } } } }
//--主显示部分--// /** 初始化主显示 */ protected virtual void initMainShow() { bool hasModel = false; if (_data.avatar != null && _data.avatar.modelID > 0) { hasModel = true; setModel(_data.avatar.modelID); _data.avatar.parts.forEach((k, v) => { setPart(k, _unit.avatar.getShowPart(k)); }); } if (BaseC.constlist.unit_canFight(_data.identity.type)) { int fightUnitID = _data.getFightIdentity().getFightUnitID(); if (fightUnitID > 0) { FightUnitConfig fConfig = FightUnitConfig.get(fightUnitID); if (!hasModel && fConfig.modelID > 0) { setModel(fConfig.modelID); } if (fConfig.effectID > 0) { addEffect(fConfig.effectID); } } } //特殊的 switch (_unit.type) { case UnitType.SceneEffect: { SceneEffectIdentityData iData = _data.getSceneEffectIdentity(); if (iData.signedEffectID > 0) { addOrPlayEffect(iData.signedEffectID); } else { SceneEffectConfig config = SceneEffectConfig.get(((SceneEffectIdentityData)_data.identity).signedEffectID); if (config.modelID > 0) { setModel(config.modelID); } if (config.effectID > 0) { addOrPlayEffect(config.effectID); } } } break; case UnitType.FieldItem: { FieldItemIdentityData iData = (FieldItemIdentityData)_data.identity; ItemConfig itemConfig = ItemConfig.get(iData.item.id); if (itemConfig.fieldItemModelID > 0) { setModel(itemConfig.fieldItemModelID); } } break; } }