require( "common" ) -------------------------------------------------------------------- --※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ --// [S_21003] 크리스마스_2014_이벤트 관련 데이터 ---------------------------------------------------------START----- --※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ -------------------------------------------------------------------- -------------------------------------------------------------------- --// 대형나무 처리 관련 데이터 -------------------------------------------------------------------- -- 디펜스 이벤트 진행시 변경될 애니메이션 TREE_DEFENCE_TABLE = { TREE_DIE = { AniIndex = "E_XTreeBig_Idle05", }, -- 부서지는 모양 TREE_REGEN = { AniIndex = "E_XTreeBig_Idle00", }, -- 원래대로 되돌림( 0단계로 ) } -------------------------------------------------------------------- --// 산타 깨빙 처리 관련 데이터 -------------------------------------------------------------------- SANTA_KEBING_MOB_REGEN_TABLE = { RunSpeed = 700, MobIndex = "KebingX_14", { RegenX = 18427, RegenY = 15754, Dir = 0,}, { RegenX = 13598, RegenY = 15727, Dir = 0,}, { RegenX = 14685, RegenY = 9746, Dir = 0,}, { RegenX = 11327, RegenY = 13423, Dir = 0,}, } SANTA_KEBING_MOB_ANI_TABLE = { CastAniIndex = "KebingKnockBackCasting", CastAniKeepTime = 3, -- CastAniIndex 재생시간. 이 시간만큼 CastAniIndex 애니 재생 후, SwingAniIndex로 넘어감 SwingAniIndex = "KebingKnockBackSwing", } -- 이동 상태값 flag MOVESTATE = {} MOVESTATE["STOP"] = "STOP" MOVESTATE["MOVE"] = "MOVE" PATHTYPE_CHK_DLY = 1 PATHTYPE_GAP = 100 -- 웨이브몹 이동좌표체크 여유거리 SANTA_KEBING_PATH_TABLE = { -- RegenX = 18427, RegenY = 15754에서 리젠될 산타깨빙의 PATH정보 { --{ x = 18427, y = 15754, }, -- 출발점(리젠좌표) { x = 17473, y = 14197, }, { x = 16386, y = 13974, }, { x = 15572, y = 13385, }, -- 트리 좌표 }, -- RegenX = 13598, RegenY = 15727에서 리젠될 산타깨빙의 PATH정보 { --{ x = 13598, y = 15727, }, -- 출발점(리젠좌표) { x = 14139, y = 14478, }, { x = 15572, y = 13385, }, }, -- RegenX = 14685, RegenY = 9746에서 리젠될 산타깨빙의 PATH정보 { --{ x = 14685, y = 9746, }, -- 출발점(리젠좌표) { x = 14954, y = 11265, }, { x = 15555, y = 11704, }, { x = 15572, y = 13385, }, }, -- RegenX = 11327, RegenY = 13423에서 리젠될 산타깨빙의 PATH정보 { --{ x = 11327, y = 13423, }, -- 출발점(리젠좌표) { x = 12547, y = 13423, }, { x = 13178, y = 12963, }, { x = 14022, y = 13411, }, { x = 15572, y = 13385, }, }, } -------------------------------------------------------------------- --// 크러시볼 처리 관련 데이터 -------------------------------------------------------------------- CRUSHBALL_TABLE = { MobIndex = "BallCrush", SkillIndex = "BallCrush_Skill01_W", } -- 크러시볼에 맞았을때, 산타깨빙에게 걸어줄 넉백 상태이상 CRUSHBALL_ABSTATE_TABLE = { AbStateHitRate = 300, -- 상태이상이 발생할 확률 AbstateIndex = "StaKnockBackFly", Strength = 1, KeepTime = 1, } -------------------------------------------------------------------- --// 디펜스이벤트 보상 관련 데이터 -------------------------------------------------------------------- DEFENCE_EVENT_REWARD_ABSTATE_TABLE = { AbstateIndex = "StaXmas_StatUp", Strength = 1, KeepTime = (60*60*1000), Range = 10000, -- 산타깨빙 모두 물리쳤을때, 메인트리 기준으로 Range안에 들어와있는 캐릭터에 상태이상을 줌 } -------------------------------------------------------------------- --// Script -------------------------------------------------------------------- E_XKebingChat01 = "E_XKebingChat01" -- 지난번처럼 당할거라고 생각하지마라!! E_X_Notice_DefenseStart = "E_X_Notice_DefenseStart" -- 크리스마스 깨빙의 습격이 시작되었습니다. 트리를 지켜주세요. E_X_Notice_DefenseSucc = "E_X_Notice_DefenseSucc" -- 크리스마스 보스 깨빙의 습격으로 부터 방어를 성공하였습니다. E_X_Notice_DefenseFail = "E_X_Notice_DefenseFail" -- 크리스마스 깨빙에 의해 트리가 파괴되었습니다. E_X_Notice_TreeRegen = "E_X_Notice_TreeRegen" -- 새로운 트리가 세워졌습니다. 트리를 꾸며 주세요. -------------------------------------------------------------------- --// 디펜스이벤트 처리 관련 데이터 -------------------------------------------------------------------- NEED_KEBING_KILLCOUNT_FOR_DEFENCE_EVENT = 100 -- 장난꾸러기 깨빙 n마리 사냥시, 디펜스이벤트가 시작됨 SANTAKEBING_CRUSHBALL_HIT_COUNT = 50 -- 산타깨빙이 크러시볼에 n번 맞으면 사망함 SANTAKEBING_RANGE_WITH_TREE = 50 -- 산타깨빙과 메인트리 충돌 범위 SANTAKEBING_RANGE_WITH_CRUSHBALL = 50 -- 산타깨빙과 크러시볼 충돌 범위 DEFENCE_EVENT_FAIL_TREE_REGEN_TIME = 15 -- 디펜스 실패후, 트리가 다시 리젠될때까지 걸리는 시간(초) -------------------------------------------------------------------- --// 게임로그 -------------------------------------------------------------------- NC_LOG_GAME_CHRISTMAS_DECO_TRY_BIG_TREE = 2045 -- 대형트리 꾸미기를 시도 NC_LOG_GAME_CHRISTMAS_DECO_TRY_SMALL_TREE = 2046 -- 소형트리 꾸미기를 시도( 소형트리 몹 아이디 ) NC_LOG_GAME_CHRISTMAS_DECO_COMPLETE_BIG_TREE = 2047 -- 대형트리 꾸미기를 완성 NC_LOG_GAME_CHRISTMAS_DECO_COMPLETE_SMALL_TREE = 2048 -- 소형트리 꾸미기를 완성( 소형트리 몹 아이디 ) NC_LOG_GAME_CHRISTMAS_START_DEFENCE = 2049 -- 디펜스 이벤트 진행 NC_LOG_GAME_CHRISTMAS_SUCC_DEFENCE = 2050 -- 디펜스 이벤트 성공 -------------------------------------------------------------------- --※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ --// [S_21003] 크리스마스_2014_이벤트 관련 데이터 ---------------------------------------------------------END------- --※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ -------------------------------------------------------------------- -------------------------------------------------------------------- --// Defined -------------------------------------------------------------------- VALID_MAP_INDEX = "Eld" -- 메인트리 리젠시 체크할 맵인덱스 IMMORTAL_INDEX = "StaImmortal" -- 몹 리젠시 풀어줄 상태이상 TREE_CAST_TIME = (2*1000) -- 나무 캐스팅 시간 TREE_CAST_ANI = "ActionProduct" -- 나무 캐스팅 애니메이션 인덱스 TREE_CAST_ITEM = "E_XTreeDeco" -- 나무 캐스팅 이후 소모 아이템 -------------------------------------------------------------------- --// Script -------------------------------------------------------------------- -- 파일 이름 SCRIPT_FILE_NAME = "Event" -- 스크립트 인덱스 E_X_Notice_TreeUp01 = "E_X_Notice_TreeUp01" -- 트리가 2단계로 변형되어 장식이 늘어납니다. E_X_Notice_TreeUp02 = "E_X_Notice_TreeUp02" -- 트리가 3단계로 변형되어 빛나는 장식이 늘어납니다. E_X_Notice_TreeUp03 = "E_X_Notice_TreeUp03" -- 트리가 4단계로 변형되어 불빛이 화려해집니다. E_X_Notice_TreeUp04 = "E_X_Notice_TreeUp04" -- 트리가 5단계로 변형되어 화려함의 극치를 보여줍니다. E_X_Notice_TreeUp05 = "E_X_Notice_TreeUp05" -- 장난꾸러기 깨빙들이 트리 장식들을 훔쳐갑니다. E_X_Notice_TreeInit = "E_X_Notice_TreeInit" -- 장난꾸러기 깨빙들이 모두 도망쳤습니다. 트리를 다시 꾸며주세요. E_X_Notice_Buff01 = "E_X_Notice_Buff01" -- 크리스마스의 소망이 느껴질랑가 몰라 E_X_Notice_Buff02 = "E_X_Notice_Buff02" -- 루돌프의 소망이 느껴질랑가 몰라 E_X_Notice_Buff03 = "E_X_Notice_Buff03" -- 산타 요정의 소망이 느껴질랑가 몰라 E_X_Notice_Buff04 = "E_X_Notice_Buff04" -- 산타의 소망이 느껴질랑가 몰라 E_X_SysMsg_Deco01 = "E_X_SysMsg_Deco01" -- 크리스마스 소망 트리에 별 장식을 달았습니다. E_X_SysMsg_Deco02 = "E_X_SysMsg_Deco02" -- 루돌프의 소망 트리에 별 장식을 달았습니다. E_X_SysMsg_Deco03 = "E_X_SysMsg_Deco03" -- 산타요정의 소망 트리에 별 장식을 달았습니다. E_X_SysMsg_Deco04 = "E_X_SysMsg_Deco04" -- 산타의 소망 트리에 별 장식을 달았습니다. E_X_SysMsg_Deco05 = "E_X_SysMsg_Deco05" -- 아이샤의 소망 트리에 별 장식을 달았습니다. E_X_ErrMsg_DecoFail = "E_X_ErrMsg_DecoFail" -- 트리 별 장식이 없습니다. 아이템을 가지고 다시 시도 해주세요. E_X_SysMsg_DecoFail = "E_X_SysMsg_Fail1" -- 지금은 트리에 장식을 추가할 수 없습니다. 잠시 후 다시 시도해주세요. E_X_SysMsg_DecoFail_2 = "E_X_SysMsg_Fail2" -- Cannot use the item due to an Abnormal State -------------------------------------------------------------------- --// 대형나무 처리 관련 데이터 -------------------------------------------------------------------- -- 레벨 테이블 -- NeedCount : 해당 레벨이 되기위해 필요한 아이템 수. (레벨은 0단계부터) -- LevDwnKeep : 1 = 1Sec, 최대 레벨이 된 이후 각 레벨 유지 시간 TREE_LEVEL_TABLE = { { NeedCount = 50 , AniIndex = "E_XTreeBig_Idle01", LevDwnKeep = 100, Notice = E_X_Notice_TreeUp01, }, { NeedCount = 100, AniIndex = "E_XTreeBig_Idle02", LevDwnKeep = 100, Notice = E_X_Notice_TreeUp02, }, { NeedCount = 150, AniIndex = "E_XTreeBig_Idle03", LevDwnKeep = 100, Notice = E_X_Notice_TreeUp03, }, { NeedCount = 200, AniIndex = "E_XTreeBig_Idle04", LevDwnKeep = 600, Notice = E_X_Notice_TreeUp04, }, } -- 몹 리젠 테이블 -- RegenInterval: 1 = 1Sec, 몹이 죽은 이후 다시 리젠 되는 시간. REWARD_MOB_REGEN_TABLE = { { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15861, CenterY = 15069, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 15612, CenterY = 11399, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, { MobIndex = "E_XKebing", CenterX = 12342, CenterY = 11267, Range = 2000, RegenInterval = 2, }, } -- 연출 TREE_LEVEL_DOWN_EVENT_INFO = { MobLifeTime = 5, -- n초동안 유지되는 MobIndex = "E_XKebing_Show", -- s몹을 RegenTick = 3, -- n+1틱마다(1Tick=0.1Sec) RegenDist = 300, -- 나무와 n만큼 떨어진 거리에서 리젠하고 FollowGap = 180, -- 나무와 n만큼 떨어진 거리까지 이동해서 AniTime = 3, -- n초 동안 AniIndex = "E_XKebing_Skill01_N", -- s애니메이션을 보여주고 RunSpeed = 2000, -- (n/1000)의 이동속도로 RunMaxDist = 2000, -- 나무와 n만큼 떨어진 거리까지 도망가는 연출을 KeepTime = 30, -- n초 동안 유지한다. } -------------------------------------------------------------------- --// 소형나무 처리 관련 데이터 -------------------------------------------------------------------- -- 보상 상태이상 테이블 -- KeepTime : 1000 = 1sec -- Range : 보상 범위 REWARD_ABSTATE_TABLE = { Reward01 = { AbstateIndex = "StaXReward01", Strength = 1, KeepTime = (60*60*1000), Range = 1000, Notice = E_X_Notice_Buff01, }, Reward02 = { AbstateIndex = "StaXReward02", Strength = 1, KeepTime = (60*60*1000), Range = 1000, Notice = E_X_Notice_Buff02, }, Reward03 = { AbstateIndex = "StaXReward03", Strength = 1, KeepTime = (60*60*1000), Range = 1000, Notice = E_X_Notice_Buff03, }, Reward04 = { AbstateIndex = "StaXReward04", Strength = 1, KeepTime = (60*60*1000), Range = 1000, Notice = E_X_Notice_Buff04, }, } -- 레벨 테이블 -- MaxLevelKeep : 1 = 1Sec, 최대 레벨이 된 이후 유지 시간 -- NeedCount : 해당 레벨이 되기위해 필요한 아이템 수. (레벨은 0단계부터) SMALL_TREE_LEVEL_TABLE = { MaxLevelKeep = 300, { NeedCount = 5, AniIndex = "E_XTree_Idle01", }, { NeedCount = 10, AniIndex = "E_XTree_Idle02", }, } -- 소형나무 정보 -- LevelTable : SMALL_TREE_LEVEL_TABLE 데이터 인덱스 -- RewardAbstate: REWARD_ABSTATE_TABLE 데이터 인덱스 SMALL_TREE_INFO = { { MobIndex = "E_XTree_Xmas", RegenX = 14738, RegenY = 13055, Dir = 7, CastSuccMsg = E_X_SysMsg_Deco01, RewardAbstate = "Reward01", }, { MobIndex = "E_XTree_Rudolph", RegenX = 17372, RegenY = 13673, Dir = 129, CastSuccMsg = E_X_SysMsg_Deco02, RewardAbstate = "Reward02", }, { MobIndex = "E_XTree_Fairy", RegenX = 15582, RegenY = 13827, Dir = 43, CastSuccMsg = E_X_SysMsg_Deco03, RewardAbstate = "Reward03", }, { MobIndex = "E_XTree_Santa", RegenX = 14797, RegenY = 13758, Dir = 132, CastSuccMsg = E_X_SysMsg_Deco04, RewardAbstate = "Reward04", }, { MobIndex = "E_XTree_Xmas", RegenX = 16750, RegenY = 13852, Dir = 128, CastSuccMsg = E_X_SysMsg_Deco01, RewardAbstate = "Reward01", }, { MobIndex = "E_XTree_Rudolph", RegenX = 15769, RegenY = 12928, Dir = 81, CastSuccMsg = E_X_SysMsg_Deco02, RewardAbstate = "Reward02", }, { MobIndex = "E_XTree_Fairy", RegenX = 16517, RegenY = 12977, Dir = 53, CastSuccMsg = E_X_SysMsg_Deco03, RewardAbstate = "Reward03", }, { MobIndex = "E_XTree_Santa", RegenX = 17363, RegenY = 13090, Dir = 146, CastSuccMsg = E_X_SysMsg_Deco04, RewardAbstate = "Reward04", }, } -------------------------------------------------------------------- --// 눈사람 처리 관련 데이터 -------------------------------------------------------------------- -- 아이템 드랍 테이블 -- Rate : 1000000 = 100% ITEM_DROP_TABLE = { SnowMan = { { ItemIndex = "E_XTreeDeco", Rate = 700000, }, { ItemIndex = "E_XCrystal", Rate = 500000, }, { ItemIndex = "E_BallSnow02", Rate = 500000, }, }, } -- 눈사람 정보 -- CenterX, CenterY, Range : 리젠 중심 좌표와 범위 -- LifeTime_Min, LifeTime_Max : 1 = 1Sec, 리젠후 눈사람 유지시간(다시 리젠될 시간) 범위 -- DropTable : ITEM_DROP_TABLE 데이터 인덱스 SNOWMAN_INFO = { { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 16000, CenterY = 15640, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 14813, CenterY = 10438, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 11142, CenterY = 10910, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, { MobIndex = "E_XSnowman", CenterX = 18261, CenterY = 10737, Range = 1000, LifeTime_Min = 5, LifeTime_Max = 7, DropTable = "SnowMan", }, } -------------------------------------------------------------------- --// 크리스마스 이벤트 전역 변수 -------------------------------------------------------------------- -- 몹정보 처리에 사용 MemBlock = {} -------------------------------------------------------------------- --// 스크립트 메인 -------------------------------------------------------------------- function E_XTreeBig( Handle, MapIndex ) cExecCheck( "E_XTreeBig" ) if MapIndex ~= VALID_MAP_INDEX then cAIScriptSet( Handle ) return ReturnAI["END"] end if cIsObjectDead( Handle ) == 1 then KebingVanishAll( MemBlock[Handle] ) cAIScriptSet( Handle ) MemBlock[Handle] = nil return ReturnAI["END"] end local Var = MemBlock[Handle] local CurSec = cCurrentSecond() if Var == nil then MemBlock[Handle] = {} Var = MemBlock[Handle] Var["MapIndex"] = MapIndex Var["Handle"] = Handle Var["CurSec"] = CurSec Var["NextTick"] = CurSec Var["Level"] = 0 Var["Count"] = 0 Var["RegenKebing"] = false Var["KebingList"] = {} Var["KebingRegenList"] = {} Var["LevelDownEvent"] = false Var["EventKeepTime"] = CurSec Var["TickCount"] = TREE_LEVEL_DOWN_EVENT_INFO["RegenTick"] -- 죽은 장난꾸러기 깨빙의 수 Var["KebingDeadCount"] = 0 -- 대형트리핸들 MemBlock["TreeHandle"] = Handle -- 대형트리 프로세스 MemBlock["BonusDefenceEvent"] = {} MemBlock["BonusDefenceEvent"]["IsProgress"] = false -- 디펜스 이벤트가 발동중인가 MemBlock["BonusDefenceEvent"]["IsSantaKebingCrush"] = false -- 깨빙과 충돌했는가 cAIScriptFunc( Handle, "NPCClick", "TreeClick" ) cAIScriptFunc( Handle, "NPCMenu", "TreeCastingComplete" ) cSetFieldScript ( Var["MapIndex"], Handle ) cFieldScriptFunc ( Var["MapIndex"], "ServantSummon", "ServantSummon" ) end -- 0.1초마다 처리 if Var["NextTick"] <= CurSec then Var["CurSec"] = CurSec Var["NextTick"] = Var["NextTick"] + 0.1 else return ReturnAI["END"] end TreeProcess( Var ) SmallTreeProcess( Var ) SnowManProcess( Var ) SantaKebingRegenProcess( Var ) return ReturnAI["END"] end -------------------------------------------------------------------- --// 나무 처리 -------------------------------------------------------------------- -- 나무 처리 function TreeProcess( Var ) cExecCheck( "TreeProcess" ) if Var == nil then return end if Var["CurSec"] == nil then return end if Var["Level"] == nil then return end if Var["Count"] == nil then return end if Var["RegenKebing"] == nil then return end if Var["LevelDownEvent"] == nil then return end -- TreeCastingComplete 에서 세팅됨 if Var["LevDwnKeep"] ~= nil then -- 유지 시간 지나면 if Var["LevDwnKeep"] <= Var["CurSec"] then -- 첫 레벨다운이면 if Var["Level"] == #TREE_LEVEL_TABLE then -- ※ 게임로그 -- 대형 트리 완성 횟수( 5단계까지 꾸미기 성공 ) cSendGameLogDataType_5( NC_LOG_GAME_CHRISTMAS_DECO_COMPLETE_BIG_TREE, 0, 0, 0 ) -- 공지 cNotice( Var["MapIndex"], SCRIPT_FILE_NAME, E_X_Notice_TreeUp05 ) -- 깨빙 리젠 시작 Var["RegenKebing"] = true end -- 레벨 다운 Var["Level"] = Var["Level"] - 1 if Var["Level"] <= 0 then -- 공지 -- cNotice( Var["MapIndex"], SCRIPT_FILE_NAME, E_X_Notice_TreeInit ) -- 애니메이션 원상태로 cAnimate( Var["Handle"], "stop" ) -- 깨빙 리젠 중지, 제거 Var["RegenKebing"] = false KebingVanishAll( Var ) -- 레벨과 카운트 초기화 Var["Level"] = 0 Var["Count"] = 0 Var["LevDwnKeep"] = nil -- 깨빙 100 마리 넘게 죽였으면 디펜스이벤트 발생 if Var["KebingDeadCount"] >= NEED_KEBING_KILLCOUNT_FOR_DEFENCE_EVENT then -- ※ 게임로그 남길 부분 -- 디펜스 이벤트 진행 횟수 cSendGameLogDataType_5( NC_LOG_GAME_CHRISTMAS_START_DEFENCE, 0, 0, 0 ) -- 공지 : 크리스마스 깨빙의 습격이 시작되었습니다. 트리를 지켜주세요. cNotice( Var["MapIndex"], SCRIPT_FILE_NAME, E_X_Notice_DefenseStart ) MemBlock["BonusDefenceEvent"]["IsProgress"] = true else -- 공지 : 장난꾸러기 깨빙들이 모두 도망쳤습니다. 트리를 다시 꾸며주세요. cNotice( Var["MapIndex"], SCRIPT_FILE_NAME, E_X_Notice_TreeInit ) end -- 깨빙 죽인 수 초기화 Var["KebingDeadCount"] = 0 else local CurLevData = TREE_LEVEL_TABLE[ Var["Level"] ] -- 다음 레벨다운 시간 Var["LevDwnKeep"] = Var["CurSec"] + CurLevData["LevDwnKeep"] -- 애니메이션 변경 cAnimate( Var["Handle"], "start", CurLevData["AniIndex"] ) -- 레벨다운 애니메이션 세팅 Var["LevelDownEvent"] = true Var["EventKeepTime"] = Var["CurSec"] + TREE_LEVEL_DOWN_EVENT_INFO["KeepTime"] end end end if Var["RegenKebing"] == true then KebingRegenProcess( Var ) end if Var["LevelDownEvent"] == true then TreeLevelDownEventProcess( Var ) end -- 디펜스 이벤트 발동 if MemBlock["BonusDefenceEvent"]["IsProgress"] == true then if MemBlock["BonusDefenceEvent"]["IsSantaKebingCrush"] == false then -- 대형깨빙 죽은 마리 수 체크, 모두 죽었으면 if IsSantaKebingAllDead( Var ) == true then -- ※ 게임로그 -- 디펜스 이벤트 성공 횟수 cSendGameLogDataType_5( NC_LOG_GAME_CHRISTMAS_SUCC_DEFENCE, 0, 0, 0 ) -- 공지처리 ( 트리를 잘 지켜냇군요 ) cNotice( Var["MapIndex"], SCRIPT_FILE_NAME, E_X_Notice_DefenseSucc ) -- 버프 부여 cSetAbstate_Range( Var["Handle"], DEFENCE_EVENT_REWARD_ABSTATE_TABLE["Range"], ObjectType["Player"], DEFENCE_EVENT_REWARD_ABSTATE_TABLE["AbstateIndex"], DEFENCE_EVENT_REWARD_ABSTATE_TABLE["Strength"], DEFENCE_EVENT_REWARD_ABSTATE_TABLE["KeepTime"] ) -- 모든 정보들 초기화 해주기 MemBlock["BonusDefenceEvent"]["IsSantaKebingCrush"] = false MemBlock["BonusDefenceEvent"]["ResetCoolTime"] = nil MemBlock["BonusDefenceEvent"]["IsProgress"] = false -- 산타깨빙 객체 삭제하기 SantaKebingVanishAll( Var ) MemBlock["SantaKebingList"] = nil MemBlock["SantaKebingListHandle"] = nil end end -- 트리와 깨빙이 충돌한 상태면, if MemBlock["BonusDefenceEvent"]["IsSantaKebingCrush"] == true then if MemBlock["BonusDefenceEvent"]["ResetCoolTime"] == nil then -- 공지 처리( 크리스마스 깨빙에 의해 트리가 파괴되었습니다. ) cNotice( Var["MapIndex"], SCRIPT_FILE_NAME, E_X_Notice_DefenseFail ) -- 산타깨빙 객체 삭제하기 SantaKebingVanishAll( Var ) MemBlock["BonusDefenceEvent"]["ResetCoolTime"] = Var["CurSec"] + DEFENCE_EVENT_FAIL_TREE_REGEN_TIME -- 애니메이션 변경( 부서지는 애니 ) cAnimate( Var["Handle"], "start", TREE_DEFENCE_TABLE["TREE_DIE"]["AniIndex"] ) end end -- 트리 재건할 시간이 되면, if MemBlock["BonusDefenceEvent"]["ResetCoolTime"] ~= nil then if MemBlock["BonusDefenceEvent"]["ResetCoolTime"] <= Var["CurSec"] then -- 공지 처리( 새로운 트리가 세워졌습니다. 트리를 꾸며 주세요. ) cNotice( Var["MapIndex"], SCRIPT_FILE_NAME, E_X_Notice_TreeRegen ) -- 애니메이션 변경( 기본상태로 ) cAnimate( Var["Handle"], "start", TREE_DEFENCE_TABLE["TREE_REGEN"]["AniIndex"] ) MemBlock["BonusDefenceEvent"]["IsProgress"] = false MemBlock["BonusDefenceEvent"]["IsSantaKebingCrush"] = false MemBlock["BonusDefenceEvent"]["ResetCoolTime"] = nil MemBlock["SantaKebingList"] = nil MemBlock["SantaKebingListHandle"] = nil end end end end -- 깨빙 리젠 function KebingRegenProcess( Var ) cExecCheck( "KebingRegenProcess" ) if Var == nil then return end if Var["CurSec"] == nil then return end if Var["KebingList"] == nil then return end if Var["KebingRegenList"] == nil then return end for i = 1, #REWARD_MOB_REGEN_TABLE do if Var["KebingList"][i] == nil or cIsObjectDead( Var["KebingList"][i] ) == 1 then -- 깨빙 죽었는지 체크하고, 데드카운트 증가 if cIsObjectDead( Var["KebingList"][i] ) == 1 then Var["KebingDeadCount"] = Var["KebingDeadCount"] + 1 end Var["KebingList"][i] = nil if Var["KebingRegenList"][i] == nil then Var["KebingRegenList"][i] = Var["CurSec"] + REWARD_MOB_REGEN_TABLE[i]["RegenInterval"] end end if Var["KebingRegenList"][i] ~= nil and Var["KebingRegenList"][i] <= Var["CurSec"] then Var["KebingList"][i] = cMobRegen_Circle( Var["MapIndex"], REWARD_MOB_REGEN_TABLE[i]["MobIndex"], REWARD_MOB_REGEN_TABLE[i]["CenterX"], REWARD_MOB_REGEN_TABLE[i]["CenterY"], REWARD_MOB_REGEN_TABLE[i]["Range"] ) Var["KebingRegenList"][i] = nil end end end -- 깨빙 제거 function KebingVanishAll( Var ) cExecCheck( "KebingVanishAll" ) if Var == nil then return end if Var["KebingList"] == nil then return end if Var["KebingRegenList"] == nil then return end for i = 1, #REWARD_MOB_REGEN_TABLE do if Var["KebingList"][i] ~= nil then cNPCVanish( Var["KebingList"][i] ) Var["KebingList"][i] = nil end Var["KebingRegenList"][i] = nil end end -- 나무 레벨다운 연출 처리 function TreeLevelDownEventProcess( Var ) cExecCheck( "TreeLevelDownEventProcess" ) if Var == nil then return end if Var["Handle"] == nil then return end if Var["CurSec"] == nil then return end if Var["LevelDownEvent"] == nil then return end if Var["EventKeepTime"] == nil then return end if Var["TickCount"] == nil then return end if Var["LevelDownEvent"] == false then return end if Var["EventKeepTime"] <= Var["CurSec"] then Var["LevelDownEvent"] = false Var["TickCount"] = TREE_LEVEL_DOWN_EVENT_INFO["RegenTick"] return end if Var["TickCount"] < TREE_LEVEL_DOWN_EVENT_INFO["RegenTick"] then Var["TickCount"] = Var["TickCount"] + 1 return end Var["TickCount"] = 0 local Dir = cRandomInt( 1, 90 ) * 4 local RegenX, RegenY = cGetAroundCoord( Var["Handle"], Dir, TREE_LEVEL_DOWN_EVENT_INFO["RegenDist"] ) local MobHandle = cMobRegen_XY( Var["MapIndex"], TREE_LEVEL_DOWN_EVENT_INFO["MobIndex"], RegenX, RegenY, Dir ) if MobHandle ~= nil then if cAIScriptSet( MobHandle, Var["Handle"] ) ~= nil then cAIScriptFunc( MobHandle, "Entrance", "EventMobRoutine" ) MemBlock[MobHandle] = {} MemBlock[MobHandle]["Handle"] = MobHandle MemBlock[MobHandle]["MapIndex"] = Var["MapIndex"] MemBlock[MobHandle]["CurSec"] = Var["CurSec"] MemBlock[MobHandle]["NextTick"] = Var["CurSec"] MemBlock[MobHandle]["LifeTime"] = Var["CurSec"] + TREE_LEVEL_DOWN_EVENT_INFO["MobLifeTime"] MemBlock[MobHandle]["MasterHandle"] = Var["Handle"] MemBlock[MobHandle]["GoalX"], MemBlock[MobHandle]["GoalY"] = cGetAroundCoord( Var["Handle"], Dir, TREE_LEVEL_DOWN_EVENT_INFO["RunMaxDist"] ) end end end -- 이벤트몹 루틴 function EventMobRoutine( Handle, MapIndex ) cExecCheck( "EventMobRoutine" ) local Var = MemBlock[Handle] local CurSec = cCurrentSecond() if Var == nil then cAIScriptSet( Handle ) return ReturnAI["END"] end if cIsObjectDead( Handle ) == 1 then cAIScriptSet( Handle ) MemBlock[Handle] = nil return ReturnAI["END"] end if cIsObjectDead( Var["MasterHandle"] ) == 1 then cAIScriptSet( Handle ) cNPCVanish( Handle ) MemBlock[Handle] = nil return ReturnAI["END"] end -- 이동 if Var["Step"] == nil then cFollow( Handle, Var["MasterHandle"], TREE_LEVEL_DOWN_EVENT_INFO["FollowGap"], 9999 ) Var["Step"] = 1 end -- 0.1초마다 처리 if Var["NextTick"] <= CurSec then Var["CurSec"] = CurSec Var["NextTick"] = Var["NextTick"] + 0.1 else return ReturnAI["END"] end -- 1스탭부턴 0.1초마다 하기위해 if문 분리 if Var["Step"] == 1 then local MoveState, KeepTime = cGetMoveState( Handle ) if MoveState ~= nil and MoveState == 0 then cAnimate( Handle, "start", TREE_LEVEL_DOWN_EVENT_INFO["AniIndex"] ) Var["Step"] = Var["Step"] + 1 end elseif Var["Step"] == 2 then local MoveState, KeepTime = cGetMoveState( Handle ) if MoveState ~= nil and MoveState == 0 and KeepTime >= TREE_LEVEL_DOWN_EVENT_INFO["AniTime"] then cAnimate( Handle, "stop" ) Var["Step"] = Var["Step"] + 1 end elseif Var["Step"] == 3 then if Var["GoalX"] ~= nil and Var["GoalY"] ~= nil then cRunTo( Handle, Var["GoalX"], Var["GoalY"], TREE_LEVEL_DOWN_EVENT_INFO["RunSpeed"] ) end Var["Step"] = Var["Step"] + 1 end -- 라이프 시간이 지났으면 몹 제거 if Var["LifeTime"] <= Var["CurSec"] then cAIScriptSet( Handle ) cNPCVanish( Handle ) MemBlock[Handle] = nil return ReturnAI["END"] end return ReturnAI["END"] end -- 나무 클릭처리 function TreeClick( NPCHandle, PlyHandle, RegistNumber ) cExecCheck( "TreeClick" ) local Var = MemBlock[NPCHandle] if Var == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["Level"] == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["Count"] == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if #TREE_LEVEL_TABLE == 0 then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["Count"] >= TREE_LEVEL_TABLE[ #TREE_LEVEL_TABLE ]["NeedCount"] then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end -- 디펜스 이벤트 중이라서 처리하지않음 if MemBlock["BonusDefenceEvent"]["IsProgress"] == true then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if cIsNoAttacOrNoMove( PlyHandle ) == 1 then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail_2 ) return end cCastingBar( PlyHandle, NPCHandle, TREE_CAST_TIME, TREE_CAST_ANI ) end -- 나무 캐스팅 완료 처리 function TreeCastingComplete( NPCHandle, PlyHandle, RegistNumber, Menu ) cExecCheck( "TreeCastingComplete" ) local Var = MemBlock[NPCHandle] if Var == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["Level"] == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["Count"] == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["MapIndex"] == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if #TREE_LEVEL_TABLE == 0 then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["Level"] >= #TREE_LEVEL_TABLE then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["Count"] >= TREE_LEVEL_TABLE[ #TREE_LEVEL_TABLE ]["NeedCount"] then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end -- 디펜스 이벤트 중이라서 처리하지않음 if MemBlock["BonusDefenceEvent"]["IsProgress"] == true then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if cInvenItemDestroy( PlyHandle, TREE_CAST_ITEM, 1 ) == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_ErrMsg_DecoFail ) return end cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_Deco05 ) Var["Count"] = Var["Count"] + 1 -- ※ 게임로그 -- 유저가 대형나무에 트리장식 1개 사용함 cSendGameLogDataType_5( NC_LOG_GAME_CHRISTMAS_DECO_TRY_BIG_TREE, 0, 0, 0 ) local NextLevData = TREE_LEVEL_TABLE[ Var["Level"]+1 ] if Var["Count"] >= NextLevData["NeedCount"] then cAnimate( NPCHandle, "start", NextLevData["AniIndex"] ) cNotice( Var["MapIndex"], SCRIPT_FILE_NAME, NextLevData["Notice"] ) Var["Level"] = Var["Level"] + 1 end if Var["Level"] >= #TREE_LEVEL_TABLE then if NextLevData["LevDwnKeep"] == nil then Var["LevDwnKeep"] = cCurrentSecond() + 0.5 else Var["LevDwnKeep"] = cCurrentSecond() + NextLevData["LevDwnKeep"] end end -------------------------- --local CurX, CurY = cObjectLocate( Var["Handle"] ) --cEffectRegen_XY( Var["MapIndex"], "LightShield", CurX, CurY, 0, 4, 0, 1000 ) -------------------------- end -------------------------------------------------------------------- --// 소형나무 처리 -------------------------------------------------------------------- -- 소형나무 처리 함수 function SmallTreeProcess( Var ) cExecCheck( "SmallTreeProcess" ) if Var == nil then return end if Var["MapIndex"] == nil then return end if Var["Handle"] == nil then return end if Var["SmallTreeList"] == nil then Var["SmallTreeList"] = {} end for i = 1, #SMALL_TREE_INFO do if Var["SmallTreeList"][i] == nil then Var["SmallTreeList"][i] = {} local CurTree = Var["SmallTreeList"][i] -- 소형나무 리젠 CurTree["Handle"] = cMobRegen_XY( Var["MapIndex"], SMALL_TREE_INFO[i]["MobIndex"], SMALL_TREE_INFO[i]["RegenX"], SMALL_TREE_INFO[i]["RegenY"], SMALL_TREE_INFO[i]["Dir"] ) if CurTree["Handle"] ~= nil then -- 무적상태이상 제거 cResetAbstate( CurTree["Handle"], IMMORTAL_INDEX ) -- 스크립트 세팅 및 필요정보 세팅 if cAIScriptSet( CurTree["Handle"], Var["Handle"] ) ~= nil then cAIScriptFunc( CurTree["Handle"], "Entrance", "SmallTreeRoutine" ) cAIScriptFunc( CurTree["Handle"], "NPCClick", "SmallTreeClick" ) cAIScriptFunc( CurTree["Handle"], "NPCMenu", "SmallTreeCastingComplete" ) -- 소형나무쪽에서 필요한 정보 MemBlock[CurTree["Handle"]] = {} MemBlock[CurTree["Handle"]]["MasterHandle"] = Var["Handle"] MemBlock[CurTree["Handle"]]["MasterMobID"] = cGetMobID( Var["Handle"] ) MemBlock[CurTree["Handle"]]["Handle"] = CurTree["Handle"] MemBlock[CurTree["Handle"]]["MapIndex"] = Var["MapIndex"] MemBlock[CurTree["Handle"]]["CurSec"] = Var["CurSec"] MemBlock[CurTree["Handle"]]["NextTick"] = Var["CurSec"] MemBlock[CurTree["Handle"]]["Level"] = 0 MemBlock[CurTree["Handle"]]["Count"] = 0 MemBlock[CurTree["Handle"]]["DataIndex"] = i -- 메인에서 소형나무 체크하기 위한 정보 CurTree["MobID"] = cGetMobID( CurTree["Handle"] ) CurTree["RegenX"], CurTree["RegenY"] = cObjectLocate( CurTree["Handle"] ) end end end if Var["SmallTreeList"][i] ~= nil then if SmallTreeValidCheck( Var["SmallTreeList"][i] ) == false then Var["SmallTreeList"][i] = nil end end end end -- 소형나무 유효성 체크(메인쪽에서 소형나무가 존재하는지 확인) function SmallTreeValidCheck( Var ) cExecCheck( "SmallTreeValidCheck" ) -- 기본 정보들 확인 if Var == nil then return false end if Var["Handle"] == nil then return false end if Var["MobID"] == nil then return false end if Var["RegenX"] == nil or Var["RegenY"] == nil then return false end -- 죽었나 확인 if cIsObjectDead( Var["Handle"] ) == 1 then return false end -- 리젠시킨 몹아이디와 맞는지 확인 local MobID = cGetMobID( Var["Handle"] ) if MobID == nil then return false end if MobID ~= Var["MobID"] then return false end -- 리젠좌표확인 local CurX, CurY = cObjectLocate( Var["Handle"] ) if CurX == nil or CurY == nil then return false end if CurX ~= Var["RegenX"] or CurY ~= Var["RegenY"] then return false end return true end -- 소형나무 루틴 function SmallTreeRoutine( Handle, MapIndex ) cExecCheck( "SmallTreeRoutine" ) local Var = MemBlock[Handle] local CurSec = cCurrentSecond() if Var == nil then cAIScriptSet( Handle ) cNPCVanish( Handle ) return ReturnAI["END"] end if cIsObjectDead( Handle ) == 1 then cAIScriptSet( Handle ) cNPCVanish( Handle ) MemBlock[Handle] = nil return ReturnAI["END"] end -- 0.1초마다 처리 if Var["NextTick"] <= CurSec then Var["CurSec"] = CurSec Var["NextTick"] = Var["NextTick"] + 0.1 else return ReturnAI["END"] end -- 마스터 존재 확인 if MainTreeValidCheck( Var ) == false then cAIScriptSet( Handle ) cNPCVanish( Handle ) MemBlock[Handle] = nil return ReturnAI["END"] end -- SmallTreeCastingComplete 에서 최대레벨 될때 세팅됨 if Var["MaxLevelKeep"] ~= nil then -- 유지 시간 지나면 if Var["MaxLevelKeep"] <= Var["CurSec"] then -- 애니메이션 원상태로 cAnimate( Handle, "stop" ) -- 레벨과 카운트 초기화 Var["Level"] = 0 Var["Count"] = 0 Var["MaxLevelKeep"] = nil end end return ReturnAI["END"] end -- 마스터 유효성 체크(소형나무 루틴쪽에서 마스터가 있는지 확인) function MainTreeValidCheck( Var ) cExecCheck( "MainTreeValidCheck" ) -- 기본 정보 확인 if Var == nil then return false end if Var["MasterHandle"] == nil then return false end if Var["MasterMobID"] == nil then return false end -- 죽었나 확인 if cIsObjectDead( Var["MasterHandle"] ) == 1 then return false end -- 리젠시킨 몹아이디와 맞는지 확인 local MobID = cGetMobID( Var["MasterHandle"] ) if MobID == nil then return false end if MobID ~= Var["MasterMobID"] then return false end return true end -- 소형나무 클릭 처리 function SmallTreeClick( NPCHandle, PlyHandle, RegistNumber ) cExecCheck( "SmallTreeClick" ) local Var = MemBlock[NPCHandle] if Var == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["Level"] == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["Count"] == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["DataIndex"] == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end local LevelData = SMALL_TREE_LEVEL_TABLE if LevelData == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if #LevelData == 0 then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["Count"] >= LevelData[ #LevelData ]["NeedCount"] then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if cIsNoAttacOrNoMove( PlyHandle ) == 1 then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail_2 ) return end cCastingBar( PlyHandle, NPCHandle, TREE_CAST_TIME, TREE_CAST_ANI ) end -- 소형나무 캐스팅 완료 처리 function SmallTreeCastingComplete( NPCHandle, PlyHandle, RegistNumber, Menu ) cExecCheck( "SmallTreeCastingComplete" ) local Var = MemBlock[NPCHandle] if Var == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["Level"] == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["Count"] == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["DataIndex"] == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end local LevelData = SMALL_TREE_LEVEL_TABLE if LevelData == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if #LevelData == 0 then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["Level"] >= #LevelData then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if Var["Count"] >= LevelData[ #LevelData ]["NeedCount"] then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_SysMsg_DecoFail ) return end if cInvenItemDestroy( PlyHandle, TREE_CAST_ITEM, 1 ) == nil then cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, E_X_ErrMsg_DecoFail ) return end cSystemMessage_Obj( PlyHandle, SCRIPT_FILE_NAME, SMALL_TREE_INFO[ Var["DataIndex"] ]["CastSuccMsg"] ) Var["Count"] = Var["Count"] + 1 -- ※ 게임로그 남길 부분 -- 유저가 소형나무에 트리장식 1개 사용함 cSendGameLogDataType_5( NC_LOG_GAME_CHRISTMAS_DECO_TRY_SMALL_TREE, 0, cGetMobID(NPCHandle), 0 ) local NextLevData = LevelData[ Var["Level"]+1 ] if Var["Count"] >= NextLevData["NeedCount"] then cAnimate( NPCHandle, "start", NextLevData["AniIndex"] ) Var["Level"] = Var["Level"] + 1 end if Var["Level"] >= #LevelData then -- ※ 게임로그 -- 소형 트리 완성 횟수(소형트리 4종) cSendGameLogDataType_5( NC_LOG_GAME_CHRISTMAS_DECO_COMPLETE_SMALL_TREE, 0, cGetMobID(NPCHandle), 0 ) local RewardData = REWARD_ABSTATE_TABLE[ SMALL_TREE_INFO[ Var["DataIndex"] ]["RewardAbstate"] ] if RewardData ~= nil then cSetAbstate_Range( NPCHandle, RewardData["Range"], ObjectType["Player"], RewardData["AbstateIndex"], RewardData["Strength"], RewardData["KeepTime"] ) cNotice( Var["MapIndex"], SCRIPT_FILE_NAME, RewardData["Notice"] ) end if LevelData["MaxLevelKeep"] == nil then Var["MaxLevelKeep"] = cCurrentSecond() + 1 else Var["MaxLevelKeep"] = cCurrentSecond() + LevelData["MaxLevelKeep"] end end -------------------------- --local CurX, CurY = cObjectLocate( Var["Handle"] ) --cEffectRegen_XY( Var["MapIndex"], "LightShield", CurX, CurY, 0, 4, 0, 1000 ) -------------------------- end -------------------------------------------------------------------- --// 눈사람 처리 -------------------------------------------------------------------- -- 눈사람 처리 함수 function SnowManProcess( Var ) cExecCheck( "SnowManProcess" ) if Var == nil then return end if Var["SnowManList"] == nil then Var["SnowManList"] = {} end for i = 1, #SNOWMAN_INFO do if Var["SnowManList"][i] == nil then Var["SnowManList"][i] = Var["CurSec"] + cRandomInt( SNOWMAN_INFO[i]["LifeTime_Min"], SNOWMAN_INFO[i]["LifeTime_Max"] ) -- 눈사람 리젠 local MobHandle = cMobRegen_Circle( Var["MapIndex"], SNOWMAN_INFO[i]["MobIndex"], SNOWMAN_INFO[i]["CenterX"], SNOWMAN_INFO[i]["CenterY"], SNOWMAN_INFO[i]["Range"] ) if MobHandle ~= nil then -- 무적상태이상 제거 cResetAbstate( MobHandle, IMMORTAL_INDEX ) -- 스크립트 세팅 및 필요정보 세팅 if cAIScriptSet( MobHandle, Var["Handle"] ) ~= nil then cAIScriptFunc( MobHandle, "Entrance", "SnowManRoutine" ) MemBlock[MobHandle] = {} MemBlock[MobHandle]["Handle"] = MobHandle MemBlock[MobHandle]["MapIndex"] = Var["MapIndex"] MemBlock[MobHandle]["CurSec"] = Var["CurSec"] MemBlock[MobHandle]["NextTick"] = Var["CurSec"] MemBlock[MobHandle]["LifeTime"] = Var["SnowManList"][i] MemBlock[MobHandle]["RegenX"], MemBlock[MobHandle]["RegenY"] = cObjectLocate( MobHandle ) MemBlock[MobHandle]["DropTable"]= ITEM_DROP_TABLE[ SNOWMAN_INFO[i]["DropTable"] ] end end end if Var["SnowManList"][i] + 0.5 <= Var["CurSec"] then Var["SnowManList"][i] = nil end end end -- 눈사람 루틴 function SnowManRoutine( Handle, MapIndex ) cExecCheck( "SnowManRoutine" ) local Var = MemBlock[Handle] local CurSec = cCurrentSecond() if Var == nil then cAIScriptSet( Handle ) return ReturnAI["END"] end if cIsObjectDead( Handle ) == 1 then cAIScriptSet( Handle ) MemBlock[Handle] = nil return ReturnAI["END"] end -- 0.1초마다 처리 if Var["NextTick"] <= CurSec then Var["CurSec"] = CurSec Var["NextTick"] = Var["NextTick"] + 0.1 else return ReturnAI["END"] end -- 크러쉬볼 상태이상 시간이 짧아 체크가 제대로 안되서 좌표로 체크 local CurX, CurY = cObjectLocate( Handle ) if CurX == nil or CurY == nil or Var["RegenX"] == nil or Var["RegenY"] == nil then cAIScriptSet( Handle ) cNPCVanish( Handle ) MemBlock[Handle] = nil return ReturnAI["END"] else if CurX ~= Var["RegenX"] or CurY ~= Var["RegenY"] then -- 아이템 드랍 if Var["DropTable"] ~= nil then for j = 1, #Var["DropTable"] do cDropItem( Var["DropTable"][j]["ItemIndex"], Handle, -1, Var["DropTable"][j]["Rate"] ) end end -- 몹 죽이고 메모리 해제 cAIScriptSet( Handle ) cKillObject( Handle ) MemBlock[Handle] = nil return ReturnAI["END"] end end -- 라이프 시간이 지났으면 몹 제거 if Var["LifeTime"] <= Var["CurSec"] then cAIScriptSet( Handle ) cNPCVanish( Handle ) MemBlock[Handle] = nil return ReturnAI["END"] end return ReturnAI["END"] end -------------------------------------------------------------------- --// 산타깨빙 처리 : SantaKebingRegenProcess -------------------------------------------------------------------- function SantaKebingRegenProcess( Var ) cExecCheck ( "SantaKebingRegenProcess" ) if Var == nil then return end -- 디펜스이벤트 처리중 아니면 return if MemBlock["BonusDefenceEvent"]["IsProgress"] == false then return end if MemBlock["SantaKebingList"] == nil and MemBlock["SantaKebingListHandle"] == nil then MemBlock["SantaKebingList"] = {} MemBlock["SantaKebingListHandle"] = {} for i = 1, #SANTA_KEBING_MOB_REGEN_TABLE do local temphandle = cMobRegen_XY( Var["MapIndex"], SANTA_KEBING_MOB_REGEN_TABLE["MobIndex"], SANTA_KEBING_MOB_REGEN_TABLE[i]["RegenX"], SANTA_KEBING_MOB_REGEN_TABLE[i]["RegenY"], SANTA_KEBING_MOB_REGEN_TABLE[i]["Dir"] ) if temphandle == nil then return end if MemBlock["SantaKebingList"][temphandle] == nil then MemBlock["SantaKebingList"][temphandle] = {} if cAIScriptSet( temphandle, Var["Handle"] ) ~= nil then cAIScriptFunc( temphandle, "Entrance", "SantaKebingRoutine" ) end MemBlock["SantaKebingList"][temphandle]["Handle"] = temphandle MemBlock["SantaKebingList"][temphandle]["RunSpeed"] = SANTA_KEBING_MOB_REGEN_TABLE["RunSpeed"] MemBlock["SantaKebingList"][temphandle]["TargetHandle"] = Var["Handle"] MemBlock["SantaKebingList"][temphandle]["GoalX"], MemBlock["SantaKebingList"][temphandle]["GoalY"] = cObjectLocate( Var["Handle"] ) MemBlock["SantaKebingList"][temphandle]["CrushBallHitCount"] = 0 MemBlock["SantaKebingList"][temphandle]["PathFinding"] = SANTA_KEBING_PATH_TABLE[i] MemBlock["SantaKebingListHandle"][i] = temphandle -- 산타깨빙 몹챗( 지난번처럼 당할거라고 생각하지마라!! ) cMobChat( temphandle, SCRIPT_FILE_NAME, E_XKebingChat01 ) -- 몹리젠시 걸려있는 무적 상태이상 제거 cResetAbstate( temphandle , "StaImmortal" ) end end end end -------------------------------------------------------------------- --// 산타깨빙 처리 : SantaKebingRoutine -------------------------------------------------------------------- function SantaKebingRoutine( Handle, MapIndex ) cExecCheck ( "SantaKebingRoutine" ) if MapIndex ~= VALID_MAP_INDEX then cAIScriptSet( Handle ) return ReturnAI["END"] end if cIsObjectDead( Handle ) == 1 then cAIScriptSet( Handle ) return ReturnAI["END"] end local CurSantaKebing = MemBlock["SantaKebingList"][Handle] -- 루틴에서 계속 돌면서, 길찾기 프로세스 실행 PathTypeProcess( Handle ) -- 메인트리랑 가까우면 처리해준다 if cDistanceSquar( Handle, CurSantaKebing["TargetHandle"] ) <= ( SANTAKEBING_RANGE_WITH_TREE * SANTAKEBING_RANGE_WITH_TREE ) then -- 깨빙 애니메이션 처리( 스킬애니가 두개로 나뉘어져 있어, 시간체크해서 연달아 사용 ) if MemBlock["SantaKebingList"][Handle]["CrushAniTime"] == nil then MemBlock["SantaKebingList"][Handle]["CrushAniTime"] = cCurrentSecond() + SANTA_KEBING_MOB_ANI_TABLE["CastAniKeepTime"] cAnimate( Handle, "start", SANTA_KEBING_MOB_ANI_TABLE["CastAniIndex"] ) end if MemBlock["SantaKebingList"][Handle]["CrushAniTime"] ~= nil then if MemBlock["SantaKebingList"][Handle]["CrushAniTime"] > cCurrentSecond() then return ReturnAI["CPP"] end cAnimate( Handle, "start", SANTA_KEBING_MOB_ANI_TABLE["SwingAniIndex"] ) end MemBlock["BonusDefenceEvent"]["IsSantaKebingCrush"] = true cAIScriptSet( Handle ) return ReturnAI["END"] end -- 크러시볼에 몇번 맞았는지 체크한다 if CurSantaKebing["CrushBallHitCount"] >= SANTAKEBING_CRUSHBALL_HIT_COUNT then cMobSuicide( MapIndex, Handle ) cAIScriptSet( Handle ) return ReturnAI["END"] end return ReturnAI["END"] end -------------------------------------------------------------------- --// 산타깨빙 처리 : IsSantaKebingAllDead -------------------------------------------------------------------- -- 대형깨빙(산타깨빙) 모두 죽었는지 판단 function IsSantaKebingAllDead( Var ) cExecCheck( "IsSantaKebingAllDead" ) if MemBlock["SantaKebingList"] == nil then return false end for i = 1, #MemBlock["SantaKebingListHandle"] do if cIsObjectDead( MemBlock["SantaKebingListHandle"][i] ) == nil then return false -- 한놈이라도 살아있으면 false반환 end if i == #MemBlock["SantaKebingListHandle"] then return true -- 모두 다 죽었으면 true 반환 end end end -------------------------------------------------------------------- --// 산타깨빙 처리 : SantaKebingVanishAll -------------------------------------------------------------------- -- 산타 깨빙 제거 function SantaKebingVanishAll( Var ) cExecCheck( "SantaKebingVanishAll" ) if Var == nil then return end if MemBlock["SantaKebingList"] == nil then return end for i = 1, #MemBlock["SantaKebingListHandle"] do local CurHandle = MemBlock["SantaKebingListHandle"][i] if MemBlock["SantaKebingList"][CurHandle] ~= nil then cNPCVanish( MemBlock["SantaKebingList"][CurHandle]["Handle"] ) MemBlock["SantaKebingList"][CurHandle] = nil end end end -------------------------------------------------------------------- --// 산타깨빙 path처리 : PathTypeProcess -------------------------------------------------------------------- function PathTypeProcess( Handle ) local CurSantaKebing = MemBlock["SantaKebingList"][Handle] if cIsObjectDead( Handle ) == 1 then return end if CurSantaKebing == nil then return end if CurSantaKebing["PathFinding"] == nil then return end -- 이미 충돌 처리 중이므로, return if CurSantaKebing["CrushAniTime"] ~= nil then return end if MemBlock["SantaKebingList"][Handle]["PathProgress"] == nil then MemBlock["SantaKebingList"][Handle]["PathProgress"] = {} MemBlock["SantaKebingList"][Handle]["PathProgress"]["GoalCheckTime"] = cCurrentSecond() MemBlock["SantaKebingList"][Handle]["PathProgress"]["CurPathStep"] = 1 MemBlock["SantaKebingList"][Handle]["PathProgress"]["CurMoveState"] = MOVESTATE["STOP"] end if CurSantaKebing["PathProgress"]["CurPathStep"] > #CurSantaKebing["PathFinding"] then return end if CurSantaKebing["PathProgress"]["CurMoveState"] == MOVESTATE["STOP"] then if cWillMovement( Handle ) == nil then return end cRunTo( Handle, CurSantaKebing["PathFinding"][CurSantaKebing["PathProgress"]["CurPathStep"]]["x"], CurSantaKebing["PathFinding"][CurSantaKebing["PathProgress"]["CurPathStep"]]["y"], SANTA_KEBING_MOB_REGEN_TABLE["RunSpeed"] ) CurSantaKebing["PathProgress"]["CurMoveState"] = MOVESTATE["MOVE"] end if CurSantaKebing["PathProgress"]["CurMoveState"] == MOVESTATE["MOVE"] then -- 움직일 수 없는 상태 if cWillMovement( Handle ) == nil then CurSantaKebing["PathProgress"]["CurMoveState"] = MOVESTATE["STOP"] return end end -- 목표점 체크 제한 local CurSec = cCurrentSecond() if CurSantaKebing["PathProgress"]["GoalCheckTime"] + PATHTYPE_CHK_DLY > CurSec then return end CurSantaKebing["PathProgress"]["GoalCheckTime"] = CurSec -- 목표점 체크 local curr = {} local goal = {} curr["x"], curr["y"] = cObjectLocate( Handle ) goal["x"] = CurSantaKebing["PathFinding"][CurSantaKebing["PathProgress"]["CurPathStep"]]["x"] goal["y"] = CurSantaKebing["PathFinding"][CurSantaKebing["PathProgress"]["CurPathStep"]]["y"] local dx = goal["x"] - curr["x"] local dy = goal["y"] - curr["y"] local distsquar = dx * dx + dy * dy if distsquar < PATHTYPE_GAP then CurSantaKebing["PathProgress"]["CurPathStep"] = CurSantaKebing["PathProgress"]["CurPathStep"] + 1 CurSantaKebing["PathProgress"]["CurMoveState"] = MOVESTATE["STOP"] return end -- 몹이 이동 멈추는 현상 때문에 목적지 체크 curr["x"], curr["y"] = cMove2Where( Handle ) if curr["x"] ~= goal["x"] and curr["y"] ~= goal["y"] then cRunTo( Handle, CurSantaKebing["PathFinding"][CurSantaKebing["PathProgress"]["CurPathStep"]]["x"], CurSantaKebing["PathFinding"][CurSantaKebing["PathProgress"]["CurPathStep"]]["y"], SANTA_KEBING_MOB_REGEN_TABLE["RunSpeed"] ) end return end -------------------------------------------------------------------- --// 크러시볼 처리 : ServantSummon -------------------------------------------------------------------- -- 크러시볼에 붙을 함수 function ServantSummon( MapIndex, ServantHandle, ServantIndex, MasterHandle ) cExecCheck "ServantSummon" -- 잘못된 맵 정보 if MapIndex ~= VALID_MAP_INDEX then cAIScriptSet( Handle ) return ReturnAI["END"] end -- 현재 디펜스이벤트 작동중이 아닌경우 리턴해 if MemBlock["BonusDefenceEvent"]["IsProgress"] ~= true then return end -- 소환한 몹이 크러시볼 아닌경우, if ServantIndex ~= CRUSHBALL_TABLE["MobIndex"] then return end cAIScriptSet( ServantHandle, MemBlock["TreeHandle"] ) cAIScriptFunc( ServantHandle, "Entrance", "Crushball_Entrance" ) end -------------------------------------------------------------------- --// 크러시볼 처리 : Crushball_Entrance -------------------------------------------------------------------- function Crushball_Entrance( Handle, MapIndex ) cExecCheck "Crushball_Entrance" -- 잘못된 맵 정보 if MapIndex ~= VALID_MAP_INDEX then cAIScriptSet( Handle ) return ReturnAI["END"] end -- 산타깨빙 정보없으면 처리할 필요없으므로 if MemBlock["SantaKebingList"] == nil then cAIScriptSet( Handle ) return ReturnAI["END"] end -- 죽었으면 스크립트 해제 if cIsObjectDead( Handle ) == 1 then cAIScriptSet( Handle ) return ReturnAI["END"] end -- 죽음 대기면 스크립트 해제 if cIsObjectAlreadyDead( Handle ) == true then cAIScriptSet( Handle ) return ReturnAI["END"] end local NearSanta = cObjectFind( Handle, SANTAKEBING_RANGE_WITH_CRUSHBALL, SANTA_KEBING_MOB_REGEN_TABLE["MobIndex"], "so_mobile_GetIdxName" ) -- 목표로 삼은 산타깨빙이 이미 죽었거나, 죽음 예약인 경우 스크립트 해제 -- 산타깨빙이 이미 죽었다면, 그 근처에 있는 다른 대상에게 기본 크러시볼 스킬이 적용되야 하므로 if NearSanta ~= nil then if cIsObjectDead( NearSanta ) == 1 or cIsObjectAlreadyDead( NearSanta ) == true then cAIScriptSet( Handle ) return ReturnAI["END"] end -- 확률적으로 산타깨빙에 넉백 상태이상을 걸어준다. if cPermileRate( CRUSHBALL_ABSTATE_TABLE["AbStateHitRate"] ) == 1 then cSetAbstate( NearSanta, CRUSHBALL_ABSTATE_TABLE["AbstateIndex"], CRUSHBALL_ABSTATE_TABLE["Strength"], CRUSHBALL_ABSTATE_TABLE["KeepTime"], Handle ) end MemBlock["SantaKebingList"][NearSanta]["CrushBallHitCount"] = MemBlock["SantaKebingList"][NearSanta]["CrushBallHitCount"] + 1 --DebugLog("산타깨빙핸들값 : "..NearSanta..", 맞은 크러시볼 : "..MemBlock["SantaKebingList"][NearSanta]["CrushBallHitCount"]) cSkillBlast ( Handle, Handle, CRUSHBALL_TABLE["SkillIndex"] ) cVanishReserv ( Handle, 3 ) return ReturnAI["END"] end -- 아직 움직이고 있다면 처음으로 돌아간다. if cGetMoveState( Handle ) ~= 0 then return ReturnAI["CPP"] end return ReturnAI["END"] end ---------------------------------------------------------------------- -- Log Functions ---------------------------------------------------------------------- function DebugLog( String ) cExecCheck ( "DebugLog" ) if String == nil then cAssertLog( "DebugLog::String == nil" ) return end cAssertLog( "Debug - "..String ) end function ErrorLog( String ) cExecCheck ( "ErrorLog" ) if String == nil then cAssertLog( "ErrorLog::String == nil" ) return end cAssertLog( "Error - "..String ) end