邮件功能

This commit is contained in:
sk 2025-06-20 15:31:35 +08:00
parent 1a9ea12307
commit 3aa08943b2
4 changed files with 462 additions and 296 deletions

View File

@ -324,32 +324,64 @@ enum UpgradeMasterType {
MasterTreasureRefine = 4; MasterTreasureRefine = 4;
} }
// MailType
enum MailType {
MailTypeNone = 0;
//
MailNormal = 1;
//
MailSpecial = 2;
//
MailBackground = 3;
//
MailAllRegion = 4;
}
enum MailStatus {
//
Unread = 0;
//
HasRead = 1;
//
Received = 2;
//
Deleted = 3;
}
enum AttrType { enum AttrType {
AttrTypeNone = 0; // AttrTypeNone = 0; //
Attack = 1; // Attack = 1; //
Hp = 2; // Hp = 2; //
AttrPhysicalDefense = 3; // PhysicalDefense = 3; //
AttrMagicDefense = 4; // MagicDefense = 4; //
AttrAttackRatio = 5; // AttackRatio = 5; //
AttrHpRatio = 6; // HpRatio = 6; //
AttrPhysicalDefenseRatio = 7; // PhysicalDefenseRatio = 7; //
AttrMagicDefenseRatio = 8; // MagicDefenseRatio = 8; //
AttrDamageRatio = 9; // DamageRatio = 9; //
AttrDamageRelief = 10; // DamageRelief = 10; //
AttrCriticalRatio = 11; // CriticalRate = 11; //
AttrCriticalResistance = 12; // CriticalResistance = 12; //
AttrCriticalDamage = 13; // CriticalDamage = 13; //
AttrCriticalDamageRelief = 14; // CriticalDamageRelief = 14; //
AttrHitRate = 15; // HitRate = 15; //
AttrDodgeRate = 16; // DodgeRate = 16; //
AttrTreatRatio = 17; // TreatRatio = 17; //
AttrByTreatedRatio = 18; // ByTreatedRate = 18; //
AttrFinalDamageRatio = 19; // FinalDamageRatio = 19; //
AttrFinalDamageRelief = 20; // FinalDamageRelief = 20; //
AttrBlockRate = 21; // BlockRate = 21; //
AttrBlockResistance = 22; // BlockResistance = 22; //
AttrSpeed = 23; // AttrNums = 23; //
Nums = 24; //
} }

90
proto/idl/mod_mail.proto Normal file
View File

@ -0,0 +1,90 @@
syntax = "proto3";
package Pb;
option go_package = "pb/";
import "enums.proto";
import "mod_item.proto";
// ModId.ModuleMail = 8000;
//
// ,
message Mail {
uint64 Uid = 1; //ID
MailType Type = 2; //MailType
string title = 3; //
string content = 4; //
int64 CreateTime = 5; //
int64 Expiration = 6; //0
MailStatus Status = 7; //MailStatus
repeated string Args = 8; //
repeated Item ItemList = 9; //,
}
message MailChange {
uint64 Uid = 1; //ID
MailStatus Status = 7; //MailStatus
}
// MsgId.ModMailList = 8001;
// MsgId.ModMailSend = 8002;
//
message MailListAck {
repeated Mail MailList = 1;
}
// MsgId.ModMailSend = 8002;
//
message MailSendReq {
uint64 UserId = 1; //ID
uint32 AreaId = 2; //IDID
uint64 RoleId = 3; //ID
Mail Mail = 4; //
}
// MsgId.ModMailSend = 8002;
//
message MailSendAck {
Mail Mail = 1;
}
// MsgId.ModMailChange = 8003;
//
message MailChangeListAck {
repeated MailChange ChangeList = 1;
}
// MsgId.ModMailRead = 8004;
//
message MailReadReq {
uint64 Uid = 1; //ID
}
// MsgId.ModMailReceive = 8005;
//
message MailReceiveReq {
uint64 Uid = 1; //ID
}
// MsgId.ModMailReceiveAll = 8006;
//
message MailReceiveAllReq {
}
// MsgId.ModMailReceive = 8005;
// MsgId.ModMailReceiveAll = 8006;
//
message MailReceiveAck {
repeated Item ItemList = 1;
}
// MsgId.ModMailDelete = 8007;
//
message MailDeleteReq {
uint64 Uid = 1; //ID
}
// MsgId.ModMailDeleteAll = 8008;
//
message MailDeleteAllReq {
}

