function onChangeSkillEffect_Thief_Necromancer(obj, skillIndex, reciveData) { if(!obj) return; switch(skillIndex){ case SKILL_BYKK_SUMMONNICOLAS: local subtype = reciveData.readDword(); switch(subtype){ case 1: local id = reciveData.readDword(); local monster_obj = sq_GetCNRDObjectToActiveObject(sq_GetObject(obj, reciveData.readDword(), reciveData.readDword())); switch(id){ case MONSTER_ID_NICOLAS: setMonsterAppendage_Necromancer_byKK(obj, monster_obj, APDPATH_NICOLAS, "NicolasObj", SKILL_BYKK_SUMMONNICOLAS); break; case MONSTER_ID_ZOMBIE: setMonsterAppendage_Necromancer_byKK(obj, monster_obj, APDPATH_ZOMBIE, "ZombieObj", SKILL_BYKK_NICOLASSUMMONZOMBIE); break; } break; } break; } } function setMonsterAppendage_Necromancer_byKK(obj, monster_obj, appendagepath, monstername, skill_index) { if(!obj) return; if(!monster_obj) return; if(appendagepath == null || monstername == null || skill_index == null) return; appendagepath = appendagepath.tostring(); monstername = monstername.tostring(); local monster_obj = sq_GetCNRDObjectToActiveObject(monster_obj); if(!CNSquirrelAppendage.sq_IsAppendAppendage(monster_obj, appendagepath)){ local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(monster_obj, monster_obj, skill_index, false, appendagepath, true); AddAppendage.getVar("sqrChr").clear_obj_vector(); AddAppendage.getVar("sqrChr").push_obj_vector(obj); local monsternum = obj.getVar(monstername).get_obj_vector_size(); if(monsternum > 0){ obj.getVar(monstername).push_obj_vector(monster_obj); } else{ obj.getVar(monstername).clear_obj_vector(); obj.getVar(monstername).push_obj_vector(monster_obj); } setMonsterInfo_Thief_Necromancer(obj, monster_obj, skill_index, AddAppendage); } } function setMonsterInfo_Thief_Necromancer(obj, monster_obj, skill_index, appendage) { if(!obj) return; monster_obj.setMapFollowParent(obj); monster_obj.setMapFollowType(1); local monster_id = monster_obj.getCollisionObjectIndex(); switch(monster_id){ case MONSTER_ID_NICOLAS: local coolt_01 = 1000, coolt_02 = 2000, coolt_03 = 3000, coolt_04 = 4000; local coolTime = [coolt_01, coolt_02, coolt_03, coolt_04]; local skillIndex = ["skill_1", "skill_2", "skill_3", "skill_4"]; for(local i = 0; i < skillIndex.len(); i++){ appendage.getVar(skillIndex[i]).clear_timer_vector(); appendage.getVar(skillIndex[i]).push_timer_vector(); local t = appendage.getVar(skillIndex[i]).get_timer_vector(0); t.setParameter(coolTime[i], -1); t.resetInstant(0); } local sub = 0; if(sq_GetSkillLevel(obj, SKILL_BYKK_SUMMONNICOLASEX) > 0) sub = 10; appendage.getVar("custom").setInt(0, sub); monsterattack_Thief_Necromancer_ksk(monster_obj,0); break; case MONSTER_ID_ZOMBIE: appendage.getVar("skill_1").clear_timer_vector(); appendage.getVar("skill_1").push_timer_vector(); local t = appendage.getVar("skill_1").get_timer_vector(0); t.setParameter(1000, -1); t.resetInstant(0); local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_NICOLASSUMMONZOMBIE); local hitMax = sq_GetLevelData(obj, SKILL_BYKK_NICOLASSUMMONZOMBIE, 4, skillLevel); appendage.getVar("custom").setInt(1, hitMax); appendage.getVar("custom").setInt(0, 0); break; } } function procAppend_Thief_Necromancer(obj) { local size = obj.getVar("NicolasObj").get_obj_vector_size(); if(size < 1){ obj.setSkillCommandEnable(SKILL_BYKK_NICOLASBEHAVIOR, false); obj.setSkillCommandEnable(SKILL_BYKK_NICOLASBLACKARACHNIA, false); obj.setSkillCommandEnable(SKILL_BYKK_NICOLASBLACKAREA, false); obj.setSkillCommandEnable(SKILL_BYKK_NICOLASBLACKWAVE, false); if(sq_GetSkillLevel(obj, SKILL_BYKK_KEYOFACERON) < 1) obj.setSkillCommandEnable(SKILL_BYKK_NICOLASSUMMONZOMBIE, false); } size = obj.getVar("ballacreObj").get_obj_vector_size(); if(size < 1){ obj.setSkillCommandEnable(SKILL_BYKK_BALLACREADVENT, false); obj.setSkillCommandEnable(SKILL_BYKK_BALLACRESTRONGATTACK, false); obj.setSkillCommandEnable(SKILL_BYKK_MADNESSBALLACRE, false); obj.setSkillCommandEnable(SKILL_BYKK_GRABCOLLAR, false); obj.setSkillCommandEnable(SKILL_BYKK_AMBITIONOFBALLACRE, false); obj.setSkillCommandEnable(SKILL_BYKK_GUILLOTINE, false); obj.setSkillCommandEnable(SKILL_BYKK_PHANTOMSTROM, false); obj.setSkillCommandEnable(SKILL_BYKK_EXECUTIONERSLASH, false); if(sq_GetSkillLevel(obj, SKILL_BYKK_KEYOFACERON) > 0) setBallacreSkillEffet_bykk(obj); } else{ obj.setSkillCommandEnable(SKILL_BYKK_APPORTBALLACRE, false); } } function setCommandEnable_Thief_Necromancer(obj, skillIndex) { local currentMp = obj.getMp(); local skill = sq_GetSkill(obj, skillIndex); local consumeMp = skill.getSpendMp(obj, -1); if(!skill.isInCoolTime() && currentMp > consumeMp){ obj.setSkillCommandEnable(skillIndex, true); return true; } } function startSkillCoolTime_Thief_Necromancer_bykk(obj, skillIndex, skillLevel, currentCoolTime) { if(sq_GetSkillLevel(obj, SKILL_BYKK_WANDMASTERY) > 0){ local weaponType = obj.getWeaponSubType(); if(weaponType == 3){ if(skillIndex != SKILL_BYKK_PHANTOMSTROM && skillIndex != SKILL_BYKK_BALLACREADVENT){ local newSkillCoolTime = currentCoolTime * 90 / 100; print("currentCoolTime : "+currentCoolTime); print("newSkillCoolTime : "+newSkillCoolTime); return newSkillCoolTime; } } } return currentCoolTime; } function ProcPassiveSkill_NecroMancer_bykk(obj, skill_index, skill_level) { switch(skill_index){ case SKILL_BYKK_FEAROFBALLACRE: if(skill_level > 0){ local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, skill_index, false, APDPATH_FEAROFBALLACRE, true); } break; case SKILL_BYKK_WANDMASTERY: if(skill_level > 0){ local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, skill_index, false, APDPATH_WANDMASTERY, true); } break; } } function onStart_appendage_fearofballacre_tochr(appendage) { if(!appendage) return; appendage.getVar("coolTime").clear_timer_vector(); appendage.getVar("coolTime").push_timer_vector(); local t = appendage.getVar("coolTime").get_timer_vector(0); t.setParameter(1000, -1); t.resetInstant(0); t.setEventOnStart(true); local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_FEAROFBALLACRE); local criticalRate = sq_GetLevelData(obj, SKILL_BYKK_FEAROFBALLACRE, 4, skillLevel); local criticaldamageRate = sq_GetLevelData(obj, SKILL_BYKK_FEAROFBALLACRE, 5, skillLevel); local lifeTime = sq_GetLevelData(obj, SKILL_BYKK_FEAROFBALLACRE, 3, skillLevel); local range = sq_GetLevelData(obj, SKILL_BYKK_FEAROFBALLACRE, 6, skillLevel); appendage.getVar("custom").setInt(0, lifeTime); appendage.getVar("custom").setInt(1, range); local change_appendage = appendage.sq_getChangeStatus("fearofballacre"); if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("fearofballacre",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_PHYSICAL_CRITICAL_HIT_RATE, false, (criticalRate * 0.1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_HIT_RATE, false, (criticalRate * 0.1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_PHYSICAL_CRITICAL_DAMAGE_RATE, false, (criticaldamageRate * 0.1 / 0.667).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_DAMAGE_RATE, false, (criticaldamageRate * 0.1 / 0.667).tofloat()); } } function proc_appendage_fearofballacre_tochr(appendage) { if (!appendage) return; local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); if(!parentObj || parentObj.getState() == STATE_DIE){ appendage.setValid(false); return; } local t = appendage.getVar("coolTime").get_timer_vector(0); local currentT = appendage.getTimer().Get(); if(t && t.isOnEvent(currentT)){ local lifeTime = appendage.getVar("custom").getInt(0); local range = appendage.getVar("custom").getInt(1); local objectManager = obj.getObjectManager(); for (local i = 0; i < objectManager.getCollisionObjectNumber(); i++){ local object = objectManager.getCollisionObject(i); if (object && object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object) && sq_Abs(sq_GetXPos(obj) - sq_GetXPos(object)) <= range && sq_Abs(sq_GetYPos(obj) - sq_GetYPos(object)) <= range / 2){ if(!CNSquirrelAppendage.sq_IsAppendAppendage(object, APDPATH_FEAROFBALLACRE_TOENEMY)){ local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(object, obj, -1, false, APDPATH_FEAROFBALLACRE_TOENEMY, true); AddAppendage.sq_SetValidTime(lifeTime); } } } } } function proc_appendage_fearofballacre_toenemy(appendage) { if (!appendage) return; local parentObj = appendage.getParent(); if(!parentObj || parentObj.getState() == STATE_DIE){ appendage.setValid(false); return; } } function drawAppend_appendage_fearofballacre_toenemy(appendage, isOver, x, y, isFlip) { if(!appendage) return; local parentObj = appendage.getParent(); if(!parentObj || parentObj.getState() == STATE_DIE) { appendage.setValid(false); return; } local var = appendage.getVar(); local Ani = var.GetAnimationMap("fearofballacre_debuff", "character/thief/effect/animation/2_necromancer_bykk/fearofballacre/debuff.ani"); sq_AnimationProc(Ani); sq_drawCurrentFrame(Ani, x, y - sq_GetHeightObject(parentObj), isFlip); } function onStart_appendage_wandmastery(appendage) { if(!appendage) return; local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); local weaponType = obj.getWeaponSubType(); if(weaponType == -1) return; if(weaponType == 3){ local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_WANDMASTERY); local castSpeed = sq_GetLevelData(obj, SKILL_BYKK_WANDMASTERY, 0, skillLevel); local change_appendage = appendage.sq_getChangeStatus("wandmastery"); if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("wandmastery",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_CAST_SPEED, false, (castSpeed).tofloat()); } } } //暗魂波 function checkExecutableSkill_DarkSoul(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_BYKK_DARKSOUL); if (isUse){ obj.getVar("DarkSoul_Bool").setBool(0, true); obj.sq_IntVectClear(); if(obj.getVar("ballacreObj").get_obj_vector_size() > 0){ if(sq_GetSkillLevel(obj, SKILL_BYKK_KEYOFACERON) < 1){ obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_DARKSOUL); obj.sq_IntVectPush(2); } else obj.sq_IntVectPush(1); } else obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_DARKSOUL, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_DarkSoul(obj) { if (!obj) return false; return true; } function onSetState_DarkSoul(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(ANI_BYKK_DARKSOUL); break; case 1: obj.sq_SetCurrentAnimation(ANI_BYKK_DARKSOULNONCHARGELAUNCH); break; case 2: obj.sq_SetCurrentAnimation(ANI_BYKK_DARKSOULCHARGECAST); break; case 3: obj.sq_SetCurrentAnimation(ANI_BYKK_DARKSOULCHARGELAUNCH); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); } function onEndCurrentAni_DarkSoul(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: case 1: case 3: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_DarkSoul(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 2: local bDownKey = obj.isDownSkillLastKey(); if(bDownKey){ if(obj.getVar("DarkSoul_Bool").getBool(0)){ local stateTime = obj.sq_GetStateTimer(); if(stateTime >= sq_GetIntData(obj, SKILL_BYKK_DARKSOUL, 4)){ obj.getVar("DarkSoul_Bool").setBool(0, false); } } } else{ obj.sq_IntVectClear(); obj.sq_IntVectPush(3); obj.sq_AddSetStatePacket(STATE_BYKK_DARKSOUL, STATE_PRIORITY_AUTO, true); } break; } } function onKeyFrameFlag_DarkSoul(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 101: local bonusRate = 0; local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_UNHOLYAURA); if(skillLevel > 0) bonusRate = sq_GetLevelData(obj, SKILL_BYKK_UNHOLYAURA, 5, skillLevel).tofloat() / sq_GetLevelData(obj, SKILL_BYKK_UNHOLYAURA, 2, skillLevel).tofloat(); local totalDamage = 0; local increaseRate = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 5, 1.0) + 100; local hitMax = sq_GetIntData(obj, SKILL_BYKK_DARKSOUL, 1); local hitTime = sq_GetIntData(obj, SKILL_BYKK_DARKSOUL, 0); local offsetY = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 4, 1.0) + 100; local subState = obj.getSkillSubState(); switch(subState){ case 3: if(obj.getVar("DarkSoul_Bool").getBool(0) == false){ local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 0, (1.0 + increaseRate.tofloat() / 100.0) * bonusRate) + 100; local totalDamage_exp = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 3, (1.0 + increaseRate.tofloat() / 100.0) * bonusRate) + 100; createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,60,0,68,obj.getDirection(),2,SKILL_BYKK_DARKSOUL,2,totalDamage,totalDamage_exp,hitMax,offsetY,hitTime,0,0,0); break; } case 0: local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 0, bonusRate) + 100; local totalDamage_exp = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 3, bonusRate) + 100; createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,60,0,68,obj.getDirection(),2,SKILL_BYKK_DARKSOUL,1,totalDamage,totalDamage_exp,hitMax,offsetY,hitTime,0,0,0); break; case 1: local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 7, (1.0 + increaseRate.tofloat() / 100.0) * bonusRate) + 100; local totalDamage_exp = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 3, (1.0 + increaseRate.tofloat() / 100.0) * bonusRate) + 100; createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,60,0,68,obj.getDirection(),2,SKILL_BYKK_DARKSOUL,3,totalDamage,totalDamage_exp,hitMax,offsetY,hitTime,0,0,0); break; } break; } return true; } function onTimeEvent_DarkSoul(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_DarkSoul(obj, new_state) { if(!obj) return; } //降临:尼古拉斯 function checkExecutableSkill_SummonNicolas(obj) { if (!obj) return false; local number = obj.getVar("NicolasObj").get_obj_vector_size(); if(number > 0 && obj.getVar("summonnicolas_bool").getBool(0)){ obj.getVar("summonnicolas_bool").setBool(0, false); for(local i = 0; i < number; i++){ local nicolasObj = obj.getVar("NicolasObj").get_obj_vector(i); if(nicolasObj){ local activeObj = sq_GetCNRDObjectToActiveObject(nicolasObj); sq_IntVectorClear(sq_GetGlobalIntVector()); sq_AddSetStatePacketActiveObject(activeObj,12,sq_GetGlobalIntVector(), STATE_PRIORITY_USER); } } local state = obj.getState(); if(state == STATE_STAND || state == STATE_DASH){ obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true); } return true; } local isUse = obj.sq_IsUseSkill(SKILL_BYKK_SUMMONNICOLAS); if (isUse){ obj.getVar("summonnicolas_bool").setBool(0, true); obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_SUMMONNICOLAS, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_SummonNicolas(obj) { if (!obj) return false; return true; } function onSetState_SummonNicolas(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(ANI_BYKK_SUMMONNICOLAS); break; } } function onEndCurrentAni_SummonNicolas(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_SummonNicolas(obj) { if(!obj) return; } function onKeyFrameFlag_SummonNicolas(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 1: local level = sq_GetSkillLevel(obj, 174); local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_SUMMONNICOLAS); local summonTime = sq_GetLevelData(obj, SKILL_BYKK_SUMMONNICOLAS, 10, skillLevel); summonmonster_necromancer_bykk(obj,obj,50,0,0,0,MONSTER_ID_NICOLAS,summonTime,level,0); print(120); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_NICOLAS_TOCHR)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_NICOLAS_TOCHR); print(121); local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, APDPATH_NICOLAS_TOCHR, true); print(122); break; } return true; } function onTimeEvent_SummonNicolas(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_SummonNicolas(obj, new_state) { if(!obj) return; } function onSourceKeyFrameFlag_appendage_nicolas(appendage,flagIndex) { if(!appendage) return; local parentObj = appendage.getParent(); if(!parentObj){ appendage.setValid(false); return true; } local sqrChr = sq_GetCNRDObjectToSQRCharacter(appendage.getVar("sqrChr").get_obj_vector(0)); if(!sqrChr) return true; switch(flagIndex){ case 100: local currentAni = parentObj.getCurrentAnimation(); local delay = currentAni.getDelaySum(0, 0); local speedRate = 30000 / delay; createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,0,parentObj.getDirection(),2,SKILL_BYKK_SUMMONNICOLAS,10,speedRate,0,0,0,0,0,0,0); break; case 102: //蜘蛛团 local bonusRate = 100; if(appendage.getVar("custom").getInt(0) == 12 || appendage.getVar("custom").getInt(0) == 2) bonusRate = bonusRate + appendage.getVar("custom").getInt(1); bonusRate = bonusRate.tofloat() / 100.0; // print("bonusRate_blackspi = "+bonusRate); local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_SUMMONNICOLAS, -1, 7, bonusRate) + 100; local hitTime = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_SUMMONNICOLAS, -1, 3, 1.0) + 100; createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,5,0,50,parentObj.getDirection(),2,SKILL_BYKK_SUMMONNICOLAS,1,totalDamage,hitTime,0,0,0,0,0,0); break; case 201: //召唤僵尸 local level = sq_GetSkillLevel(sqrChr, 174); local skillLevel = sq_GetSkillLevel(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE); local summonTime = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, 9, skillLevel); local summonMax = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, 11, skillLevel); createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,58,0,116,parentObj.getDirection(),2,SKILL_BYKK_NICOLASSUMMONZOMBIE,1,level,summonTime,summonMax,0,0,0,0,0); break; case 301: //吸魂暗劲波 if(sqrChr.isDownSkillLastKey()){ local offsetX = sq_GetDistancePos(sq_GetXPos(sqrChr), sqrChr.getDirection(), 100); sq_setCurrentAxisPos(parentObj, 0, offsetX); sq_setCurrentAxisPos(parentObj, 1, sq_GetYPos(sqrChr)); sq_SetCurrentDirection(parentObj, sq_GetDirection(sqrChr)); } local currentAni = parentObj.getCurrentAnimation(); sq_SetFrameDelayTime(currentAni, 3, 200); sqrChr.getVar("blackwave_tar").clear_obj_vector(); parentObj.getVar("blackwave_bool").setBool(0, true); local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKWAVE, -1, 1, 1.0) + 100; local hitTime = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKWAVE, 0); createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,0,parentObj.getDirection(),2,SKILL_BYKK_NICOLASBLACKWAVE,1,totalDamage,hitTime,0,0,0,0,0,0); break; case 304: //吸魂暗劲波 local aniPath = "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackwave/bodysmokenormal.ani"; local pooledObj = createOnlyDrawObject_Theif_bykk(parentObj,aniPath,true,parentObj.getDirection(),sq_GetXPos(parentObj),sq_GetYPos(parentObj),sq_GetZPos(parentObj),ENUM_DRAWLAYER_NORMAL); parentObj.getVar("effect").clear_obj_vector(); parentObj.getVar("effect").push_obj_vector(pooledObj); local aniPath2 = "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackwave/linestartnormal.ani"; local angle = [135,110,60,45,0,-40,-80,-120,-150,-175]; local xPos = sq_GetDistancePos(sq_GetXPos(parentObj), parentObj.getDirection(), 10), yPos = sq_GetYPos(parentObj), zPos = sq_GetZPos(parentObj) + 100; for(local i = 0; i < angle.len(); i++){ local pooledObj = createOnlyDrawObject_Theif_bykk(parentObj, aniPath2, true, parentObj.getDirection(), xPos, yPos - 1, zPos, ENUM_DRAWLAYER_NORMAL); sq_SetCustomRotate(pooledObj, sq_ToRadian(angle[i].tofloat())); } break; case 310: //吸魂暗劲波 local effect_obj = parentObj.getVar("effect").get_obj_vector(0); if(effect_obj) effect_obj.setValid(false); local aniPath = "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackwave/blastbeforebody.ani"; local aniPath2 = "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackwave/blastbeforeeffect.ani"; createOnlyDrawObject_Theif_bykk(parentObj,aniPath,true,parentObj.getDirection(),sq_GetXPos(parentObj),sq_GetYPos(parentObj),sq_GetZPos(parentObj),ENUM_DRAWLAYER_NORMAL); createOnlyDrawObject_Theif_bykk(parentObj,aniPath2,true,parentObj.getDirection(),sq_GetXPos(parentObj),sq_GetYPos(parentObj) - 1,sq_GetZPos(parentObj) - 1,ENUM_DRAWLAYER_NORMAL); break; case 311: //吸魂暗劲波 local aniPath = "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackwave/blastbeforeeyedodge.ani"; createOnlyDrawObject_Theif_bykk(parentObj,aniPath,true,parentObj.getDirection(),sq_GetXPos(parentObj),sq_GetYPos(parentObj),sq_GetZPos(parentObj),ENUM_DRAWLAYER_NORMAL); local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKWAVE, -1, 3, 1.0) + 100; local sizeRate = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKWAVE, 4) / 10; local size = sqrChr.getVar("blackwave_tar").get_obj_vector_size(); if(size > 0){ for(local i = 0; i < size; i++){ local targetObj = sqrChr.getVar("blackwave_tar").get_obj_vector(i); if(targetObj){ createSkillPassive_Theif_bykk(sqrChr,targetObj,PASSIVEOBJ_NUM_THIEF,0,0,sq_GetHeightObject(targetObj) / 2,parentObj.getDirection(),2,SKILL_BYKK_NICOLASSUMMONZOMBIE,3,totalDamage,sizeRate,0,0,0,0,0,0); } } } break; case 322: //吸魂暗劲波 if(parentObj.getVar("blackwave_bool").getBool(0)){ parentObj.getVar("blackwave_bool").setBool(0, false); local size = sqrChr.getVar("blackwave_tar").get_obj_vector_size(); if(size > 0){ for(local i = 0; i < size; i++){ local targetObj = sqrChr.getVar("blackwave_tar").get_obj_vector(i); if(targetObj){ CNSquirrelAppendage.sq_RemoveAppendage(targetObj, APDPATH_NICOLAS_BLACKWAVE); } } } } break; case 404: //艾克洛索 local targetObj = parentObj.getVar("targetObj").get_obj_vector(0); if(targetObj){ local bonusRate = 100; if(appendage.getVar("custom").getInt(0) == 12 || appendage.getVar("custom").getInt(0) == 2) bonusRate = bonusRate + appendage.getVar("custom").getInt(2); bonusRate = bonusRate.tofloat() / 100.0; // print("bonusRate_ara = "+bonusRate); local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_SUMMONNICOLAS, -1, 8, bonusRate) + 100; local totalDamage2 = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_SUMMONNICOLAS, -1, 9, bonusRate) + 100; createSkillPassive_Theif_bykk(sqrChr,targetObj,PASSIVEOBJ_NUM_THIEF,0,0,400,parentObj.getDirection(),2,SKILL_BYKK_SUMMONNICOLAS,2,totalDamage,totalDamage2,0,0,0,0,0,0); sq_AddDrawOnlyAniFromParent(targetObj, "passiveobject/common/animation/magictargetwarningterrible.ani", 0, 0, -sq_GetZPos(targetObj)); } break; case 503: //暗影蛛丝阵 local skillLevel = sq_GetSkillLevel(sqrChr, SKILL_BYKK_NICOLASBLACKAREA); local lifeTime = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASBLACKAREA, 4, skillLevel); local totalDamage = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASBLACKAREA, 5, skillLevel); local darkTol = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASBLACKAREA, 0, skillLevel); local hitTime = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKAREA, 0); local sizeRate = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASBLACKAREA, 2, skillLevel) / 2; local ap = sq_CreateChangeStatus(CHANGE_STATUS_TYPE_ELEMENT_TOLERANCE_DARK, false, darkTol.tofloat() , 0); if (ap){ ap.getAppendageInfo().setValidTime(lifeTime); ap.sq_Append(parentObj, sqrChr); } local group = sq_GetGroup(parentObj); local uniqueId = sq_GetUniqueId(parentObj); createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,-sq_GetZPos(parentObj),parentObj.getDirection(),2,SKILL_BYKK_NICOLASBLACKAREA,1,totalDamage,lifeTime,hitTime,sizeRate,group,uniqueId,0,0); break; case 701: //tp黑蜘蛛 local bonusRate = 100; if(appendage.getVar("custom").getInt(0) == 12 || appendage.getVar("custom").getInt(0) == 2) bonusRate = bonusRate + appendage.getVar("custom").getInt(1); bonusRate = bonusRate.tofloat() / 100.0; // print("bonusRate_blackspi_tp = "+bonusRate); local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_SUMMONNICOLAS, -1, 11, bonusRate) + 100; local hitTime = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_SUMMONNICOLAS, -1, 3, 1.0) + 100; createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,60,-1,10,parentObj.getDirection(),2,SKILL_BYKK_SUMMONNICOLAS,3,totalDamage,hitTime,0,0,0,0,0,0); break; case 802: //tp艾克尼亚的灵体 local targetObj = parentObj.getVar("targetObj").get_obj_vector(0); if(targetObj){ local bonusRate = 100; if(appendage.getVar("custom").getInt(0) == 12 || appendage.getVar("custom").getInt(0) == 2) bonusRate = bonusRate + appendage.getVar("custom").getInt(1); bonusRate = bonusRate.tofloat() / 100.0; // print("bonusRate_ara_tp = "+bonusRate); local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_SUMMONNICOLAS, -1, 14, bonusRate) + 100; createSkillPassive_Theif_bykk(sqrChr,targetObj,PASSIVEOBJ_NUM_THIEF,0,0,-sq_GetZPos(targetObj),parentObj.getDirection(),2,SKILL_BYKK_SUMMONNICOLAS,5,totalDamage,0,0,0,0,0,0,0); } break; case 901: //暗黑蛛丝引 if(sqrChr.isDownSkillLastKey()){ sq_AddDrawOnlyAniFromParent(parentObj, "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackarachnia/disappear_smokenormal.ani", 0, 0, 0); } break; case 902: //暗黑蛛丝引 if(sqrChr.isDownSkillLastKey()){ local offsetX = sq_GetDistancePos(sq_GetXPos(sqrChr), sqrChr.getDirection(), 100); sq_setCurrentAxisPos(parentObj, 0, offsetX); sq_setCurrentAxisPos(parentObj, 1, sq_GetYPos(sqrChr)); sq_SetCurrentDirection(parentObj, sq_GetDirection(sqrChr)); sq_AddDrawOnlyAniFromParent(parentObj, "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackarachnia/disappear_smokenormal.ani", 0, 0, 0); } local aniPath = "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackarachnia/start_blackground.ani"; createOnlyDrawObject_Theif_bykk(parentObj,aniPath,true,parentObj.getDirection(),sq_GetXPos(parentObj),sq_GetYPos(parentObj),0,ENUM_DRAWLAYER_BOTTOM); break; case 903: //暗黑蛛丝引 sq_SetMyShake(parentObj, 10, 500); monsterattack_Thief_Necromancer_ksk(parentObj,13); break; case 1004: //近身攻击 local currentAni = parentObj.getCurrentAnimation(); local delay = currentAni.getDelaySum(0, 0); local speedRate = 6000 / delay; local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBEHAVIOR, -1, 11, 1.0) + 100; createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,0,parentObj.getDirection(),2,SKILL_BYKK_SUMMONNICOLAS,6,speedRate,totalDamage,0,0,0,0,0,0); case 1101: //吸魂暗劲波护石 case 1200: if(sqrChr.isDownSkillLastKey()){ sq_AddDrawOnlyAniFromParent(parentObj, "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackarachnia/disappear_smokenormal.ani", 0, 0, 0); } break; case 1201: //暗黑蛛丝引 if(sqrChr.isDownSkillLastKey()){ local offsetX = sq_GetDistancePos(sq_GetXPos(sqrChr), sqrChr.getDirection(), 50); sq_setCurrentAxisPos(parentObj, 0, offsetX); sq_setCurrentAxisPos(parentObj, 1, sq_GetYPos(sqrChr)); sq_SetCurrentDirection(parentObj, sq_GetDirection(sqrChr)); sq_AddDrawOnlyAniFromParent(parentObj, "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackarachnia/disappear_smokenormal.ani", 0, 0, 0); } break; case 1203://`create Dead Nicolas sister` 142 0 0 local currentAni = parentObj.getCurrentAnimation(); local delay = currentAni.getDelaySum(3, 7); local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, -1, 0, 1.0) + 100; local totalDamage2 = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, -1, 2, 5.0) + 100; local holdTime = 3000 + delay; local sizeRate = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, 5); local hitTime = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, 4); sqrChr.getVar("blacjarachnia_tar").clear_obj_vector(); createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,142,0,0,parentObj.getDirection(),2,SKILL_BYKK_NICOLASBLACKARACHNIA,4,totalDamage,sizeRate,totalDamage2,holdTime,hitTime,0,0,0); print("test"); break; case 1301: sq_flashScreen(parentObj,200,200,240,255, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); local currentAni = parentObj.getCurrentAnimation(); local delay = currentAni.getDelaySum(6, 15); local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, -1, 0, 1.0) + 100; local totalDamage2 = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, -1, 2, 1.0) + 100; local holdTime = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, -1, 3, 1.0) + 100 + delay; local sizeRate = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, 5); local hitTime = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, 4); sqrChr.getVar("blacjarachnia_tar").clear_obj_vector(); createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,0,parentObj.getDirection(),2,SKILL_BYKK_NICOLASBLACKARACHNIA,1,totalDamage,sizeRate,totalDamage2,holdTime,hitTime,0,0,0); break; case 1306: local aniPath = "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackarachnia/attack_blackground.ani"; createOnlyDrawObject_Theif_bykk(parentObj,aniPath,true,parentObj.getDirection(),sq_GetXPos(parentObj),sq_GetYPos(parentObj),0,ENUM_DRAWLAYER_BOTTOM); local size = sqrChr.getVar("blacjarachnia_tar").get_obj_vector_size(); local currentAni = parentObj.getCurrentAnimation(); local delay = currentAni.getDelaySum(6, 10); if(size > 0){ for(local i = 0; i < size; i++){ local targetObj = sqrChr.getVar("blacjarachnia_tar").get_obj_vector(i); if(targetObj){ local activeObj = sq_GetCNRDObjectToActiveObject(targetObj); local addAppendage = CNSquirrelAppendage.sq_GetAppendage(targetObj, APDPATH_NICOLAS_BLACKWAVE); if(addAppendage && !sq_IsFixture(activeObj)) sq_MoveToAppendageForce(targetObj, sqrChr, parentObj, 100, 0, targetObj.getZPos(), delay, true, addAppendage); } } } break; case 1307: local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, -1, 1, 1.0) + 100; local sizeRate = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, 5); createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,0,parentObj.getDirection(),2,SKILL_BYKK_NICOLASBLACKARACHNIA,2,totalDamage,sizeRate,0,0,0,0,0,0); break; } return true; } function proc_appendage_nicolas_tochr(appendage) { if (!appendage) return; local parentObj = appendage.getParent(); if(!parentObj || parentObj.getState() == STATE_DIE){ appendage.setValid(false); return; } } function proc_appendage_nicolas(appendage) { if (!appendage) return; local parentObj = appendage.getParent(); local sqrChr = sq_GetCNRDObjectToSQRCharacter(appendage.getVar("sqrChr").get_obj_vector(0)); if((!sqrChr || sqrChr.getState() == STATE_DIE) || (!parentObj || parentObj.getState() == STATE_DIE)){ appendage.setValid(false); return; } local sub = appendage.getVar("custom").getInt(0); if(sub == 3 || sub == 13) return; if(!sq_IsMyControlObject(sqrChr)) return; local t_01 = appendage.getVar("skill_1").get_timer_vector(0); local t_02 = appendage.getVar("skill_2").get_timer_vector(0); local t_03 = appendage.getVar("skill_3").get_timer_vector(0); local t_04 = appendage.getVar("skill_4").get_timer_vector(0); local currentT = appendage.getTimer().Get(); local state = parentObj.getState(); switch(state){ case STATE_STAND: local timer = appendage.getVar("atktime").get_ct_vector(0); local currentTT = timer.Get(); if(currentTT < ATK_TIME) return; timer.Reset(); timer.Start(10000,0); if(parentObj.getVar("blackwave_bool").getBool(0)){ parentObj.getVar("blackwave_bool").setBool(0, false); local size = sqrChr.getVar("blackwave_tar").get_obj_vector_size(); if(size > 0){ for(local i = 0; i < size; i++){ local targetObj = sqrChr.getVar("blackwave_tar").get_obj_vector(i); if(targetObj) CNSquirrelAppendage.sq_RemoveAppendage(targetObj, APDPATH_NICOLAS_BLACKWAVE); } } } local targetObj = sq_FindTarget( parentObj, 0, 1000, 800, 350); if(targetObj){ parentObj.getVar("targetObj").clear_obj_vector(); parentObj.getVar("targetObj").push_obj_vector(targetObj); local skillt, attackIndex, distanceX, distanceXmin, distanceY; switch(sub){ case 1: case 11: skillt = [t_02,t_01,t_04]; attackIndex = [1,10,4]; if(sub == 11) attackIndex = [7,10,8]; distanceX = [160,160,500]; distanceXmin = [0,0,0]; distanceY = [16,38,200]; break; case 0: case 10: case 2: case 12: skillt = [t_03,t_02]; attackIndex = [4,1]; if(sub == 10 || sub == 12) attackIndex = [8,7]; distanceX = [500,500]; distanceXmin = [0,0]; distanceY = [200,16]; break; } for(local i = 0;i < skillt.len(); i++){ if(skillt[i] && skillt[i].isOnEvent(currentT)){ if(sq_IsMyControlObject(parentObj)){ if(sq_Abs(targetObj.getXPos() - parentObj.getXPos()) <= distanceX[i] && sq_Abs(targetObj.getXPos() - parentObj.getXPos()) >= distanceXmin[i] && sq_Abs(targetObj.getYPos() - parentObj.getYPos()) <= distanceY[i]){ monsterattack_Thief_Necromancer_ksk(parentObj,attackIndex[i]); return; } } } } } else{ targetObj = sq_FindTarget( parentObj, -1000, 1000, 800, 350); if(targetObj){ sq_SetCurrentDirection(parentObj, sq_GetOppositeDirection(sq_GetDirection(parentObj))); } } break; case STATE_ATTACK: local attackIndex = parentObj.getAttackIndex(); break; } } function onStart_appendage_nicolas(appendage) { if (!appendage) return; appendage.getVar("atktime").clear_ct_vector(); appendage.getVar("atktime").push_ct_vector(); local timer = appendage.getVar("atktime").get_ct_vector(0); timer.Reset(); timer.Start(10000,0); } function onEnd_appendage_nicolas(appendage) { if (!appendage) return; local parentObj = appendage.getParent(); if(!parentObj) return; local activeObj = sq_GetCNRDObjectToActiveObject(parentObj); sq_IntVectorClear(sq_GetGlobalIntVector()); sq_AddSetStatePacketActiveObject(activeObj, 12, sq_GetGlobalIntVector(), STATE_PRIORITY_USER); } //服从 function checkExecutableSkill_NicolasBehavior(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_BYKK_NICOLASBEHAVIOR); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_NICOLASBEHAVIOR, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_NicolasBehavior(obj) { if (!obj) return false; return true; } function onSetState_NicolasBehavior(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(ANI_BYKK_NICOLASBEHAVIOR_CASTING_BODY); break; case 1: obj.sq_SetCurrentAnimation(ANI_BYKK_NICOLASBEHAVIOR_LOOP_BODY); local sub = obj.getVar("NicolasBehavior_Sub").getInt(0); local aniPath = ["character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/range.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/melee.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/guard.ani"]; obj.getVar("effect").clear_obj_vector(); switch(sub){ case 1://近战 case 11://近战 aniPath = ["character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/melee_sub.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/range.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/guard.ani"]; break; case 2://远程 case 12://远程 aniPath = ["character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/melee.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/range_sub.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/guard.ani"]; break; case 3://守护 case 13://守护 local aniPath = ["character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/melee.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/range.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/guard_sub.ani"]; break; } local offsetX = [-35, 35, 0], offsetZ = [130, 130, 165]; for(local i = 0; i < aniPath.len(); i++){ local pooledObj = createOnlyDrawObject_Theif_bykk(obj,aniPath[i],false,ENUM_DIRECTION_RIGHT,sq_GetDistancePos(sq_GetXPos(obj), ENUM_DIRECTION_RIGHT, offsetX[i]),sq_GetYPos(obj),sq_GetZPos(obj) + offsetZ[i],ENUM_DRAWLAYER_NORMAL); obj.getVar("effect").push_obj_vector(pooledObj); } break; case 2: obj.sq_SetCurrentAnimation(ANI_BYKK_NICOLASBEHAVIOR_END_BODY); obj.sq_PlaySound("TF_NICOLAS_OBEY"); local size = obj.getVar("effect").get_obj_vector_size(); if(size > 0){ for(local i = 0; i < size; i++){ local pooledObj = obj.getVar("effect").get_obj_vector(i); if(pooledObj) pooledObj.setValid(false); } } local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, APDPATH_NICOLAS_TOCHR); if(addAppendage){//92近战 93远程 94守护 local sub = obj.getVar("NicolasBehavior_Sub").getInt(0); if(sub > 0){ if(sub > 10) addAppendage.setBuffIconImage(sub + 81); else addAppendage.setBuffIconImage(sub + 91); } local nicolasObj = obj.getVar("NicolasObj").get_obj_vector(0); if(nicolasObj){ local activeObj = sq_GetCNRDObjectToActiveObject(nicolasObj); local addAppendage2 = CNSquirrelAppendage.sq_GetAppendage(activeObj, APDPATH_NICOLAS); addAppendage2.getVar("custom").setInt(0, sub); switch(sub){ case 1: case 11: local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_NICOLASBEHAVIOR); local phyDefense = sq_GetLevelData(obj, SKILL_BYKK_NICOLASBEHAVIOR, 4, skillLevel); local mglDefense = sq_GetLevelData(obj, SKILL_BYKK_NICOLASBEHAVIOR, 5, skillLevel); local change_appendage2 = addAppendage2.sq_getChangeStatus("nicolas"); if(!change_appendage2) change_appendage2 = addAppendage2.sq_AddChangeStatus("nicolas",activeObj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000); if(change_appendage2){ change_appendage2.clearParameter(); change_appendage2.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_DEFENSE, true, (phyDefense).tofloat()); change_appendage2.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_DEFENSE, true, (mglDefense).tofloat()); } local change_appendage = addAppendage.sq_getChangeStatus("nicolas_tochr"); if(change_appendage) change_appendage.clearParameter(); break; case 2: case 12: local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_NICOLASBEHAVIOR); local spiBonusRate = sq_GetLevelData(obj, SKILL_BYKK_NICOLASBEHAVIOR, 6, skillLevel); local araBonusRate = sq_GetLevelData(obj, SKILL_BYKK_NICOLASBEHAVIOR, 7, skillLevel); addAppendage2.getVar("custom").setInt(1, spiBonusRate); addAppendage2.getVar("custom").setInt(2, araBonusRate); local change_appendage = addAppendage.sq_getChangeStatus("nicolas_tochr"); if(change_appendage) change_appendage.clearParameter(); break; case 3: case 13: local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_NICOLASBEHAVIOR); local phyDefense = sq_GetLevelData(obj, SKILL_BYKK_NICOLASBEHAVIOR, 8, skillLevel); local mglDefense = sq_GetLevelData(obj, SKILL_BYKK_NICOLASBEHAVIOR, 9, skillLevel); local change_appendage = addAppendage.sq_getChangeStatus("nicolas_tochr"); if(!change_appendage) change_appendage = addAppendage.sq_AddChangeStatus("nicolas_tochr",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_DEFENSE, false, (phyDefense).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_DEFENSE, false, (mglDefense).tofloat()); } break; } } } break; } } function onEndCurrentAni_NicolasBehavior(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_BYKK_NICOLASBEHAVIOR, STATE_PRIORITY_AUTO, true); break; case 2: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_NicolasBehavior(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 1: if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL)){//远程 if(sq_GetSkillLevel(obj, SKILL_BYKK_SUMMONNICOLASEX) > 0) obj.getVar("NicolasBehavior_Sub").setInt(0, 12); else obj.getVar("NicolasBehavior_Sub").setInt(0, 2); local nicolasBehaviorObj = obj.getVar("NicolasBehavior_obj").get_obj_vector(0); if(nicolasBehaviorObj) nicolasBehaviorObj.setValid(false); obj.sq_IntVectClear(); obj.sq_IntVectPush(2); obj.sq_AddSetStatePacket(STATE_BYKK_NICOLASBEHAVIOR, STATE_PRIORITY_IGNORE_FORCE, true); } else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL)){//守护 if(sq_GetSkillLevel(obj, SKILL_BYKK_SUMMONNICOLASEX) > 0) obj.getVar("NicolasBehavior_Sub").setInt(0, 13); else obj.getVar("NicolasBehavior_Sub").setInt(0, 3); sq_SendCreatePassiveObjectPacket(obj, 1008611, 0, 0, 0, 0, obj.getDirection()); obj.sq_IntVectClear(); obj.sq_IntVectPush(2); obj.sq_AddSetStatePacket(STATE_BYKK_NICOLASBEHAVIOR, STATE_PRIORITY_IGNORE_FORCE, true); } else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL)){//近战 if(sq_GetSkillLevel(obj, SKILL_BYKK_SUMMONNICOLASEX) > 0) obj.getVar("NicolasBehavior_Sub").setInt(0, 11); else obj.getVar("NicolasBehavior_Sub").setInt(0, 1); local nicolasBehaviorObj = obj.getVar("NicolasBehavior_obj").get_obj_vector(0); if(nicolasBehaviorObj) nicolasBehaviorObj.setValid(false); obj.sq_IntVectClear(); obj.sq_IntVectPush(2); obj.sq_AddSetStatePacket(STATE_BYKK_NICOLASBEHAVIOR, STATE_PRIORITY_IGNORE_FORCE, true); } local stateTime = obj.sq_GetStateTimer(); if(stateTime >= 2000){ obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); } break; } } function onKeyFrameFlag_NicolasBehavior(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_NicolasBehavior(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_NicolasBehavior(obj, new_state) { if(!obj) return; if(new_state != SKILL_BYKK_NICOLASBEHAVIOR){ local size = obj.getVar("effect").get_obj_vector_size(); if(size > 0){ for(local i = 0; i < size; i++){ local pooledObj = obj.getVar("effect").get_obj_vector(i); if(pooledObj) pooledObj.setValid(false); } } } } function onCreateObject_NicolasBehavior(obj, createObject) { if(createObject.isObjectType(OBJECTTYPE_PASSIVE)){ local colObj = sq_GetCNRDObjectToCollisionObject(createObject); local id = colObj.getCollisionObjectIndex(); if(id == 1008611){ sq_moveWithParent(obj, colObj); obj.getVar("NicolasBehavior_obj").clear_obj_vector(); obj.getVar("NicolasBehavior_obj").push_obj_vector(colObj); print("test"); } } } //驱使僵尸 function checkExecutableSkill_NicolasSummonZombie(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_BYKK_NICOLASSUMMONZOMBIE); if (isUse){ if(sq_GetSkillLevel(obj, SKILL_BYKK_KEYOFACERON) > 0){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_NICOLASSUMMONZOMBIE, STATE_PRIORITY_IGNORE_FORCE, true); } else{ local size = obj.getVar("NicolasObj").get_obj_vector_size(); if(size > 0){ local nicolasObj = obj.getVar("NicolasObj").get_obj_vector(0); if(nicolasObj){ local activeObj = sq_GetCNRDObjectToActiveObject(nicolasObj); monsterattack_Thief_Necromancer_ksk(activeObj,2); } } local state = obj.getState(); switch(state){ case STATE_STAND: case STATE_DASH: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true); break; } } return true; } return false; } function checkCommandEnable_NicolasSummonZombie(obj) { if (!obj) return false; return true; } function onSetState_NicolasSummonZombie(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(ANI_BYKK_SUMMONZOMBIE_ACHERON); break; } } function onEndCurrentAni_NicolasSummonZombie(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_NicolasSummonZombie(obj) { if(!obj) return; } function onKeyFrameFlag_NicolasSummonZombie(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 1: local level = sq_GetSkillLevel(obj, 174); local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_NICOLASSUMMONZOMBIE); local summonTime = sq_GetLevelData(obj, SKILL_BYKK_NICOLASSUMMONZOMBIE, 9, skillLevel); local summonMax = sq_GetLevelData(obj, SKILL_BYKK_NICOLASSUMMONZOMBIE, 11, skillLevel); for(local i = 0; i < summonMax; i++){ summonmonster_necromancer_bykk(obj,obj,150+sq_getRandom(-15,15),sq_getRandom(-15,15),0,0,MONSTER_ID_ZOMBIE,summonTime,level,0); } break; } return true; } function onTimeEvent_NicolasSummonZombie(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_NicolasSummonZombie(obj, new_state) { if(!obj) return; } function onSourceKeyFrameFlag_appendage_zombie(appendage,flagIndex) { if(!appendage) return; local parentObj = appendage.getParent(); if(!parentObj){ appendage.setValid(false); return true; } local sqrChr = sq_GetCNRDObjectToSQRCharacter(appendage.getVar("sqrChr").get_obj_vector(0)); if(!sqrChr) return true; switch(flagIndex){ case 101: //撕咬 parentObj.getVar("tar").clear_obj_vector(); local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, -1, 2, 1.0) + 100; if(appendage.getVar("custom").getInt(0) == appendage.getVar("custom").getInt(1) - 1) totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, -1, 3, 1.0) + 100; local skillLevel = sq_GetSkillLevel(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE); local level = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, 7, skillLevel); local time = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, 6, skillLevel); local prob = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, 5, skillLevel); local group = sq_GetGroup(parentObj); local uniqueId = sq_GetUniqueId(parentObj); createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,0,parentObj.getDirection(),2,SKILL_BYKK_NICOLASSUMMONZOMBIE,2,totalDamage,level,time,prob,group,uniqueId,0,0); break; case 103: if(parentObj.getVar("tar").get_obj_vector_size() > 0) monsterattack_Thief_Necromancer_ksk(parentObj, 1); break; case 202: monsterattack_Thief_Necromancer_ksk(parentObj, 2); break; case 303: if(appendage.getVar("custom").getInt(0) == appendage.getVar("custom").getInt(1) - 1){ //爆炸 local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, -1, 12, 1.0) + 100; local sizeRate = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, -1, 14, 1.0) + 100; createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,sq_GetHeightObject(parentObj) / 2,parentObj.getDirection(),2,SKILL_BYKK_NICOLASSUMMONZOMBIE,3,totalDamage,sizeRate,0,0,0,0,0,0); parentObj.setValid(false); } else appendage.getVar("custom").setInt(0, appendage.getVar("custom").getInt(0) + 1); local size = parentObj.getVar("tar").get_obj_vector_size(); if(size > 0){ for(local i = 0; i < size; i++){ local targetObj = parentObj.getVar("tar").get_obj_vector(i); if(targetObj) CNSquirrelAppendage.sq_RemoveAppendage(targetObj, APDPATH_ZOMBIE_HOLD); } } break; } return true; } function proc_appendage_zombie(appendage) { if (!appendage) return; local parentObj = appendage.getParent(); local sqrChr = sq_GetCNRDObjectToSQRCharacter(appendage.getVar("sqrChr").get_obj_vector(0)); if((!sqrChr || sqrChr.getState() == STATE_DIE) || (!parentObj || parentObj.getState() == STATE_DIE)){ appendage.setValid(false); return; } if(!sq_IsMyControlObject(sqrChr)) return; local t_01 = appendage.getVar("skill_1").get_timer_vector(0); local currentT = appendage.getTimer().Get(); local state = parentObj.getState(); switch(state){ case STATE_STAND: local timer = appendage.getVar("atktime").get_ct_vector(0); local currentTT = timer.Get(); if(currentTT < ATK_TIME) return; timer.Reset(); timer.Start(10000,0); local targetObj = sq_FindTarget( parentObj, 0, 1000, 800, 350); if(targetObj){ parentObj.getVar("targetObj").clear_obj_vector(); parentObj.getVar("targetObj").push_obj_vector(targetObj); if(t_01 && t_01.isOnEvent(currentT)){ if(sq_IsMyControlObject(parentObj)){ if(sq_Abs(targetObj.getXPos() - parentObj.getXPos()) <= 90 && sq_Abs(targetObj.getXPos() - parentObj.getXPos()) >= 0 && sq_Abs(targetObj.getYPos() - parentObj.getYPos()) <= 18){ monsterattack_Thief_Necromancer_ksk(parentObj, 0); return; } } } } else{ targetObj = sq_FindTarget( parentObj, -1000, 1000, 800, 350); if(targetObj){ sq_SetCurrentDirection(parentObj, sq_GetOppositeDirection(sq_GetDirection(parentObj))); } } break; case STATE_ATTACK: local attackIndex = parentObj.getAttackIndex(); break; } } function onStart_appendage_zombie(appendage) { if (!appendage) return; appendage.getVar("atktime").clear_ct_vector(); appendage.getVar("atktime").push_ct_vector(); local timer = appendage.getVar("atktime").get_ct_vector(0); timer.Reset(); timer.Start(10000,0); } function onEnd_appendage_zombie(appendage) { if (!appendage) return; local parentObj = appendage.getParent(); if(!parentObj) return; local activeObj = sq_GetCNRDObjectToActiveObject(parentObj); sq_IntVectorClear(sq_GetGlobalIntVector()); sq_AddSetStatePacketActiveObject(activeObj, 12, sq_GetGlobalIntVector(), STATE_PRIORITY_USER); } //暗影蛛丝阵 function checkExecutableSkill_NicolasBlackArea(obj) { if (!obj) return false; local size = obj.getVar("NicolasObj").get_obj_vector_size(); if(size < 1) return false; local isUse = obj.sq_IsUseSkill(SKILL_BYKK_NICOLASBLACKAREA); if (isUse){ obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_NICOLASBLACKAREA); local nicolasObj = obj.getVar("NicolasObj").get_obj_vector(0); if(nicolasObj){ local activeObj = sq_GetCNRDObjectToActiveObject(nicolasObj); monsterattack_Thief_Necromancer_ksk(activeObj,5); } local state = obj.getState(); switch(state){ case STATE_STAND: case STATE_DASH: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true); break; } return true; } return false; } function checkCommandEnable_NicolasBlackArea(obj) { if (!obj) return false; return true; } function onSetState_NicolasBlackArea(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(109); break; case 1: obj.sq_SetCurrentAnimation(110); break; } } function onEndCurrentAni_NicolasBlackArea(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_AUTO, true); break; case 1: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_NicolasBlackArea(obj) { if(!obj) return; } function onKeyFrameFlag_NicolasBlackArea(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_NicolasBlackArea(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_NicolasBlackArea(obj, new_state) { if(!obj) return; } //死亡之爪 function checkExecutableSkill_DarkNail(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_BYKK_DARKNAIL); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_DARKNAIL, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_DarkNail(obj) { if (!obj) return false; return true; } function onSetState_DarkNail(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(ANI_BYKK_DARKNAIL); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); local currentAni = obj.getCurrentAnimation(); local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKNAIL, -1, 3, 1.0) + 100; local sizeRate = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKNAIL, -1, 2, 1.0) + 100; local speedRate = 8000 / currentAni.getDelaySum(0, 0); createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,0,0,0,obj.getDirection(),2,SKILL_BYKK_DARKNAIL,1,totalDamage,sizeRate,speedRate,0,0,0,0,0); } function onEndCurrentAni_DarkNail(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_DarkNail(obj) { if(!obj) return; } function onKeyFrameFlag_DarkNail(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_DarkNail(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_DarkNail(obj, new_state) { if(!obj) return; } //暗黑仪式 function checkExecutableSkill_DarkRitual(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_BYKK_DARKRITUAL); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_DARKRITUAL, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_DarkRitual(obj) { if (!obj) return false; return true; } function onSetState_DarkRitual(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(ANI_BYKK_DARKRITUAL); local currentAni = obj.getCurrentAnimation(); sq_SetFrameDelayTime(currentAni, 0, 80); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); } function onEndCurrentAni_DarkRitual(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_DarkRitual(obj) { if(!obj) return; } function onKeyFrameFlag_DarkRitual(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 1: if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DARKRITUAL)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_DARKRITUAL); local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, APDPATH_DARKRITUAL, true); local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_DARKRITUAL); local buffTime = sq_GetLevelData(obj, SKILL_BYKK_DARKRITUAL, 1, skillLevel); if(buffTime > 0) AddAppendage.sq_SetValidTime(buffTime); AddAppendage.setEnableIsBuff(true); AddAppendage.setBuffIconImage(112); AddAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_BYKK_DARKRITUAL, skillLevel); CNSquirrelAppendage.sq_Append(AddAppendage, obj, obj, true); setSkillBonusRate_NecroMancer_bykk(obj); break; } return true; } function onTimeEvent_DarkRitual(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_DarkRitual(obj, new_state) { if(!obj) return; } function proc_appendage_darkritual_tochr(appendage) { if(!appendage) return; local parentObj = appendage.getParent(); if(!parentObj || parentObj.getState() == STATE_DIE){ appendage.setValid(false); return; } } function onEnd_appendage_darkritual_tochr(appendage) { if(!appendage) return; local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); if(obj && obj.getState() != STATE_DIE){ setSkillBonusRate_NecroMancer_bykk(obj); } } function setSkillBonusRate_NecroMancer_bykk(obj) { local bonusRate = 1000; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DARKRITUAL)) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_DARKRITUAL, 0, sq_GetSkillLevel(obj, SKILL_BYKK_DARKRITUAL))) / 1000; print("bonusRate1 = "+bonusRate); if(sq_GetSkillLevel(obj, SKILL_BYKK_GRIMGRIMOIRE) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_GRIMGRIMOIRE, 13, sq_GetSkillLevel(obj, SKILL_BYKK_GRIMGRIMOIRE))) / 1000; print("bonusRate2 = "+bonusRate); if(sq_GetSkillLevel(obj, SKILL_BYKK_KEYOFACERON) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_KEYOFACERON, 0, sq_GetSkillLevel(obj, SKILL_BYKK_KEYOFACERON))) / 1000; print("bonusRate3 = "+bonusRate); if(sq_GetSkillLevel(obj, SKILL_BYKK_RINGOFDARKNESS) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_RINGOFDARKNESS, 0, sq_GetSkillLevel(obj, SKILL_BYKK_RINGOFDARKNESS))) / 1000; print("bonusRate4 = "+bonusRate); if(sq_GetSkillLevel(obj, SKILL_BYKK_SACRIFICIALPACT) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_SACRIFICIALPACT, 1, sq_GetSkillLevel(obj, SKILL_BYKK_SACRIFICIALPACT))) / 1000; print("bonusRate5 = "+bonusRate); if(sq_GetSkillLevel(obj, SKILL_BYKK_UNHOLYAURA) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_UNHOLYAURA, 2, sq_GetSkillLevel(obj, SKILL_BYKK_UNHOLYAURA))) / 1000; print("bonusRate6 = "+bonusRate); obj.getVar("setSkillBonusRate").setInt(0, bonusRate.tointeger()); //sq_SetSkillAttackBonus(obj, bonusRate); } function onStartDungeon_NecroMancer_bykk(obj) { setSkillBonusRate_NecroMancer_bykk(obj); } //百鬼夜行 function checkExecutableSkill_DarkLure(obj) { if (!obj) return false; local size = obj.getVar("darklure_obj").get_obj_vector_size(); if(size > 0 && sq_GetSkill(obj, SKILL_BYKK_DARKLURE).isInCoolTime()){ local attackObj = obj.getVar("darklure_obj").get_obj_vector(0); if(attackObj){ local colObj = sq_GetCNRDObjectToCollisionObject(attackObj); colObj.removeAllTimeEvent(); if(sq_GetZPos(colObj) > 0) colObj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, ""); else colObj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, ""); } local state = obj.getState(); if(state == 0 || state == 14){ obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, false); } return true; } local isUse = obj.sq_IsUseSkill(SKILL_BYKK_DARKLURE); if (isUse){ obj.getVar("darklure_obj").clear_obj_vector(); obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_DARKLURE, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_DarkLure(obj) { if (!obj) return false; return true; } function onSetState_DarkLure(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: local Ani = obj.sq_GetThrowChargeAni(0); obj.setCurrentAnimation(Ani); break; case 1: local Ani = obj.sq_GetThrowShootAni(0); obj.setCurrentAnimation(Ani); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); } function onEndCurrentAni_DarkLure(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_BYKK_DARKLURE, STATE_PRIORITY_AUTO, true); break; case 1: local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKLURE, -1, 0, 1.0) + 100; local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_DARKLURE); local lifeTime = sq_GetIntData(obj, SKILL_BYKK_DARKLURE, 0); local hitTime = sq_GetIntData(obj, SKILL_BYKK_DARKLURE, 2); local increaseRate = sq_GetLevelData(obj, SKILL_BYKK_DARKLURE, 2, skillLevel); local increaseRate_cur = sq_GetLevelData(obj, SKILL_BYKK_DARKLURE, 3, skillLevel); local sizeRate = sq_GetLevelData(obj, SKILL_BYKK_DARKLURE, 7, skillLevel); local autoTime = sq_GetLevelData(obj, SKILL_BYKK_DARKLURE, 5, skillLevel) * 10; createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,75,0,50,obj.getDirection(),2,SKILL_BYKK_DARKLURE,1,totalDamage,lifeTime,hitTime,increaseRate,increaseRate_cur,sizeRate,autoTime,0); obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_DarkLure(obj) { if(!obj) return; } function onKeyFrameFlag_DarkLure(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_DarkLure(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_DarkLure(obj, new_state) { if(!obj) return; } //死灵之怨 function checkExecutableSkill_BlameOfDead(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_BYKK_BLAMEOFDEAD); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_BLAMEOFDEAD, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_BlameOfDead(obj) { if (!obj) return false; return true; } function onSetState_BlameOfDead(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(ANI_BYKK_BLAMEOFDEAD); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); } function onEndCurrentAni_BlameOfDead(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_BlameOfDead(obj) { if(!obj) return; } function onKeyFrameFlag_BlameOfDead(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 1: local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_BLAMEOFDEAD, -1, 0, 1.0) + 100; local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_BLAMEOFDEAD); local lifeTime = sq_GetLevelData(obj, SKILL_BYKK_BLAMEOFDEAD, 6, skillLevel); local hitMax = sq_GetIntData(obj, SKILL_BYKK_BLAMEOFDEAD, 1); local sizeRate = sq_GetIntData(obj, SKILL_BYKK_BLAMEOFDEAD, 0) + 30; createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,0,0,0,obj.getDirection(),2,SKILL_BYKK_BLAMEOFDEAD,1,totalDamage,lifeTime,hitMax,sizeRate,0,0,0,0); break; } return true; } function onTimeEvent_BlameOfDead(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_BlameOfDead(obj, new_state) { if(!obj) return; } //降临:暴君巴拉克 function checkExecutableSkill_ApportBallacre(obj) { if (!obj) return false; local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); colObj.setTimeEvent(1, 1000, 1, true); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_BALLACRE_TOCHR); local state = obj.getState(); if(state == STATE_STAND || state == STATE_DASH){ obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true); } return false; } local isUse = obj.sq_IsUseSkill(SKILL_BYKK_APPORTBALLACRE); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_APPORTBALLACRE, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_ApportBallacre(obj) { if (!obj) return false; if(obj.getVar("ballacreObj").get_obj_vector_size() > 0) return false; return true; } function onSetState_ApportBallacre(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRECAST); break; case 1: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_PIERCE); break; case 2: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_SWINGRL); break; case 3: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_HAND_PIERCE); break; case 4: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_SWING_DOWN); break; case 5: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_DASH_UPPER); break; } if(subState > 0){ obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(0, 0); local speedRate = 100.0; switch(subState){ case 1: speedRate = 10000.0 / delay.tofloat(); break; case 2: speedRate = 12000.0 / delay.tofloat(); break; case 3: speedRate = 10000.0 / delay.tofloat(); break; case 4: speedRate = 20000.0 / delay.tofloat(); break; case 5: speedRate = 20000.0 / delay.tofloat(); break; } local attackState = [22,23,24,25,27]; local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); colObj.getVar("setSpeedRate").setFloat(0, speedRate); colObj.addSetStatePacket(attackState[subState - 1], null, STATE_PRIORITY_IGNORE_FORCE, false, ""); } } } function onEndCurrentAni_ApportBallacre(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: case 1: case 2: case 3: case 4: case 5: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProc_ApportBallacre(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 4: local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); if(colObj.getState() >= 26) break; } case 1: case 2: case 3: if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL) && sq_IsKeyDown(OPTION_HOTKEY_JUMP, ENUM_SUBKEY_TYPE_ALL)){ obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_IntVectPush(1); obj.sq_IntVectPush(200); obj.sq_AddSetStatePacket(STATE_JUMP, STATE_PRIORITY_IGNORE_FORCE, true); } local startFrame = [5, 5, 8, 5]; local frameIndex = sq_GetCurrentFrameIndex(obj); if(frameIndex >= startFrame[subState - 1]){ sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true); if(sq_IsEnterCommand(obj, E_ATTACK_COMMAND)){ obj.sq_IntVectClear(); if(subState == 4) obj.sq_IntVectPush(1); else obj.sq_IntVectPush(subState + 1); obj.sq_AddSetStatePacket(STATE_BYKK_APPORTBALLACRE, STATE_PRIORITY_AUTO, true); } } break; } } function onKeyFrameFlag_ApportBallacre(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 101: setBallacreSkillEffet_bykk(obj); break; } return true; } function onTimeEvent_ApportBallacre(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_ApportBallacre(obj, new_state) { if(!obj) return; } function setBallacreSkillEffet_bykk(obj) { local size = obj.getVar("ballacreObj").get_obj_vector_size(); if(size > 0){ for(local i = 0; i < size; i++){ local aObj = obj.getVar("ballacreObj").get_obj_vector(i); if(aObj) aObj.setValid(false); } } obj.getVar("ballacreObj").clear_obj_vector(); obj.sq_PlaySound("R_TF_APPORT_BALLACRE"); obj.sq_PlaySound("BAL_SUMMON"); local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_APPORTBALLACRE); local phyDefense = sq_GetLevelData(obj, SKILL_BYKK_APPORTBALLACRE, 3, skillLevel); local mglDefense = sq_GetLevelData(obj, SKILL_BYKK_APPORTBALLACRE, 4, skillLevel); local darkTol = sq_GetIntData(obj, SKILL_BYKK_APPORTBALLACRE, 2); local lightTol = sq_GetIntData(obj, SKILL_BYKK_APPORTBALLACRE, 3); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_BALLACRE_TOCHR); local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, APDPATH_BALLACRE_TOCHR, true); AddAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_BYKK_APPORTBALLACRE, skillLevel); CNSquirrelAppendage.sq_Append(AddAppendage, obj, obj, true); local change_appendage = AddAppendage.sq_getChangeStatus("apportballacre"); if(!change_appendage) change_appendage = AddAppendage.sq_AddChangeStatus("apportballacre", obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_DEFENSE, true, (phyDefense * 0.1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_DEFENSE , true, (mglDefense * 0.1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_ELEMENT_TOLERANCE_DARK, false, (darkTol).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_ELEMENT_TOLERANCE_LIGHT, false, (lightTol * -1).tofloat()); } createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,-25,-1,0,obj.getDirection(),2,SKILL_BYKK_APPORTBALLACRE,1,0,0,0,0,0,0,0,0); } function getAttackAni_Thief_necromancer(obj, index) { local animation = obj.sq_GetAttackAni(index); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)){ local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); if(colObj.getState() >= 25) return animation; } switch(index){ case 0: animation = obj.sq_GetCustomAni(ANI_BYKK_BALLACRE_PIERCE); break; case 1: animation = obj.sq_GetCustomAni(ANI_BYKK_BALLACRE_SWINGRL); break; case 2: animation = obj.sq_GetCustomAni(ANI_BYKK_BALLACRE_HAND_PIERCE); break; case 3: animation = obj.sq_GetCustomAni(ANI_BYKK_BALLACRE_SWING_DOWN); break; } } return animation; } function getDashAttackAni_Thief_necromancer(obj) { local animation = obj.sq_GetDashAttackAni(); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR) && !sq_GetSkill(obj, SKILL_BYKK_GRABCOLLAR).isInCoolTime()){ animation = obj.sq_GetCustomAni(ANI_BYKK_BALLACRE_DASH_UPPER); } return animation; } function getJumpAttackAni_Thief_necromancer(obj) { local animation = obj.sq_GetJumpAttackAni(); return animation; } function getRestAni_Thief_necromancer(obj) { local animation = obj.sq_GetRestAni(); return animation; } function onSetState_attack_thief_necromancer(obj, state, datas, isResetTimer) { if(!obj) return; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)){ obj.getVar("ballacre_move").setInt(0, sq_GetXPos(obj)); local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); local state = colObj.getState(); if(state >= 26) return; } local attackIndex = obj.sq_GetVectorData(datas, 0); obj.sq_IntVectClear(); switch(attackIndex){ case 0: obj.sq_IntVectPush(1); break; case 1: obj.sq_IntVectPush(2); break; case 2: obj.sq_IntVectPush(3); break; case 3: obj.sq_IntVectPush(4); break; } obj.sq_AddSetStatePacket(STATE_BYKK_APPORTBALLACRE, STATE_PRIORITY_IGNORE_FORCE, true); } } function onAfterSetState_attack_thief_necromancer(obj, state, datas, isResetTimer) { if(!obj) return; // if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)){ // local attackIndex = obj.sq_GetVectorData(datas, 0); // if(attackIndex == 0){ // obj.sq_IntVectClear(); // obj.sq_IntVectPush(1); // obj.sq_AddSetStatePacket(STATE_BYKK_APPORTBALLACRE, STATE_PRIORITY_IGNORE_FORCE, true); // } // // if(attackIndex > 3){ // // obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true); // // return; // // } // // obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 0.75, 0.75); // // local currentAni = obj.getCurrentAnimation(); // // local delay = currentAni.getDelaySum(0, 0); // // local speedRate = 100.0; // // switch(attackIndex){ // // case 0: speedRate = 10000.0 / delay.tofloat(); break; // // case 1: speedRate = 12000.0 / delay.tofloat(); break; // // case 2: speedRate = 10000.0 / delay.tofloat(); break; // // case 3: speedRate = 20000.0 / delay.tofloat(); break; // // } // // print("attackIndex = "+attackIndex+",speedRate = "+speedRate); // // local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); // // obj.getVar("ballacre_move").setInt(0, sq_GetXPos(obj)); // // if(ballacreObj){ // // local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); // // if(colObj.getState() >= 25) return; // // colObj.getVar("setSpeedRate").setFloat(0, speedRate); // // switch(attackIndex){ // // case 0: colObj.addSetStatePacket(22, null, STATE_PRIORITY_IGNORE_FORCE, false, ""); break; // // case 1: colObj.addSetStatePacket(23, null, STATE_PRIORITY_IGNORE_FORCE, false, ""); break; // // case 2: colObj.addSetStatePacket(24, null, STATE_PRIORITY_IGNORE_FORCE, false, ""); break; // // case 3: colObj.addSetStatePacket(25, null, STATE_PRIORITY_IGNORE_FORCE, false, ""); break; // // } // // } // } } function onKeyFrameFlag_attack_thief_necromancer(obj, flagIndex) {} function onProc_attack_thief_necromancer(obj) { if(!obj) return; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)){ sq_setCurrentAxisPos(obj, 0, obj.getVar("ballacre_move").getInt(0)); } } function onSetState_dashattack_thief_necromancer(obj, state, datas, isResetTimer) { if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)){ if(!sq_GetSkill(obj, SKILL_BYKK_GRABCOLLAR).isInCoolTime()){ obj.startSkillCoolTime(SKILL_BYKK_GRABCOLLAR, sq_GetSkillLevel(obj, SKILL_BYKK_GRABCOLLAR), -1); obj.sq_IntVectClear(); obj.sq_IntVectPush(5); obj.sq_AddSetStatePacket(STATE_BYKK_APPORTBALLACRE, STATE_PRIORITY_IGNORE_FORCE, true); } } } function onAfterSetState_dashattack_thief_necromancer(obj, state, datas, isResetTimer) { if(!obj) return; // if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)){ // obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 0.5, 0.5); // local currentAni = obj.getCurrentAnimation(); // local delay = currentAni.getDelaySum(0, 0); // local speedRate = 10000.0 / delay.tofloat(); // print("delay = "+currentAni.getDelaySum(false)); // obj.getVar("ballacre_speedRate").setFloat(4, speedRate); // } } function onProcCon_dashattack_thief_necromancer(obj) { if(!obj) return; } function onKeyFrameFlag_dashattack_thief_necromancer(obj, flagIndex) {} function onSetState_jumpattack_thief_necromancer(obj, state, datas, isResetTimer) { if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)){ local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); if(colObj.getState() != 26) colObj.addSetStatePacket(26, null, STATE_PRIORITY_IGNORE_FORCE, false, ""); } } } function onAfterSetState_jumpattack_thief_necromancer(obj, state, datas, isResetTimer) {} function onKeyFrameFlag_jumpattack_thief_necromancer(obj, flagIndex) {} //吸魂暗劲波 function checkExecutableSkill_NicolasBlackWave(obj) { if (!obj) return false; local size = obj.getVar("NicolasObj").get_obj_vector_size(); if(size < 1) return false; local isUse = obj.sq_IsUseSkill(SKILL_BYKK_NICOLASBLACKWAVE); if (isUse){ obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_NICOLASBLACKWAVE); local nicolasObj = obj.getVar("NicolasObj").get_obj_vector(0); if(nicolasObj){ local activeObj = sq_GetCNRDObjectToActiveObject(nicolasObj); monsterattack_Thief_Necromancer_ksk(activeObj,3); } local state = obj.getState(); switch(state){ case STATE_STAND: case STATE_DASH: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true); break; } return true; } return false; } function checkCommandEnable_NicolasBlackWave(obj) { if (!obj) return false; return true; } function onSetState_NicolasBlackWave(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(109); break; case 1: obj.sq_SetCurrentAnimation(110); break; } } function onEndCurrentAni_NicolasBlackWave(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_AUTO, true); break; case 1: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_NicolasBlackWave(obj) { if(!obj) return; } function onKeyFrameFlag_NicolasBlackWave(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_NicolasBlackWave(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_NicolasBlackWave(obj, new_state) { if(!obj) return; } //巴拉克的野心 function checkExecutableSkill_AmbitionOfBallacre(obj) { if (!obj) return false; local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); if(colObj.getState() > 25){ local state = obj.getState(); if(state == STATE_STAND || state == STATE_DASH){ obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true); return false; } } } local isUse = obj.sq_IsUseSkill(SKILL_BYKK_AMBITIONOFBALLACRE); if (isUse){ obj.getVar("ambitionObj").clear_obj_vector(); obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_AMBITIONOFBALLACRE, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_AmbitionOfBallacre(obj) { if (!obj) return false; return true; } function onSetState_AmbitionOfBallacre(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_HAND_APPEAR); break; case 1: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_HAND_GRAB); break; case 2: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_HAND_APPEAR); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 0.75, 0.75); local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(0, 0); local speedRate = 8000.0 / delay.tofloat(); switch(subState){ case 0: local delayTime = currentAni.getDelaySum(0, 6) + sq_GetIntData(obj, SKILL_BYKK_AMBITIONOFBALLACRE, 1); if(sq_GetSkillLevel(obj, SKILL_BYKK_SACRIFICIALPACT) > 0) delayTime = currentAni.getDelaySum(0, 6) + 200; local delay = (delayTime.tofloat() / speedRate * 100.0).tointeger(); obj.setTimeEvent(1, delay, 1, false); break; case 1: local ambitionObj = obj.getVar("ambitionObj").get_obj_vector(0); if(ambitionObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ambitionObj); colObj.getVar("setSpeedRate").setFloat(0, speedRate); colObj.addSetStatePacket(21, null, STATE_PRIORITY_IGNORE_FORCE, false, ""); } break; case 2: local delay = (740.0 / speedRate * 100.0).tointeger(); obj.setTimeEvent(2, delay, 1, false); break; } local attackState = [31, 32, 33]; local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); colObj.getVar("setSpeedRate").setFloat(0, speedRate); colObj.addSetStatePacket(attackState[subState], null, STATE_PRIORITY_IGNORE_FORCE, false, ""); } } function onEndCurrentAni_AmbitionOfBallacre(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_BYKK_AMBITIONOFBALLACRE, STATE_PRIORITY_AUTO, true); break; case 1: case 2: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_AmbitionOfBallacre(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: if(sq_GetCurrentFrameIndex(obj) == 7 && obj.isExistTimeEvent(1)){ obj.setSkillCommandEnable(SKILL_BYKK_AMBITIONOFBALLACRE, true); local b_useskill = obj.sq_IsEnterSkill(SKILL_BYKK_AMBITIONOFBALLACRE); if(b_useskill != -1){ obj.stopTimeEvent(1); obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_BYKK_AMBITIONOFBALLACRE, STATE_PRIORITY_AUTO, true); break; } } break; } } function onKeyFrameFlag_AmbitionOfBallacre(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_AmbitionOfBallacre(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_BYKK_AMBITIONOFBALLACRE, STATE_PRIORITY_AUTO, true); break; case 2: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onEndState_AmbitionOfBallacre(obj, new_state) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 1: if(new_state != STATE_BYKK_AMBITIONOFBALLACRE){ local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); colObj.addSetStatePacket(21, null, STATE_PRIORITY_IGNORE_FORCE, false, ""); } } break; } } //暗击拳 function checkExecutableSkill_Grabcollar(obj) { if (!obj) return false; // local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CROSSOFPUNISHMENT); // if (isUse){ // obj.sq_IntVectClear(); // obj.sq_IntVectPush(0); // obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_IGNORE_FORCE, true); // return true; // } return false; } function checkCommandEnable_Grabcollar(obj) { if (!obj) return false; return true; } function onSetState_Grabcollar(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(109); break; case 1: obj.sq_SetCurrentAnimation(110); break; } } function onEndCurrentAni_Grabcollar(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_AUTO, true); break; case 1: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_Grabcollar(obj) { if(!obj) return; } function onKeyFrameFlag_Grabcollar(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_Grabcollar(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_Grabcollar(obj, new_state) { if(!obj) return; } //杀戮乱舞 function checkExecutableSkill_Madnessballacre(obj) { if (!obj) return false; // local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CROSSOFPUNISHMENT); // if (isUse){ // obj.sq_IntVectClear(); // obj.sq_IntVectPush(0); // obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_IGNORE_FORCE, true); // return true; // } return false; } function checkCommandEnable_Madnessballacre(obj) { if (!obj) return false; return true; } function onSetState_Madnessballacre(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(109); break; case 1: obj.sq_SetCurrentAnimation(110); break; } } function onEndCurrentAni_Madnessballacre(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_AUTO, true); break; case 1: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_Madnessballacre(obj) { if(!obj) return; } function onKeyFrameFlag_Madnessballacre(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_Madnessballacre(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_Madnessballacre(obj, new_state) { if(!obj) return; } //巴拉克强击 function checkExecutableSkill_Ballacrestrongattack(obj) { if (!obj) return false; // local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CROSSOFPUNISHMENT); // if (isUse){ // obj.sq_IntVectClear(); // obj.sq_IntVectPush(0); // obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_IGNORE_FORCE, true); // return true; // } return false; } function checkCommandEnable_Ballacrestrongattack(obj) { if (!obj) return false; return true; } function onSetState_Ballacrestrongattack(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(109); break; case 1: obj.sq_SetCurrentAnimation(110); break; } } function onEndCurrentAni_Ballacrestrongattack(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_AUTO, true); break; case 1: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_Ballacrestrongattack(obj) { if(!obj) return; } function onKeyFrameFlag_Ballacrestrongattack(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_Ballacrestrongattack(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_Ballacrestrongattack(obj, new_state) { if(!obj) return; } //降临:僵尸莱迪亚 function checkExecutableSkill_Livingdead(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_BYKK_LIVINGDEAD); if (isUse){ obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_LIVINGDEAD); obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_LIVINGDEAD, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_Livingdead(obj) { if (!obj) return false; return true; } function onSetState_Livingdead(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(ANI_BYKK_LIVINGDEAD); break; } } function onEndCurrentAni_Livingdead(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_Livingdead(obj) { if(!obj) return; } function onKeyFrameFlag_Livingdead(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 0: if(false){//CP武器效果 createLivingDeadExplosion(obj); break; } local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_LIVINGDEAD, -1, 0, 1.0) + 100; local lifeTime = sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 2); local hitTime = sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 0); local sizeRate = 100; local addSizeRate = sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 8); local increaseRate = sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 13); createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,50,0,0,obj.getDirection(),2,SKILL_BYKK_LIVINGDEAD,1,totalDamage,lifeTime,hitTime,sizeRate,increaseRate,addSizeRate,0,0); break; } return true; } function onTimeEvent_Livingdead(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_Livingdead(obj, new_state) { if(!obj) return; } function createLivingDeadExplosion(obj) { local currentAni = obj.getCurrentAnimation(); local speedRate = 10200 / currentAni.getDelaySum(0, 0); local bonusRate = (100 + sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 13)).tofloat() / 100.0; local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_LIVINGDEAD, -1, 0, bonusRate) + 100; local lifeTime = sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 2); local hitTime = sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 0); local hitCount = lifeTime / hitTime; totalDamage = totalDamage * hitCount * 45 / 100; local sizeRate = 100 + sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 8); createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,50,0,0,obj.getDirection(),2,SKILL_BYKK_LIVINGDEAD,3,totalDamage,sizeRate,speedRate,0,0,0,0,0); } //巴拉克的愤怒 function checkExecutableSkill_Guillotine(obj) { if (!obj) return false; local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); if(colObj.getState() > 25){ local state = obj.getState(); if(state == STATE_STAND || state == STATE_DASH){ obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true); return false; } } } local isUse = obj.sq_IsUseSkill(SKILL_BYKK_GUILLOTINE); if (isUse){ obj.sq_IntVectClear(); if(false){ obj.sq_IntVectPush(2); obj.sq_IntVectPush(1); } else obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_GUILLOTINE, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_Guillotine(obj) { if (!obj) return false; return true; } function onSetState_Guillotine(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_GUILLOTINE_START); break; case 1: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_GUILLOTINE_CHARGE); break; case 2: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_GUILLOTINE_FINISH); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 0.75, 0.75); local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(0, 0); local speedRate = 8000.0 / delay.tofloat(); local attackState = [34, 35, 36]; local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); colObj.getVar("setSpeedRate").setFloat(0, speedRate); if(subState == 2 && obj.sq_GetVectorData(datas, 1) > 0) colObj.getVar("guillotine_bool").setBool(0, true); else colObj.getVar("guillotine_bool").setBool(0, false); colObj.addSetStatePacket(attackState[subState], null, STATE_PRIORITY_IGNORE_FORCE, false, ""); } } function onEndCurrentAni_Guillotine(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: case 1: obj.sq_IntVectClear(); if(subState == 0 && sq_GetSkillLevel(obj, SKILL_BYKK_SACRIFICIALPACT) > 0) obj.sq_IntVectPush(2); else obj.sq_IntVectPush(subState + 1); obj.sq_AddSetStatePacket(STATE_BYKK_GUILLOTINE, STATE_PRIORITY_AUTO, true); break; case 2: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_Guillotine(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 1: obj.setSkillCommandEnable(SKILL_BYKK_GUILLOTINE,true); local b_useskill = obj.sq_IsEnterSkill(SKILL_BYKK_GUILLOTINE); if(b_useskill != -1){ obj.sq_IntVectClear(); obj.sq_IntVectPush(2); obj.sq_AddSetStatePacket(STATE_BYKK_GUILLOTINE, STATE_PRIORITY_AUTO, true); } break; } } function onKeyFrameFlag_Guillotine(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_Guillotine(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_Guillotine(obj, new_state) { if(!obj) return; } //千魂杀 function checkExecutableSkill_Phantomstrom(obj) { if (!obj) return false; local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); if(colObj.getState() > 25){ local state = obj.getState(); if(state == STATE_STAND || state == STATE_DASH){ obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true); return false; } } } local isUse = obj.sq_IsUseSkill(SKILL_BYKK_PHANTOMSTROM); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_PHANTOMSTROM, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_Phantomstrom(obj) { if (!obj) return false; return true; } function onSetState_Phantomstrom(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_PHANTOM_STROM); obj.sq_PlaySound("R_TF_ADESPHANTOM_03_A"); obj.sq_PlaySound("BALAC_FANTOM"); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 0.75, 0.75); local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(0, 0); local speedRate = 8000.0 / delay.tofloat(); local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); colObj.getVar("setSpeedRate").setFloat(0, speedRate); colObj.addSetStatePacket(37, null, STATE_PRIORITY_IGNORE_FORCE, false, ""); } } function onEndCurrentAni_Phantomstrom(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_PHANTOMSTROM); if(skillLevel >= 6){ local addLevel = sq_GetLevelData(obj, SKILL_BYKK_PHANTOMSTROM, 4, skillLevel); local addSkillLevelTime = sq_GetLevelData(obj, SKILL_BYKK_PHANTOMSTROM, 5, skillLevel); if(sq_GetSkillLevel(obj, SKILL_BYKK_SUMMONNICOLAS) > 0) obj.addSkillLevelAppendage(SKILL_BYKK_SUMMONNICOLAS, addLevel, addSkillLevelTime); } if(skillLevel >= 9){ local addLevel = sq_GetLevelData(obj, SKILL_BYKK_PHANTOMSTROM, 6, skillLevel); local addSkillLevelTime = sq_GetLevelData(obj, SKILL_BYKK_PHANTOMSTROM, 7, skillLevel); if(sq_GetSkillLevel(obj, SKILL_BYKK_APPORTBALLACRE) > 0) obj.addSkillLevelAppendage(SKILL_BYKK_APPORTBALLACRE, addLevel, addSkillLevelTime); } obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_Phantomstrom(obj) { if(!obj) return; } function onKeyFrameFlag_Phantomstrom(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_Phantomstrom(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_Phantomstrom(obj, new_state) { if(!obj) return; } //死灵之缚 function checkExecutableSkill_BlameOfDeadEx(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_BYKK_BLAMEOFDEADEX); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_BLAMEOFDEADEX, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_BlameOfDeadEx(obj) { if (!obj) return false; return true; } function onSetState_BlameOfDeadEx(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(ANI_BYKK_BLAMEOFDEADEX); obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); break; } } function onEndCurrentAni_BlameOfDeadEx(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_BlameOfDeadEx(obj) { if(!obj) return; } function onKeyFrameFlag_BlameOfDeadEx(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 1: break; case 2: if(false){ local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_BLAMEOFDEADEX); local lifeTime = sq_GetLevelData(obj, SKILL_BYKK_BLAMEOFDEADEX, 5, skillLevel); local hitTime = sq_GetLevelData(obj, SKILL_BYKK_BLAMEOFDEADEX, 4, skillLevel); local hitMax = lifeTime / hitTime; local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_BLAMEOFDEADEX, -1, 0, 1.0) + 100; local sizeRate = sq_GetIntData(obj, SKILL_BYKK_BLAMEOFDEADEX, 1); local skillLevel2 = sq_GetSkillLevel(obj, SKILL_BYKK_GRIMGRIMOIRE); if(skillLevel2 > 0) sizeRate = sizeRate * (100 + sq_GetLevelData(obj, SKILL_BYKK_GRIMGRIMOIRE, 11, skillLevel2)) / 100; local multiHit = (totalDamage * hitMax) * 18 / 100; local expHit = (totalDamage * hitMax) * 35 / 100; createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,200,0,0,obj.getDirection(),2,SKILL_BYKK_BLAMEOFDEADEX,2,multiHit,expHit,hitTime,sizeRate,0,0,0,0); } else{ local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_BLAMEOFDEADEX, -1, 0, 1.0) + 100; local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_BLAMEOFDEADEX); local lifeTime = sq_GetLevelData(obj, SKILL_BYKK_BLAMEOFDEADEX, 5, skillLevel); local hitTime = sq_GetLevelData(obj, SKILL_BYKK_BLAMEOFDEADEX, 4, skillLevel); local prob = sq_GetLevelData(obj, SKILL_BYKK_BLAMEOFDEADEX, 1, skillLevel) / 10; local sizeRate = sq_GetIntData(obj, SKILL_BYKK_BLAMEOFDEADEX, 1); local skillLevel2 = sq_GetSkillLevel(obj, SKILL_BYKK_GRIMGRIMOIRE); if(skillLevel2 > 0) sizeRate = sizeRate * (100 + sq_GetLevelData(obj, SKILL_BYKK_GRIMGRIMOIRE, 11, skillLevel2)) / 100; createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,200,0,0,obj.getDirection(),2,SKILL_BYKK_BLAMEOFDEADEX,1,totalDamage,lifeTime,hitTime,prob,sizeRate,0,0,0); } break; } return true; } function onTimeEvent_BlameOfDeadEx(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_BlameOfDeadEx(obj, new_state) { if(!obj) return; } //怨噬之沼 function checkExecutableSkill_Hatefulghost(obj) { if (!obj) return false; local attackObj = obj.getVar("hatefulGhostObj").get_obj_vector(0); if(attackObj){ local colObj = sq_GetCNRDObjectToCollisionObject(attackObj); if(!colObj.isExistTimeEvent(12)){ local state = obj.getState(); if(state == STATE_STAND || state == STATE_DASH){ obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true); } return false; } local objPhase = colObj.getVar("phaseSet").getInt(0); switch(objPhase){ case 1: obj.sq_IntVectClear(); obj.sq_IntVectPush(sq_getRandom(2,3)); obj.sq_AddSetStatePacket(STATE_BYKK_HATEFULGHOST, STATE_PRIORITY_IGNORE_FORCE, true); return false; break; case 2: obj.sq_IntVectClear(); obj.sq_IntVectPush(sq_getRandom(4,5)); obj.sq_AddSetStatePacket(STATE_BYKK_HATEFULGHOST, STATE_PRIORITY_IGNORE_FORCE, true); return false; break; } } local isUse = obj.sq_IsUseSkill(SKILL_BYKK_HATEFULGHOST); if (isUse){ obj.getVar("hatefulGhostObj").clear_obj_vector(); obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_HATEFULGHOST, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_Hatefulghost(obj) { if (!obj) return false; return true; } function onSetState_Hatefulghost(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(ANI_BYKK_HATEFULGHOSTSTAY); break; case 1: obj.sq_SetCurrentAnimation(ANI_BYKK_HATEFULGHOSTATTACK1_BODY); obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/2_necromancer_bykk/hatefulghost/character/hatefulghostattack1front_00.ani"), 0, 0); break; case 2: obj.sq_SetCurrentAnimation(ANI_BYKK_HATEFULGHOSTATTACK2A_BODY); obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/2_necromancer_bykk/hatefulghost/character/hatefulghostattack2afront_00.ani"), 0, 0); break; case 3: obj.sq_SetCurrentAnimation(ANI_BYKK_HATEFULGHOSTATTACK2B_BODY); obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/2_necromancer_bykk/hatefulghost/character/hatefulghostattack2afront_00.ani"), 0, 0); break; case 4: obj.sq_SetCurrentAnimation(ANI_BYKK_HATEFULGHOSTATTACK3A_BODY); obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/2_necromancer_bykk/hatefulghost/character/hatefulghostattack2bfront_00.ani"), 0, 0); break; case 5: obj.sq_SetCurrentAnimation(ANI_BYKK_HATEFULGHOSTATTACK3B_BODY); obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/2_necromancer_bykk/hatefulghost/character/hatefulghostattack3front_00.ani"), 0, 0); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); } function onEndCurrentAni_Hatefulghost(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(subState + 1); obj.sq_AddSetStatePacket(STATE_BYKK_HATEFULGHOST, STATE_PRIORITY_AUTO, true); break; case 1: case 2: case 3: case 4: case 5: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_Hatefulghost(obj) { if(!obj) return; } function onKeyFrameFlag_Hatefulghost(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 105: //[OFFSET] `create attack Front Effect` 0 0 0 //[OFFSET] `create attack Bottom Effect` 0 0 0 //[OFFSET] `create Hand Effect` 0 0 0 //[OFFSET] `create Hand bottom Effect` 2000 0 0 local totalDamage_1st = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_HATEFULGHOST, -1, 0, 1.0) + 100; local totalDamage_2nd = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_HATEFULGHOST, -1, 1, 1.0) + 100; local totalDamage_3th1 = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_HATEFULGHOST, -1, 2, 1.0) + 100; local totalDamage_3th2 = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_HATEFULGHOST, -1, 3, 1.0) + 100; local lifeTime = 20000; local sizeRate = sq_GetIntData(obj, SKILL_BYKK_HATEFULGHOST, 1); createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,150,0,0,obj.getDirection(),2,SKILL_BYKK_HATEFULGHOST,1,totalDamage_1st,totalDamage_2nd,totalDamage_3th1,totalDamage_3th2,lifeTime,sizeRate,0,0); break; case 106: sq_SetMyShake(obj, 3, 300); break; case 200: //[OFFSET] `create attack Front Effect` 0 0 0 local attackObj = obj.getVar("hatefulGhostObj").get_obj_vector(0); if(attackObj){ local colObj = sq_GetCNRDObjectToCollisionObject(attackObj); colObj.getVar("setState").setInt(0, 24); colObj.stopTimeEvent(12); colObj.getVar("move").setInt(0, sq_GetXPos(colObj)); colObj.getVar("move").setInt(1, sq_GetYPos(colObj)); colObj.setTimeEvent(13, 1, 50, true); } break; case 204: sq_SetMyShake(obj, 3, 300); break; case 211: //[OFFSET] `create attack Front Effect` 0 0 0 local attackObj = obj.getVar("hatefulGhostObj").get_obj_vector(0); if(attackObj){ local colObj = sq_GetCNRDObjectToCollisionObject(attackObj); colObj.getVar("setState").setInt(0, 25); colObj.stopTimeEvent(12); colObj.getVar("move").setInt(0, sq_GetXPos(colObj)); colObj.getVar("move").setInt(1, sq_GetYPos(colObj)); colObj.setTimeEvent(13, 1, 50, true); } break; case 217: sq_SetMyShake(obj, 3, 300); break; case 308: case 313: sq_SetMyShake(obj, 3, 300); //[OFFSET] `create attack Front Effect` 0 0 0 local attackObj = obj.getVar("hatefulGhostObj").get_obj_vector(0); if(attackObj){ local colObj = sq_GetCNRDObjectToCollisionObject(attackObj); colObj.getVar("setState").setInt(0, 27); colObj.stopTimeEvent(12); colObj.getVar("move").setInt(0, sq_GetXPos(colObj)); colObj.getVar("move").setInt(1, sq_GetYPos(colObj)); colObj.setTimeEvent(13, 1, 50, true); } break; } return true; } function onTimeEvent_Hatefulghost(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_Hatefulghost(obj, new_state) { if(!obj) return; } //暗黑蛛丝引 function checkExecutableSkill_Nicolasblackarachnia(obj) { if (!obj) return false; local size = obj.getVar("NicolasObj").get_obj_vector_size(); if(size < 1) return false; local isUse = obj.sq_IsUseSkill(SKILL_BYKK_NICOLASBLACKARACHNIA); if (isUse){ obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_NICOLASBLACKARACHNIA); local nicolasObj = obj.getVar("NicolasObj").get_obj_vector(0); if(nicolasObj){ local activeObj = sq_GetCNRDObjectToActiveObject(nicolasObj); local attackIndex = 9; if(false) attackIndex = 12; monsterattack_Thief_Necromancer_ksk(activeObj, attackIndex); } local state = obj.getState(); switch(state){ case STATE_STAND: case STATE_DASH: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true); break; } return true; } } function checkCommandEnable_Nicolasblackarachnia(obj) { if (!obj) return false; return true; } function onSetState_Nicolasblackarachnia(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(109); break; case 1: obj.sq_SetCurrentAnimation(110); break; } } function onEndCurrentAni_Nicolasblackarachnia(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_AUTO, true); break; case 1: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_Nicolasblackarachnia(obj) { if(!obj) return; } function onKeyFrameFlag_Nicolasblackarachnia(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_Nicolasblackarachnia(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_Nicolasblackarachnia(obj, new_state) { if(!obj) return; } //暴君极刑斩 function checkExecutableSkill_Executionerslash(obj) { if (!obj) return false; local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); if(colObj.getState() > 25){ local state = obj.getState(); if(state == STATE_STAND || state == STATE_DASH){ obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true); return false; } } } local isUse = obj.sq_IsUseSkill(SKILL_BYKK_EXECUTIONERSLASH); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_EXECUTIONERSLASH, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_Executionerslash(obj) { if (!obj) return false; return true; } function onSetState_Executionerslash(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: local Ani = obj.sq_GetThrowChargeAni(1); obj.setCurrentAnimation(Ani); break; case 1: local Ani = obj.sq_GetThrowShootAni(1); obj.setCurrentAnimation(Ani); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 0.75, 0.75); if(subState == 0){ local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(0, 0); local speedRate = 8000.0 / delay.tofloat(); local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); colObj.getVar("setSpeedRate").setFloat(0, speedRate); if(false) colObj.getVar("isStone_executionerslash").setBool(0, true); else colObj.getVar("isStone_executionerslash").setBool(0, true); colObj.addSetStatePacket(38, null, STATE_PRIORITY_IGNORE_FORCE, false, ""); } } } function onEndCurrentAni_Executionerslash(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_BYKK_EXECUTIONERSLASH, STATE_PRIORITY_AUTO, true); break; case 1: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_Executionerslash(obj) { if(!obj) return; } function onKeyFrameFlag_Executionerslash(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_Executionerslash(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_Executionerslash(obj, new_state) { if(!obj) return; } //亡者君临:巴拉克之戮 function checkExecutableSkill_Ballacreadvent(obj) { if (!obj) return false; local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); if(colObj.getState() > 25){ local state = obj.getState(); if(state == STATE_STAND || state == STATE_DASH){ obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true); return false; } } } local isUse = obj.sq_IsUseSkill(SKILL_BYKK_BALLACREADVENT); if (isUse){ obj.getVar("Ballacreadvent_Effect").clear_obj_vector(); obj.getVar("Ballacreadvent_Background").clear_obj_vector(); obj.getVar("Ballacreadvent_Attract").clear_obj_vector(); obj.getVar("Ballacreadvent_Tar").clear_obj_vector(); obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_BALLACREADVENT, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_Ballacreadvent(obj) { if (!obj) return false; return true; } function onSetState_Ballacreadvent(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: local Ani = obj.sq_GetThrowChargeAni(2); obj.setCurrentAnimation(Ani); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/ballacreadvent/casting/casting01_set01d01.ani"), 0, 0); break; case 1: local Ani = obj.sq_GetThrowShootAni(2); obj.setCurrentAnimation(Ani); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/ballacreadvent/casting/casting01_set02d01.ani"), 0, 0); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/ballacreadvent/casting/casting01_set02n01.ani"), 0, 0); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 0.75, 0.75); if(subState == 0){ local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(0, 0); local speedRate = 6000.0 / delay.tofloat(); local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0); if(ballacreObj){ local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj); colObj.getVar("setSpeedRate").setFloat(0, speedRate); colObj.addSetStatePacket(39, null, STATE_PRIORITY_IGNORE_FORCE, false, ""); local totalDamage_start = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_BALLACREADVENT, -1, 0, 1.0) + 100; local totalDamage_multihit = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_BALLACREADVENT, -1, 1, 1.0) + 100; local totalDamage_finish = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_BALLACREADVENT, -1, 2, 1.0) + 100; local hitMax = sq_GetIntData(obj, SKILL_BYKK_BALLACREADVENT, 18); speedRate = (speedRate * 100.0).tointeger(); createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,0,-1,0,obj.getDirection(),2,SKILL_BYKK_BALLACREADVENT,1,totalDamage_start,totalDamage_multihit,totalDamage_finish,hitMax,speedRate,0,0,0); } } else if(subState == 1){ local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(0, 1); obj.setTimeEvent(1, delay, 1, false); local aniPath = "character/thief/effect/animation/ballacreadvent/casting/casting02_groundn.ani"; createOnlyDrawObject_Theif_bykk(obj,aniPath,true,obj.getDirection(),sq_GetXPos(obj),sq_GetYPos(obj),0,ENUM_DRAWLAYER_BOTTOM); } } function onEndCurrentAni_Ballacreadvent(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_BYKK_BALLACREADVENT, STATE_PRIORITY_AUTO, true); break; case 1: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_Ballacreadvent(obj) { if(!obj) return; } function onKeyFrameFlag_Ballacreadvent(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_Ballacreadvent(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/2_necromancer_bykk/ballacreadvent/casting/casting01_set03n01.ani", 0, 0, 0); sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/2_necromancer_bykk/ballacreadvent/casting/casting01_set03n02.ani", 0, 0, 0); sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/2_necromancer_bykk/ballacreadvent/casting/casting01_set03d01.ani", 0, 1, 1); sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/2_necromancer_bykk/ballacreadvent/casting/casting01_set03d02.ani", 0, 1, 1); local aniPath = "character/thief/effect/animation/2_necromancer_bykk/ballacreadvent/casting/flooreffect_d01.ani"; local pooledObj = createOnlyDrawObject_Theif_bykk(obj,aniPath,true,obj.getDirection(),sq_GetXPos(obj),sq_GetYPos(obj),0,ENUM_DRAWLAYER_BOTTOM); obj.getVar("Ballacreadvent_Effect").push_obj_vector(pooledObj); break; } } function onEndState_Ballacreadvent(obj, new_state) { if(!obj) return; } //亡者之茧 function checkExecutableSkill_Coconofundead(obj) { if (!obj) return false; local attackObj = obj.getVar("coconofundeadObj").get_obj_vector(0); if(attackObj && attackObj.getState() != 25){ local colObj = sq_GetCNRDObjectToCollisionObject(attackObj); colObj.addSetStatePacket(25, null, STATE_PRIORITY_AUTO, false, ""); local size = obj.getVar("coconofundeadObj_b").get_obj_vector_size(); if(size > 0){ for(local i = 0; i < size; i++){ local effect = obj.getVar("coconofundeadObj_b").get_obj_vector(i); if(effect){ local colObj = sq_GetCNRDObjectToCollisionObject(effect); colObj.setTimeEvent(1, 1000, 1, true); } } } return false; } local isUse = obj.sq_IsUseSkill(SKILL_BYKK_COCONOFUNDEAD); if (isUse){ obj.getVar("coconofundeadObj").clear_obj_vector(); obj.getVar("coconofundeadObj_b").clear_obj_vector(); obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_BYKK_COCONOFUNDEAD, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_Coconofundead(obj) { if (!obj) return false; return true; } function onSetState_Coconofundead(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(ANI_BYKK_COCOONOFUNDEADSTART_BODY); obj.sq_PlaySound("R_TF_COCOON_UNDEAD"); break; } } function onEndCurrentAni_Coconofundead(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_Coconofundead(obj) { if(!obj) return; } function onKeyFrameFlag_Coconofundead(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 107: local aniPath = "character/thief/effect/animation/2_necromancer_bykk/cocoonofundead/cocoonofundeadstartbottom_00.ani"; createOnlyDrawObject_Theif_bykk(obj,aniPath,true,obj.getDirection(),sq_GetXPos(obj),sq_GetYPos(obj),0,ENUM_DRAWLAYER_BOTTOM); break; case 108: //[OFFSET] `start attraction` 170 0 0 local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_COCONOFUNDEAD, -1, 0, 1.0) + 100; local totalDamage_exp = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_COCONOFUNDEAD, -1, 1, 1.0) + 100; local lifeTime = 4500; createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,170,0,0,obj.getDirection(),2,SKILL_BYKK_COCONOFUNDEAD,1,totalDamage,totalDamage_exp,lifeTime,0,0,0,0,0); break; case 112: //[OFFSET] `create cocoon side object` 170 0 0 break; case 116: //[OFFSET] `create cocoon Monster` 170 0 0 break; } return true; } function onTimeEvent_Coconofundead(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_Coconofundead(obj, new_state) { if(!obj) return; } function summonmonster_necromancer_bykk(obj,monsterobj,x,y,z,substate,monsterId,summontime,level,team) { if(obj.getVar("Summonnum").size_vector() == 0){ obj.getVar("Summonnum").clear_vector(); obj.getVar("Summonnum").push_vector(0); } sq_BinaryStartWrite(); sq_BinaryWriteByte(substate); sq_BinaryWriteDword(monsterId); sq_BinaryWriteWord(team); sq_BinaryWriteWord(level); sq_BinaryWriteWord(obj.getVar("Summonnum").get_vector(0)); sq_BinaryWriteDword(0); sq_BinaryWriteDword(summontime); sq_BinaryWriteWord(1); sq_BinaryWriteWord(1); sq_BinaryWriteWord(1); local destX_01 = 0; local destY_01 = 0; if(!isSameObject(obj, monsterobj)){ destX_01 = monsterobj.getXPos() - obj.getXPos(); destY_01 = monsterobj.getYPos() - obj.getYPos(); if(monsterobj.getDirection() == ENUM_DIRECTION_LEFT) destX_01 = obj.getXPos() - monsterobj.getXPos(); } sq_SendCreatePassiveObjectPacket(obj, 48024, 0, destX_01 + x, destY_01 + y, z, monsterobj.getDirection()); obj.getVar("Summonnum").set_vector(0,obj.getVar("Summonnum").get_vector(0) + 1); } function monsterattack_Thief_Necromancer_ksk(monsterObj,attackIndex) { if(!monsterObj) return; local activeObj = sq_GetCNRDObjectToCollisionObject(monsterObj); sq_IntVectorClear(sq_GetGlobalIntVector()); sq_IntVectorPush(sq_GetGlobalIntVector(),attackIndex); sq_AddSetStatePacketCollisionObject(activeObj, 8, sq_GetGlobalIntVector(), STATE_PRIORITY_USER, true); } function createOnlyDrawObject_Theif_bykk(obj,aniPath,isTrue,direction,x,y,z,drawlayer) { local ani = sq_CreateAnimation("",aniPath); local pooledObj = sq_CreatePooledObject(ani,isTrue); sq_SetCurrentDirection(pooledObj, direction); pooledObj.setCurrentPos(x,y,z); pooledObj = sq_SetEnumDrawLayer(pooledObj, drawlayer); sq_AddObject(obj, pooledObj, OBJECTTYPE_DRAWONLY, false); return pooledObj; } function createOnlyDrawObjectEX_Theif_bykk(obj,aniPath,isTrue,direction,x,y,z,drawlayer,sizeRateX,sizeRateY) { local ani = sq_CreateAnimation("",aniPath); local pooledObj = sq_CreatePooledObject(ani,isTrue); sq_SetCurrentDirection(pooledObj, direction); pooledObj.setCurrentPos(x,y,z); local currentAni = pooledObj.getCurrentAnimation(); sizeRateX = sizeRateX.tofloat() / 100.0; sizeRateY = sizeRateY.tofloat() / 100.0; currentAni.setImageRateFromOriginal(sizeRateX, sizeRateY); pooledObj = sq_SetEnumDrawLayer(pooledObj, drawlayer); sq_AddObject(obj, pooledObj, OBJECTTYPE_DRAWONLY, false); return pooledObj; } function createSkillPassive_Theif_bykk(obj,passiveObj,objnum,x,y,z,direction,job,skillIndex,subtype,pushv1,pushv2,pushv3,pushv4,pushv5,pushv6,pushv7,pushv8) { if(!obj || !passiveObj || obj.getState() == STATE_DIE) return; local destX_01 = 0; local destY_01 = 0; if(!isSameObject(obj, passiveObj)){ destX_01 = passiveObj.getXPos() - obj.getXPos(); destY_01 = passiveObj.getYPos() - obj.getYPos(); if(direction == ENUM_DIRECTION_LEFT) destX_01 = obj.getXPos() - passiveObj.getXPos(); } sq_BinaryStartWrite(); sq_BinaryWriteDword(job); sq_BinaryWriteDword(skillIndex); sq_BinaryWriteDword(subtype); sq_BinaryWriteDword(pushv1); sq_BinaryWriteDword(pushv2); sq_BinaryWriteDword(pushv3); sq_BinaryWriteDword(pushv4); sq_BinaryWriteDword(pushv5); sq_BinaryWriteDword(pushv6); sq_BinaryWriteDword(pushv7); sq_BinaryWriteDword(pushv8); sq_SendCreatePassiveObjectPacket(obj, objnum, 0, destX_01 + x, destY_01 + y, z, direction); }