//Battlemage_skill function setState_Mage_battlemage_bykk(obj, state, datas, isResetTimer) { if(state == 17){ switch(sq_GetVectorData(datas, 0)){ case 2: obj.sq_IntVectClear(); obj.sq_IntVectPush(20); obj.sq_AddSetStatePacket(SKILL_BYKK_PRECENCIA, STATE_PRIORITY_IGNORE_FORCE, true); break; } } else if(state == 8){ obj.sq_IntVectClear(); obj.sq_IntVectPush(10); obj.sq_IntVectPush(sq_GetVectorData(datas, 0)); obj.sq_AddSetStatePacket(SKILL_BYKK_PRECENCIA, STATE_PRIORITY_IGNORE_FORCE, true); } } function onEndCurrentAni_mage_buff_bykk(obj) { if(sq_getGrowType(obj) == 3){ local SkillIndex = obj.getBuffSkillIndex(); if(SkillIndex != 40) return; local skill_level = sq_GetSkillLevel(obj, SKILL_BYKK_CHASERAUTOCREATE); local apdPath = "character/mage/battlemage_bykk/ap/ap_chaserautocreate.nut"; local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, SKILL_BYKK_CHASERAUTOCREATE, false, apdPath, true); local buffTime = sq_GetLevelData(obj, SKILL_BYKK_CHASERAUTOCREATE, 0, skill_level); if(buffTime > 0) addAppendage.sq_SetValidTime(buffTime); addAppendage.setEnableIsBuff(true); addAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_BYKK_CHASERAUTOCREATE, skill_level); CNSquirrelAppendage.sq_Append(addAppendage, obj, obj, true); } } function createOnlyDrawObject_Battlemage_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_Battlemage_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 cearteSkillPassive_Battlemage_bykk(obj,passiveObj,objnum,x,y,z,direction,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(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); } function createBattlemageChaser(obj) { local baseX = [-50,-75,-100,-125,-150,-175,-200], baseZ = [50,75,50,75,50,75,50]; local count = obj.getVar("kksChaser").get_obj_vector_size() % 7; local ycount = (obj.getVar("kksChaser").get_obj_vector_size() / 7).tointeger(); local bX = -sq_getRandom(50,120), bY = -ycount, bZ = sq_getRandom(50,100) - (ycount * 3); local skill_level = sq_GetSkillLevel(obj, SKILL_BYKK_CHASER); local totalDamage = sq_GetLevelData(obj, SKILL_BYKK_CHASER, 1, skill_level); local sub = 0; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_chaserevolution.nut")) sub = 1; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) sub = 2; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) sub = 3; local sizeRateSet = 0; if(sq_getRandom(1, 1000) > 500) sizeRateSet = 1; local prob = sq_GetLevelData(obj, SKILL_BYKK_CHASERAUTOCREATE, 1, sq_GetSkillLevel(obj, SKILL_BYKK_CHASERAUTOCREATE)); if(sq_getRandom(1, 1000) > (1000 - prob) || sq_GetSkillLevel(obj, SKILL_BYKK_ARMONIA) > 0) sizeRateSet = 2; switch(sizeRateSet){ case 1: totalDamage = totalDamage * (1000 + sq_GetIntData(obj, SKILL_BYKK_CHASER, 7)) / 1000; break; case 2: totalDamage = totalDamage * (1000 + sq_GetIntData(obj, SKILL_BYKK_CHASER, 8)) / 1000; break; } local addRate = sq_GetLevelData(obj, SKILL_BYKK_CHASER, 23, skill_level); local addRate2 = sq_GetLevelData(obj, SKILL_BYKK_CHASER, 22, skill_level); if(addRate > 0 && sub >= 2) totalDamage = totalDamage * (100 + addRate) / 100; else if(addRate2 > 0 && sub == 1) totalDamage = totalDamage * (100 + addRate2) / 100; local lifeTime = sq_GetLevelData(obj, SKILL_BYKK_CHASER, 18, skill_level); local movespeedRate = sq_GetLevelData(obj, SKILL_BYKK_CHASER, 6, skill_level); local attackspeedRate = sq_GetLevelData(obj, SKILL_BYKK_CHASER, 5, skill_level); local decreasespeedLevel = sq_GetLevelData(obj, SKILL_BYKK_CHASER, 7, skill_level); local decreasespeedProb = sq_GetLevelData(obj, SKILL_BYKK_CHASER, 10, skill_level); local decreasespeedRate = sq_GetLevelData(obj, SKILL_BYKK_CHASER, 8, skill_level); local decreasespeedTime = sq_GetLevelData(obj, SKILL_BYKK_CHASER, 11, skill_level); local attackbonusRate = sq_GetLevelData(obj, SKILL_BYKK_CHASER, 2, skill_level); local criticaldamageRate = sq_GetLevelData(obj, SKILL_BYKK_CHASER, 3, skill_level); local buffTime = sq_GetLevelData(obj, SKILL_BYKK_CHASER, 0, skill_level); local expsizeRate = 100 + sq_GetLevelData(obj, SKILL_BYKK_CHASER, 19, skill_level); //print("expsizeRate = "+expsizeRate); sq_BinaryStartWrite(); sq_BinaryWriteDword(SKILL_BYKK_CHASER); sq_BinaryWriteDword(0); sq_BinaryWriteDword(totalDamage); sq_BinaryWriteDword(sub); sq_BinaryWriteDword(sizeRateSet); sq_BinaryWriteDword(lifeTime); sq_BinaryWriteDword(movespeedRate); sq_BinaryWriteDword(attackspeedRate); sq_BinaryWriteDword(decreasespeedLevel); sq_BinaryWriteDword(decreasespeedProb); sq_BinaryWriteDword(decreasespeedRate); sq_BinaryWriteDword(decreasespeedTime); sq_BinaryWriteDword(attackbonusRate); sq_BinaryWriteDword(criticaldamageRate); sq_BinaryWriteDword(buffTime); sq_BinaryWriteDword(bX); sq_BinaryWriteDword(bY); sq_BinaryWriteDword(bZ); sq_BinaryWriteDword(expsizeRate); sq_SendCreatePassiveObjectPacket(obj, PASSIVEOBJECT_BYKK_BATTLEMAGE, 0, bX, bY, bZ, obj.getDirection()); } function shootBattlemageChaser(obj, damager, number) { local activeObj = sq_GetCNRDObjectToActiveObject(damager); local size = obj.getVar("kksChaser").get_obj_vector_size(); if(size < number) number = size; for(local i = 0; i < number; i++){ local chaserObj = obj.getVar("kksChaser").get_obj_vector(i); if(chaserObj){ local colObj = sq_GetCNRDObjectToCollisionObject(chaserObj); if(colObj.getState() <= 21){ colObj.getVar("target").clear_obj_vector(); colObj.getVar("target").push_obj_vector(activeObj); if(colObj.isExistTimeEvent(10)) colObj.stopTimeEvent(10); if(colObj.isExistTimeEvent(11)) colObj.stopTimeEvent(11); if(colObj.isExistTimeEvent(12)) colObj.stopTimeEvent(12); colObj.addSetStatePacket(23, null, STATE_PRIORITY_AUTO, false, ""); obj.getVar("kksChaser").remove_obj_vector(colObj); } } } } function changeBattlemageChaser(obj, sub) { local size = obj.getVar("kksChaser").get_obj_vector_size(); if(size < 1) return; local addRate = sq_GetLevelData(obj, SKILL_BYKK_CHASER, 23, sq_GetSkillLevel(obj, SKILL_BYKK_CHASER)); for(local i = 0; i < size; i++){ local chaserObj = obj.getVar("kksChaser").get_obj_vector(i); if(chaserObj){ local colObj = sq_GetCNRDObjectToCollisionObject(chaserObj); if(colObj.getState() <= 21){ local lifeTime = colObj.getVar("custom").getInt(13); if(sub == 1) lifeTime = sq_GetLevelData(obj, SKILL_BYKK_CHASEREVOLUTION, 0, sq_GetSkillLevel(obj, SKILL_BYKK_CHASEREVOLUTION)); if(colObj.isExistTimeEvent(13)) colObj.stopTimeEvent(13); colObj.setTimeEvent(13, lifeTime, 1, false); colObj.getVar("custom").setInt(11, sub); if(addRate > 0){ switch(sub){ case 0: case 1: local totalDamage = colObj.getVar("custom").getInt(10); totalDamage = totalDamage / (100 + addRate) * 100; colObj.getVar("custom").setInt(10, totalDamage); break; case 2: case 3: local totalDamage = colObj.getVar("custom").getInt(10); totalDamage = totalDamage * (100 + addRate) / 100; colObj.getVar("custom").setInt(10, totalDamage); break; } } colObj.addSetStatePacket(20, null, STATE_PRIORITY_AUTO, false, ""); } } } } function setDamageRate_BattleMage_bykk(obj) { local bonusRate = 1000; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_chaser.nut") && sq_GetSkillLevel(obj, 174) <= 60) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_CHASER, 2, sq_GetSkillLevel(obj, SKILL_BYKK_CHASER))) / 1000; print("bonusRate1 = "+bonusRate); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_goddnessofwar.nut")) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_GODDNESSOFWAR, 1, sq_GetSkillLevel(obj, SKILL_BYKK_GODDNESSOFWAR))) / 1000; print("bonusRate2 = "+bonusRate); if(sq_GetSkillLevel(obj, SKILL_BYKK_ARMONIA) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_ARMONIA, 0, sq_GetSkillLevel(obj, SKILL_BYKK_ARMONIA))) / 1000; print("bonusRate3 = "+bonusRate); if(sq_GetSkillLevel(obj, SKILL_BYKK_COMBOMASTERY) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_COMBOMASTERY, 18, sq_GetSkillLevel(obj, SKILL_BYKK_COMBOMASTERY))) / 1000; print("bonusRate4 = "+bonusRate); if(sq_GetSkillLevel(obj, SKILL_BYKK_POLEMASTERY) > 0 && obj.getWeaponSubType() == 1) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_POLEMASTERY, 5, sq_GetSkillLevel(obj, SKILL_BYKK_POLEMASTERY))) / 1000; print("bonusRate = "+bonusRate); obj.getVar("setSkillBonusRate").setInt(0, bonusRate.tointeger()); //sq_SetSkillAttackBonus(obj, bonusRate); } function onEnd_appendage_battlemage_chaser_bykk(appendage) { local parentObj = appendage.getParent(); local sqrChr = sq_GetCNRDObjectToSQRCharacter(parentObj); setDamageRate_BattleMage_bykk(sqrChr); } function getAttackAni_Mage(obj, index) { if(!obj) return null; local ani = obj.sq_GetAttackAni(index); if(index == 4){ ani = obj.sq_getCustomAni(ANIMATION_ATTACK_SETCUSTOM); return ani; } if(sq_GetSkillLevel(obj, SKILL_BYKK_ENABLEFINISHATTACK) > 0) ani = obj.sq_getCustomAni(10 + index); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ local aniName = ["Attack1","Attack2","Attack3"]; print(aniName[index]); ani = getCurrentAnimation_precencia(obj, aniName[index], false, false); } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ local aniName = ["Attack1_00","Attack2_00","Attack3_00"]; print(aniName[index]); ani = getCurrentAnimation_precencia(obj, aniName[index], false, true); } return ani; } function getStayAni_Mage(obj) { if(!obj) return null; local ani = obj.sq_GetStayAni(); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ ani = getCurrentAnimation_precencia(obj, "Stay", false, false); return ani; } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ ani = sq_GetCustomAni(obj, 257); return ani; } return ani; } function getMoveAni_Mage(obj) { if(!obj) return null; local ani = obj.sq_GetMoveAni(); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ ani = getCurrentAnimation_precencia(obj, "Move", false, false); return ani; } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ // ani = getCurrentAnimation_precencia(obj, "Move", false, true); ani = sq_GetCustomAni(obj, 243); return ani; } return ani; } function getSitAni_Mage(obj) { if(!obj) return null; local ani = obj.sq_GetSitAni(); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ ani = getCurrentAnimation_precencia(obj, "Sit", false, false); return ani; } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ ani = getCurrentAnimation_precencia(obj, "Sit", false, true); return ani; } return ani; } function getDamageAni_Mage(obj, index) { if(!obj) return null; local ani = obj.sq_GetDamageAni(index); local aniName = ["Damage1","Damage2"]; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ ani = getCurrentAnimation_precencia(obj, aniName[index], false, false); return ani; } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ ani = getCurrentAnimation_precencia(obj, aniName[index], false, true); return ani; } return ani; } function getDownAni_Mage(obj) { if(!obj) return null; local ani = obj.sq_GetDownAni(); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ ani = getCurrentAnimation_precencia(obj, "Damage2", false, false); return ani; } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ ani = getCurrentAnimation_precencia(obj, "Down", false, true); return ani; } return ani; } function getOverturnAni_Mage(obj) { if(!obj) return null; local ani = obj.sq_GetOverturnAni(); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ ani = getCurrentAnimation_precencia(obj, "Overturn", false, false); return ani; } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ ani = getCurrentAnimation_precencia(obj, "Overturn", false, true); return ani; } return ani; } function getJumpAni_Mage(obj) { if(!obj) return null; local ani = obj.sq_GetJumpAni(); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ ani = getCurrentAnimation_precencia(obj, "Jump", false, false); return ani; } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ ani = getCurrentAnimation_precencia(obj, "Jump", false, true); return ani; } return ani; } function getJumpAttackAni_Mage(obj) { if(!obj) return null; local ani = obj.sq_GetJumpAttackAni(); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ ani = getCurrentAnimation_precencia(obj, "JumpAttack", false, false); return ani; } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ ani = getCurrentAnimation_precencia(obj, "Jumpattack_01", false, true); return ani; } return ani; } function getRestAni_Mage(obj) { if(!obj) return null; local ani = obj.sq_GetRestAni(); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ ani = getCurrentAnimation_precencia(obj, "Rest", false, false); return ani; } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ ani = getCurrentAnimation_precencia(obj, "Rest", false, true); return ani; } if(sq_getGrowType(obj) == 1) ani = getElementalMaster_RestAni(obj); return ani; } function getThrowChargeAni_Mage(obj, index) { if(!obj) return null; local ani = obj.sq_GetThrowChargeAni(index); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ local aniName = ["OneHandThrow1","TwoHandThrow1","Cast1","Wink1"]; ani = getCurrentAnimation_precencia(obj, aniName[index], false, false); return ani; } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ ani = getCurrentAnimation_precencia(obj, "Throw", false, true); return ani; } return ani; } function getThrowShootAni_Mage(obj, index) { if(!obj) return null; local ani = obj.sq_GetThrowShootAni(index); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ local aniName = ["OneHandThrow2","TwoHandThrow2","Cast2","Wink2"]; ani = getCurrentAnimation_precencia(obj, aniName[index], false, false); return ani; } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ ani = getCurrentAnimation_precencia(obj, "Throwshoot", false, true); return ani; } return ani; } function getDashAni_Mage(obj) { if(!obj) return null; local ani = obj.sq_GetDashAni(); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ ani = getCurrentAnimation_precencia(obj, "Dash", false, false); return ani; } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ ani = sq_GetCustomAni(obj, 224); return ani; } return ani; } function getDashAttackAni_Mage(obj) { if(!obj) return null; local ani = obj.sq_GetDashAttackAni(); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ ani = getCurrentAnimation_precencia(obj, "Dashattack", false, false); } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ ani = getCurrentAnimation_precencia(obj, "Dashattack_00", false, true); } return ani; } function getGetItemAni_Mage(obj) { if(!obj) return null; local ani = obj.sq_GetGetItemAni(); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ ani = getCurrentAnimation_precencia(obj, "GetItem", false, false); } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ ani = getCurrentAnimation_precencia(obj, "GetItem", false, true); } return ani; } function getBuffAni_Mage(obj) { if(!obj) return null; local ani = obj.sq_GetBuffAni(); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ ani = getCurrentAnimation_precencia(obj, "Buff", false, false); } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ ani = getCurrentAnimation_precencia(obj, "Buff", false, true); } return ani; } function getCurrentAnimation_precencia(obj, aniName, isRewind, isSeal) { local ani = null; local aniPath_01 = "character/mage/effect/animation/avatar/change_skin/", aName = "mage_precencia_off_" + aniName; if(isSeal == true){aniPath_01 = "character/mage/animation/battlemage_bykk/precencia/"; aName = "mage_precencia_on_" + aniName;} else{ local skill = sq_GetSkill(obj, SKILL_BYKK_ARMONIA); local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_ARMONIA); if(skillLevel > 0 && !skill.isSealFunction()){ aniPath_01 = "character/mage/effect/animation/battlemage_bykk/exticion_newbody/change_skin/"; aName = "mage_exticion_New_" + aniName; } } ani = obj.getVar().GetAnimationMap(aName, aniPath_01 + aniName + ".ani"); if(ani && isRewind) sq_Rewind(ani); return ani; } function onattack_Battlemage_k_k(obj, damager, bounding_box, is_stuck) { if(is_stuck) return; if(!obj || obj.getState() == STATE_DIE) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, CHASERLAUNCH_APDPATH)) CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, CHASERLAUNCH_APDPATH, true); local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, CHASERLAUNCH_APDPATH); if(addAppendage){ local buffTime = sq_GetLevelData(obj, SKILL_BYKK_CHASERLAUNCH, 0, sq_GetSkillLevel(obj, SKILL_BYKK_CHASERLAUNCH)); addAppendage.sq_SetValidTime(buffTime); addAppendage.getVar("target").clear_obj_vector(); addAppendage.getVar("target").push_obj_vector(damager); } } function procSkill_Battlemage_bykk(obj) { if(obj.getVar("kksChaser").get_obj_vector_size() < 1 || !CNSquirrelAppendage.sq_IsAppendAppendage(obj, CHASERLAUNCH_APDPATH)){ obj.setSkillCommandEnable(SKILL_BYKK_CHASERLAUNCH, false); return; } if(sq_GetSkill(obj, SKILL_BYKK_CHASERLAUNCH).isInCoolTime()) return; obj.setSkillCommandEnable(SKILL_BYKK_CHASERLAUNCH,true); local stateNow = obj.getState(); local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHASERLAUNCH); if(stateNow == STATE_BYKK_RANDOMPIERCESTRIKEEX || stateNow == SKILL_BYKK_RANDOMPIERCESTRIKE || stateNow == SKILL_BYKK_DRAGONSPEAR){ local number = sq_GetLevelData(obj, SKILL_BYKK_CHASERLAUNCH, 2, skillLevel); obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_CHASERLAUNCH); local bDownKey = obj.isDownSkillLastKey(); if(bDownKey){ local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, CHASERLAUNCH_APDPATH); if(addAppendage){ local targetObj = addAppendage.getVar("target").get_obj_vector(0); if(targetObj && targetObj.getState() != STATE_DIE){ shootBattlemageChaser(obj, targetObj, number); obj.startSkillCoolTime(SKILL_BYKK_CHASERLAUNCH, skillLevel, -1); } } } } else{ local b_useskill = obj.sq_IsEnterSkill(SKILL_BYKK_CHASERLAUNCH); if(b_useskill != -1){ local number = sq_GetLevelData(obj, SKILL_BYKK_CHASERLAUNCH, 2, skillLevel); local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, CHASERLAUNCH_APDPATH); if(addAppendage){ local targetObj = addAppendage.getVar("target").get_obj_vector(0); if(targetObj && targetObj.getState() != STATE_DIE){ shootBattlemageChaser(obj, targetObj, number); obj.startSkillCoolTime(SKILL_BYKK_CHASERLAUNCH, skillLevel, -1); } } } } } function onStart_appendage_battlemage_chaserautocreate(appendage) { local parentObj = appendage.getParent(); local sqrChr = sq_GetCNRDObjectToSQRCharacter(parentObj); local skill_level = sq_GetSkillLevel(sqrChr, SKILL_BYKK_CHASERAUTOCREATE); local createTime = sq_GetLevelData(sqrChr, SKILL_BYKK_CHASERAUTOCREATE, 5, skill_level); appendage.getVar("time").clear_timer_vector(); appendage.getVar("time").push_timer_vector(); local t_01 = appendage.getVar("time").get_timer_vector(0); t_01.setParameter(createTime, -1); t_01.resetInstant(0); return; } function proc_appendage_battlemage_chaserautocreate(appendage) { local parentObj = appendage.getParent(); local sqrChr = sq_GetCNRDObjectToSQRCharacter(parentObj); if(!sqrChr || sqrChr.getState() == STATE_DIE){ appendage.setValid(false); return; } local t_01 = appendage.getVar("time").get_timer_vector(0); local currentT = appendage.getTimer().Get(); if(t_01 && t_01.isOnEvent(currentT)){ local createMax = sq_GetIntData(sqrChr, SKILL_BYKK_CHASER, 0); if(sqrChr.getVar("kksChaser").get_obj_vector_size() < createMax) createBattlemageChaser(sqrChr); } return; } function onAttackParent_appendage_battlemage_chaserautocreate(appendage, realAttacker, damager, boundingBox, isStuck) { if(isStuck) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; local parentObj = appendage.getParent(); local sqrChr = sq_GetCNRDObjectToSQRCharacter(parentObj); if(!sqrChr || sqrChr.getState() == STATE_DIE){ appendage.setValid(false); return; } if(realAttacker.isObjectType(OBJECTTYPE_PASSIVE)){ if(realAttacker.getVar("skillIndex").getInt(0) == SKILL_BYKK_CHASER) return; } local skillLevel = sq_GetSkillLevel(sqrChr, SKILL_BYKK_CHASERAUTOCREATE); switch(sqrChr.getState()){ case SKILL_BYKK_PRECENCIA: switch(sqrChr.getSkillSubState()){ case 10: case 11: case 12: local prob = sq_GetLevelData(sqrChr, SKILL_BYKK_CHASERAUTOCREATE, 2, skillLevel); if(sq_getRandom(1,1000) > (1000 - prob)){ local createMax = sq_GetIntData(sqrChr, SKILL_BYKK_CHASER, 0); if(sqrChr.getVar("kksChaser").get_obj_vector_size() < createMax) createBattlemageChaser(sqrChr); } break; } break; default: local prob = sq_GetLevelData(sqrChr, SKILL_BYKK_CHASERAUTOCREATE, 3, skillLevel); if(sq_getRandom(1,1000) > (1000 - prob)){ local createMax = sq_GetIntData(sqrChr, SKILL_BYKK_CHASER, 0); if(sqrChr.getVar("kksChaser").get_obj_vector_size() < createMax) createBattlemageChaser(sqrChr); } break; } } function onEnd_appendage_battlemage_precenciaoff(appendage) { local spectrumAppendage = appendage.sq_GetOcularSpectrum("ocularSpectrum");//得到殘影 if(spectrumAppendage) spectrumAppendage.endCreateSpectrum();//清除 local parentObj = appendage.getParent(); local sqrChr = sq_GetCNRDObjectToSQRCharacter(parentObj); sqrChr.stopSound(2333);//停止光環聲音 local goddAppendage = CNSquirrelAppendage.sq_GetAppendage(sqrChr, "character/mage/battlemage_bykk/ap/ap_goddnessofwar.nut"); if(goddAppendage) goddAppendage.getVar().setBool(100, false); if(sqrChr.getState() == 0 || sqrChr.getState() == 8 || sqrChr.getState() == 14){ sqrChr.sq_IntVectClear(); sqrChr.sq_IntVectPush(1); sqrChr.sq_IntVectPush(0); sqrChr.sq_AddSetStatePacket(SKILL_BYKK_PRECENCIA, STATE_PRIORITY_USER, true); } } function onEnd_appendage_battlemage_precenciaon(appendage) { local spectrumAppendage = appendage.sq_GetOcularSpectrum("ocularSpectrum");//得到殘影 if(spectrumAppendage) spectrumAppendage.endCreateSpectrum();//清除 local parentObj = appendage.getParent(); local sqrChr = sq_GetCNRDObjectToSQRCharacter(parentObj); sqrChr.setObjectHeight(-1); sqrChr.stopSound(2333);//停止光環聲音 local goddAppendage = CNSquirrelAppendage.sq_GetAppendage(sqrChr, "character/mage/battlemage_bykk/ap/ap_goddnessofwar.nut"); if(goddAppendage) goddAppendage.getVar().setBool(100, false); if(sqrChr.getState() == 0 || sqrChr.getState() == 8 || sqrChr.getState() == 14){ sqrChr.sq_IntVectClear(); sqrChr.sq_IntVectPush(1); sqrChr.sq_IntVectPush(1); sqrChr.sq_AddSetStatePacket(SKILL_BYKK_PRECENCIA, STATE_PRIORITY_USER, true); } } function drawAppend_appendage_battlemage_precenciaoff(appendage, isOver, x, y, isFlip) { if(!appendage) return; if(!appendage.isValid()) return; local parentObj = appendage.getParent(); if(!parentObj || parentObj.getState() == STATE_DIE){ appendage.setValid(false); return; } if(appendage.getVar("setFail").getBool(0)){ local sqrChr = sq_GetCNRDObjectToSQRCharacter(parentObj); if(sq_GetIntData(sqrChr, SKILL_BYKK_PRECENCIA, 15) < 1){ appendage.setValid(false); return; } } local var = appendage.getVar(); local backAni = var.GetAnimationMap("precenciabackAni_01", "character/mage/effect/animation/avatar/avatarauraloopbot_eff_01.ani"); local backAni2 = var.GetAnimationMap("precenciabackAni_02", "character/mage/effect/animation/avatar/avataraurabody_eff_00.ani"); local frontAni = var.GetAnimationMap("precenciafrontAni_01", "character/mage/effect/animation/avatar/avatarauralooptop_eff_01.ani"); if (frontAni && isOver){ sq_AnimationProc(frontAni); sq_drawCurrentFrame(frontAni, x, y, isFlip); } else if(backAni && !isOver){ sq_AnimationProc(backAni); sq_AnimationProc(backAni2); sq_drawCurrentFrame(backAni, x, y, isFlip); sq_drawCurrentFrame(backAni2, x, y, isFlip); } return; } function drawAppend_appendage_battlemage_precenciaon(appendage, isOver, x, y, isFlip) { if(!appendage) return; if(!appendage.isValid()) return; local parentObj = appendage.getParent(); if(!parentObj || parentObj.getState() == STATE_DIE){ appendage.setValid(false); return; } if(appendage.getVar("setFail").getBool(0)){ local sqrChr = sq_GetCNRDObjectToSQRCharacter(parentObj); if(sq_GetIntData(sqrChr, SKILL_BYKK_PRECENCIA, 15) < 1){ appendage.setValid(false); return; } } local var = appendage.getVar(); local backAni = var.GetAnimationMap("precenciabackAni_01", "character/mage/effect/animation/avatar/avatarauraloopbot_eff_01.ani"); local backAni2 = var.GetAnimationMap("precenciabackAni_02", "character/mage/effect/animation/avatar/avataraurabody_eff_00.ani"); local frontAni = var.GetAnimationMap("precenciafrontAni_01", "character/mage/effect/animation/avatar/avatarauralooptop_eff_01.ani"); if (frontAni && isOver){ sq_AnimationProc(frontAni); sq_drawCurrentFrame(frontAni, x, y, isFlip); } else if(backAni && !isOver){ sq_AnimationProc(backAni); sq_AnimationProc(backAni2); sq_drawCurrentFrame(backAni, x, y, isFlip); sq_drawCurrentFrame(backAni2, x, y - 50, isFlip); } return; } function onEnd_appendage_battlemage_pokethrow(appendage) { if(!appendage) return; local parentObj = appendage.getParent(); if(!parentObj){ appendage.setValid(false); return; } } function drawAppend_appendage_battlemage_goddnessofwar(appendage, isOver, x, y, isFlip) { // local parentObj = appendage.getParent(); // local sqrChr = sq_GetCNRDObjectToSQRCharacter(parentObj); local var = appendage.getVar(); local frontAni = var.GetAnimationMap("godfrontAni_01", "character/mage/effect/animation/battlemage_bykk/goddnessofwar/goddnessofwar_loop.ani"); local frontAni2 = var.GetAnimationMap("godfrontAni_02", "character/mage/effect/animation/battlemage_bykk/goddnessofwar/goddnessofwar_loop_avatar.ani"); if (frontAni && isOver){ if(var.getBool(100)){ sq_AnimationProc(frontAni2); sq_drawCurrentFrame(frontAni2, x, y, isFlip); } else{ sq_AnimationProc(frontAni); sq_drawCurrentFrame(frontAni, x, y, isFlip); } } return; } function onEnd_appendage_battlemage_goddnessofwar(appendage) { local parentObj = appendage.getParent(); local sqrChr = sq_GetCNRDObjectToSQRCharacter(parentObj); setDamageRate_BattleMage_bykk(sqrChr); return; } function drawAppend_appendage_battlemage_randompiercestrikeex(appendage, isOver, x, y, isFlip) { local var = appendage.getVar(); local frontAni = var.GetAnimationMap("randompiercestrikeex_01", "character/mage/effect/animation/battlemage_bykk/randompiercestrikeex/talisman/holdeffect/hold_lightning.ani"); if (frontAni && isOver){ sq_AnimationProc(frontAni); sq_drawCurrentFrame(frontAni, x, y, isFlip); } return; } function onStart_appendage_battlemage_weaponmastery(appendage) { local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); local criticalRate_1 = sq_GetLevelData(obj, SKILL_BYKK_ENABLEFINISHATTACK, 2, sq_GetSkillLevel(obj, SKILL_BYKK_ENABLEFINISHATTACK)); local change_appendage = appendage.sq_getChangeStatus("enablefinishattack"); if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("enablefinishattack",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 100); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_PHYSICAL_CRITICAL_HIT_RATE, false, (criticalRate_1 * 0.1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_HIT_RATE, false, (criticalRate_1 * 0.1).tofloat()); } local weaponType = obj.getWeaponSubType(); switch(weaponType){ case 1: local skill_level = sq_GetSkillLevel(obj, SKILL_BYKK_POLEMASTERY); if(skill_level > 0){ local attackRate = sq_GetLevelData(obj, SKILL_BYKK_POLEMASTERY, 10, skill_level); local stuckRate = sq_GetLevelData(obj, SKILL_BYKK_POLEMASTERY, 6, skill_level); local cooltime = sq_GetIntData(obj, SKILL_BYKK_POLEMASTERY, 4) / 10; local change_appendage = appendage.sq_getChangeStatus("weaponMastery"); if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("weaponMastery",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, attackRate); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_ATTACK, true, (attackRate * 0.1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_STUCK, false, (stuckRate * -0.1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_COOLTIME_DECLINE, true, (cooltime * -1).tofloat()); } } break; case 0: local skill_level = sq_GetSkillLevel(obj, SKILL_BYKK_SPEARMASTERY); if(skill_level > 0){ local bonusRate = sq_GetLevelData(obj, SKILL_BYKK_SPEARMASTERY, 4, skill_level); local criticalRate = sq_GetLevelData(obj, SKILL_BYKK_SPEARMASTERY, 5, skill_level); local stuckRate = sq_GetLevelData(obj, SKILL_BYKK_SPEARMASTERY, 7, skill_level); local change_appendage = appendage.sq_getChangeStatus("weaponMastery"); if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("weaponMastery",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, bonusRate); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_ATTACK, true, (bonusRate * 0.1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_ATTACK, true, (bonusRate * 0.1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_PHYSICAL_CRITICAL_HIT_RATE, false, (criticalRate * 0.1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_STUCK, false, (stuckRate * -0.1).tofloat()); } } break; } return; } function onAttackParent_appendage_battlemage_weaponmastery(appendage, realAttacker, damager, boundingBox, isStuck) { if(!appendage) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; if(isStuck) return; local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); if(!obj || obj.getState() == STATE_DIE) return; if(realAttacker.isObjectType(OBJECTTYPE_PASSIVE)){ local colObj = sq_GetCNRDObjectToCollisionObject(realAttacker); if(colObj.getVar("skillIndex").getInt(0) == SKILL_BYKK_CHASER){ return; } } local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHASERLAUNCH); local isAutoFire = sq_GetLevelData(obj, SKILL_BYKK_CHASERLAUNCH, 5, skillLevel); if(isAutoFire > 0){ local number = sq_GetLevelData(obj, SKILL_BYKK_CHASERLAUNCH, 2, skillLevel); local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, CHASERLAUNCH_APDPATH); if(addAppendage){ local targetObj = addAppendage.getVar("target").get_obj_vector(0); if(targetObj && targetObj.getState() != STATE_DIE){ shootBattlemageChaser(obj, targetObj, number); } } } } function onStart_appendage_battlemage_multirole(appendage) { local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); local criticaldRate = sq_GetLevelData(obj, SKILL_BYKK_MULTIROLE, 0, sq_GetSkillLevel(obj, SKILL_BYKK_MULTIROLE)); local change_appendage = appendage.sq_getChangeStatus("multirole"); if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("multirole", obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 100); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_PHYSICAL_CRITICAL_DAMAGE_RATE, false, (criticaldRate * 0.1 / 0.667).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_DAMAGE_RATE, false, (criticaldRate * 0.1 / 0.667).tofloat()); } } function onStart_appendage_battlemage_combomastery(appendage) { local parentObj = appendage.getParent(); if(!parentObj){appendage.setValid(false); return;} local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_COMBOMASTERY); local phase1Count = sq_GetLevelData(obj, SKILL_BYKK_COMBOMASTERY, 30, skillLevel); local phase2Count = sq_GetLevelData(obj, SKILL_BYKK_COMBOMASTERY, 31, skillLevel); local phase3Count = sq_GetLevelData(obj, SKILL_BYKK_COMBOMASTERY, 32, skillLevel); local phase1attackSpeed = sq_GetLevelData(obj, SKILL_BYKK_COMBOMASTERY, 19, skillLevel); local phase1moveSpeed = sq_GetLevelData(obj, SKILL_BYKK_COMBOMASTERY, 20, skillLevel); local phase2attackSpeed = sq_GetLevelData(obj, SKILL_BYKK_COMBOMASTERY, 23, skillLevel); local phase2moveSpeed = sq_GetLevelData(obj, SKILL_BYKK_COMBOMASTERY, 24, skillLevel); local phase3attackSpeed = sq_GetLevelData(obj, SKILL_BYKK_COMBOMASTERY, 27, skillLevel); local phase3moveSpeed = sq_GetLevelData(obj, SKILL_BYKK_COMBOMASTERY, 28, skillLevel); appendage.getVar("custom").setInt(101, phase1Count); appendage.getVar("custom").setInt(102, phase2Count); appendage.getVar("custom").setInt(103, phase3Count); appendage.getVar("custom").setInt(104, phase1attackSpeed); appendage.getVar("custom").setInt(105, phase1moveSpeed); appendage.getVar("custom").setInt(106, phase2attackSpeed); appendage.getVar("custom").setInt(107, phase2moveSpeed); appendage.getVar("custom").setInt(108, phase3attackSpeed); appendage.getVar("custom").setInt(109, phase3moveSpeed); appendage.getVar("combomastery_phase").setInt(10, 0); appendage.getVar("combomastery_phase").setInt(11, 0); appendage.getVar("combomastery_count").setInt(10, 0); appendage.getVar("combomastery_time").clear_ct_vector(); appendage.getVar("combomastery_time").push_ct_vector(); obj.sq_AddSkillLoad(84, 62, 0, 500); } function proc_appendage_battlemage_combomastery(appendage) { local parentObj = appendage.getParent(); if(!parentObj){appendage.setValid(false); return;} local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); local timer = appendage.getVar("combomastery_time").get_ct_vector(0); if(!timer){ appendage.getVar("combomastery_time").clear_ct_vector(); appendage.getVar("combomastery_time").push_ct_vector(); return; } local currentT = timer.Get(); local combomTime = 1300 + sq_GetIntData(obj, SKILL_BYKK_COMBOINSTINCT, 0); if(currentT > combomTime){ if(appendage.getVar("combomastery_phase").getInt(10) >= 3 && (CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut") || CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut"))) return; timer.Reset(); timer.Start(10000,0); appendage.getVar("combomastery_count").setInt(10, 0); appendage.getVar("combomastery_phase").setInt(10, 0); appendage.getVar("combomastery_phase").setInt(11, 0); local change_appendage = appendage.sq_getChangeStatus("battlemage_combomastery"); if(change_appendage) change_appendage.clearParameter(); local loadSlot = obj.sq_GetSkillLoad(84); if(loadSlot){ local number = loadSlot.getRemainLoadNumber(); loadSlot.decreaseLoadCount(number); } } else{ local combomCount = appendage.getVar("combomastery_count").getInt(10); local phase1Count = appendage.getVar("custom").getInt(101); local phase2Count = appendage.getVar("custom").getInt(102); local phase3Count = appendage.getVar("custom").getInt(103); if(combomCount >= phase3Count) appendage.getVar("combomastery_phase").setInt(10, 3); else if(combomCount >= phase2Count) appendage.getVar("combomastery_phase").setInt(10, 2); else if(combomCount >= phase1Count) appendage.getVar("combomastery_phase").setInt(10, 1); if(appendage.getVar("combomastery_phase").getInt(10) != appendage.getVar("combomastery_phase").getInt(11)){ appendage.getVar("combomastery_phase").setInt(11, appendage.getVar("combomastery_phase").getInt(10)); local loadSlot = obj.sq_GetSkillLoad(84); if(loadSlot){ local number = loadSlot.getRemainLoadNumber(); loadSlot.decreaseLoadCount(number); loadSlot.increaseLoadCount(110 + appendage.getVar("combomastery_phase").getInt(10)); } local attackspeedRate = 0, movespeedRate = 0; switch(appendage.getVar("combomastery_phase").getInt(11)){ case 1: attackspeedRate = appendage.getVar("custom").getInt(104); movespeedRate = appendage.getVar("custom").getInt(105); break; case 2: attackspeedRate = appendage.getVar("custom").getInt(106); movespeedRate = appendage.getVar("custom").getInt(107); break; case 3: attackspeedRate = appendage.getVar("custom").getInt(108); movespeedRate = appendage.getVar("custom").getInt(109); break; } local change_appendage = appendage.sq_getChangeStatus("battlemage_combomastery"); if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("battlemage_combomastery",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(10, false, (attackspeedRate).tofloat()); change_appendage.addParameter(11, false, (movespeedRate).tofloat()); } } } } function onAttackParent_appendage_battlemage_combomastery(appendage, realAttacker, damager, boundingBox, isStuck) { if(isStuck) return; local parentObj = appendage.getParent(); if(!parentObj){appendage.setValid(false); return;} local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; appendage.getVar("combomastery_count").setInt(10, appendage.getVar("combomastery_count").getInt(10) + 1); local combomCount = appendage.getVar("combomastery_count").getInt(10); print("COMBOM = "+combomCount); local timer = appendage.getVar("combomastery_time").get_ct_vector(0); if(timer){ timer.Reset(); timer.Start(10000,0); } } function onStartDungeon_Battlemage_bykk(obj) { if(sq_GetSkillLevel(obj, SKILL_BYKK_ARMONIA) > 0){ local skill_level = sq_GetSkillLevel(obj, SKILL_BYKK_CHASERAUTOCREATE); local apdPath = "character/mage/battlemage_bykk/ap/ap_chaserautocreate.nut"; local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, SKILL_BYKK_CHASERAUTOCREATE, false, apdPath, true); local buffTime = sq_GetLevelData(obj, SKILL_BYKK_CHASERAUTOCREATE, 0, skill_level); if(buffTime > 0) addAppendage.sq_SetValidTime(buffTime); addAppendage.setEnableIsBuff(true); addAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_BYKK_CHASERAUTOCREATE, skill_level); CNSquirrelAppendage.sq_Append(addAppendage, obj, obj, true); } if(sq_GetSkillLevel(obj, SKILL_BYKK_COMBOMASTERY) > 0){ CNSquirrelAppendage.sq_AppendAppendage(obj, obj, SKILL_BYKK_CHASERAUTOCREATE, false, "character/mage/battlemage_bykk/ap/ap_battlemage_combomastery.nut", true); } if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut"); } if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut"); } setDamageRate_BattleMage_bykk(obj); } function procSkill_Battlemage(obj) { if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut") || CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ obj.setSkillCommandEnable(15, false); obj.setSkillCommandEnable(16, false); obj.setSkillCommandEnable(17, false); obj.setSkillCommandEnable(18, false); obj.setSkillCommandEnable(20, false); obj.setSkillCommandEnable(11, false); obj.setSkillCommandEnable(25, false); } if(obj.getVar("chaserClusterObj01").get_obj_vector_size() > 0){ if(obj.getState() != STATE_STAND || obj.getState() != STATE_DASH){ obj.setSkillCommandEnable(SKILL_BYKK_CHASERCLUSTER,true); local b_useskill = obj.sq_IsEnterSkill(SKILL_BYKK_CHASERCLUSTER); if(b_useskill != -1){ obj.sq_PlaySound("WZ_CHASER_EXPLOSION"); local attackObj = obj.getVar("chaserClusterObj01").get_obj_vector(0); if(attackObj){ local colObj = sq_GetCNRDObjectToCollisionObject(attackObj); if(colObj.getState() != 21) colObj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, ""); } local size = obj.getVar("chaserClusterObj02").get_obj_vector_size(); for(local i = 0; i < size; i++){ local effectObj = obj.getVar("chaserClusterObj02").get_obj_vector(i); if(effectObj){ local colObj = sq_GetCNRDObjectToCollisionObject(effectObj); if(colObj.isExistTimeEvent(0)) colObj.stopTimeEvent(0); if(colObj.getState() <= 21) colObj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, ""); } } } } } procSkill_Battlemage_bykk(obj); } function reset_battlemage_bykk(obj) { if(sq_GetSkillLevel(obj, SKILL_BYKK_ARMONIA) > 0){ if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_chaserautocreate.nut")){ local skill_level = sq_GetSkillLevel(obj, SKILL_BYKK_CHASERAUTOCREATE); local apdPath = "character/mage/battlemage_bykk/ap/ap_chaserautocreate.nut"; local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, SKILL_BYKK_CHASERAUTOCREATE, false, apdPath, true); local buffTime = sq_GetLevelData(obj, SKILL_BYKK_CHASERAUTOCREATE, 0, skill_level); if(buffTime > 0) addAppendage.sq_SetValidTime(buffTime); addAppendage.setEnableIsBuff(true); addAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_BYKK_CHASERAUTOCREATE, skill_level); CNSquirrelAppendage.sq_Append(addAppendage, obj, obj, true); } } if(sq_GetSkillLevel(obj, SKILL_BYKK_COMBOMASTERY) > 0){ if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_battlemage_combomastery.nut")) CNSquirrelAppendage.sq_AppendAppendage(obj, obj, SKILL_BYKK_CHASERAUTOCREATE, false, "character/mage/battlemage_bykk/ap/ap_battlemage_combomastery.nut", true); } } function setCustomData_po_battlemage_bykk(obj, receiveData) { if(!obj) return; local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter()); if(!sqrChr) return; local skillIndex = receiveData.readDword(); local subtype = receiveData.readDword(); obj.getVar("skillIndex").setInt(0, skillIndex); obj.getVar("subtype").setInt(0, subtype); switch(skillIndex){ case SKILL_BYKK_THRUST://龍牙 break; case SKILL_BYKK_CHASER://炫紋 if(sqrChr.getVar("kksChaser").get_obj_vector_size() < 0) sqrChr.getVar("kksChaser").clear_obj_vector(); if(!sqrChr.getVar("kksChaser").is_obj_vector(obj)) sqrChr.getVar("kksChaser").push_obj_vector(obj); obj.setMapFollowParent(sqrChr); obj.setMapFollowType(1); local totalDamage = receiveData.readDword(); local sub = receiveData.readDword(); local sizeRate = receiveData.readDword(); local lifeTime = receiveData.readDword(); local movespeedRate = receiveData.readDword(); local attackspeedRate = receiveData.readDword(); local decreasespeedLevel = receiveData.readDword(); local decreasespeedProb = receiveData.readDword(); local decreasespeedRate = receiveData.readDword(); local decreasespeedTime = receiveData.readDword(); local attackbonusRate = receiveData.readDword(); local criticaldamageRate = receiveData.readDword(); local buffTime = receiveData.readDword(); local baseX = receiveData.readDword(); local baseY = receiveData.readDword(); local baseZ = receiveData.readDword(); local expsizeRate = receiveData.readDword(); obj.getVar("custom").setInt(10, totalDamage); obj.getVar("custom").setInt(11, sub); obj.getVar("custom").setInt(12, sizeRate); obj.getVar("custom").setInt(13, lifeTime); obj.getVar("custom").setInt(14, baseX); obj.getVar("custom").setInt(15, baseY); obj.getVar("custom").setInt(16, baseZ); obj.getVar("custom").setInt(17, expsizeRate); obj.getVar("buff").setInt(10, movespeedRate); obj.getVar("buff").setInt(11, attackspeedRate); obj.getVar("buff").setInt(12, decreasespeedLevel); obj.getVar("buff").setInt(13, decreasespeedProb); obj.getVar("buff").setInt(14, decreasespeedRate); obj.getVar("buff").setInt(15, decreasespeedTime); obj.getVar("buff").setInt(16, attackbonusRate); obj.getVar("buff").setInt(17, criticaldamageRate); obj.getVar("buff").setInt(18, buffTime); obj.addSetStatePacket(20, null, STATE_PRIORITY_AUTO, false, ""); break; case SKILL_BYKK_CHASERSEXPLOSION://炫紋強壓 switch(subtype){ case 1: local delay = receiveData.readDword(); local ani = sq_CreateAnimation("","character/mage/effect/animation/battlemage_bykk/chasersexplosion/charge.ani"); obj.setCurrentAnimation(ani); obj.setTimeEvent(0, delay, 1, false); break; case 2:// local totalDamage = receiveData.readDword(); local sizeRate = receiveData.readDword(); local sub = receiveData.readDword(); local ani = sq_CreateAnimation("","passiveobject/battlemage_bykk/animation/chasersexplosion/floor.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 11)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local attackInfo = sq_GetCurrentAttackInfo(obj); sq_SetAddWeaponDamage(attackInfo, true); sq_ChangeDrawLayer(obj, ENUM_DRAWLAYER_BOTTOM); if(sub < 1) createOnlyDrawObjectEX_Battlemage_bykk(obj,"passiveobject/battlemage_bykk/animation/chasersexplosion/exp.ani",true,obj.getDirection(),sq_GetXPos(obj),sq_GetYPos(obj),sq_GetZPos(obj),ENUM_DRAWLAYER_NORMAL,sizeRate,sizeRate); local currentAni = obj.getCurrentAnimation(); sizeRate = sizeRate.tofloat() / 100.0; currentAni.setImageRateFromOriginal(sizeRate, sizeRate); currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); break; } break; case SKILL_BYKK_UPPERSWING://天擊 break; case SKILL_BYKK_SWING://碎霸 switch(subtype){ case 1: local sub = receiveData.readDword(); local totalDamage = receiveData.readDword(); local delay = receiveData.readDword(); local sizeRate = receiveData.readDword(); local speedRate = 5000 / delay; local aniPath = "passiveobject/battlemage_bykk/animation/swing/swingarmonia_shoot.ani" if(sub > 0) aniPath = "passiveobject/battlemage_bykk/animation/swing/swingarmonia_shoot_precencia.ani" local ani = sq_CreateAnimation("",aniPath); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 38)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local pAni = obj.getCurrentAnimation(); pAni.setSpeedRate(speedRate.tofloat()); local currentAni = obj.getCurrentAnimation(); sizeRate = sizeRate.tofloat() / 100.0; currentAni.setImageRateFromOriginal(sizeRate, sizeRate); currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); break; } break; case SKILL_BYKK_HANDSTRIKE://落花掌 switch(subtype){ case 1: local totalDamage = receiveData.readDword(); local group = receiveData.readDword(); local uniqueId = receiveData.readDword(); local targetObj = sq_GetObject(obj, group, uniqueId); if(targetObj){ obj.getVar("target").clear_obj_vector(); obj.getVar("target").push_obj_vector(targetObj); sq_moveWithParent(targetObj, obj); } sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 31)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local attackInfo = sq_GetCurrentAttackInfo(obj); sq_SetCurrentAttacknBackForce(attackInfo, 1500); obj.getVar("move").setInt(10, sq_GetXPos(obj)); obj.getVar("move").setInt(11, obj.getDirection()); obj.setTimeEvent(0, 50, -1, false); break; } break; case SKILL_BYKK_POKETHROW://圓舞棍 switch(subtype){ case 1: local totalDamage = receiveData.readDword(); local sizeRate = receiveData.readDword(); local ani = sq_CreateAnimation("","passiveobject/battlemage_bykk/animation/pokethrowsub1.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 14)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); sq_ChangeDrawLayer(obj, ENUM_DRAWLAYER_BOTTOM); sq_AddDrawOnlyAniFromParent(obj, "passiveobject/battlemage_bykk/animation/pokethrowsub2.ani", 0, 0, 0); local currentAni = obj.getCurrentAnimation(); sizeRate = sizeRate.tofloat() / 100.0; currentAni.setImageRateFromOriginal(sizeRate, sizeRate); currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); break; } break; case SKILL_BYKK_RANDOMPIERCESTRIKE://流星閃影擊 break; case SKILL_BYKK_STRENGTHHANDSTRIKE://強襲流星打 switch(subtype){ case 1: case 2: case 3: case 4: case 11: case 12: case 13: case 14: if(sqrChr.getVar("kksshs").get_obj_vector_size() < 0) sqrChr.getVar("kksshs").clear_obj_vector(); if(!sqrChr.getVar("kksshs").is_obj_vector(obj)) sqrChr.getVar("kksshs").push_obj_vector(obj); if(subtype < 3 || subtype == 11 || subtype == 12) obj.addSetStatePacket(20, null, STATE_PRIORITY_AUTO, false, ""); else{ local aniPath = "character/mage/effect/animation/battlemage_bykk/strengthhandstrike/fullcharge_front.ani"; if(subtype == 4) aniPath = "character/mage/effect/animation/battlemage_bykk/strengthhandstrike/fullcharge_back.ani"; else if(subtype == 13) aniPath = "character/mage/effect/animation/battlemage_bykk/strengthhandstrike/precencia/fullcharge_aura.ani"; else if(subtype == 14) aniPath = "character/mage/effect/animation/battlemage_bykk/strengthhandstrike/precencia/precencia_fullcharge_back.ani"; local ani = sq_CreateAnimation("", aniPath); obj.setCurrentAnimation(ani); } break; case 20: local totalDamage = receiveData.readDword(); local upForce = receiveData.readDword(); local ani = sq_CreateAnimation("", "passiveobject/battlemage_bykk/animation/strengthhandstrike/shootingstar.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 36)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local attackInfo = sq_GetCurrentAttackInfo(obj); sq_SetCurrentAttacknUpForce(attackInfo, upForce); sq_moveWithParent(sqrChr, obj); break; case 21: local totalDamage = receiveData.readDword(); obj.getVar("custom").setInt(10, totalDamage); local sizeRate = receiveData.readDword(); local ani = sq_CreateAnimation("", "passiveobject/battlemage_bykk/animation/strengthhandstrike/shootingstar.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 36)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local currentAni = obj.getCurrentAnimation(); sizeRate = sizeRate.tofloat() / 100.0; currentAni.setImageRateFromOriginal(sizeRate, sizeRate); currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); obj.getVar("move").setInt(10, sq_GetXPos(obj)); local delay = currentAni.getDelaySum(false); obj.setTimeEvent(0, delay / 50, 40, true); break; case 22: local totalDamage = receiveData.readDword(); local ani = sq_CreateAnimation("", "passiveobject/battlemage_bykk/animation/strengthhandstrike/shootingstarexplosion_04.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 37)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local currentAni = obj.getCurrentAnimation(); sq_AddAttackBox(currentAni, -50, -20, -50, 100, 40, 100); break; } break; case SKILL_BYKK_DRAGONSPEAR://煌龍偃月 switch(subtype){ case 1: local totalDamage = receiveData.readDword(); local sizeRate = receiveData.readDword(); local ani = sq_CreateAnimation("","passiveobject/battlemage_bykk/animation/dragondance/dragonspear_exp_03.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 15)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local currentAni = obj.getCurrentAnimation(); sizeRate = sizeRate.tofloat() / 100.0; currentAni.setImageRateFromOriginal(sizeRate, sizeRate); currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); break; case 2: local totalDamage = receiveData.readDword(); local sizeRate = receiveData.readDword(); local sub = receiveData.readDword(); local zpos = receiveData.readDword(); local speedRate = receiveData.readDword(); obj.getVar("custom").setInt(10, totalDamage); obj.getVar("custom").setInt(11, sizeRate); obj.getVar("custom").setInt(12, sub); obj.getVar("custom").setInt(13, zpos); obj.getVar("custom").setInt(14, speedRate); obj.addSetStatePacket(20, null, STATE_PRIORITY_AUTO, false, ""); break; case 3: local totalDamage = receiveData.readDword(); local sizeRate = receiveData.readDword(); local ani = sq_CreateAnimation("","passiveobject/battlemage_bykk/animation/dragonspearfinal.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 15)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local currentAni = obj.getCurrentAnimation(); currentAni.addLayerAnimation(1,sq_CreateAnimation("","passiveobject/battlemage_bykk/animation/dragonspearfinalnone.ani"),true); currentAni.addLayerAnimation(-1,sq_CreateAnimation("","passiveobject/battlemage_bykk/animation/dragonspearfinalxor.ani"),true); sizeRate = sizeRate.tofloat() / 100.0; currentAni.setImageRateFromOriginal(sizeRate, sizeRate); currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); break; } break; case SKILL_BYKK_QUASAREXPLOSION://星紋隕爆 switch(subtype){ case 1: local totalDamage = receiveData.readDword(); local speedRate = receiveData.readDword(); local ani = sq_CreateAnimation("","passiveobject/battlemage_bykk/animation/quasarexplosion/precencia/precencia_quasarexplosion_boom.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 35)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local pAni = obj.getCurrentAnimation(); pAni.setSpeedRate(speedRate.tofloat()); break; } break; case SKILL_BYKK_CHASERCLUSTER://炫紋簇 switch(subtype){ case 1: if(sqrChr.getVar("chaserClusterObj01").get_obj_vector_size() < 0) sqrChr.getVar("chaserClusterObj01").clear_obj_vector(); if(!sqrChr.getVar("chaserClusterObj01").is_obj_vector(obj)) sqrChr.getVar("chaserClusterObj01").push_obj_vector(obj); local totalDamage = receiveData.readDword(); local createMax = receiveData.readDword(); local lifeTime = receiveData.readDword(); local sizeRate = receiveData.readDword(); print("lifeTime2 ="+lifeTime); obj.getVar("custom").setInt(10, totalDamage); obj.getVar("custom").setInt(11, createMax); obj.getVar("custom").setInt(12, sizeRate); obj.setTimeEvent(0, lifeTime, 1, false); obj.addSetStatePacket(20, null, STATE_PRIORITY_AUTO, false, ""); break; case 2: if(sqrChr.getVar("chaserClusterObj02").get_obj_vector_size() < 0) sqrChr.getVar("chaserClusterObj02").clear_obj_vector(); if(!sqrChr.getVar("chaserClusterObj02").is_obj_vector(obj)) sqrChr.getVar("chaserClusterObj02").push_obj_vector(obj); local lifeTime = receiveData.readDword(); local sizeRate = receiveData.readDword(); obj.getVar("custom").setInt(12, sizeRate); obj.setTimeEvent(0, lifeTime, 1, false); obj.addSetStatePacket(20, null, STATE_PRIORITY_AUTO, false, ""); break; } break; case SKILL_BYKK_RANDOMPIERCESTRIKEEX://流星雷連擊 switch(subtype){ case 1: local totalDamage = receiveData.readDword(); local group = receiveData.readDword(); local uniqueId = receiveData.readDword(); local targetObj = sq_GetObject(obj, group, uniqueId); if(targetObj){ obj.getVar("tar").clear_obj_vector(); obj.getVar("tar").push_obj_vector(targetObj); local aniPath = [ "character/mage/effect/animation/battlemage_bykk/randompiercestrikeex/talisman/finishthunder/a_thunder_a.ani", "character/mage/effect/animation/battlemage_bykk/randompiercestrikeex/talisman/finishthunder/b_thunder_b.ani", "character/mage/effect/animation/battlemage_bykk/randompiercestrikeex/talisman/finishthunder/c_thunder_c.ani" ]; local ani = sq_CreateAnimation("",aniPath[sq_getRandom(0,2)]); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 9)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); obj.setTimeEvent(0, 80, 1, false); } break; } break; case SKILL_BYKK_SWINGEX://閃擊碎霸 switch(subtype){ case 1:// local totalDamage = receiveData.readDword(); local delay = receiveData.readDword(); local speedRate = 12000.0 / delay.tofloat(); local sizeRate = receiveData.readDword(); local ani = sq_CreateAnimation("", "character/mage/effect/animation/battlemage_bykk/swingex/precencia/swingeffect_twinkle_04.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 38)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local currentAni = obj.getCurrentAnimation(); currentAni.setSpeedRate(speedRate); sizeRate = sizeRate.tofloat() / 100.0; currentAni.setImageRateFromOriginal(sizeRate, sizeRate); currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); break; case 2: local delay = receiveData.readDword(); local sizeRate = receiveData.readDword(); local speedRate = 7000.0 / delay.tofloat(); local totalDamage = receiveData.readDword(); local ani = sq_CreateAnimation("", "character/mage/effect/animation/battlemage_bykk/swingex/newswingeff_eff_08.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 38)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local currentAni = obj.getCurrentAnimation(); currentAni.setSpeedRate(speedRate); sizeRate = sizeRate.tofloat() / 100.0; currentAni.setImageRateFromOriginal(sizeRate, sizeRate); currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); break; } break; case SKILL_BYKK_FUSIONCHASER://炫紋融合 switch(subtype){ case 1: if(sqrChr.getVar("kksfsChaser").get_obj_vector_size() < 0) sqrChr.getVar("kksfsChaser").clear_obj_vector(); if(!sqrChr.getVar("kksfsChaser").is_obj_vector(obj)) sqrChr.getVar("kksfsChaser").push_obj_vector(obj); local sub = receiveData.readDword(); obj.getVar("custom").setInt(10, sub); obj.addSetStatePacket(20, null, STATE_PRIORITY_AUTO, false, ""); break; case 2: local totalDamage = receiveData.readDword(); local sizeRate = receiveData.readDword(); local ani = sq_CreateAnimation("", "passiveobject/battlemage_bykk/animation/fusionchaser/precencia/explosion/fusionchaseree_00.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 26)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local currentAni = obj.getCurrentAnimation(); sizeRate = sizeRate.tofloat() / 100.0; currentAni.setImageRateFromOriginal(sizeRate, sizeRate); currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); break; case 3: case 4: local totalDamage = receiveData.readDword(); local sizeRate = receiveData.readDword(); local ani = sq_CreateAnimation("", "passiveobject/battlemage_bykk/animation/fusionchaser/fw.ani"); if(subtype == 4) ani = sq_CreateAnimation("", "passiveobject/battlemage_bykk/animation/fusionchaser/dl.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 26)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local currentAni = obj.getCurrentAnimation(); sizeRate = sizeRate.tofloat() / 100.0; currentAni.setImageRateFromOriginal(sizeRate, sizeRate); currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); local delay = currentAni.getDelaySum(0, 1); obj.setTimeEvent(3, delay, 1, false); break; } break; case SKILL_BYKK_CHASEREVOLUTION://炫紋進化 break; case SKILL_BYKK_DOUBLESWING://雙重錘擊 switch(subtype){ case 1: local totalDamage = receiveData.readDword(); local sizeRate = receiveData.readDword(); createOnlyDrawObjectEX_Battlemage_bykk(obj,"passiveobject/battlemage_bykk/animation/doubleswing/double_swing_sub_down_dodge.ani",true,obj.getDirection(),sq_GetXPos(obj),sq_GetYPos(obj),0,ENUM_DRAWLAYER_BOTTOM,sizeRate,sizeRate); local ani = sq_CreateAnimation("","passiveobject/battlemage_bykk/animation/doubleswing/double_swing_sub_up_dodge.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 32)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local currentAni = obj.getCurrentAnimation(); sizeRate = sizeRate.tofloat() / 100.0; currentAni.setImageRateFromOriginal(sizeRate, sizeRate); currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); break; } break; case SKILL_BYKK_TIMERBOMB://炫紋爆彈 switch(subtype){ case 1: local totalDamage = receiveData.readDword(); local totalDamage2 = receiveData.readDword(); local lifeTime = receiveData.readDword(); local hitTime = receiveData.readDword(); local group = receiveData.readDword(); local uniqueId = receiveData.readDword(); local sub = receiveData.readDword(); local sub2 = receiveData.readDword(); local targetObj = sq_GetObject(obj, group, uniqueId); if(targetObj){ obj.getVar("target").clear_obj_vector(); obj.getVar("target").push_obj_vector(targetObj); sq_moveWithParent(targetObj, obj); if(sub2 > 0) totalDamage2 = (lifeTime / hitTime) * totalDamage + totalDamage2; obj.getVar("custom").setInt(10, totalDamage2); local ani = sq_CreateAnimation("","passiveobject/battlemage_bykk/animation/timerbomb/1_monmu_dodge.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 39)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); if(sub > 0) obj.setTimeEvent(1, 50, 1, false); else{ obj.setTimeEvent(0, hitTime, -1, true); obj.setTimeEvent(1, lifeTime, 1, false); } } else sq_SendDestroyPacketPassiveObject(obj); break; } break; case SKILL_BYKK_AVATARDANCE://使徒之舞 break; case SKILL_BYKK_AVATARFINISH://一騎當千碎霸 switch(subtype){ case 1: local totalDamage = receiveData.readDword(); local group = receiveData.readDword(); local uniqueId = receiveData.readDword(); local targetObj = sq_GetObject(obj, group, uniqueId); obj.getVar("tar").clear_obj_vector(); obj.getVar("tar").push_obj_vector(targetObj); local ani = sq_CreateAnimation("","character/mage/effect/animation/battlemage_bykk/avatar/avataratkfinishtop_eff_j.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 0)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local currentAni = obj.getCurrentAnimation(); currentAni.addLayerAnimation(-1,sq_CreateAnimation("","character/mage/effect/animation/battlemage_bykk/avatar/avataratkfinishbot_eff_t.ani"),true); obj.setTimeEvent(1, 1000, 1, false); break; case 2: local totalDamage = receiveData.readDword(); local speedRate = receiveData.readDword(); local ani = sq_CreateAnimation("","passiveobject/battlemage_bykk/animation/avatar/avatarfinish_star_b.ani"); obj.setCurrentAnimation(ani); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 0)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local pAni = obj.getCurrentAnimation(); pAni.setSpeedRate(speedRate.tofloat()); break; } break; case SKILL_BYKK_CHASERLAUNCHPOWERED://炫紋聚合 break; case SKILL_BYKK_PRECENCIA://太古化身 break; case SKILL_BYKK_LAYOFPRIMITIVE://炫紋之源:太古神光 break; } local attackInfo = sq_GetCurrentAttackInfo(obj); if(attackInfo){ attackInfo.setAttackType(ATTACKTYPE_PHYSICAL); sq_SetAddWeaponDamage(attackInfo, true); local element_kk_fire = sqrChr.getVar("element_kk").getInt(0); local element_kk_water = sqrChr.getVar("element_kk").getInt(1); local element_kk_dark = sqrChr.getVar("element_kk").getInt(2); local element_kk_light = sqrChr.getVar("element_kk").getInt(3); if(!attackInfo.isValidElement(ENUM_ELEMENT_FIRE) && element_kk_fire > 0) attackInfo.setElement(ENUM_ELEMENT_FIRE); if(!attackInfo.isValidElement(ENUM_ELEMENT_WATER) && element_kk_water > 0) attackInfo.setElement(ENUM_ELEMENT_WATER); if(!attackInfo.isValidElement(ENUM_ELEMENT_DARK) && element_kk_dark > 0) attackInfo.setElement(ENUM_ELEMENT_DARK); if(!attackInfo.isValidElement(ENUM_ELEMENT_LIGHT) && element_kk_light > 0) attackInfo.setElement(ENUM_ELEMENT_LIGHT); } } function setState_po_battlemage_bykk(obj, state, datas) { if(!obj) return; local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter()); local skillIndex = obj.getVar("skillIndex").getInt(0); local subtype = obj.getVar("subtype").getInt(0); obj.getVar("state").setInt(0, state); switch(skillIndex){ case SKILL_BYKK_THRUST://龍牙 break; case SKILL_BYKK_CHASER://炫紋 local chaser_aniPath = [ ["passiveobject/battlemage_bykk/animation/chaserdefaultappear.ani","passiveobject/battlemage_bykk/animation/evolutionchaser/evolutionchaserstart01_02.ani","passiveobject/battlemage_bykk/animation/chaseravatar/defaultchaserstart_03.ani","passiveobject/battlemage_bykk/animation/precencia/primitivechaser/start/ccon_00.ani"], ["passiveobject/battlemage_bykk/animation/chaserdefaultstay.ani","passiveobject/battlemage_bykk/animation/evolutionchaser/evolutionchaserloop_02.ani","passiveobject/battlemage_bykk/animation/chaseravatar/defaultchaserloop_02.ani","passiveobject/battlemage_bykk/animation/precencia/primitivechaser/loop/cc_00.ani"], ["passiveobject/battlemage_bykk/animation/chaserdefaultdisappear.ani","passiveobject/battlemage_bykk/animation/evolutionchaser/evolutionchaserend_00.ani","passiveobject/battlemage_bykk/animation/chaseravatar/defaultchaserend_00.ani","passiveobject/battlemage_bykk/animation/precencia/primitivechaser/end/ccoff_00.ani"], ["passiveobject/battlemage_bykk/animation/chaserdefaultattack.ani","passiveobject/battlemage_bykk/animation/evolutionchaser/evolutionchaserspinsawloop_02.ani","passiveobject/battlemage_bykk/animation/chaseravatar/defaultchaserend_00.ani","passiveobject/battlemage_bykk/animation/precencia/primitivechaser/attack/attack_00.ani"], ["passiveobject/battlemage_bykk/animation/chaserbomb.ani","passiveobject/battlemage_bykk/animation/chaserlaunchpowered/explosionevo_04.ani","passiveobject/battlemage_bykk/animation/chaserlaunchpowered/explosion_01.ani","passiveobject/battlemage_bykk/animation/precencia/primitivechaser/explosion/ccpp_00.ani"] ]; local sub = obj.getVar("custom").getInt(11); local ani = sq_CreateAnimation("",chaser_aniPath[state - 20][sub]); obj.setCurrentAnimation(ani); local currentAni = obj.getCurrentAnimation(); local sizeRateSet = obj.getVar("custom").getInt(12); local sizeRate_all = [[100,60,125,125],[150,80,125,125],[250,120,125,125]]; local sizeRate = sizeRate_all[sizeRateSet][sub].tofloat() / 100.0; if(state != 23){ currentAni.setImageRateFromOriginal(sizeRate, sizeRate); currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); } switch(state){ case 20://開始 if(!obj.isExistTimeEvent(10)) obj.setTimeEvent(10, 15, -1, true); break; case 21://持續 local lifeTime = obj.getVar("custom").getInt(13); obj.setTimeEvent(13, lifeTime, 1, false); break; case 22://結束 break; case 23://攻擊 if(obj.getVar("target").get_obj_vector_size() > 0){ local pAni = obj.getCurrentAnimation(); local delaySum = pAni.getDelaySum(false); if(delaySum > 300) delaySum = 300; obj.setTimeEvent(14, delaySum / 20, 20, true); } break; case 24://爆炸 local hitMax = 1; if(sub == 1) hitMax = sq_GetIntData(sqrChr, SKILL_BYKK_CHASEREVOLUTION, 7); if(hitMax > 1){ local pAni = obj.getCurrentAnimation(); local delaySum = pAni.getDelaySum(false); obj.setTimeEvent(0, delaySum / hitMax, hitMax - 1, false); } local atkIndex = [5,6,5,34]; local totalDamage = obj.getVar("custom").getInt(10); if(sub == 1){ totalDamage = totalDamage * (65 + sq_GetLevelData(sqrChr, SKILL_BYKK_CHASER, 5, sq_GetSkillLevel(sqrChr, 22))) / 100; } sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, atkIndex[sub])); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local decreasespeedLevel = obj.getVar("buff").getInt(12); local decreasespeedProb = obj.getVar("buff").getInt(13); local decreasespeedRate = obj.getVar("buff").getInt(14); local decreasespeedTime = obj.getVar("buff").getInt(15); local attackInfo = sq_GetCurrentAttackInfo(obj); if(attackInfo) sq_SetChangeStatusIntoAttackInfo(attackInfo, 0, ACTIVESTATUS_SLOW,decreasespeedProb,decreasespeedLevel,decreasespeedTime,decreasespeedRate); switch(sub){ case 0: sq_CreateParticle("passiveobject/battlemage_bykk/animation/chaserlaunchpowered/avatarchaserlaunchpowered.ptl", obj, 0, 0, 0, true, 30, 0, 1); break; case 1: sq_CreateParticle("passiveobject/battlemage_bykk/animation/evolutionchaser/starparticle.ptl", obj, 0, 0, 0, true, 30, 0, 1); break; case 2: sq_CreateParticle("passiveobject/battlemage_bykk/animation/chaseravatar/boomdefaultparticle.ptl", obj, 0, 0, 0, true, 30, 0, 1); break; } local expsizeRate = obj.getVar("custom").getInt(17); print("obj-expsizeRate = "+expsizeRate); local currentAni = obj.getCurrentAnimation(); local sizeRate = expsizeRate.tofloat() / 100.0; currentAni.setImageRateFromOriginal(sizeRate, sizeRate); currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); break; } break; case SKILL_BYKK_CHASERSEXPLOSION://炫紋強壓 break; case SKILL_BYKK_UPPERSWING://天擊 break; case SKILL_BYKK_SWING://碎霸 break; case SKILL_BYKK_HANDSTRIKE://落花掌 break; case SKILL_BYKK_POKETHROW://圓舞棍 break; case SKILL_BYKK_RANDOMPIERCESTRIKE://流星閃影擊 break; case SKILL_BYKK_STRENGTHHANDSTRIKE://強襲流星打 switch(subtype){ case 1: case 2: case 11: case 12: local aniPath = [ ["character/mage/effect/animation/battlemage_bykk/strengthhandstrike/start_front.ani","character/mage/effect/animation/battlemage_bykk/strengthhandstrike/loop_front.ani"], ["character/mage/effect/animation/battlemage_bykk/strengthhandstrike/start_back.ani","character/mage/effect/animation/battlemage_bykk/strengthhandstrike/loop_back.ani"], ["character/mage/effect/animation/battlemage_bykk/strengthhandstrike/precencia/start_front.ani","character/mage/effect/animation/battlemage_bykk/strengthhandstrike/precencia/precencia_loop_front.ani"], ["character/mage/effect/animation/battlemage_bykk/strengthhandstrike/precencia/start_back.ani","character/mage/effect/animation/battlemage_bykk/strengthhandstrike/precencia/precencia_loop_back.ani"] ]; local tz = 1; if(subtype > 10) tz = 9; local ani = sq_CreateAnimation("",aniPath[subtype - tz][state - 20]); obj.setCurrentAnimation(ani); break; } break; case SKILL_BYKK_DRAGONSPEAR://煌龍偃月 switch(subtype){ case 2: switch(state){ case 20: local ani = sq_CreateAnimation("","character/mage/effect/animation/avatar/dragonspear/chaser2.ani"); obj.setCurrentAnimation(ani); local currentAni = obj.getCurrentAnimation(); currentAni.addLayerAnimation(10001,sq_CreateAnimation("","character/mage/effect/animation/avatar/dragonspear/chaser1.ani"),true); local delay = (obj.getVar("custom").getInt(12) * 200 + 1200) / obj.getVar("custom").getInt(14) * 100; obj.setTimeEvent(0, delay, 1, false); break; case 21: local ani = sq_CreateAnimation("","passiveobject/battlemage_bykk/animation/dragonspearexplosion.ani"); obj.setCurrentAnimation(ani); local totalDamage = obj.getVar("custom").getInt(10); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 16)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local sizeRate = obj.getVar("custom").getInt(11); local currentAni = obj.getCurrentAnimation(); sizeRate = sizeRate.tofloat() / 100.0; currentAni.setImageRateFromOriginal(sizeRate, sizeRate); currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); break; } break; } break; case SKILL_BYKK_QUASAREXPLOSION://星紋隕爆 break; case SKILL_BYKK_CHASERCLUSTER://炫紋簇 switch(subtype){ case 1: local aniPath = ["passiveobject/battlemage_bykk/animation/chasercluster/chaserclustermainloop.ani","passiveobject/battlemage_bykk/animation/chasercluster/chaserclustermainexplosion.ani"]; local ani = sq_CreateAnimation("", aniPath[state - 20]); obj.setCurrentAnimation(ani); if(state > 20){ local totalDamage = obj.getVar("custom").getInt(10); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 10)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local hitMax = obj.getVar("custom").getInt(11); obj.setTimeEvent(1, 600 / hitMax, hitMax, true); } break; case 2: local aniPath = ["passiveobject/battlemage_bykk/animation/chasercluster/chaserclusterstart_00.ani","passiveobject/battlemage_bykk/animation/chasercluster/chaserclusterloop_00.ani","passiveobject/battlemage_bykk/animation/chasercluster/chaserclusterend_00.ani"]; local ani = sq_CreateAnimation("", aniPath[state - 20]); obj.setCurrentAnimation(ani); break; } local sizeRate = obj.getVar("custom").getInt(12); local currentAni = obj.getCurrentAnimation(); sizeRate = sizeRate.tofloat() / 100.0; currentAni.setImageRateFromOriginal(sizeRate, sizeRate); currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); break; case SKILL_BYKK_RANDOMPIERCESTRIKEEX://流星雷連擊 break; case SKILL_BYKK_SWINGEX://閃擊碎霸 break; case SKILL_BYKK_FUSIONCHASER://炫紋融合 switch(subtype){ case 1: local sub = obj.getVar("custom").getInt(10); local aniPath = [ ["character/mage/effect/animation/battlemage_bykk/fusionchaser/nn_cast.ani","character/mage/effect/animation/battlemage_bykk/fusionchaser/a/nnfusionchaserfull_loop.ani","character/mage/effect/animation/battlemage_bykk/fusionchaser/precencia/pp_cast.ani"], ["passiveobject/battlemage_bykk/animation/fusionchaser/full/normalspin_fcspin_normal.ani","passiveobject/battlemage_bykk/animation/fusionchaser/full/icespin_fcspin_normal.ani","passiveobject/battlemage_bykk/animation/fusionchaser/precencia/spin/fcspin2_00.ani"], ["passiveobject/battlemage_bykk/animation/fusionchaser/full/normalspin_r_fcspin_normal.ani","passiveobject/battlemage_bykk/animation/fusionchaser/full/icespin_r_fcspin_normal.ani","passiveobject/battlemage_bykk/animation/fusionchaser/precencia/spin/fcspin2_r_00.ani"] ]; local ani = sq_CreateAnimation("", aniPath[state - 20][sub]); obj.setCurrentAnimation(ani); if(state == 21){ local currentAni = obj.getCurrentAnimation(); currentAni.addLayerAnimation(0,sq_CreateAnimation("",aniPath[state - 19][sub]),true); } break; } break; case SKILL_BYKK_CHASEREVOLUTION://炫紋進化 break; case SKILL_BYKK_DOUBLESWING://雙重錘擊 break; case SKILL_BYKK_TIMERBOMB://炫紋爆彈 break; case SKILL_BYKK_AVATARDANCE://使徒之舞 break; case SKILL_BYKK_AVATARFINISH://一騎當千碎霸 break; case SKILL_BYKK_CHASERLAUNCHPOWERED://炫紋聚合 break; case SKILL_BYKK_PRECENCIA://太古化身 break; case SKILL_BYKK_LAYOFPRIMITIVE://炫紋之源:太古神光 break; } local attackInfo = sq_GetCurrentAttackInfo(obj); if(attackInfo){ attackInfo.setAttackType(ATTACKTYPE_PHYSICAL); sq_SetAddWeaponDamage(attackInfo, true); local element_kk_fire = sqrChr.getVar("element_kk").getInt(0); local element_kk_water = sqrChr.getVar("element_kk").getInt(1); local element_kk_dark = sqrChr.getVar("element_kk").getInt(2); local element_kk_light = sqrChr.getVar("element_kk").getInt(3); if(!attackInfo.isValidElement(ENUM_ELEMENT_FIRE) && element_kk_fire > 0) attackInfo.setElement(ENUM_ELEMENT_FIRE); if(!attackInfo.isValidElement(ENUM_ELEMENT_WATER) && element_kk_water > 0) attackInfo.setElement(ENUM_ELEMENT_WATER); if(!attackInfo.isValidElement(ENUM_ELEMENT_DARK) && element_kk_dark > 0) attackInfo.setElement(ENUM_ELEMENT_DARK); if(!attackInfo.isValidElement(ENUM_ELEMENT_LIGHT) && element_kk_light > 0) attackInfo.setElement(ENUM_ELEMENT_LIGHT); } } function onEndCurrentAni_po_battlemage_bykk(obj) { if(!obj) return; local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter()); local skillIndex = obj.getVar("skillIndex").getInt(0); local subtype = obj.getVar("subtype").getInt(0); local state = obj.getVar("state").getInt(0); switch(skillIndex){ case SKILL_BYKK_THRUST://龍牙 break; case SKILL_BYKK_CHASER://炫紋 switch(state){ case 20: obj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, ""); break; case 22: sq_SendDestroyPacketPassiveObject(obj); break; case 23: obj.addSetStatePacket(24, null, STATE_PRIORITY_AUTO, false, ""); break; case 24: sq_SendDestroyPacketPassiveObject(obj); break; } break; case SKILL_BYKK_CHASERSEXPLOSION://炫紋強壓 sq_SendDestroyPacketPassiveObject(obj); break; case SKILL_BYKK_UPPERSWING://天擊 break; case SKILL_BYKK_SWING://碎霸 sq_SendDestroyPacketPassiveObject(obj); break; case SKILL_BYKK_HANDSTRIKE://落花掌 break; case SKILL_BYKK_POKETHROW://圓舞棍 sq_SendDestroyPacketPassiveObject(obj); break; case SKILL_BYKK_RANDOMPIERCESTRIKE://流星閃影擊 break; case SKILL_BYKK_STRENGTHHANDSTRIKE://強襲流星打 switch(subtype){ case 1: case 2: case 11: case 12: switch(state){ case 20: obj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, ""); break; } break; case 3: case 4: case 13: case 14: case 20: case 21: case 22: sq_SendDestroyPacketPassiveObject(obj); break; } break; case SKILL_BYKK_DRAGONSPEAR://煌龍偃月 switch(subtype){ case 1: sq_SendDestroyPacketPassiveObject(obj); break; case 2: switch(state){ case 21: sq_SendDestroyPacketPassiveObject(obj); break; } break; case 3: sq_SendDestroyPacketPassiveObject(obj); break; } break; case SKILL_BYKK_QUASAREXPLOSION://星紋隕爆 sq_SendDestroyPacketPassiveObject(obj); break; case SKILL_BYKK_CHASERCLUSTER://炫紋簇 switch(subtype){ case 2: switch(state){ case 20: obj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, ""); break; case 22: sq_SendDestroyPacketPassiveObject(obj); break; } break; } break; case SKILL_BYKK_RANDOMPIERCESTRIKEEX://流星雷連擊 sq_SendDestroyPacketPassiveObject(obj); break; case SKILL_BYKK_SWINGEX://閃擊碎霸 sq_SendDestroyPacketPassiveObject(obj); break; case SKILL_BYKK_FUSIONCHASER://炫紋融合 switch(subtype){ case 1: switch(state){ case 22: sq_SendDestroyPacketPassiveObject(obj); break; } break; case 2: sq_SendDestroyPacketPassiveObject(obj); break; case 3: sq_SendDestroyPacketPassiveObject(obj); break; case 4: sq_SendDestroyPacketPassiveObject(obj); break; } break; case SKILL_BYKK_CHASEREVOLUTION://炫紋進化 break; case SKILL_BYKK_DOUBLESWING://雙重錘擊 sq_SendDestroyPacketPassiveObject(obj); break; case SKILL_BYKK_TIMERBOMB://炫紋爆彈 sq_SendDestroyPacketPassiveObject(obj); break; case SKILL_BYKK_AVATARDANCE://使徒之舞 break; case SKILL_BYKK_AVATARFINISH://一騎當千碎霸 sq_SendDestroyPacketPassiveObject(obj); break; case SKILL_BYKK_CHASERLAUNCHPOWERED://炫紋聚合 break; case SKILL_BYKK_PRECENCIA://太古化身 break; case SKILL_BYKK_LAYOFPRIMITIVE://炫紋之源:太古神光 break; } } function onTimeEvent_po_battlemage_bykk(obj, timeEventIndex, timeEventCount) { if(!obj) return; local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter()); local skillIndex = obj.getVar("skillIndex").getInt(0); local subtype = obj.getVar("subtype").getInt(0); local state = obj.getVar("state").getInt(0); switch(skillIndex){ case SKILL_BYKK_THRUST://龍牙 break; case SKILL_BYKK_CHASER://炫紋 switch(timeEventIndex){ case 0: obj.resetHitObjectList(); break; case 10://判斷距離 if(sqrChr.getState() == STATE_DIE) sq_SendDestroyPacketPassiveObject(obj); local baseX = obj.getVar("custom").getInt(14), baseY = obj.getVar("custom").getInt(15), baseZ = obj.getVar("custom").getInt(16); local disX = sq_Abs(sq_GetXPos(obj) - sq_GetDistancePos(sq_GetXPos(sqrChr),sqrChr.getDirection(),baseX)); local disY = sq_Abs(sq_GetYPos(obj) - sq_GetYPos(sqrChr) - baseY); local disZ = sq_Abs(sq_GetZPos(obj) - sq_GetZPos(sqrChr) - baseZ); local direction = sqrChr.getDirection(); if(obj.getDirection() != direction) obj.setDirection(direction); if(disX > 10){ local baseM = 25; local moveX = disX / baseM + 1; if(sq_GetXPos(obj) > sq_GetDistancePos(sq_GetXPos(sqrChr),sqrChr.getDirection(),baseX)) sq_setCurrentAxisPos(obj, 0, sq_GetXPos(obj) - moveX); else sq_setCurrentAxisPos(obj, 0, sq_GetXPos(obj) + moveX); } if(disY > 0){ local baseM = 25; local moveY = disY / baseM + 1; if(sq_GetYPos(obj) > sq_GetYPos(sqrChr)) sq_setCurrentAxisPos(obj, 1, sq_GetYPos(obj) - moveY); else sq_setCurrentAxisPos(obj, 1, sq_GetYPos(obj) + moveY); } if(disZ > 0){ local baseM = 25; local moveZ = disZ / baseM + 1; if(sq_GetZPos(obj) - baseZ > sq_GetZPos(sqrChr)) sq_setCurrentAxisPos(obj, 2, sq_GetZPos(obj) - moveZ); else sq_setCurrentAxisPos(obj, 2, sq_GetZPos(obj) + moveZ); } if(disX <= 10 && disY <= 0 && disZ <= 0){ obj.stopTimeEvent(10); obj.setTimeEvent(11,300,-1,false); } break; case 11://移動 local baseX = obj.getVar("custom").getInt(14), baseY = obj.getVar("custom").getInt(15), baseZ = obj.getVar("custom").getInt(16); local disX = sq_Abs(sq_GetXPos(obj) - sq_GetDistancePos(sq_GetXPos(sqrChr),sqrChr.getDirection(),baseX)); local disY = sq_Abs(sq_GetYPos(obj) - sq_GetYPos(sqrChr) - baseY); local disZ = sq_Abs(sq_GetZPos(obj) - sq_GetZPos(sqrChr) - baseZ); if(disX > 10 || disY > 0 || disZ > 5){ obj.stopTimeEvent(11); obj.stopTimeEvent(12); obj.setTimeEvent(10,15,-1,false); } else{ if(!obj.isExistTimeEvent(12)) obj.setTimeEvent(12, 100, -1, true); } break; case 12: local v = sq_GetUniformVelocity(0, 2, timeEventCount % 20, 5); if(timeEventCount % 20 > 5) v = sq_GetUniformVelocity(2, 0, timeEventCount % 20 - 5, 5); if(timeEventCount % 20 > 10) v = sq_GetUniformVelocity(0, -2, timeEventCount % 20 - 10, 5); if(timeEventCount % 20 > 15) v = sq_GetUniformVelocity(-2, 0, timeEventCount % 20 - 15, 5); sq_setCurrentAxisPos(obj, 2, sq_GetZPos(obj) + v); break; case 13://轉至結束 if(obj.getState() < 22) obj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, ""); break; case 14://移動到目標 local targetObj = obj.getVar("target").get_obj_vector(0); if(targetObj && targetObj.getState() != STATE_DIE){ local moveX = sq_GetUniformVelocity(sq_GetXPos(obj), sq_GetXPos(targetObj), timeEventCount, 20); local moveY = sq_GetUniformVelocity(sq_GetYPos(obj), sq_GetYPos(targetObj), timeEventCount, 20); local moveZ = sq_GetUniformVelocity(sq_GetZPos(obj), sq_GetZPos(targetObj) + sq_GetObjectHeight(targetObj) / 2, timeEventCount, 20); sq_setCurrentAxisPos(obj, 0, moveX); sq_setCurrentAxisPos(obj, 1, moveY); sq_setCurrentAxisPos(obj, 2, moveZ); } if(timeEventCount >= 20) obj.addSetStatePacket(24, null, STATE_PRIORITY_AUTO, false, ""); break; case 15: local moveX = sq_GetUniformVelocity(sq_GetXPos(obj), obj.getVar("moveSet").getInt(10), timeEventCount, 15); local moveZ = sq_GetUniformVelocity(sq_GetZPos(obj), obj.getVar("moveSet").getInt(11), timeEventCount, 15); sq_setCurrentAxisPos(obj, 0, moveX); sq_setCurrentAxisPos(obj, 2, moveZ); if(timeEventCount >= 15){ obj.setTimeEvent(16, obj.getVar("moveSet").getInt(14) / 3, 1, false); } break; case 16: obj.setTimeEvent(17, obj.getVar("moveSet").getInt(14) / 45, 15, true); break; case 17: local moveX = sq_GetUniformVelocity(sq_GetXPos(obj), obj.getVar("moveSet").getInt(12), timeEventCount, 15); local moveZ = sq_GetUniformVelocity(sq_GetZPos(obj), obj.getVar("moveSet").getInt(13), timeEventCount, 15); sq_setCurrentAxisPos(obj, 0, moveX); sq_setCurrentAxisPos(obj, 2, moveZ); if(timeEventCount >= 15){ sq_SendDestroyPacketPassiveObject(obj); } break; } break; case SKILL_BYKK_CHASERSEXPLOSION://炫紋強壓 switch(timeEventIndex){ case 0: sq_AddDrawOnlyAniFromParent(sqrChr, "character/mage/effect/animation/battlemage_bykk/chasersexplosion/smash.ani", 0,0,0); sq_SendDestroyPacketPassiveObject(obj); break; } break; case SKILL_BYKK_UPPERSWING://天擊 break; case SKILL_BYKK_SWING://碎霸 break; case SKILL_BYKK_HANDSTRIKE://落花掌 switch(timeEventIndex){ case 0: local targetObj = obj.getVar("target").get_obj_vector(0); if(!targetObj || targetObj.getState() == STATE_DIE || timeEventCount >= 30) sq_SendDestroyPacketPassiveObject(obj); local baseX = obj.getVar("move").getInt(10); local direction = obj.getVar("move").getInt(11); if(direction == ENUM_DIRECTION_LEFT){ local nowX = sq_GetXPos(obj); if(nowX < baseX){ sq_SendHitObjectPacket(obj,targetObj,0,0,sq_GetObjectHeight(targetObj) / 2); obj.stopTimeEvent(0); obj.setTimeEvent(1, 50, 1, false); } else obj.getVar("move").setInt(10, nowX); } else if(direction == ENUM_DIRECTION_RIGHT){ local nowX = sq_GetXPos(obj); if(nowX > baseX){ sq_SendHitObjectPacket(obj,targetObj,0,0,sq_GetObjectHeight(targetObj) / 2); obj.stopTimeEvent(0); obj.setTimeEvent(1, 50, 1, false); } else obj.getVar("move").setInt(10, nowX); } break; case 1: sq_SendDestroyPacketPassiveObject(obj); break; } break; case SKILL_BYKK_POKETHROW://圓舞棍 break; case SKILL_BYKK_RANDOMPIERCESTRIKE://流星閃影擊 break; case SKILL_BYKK_STRENGTHHANDSTRIKE://強襲流星打 switch(timeEventIndex){ case 0: local v = sq_GetUniformVelocity(0, 500, timeEventCount, 40); local dstX = sq_GetDistancePos(obj.getVar("move").getInt(10), obj.getDirection(), v); sq_setCurrentAxisPos(obj, 0, dstX); break; } break; case SKILL_BYKK_DRAGONSPEAR://煌龍偃月 switch(timeEventIndex){ case 0: obj.getVar("move").setInt(10, sq_GetXPos(obj)); obj.getVar("move").setInt(11, sq_GetZPos(obj)); local speedRate = obj.getVar("custom").getInt(14); local delay = 4 / speedRate * 100; obj.setTimeEvent(1, delay, 30, true); break; case 1: local moveX = sq_GetDistancePos(sq_GetXPos(sqrChr), sqrChr.getDirection(), 300); local moveZ = obj.getVar("custom").getInt(13); local vx = sq_GetUniformVelocity(obj.getVar("move").getInt(10), moveX, timeEventCount, 30); local vz = sq_GetUniformVelocity(obj.getVar("move").getInt(11), moveZ, timeEventCount, 30); sq_setCurrentAxisPos(obj, 0, vx); sq_setCurrentAxisPos(obj, 2, vz); if(timeEventCount >= 30) obj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, ""); break; } break; case SKILL_BYKK_QUASAREXPLOSION://星紋隕爆 break; case SKILL_BYKK_CHASERCLUSTER://炫紋簇 switch(timeEventIndex){ case 0: if(subtype == 1) obj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, ""); else obj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, ""); break; case 1: obj.resetHitObjectList(); if(timeEventCount >= obj.getVar("custom").getInt(11)){ if(obj.getVar("custom").getInt(11) != 1) sq_SendDestroyPacketPassiveObject(obj); else obj.setTimeEvent(2, 100, 1, false); } break; case 2: sq_SendDestroyPacketPassiveObject(obj); break; } break; case SKILL_BYKK_RANDOMPIERCESTRIKEEX://流星雷連擊 switch(timeEventIndex){ case 0: local targetObj = obj.getVar("tar").get_obj_vector(0); if(targetObj) sq_SendHitObjectPacket(obj,targetObj,0,0,sq_GetObjectHeight(targetObj)); break; } break; case SKILL_BYKK_SWINGEX://閃擊碎霸 break; case SKILL_BYKK_FUSIONCHASER://炫紋融合 switch(timeEventIndex){ case 0: if(sqrChr){ sq_setCurrentAxisPos(obj, 0, sq_GetDistancePos(sq_GetXPos(sqrChr), sqrChr.getDirection(), 80)); if(timeEventCount >= 30 && state == 20) sq_SendDestroyPacketPassiveObject(obj); } else sq_SendDestroyPacketPassiveObject(obj); break; case 1: sq_SendDestroyPacketPassiveObject(obj); break; case 2: local targetObj = obj.getVar("tar").get_obj_vector(0); if(targetObj && targetObj.getState() != STATE_DIE){ sq_SendHitObjectPacket(obj,targetObj,0,0,sq_GetZPos(obj)); } else sq_SendDestroyPacketPassiveObject(obj); break; case 3: sq_SendDestroyPacketPassiveObject(obj); break; } break; case SKILL_BYKK_CHASEREVOLUTION://炫紋進化 break; case SKILL_BYKK_DOUBLESWING://雙重錘擊 break; case SKILL_BYKK_TIMERBOMB://炫紋爆彈 switch(timeEventIndex){ case 0: local targetObj = obj.getVar("target").get_obj_vector(0); if(targetObj && targetObj.getState() != STATE_DIE){ sq_SendHitObjectPacket(obj,targetObj,0,0,sq_GetZPos(obj)); } else sq_SendDestroyPacketPassiveObject(obj); break; case 1: obj.stopTimeEvent(0); local totalDamage = obj.getVar("custom").getInt(10); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 40)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local targetObj = obj.getVar("target").get_obj_vector(0); if(targetObj && targetObj.getState() != STATE_DIE){ sq_SendHitObjectPacket(obj,targetObj,0,0,sq_GetZPos(obj)); obj.setTimeEvent(2, 100, 1, false); } else sq_SendDestroyPacketPassiveObject(obj); break; case 2: sq_SendDestroyPacketPassiveObject(obj); break; } break; case SKILL_BYKK_AVATARDANCE://使徒之舞 break; case SKILL_BYKK_AVATARFINISH://一騎當千碎霸 switch(timeEventIndex){ case 1: local targetObj = obj.getVar("tar").get_obj_vector(0); if(targetObj) sq_SendHitObjectPacket(obj,targetObj,0,0,sq_GetObjectHeight(targetObj) / 2); break; } break; case SKILL_BYKK_CHASERLAUNCHPOWERED://炫紋聚合 break; case SKILL_BYKK_PRECENCIA://太古化身 break; case SKILL_BYKK_LAYOFPRIMITIVE://炫紋之源:太古神光 break; } } function onAttack_po_battlemage_bykk(obj, damager, boundingBox, isStuck) { if(!obj) return; local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter()); local skillIndex = obj.getVar("skillIndex").getInt(0); local subtype = obj.getVar("subtype").getInt(0); local state = obj.getVar("state").getInt(0); switch(skillIndex){ case SKILL_BYKK_THRUST://龍牙 break; case SKILL_BYKK_CHASER://炫紋 if(!sqrChr || sqrChr.getState() == STATE_DIE) break; if(sq_GetSkillLevel(sqrChr, SKILL_BYKK_ARMONIA) > 0 && CNSquirrelAppendage.sq_IsAppendAppendage(sqrChr, CHASER_APDPATH)) break; local addAppendage = CNSquirrelAppendage.sq_GetAppendage(sqrChr, CHASER_APDPATH); if(!addAppendage){ addAppendage = CNSquirrelAppendage.sq_AppendAppendage(sqrChr, sqrChr, -1, false, CHASER_APDPATH, true); // setDamageRate_BattleMage_bykk(obj); } local buffTime = obj.getVar("buff").getInt(18); if(sq_GetSkillLevel(sqrChr, SKILL_BYKK_ARMONIA) < 1) addAppendage.sq_SetValidTime(buffTime); else addAppendage.sq_SetValidTime(0); addAppendage.setEnableIsBuff(true); addAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(sqrChr), SKILL_BYKK_CHASER, sq_GetSkillLevel(sqrChr, SKILL_BYKK_CHASER)); CNSquirrelAppendage.sq_Append(addAppendage, sqrChr, sqrChr, true); local movespeedRate = obj.getVar("buff").getInt(10); local attackspeedRate = obj.getVar("buff").getInt(11); local criticaldamageRate = obj.getVar("buff").getInt(17); local change_appendage = addAppendage.sq_getChangeStatus("kkschaser"); if(!change_appendage) change_appendage = addAppendage.sq_AddChangeStatus("kkschaser",sqrChr, sqrChr, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_MOVE_SPEED, false, (movespeedRate).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_ATTACK_SPEED, false, (attackspeedRate).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_PHYSICAL_CRITICAL_HIT_RATE, false, (criticaldamageRate*0.1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_HIT_RATE, false, (criticaldamageRate*0.1).tofloat()); } break; case SKILL_BYKK_CHASERSEXPLOSION://炫紋強壓 break; case SKILL_BYKK_UPPERSWING://天擊 break; case SKILL_BYKK_SWING://碎霸 break; case SKILL_BYKK_HANDSTRIKE://落花掌 break; case SKILL_BYKK_POKETHROW://圓舞棍 break; case SKILL_BYKK_RANDOMPIERCESTRIKE://流星閃影擊 break; case SKILL_BYKK_STRENGTHHANDSTRIKE://強襲流星打 switch(subtype){ case 21: if(damager.isObjectType(OBJECTTYPE_ACTIVE)){ local totalDamage = obj.getVar("custom").getInt(10) * 22 / 100; cearteSkillPassive_Battlemage_bykk(sqrChr,damager,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,0, sq_GetCenterZPos(boundingBox) - 10,obj.getDirection(),SKILL_BYKK_STRENGTHHANDSTRIKE,22,totalDamage,0,0,0,0,0,0,0); } break; } break; case SKILL_BYKK_DRAGONSPEAR://煌龍偃月 break; case SKILL_BYKK_QUASAREXPLOSION://星紋隕爆 break; case SKILL_BYKK_CHASERCLUSTER://炫紋簇 if(damager.isObjectType(OBJECTTYPE_ACTIVE)) sq_SetShake(obj, 5, 50); break; case SKILL_BYKK_RANDOMPIERCESTRIKEEX://流星雷連擊 break; case SKILL_BYKK_SWINGEX://閃擊碎霸 break; case SKILL_BYKK_FUSIONCHASER://炫紋融合 break; case SKILL_BYKK_CHASEREVOLUTION://炫紋進化 break; case SKILL_BYKK_DOUBLESWING://雙重錘擊 break; case SKILL_BYKK_TIMERBOMB://炫紋爆彈 break; case SKILL_BYKK_AVATARDANCE://使徒之舞 break; case SKILL_BYKK_AVATARFINISH://一騎當千碎霸 switch(subtype){ case 2: if(isStuck) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; obj.sq_PlaySound("AVATAR_FINISH_EFFECT"); local apdPath = "character/mage/battlemage_bykk/ap/ap_avatarfinish.nut"; local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, sqrChr, SKILL_BYKK_AVATARFINISH, false, apdPath, true); sq_HoldAndDelayDie(damager, sqrChr, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL, addAppendage); addAppendage.sq_SetValidTime(2000); local totalDamage = sqrChr.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARFINISH, -1, 1, 1.0) + 100; local group = sq_GetGroup(damager); local uniqueId = sq_GetUniqueId(damager); cearteSkillPassive_Battlemage_bykk(sqrChr,damager,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,0,sq_GetObjectHeight(damager) / 2,sqrChr.getDirection(),SKILL_BYKK_AVATARFINISH,1,totalDamage,group,uniqueId,0,0,0,0,0); break; } break; case SKILL_BYKK_CHASERLAUNCHPOWERED://炫紋聚合 break; case SKILL_BYKK_PRECENCIA://太古化身 break; case SKILL_BYKK_LAYOFPRIMITIVE://炫紋之源:太古神光 break; } if(skillIndex != SKILL_BYKK_CHASER){ if(isStuck) return; if(!sqrChr || sqrChr.getState() == STATE_DIE) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, CHASERLAUNCH_APDPATH)) CNSquirrelAppendage.sq_AppendAppendage(sqrChr, sqrChr, -1, false, CHASERLAUNCH_APDPATH, true); local addAppendage = CNSquirrelAppendage.sq_GetAppendage(sqrChr, CHASERLAUNCH_APDPATH); if(addAppendage){ local buffTime = sq_GetLevelData(sqrChr, SKILL_BYKK_CHASERLAUNCH, 0, sq_GetSkillLevel(sqrChr, SKILL_BYKK_CHASERLAUNCH)); addAppendage.sq_SetValidTime(buffTime); addAppendage.getVar("target").clear_obj_vector(); addAppendage.getVar("target").push_obj_vector(damager); } } } function onKeyFrameFlag_po_battlemage_bykk(obj, flagIndex) { if(!obj) return; local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter()); local skillIndex = obj.getVar("skillIndex").getInt(0); local subtype = obj.getVar("subtype").getInt(0); local state = obj.getVar("state").getInt(0); switch(skillIndex){ case SKILL_BYKK_THRUST://龍牙 break; case SKILL_BYKK_CHASER://炫紋 break; case SKILL_BYKK_CHASERSEXPLOSION://炫紋強壓 break; case SKILL_BYKK_UPPERSWING://天擊 break; case SKILL_BYKK_SWING://碎霸 break; case SKILL_BYKK_HANDSTRIKE://落花掌 break; case SKILL_BYKK_POKETHROW://圓舞棍 break; case SKILL_BYKK_RANDOMPIERCESTRIKE://流星閃影擊 break; case SKILL_BYKK_STRENGTHHANDSTRIKE://強襲流星打 break; case SKILL_BYKK_DRAGONSPEAR://煌龍偃月 break; case SKILL_BYKK_QUASAREXPLOSION://星紋隕爆 break; case SKILL_BYKK_CHASERCLUSTER://炫紋簇 break; case SKILL_BYKK_RANDOMPIERCESTRIKEEX://流星雷連擊 break; case SKILL_BYKK_SWINGEX://閃擊碎霸 break; case SKILL_BYKK_FUSIONCHASER://炫紋融合 break; case SKILL_BYKK_CHASEREVOLUTION://炫紋進化 break; case SKILL_BYKK_DOUBLESWING://雙重錘擊 break; case SKILL_BYKK_TIMERBOMB://炫紋爆彈 break; case SKILL_BYKK_AVATARDANCE://使徒之舞 break; case SKILL_BYKK_AVATARFINISH://一騎當千碎霸 break; case SKILL_BYKK_CHASERLAUNCHPOWERED://炫紋聚合 break; case SKILL_BYKK_PRECENCIA://太古化身 break; case SKILL_BYKK_LAYOFPRIMITIVE://炫紋之源:太古神光 break; } } function procAppend_po_battlemage_bykk(obj) { if(!obj) return; local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter()); local skillIndex = obj.getVar("skillIndex").getInt(0); local subtype = obj.getVar("subtype").getInt(0); local state = obj.getVar("state").getInt(0); switch(skillIndex){ case SKILL_BYKK_THRUST://龍牙 break; case SKILL_BYKK_CHASER://炫紋 break; case SKILL_BYKK_CHASERSEXPLOSION://炫紋強壓 break; case SKILL_BYKK_UPPERSWING://天擊 break; case SKILL_BYKK_SWING://碎霸 break; case SKILL_BYKK_HANDSTRIKE://落花掌 break; case SKILL_BYKK_POKETHROW://圓舞棍 break; case SKILL_BYKK_RANDOMPIERCESTRIKE://流星閃影擊 break; case SKILL_BYKK_STRENGTHHANDSTRIKE://強襲流星打 break; case SKILL_BYKK_DRAGONSPEAR://煌龍偃月 break; case SKILL_BYKK_QUASAREXPLOSION://星紋隕爆 break; case SKILL_BYKK_CHASERCLUSTER://炫紋簇 break; case SKILL_BYKK_RANDOMPIERCESTRIKEEX://流星雷連擊 break; case SKILL_BYKK_SWINGEX://閃擊碎霸 break; case SKILL_BYKK_FUSIONCHASER://炫紋融合 break; case SKILL_BYKK_CHASEREVOLUTION://炫紋進化 break; case SKILL_BYKK_DOUBLESWING://雙重錘擊 break; case SKILL_BYKK_TIMERBOMB://炫紋爆彈 break; case SKILL_BYKK_AVATARDANCE://使徒之舞 break; case SKILL_BYKK_AVATARFINISH://一騎當千碎霸 break; case SKILL_BYKK_CHASERLAUNCHPOWERED://炫紋聚合 break; case SKILL_BYKK_PRECENCIA://太古化身 break; case SKILL_BYKK_LAYOFPRIMITIVE://炫紋之源:太古神光 break; } } function onSetState_mage_attack(obj, state, datas, isResetTimer) { if(!obj) return; local index = obj.sq_GetVectorData(datas, 0); // if(index == 0){ // local set = obj.sq_GetVectorData(datas, 1); // print("test :"+set); // if(set == 100){ // obj.setTimeEvent(1, 10, 1, false); // } // } // print("index = "+index); if(index == 50){ obj.sq_SetCurrentAnimation(205); obj.getVar("setattack").setInt(0, index); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 1)); // sq_SetVelocity(obj, 0, 0.0); return; } if(sq_GetSkillLevel(obj, SKILL_BYKK_ENABLEFINISHATTACK) > 0){ if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ local aniName = ["Attack1","Attack2","Attack3"]; local ani = getCurrentAnimation_precencia(obj, aniName[index], false, false); obj.setCurrentAnimation(ani); } else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ local aniName = [206,207,208]; obj.sq_SetCurrentAnimation(aniName[index]); } else obj.sq_SetCurrentAnimation(10 + index); local atkIndex = [9,10,11], speedRate = [20,50,20]; local totalDamage = sq_GetLevelData(obj, 174, 0, sq_GetSkillLevel(obj, 174)) + 100; sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, atkIndex[index])); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); sq_SetVelocity(obj, 0, speedRate[index].tofloat()); } } function onEndCurrentAni_mage_attack(obj) { local substate = obj.getVar("setattack").getInt(0) if(substate == 50){ obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false); } return; } function onTimeEvent_mage_attack(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false); break; } } function onAttack_mage_dashattack(obj, damager, boundingBox, isStuck) { if(!obj) return; } function onAttack_mage_jumpattack(obj, damager, boundingBox, isStuck) { if(!obj) return; } function onAfterSetState_mage_dashattack(obj, state, datas, isResetTimer) { if(!obj) return; obj.applyBasicAttackUp(sq_GetCurrentAttackInfo(obj),obj.getState()); sq_SetCurrentAttackInfo(obj,sq_GetCurrentAttackInfo(obj)); local speed = 1.0; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) speed = 1.3; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) speed = 1.6; obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speed, speed); } function onAfterSetState_mage_jumpattack(obj, state, datas, isResetTimer) { if(!obj) return; obj.applyBasicAttackUp(sq_GetCurrentAttackInfo(obj),obj.getState()); sq_SetCurrentAttackInfo(obj,sq_GetCurrentAttackInfo(obj)); local speed = 1.0; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) speed = 1.3; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) speed = 1.6; obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speed, speed); } function checkExecutableSkill_Avatardance(obj) { if (!obj) return false; if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false; local isUse = obj.sq_IsUseSkill(SKILL_BYKK_AVATARDANCE); if (isUse){ if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) obj.getVar("skillSub").setInt(100, 2); else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) obj.getVar("skillSub").setInt(100, 1); else obj.getVar("skillSub").setInt(100, 0); obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(SKILL_BYKK_AVATARDANCE, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_Avatardance(obj) { if (!obj) return false; return true; } function onSetState_Avatardance(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); obj.sq_ZStop(); local aniSet = [ [84,85,86,87,88,89,90,91,297], ["AvatarDance_A","AvatarDance_B","AvatarDance_C","AvatarDance_D","AvatarDance_E01","AvatarDance_E02","AvatarDance_F01","AvatarDance_F02","AvatarDance_ChaserPush"], [212,213,214,216,217,215] ]; switch(obj.getVar("skillSub").getInt(100)){ case 0: obj.sq_SetCurrentAnimation(aniSet[0][subState]); break; case 1: local Ani = getCurrentAnimation_precencia(obj, aniSet[1][subState], false, false); obj.setCurrentAnimation(Ani); break; case 2: obj.sq_SetCurrentAnimation(aniSet[2][subState]); switch(subState){ case 1: obj.sq_PlaySound("WZ_PRECENCIA_AVATARDANCE_1_0"+sq_getRandom(1, 2).tostring()); obj.sq_PlaySound("PRECENCIA_AVATARDANCE_1"); obj.sq_PlaySound("PRECENCIA_AVATARDANCE_2"); break; case 2: obj.sq_PlaySound("WZ_PRECENCIA_AVATARDANCE_1_0"+sq_getRandom(3, 4).tostring()); obj.sq_PlaySound("PRECENCIA_AVATARDANCE_3"); obj.sq_PlaySound("PRECENCIA_AVATARDANCE_4"); break; case 3: obj.sq_PlaySound("R_WZ_PRECENCIA_AVATARDANCE_2"); obj.sq_PlaySound("PRECENCIA_AVATARDANCE_5"); break; case 4: obj.sq_PlaySound("WZ_PRECENCIA_AVATARDANCE_3"); obj.sq_PlaySound("PRECENCIA_AVATARDANCE_6"); break; } break; } local speedRate = 1.0; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) speedRate = 1.3; else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) speedRate = 1.5; obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speedRate, speedRate); if(subState == 6 && obj.getVar("skillSub").getInt(100) < 2){ local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(false); obj.getVar("avatardance_move").setInt(11, sq_GetZPos(obj)); if(obj.isExistTimeEvent(1)) obj.stopTimeEvent(1); obj.setTimeEvent(2, delay / 60, 30, true); } else if(subState == 4 && obj.getVar("skillSub").getInt(100) == 2){ local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(0, 4); obj.getVar("avatardance_move").setInt(11, sq_GetZPos(obj)); if(obj.isExistTimeEvent(1)) obj.stopTimeEvent(1); obj.setTimeEvent(2, delay / 60, 30, true); } else if(subState == 7 && obj.getVar("skillSub").getInt(100) < 2){ obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/avatardance/avatardance_d_eff03.ani"), 0, 0); } } function onEndCurrentAni_Avatardance(obj) { if(!obj) return; local subState = obj.getSkillSubState(); local sub = sq_GetLevelData(obj, SKILL_BYKK_AVATARDANCE, 13, sq_GetSkillLevel(obj, SKILL_BYKK_AVATARDANCE)); local stateMax = 7; if(obj.getVar("skillSub").getInt(100) == 2){ stateMax = 4; } if(sub > 0 && ((subState == 3 && obj.getVar("skillSub").getInt(100) < 2) || (subState == 2 && obj.getVar("skillSub").getInt(100) == 2))){ obj.sq_IntVectClear(); if(obj.getVar("skillSub").getInt(100) < 2) obj.sq_IntVectPush(8); else obj.sq_IntVectPush(5); obj.sq_AddSetStatePacket(SKILL_BYKK_AVATARDANCE, STATE_PRIORITY_AUTO, true); } else{ if(subState < stateMax){ obj.sq_IntVectClear(); obj.sq_IntVectPush(subState + 1); obj.sq_AddSetStatePacket(SKILL_BYKK_AVATARDANCE, STATE_PRIORITY_AUTO, true); } else{ obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); } } } function onProcCon_Avatardance(obj) { if(!obj) return; } function onKeyFrameFlag_Avatardance(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 101: obj.sq_PlaySound("AVATAR_DANCE_SUMMONSPEAR"); sq_flashScreen(obj, 180, 0, 0, 102, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_CLOSEBACK); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/avatardance/avatardance_a_eff01.ani", 0, 1, 0); break; case 102: sq_flashScreen(obj, 0, 0, 60, 76, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); break; case 103: obj.sq_PlaySound("R_WZ_ATK"); obj.sq_PlaySound("AVATAR_DANCE_01"); sq_SetMyShake(obj, 6, 150); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/avatardance/avatardance_b_back_eff01.ani", 0, -1, 0); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/avatardance/avatardance_b_eff01.ani", 0, 1, 0); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARDANCE, -1, 0, 1.0) + 100; sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 39)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); break; case 104: sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/avatardance/avatardance_c_eff01.ani", 0, 1, 0); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARDANCE, -1, 1, 1.0) + 100; sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 40)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); break; case 105: obj.sq_PlaySound("AVATAR_DANCE_02"); sq_SetMyShake(obj, 6, 150); break; case 106: sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/avatardance/avatardance_d_eff03.ani", 0, 1, 0); break; case 107: obj.sq_PlaySound("R_WZ_ATK"); obj.sq_PlaySound("AVATAR_DANCE_03"); sq_SetMyShake(obj, 6, 150); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARDANCE, -1, 2, 1.0) + 100; sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 41)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); break; case 108: sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/avatardance/avatardance_e01_moveeff01.ani", 0, -1, 0); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/avatardance/avatardance_e01_eff01.ani", 0, 1, 0); break; case 109: local speed = 100.0; if(obj.getDirection() == ENUM_DIRECTION_LEFT) speed = -speed; sq_SetVelocity(obj, 0, speed); break; case 110: obj.sq_PlaySound("AVATAR_DANCE_04"); sq_SetMyShake(obj, 5, 120); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/avatardance/avatardance_e02_backeff03.ani", 0, -1, 0); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/avatardance/avatardance_e02_eff03.ani", 0, 1, 0); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARDANCE, -1, 3, 1.0) + 100; sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 42)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(false); obj.getVar("avatardance_move").setInt(10, sq_GetXPos(obj)); obj.getVar("avatardance_move").setInt(11, sq_GetZPos(obj)); obj.setTimeEvent(1, delay / 80, 40, true); break; case 111: if(obj.getVar("skillSub").getInt(100) == 1) break; obj.sq_PlaySound("R_WZ_AVATAR_DANCE_FIN"); sq_SetMyShake(obj, 8, 400); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/avatardance/avatardance_f02_flooreff01.ani", 0, -1, 0); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/avatardance/avatardance_f02_eff05.ani", 0, 1, 0); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARDANCE, -1, 4, 1.0) + 100; sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 43)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); break; case 112: obj.sq_PlaySound("AVATAR_DANCE_FINISH"); if(obj.getVar("skillSub").getInt(100) == 1){ obj.sq_PlaySound("R_WZ_AVATAR_DANCE_FIN"); sq_SetMyShake(obj, 8, 400); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/avatardance/avatardance_f02_flooreff01.ani", 0, -1, 0); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/avatardance/avatardance_f02_eff05.ani", 0, 1, 0); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARDANCE, -1, 4, 1.0) + 100; sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 43)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); } break; case 201: obj.sq_PlaySound("PRECENCIA_AVATARDANCE_1"); sq_SetMyShake(obj, 6, 150); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARDANCE, -1, 0, 1.0) + 100; sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 39)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); break; case 202: obj.sq_PlaySound("PRECENCIA_AVATARDANCE_2"); sq_SetMyShake(obj, 6, 150); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARDANCE, -1, 1, 1.0) + 100; sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 40)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); break; case 203: obj.sq_PlaySound("PRECENCIA_AVATARDANCE_3"); sq_SetMyShake(obj, 6, 150); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARDANCE, -1, 2, 1.0) + 100; sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 41)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/avatardance/precencia/avatardance_c_04.ani", 0, 1, 0); break; case 204: obj.sq_PlaySound("PRECENCIA_AVATARDANCE_4"); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARDANCE, -1, 3, 1.0) + 100; sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 42)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(3, 5); obj.getVar("avatardance_move").setInt(10, sq_GetXPos(obj)); obj.getVar("avatardance_move").setInt(11, sq_GetZPos(obj)); obj.setTimeEvent(3, delay / 10, 10, true); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/avatardance/precencia/avatardance_d_08.ani", 0, 1, 0); break; case 205: obj.sq_PlaySound("PRECENCIA_AVATARDANCE_5"); break; case 206: obj.sq_PlaySound("PRECENCIA_AVATARDANCE_6"); sq_SetMyShake(obj, 8, 400); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARDANCE, -1, 4, 1.0) + 100; sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 43)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); break; case 207: if(obj.getVar("skillSub").getInt(100) == 2){ obj.sq_PlaySound("PRECENCIA_AVATARDANCE_3"); obj.sq_PlaySound("R_WZ_ATK"); } else{ obj.sq_PlaySound("AVATAR_DANCE_03"); obj.sq_PlaySound("R_WZ_AVATAR_DANCE_FIN"); } sq_SetMyShake(obj, 6, 150); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARDANCE, -1, 3, 1.0) + obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARDANCE, -1, 4, 1.0) + 200; totalDamage = totalDamage * 130 / 100; sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 41)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); sq_flashScreen(obj, 20, 90, 20, 127, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); sq_SetMyShake(obj, 20, 150); break; case 208: obj.sq_PlaySound("AVATAR_DANCE_CHARGE_TALISMAN"); break; } local attackInfo = sq_GetCurrentAttackInfo(obj); if(attackInfo){ attackInfo.setAttackType(ATTACKTYPE_PHYSICAL); sq_SetAddWeaponDamage(attackInfo, true); } return true; } function onTimeEvent_Avatardance(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: local vx = sq_GetUniformVelocity(0, 200, timeEventCount, 40); local vz = sq_GetUniformVelocity(0, 200, timeEventCount, 40); local dstX = sq_GetDistancePos(obj.getVar("avatardance_move").getInt(10), obj.getDirection(), vx); if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX); sq_setCurrentAxisPos(obj, 2, vz); break; case 2: local vz = sq_GetUniformVelocity(obj.getVar("avatardance_move").getInt(11), 0, timeEventCount, 10); sq_setCurrentAxisPos(obj, 2, vz); break; case 3: local vx = sq_GetUniformVelocity(0, 200, timeEventCount, 10); local vz = sq_GetUniformVelocity(0, 100, timeEventCount, 10); local dstX = sq_GetDistancePos(obj.getVar("avatardance_move").getInt(10), obj.getDirection(), vx); if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX); sq_setCurrentAxisPos(obj, 2, vz); break; } } function onEndState_Avatardance(obj, new_state) { if(!obj) return; if(new_state != SKILL_BYKK_AVATARDANCE){ sq_SimpleMoveToNearMovablePos(obj,1200); } } function checkExecutableSkill_Avatarfinish(obj) { if (!obj) return false; if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false; local isUse = obj.sq_IsUseSkill(SKILL_BYKK_AVATARFINISH); if (isUse){ if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) obj.getVar("skillSub").setInt(100, 2); else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) obj.getVar("skillSub").setInt(100, 1); else obj.getVar("skillSub").setInt(100, 0); obj.sq_IntVectClear(); if(obj.getVar("skillSub").getInt(100) == 0) obj.sq_IntVectPush(0); else obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(SKILL_BYKK_AVATARFINISH, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_Avatarfinish(obj) { if (!obj) return false; return true; } function onSetState_Avatarfinish(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); obj.sq_ZStop(); switch(subState){ case 0: obj.sq_SetCurrentAnimation(295); obj.sq_PlaySound("AVATAR_FINISH_CAST"); obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(0, 0); local speedRate = 5900 / delay; local aniPath = ["character/mage/effect/animation/battlemage_bykk/avatar/avatarfinish_normal_ready_02.ani","character/mage/effect/animation/battlemage_bykk/avatar/avatarfinish_normal_ready_03.ani","character/mage/effect/animation/battlemage_bykk/avatar/avatarfinish_normal_ready_04.ani"]; for(local i = 0; i < aniPath.len(); i++){ local ypos = 1; if(i > 1) ypos = -1; local pooledObj = sq_AddDrawOnlyAniFromParent(obj, aniPath[i], 0, ypos, 0); local pAni = pooledObj.getCurrentAnimation(); pAni.setSpeedRate(speedRate.tofloat()); } break; case 1: if(obj.getVar("skillSub").getInt(100) == 1){ local Ani = getCurrentAnimation_precencia(obj, "AvatarFinish_Body", false, false); obj.setCurrentAnimation(Ani); obj.sq_PlaySound("WZ_AVATAR_FINISH"); obj.sq_PlaySound("AVATAR_FINISH"); obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(0, 0); local speedRate = 8000 / delay; local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARFINISH, -1, 0, 1.0) + 100; if(sq_GetSkillLevel(obj, SKILL_BYKK_SPEARMASTERY) > 0 && obj.getWeaponSubType() == 0) totalDamage = totalDamage * (1000 + sq_GetIntData(obj, SKILL_BYKK_SPEARMASTERY, 4)) / 1000; cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,0,0,obj.getDirection(),SKILL_BYKK_AVATARFINISH,2,totalDamage,speedRate,0,0,0,0,0,0); obj.setTimeEvent(0, 1000 / speedRate, 1, false); } else{ obj.sq_SetCurrentAnimation(211); obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(0, 0); local speedRate = 8700 / delay; for(local i = 18; i < 27; i++){ local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/avatar/precencia/avatar_inishxx1_"+i.tostring()+".ani", 0, 1, 0); local pAni = pooledObj.getCurrentAnimation(); pAni.setSpeedRate(speedRate.tofloat()); } local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARFINISH, -1, 0, 1.0) + 100; if(sq_GetSkillLevel(obj, SKILL_BYKK_SPEARMASTERY) > 0 && obj.getWeaponSubType() == 0) totalDamage = totalDamage * (1000 + sq_GetIntData(obj, SKILL_BYKK_SPEARMASTERY, 4)) / 1000; sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 66)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local attackInfo = sq_GetCurrentAttackInfo(obj); if(attackInfo){ attackInfo.setAttackType(ATTACKTYPE_PHYSICAL); sq_SetAddWeaponDamage(attackInfo, true); } } sq_flashScreen(obj,650,150,80,204, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); break; case 2: obj.sq_SetCurrentAnimation(296); break; } } function onEndCurrentAni_Avatarfinish(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(SKILL_BYKK_AVATARFINISH, STATE_PRIORITY_AUTO, true); break; case 1: if(obj.getVar("skillSub").getInt(100) == 0){ obj.sq_IntVectClear(); obj.sq_IntVectPush(2); obj.sq_AddSetStatePacket(SKILL_BYKK_AVATARFINISH, STATE_PRIORITY_AUTO, true); break; } case 2: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_Avatarfinish(obj) { if(!obj) return; } function onKeyFrameFlag_Avatarfinish(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 111: obj.sq_PlaySound("PRCENCIA_AVATAR_CAST"); break; case 301: obj.sq_PlaySound("AVATAR_FINISH_CAST"); sq_flashScreen(obj,0,80,80,255, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); break; case 303: obj.sq_PlaySound("AVATAR_FINISH"); sq_flashScreen(obj,60,60,420,204, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_COVER); sq_SetMyShake(obj, 8, 160); break; } return true; } function onTimeEvent_Avatarfinish(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 0: sq_flashScreen(obj,60,60,420,204, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_COVER); sq_SetMyShake(obj, 8, 160); break; } } function onEndState_Avatarfinish(obj, new_state) { if(!obj) return; } function onAttack_Avatarfinish(obj, damager, boundingBox, isStuck) { if(isStuck) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; obj.sq_PlaySound("AVATAR_FINISH_EFFECT"); local apdPath = "character/mage/battlemage_bykk/ap/ap_avatarfinish.nut"; local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, SKILL_BYKK_AVATARFINISH, false, apdPath, true); sq_HoldAndDelayDie(damager, obj, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL, addAppendage); addAppendage.sq_SetValidTime(2000); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AVATARFINISH, -1, 1, 1.0) + 100; if(sq_GetSkillLevel(obj, SKILL_BYKK_SPEARMASTERY) > 0 && obj.getWeaponSubType() == 0) totalDamage = totalDamage * (1000 + sq_GetIntData(obj, SKILL_BYKK_SPEARMASTERY, 4)) / 1000; local group = sq_GetGroup(damager); local uniqueId = sq_GetUniqueId(damager); cearteSkillPassive_Battlemage_bykk(obj,damager,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,0,sq_GetObjectHeight(damager) / 2,obj.getDirection(),SKILL_BYKK_AVATARFINISH,1,totalDamage,group,uniqueId,0,0,0,0,0); } function checkExecutableSkill_ChaserAutoCreate(obj) { // if (!obj) return false; // local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CHASERAUTOCREATE); // if (isUse){ // obj.sq_IntVectClear(); // obj.sq_IntVectPush(0); // obj.sq_AddSetStatePacket(SKILL_BYKK_CHASERAUTOCREATE, STATE_PRIORITY_IGNORE_FORCE, true); // return true; // } // return false; } function checkCommandEnable_ChaserAutoCreate(obj) { if (!obj) return false; return true; } function onSetState_ChaserAutoCreate(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(3); obj.setCurrentAnimation(Ani); break; case 1: local Ani = obj.sq_GetThrowShootAni(3); obj.setCurrentAnimation(Ani); break; } } function onEndCurrentAni_ChaserAutoCreate(obj) { if(!obj) return; if(!obj.sq_IsMyControlObject()) return; local substate = obj.getSkillSubState(); switch(substate){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(SKILL_BYKK_CHASERAUTOCREATE, STATE_PRIORITY_USER, true); break; case 1: obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false); break; } } function onProcCon_ChaserAutoCreate(obj) { if(!obj) return; } function onKeyFrameFlag_ChaserAutoCreate(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_ChaserAutoCreate(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_ChaserAutoCreate(obj, new_state) { if(!obj) return; } function checkExecutableSkill_Chasercluster(obj) { if (!obj) return false; if(obj.getVar("chaserClusterObj01").get_obj_vector_size() > 0){ obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(SKILL_BYKK_CHASERCLUSTER, STATE_PRIORITY_IGNORE_FORCE, true); return true; } if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false; local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CHASERCLUSTER); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(SKILL_BYKK_CHASERCLUSTER, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_Chasercluster(obj) { if (!obj) return false; return true; } function onSetState_Chasercluster(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ obj.sq_SetCurrentAnimation(219); } else{ if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ local Ani = getCurrentAnimation_precencia(obj, "ChaserClusterBodyStart_09", false, false); obj.setCurrentAnimation(Ani); } else obj.sq_SetCurrentAnimation(82); } local flashScreenObj = sq_flashScreen(obj,80,1300,240,150, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); obj.getVar("flashobj").clear_obj_vector(); obj.getVar("flashobj").push_obj_vector(flashScreenObj); break; case 1: if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){ obj.sq_SetCurrentAnimation(220); } else{ if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){ local Ani = getCurrentAnimation_precencia(obj, "ChaserClusterBodyEnd_06", false, false); obj.setCurrentAnimation(Ani); } else obj.sq_SetCurrentAnimation(83); } break; } local currentAni = obj.getCurrentAnimation(); sq_ClearAttackBox(currentAni); local speed = 1.0; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) speed = 0.3 + speed; else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) speed = 0.5 + speed; obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speed, speed); } function onEndCurrentAni_Chasercluster(obj) { if(!obj) return; obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); } function onProcCon_Chasercluster(obj) { if(!obj) return; } function onKeyFrameFlag_Chasercluster(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 1: obj.sq_PlaySound("CHASER_CLUSTER_SWISH"); obj.sq_PlaySound("R_WZ_CHASER_CLUSTER"); sq_SetMyShake(obj, 5, 100); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/chasercluster/chaserclusterbodystartobj_07.ani", 0, 1, 0); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_CHASERCLUSTER, -1, 0, 1.0) + 100; local createMax = sq_GetIntData(obj, SKILL_BYKK_CHASERCLUSTER, 2); if(sq_GetLevelData(obj, SKILL_BYKK_CHASERCLUSTER, 1, sq_GetSkillLevel(obj, SKILL_BYKK_CHASERCLUSTER)) > 0) createMax = 1; local lifeTime = sq_GetIntData(obj, SKILL_BYKK_CHASERCLUSTER, 0); if(sq_GetLevelData(obj, SKILL_BYKK_CHASERCLUSTER, 3, sq_GetSkillLevel(obj, SKILL_BYKK_CHASERCLUSTER)) > 0) lifeTime = 100; local sizeRate = sq_GetIntData(obj, SKILL_BYKK_CHASERCLUSTER, 13); cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,232,0,50,obj.getDirection(),SKILL_BYKK_CHASERCLUSTER,1,totalDamage,createMax,lifeTime,sizeRate,0,0,0,0); local xpos = [140,180,240,303,325,310,370,365], zpos = [45,140,75,130,95,40,70,150], size = [130,95,150,100,60,105,110,75]; if(sq_GetLevelData(obj, SKILL_BYKK_CHASERCLUSTER, 2, sq_GetSkillLevel(obj, SKILL_BYKK_CHASERCLUSTER)) > 0){ cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,232,0,100,obj.getDirection(),SKILL_BYKK_CHASERCLUSTER,2,lifeTime,300,0,0,0,0,0,0); } else{ for(local i = 0; i < 8; i++){ cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,xpos[i],0,zpos[i],obj.getDirection(),SKILL_BYKK_CHASERCLUSTER,2,lifeTime,size[i],0,0,0,0,0,0); } } break; case 2://引爆 case 13://引爆 //if(flagIndex == 2) obj.sq_PlaySound("WZ_CHASER_EXPLOSION"); local attackObj = obj.getVar("chaserClusterObj01").get_obj_vector(0); if(attackObj){ local colObj = sq_GetCNRDObjectToCollisionObject(attackObj); colObj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, ""); } local size = obj.getVar("chaserClusterObj02").get_obj_vector_size(); for(local i = 0; i < size; i++){ local effectObj = obj.getVar("chaserClusterObj02").get_obj_vector(i); if(effectObj){ local colObj = sq_GetCNRDObjectToCollisionObject(effectObj); if(colObj.isExistTimeEvent(0)) colObj.stopTimeEvent(0); if(colObj.getState() <= 21) colObj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, ""); } } break; case 11: sq_flashScreen(obj, 350, 150, 100, 255, sq_RGB(0, 0, 0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); break; case 12: obj.sq_PlaySound("WZ_PRECENCIA_CHASERCLUSTER_1"); sq_SetMyShake(obj, 5, 120); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/chasercluster/precencia/chasercluster_13.ani", 0, 1, 0); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/chasercluster/precencia/chasercluster_12.ani", 0, 1, 0); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/chasercluster/precencia/chasercluster_11.ani", 0, 1, 0); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/chasercluster/precencia/chasercluster_10.ani", 0, 1, 0); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/chasercluster/precencia/chasercluster_09.ani", 0, 1, 0); sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/chasercluster/precencia/chasercluster_08.ani", 0, 1, 0); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_CHASERCLUSTER, -1, 0, 1.0) + 100; local createMax = sq_GetIntData(obj, SKILL_BYKK_CHASERCLUSTER, 2); local lifeTime = sq_GetIntData(obj, SKILL_BYKK_CHASERCLUSTER, 0); local sizeRate = sq_GetIntData(obj, SKILL_BYKK_CHASERCLUSTER, 13); cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,232,0,50,obj.getDirection(),SKILL_BYKK_CHASERCLUSTER,1,totalDamage,createMax,lifeTime,sizeRate,0,0,0,0); local xpos = [140,180,240,303,325,310,370,365], zpos = [45,140,75,130,95,40,70,175], size = [150,75,175,100,80,120,125,60]; for(local i = 0; i < 8; i++){ cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,xpos[i],0,20 + zpos[i],obj.getDirection(),SKILL_BYKK_CHASERCLUSTER,2,lifeTime,size[i],0,0,0,0,0,0); } break; } return true; } function onTimeEvent_Chasercluster(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_Chasercluster(obj, new_state) { if(!obj) return; } function checkExecutableSkill_Chaserevolution(obj) { if (!obj) return false; if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false; local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CHASEREVOLUTION); if (isUse){ if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) obj.getVar("skillSub").setInt(100, 2); else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) obj.getVar("skillSub").setInt(100, 1); else obj.getVar("skillSub").setInt(100, 0); obj.sq_IntVectClear(); obj.sq_IntVectPush(3); obj.sq_AddSetStatePacket(STATE_BYKK_GODDNESSOFWAR, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_Chaserevolution(obj) { if (!obj) return false; return true; } function onSetState_Chaserevolution(obj, state, datas, isResetTimer) { if(!obj) return; } function onEndCurrentAni_Chaserevolution(obj) { if(!obj) return; } function onProcCon_Chaserevolution(obj) { if(!obj) return; } function onKeyFrameFlag_Chaserevolution(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_Chaserevolution(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_Chaserevolution(obj, new_state) { if(!obj) return; } function checkExecutableSkill_ChaserLaunch(obj) { if (!obj) return false; // local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, CHASERLAUNCH_APDPATH); // if(addAppendage){ // local targetObj = addAppendage.getVar("target").get_obj_vector(0); // if(targetObj){ // shootBattlemageChaser(obj, targetObj); // obj.startSkillCoolTime(SKILL_BYKK_CHASERLAUNCH, sq_GetSkillLevel(obj, SKILL_BYKK_CHASERLAUNCH), -1); // return true; // } // else return false; // } // else return false; return true; } function checkCommandEnable_ChaserLaunch(obj) { if (!obj) return false; // if(obj.getVar("kksChaser").get_obj_vector_size() < 1) return false; // if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, CHASERLAUNCH_APDPATH)) return false; return true; } function onSetState_ChaserLaunch(obj, state, datas, isResetTimer) { if(!obj) return; } function onEndCurrentAni_ChaserLaunch(obj) { if(!obj) return; } function onProcCon_ChaserLaunch(obj) { if(!obj) return; } function onKeyFrameFlag_ChaserLaunch(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_ChaserLaunch(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_ChaserLaunch(obj, new_state) { if(!obj) return; }