View File

@ -1,194 +1,251 @@
package handler package handler
//func (this *PlayerHandler) MailRead(player *logic.Player, msg *net.Message) { import (
// var req = new(proto.MsgMailReadReq) "ecs/proto"
// var err = msg.Read(req) "ecs/proto/pb"
// if err != nil { "ecs/servers/game/logic"
// this.logger.Error("Read message failed, ", err) "github.com/oylshe1314/framework/net"
// _ = player.TipNotice(proto.ErrMessageError) )
// return
// } func (this *PlayerHandler) MailSend(player *logic.Player, msg *net.Message) {
// var req = new(pb.MailSendReq)
// if req.Id == 0 { var err = msg.Read(req)
// this.logger.Error("Parameter error, req.Id == 0") if err != nil {
// _ = player.TipNotice(proto.ErrParameterError) this.logger.Error("Read message failed, ", err)
// return _ = player.TipNotice(proto.TipMessageError)
// } return
// }
// var mail = player.Mail[req.Id]
// if mail == nil { if req.UserId == 0 {
// this.logger.Error("Parameter error, Player 'Mail' was not found, id: ", req.Id) this.logger.Error("Parameter error, req.UserId == 0")
// _ = player.TipNotice(proto.ErrMailNotFound) _ = player.TipNotice(proto.TipParameterError)
// return return
// } }
//
// if proto.MailStatus(mail.Status) >= proto.MailStatusHasRead { if req.AreaId == 0 {
// return this.logger.Error("Parameter error, req.AreaId == 0")
// } _ = player.TipNotice(proto.TipParameterError)
// return
// mail.Status = uint32(proto.MailStatusHasRead) }
//
// player.SaveModel(mail) if req.RoleId == 0 {
// this.logger.Error("Parameter error, req.RoleId == 0")
// _ = player.Send(proto.ModIdMail, proto.MsgIdMailRead, &proto.MsgMailReadAck{MailChange: &proto.MailChange{Id: mail.Id, Status: mail.Status}}) _ = player.TipNotice(proto.TipParameterError)
// return
// this.eventManager.PlayerMailLog(player, logic.LogTypeMailRead, mail.Id, mail.Type, 0, mail.Title, mail.Content, mail.ItemId, mail.ItemNum, 0, mail.CreateTime) }
//}
// if req.Mail == nil {
//func (this *PlayerHandler) MailReceive(player *logic.Player, msg *net.Message) { this.logger.Error("Parameter error, req.Mail == nil")
// var req = new(proto.MsgMailReceiveReq) _ = player.TipNotice(proto.TipParameterError)
// var err = msg.Read(req) return
// if err != nil { }
// this.logger.Error("Read message failed, ", err)
// _ = player.TipNotice(proto.ErrMessageError) _ = player.TipNotice(proto.TipServerError)
// return }
// }
// func (this *PlayerHandler) MailRead(player *logic.Player, msg *net.Message) {
// if req.Id == 0 { var req = new(pb.MailReadReq)
// this.logger.Error("Parameter error, req.Id == 0") var err = msg.Read(req)
// _ = player.TipNotice(proto.ErrParameterError) if err != nil {
// return this.logger.Error("Read message failed, ", err)
// } _ = player.TipNotice(proto.TipMessageError)
// return
// var mail = player.Mail[req.Id] }
// if mail == nil {
// this.logger.Error("Parameter error, Player 'Mail' was not found, id: ", req.Id) if req.Uid == 0 {
// _ = player.TipNotice(proto.ErrMailNotFound) this.logger.Error("Parameter error, req.Uid == 0")
// return _ = player.TipNotice(proto.TipParameterError)
// } return
// }
// if proto.MailStatus(mail.Status) >= proto.MailStatusReceived {
// return var mail = player.Mail[req.Uid]
// } if mail == nil {
// this.logger.Error("Parameter error, player 'Mail' was not found, req.Uid: ", req.Uid)
// if len(mail.ItemId) == 0 || len(mail.ItemNum) == 0 { _ = player.TipNotice(proto.TipMailNotFound)
// return return
// } }
//
// var rewardList []*proto.ItemPair if pb.MailStatus(mail.Status) >= pb.MailStatus_HasRead {
// for i := range mail.ItemId { return
// _ = player.AddItem(mail.ItemId[i], mail.ItemNum[i], logic.LogTypeItemObtainByMail) }
// rewardList = append(rewardList, &proto.ItemPair{ItemId: mail.ItemId[i], ItemNum: mail.ItemNum[i]})
// } mail.Status = uint32(pb.MailStatus_HasRead)
//
// mail.Status = uint32(proto.MailStatusReceived) player.SaveModel(mail)
//
// player.SaveModel(mail) _ = player.Send(pb.ModId_ModuleMail, pb.MsgId_ModMailRead, &pb.MailChangeListAck{
// ChangeList: []*pb.MailChange{{Uid: mail.Uid, Status: pb.MailStatus(mail.Status)}},
// _ = player.Send(proto.ModIdMail, proto.MsgIdMailReceive, &proto.MsgMailReceiveAck{ })
// MsgRewardListAck: &proto.MsgRewardListAck{RewardList: rewardList},
// MailChange: &proto.MailChange{Id: mail.Id, Status: mail.Status}, // this.eventManager.PlayerMailLog(player, logic.LogTypeMailRead, mail.Id, mail.Type, 0, mail.Title, mail.Content, mail.ItemId, mail.ItemNum, 0, mail.CreateTime)
// }) }
//
// this.eventManager.PlayerMailLog(player, logic.LogTypeMailReward, mail.Id, mail.Type, 0, mail.Title, mail.Content, mail.ItemId, mail.ItemNum, 0, mail.CreateTime) func (this *PlayerHandler) MailReceive(player *logic.Player, msg *net.Message) {
//} var req = new(pb.MailReceiveReq)
// var err = msg.Read(req)
//func (this *PlayerHandler) MailReceiveAll(player *logic.Player, _ *net.Message) { if err != nil {
// var rewardList []*proto.ItemPair this.logger.Error("Read message failed, ", err)
// var changeList []*proto.MailChange _ = player.TipNotice(proto.TipMessageError)
// var itemPair = map[uint32]uint32{} return
// for id, mail := range player.Mail { }
// if proto.MailStatus(mail.Status) >= proto.MailStatusReceived {
// continue if req.Uid == 0 {
// } this.logger.Error("Parameter error, req.Uid == 0")
// _ = player.TipNotice(proto.TipParameterError)
// if len(mail.ItemId) == 0 || len(mail.ItemNum) == 0 { return
// return }
// }
// var mail = player.Mail[req.Uid]
// for i := range mail.ItemId { if mail == nil {
// itemPair[mail.ItemId[i]] += mail.ItemNum[i] this.logger.Error("Parameter error, player 'Mail' was not found, req.Uid: ", req.Uid)
// } _ = player.TipNotice(proto.TipMailNotFound)
// return
// mail.Status = uint32(proto.MailStatusReceived) }
// player.SaveModel(mail)
// if len(mail.Items) == 0 {
// changeList = append(changeList, &proto.MailChange{Id: id, Status: mail.Status}) this.logger.Error("Parameter error, len(mail.Items) == 0, req.Uid: ", req.Uid)
// _ = player.TipNotice(proto.TipMailNoItems)
// this.eventManager.PlayerMailLog(player, logic.LogTypeMailReward, mail.Id, mail.Type, 0, mail.Title, mail.Content, mail.ItemId, mail.ItemNum, 0, mail.CreateTime) return
// } }
//
// for itemId, itemNum := range itemPair { if pb.MailStatus(mail.Status) >= pb.MailStatus_Received {
// _ = player.AddItem(itemId, itemNum, logic.LogTypeItemObtainByMail) return
// rewardList = append(rewardList, &proto.ItemPair{ItemId: itemId, ItemNum: itemNum}) }
// }
// var itemList []*pb.Item
// if len(changeList) > 0 { for i := range mail.Items {
// _ = player.Send(proto.ModIdMail, proto.MsgIdMailReceiveAll, &proto.MsgMailReceiveAllAck{ _ = player.AddItem(mail.Items[i][0], mail.Items[i][1], logic.LogTypeItemObtainByMail)
// MsgRewardListAck: &proto.MsgRewardListAck{RewardList: rewardList}, itemList = append(itemList, &pb.Item{ItemId: mail.Items[i][0], ItemNum: mail.Items[i][1]})
// ChangeList: changeList, }
// })
// } mail.Status = uint32(pb.MailStatus_Received)
//}
// player.SaveModel(mail)
//func (this *PlayerHandler) MailDelete(player *logic.Player, msg *net.Message) {
// var req = new(proto.MsgMailDeleteReq) _ = player.Send(pb.ModId_ModuleMail, pb.MsgId_ModMailReceive, &pb.MailReceiveAck{
// var err = msg.Read(req) ItemList: itemList,
// if err != nil { })
// this.logger.Error("Read message failed, ", err)
// _ = player.TipNotice(proto.ErrMessageError) _ = player.Send(pb.ModId_ModuleMail, pb.MsgId_ModMailChange, &pb.MailChangeListAck{
// return ChangeList: []*pb.MailChange{{Uid: mail.Uid, Status: pb.MailStatus(mail.Status)}},
// } })
//
// if req.Id == 0 { // this.eventManager.PlayerMailLog(player, logic.LogTypeMailReward, mail.Id, mail.Type, 0, mail.Title, mail.Content, mail.ItemId, mail.ItemNum, 0, mail.CreateTime)
// this.logger.Error("Parameter error, req.Id == 0") }
// _ = player.TipNotice(proto.ErrParameterError)
// return func (this *PlayerHandler) MailReceiveAll(player *logic.Player, _ *net.Message) {
// } var changeList []*pb.MailChange
// var mailItems = map[uint32]uint32{}
// var mail = player.Mail[req.Id] for uid, mail := range player.Mail {
// if mail == nil { if pb.MailStatus(mail.Status) >= pb.MailStatus_Received {
// this.logger.Error("Parameter error, Player 'Mail' was not found, id: ", req.Id) continue
// _ = player.TipNotice(proto.ErrMailNotFound) }
// return
// } if len(mail.Items) == 0 {
// continue
// if proto.MailType(mail.Type) == proto.MailTypeRegion { }
// if proto.MailStatus(mail.Status) >= proto.MailStatusDeleted {
// return for i := range mail.Items {
// } mailItems[mail.Items[i][0]] += mail.Items[i][1]
// mail.Status = uint32(proto.MailStatusDeleted) }
// player.SaveModel(mail)
// } else { mail.Status = uint32(pb.MailStatus_Received)
// delete(player.Mail, req.Id) player.SaveModel(mail)
// player.WipeModel(mail)
// } changeList = append(changeList, &pb.MailChange{Uid: uid, Status: pb.MailStatus(mail.Status)})
//
// _ = player.Send(proto.ModIdMail, proto.MsgIdMailDelete, &proto.MsgMailDeleteAck{MailChange: &proto.MailChange{Id: mail.Id, Status: mail.Status}}) //this.eventManager.PlayerMailLog(player, logic.LogTypeMailReward, mail.Id, mail.Type, 0, mail.Title, mail.Content, mail.ItemId, mail.ItemNum, 0, mail.CreateTime)
// }
// this.eventManager.PlayerMailLog(player, logic.LogTypeMailDelete, mail.Id, mail.Type, 0, mail.Title, mail.Content, mail.ItemId, mail.ItemNum, 0, mail.CreateTime)
//} var itemList []*pb.Item
// for itemId, itemNum := range mailItems {
//func (this *PlayerHandler) MailDeleteAll(player *logic.Player, _ *net.Message) { _ = player.AddItem(itemId, itemNum, logic.LogTypeItemObtainByMail)
// var changeList []*proto.MailChange itemList = append(itemList, &pb.Item{ItemId: itemId, ItemNum: itemNum})
// for id, mail := range player.Mail { }
// if proto.MailStatus(mail.Status) < proto.MailStatusHasRead {
// continue if len(itemList) > 0 {
// } _ = player.Send(pb.ModId_ModuleMail, pb.MsgId_ModMailReceiveAll, &pb.MailReceiveAck{
// ItemList: itemList,
// if len(mail.ItemId) > 0 { })
// if proto.MailStatus(mail.Status) < proto.MailStatusReceived { }
// continue
// } if len(changeList) > 0 {
// } _ = player.Send(pb.ModId_ModuleMail, pb.MsgId_ModMailChange, &pb.MailChangeListAck{
// ChangeList: changeList,
// if proto.MailType(mail.Type) == proto.MailTypeRegion { })
// if proto.MailStatus(mail.Status) >= proto.MailStatusDeleted { }
// continue }
// }
// mail.Status = uint32(proto.MailStatusDeleted) func (this *PlayerHandler) MailDelete(player *logic.Player, msg *net.Message) {
// player.SaveModel(mail) var req = new(pb.MailDeleteReq)
// } else { var err = msg.Read(req)
// delete(player.Mail, id) if err != nil {
// player.WipeModel(mail) this.logger.Error("Read message failed, ", err)
// } _ = player.TipNotice(proto.TipMessageError)
// return
// changeList = append(changeList, &proto.MailChange{Id: id, Status: uint32(proto.MailStatusDeleted)}) }
//
// this.eventManager.PlayerMailLog(player, logic.LogTypeMailDelete, mail.Id, mail.Type, 0, mail.Title, mail.Content, mail.ItemId, mail.ItemNum, 0, mail.CreateTime) if req.Uid == 0 {
// } this.logger.Error("Parameter error, req.Uid == 0")
// _ = player.TipNotice(proto.TipParameterError)
// if len(changeList) > 0 { return
// _ = player.Send(proto.ModIdMail, proto.MsgIdMailDeleteAll, &proto.MsgMailDeleteAllAck{ChangeList: changeList}) }
// }
//} var mail = player.Mail[req.Uid]
if mail == nil {
//this.logger.Error("Parameter error, Player 'Mail' was not found, req.Uid: ", req.Uid)
//_ = player.TipNotice(proto.TipMailNotFound)
return
}
if pb.MailType(mail.Type) == pb.MailType_MailAllRegion {
if pb.MailStatus(mail.Status) >= pb.MailStatus_Deleted {
return
}
mail.Status = uint32(pb.MailStatus_Deleted)
player.SaveModel(mail)
} else {
delete(player.Mail, req.Uid)
player.WipeModel(mail)
}
_ = player.Send(pb.ModId_ModuleMail, pb.MsgId_ModMailChange, &pb.MailChangeListAck{
ChangeList: []*pb.MailChange{{Uid: mail.Uid, Status: pb.MailStatus(mail.Status)}},
})
// this.eventManager.PlayerMailLog(player, logic.LogTypeMailDelete, mail.Id, mail.Type, 0, mail.Title, mail.Content, mail.ItemId, mail.ItemNum, 0, mail.CreateTime)
}
func (this *PlayerHandler) MailDeleteAll(player *logic.Player, _ *net.Message) {
var changeList []*pb.MailChange
for id, mail := range player.Mail {
if pb.MailStatus(mail.Status) < pb.MailStatus_HasRead {
continue
}
if len(mail.Items) > 0 {
if pb.MailStatus(mail.Status) < pb.MailStatus_Received {
continue
}
}
if pb.MailType(mail.Type) == pb.MailType_MailAllRegion {
if pb.MailStatus(mail.Status) >= pb.MailStatus_Deleted {
continue
}
mail.Status = uint32(pb.MailStatus_Deleted)
player.SaveModel(mail)
} else {
delete(player.Mail, id)
player.WipeModel(mail)
}
changeList = append(changeList, &pb.MailChange{Uid: id, Status: pb.MailStatus_Deleted})
//this.eventManager.PlayerMailLog(player, logic.LogTypeMailDelete, mail.Id, mail.Type, 0, mail.Title, mail.Content, mail.ItemId, mail.ItemNum, 0, mail.CreateTime)
}
if len(changeList) > 0 {
_ = player.Send(pb.ModId_ModuleMail, pb.MsgId_ModMailChange, &pb.MailChangeListAck{ChangeList: changeList})
}
}

