This commit is contained in:
yangduo 2024-12-10 11:00:08 +08:00
parent fd55aa6a37
commit fd92cf0de1
7 changed files with 305 additions and 87 deletions

View File

@ -127,9 +127,8 @@ func (this *ActivityApi) RollDice(c *gin.Context) {
}
awardgridids := mt.Table.MapGrid.GetAwardGridIdList()
if len(awardgridids) > len(userAwardgrids)+1 {
user.AddAwardGrid(user.CurrGrid)
} else {
user.AddAwardGrid(user.CurrGrid)
if len(awardgridids) >= len(userAwardgrids) {
fullgrid = true
}
}
@ -137,7 +136,7 @@ func (this *ActivityApi) RollDice(c *gin.Context) {
rspObj.GetOrCreateAward().AddItem(constant.VIRTUAL_ITEM_SCORE, score)
if this.handleAwards(user, rspObj.GetOrCreateAward()) {
if service.Award.HandleAwards(user, rspObj.GetOrCreateAward()) {
q5.AppendSlice(&rspObj.BaseVo.GetOrCreateSideEffect().Effects, "bag")
}
@ -194,48 +193,10 @@ func (this *ActivityApi) Claim(c *gin.Context) {
rspObj.GetOrCreateAward().AddItem(item.ItemId, item.ItemNum)
}
if this.handleAwards(user, rspObj.GetOrCreateAward()) {
if service.Award.HandleAwards(user, rspObj.GetOrCreateAward()) {
q5.AppendSlice(&rspObj.GetOrCreateSideEffect().Effects, "bag")
}
rspObj.GetOrCreateSideEffect().GetOrCreateUser().FromModel(user)
c.JSON(200, rspObj)
}
func (aa *ActivityApi) handleAwards(user *model.User, totalaward *vo.Award) bool {
bageffect := false
for _, awarditem := range totalaward.Items {
itemcfg := mt.Table.Item.GetById(int64(awarditem.ItemId))
switch itemcfg.GetItemType() {
case constant.ITEM_TYPE_SCORE:
user.AddScore(awarditem.ItemNum)
case constant.ITEM_TYPE_DICE:
user.AddDice(awarditem.ItemNum)
case constant.ITEM_TYPE_SPEC_DICE:
user.AddSpecDice(awarditem.ItemNum)
case constant.ITEM_TYPE_CHIP:
nowTime := int32(f5.GetApp().GetRealSeconds())
for i := int32(0); i < awarditem.ItemNum; i++ {
chip := new(model.Chip)
chip.AccountId = user.AccountId
chip.ItemId = awarditem.ItemId
chip.ItemNum = 1
chip.ExpireTime = nowTime + itemcfg.GetTime()*60
chip.CreateTime = nowTime
chip.ModifyTime = nowTime
if chip.Create() != nil {
f5.GetSysLog().Error("internal error, mapgrid chip award fail:%s, %d, %d", user.AccountId, user.CurrGrid, awarditem.ItemId)
}
}
case constant.ITEM_TYPE_SCORE_DOUBLE_CARD:
fallthrough
case constant.ITEM_TYPE_SCORE_SMALL_GIFT_PACK:
fallthrough
case constant.ITEM_TYPE_SCORE_BIG_GIFT_PACK:
service.Award.AddItem(user.AccountId, awarditem.ItemId, awarditem.ItemNum, nil)
bageffect = true
}
}
return bageffect
}

View File

@ -8,6 +8,7 @@ import (
"main/mt"
"main/vo"
"q5"
"wheelserver/service"
"github.com/gin-gonic/gin"
)
@ -24,39 +25,8 @@ func (this *MissionApi) List(c *gin.Context) {
vo.BaseVo
Data []*vo.Mission `json:"data"`
}{}
task := new(model.Task)
err, found := task.Find(s.GetAccountId())
if err != nil {
f5.RspErr(c, 500, "server internal error")
return
}
createTasks := true
if found {
tasks := task.GetTaskItems()
if tasks != nil {
createTasks = false
}
}
if createTasks {
tasks := []*model.TaskItem{}
mt.Table.Task.Traverse(func(taskMeta *mt.Task) bool {
taskitem := new(model.TaskItem)
taskitem.MissionId = taskMeta.GetId()
taskitem.Current = 0
taskitem.Target = taskMeta.GetParam1()
taskitem.Award = 0
taskitem.Time = int32(f5.GetApp().GetRealSeconds())
tasks = append(tasks, taskitem)
missionVo := new(vo.Mission)
missionVo.FromModel(taskitem)
q5.AppendSlice(&rspObj.Data, missionVo)
return true
})
}
rspObj.ErrCode, rspObj.ErrMsg = service.Task.List(s.GetAccountId(), &rspObj.Data)
c.JSON(200, rspObj)
}
@ -79,7 +49,46 @@ func (this *MissionApi) UpdateTask(c *gin.Context) {
Data []*vo.Mission `json:"data"`
}{}
task := new(model.Task)
err, found := task.Find(s.GetAccountId())
if err != nil || !found {
f5.RspErr(c, 500, "server internal error")
return
}
tasks := task.GetTaskItems()
if tasks == nil {
f5.RspErr(c, 401, "bad request")
return
}
taskitem, ok := tasks[reqJson.MissionId]
if !ok {
f5.RspErr(c, 401, "bad request")
return
}
taskMeta := mt.Table.Task.GetById(int64(taskitem.MissionId))
if taskMeta == nil {
f5.RspErr(c, 500, "server internal error")
return
}
if taskMeta.GetConditon() != constant.TASK_COND_FRONT ||
taskitem.Target <= taskitem.Current {
f5.RspErr(c, 401, "bad request")
return
}
taskitem.Target++
task.UpdateTasks(tasks)
for _, taskitem := range tasks {
missionVo := new(vo.Mission)
missionVo.FromModel(taskitem)
q5.AppendSlice(&rspObj.Data, missionVo)
}
c.JSON(200, rspObj)
}
@ -96,12 +105,60 @@ func (this *MissionApi) ClaimTaskAward(c *gin.Context) {
f5.RspErr(c, 401, "params parse error")
return
}
rspObj := struct {
vo.BaseVo
Data []*vo.Mission `json:"data"`
}{}
task := new(model.Task)
err, found := task.Find(s.GetAccountId())
if err != nil || !found {
f5.RspErr(c, 500, "server internal error")
return
}
tasks := task.GetTaskItems()
if tasks == nil {
f5.RspErr(c, 401, "bad request")
return
}
taskitem, ok := tasks[reqJson.MissionId]
if !ok || taskitem.Current != taskitem.Target {
f5.RspErr(c, 401, "bad request")
return
}
taskMeta := mt.Table.Task.GetById(int64(taskitem.MissionId))
if taskMeta == nil {
f5.RspErr(c, 500, "server internal error")
return
}
user := new(model.User)
nowTime := f5.GetApp().GetRealSeconds()
if err, found := user.Find(s.GetAccountId(), nowTime); err != nil {
f5.RspErr(c, 500, "server internal error1")
return
} else if !found {
f5.RspErr(c, 500, "server internal error2")
return
}
taskitem.Award = 1
task.UpdateTasks(tasks)
for _, taskitem := range tasks {
missionVo := new(vo.Mission)
missionVo.FromModel(taskitem)
q5.AppendSlice(&rspObj.Data, missionVo)
}
if taskMeta.GetRewardType() == constant.TASK_AWARD_SCORE {
user.AddScore(taskMeta.GetReward())
}
c.JSON(200, rspObj)
}

