Merge branch 'develop' into sdk

This commit is contained in:
hahwu 2025-02-12 12:26:50 +08:00
commit c5de7434f5
26 changed files with 3857 additions and 3340 deletions

View File

@ -235,33 +235,6 @@ func CreateCardId(From, To, CardId int) string {
return fmt.Sprintf("%d_%d_%d_%d_%s", From, To, CardId, Now(), RandString(3)) return fmt.Sprintf("%d_%d_%d_%d_%s", From, To, CardId, Now(), RandString(3))
} }
func PlayroomTrigger(Time int64, Num int) (int64, int) {
if Num == 0 {
return 0, 0
}
Now := Now()
if Time > Now {
return Time, Num
}
var Duration int64
for {
if Num > 50 {
Duration = 1200
} else {
Duration = 3600
}
if Time+Duration > Now {
return Time + Duration, Num
}
Time += Duration
Num -= 10
if Num <= 0 {
return 0, 0
}
}
}
func SplitInt(str, sep string) []int { func SplitInt(str, sep string) []int {
var ret []int var ret []int
for _, v := range strings.Split(str, sep) { for _, v := range strings.Split(str, sep) {

View File

@ -0,0 +1,75 @@
package GoUtil
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"server/conf"
)
const (
FEISHU_WEBHOOK = "https://open.feishu.cn/open-apis/bot/v2/hook/70e24a79-b019-434a-b4d1-4592bbf7c311"
)
func SendFeishuMsg(msg string) error {
// 创建请求体
payload := map[string]interface{}{
"msg_type": "post",
"content": map[string]interface{}{
"post": map[string]interface{}{
"zh_cn": map[string]interface{}{
"title": "服务器报错提醒",
"content": [][]map[string]interface{}{
{
{
"tag": "text",
"text": fmt.Sprintf("AppName:%s", conf.Server.GameName),
// "style": []string{"bold", "lineThrough"},
},
},
{
{
"tag": "text",
"text": fmt.Sprintf("ServerName:%s", conf.Server.ServerName),
// "style": []string{"bold", "lineThrough"},
},
},
{
{
"tag": "text",
"text": msg,
},
},
},
},
},
},
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
return err
}
// 创建HTTP请求
req, err := http.NewRequest("POST", FEISHU_WEBHOOK, bytes.NewBuffer(payloadBytes))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
// 检查响应状态码
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("failed to send message, status code: %d", resp.StatusCode)
}
return nil
}

View File

@ -54,3 +54,11 @@ func GetMaxEnergyMul(Lv int, Energy int) int {
} }
return Mul return Mul
} }
func GetLimitEnergyMul(Lv int) int {
data, err := gamedata.GetDataByIntKey(ENERGY_CFG, Lv+1)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Limit")
}

View File

@ -40,6 +40,14 @@ func GetStarById(Id int) int {
return gamedata.GetIntValue(data, "Star") return gamedata.GetIntValue(data, "Star")
} }
func GetRoundById(Id int) int {
data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, Id)
if err != nil {
log.Debug("GetRoundById data not found")
}
return gamedata.GetIntValue(data, "Round")
}
// 获取开启卡包获得的卡牌数量 // 获取开启卡包获得的卡牌数量
func GetPackRewardCnt(Star int) int { func GetPackRewardCnt(Star int) int {
data, err := gamedata.GetDataByIntKey(CARD_PACK_CFG_NAME, Star) data, err := gamedata.GetDataByIntKey(CARD_PACK_CFG_NAME, Star)

View File

@ -7,15 +7,19 @@ import (
) )
const ( const (
CFG_PLAYROOM_CONST = "PlayroomConst" CFG_PLAYROOM_CONST = "PlayroomConst"
CFG_PLAYROOM_DECORATE = "PlayroomDecorate" CFG_PLAYROOM_DECORATE = "PlayroomDecorate"
CFG_PLAYROOM_MOOD = "PlayroomMood" CFG_PLAYROOM_MOOD = "PlayroomMood"
CFG_PLAYROOM_PHYSIOLOGY = "PlayroomPhysiology"
CFG_PLAYROOM_PHYSIOLOGY_TYPE = "PlayroomPhysiologyType"
) )
func init() { func init() {
gamedata.InitCfg(CFG_PLAYROOM_CONST) gamedata.InitCfg(CFG_PLAYROOM_CONST)
gamedata.InitCfg(CFG_PLAYROOM_DECORATE) gamedata.InitCfg(CFG_PLAYROOM_DECORATE)
gamedata.InitCfg(CFG_PLAYROOM_MOOD) gamedata.InitCfg(CFG_PLAYROOM_MOOD)
gamedata.InitCfg(CFG_PLAYROOM_PHYSIOLOGY)
gamedata.InitCfg(CFG_PLAYROOM_PHYSIOLOGY_TYPE)
} }
func GetUnLockLv() int { func GetUnLockLv() int {
@ -26,6 +30,14 @@ func GetUnLockLv() int {
return gamedata.GetIntValue(data, "Value") return gamedata.GetIntValue(data, "Value")
} }
func GetGameOutline() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "GameOutline")
if err != nil {
return 999
}
return gamedata.GetIntValue(data, "Value")
}
func GetOrderStar() int { func GetOrderStar() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Star") data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Star")
if err != nil { if err != nil {
@ -42,6 +54,14 @@ func GetRewardStar() int {
return gamedata.GetIntValue(data, "Value") return gamedata.GetIntValue(data, "Value")
} }
func GetTriggerCd() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "CD")
if err != nil {
return 1000
}
return gamedata.GetIntValue(data, "Value")
}
func GetNormalItem() (int, int) { func GetNormalItem() (int, int) {
data1, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "NormalFoodId") data1, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "NormalFoodId")
if err != nil { if err != nil {
@ -108,6 +128,14 @@ func GetInteract(Id, Type int) (int, []*item.Item, int) {
return gamedata.GetIntValue(data, "Type"), gamedata.GetItemList(data, "Cost2"), gamedata.GetIntValue(data, "Effect") return gamedata.GetIntValue(data, "Type"), gamedata.GetItemList(data, "Cost2"), gamedata.GetIntValue(data, "Effect")
} }
func GetInteractPhysiology(Id int) (int, int) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_MOOD, Id)
if err != nil {
return 0, 0
}
return gamedata.GetIntValue(data, "PType"), gamedata.GetIntValue(data, "PEffect")
}
func GetInitDecorate() []int { func GetInitDecorate() []int {
r := make([]int, 0) r := make([]int, 0)
data, err := gamedata.GetData(CFG_PLAYROOM_DECORATE) data, err := gamedata.GetData(CFG_PLAYROOM_DECORATE)
@ -141,3 +169,38 @@ func GetBuyItem(Id int) ([]*item.Item, []*item.Item) {
} }
return gamedata.GetItemList(data, "Cost2"), gamedata.GetItemList(data, "Buy") return gamedata.GetItemList(data, "Cost2"), gamedata.GetItemList(data, "Buy")
} }
func GetPhysiologyMax(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_PHYSIOLOGY_TYPE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Max")
}
func GetPhysiologyDuration(Id int, Num int) int {
data, err := gamedata.GetData(CFG_PLAYROOM_PHYSIOLOGY)
if err != nil {
return 0
}
for _, v := range data {
Type := gamedata.GetIntValue(v, "Type")
if Type != Id {
continue
}
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Num >= Min && Num <= Max {
return gamedata.GetIntValue(v, "Per")
}
}
return 0
}
func GetMoodEffect(Id int) (int, int) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_PHYSIOLOGY_TYPE, Id)
if err != nil {
return 0, 0
}
return gamedata.GetIntValue(data, "MType"), gamedata.GetIntValue(data, "MEffect")
}

View File

@ -23,7 +23,7 @@
"ServerName": "Merge_Pet", "ServerName": "Merge_Pet",
"ServerStatus" : 1, "ServerStatus" : 1,
"ServerCenter" : 1, "ServerCenter" : 1,
"GameConfPath": "F:/Github/pet_home_server/src/server/gamedata/config/",
"RedisAddr":"127.0.0.1", "RedisAddr":"127.0.0.1",
"RedisPort" :"6379", "RedisPort" :"6379",

View File