View File

@ -1,84 +1,71 @@
package logic package logic
//type PlayerMail struct { import (
// Id uint64 `bson:"id" key:"1"` "ecs/proto/pb"
// Type uint32 `bson:"type"` )
// Title string `bson:"title"`
// Content string `bson:"content"` type PlayerMail struct {
// Args []string `bson:"args"` Uid uint64 `bson:"uid" key:"1"`
// Status uint32 `bson:"status"` Type uint32 `bson:"type"`
// ItemId []uint32 `bson:"item_id"` Title string `bson:"title"`
// ItemNum []uint32 `bson:"item_num"` Content string `bson:"content"`
// CreateTime int64 `bson:"create_time"` Status uint32 `bson:"status"`
// Expiration int64 `bson:"expiration"` CreateTime int64 `bson:"create_time"`
//} Expiration int64 `bson:"expiration"`
// Args []string `bson:"args"`
//func (this *PlayerMail) BuildMsgMail() *proto.Mail { Items [][2]uint32 `bson:"items"`
// var itemList []*proto.ItemPair }
// for i, itemId := range this.ItemId {
// itemList = append(itemList, &proto.ItemPair{ItemId: itemId, ItemNum: this.ItemNum[i]}) func (this *PlayerMail) BuildMsgMail() *pb.Mail {
// } var itemList []*pb.Item
// return &proto.Mail{ for i := range this.Items {
// Id: this.Id, itemList = append(itemList, &pb.Item{ItemId: this.Items[i][0], ItemNum: this.Items[i][1]})
// Type: this.Type, }
// Title: this.Title, return &pb.Mail{
// Content: this.Content, Uid: this.Uid,
// Args: this.Args, Type: pb.MailType(this.Type),
// Status: this.Status, Title: this.Title,
// ItemList: itemList, Content: this.Content,
// CreateTime: this.CreateTime, CreateTime: this.CreateTime,
// Expiration: this.Expiration, Expiration: this.Expiration,
// } Status: pb.MailStatus(this.Status),
//} Args: this.Args,
// ItemList: itemList,
//func (this *Player) AddMail(tipe proto.MailType, title, content string, args []string, itemId, itemNum []uint32, createTime int64, expiration ...int64) { }
// counter, err := this.manager.mongoClient.Counter("mail_id", 1) }
// if err != nil {
// this.manager.logger.Error("Get counter failed, ", err) func (this *Player) AddMail(uid uint64, tipe pb.MailType, title, content string, createTime, expiration int64, args []string, items [][2]uint32) {
// return var mail = &PlayerMail{
// } Uid: uid,
// Type: uint32(tipe),
// this.addMail(util.EncryptUid(counter), tipe, title, content, args, itemId, itemNum, createTime, expiration...) Title: title,
//} Content: content,
// Status: uint32(pb.MailStatus_Unread),
//func (this *Player) addMail(mailId uint64, tipe proto.MailType, title, content string, args []string, itemId, itemNum []uint32, createTime int64, expiration ...int64) { CreateTime: createTime,
// var mail = &PlayerMail{ Expiration: expiration,
// Id: mailId, Args: args,
// Type: uint32(tipe), Items: items,
// Title: title, }
// Content: content,
// Args: args, this.Mail[mail.Uid] = mail
// Status: uint32(proto.MailStatusUnread), this.SaveModel(mail)
// ItemId: itemId,
// ItemNum: itemNum, _ = this.Send(pb.ModId_ModuleMail, pb.MsgId_ModMailSend, &pb.MailSendAck{Mail: mail.BuildMsgMail()})
// CreateTime: createTime,
// } //this.manager.eventManager.PlayerMailLog(this, LogTypeMailGet, mail.Id, mail.Type, 0, mail.Title, mail.Content, mail.ItemId, mail.ItemNum, 0, mail.CreateTime)
// }
// if len(expiration) > 0 {
// mail.Expiration = expiration[0] func (this *Player) BuildMsgMailListAck() *pb.MailListAck {
// } else { var mailList []*pb.Mail
// mail.Expiration = mail.CreateTime + util.DayTotalSeconds*30 for _, mail := range this.Mail {
// } if pb.MailStatus(mail.Status) >= pb.MailStatus_Deleted {
// continue
// this.Mail[mail.Id] = mail }
// this.SaveModel(mail) var itemList []*pb.Item
// for i := range mail.Items {
// _ = this.Send(proto.ModIdMail, proto.MsgIdMailSend, &proto.MsgMailSendAck{Mail: mail.BuildMsgMail()}) itemList = append(itemList, &pb.Item{ItemId: mail.Items[i][0], ItemNum: mail.Items[i][1]})
// }
// this.manager.eventManager.PlayerMailLog(this, LogTypeMailGet, mail.Id, mail.Type, 0, mail.Title, mail.Content, mail.ItemId, mail.ItemNum, 0, mail.CreateTime) mailList = append(mailList, mail.BuildMsgMail())
//} }
// return &pb.MailListAck{MailList: mailList}
//func (this *Player) BuildMsgMailListAck() *proto.MsgMailListAck { }
// var mailList []*proto.Mail
// for _, mail := range this.Mail {
// if proto.MailStatus(mail.Status) >= proto.MailStatusDeleted {
// continue
// }
// var itemList []*proto.ItemPair
// for i := range mail.ItemId {
// itemList = append(itemList, &proto.ItemPair{ItemId: mail.ItemId[i], ItemNum: mail.ItemNum[i]})
// }
// mailList = append(mailList, mail.BuildMsgMail())
// }
// return &proto.MsgMailListAck{List: mailList}
//}