mirror of
https://github.com/FlourishingWorld/hk4e.git
synced 2026-02-12 19:22:27 +08:00
优化场景LUA处理
This commit is contained in:
@@ -1,8 +1,12 @@
|
||||
package game
|
||||
|
||||
import (
|
||||
"hk4e/common/constant"
|
||||
"hk4e/gdconf"
|
||||
"hk4e/pkg/logger"
|
||||
"hk4e/pkg/object"
|
||||
"hk4e/protocol/cmd"
|
||||
"hk4e/protocol/proto"
|
||||
|
||||
lua "github.com/yuin/gopher-lua"
|
||||
)
|
||||
@@ -50,21 +54,26 @@ func CallLuaFunc(luaState *lua.LState, luaFuncName string, luaCtx *LuaCtx, luaEv
|
||||
Protect: true,
|
||||
}, ctx, evt)
|
||||
if err != nil {
|
||||
logger.Error("call lua error: %v", err)
|
||||
logger.Error("call lua error, func: %v, error: %v", luaFuncName, err)
|
||||
return false
|
||||
}
|
||||
luaRet := luaState.Get(-1)
|
||||
luaState.Pop(1)
|
||||
ret, ok := luaRet.(lua.LBool)
|
||||
if !ok {
|
||||
switch luaRet.(type) {
|
||||
case lua.LBool:
|
||||
return bool(luaRet.(lua.LBool))
|
||||
case lua.LNumber:
|
||||
return object.ConvRetCodeToBool(int64(luaRet.(lua.LNumber)))
|
||||
default:
|
||||
return false
|
||||
}
|
||||
return bool(ret)
|
||||
}
|
||||
|
||||
func RegLuaLibFunc() {
|
||||
gdconf.RegScriptLib("GetEntityType", GetEntityType)
|
||||
gdconf.RegScriptLib("GetQuestState", GetQuestState)
|
||||
gdconf.RegScriptLibFunc("GetEntityType", GetEntityType)
|
||||
gdconf.RegScriptLibFunc("GetQuestState", GetQuestState)
|
||||
gdconf.RegScriptLibFunc("PrintContextLog", PrintContextLog)
|
||||
gdconf.RegScriptLibFunc("BeginCameraSceneLook", BeginCameraSceneLook)
|
||||
}
|
||||
|
||||
func GetEntityType(luaState *lua.LState) int {
|
||||
@@ -76,15 +85,19 @@ func GetEntityType(luaState *lua.LState) int {
|
||||
func GetQuestState(luaState *lua.LState) int {
|
||||
ctx, ok := luaState.Get(1).(*lua.LTable)
|
||||
if !ok {
|
||||
luaState.Push(lua.LNumber(0))
|
||||
luaState.Push(lua.LNumber(constant.QUEST_STATE_NONE))
|
||||
return 1
|
||||
}
|
||||
uid, ok := luaState.GetField(ctx, "uid").(lua.LNumber)
|
||||
if !ok {
|
||||
luaState.Push(lua.LNumber(0))
|
||||
luaState.Push(lua.LNumber(constant.QUEST_STATE_NONE))
|
||||
return 1
|
||||
}
|
||||
player := USER_MANAGER.GetOnlineUser(uint32(uid))
|
||||
if player == nil {
|
||||
luaState.Push(lua.LNumber(constant.QUEST_STATE_NONE))
|
||||
return 1
|
||||
}
|
||||
entityId := luaState.ToInt(2)
|
||||
_ = entityId
|
||||
questId := luaState.ToInt(3)
|
||||
@@ -93,3 +106,45 @@ func GetQuestState(luaState *lua.LState) int {
|
||||
luaState.Push(lua.LNumber(quest.State))
|
||||
return 1
|
||||
}
|
||||
|
||||
func PrintContextLog(luaState *lua.LState) int {
|
||||
ctx, ok := luaState.Get(1).(*lua.LTable)
|
||||
if !ok {
|
||||
return 0
|
||||
}
|
||||
uid, ok := luaState.GetField(ctx, "uid").(lua.LNumber)
|
||||
if !ok {
|
||||
return 0
|
||||
}
|
||||
logInfo := luaState.ToString(2)
|
||||
logger.Info("[LUA LOG] %v [UID %v]", logInfo, uid)
|
||||
return 0
|
||||
}
|
||||
|
||||
func BeginCameraSceneLook(luaState *lua.LState) int {
|
||||
ctx, ok := luaState.Get(1).(*lua.LTable)
|
||||
if !ok {
|
||||
luaState.Push(lua.LNumber(-1))
|
||||
return 1
|
||||
}
|
||||
uid, ok := luaState.GetField(ctx, "uid").(lua.LNumber)
|
||||
if !ok {
|
||||
luaState.Push(lua.LNumber(-1))
|
||||
return 1
|
||||
}
|
||||
player := USER_MANAGER.GetOnlineUser(uint32(uid))
|
||||
if player == nil {
|
||||
luaState.Push(lua.LNumber(-1))
|
||||
return 1
|
||||
}
|
||||
cameraLockInfo, ok := luaState.Get(2).(*lua.LTable)
|
||||
if !ok {
|
||||
luaState.Push(lua.LNumber(-1))
|
||||
return 1
|
||||
}
|
||||
ntf := new(proto.BeginCameraSceneLookNotify)
|
||||
gdconf.ParseLuaTableToObject(cameraLockInfo, ntf)
|
||||
GAME_MANAGER.SendMsg(cmd.BeginCameraSceneLookNotify, player.PlayerID, player.ClientSeq, ntf)
|
||||
luaState.Push(lua.LNumber(0))
|
||||
return 1
|
||||
}
|
||||
|
||||
@@ -384,6 +384,7 @@ func (g *GameManager) AoiPlayerMove(player *model.Player, oldPos *model.Vector,
|
||||
g.AddSceneEntityNotify(player, proto.VisionType_VISION_MEET, addEntityIdList, false, false)
|
||||
// 场景区域触发器
|
||||
dbQuest := player.GetDbQuest()
|
||||
updateQuest := false
|
||||
for _, group := range newVisionGroupMap {
|
||||
for _, region := range group.RegionList {
|
||||
shape := alg.NewShape()
|
||||
@@ -416,49 +417,79 @@ func (g *GameManager) AoiPlayerMove(player *model.Player, oldPos *model.Vector,
|
||||
Z: float32(newPos.Z),
|
||||
})
|
||||
if !oldPosInRegion && newPosInRegion {
|
||||
// EVENT_ENTER_REGION
|
||||
logger.Debug("player enter region: %v, uid: %v", region, player.PlayerID)
|
||||
for _, trigger := range group.TriggerList {
|
||||
if trigger.Event != constant.LUA_EVENT_ENTER_REGION {
|
||||
continue
|
||||
}
|
||||
cond := CallLuaFunc(group.LuaState, trigger.Condition, &LuaCtx{
|
||||
uid: player.PlayerID,
|
||||
}, &LuaEvt{
|
||||
param1: region.ConfigId,
|
||||
targetEntityId: entityId,
|
||||
})
|
||||
cond := CallLuaFunc(group.GetLuaState(), trigger.Condition,
|
||||
&LuaCtx{uid: player.PlayerID},
|
||||
&LuaEvt{param1: region.ConfigId, targetEntityId: entityId})
|
||||
if !cond {
|
||||
continue
|
||||
}
|
||||
// TODO 这一块写得太炸裂了需要优化
|
||||
for _, triggerDataConfig := range gdconf.GetTriggerDataMap() {
|
||||
if triggerDataConfig.TriggerName == trigger.Name {
|
||||
for _, quest := range dbQuest.GetQuestMap() {
|
||||
questDataConfig := gdconf.GetQuestDataById(int32(quest.QuestId))
|
||||
if questDataConfig == nil {
|
||||
continue
|
||||
}
|
||||
for _, questCond := range questDataConfig.FinishCondList {
|
||||
if questCond.Type != constant.QUEST_FINISH_COND_TYPE_TRIGGER_FIRE {
|
||||
continue
|
||||
}
|
||||
if questCond.Param[0] != triggerDataConfig.TriggerId {
|
||||
continue
|
||||
}
|
||||
dbQuest.ForceFinishQuest(quest.QuestId)
|
||||
}
|
||||
}
|
||||
}
|
||||
ok := CallLuaFunc(group.GetLuaState(), trigger.Action,
|
||||
&LuaCtx{uid: player.PlayerID},
|
||||
&LuaEvt{})
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
updateQuest = g.TriggerFire(dbQuest, trigger)
|
||||
}
|
||||
} else if oldPosInRegion && !newPosInRegion {
|
||||
// EVENT_LEAVE_REGION
|
||||
logger.Debug("player leave region: %v, uid: %v", region, player.PlayerID)
|
||||
for _, trigger := range group.TriggerList {
|
||||
if trigger.Event != constant.LUA_EVENT_LEAVE_REGION {
|
||||
continue
|
||||
}
|
||||
cond := CallLuaFunc(group.GetLuaState(), trigger.Condition,
|
||||
&LuaCtx{uid: player.PlayerID},
|
||||
&LuaEvt{param1: region.ConfigId, targetEntityId: entityId})
|
||||
if !cond {
|
||||
continue
|
||||
}
|
||||
ok := CallLuaFunc(group.GetLuaState(), trigger.Action,
|
||||
&LuaCtx{uid: player.PlayerID},
|
||||
&LuaEvt{})
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
g.AcceptQuest(player, true)
|
||||
if updateQuest {
|
||||
g.AcceptQuest(player, true)
|
||||
}
|
||||
}
|
||||
|
||||
func (g *GameManager) TriggerFire(dbQuest *model.DbQuest, trigger *gdconf.Trigger) bool {
|
||||
// TODO 这一块写得太炸裂了需要优化
|
||||
updateQuest := false
|
||||
for _, triggerDataConfig := range gdconf.GetTriggerDataMap() {
|
||||
if triggerDataConfig.TriggerName == trigger.Name {
|
||||
for _, quest := range dbQuest.GetQuestMap() {
|
||||
questDataConfig := gdconf.GetQuestDataById(int32(quest.QuestId))
|
||||
if questDataConfig == nil {
|
||||
continue
|
||||
}
|
||||
for _, questCond := range questDataConfig.FinishCondList {
|
||||
if questCond.Type != constant.QUEST_FINISH_COND_TYPE_TRIGGER_FIRE {
|
||||
continue
|
||||
}
|
||||
if len(questCond.Param) != 1 {
|
||||
continue
|
||||
}
|
||||
if questCond.Param[0] != triggerDataConfig.TriggerId {
|
||||
continue
|
||||
}
|
||||
dbQuest.ForceFinishQuest(quest.QuestId)
|
||||
updateQuest = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return updateQuest
|
||||
}
|
||||
|
||||
func (g *GameManager) AbilityInvocationsNotify(player *model.Player, payloadMsg pb.Message) {
|
||||
|
||||
@@ -62,7 +62,7 @@ func (g *GameManager) AddQuestProgress(player *model.Player, req *proto.AddQuest
|
||||
}
|
||||
|
||||
// AcceptQuest 接取当前条件下能接取到的全部任务
|
||||
func (g *GameManager) AcceptQuest(player *model.Player, isNtfClient bool) {
|
||||
func (g *GameManager) AcceptQuest(player *model.Player, notifyClient bool) {
|
||||
dbQuest := player.GetDbQuest()
|
||||
addQuestIdList := make([]uint32, 0)
|
||||
for _, questData := range gdconf.GetQuestDataMap() {
|
||||
@@ -100,7 +100,7 @@ func (g *GameManager) AcceptQuest(player *model.Player, isNtfClient bool) {
|
||||
addQuestIdList = append(addQuestIdList, uint32(questData.QuestId))
|
||||
}
|
||||
}
|
||||
if isNtfClient {
|
||||
if notifyClient {
|
||||
ntf := &proto.QuestListUpdateNotify{
|
||||
QuestList: make([]*proto.Quest, 0),
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ import (
|
||||
|
||||
const (
|
||||
ENTITY_MAX_BATCH_SEND_NUM = 1000 // 单次同步的最大实体数量
|
||||
ENTITY_LOD = 300 // 实体加载视野距离
|
||||
ENTITY_LOD = 100 // 实体加载视野距离
|
||||
)
|
||||
|
||||
func (g *GameManager) EnterSceneReadyReq(player *model.Player, payloadMsg pb.Message) {
|
||||
|
||||
@@ -15,7 +15,7 @@ import (
|
||||
|
||||
const (
|
||||
ENTITY_NUM_UNLIMIT = false // 是否不限制场景内实体数量
|
||||
ENTITY_MAX_SEND_NUM = 300 // 场景内最大实体数量
|
||||
ENTITY_MAX_SEND_NUM = 500 // 场景内最大实体数量
|
||||
MAX_MULTIPLAYER_WORLD_NUM = 10 // 本服务器最大多人世界数量
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user