View File

@ -54,9 +54,19 @@ const (
PRESENT_DICE_LOOP = 1800
)
const (
TASK_TYPE_ONCE = 1
TASK_TYPE_DAILY = 2
TASK_TYPE_RANGE = 3
)
const (
TASK_COND_FRONT = 1
TASK_COND_BACK_GAIN = 2
TASK_COND_BACK_USE = 3
TASK_COND_BACK_BUY = 4
)
const (
TASK_AWARD_SCORE = 1
)

View File

@ -15,7 +15,7 @@ type TaskItem struct {
Current int32 `json:"current"`
Target int32 `json:"target"`
Award int32 `json:"award"`
Time int32 `json:"time"`
Time int64 `json:"time"`
}
type Task struct {
@ -55,7 +55,7 @@ func (this *Task) Create() error {
return nil
}
func (this *Task) UpdateTask(tasks []*TaskItem) error {
func (t *Task) UpdateTasks(tasks map[int32]*TaskItem) error {
if tasks == nil || len(tasks) < 1 {
return errors.New("")
}
@ -74,18 +74,18 @@ func (this *Task) UpdateTask(tasks []*TaskItem) error {
sb.WriteByte('|')
}
this.Data = sb.String()
this.ModifyTime = int32(f5.GetApp().GetRealSeconds())
if err := this.UpdateFields([]string{"data", "modifytime"}); err != nil {
t.Data = sb.String()
t.ModifyTime = int32(f5.GetApp().GetRealSeconds())
if err := t.UpdateFields([]string{"data", "modifytime"}); err != nil {
return err
}
return nil
}
func (this *Task) GetTaskItems() []*TaskItem {
func (this *Task) GetTaskItems() map[int32]*TaskItem {
if this.Data != "" {
Tasks := []*TaskItem{}
Tasks := map[int32]*TaskItem{}
taskitems := strings.Split(this.Data, "|")
for _, itemstr := range taskitems {
strs := strings.Split(itemstr, ",")
@ -97,8 +97,8 @@ func (this *Task) GetTaskItems() []*TaskItem {
taskitem.Current = q5.SafeToInt32(strs[1])
taskitem.Target = q5.SafeToInt32(strs[2])
taskitem.Award = q5.SafeToInt32(strs[3])
taskitem.Time = q5.SafeToInt32(strs[4])
Tasks = append(Tasks, taskitem)
taskitem.Time = q5.SafeToInt64(strs[4])
Tasks[taskitem.MissionId] = taskitem
}
return Tasks

View File

@ -52,3 +52,41 @@ func (this *award) AddItem(accountId string, itemId int32, itemNum int32, baseVo
}
}
}
func (aa *award) HandleAwards(user *model.User, totalaward *vo.Award) bool {
bageffect := false
for _, awarditem := range totalaward.Items {
itemcfg := mt.Table.Item.GetById(int64(awarditem.ItemId))
switch itemcfg.GetItemType() {
case constant.ITEM_TYPE_SCORE:
user.AddScore(awarditem.ItemNum)
case constant.ITEM_TYPE_DICE:
user.AddDice(awarditem.ItemNum)
case constant.ITEM_TYPE_SPEC_DICE:
user.AddSpecDice(awarditem.ItemNum)
case constant.ITEM_TYPE_CHIP:
nowTime := int32(f5.GetApp().GetRealSeconds())
for i := int32(0); i < awarditem.ItemNum; i++ {
chip := new(model.Chip)
chip.AccountId = user.AccountId
chip.ItemId = awarditem.ItemId
chip.ItemNum = 1
chip.ExpireTime = nowTime + itemcfg.GetTime()*60
chip.CreateTime = nowTime
chip.ModifyTime = nowTime
if chip.Create() != nil {
f5.GetSysLog().Error("internal error, mapgrid chip award fail:%s, %d, %d", user.AccountId, user.CurrGrid, awarditem.ItemId)
}
}
case constant.ITEM_TYPE_SCORE_DOUBLE_CARD:
fallthrough
case constant.ITEM_TYPE_SCORE_SMALL_GIFT_PACK:
fallthrough
case constant.ITEM_TYPE_SCORE_BIG_GIFT_PACK:
aa.AddItem(user.AccountId, awarditem.ItemId, awarditem.ItemNum, nil)
bageffect = true
}
}
return bageffect
}

View File

@ -13,6 +13,7 @@ var Award = new(award)
var Bag = new(bag)
var Buff = new(buff)
var Friend = new(friend)
var Task = new(task)
func init() {
global.RegModule(constant.SERVICE_MGR_MODULE_IDX, _serviceMgr)

View File

@ -0,0 +1,151 @@
package service
import (
"f5"
"main/constant"
"main/model"
"main/mt"
"main/vo"
"q5"
)
type task struct {
}
func (this *task) init() {
}
func (this *task) unInit() {
}
func (this *task) List(accountId string, data *[]*vo.Mission) (errcode int32, msg string) {
task := new(model.Task)
err, found := task.Find(accountId)
if err != nil {
return 500, "server internal error"
}
createTasks := true
nowtime := f5.GetApp().GetRealSeconds()
tasksupdate := false
newTask := func(tasks *map[int32]*model.TaskItem, taskMeta *mt.Task) {
taskitem := new(model.TaskItem)
taskitem.MissionId = taskMeta.GetId()
taskitem.Current = 0
taskitem.Target = taskMeta.GetParam1()
taskitem.Award = 0
taskitem.Time = f5.GetApp().GetRealSeconds()
(*tasks)[taskMeta.GetId()] = taskitem
tasksupdate = true
}
var tasks map[int32]*model.TaskItem
if found {
tasks = task.GetTaskItems()
if tasks != nil {
createTasks = false
for taskid := range tasks {
found := false
mt.Table.Task.Traverse(func(taskMeta *mt.Task) bool {
if taskid == taskMeta.GetId() {
found = true
if taskMeta.GetType() == constant.TASK_TYPE_DAILY &&
q5.GetDaySeconds(tasks[taskid].Time, 0) != q5.GetDaySeconds(nowtime, 0) {
tasks[taskid].Time = nowtime
tasks[taskid].Current = 0
tasks[taskid].Award = 0
tasksupdate = true
}
}
return true
})
if !found {
delete(tasks, taskid)
tasksupdate = true
}
}
mt.Table.Task.Traverse(func(taskMeta *mt.Task) bool {
taskid := taskMeta.GetId()
_, ok := tasks[taskid]
if !ok {
newTask(&tasks, taskMeta)
}
return true
})
}
}
if createTasks {
tasks = map[int32]*model.TaskItem{}
mt.Table.Task.Traverse(func(taskMeta *mt.Task) bool {
newTask(&tasks, taskMeta)
return true
})
}
for _, taskitem := range tasks {
missionVo := new(vo.Mission)
missionVo.FromModel(taskitem)
q5.AppendSlice(data, missionVo)
}
if tasksupdate {
task.UpdateTasks(tasks)
}
return 0, ""
}
func (this *task) UpdateTaskProgress(accountId string, itemid int32, amount int32, data *[]*vo.Mission) (errcode int32, msg string) {
task := new(model.Task)
err, found := task.Find(accountId)
if err != nil || !found {
return 500, "server internal error"
}
tasks := task.GetTaskItems()
if tasks == nil {
return 401, "bad request"
}
taskupdate := false
for _, taskitem := range tasks {
if taskitem.Award != 0 || taskitem.Current >= taskitem.Target {
continue
}
taskMeta := mt.Table.Task.GetById(int64(taskitem.MissionId))
if taskMeta == nil {
continue
}
if taskMeta.GetParam2() != itemid {
continue
}
taskitem.Current += amount
if taskitem.Current > taskitem.Target {
taskitem.Current = taskitem.Target
}
taskupdate = true
}
if taskupdate {
task.UpdateTasks(tasks)
}
for _, taskitem := range tasks {
missionVo := new(vo.Mission)
missionVo.FromModel(taskitem)
q5.AppendSlice(data, missionVo)
}
return 0,""
}