You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
923 lines
36 KiB
923 lines
36 KiB
package serviceGame |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
"errors" |
|
"fmt" |
|
"github.com/gogf/gf/v2/encoding/gjson" |
|
"github.com/gogf/gf/v2/frame/g" |
|
"github.com/gogf/gf/v2/os/gtime" |
|
"go.mongodb.org/mongo-driver/bson/primitive" |
|
"log" |
|
"os" |
|
"strings" |
|
"time" |
|
"tyj_admin/api/v1/game" |
|
"tyj_admin/config" |
|
"tyj_admin/internal/consts" |
|
"tyj_admin/internal/serviceGame/internal" |
|
"tyj_admin/utils" |
|
) |
|
|
|
type IGameManage interface { |
|
ChangeGm(ctx context.Context, req *game.ChangeGmReq) (res *game.ChangeGmRes, err error) |
|
ChangePwd(ctx context.Context, req *game.ResetPwdReq) (res *game.ResetPwdRes, err error) |
|
SearchGm(ctx context.Context, req *game.SearchGmReq) (res *game.SearchGmRes, err error) |
|
ListGm(ctx context.Context, req *game.ListGmReq) (res *game.ListGmRes, err error) |
|
SetGmToClient(ctx context.Context, req *game.SetGmToClientReq) (res *game.SetGmToClientRes, err error) |
|
CopyUnit(ctx context.Context, req *game.CopyUnitReq) (res *game.CopyUnitRes, err error) |
|
//EditUnit(ctx context.Context, req *game.EditUnitReq) (res *game.EditUnitRes, err error) |
|
UpdateUnit(ctx context.Context, req *game.UpdateUnitReq) (res *game.UpdateUnitRes, err error) |
|
DelAccount(ctx context.Context, req *game.DelAccountReq) (res *game.DelAccountRes, err error) |
|
SearchAccount(ctx context.Context, req *game.SearchAccountReq) (res *game.SearchAccountRes, err error) |
|
GetKeepAlive(ctx context.Context, req *game.GetKeepAliveReq) (res *game.GetKeepAliveRes, err error) |
|
GetLive(ctx context.Context, req *game.GetLiveReq) (res *game.GetLiveRes, err error) |
|
RegisterCount(ctx context.Context, req *game.RegisterCountReq) (res *game.RegisterCountRes, err error) |
|
GetShopItemLog(ctx context.Context, req *game.GetShopItemLogReq) (res *game.GetShopItemLogRes, err error) |
|
} |
|
|
|
type gameManageImpl struct { |
|
} |
|
|
|
var gameManageService = gameManageImpl{} |
|
|
|
func GameManage() IGameManage { |
|
return &gameManageService |
|
} |
|
|
|
func (ga *gameManageImpl) ChangePwd(ctx context.Context, req *game.ResetPwdReq) (res *game.ResetPwdRes, err error) { |
|
//pwd := gmd5.MustEncryptString(req.Pwd + "sdsd") |
|
res, err = internal.ChangePwd(ctx, req.Account, req.Pwd, fmt.Sprint(req.ServerId)) |
|
return |
|
} |
|
|
|
func (ga *gameManageImpl) SearchGm(ctx context.Context, req *game.SearchGmReq) (res *game.SearchGmRes, err error) { |
|
res = new(game.SearchGmRes) |
|
res.Gm, err = internal.SearchGm(ctx, req) |
|
return |
|
} |
|
|
|
func (ga *gameManageImpl) ListGm(ctx context.Context, req *game.ListGmReq) (res *game.ListGmRes, err error) { |
|
res = new(game.ListGmRes) |
|
res, err = internal.ListGm(ctx, req) |
|
return |
|
} |
|
|
|
func (ga *gameManageImpl) SetGmToClient(ctx context.Context, req *game.SetGmToClientReq) (res *game.SetGmToClientRes, err error) { |
|
res = new(game.SetGmToClientRes) |
|
res, err = internal.SetGmToClient(ctx, req) |
|
return |
|
} |
|
|
|
func (ga *gameManageImpl) ChangeGm(ctx context.Context, req *game.ChangeGmReq) (res *game.ChangeGmRes, err error) { |
|
res = new(game.ChangeGmRes) |
|
res, err = internal.ChangeGm(ctx, req) |
|
return |
|
} |
|
|
|
func (ga *gameManageImpl) AddGameUnit(ctx context.Context, req *game.AddGameUnitReq) (res *game.AddGameUnitRes, err error) { |
|
uid, err := internal.GetAccountUid(ctx, req.Account, fmt.Sprint(req.ServerId)) |
|
if err != nil { |
|
fmt.Println("GetAccount err", err) |
|
return nil, err |
|
} |
|
fmt.Println("GetRoleDelta", uid) |
|
roleDelta, err2 := internal.GetRoleDetail(ctx, uid, fmt.Sprint(req.ServerId)) |
|
if err2 != nil { |
|
fmt.Println("err2: ", err2) |
|
return nil, err2 |
|
} |
|
|
|
t := roleDelta["_t"] |
|
c := roleDelta["C"].(primitive.A) |
|
log.Println(" rrr >>> ", t) |
|
GameUnitComponent := map[string]interface{}{} |
|
for _, v := range c { |
|
v1 := v.(map[string]interface{}) |
|
if v1["_t"] == consts.GameUnitComponent { |
|
GameUnitComponent = v.(map[string]interface{}) |
|
break |
|
} |
|
} |
|
children := GameUnitComponent["Children"].(primitive.A) |
|
switch fmt.Sprint(req.GameUnitType) { |
|
case consts.GameUnitType_Villager: |
|
villagerConfig := config.InitialVillagerConfig[req.CfgId] |
|
unit := map[string]interface{}{"_id": gtime.TimestampMilli(), "_t": consts.GameUnit, "UnitType": consts.GameUnitType_Villager, |
|
"UnitCamp": consts.GameUnitCamp_Friend, "Position": map[string]interface{}{"x": req.X, "y": req.Y}, "C": []interface{}{}} |
|
children = append(children, unit) |
|
villagers := unit["C"].(primitive.A) |
|
villagerRecordComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.VillagerRecordComponent, "DisplayState": villagerConfig.DisplayState} |
|
gameNumericComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.GameNumericComponent, "NumericDic": []interface{}{}} |
|
NumericDic := gameNumericComponent["NumericDic"].(primitive.A) |
|
NumericDic = append(NumericDic, []interface{}{consts.NUMERICTYPE_PHYSIQUE, villagerConfig.Physique}, |
|
[]interface{}{consts.NUMERICTYPE_AGE, villagerConfig.Age}, []interface{}{consts.NUMERICTYPE_AGE, villagerConfig.Age}) |
|
if villagerConfig.LifeMax > 0 { |
|
NumericDic = append(NumericDic, []interface{}{consts.NUMERICTYPE_LIFEMAX, villagerConfig.LifeMax}) |
|
} |
|
gameNumericComponent["NumericDic"] = append(NumericDic, []interface{}{consts.NUMERICTYPE_HP, villagerConfig.StartHp}, |
|
[]interface{}{consts.NUMERICTYPE_ATKBASE, villagerConfig.StartATK}, []interface{}{consts.NUMERICTYPE_MAXHPBASE, villagerConfig.StartHp}, |
|
[]interface{}{consts.NUMERICTYPE_DEFBASE, villagerConfig.StartDEF}, []interface{}{consts.NUMERICTYPE_LABORBASE, villagerConfig.Labor}, |
|
[]interface{}{consts.NUMERICTYPE_WISDOMBASE, villagerConfig.Wisdom}, []interface{}{consts.NUMERICTYPE_MOVESPEEDBASE, villagerConfig.MoveSpeed}, |
|
[]interface{}{consts.NUMERICTYPE_ATTACKSPEEDBASE, 100}, []interface{}{consts.NUMERICTYPE_LABOREXP, 0}, |
|
[]interface{}{consts.NUMERICTYPE_LIFEEXP, 0}, []interface{}{consts.NUMERICTYPE_PHYSIQUE, villagerConfig.Physique}, |
|
[]interface{}{consts.NUMERICTYPE_PHYSIQUEEXP, 0}, []interface{}{consts.NUMERICTYPE_HITRATE, villagerConfig.HitRate}, |
|
[]interface{}{consts.NUMERICTYPE_HITBASE, villagerConfig.Hit}) |
|
|
|
personalityLabel := config.PersonalityLabelConfig[villagerConfig.Personality] |
|
villagerRecordComponent["EndWordsCfgId"] = config.GetRandomConfigIdByGroup(personalityLabel.EndWords) |
|
peopleComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.PeopleComponent, "Name": villagerConfig.Name, "FamilyName": villagerConfig.FirstName, |
|
"PersonalityCfgId": villagerConfig.Personality, "Gender": villagerConfig.Gender} |
|
|
|
if len(req.Name) > 0 { |
|
peopleComponent["Name"] = req.Name |
|
} |
|
if len(req.FamilyName) > 0 { |
|
peopleComponent["FamilyName"] = req.FamilyName |
|
} |
|
BehaveComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.BehaveComponent} |
|
SlotComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.SlotComponent} |
|
LabourComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.LabourComponent} |
|
MarriageComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.MarriageComponent} |
|
ResidentComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.ResidentComponent} |
|
FightComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.FightComponent} |
|
BuffComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.BuffComponent} |
|
StudyComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.StudyComponent} |
|
SkillComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.SkillComponent, "Children": []interface{}{}, "PassiveSkillCfgIds": []interface{}{}, "TalentSkillCfgId": 0} |
|
SkillComponent["Children"] = append(SkillComponent["Children"].(primitive.A), map[string]interface{}{"_id": unit["_id"], "_t": consts.Skill, "ConfigId": config.WorldParametersConfig.VillagerSkillId, "CoolTime": 0}) |
|
VillagerSkillComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.VillagerSkillComponent, "Children": []interface{}{}} |
|
|
|
for _, v := range villagerConfig.Skill { |
|
villagerSkillC := config.VillagerSkillConfig[v] |
|
if villagerSkillC == nil { |
|
continue |
|
} |
|
VillagerSkill := map[string]interface{}{"_id": unit["_id"], "_t": consts.VillagerSkill, "ConfigId": villagerSkillC.Id} |
|
VillagerSkillComponent["Children"] = append(VillagerSkillComponent["Children"].(primitive.A), VillagerSkill) |
|
State_Ref, ok := config.SkillBuffConfig[villagerSkillC.State] |
|
if State_Ref != nil && ok { |
|
buff := map[string]interface{}{"_id": unit["_id"], "_t": consts.Buff, "BuffLayer": 1, |
|
"SkillCfgId": villagerSkillC.Id, "ConfigId": villagerSkillC.State, "AtkerId": 0, "Life": 0} |
|
BuffComponent["Children"] = []map[string]interface{}{buff} |
|
SpecialStatus_Ref, ok1 := config.SpecialStatusConfig[State_Ref.SpecialStatus] |
|
if SpecialStatus_Ref != nil && ok1 { |
|
buff["Children"] = []map[string]interface{}{{"_id": unit["_id"], "_t": consts.Status, "ConfigId": State_Ref.SpecialStatus}} |
|
} |
|
} |
|
|
|
} |
|
unit["C"] = append(villagers, villagerRecordComponent, gameNumericComponent, peopleComponent, BehaveComponent, |
|
SlotComponent, LabourComponent, MarriageComponent, ResidentComponent, FightComponent, BuffComponent, StudyComponent, |
|
SkillComponent, VillagerSkillComponent) |
|
case consts.GameUnitType_Npc: |
|
npcConfig := config.NpcConfig[req.CfgId] |
|
if npcConfig == nil { |
|
return nil, errors.New("err_NpcConfig") |
|
} |
|
pos := config.WorldParametersConfig.ValleyBusinessManSpawnPos |
|
unit := map[string]interface{}{"_id": gtime.TimestampMilli(), "_t": consts.GameUnit, "UnitType": consts.GameUnitType_Npc, |
|
"UnitCamp": consts.GameUnitCamp_Friend, "Position": map[string]interface{}{"x": pos.X, "y": pos.Y}, "C": []interface{}{}} |
|
children = append(children, unit) |
|
villagers := unit["C"].(primitive.A) |
|
npcComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.NpcComponent} |
|
villagers = append(villagers, npcComponent) |
|
npcComponent["ConfigId"] = req.CfgId |
|
behaveComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.BehaveComponent, "BehaveType": consts.BehaveType_BEHAVE_IDLE, |
|
"DayBehaveType": consts.BehaveType_BEHAVE_IDLE, "DayTargetId": 0} |
|
villagers = append(villagers, behaveComponent) |
|
gameNumericComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.GameNumericComponent, "NumericDic": []interface{}{}} |
|
NumericDic := gameNumericComponent["NumericDic"].(primitive.A) |
|
NumericDic = append(NumericDic, []interface{}{consts.NUMERICTYPE_MOVESPEEDBASE, npcConfig.MoveSpeed}) |
|
villagers = append(villagers, gameNumericComponent) |
|
dialogueComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.DialogueComponent, "State": 0, "IsInteractived": false, "InteractivedRewardOptions": []int32{}} |
|
unit["C"] = append(villagers, dialogueComponent) |
|
if npcConfig.Type == consts.NpcConfig_Type_BUSINESSMAN { |
|
businessManComponent := map[string]interface{}{"_id": unit["_id"], "_t": consts.BusinessManComponent, "Sales": []interface{}{}, |
|
"Recycles": []interface{}{}, "SaleRefreshTimes": 0, "RecycleRefreshTimes": 0} |
|
villagers = append(villagers, businessManComponent) |
|
businessManComponent["ConfigId"] = npcConfig.RelatedId |
|
businessManConfig := config.BusinessManConfig[npcConfig.RelatedId] |
|
|
|
// Recycles |
|
extralRecycleConfigs := config.GoodsForRecycleConfig[businessManConfig.RecycleItem] |
|
var extralRecycleNum int32 = 0 |
|
extralRecycles := []*config.GoodsForRecycle{} |
|
extralRecycleWeight := []int32{} |
|
for _, v := range extralRecycleConfigs { |
|
extralRecycles = append(extralRecycles, v) |
|
extralRecycleWeight = append(extralRecycleWeight, v.Weight) |
|
} |
|
|
|
recycles := businessManComponent["Recycles"].(primitive.A) |
|
for { |
|
if extralRecycleNum >= businessManConfig.RecycleItemNum || len(extralRecycles) == 0 { |
|
break |
|
} |
|
index := utils.RandomByWeight(extralRecycleWeight) |
|
extralRecycleNum++ |
|
recycles = append(recycles, createRecycleGoods(extralRecycles[index])) |
|
extralRecycleWeight = append(extralRecycleWeight[:index], extralRecycleWeight[index+1:]...) |
|
extralRecycles = append(extralRecycles[:index], extralRecycles[index+1:]...) |
|
} |
|
commonRecycleItems := config.GoodsForRecycleConfig[businessManConfig.CommonRecycleItem] |
|
for _, v := range commonRecycleItems { |
|
recycles = append(recycles, createRecycleGoods(v)) |
|
} |
|
|
|
// Sales |
|
sales := businessManComponent["Sales"].(primitive.A) |
|
saleConfigs := config.GoodsForRecycleConfig[businessManConfig.ItemGroup] |
|
for _, saleConfig := range saleConfigs { |
|
if saleConfig.SaleMax > 0 { |
|
// todo 最大值判断 |
|
} |
|
sales = append(sales, createRecycleGoods(saleConfig)) |
|
} |
|
extralSaleConfigs := config.GoodsForRecycleConfig[businessManConfig.ExtraItemGroup] |
|
var extralSaleNum int32 = 0 |
|
extralSales := []*config.GoodsForRecycle{} |
|
extralSaleWeight := []int32{} |
|
for _, v := range extralSaleConfigs { |
|
extralSales = append(extralSales, v) |
|
extralSaleWeight = append(extralSaleWeight, v.Weight) |
|
} |
|
for { |
|
if extralSaleNum >= businessManConfig.ExtraItemNum || len(extralSales) == 0 { |
|
break |
|
} |
|
index := utils.RandomByWeight(extralSaleWeight) |
|
extralSaleNum++ |
|
recycles = append(recycles, createRecycleGoods(extralSales[index])) |
|
extralSaleWeight = append(extralSaleWeight[:index], extralSaleWeight[index+1:]...) |
|
extralSales = append(extralSales[:index], extralSales[index+1:]...) |
|
} |
|
|
|
businessManComponent["Recycles"] = recycles |
|
} |
|
case consts.GameUnitType_Warrior: |
|
case consts.GameUnitType_RegionResPoint: |
|
case consts.GameUnitType_Building: |
|
case consts.GameUnitType_Monster: |
|
default: |
|
return nil, errors.New("ERR_OperateFail") |
|
} |
|
|
|
err3 := internal.UpdateUnitP(ctx, uid, c, fmt.Sprint(req.ServerId)) |
|
if err3 != nil { |
|
log.Println("additem UpdateUnitP err", err3) |
|
return nil, err3 |
|
} |
|
|
|
log.Println("additem UpdateUnitP 1", err3) |
|
return |
|
} |
|
|
|
func createRecycleGoods(cfg *config.GoodsForRecycle) map[string]interface{} { |
|
res := map[string]interface{}{} |
|
randVal := utils.RandInt32(0, 101) |
|
if randVal <= cfg.DiscountWeight { |
|
res["Discount"] = cfg.Discount |
|
} else { |
|
res["Discount"] = 100 |
|
} |
|
res["Amount"] = 0 |
|
res["ItemCfgId"] = cfg.ItemId |
|
res["AmountMax"] = utils.RandInt32(cfg.SaleNum[0], cfg.SaleNum[1]+1) |
|
return res |
|
} |
|
|
|
func (ga *gameManageImpl) AddVillagerSkill(ctx context.Context, req *game.AddVillagerSkillReq) (res *game.AddVillagerSkillRes, err error) { |
|
uid, err := internal.GetAccountUid(ctx, req.Account, fmt.Sprint(req.ServerId)) |
|
if err != nil { |
|
fmt.Println("GetAccount err", err) |
|
return nil, err |
|
} |
|
fmt.Println("GetRoleDelta", uid) |
|
roleDelta, err2 := internal.GetRoleDetail(ctx, uid, fmt.Sprint(req.ServerId)) |
|
if err2 != nil { |
|
fmt.Println("err2: ", err2) |
|
return nil, err2 |
|
} |
|
|
|
t := roleDelta["_t"] |
|
c := roleDelta["C"].(primitive.A) |
|
log.Println(" rrr >>> ", t) |
|
GameUnitComponent := map[string]interface{}{} |
|
gameUnit := primitive.A{} |
|
villagerSkillComponent := map[string]interface{}{} |
|
buffComponent := map[string]interface{}{} |
|
for _, v := range c { |
|
v1 := v.(map[string]interface{}) |
|
if v1["_t"] == consts.GameUnitComponent { |
|
GameUnitComponent = v.(map[string]interface{}) |
|
break |
|
} |
|
} |
|
|
|
childs := GameUnitComponent["children"].(primitive.A) |
|
for _, v := range childs { |
|
v1 := v.(map[string]interface{}) |
|
if v1["_id"] == req.GameUnitId { |
|
gameUnit = v1["C"].(primitive.A) |
|
break |
|
} |
|
} |
|
|
|
for _, v := range gameUnit { |
|
v1 := v.(map[string]interface{}) |
|
if v1["_t"] == consts.VillagerSkillComponent { |
|
villagerSkillComponent = v1 |
|
break |
|
} else if v1["_t"] == consts.BuffComponent { |
|
buffComponent = v1 |
|
break |
|
} |
|
} |
|
vsconfig := config.VillagerSkillConfig[req.VillagerSkillId] |
|
if vsconfig == nil { |
|
return nil, errors.New("error_config") |
|
} |
|
Children := villagerSkillComponent["Children"].(primitive.A) |
|
oldConfigId := getVillagerSkillCfgIdByGroupAndGrade(vsconfig.Group, vsconfig.Grade-1) |
|
for k, v := range Children { |
|
villagerSkill := v.(map[string]interface{}) |
|
if villagerSkill["ConfigId"] == oldConfigId { |
|
Children = append(Children[:k], Children[k+1:]...) |
|
} |
|
} |
|
VillagerSkill := map[string]interface{}{"_id": gtime.TimestampMilli(), "_t": consts.VillagerSkill} |
|
VillagerSkill["Config"] = vsconfig.Id |
|
villagerSkillComponent["Children"] = append(Children, VillagerSkill) |
|
AddBuff(buffComponent, vsconfig.State, vsconfig.Id, 0) |
|
err3 := internal.UpdateUnitP(ctx, uid, c, fmt.Sprint(req.ServerId)) |
|
if err3 != nil { |
|
log.Println("additem UpdateUnitP err", err3) |
|
return nil, err3 |
|
} |
|
|
|
log.Println("additem UpdateUnitP 1", err3) |
|
return |
|
} |
|
func getVillagerSkillCfgIdByGroupAndGrade(group int32, grade int32) int32 { |
|
for _, v := range config.VillagerSkillConfig { |
|
if v.Group == group && v.Grade == grade { |
|
return v.Id |
|
} |
|
} |
|
return 0 |
|
} |
|
|
|
func AddBuff(buffComponent map[string]interface{}, buffCfgId int32, skillCfgId int32, atkerId int64) { |
|
buffChildren := buffComponent["Children"].(primitive.A) |
|
|
|
//vsconfig := config.VillagerSkillConfig[skillCfgId] |
|
buffConfig := config.SkillBuffConfig[buffCfgId] |
|
if buffConfig != nil { |
|
//var removeId int64 = 0 |
|
var layer int32 = 1 |
|
for k, v := range buffChildren { |
|
oldBuff := v.(map[string]interface{}) |
|
if oldBuff["ConfigId"] == buffCfgId { |
|
if buffConfig.Overlay { |
|
BuffLayer := oldBuff["BuffLayer"].(int32) |
|
if BuffLayer < buffConfig.OverlayMax { |
|
layer = BuffLayer + 1 |
|
} else { |
|
layer = buffConfig.OverlayMax |
|
} |
|
buffChildren = append(buffChildren[:k], buffChildren[k+1:]...) |
|
} |
|
} |
|
} |
|
|
|
if buffConfig.SequenceId != 0 && buffConfig.SequenceLv != 0 { |
|
for k, v := range buffChildren { |
|
oldBuff := v.(map[string]interface{}) |
|
vConfig := config.SkillBuffConfig[oldBuff["ConfigId"].(int32)] |
|
if vConfig.SequenceId != 0 && vConfig.SequenceLv != 0 && vConfig.SequenceId == buffConfig.SequenceId { |
|
if vConfig.SequenceLv <= buffConfig.SequenceLv { |
|
buffChildren = append(buffChildren[:k], buffChildren[k+1:]...) |
|
} |
|
break |
|
} |
|
} |
|
} |
|
|
|
buffChild := map[string]interface{}{"_id": gtime.TimestampMilli(), "_t": consts.Buff, "ConfigId": buffCfgId, "Duration": 0, "BuffLayer": layer, |
|
"SkillCfgId": skillCfgId, "EffectValues": []interface{}{}, "Life": 0, "EffectCdTime": 0, "AtkerId": atkerId, "EffectTick": 0, "Children": primitive.A{}} |
|
SpecialStatus_Ref := config.SpecialStatusConfig[buffConfig.SpecialStatus] |
|
if SpecialStatus_Ref != nil { |
|
buffChilds := buffChild["Children"].(primitive.A) |
|
buffChild["Children"] = append(buffChilds, map[string]interface{}{"_id": gtime.TimestampMilli(), "_t": consts.Status, "ConfigId": buffConfig.SpecialStatus}) |
|
} |
|
if buffConfig.TriggerTime == consts.SkillBuff_TriggerTime_RIGHTNOW { |
|
for _, v := range buffConfig.LinkEffect { |
|
SkillEffectConfig := config.SkillEffectConfig[v] |
|
if SkillEffectConfig != nil { |
|
|
|
} |
|
} |
|
} |
|
if buffConfig.ContinuedType == consts.SkillBuff_ContinuedType_RIGHTNOW { |
|
|
|
} |
|
buffComponent["Children"] = append(buffChildren, buffChild) |
|
} |
|
} |
|
|
|
func (ga *gameManageImpl) SetWeather(ctx context.Context, req *game.SetWeatherReq) (res *game.SetWeatherRes, err error) { |
|
uid, err := internal.GetAccountUid(ctx, req.Account, fmt.Sprint(req.ServerId)) |
|
if err != nil { |
|
fmt.Println("SetWeather err", err) |
|
return nil, err |
|
} |
|
fmt.Println("SetWeather GetRoleDetail", uid) |
|
roleDelta, err2 := internal.GetRoleDetail(ctx, uid, fmt.Sprint(req.ServerId)) |
|
if err2 != nil { |
|
fmt.Println("err2: ", err2) |
|
return nil, err2 |
|
} |
|
|
|
t := roleDelta["_t"] |
|
c := roleDelta["C"].(primitive.A) |
|
log.Println("SetWeather rrr >>> ", t) |
|
WeatherComponent := map[string]interface{}{} |
|
ValleyComponent := map[string]interface{}{} |
|
GameUnitComponent := map[string]interface{}{} |
|
|
|
for _, v := range c { |
|
v1 := v.(map[string]interface{}) |
|
if v1["_t"] == consts.WeatherComponent { |
|
WeatherComponent = v1 |
|
} else if v1["_t"] == consts.ValleyComponent { |
|
ValleyComponent = v1 |
|
} else if v1["_t"] == consts.GameUnitComponent { |
|
GameUnitComponent = v1 |
|
} |
|
} |
|
|
|
if WeatherComponent == nil { |
|
WeatherComponent = map[string]interface{}{"_id": uid, "_t": consts.WeatherComponent} |
|
roleDelta["C"] = append(c, WeatherComponent) |
|
} |
|
WeatherComponent["ConfigId"] = req.WeatherConfigId |
|
WeatherComponent["StartTime"] = 0 |
|
weatherConf := config.WeatherConfig[req.WeatherConfigId] |
|
WeatherComponent["Duration"] = utils.RandInt32(weatherConf.Duration[0], weatherConf.Duration[1]+1) |
|
WeatherComponent["IsWeatherStart"] = true |
|
if weatherConf.SkillBUFF != 0 { |
|
for _, v := range GameUnitComponent { |
|
gameUnit := v.(map[string]interface{}) |
|
if gameUnit != nil && gameUnit["UnitType"] != consts.GameUnitType_Villager && gameUnit["UnitType"] != consts.GameUnitType_Warrior { |
|
continue |
|
} |
|
Compoent := gameUnit["C"].(primitive.A) |
|
buffComponent := map[string]interface{}{} |
|
for _, v2 := range Compoent { |
|
v3 := v2.(map[string]interface{}) |
|
if v3["_t"] == consts.BuffComponent { |
|
buffComponent = v3 |
|
} |
|
} |
|
|
|
AddBuff(buffComponent, weatherConf.SkillBUFF, 0, 0) |
|
BuffCfgIds := ValleyComponent["BuffCfgIds"].(primitive.A) |
|
//var a = weatherConf.SkillBUFF.(interface{}) |
|
if !utils.ContainsGeneric(BuffCfgIds, weatherConf.SkillBUFF) { |
|
BuffCfgIds = append(BuffCfgIds, weatherConf.SkillBUFF) |
|
} |
|
} |
|
} |
|
|
|
err3 := internal.UpdateUnitP(ctx, uid, c, fmt.Sprint(req.ServerId)) |
|
if err3 != nil { |
|
log.Println("SetWeather UpdateUnitP err", err3) |
|
return nil, err3 |
|
} |
|
|
|
log.Println("SetWeather UpdateUnitP 1", err3) |
|
return |
|
} |
|
|
|
func (ga *gameManageImpl) ClearResource(ctx context.Context, req *game.ClearResourceReq) (res *game.ClearResourceRes, err error) { |
|
uid, err := internal.GetAccountUid(ctx, req.Account, fmt.Sprint(req.ServerId)) |
|
if err != nil { |
|
fmt.Println("ClearResource GetAccount err", err) |
|
return nil, err |
|
} |
|
fmt.Println("ClearResource GetRoleDelta", uid) |
|
roleDelta, err2 := internal.GetRoleDetail(ctx, uid, fmt.Sprint(req.ServerId)) |
|
if err2 != nil { |
|
fmt.Println("err2: ", err2) |
|
return nil, err2 |
|
} |
|
|
|
t := roleDelta["_t"] |
|
c := roleDelta["C"].(primitive.A) |
|
log.Println("ClearResource rrr >>> ", t) |
|
GatherComponent := map[string]interface{}{} |
|
GameUnitComponent := map[string]interface{}{} |
|
ValleyComponent := map[string]interface{}{} |
|
TroopComponent := map[string]interface{}{} |
|
for _, v := range c { |
|
v1 := v.(map[string]interface{}) |
|
if v1["_t"] == consts.GatherComponent { |
|
GatherComponent = v1 |
|
} else if v1["_t"] == consts.GameUnitComponent { |
|
GameUnitComponent = v1 |
|
} else if v1["_t"] == consts.ValleyComponent { |
|
ValleyComponent = v1 |
|
} else if v1["_t"] == consts.TroopComponent { |
|
TroopComponent = v1 |
|
} |
|
} |
|
|
|
ResIds := []int32{} |
|
guC := GameUnitComponent["Children"].(primitive.A) |
|
for _, v := range guC { |
|
GameUnit := v.(map[string]interface{}) |
|
if GameUnit["UnitType"] == consts.GameUnitType_Building || GameUnit["UnitType"] == consts.GameUnitType_ResourcePoint { |
|
gameUnitC := GameUnit["C"].(primitive.A) |
|
for _, v1 := range gameUnitC { |
|
component := v1.(map[string]interface{}) |
|
if component["_t"] == consts.ResidentComponent { |
|
rpConfig := config.ResourcesPointConfig[component["ConfigId"].(int32)] |
|
if rpConfig.Type == consts.ResourcesPoint_Type_POINTRESOURCES { |
|
continue |
|
} |
|
gatherC := GatherComponent["Children"].(primitive.A) |
|
for _, v2 := range gatherC { |
|
gather := v2.(map[string]interface{}) |
|
if gather["_id"] == GameUnit["_id"] { |
|
var idList = append(gather["PeopleIdList"].(primitive.A), gather["PreparePeopleIdList"].(primitive.A)...) |
|
for _, vi := range idList { |
|
for _, vg := range guC { |
|
gameUnit1 := vg.(map[string]interface{}) |
|
if gameUnit1["_id"] == vi { |
|
gu1C := gameUnit1["C"].(primitive.A) |
|
for _, vg1 := range gu1C { |
|
vg2 := vg1.(map[string]interface{}) |
|
if vg2["_t"] == consts.BehaveComponent { |
|
processedNewBehave := consts.BehaveType_BEHAVE_IDLE |
|
if ValleyComponent != nil && ValleyComponent["IsNight"].(bool) { |
|
processedNewBehave = consts.BehaveType_BEHAVE_NIGHT_IDLE |
|
} |
|
PeopleList := TroopComponent["PeopleList"].(primitive.A) |
|
if processedNewBehave == consts.BehaveType_BEHAVE_BATTLE && gameUnit1["UnitType"] == consts.GameUnitType_Warrior && |
|
PeopleList != nil && utils.ContainsGeneric(PeopleList, vg2["_id"]) { |
|
processedNewBehave = consts.BehaveType_BEHAVE_TROOP_BATTLE |
|
} |
|
vg2["BehaveType"] = processedNewBehave |
|
vg2["TargetId"] = 0 |
|
break |
|
} |
|
} |
|
break |
|
} |
|
} |
|
} |
|
break |
|
} |
|
} |
|
ResIds = append(ResIds, component["_id"].(int32)) |
|
} |
|
} |
|
|
|
} |
|
} |
|
for _, v := range ResIds { |
|
for k1, v1 := range guC { |
|
GameUnit := v1.(map[string]interface{}) |
|
if GameUnit["_id"] == v { |
|
v1 = append(guC[:k1], guC[k1+1:]...) |
|
break |
|
} |
|
} |
|
} |
|
|
|
err3 := internal.UpdateUnitP(ctx, uid, c, fmt.Sprint(req.ServerId)) |
|
if err3 != nil { |
|
log.Println("ClearResource UpdateUnitP err", err3) |
|
return nil, err3 |
|
} |
|
|
|
log.Println("ClearResource UpdateUnitP 1", err3) |
|
return |
|
} |
|
|
|
func (ga *gameManageImpl) CopyUnit(ctx context.Context, req *game.CopyUnitReq) (res *game.CopyUnitRes, err error) { |
|
res = new(game.CopyUnitRes) |
|
unit, err := internal.GetUnit(ctx, int64(req.SrcName)) |
|
if err != nil { |
|
fmt.Println("GetAccount:", err) |
|
return |
|
} |
|
mongoConfig := internal.MongoConfigs[fmt.Sprint(unit.Server)] |
|
if mongoConfig.Id == "" { |
|
return res, errors.New("区服不存在!") |
|
} |
|
filename := "Unit" + fmt.Sprint(req.SrcName) + ".json" |
|
storeFilename := "storeComponent" + fmt.Sprint(req.SrcName) + ".json" |
|
userDir := "./download/" + filename |
|
storeDir := "./download/" + storeFilename |
|
//cmdName := "getData" + fmt.Sprint(time.Now().Unix()) |
|
|
|
g.Try(ctx, func(ctx context.Context) { |
|
name := "mongoexport" |
|
args := []string{} |
|
args1 := []string{} |
|
|
|
args = append(args, fmt.Sprintf("--uri=\"%s\"", mongoConfig.Link1)) |
|
args = append(args, fmt.Sprintf("--authenticationDatabase=%s", mongoConfig.Auth)) |
|
args1 = append(args1, fmt.Sprintf("--uri=\"%s\"", mongoConfig.Link1)) |
|
args1 = append(args1, fmt.Sprintf("--authenticationDatabase=%s", mongoConfig.Auth)) |
|
args = append(args, "--collection=Unit") |
|
args = append(args, "--jsonArray") |
|
args = append(args, fmt.Sprintf("--out=\"%s\"", userDir)) |
|
args = append(args, fmt.Sprintf("--query=\"{\\\"UniqueId\\\":%d}\"", req.SrcName)) |
|
args = append(args, "--jsonFormat=canonical") |
|
args = append(args, "--type=json") |
|
args1 = append(args1, "--collection=StoreComponent") |
|
args1 = append(args1, "--jsonArray") |
|
args1 = append(args1, fmt.Sprintf("--out=\"%s\"", storeDir)) |
|
args1 = append(args1, fmt.Sprintf("--query=\"{\\\"_id\\\":%d}\"", unit.Uid)) |
|
args1 = append(args1, "--jsonFormat=canonical") |
|
args1 = append(args1, "--type=json") |
|
|
|
err = utils.CmdCommand(ctx, name, args...) |
|
if err != nil { |
|
log.Printf("cmd.Run() args failed with %s\n", err) |
|
return |
|
} |
|
err = utils.CmdCommand(ctx, name, args1...) |
|
if err != nil { |
|
log.Printf("cmd.Run() args1 failed with %s\n", err) |
|
return |
|
} |
|
//if runtime.GOOS == "linux" { |
|
// // LINUX系统 |
|
wireteString := fmt.Sprintf("mongoexport --uri=\"%s\" --authenticationDatabase=%s --collection=Unit --out=\"%s\" --query=\"{\\\"UniqueId\\\":%d}\" --jsonArray --jsonFormat=canonical --type=json", |
|
mongoConfig.Link1, mongoConfig.Auth, userDir, req.SrcName) |
|
writeString := fmt.Sprintf("mongoexport --uri=\"%s\" --authenticationDatabase=%s --collection=StoreComponent --out=\"%s\" --query=\"{\\\"_id\\\":%d}\" --jsonArray --jsonFormat=canonical --type=json", |
|
mongoConfig.Link1, mongoConfig.Auth, storeDir, unit.Uid) |
|
log.Println(wireteString) |
|
log.Println(writeString) |
|
// if err = os.WriteFile("./"+cmdName+".sh", []byte(wireteString+"\n"+writeString), 0666); err != nil { |
|
// log.Println(err) |
|
// return |
|
// } |
|
// cmd := exec.Command("sh", cmdName+".sh") |
|
// var stdout, stderr bytes.Buffer |
|
// cmd.Stdout = &stdout // 标准输出 |
|
// cmd.Stderr = &stderr // 标准错误 |
|
// err = cmd.Run() |
|
// if err != nil { |
|
// log.Printf("cmd.Run() failed with %s\n", err) |
|
// return |
|
// } |
|
// outStr, errStr := string(stdout.Bytes()), string(stderr.Bytes()) |
|
// fmt.Printf("out:\n%s\nerr:\n%s\n", outStr, errStr) |
|
//} |
|
// |
|
//if runtime.GOOS == "windows" { |
|
// // windows系统 |
|
// writeString := fmt.Sprintf("mongoexport --uri=\"%s\" --authenticationDatabase=%s --collection=Unit --out=\"%s\" --query=\"{\\\"UniqueId\\\":%d}\" --jsonFormat=canonical --type=json", |
|
// mongoConfig.Link1, mongoConfig.Auth, userDir, req.SrcName) |
|
// storeWriteString := fmt.Sprintf("mongoexport --uri=\"%s\" --authenticationDatabase=%s --collection=StoreComponent --out=\"%s\" --query=\"{\\\"_id\\\":%d}\" --jsonFormat=canonical --type=json", |
|
// mongoConfig.Link1, mongoConfig.Auth, storeDir, unit.Uid) |
|
// log.Println(writeString) |
|
// log.Println(storeWriteString) |
|
// if err = os.WriteFile("./"+cmdName+".bat", []byte(writeString+"\n"+storeWriteString), 0666); err != nil { |
|
// log.Println(err) |
|
// return |
|
// } |
|
// cmd := exec.Command("cmd", "/c", cmdName+".bat") |
|
// err = cmd.Start() |
|
// if err != nil { |
|
// fmt.Println("Error:", err) |
|
// return |
|
// } |
|
//} |
|
res.Filename = filename |
|
res.StoreFilename = storeFilename |
|
}) |
|
fmt.Println("CopyUnit GetRoleDelta", res.Filename) |
|
return |
|
} |
|
|
|
func (ga *gameManageImpl) UpdateUnit(ctx context.Context, req *game.UpdateUnitReq) (res *game.UpdateUnitRes, err error) { |
|
res = new(game.UpdateUnitRes) |
|
unit, err := internal.GetUnit(ctx, int64(req.DestName)) |
|
if err != nil { |
|
fmt.Println("GetAccount:", err) |
|
return |
|
} |
|
mongoConfig := internal.MongoConfigs[fmt.Sprint(unit.Server)] |
|
if mongoConfig.Id == "" { |
|
return res, errors.New("区服不存在!") |
|
} |
|
|
|
destId, err1 := internal.GetIdToUid(ctx, int64(req.DestName)) |
|
if err1 != nil { |
|
return res, err1 |
|
} |
|
userDir := "./download/Unit" + fmt.Sprint(req.DestName) + fmt.Sprint(time.Now().Unix()) + ".json" |
|
srcUserDir := "./download/" + req.Filename |
|
writeByte, err1 := os.ReadFile(srcUserDir) |
|
if err1 != nil { |
|
return res, err1 |
|
} |
|
|
|
srcUid := "" |
|
srcId := "" |
|
var v1 map[string]interface{} |
|
if strings.HasPrefix(string(writeByte), "[") { |
|
user := []interface{}{} |
|
json.Unmarshal(writeByte, &user) |
|
v1 = user[0].(map[string]interface{}) |
|
} else { |
|
json.Unmarshal(writeByte, &v1) |
|
} |
|
|
|
if _, ok := v1["UniqueId"]; ok { |
|
UniqueId := v1["UniqueId"].(map[string]interface{}) |
|
srcUid = fmt.Sprint(UniqueId["$numberInt"]) |
|
} |
|
if _, ok := v1["_id"]; ok { |
|
UniqueId := v1["_id"].(map[string]interface{}) |
|
srcId = fmt.Sprint(UniqueId["$numberLong"]) |
|
} |
|
|
|
userStoreDir := "./download/storeComponent" + fmt.Sprint(req.DestName) + fmt.Sprint(time.Now().Unix()) + ".json" |
|
srcStoreDir := "./download/" + req.StoreFilename |
|
writeStoreByte, err1 := os.ReadFile(srcStoreDir) |
|
if err1 != nil { |
|
return res, err1 |
|
} |
|
|
|
var v2 map[string]interface{} |
|
if strings.HasPrefix(string(writeStoreByte), "[") { |
|
user := []interface{}{} |
|
json.Unmarshal(writeStoreByte, &user) |
|
v2 = user[0].(map[string]interface{}) |
|
} else { |
|
json.Unmarshal(writeStoreByte, &v2) |
|
} |
|
|
|
log.Printf("copyUnit srcid: %s, uid: %s, destid: %d, uid: %d", srcId, srcUid, destId, req.DestName) |
|
if srcId == "" || srcUid == "" { |
|
return |
|
} |
|
writeUnitString := strings.ReplaceAll(gjson.MustEncodeString(v1), srcId, fmt.Sprint(destId)) |
|
writeStoreString := strings.ReplaceAll(gjson.MustEncodeString(v2), srcId, fmt.Sprint(destId)) |
|
writeUnitString = internal.ReplaceLastOccurrence(writeUnitString, srcUid, fmt.Sprint(req.DestName)) |
|
if err = os.WriteFile(userDir, []byte(writeUnitString), 0666); err != nil { |
|
log.Println(err) |
|
return |
|
} |
|
|
|
if err = os.WriteFile(userStoreDir, []byte(writeStoreString), 0666); err != nil { |
|
log.Println(err) |
|
return |
|
} |
|
|
|
writeUnitCmd := fmt.Sprintf("mongoimport --uri=\"%s\" --authenticationDatabase=%s --collection=Unit --file=\"%s\" --type=json --mode=upsert", |
|
mongoConfig.Link1, mongoConfig.Auth, userDir) |
|
writeStoreCmd := fmt.Sprintf("mongoimport --uri=\"%s\" --authenticationDatabase=%s --collection=StoreComponent --file=\"%s\" --type=json --mode=upsert", |
|
mongoConfig.Link1, mongoConfig.Auth, userStoreDir) |
|
log.Println("sh Unit: ", writeUnitCmd) |
|
log.Println("sh StoreComponent: ", writeStoreCmd) |
|
g.Try(ctx, func(ctx context.Context) { |
|
name := "mongoimport" |
|
args := []string{} |
|
args1 := []string{} |
|
args = append(args, fmt.Sprintf("--uri=\"%s\"", mongoConfig.Link1)) |
|
args = append(args, fmt.Sprintf("--authenticationDatabase=%s", mongoConfig.Auth)) |
|
args1 = append(args1, fmt.Sprintf("--uri=\"%s\"", mongoConfig.Link1)) |
|
args1 = append(args1, fmt.Sprintf("--authenticationDatabase=%s", mongoConfig.Auth)) |
|
args = append(args, "--collection=Unit") |
|
args = append(args, fmt.Sprintf("--file=\"%s\"", userDir)) |
|
args = append(args, "--type=json") |
|
args = append(args, "--mode=upsert") |
|
args1 = append(args1, "--collection=StoreComponent") |
|
args1 = append(args1, fmt.Sprintf("--file=\"%s\"", userStoreDir)) |
|
args1 = append(args1, "--type=json") |
|
args1 = append(args1, "--mode=upsert") |
|
|
|
err = utils.CmdCommand(ctx, name, args...) |
|
if err != nil { |
|
log.Printf("cmd.Run() failed with %s\n", err) |
|
return |
|
} |
|
err = utils.CmdCommand(ctx, name, args1...) |
|
if err != nil { |
|
log.Printf("cmd.Run() failed with %s\n", err) |
|
return |
|
} |
|
err = os.Remove(userDir) |
|
if err != nil { |
|
log.Printf("os.Remove failed with %s\n", err) |
|
return |
|
} |
|
err = os.Remove(userStoreDir) |
|
if err != nil { |
|
log.Printf("os.Remove failed with %s\n", err) |
|
return |
|
} |
|
//cmdName := "getData" + fmt.Sprint(time.Now().Unix()) |
|
//if runtime.GOOS == "linux" { |
|
// // LINUX系统 |
|
// if err = os.WriteFile("./"+cmdName+".sh", []byte(writeUnitCmd+"\n"+writeStoreCmd), 0666); err != nil { |
|
// log.Println(err) |
|
// return |
|
// } |
|
// cmd := exec.Command("sh", cmdName+".sh") |
|
// var stdout, stderr bytes.Buffer |
|
// cmd.Stdout = &stdout // 标准输出 |
|
// cmd.Stderr = &stderr // 标准错误 |
|
// err = cmd.Run() |
|
// if err != nil { |
|
// log.Printf("cmd.Run() failed with %s\n", err) |
|
// return |
|
// } |
|
// outStr, errStr := string(stdout.Bytes()), string(stderr.Bytes()) |
|
// fmt.Printf("out:\n%s\nerr:\n%s\n", outStr, errStr) |
|
//} |
|
// |
|
//if runtime.GOOS == "windows" { |
|
// // windows系统 |
|
// if err = os.WriteFile("./"+cmdName+".bat", []byte(writeUnitCmd+"\n"+writeStoreCmd), 0666); err != nil { |
|
// log.Println(err) |
|
// return |
|
// } |
|
// cmd := exec.Command("cmd", "/c", cmdName+".bat") |
|
// err = cmd.Start() |
|
// if err != nil { |
|
// fmt.Println("Error:", err) |
|
// return |
|
// } |
|
//} |
|
}) |
|
fmt.Println("UpdateUnit GetRoleDelta", req.DestName) |
|
return |
|
} |
|
|
|
func (ga *gameManageImpl) DelAccount(ctx context.Context, req *game.DelAccountReq) (res *game.DelAccountRes, err error) { |
|
uid, err := internal.GetAccountUid2(ctx, req.SrcName, fmt.Sprint(req.ServerId)) |
|
if err != nil { |
|
fmt.Println("DelAccount GetAccount err", err) |
|
return nil, err |
|
} |
|
fmt.Println("DelAccount DelRole", uid) |
|
_, err2 := internal.DelRole(ctx, uid, fmt.Sprint(req.ServerId)) |
|
if err2 != nil { |
|
fmt.Println("DelAccount err2: ", err2) |
|
return nil, err2 |
|
} |
|
_, err3 := internal.DelAccount(ctx, uid, fmt.Sprint(req.ServerId)) |
|
if err3 != nil { |
|
fmt.Println("DelAccount err3: ", err3) |
|
return nil, err3 |
|
} |
|
_, err4 := internal.DelBaseInfo(ctx, uid, fmt.Sprint(req.ServerId)) |
|
fmt.Println("DelAccount err4: ", err4) |
|
_, err6 := internal.DelBazaar(ctx, uid, fmt.Sprint(req.ServerId)) |
|
fmt.Println("DelAccount err6: ", err6) |
|
_, err5 := internal.DelFriendUnit(ctx, uid, fmt.Sprint(req.ServerId)) |
|
fmt.Println("DelAccount err5: ", err5) |
|
return |
|
} |
|
|
|
func (ga *gameManageImpl) SearchAccount(ctx context.Context, req *game.SearchAccountReq) (res *game.SearchAccountRes, err error) { |
|
res, err = internal.SearchAccount(ctx, req) |
|
if err != nil { |
|
fmt.Println("err3: ", err) |
|
return nil, err |
|
} |
|
|
|
return res, err |
|
} |
|
|
|
/* |
|
**留存 |
|
**/ |
|
func (ga *gameManageImpl) GetKeepAlive(ctx context.Context, req *game.GetKeepAliveReq) (res *game.GetKeepAliveRes, err error) { |
|
res, err = internal.GetKeepAlive(ctx, req) |
|
return |
|
} |
|
|
|
func (ga *gameManageImpl) GetLive(ctx context.Context, req *game.GetLiveReq) (res *game.GetLiveRes, err error) { |
|
res, err = internal.GetLive(ctx, req) |
|
return |
|
} |
|
|
|
func (ga *gameManageImpl) RegisterCount(ctx context.Context, req *game.RegisterCountReq) (res *game.RegisterCountRes, err error) { |
|
res, err = internal.RegisterNum(ctx, req) |
|
return |
|
} |
|
|
|
func (ga *gameManageImpl) GetShopItemLog(ctx context.Context, req *game.GetShopItemLogReq) (res *game.GetShopItemLogRes, err error) { |
|
res, err = internal.GetShopItemLog(ctx, req) |
|
return |
|
}
|
|
|