【家园功能1.0.9】建筑升级只允许一次升级一个建筑,装备强化bug优化

back_recharge
duhui 2021-12-28 17:39:20 +08:00
parent ee97a40004
commit e5fc1ea28c
2 changed files with 94 additions and 97 deletions

View File

@ -2770,6 +2770,7 @@ public class HeroLogic {
int equipForce = 0;
Iterator<Map.Entry<Integer, Integer>> iterator = hero.getEquipByHongmengPositionMap(heroManager).entrySet().iterator();
Map<Integer, Integer> intensifyMap = user.getEquipManager().getEquipIntensifyMap();
Map<Integer, SEquipStrengthen> strengthenMap = STableManager.getConfig(SEquipStrengthen.class);
// 套装list初始化
ArrayList<SEquipConfig> suiteNumList = new ArrayList<>();
while (iterator.hasNext()) {
@ -2779,10 +2780,13 @@ public class HeroLogic {
Map<Integer, Long> propertyValueByIdMap = new HashMap<>();
for (int[] prop : property) {
// 家园装备强化属性
Integer level = intensifyMap.get(sEquipConfig.getPosition());
Integer levelId = intensifyMap.get(sEquipConfig.getPosition());
long value = prop[1];
if (level != null){
value = prop[1] + (prop[1]/100L*level);
if (levelId != null){
SEquipStrengthen strengthen = strengthenMap.get(levelId);
if(strengthen != null){
value = value + (value/100L*strengthen.getRate());
}
}
propertyValueByIdMap.put(prop[0], value);
}

View File

@ -52,102 +52,95 @@ public class HomeLogic {
*/
public void architectureUpLv(ISession session, PlayerInfoProto.ArchitectureOperateRequest proto) throws Exception {
User user = UserManager.getUser(session.getUid());
List<Integer> idsList = proto.getIdsList();
//xxxx 目前只允许升级一个建筑,多个建筑一键升级需要优化
int id = proto.getIdsList().get(0);
// 1普通升级 2立即完成
int type = proto.getType();
ArrayList<CommonProto.ArchitectureInfo> list = new ArrayList<>();
// 当前时间
int now = TimeUtils.nowInt();
Map<Integer, SHomeLandLevel> config = STableManager.getConfig(SHomeLandLevel.class);
for (Integer id : idsList) {
// 建筑信息验证
ArchitectureInfo info = user.getPlayerInfoManager().getArchitectureInfoMap().get(id);
if (info == null) {
LOGGER.error("浮生门建筑升级数据库内找不到建筑poolId{}", id);
continue;
}
SHomeLandLevel landLevel = config.get(info.getId());
if (landLevel == null){
LOGGER.error("浮生门建筑升级策划表内找不到建筑levelId{}", info.getId());
continue;
}
//升级前置条件
int[] rule = landLevel.getRule();
if (rule != null && rule.length > 1){
ArchitectureInfo info1 = user.getPlayerInfoManager().getArchitectureInfoMap().get(rule[0]);
if (info1 == null){
LOGGER.error("浮生门建筑升级前置建筑未解锁升级建筑levelId{},前置建筑poolId{}",id,rule[0]);
continue;
}
int level = Optional.ofNullable(config.get(info1.getId())).map(SHomeLandLevel::getlevel).orElse(0);
if (level < rule[1]){
LOGGER.error("浮生门建筑升级前置建筑等级不足升级建筑levelId{},前置建筑levelId{}",id,info1.getId());
continue;
}
}
// 最高等级
int maxId = config.values().stream().filter(v->v.getPoolID()==landLevel.getPoolID()).mapToInt(SHomeLandLevel::getlevel).max().orElse(0);
if (info.getId() == maxId) {
LOGGER.error("浮生门建筑升级建筑等级最高id{}", info.getId());
continue;
}
// 需要消耗的道具
int[][] items = landLevel.getCost();
boolean cost = ItemUtil.checkCostLong(user, items, 1);
if (!cost) {
LOGGER.error("浮生门建筑升级建筑升级要求道具不足建筑levelId{},道具要求:{}", info.getId(),Arrays.toString(items));
continue;
}
// 普通升级
if (info.getUpLvEndTime() == 0){
int endTime = landLevel.getTime();
info.setUpLvEndTime(now + endTime);
}
// 特殊情况
else if (info.getUpLvEndTime() <= now){
// 升级
architectureUpLvEnd(user, landLevel.getPoolID(), info);
// 可以继续升级
if (info.getId() < maxId){
SHomeLandLevel landLevel1 = config.get(info.getId());
info.setUpLvEndTime(landLevel1.getTime() + now);
}
}
// 取消
if (type == 3){
info.setUpLvEndTime(0);
}
// 立即完成
if (type == 2 && info.getUpLvEndTime() > now){
// 验证特权次数
boolean countBol = PlayerLogic.getInstance().checkAndUpdate(user, proto.getPrivilageTypeId(), 1);
// 无特权,消耗道具
if (!countBol || proto.getPrivilageTypeId() == 0) {
// 条件: 单位/s 道具id 道具数量
String[] stringValue = SSpecialConfig.getStringValue(SSpecialConfig.HONGMENG_LATTICE_PRICE).split("#");
// 立即升级消耗的道具
double time = Math.max(info.getUpLvEndTime() - now,0);
// 每一个单位的消耗
double oneCost = Integer.parseInt(stringValue[0]) * Integer.parseInt(stringValue[2]);
// 总消耗数量,向上取整
double count = Math.ceil(time / oneCost);
int[][] cost1 = {{Integer.parseInt(stringValue[1]), (int) count}};
boolean itemCost = ItemUtil.itemCost(user, cost1, BIReason.ARCHITECTURE_IMMEDIATELY_UP_LEVEL, 0);
if (!itemCost){
LOGGER.error("浮生门建筑升级立刻升级失败道具不足建筑levelId{},道具要求:{}", info.getId(),Arrays.toString(cost1));
continue;
}
}
architectureUpLvEnd(user, landLevel.getPoolID(), info);
}
ItemUtil.itemCost(user, items, BIReason.ARCHITECTURE_UP_LEVEL, 0);
// 最后更新
user.getPlayerInfoManager().putArchitectureInfo(landLevel.getPoolID(),info);
// 需要更新的建筑信息
CommonProto.ArchitectureInfo.Builder builder = CommonProto.ArchitectureInfo.newBuilder()
.setId(info.getId()).setProductionStartTime(info.getProductionStartTime()).setUpLvEndTime(info.getUpLvEndTime());
list.add(builder.build());
// 建筑信息验证
ArchitectureInfo info = user.getPlayerInfoManager().getArchitectureInfoMap().get(id);
if (info == null) {
throw new ErrorCodeException(ErrorCode.SERVER_DEFINE,"浮生门建筑升级数据库内找不到建筑poolId"+id);
}
SHomeLandLevel landLevel = config.get(info.getId());
if (landLevel == null){
throw new ErrorCodeException(ErrorCode.SERVER_DEFINE,"浮生门建筑升级策划表内找不到建筑levelId"+info.getId());
}
//升级前置条件
int[] rule = landLevel.getRule();
if (rule != null && rule.length > 1){
ArchitectureInfo info1 = user.getPlayerInfoManager().getArchitectureInfoMap().get(rule[0]);
if (info1 == null){
throw new ErrorCodeException(ErrorCode.SERVER_DEFINE,"浮生门建筑升级前置建筑未解锁升级建筑levelId"+info.getId()+",前置建筑poolId"+rule[0]);
}
int level = Optional.ofNullable(config.get(info1.getId())).map(SHomeLandLevel::getlevel).orElse(0);
if (level < rule[1]){
throw new ErrorCodeException(ErrorCode.SERVER_DEFINE,"浮生门建筑升级前置建筑等级不足升级建筑levelId"+info.getId()+",前置建筑levelId"+info1.getId());
}
}
// 最高等级
int maxId = config.values().stream().filter(v->v.getPoolID()==landLevel.getPoolID()).mapToInt(SHomeLandLevel::getlevel).max().orElse(0);
if (info.getId() == maxId) {
throw new ErrorCodeException(ErrorCode.LEVE_MAX,"浮生门建筑升级建筑等级最高升级建筑levelId"+info.getId());
}
// 需要消耗的道具
int[][] items = landLevel.getCost();
boolean cost = ItemUtil.checkCostLong(user, items, 1);
if (!cost) {
throw new ErrorCodeException(ErrorCode.ITEM_NOT_ENOUGH,"浮生门建筑升级建筑升级要求道具不足建筑levelId"+info.getId()+",道具要求:"+Arrays.toString(items));
}
// 普通升级
if (info.getUpLvEndTime() == 0){
int endTime = landLevel.getTime();
info.setUpLvEndTime(now + endTime);
}
// 特殊情况
else if (info.getUpLvEndTime() <= now){
// 升级
architectureUpLvEnd(user, landLevel.getPoolID(), info);
// 可以继续升级
if (info.getId() < maxId){
SHomeLandLevel landLevel1 = config.get(info.getId());
info.setUpLvEndTime(landLevel1.getTime() + now);
}
}
// 取消
if (type == 3){
info.setUpLvEndTime(0);
}
// 立即完成
if (type == 2 && info.getUpLvEndTime() > now){
// 验证特权次数
boolean countBol = PlayerLogic.getInstance().checkAndUpdate(user, proto.getPrivilageTypeId(), 1);
// 无特权,消耗道具
if (!countBol || proto.getPrivilageTypeId() == 0) {
// 条件: 单位/s 道具id 道具数量
String[] stringValue = SSpecialConfig.getStringValue(SSpecialConfig.HONGMENG_LATTICE_PRICE).split("#");
// 立即升级消耗的道具
double time = Math.max(info.getUpLvEndTime() - now,0);
// 每一个单位的消耗
double oneCost = Integer.parseInt(stringValue[0]) * Integer.parseInt(stringValue[2]);
// 总消耗数量,向上取整
double count = Math.ceil(time / oneCost);
int[][] cost1 = {{Integer.parseInt(stringValue[1]), (int) count}};
boolean itemCost = ItemUtil.itemCost(user, cost1, BIReason.ARCHITECTURE_IMMEDIATELY_UP_LEVEL, 0);
if (!itemCost){
throw new ErrorCodeException(ErrorCode.ITEM_NOT_ENOUGH,"浮生门建筑升级立刻升级失败道具不足建筑levelId"+info.getId()+",道具要求:"+Arrays.toString(cost1));
}
}
architectureUpLvEnd(user, landLevel.getPoolID(), info);
}
ItemUtil.itemCost(user, items, BIReason.ARCHITECTURE_UP_LEVEL, 0);
// 最后更新
user.getPlayerInfoManager().putArchitectureInfo(landLevel.getPoolID(),info);
// 需要更新的建筑信息
CommonProto.ArchitectureInfo.Builder infoBuilder = CommonProto.ArchitectureInfo.newBuilder()
.setId(info.getId()).setProductionStartTime(info.getProductionStartTime()).setUpLvEndTime(info.getUpLvEndTime());
list.add(infoBuilder.build());
PlayerInfoProto.HomeInfoResponse.Builder builder = PlayerInfoProto.HomeInfoResponse.newBuilder().addAllInfos(list);
MessageUtil.sendMessage(session, 1, MessageTypeProto.MessageType.HomeInfoResponse_VALUE, builder.build());
}
@ -188,11 +181,11 @@ public class HomeLogic {
for (ArchitectureInfo info : infoMap.values()) {
oneArchitectureEarnings(user,info,nowInt,drop);
}
// 栖云阁领取
Map<Integer, LandInfo> landInfoMap = user.getPlayerInfoManager().getLandInfoMap();
for (LandInfo value : landInfoMap.values()) {
oneLandEarnings(user,value,nowInt,drop);
}
// TODO: 2021/12/28 栖云阁领取
// Map<Integer, LandInfo> landInfoMap = user.getPlayerInfoManager().getLandInfoMap();
// for (LandInfo value : landInfoMap.values()) {
// oneLandEarnings(user,value,nowInt,drop);
// }
}
// 单个收获
else {