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.
 
 
SigFiesta/LuaScript/AIScript/BH_Humar.lua

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