940 lines
40 KiB
C
940 lines
40 KiB
C
|
|
|
||
|
|
|
||
|
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
|
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;
|
||
|
|
}
|
||
|
|
}
|