一键领取邮件bug处理
parent
4a90d1fa46
commit
07dbb37262
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 去处理
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue