副本生命周期
OnCopySceneTick() 子线程每次心跳调用
--副本心跳
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;
if x3323_g_GameOver == 2 then
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
OnCopySceneClientPlayerEnterOk() 玩家进入处理雇佣robot共战逻辑
function x3323_OnCopySceneClientPlayerEnterOk(objId)
table.insert(x3323_g_Players,objid);
if x3323_g_IsPlayerEnter == 0 then
--更新
end
local bLeader = C_IsTeamLeader(objId)
if bLeader == 1 then
local id1,id2,id3,id4 = C_CreateMercenary(objId,0,1)
--清空
if id1 ~= -1 then
x3323_g_LeaderObjId = objId;
end
end
end
创建怪物
小怪【不带技能】
即x3323_g_CreateNextEnemy() 方法
--核心
local nGroupID = x3323_g_CurrentEnemyData[x3323_g_CurrentGroupIndex];
if nGroupID ~= nil then
local nNpcCreateNumber = C_CreateCopySceneNpcByGroup(nGroupID);//核心
if nNpcCreateNumber > 0 then
x3323_g_CurrentEnemyCount = x3323_g_CurrentEnemyCount + nNPCCreateNumber;
end
else
--说明上一波已经是最后一拨的怪物了
C_CreateCopySceneNpcByGroup
可以根据组号创建一组怪物
那么可以在脚本初始化时创建一组怪物Id
比如,参考服务器配置表CopySceneNpc.txt
local x3323_g_CurrentEnemyData =
{
[1] = {770,771,772,773.......791}
[2] = {792,793,.......}
}
然后C_CreateCopySceneNpcByGroup 就会通过访问服务器根据组号查找CopySceneNpc.txt表,
通过dataID列找到对应的Npc 模型表,这是一张客户端访问的表
可以看到882 883 是45级的【巫族怨灵】 战斗逻辑是 1 (没有技能)
若查找成功像客户端广播GC_CreateCopySceneNpcByGroup 消息,客户端拿到一组位置 和 index, 走创建AssetsGroupManager,创建fbx实例。
精英怪 & BOSS 【带技能】
需要强调的是,本游戏里的 技能skillLogic 逻辑依赖于impact 表,严格意义上来说,普通攻击方式也算一种逻辑,都是一种skillLogic的方式,但impact表的参数表个字段走默认值是-1,可能没有派发BUFF(持续的增益/减益效果) 、可能没有附带粒子特效。
这种怪物一般有自己的战斗策略
这里以镇魔古洞的第二个精英怪物【888:饕餮为例】
查找npcAttr表
战斗策略是104,查看一下NpcSkillStrategy.txt
这只怪物有4个技能,编号【100005,160706,160707,160101】默认是100001 技能 ,且四种技能权重对默认技能的权重比是1:1 ,表示在这只怪物在进入攻击状态时,有50%几率先使用非默认技能
查找一下skillEx技能逻辑表
可以看到饕餮有毒雾 、 猛击 两套AOE 还有召唤 蛇妖的召唤类技能
按照策划需求,在召唤蛇妖时有对话框气泡、
在指定难度等级下 蛇妖本体【无敌】 在指定结束后,自爆。范围性伤害
需要在Lua脚本中单独处理一下这部分逻辑
function x3323_OnCopySceneSkillStart(objID,SkillID,targetObjId)
if X3323_g_TaoTieSnare_SkillID[x3323_g_CopyGrade] == skillId then
--提示字
C_NPCChat(objId,"#{5284}");
--
local posX,posY,posZ = C_GetPos(objId)
x3323_Create_WudiMonster(posX,posY,posZ)
return
end
end
function x3323_Create_WudiMonster(posX,posY,posZ)
for i = 1,6 do
local x3323_g_monsterId = C_CreateNpc(x3323_g_TaotieXiaoBin_DataId[x3323_g_CopyGrade],posx,posZ,0,x3323_g_CopyLevel);
table.insert(x3323_g_CacheSheYaoObjId,x3323_g_monsterId);
C_AddBuff(x3323_g_monsterId,x3323_g_monster,x3323_g_TaotieMonster_ZiBaoBuff)
C_AddBuff(x3323_g_monsterId,x3323_g_monster,x3323_g_TaotieMonster_WudiBuff)
end
end
C_AddBuff(lua_State * L)方法是服务器
从Lua接受第一个参数是派发者Id ,第二个参数是接受此Buff 角色id,第三个是读impact 表(buff 效果表)关于Buff效果逻辑内容见【技能文章】,不是本文重点。
饕餮开启对话、释放蛇妖【技能编号:160101】
奖励信息
副本中的奖励有【掉落奖励】 和 【结算奖励】两种
这里讨论掉落奖励,因为结算奖励属于OnCopySceneEnd 流程里的内容
function x3323_CreateLimitDropItem(npcId,playerObjId,posx,posy,posz,lismitDropPackageId)
C_CreateDropItem(npcId,lismitDropPackageId,playerObjId,posx,posy,posz)
end
此方法在指定Npc死亡时,就是怪物死亡时调用。
第二种方法就是读取配置表