diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/mail/MailLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/mail/MailLogic.java index fe3c4e22a..31eb090d8 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/mail/MailLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/mail/MailLogic.java @@ -16,6 +16,7 @@ import com.ljsd.jieling.logic.dao.root.MailingSystem; import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.logic.dao.UserManager; import com.ljsd.jieling.network.session.ISession; +import org.luaj.vm2.ast.Str; import rpc.protocols.CommonProto; import rpc.protocols.MessageTypeProto; import rpc.protocols.PlayerInfoProto; @@ -208,46 +209,63 @@ public class MailLogic { MessageUtil.sendMessage(iSession, 1,msgId, null, true); } - //领取附件 + /** + * 领取附件 + * @param iSession + * @param mailIdsList + * @param userId + * @throws Exception + */ public void takeMail(ISession iSession,List mailIdsList, int userId) throws Exception { int msgId = MessageTypeProto.MessageType.MAIL_TAKE_MAIL_ITEM_RESPONESE_VALUE; User user = UserManager.getUser(userId); MailManager mailManager = user.getMailManager(); - StringBuilder mailItem = new StringBuilder(); + + CommonProto.Drop.Builder dropBuilder = CommonProto.Drop.newBuilder(); + // 返回值,默认为1 + /** + * 1:成功 + * 0:道具为空 + * 2:背包已满 + */ + int result = 1; + for (String mailId : mailIdsList){ + // 获取邮件 Mail mail = mailManager.getMail(mailId); if (mail == null){ throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); } + // 附件已领取 if(mail.getState() == Global.MAIL_DRAW_ST_GOT){ throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); } - if (mailItem.length() == 0){ - mailItem = new StringBuilder(mail.getMailItem()); - }else{ - mailItem.append("|").append(mail.getMailItem()); + // 包装邮件奖励 + StringBuilder mailItem = new StringBuilder(mail.getMailItem()); + if(mailItem.length()==0){ + throw new ErrorCodeException(ErrorCode.MAIL_NO_REWARD); } + // 转换二维数组 + int[][] itemArr = StringUtil.parseFiledInt2(mailItem.toString()); + // 检测卡牌和装备背包 + boolean isLimit = ItemUtil.checkCardAndEquipLimit(user,itemArr); + if (isLimit){ + throw new ErrorCodeException(ErrorCode.ITEM_POCKET_IS_FULL); + } + // 领取道具 + result = ItemUtil.dropByMail(user, itemArr, dropBuilder, BIReason.TAKE_MAIL_REWARD); - } - if(mailItem.length()==0){ - throw new ErrorCodeException(ErrorCode.MAIL_NO_REWARD); - } - int[][] itemArr = StringUtil.parseFiledInt2(mailItem.toString()); - boolean isLimit = ItemUtil.checkCardAndEquipLimit(user,itemArr); - if (isLimit){ - throw new ErrorCodeException(ErrorCode.ITEM_POCKET_IS_FULL); - } - CommonProto.Drop.Builder dropBuilder = ItemUtil.drop(user, itemArr, BIReason.TAKE_MAIL_REWARD); - for (String mailId : mailIdsList){ - Mail mail = mailManager.getMail(mailId); - mail.setState(Global.MAIL_DRAW_ST_GOT); -// mail.setMailItem(""); - mail.setNoUseDeleteTime(TimeUtils.now()+TimeUtils.DAY*Global.MAIL_NOUSE_DELETE_TIME); - mailManager.addMail(mail); + if (result == 1){ + // 改变邮件状态 + mail.setState(Global.MAIL_DRAW_ST_GOT); + mail.setNoUseDeleteTime(TimeUtils.now()+TimeUtils.DAY*Global.MAIL_NOUSE_DELETE_TIME); + mailManager.addMail(mail); + } } PlayerInfoProto.TakeMailResponse takeMailResponse = PlayerInfoProto.TakeMailResponse.newBuilder() .setDrop(dropBuilder) + .setMsg(result) .buildPartial(); MessageUtil.sendMessage(iSession, 1, msgId,takeMailResponse , true); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java index eb4e9d078..5371ab465 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java @@ -106,6 +106,23 @@ public class ItemUtil { return dropBuilder; } + public static int dropByMail(User user, int[][] itemArr,CommonProto.Drop.Builder dropBuilder,int reason) throws Exception { + Map itemMap = new HashMap<>(); + Map cardMap = new HashMap<>(); + Map equipMap = new HashMap<>(); + Map randomMap = new HashMap<>(); + ItemMap itemObj = new ItemMap(); + + selectItemArr(itemArr,cardMap,itemMap,equipMap,randomMap,itemObj); + useRandomItem(user,randomMap,reason); + int ints = addItemByMail(user, itemMap, dropBuilder, reason); + addCard(user,cardMap,dropBuilder,reason); + addEquip(user,equipMap,dropBuilder,reason); + addSpecialMonster(user,itemObj,dropBuilder,reason); + + return ints; + } + //指定道具掉落(如:邮件,初始化物品) public static CommonProto.Drop.Builder drop(User user, List itemArrs,int reason) throws Exception { CommonProto.Drop.Builder dropBuilder = CommonProto.Drop.newBuilder(); @@ -750,6 +767,126 @@ public class ItemUtil { } + /** + * 添加道具 + * @param user + * @param itemMap + * @throws Exception + */ + public static int addItemByMail(User user, Map itemMap,CommonProto.Drop.Builder dropBuilder,int reason) throws Exception { + if (itemMap.isEmpty()) { + return 0; + } + List itemProtoList = new CopyOnWriteArrayList<>(); + ItemManager itemManager = user.getItemManager(); + List sendToFront = new CopyOnWriteArrayList<>(); + //超过上限不能直接获得 + Map extraItem = new HashMap<>(itemMap.size()); + + for (Map.Entry entry : itemMap.entrySet()) { + SItem sItem = SItem.getsItemMap().get (entry.getKey()); + int itemNumlimit = sItem.getItemNumlimit(); + int itemNum = entry.getValue(); + if(itemNum <= 0){ + continue; + } + if (itemNum >= itemNumlimit){ + itemNum = itemNumlimit; + } + Item item = itemManager.getItem(entry.getKey()); + if (item == null) { + item = itemManager.newItem(entry.getKey(), itemNum); + } else { + if(sItem.getId()==Global.MISSING_ROOM_ITEM&&reason==BIReason.ADVENTURE_BASE_REWARD){ + itemNumlimit = SPlayerLevelConfig.getsPlayerLevelConfigMap().get(user.getPlayerInfoManager().getLevel()).getMazeTreasureMax(); + } + //数量超过了 + if(item.getItemNum()> itemNumlimit){ + + //如果是寻龙玉,直接返回不给 + if(sItem.getId()==Global.MISSING_ROOM_ITEM&&reason==BIReason.ADVENTURE_BASE_REWARD){ + continue; + } + if(reason==BIReason.TAKE_MAIL_REWARD){ + return 2; + }else{ + extraItem.put(entry.getKey(),extraItem.getOrDefault(entry.getKey(),0)+entry.getValue()); + } + continue; + } + if (item.getItemNum() + entry.getValue() > itemNumlimit){ + if(sItem.getId()==Global.MISSING_ROOM_ITEM&&reason==BIReason.ADVENTURE_BASE_REWARD){ + item.setItemNum(item.getItemNum() + entry.getValue()); + }else{ + if(reason==BIReason.TAKE_MAIL_REWARD){ + return 2; + }else{ + extraItem.put(entry.getKey(),extraItem.getOrDefault(entry.getKey(),0)+entry.getValue()); + continue; + } + } + }else{ + item.setItemNum(item.getItemNum() + entry.getValue()); + + } + } + if(itemNum>=0){ + itemProtoList.add(CBean2Proto.getItem(item,itemNum)); + } + + + ReportUtil.onReportEvent(user,ReportEventEnum.GET_ITEM.getType(),itemNum,String.valueOf(reason),item.getItemId()); + + baseItemReport(user,item.getItemId(),itemNum,1,reason); + + if(sItem.getId() == Global.EXP){ + userLevelUp(user,itemNum); + } + if(sItem.getId() == Global.TREASURE_SCORE){ + treasureLevelUp(user); + } + extraDropAop(user,dropBuilder,sItem); + sendToFront.add(CBean2Proto.getItem(item,-1)); + if(sItem.getItemType()==GlobalItemType.EQUIP){ + if(reason!=BIReason.EQUIP_UNLOAD_REWARD&&reason!=BIReason.DECOMPOS_HERO_REWARD&&reason!=BIReason.UPHERO_DECOMPOS_HERO_REWARD){ + user.getUserMissionManager().onGameEvent(user,GameEvent.GET_EQUIP,sItem.getId(),itemNum); + ReportUtil.onReportEvent(user,ReportEventEnum.GET_EQUIP.getType(),sItem.getId(),itemNum,reason); + } + } else if (sItem.getItemType() == GlobalItemType.SOUL_MARK) { + user.getUserMissionManager().onGameEvent(user, GameEvent.GOT_SOUL_MARK, sItem.getId(), itemNum); + } + if(sItem.getId()==Global.DAILY_TASK_REMOVE_ITEM){ + user.getUserMissionManager().onGameEvent(user,GameEvent.DAILY_TASK_TYPE,itemNum,user); + } + //日志记录 + ItemLogic.getInstance().addItemLog(new ItemLog(user.getId(),0,user.getPlayerInfoManager().getLevel(),String.valueOf(TimeUtils.now()),reason,sItem.getId(),itemNum,item.getItemNum())); + } + for(Map.Entry entry:extraItem.entrySet()){ + itemProtoList.add(CBean2Proto.getItem(itemManager.getItemMap().get(entry.getKey()),entry.getValue())); + } + if (dropBuilder != null) { + dropBuilder.addAllItemlist(itemProtoList); + } + if(!sendToFront.isEmpty()||extraItem.size()>0){ + MessageUtil.sendBagIndication(user.getId(),0,sendToFront,extraItem.size()>0); + } + if(extraItem.size()>0){ + StringBuilder builder = new StringBuilder(); + for(Map.Entry entry:extraItem.entrySet()){ + builder.append(entry.getKey()).append("#").append(entry.getValue()); + String title = SErrorCodeEerverConfig.getI18NMessage("item_max_mail_title"); + SItem item = SItem.getsItemMap().get(entry.getKey()); + String content = SErrorCodeEerverConfig.getI18NMessage("item_max_mail_content",new String[]{item.getName(),String.valueOf(item.getItemNumlimit())}); + MailLogic.getInstance().sendMail(user.getId(),title,content,builder.toString(),TimeUtils.nowInt(),Global.MAIL_EFFECTIVE_TIME); + builder = new StringBuilder(); + } + } + + return 1; + } + + + /** * 玩家升级 //zsx 保留 TODO 由事件分发到 playlogic 去处理 */