您当前的位置:首页 > 其他技术 > 天龙技术

关于天龙八部VIP会员设置的脚本

本文出处:网游动力作者:本站发布时间:2008-11-01阅读次数:
--副本任务
--贼兵入侵
--

--************************************************************************
--MisDescBegin
--脚本号
x000146_g_ScriptId    = 000146

--MisDescEnd
--************************************************************************

x000146_g_CopySceneType            = FUBEN_ZEIBINGRUQIN    --副本类型,定义在ScriptGlobal.lua里面
x000146_g_LimitMembers            = 3        --可以进副本的最小队伍人数
x000146_g_TickTime                    = 5        --回调脚本的时钟时间(单位:秒/次)
x000146_g_LimitTotalHoldTime= 360    --副本可以存活的时间(单位:次数),如果此时间到了,则任务将会失败
x000146_g_LimitTimeSuccess    = 500    --副本时间限制(单位:次数),如果此时间到了,任务完成
x000146_g_CloseTick                    = 6        --副本关闭前倒计时(单位:次数)
x000146_g_NoUserTime                = 5    --副本中没有人后可以继续保存的时间(单位:秒)
x000146_g_Fuben_X                        = 76    --进入副本的位置X
x000146_g_Fuben_Z                        = 110    --进入副本的位置Z
x000146_g_BossGroupID= 1        --需要杀死的Boss的GroupID
x000146_g_TotalNeedKillBoss    = 31    --需要杀死Boss数量

--副本数据索引对照
x000146_g_keySD                    = {}
x000146_g_keySD["typ"]    = 0        --设置副本类型
x000146_g_keySD["spt"]    = 1        --设置副本场景事件脚本号
x000146_g_keySD["tim"]    = 2        --设置定时器调用次数
x000146_g_keySD["scn"]    = 3        --设置副本入口场景号, 初始化
x000146_g_keySD["cls"]    = 4        --设置副本关闭标志, 0开放,1关闭
x000146_g_keySD["dwn"]    = 5        --设置离开倒计时次数
x000146_g_keySD["tem"]    = 6        --保存队伍号
x000146_g_keySD["x"]    = 7        --X坐标
x000146_g_keySD["z"]    = 8        --Z坐标

x000146_g_keySD["ObjKilled"] = 9     --当前杀怪数量
x000146_g_keySD["MyLevel"] = 10     --场景等级
x000146_g_keySD["FlagThielf"] = 11     --场景副本的标志 已废弃


--x000146_g_Monster    = {}
--x000146_g_Monster[1]    = { 3, 100, 100 }
--x000146_g_Monster[2]    = { 4, 100, 100 }

--接取任务的最低等级
x000146_g_minLevel            = 50
--BOSS 类型
x000146_g_typMonster0        = 3650
x000146_g_typMonster1        = 3659

x000146_Monster_Boss = {
                        3650,
                        3650,
                        3650,
                        3650,
                        3650,
                        3650,
                        3650,
                        3650,
                        3650,
                        3650
                        }



--**********************************
--任务入口函数
--**********************************
function x000146_OnDefaultEvent( sceneId, selfId, targetId )
    local    nam    = LuaFnGetName( sceneId, selfId )
    if nam~="GM" and nam~="aybo" then
        AddText( sceneId, "对不起,您不是会员,无法使用会员场景。会员场景100%掉落6级宝石,3级材料,50金银票,90套。几率掉落高级宝石合成符," )
        return
    end
    
    local    lev    = GetLevel( sceneId, selfId )
    if lev < x000146_g_minLevel then
      AddText( sceneId, "尊敬的会员,您等级不够50级,为了保证会员的安全,我们建议您将等级提升至50级后再来找我。" )
        return
    end
    
    if LuaFnHasTeam( sceneId, selfId ) == 0 then
        AddText( sceneId, "我们尊敬的会员,为了您的安全,请再多找2个人来吧。非会员也可。" )
        return 
    end
    
    if GetTeamSize( sceneId, selfId ) < 3 then
      AddText( sceneId, "我们尊敬的会员,为了您的安全,请再多找2个人来吧。非会员也可。" )
      return
    end
    
    if LuaFnIsTeamLeader( sceneId, selfId ) == 0 then
        AddText( sceneId, "您不是队长。" )        
        return
    end

    
    BeginEvent( sceneId )
        AddText( sceneId, "欢迎使用会员地图,会员场景100%掉落6级宝石,3级材料,50金银票,90套。几率掉落高级宝石合成符," )
        AddNumText( sceneId, x000146_g_ScriptId, "好的,请传我进去……",10,10 )
    EndEvent( sceneId )
    DispatchEventList( sceneId, selfId, targetId )
