////////////////////////////////////////////////////////////////////////////// function onStart_appendage_equipchakraweapon(appendage) { local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); local magicalEquAttack = 0, stunRate = 0, coolTime = 0, criticaldamageRate = 0, criticalRate = 0; local shurikenImproveLevel = sq_GetSkillLevel(obj, SKILL_THBYKK_SHURIKENIMPROVE); local ninjutsuLevel = sq_GetSkillLevel(obj, SKILL_THBYKK_NINJUTSU); local kurokagenojutsuLevel = sq_GetSkillLevel(obj, SKILL_THBYKK_KUROKAGENOJUTSU); local fireMarkLevel = sq_GetSkillLevel(obj, SKILL_THBYKK_FIREMARK); if(shurikenImproveLevel > 0 && obj.getWeaponSubType() == 5){ magicalEquAttack = sq_GetLevelData(obj, SKILL_THBYKK_SHURIKENIMPROVE, 0, shurikenImproveLevel); stunRate = sq_GetLevelData(obj, SKILL_THBYKK_SHURIKENIMPROVE, 1, shurikenImproveLevel); } if(ninjutsuLevel > 0) coolTime = sq_GetLevelData(obj, SKILL_THBYKK_NINJUTSU, 6, ninjutsuLevel); if(kurokagenojutsuLevel > 0) criticaldamageRate = sq_GetLevelData(obj, SKILL_THBYKK_KUROKAGENOJUTSU, 39, kurokagenojutsuLevel); if(fireMarkLevel > 0) criticalRate = sq_GetLevelData(obj, SKILL_THBYKK_FIREMARK, 15, fireMarkLevel); // print("magicalEquAttack = "+magicalEquAttack); // print("stunRate = "+stunRate); // print("coolTime = "+coolTime); // print("criticaldamageRate = "+criticaldamageRate); // print("criticalRate = "+criticalRate); local change_appendage = appendage.sq_getChangeStatus("equipchakraweapon"); if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("equipchakraweapon",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000); if(change_appendage){ change_appendage.clearParameter(); if(magicalEquAttack > 0) change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_ATTACK, true, (magicalEquAttack * 0.1).tofloat()); if(stunRate > 0) change_appendage.addParameter(CHANGE_STATUS_TYPE_STUCK, false, (stunRate * -0.1).tofloat()); if(coolTime > 0) change_appendage.addParameter(CHANGE_STATUS_TYPE_COOLTIME_DECLINE, true, (coolTime * -0.1).tofloat()); if(criticaldamageRate > 0) change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_DAMAGE_RATE, false, (criticaldamageRate * 0.1 / 0.667).tofloat()); if(criticalRate > 0) change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_HIT_RATE, false, (criticalRate * 0.1).tofloat()); } } function onAttackParent_appendage_equipchakraweapon(appendage, realAttacker, damager, boundingBox, isStuck) { if(!appendage) return; if(isStuck || !damager.isObjectType(OBJECTTYPE_ACTIVE)) return; // if(realAttacker.isObjectType(OBJECTTYPE_PASSIVE)){ // local colObj = sq_GetCNRDObjectToCollisionObject(realAttacker); // if(colObj.getVar("skillIndex").getInt(0) == false) return; // } // local parentObj = appendage.getParent(); // local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); // local prob = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONMASTERY, -1, 6, 1.0) + 100; // if(sq_getRandom(1, 1000) < 1000 - prob) return; // if(damager.getVar("SFPoison").get_obj_vector_size() > 0){ // local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); // if(poisonObj){ // local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); // local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONMASTERY, -1, 4, 1.0) + 100; // local time = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONMASTERY, -1, 3, 1.0) + 100; // // print("damageAddSet = "+damage); // local baseDamage = colObj.getVar("damage").getInt(0); // colObj.getVar("damage").setInt(0, baseDamage + damage); // colObj.getVar("time").setInt(0, time); // colObj.getVar("custom").setInt(2, time / 500); // } // } } function ProcPassiveSkill_Kunoichi(obj, skill_index, skill_level) { if(!obj) return; switch(skill_index){ case SKILL_THBYKK_EQUIPCHAKRAWEAPON: if(skill_level > 0){ local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, skill_index, false, "character/thief/3_kunoichi_bykk/passiveskill/ap_equipchakraweapon.nut", true); } break; } } function setState_Kunoichi(obj, state, datas, isResetTimer) { if(!obj) return; } function setSwordKusanagiEffect(obj, pathName) { obj.sq_AddStateLayerAnimation(11001,obj.sq_CreateCNRDAnimation("effect/animation/3kunoichi_bykk/swordofkusanagi/kusanagifrontweaponnormal/"+pathName+".ani"), 0, 0); obj.sq_AddStateLayerAnimation(11002,obj.sq_CreateCNRDAnimation("effect/animation/3kunoichi_bykk/swordofkusanagi/kusanagifrontweapondodge/"+pathName+".ani"), 0, 0); obj.sq_AddStateLayerAnimation(-1,obj.sq_CreateCNRDAnimation("effect/animation/3kunoichi_bykk/swordofkusanagi/kusanagibackweaponnormal/"+pathName+".ani"), 0, 0); obj.sq_AddStateLayerAnimation(-2,obj.sq_CreateCNRDAnimation("effect/animation/3kunoichi_bykk/swordofkusanagi/kusanagibackweapondodge/"+pathName+".ani"), 0, 0); obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/3kunoichi_bykk/swordofkusanagi/kusanagimufftop/"+pathName+".ani"), 0, 0); obj.sq_AddStateLayerAnimation(-1,obj.sq_CreateCNRDAnimation("effect/animation/3kunoichi_bykk/swordofkusanagi/kusanagimuffbot/"+pathName+".ani"), 0, 0); if(obj.getState() != 0){ local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, APDPATH_SWORDOFKUSANAGI_BUFF); addAppendage.sq_DeleteEffectFront(); addAppendage.sq_DeleteEffectBack(); } } function resetDungeonStart_Kunoichi(obj, moduleType, resetReason, isDeadTower, isResetSkillUserCount) { if(!obj) return; } function procSkill_Kunoichi(obj) { if(!obj) return; if(sq_GetSkillLevel(obj, SKILL_THBYKK_KURVEJADE) > 0){ if(obj.getVar("kurvejadeBool").getBool(0) == false){ if(obj.getVar("kurvejadeFireObj").get_obj_vector_size() < 1){ obj.getVar("kurvejadeBool").setBool(0, true); createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,0, 0, 70,sq_GetDirection(obj),3,SKILL_THBYKK_KURVEJADE,1,0,0,0,0,0,0,0,0); } } if(obj.getVar("kurvejadeBool").getBool(1) == false){ if(obj.getVar("kurvejadeDarkObj").get_obj_vector_size() < 1){ obj.getVar("kurvejadeBool").setBool(1, true); createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,0, 0, 70,sq_GetDirection(obj),3,SKILL_THBYKK_KURVEJADE,2,0,0,0,0,0,0,0,0); } } if(obj.getVar("kurvejadeBool").getBool(2) == false){ if(obj.getVar("kurvejadeLightObj").get_obj_vector_size() < 1){ obj.getVar("kurvejadeBool").setBool(2, true); createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,0, 0, 70,sq_GetDirection(obj),3,SKILL_THBYKK_KURVEJADE,3,0,0,0,0,0,0,0,0); } } } if(sq_GetSkillLevel(obj, SKILL_THBYKK_FIREMARK) > 0){ local skill = sq_GetSkill(obj, SKILL_THBYKK_FIREMARK); if(!skill.isSealFunction()){ local timer = obj.getVar("fireMark").get_ct_vector(0); if(!timer){ obj.getVar("fireMark").clear_ct_vector(); obj.getVar("fireMark").push_ct_vector(); timer = obj.getVar("fireMark").get_ct_vector(0); timer.Reset(); timer.Start(10000,0); } local currentT = timer.Get(); if(currentT > 1500){ timer.Reset(); timer.Start(10000,0); local skillLevel = sq_GetSkillLevel(obj, SKILL_THBYKK_FIREMARK); local rangeNear = sq_GetLevelData(obj, SKILL_THBYKK_FIREMARK, 7, skillLevel); local totalDamageNear = obj.sq_GetBonusRateWithPassive(SKILL_THBYKK_FIREMARK, -1, 9, 1.0); local totalDamageExpNear = obj.sq_GetBonusRateWithPassive(SKILL_THBYKK_FIREMARK, -1, 12, 1.0); local hitTimeNear = sq_GetLevelData(obj, SKILL_THBYKK_FIREMARK, 9, skillLevel); local lifeTimeNear = sq_GetLevelData(obj, SKILL_THBYKK_FIREMARK, 10, skillLevel); local rangeFar = sq_GetLevelData(obj, SKILL_THBYKK_FIREMARK, 0, skillLevel); local totalDamageFar = obj.sq_GetBonusRateWithPassive(SKILL_THBYKK_FIREMARK, -1, 1, 1.0); local totalDamageExpFar = obj.sq_GetBonusRateWithPassive(SKILL_THBYKK_FIREMARK, -1, 5, 1.0); local hitTimeFar = sq_GetLevelData(obj, SKILL_THBYKK_FIREMARK, 2, skillLevel); local lifeTimeFar = sq_GetLevelData(obj, SKILL_THBYKK_FIREMARK, 3, skillLevel); sq_BinaryStartWrite(); sq_BinaryWriteDword(3); sq_BinaryWriteDword(SKILL_THBYKK_FIREMARK); sq_BinaryWriteDword(1); sq_BinaryWriteDword(rangeNear); sq_BinaryWriteDword(totalDamageNear); sq_BinaryWriteDword(totalDamageExpNear); sq_BinaryWriteDword(hitTimeNear); sq_BinaryWriteDword(lifeTimeNear); sq_BinaryWriteDword(rangeFar); sq_BinaryWriteDword(totalDamageFar); sq_BinaryWriteDword(totalDamageExpFar); sq_BinaryWriteDword(hitTimeFar); sq_BinaryWriteDword(lifeTimeFar); sq_SendCreatePassiveObjectPacket(obj, PASSIVEOBJ_NUM_THIEF, 0, 0, 0, 0, sq_GetDirection(obj)); } } } local loadSlot = obj.sq_GetSkillLoad(SKILL_THBYKK_DEITIESREBIRTH); if(loadSlot){ local loadNumber = loadSlot.getRemainLoadNumber(); if(loadSlot.isCooling()){ if(loadNumber > 0){ if(obj.getVar("canSaveDeitiesreBirth").getBool(0) == false) obj.getVar("canSaveDeitiesreBirth").setBool(0, true); } else if(obj.getVar("canSaveDeitiesreBirth").getBool(0) == true) obj.getVar("canSaveDeitiesreBirth").setBool(0, false); } else{ if(loadNumber < sq_GetIntData(obj, SKILL_THBYKK_DEITIESREBIRTH, 0)){ //释放轮子 local state = obj.getState(); if(state == STATE_THBYKK_DEITIESREBIRTH) return; if(state == 1 || state == 2 || state == 3 || state == 4 || state == 5 || state == 9 || state == 6 || state == 7) obj.sq_RemoveSkillLoad(SKILL_THBYKK_DEITIESREBIRTH); else{ obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_THBYKK_DEITIESREBIRTH, STATE_PRIORITY_IGNORE_FORCE, true); return; } } else{ obj.getVar("canSaveDeitiesreBirth").setBool(0, false); obj.sq_RemoveSkillLoad(SKILL_THBYKK_DEITIESREBIRTH); } } } if(obj.getVar("SwordOfKusanagi").get_obj_vector_size() > 0 && obj.getVar("SwordOfKusanagiBool").getBool(0)){ sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true); if(sq_IsEnterCommand(obj, E_ATTACK_COMMAND)){ obj.getVar("SwordOfKusanagiBool").setBool(0, false); obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_THBYKK_SWORDOFKUSANAGI, STATE_PRIORITY_IGNORE_FORCE, true); return; } } if(obj.getVar("SwordOfKusanagiBool").getBool(1)){ local state = obj.getState(); if(state == 1 || state == 2 || state == 3 || state == 4 || state == 5 || state == 9 || state == 6 || state == 7){ obj.setSkillCommandEnable(SKILL_THBYKK_SWORDOFKUSANAGI,false); return; } else{ obj.setSkillCommandEnable(SKILL_THBYKK_SWORDOFKUSANAGI,true); if(obj.sq_IsEnterSkill(SKILL_THBYKK_SWORDOFKUSANAGI) != -1){ obj.getVar("SwordOfKusanagiBool").setBool(1, false); obj.sq_IntVectClear(); obj.sq_IntVectPush(2); obj.sq_AddSetStatePacket(STATE_THBYKK_SWORDOFKUSANAGI, STATE_PRIORITY_IGNORE_FORCE, true); return; } } } } function procAppend_Kunoichi(obj) { if(!obj) return; local loadSlot = obj.sq_GetSkillLoad(SKILL_THBYKK_LEAVETRACE); if(loadSlot){ local loadNumber = loadSlot.getRemainLoadNumber(); if(!loadSlot.isCooling()){ local skillLevel = sq_GetSkillLevel(obj, SKILL_THBYKK_LEAVETRACE); local countMax = sq_GetLevelData(obj, SKILL_THBYKK_LEAVETRACE, 0, skillLevel); local mirrorofyataLevel = sq_GetSkillLevel(obj, SKILL_THBYKK_MIRROROFYATA); if(mirrorofyataLevel > 0){ countMax = countMax + sq_GetLevelData(obj, SKILL_THBYKK_MIRROROFYATA, 1, mirrorofyataLevel); } if(loadNumber < countMax){ loadSlot.increaseLoadCount(1); loadSlot.setStartCool(); } } if(loadNumber > 0){ if(obj.getVar("createLeaveTraceObj").getBool(0)) return; local state = obj.getState(); local subState = obj.getSkillSubState(); switch(state){ case STATE_THBYKK_AMATERAS: case STATE_THBYKK_BIGKUNAI: case STATE_THBYKK_DOOMFIELD: case STATE_THBYKK_FLAMEBALL: case STATE_THBYKK_FLAMEFLOWER: case STATE_THBYKK_FLAMETORNADO: case STATE_THBYKK_FUUMASHURIKEN: case STATE_THBYKK_GASOLINEFIRE: case STATE_THBYKK_ILUSIONSHURIKEN: case STATE_THBYKK_JADEKAMAITACHI: case STATE_THBYKK_SKYROADS: case STATE_THBYKK_YAMATAOROCHI: case STATE_THBYKK_NINJUTSU: if(state == STATE_THBYKK_BIGKUNAI && subState != 1) break; else if(state == STATE_THBYKK_FLAMEBALL && subState == 10) break; else if(state == STATE_THBYKK_FUUMASHURIKEN && subState == 10) break; else if(state == STATE_THBYKK_GASOLINEFIRE && subState == 1) break; else if(state == STATE_THBYKK_ILUSIONSHURIKEN && subState >= 10) break; else if(state == STATE_THBYKK_SKYROADS && subState > 0) break; local enableCancelSkillIndex = [SKILL_THBYKK_AMATERAS, SKILL_THBYKK_BIGKUNAI, SKILL_THBYKK_DOOMFIELD, SKILL_THBYKK_FLAMEBALL, SKILL_THBYKK_FLAMEFLOWER, SKILL_THBYKK_FLAMETORNADO, SKILL_THBYKK_FUUMASHURIKEN, SKILL_THBYKK_GASOLINEFIRE, SKILL_THBYKK_ILUSIONSHURIKEN, SKILL_THBYKK_JADEKAMAITACHI, SKILL_THBYKK_SKYROADS, SKILL_THBYKK_YAMATAOROCHI, 24]; local enableCancelStateIndex = [STATE_THBYKK_AMATERAS, STATE_THBYKK_BIGKUNAI, STATE_THBYKK_DOOMFIELD, STATE_THBYKK_FLAMEBALL, STATE_THBYKK_FLAMEFLOWER, STATE_THBYKK_FLAMETORNADO, STATE_THBYKK_FUUMASHURIKEN, STATE_THBYKK_GASOLINEFIRE, STATE_THBYKK_ILUSIONSHURIKEN, STATE_THBYKK_JADEKAMAITACHI, STATE_THBYKK_SKYROADS, STATE_THBYKK_YAMATAOROCHI, 47]; for(local i = 0; i < enableCancelSkillIndex.len(); i++){ if(sq_GetSkill(obj, enableCancelSkillIndex[i]).isInCoolTime()) continue; if(state != enableCancelStateIndex[i]){ obj.setSkillCommandEnable(enableCancelSkillIndex[i], true); if(obj.sq_IsEnterSkill(enableCancelSkillIndex[i]) != -1){ obj.startSkillCoolTime(enableCancelSkillIndex[i], sq_GetSkillLevel(obj, enableCancelSkillIndex[i]), -1); local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "passiveobject/6_thief_bykk/kunoichi_bykk/animation/kunoichitrace/leavetracesfire_04.ani", 0, 0, 0); local pAni = pooledObj.getCurrentAnimation(); pAni.setSpeedRate(200.0); local loadSlot2 = obj.sq_GetSkillLoad(SKILL_THBYKK_DEITIESREBIRTH); if(loadSlot2 && loadSlot2.getRemainLoadNumber() > 0){ local countSkillSave = obj.getVar("DeitiesreBirthSkillSave").getInt(enableCancelStateIndex[i]); if(countSkillSave < 3){ obj.getVar("DeitiesreBirthSkillSave").setInt(enableCancelStateIndex[i], countSkillSave + 1); loadSlot2.decreaseLoadCount(1); deitiesreBirthDamageSave(obj, enableCancelStateIndex[i]); } } if(state == STATE_THBYKK_NINJUTSU) obj.getVar("canbreak").setBool(0, true); obj.sq_IntVectClear(); if(enableCancelSkillIndex[i] == 24){ obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(47, STATE_PRIORITY_IGNORE_FORCE, true); obj.getVar("createLeaveTraceObj").setBool(0, true); loadSlot.decreaseLoadCount(1); if(!loadSlot.isCooling()) loadSlot.setStartCool(); return; } if(sq_GetSkillLevel(obj, SKILL_THBYKK_NINJUTSU) > 0 && enableCancelSkillIndex[i] != SKILL_THBYKK_DOOMFIELD && enableCancelSkillIndex[i] != SKILL_THBYKK_JADEKAMAITACHI){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_IntVectPush(enableCancelSkillIndex[i]); obj.sq_IntVectPush(enableCancelStateIndex[i]); obj.sq_AddSetStatePacket(STATE_THBYKK_NINJUTSU, STATE_PRIORITY_IGNORE_FORCE, true); obj.getVar("createLeaveTraceObj").setBool(0, true); loadSlot.decreaseLoadCount(1); if(!loadSlot.isCooling()) loadSlot.setStartCool(); return; } else obj.sq_IntVectPush(0); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(enableCancelStateIndex[i], STATE_PRIORITY_IGNORE_FORCE, true); obj.getVar("createLeaveTraceObj").setBool(0, true); loadSlot.decreaseLoadCount(1); if(!loadSlot.isCooling()) loadSlot.setStartCool(); return; } } } break; // default: // local loadSlot2 = obj.sq_GetSkillLoad(SKILL_THBYKK_DEITIESREBIRTH); // if(loadSlot2 && loadSlot2.getRemainLoadNumber() > 0){ // obj.getVar("canSaveDeitiesreBirth").setBool(0, true); // } // break; } } } else{ if(sq_GetSkillLevel(obj, SKILL_THBYKK_LEAVETRACE) > 0){ local skillLevel = sq_GetSkillLevel(obj, SKILL_THBYKK_LEAVETRACE); local countMax = sq_GetLevelData(obj, SKILL_THBYKK_LEAVETRACE, 0, skillLevel); local coolTime = sq_GetLevelData(obj, SKILL_THBYKK_LEAVETRACE, 1, skillLevel); local mirrorofyataLevel = sq_GetSkillLevel(obj, SKILL_THBYKK_MIRROROFYATA); if(mirrorofyataLevel > 0){ countMax = countMax + sq_GetLevelData(obj, SKILL_THBYKK_MIRROROFYATA, 1, mirrorofyataLevel); coolTime = coolTime * (100 - sq_GetLevelData(obj, SKILL_THBYKK_MIRROROFYATA, 0, mirrorofyataLevel)) / 100; } // print("countMax = "+countMax); // print("coolTime = "+coolTime); obj.sq_AddSkillLoad(SKILL_THBYKK_LEAVETRACE, 66, countMax, coolTime); } } } function onStartDungeon_Kunoichi(obj) { if(!obj) return; local loadSlot = obj.sq_GetSkillLoad(SKILL_THBYKK_LEAVETRACE); if(loadSlot) obj.sq_RemoveSkillLoad(SKILL_THBYKK_LEAVETRACE); setSkillBonusRate_3Kunoichi_bykk(obj); } function onStartMap_Kunoichi(obj) { if(!obj || obj.getState() == STATE_DIE) return; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_FLAMETORNADO_SUCK)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_FLAMETORNADO_SUCK); if(sq_GetSkillLevel(obj, SKILL_THBYKK_MARKOFFLAME) > 0){ local burnTime = sq_GetIntData(obj, SKILL_THBYKK_MARKOFFLAME, 0); local objectManager = obj.getObjectManager();//得到對象管理器 for (local i = 0; i < objectManager.getCollisionObjectNumber(); i++){ local object = objectManager.getCollisionObject(i);//得到控制類對象 if (object && object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object)){ local activeObj = sq_GetCNRDObjectToActiveObject(object); if(activeObj.getVar("markofFlameObj").get_obj_vector_size() < 1){ local group = sq_GetGroup(activeObj); local uniqueId = sq_GetUniqueId(activeObj); createSkillPassive_Fighter_bykk(obj,activeObj,PASSIVEOBJNUM_FWBYKK,0,0,0,sq_GetDirection(obj),3,255,1,group,uniqueId,burnTime,0,0,0,0,0); } } } } } function setSkillBonusRate_3Kunoichi_bykk(obj) { local bonusRate = 1000; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/thief/3_kunoichi_bykk/ap_firehide.nut")) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_THBYKK_FIREHIDE, 2, sq_GetSkillLevel(obj, SKILL_THBYKK_FIREHIDE))) / 1000; print("bonusRate0 = "+bonusRate); if(sq_GetSkillLevel(obj, SKILL_THBYKK_CHAKRATRINITY) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_THBYKK_CHAKRATRINITY, 0, sq_GetSkillLevel(obj, SKILL_THBYKK_CHAKRATRINITY))) / 1000; print("bonusRate1 = "+bonusRate); if(sq_GetSkillLevel(obj, SKILL_THBYKK_FIREMARK) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_THBYKK_FIREMARK, 14, sq_GetSkillLevel(obj, SKILL_THBYKK_FIREMARK))) / 1000; print("bonusRate2 = "+bonusRate); if(sq_GetSkillLevel(obj, SKILL_THBYKK_MARKOFFLAME) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_THBYKK_MARKOFFLAME, 0, sq_GetSkillLevel(obj, SKILL_THBYKK_MARKOFFLAME))) / 1000; print("bonusRate3 = "+bonusRate); if(sq_GetSkillLevel(obj, SKILL_THBYKK_MIRROROFYATA) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_THBYKK_MIRROROFYATA, 8, sq_GetSkillLevel(obj, SKILL_THBYKK_MIRROROFYATA))) / 1000; print("bonusRate4 = "+bonusRate); obj.getVar("setSkillBonusRate").setInt(0, bonusRate.tointeger()); // bonusRate = bonusRate.tofloat() / 1000.0; //sq_SetSkillAttackBonus(obj, bonusRate); } function onEndCurrentAni_po_youbishenshou(obj) { if(!obj) return; sq_SendDestroyPacketPassiveObject(obj); } function onKeyFrameFlag_po_youbishenshou(obj, flagIndex) { if(!obj) return; print("zpos = "+sq_GetZPos(obj)); local apdPath = "appendage/character/ap_common_buff.nut"; switch(sq_GetZPos(obj)){ case 1500: local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter()); if(CNSquirrelAppendage.sq_IsAppendAppendage(sqrChr, apdPath)) CNSquirrelAppendage.sq_RemoveAppendage(sqrChr, apdPath); local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(sqrChr, obj, -1, false, apdPath, true); AddAppendage.sq_SetValidTime(10000); local change_appendage = AddAppendage.sq_getChangeStatus("youbishenshou"); if(!change_appendage){ change_appendage = AddAppendage.sq_AddChangeStatus("youbishenshou",sqrChr, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 100); } if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_ATTACK_SPEED, false, 50.0); change_appendage.addParameter(CHANGE_STATUS_TYPE_MOVE_SPEED, false, 50.0); change_appendage.addParameter(CHANGE_STATUS_TYPE_CAST_SPEED , false, 50.0); } break; case 2000: local objectManager = obj.getObjectManager();//得到對象管理器 for (local i = 0; i < objectManager.getCollisionObjectNumber(); i++) { local object = objectManager.getCollisionObject(i);//得到控制類對象 if (object && object.isObjectType(OBJECTTYPE_CHARACTER) && obj.isEnemy(object)) { local sqrChr = sq_GetCNRDObjectToSQRCharacter(object); if(sqrChr.getState() != STATE_DIE){ if(CNSquirrelAppendage.sq_IsAppendAppendage(sqrChr, apdPath)) CNSquirrelAppendage.sq_RemoveAppendage(sqrChr, apdPath); local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(sqrChr, obj, -1, false, apdPath, true); AddAppendage.sq_SetValidTime(10000); local change_appendage = AddAppendage.sq_getChangeStatus("youbishenshou"); if(!change_appendage){ change_appendage = AddAppendage.sq_AddChangeStatus("youbishenshou",sqrChr, 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, 10.0); //物理暴擊率 change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_HIT_RATE, false, 10.0); //魔法暴擊率 change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_ATTACK, true, 10.0); //物理攻擊力 change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_ATTACK, true, 10.0); //魔法攻擊力 change_appendage.addParameter(CHANGE_STATUS_TYPE_ADDITIONAL_PHYSICAL_GENUINE_ATTACK, true, 10.0); //獨立物理攻擊力 change_appendage.addParameter(CHANGE_STATUS_TYPE_ADDITIONAL_MAGICAL_GENUINE_ATTACK, true, 10.0); //獨立魔法攻擊力 } } } } break; } return true; } function proc_appendage_common_buff(appendage) { if(!appendage) return; } //幻灭瞬杀 function checkExecutableSkill_VanishingIllusion(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(223); if (isUse){ local state = obj.getState(); obj.sq_IntVectClear(); obj.sq_IntVectPush(0); if(state == 6 || state == 7) obj.sq_IntVectPush(1); else obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(223, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_VanishingIllusion(obj) { if (!obj) return false; return true; } function onSetState_VanishingIllusion(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: local isJump = obj.sq_GetVectorData(datas, 1); if(isJump > 0) obj.sq_SetCurrentAnimation(353); else obj.sq_SetCurrentAnimation(354); obj.getVar("VanishingIllusionBool").setBool(0, false); obj.getVar("VanishingIllusionSet").setInt(0, sq_GetXPos(obj)); obj.getVar("VanishingIllusionSet").setInt(1, sq_GetYPos(obj)); obj.getVar("VanishingIllusionSet").setInt(4, sq_GetZPos(obj)); print("saveX = "+ obj.getVar("VanishingIllusionSet").getInt(0)); print("saveY = "+ obj.getVar("VanishingIllusionSet").getInt(1)); obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); break; case 1: obj.sq_SetCurrentAnimation(351); local currentAni = obj.getCurrentAnimation(); local speedRate = 20000 / currentAni.getDelaySum(false); print("speedRate = "+speedRate); local speed = 30.0 * speedRate; if(sq_GetDirection(obj) == ENUM_DIRECTION_RIGHT) sq_SetVelocity(obj, 0, speed.tofloat()); else sq_SetVelocity(obj, 0, -speed.tofloat()); local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/1_rogue_bykk/vanishingillusion/move/moveshine_00.ani", 0, 0, 60); local offsetZ = obj.getVar("VanishingIllusionSet").getInt(4); if(offsetZ > 0){ sq_SetCustomRotate(pooledObj, sq_ToRadian(-10.0)); } break; case 2: sq_setCurrentAxisPos(obj, 2, 0); obj.sq_SetCurrentAnimation(352); sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/1_rogue_bykk/vanishingillusion/moveend/moveend_back_00.ani", 0, 0, 0); sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/1_rogue_bykk/vanishingillusion/moveend/moveend_front_00.ani", 0, 1, 1); local totalDamage = obj.sq_GetBonusRateWithPassive(223, -1, 0, 1.0); local hitMax = sq_GetIntData(obj, 223, 6); local baseX = obj.getVar("VanishingIllusionSet").getInt(0); local offSetX = sq_GetXPos(obj); local rangeX = sq_Abs(baseX - offSetX), rangeY = 300; if(rangeX == 0) rangeX = 600; else if(rangeX > 600) rangeX = 1200; local objectManager = obj.getObjectManager();//得到對象管理器 for (local i = 0; i < objectManager.getCollisionObjectNumber(); i++){ local object = objectManager.getCollisionObject(i);//得到控制類對象 if (object && object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object) && object.isInDamagableState(obj) && sq_GetZPos(object) <= 500){ if(sq_Abs(sq_GetYPos(obj) - sq_GetYPos(object)) <= rangeY){ print("isFront = "+IsFrontOf(obj, object)); print("rangeX = "+sq_Abs(sq_GetXPos(obj) - sq_GetXPos(object))); if(IsFrontOf(obj, object) == false && sq_Abs(sq_GetXPos(obj) - sq_GetXPos(object)) <= rangeX){ local group = sq_GetGroup(object); local uniqueId = sq_GetUniqueId(object); //createSkillPassive_Theif_bykk(obj,object,646001,0,0,0,sq_GetDirection(obj),1,totalDamage,hitMax,group,uniqueId,0,0,0,0,0,0); obj.sq_StartWrite(); obj.sq_WriteDword(1000); obj.sq_WriteDword(1); obj.sq_WriteDword(1); obj.sq_WriteDword(totalDamage); obj.sq_WriteDword(hitMax); obj.sq_WriteDword(group); obj.sq_WriteDword(uniqueId); obj.sq_SendCreatePassiveObjectPacket(24343, 0, 0, 0, 0); local apdPath = "appendage/ap_common_hold.nut"; if(!CNSquirrelAppendage.sq_IsAppendAppendage(object, apdPath)){ local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(object, obj, -1, false, apdPath, true); sq_HoldAndDelayDie(object, obj, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL , AddAppendage); AddAppendage.sq_SetValidTime(200 * hitMax); } } } } } break; case 3: // sq_SetCurrentDirection(obj, sq_GetOppositeDirection(sq_GetDirection(obj))); obj.sq_SetCurrentAnimation(350); local currentAni = obj.getCurrentAnimation(); local speedRate = 20000 / currentAni.getDelaySum(false); obj.setTimeEvent(1, 1000 / speedRate, 20, true); obj.getVar("VanishingIllusionSet").setInt(2, sq_GetXPos(obj)); obj.getVar("VanishingIllusionSet").setInt(3, sq_GetYPos(obj)); break; case 4: obj.sq_SetCurrentAnimation(349); obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); local bonusRate = 1.0; local hitEndCount = obj.getVar("VanishingIllusionSet").getInt(5); bonusRate = sq_GetLevelData(obj, 9, 9 + hitEndCount, sq_GetSkillLevel(obj, 9)).tofloat() / 100.0; print("bonusRate = "+bonusRate); local totalDamage = obj.sq_GetBonusRateWithPassive(223, -1, 1, bonusRate); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 77)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); break; } } function onEndCurrentAni_VanishingIllusion(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: case 1: case 3: obj.sq_IntVectClear(); obj.sq_IntVectPush(subState + 1); obj.sq_AddSetStatePacket(223, STATE_PRIORITY_AUTO, true); break; case 2: case 4: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_VanishingIllusion(obj) { if(!obj) return; if(obj.getVar("VanishingIllusionBool").getBool(0)){ if(obj.getVar("VanishingIllusionBool").getBool(1) == false){ obj.setSkillCommandEnable(9, true); sq_SetKeyxEnable(obj, E_SKILL_COMMAND, true); if(sq_IsEnterCommand(obj, E_SKILL_COMMAND)){ obj.getVar("VanishingIllusionBool").setBool(1, true); obj.sq_StartWrite(); obj.sq_WriteDword(1); sq_SendChangeSkillEffectPacket(obj, 223); } } } } function onProc_VanishingIllusion(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 1: local currentAni = obj.getCurrentAnimation(); local delaySum = currentAni.getDelaySum(false); local stateTime = obj.sq_GetStateTimer(); local vz = sq_GetUniformVelocity(obj.getVar("VanishingIllusionSet").getInt(4), 0, stateTime, delaySum / 2); sq_setCurrentAxisPos(obj, 2, vz); break; } } function onChangeSkillEffect_VanishingIllusion(obj, skillIndex, reciveData) { if(!obj) return; local set = reciveData.readDword(); if(set == 1){ obj.getVar("VanishingIllusionBool").setBool(1, true); } } function onKeyFrameFlag_VanishingIllusion(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 0: sq_flashScreen(obj,20,80,60,239, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); break; case 1: obj.sq_PlaySound("VANISHING_ILLUSION_ADD"); obj.sq_PlaySound("R_TF_HITEND"); sq_SetMyShake(obj, 25, 200); break; case 2: //`smoke back` 81 0 8 sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/1_rogue_bykk/vanishingillusion/hitend/hitend_back_00.ani", 81, 0, 8); break; case 3: //`smoke front` 101 0 10 sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/1_rogue_bykk/vanishingillusion/hitend/hitend_front_00.ani", 81, 0, 8); break; case 4: //`hitend start effect` -39 0 37 sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/1_rogue_bykk/vanishingillusion/hitendstart/hitendstart_front_00.ani", 0, 0, 0); break; case 5: obj.sq_PlaySound("VANISHING_ILLUSION_DASH"); sq_flashScreen(obj,0,200,0,174, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); sq_SetMyShake(obj, 1, 750); //`Enable To Input Hitend Skill` local hitEndCount = obj.getVar("hitEndCount").getInt(0); if(hitEndCount > 0){ obj.getVar("VanishingIllusionSet").setInt(5, hitEndCount); obj.getVar("VanishingIllusionBool").setBool(0, true); obj.getVar("VanishingIllusionBool").setBool(1, false); } break; case 6: sq_flashScreen(obj,0,300,100,184, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); break; case 7: //`Enable To Execute HitEndSkill` if(obj.getVar("VanishingIllusionBool").getBool(1)){ obj.getVar("VanishingIllusionBool").setBool(1, false); hitEndCountDecrease(obj); obj.sq_IntVectClear(); obj.sq_IntVectPush(3); obj.sq_AddSetStatePacket(223, STATE_PRIORITY_AUTO, true); } break; case 8: obj.sq_PlaySound("TF_ASSASSINATION_FIN_01");//R_TF_VANISHING_ILLUSION obj.sq_PlaySound("VANISHING_ILLUSION_CAST"); break; case 9: sq_flashScreen(obj,60,300,0,174, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); break; case 10: sq_SetMyShake(obj, 25, 100); break; } return true; } function onTimeEvent_VanishingIllusion(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: local vx = sq_GetUniformVelocity(obj.getVar("VanishingIllusionSet").getInt(2), obj.getVar("VanishingIllusionSet").getInt(0), timeEventCount, 18); local vy = sq_GetUniformVelocity(obj.getVar("VanishingIllusionSet").getInt(3), obj.getVar("VanishingIllusionSet").getInt(1), timeEventCount, 18); sq_setCurrentAxisPos(obj, 0, vx);//设置当前x坐标 sq_setCurrentAxisPos(obj, 1, vy); if(timeEventCount == 20){ sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/1_rogue_bykk/vanishingillusion/hitend/hitendgroundsmoke_back_00.ani", 0, 0, 0); sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/1_rogue_bykk/vanishingillusion/hitend/hitendgroundsmoke_front_00.ani", 0, 1, 1); } break; } } function onEndState_VanishingIllusion(obj, new_state) { if(!obj) return; if(new_state != 223){ obj.getVar("VanishingIllusionBool").setBool(0, false); obj.getVar("VanishingIllusionBool").setBool(1, false); } } function onAttack_VanishingIllusion(obj, damager, boundingBox, isStuck) { if(!obj || isStuck) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; sq_AddDrawOnlyAniFromParent(damager, "character/thief/effect/animation/1_rogue_bykk/vanishingillusion/hitend/hitendslash_00.ani", 0, 0, sq_GetHeightObject(damager) / 2); } function setCustomData_po_vanishingillusion(obj, receiveData) { if(!obj) return; local sub = receiveData.readDword(); obj.getVar("custom").setInt(0, sub); switch(sub){ case 1: local totalDamage = receiveData.readDword(); local hitMax = receiveData.readDword(); local group = receiveData.readDword(); local uniqueId = receiveData.readDword(); local targetObj = sq_GetObject(obj, group, uniqueId); if(targetObj && targetObj.getState() != STATE_DIE){ obj.getVar("tar").clear_obj_vector(); obj.getVar("tar").push_obj_vector(targetObj); obj.getVar("custom").setInt(4, hitMax); local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter()); local aniNum = [355, 357, 360]; local ani = sq_GetCustomAni(sqrChr, aniNum[sq_getRandom(0, 2)]); sq_Rewind(ani); obj.setCurrentAnimation(ani); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local currentAni = obj.getCurrentAnimation(); local delaySum = currentAni.getDelaySum(false); obj.setTimeEvent(2, delaySum / (hitMax + 1), hitMax, false); } break; } } function onEndCurrentAni_po_vanishingillusion(obj) { if(!obj) return; } function onTimeEvent_po_vanishingillusion(obj, timeEventIndex, timeEventCount) { if(!obj) return; switch(timeEventIndex){ case 2: local targetObj = obj.getVar("tar").get_obj_vector(0); if(targetObj && targetObj.getState() != STATE_DIE){ sq_SendHitObjectPacketWithNoStuck(obj,targetObj,0,0,sq_GetHeightObject(targetObj) / 2); } local hitMax = obj.getVar("custom").getInt(4); if(timeEventCount >= hitMax) sq_SendDestroyPacketPassiveObject(obj); break; } } function onProcCon_thief_chainsaw(obj) { if (!obj) return false; local subState = obj.getVar("subState").get_vector(0); local hitEndCount = obj.getVar("hitEndCount").getInt(0); if (subState == 28) { if (obj.isMyControlObject() && hitEndCount > 0) { sq_SetKeyxEnable(obj, E_SKILL_COMMAND, true); if (sq_IsEnterCommand(obj, E_SKILL_COMMAND) && obj.isMyControlObject()) { obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_CHAINSAWHITEND, STATE_PRIORITY_IGNORE_FORCE, true); obj.sq_PlaySound("R_TF_HITEND"); } } } else if(subState == 26){ if(sq_GetSkillLevel(obj, 224) > 0){ obj.sq_IntVectClear(); obj.sq_IntVectPush(28); obj.sq_IntVectPush(0); obj.sq_IntVectPush(0); obj.sq_IntVectPush(0); obj.sq_IntVectPush(0); obj.sq_IntVectPush(0); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(34, STATE_PRIORITY_IGNORE_FORCE, true); } } } function onAfterSetState_thief_chainsaw(obj, state, datas, isResetTimer) { if (!obj) return false; local subState = obj.sq_GetVectorData(datas, 0); obj.getVar("subState").clear_vector(); obj.getVar("subState").push_vector(subState); // dofile("Plugins/8_thief.c"); if(sq_GetSkillLevel(obj, 224) > 0){ switch(subState){ case 28: local currentAni = obj.getCurrentAnimation(); local speedRate = 8000 / currentAni.getDelaySum(0, 0); local totalDamage = obj.sq_GetBonusRateWithPassive(41, -1, 0, 1.0); local totalDamage2 = obj.sq_GetBonusRateWithPassive(41, -1, 2, 1.0); local skillLevel = sq_GetSkillLevel(obj, 41); local hitMax = sq_GetLevelData(obj, 41, 1, skillLevel); local hitMax2 = sq_GetLevelData(obj, 41, 3, skillLevel); //createSkillPassive_Theif_bykk(obj,obj,646002,0,0,0,sq_GetDirection(obj),1,totalDamage,hitMax,speedRate,0,0,0,0,0,0,0); //createSkillPassive_Theif_bykk(obj,obj,646002,0,0,0,sq_GetDirection(obj),2,totalDamage2,hitMax2,speedRate,0,0,0,0,0,0,0); print("test = "+ currentAni.getDelaySum(0, 0)); print("speedRate = "+ speedRate); break; } } } function setCustomData_po_chainsawexblade_bykk(obj, receiveData) { if(!obj) return; local sub = receiveData.readDword(); local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter()); sq_moveWithParent(sqrChr, obj); obj.getVar("custom").setInt(0, sub); switch(sub){ case 1: local totalDamage = receiveData.readDword(); local hitMax = receiveData.readDword(); local speedRate = receiveData.readDword(); local ani = sq_GetCustomAni(sqrChr, 116); sq_Rewind(ani); obj.setCurrentAnimation(ani); local currentAni = obj.getCurrentAnimation(); currentAni.setRGBA(255, 255, 255, 156); currentAni.setSpeedRate(speedRate.tofloat()); currentAni = obj.getCurrentAnimation(); local delaySum = currentAni.getDelaySum(false); local delay = delaySum / (hitMax + 1); print("delay = "+delay+",,hitMax = "+hitMax); //createSkillPassive_Theif_bykk(sqrChr,sqrChr,646002,50,0,70,sq_GetDirection(obj),3,totalDamage,hitMax,delay,speedRate,0,0,0,0,0,0); break; case 2: local totalDamage = receiveData.readDword(); local hitMax = receiveData.readDword(); local speedRate = receiveData.readDword(); local ani = sq_GetCustomAni(sqrChr, 117); sq_Rewind(ani); obj.setCurrentAnimation(ani); local currentAni = obj.getCurrentAnimation(); currentAni.setRGBA(255, 255, 255, 156); currentAni.setSpeedRate(speedRate.tofloat()); currentAni = obj.getCurrentAnimation(); local delaySum = currentAni.getDelaySum(false); local delay = delaySum / (hitMax + 1); print("delay = "+delay+",,hitMax = "+hitMax); //createSkillPassive_Theif_bykk(sqrChr,sqrChr,646002,75,0,55,sq_GetDirection(obj),4,totalDamage,hitMax,delay,speedRate,0,0,0,0,0,0); break; case 3: local totalDamage = receiveData.readDword(); local hitMax = receiveData.readDword(); local delay = receiveData.readDword(); local speedRate = receiveData.readDword(); obj.getVar("custom").setInt(1, hitMax); local aniPath = "passiveobject/6_thief_bykk/rogue_bykk/animation/chainsawex/rollingweaponeffect0.ani"; local ani = sq_CreateAnimation("", aniPath); obj.setCurrentAnimation(ani); // local currentAni = obj.getCurrentAnimation(); // currentAni.setSpeedRate(speedRate.tofloat()); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); obj.setTimeEvent(1, delay, -1, true); break; case 4: local totalDamage = receiveData.readDword(); local hitMax = receiveData.readDword(); local delay = receiveData.readDword(); local speedRate = receiveData.readDword(); obj.getVar("custom").setInt(1, hitMax); local aniPath = "passiveobject/6_thief_bykk/rogue_bykk/animation/chainsawex/rollingweaponeffect0.ani"; local ani = sq_CreateAnimation("", aniPath); obj.setCurrentAnimation(ani); // local currentAni = obj.getCurrentAnimation(); // currentAni.setSpeedRate(speedRate.tofloat()); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); obj.setTimeEvent(1, delay, -1, true); break; } } function onEndCurrentAni_po_chainsawexblade_bykk(obj) { if(!obj) return; local sub = obj.getVar("custom").getInt(0); if(sub < 3) sq_SendDestroyPacketPassiveObject(obj); } function onTimeEvent_po_chainsawexblade_bykk(obj, timeEventIndex, timeEventCount) { if(!obj) return; switch(timeEventIndex){ case 1: print("reset"+timeEventCount); obj.resetHitObjectList(); if(timeEventCount >= obj.getVar("custom").getInt(1)) sq_SendDestroyPacketPassiveObject(obj); break; } }