命格脚本优化

back_recharge
yuanshuai 2021-12-10 09:55:51 +08:00
parent b8de907745
commit 9060e00553
1 changed files with 154 additions and 145 deletions

View File

@ -35,84 +35,84 @@ public class LifeStoneUpRequestHandler extends BaseHandler<HeroInfoProto.LifeSto
public void processWithProto(ISession session, HeroInfoProto.LifeStoneUpRequest proto) throws Exception { public void processWithProto(ISession session, HeroInfoProto.LifeStoneUpRequest proto) throws Exception {
int uid = session.getUid(); int uid = session.getUid();
User user = UserManager.getUser(uid); User user = UserManager.getUser(uid);
int type= proto.getType(); int type = proto.getType();
Map<Integer, Long>costItemMap=new HashMap<>(); Map<Integer, Long> costItemMap = new HashMap<>();
Map<Integer, Long>addItemMap=new HashMap<>(); Map<Integer, Long> addItemMap = new HashMap<>();
int equipLifeStoneId=0; int equipLifeStoneId = 0;
ItemManager itemManager=user.getItemManager(); ItemManager itemManager = user.getItemManager();
//操作类型 1:批量合成 2:一键合成 3:命石单个合成 4:快速合成 //操作类型 1:批量合成 2:一键合成 3:命石单个合成 4:快速合成
if (type==1) { if (type == 1) {
int itemId=proto.getCurGemId(); int itemId = proto.getCurGemId();
int itemNum=proto.getSelectNum(); int itemNum = proto.getSelectNum();
SGemConfig gemConfig=STableManager.getConfig(SGemConfig.class).get(itemId); SGemConfig gemConfig = STableManager.getConfig(SGemConfig.class).get(itemId);
long upNum=itemNum/gemConfig.getUpgradeNum(); long upNum = itemNum / gemConfig.getUpgradeNum();
long costGold=upNum*gemConfig.getUpgradeCost()[1]; long costGold = upNum * gemConfig.getUpgradeCost()[1];
costItemMap.put(gemConfig.getUpgradeCost()[0],costGold); costItemMap.put(gemConfig.getUpgradeCost()[0], costGold);
costItemMap.put(itemId,(long)itemNum); costItemMap.put(itemId, (long) itemNum);
addItemMap.put(gemConfig.getNextGem(),upNum); addItemMap.put(gemConfig.getNextGem(), upNum);
}else if(type==2){ } else if (type == 2) {
for (Map.Entry<Integer, TreeMap<Integer, SGemConfig>> integerTreeMapEntry : SGemConfig.gemConfigMapByType.entrySet()) { for (Map.Entry<Integer, TreeMap<Integer, SGemConfig>> integerTreeMapEntry : SGemConfig.gemConfigMapByType.entrySet()) {
boolean isCost=LifeStoneAllUp(itemManager,integerTreeMapEntry.getValue(),costItemMap,addItemMap); boolean isCost = LifeStoneAllUp(itemManager, integerTreeMapEntry.getValue(), costItemMap, addItemMap);
if (!isCost) { if (!isCost) {
break; break;
} }
} }
}else if (type==3){ } else if (type == 3) {
int itemId=proto.getCurGemId(); int itemId = proto.getCurGemId();
int itemNum=proto.getSelectNum(); int itemNum = proto.getSelectNum();
SGemConfig gemConfig=STableManager.getConfig(SGemConfig.class).get(itemId); SGemConfig gemConfig = STableManager.getConfig(SGemConfig.class).get(itemId);
costItemMap.put(gemConfig.getUpgradeCost()[0],(long)gemConfig.getUpgradeCost()[1]); costItemMap.put(gemConfig.getUpgradeCost()[0], (long) gemConfig.getUpgradeCost()[1]);
if (proto.getGridId()>0){ if (proto.getGridId() > 0) {
costItemMap.put(itemId,(long)itemNum); costItemMap.put(itemId, (long) itemNum);
equipLifeStoneId=gemConfig.getNextGem(); equipLifeStoneId = gemConfig.getNextGem();
}else{ } else {
costItemMap.put(itemId,(long)itemNum+1); costItemMap.put(itemId, (long) itemNum + 1);
addItemMap.put(gemConfig.getNextGem(),1L); addItemMap.put(gemConfig.getNextGem(), 1L);
} }
}else if (type==4){ } else if (type == 4) {
SGemConfig gemConfig=STableManager.getConfig(SGemConfig.class).get(proto.getCurGemId()); SGemConfig gemConfig = STableManager.getConfig(SGemConfig.class).get(proto.getCurGemId());
TreeMap<Integer,SGemConfig>gemConfigMap=SGemConfig.gemConfigMapByType.get(gemConfig.getType()); TreeMap<Integer, SGemConfig> gemConfigMap = SGemConfig.gemConfigMapByType.get(gemConfig.getType());
if (LifeStoneQuickUp(itemManager,gemConfigMap,costItemMap,gemConfig.getLevel())) { if (LifeStoneQuickUp(itemManager, gemConfigMap, costItemMap, gemConfig.getLevel())) {
int[]curUpCost=gemConfig.getUpgradeCost(); int[] curUpCost = gemConfig.getUpgradeCost();
long allGoldCost= costItemMap.get(curUpCost[0])+curUpCost[1]; long allGoldCost = costItemMap.get(curUpCost[0]) + curUpCost[1];
costItemMap.put(curUpCost[0],allGoldCost); costItemMap.put(curUpCost[0], allGoldCost);
if (proto.getGridId()>0){ if (proto.getGridId() > 0) {
equipLifeStoneId=gemConfig.getNextGem(); equipLifeStoneId = gemConfig.getNextGem();
}else { } else {
addItemMap.put(gemConfig.getNextGem(),1L); addItemMap.put(gemConfig.getNextGem(), 1L);
costItemMap.put(proto.getCurGemId(),1L); costItemMap.put(proto.getCurGemId(), 1L);
} }
}else{ } else {
LOGGER.error("命石合成材料不足"); LOGGER.error("命石合成材料不足");
throw new ErrorCodeException(ErrorCode.HANDLE_FAILED); throw new ErrorCodeException(ErrorCode.HANDLE_FAILED);
} }
} }
if (costItemMap.isEmpty()){ if (costItemMap.isEmpty()) {
LOGGER.error("命石合成异常,请联系后端"); LOGGER.error("命石合成异常,请联系后端");
throw new ErrorCodeException(ErrorCode.HANDLE_FAILED); throw new ErrorCodeException(ErrorCode.HANDLE_FAILED);
} }
boolean isTrue= ItemUtil.itemCostLong(user,costItemMap,BIReason.LIFE_STONE_UP,type); boolean isTrue = ItemUtil.itemCostLong(user, costItemMap, BIReason.LIFE_STONE_UP, type);
if (!isTrue){ if (!isTrue) {
LOGGER.error("命石合成材料不足"); LOGGER.error("命石合成材料不足");
throw new ErrorCodeException(ErrorCode.HANDLE_FAILED); throw new ErrorCodeException(ErrorCode.HANDLE_FAILED);
} }
HeroInfoProto.LifeStoneUpResponse.Builder response=HeroInfoProto.LifeStoneUpResponse.newBuilder(); HeroInfoProto.LifeStoneUpResponse.Builder response = HeroInfoProto.LifeStoneUpResponse.newBuilder();
///大于0说明是在命格系统操作 ///大于0说明是在命格系统操作
if (equipLifeStoneId>0){ if (equipLifeStoneId > 0) {
CommonProto.LifeGridInfo lifeGridInfo=CommonProto.LifeGridInfo.newBuilder() CommonProto.LifeGridInfo lifeGridInfo = CommonProto.LifeGridInfo.newBuilder()
.setGridId(proto.getGridId()) .setGridId(proto.getGridId())
.setGridIndex(proto.getGridIndex()) .setGridIndex(proto.getGridIndex())
.setItemId(equipLifeStoneId) .setItemId(equipLifeStoneId)
.build(); .build();
response.setLifeGridInfo(lifeGridInfo); response.setLifeGridInfo(lifeGridInfo);
user.getHeroManager().setLifeGridMap(proto.getGridId(),proto.getGridIndex(),equipLifeStoneId); user.getHeroManager().setLifeGridMap(proto.getGridId(), proto.getGridIndex(), equipLifeStoneId);
}else{ } else {
long[][]addItem=ItemUtil.mapToLongArray(addItemMap); long[][] addItem = ItemUtil.mapToLongArray(addItemMap);
CommonProto.Drop.Builder drop=ItemUtil.drop(user,addItem,BIReason.LIFE_STONE_UP); CommonProto.Drop.Builder drop = ItemUtil.drop(user, addItem, BIReason.LIFE_STONE_UP);
response.setDrop(drop.build()); response.setDrop(drop.build());
} }
MessageUtil.sendMessage(session,1, MessageTypeProto.MessageType.LIFE_STONE_UP_RESPONSE_VALUE,response.build(),true); MessageUtil.sendMessage(session, 1, MessageTypeProto.MessageType.LIFE_STONE_UP_RESPONSE_VALUE, response.build(), true);
} }
@ -124,76 +124,84 @@ public class LifeStoneUpRequestHandler extends BaseHandler<HeroInfoProto.LifeSto
* @param addItemMap * @param addItemMap
* @return * @return
*/ */
public boolean LifeStoneAllUp(ItemManager itemManager,TreeMap<Integer,SGemConfig>gemConfigMap, Map<Integer, Long>costItemMap, Map<Integer, Long>addItemMap){ private boolean LifeStoneAllUp(ItemManager itemManager, TreeMap<Integer, SGemConfig> gemConfigMap, Map<Integer, Long> costItemMap, Map<Integer, Long> addItemMap) {
long addCount=0;//一个循环合成数量 long addCount = 0;//一个循环合成数量
long costGoldNum=0;//合成金币总消耗 long costGoldNum = 0;//合成金币总消耗
int costGoldId=gemConfigMap.get(1).getUpgradeCost()[0];//获取消耗材料id int costGoldId = gemConfigMap.get(1).getUpgradeCost()[0];//获取消耗材料id
if(costItemMap.containsKey(costGoldId)){ if (costItemMap.containsKey(costGoldId)) {
costGoldNum=costItemMap.get(costGoldId); costGoldNum = costItemMap.get(costGoldId);
} }
for (Map.Entry<Integer, SGemConfig> gemConfigEntry : gemConfigMap.entrySet()) { for (Map.Entry<Integer, SGemConfig> gemConfigEntry : gemConfigMap.entrySet()) {
SGemConfig gemConfig=gemConfigEntry.getValue(); SGemConfig gemConfig = gemConfigEntry.getValue();
///升到满级 ///升到满级
if (gemConfig.getNextGem()==0){ if (gemConfig.getNextGem() == 0) {
if (addCount>0){ if (addCount > 0) {
addItemMap.put(gemConfig.getId(),addCount); addItemMap.put(gemConfig.getId(), addCount);
} }
continue; continue;
} }
Item curItem= itemManager.getItem(gemConfig.getId()); Item curItem = itemManager.getItem(gemConfig.getId());
long costNum=addCount; long costNum = addCount;
if (curItem!=null){ if (curItem != null) {
costNum=curItem.getItemNum()+addCount; costNum = curItem.getItemNum() + addCount;
} }
///命石不足 ///命石不足
if (costNum< gemConfig.getUpgradeNum()){ if (costNum < gemConfig.getUpgradeNum()) {
if (addCount>0){ if (addCount > 0) {
addItemMap.put(gemConfig.getId(),addCount); addItemMap.put(gemConfig.getId(), addCount);
addCount=0; addCount = 0;
} }
continue; continue;
} }
int stoneNum=gemConfig.getUpgradeNum(); int stoneNum = gemConfig.getUpgradeNum();
int[]costGold=gemConfig.getUpgradeCost(); int[] costGold = gemConfig.getUpgradeCost();
long remainNum=costNum%stoneNum; long remainNum = costNum % stoneNum;
if (remainNum!=0){ if (remainNum != 0) {
costNum-=remainNum; costNum -= remainNum;
} }
if (costNum>0){ if (costNum <= 0) {
//本次合成消耗 continue;
long needCostGoldNum=costNum/stoneNum*costGold[1];
long haveGoldNum=0;
if (itemManager.getItem(costGold[0])!=null){
haveGoldNum=itemManager.getItem(costGold[0]).getItemNum();
}
///金币不足情况中断合成
if (needCostGoldNum+costGoldNum>haveGoldNum){
long upNum= (haveGoldNum-costGoldNum)/costGold[1];
costItemMap.put(gemConfig.getId(),upNum*stoneNum);
addItemMap.put(gemConfig.getNextGem(),upNum);
costGoldNum+=upNum*costGold[1];
//刷新消耗金币数量
costItemMap.put(costGold[0],costGoldNum);
return false;
}
//计算累计消耗金币
costGoldNum+=needCostGoldNum;
if (curItem!=null){
long bagCost=curItem.getItemNum()-remainNum;
//刷新消耗命石数量
costItemMap.put(gemConfig.getId(),bagCost);
long addNum=remainNum-curItem.getItemNum();
if (addNum>0){
addItemMap.put(gemConfig.getId(),addNum);
}
}
//保存累计消耗金币数量
costItemMap.put(costGold[0],costGoldNum);
} }
if (curItem==null){ //本次合成消耗
addItemMap.put(gemConfig.getId(),remainNum); long needCostGoldNum = costNum / stoneNum * costGold[1];
long haveGoldNum = 0;
if (itemManager.getItem(costGold[0]) != null) {
haveGoldNum = itemManager.getItem(costGold[0]).getItemNum();
} }
addCount=costNum/stoneNum; ///金币不足情况中断合成
if (needCostGoldNum + costGoldNum > haveGoldNum) {
long upNum = (haveGoldNum - costGoldNum) / costGold[1];
long endCostNum = upNum * stoneNum;
long haveCostNum = endCostNum - addCount;
if (haveCostNum > 0) {
costItemMap.put(gemConfig.getId(), haveCostNum);
} else {
addItemMap.put(gemConfig.getId(), -haveCostNum);
}
addItemMap.put(gemConfig.getNextGem(), upNum);
costGoldNum += upNum * costGold[1];
//刷新消耗金币数量
costItemMap.put(costGold[0], costGoldNum);
return false;
}
//计算累计消耗金币
costGoldNum += needCostGoldNum;
if (curItem != null) {
long bagCost = curItem.getItemNum() - remainNum;
//刷新消耗命石数量
costItemMap.put(gemConfig.getId(), bagCost);
long addNum = remainNum - curItem.getItemNum();
if (addNum > 0) {
addItemMap.put(gemConfig.getId(), addNum);
}
}
//保存累计消耗金币数量
costItemMap.put(costGold[0], costGoldNum);
if (curItem == null) {
addItemMap.put(gemConfig.getId(), remainNum);
}
addCount = costNum / stoneNum;
} }
return true; return true;
} }
@ -206,73 +214,74 @@ public class LifeStoneUpRequestHandler extends BaseHandler<HeroInfoProto.LifeSto
* @param selectGemLv * @param selectGemLv
* @return * @return
*/ */
public boolean LifeStoneQuickUp(ItemManager itemManager,TreeMap<Integer,SGemConfig>gemConfigMap, Map<Integer, Long>costItemMap,int selectGemLv){ private boolean LifeStoneQuickUp(ItemManager itemManager, TreeMap<Integer, SGemConfig> gemConfigMap, Map<Integer, Long> costItemMap, int selectGemLv) {
long addCount=0;//一个循环合成数量 long addCount = 0;//一个循环合成数量
long costGoldNum=0;//合成金币总消耗 long costGoldNum = 0;//合成金币总消耗
for (Map.Entry<Integer, SGemConfig> gemConfigEntry : gemConfigMap.entrySet()) { for (Map.Entry<Integer, SGemConfig> gemConfigEntry : gemConfigMap.entrySet()) {
SGemConfig gemConfig=gemConfigEntry.getValue(); SGemConfig gemConfig = gemConfigEntry.getValue();
///如果命石等级大于当前选中的命石等级跳过 ///如果命石等级大于当前选中的命石等级跳过
if (gemConfig.getLevel()>=selectGemLv){ if (gemConfig.getLevel() >= selectGemLv) {
break; break;
} }
Item curItem= itemManager.getItem(gemConfig.getId()); Item curItem = itemManager.getItem(gemConfig.getId());
long costNum=addCount; long costNum = addCount;
if (curItem!=null){ if (curItem != null) {
costNum=curItem.getItemNum()+addCount; costNum = curItem.getItemNum() + addCount;
} }
int[]costGold=gemConfig.getUpgradeCost(); int[] costGold = gemConfig.getUpgradeCost();
int stoneNum=gemConfig.getUpgradeNum(); int stoneNum = gemConfig.getUpgradeNum();
if (costNum<stoneNum){ if (costNum < stoneNum) {
costItemMap.clear(); costItemMap.clear();
costGoldNum=0; costGoldNum = 0;
addCount=0; addCount = 0;
continue; continue;
} }
long needNum= GetNeedLifeStoneNum(gemConfig.getType(),gemConfig.getLevel(),selectGemLv); long needNum = GetNeedLifeStoneNum(gemConfig.getType(), gemConfig.getLevel(), selectGemLv);
//剩余数量 //剩余数量
long remainNum=costNum%stoneNum; long remainNum = costNum % stoneNum;
if (costNum>needNum){ if (costNum > needNum) {
costNum=needNum; remainNum = costNum - needNum;
remainNum=costNum-needNum; costNum = needNum;
} }
addCount=costNum/stoneNum; addCount = costNum / stoneNum;
//本次合成消耗金币 //本次合成消耗金币
long needCostGoldNum=addCount*costGold[1]; long needCostGoldNum = addCount * costGold[1];
//计算累计消耗金币 //计算累计消耗金币
costGoldNum+=needCostGoldNum; costGoldNum += needCostGoldNum;
costItemMap.put(costGold[0],costGoldNum); costItemMap.put(costGold[0], costGoldNum);
if (curItem!=null){ if (curItem != null) {
long bagCost=curItem.getItemNum()-remainNum; long bagCost = curItem.getItemNum() - remainNum;
//刷新消耗命石数量 //刷新消耗命石数量
costItemMap.put(gemConfig.getId(),bagCost); costItemMap.put(gemConfig.getId(), bagCost);
} }
long haveGoldNum=itemManager.getItem(costGold[0]).getItemNum(); long haveGoldNum = itemManager.getItem(costGold[0]).getItemNum();
if (costGoldNum>haveGoldNum){ if (costGoldNum > haveGoldNum) {
LOGGER.error("命石快速合成金币不足"); LOGGER.error("命石快速合成金币不足");
return false; return false;
} }
} }
return addCount==1; return addCount == 1;
} }
/** /**
* *
* @param stoneType * @param stoneType
* @param costStoneLv * @param costStoneLv
* @param targetStoneLv * @param targetStoneLv
* @return * @return
*/ */
private long GetNeedLifeStoneNum(int stoneType, int costStoneLv,int targetStoneLv){ private long GetNeedLifeStoneNum(int stoneType, int costStoneLv, int targetStoneLv) {
long needNum=1; long needNum = 1;
TreeMap<Integer,SGemConfig>stoneLvMap= SGemConfig.gemConfigMapByType.get(stoneType); TreeMap<Integer, SGemConfig> stoneLvMap = SGemConfig.gemConfigMapByType.get(stoneType);
for (Map.Entry<Integer, SGemConfig> gemConfigEntry : stoneLvMap.entrySet()) { for (Map.Entry<Integer, SGemConfig> gemConfigEntry : stoneLvMap.entrySet()) {
if (gemConfigEntry.getKey()<costStoneLv){ if (gemConfigEntry.getKey() < costStoneLv) {
continue; continue;
} }
if (gemConfigEntry.getValue().getLevel()==targetStoneLv){ if (gemConfigEntry.getValue().getLevel() == targetStoneLv) {
break; break;
} }
needNum*=gemConfigEntry.getValue().getUpgradeNum(); needNum *= gemConfigEntry.getValue().getUpgradeNum();
} }
return needNum; return needNum;
} }