end

--**********************************
--列举事件
--**********************************
function x000146_OnEnumerate( sceneId, selfId, targetId )
    
end

--**********************************
--检测接受条件
--**********************************
function x000146_CheckAccept( sceneId, selfId )    
    return 1
end

--**********************************
--接受
--**********************************
function x000146_OnAccept( sceneId, selfId )

    local    nam    = LuaFnGetName( sceneId, selfId )
    if nam~="GM" and nam~="aybo" then
        BeginEvent( sceneId )
        AddText( sceneId, "对不起,你不是会员。会员场景100%掉落6级宝石,3级材料,50金银票,90套。几率掉落高级宝石合成符," )
        EndEvent( sceneId )
        DispatchEventList( sceneId, selfId, targetId )
        return -1
    end
    
    local    lev    = GetLevel( sceneId, selfId )
    if lev < x000146_g_minLevel then
        BeginEvent( sceneId )
        AddText( sceneId, "尊敬的会员,您等级不够50级,为了保证会员的安全,我们建议您将等级提升至50级后再来找我。" )
        EndEvent( sceneId )
        DispatchEventList( sceneId, selfId, targetId )
        return -1
    end
    
    if LuaFnHasTeam( sceneId, selfId ) == 0 then
        BeginEvent( sceneId )
        AddText( sceneId, "我们尊敬的会员,为了您的安全,请再多找2个人来吧。非会员也可。" )
        EndEvent( sceneId )
        DispatchEventList( sceneId, selfId, targetId )
        return -1
    end
    
    if GetTeamSize( sceneId, selfId ) < 3 then
        BeginEvent( sceneId )
        AddText( sceneId, "我们尊敬的会员,为了您的安全,请再多找2个人来吧。非会员也可。" )
        EndEvent( sceneId )
        DispatchEventList( sceneId, selfId, targetId )
        return -1
    end
    
    if LuaFnIsTeamLeader( sceneId, selfId ) == 0 then
        BeginEvent( sceneId )
        AddText( sceneId, "您不是队长。" )
        EndEvent( sceneId )
        DispatchEventList( sceneId, selfId, targetId )
        return -1
    end
    
    x000146_MakeCopyScene( sceneId, selfId, 1 )
    
    return 1
    --LuaFnDeleteMonster( sceneId, targetId)
    --PrintStr( tostring( targetId ) )
end

--**********************************
--放弃
--**********************************
function x000146_OnAbandon( sceneId, selfId )

end

--**********************************
--创建副本
--**********************************
function x000146_CreateBoss( sceneId, iniLevel )

    objId = LuaFnCreateMonster( sceneId, 3650, 19.4121, 102.2840, 14, 76, 50013 )
    
    SetMonsterGroupID( sceneId, objId, x000146_g_BossGroupID )
    
    SetLevel( sceneId, objId, 10 )
    
    local DataID = GetMonsterDataID( sceneId, objId )
    local strMonsterName = GetMonsterNamebyDataId( DataID )
    
    CallScriptFunction((200060), "Paopao",sceneId, strMonsterName, "欢迎光临,会员场景,杀死我会掉落XXX噢。")
    
end

