服务器子线程心跳检测玩家进入副本信息
1.创建副本实例【Lua】
服务器GameServer::Routine线程在心跳中检测
发现ROUTINEMSG_IMPL(PlayerEnterSceneMsg)
会走void CopyScene::HandleMsg(const PlayerEnterSceneMsg& Msg)
void CopyScene::HandleMsg(const PlayerEnterSceneMsg& Msg)
{
if(Obj_Player->curPlayer != nullptr)
{
CopySceneInfo Info = curPlayer->GetCopySceneInfo();
if(info.CheckValid(GetLocalTime() == CopySceneErrorInfo::INFO_OK))
{
//单人模式数据添加
//组队模式数据添加
}
//断线重连保存现场
RefixLevelWhenAccident(Info,curPlayer->GetLevel.m_nLevel);
//
Open(Info,ptr);
}
}
void CopyScene::Open(const CopySceneInfo& rInfo)
{
//缓存是否首次掉落
//副本共战信息
//加载Lua脚本
Script_OnCopySceneOpen();
}
调用Lua脚本
void CopyScene::Script_OnCopySceneOpen()
{
__SOL_TRACE
ScriptParamList oParamList;
LuaCall(m_data.GetScriptID(),"OnCopySceneOpen",oParamList);
SOL_TRACE__
}
Lua脚本内容
OnCopySceneOpen是玩家刚进入副本时调用,在镇魔古洞中
--npc
x3323_g_JuBaoPenNpc_ObjId = -1;
--副本难度
_,x3323_g_CopyGrade, _, x3323_g_CopyLevel = C_GetCopySceneInfo() ;
--副本心跳
function x3323_OnCopySceneTick(elapse)
if x3323_g_IsPlayerEnter == 0 then
return; -- 如果没人进入,则函数直接返回
end
if x3323_g_GameOver == 1 then
if x3323_g_EndTick > 0 then
x3323_CountDown(x3323_g_EndTick);
x3323_g_EndTick = x3323_g_EndTick - 1;
return;
else
C_LeveCopySceneAllPlayer();
x3323_g_Gameover = 2;
end;
return;
end;
x3323_g_CopyTime = x3323_g_CopyTime + elapse; --时间累加
if x3323_g_CopyTime >= x3323_g_EndTime then
x3323_CountDown(x3323_g_EndTick)
x3323_g_EndTick = x3323_g_EndTick -1;
else
x3323_InActiveness();
C_LeaveCopySceneAllPlayer();
x3323_g_GameOver = 2;
end
return;
end
if x3323_g_CurrentEnemyCount == 0 then
x3323_CreateNextEnemy();
end
end
可以看出对于游戏目前的状态,是否结束会进行不同的判断。 由于OnCopySceneTick是在服务器的Tick 过程中调用的,类似客户端的Update。
在其中进行游戏终止判定 和 生成敌人的操作(此副本中,定义一波敌人全部消灭后,生成下一波)
好了,接下来我们详细看一下Lua中的副本逻辑