go_dreamfactory/modules/equipment/module.go
2023-06-07 17:55:58 +08:00

531 lines
15 KiB
Go

package equipment
import (
"fmt"
"go_dreamfactory/comm"
"go_dreamfactory/lego/core"
"go_dreamfactory/lego/sys/event"
"go_dreamfactory/modules"
"go_dreamfactory/pb"
cfg "go_dreamfactory/sys/configure/structs"
"math"
"math/rand"
"time"
"github.com/go-redis/redis/v8"
)
const moduleName = "装备"
/*
模块名:装备
描述:用户装备管理以及装备升级强化相关
开发:李伟
*/
func NewModule() core.IModule {
m := new(Equipment)
return m
}
type Equipment struct {
modules.ModuleBase
service core.IService
chat comm.IChat
api *apiComp
configure *configureComp
modelEquipment *modelEquipmentComp
}
//模块名
func (this *Equipment) GetType() core.M_Modules {
return comm.ModuleEquipment
}
//模块初始化接口 注册用户创建角色事件
func (this *Equipment) 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 *Equipment) Start() (err error) {
err = this.ModuleBase.Start()
var module core.IModule
if module, err = this.service.GetModule(comm.ModuleChat); err != nil {
return
}
this.chat = module.(comm.IChat)
event.RegisterGO(comm.EventUserOffline, this.EventUserOffline)
return
}
//装备组件
func (this *Equipment) OnInstallComp() {
this.ModuleBase.OnInstallComp()
this.api = this.RegisterComp(new(apiComp)).(*apiComp)
this.modelEquipment = this.RegisterComp(new(modelEquipmentComp)).(*modelEquipmentComp)
this.configure = this.RegisterComp(new(configureComp)).(*configureComp)
}
//Event------------------------------------------------------------------------------------------------------------
func (this *Equipment) EventUserOffline(uid, sessionid string) {
this.modelEquipment.BatchDelLists(uid)
}
//IEquipment-------------------------------------------------------------------------------------------------------------------------------
//查询武器信息
func (this *Equipment) QueryEquipment(uid string, id string) (equipment *pb.DB_Equipment, errdata *pb.ErrorData) {
var err error
if uid == "" || id == "" {
this.Errorf("请求参数错误 uid:%s Id:%s", uid, id)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ReqParameterError,
Title: pb.ErrorCode_ReqParameterError.ToString(),
}
return
}
if equipment, err = this.modelEquipment.QueryUserEquipmentsById(uid, id); err != nil {
if err == redis.Nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_EquipmentOnFoundEquipment,
Title: pb.ErrorCode_EquipmentOnFoundEquipment.ToString(),
Message: fmt.Sprintf("未找到装备 uid:%s id:%s", uid, id),
}
} else {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_SystemError,
Title: pb.ErrorCode_SystemError.ToString(),
Message: err.Error(),
}
}
}
return
}
//查询服务资源数量
func (this *Equipment) QueryEquipments(uid string) (equipment []*pb.DB_Equipment, errdata *pb.ErrorData) {
var err error
if uid == "" {
this.Errorf("请求参数错误 uid:%s ", uid)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ReqParameterError,
Title: pb.ErrorCode_ReqParameterError.ToString(),
}
return
}
if equipment, err = this.modelEquipment.QueryUserEquipments(uid); err != nil {
if err != redis.Nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_SystemError,
Title: pb.ErrorCode_SystemError.ToString(),
Message: err.Error(),
}
}
}
return
}
//查询卡片数量
func (this *Equipment) QueryEquipmentAmount(uid string, equipmentId string) (amount uint32) {
amount = this.modelEquipment.QueryEquipmentAmount(uid, equipmentId)
return
}
//添加武器
func (this *Equipment) AddNewEquipments(session comm.IUserSession, cIds map[string]uint32, bPush bool) (change []*pb.DB_Equipment, errdata *pb.ErrorData) {
var (
err error
)
if change, err = this.modelEquipment.AddEquipments(session, cIds); err != nil {
this.Errorf("err%v", err)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_SystemError,
Title: pb.ErrorCode_SystemError.ToString(),
Message: err.Error(),
}
return
}
if len(change) > 0 && bPush {
this.equipmentsChangePush(session, change)
}
return
}
func (this *Equipment) AddAllEquipments(session comm.IUserSession) (errdata *pb.ErrorData) {
var (
configure *cfg.GameEquip
cIds map[string]uint32
err error
)
if configure, err = this.configure.GetEquipmentConfigure(); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigNoFound,
Title: pb.ErrorCode_ConfigNoFound.ToString(),
Message: err.Error(),
}
return
}
cIds = make(map[string]uint32)
for _, v := range configure.GetDataList() {
cIds[v.Id] = 1
}
_, errdata = this.AddNewEquipments(session, cIds, true)
return
}
//删除武器
func (this *Equipment) DelEquipments(session comm.IUserSession, equipIds []string, bPush bool) (errdata *pb.ErrorData) {
var (
err error
change []*pb.DB_Equipment
)
if change, err = this.modelEquipment.DelEquipments(session.GetUserId(), equipIds); err != nil {
this.Errorf("err%v", err)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_SystemError,
Title: pb.ErrorCode_SystemError.ToString(),
Message: err.Error(),
}
return
}
if len(change) > 0 && bPush {
this.equipmentsChangePush(session, change)
}
return
}
//创建新的装备
func (this *Equipment) NewEquipment(uid, cid string) (errdata *pb.ErrorData, equip *pb.DB_Equipment) {
var (
conf *cfg.GameEquipData
err error
)
if conf, err = this.configure.GetEquipmentConfigureById(cid); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigNoFound,
Title: pb.ErrorCode_ConfigNoFound.ToString(),
Message: err.Error(),
}
return
}
if equip, err = this.modelEquipment.newEquipment(uid, conf, nil); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigNoFound,
Title: pb.ErrorCode_ConfigNoFound.ToString(),
Message: err.Error(),
}
return
}
return
}
//创建新的装备
func (this *Equipment) AddEquipment(session comm.IUserSession, equip *pb.DB_Equipment) (errdata *pb.ErrorData) {
var (
err error
configure *cfg.GameEquipData
)
if err = this.modelEquipment.addEquipment(equip); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_DBError,
Title: pb.ErrorCode_DBError.ToString(),
Message: err.Error(),
}
return
}
if configure, err = this.configure.GetEquipmentConfigureById(equip.CId); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigNoFound,
Title: pb.ErrorCode_ConfigNoFound.ToString(),
Message: err.Error(),
}
return
}
tasks := make([]*pb.BuriedParam, 0)
//随机任务
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype50, 1, configure.Color))
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype97, 1, configure.Suittype, configure.Color))
unm := int32(1)
if equip.AdverbEntry != nil {
unm += int32(len(equip.AdverbEntry))
}
if equip.Adverbskill != nil {
unm += int32(len(equip.Adverbskill))
}
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype99, 1, unm, configure.Color))
if configure.Pos == 7 {
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype103, 1, configure.Color))
} else if configure.Pos == 6 {
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype101, 1, configure.Color))
}
go this.ModuleBuried.TriggerBuried(session.GetUserId(), tasks...)
this.equipmentsChangePush(session, []*pb.DB_Equipment{equip})
return
}
///出售装备
func (this *Equipment) SellEquipments(session comm.IUserSession, equs []string) (errdata *pb.ErrorData, atno []*pb.UserAtno) {
var (
err error
equipments []*pb.DB_Equipment
confs []*cfg.GameEquipData
sale [][]*cfg.Gameatn
)
if equipments, err = this.modelEquipment.QueryUserEquipmentsByIds(session.GetUserId(), equs); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ReqParameterError,
Title: pb.ErrorCode_ReqParameterError.ToString(),
}
return
}
confs = make([]*cfg.GameEquipData, len(equipments))
sale = make([][]*cfg.Gameatn, len(equipments))
for i, v := range equipments {
if v.HeroId != "" || v.Islock {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_EquipmentNoCanSell,
Title: pb.ErrorCode_EquipmentNoCanSell.ToString(),
Message: fmt.Sprintf("装备锁定或者穿戴状态下 不可售卖!"),
}
this.Errorf("NoCanSell %v", v)
return
}
if confs[i], err = this.configure.GetEquipmentConfigureById(v.CId); err != nil {
this.Errorln(err)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigNoFound,
Title: pb.ErrorCode_ConfigNoFound.ToString(),
Message: err.Error(),
}
return
}
if confs[i].Sale == nil || len(confs[i].Sale) == 0 {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_EquipmentNoCanSell,
Title: pb.ErrorCode_EquipmentNoCanSell.ToString(),
Message: err.Error(),
}
return
}
sale[i] = make([]*cfg.Gameatn, len(confs[i].Sale))
for n, s := range confs[i].Sale {
_s := &cfg.Gameatn{
A: s.A,
T: s.T,
N: s.N + int32(math.Floor(float64(s.N*(v.Lv-1))*float64(confs[i].Salecoef))),
}
sale[i][n] = _s
}
}
sales := make([]*cfg.Gameatn, 0)
for _, v := range sale {
sales = append(sales, v...)
}
if errdata, atno = this.DispenseAtno(session, sales, true); errdata != nil {
return
}
if errdata = this.DelEquipments(session, equs, true); errdata != nil {
return
}
return
}
//回收装备接口
func (this *Equipment) RecycleEquipments(session comm.IUserSession, equs []string, discount int32) (errdata *pb.ErrorData, atno []*pb.UserAtno) {
var (
err error
equipments []*pb.DB_Equipment
sellconf *cfg.GameSellCoefficientData
confs []*cfg.GameEquipData
sale [][]*cfg.Gameatn
)
if equipments, err = this.modelEquipment.QueryUserEquipmentsByIds(session.GetUserId(), equs); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ReqParameterError,
Title: pb.ErrorCode_ReqParameterError.ToString(),
}
return
}
confs = make([]*cfg.GameEquipData, len(equipments))
sale = make([][]*cfg.Gameatn, len(equipments))
for i, v := range equipments {
if v.HeroId != "" || v.Islock {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ReqParameterError,
Title: pb.ErrorCode_ReqParameterError.ToString(),
}
this.Errorf("NoCanSell %v", v)
return
}
if confs[i], err = this.configure.GetEquipmentConfigureById(v.CId); err != nil {
this.Errorln(err)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigNoFound,
Title: pb.ErrorCode_ConfigNoFound.ToString(),
}
return
}
if confs[i].SmithySale == nil || len(confs[i].SmithySale) == 0 {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_EquipmentNoCanSell,
Title: pb.ErrorCode_EquipmentNoCanSell.ToString(),
}
return
}
if sellconf, err = this.configure.getSellcoefficient(int32(len(v.AdverbEntry) + 1)); err != nil {
this.Errorln(err)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigNoFound,
Title: pb.ErrorCode_ConfigNoFound.ToString(),
Message: err.Error(),
}
return
}
sale[i] = make([]*cfg.Gameatn, len(confs[i].Sale))
for n, s := range confs[i].SmithySale {
_s := &cfg.Gameatn{
A: s.A,
T: s.T,
N: int32(math.Floor(float64(s.N) * (float64(discount+1000) / float64(1000)) * (float64(sellconf.Coefficient) / float64(1000)))),
}
sale[i][n] = _s
}
}
sales := make([]*cfg.Gameatn, 0)
for _, v := range sale {
sales = append(sales, v...)
}
if errdata, atno = this.DispenseAtno(session, sales, true); errdata != nil {
return
}
if errdata = this.DelEquipments(session, equs, true); errdata != nil {
return
}
return
}
//获得可操作用户装备列表
func (this *Equipment) GetActionableEquipments(uid string) (errdata *pb.ErrorData, eruips []*pb.DB_Equipment) {
var (
err error
equipments []*pb.DB_Equipment
)
eruips = make([]*pb.DB_Equipment, 0)
if equipments, err = this.modelEquipment.QueryUserEquipments(uid); err != nil {
return
}
for _, v := range equipments {
if v.HeroId == "" && !v.Islock {
eruips = append(eruips, v)
}
}
return
}
//获取可用套装 (铁匠铺使用)
func (this *Equipment) GetActionableSuit(uid string) (errdata *pb.ErrorData, Suit []int32) {
var (
err error
equipments []*pb.DB_Equipment
suit map[int32]struct{}
)
suit = make(map[int32]struct{})
if equipments, err = this.modelEquipment.QueryUserEquipments(uid); err != nil {
return
}
for _, v := range equipments {
if v.HeroId == "" && !v.Islock {
if conf, err := this.configure.GetEquipmentConfigureById(v.CId); err == nil {
suit[conf.Suittype] = struct{}{}
}
}
}
for i, _ := range suit {
Suit = append(Suit, i)
}
return
}
// 随机获得一件N级的装备装备
/*
suiteId: 套装id
pos: 位置(-1 表示随机位置 大于0 表示获得指定位置 )
lv: 装备等级
*/
func (this *Equipment) GetForgeEquip(session comm.IUserSession, suiteId int32, pos int32, lv int32, dyweight []int32) (eruip *pb.DB_Equipment, errdata *pb.ErrorData) {
var (
configures []*cfg.GameEquipData
lvs []*cfg.GameEquipData
err error
)
if configures, err = this.configure.GetSuitEquipmentConfigure(suiteId); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_EquipmentSuiteNotFound,
Title: pb.ErrorCode_EquipmentSuiteNotFound.ToString(),
Message: err.Error(),
}
return
}
if pos != -1 {
for _, v := range configures {
if v.Pos == pos && v.Color == lv {
if eruip, err = this.modelEquipment.newEquipment(session.GetUserId(), v, dyweight); err == nil {
this.equipmentsChangePush(session, []*pb.DB_Equipment{eruip})
return
}
this.Errorf("err%v", err)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_SystemError,
Title: pb.ErrorCode_SystemError.ToString(),
Message: err.Error(),
}
return
}
}
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigNoFound,
Title: pb.ErrorCode_ConfigNoFound.ToString(),
Message: err.Error(),
}
return
} else {
lvs = make([]*cfg.GameEquipData, 0)
for _, v := range configures {
if v.Color == lv {
lvs = append(lvs, v)
}
}
if len(lvs) == 0 {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigNoFound,
Title: pb.ErrorCode_ConfigNoFound.ToString(),
}
return
}
r := rand.New(rand.NewSource(time.Now().Unix()))
index := r.Perm(len(lvs))[0]
if eruip, err = this.modelEquipment.newEquipment(session.GetUserId(), lvs[index], dyweight); err == nil {
this.equipmentsChangePush(session, []*pb.DB_Equipment{eruip})
return
}
this.Errorf("err%v", err)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_SystemError,
Title: pb.ErrorCode_SystemError.ToString(),
Message: err.Error(),
}
return
}
}
//Evens--------------------------------------------------------------------------------------------------------------------------------
//推送道具变化消息
func (this *Equipment) equipmentsChangePush(session comm.IUserSession, items []*pb.DB_Equipment) (err error) {
session.SendMsg(string(this.GetType()), "change", &pb.EquipmentChangePush{Equipments: items})
return
}