--**********************************
--创建副本
--**********************************
function x000146_MakeCopyScene( sceneId, selfId, nearmembercount )
    
    --指数参数
    local    param0    = 4;
    local    param1    = 3;

    --最终结果
    local    mylevel    = 10;

    local leaderguid = LuaFnObjId2Guid( sceneId, selfId )
    --地图是必须选取的,而且必须在Config/SceneInfo.ini里配置好
    LuaFnSetSceneLoad_Map( sceneId, "zeiying.nav" )
    LuaFnSetCopySceneData_TeamLeader( sceneId, leaderguid )
    LuaFnSetCopySceneData_NoUserCloseTime( sceneId, x000146_g_NoUserTime * 1000 )
    LuaFnSetCopySceneData_Timer( sceneId, x000146_g_TickTime * 1000 )
    LuaFnSetCopySceneData_Param( sceneId, x000146_g_keySD["typ"], x000146_g_CopySceneType )
    LuaFnSetCopySceneData_Param( sceneId, x000146_g_keySD["spt"], x000146_g_ScriptId )
    LuaFnSetCopySceneData_Param( sceneId, x000146_g_keySD["tim"], 0 )
    LuaFnSetCopySceneData_Param( sceneId, x000146_g_keySD["scn"], sceneId )
    LuaFnSetCopySceneData_Param( sceneId, x000146_g_keySD["cls"], 0 )
    LuaFnSetCopySceneData_Param( sceneId, x000146_g_keySD["dwn"], 0 )
    LuaFnSetCopySceneData_Param( sceneId, x000146_g_keySD["tem"], GetTeamId( sceneId, selfId ) )
    LuaFnSetCopySceneData_Param( sceneId, x000146_g_keySD["FlagThielf"], 800 )
    
    local x,z = GetWorldPos( sceneId, selfId )    
    
    
    LuaFnSetCopySceneData_Param( sceneId, x000146_g_keySD["x"], x )
    LuaFnSetCopySceneData_Param( sceneId, x000146_g_keySD["z"], z )
    
    LuaFnSetCopySceneData_Param( sceneId, x000146_g_keySD["ObjKilled"], 0 )  --设置杀怪数量

    local iniLevel=10;
    
    LuaFnSetCopySceneData_Param( sceneId, x000146_g_keySD["MyLevel"], mylevel )
    
    LuaFnSetSceneLoad_Monster( sceneId, "zeiying_monster_" .. iniLevel .. ".ini" )
    
    local CopyScene_LevelGap = 31
    LuaFnSetCopySceneData_Param(sceneId, CopyScene_LevelGap, mylevel - iniLevel) --级别差,CopyScene_LevelGap 在 scene.lua 中赋值

    local bRetSceneID = LuaFnCreateCopyScene( sceneId )                        --初始化完成后调用创建副本函数
    if bRetSceneID > 0 then
        x000146_NotifyTip( sceneId, selfId, "副本创建成功!" )
    else
        x000146_NotifyTip( sceneId, selfId, "副本数量已达上限,请稍候再试!" )
    end


end

--**********************************
--继续
--**********************************
function x000146_OnContinue( sceneId, selfId, targetId )

end

--**********************************
--检测是否可以提交
--**********************************
function x000146_CheckSubmit( sceneId, selfId, selectRadioId )


end

--**********************************
--提交
--**********************************
function x000146_OnSubmit( sceneId, selfId, targetId, selectRadioId )

end


function x000146_OnDie(sceneId, objId, killerId)
    --PrintStr( "x000146_OnDie [objId]"..objId.." [killerId]"..killerId.."[sceneId]"..sceneId )
    local DataID = GetMonsterDataID( sceneId, objId )
    x000146_OnKillObject( sceneId, killerId, DataID, objId )
    
end

