go_dreamfactory/modules/caravan/module.go

327 lines
9.2 KiB
Go

package caravan
import (
"go_dreamfactory/comm"
"go_dreamfactory/lego/core"
"go_dreamfactory/lego/sys/log"
"go_dreamfactory/modules"
"go_dreamfactory/pb"
"go_dreamfactory/sys/configure"
cfg "go_dreamfactory/sys/configure/structs"
"go_dreamfactory/utils"
"math"
)
type Caravan struct {
modules.ModuleBase
modelCaravan *modelCaravan
api *apiComp
configure *configureComp
service core.IService
}
func NewModule() core.IModule {
return &Caravan{}
}
func (this *Caravan) GetType() core.M_Modules {
return comm.ModuleCaravan
}
func (this *Caravan) Init(service core.IService, module core.IModule, options core.IModuleOptions) (err error) {
err = this.ModuleBase.Init(service, module, options)
this.service = service
return
}
func (this *Caravan) OnInstallComp() {
this.ModuleBase.OnInstallComp()
this.api = this.RegisterComp(new(apiComp)).(*apiComp)
this.modelCaravan = this.RegisterComp(new(modelCaravan)).(*modelCaravan)
this.configure = this.RegisterComp(new(configureComp)).(*configureComp)
}
// 接口信息 修改数据
func (this *Caravan) ModifyCaravanData(uid string, data map[string]interface{}) (code pb.ErrorCode) {
err := this.modelCaravan.modifyCaravanDataByObjId(uid, data)
if err != nil {
code = pb.ErrorCode_DBError
}
return
}
// 初始化城市信息
func (this *Caravan) InitCaravanCityData(uid string, data *pb.DBCaravan) {
list := this.configure.GetAllCaravanCity()
data.City = make(map[int32]*pb.CityInfo, 0)
for _, v := range list {
city := &pb.CityInfo{
Special: []int32{}, // 城市卖给玩家的商品 (注意 这里有库存 必须初始化 Count 字段数据)
Count: map[int32]int32{}, // key 货物ID
}
if len(v.Special) > int(v.Citytypenum) {
ids := utils.RandomNumbers(0, len(v.Special), int(v.Citytypenum))
for _, id := range ids {
city.Special = append(city.Special, v.Special[id])
}
} else {
city.Special = append(city.Special, v.Special...)
}
// for _, v := range city.Special {
// city.Count[v] = 40 // 配置暂无 后面走配置
// }
data.City[v.Id] = city
}
}
// 初始化货物信息
func (this *Caravan) InitCaravanItemData(uid string, data *pb.DBCaravan) {
items := this.configure.GetAllCaravanItem()
data.Goods = make(map[int32]*pb.Goods, 0)
for _, v := range items {
goods := &pb.Goods{
Period: 0, // 变动周期
CurPeriod: 1, // 当前变动周期
Price: 0, // 当前价格
}
if len(v.Changeperiod) == 2 {
goods.Period = comm.GetRandNum(v.Changeperiod[0], v.Changeperiod[1])
goods.Price = v.Goodsprice
data.Goods[v.Id] = goods
}
}
}
// 初始化门票和虚拟币
func (this *Caravan) InitCaravanTicket(session comm.IUserSession, lv int32) (code pb.ErrorCode) {
code = pb.ErrorCode_ConfigNoFound
if conf := this.modelCaravan.module.configure.GetCaravanLv(lv); conf != nil {
var res []*cfg.Gameatn
res = append(res, conf.Tickettop)
res = append(res, conf.Moneynumtop)
code = this.DispenseRes(session, res, true) // 推送门票和虚拟币资源
}
return
}
// 刷新城市货物信息
func (this *Caravan) refreshCaravanCityInfo(uid string, caravan *pb.DBCaravan) {
var (
bChange bool
update map[string]interface{}
changeTime int32
)
update = make(map[string]interface{})
changeTime = this.configure.GetCityRefreshTime()
if int32(configure.Now().Unix()-caravan.Citystime) >= changeTime {
bChange = true
for k, v := range caravan.City {
if c := this.configure.GetCaravanCity(k); c != nil {
v.Count = make(map[int32]int32) // 初始化城市信息
v.Special = []int32{}
if len(c.Special) > int(c.Citytypenum) {
ids := utils.RandomNumbers(0, len(c.Special), int(c.Citytypenum))
for _, id := range ids {
v.Special = append(v.Special, c.Special[id])
}
} else {
v.Special = append(v.Special, c.Special...)
}
}
}
for k, v := range caravan.Goods {
if c := this.configure.GetCaravanGoods(k); c != nil {
subTime := configure.Now().Unix() - int64(changeTime)
icount := int32(subTime / int64(changeTime)) // 循环周期
if icount > 50 { //超过一定的周期 则不计算
// 随机出新的变动周期
v.Period = comm.GetRandNum(c.Changeperiod[0], c.Changeperiod[1])
v.CurPeriod = 0
} else {
for i := 0; i < int(icount); i++ { // 计算当前的价格
// 价格涨跌权重 PriceChangeWeight
bUp := false // true 涨
ipos := comm.GetRandW(c.PriceChangeWeight)
if ipos == 1 {
if comm.GetRandW(c.PriceChangeWeightOne) == 0 {
bUp = true
}
} else if ipos == 2 {
if comm.GetRandW(c.PriceChangeWeightTwo) == 0 {
bUp = true
}
} else if ipos == 3 {
if comm.GetRandW(c.PriceChangeWeightThree) == 0 {
bUp = true
}
}
if bUp { // 价格上涨
v.Price = int32(math.Floor(float64(v.Price) * (1.0 + float64(c.FluctuationRange)/1000.0)))
} else {
v.Price = int32(math.Floor(float64(v.Price) * (1.0 - float64(c.FluctuationRange)/1000.0)))
}
if v.Price < c.Pricemin { // 设置最小值
v.Price = c.Pricemin
}
if v.Price > c.Pricemax { // 设置最大值
v.Price = c.Pricemax
}
v.CurPeriod += 1 // 更新周期+1
if v.CurPeriod+icount > v.Period {
// 随机出新的变动周期
v.Period = comm.GetRandNum(c.Changeperiod[0], c.Changeperiod[1])
v.CurPeriod = 0
}
}
}
}
}
}
if bChange {
update["city"] = caravan.City
this.modelCaravan.modifyCaravanDataByObjId(uid, update)
}
}
// 校验随机事件是否超时
func (this *Caravan) CheckCaravanTask(session comm.IUserSession, data *pb.DBCaravan) {
if data.Eventid != 0 {
if list := this.configure.GetCaravanEventById(data.Eventid); list != nil {
// 校验任务是否超时
if data.Tasktime-configure.Now().Unix() > int64(list.Eventtime) { //TODO 任务超时 通知任务模块处理 并清理相关数据
module, err := this.service.GetModule(comm.ModuleWorldtask)
if err != nil {
return
}
if wt, ok := module.(comm.IWorldtask); ok {
wt.UpdateTaskStatus(session.GetUserId(), data.Taskid) // 通知任务模块 任务超时
}
this.CleanCaravanTask(session.GetUserId(), data) //任务超时 清理任务数据
// 任务超时发送任务失败推送
resp := &pb.CaravanTaskCompletePush{}
resp.Data = data
resp.BSuccess = false
if len(list.Unreword) == 2 && list.Unreword[0] == 1 { // 类型为1 的 直接扣除虚拟币
this.ConsumeRes(session, []*cfg.Gameatn{{
A: "attr",
T: "merchantmoney",
N: list.Unreword[1],
}}, true)
resp.Reward = append(resp.Reward, &pb.UserAssets{
A: "attr",
T: "merchantmoney",
N: -list.Unreword[1], // 扣除虚拟币
})
}
session.SendMsg(string(this.GetType()), "taskcomplete", resp)
}
}
}
}
func (this *Caravan) CleanCaravanTask(uid string, data *pb.DBCaravan) {
if data.Eventid != 0 {
data.Eventid = 0
data.Taskid = 0
data.Tasktime = 0
update := make(map[string]interface{})
update["eventid"] = data.Eventid
update["task"] = data.Taskid
update["tasktime"] = data.Tasktime
this.modelCaravan.modifyCaravanDataByObjId(uid, update)
}
}
func (this *Caravan) TaskComplete(session comm.IUserSession, taskid int32) {
this.Debug("Caravan TaskComplete",
log.Field{Key: "session", Value: session.GetUserId()},
log.Field{Key: "taskid", Value: taskid},
)
var (
resp *pb.CaravanTaskCompletePush
)
if !this.IsCross() {
if conf := this.configure.GetCaravanEventById(taskid); conf != nil {
list, _ := this.modelCaravan.getCaravanList(session.GetUserId())
if list.Taskid == taskid {
this.CleanCaravanTask(session.GetUserId(), list) //任务完成 清理任务数据
resp = &pb.CaravanTaskCompletePush{}
resp.Data = list
resp.BSuccess = true
for _, v := range conf.Reword {
resp.Reward = append(resp.Reward, &pb.UserAssets{
A: v.A,
T: v.T,
N: v.N,
})
}
if code := this.ModuleBase.DispenseRes(session, conf.Reword, true); code != pb.ErrorCode_Success {
this.Errorf("Caravan DispenseRes err:%v", conf.Reword)
}
session.SendMsg(string(this.GetType()), "taskcomplete", resp)
}
}
}
}
// 整理背包 (true 表示背包装不下)
func (this *Caravan) ArrayBag(data *pb.DBCaravan, limit int32) (bFull bool) {
var count int32
for k, v := range data.Items {
if v.Count == 0 {
delete(data.Items, k)
} else {
tmp := v.Count
for {
count++
if tmp > limit {
tmp -= limit
} else {
break
}
}
}
}
if count > data.Baglimit {
return true
}
data.UseCount = count
return false
}
// 校验商队等级
func (this *Caravan) CheckCaravavLvUp(data *pb.DBCaravan) (curLv int32) {
curLv = data.Lv
for {
if conf := this.configure.GetCaravanLv(curLv + 1); conf != nil {
if conf.Newmoneyexp <= int32(data.Profit) {
curLv++
} else {
break
}
} else {
break
}
}
return curLv
}
func (this *Caravan) TestFunc(session comm.IUserSession) {
this.modelCaravan.module.api.GetList(session, &pb.CaravanGetListReq{})
this.modelCaravan.module.api.BuyOrSell(session, &pb.CaravanBuyOrSellReq{
City: 101,
Items: map[int32]int32{
6: 100,
},
IsBuy: false,
})
}