@ -481,6 +481,7 @@ type SqlServerMailStruct struct {
End_time int64 `db:"end_time"` End_time int64 `db:"end_time"`
Mail_type int `db:"mail_type"` Mail_type int `db:"mail_type"`
To_uids string `db:"to_uids"` To_uids string `db:"to_uids"`
CreateTime int64 `db:"create_time"`
} }
type SqlChargeOrderStruct struct { type SqlChargeOrderStruct struct {

View File

@ -1,7 +1,9 @@
package game package game
import ( import (
"encoding/gob"
"fmt" "fmt"
"os"
"server/GoUtil" "server/GoUtil"
"server/conf" "server/conf"
cardCfg "server/conf/card" cardCfg "server/conf/card"
@ -169,6 +171,11 @@ func ReqGmCommand(args []interface{}) error {
OrderMod.EimtOrder = make(map[string]struct{}) OrderMod.EimtOrder = make(map[string]struct{})
HandbookMod := player.PlayMod.getHandbookMod() HandbookMod := player.PlayMod.getHandbookMod()
delete(HandbookMod.BookList, 125) delete(HandbookMod.BookList, 125)
case "deleteOrder":
Id, _ := strconv.Atoi(arg[1])
OrderMod := player.PlayMod.getOrderMod()
delete(OrderMod.OrderList, Id)
player.PushClientRes(OrderMod.BackData())
case "miningReload": case "miningReload":
MiningMod := player.PlayMod.getMiningMod() MiningMod := player.PlayMod.getMiningMod()
MiningMod.ZeroUpdate(-1) MiningMod.ZeroUpdate(-1)
@ -247,6 +254,34 @@ func ReqGmCommand(args []interface{}) error {
case "resetCardSeasonFirst": case "resetCardSeasonFirst":
CardMod := player.PlayMod.getCardMod() CardMod := player.PlayMod.getCardMod()
CardMod.SeasonFirst = false CardMod.SeasonFirst = false
case "addPhysiology":
PlayroomMod := player.PlayMod.getPlayroomMod()
Type, _ := strconv.Atoi(arg[1])
Num, _ := strconv.Atoi(arg[2])
PlayroomMod.AddPhysiology(Type, Num)
case "resetTriggerTime":
PlayroomMod := player.PlayMod.getPlayroomMod()
PlayroomMod.TriggerTime = 0
case "recoverUser":
file, err := os.OpenFile(conf.Server.GameConfPath+"user.info", os.O_RDWR|os.O_CREATE, 0666)
if err != nil {
log.Error("Failed to open user.info file: %v", err)
return err
}
// file.Write(buf.Bytes())
defer file.Close()
Uid := player.M_DwUin
file.Seek(0, 0)
decoder := gob.NewDecoder(file)
modList := PlayerModList{}
err = decoder.Decode(&modList)
player.PlayMod.mod_list = modList
if err != nil {
log.Error("Failed to decode user.info file: %v", err)
return err
}
BaseMod := player.PlayMod.getBaseMod()
BaseMod.Uid = Uid
} }
player.PlayMod.save() player.PlayMod.save()
return nil return nil

View File

@ -5,11 +5,13 @@ import (
"math" "math"
"server/GoUtil" "server/GoUtil"
baseCfg "server/conf/base" baseCfg "server/conf/base"
playroomCfg "server/conf/playroom"
userCfg "server/conf/user" userCfg "server/conf/user"
"server/game/mod/card" "server/game/mod/card"
"server/game/mod/item" "server/game/mod/item"
"server/game/mod/limitedTimeEvent" "server/game/mod/limitedTimeEvent"
MsgMod "server/game/mod/msg" // Ensure this package exists and is correctly referenced MsgMod "server/game/mod/msg" // Ensure this package exists and is correctly referenced
"server/game/mod/playroom"
"server/msg" "server/msg"
"time" "time"
) )
@ -137,17 +139,34 @@ func LimitedTimeCardTrigger(p *Player) {
}, "LimitedTimeCard") }, "LimitedTimeCard")
} }
} }
func LimitedTimePlayroomTrigger(p *Player) {
func LimitedTimePlayroomTrigger(p *Player, Id int) { PlayroomMod := p.PlayMod.getPlayroomMod()
for k, v := range PlayroomMod.Physiology {
if v.Time > 0 {
LimitedTimePlayroomTrigger_(p, k)
}
}
p.PushClientRes(PlayroomMod.NotifyMood())
}
func LimitedTimePlayroomTrigger_(p *Player, Id int) {
PlayroomMod := p.PlayMod.getPlayroomMod() PlayroomMod := p.PlayMod.getPlayroomMod()
Now := GoUtil.Now() Now := GoUtil.Now()
MoodInfo := PlayroomMod.GetMoodInfo(Id) Physiology := PlayroomMod.GetPhysiology(Id)
if MoodInfo == nil { if Physiology == nil {
return return
} }
NewTime, Num := GoUtil.PlayroomTrigger(MoodInfo.Time, MoodInfo.Num) NewTime, Num := PlayroomTrigger(Physiology.Id, Physiology.Time, Physiology.Num)
MoodInfo.Time = NewTime Physiology.Time = NewTime
MoodInfo.Num = Num DiffValue := Physiology.Num - Num
MType, MEffect := playroomCfg.GetMoodEffect(Physiology.Id)
CleanMood := PlayroomMod.GetMoodInfo(playroom.MOOD_TYPE_CLEAN)
// 上厕所数值为0 且清洁度大于50时清洁度降至50
if Id == playroom.PHYSIOLOGY_TYPE_TOLIET && Num == 0 && CleanMood.Num > 50 {
CleanMood.Num = 50
} else {
PlayroomMod.AddMood(MType, -MEffect*DiffValue)
}
Physiology.Num = Num
p.PlayMod.save() p.PlayMod.save()
PlayroomBackData(p) PlayroomBackData(p)
NextSecond := NewTime - Now NextSecond := NewTime - Now
@ -155,12 +174,42 @@ func LimitedTimePlayroomTrigger(p *Player, Id int) {
p.CallEvent(time.Duration(NextSecond)*time.Second, func() { p.CallEvent(time.Duration(NextSecond)*time.Second, func() {
p.lock.Lock() p.lock.Lock()
defer p.lock.Unlock() defer p.lock.Unlock()
LimitedTimePlayroomTrigger(p, Id) LimitedTimePlayroomTrigger_(p, Id)
p.SendClientRes() p.SendClientRes()
}, fmt.Sprintf("Playroom_%d", Id)) }, fmt.Sprintf("Playroom_%d", Id))
} }
} }
func PlayroomTrigger(Id int, Time int64, Num int) (int64, int) {
if Num == 0 {
return 0, 0
}
Now := GoUtil.Now()
if Time > Now {
return Time, Num
}
if Time == Now {
NeedDuration := playroomCfg.GetPhysiologyDuration(Id, Num)
return Time + int64(NeedDuration), Num
}
n := 0
for {
if n > 100 {
return 0, 0
}
Num--
NeedDuration := playroomCfg.GetPhysiologyDuration(Id, Num)
Time += int64(NeedDuration)
if Time > Now {
return Time, Num
}
if Num == 0 {
return 0, 0
}
n++
}
}
func LimitedTimePlayroomWorkTrigger(p *Player) { func LimitedTimePlayroomWorkTrigger(p *Player) {
PlayroomMod := p.PlayMod.getPlayroomMod() PlayroomMod := p.PlayMod.getPlayroomMod()
EndTime := PlayroomMod.Endtime EndTime := PlayroomMod.Endtime

View File

@ -9,6 +9,11 @@ import (
"strings" "strings"
) )
const (
MAIL_TYPE_SERVER = 1
MAIL_TYPE_USER = 2
)
type MailMgr struct { type MailMgr struct {
*ServerMod *ServerMod
list map[int]*ServerMail list map[int]*ServerMail
@ -38,10 +43,18 @@ func (m *MailMgr) Init() {
m.list = make(map[int]*ServerMail) m.list = make(map[int]*ServerMail)
// 注册处理函数 // 注册处理函数
m.init() m.init()
m.LoadMail() m.LoadMail(nil)
m.RegisterHandler(msg.HANDLE_TYPE_MAIL_ADD, m.AddMail)
m.RegisterHandler(msg.HANDLE_TYPE_MAIL_RELOAD, m.LoadMail)
} }
func (r *MailMgr) LoadMail() { func (m *MailMgr) AddMail(msg *msg.Msg) (interface{}, error) {
ServerMail := msg.Extra.(*ServerMail)
m.list[ServerMail.Id] = ServerMail
return nil, nil
}
func (r *MailMgr) LoadMail(msg *msg.Msg) (interface{}, error) {
// 从数据库加载邮件 // 从数据库加载邮件
data := make([]*db.SqlServerMailStruct, 0) data := make([]*db.SqlServerMailStruct, 0)
db.GetServerMailData(&data) db.GetServerMailData(&data)
@ -65,8 +78,30 @@ func (r *MailMgr) LoadMail() {
To_uids: Uids, To_uids: Uids,
} }
} }
return nil, nil
} }
func (r *MailMgr) Sync() { func (r *MailMgr) Sync(Uid int, Register int64) []ServerMail {
G_GameLogicPtr.NotifyAll(&msg.Msg{Type: msg.HANDLE_TYPE_MAIL, Extra: r.list[1]}) // 同步邮件
Now := GoUtil.Now()
list := make([]ServerMail, 0)
for _, v := range r.list {
if v.Start_time > 0 && v.Start_time > Now {
continue
}
if v.End_time > 0 && v.End_time < Now {
continue
}
if v.Register_time > 0 && v.Register_time < Register {
continue
}
if v.Mail_type == MAIL_TYPE_SERVER { //全服邮件
list = append(list, *v)
} else {
if GoUtil.InArray(Uid, v.To_uids) {
list = append(list, *v)
}
}
}
return list
} }