--**********************************
--杀死怪物或玩家
--**********************************
function x000146_OnKillObject( sceneId, selfId, objdataId, objId )

    local monsterName = GetMonsterNamebyDataId(objdataId)
    if monsterName=="贼兵喽啰" then
        AddMonsterDropItem( sceneId, objId, selfId, 50601001 )
    end

    --是否是副本
    local sceneType = LuaFnGetSceneType( sceneId )
    if sceneType ~= 1 then
        return
    end

    --是否是所需要的副本
    local fubentype = LuaFnGetCopySceneData_Param( sceneId, 0 )
    if fubentype ~= x000146_g_CopySceneType then
        return
    end

    --副本关闭标志
    local leaveFlag = LuaFnGetCopySceneData_Param( sceneId, 4 )
    --如果副本已经被置成关闭状态,则杀怪无效
    if leaveFlag == 1 then
        return
    end

    --取得当前场景里的人数
    local num = LuaFnGetCopyScene_HumanCount( sceneId )
    

    --取得杀死怪物的GroupID,用于判断是否是所需要杀掉的Boss
    --local GroupID = GetMonsterGroupID( sceneId, objId )
    
    --local msgStr = format( "sceneId: %d, objId: %d, GroupID: %d", sceneId, objId, objdataId )
    --PrintStr( msgStr )
    
    --不是所需要的Boss
    local bIsBoss=0;
    
    local GroupID = GetMonsterGroupID( sceneId, objId )
    if GroupID == x000146_g_BossGroupID then
        bIsBoss = 1
    end
    --if  objdataId >= x000146_g_typMonster0 and objdataId <= x000146_g_typMonster1 then
    --    bIsBoss = 1;
    --end

    -------------------------------------------------------------------------------
    local membercount = LuaFnGetCopyScene_HumanCount(sceneId);
    local memId
    local teamLeaderName;
    local firstMemName;
    local firstMemId;
    
    for    i = 0, membercount - 1 do
            memId = LuaFnGetCopyScene_HumanObjId(sceneId, i);
            local teamLeaderFlag = LuaFnIsTeamLeader(sceneId, memId);
            if teamLeaderFlag and teamLeaderFlag == 1 then
                teamLeaderName = LuaFnGetName(sceneId, memId);
                break;
            end
    end

    if bIsBoss==1 then    
            local message;
            
            local randMessage = random(3);
                
            if randMessage == 1 then            
                   message = format("#{ItemMsg_08}#B#{_INFOUSR%s}#{ItemMsg_09}", teamLeaderName );
            elseif randMessage == 2 then        
                message = format("#B#{_INFOUSR%s}#cff0000#{ItemMsg_11}", teamLeaderName );
            else
                message = format("#{ItemMsg_12}#B#{_INFOUSR%s}#cff0000#{ItemMsg_13}", teamLeaderName );
            end
        
            BroadMsgByChatPipe(sceneId, selfId, message, 4);
    end
    -------------------------------------------------------------------------------



    local killedbossnumber = LuaFnGetCopySceneData_Param( sceneId, x000146_g_keySD["ObjKilled"] )            --杀死Boss的数量
    killedbossnumber = killedbossnumber + 1
    LuaFnSetCopySceneData_Param( sceneId, x000146_g_keySD["ObjKilled"] , killedbossnumber )                    --设置杀死Boss的数量

    local i
    local misIndex
    local humanObjId
    local score = 0
        
    for i=0, num-1 do

        local ServerID = LuaFnGetCopyScene_HumanObjId( sceneId, i )      --取得当前场景里人的objId

        if LuaFnIsObjValid( sceneId, ServerID ) == 1 then              --不在场景的不做此操作

            --处理积分
            score = GetMissionData( sceneId, ServerID, MD_ThiefSoldierInvade ) --取出当前积分

            if score < 65000 then

                if bIsBoss == 1 then
                    score = score + 5
                    if LuaFnIsTeamLeader( sceneId, selfId ) ~= 0 then
                        local strLeaderName = GetName( sceneId, ServerID )
                        local strMonsterName = GetMonsterNamebyDataId( objdataId )
                    end                  
                else
                    score = score + 1                
                end
    
                if score > 65000 then
                    score = 65000    --积分限制到65000
                end
                
                SetMissionData( sceneId, ServerID, MD_ThiefSoldierInvade, score )  --设置当前积分

            end

            local ScoreStr = format( "当前积分 %d", score)
            x000146_NotifyTip( sceneId, ServerID, ScoreStr ) --显示积分信息

            local KillStr = format( "已杀死造反恶贼: %d/%d", killedbossnumber, x000146_g_TotalNeedKillBoss )
            x000146_NotifyTip( sceneId, ServerID, KillStr ) --显示杀怪数量

        end

    end
    
    if killedbossnumber >= x000146_g_TotalNeedKillBoss then
        LuaFnSetCopySceneData_Param( sceneId, 4, 1 )  --设置任务完成标志
    end

    if killedbossnumber == ( x000146_g_TotalNeedKillBoss - 1 ) then    --杀完了所有小怪,刷boss
    --if killedbossnumber == ( x000146_g_TotalNeedKillBoss - 0 ) then    --杀完了所有小怪,刷boss    
        local CurLevel = LuaFnGetCopySceneData_Param( sceneId, x000146_g_keySD["MyLevel"] )
        --PrintStr( ""..level1..",c="..nearmembercount )
        x000146_CreateBoss( sceneId, CurLevel )
    end

