一键领取邮件bug处理

back_recharge
duhui 2021-01-25 16:04:16 +08:00
parent 4a90d1fa46
commit 07dbb37262
2 changed files with 177 additions and 22 deletions

View File

@ -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<String> 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);
}

View File

@ -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<Integer, Integer> itemMap = new HashMap<>();
Map<Integer, Integer> cardMap = new HashMap<>();
Map<Integer,Integer> equipMap = new HashMap<>();
Map<Integer,Integer> 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<int[][]> 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<Integer, Integer> itemMap,CommonProto.Drop.Builder dropBuilder,int reason) throws Exception {
if (itemMap.isEmpty()) {
return 0;
}
List<CommonProto.Item> itemProtoList = new CopyOnWriteArrayList<>();
ItemManager itemManager = user.getItemManager();
List<CommonProto.Item> sendToFront = new CopyOnWriteArrayList<>();
//超过上限不能直接获得
Map<Integer,Integer> extraItem = new HashMap<>(itemMap.size());
for (Map.Entry<Integer, Integer> 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<Integer,Integer> 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<Integer,Integer> 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 去处理
*/