View File

@ -340,33 +340,19 @@ func (p *Player) Login() {
LimitedTimeEventTrigger(p, 0) LimitedTimeEventTrigger(p, 0)
// 猪猪银行触发 // 猪猪银行触发
LimitedTimePiggyBankTrigger(p) LimitedTimePiggyBankTrigger(p)
// playroom触发
LimitedTimePlayroomTrigger(p, playroom.MOOD_TYPE_ENTER)
LimitedTimePlayroomTrigger(p, playroom.MOOD_TYPE_FOOD)
LimitedTimePlayroomTrigger(p, playroom.MOOD_TYPE_CLEAN)
LimitedTimePlayroomWorkTrigger(p)
LimitedTimeEnergyAdd(p)
ActivityLogin(p)
LoignBack(p)
BaseMod := p.PlayMod.getBaseMod() BaseMod := p.PlayMod.getBaseMod()
// playroom触发
PlayroomMod := p.PlayMod.getPlayroomMod()
PlayroomMod.UnLock(BaseMod.GetLevel())
LimitedTimePlayroomTrigger(p) // playroom数值变化
LimitedTimePlayroomWorkTrigger(p) // playroom打工
LimitedTimeEnergyAdd(p) // 能量定时处理
ActivityLogin(p) // 活动登录
LoignBack(p) // 登录返回数据
SyncMailMsg(p) // 同步邮件
BaseMod.Login() BaseMod.Login()
p.PlayMod.getCardMod().Login(G_GameLogicPtr.SeverInfo.OpenTime) HandbookItem := p.PlayMod.getCardMod().Login(G_GameLogicPtr.SeverInfo.OpenTime)
if p.PlayerBaseMod.Data.UserName == "388faebe29ffe56666a04ea22b902b0f" { p.HandleItem(HandbookItem, msg.ITEM_POP_LABEL_AllCollectRewardHB.String())
VarMod := p.PlayMod.getVarMod()
Mail1, _ := VarMod.GetVar(2)
if Mail1 != nil {
return
}
VarMod.SetVar(2, 1)
Items := make([]*item.Item, 0)
Items = append(Items, &item.Item{Id: item.ITEM_ENERGY_ID, Num: 500})
MailMod := p.PlayMod.getMailMod()
MailMod.Send("Game Bug Report Handling & Compensation",
`We sincerely apologize for this issue that has affected your experience.
One of our collleague will contact you soon, and we kindly ask for your cooperation with the QA process.
As a token of our appreciation, here is 500 Energy for your trouble.
Once again, we deeply regret any trouble this may have caused and thank you for your understanding and support.`, Items)
}
} }
func (p *Player) Outline() { func (p *Player) Outline() {
@ -379,6 +365,7 @@ func (p *Player) Outline() {
BaseMod := p.PlayMod.getBaseMod() BaseMod := p.PlayMod.getBaseMod()
BaseMod.Outline(int(Cacumulative)) BaseMod.Outline(int(Cacumulative))
p.PlayMod.save() p.PlayMod.save()
p.UpdateUserInfo()
} }
// 离线 保存数据 // 离线 保存数据
@ -739,6 +726,7 @@ func (p *Player) GetSimpleData(Uid int, simple *PlayerSimpleData) error {
func (p *Player) UpdateUserInfo() { func (p *Player) UpdateUserInfo() {
simple := &PlayerSimpleData{} simple := &PlayerSimpleData{}
Base := p.GetPlayerBaseMod() Base := p.GetPlayerBaseMod()
BaseMod := p.PlayMod.getBaseMod()
simple.Name = p.PlayMod.getBaseMod().NickName simple.Name = p.PlayMod.getBaseMod().NickName
simple.Avatar = p.PlayMod.getAvatarMod().SetId simple.Avatar = p.PlayMod.getAvatarMod().SetId
simple.Uid = int(p.M_DwUin) simple.Uid = int(p.M_DwUin)
@ -746,8 +734,8 @@ func (p *Player) UpdateUserInfo() {
simple.Face = p.PlayMod.getFaceMod().SetId simple.Face = p.PlayMod.getFaceMod().SetId
simple.Level = p.GetPlayerBaseMod().GetLevel() simple.Level = p.GetPlayerBaseMod().GetLevel()
simple.Decorate = p.PlayMod.getDecorateMod().DecorateNum simple.Decorate = p.PlayMod.getDecorateMod().DecorateNum
simple.Login = int64(Base.Data.LoginTime) simple.Login = int64(BaseMod.LoginTime)
simple.Loginout = int64(Base.Data.LogoutTime) simple.Loginout = int64(BaseMod.LogoutTime)
simple.FaceBook = Base.Data.FaceBookId simple.FaceBook = Base.Data.FaceBookId
simple.FaceBookPic = p.PlayMod.getBaseMod().FacebookUrl simple.FaceBookPic = p.PlayMod.getBaseMod().FacebookUrl
simple.Playroom = p.PlayMod.getPlayroomMod().Room simple.Playroom = p.PlayMod.getPlayroomMod().Room

View File

@ -426,6 +426,10 @@ func (p *PlayerBaseData) ClearData() bool {
return true return true
} }
func (p *PlayerBaseData) GetRegisterTime() int64 {
return int64(p.Data.Rolecreatetime)
}
// 增加减少体力 // 增加减少体力
func (p *PlayerBaseData) AddEnergy(player *Player, cnt int) error { func (p *PlayerBaseData) AddEnergy(player *Player, cnt int) error {
BaseMod := p.p.PlayMod.getBaseMod() BaseMod := p.p.PlayMod.getBaseMod()
@ -435,6 +439,8 @@ func (p *PlayerBaseData) AddEnergy(player *Player, cnt int) error {
} }
if cnt < 0 { if cnt < 0 {
player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_ENERGY, A: []interface{}{-cnt}}) player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_ENERGY, A: []interface{}{-cnt}})
BaseMod.FormatEnergyMul(NewEnergy)
p.p.PushClientRes(BaseMod.BackData())
} }
if BaseMod.Energy >= p.GetMaxEnergy() && NewEnergy < p.GetMaxEnergy() { if BaseMod.Energy >= p.GetMaxEnergy() && NewEnergy < p.GetMaxEnergy() {
Recover := userCfg.GetRecover(int(BaseMod.Level)) Recover := userCfg.GetRecover(int(BaseMod.Level))
@ -523,9 +529,10 @@ func (p *PlayerBaseData) AddExp(player *Player, exp int) (int, error) {
return 0, err return 0, err
} }
} }
PlayroomMod := player.PlayMod.getPlayroomMod()
PlayroomMod.UnLock(int(BaseMod.Level))
player.PushClientRes(p.BackAsset()) player.PushClientRes(p.BackAsset())
return upLv, nil return upLv, nil
} }
func (p *PlayerBaseData) GetLevel() int { func (p *PlayerBaseData) GetLevel() int {

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"math" "math"
"server/GoUtil" "server/GoUtil"
"server/conf"
mergeDataCfg "server/conf/mergeData" mergeDataCfg "server/conf/mergeData"
orderCfg "server/conf/order" orderCfg "server/conf/order"
"server/game/mod/item" "server/game/mod/item"
@ -113,9 +114,9 @@ func (p *PlayerChessData) UpdateChessData(player *Player, MChessData map[string]
// 检查棋子数据是否一致 // 检查棋子数据是否一致
func (p *PlayerChessData) checkChessEqual(player *Player) bool { func (p *PlayerChessData) checkChessEqual(player *Player) bool {
// if len(p.Data.MChessData) == 0 { if len(p.Data.MChessData) == 0 && conf.Server.GameName == "Merge_Pet_Local" {
// return true return true
// } }
ChessList := player.PlayMod.getChessMod().GetChessList() ChessList := player.PlayMod.getChessMod().GetChessList()
if len(ChessList) != len(p.Data.MChessData) { if len(ChessList) != len(p.Data.MChessData) {
return false return false
@ -197,9 +198,9 @@ func (p *PlayerChessData) HandleChess(player *Player, handle_list []*msg.ChessHa
itemList = append(itemList, &item.Item{Id: item.ITEM_STAR_ID, Num: int(-loseGold)}) itemList = append(itemList, &item.Item{Id: item.ITEM_STAR_ID, Num: int(-loseGold)})
case msg.HANDLE_TYPE_SELL: //出售棋子 case msg.HANDLE_TYPE_SELL: //出售棋子
items, err := ChessMod.SellChess(ChessId) items, err := ChessMod.SellChess(ChessId)
// if checkChess(ChessId, BaseMod.GetEnergyMul(), ChessMod.GetEmitList()) { // 在订单中无法生成的棋子 出售获得原价宠物币 if checkChess(ChessId, BaseMod.GetEnergyMul(), ChessMod.GetEmitList()) { // 在订单中无法生成的棋子 出售获得原价宠物币
// items = []*item.Item{{Id: item.ITEM_STAR_ID, Num: mergeDataCfg.GetStarById(ChessId)}} items = []*item.Item{{Id: item.ITEM_STAR_ID, Num: mergeDataCfg.GetStarById(ChessId)}}
// } }
if err != nil { if err != nil {
return err return err
} }
@ -241,7 +242,14 @@ func (p *PlayerChessData) ClearData() bool {
} }
func checkChess(ChessId, EnergyMul int, Emit []int) bool { func checkChess(ChessId, EnergyMul int, Emit []int) bool {
if len(Emit) == 0 {
return false
}
ChessIdLv := mergeDataCfg.GetLvById(ChessId) ChessIdLv := mergeDataCfg.GetLvById(ChessId)
ChessIdType := mergeDataCfg.GetTypeById(ChessId)
if ChessIdType != "Product" {
return false
}
ChessIdColor := mergeDataCfg.GetColorById(ChessId) ChessIdColor := mergeDataCfg.GetColorById(ChessId)
if ChessIdColor == "Star" || ChessIdColor == "Energy" || ChessIdColor == "Diamond" { if ChessIdColor == "Star" || ChessIdColor == "Energy" || ChessIdColor == "Diamond" {
return false return false
@ -254,12 +262,9 @@ func checkChess(ChessId, EnergyMul int, Emit []int) bool {
break break
} }
} }
Min, Max := getChesslvRange(EmitId, EnergyMul) _, Max := getChesslvRange(EmitId, EnergyMul)
Adjust := mergeDataCfg.GetAdjust(EmitId, ChessIdColor) Adjust := mergeDataCfg.GetAdjust(EmitId, ChessIdColor)
if ChessIdLv < Min-Adjust || ChessIdLv > Max-Adjust { return ChessIdLv > Max-Adjust
return true
}
return false
} }
func getChesslvRange(Emit int, EnergyMul int) (int, int) { func getChesslvRange(Emit int, EnergyMul int) (int, int) {
@ -275,11 +280,14 @@ func getChesslvRange(Emit int, EnergyMul int) (int, int) {
} }
func triggerComposeChess(player *Player, ChessId, EnergyMul int, Emit []int) { func triggerComposeChess(player *Player, ChessId, EnergyMul int, Emit []int) {
return //TODO 暂时不用 return
OrderMod := player.PlayMod.getOrderMod()
if OrderMod.Step != 12 {
return
}
if !checkChess(ChessId, EnergyMul, Emit) { if !checkChess(ChessId, EnergyMul, Emit) {
return return
} }
OrderMod := player.PlayMod.getOrderMod()
OrderMod.CreateCleanOrder2([]int{ChessId}) OrderMod.CreateCleanOrder2([]int{ChessId})
player.PushClientRes(OrderMod.BackData()) player.PushClientRes(OrderMod.BackData())
} }

View File

@ -191,28 +191,7 @@ func handle(p *Player, m *msg.Msg) error {
case msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY: // # 锦标赛排名变动通知 case msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY: // # 锦标赛排名变动通知
BackChampship(p) BackChampship(p)
case msg.HANDLE_TYPE_MAIL: // 邮件操作 case msg.HANDLE_TYPE_MAIL: // 邮件操作
MailMod := p.PlayMod.getMailMod() SyncMailMsg(p)
if m.Extra == nil {
return nil
}
mail := m.Extra.(*ServerMail)
Now := GoUtil.Now()
if mail.Mail_type == 1 {
if mail.Start_time > 0 && mail.Start_time > Now {
return nil
}
if mail.End_time > 0 && mail.End_time < Now {
return nil
}
MailId := MailMod.Send(mail.Title, mail.Content, mail.Items)
p.PushClientRes(MailMod.NotifyMail(MailId))
} else if mail.Mail_type == 2 {
if GoUtil.InArray(int(p.M_DwUin), mail.To_uids) {
MailId := MailMod.Send(mail.Title, mail.Content, mail.Items)
p.PushClientRes(MailMod.NotifyMail(MailId))
}
}
case msg.HANDLE_TYPE_PLAYROOM_LOSE: // # 玩家输了 case msg.HANDLE_TYPE_PLAYROOM_LOSE: // # 玩家输了
PlayroomMod := p.PlayMod.getPlayroomMod() PlayroomMod := p.PlayMod.getPlayroomMod()
Items := make([]*item.Item, 0) Items := make([]*item.Item, 0)
@ -322,6 +301,18 @@ func SyncFriendMsg(p *Player) {
p.PlayMod.save() p.PlayMod.save()
} }
func SyncMailMsg(p *Player) {
ServerMailList := G_GameLogicPtr.MailMgr.Sync(int(p.M_DwUin), p.GetPlayerBaseMod().GetRegisterTime())
MailMod := p.PlayMod.getMailMod()
for _, v := range ServerMailList {
if GoUtil.InArray(v.Id, MailMod.ServerMail) {
continue
}
MailMod.ServerMail = append(MailMod.ServerMail, v.Id)
MailMod.Send(v.Title, v.Content, v.Items)
}
}
// 返回好友信息 // 返回好友信息
func FriendListBackData(p *Player) { func FriendListBackData(p *Player) {
FriendMod := p.PlayMod.getFriendMod() FriendMod := p.PlayMod.getFriendMod()
@ -534,6 +525,12 @@ func BackChampship(p *Player) {
} }
func PlayroomOrderTrigger(p *Player) error { func PlayroomOrderTrigger(p *Player) error {
CD := playroomCfg.GetTriggerCd()
PlayroomMod := p.PlayMod.getPlayroomMod()
Now := GoUtil.Now()
if PlayroomMod.TriggerTime+int64(CD) > Now {
return nil
}
PlayroomUnlockLv := playroomCfg.GetUnLockLv() PlayroomUnlockLv := playroomCfg.GetUnLockLv()
if p.GetPlayerBaseMod().GetLevel() < PlayroomUnlockLv { if p.GetPlayerBaseMod().GetLevel() < PlayroomUnlockLv {
return nil return nil
@ -547,7 +544,6 @@ func PlayroomOrderTrigger(p *Player) error {
log.Debug("uid : %d, PlayroomOrderTrigger, err : %s", p.M_DwUin, err) log.Debug("uid : %d, PlayroomOrderTrigger, err : %s", p.M_DwUin, err)
return err return err
} }
PlayroomMod := p.PlayMod.getPlayroomMod()
PlayroomMod.CreateOrderReward(Star, p.PlayMod.getItemMod()) PlayroomMod.CreateOrderReward(Star, p.PlayMod.getItemMod())
PlayroomBackData(p) PlayroomBackData(p)
p.PlayMod.save() p.PlayMod.save()
@ -606,6 +602,7 @@ func PlayroomBackData(p *Player) {
r.WorkStatus = int32(PlayroomMod.WorkStatus) r.WorkStatus = int32(PlayroomMod.WorkStatus)
r.Playroom = GoUtil.MapIntToInt32(PlayroomMod.GetRoom()) r.Playroom = GoUtil.MapIntToInt32(PlayroomMod.GetRoom())
r.Mood = GoUtil.MapIntToInt32(PlayroomMod.GetMood()) r.Mood = GoUtil.MapIntToInt32(PlayroomMod.GetMood())
r.Physiology = GoUtil.MapIntToInt32(PlayroomMod.GetPhysiologyList())
r.AllMood = int32(PlayroomMod.AllMood) r.AllMood = int32(PlayroomMod.AllMood)
r.Jackpot = int32(PlayroomMod.JackpotNum) r.Jackpot = int32(PlayroomMod.JackpotNum)
p.PushClientRes(r) p.PushClientRes(r)

View File

@ -184,10 +184,10 @@ func ReqRewardOrder(args []interface{}) error {
proto.Unmarshal(buf, req) proto.Unmarshal(buf, req)
OrderMod := player.PlayMod.getOrderMod() OrderMod := player.PlayMod.getOrderMod()
ChessMod := player.PlayMod.getChessMod() ChessMod := player.PlayMod.getChessMod()
PlayroomMod := player.PlayMod.getPlayroomMod()
LimitedTimeEventMod := player.PlayMod.getLimitedTimeEventMod() LimitedTimeEventMod := player.PlayMod.getLimitedTimeEventMod()
Item, mergeList, OrderType, Star, err := OrderMod.RewardOrder(int(req.OrderId)) Item, mergeList, OrderType, Star, err := OrderMod.RewardOrder(int(req.OrderId))
if OrderType == order.Trigger_type { // playroom触发式订单获取额外道具 if OrderType == order.Trigger_type { // playroom触发式订单获取额外道具
PlayroomMod := player.PlayMod.getPlayroomMod()
Item1 := PlayroomMod.GetReward() Item1 := PlayroomMod.GetReward()
Item = item.Merge(Item, Item1) Item = item.Merge(Item, Item1)
P1, P2 := playroomCfg.GetPremiumItem() P1, P2 := playroomCfg.GetPremiumItem()
@ -196,6 +196,10 @@ func ReqRewardOrder(args []interface{}) error {
} else { } else {
Star = int(math.Ceil(float64(Star) * 0.6)) Star = int(math.Ceil(float64(Star) * 0.6))
} }
Target := GetVisitorPlayer(player)
PlayroomMod.Target = Target
PlayroomMod.Status = playroom.STATUS_VISIT
PlayroomBackData(player)
} }
if !OrderMod.CheckSuperOrder() { if !OrderMod.CheckSuperOrder() {
@ -887,7 +891,7 @@ func ReqExStarReward(args []interface{}) error {
func ReqAllCollectReward(args []interface{}) error { func ReqAllCollectReward(args []interface{}) error {
_, player, _ := ParseArgs(args) _, player, _ := ParseArgs(args)
CardMod := player.PlayMod.getCardMod() CardMod := player.PlayMod.getCardMod()
itemList, err := CardMod.AllCollectReward() itemList, itemList2, err := CardMod.AllCollectReward()
if err != nil { if err != nil {
player.SendErrClienRes(&msg.ResAllCollectReward{ player.SendErrClienRes(&msg.ResAllCollectReward{
Code: msg.RES_CODE_FAIL, Code: msg.RES_CODE_FAIL,
@ -904,6 +908,14 @@ func ReqAllCollectReward(args []interface{}) error {
}) })
return err return err
} }
err = player.HandleItem(itemList2, msg.ITEM_POP_LABEL_AllCollectRewardHB.String())
if err != nil {
player.SendErrClienRes(&msg.ResAllCollectReward{
Code: msg.RES_CODE_FAIL,
Msg: err.Error(),
})
return err
}
player.PlayMod.save() player.PlayMod.save()
player.PushClientRes(CardMod.NotifyCard()) player.PushClientRes(CardMod.NotifyCard())
player.PushClientRes(&msg.ResAllCollectReward{ player.PushClientRes(&msg.ResAllCollectReward{
@ -2929,7 +2941,8 @@ func ReqPlayroomInfo(args []interface{}) error {
} }
PlayerData := G_GameLogicPtr.GetSimplePlayerByUid(Targer) PlayerData := G_GameLogicPtr.GetSimplePlayerByUid(Targer)
PlayroomMod.SetTarget(Targer) PlayroomMod.SetTarget(Targer)
if PlayerData.Loginout < GoUtil.Now()-300 { // todo DEBUG if PlayerData.Loginout > 0 && PlayerData.Loginout < GoUtil.Now()-int64(playroomCfg.GetGameOutline()) { // todo DEBUG
log.Debug("ReqPlayroomInfo PlayerData.Loginout:%v, %v", PlayerData.Loginout, playroomCfg.GetGameOutline())
PlayroomMod.SetGameId(1) PlayroomMod.SetGameId(1)
Star := min(500, max(PlayerData.Star/10, 10)) Star := min(500, max(PlayerData.Star/10, 10))
ChessMod := player.PlayMod.getChessMod() ChessMod := player.PlayMod.getChessMod()
@ -2959,7 +2972,7 @@ func ReqPlayroomInfo(args []interface{}) error {
PlayroomMod.SetGameId(2) PlayroomMod.SetGameId(2)
PlayroomMod.SetGameRewardFlip(int(float64(PlayerData.Star)*0.03), int(float64(PlayerData.Star)*0.05), int(float64(PlayerData.Star)*0.1)) PlayroomMod.SetGameRewardFlip(int(float64(PlayerData.Star)*0.03), int(float64(PlayerData.Star)*0.05), int(float64(PlayerData.Star)*0.1))
} }
player.PlayMod.save()
PlayroomVisit(player, Targer) PlayroomVisit(player, Targer)
return nil return nil
} }
@ -2970,7 +2983,7 @@ func ReqPlayroomInteract(args []interface{}) error {
req := &msg.ReqPlayroomInteract{} req := &msg.ReqPlayroomInteract{}
proto.Unmarshal(buf, req) proto.Unmarshal(buf, req)
PlayroomMod := player.PlayMod.getPlayroomMod() PlayroomMod := player.PlayMod.getPlayroomMod()
Items, MoodType, err := PlayroomMod.Interact(int(req.Id), int(req.Type)) Items, _, err := PlayroomMod.Interact(int(req.Id), int(req.Type))
if err != nil { if err != nil {
player.SendErrClienRes(&msg.ResPlayroomInteract{ player.SendErrClienRes(&msg.ResPlayroomInteract{
Code: msg.RES_CODE_FAIL, Code: msg.RES_CODE_FAIL,
@ -2987,7 +3000,7 @@ func ReqPlayroomInteract(args []interface{}) error {
return err return err
} }
player.PlayMod.save() player.PlayMod.save()
LimitedTimePlayroomTrigger(player, MoodType) LimitedTimePlayroomTrigger(player)
player.PushClientRes(PlayroomMod.NotifyMood()) player.PushClientRes(PlayroomMod.NotifyMood())
player.PushClientRes(&msg.ResPlayroomInteract{ player.PushClientRes(&msg.ResPlayroomInteract{
Code: msg.RES_CODE_SUCCESS, Code: msg.RES_CODE_SUCCESS,

View File

@ -180,3 +180,11 @@ func UnitOrder2(p *Player, Lv, EnergyMul int) float64 {
} }
return Energy / float64(5000) return Energy / float64(5000)
} }
func UnitPlayroom(p *Player) error {
PlayroomMod := p.PlayMod.getPlayroomMod()
PlayroomMod.Physiology[1].Num = 10
PlayroomMod.Physiology[1].Time = 1738978968
LimitedTimePlayroomTrigger(p)
return nil
}

View File

@ -3,6 +3,8 @@ package game
import ( import (
"encoding/json" "encoding/json"
"server/GoUtil" "server/GoUtil"
Msg "server/game/mod/msg"
"server/gamedata"
"server/msg" "server/msg"
"server/pkg/github.com/name5566/leaf/gate" "server/pkg/github.com/name5566/leaf/gate"
"server/pkg/github.com/name5566/leaf/log" "server/pkg/github.com/name5566/leaf/log"
@ -11,8 +13,10 @@ import (
) )
var AdminFuncMap = map[string]func([]interface{}) error{ var AdminFuncMap = map[string]func([]interface{}) error{
"ReqAdminInfo": AdminPlayerInfo, "ReqAdminInfo": AdminPlayerInfo,
"ReqServerInfo": ReqServerInfo, "ReqServerInfo": ReqServerInfo,
"ReqReloadServerMail": ReqReloadServerMail,
"ReqReload": ReqReload,
} }
func AdminProcess(Func string, args []interface{}) { func AdminProcess(Func string, args []interface{}) {
@ -92,3 +96,22 @@ func ReqServerInfo(args []interface{}) error {
AdminPlayerBack(a, JsonBuff) AdminPlayerBack(a, JsonBuff)
return nil return nil
} }
func ReqReloadServerMail(args []interface{}) error {
G_GameLogicPtr.MailMgrCall(&Msg.Msg{Type: Msg.HANDLE_TYPE_MAIL_RELOAD})
G_GameLogicPtr.NotifyAll(&Msg.Msg{Type: Msg.HANDLE_TYPE_MAIL})
return nil
}
func ReqReload(args []interface{}) error {
a, _ := ParseAdminArgs(args)
gamedata.Reload()
res := make(map[string]interface{})
res["Code"] = 0
JsonBuff, err := json.Marshal(res)
if err != nil {
return err
}
AdminPlayerBack(a, JsonBuff)
return nil
}

View File

@ -1,6 +1,7 @@
package game package game
import ( import (
"fmt"
"reflect" "reflect"
"server/GoUtil" "server/GoUtil"
"server/MergeConst" "server/MergeConst"
@ -80,7 +81,6 @@ func HandleClientReq(args []interface{}) {
ResRegisterAccount.ResultCode = MergeConst.Protocol_Error_Account_OR_PWD_Short ResRegisterAccount.ResultCode = MergeConst.Protocol_Error_Account_OR_PWD_Short
data, _ := proto.Marshal(ResRegisterAccount) data, _ := proto.Marshal(ResRegisterAccount)
gl.PackResInfo(a, "ResRegisterAccount", data) gl.PackResInfo(a, "ResRegisterAccount", data)
break break
} }
gl.Db_AccountInfo.UserName = detail.UserName gl.Db_AccountInfo.UserName = detail.UserName
@ -160,7 +160,8 @@ func HandleClientReq(args []interface{}) {
backup := p.(*Player).BackUp() // 备份当前的 Player 值 backup := p.(*Player).BackUp() // 备份当前的 Player 值
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
log.Debug("uid : %d, func : %s, fatal : %s", p.(*Player).M_DwUin, m.GetFunc(), r) log.Error("uid : %d, func : %s, fatal : %s", p.(*Player).M_DwUin, m.GetFunc(), r)
GoUtil.SendFeishuMsg(fmt.Sprintf("uid : %d, func : %s, fatal : %s", p.(*Player).M_DwUin, m.GetFunc(), r))
p.(*Player).Recover(backup) //还原Player的数据 p.(*Player).Recover(backup) //还原Player的数据
} }
p.(*Player).lock.Unlock() //解锁 p.(*Player).lock.Unlock() //解锁

View File

@ -47,7 +47,7 @@ func (b *Base) InitData(Uid int) {
func (b *Base) Login() { func (b *Base) Login() {
b.LoginTime = GoUtil.Now() b.LoginTime = GoUtil.Now()
// b.LogoutTime = 0 b.LogoutTime = 0
} }
func (b *Base) GetNickName() string { func (b *Base) GetNickName() string {
@ -211,3 +211,20 @@ func (b *Base) GetEnergyByAD() ([]*item.Item, error) {
b.EnergyAD += 1 b.EnergyAD += 1
return []*item.Item{{Id: item.ITEM_ENERGY_ID, Num: 25}}, nil return []*item.Item{{Id: item.ITEM_ENERGY_ID, Num: 25}}, nil
} }
func (b *Base) FormatEnergyMul(Energy int) {
for {
EnergyLimit := baseCfg.GetLimitEnergyMul(b.Level)
if EnergyLimit == 0 {
return
}
if Energy > EnergyLimit {
return
}
b.EnergyMul--
if b.EnergyMul < 0 {
b.EnergyMul = 0
return
}
}
}

View File

@ -39,6 +39,11 @@ const (
MASTER_CARD_GOLD = 7 MASTER_CARD_GOLD = 7
) )
const (
HANDBOOK_STATUS_IDLE = 1 // 未领取
HANDBOOK_STATUS_GET = 2 // 已领取
)
const ( const (
TYPE_CARD_GIVE = 1 // 请求卡牌 TYPE_CARD_GIVE = 1 // 请求卡牌
TYPE_CARD_SEND = 2 // 赠送卡牌 TYPE_CARD_SEND = 2 // 赠送卡牌
@ -101,14 +106,15 @@ func (c *CardMod) InitData() {
for k := range c.CardList { for k := range c.CardList {
if _, ok := c.Handbook[k]; !ok { if _, ok := c.Handbook[k]; !ok {
c.Handbook[k] = 1 c.Handbook[k] = HANDBOOK_STATUS_IDLE
} }
} }
} }
func (c *CardMod) Login(ServerOpenTime int64) { func (c *CardMod) Login(ServerOpenTime int64) []*item.Item {
Now := GoUtil.Now() Now := GoUtil.Now()
Duration := cardCfg.GetCardDuration() Duration := cardCfg.GetCardDuration()
HandbookItemNum := 0
if c.EndTime < Now { if c.EndTime < Now {
c.CardList = make(map[int]int) c.CardList = make(map[int]int)
c.ExchangeStar = 0 c.ExchangeStar = 0
@ -116,10 +122,22 @@ func (c *CardMod) Login(ServerOpenTime int64) {
c.AllCollect = 0 c.AllCollect = 0
c.EndTime = 0 c.EndTime = 0
c.Round = 0 c.Round = 0
c.Handbook = make(map[int]int)
for k, v := range c.Handbook {
if v == HANDBOOK_STATUS_GET {
continue
}
Round := cardCfg.GetRoundById(k)
if Round < c.Round {
continue
}
HandbookItemNum += cardCfg.GetStarById(k)
}
} }
if c.EndTime == 0 { if c.EndTime == 0 {
c.EndTime = ((Now-ServerOpenTime)/Duration+1)*Duration + ServerOpenTime c.EndTime = ((Now-ServerOpenTime)/Duration+1)*Duration + ServerOpenTime
} }
return []*item.Item{{Id: item.ITEM_ENERGY_ID, Num: HandbookItemNum}}
} }
func (c *CardMod) ZeroUpdate() { func (c *CardMod) ZeroUpdate() {
@ -141,7 +159,7 @@ func (c *CardMod) AddCard(Id int) {
} }
_, ok = c.Handbook[Id] _, ok = c.Handbook[Id]
if !ok { if !ok {
c.Handbook[Id] = 1 c.Handbook[Id] = HANDBOOK_STATUS_IDLE
c.Cache.Handbook[Id] = 1 c.Cache.Handbook[Id] = 1
} }
c.Cache.Card[Id]++ c.Cache.Card[Id]++
@ -267,19 +285,18 @@ func (c *CardMod) ExStarReward(Id int) ([]*item.Item, error) {
} }
// 领取全收集奖励 // 领取全收集奖励
func (c *CardMod) AllCollectReward() ([]*item.Item, error) { func (c *CardMod) AllCollectReward() ([]*item.Item, []*item.Item, error) {
if c.AllCollect == 1 { if c.AllCollect == 1 {
return nil, fmt.Errorf("AllCollectReward already collect") return nil, nil, fmt.Errorf("AllCollectReward already collect")
} }
AllCardId := cardCfg.GetAllCardId(c.Round) AllCardId := cardCfg.GetAllCardId(c.Round)
for _, v := range AllCardId { for _, v := range AllCardId {
count, ok := c.CardList[v] count, ok := c.CardList[v]
if !ok || count <= 0 { if !ok || count <= 0 {
return nil, fmt.Errorf("card not fully collect") return nil, nil, fmt.Errorf("card not fully collect")
} }
} }
c.AllCollect = 0 c.AllCollect = 0
c.Round++
c.CollectReward = make(map[int]struct{}) c.CollectReward = make(map[int]struct{})
ExStar := 0 ExStar := 0
for k, v := range c.CardList { for k, v := range c.CardList {
@ -290,7 +307,20 @@ func (c *CardMod) AllCollectReward() ([]*item.Item, error) {
c.ExchangeStar += ExStar c.ExchangeStar += ExStar
c.Cache.ExStar += ExStar c.Cache.ExStar += ExStar
Item := cardCfg.GetAllCollectReward() Item := cardCfg.GetAllCollectReward()
return Item, nil HandbookItemNum := 0
for k, v := range c.Handbook {
if v == HANDBOOK_STATUS_GET {
continue
}
Round := cardCfg.GetRoundById(k)
if Round < c.Round {
continue
}
HandbookItemNum += cardCfg.GetStarById(k)
}
c.Round++
c.Handbook = make(map[int]int)
return Item, []*item.Item{{Id: item.ITEM_ENERGY_ID, Num: HandbookItemNum}}, nil
} }
func (c *CardMod) ResetCardFestival() { func (c *CardMod) ResetCardFestival() {
@ -526,12 +556,12 @@ func (c *CardMod) AddGoldTimes() {
func (c *CardMod) GetHandbookReward(CardId int) ([]*item.Item, error) { func (c *CardMod) GetHandbookReward(CardId int) ([]*item.Item, error) {
if v, ok := c.Handbook[CardId]; ok { if v, ok := c.Handbook[CardId]; ok {
if v == 2 { if v == HANDBOOK_STATUS_GET {
return nil, fmt.Errorf("GetHandbookReward already get") return nil, fmt.Errorf("GetHandbookReward already get")
} }
Star := cardCfg.GetStarById(CardId) Star := cardCfg.GetStarById(CardId)
c.Handbook[CardId] = 2 c.Handbook[CardId] = HANDBOOK_STATUS_GET
c.Cache.Handbook[CardId] = 2 c.Cache.Handbook[CardId] = HANDBOOK_STATUS_GET
return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, Star)}, nil return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, Star)}, nil
} }
return nil, fmt.Errorf("GetHandbookReward not find card") return nil, fmt.Errorf("GetHandbookReward not find card")

View File

@ -8,8 +8,9 @@ import (
) )
type MailMod struct { type MailMod struct {
List map[int]*MailInfo // 邮件列表 List map[int]*MailInfo // 邮件列表
AutoId int // 自增id AutoId int // 自增id
ServerMail []int
} }
const ( const (

View File

@ -66,7 +66,9 @@ const (
HANDLE_TYPE_PLAYROOM_LOSE // playroom偷取物品 HANDLE_TYPE_PLAYROOM_LOSE // playroom偷取物品
SERVER_NOON_UPDATE // 12点更新 SERVER_NOON_UPDATE // 12点更新
FRIEND_TREASURE_HANDLE //好友宝藏操作 FRIEND_TREASURE_HANDLE //好友宝藏操作
HANDLE_TYPE_MAIL_ADD //添加邮件
HANDLE_TYPE_MAIL_RELOAD //重新加载邮件
) )
const ( const (

View File

@ -93,9 +93,6 @@ func (o *OrderMod) RewardOrder(id int) ([]*item.Item, []int, int, int, error) {
for _, v := range v.MergeId { for _, v := range v.MergeId {
Star += mergeDataCfg.GetStarById(v) Star += mergeDataCfg.GetStarById(v)
} }
if v.Type == Trigger_type {
Star = int(float64(Star) * 0.8)
}
if v.Type == Super_type { if v.Type == Super_type {
Items := limitedTimeEventCfg.GetSuperOrderReward(Star) Items := limitedTimeEventCfg.GetSuperOrderReward(Star)
ItemList = append(ItemList, Items...) ItemList = append(ItemList, Items...)
@ -453,7 +450,16 @@ func (o *OrderMod) CreateExtraOrder(AddChess, AddNewEmit, ChessList []int, Energ
//额外订单补充2当玩家的棋盘中出现三个相同的满级产物时立刻生成一个对应的收购订单 //额外订单补充2当玩家的棋盘中出现三个相同的满级产物时立刻生成一个对应的收购订单
for k := range MaxLvChess { for k := range MaxLvChess {
ChessNum := GoUtil.GetElemNum(ChessList, k) ChessNum := GoUtil.GetElemNum(ChessList, k)
if ChessNum == 3 { OrderChess := 0
for _, order := range o.OrderList {
for _, v := range order.MergeId {
if v == k {
OrderChess++
}
}
}
OrderNum := (ChessNum - OrderChess) / 3
for i := 0; i < OrderNum; i++ {
b1 = true b1 = true
o.addOrder([]int{k, k, k}, DIFF_LOW, Extra_type) o.addOrder([]int{k, k, k}, DIFF_LOW, Extra_type)
} }

View File

@ -23,6 +23,7 @@ type PlayroomMod struct {
Reward []*item.Item // 奖励 Reward []*item.Item // 奖励
DayFirstT int // 每日未首次触发次数 DayFirstT int // 每日未首次触发次数
Trigger int // 未触发次数 Trigger int // 未触发次数
TriggerTime int64 // 触发时间
HasVisit map[int]int64 // 今日已拜访的玩家 HasVisit map[int]int64 // 今日已拜访的玩家
Target int // 拜访的目标 Target int // 拜访的目标
GameId int // 游戏ID GameId int // 游戏ID
@ -38,6 +39,7 @@ type PlayroomMod struct {
NoFlip int // 连续未获取最高翻牌奖励次数 NoFlip int // 连续未获取最高翻牌奖励次数
TodayFlip bool // 今日是否已获得最高档奖励 TodayFlip bool // 今日是否已获得最高档奖励
JackpotNum int // 每日转盘数量 JackpotNum int // 每日转盘数量
Physiology map[int]*Physiology
} }
const ( const (
@ -55,6 +57,12 @@ const (
FLIP_TYPE_COPPER = 1 // 铜 FLIP_TYPE_COPPER = 1 // 铜
FLIP_TYPE_SILVER = 2 // 银 FLIP_TYPE_SILVER = 2 // 银
FLIP_TYPE_GOLD = 3 // 金 FLIP_TYPE_GOLD = 3 // 金
PHYSIOLOGY_TYPE_STROKE = 1 // 抚摸
PHYSIOLOGY_TYPE_PLAY = 2 // 玩耍
PHYSIOLOGY_TYPE_FEED = 3 // 进食
PHYSIOLOGY_TYPE_CLEAN = 4 // 清洁
PHYSIOLOGY_TYPE_TOLIET = 5 // 上厕所
) )
type Mood struct { type Mood struct {
@ -63,6 +71,12 @@ type Mood struct {
Time int64 Time int64
} }
type Physiology struct {
Id int
Num int
Time int64
}
type Info struct { type Info struct {
Time int64 Time int64
Times int Times int
@ -86,6 +100,9 @@ func (p *PlayroomMod) InitData() {
if p.MoodInfo == nil { if p.MoodInfo == nil {
p.MoodInfo = make(map[int]*Mood) p.MoodInfo = make(map[int]*Mood)
} }
if p.Physiology == nil {
p.Physiology = make(map[int]*Physiology)
}
if p.Reward == nil { if p.Reward == nil {
p.Reward = make([]*item.Item, 0) p.Reward = make([]*item.Item, 0)
} }
@ -129,10 +146,22 @@ func (p *PlayroomMod) GetMood() map[int]int {
return Mood return Mood
} }
func (p *PlayroomMod) GetPhysiologyList() map[int]int {
Physiology := make(map[int]int)
for k, v := range p.Physiology {
Physiology[k] = v.Num
}
return Physiology
}
func (p *PlayroomMod) GetMoodInfo(Id int) *Mood { func (p *PlayroomMod) GetMoodInfo(Id int) *Mood {
return p.MoodInfo[Id] return p.MoodInfo[Id]
} }
func (p *PlayroomMod) GetPhysiology(Id int) *Physiology {
return p.Physiology[Id]
}
func (p *PlayroomMod) GetCollect() map[int]int { func (p *PlayroomMod) GetCollect() map[int]int {
return p.Collect return p.Collect
} }
@ -160,9 +189,6 @@ func (p *PlayroomMod) SetTarget(Target int) {
} }
func (p *PlayroomMod) SetGameId(GameId int) { func (p *PlayroomMod) SetGameId(GameId int) {
if p.GameId != 0 {
return
}
p.GameId = GameId p.GameId = GameId
} }
@ -171,54 +197,41 @@ func (p *PlayroomMod) CreateOrderReward(Star int, itemMod *item.ItemMod) {
return return
} }
p.Reward = make([]*item.Item, 0) p.Reward = make([]*item.Item, 0)
var Item1, Item2 int NormalFoodId, NormalCleanId := playroomCfg.GetNormalItem()
VisitorItem := playroomCfg.GetVisitorItem() PremiumFoodId, PremiumCleanId := playroomCfg.GetPremiumItem()
if Star < playroomCfg.GetOrderStar() {
Item1, Item2 = playroomCfg.GetNormalItem()
} else {
Item1, Item2 = playroomCfg.GetPremiumItem()
}
Item1Num := itemMod.GetItem(Item1) NormalFoodNum := itemMod.GetItem(NormalFoodId)
Item2Num := itemMod.GetItem(Item2) NormalCleanNum := itemMod.GetItem(NormalCleanId)
if p.DayFirstT == 2 {
p.Reward = append(p.Reward, &item.Item{Id: VisitorItem, Num: 1}) PremiumFoodNum := itemMod.GetItem(PremiumFoodId)
PremiumCleanNum := itemMod.GetItem(PremiumCleanId)
p.TriggerTime = GoUtil.Now()
if NormalFoodNum == 0 {
p.Reward = append(p.Reward, &item.Item{Id: NormalFoodId, Num: 1})
return return
} }
if p.Trigger == 4 { if NormalCleanNum == 0 {
p.Reward = append(p.Reward, &item.Item{Id: VisitorItem, Num: 1}) p.Reward = append(p.Reward, &item.Item{Id: NormalCleanId, Num: 1})
p.Trigger = 0
return return
} }
if Item1Num == 0 && Item2Num == 0 { if PremiumFoodNum == 0 {
Prob := GoUtil.RandSlice([]int{Item1, Item2}) p.Reward = append(p.Reward, &item.Item{Id: PremiumFoodId, Num: 1})
p.Reward = append(p.Reward, &item.Item{Id: Prob, Num: 1})
p.DayFirstT++
p.Trigger++
return return
} }
if math.Abs(float64(Item1Num-Item2Num)) > 3 { if PremiumCleanNum == 0 {
RI := GoUtil.IfTrue(Item1Num > Item2Num, Item2, Item1).(int) p.Reward = append(p.Reward, &item.Item{Id: PremiumCleanId, Num: 1})
p.Reward = append(p.Reward, &item.Item{Id: RI, Num: 1})
p.DayFirstT++
p.Trigger++
return return
} }
var RandSlice []int var RandSlice []int
if Star < playroomCfg.GetOrderStar() { if math.Abs(float64((NormalCleanNum+PremiumCleanNum)-(NormalFoodNum+PremiumFoodNum))) > 3 {
RandSlice = []int{Item1, Item2} RandSlice := GoUtil.IfTrue((NormalCleanNum+PremiumCleanNum) > (NormalFoodNum+PremiumFoodNum), []int{PremiumCleanId, NormalCleanId}, []int{NormalFoodId, PremiumFoodId}).([]int)
} else { Prob := GoUtil.RandSlice(RandSlice)
RandSlice = []int{Item1, Item2, VisitorItem} p.Reward = append(p.Reward, &item.Item{Id: Prob, Num: 1})
return
} }
RandSlice = []int{NormalFoodId, NormalCleanId, PremiumFoodId, PremiumCleanId}
Prob := GoUtil.RandSlice(RandSlice) Prob := GoUtil.RandSlice(RandSlice)
p.Reward = append(p.Reward, &item.Item{Id: Prob, Num: 1}) p.Reward = append(p.Reward, &item.Item{Id: Prob, Num: 1})
if Prob == VisitorItem {
p.DayFirstT = 3
p.Trigger = 0
} else {
p.DayFirstT++
p.Trigger++
}
} }
func (p *PlayroomMod) GetReward() []*item.Item { func (p *PlayroomMod) GetReward() []*item.Item {
@ -233,6 +246,8 @@ func (p *PlayroomMod) Interact(Id, Type int) ([]*item.Item, int, error) {
if Effect > 0 { if Effect > 0 {
p.AllMood = min(100, p.AllMood+10) p.AllMood = min(100, p.AllMood+10)
} }
PType, PEffect := playroomCfg.GetInteractPhysiology(Id)
p.AddPhysiology(PType, PEffect)
p.AddMood(MoodType, Effect) p.AddMood(MoodType, Effect)
return ItemList, MoodType, nil return ItemList, MoodType, nil
} }
@ -251,6 +266,21 @@ func (p *PlayroomMod) AddMood(Id, Num int) {
} }
} }
func (p *PlayroomMod) AddPhysiology(Id, Num int) {
Phy := p.GetPhysiology(Id)
if Phy == nil {
Phy = &Physiology{Id: Id, Num: 0, Time: 0}
}
Max := playroomCfg.GetPhysiologyMax(Id)
Phy.Num = max(0, min(Phy.Num+Num, Max))
if Phy.Num != 0 && Phy.Time == 0 {
Phy.Time = GoUtil.Now()
}
if Phy.Num == 0 {
Phy.Time = 0
}
}
func (p *PlayroomMod) AddVisitor(Id int, Time int64) { func (p *PlayroomMod) AddVisitor(Id int, Time int64) {
v, ok := p.Visitor[Id] v, ok := p.Visitor[Id]
if !ok { if !ok {
@ -381,8 +411,9 @@ func (p *PlayroomMod) NotifyMood() *msg.NotifyPlayroomMood {
Mood[int32(k)] = int32(v.Num) Mood[int32(k)] = int32(v.Num)
} }
return &msg.NotifyPlayroomMood{ return &msg.NotifyPlayroomMood{
AllMood: int32(p.AllMood), AllMood: int32(p.AllMood),
Mood: Mood, Mood: Mood,
Physiology: GoUtil.MapIntToInt32(p.GetPhysiologyList()),
} }
} }
@ -466,3 +497,24 @@ func (p *PlayroomMod) GetFlipReward() ([]*item.Item, error) {
func (p *PlayroomMod) BuyItem(Id int) ([]*item.Item, []*item.Item) { func (p *PlayroomMod) BuyItem(Id int) ([]*item.Item, []*item.Item) {
return playroomCfg.GetBuyItem(Id) return playroomCfg.GetBuyItem(Id)
} }
func (p *PlayroomMod) UnLock(Lv int) {
UnlockLv := playroomCfg.GetUnLockLv()
if Lv < UnlockLv {
return
}
if len(p.Physiology) == 0 {
Now := GoUtil.Now()
p.Physiology = make(map[int]*Physiology)
for k := 1; k <= 5; k++ {
Max := playroomCfg.GetPhysiologyMax(k)
p.Physiology[k] = &Physiology{Id: k, Num: Max, Time: Now}
}
}
if len(p.MoodInfo) == 0 {
p.MoodInfo = make(map[int]*Mood)
for k := 1; k <= 3; k++ {
p.MoodInfo[k] = &Mood{Id: k, Num: 100}
}
}
}

Binary file not shown.

File diff suppressed because it is too large Load Diff