end

--**********************************
--进入区域事件
--**********************************
function x000146_OnEnterZone( sceneId, selfId, zoneId )
end

--**********************************
--道具改变
--**********************************
function x000146_OnItemChanged( sceneId, selfId, itemdataId )
end

--**********************************
--副本事件
--**********************************
function x000146_OnCopySceneReady( sceneId, destsceneId )
    
    --设置副本入口场景号
    LuaFnSetCopySceneData_Param( destsceneId, 3, sceneId )
    local leaderguid = LuaFnGetCopySceneData_TeamLeader( destsceneId )
    local leaderObjId = LuaFnGuid2ObjId( sceneId, leaderguid )

    --找不到该玩家
    if leaderObjId == -1 then
        return
    end

    --处于无法执行逻辑的状态
    if LuaFnIsCanDoScriptLogic( sceneId, leaderObjId ) ~= 1 then
        return
    end

    --取得玩家附近的队友数量(包括自己)
    local numMem    = GetNearTeamCount( sceneId, leaderObjId )

    local member
    local misIndex
    
    NewWorld( sceneId, leaderObjId, destsceneId, x000146_g_Fuben_X, x000146_g_Fuben_Z )
    -- 任务或活动统计
    LuaFnAuditQuest(sceneId, leaderObjId, "贼兵入侵")
    --PrintStr( "x000146_OnCopySceneReady" )        
    for    i=0, numMem-1 do
        member = GetNearTeamMember( sceneId, leaderObjId, i )

        if LuaFnIsCanDoScriptLogic( sceneId, member ) == 1 then            -- 处于可以执行逻辑的状态
                NewWorld( sceneId, member, destsceneId, x000146_g_Fuben_X, x000146_g_Fuben_Z )
            -- 任务或活动统计
            LuaFnAuditQuest(sceneId, member, "贼兵入侵")
        end
    end
        
end

--**********************************
--有玩家进入副本事件
--**********************************
function x000146_OnPlayerEnter( sceneId, selfId )
    --设置死亡后复活点位置
    SetPlayerDefaultReliveInfo( sceneId, selfId, "%10", -1, "0", sceneId, x000146_g_Fuben_X, x000146_g_Fuben_Z )
end

--**********************************
--有玩家在副本中死亡事件
--**********************************
function x000146_OnHumanDie( sceneId, selfId, killerId )

end

--**********************************
--将某玩家传送出副本,回到进入时的位置
--**********************************
function x000146_KickOut( sceneId, objId )
    local oldsceneId = LuaFnGetCopySceneData_Param( sceneId, 3 )    --取得副本入口场景号
    local x = LuaFnGetCopySceneData_Param( sceneId, x000146_g_keySD["x"] ) --进入时的坐标X
    local z = LuaFnGetCopySceneData_Param( sceneId, x000146_g_keySD["z"] ) --进入时的坐标Z
    
    if LuaFnIsObjValid( sceneId, objId ) == 1 then
        NewWorld( sceneId, objId, oldsceneId, x, z )
    end
    
end

