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.
291 lines
7.5 KiB
291 lines
7.5 KiB
--[[
|
|
보스 상위버전 - 후마르
|
|
|
|
9Data/Here/World/FineScript.txt 필요
|
|
9Data/Hero/Script/BH_Humar.txt 필요
|
|
]]
|
|
|
|
-- 스크립트의 리턴값
|
|
ReturnAI = {}
|
|
ReturnAI.END = 1 -- Return_AI_END = 1;// -- 모든 AI루틴 끝
|
|
ReturnAI.CPP = 2 -- Return_AI_CPP = 2;// -- 루아로 일부 처리한 후 cpp의 AI루틴 돌림
|
|
|
|
|
|
--BossIndex = "BH_Humar"
|
|
FellowIndex = {}
|
|
FellowIndex[1] = "BH_Looter"
|
|
FellowIndex[2] = "BH_Guardian"
|
|
|
|
HumarBuffSkill = "BH_Humar_Skill_N_APU"
|
|
HumarBuffAbState = "StaMobAPU01"
|
|
HumarBuffSec = 60
|
|
|
|
SummonSkillName = "BH_Humar_Skill_S"
|
|
SummonSkillCastSecond = 5
|
|
|
|
--어그로 제거시 부하 없애고 inactiv상태로
|
|
SummonRate = {}
|
|
SummonRate[1] = 750 -- 75%, 50%, 25%에서 한번씩 부하들 리젠
|
|
SummonRate[2] = 500
|
|
SummonRate[3] = 250
|
|
SummonRate[4] = 0 -- 마지막은 항상 0인것 추가 필요
|
|
|
|
MemBlock = {}
|
|
|
|
----------------------------------------------------------------------
|
|
-- Mantis 7984
|
|
-- 보물상자 소환 정보
|
|
BH_HumarBox =
|
|
{
|
|
{ Index = "BH_Humar_X", ItemDropMobIndex = "BH_Humar_O", x = 3060, y = 3126, width = 303, height = 494, rotate = 4 },
|
|
{ Index = "BH_Humar_X", ItemDropMobIndex = "BH_Humar_O_02", x = 3060, y = 3126, width = 303, height = 494, rotate = 4 },
|
|
{ Index = "BH_Humar_X", ItemDropMobIndex = "BH_Humar_O_03", x = 3060, y = 3126, width = 303, height = 494, rotate = 4 },
|
|
{ Index = "BH_Humar_X", ItemDropMobIndex = "BH_Humar_O_04", x = 3060, y = 3126, width = 303, height = 494, rotate = 4 },
|
|
}
|
|
----------------------------------------------------------------------
|
|
|
|
function Common_RemoveTreasure(MapIndex)
|
|
cExecCheck "Common_RemoveTreasure"
|
|
cDebugLog "Common_RemoveTreasure"
|
|
|
|
cRegenGroupActiv("BH_Cracker", "BH_HumarBox", 0) -- 상자가 나오지 않도록(세번째 인수를 생략하거나 1이면 activ)
|
|
-- cVanishAll(MapIndex, "BH_Humar_O")
|
|
-- cVanishAll(MapIndex, "BH_Humar_O_02")
|
|
-- cVanishAll(MapIndex, "BH_Humar_O_03")
|
|
-- cVanishAll(MapIndex, "BH_Humar_O_04")
|
|
cVanishAll(MapIndex, "BH_Humar_X")
|
|
end
|
|
|
|
|
|
-- 부하들은 스크립트처리 안함 - CPP 루틴 사용
|
|
|
|
------------------------------------------------------------------
|
|
----------------------- Humar Part --------------------------
|
|
------------------------------------------------------------------
|
|
|
|
function BH_Humar(Handle, MapIndex)
|
|
cExecCheck "BH_Humar"
|
|
local Var = MemBlock[Handle]
|
|
if cIsObjectDead(Handle) ~= nil then
|
|
if Var ~= nil then -- 보스가 죽었음
|
|
cDebugLog("Boss Dead")
|
|
for k = 1, 2 do
|
|
if Var.FellowHandle[k] ~= -1 then
|
|
cNPCVanish(Var.FellowHandle[k])
|
|
Var.FellowHandle[k] = -1
|
|
end
|
|
end
|
|
|
|
-- 투명인간 소환 - 보물상자 제어용
|
|
local InvisibleHandle = cMobRegen_Obj("InvisibleMan", Handle)
|
|
cAIScriptSet(InvisibleHandle, Handle) -- 비쥬의 AI스크립트를 Var.Handle(헬가)의 AI스크립트로 세팅
|
|
MemBlock[InvisibleHandle] = {}
|
|
MemBlock[InvisibleHandle].Handle = InvisibleHandle
|
|
MemBlock[InvisibleHandle].MapIndex = MapIndex
|
|
MemBlock[InvisibleHandle].StepFunc = Invisible_Init
|
|
|
|
MemBlock[Handle] = nil
|
|
end
|
|
return ReturnAI.END
|
|
end
|
|
|
|
|
|
if Var == nil then -- 처음 리젠되었음
|
|
MemBlock[Handle] = {}
|
|
Var = MemBlock[Handle]
|
|
|
|
Var.Handle = Handle
|
|
Var.MapIndex = MapIndex
|
|
Var.FellowHandle = {}
|
|
Var.FellowHandle[1] = -1
|
|
Var.FellowHandle[2] = -1
|
|
|
|
Var.NextSummonIndex = 1
|
|
Var.BoxVanish = 0 -- 10초에 한번씩 박스를 지우기 위해
|
|
|
|
Var.TargetLostSec = 0 -- 타겟을 잃은 시간
|
|
Var.NextBuff = 0 -- 다음번 버프받을 시간
|
|
|
|
Var.Wait = {}
|
|
Var.Wait.Second = 0;
|
|
Var.Wait.NextFunc = nil
|
|
|
|
Var.StepFunc = Boss_WaitInvader
|
|
end
|
|
|
|
return Var.StepFunc(Var)
|
|
end
|
|
|
|
function Boss_Wait(Var) -- Var.Wait.Second까지 기다린 후 StepFunc을 WaitFunction으로 세팅
|
|
cExecCheck "Boss_Wait"
|
|
if cCurSec() >= Var.Wait.Second then
|
|
Var.StepFunc = Var.Wait.NextFunc
|
|
end
|
|
end
|
|
|
|
function Boss_WaitInvader(Var)
|
|
cExecCheck "Boss_WaitInvader"
|
|
|
|
local CurSecond = cCurSec()
|
|
if CurSecond > Var.BoxVanish then
|
|
Common_RemoveTreasure(Var.MapIndex)
|
|
Var.BoxVanish = CurSecond + 10
|
|
end
|
|
|
|
|
|
local hp
|
|
local maxhp
|
|
hp, maxhp = cObjectHP(Var.Handle)
|
|
if hp < maxhp then
|
|
Var.NextBuff = cCurSec() + HumarBuffSec
|
|
Var.StepFunc = Boss_SummonCheck
|
|
end
|
|
|
|
if hp == maxhp and Var.NextSummonIndex ~= 1 then
|
|
Var.NextSummonIndex = 1
|
|
cDebugLog "Summon Reset"
|
|
end
|
|
|
|
return ReturnAI.END
|
|
end
|
|
|
|
function Boss_BuffCheck(Var)
|
|
cExecCheck "Boss_BuffCheck"
|
|
hp, maxhp = cObjectHP(Var.Handle)
|
|
if hp == maxhp then
|
|
Var.StepFunc = Boss_WaitInvader -- 전투 끝, 피 회복되었음
|
|
return
|
|
end
|
|
|
|
if cCurSec() >= Var.NextBuff then
|
|
cDebugLog "Buffing"
|
|
if cNPCSkillUse(Var.Handle, Var.Handle, HumarBuffSkill) ~= nil then
|
|
Var.NextBuff = cCurSec() + HumarBuffSec
|
|
else
|
|
cDebugLog "Fail"
|
|
end
|
|
end
|
|
|
|
Var.StepFunc = Boss_SummonCheck
|
|
end
|
|
|
|
function Boss_SummonCheck(Var)
|
|
cExecCheck "Boss_SummonCheck"
|
|
local hp
|
|
local maxhp
|
|
hp, maxhp = cObjectHP(Var.Handle)
|
|
if hp * 1000 < maxhp * SummonRate[Var.NextSummonIndex] and cNPCSkillUse(Var.Handle, Var.Handle, SummonSkillName) == 1 then
|
|
cDebugLog("Summon Index " .. Var.NextSummonIndex)
|
|
Var.NextSummonIndex = Var.NextSummonIndex + 1
|
|
|
|
Var.Wait.Second = cCurSec() + SummonSkillCastSecond
|
|
Var.Wait.NextFunc = Boss_SummomFellow
|
|
|
|
Var.StepFunc = Boss_Wait
|
|
return
|
|
end
|
|
|
|
-- 부하들 죽었는지 확인
|
|
for fel = 1, 2 do
|
|
if Var.FellowHandle[fel] ~= -1 and cIsObjectDead(Var.FellowHandle[fel]) ~= nil then
|
|
Var.FellowHandle[fel] = -1
|
|
end
|
|
end
|
|
|
|
|
|
if cTargetHandle(Var.Handle) ~= nil then -- 타겟 있음
|
|
Var.TargetLostSec = cCurSec()
|
|
elseif Var.TargetLostSec + 10 < cCurSec() then -- 타겟 사라짐
|
|
Var.StepFunc = Boss_WaitInvader
|
|
|
|
cResetAbstate(Var.Handle, HumarBuffAbState) -- 버프 해제
|
|
|
|
-- Remove fallows
|
|
for k = 1, 2 do
|
|
if Var.FellowHandle[k] ~= -1 then
|
|
cNPCVanish(Var.FellowHandle[k])
|
|
Var.FellowHandle[k] = -1
|
|
end
|
|
end
|
|
end
|
|
|
|
Var.StepFunc = Boss_BuffCheck
|
|
|
|
return ReturnAI.CPP
|
|
end
|
|
|
|
function Boss_SummomFellow(Var)
|
|
cExecCheck "Boss_SummomFellow"
|
|
local summon = false
|
|
for fel = 1, 2 do
|
|
if Var.FellowHandle[fel] == -1 then
|
|
Var.FellowHandle[fel] = cMobRegen_Obj(FellowIndex[fel], Var.Handle)
|
|
summon = true
|
|
end
|
|
end
|
|
if summon then
|
|
cNPCChat(Var.Handle, "BH_Humar_Sum")
|
|
end
|
|
Var.StepFunc = Boss_SummonCheck
|
|
end
|
|
|
|
|
|
|
|
-------------------------------------------------------------------------
|
|
----------------------- InvisibleMan Part --------------------------
|
|
-------------------------------------------------------------------------
|
|
-- 보물상자 제어용 오브젝트
|
|
|
|
function InvisibleMan(Handle, MapIndex)
|
|
cExecCheck "InvisibleMan"
|
|
local Var = MemBlock[Handle]
|
|
if Var == nil then
|
|
----cDebugLog("InvisibleMan Handle Error:" .. Handle)
|
|
return
|
|
end
|
|
|
|
if Var.StepFunc ~= nil then
|
|
Var.StepFunc(Var)
|
|
end
|
|
|
|
return ReturnAI.END
|
|
end
|
|
|
|
function Invisible_Init(Var)
|
|
cExecCheck "Invisible_Init"
|
|
cDebugLog "Invisible_Init"
|
|
|
|
----------------------------------------------------------------------
|
|
-- Mantis 7984
|
|
-- ※ 보물상제 소환 및 아이템드랍그룹 몬스터 셋팅
|
|
for i = 1, #BH_HumarBox
|
|
do
|
|
local BoxHandle = cMobRegen_Rectangle( Var["MapIndex"], BH_HumarBox[i]["Index"], BH_HumarBox[i]["x"], BH_HumarBox[i]["y"], BH_HumarBox[i]["width"], BH_HumarBox[i]["height"], BH_HumarBox[i]["rotate"] )
|
|
if BoxHandle ~= nil
|
|
then
|
|
cSetItemDropMobID( BoxHandle, BH_HumarBox[i]["ItemDropMobIndex"] )
|
|
end
|
|
end
|
|
----------------------------------------------------------------------
|
|
|
|
cGroupRegen("BH_Cracker", "BH_HumarBox") -- 상자가 나오도록
|
|
|
|
|
|
Var.Wait = {}
|
|
Var.Wait.Second = cCurSec() + 60
|
|
Var.StepFunc = Invisible_AllVanish
|
|
end
|
|
|
|
function Invisible_AllVanish(Var)
|
|
cExecCheck "Invisible_AllVanish"
|
|
|
|
if cCurSec() > Var.Wait.Second then
|
|
cDebugLog "Invisible_AllVanish"
|
|
cRegenGroupActiv("BH_Cracker", "BH_HumarBox", 0) -- 상자가 나오지 않도록(세번째 인수를 생략하거나 1이면 activ)
|
|
|
|
Common_RemoveTreasure(Var.MapIndex)
|
|
cNPCVanish(Var.Handle)
|
|
|
|
Var.StepFunc = nil
|
|
end
|
|
end
|
|
|