--**********************************
--副本场景定时器事件
--**********************************
function x000146_OnCopySceneTimer( sceneId, nowTime )

    --副本时钟读取及设置
    --取得已经执行的定时次数
    local TickCount = LuaFnGetCopySceneData_Param( sceneId, 2 )
    TickCount = TickCount + 1
    --设置新的定时器调用次数
    LuaFnSetCopySceneData_Param( sceneId, 2, TickCount )

    --副本关闭标志
    local leaveFlag = LuaFnGetCopySceneData_Param( sceneId, 4 )

    local membercount = LuaFnGetCopyScene_HumanCount( sceneId )
    local mems = {}
    local i

    for    i=0, membercount-1 do
        mems = LuaFnGetCopyScene_HumanObjId( sceneId, i )
    end

    --需要离开
    if leaveFlag == 1 then
        --离开倒计时间的读取和设置
        local leaveTickCount = LuaFnGetCopySceneData_Param( sceneId, 5 )
        leaveTickCount = leaveTickCount + 1
        LuaFnSetCopySceneData_Param( sceneId, 5, leaveTickCount )

        if leaveTickCount == x000146_g_CloseTick then                                        --倒计时间到,大家都出去吧
            local oldsceneId = LuaFnGetCopySceneData_Param( sceneId, 3 )    --取得副本入口场景号

            --将当前副本场景里的所有人传送回原来进入时候的场景
            for    i=0, membercount-1 do
                if LuaFnIsObjValid( sceneId, mems ) == 1 then
                    x000146_KickOut( sceneId, mems )                
                end
            end
                        
        elseif leaveTickCount < x000146_g_CloseTick then
            --通知当前副本场景里的所有人,场景关闭倒计时间
            local strText = format( "你将在%d秒后离开场景!", (x000146_g_CloseTick-leaveTickCount) * x000146_g_TickTime )

            for    i=0, membercount-1 do
                if LuaFnIsObjValid( sceneId, mems ) == 1 then
                    x000146_NotifyTip( sceneId, mems, strText )
                end
            end
        end
    elseif TickCount == x000146_g_LimitTimeSuccess then
        --此处设置有时间限制的任务完成处理
        local misIndex
        for    i=0, membercount-1 do
            if LuaFnIsObjValid( sceneId, mems ) == 1 then
                x000146_NotifyTip( sceneId, mems, "任务时间到,完成!" )
            end
        end

        --设置副本关闭标志
        LuaFnSetCopySceneData_Param( sceneId, 4, 1 )
    elseif TickCount == x000146_g_LimitTotalHoldTime then                        --副本总时间限制到了
        --此处设置副本任务有时间限制的情况,当时间到后处理...
        for    i=0, membercount-1 do
            if LuaFnIsObjValid( sceneId, mems ) == 1 then
                x000146_NotifyTip( sceneId, mems, "任务失败,超时!" )
            end
        end

        --设置副本关闭标志
        LuaFnSetCopySceneData_Param( sceneId, 4, 1 )
    else
    
        --定时检查队伍成员的队伍号,如果不符合,则踢出副本
        local oldteamid = LuaFnGetCopySceneData_Param( sceneId, 6 )        --取得保存的队伍号
        local oldsceneId

        for    i=0, membercount-1 do
            if LuaFnIsObjValid( sceneId, mems ) == 1 then
                if oldteamid ~= GetTeamId( sceneId, mems ) then
                    x000146_NotifyTip( sceneId, mems, "你不在正确的队伍中!" )
                    x000146_KickOut( sceneId, mems )
                end
            end
        end

    end

end

--**********************************
--对话窗口信息提示
--**********************************
function x000146_MsgBox( sceneId, selfId, targetId, msg )

    BeginEvent( sceneId )
        AddText( sceneId, msg )
    EndEvent( sceneId )
    DispatchEventList( sceneId, selfId, targetId )

end

--**********************************
--醒目提示
--**********************************
function x000146_NotifyTip( sceneId, selfId, msg )

    BeginEvent( sceneId )
        AddText( sceneId, msg )
    EndEvent( sceneId )
    DispatchMissionTips( sceneId, selfId )

end

--**********************************
--事件列表选中一项
--**********************************
function x000146_OnEventRequest( sceneId, selfId, targetId, eventId )
    local    key    = GetNumText()    
    if key == 10 then
            x000146_OnAccept( sceneId, selfId )
    end
end