3698 lines
145 KiB
C
3698 lines
145 KiB
C
|
|
function onKeyFrameFlag_po_priest_bykk(obj, flagIndex)
|
|
{
|
|
if(!obj) return true;
|
|
local job = obj.getVar("job").getInt(0);
|
|
if(flagIndex == 1000 && job == 0){
|
|
local height = sq_GetZPos(obj);
|
|
print("height = "+height);
|
|
if(height > 5000){
|
|
switch(height){
|
|
case 6000://球手
|
|
local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter());
|
|
local apdPath = "character/common/ap_equ.nut";
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(sqrChr, apdPath)){
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(sqrChr, sqrChr, -1, false, apdPath, true);
|
|
AddAppendage.sq_SetValidTime(60000);
|
|
AddAppendage.getVar("custom").setInt(17, 20);
|
|
AddAppendage.getVar("custom").setInt(18, 20);
|
|
AddAppendage.getVar("custom").setInt(19, 25);
|
|
AddAppendage.getVar("custom").setInt(9, 40);
|
|
AddAppendage.getVar("custom").setInt(10, 40);
|
|
AddAppendage.getVar("custom").setInt(11, 40);
|
|
AddAppendage.getVar("custom").setInt(12, 40);
|
|
}
|
|
sq_SendDestroyPacketPassiveObject(obj);
|
|
return true;
|
|
break;
|
|
case 6001:
|
|
local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter());
|
|
local apdPath = "character/common/ap_youbishenshou.nut";
|
|
local objectManager = sqrChr.getObjectManager();//得到對象管理器
|
|
for (local i = 0; i < objectManager.getCollisionObjectNumber(); i++){
|
|
local object = objectManager.getCollisionObject(i);//得到控制類對象
|
|
if (object && object.getState() != STATE_DIE && object.isObjectType(OBJECTTYPE_CHARACTER) && !sqrChr.isEnemy(object)){
|
|
local chrObj = sq_GetCNRDObjectToSQRCharacter(object);
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(sqrChr, apdPath)){
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(chrObj, sqrChr, -1, false, apdPath, true);
|
|
AddAppendage.sq_SetValidTime(10000);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
local skillIndex = obj.getVar("skillIndex").getInt(0);
|
|
local subtype = obj.getVar("subtype").getInt(0);
|
|
local state = obj.getVar("state").getInt(0);
|
|
switch(job){
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
switch(skillIndex){
|
|
case 1: sq_SendDestroyPacketPassiveObject(obj); break;
|
|
case SKILL_BYKK_ASTRAFE:
|
|
local totalDamage = obj.getVar("custom").getInt(0);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 51));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
sq_SetAddWeaponDamage(sq_GetCurrentAttackInfo(obj), true);
|
|
break;
|
|
}
|
|
break;
|
|
case 2:
|
|
break;
|
|
case 3:
|
|
switch(skillIndex){
|
|
case SKILL_BYKK_ADVANCEDDRAGON:
|
|
local sub = obj.getVar("custom").getInt(0);
|
|
switch(sub){
|
|
case 1:
|
|
switch(flagIndex){
|
|
case 1:
|
|
//`create blue dragon` 201 0 0
|
|
local lifeTime = obj.getVar("custom").getInt(5);
|
|
local range = obj.getVar("custom").getInt(3);
|
|
local sizeRate = range.tofloat() / 310.0;
|
|
local offset = (201 * sizeRate).tointeger();
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643040,offset,0,0,sq_GetDirection(obj),5,1,lifeTime,0,0,0,0,0);
|
|
break;
|
|
case 2:
|
|
//`create white tiger` -206 0 0
|
|
local lifeTime = obj.getVar("custom").getInt(5);
|
|
local range = obj.getVar("custom").getInt(3);
|
|
local sizeRate = range.tofloat() / 310.0;
|
|
local offset = (-206 * sizeRate).tointeger();
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643040,offset,0,0,sq_GetDirection(obj),5,2,lifeTime,0,0,0,0,0);
|
|
break;
|
|
case 3:
|
|
//`create hyunmu` 0 60 0
|
|
local lifeTime = obj.getVar("custom").getInt(5);
|
|
local range = obj.getVar("custom").getInt(3);
|
|
local sizeRate = range.tofloat() / 310.0;
|
|
local offset = (60 * sizeRate).tointeger();
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643040,0,offset,0,sq_GetDirection(obj),5,3,lifeTime,0,0,0,0,0);
|
|
break;
|
|
case 4:
|
|
//`create phoenix` 0 -60 0
|
|
local lifeTime = obj.getVar("custom").getInt(5);
|
|
local range = obj.getVar("custom").getInt(3);
|
|
local sizeRate = range.tofloat() / 310.0;
|
|
local offset = (-60 * sizeRate).tointeger();
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643040,0,offset,0,sq_GetDirection(obj),5,4,lifeTime,0,0,0,0,0);
|
|
break;
|
|
}
|
|
break;
|
|
case 2:
|
|
switch(flagIndex){
|
|
case 1:
|
|
local speedRate = obj.getVar("custom").getInt(1);
|
|
local delay = 170000 / speedRate;
|
|
sq_SetMyShake(obj, 3, delay);
|
|
break;
|
|
case 2:
|
|
//`create physic flash` 8 0 8
|
|
local flashScreenObj = sq_flashScreen(obj,100,99999,30,178, 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 3:
|
|
sq_flashScreen(obj,100,0,30,178, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
|
local speedRate = obj.getVar("custom").getInt(1);
|
|
local delay = 45000 / speedRate;
|
|
sq_SetMyShake(obj, 20, delay);
|
|
//`dragon shout sound` 4 0 -4
|
|
obj.sq_PlaySound("ADVANCED_DRAGON_START");
|
|
break;
|
|
case 4:
|
|
//`swing sound`
|
|
obj.sq_PlaySound("ADVANCED_DRAGON_SWISH");
|
|
break;
|
|
case 5:
|
|
sq_flashScreen(obj,100,100,30,178, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
|
local speedRate = obj.getVar("custom").getInt(1);
|
|
local delay = 50000 / speedRate;
|
|
sq_SetMyShake(obj, 20, delay);
|
|
//`create physic attack dust`
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "passiveobject/4_priest_bykk/3exorcist_bykk/animation/advanceddragon/advanceddragon_passion/ground_bottom_attack_end_crack_normal.ani", 0, 0, 0);
|
|
sq_ChangeDrawLayer(pooledObj, ENUM_DRAWLAYER_BOTTOM);
|
|
break;
|
|
case 6:
|
|
//`destroy axe` -300 0 4
|
|
break;
|
|
case 7:
|
|
//`physic flash fade out`
|
|
local flashScreenObj = obj.getVar("flashobj").get_obj_vector(0);//得到
|
|
local pflashScreen = sq_GetCNRDObjectToFlashScreen(flashScreenObj);//转为闪屏类
|
|
if(pflashScreen) pflashScreen.fadeOut();//为真 销毁
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case 4:
|
|
switch(skillIndex){
|
|
case SKILL_DireStream:
|
|
local Id = obj.getVar("avenger_ID").get_vector(0);
|
|
local pChrOBJ = obj.getTopCharacter();
|
|
pChrOBJ = sq_GetCNRDObjectToSQRCharacter(pChrOBJ);
|
|
local x = sq_GetXPos(obj);
|
|
local y = sq_GetYPos(obj);
|
|
local z = sq_GetZPos(obj);
|
|
local isMyControlObject = pChrOBJ.sq_IsMyControlObject();
|
|
if(Id == AVG_OBJ_Ear_Attack){
|
|
sq_BinaryStartWrite();
|
|
sq_BinaryWriteDword(AVG_OBJ_Ear_Explosion);
|
|
sq_SendCreatePassiveObjectPacketPos(obj, 24349, 0, x, y, z + 25);
|
|
}
|
|
else if(Id == AVG_OBJ_SpinCutter_Attack){
|
|
local skillLevel = pChrOBJ.sq_GetSkillLevel(SKILL_SPINCUTTER);
|
|
local BonusRate = pChrOBJ.sq_GetLevelData(SKILL_SPINCUTTER, 0, skillLevel);
|
|
local attackInfo = sq_GetCustomAttackInfo(obj, 3);
|
|
sq_SetCurrentAttackInfo(obj, attackInfo);
|
|
attackInfo = sq_GetCurrentAttackInfo(obj);
|
|
|
|
sq_SetCurrentAttackBonusRate(attackInfo, BonusRate);
|
|
obj.setTimeEvent(OBJ_SpinCutter_get_Attack,80,4,false);
|
|
}
|
|
else if(Id == AVG_OBJ_DireStream_Lase){
|
|
if(flagIndex == 10){
|
|
local Type = obj.getVar("DireStream_Lase").get_vector(0);
|
|
if(pChrOBJ.isMyControlObject()){
|
|
if(Type == 0)
|
|
{
|
|
//Common_Image_Als(obj,"passiveobject/4_priest_bykk/4avenger/animation/direstream/normal/direstream_passivefront.ani", 300, -1, 0, 0, 80, 1, 1.0);
|
|
sq_AddDrawOnlyAniFromParent(obj, "passiveobject/4_priest_bykk/4avenger/animation/direstream/normal/direstream_passivefront.ani", 300, -1, 0);
|
|
}
|
|
else if(Type == 1)
|
|
{
|
|
//Common_Image_Als(obj,"passiveobject/4_priest_bykk/4avenger/animation/direstream/devilgauge/direstream2_passivefront.ani", 300, -1, 0, 0, 80, 1, 1.0)
|
|
sq_AddDrawOnlyAniFromParent(obj, "passiveobject/4_priest_bykk/4avenger/animation/direstream/devilgauge/direstream2_passivefront.ani", 300, -1, 0);
|
|
}
|
|
//Common_Image_Als(obj,"passiveobject/4_priest_bykk/4avenger/animation/direstream/direstream_passiveback.ani", 450, -1, 0, 0, 80, 1, 1.0)
|
|
sq_AddDrawOnlyAniFromParent(obj, "passiveobject/4_priest_bykk/4avenger/animation/direstream/direstream_passiveback.ani", 450, -1, 0);
|
|
}
|
|
}
|
|
if(flagIndex == 11){
|
|
sq_BinaryStartWrite();
|
|
sq_BinaryWriteDword(AVG_OBJ_DireStream_LaseEnd);
|
|
sq_SendCreatePassiveObjectPacketPos(obj, 24349, 0, x, y, z);
|
|
}
|
|
}
|
|
break;
|
|
case SKILL_PRIEST_RIGHTEOUSDEVILIZE:
|
|
switch(subtype){
|
|
case 1:
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delay = currentAni.getDelaySum(14, 21);
|
|
local hitMax = obj.getVar("custom").getInt(0);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 50));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), obj.getVar("custom").getInt(4));
|
|
obj.setTimeEvent(1, delay / (hitMax + 1), hitMax, true);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
function onAttack_po_priest_bykk(obj, damager, boundingBox, isStuck)
|
|
{
|
|
if(!obj) return;
|
|
local job = obj.getVar("job").getInt(0);
|
|
local skillIndex = obj.getVar("skillIndex").getInt(0);
|
|
local subtype = obj.getVar("subtype").getInt(0);
|
|
local state = obj.getVar("state").getInt(0);
|
|
switch(job){
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
switch(skillIndex){
|
|
case 28:
|
|
if(damager.isObjectType(OBJECTTYPE_ACTIVE)){
|
|
if(obj.getVar("custom").getInt(7) > 0){
|
|
local prob = obj.getVar("custom").getInt(8);
|
|
if(sq_getRandom(1, 100) > 100 - prob){
|
|
local power = obj.getVar("custom").getInt(9);
|
|
createSkillPassive_Priest_bykk(obj,damager,PASSIVEOBJECT_PRIESTBYKK,0,0,0,sq_GetDirection(obj),1,23,1,power,0,0,0,0,0,0,0);
|
|
// print("power = "+power);
|
|
// sq_BinaryStartWrite();
|
|
// sq_BinaryWriteByte(power);
|
|
// sq_SendCreatePassiveObjectPacketPos(obj, 24012, 0, sq_GetXPos(damager), sq_GetYPos(damager), 0);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case 2:
|
|
break;
|
|
case 3:
|
|
switch(skillIndex){
|
|
case SKILL_BYKK_THUNDERBOLTTALISMAN:
|
|
switch(subtype){
|
|
case 1:
|
|
if(obj.getVar("custom").getInt(6) > 0) return;
|
|
local skillLevel = obj.getVar("custom").getInt(5);
|
|
local aniPath = ["passiveobject/4_priest_bykk/3exorcist_bykk/animation/thunderbolttalisman/thunderbolt1.ani", "passiveobject/4_priest_bykk/3exorcist_bykk/animation/thunderbolttalisman/thunderbolt2.ani", "passiveobject/4_priest_bykk/3exorcist_bykk/animation/thunderbolttalisman/thunderbolt3.ani"];
|
|
if(skillLevel > 0){
|
|
aniPath = ["passiveobject/4_priest_bykk/3exorcist_bykk/animation/chakraofgod/thunder/a_thunder_a.ani", "passiveobject/4_priest_bykk/3exorcist_bykk/animation/chakraofgod/thunder/b_thunder_b.ani", "passiveobject/4_priest_bykk/3exorcist_bykk/animation/chakraofgod/thunder/c_thunder_c.ani"];
|
|
}
|
|
sq_AddDrawOnlyAniFromParent(damager, aniPath[sq_getRandom(0, 2)], 0, 0, sq_GetObjectHeight(damager) / 2);
|
|
if(obj.getVar("bool").getBool(1)){
|
|
obj.getVar("bool").setBool(1, false);
|
|
sq_SetMyShake(obj, 3, 80);
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case SKILL_BYKK_HYUNMOO:
|
|
if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return;
|
|
local sub = obj.getVar("custom").getInt(0);
|
|
local atkTarget = obj.getVar("atkTarget").get_obj_vector(0);
|
|
if(sub == 0 && obj.getVar("atkBool").getBool(0) && isSameObject(atkTarget, damager)){
|
|
sq_setCurrentAxisPos(obj, 0, sq_GetXPos(damager));
|
|
sq_setCurrentAxisPos(obj, 1, sq_GetYPos(damager) + 3);
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(damager);
|
|
local apdPath = "character/priest/3exorcist_bykk/ap_hyunmoohold.nut";
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(activeObj, apdPath)){
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(activeObj, obj, -1, false, apdPath, true);
|
|
sq_HoldAndDelayDie(activeObj, obj, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL , AddAppendage);
|
|
AddAppendage.getVar("custom").setInt(0, sq_GetXPos(activeObj));
|
|
AddAppendage.getVar("custom").setInt(1, sq_GetYPos(activeObj));
|
|
AddAppendage.getVar("custom").setInt(2, sq_GetZPos(activeObj));
|
|
local holdTime = obj.getVar("custom").getInt(2);
|
|
local changeRate = obj.getVar("custom").getInt(7);
|
|
if(sq_IsBoss(activeObj) || sq_IsNamed(activeObj) || sq_IsAiCharacter(activeObj) || sq_IsHellMonster(activeObj)){
|
|
holdTime = holdTime * changeRate / 100;
|
|
}
|
|
print("holdTime = "+holdTime);
|
|
AddAppendage.sq_SetValidTime(holdTime);
|
|
obj.addSetStatePacket(24, null, STATE_PRIORITY_AUTO, false, "");
|
|
obj.setTimeEvent(3, holdTime, 1, false);
|
|
obj.sq_PlaySound("HYUN_LOCK_LOOP", 2333);
|
|
}
|
|
obj.getVar("atkBool").setBool(0, false);
|
|
}
|
|
break;
|
|
case SKILL_BYKK_DESTROYSPIRITTALISMAN:
|
|
switch(subtype){
|
|
case 1:
|
|
if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return;
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(damager);
|
|
if(activeObj.getVar("dsTalisman").getBool(0) == false){
|
|
activeObj.getVar("dsTalisman").setBool(0, true);
|
|
local group = sq_GetGroup(activeObj);
|
|
local uniqueId = sq_GetUniqueId(activeObj);
|
|
local totalDamage = obj.getVar("custom").getInt(1);
|
|
local lifeTime = obj.getVar("custom").getInt(2);
|
|
local hitTime = obj.getVar("custom").getInt(3);
|
|
local sizeRate = obj.getVar("custom").getInt(4);
|
|
local height = sq_GetObjectHeight(activeObj);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,activeObj,643014,0,1,height / 3,sq_GetDirection(obj),group,uniqueId,totalDamage,lifeTime,hitTime,sizeRate,0,0);
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case SKILL_BYKK_GROUNDCRASH:
|
|
if(isStuck) return;
|
|
if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return;
|
|
if(sq_IsFixture(damager)) return;
|
|
if(obj.getVar("custom").getInt(0) > 0){
|
|
local apdPath = "character/priest/3exorcist_bykk/ap_groundcrash_suck.nut";
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(damager, apdPath)){
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, apdPath, true);
|
|
AddAppendage.sq_SetValidTime(300);
|
|
sq_MoveToAppendageForce(damager, obj, obj, 0, 0, damager.getZPos(), 200, true, AddAppendage);
|
|
}
|
|
}
|
|
break;
|
|
case SKILL_BYKK_THROWWEAPON:
|
|
if(isStuck) return;
|
|
if(obj.getVar().getBool(1) == false){
|
|
obj.getVar().setBool(1, true);
|
|
obj.stopTimeEvent(1);
|
|
obj.setTimeEvent(1, 300, 1, false);
|
|
}
|
|
sq_AddDrawOnlyAniFromParent(damager, "passiveobject/4_priest_bykk/3exorcist_bykk/animation/throwweapon/hit.ani", 0, 0, sq_GetCenterZPos(boundingBox));
|
|
break;
|
|
case SKILL_BYKK_ATOMICSMASH:
|
|
sq_AddDrawOnlyAniFromParent(damager, "character/priest/effect/animation/3exorcist_bykk/atomicsmash/hit2final.ani", -150, 1, 50);
|
|
break;
|
|
case SKILL_BYKK_DANGEROUSSCALE:
|
|
local sub = obj.getVar("custom").getInt(0);
|
|
switch(sub){
|
|
case 1:
|
|
if(obj.getVar("custom").getInt(1) <= 0) break;
|
|
if(damager.isObjectType(OBJECTTYPE_ACTIVE)){
|
|
local aniPath = "appendage/ap_common_hold.nut";
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(damager, aniPath)){
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, aniPath, true);
|
|
sq_HoldAndDelayDie(damager, obj, true, true, true, 200, 600, ENUM_DIRECTION_NEUTRAL , AddAppendage);
|
|
AddAppendage.sq_SetValidTime(2000);
|
|
local group = sq_GetGroup(damager);
|
|
local uniqueId = sq_GetUniqueId(damager);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,damager,643023,0,1,0,sq_GetDirection(obj),2,group,uniqueId,0,0,0,0,0);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case SKILL_BYKK_THEBEST7HIT:
|
|
switch(subtype){
|
|
case 1:
|
|
if(isStuck) return;
|
|
if(damager.isObjectType(OBJECTTYPE_ACTIVE)){
|
|
if(obj.getVar().getBool(0) == false){
|
|
obj.getVar().setBool(0, true);
|
|
sq_AddDrawOnlyAniFromParent(damager, "character/priest/effect/animation/3exorcist_bykk/thebest7hit/powerstrikeseven_crasha.ani", 0, 1, sq_GetCenterZPos(boundingBox));
|
|
sq_AddDrawOnlyAniFromParent(damager, "character/priest/effect/animation/3exorcist_bykk/thebest7hit/powerstrikeseven_crashb.ani", 0, 1, sq_GetCenterZPos(boundingBox));
|
|
}
|
|
local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter());
|
|
if(sqrChr && sqrChr.getState() != STATE_DIE){
|
|
if(!sqrChr.getVar("Thebest7hitTar").is_obj_vector(damager)){
|
|
sqrChr.getVar("Thebest7hitTar").push_obj_vector(damager);
|
|
local apdPath = "character/priest/3exorcist_bykk/ap_thebest7hit_hold.nut";
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(damager, apdPath)){
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, sqrChr, -1, false, apdPath, true);
|
|
sq_HoldAndDelayDie(damager, obj, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL , AddAppendage);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case SKILL_BYKK_ADVANCEDDRAGON:
|
|
if(isStuck) return;
|
|
if(damager.isObjectType(OBJECTTYPE_ACTIVE)){
|
|
local sub = obj.getVar("custom").getInt(0);
|
|
switch(sub){
|
|
case 3:
|
|
local apdPath = "character/priest/3exorcist_bykk/ap_advanceddragon_hold.nut";
|
|
local lifeTime = obj.getVar("custom").getInt(2) + 200;
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(damager, apdPath)){
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, apdPath, true);
|
|
sq_HoldAndDelayDie(damager, obj, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL , AddAppendage);
|
|
AddAppendage.sq_SetValidTime(lifeTime);
|
|
}
|
|
break;
|
|
case 2:
|
|
sq_AddDrawOnlyAniFromParent(damager, "character/priest/effect/animation/3exorcist_bykk/advanceddragon_passion/hit/hit_hitdodge.ani", 0, 0, sq_GetCenterZPos(boundingBox));
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case 4:
|
|
break;
|
|
}
|
|
}
|
|
|
|
function procAppend_po_priest_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local job = obj.getVar("job").getInt(0);
|
|
local skillIndex = obj.getVar("skillIndex").getInt(0);
|
|
local subtype = obj.getVar("subtype").getInt(0);
|
|
local state = obj.getVar("state").getInt(0);
|
|
switch(job){
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
break;
|
|
case 2:
|
|
break;
|
|
case 3:
|
|
switch(skillIndex){
|
|
case SKILL_BYKK_VERMILIONBIRDTALISMAN:
|
|
switch(subtype){
|
|
case 2:
|
|
local sub = obj.getVar("custom").getInt(0);
|
|
if(sub == 1 && state == 20){
|
|
local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter());
|
|
if(sqrChr && sqrChr.getState() != STATE_DIE){
|
|
local direction = sq_GetDirection(sqrChr);
|
|
local offSetX = sq_GetDistancePos(sq_GetXPos(sqrChr), direction, -50);
|
|
local offSetY = sq_GetYPos(sqrChr);
|
|
sq_setCurrentAxisPos(obj, 0, offSetX);
|
|
sq_setCurrentAxisPos(obj, 1, offSetY);
|
|
sq_SetCurrentDirection(obj, direction);
|
|
}
|
|
else{
|
|
obj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, "");
|
|
return;
|
|
}
|
|
local time = sq_GetObjectTime(obj);
|
|
if(time >= 10000){
|
|
sqrChr.getVar("vermilionbirdtalismanBool").setBool(0, false);
|
|
obj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
}
|
|
else if(sub == 2 && state == 20){
|
|
local time = sq_GetObjectTime(obj);
|
|
local lifeTime = obj.getVar("custom").getInt(2);
|
|
if(time >= lifeTime){
|
|
obj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case SKILL_BYKK_THUNDERBOLTTALISMAN:
|
|
switch(subtype){
|
|
case 1:
|
|
switch(state){
|
|
case 21:
|
|
if(obj.getVar("bool").getBool(0)) return;
|
|
// if(obj.getVar("custom").getInt(6) > 0) return;
|
|
local timer = obj.getVar().get_ct_vector(0);
|
|
if(timer){
|
|
local currentT = timer.Get();
|
|
if(currentT >= obj.getVar("custom").getInt(2)){
|
|
obj.getVar("bool").setBool(0, true);
|
|
print("time = "+obj.getVar("custom").getInt(2));
|
|
local size = obj.getVar("eff").get_obj_vector_size();
|
|
if(size > 0){
|
|
for(local i = 0; i < size; i++){
|
|
local pooledObj = obj.getVar("eff").get_obj_vector(i);
|
|
if(pooledObj) pooledObj.setValid(false);
|
|
}
|
|
}
|
|
obj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
}
|
|
else{
|
|
obj.getVar("bool").setBool(0, true);
|
|
local size = obj.getVar("eff").get_obj_vector_size();
|
|
if(size > 0){
|
|
for(local i = 0; i < size; i++){
|
|
local pooledObj = obj.getVar("eff").get_obj_vector(i);
|
|
if(pooledObj) pooledObj.setValid(false);
|
|
}
|
|
}
|
|
obj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case 2:
|
|
break;
|
|
}
|
|
break;
|
|
case SKILL_BYKK_HYUNMOO:
|
|
local sub = obj.getVar("custom").getInt(0);
|
|
switch(sub){
|
|
case 0:
|
|
local time = sq_GetObjectTime(obj);
|
|
if(time >= obj.getVar("custom").getInt(3) && state == 21 && obj.getVar("disappear").getBool(0) == false){
|
|
obj.getVar("disappear").setBool(0, true);
|
|
obj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter());
|
|
if((!sqrChr || sqrChr.getState() == STATE_DIE) && obj.getVar("disappear").getBool(0) == false){
|
|
obj.getVar("disappear").setBool(0, true);
|
|
obj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
break;
|
|
case 1:
|
|
local targetObj = obj.getVar("tar").get_obj_vector(0);
|
|
if(!targetObj || targetObj.getState() == 26){
|
|
sq_SendDestroyPacketPassiveObject(obj);
|
|
}
|
|
local offsetX = sq_GetDistancePos(sq_GetXPos(targetObj), sq_GetDirection(obj), 200);
|
|
sq_setCurrentAxisPos(obj, 0, offsetX);
|
|
sq_setCurrentAxisPos(obj, 1, sq_GetYPos(targetObj) + 125);
|
|
break;
|
|
}
|
|
break;
|
|
case SKILL_BYKK_SHIKIGAMI:
|
|
local sub = obj.getVar("custom").getInt(0);
|
|
switch(sub){
|
|
case 1:
|
|
local time = sq_GetObjectTime(obj);
|
|
if(time >= obj.getVar("custom").getInt(4) + 500 && obj.getVar().getBool(0) == false){
|
|
obj.getVar().setBool(0, true);
|
|
local totalDamage = obj.getVar("custom").getInt(2);
|
|
local sizeRate = obj.getVar("custom").getInt(6);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643012,250,0,-sq_GetZPos(obj),sq_GetDirection(obj),3,totalDamage,sizeRate,0,0,0,0,0);
|
|
sq_SendDestroyPacketPassiveObject(obj);
|
|
}
|
|
break;
|
|
case 2:
|
|
local time = sq_GetObjectTime(obj);
|
|
if(time >= obj.getVar("custom").getInt(1) - 350){
|
|
if(obj.isExistTimeEvent(2)) obj.stopTimeEvent(2);
|
|
if(obj.isExistTimeEvent(3)) obj.stopTimeEvent(3);
|
|
}
|
|
if(time >= obj.getVar("custom").getInt(1)){
|
|
sq_SendDestroyPacketPassiveObject(obj);
|
|
}
|
|
break;
|
|
case 5:
|
|
local randomNum = obj.getVar("custom").getInt(1);
|
|
local randomNum2 = obj.getVar("custom").getInt(4);
|
|
local time = sq_GetObjectTime(obj);
|
|
if(time <= 300 + randomNum){
|
|
local vz = sq_GetUniformVelocity(obj.getVar("custom").getInt(3), obj.getVar("custom").getInt(3) - 150 + randomNum2 * 5, time, 300 + randomNum);
|
|
local angle = sq_GetUniformVelocity(-35 + randomNum2, 0, time, 300);
|
|
sq_setCurrentAxisPos(obj, 2, vz);
|
|
sq_SetCustomRotate(obj, sq_ToRadian(angle.tofloat()));
|
|
}
|
|
else{
|
|
local vz = sq_GetUniformVelocity(obj.getVar("custom").getInt(3) - 150 + randomNum2 * 5, obj.getVar("custom").getInt(3), time, 300 + randomNum + obj.getVar("custom").getInt(2));
|
|
local angle = sq_GetUniformVelocity(0, 35 + randomNum2, time, 300);
|
|
sq_setCurrentAxisPos(obj, 2, vz);
|
|
sq_SetCustomRotate(obj, sq_ToRadian(angle.tofloat()));
|
|
if(time >= obj.getVar("custom").getInt(2) + 300 && obj.getVar().getBool(0) == false){
|
|
obj.getVar().setBool(0, true);
|
|
local pooledObj;
|
|
if(randomNum > 50){
|
|
pooledObj = sq_AddDrawOnlyAniFromParent(obj, "passiveobject/4_priest_bykk/3exorcist_bykk/animation/shikigami/birddisappearw.ani", 0, 0, 0);
|
|
sq_SetCustomRotate(pooledObj, sq_ToRadian(-20.0, 20.0));
|
|
}
|
|
else{
|
|
local angle = sq_ToRadian(-20.0, 20.0);
|
|
pooledObj = sq_AddDrawOnlyAniFromParent(obj, "passiveobject/4_priest_bykk/3exorcist_bykk/animation/shikigami/birddisappearb1.ani", 0, 0, 0);
|
|
sq_SetCustomRotate(pooledObj, angle);
|
|
pooledObj = sq_AddDrawOnlyAniFromParent(obj, "passiveobject/4_priest_bykk/3exorcist_bykk/animation/shikigami/birddisappearb2.ani", 0, 1, 1);
|
|
sq_SetCustomRotate(pooledObj, angle);
|
|
}
|
|
sq_SendDestroyPacketPassiveObject(obj);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case SKILL_BYKK_DESTROYSPIRITTALISMAN:
|
|
switch(subtype){
|
|
case 1:
|
|
local sub = obj.getVar("custom").getInt(0);
|
|
switch(sub){
|
|
case 1:
|
|
local time = sq_GetObjectTime(obj);
|
|
if(time >= 1500 && obj.getVar().getBool(0) == false){
|
|
obj.getVar().setBool(0, true);
|
|
sq_SendDestroyPacketPassiveObject(obj);
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case 2:
|
|
local targetObj = obj.getVar("tar").get_obj_vector(0);
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(targetObj);
|
|
if(!activeObj || activeObj.getState() == STATE_DIE || activeObj.getHp() <= 0) sq_SendDestroyPacketPassiveObject(obj);
|
|
break;
|
|
}
|
|
break;
|
|
case SKILL_BYKK_THROWWEAPON:
|
|
local time = sq_GetObjectTime(obj);
|
|
if(time >= obj.getVar("custom").getInt(1) && obj.getVar().getBool(0) == false){
|
|
obj.getVar().setBool(0, true);
|
|
sq_SendDestroyPacketPassiveObject(obj);
|
|
local aniPath = "passiveobject/4_priest_bykk/3exorcist_bykk/animation/throwweapon/disappear.ani";
|
|
local direction = sq_GetDirection(obj), x = sq_GetXPos(obj), y = sq_GetYPos(obj), z = sq_GetZPos(obj);
|
|
local sizeRate = obj.getVar("custom").getInt(0);
|
|
createOnlyDrawObjectEX_Priest_bykk(obj,aniPath,true,direction,x,y,z,ENUM_DRAWLAYER_NORMAL,sizeRate,sizeRate)
|
|
}
|
|
break;
|
|
case SKILL_BYKK_DANGEROUSSCALE:
|
|
if(obj.getVar("custom").getInt(0) == 1) return;
|
|
local state = obj.getVar("state").getInt(0);
|
|
switch(state){
|
|
case 21:
|
|
local targetObj = obj.getVar("tar").get_obj_vector(0);
|
|
local aniPath = "appendage/ap_common_hold.nut";
|
|
if(targetObj && !CNSquirrelAppendage.sq_IsAppendAppendage(targetObj, aniPath)){
|
|
obj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case SKILL_BYKK_PENTAGON:
|
|
switch(subtype){
|
|
case 1:
|
|
switch(state){
|
|
case 22:
|
|
local timer = obj.getVar().get_ct_vector(0);//得到
|
|
if(timer){
|
|
local currentT = timer.Get();//得到时间
|
|
if(currentT >= obj.getVar("custom").getInt(3) && obj.getVar().getBool(0) == false){
|
|
obj.getVar().setBool(0, true);
|
|
obj.addSetStatePacket(23, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 2:
|
|
local sub = obj.getVar("custom").getInt(0);
|
|
local sizeRate = obj.getVar("custom").getInt(1);
|
|
switch(sub){
|
|
case 2:
|
|
local time = sq_GetObjectTime(obj);
|
|
local sizeRate = sq_GetUniformVelocity(100, 50 * sizeRate / 100, time, 250);
|
|
local currentAni = obj.getCurrentAnimation();
|
|
sizeRate = sizeRate.tofloat() / 100.0;
|
|
currentAni.setImageRateFromOriginal(sizeRate, sizeRate);
|
|
currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate);
|
|
break;
|
|
}
|
|
break;
|
|
case 3:
|
|
break;
|
|
case 4:
|
|
break;
|
|
case 5:
|
|
break;
|
|
case 6:
|
|
break;
|
|
case 7:
|
|
break;
|
|
case 8:
|
|
break;
|
|
case 9:
|
|
break;
|
|
}
|
|
break;
|
|
case SKILL_BYKK_FOURGODPOWER:
|
|
switch(subtype){
|
|
case 1:
|
|
break;
|
|
case 2:
|
|
switch(state){
|
|
case 21:
|
|
local timer = obj.getVar().get_ct_vector(0);//得到
|
|
if(timer){
|
|
local currentT = timer.Get();//得到时间
|
|
local isStrong = obj.getVar("custom").getInt(4);
|
|
local lifeTime = obj.getVar("custom").getInt(5);
|
|
if(isStrong > 0) lifeTime = lifeTime / 2;
|
|
if(currentT >= lifeTime && obj.getVar().getBool(0) == false){
|
|
obj.getVar().setBool(0, true);
|
|
obj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 3:
|
|
switch(state){
|
|
case 21:
|
|
local timer = obj.getVar().get_ct_vector(0);//得到
|
|
if(timer){
|
|
local currentT = timer.Get();//得到时间
|
|
local isStrong = obj.getVar("custom").getInt(4);
|
|
local lifeTime = obj.getVar("custom").getInt(5);
|
|
if(isStrong > 0) lifeTime = lifeTime / 2;
|
|
if(currentT >= lifeTime && obj.getVar().getBool(0) == false){
|
|
obj.getVar().setBool(0, true);
|
|
obj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 4:
|
|
break;
|
|
}
|
|
break;
|
|
case SKILL_BYKK_BLUEDRAGON:
|
|
local sub = obj.getVar("custom").getInt(0);
|
|
if(sub == 1){
|
|
switch(state){
|
|
default:
|
|
if(sq_GetZPos(obj) <= 0 && obj.getVar().getBool(0) == false){
|
|
obj.getVar().setBool(0, true);
|
|
obj.sq_RemoveMoveParticle();
|
|
local sqrChr = sq_GetCNRDObjectToSQRCharacter(obj.getTopCharacter());
|
|
|
|
local destX_01 = obj.getXPos() - sqrChr.getXPos();
|
|
local destY_01 = obj.getYPos() - sqrChr.getYPos();
|
|
if(sq_GetDirection(obj) == ENUM_DIRECTION_LEFT) destX_01 = sqrChr.getXPos() - obj.getXPos();
|
|
|
|
sq_BinaryStartWrite();
|
|
sq_BinaryWriteDword(100);
|
|
sq_BinaryWriteDword(30);
|
|
sq_BinaryWriteDword(30);
|
|
sq_BinaryWriteDword(30);
|
|
sq_BinaryWriteDword(30);
|
|
sq_BinaryWriteDword(30);
|
|
sq_SendCreatePassiveObjectPacket(sqrChr, 24030, 0, destX_01, destY_01, 0, sq_GetDirection(sqrChr));
|
|
|
|
local totalDamage = obj.getVar("custom").getInt(1);
|
|
local sizeRate = obj.getVar("custom").getInt(2);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643039,0,0,0,sq_GetDirection(obj),2,totalDamage,sizeRate,0,0,0,0,0);
|
|
sq_SendDestroyPacketPassiveObject(obj);
|
|
}
|
|
else if(sq_GetZPos(obj) > 0 && sq_GetObjectTime(obj) >= 3000) sq_SendDestroyPacketPassiveObject(obj);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case SKILL_BYKK_ADVANCEDDRAGON:
|
|
local sub = obj.getVar("custom").getInt(0);
|
|
if(sub == 1){
|
|
local time = sq_GetObjectTime(obj);
|
|
local lifeTime = obj.getVar("custom").getInt(5);
|
|
local speedRate = obj.getVar("custom").getInt(6);
|
|
lifeTime = lifeTime + 200000 / speedRate;
|
|
if(time >= lifeTime && obj.getVar().getBool(0) == false){
|
|
obj.getVar().setBool(0, true);
|
|
local range = obj.getVar("custom").getInt(3);
|
|
local sizeRate = range.tofloat() / 310.0;
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "passiveobject/4_priest_bykk/3exorcist_bykk/animation/advanceddragon/advanceddragon_bright/endmagiccircle_1.ani", 0, 0, 0);
|
|
local pAni = pooledObj.getCurrentAnimation();
|
|
pAni.setImageRateFromOriginal(sizeRate, sizeRate);
|
|
pAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate);
|
|
sq_SendDestroyPacketPassiveObject(obj);
|
|
}
|
|
}
|
|
else if(sub == 3){
|
|
switch(state){
|
|
case 21:
|
|
local timer = obj.getVar().get_ct_vector(0);
|
|
if(timer){
|
|
local currentT = timer.Get();
|
|
if(currentT >= obj.getVar("custom").getInt(2)){
|
|
obj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case 4:
|
|
switch(skillIndex){
|
|
case SKILL_DireStream:
|
|
local Id = obj.getVar("avenger_ID").get_vector(0);
|
|
local pChrOBJ = obj.getTopCharacter();
|
|
pChrOBJ = sq_GetCNRDObjectToSQRCharacter(pChrOBJ);
|
|
local state = pChrOBJ.getState();
|
|
if(Id == AVG_OBJ_SpinCutter_Attack){
|
|
local pAni = obj.getCurrentAnimation();
|
|
local frmIndex = sq_GetAnimationFrameIndex(pAni);
|
|
|
|
local t = obj.getVar("SpinCutter_Attack_HitTime").get_ct_vector(0);
|
|
if (!t){
|
|
obj.getVar("SpinCutter_Attack_HitTime").clear_ct_vector();
|
|
obj.getVar("SpinCutter_Attack_HitTime").push_ct_vector();
|
|
t = obj.getVar("SpinCutter_Attack_HitTime").get_ct_vector(0);
|
|
t.Reset();
|
|
t.Start(10000,0);
|
|
return true;
|
|
}
|
|
local currentT = t.Get();
|
|
local end_frmIndex = 7;
|
|
pAni.setSpeedRate(150.0);
|
|
if(frmIndex >= 0 && frmIndex <= end_frmIndex){
|
|
local Dis_xpos = obj.getVar("SpinCutter_Attack").get_vector(0);
|
|
local End_xpos = sq_GetDistancePos(Dis_xpos, obj.getDirection(), 350);
|
|
local xpos = sq_GetUniformVelocity(Dis_xpos, End_xpos, currentT, 300);
|
|
obj.setCurrentPos(xpos, obj.getYPos(), obj.getZPos());
|
|
obj.getVar("SpinCutter_Attack").set_vector(1,xpos);
|
|
}
|
|
if(frmIndex == end_frmIndex + 6){
|
|
obj.getVar("SpinCutter_Attack_HitTime").clear_ct_vector();
|
|
|
|
local pIntVec = sq_GetGlobalIntVector();
|
|
sq_IntVectorClear(pIntVec);
|
|
sq_IntVectorPush(pIntVec, 11);
|
|
pChrOBJ.addSetStatePacket(STATE_SPINCUTTER, pIntVec, STATE_PRIORITY_IGNORE_FORCE, false, "");
|
|
}
|
|
if(frmIndex >= end_frmIndex + 7){
|
|
local Dis_xpos = obj.getVar("SpinCutter_Attack").get_vector(1);
|
|
local End_xpos = sq_GetDistancePos(Dis_xpos, obj.getDirection(), -350);
|
|
local xpos = sq_GetUniformVelocity(Dis_xpos, End_xpos, currentT, 300);
|
|
obj.setCurrentPos(xpos, obj.getYPos(), obj.getZPos());
|
|
}
|
|
if(state != STATE_SPINCUTTER){
|
|
sq_SendDestroyPacketPassiveObject(obj);
|
|
}
|
|
}
|
|
break;
|
|
case SKILL_PRIEST_RIGHTEOUSDEVILIZE:
|
|
switch(subtype){
|
|
case 1:
|
|
local frameIndex = sq_GetCurrentFrameIndex(obj);
|
|
local time = sq_GetObjectTime(obj);
|
|
local currentAni = obj.getCurrentAnimation();
|
|
if(frameIndex < 21){
|
|
if(frameIndex > 13){
|
|
local fireT = currentAni.getDelaySum(14, 21);
|
|
local currentT = time - currentAni.getDelaySum(0, 13);
|
|
local vx = sq_GetUniformVelocity(obj.getVar("custom").getInt(3), obj.getVar("custom").getInt(2), currentT, fireT);
|
|
sq_setCurrentAxisPos(obj, 0, vx);
|
|
}
|
|
else{
|
|
local fireT = currentAni.getDelaySum(0, 13);
|
|
local vx = sq_GetUniformVelocity(0, obj.getVar("custom").getInt(1), time, fireT);
|
|
local dstX = sq_GetDistancePos(obj.getVar("custom").getInt(2), obj.getDirection(), vx);
|
|
sq_setCurrentAxisPos(obj, 0, dstX);
|
|
obj.getVar("custom").setInt(3, dstX);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function findTheStrongestTarget(obj)
|
|
{
|
|
obj.getVar("Tar_boss").clear_obj_vector();
|
|
obj.getVar("Tar_named").clear_obj_vector();
|
|
obj.getVar("Tar_normal").clear_obj_vector();
|
|
obj.getVar("tar").clear_obj_vector();
|
|
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(sq_IsBoss(activeObj)){
|
|
obj.getVar("Tar_boss").push_obj_vector(activeObj);
|
|
continue;
|
|
}
|
|
else if(sq_IsNamed(activeObj)){
|
|
obj.getVar("Tar_named").push_obj_vector(activeObj);
|
|
continue;
|
|
}
|
|
else{
|
|
obj.getVar("Tar_normal").push_obj_vector(activeObj);
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
local bossSize = obj.getVar("Tar_boss").get_obj_vector_size();
|
|
local namedSize = obj.getVar("Tar_named").get_obj_vector_size();
|
|
local normalSize = obj.getVar("Tar_normal").get_obj_vector_size();
|
|
if(bossSize > 0){
|
|
for(local i = 0; i < bossSize; i++){
|
|
local targetObj = obj.getVar("Tar_boss").get_obj_vector(i);
|
|
if(targetObj) obj.getVar("tar").push_obj_vector(targetObj);
|
|
}
|
|
}
|
|
if(namedSize > 0){
|
|
for(local i = 0; i < namedSize; i++){
|
|
local targetObj = obj.getVar("Tar_named").get_obj_vector(i);
|
|
if(targetObj) obj.getVar("tar").push_obj_vector(targetObj);
|
|
}
|
|
}
|
|
if(normalSize > 0){
|
|
for(local i = 0; i < normalSize; i++){
|
|
local targetObj = obj.getVar("Tar_normal").get_obj_vector(i);
|
|
if(targetObj) obj.getVar("tar").push_obj_vector(targetObj);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//驱魔
|
|
|
|
function onAttack_Priest_3exorcist(obj, damager, bounding_box, is_stuck)
|
|
{
|
|
if(is_stuck) return;
|
|
if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return;
|
|
if(obj.getVar("vermilionbirdtalismanBool").getBool(0)){
|
|
obj.getVar("vermilionbirdtalismanBool").setBool(0, false);
|
|
local size = obj.getVar("VermilionbirdtalismanObj").get_obj_vector_size();
|
|
if(size > 0){
|
|
for(local i = 0; i < size; i++){
|
|
local aObj = obj.getVar("VermilionbirdtalismanObj").get_obj_vector(i);
|
|
if(aObj){
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(aObj);
|
|
if(colObj.getState() != 21) colObj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
}
|
|
}
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(damager);
|
|
local bonusRate = 1.0, chakraofgodLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD);
|
|
if(chakraofgodLevel > 0) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 1, chakraofgodLevel).tofloat() / 1000;
|
|
print("bonusRate = "+ bonusRate);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_VERMILIONBIRDTALISMAN, -1, 2, bonusRate);
|
|
local lifeTime = sq_GetIntData(obj, SKILL_BYKK_VERMILIONBIRDTALISMAN, 3);
|
|
local hitTime = sq_GetIntData(obj, SKILL_BYKK_VERMILIONBIRDTALISMAN, 5);
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_VERMILIONBIRDTALISMAN, 2);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,activeObj,643005,0,0,50,sq_GetDirection(obj),2,totalDamage,lifeTime,hitTime,sizeRate,0,0,0);
|
|
}
|
|
}
|
|
|
|
function createOnlyDrawObject_Priest_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_Priest_bykk(obj,aniPath,isTrue,direction,x,y,z,drawlayer,sizeRateX,sizeRateY)
|
|
{
|
|
local ani = sq_CreateAnimation("",aniPath);
|
|
local pooledObj = sq_CreatePooledObject(ani,isTrue);
|
|
sq_SetCurrentDirection(pooledObj, direction);
|
|
pooledObj.setCurrentPos(x,y,z);
|
|
local currentAni = pooledObj.getCurrentAnimation();
|
|
sizeRateX = sizeRateX.tofloat() / 100.0;
|
|
sizeRateY = sizeRateY.tofloat() / 100.0;
|
|
currentAni.setImageRateFromOriginal(sizeRateX, sizeRateY);
|
|
pooledObj = sq_SetEnumDrawLayer(pooledObj, drawlayer);
|
|
sq_AddObject(obj, pooledObj, OBJECTTYPE_DRAWONLY, false);
|
|
return pooledObj;
|
|
}
|
|
|
|
function createSkillPassive_Priest_3exorcist_bykk(obj,passiveObj,objnum,x,y,z,direction,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();
|
|
}
|
|
local skillIndex = 0;
|
|
local subtype = 0;
|
|
switch(objnum){
|
|
case 643001: skillIndex = SKILL_BYKK_CHAKRAOFGOD; subtype = 1; break;
|
|
case 643002: skillIndex = SKILL_BYKK_CHAKRAOFGOD; subtype = 2; break;
|
|
case 643003: skillIndex = SKILL_BYKK_ENTERINGNIRVANA; subtype = 1; break;
|
|
case 643004: skillIndex = SKILL_BYKK_VERMILIONBIRDTALISMAN; subtype = 1; break;
|
|
case 643005: skillIndex = SKILL_BYKK_VERMILIONBIRDTALISMAN; subtype = 2; break;
|
|
case 643006: skillIndex = SKILL_BYKK_VERMILIONBIRDTALISMAN; subtype = 3; break;
|
|
case 643007: skillIndex = SKILL_BYKK_BAEKHO; subtype = 1; break;
|
|
case 643008: skillIndex = SKILL_BYKK_BAEKHO; subtype = 2; break;
|
|
case 643009: skillIndex = SKILL_BYKK_THUNDERBOLTTALISMAN; subtype = 1; break;
|
|
case 643010: skillIndex = SKILL_BYKK_THUNDERBOLTTALISMAN; subtype = 2; break;
|
|
case 643011: skillIndex = SKILL_BYKK_HYUNMOO; subtype = 1; break;
|
|
case 643012: skillIndex = SKILL_BYKK_SHIKIGAMI; subtype = 1; break;
|
|
case 643013: skillIndex = SKILL_BYKK_DESTROYSPIRITTALISMAN; subtype = 1; break;
|
|
case 643014: skillIndex = SKILL_BYKK_DESTROYSPIRITTALISMAN; subtype = 2; break;
|
|
case 643015: skillIndex = SKILL_BYKK_DESTROYSPIRITTALISMAN; subtype = 3; break;
|
|
case 643016: skillIndex = SKILL_BYKK_ANTIAIRUPPER; subtype = 1; break;
|
|
case 643017: skillIndex = SKILL_BYKK_ANTIAIRUPPER; subtype = 2; break;
|
|
case 643018: skillIndex = SKILL_BYKK_GROUNDCRASH; subtype = 1; break;
|
|
case 643019: skillIndex = SKILL_BYKK_CUTTINGDARKNESS; subtype = 1; break;
|
|
case 643020: skillIndex = SKILL_BYKK_THROWWEAPON; subtype = 1; break;
|
|
case 643021: skillIndex = SKILL_BYKK_REPEATEDSMASH; subtype = 1; break;
|
|
case 643022: skillIndex = SKILL_BYKK_ATOMICSMASH; subtype = 1; break;
|
|
case 643023: skillIndex = SKILL_BYKK_DANGEROUSSCALE; subtype = 1; break;
|
|
case 643024: skillIndex = SKILL_BYKK_THEBEST7HIT; subtype = 1; break;
|
|
case 643025: skillIndex = SKILL_BYKK_THEBEST7HIT; subtype = 2; break;
|
|
case 643026: skillIndex = SKILL_BYKK_PENTAGON; subtype = 1; break;
|
|
case 643027: skillIndex = SKILL_BYKK_PENTAGON; subtype = 2; break;
|
|
case 643028: skillIndex = SKILL_BYKK_PENTAGON; subtype = 3; break;
|
|
case 643029: skillIndex = SKILL_BYKK_PENTAGON; subtype = 4; break;
|
|
case 643030: skillIndex = SKILL_BYKK_PENTAGON; subtype = 5; break;
|
|
case 643031: skillIndex = SKILL_BYKK_PENTAGON; subtype = 6; break;
|
|
case 643032: skillIndex = SKILL_BYKK_PENTAGON; subtype = 7; break;
|
|
case 643033: skillIndex = SKILL_BYKK_PENTAGON; subtype = 8; break;
|
|
case 643034: skillIndex = SKILL_BYKK_PENTAGON; subtype = 9; break;
|
|
case 643035: skillIndex = SKILL_BYKK_FOURGODPOWER; subtype = 1; break;
|
|
case 643036: skillIndex = SKILL_BYKK_FOURGODPOWER; subtype = 2; break;
|
|
case 643037: skillIndex = SKILL_BYKK_FOURGODPOWER; subtype = 3; break;
|
|
case 643038: skillIndex = SKILL_BYKK_FOURGODPOWER; subtype = 4; break;
|
|
case 643039: skillIndex = SKILL_BYKK_BLUEDRAGON; subtype = 1; break;
|
|
case 643040: skillIndex = SKILL_BYKK_ADVANCEDDRAGON; subtype = 1; break;
|
|
}
|
|
if(skillIndex == 0 && subtype == 0) return;
|
|
sq_BinaryStartWrite();
|
|
sq_BinaryWriteDword(3);
|
|
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, PASSIVEOBJECT_PRIESTBYKK, 0, destX_01 + x, destY_01 + y, z, direction);
|
|
}
|
|
|
|
function getAttackCancelStartFrameSize_Priest_3exorcist(obj)
|
|
{
|
|
return 2;
|
|
}
|
|
|
|
function getAttackCancelStartFrame_Priest_3exorcist(obj, Index)
|
|
{
|
|
if(Index == 0) return 7;
|
|
else if(Index == 1) return 6;
|
|
else if(Index == 2) return 6;
|
|
}
|
|
|
|
function onAttack_priest_attack_3exorcist(obj, damager, boundingBox, isStuck)
|
|
{
|
|
if(isStuck) return;
|
|
}
|
|
|
|
function onAfterSetState_priest_attack_3exorcist(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local attackIndex = obj.getAttackIndex();
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0){
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)){
|
|
switch(attackIndex){
|
|
case 0:
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/light/exorcistattack1_attack.ani"), 0, 0);
|
|
break;
|
|
case 1:
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/light/exorcistattack2_attack2.ani"), 0, 0);
|
|
break;
|
|
case 2:
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/light/exorcistattack3_attack3.ani"), 0, 0);
|
|
break;
|
|
}
|
|
}
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)){
|
|
switch(attackIndex){
|
|
case 0:
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/fire/exorcistattack1_attack.ani"), 0, 0);
|
|
break;
|
|
case 1:
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/fire/exorcistattack2_attack2.ani"), 0, 0);
|
|
break;
|
|
case 2:
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/fire/exorcistattack3_attack3.ani"), 0, 0);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_priest_attack_3exorcist(obj, flagIndex)
|
|
{
|
|
if(!obj) return;
|
|
// print("flagIndex = "+flagIndex);
|
|
switch(flagIndex){
|
|
case 1000:
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0){
|
|
// print("test2222");
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
local bonusRate = sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 0, sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD));
|
|
bonusRate = bonusRate.tofloat() / 100.0;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(174, -1, 0, bonusRate) + 100;
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON);
|
|
local sizeRate = sq_GetLevelData(obj, SKILL_BYKK_CHARGEWEAPON, 2, skillLevel);
|
|
if(skillLevel > 0) createSkillPassive_Priest_3exorcist_bykk(obj,obj,643017,150,0,0,sq_GetDirection(obj),totalDamage,sizeRate,0,0,0,0,0,0);
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)) createSkillPassive_Priest_3exorcist_bykk(obj,obj,643001,125,0,30,sq_GetDirection(obj),totalDamage,1,0,0,0,0,0,0);
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)){
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643001,125,0,30,sq_GetDirection(obj),totalDamage,0,0,0,0,0,0,0);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STAGEOFHERMIT) > 0 && sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON) > 0){
|
|
setStageofhermitAppendage(obj);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//脉轮 : 圣光
|
|
function checkExecutableSkill_Chakraofcalmness(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CHAKRAOFCALMNESS);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_IntVectPush(SKILL_BYKK_CHAKRAOFCALMNESS);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CHAKRAOFCALMNESS, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Chakraofcalmness(obj)
|
|
{
|
|
if (!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Chakraofcalmness(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
local Ani = obj.sq_GetThrowChargeAni(1);
|
|
obj.setCurrentAnimation(Ani);
|
|
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
|
|
local skillIndex = obj.sq_GetVectorData(datas, 1);
|
|
obj.getVar("mailunSet").setInt(0, skillIndex);
|
|
local skill_level = sq_GetSkillLevel(obj, skillIndex);
|
|
local castTime = sq_GetCastTime(obj, skillIndex, skill_level);
|
|
local timeRate = delaySum * 100 / castTime;
|
|
print("timeRate = "+timeRate);
|
|
obj.getVar("mailunSet").setInt(1, timeRate);
|
|
currentAni.setSpeedRate(timeRate.tofloat());
|
|
sq_StartDrawCastGauge(obj, castTime, true);//开始读条
|
|
switch(skillIndex){
|
|
case SKILL_BYKK_CHAKRAOFCALMNESS:
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0) obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofcalmness/90lvrosary/chakracasting_f.ani"), 0, 0);
|
|
else obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofcalmness/cast.ani"), 0, 0);
|
|
break;
|
|
case SKILL_BYKK_CHAKRAOFPASSION:
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0) obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofpassion/90lvrosary/chakracasting_f.ani"), 0, 0);
|
|
else obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofpassion/cast.ani"), 0, 0);
|
|
break;
|
|
}
|
|
break;
|
|
case 1:
|
|
sq_EndDrawCastGauge(obj);
|
|
local Ani = obj.sq_GetThrowShootAni(1);
|
|
obj.setCurrentAnimation(Ani);
|
|
local speed = 500 * obj.getVar("mailunSet").getInt(1) / 100;
|
|
obj.setTimeEvent(1, speed, 1, false);
|
|
local skillIndex = obj.getVar("mailunSet").getInt(0);
|
|
switch(skillIndex){
|
|
case SKILL_BYKK_CHAKRAOFCALMNESS:
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) <= 0) sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/chakraofcalmness/start.ani", 0, 0, 0);
|
|
break;
|
|
case SKILL_BYKK_CHAKRAOFPASSION:
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) <= 0) sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/chakraofpassion/start.ani", 0, 0, 0);
|
|
break;
|
|
}
|
|
|
|
local skillLevel = sq_GetSkillLevel(obj, skillIndex);
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)) CNSquirrelAppendage.sq_RemoveAppendage(obj, apdPath1);
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)) CNSquirrelAppendage.sq_RemoveAppendage(obj, apdPath2);
|
|
switch(skillIndex){
|
|
case SKILL_BYKK_CHAKRAOFCALMNESS:
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, skillIndex, false, apdPath1, true);
|
|
local buffTime = sq_GetLevelData(obj, skillIndex, 0, skillLevel);
|
|
// local mgAttack = sq_GetLevelData(obj, skillIndex, 1, skillLevel);
|
|
local castTime = sq_GetLevelData(obj, skillIndex, 2, skillLevel);
|
|
if(buffTime > 0) AddAppendage.sq_SetValidTime(buffTime);
|
|
AddAppendage.setBuffIconImage(46);
|
|
AddAppendage.setEnableIsBuff(true);
|
|
AddAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), skillIndex, skillLevel);
|
|
CNSquirrelAppendage.sq_Append(AddAppendage, obj, obj, true);
|
|
obj.getVar("element_kk").setInt(1, 100);
|
|
local change_appendage = AddAppendage.sq_getChangeStatus("chakraofcalmness");
|
|
if(!change_appendage) change_appendage = AddAppendage.sq_AddChangeStatus("chakraofcalmness",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000);
|
|
if(change_appendage){
|
|
change_appendage.clearParameter();
|
|
// change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_ATTACK, true, (mgAttack).tofloat() * 0.1);
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_CAST_SPEED, false, (castTime).tofloat());
|
|
}
|
|
AddAppendage.sq_DeleteEffectFront();
|
|
AddAppendage.sq_DeleteEffectBack();
|
|
local chakraofgodLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD);
|
|
if(false){//chakraofgodLevel > 0
|
|
AddAppendage.sq_AddEffectBack("character/priest/effect/animation/3exorcist_bykk/chakraofcalmness/90lvrosary/chakraofcalmnessroop_03.ani");
|
|
AddAppendage.sq_AddEffectBack("character/priest/effect/animation/3exorcist_bykk/chakraofcalmness/90lvrosary/chakraofcalmnessroop_04.ani");
|
|
AddAppendage.sq_AddEffectFront("character/priest/effect/animation/3exorcist_bykk/chakraofcalmness/90lvrosary/chakraofcalmnessroop_01.ani");
|
|
AddAppendage.sq_AddEffectFront("character/priest/effect/animation/3exorcist_bykk/chakraofcalmness/90lvrosary/chakraofcalmnessroop_02.ani");
|
|
}
|
|
else{
|
|
AddAppendage.sq_AddEffectFront("character/priest/effect/animation/3exorcist_bykk/chakraofcalmness/front-dodge.ani");
|
|
AddAppendage.sq_AddEffectFront("character/priest/effect/animation/3exorcist_bykk/chakraofcalmness/front-glow.ani");
|
|
AddAppendage.sq_AddEffectFront("character/priest/effect/animation/3exorcist_bykk/chakraofcalmness/front-normal.ani");
|
|
AddAppendage.sq_AddEffectBack("character/priest/effect/animation/3exorcist_bykk/chakraofcalmness/back-dodge.ani");
|
|
AddAppendage.sq_AddEffectBack("character/priest/effect/animation/3exorcist_bykk/chakraofcalmness/back-glow.ani");
|
|
AddAppendage.sq_AddEffectBack("character/priest/effect/animation/3exorcist_bykk/chakraofcalmness/back-normal.ani");
|
|
}
|
|
setSkillBonusRate_3Exorcist_bykk(obj);
|
|
obj.sq_PlaySound("PR_CHA_COLD");
|
|
break;
|
|
case SKILL_BYKK_CHAKRAOFPASSION:
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, skillIndex, false, apdPath2, true);
|
|
local buffTime = sq_GetLevelData(obj, skillIndex, 0, skillLevel);
|
|
// local phAttack = sq_GetLevelData(obj, skillIndex, 1, skillLevel);
|
|
local stuckRate = sq_GetLevelData(obj, skillIndex, 2, skillLevel);
|
|
local hitReRate = sq_GetLevelData(obj, skillIndex, 3, skillLevel);
|
|
if(buffTime > 0) AddAppendage.sq_SetValidTime(buffTime);
|
|
AddAppendage.setBuffIconImage(47);
|
|
AddAppendage.setEnableIsBuff(true);
|
|
AddAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), skillIndex, skillLevel);
|
|
CNSquirrelAppendage.sq_Append(AddAppendage, obj, obj, true);
|
|
obj.getVar("element_kk").setInt(0, 100);
|
|
local change_appendage = AddAppendage.sq_getChangeStatus("chakraofcalmness");
|
|
if(!change_appendage) change_appendage = AddAppendage.sq_AddChangeStatus("chakraofcalmness",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000);
|
|
if(change_appendage){
|
|
change_appendage.clearParameter();
|
|
// change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_ATTACK, true, (phAttack).tofloat() * 0.1);
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_STUCK, false, (stuckRate).tofloat() * -0.1);
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_RIGIDITY, false, (hitReRate).tofloat());
|
|
}
|
|
AddAppendage.sq_DeleteEffectFront();
|
|
AddAppendage.sq_DeleteEffectBack();
|
|
local chakraofgodLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD);
|
|
if(false){//chakraofgodLevel > 0
|
|
AddAppendage.sq_AddEffectBack("character/priest/effect/animation/3exorcist_bykk/chakraofpassion/90lvrosary/chakraofpassionroop_03.ani");
|
|
AddAppendage.sq_AddEffectBack("character/priest/effect/animation/3exorcist_bykk/chakraofpassion/90lvrosary/chakraofpassionroop_04.ani");
|
|
AddAppendage.sq_AddEffectFront("character/priest/effect/animation/3exorcist_bykk/chakraofpassion/90lvrosary/chakraofpassionroop_01.ani");
|
|
AddAppendage.sq_AddEffectFront("character/priest/effect/animation/3exorcist_bykk/chakraofpassion/90lvrosary/chakraofpassionroop_02.ani");
|
|
}
|
|
else{
|
|
AddAppendage.sq_AddEffectBack("character/priest/effect/animation/3exorcist_bykk/chakraofpassion/back-dodge.ani");
|
|
AddAppendage.sq_AddEffectBack("character/priest/effect/animation/3exorcist_bykk/chakraofpassion/back-glow.ani");
|
|
AddAppendage.sq_AddEffectBack("character/priest/effect/animation/3exorcist_bykk/chakraofpassion/back-normal.ani");
|
|
AddAppendage.sq_AddEffectFront("character/priest/effect/animation/3exorcist_bykk/chakraofpassion/front-dodge.ani");
|
|
AddAppendage.sq_AddEffectFront("character/priest/effect/animation/3exorcist_bykk/chakraofpassion/front-glow.ani");
|
|
AddAppendage.sq_AddEffectFront("character/priest/effect/animation/3exorcist_bykk/chakraofpassion/front-normal.ani");
|
|
}
|
|
setSkillBonusRate_3Exorcist_bykk(obj);
|
|
obj.sq_PlaySound("PR_CHA_HOT");
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Chakraofcalmness(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CHAKRAOFCALMNESS, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onTimeEvent_Chakraofcalmness(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
if(!obj) return false;
|
|
if(timeEventIndex == 1){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
}
|
|
}
|
|
|
|
function onEndState_Chakraofcalmness(obj, new_state)
|
|
{
|
|
if(!obj) return;
|
|
if(new_state != STATE_BYKK_CHAKRAOFCALMNESS){
|
|
sq_EndDrawCastGauge(obj);
|
|
}
|
|
}
|
|
|
|
function drawAppend_appendage_chakraofcalmness(appendage, isOver, x, y, isFlip)
|
|
{
|
|
if(!appendage) return;
|
|
local parentObj = appendage.getParent();
|
|
local obj = sq_GetCNRDObjectToSQRCharacter(parentObj);
|
|
if (!obj || obj.getState() == STATE_DIE) {
|
|
appendage.setValid(false);
|
|
return;
|
|
}
|
|
}
|
|
|
|
function drawAppend_appendage_chakraofpassion(appendage, isOver, x, y, isFlip)
|
|
{
|
|
local parentObj = appendage.getParent();
|
|
local obj = sq_GetCNRDObjectToSQRCharacter(parentObj);
|
|
if (!obj || obj.getState() == STATE_DIE) {
|
|
appendage.setValid(false);
|
|
return;
|
|
}
|
|
}
|
|
|
|
//脉轮 : 烈焰
|
|
function checkExecutableSkill_Chakraofpassion(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CHAKRAOFPASSION);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_IntVectPush(SKILL_BYKK_CHAKRAOFPASSION);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CHAKRAOFCALMNESS, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Chakraofpassion(obj)
|
|
{
|
|
if (!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Chakraofpassion(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_SetCurrentAnimation(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Chakraofpassion(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//破魔符
|
|
function checkExecutableSkill_Enteringnirvana(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_ENTERINGNIRVANA);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_ENTERINGNIRVANA, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Enteringnirvana(obj)
|
|
{
|
|
if (!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Enteringnirvana(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
local Ani = obj.sq_GetThrowChargeAni(0);
|
|
obj.setCurrentAnimation(Ani);
|
|
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_BYKK_ENTERINGNIRVANA);
|
|
local castTime = sq_GetCastTime(obj, SKILL_BYKK_ENTERINGNIRVANA, skill_level);
|
|
local timeRate = delaySum * 100 / castTime;
|
|
print("timeRate = "+timeRate);
|
|
currentAni.setSpeedRate(timeRate.tofloat());
|
|
sq_StartDrawCastGauge(obj, castTime, true);//开始读条
|
|
|
|
obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_ENTERINGNIRVANA);
|
|
break;
|
|
case 1:
|
|
sq_EndDrawCastGauge(obj);
|
|
local Ani = obj.sq_GetThrowShootAni(0);
|
|
obj.setCurrentAnimation(Ani);
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local speedRate = 8000 / currentAni.getDelaySum(0, 0);
|
|
obj.getVar("setEnteringnirvana").setInt(0, speedRate);
|
|
local delaySum = currentAni.getDelaySum(0, 2);
|
|
obj.setTimeEvent(1, delaySum, 1, false);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STAGEOFHERMIT) > 0 && CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut")){
|
|
setStageofhermitAppendage(obj);
|
|
}
|
|
obj.sq_PlaySound("BUDD_LIGHTBALL");
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Enteringnirvana(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_ENTERINGNIRVANA, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProcCon_Enteringnirvana(obj)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onKeyFrameFlag_Enteringnirvana(obj, flagIndex)
|
|
{
|
|
if(!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onTimeEvent_Enteringnirvana(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
if(!obj) return false;
|
|
switch(timeEventIndex){
|
|
case 1:
|
|
local hitMax = sq_GetIntData(obj, SKILL_BYKK_ENTERINGNIRVANA, 3);
|
|
local bonusRate = 1.0, chakraofgodLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD);
|
|
if(chakraofgodLevel > 0) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 1, chakraofgodLevel).tofloat() / 1000;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_ENTERINGNIRVANA, -1, 0, bonusRate);
|
|
local sizeRate = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_ENTERINGNIRVANA, -1, 12, 1.0) + 100;
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_ENTERINGNIRVANA);
|
|
local prob = sq_GetLevelData(obj, SKILL_BYKK_ENTERINGNIRVANA, 1, skillLevel);
|
|
local time = sq_GetLevelData(obj, SKILL_BYKK_ENTERINGNIRVANA, 3, skillLevel);
|
|
local moveSpeed = sq_GetLevelData(obj, SKILL_BYKK_ENTERINGNIRVANA, 4, skillLevel);
|
|
local attackSpeed = sq_GetLevelData(obj, SKILL_BYKK_ENTERINGNIRVANA, 5, skillLevel);
|
|
local subtype = 0;
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)) subtype = 1;
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)) subtype = 2;
|
|
local offSetX = 50;
|
|
if(obj.isDownSkillLastKey()){
|
|
local speedRate = obj.getVar("setEnteringnirvana").getInt(0);
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "passiveobject/4_priest_bykk/3exorcist_bykk/animation/enteringnirvana/talisman1.ani", 0, 1, 61);
|
|
local pooledObj2 = sq_AddDrawOnlyAniFromParent(obj, "passiveobject/4_priest_bykk/3exorcist_bykk/animation/enteringnirvana/talisman2.ani", 0, 0, 60);
|
|
local pAni = pooledObj.getCurrentAnimation();
|
|
local pAni2 = pooledObj2.getCurrentAnimation();
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
|
pAni2.setSpeedRate(speedRate.tofloat());
|
|
offSetX = 150;
|
|
}
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643003,offSetX,0,70,sq_GetDirection(obj),hitMax,totalDamage,sizeRate,prob,time,moveSpeed,attackSpeed,subtype);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndState_Enteringnirvana(obj, new_state)
|
|
{
|
|
if(!obj) return;
|
|
if(new_state != STATE_BYKK_ENTERINGNIRVANA)
|
|
sq_EndDrawCastGauge(obj);
|
|
}
|
|
|
|
//朱雀符
|
|
function checkExecutableSkill_Vermilionbirdtalisman(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_VERMILIONBIRDTALISMAN);
|
|
if (isUse){
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_GODOFEXORCISM) > 0 && CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/priest/3exorcist_bykk/ap_chakraofpassion.nut")){
|
|
obj.startSkillCoolTime(SKILL_BYKK_VERMILIONBIRDTALISMAN, sq_GetSkillLevel(obj, SKILL_BYKK_VERMILIONBIRDTALISMAN), -1);
|
|
local size = obj.getVar("VermilionbirdtalismanObj").get_obj_vector_size();
|
|
if(size <= 0){
|
|
obj.getVar("VermilionbirdtalismanObj").clear_obj_vector();
|
|
obj.getVar("vermilionbirdtalismanBool").setBool(0, true);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643005,-50,0,100,sq_GetDirection(obj),1,0,0,0,0,0,0,0);
|
|
}
|
|
local state = obj.getState();
|
|
if(state == STATE_STAND || state == STATE_DASH){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
}
|
|
return true;
|
|
}
|
|
obj.startSkillCoolTime(SKILL_BYKK_VERMILIONBIRDTALISMAN, sq_GetSkillLevel(obj, SKILL_BYKK_VERMILIONBIRDTALISMAN), -1);
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_VERMILIONBIRDTALISMAN, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Vermilionbirdtalisman(obj)
|
|
{
|
|
if (!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Vermilionbirdtalisman(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
local Ani = obj.sq_GetThrowChargeAni(2);
|
|
obj.setCurrentAnimation(Ani);
|
|
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_BYKK_VERMILIONBIRDTALISMAN);
|
|
local castTime = sq_GetCastTime(obj, SKILL_BYKK_VERMILIONBIRDTALISMAN, skill_level);
|
|
local timeRate = delaySum * 100 / castTime;
|
|
currentAni.setSpeedRate(timeRate.tofloat());
|
|
sq_StartDrawCastGauge(obj, castTime, true);//开始读条
|
|
break;
|
|
case 1:
|
|
sq_EndDrawCastGauge(obj);
|
|
local Ani = obj.sq_GetThrowShootAni(2);
|
|
obj.setCurrentAnimation(Ani);
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Vermilionbirdtalisman(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_VERMILIONBIRDTALISMAN, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 1:
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_GODOFEXORCISM) > 0 && CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut")){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProcCon_Vermilionbirdtalisman(obj)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onKeyFrameFlag_Vermilionbirdtalisman(obj, flagIndex)
|
|
{
|
|
if(!obj) return false;
|
|
switch(flagIndex){
|
|
case 1000:
|
|
local delay = sq_GetIntData(obj, SKILL_BYKK_VERMILIONBIRDTALISMAN, 3);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_GODOFEXORCISM) <= 0 || !CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut")){
|
|
obj.setTimeEvent(1, delay + 500, 1, false);
|
|
local bonusRate = 1.0, chakraofgodLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD);
|
|
if(chakraofgodLevel > 0) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 1, chakraofgodLevel).tofloat() / 1000;
|
|
print("bonusRate = "+ bonusRate);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_VERMILIONBIRDTALISMAN, -1, 0, bonusRate);
|
|
local lifeTime = sq_GetIntData(obj, SKILL_BYKK_VERMILIONBIRDTALISMAN, 3);
|
|
local hitTime = sq_GetIntData(obj, SKILL_BYKK_VERMILIONBIRDTALISMAN, 4);
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_VERMILIONBIRDTALISMAN, 2);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643004,50,0,90,sq_GetDirection(obj),totalDamage,lifeTime,hitTime,sizeRate,0,0,0,0);
|
|
}
|
|
else{
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/godofexorcism/godofexorcism_vermilionbirdtalisman_spawn_magic_body.ani", -45, 0, 95);
|
|
local bonusRate = 1.0, chakraofgodLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD);
|
|
if(chakraofgodLevel > 0) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 1, chakraofgodLevel).tofloat() / 1000;
|
|
print("bonusRate = "+ bonusRate);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_VERMILIONBIRDTALISMAN, -1, 1, bonusRate);
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_VERMILIONBIRDTALISMAN, 2);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643006,50,0,90,sq_GetDirection(obj),totalDamage,sizeRate,0,0,0,0,0,0);
|
|
}
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function onTimeEvent_Vermilionbirdtalisman(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
if(!obj) return false;
|
|
switch(timeEventIndex){
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndState_Vermilionbirdtalisman(obj, new_state)
|
|
{
|
|
if(!obj) return;
|
|
if(new_state != STATE_BYKK_VERMILIONBIRDTALISMAN)
|
|
sq_EndDrawCastGauge(obj);
|
|
}
|
|
|
|
//式神 : 白虎
|
|
function checkExecutableSkill_Baekho(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_BAEKHO);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BAEKHO, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Baekho(obj)
|
|
{
|
|
if (!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Baekho(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
local Ani = obj.sq_GetThrowChargeAni(2);
|
|
obj.setCurrentAnimation(Ani);
|
|
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_BYKK_BAEKHO);
|
|
local castTime = sq_GetCastTime(obj, SKILL_BYKK_BAEKHO, skill_level);
|
|
local timeRate = delaySum * 100 / castTime;
|
|
currentAni.setSpeedRate(timeRate.tofloat());
|
|
sq_StartDrawCastGauge(obj, castTime, true);//开始读条
|
|
break;
|
|
case 1:
|
|
sq_EndDrawCastGauge(obj);
|
|
local Ani = obj.sq_GetThrowShootAni(2);
|
|
obj.setCurrentAnimation(Ani);
|
|
obj.sq_PlaySound("R_PR_VO_BEAKHO");
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STAGEOFHERMIT) > 0 && CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut")){
|
|
setStageofhermitAppendage(obj);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Baekho(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BAEKHO, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProcCon_Baekho(obj)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onKeyFrameFlag_Baekho(obj, flagIndex)
|
|
{
|
|
if(!obj) return false;
|
|
switch(flagIndex){
|
|
case 1000:
|
|
local bonusRate = 1.0, chakraofgodLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD);
|
|
if(chakraofgodLevel > 0) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 1, chakraofgodLevel).tofloat() / 1000;
|
|
print("bonusRate = "+ bonusRate);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_BAEKHO, -1, 0, bonusRate);
|
|
local totalDamageExp = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_BAEKHO, -1, 0, 4.4 * bonusRate);
|
|
local hitTime = sq_GetIntData(obj, SKILL_BYKK_BAEKHO, 0);
|
|
local hitMax = sq_GetIntData(obj, SKILL_BYKK_BAEKHO, 1);
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_BAEKHO, 2);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0){
|
|
hitTime = hitTime - sq_GetIntData(obj, SKILL_BYKK_CHAKRAOFGOD, 4);
|
|
sizeRate = sizeRate * (1000 + sq_GetIntData(obj, SKILL_BYKK_CHAKRAOFGOD, 5)) / 1000;
|
|
}
|
|
// print("hitTime = "+hitTime);
|
|
// print("hitMax = "+hitMax);
|
|
// print("sizeRate = "+sizeRate);
|
|
local apdSet = 0;
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)) apdSet = 1;
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)) apdSet = 2;
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643007,50,0,0,sq_GetDirection(obj),totalDamage,totalDamageExp,hitTime,hitMax,sizeRate,apdSet,0,0);
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function onTimeEvent_Baekho(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
if(!obj) return false;
|
|
}
|
|
|
|
function onEndState_Baekho(obj, new_state)
|
|
{
|
|
if(!obj) return;
|
|
if(new_state != STATE_BYKK_BAEKHO)
|
|
sq_EndDrawCastGauge(obj);
|
|
}
|
|
|
|
//落雷符
|
|
function checkExecutableSkill_Thunderbolttalisman(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_THUNDERBOLTTALISMAN);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_THUNDERBOLTTALISMAN, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Thunderbolttalisman(obj)
|
|
{
|
|
if (!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Thunderbolttalisman(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
local Ani = obj.sq_GetThrowChargeAni(2);
|
|
obj.setCurrentAnimation(Ani);
|
|
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_BYKK_THUNDERBOLTTALISMAN);
|
|
local castTime = sq_GetCastTime(obj, SKILL_BYKK_THUNDERBOLTTALISMAN, skill_level);
|
|
local timeRate = delaySum * 100 / castTime;
|
|
currentAni.setSpeedRate(timeRate.tofloat());
|
|
sq_StartDrawCastGauge(obj, castTime, true);//开始读条
|
|
break;
|
|
case 1:
|
|
sq_EndDrawCastGauge(obj);
|
|
local Ani = obj.sq_GetThrowShootAni(2);
|
|
obj.setCurrentAnimation(Ani);
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STAGEOFHERMIT) > 0 && CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut")){
|
|
setStageofhermitAppendage(obj);
|
|
}
|
|
obj.sq_PlaySound("PR_LIGHT");
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Thunderbolttalisman(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_THUNDERBOLTTALISMAN, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProcCon_Thunderbolttalisman(obj)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onKeyFrameFlag_Thunderbolttalisman(obj, flagIndex)
|
|
{
|
|
if(!obj) return false;
|
|
switch(flagIndex){
|
|
case 1000:
|
|
local hitTime = sq_GetIntData(obj, SKILL_BYKK_THUNDERBOLTTALISMAN, 2);
|
|
local bonusRate = 1.0, chakraofgodLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD);
|
|
if(chakraofgodLevel > 0) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 1, chakraofgodLevel).tofloat() / 1000;
|
|
print("bonusRate = "+ bonusRate);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_THUNDERBOLTTALISMAN, -1, 1, bonusRate);
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_THUNDERBOLTTALISMAN);
|
|
local lifeTime = sq_GetLevelData(obj, SKILL_BYKK_THUNDERBOLTTALISMAN, 0, skillLevel);
|
|
local prob = sq_GetLevelData(obj, SKILL_BYKK_THUNDERBOLTTALISMAN, 0, skillLevel);
|
|
local time = sq_GetLevelData(obj, SKILL_BYKK_THUNDERBOLTTALISMAN, 0, skillLevel);
|
|
local level = sq_GetSkillLevel(obj, 174) + 10;
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_THUNDERBOLTTALISMAN, 1);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0) sizeRate = sizeRate * (100 + sq_GetIntData(obj, SKILL_BYKK_CHAKRAOFGOD, 8)) / 100;
|
|
local isTalisman = 0;
|
|
if(sq_GetIntData(obj, SKILL_BYKK_THUNDERBOLTTALISMAN, 15) > 0) isTalisman = 1;
|
|
print("isTalisman = "+isTalisman);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643009,50,0,0,sq_GetDirection(obj),hitTime,totalDamage,lifeTime,prob,time,level,sizeRate,isTalisman);
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function onTimeEvent_Thunderbolttalisman(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
if(!obj) return false;
|
|
}
|
|
|
|
function onEndState_Thunderbolttalisman(obj, new_state)
|
|
{
|
|
if(!obj) return;
|
|
if(new_state != STATE_BYKK_THUNDERBOLTTALISMAN)
|
|
sq_EndDrawCastGauge(obj);
|
|
}
|
|
|
|
//式神 : 玄武
|
|
function checkExecutableSkill_Hyunmoo(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local hyunmooObj = obj.getVar("hyunmooObj").get_obj_vector(0);
|
|
if (hyunmooObj){
|
|
local state = obj.getState();
|
|
if(state == 0 || state == 14){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
}
|
|
return false;
|
|
}
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_HYUNMOO);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HYUNMOO, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Hyunmoo(obj)
|
|
{
|
|
if (!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Hyunmoo(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
local Ani = obj.sq_GetThrowChargeAni(1);
|
|
obj.setCurrentAnimation(Ani);
|
|
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_BYKK_HYUNMOO);
|
|
local castTime = sq_GetCastTime(obj, SKILL_BYKK_HYUNMOO, skill_level);
|
|
local timeRate = delaySum * 100 / castTime;
|
|
currentAni.setSpeedRate(timeRate.tofloat());
|
|
sq_StartDrawCastGauge(obj, castTime, true);//开始读条
|
|
break;
|
|
case 1:
|
|
sq_EndDrawCastGauge(obj);
|
|
local Ani = obj.sq_GetThrowShootAni(1);
|
|
obj.setCurrentAnimation(Ani);
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
obj.sq_PlaySound("PR_HYUNMU");
|
|
|
|
obj.getVar("hyunmooObj").clear_obj_vector();
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_HYUNMOO, 1);
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_HYUNMOO);
|
|
local holdTime = sq_GetLevelData(obj, SKILL_BYKK_HYUNMOO, 1, skillLevel);
|
|
local lifeTime = sq_GetLevelData(obj, SKILL_BYKK_HYUNMOO, 0, skillLevel);
|
|
local mpRestore = sq_GetLevelData(obj, SKILL_BYKK_HYUNMOO, 3, skillLevel);
|
|
local attackSpeed = sq_GetLevelData(obj, SKILL_BYKK_HYUNMOO, 8, skillLevel);
|
|
local moveSpeed = sq_GetLevelData(obj, SKILL_BYKK_HYUNMOO, 9, skillLevel);
|
|
local changeRate = sq_GetIntData(obj, SKILL_BYKK_HYUNMOO, 6);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643011,-50,0,0,sq_GetDirection(obj),0,sizeRate,holdTime,lifeTime,mpRestore,attackSpeed,moveSpeed,changeRate);
|
|
obj.endSkillCoolTime(SKILL_BYKK_HYUNMOO);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Hyunmoo(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HYUNMOO, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndState_Hyunmoo(obj, new_state)
|
|
{
|
|
if(!obj) return;
|
|
if(new_state != STATE_BYKK_HYUNMOO)
|
|
sq_EndDrawCastGauge(obj);
|
|
}
|
|
|
|
function proc_appendage_hyunmoobuff(appendage)
|
|
{
|
|
if(!appendage) return;
|
|
local parentObj = appendage.getParent();
|
|
if(!parentObj || parentObj.getState() == STATE_DIE){
|
|
appendage.setValid(false);
|
|
return;
|
|
}
|
|
local sourceObj = appendage.getSource();
|
|
local distance = appendage.getVar("custom").getInt(0);
|
|
local xPos = sq_GetXPos(sourceObj), yPos = sq_GetYPos(sourceObj);
|
|
if(sq_GetDistance(xPos, yPos, parentObj.getXPos(), parentObj.getYPos(), true) > distance / 2){
|
|
appendage.setValid(false);
|
|
return;
|
|
}
|
|
}
|
|
|
|
function proc_appendage_hyunmoohold(appendage)
|
|
{
|
|
if(!appendage) return;
|
|
local parentObj = appendage.getParent();
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(parentObj);
|
|
if(!activeObj || activeObj.getState() == STATE_DIE || activeObj.getHp() <= 0){
|
|
appendage.setValid(false);
|
|
return;
|
|
}
|
|
sq_setCurrentAxisPos(activeObj, 0, appendage.getVar("custom").getInt(0));
|
|
sq_setCurrentAxisPos(activeObj, 1, appendage.getVar("custom").getInt(1));
|
|
sq_setCurrentAxisPos(activeObj, 2, appendage.getVar("custom").getInt(2));
|
|
local sourceObj = appendage.getSource();
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(sourceObj);
|
|
if(colObj.getState() != 24 && colObj.getState() != 23){
|
|
appendage.setValid(false);
|
|
return;
|
|
}
|
|
}
|
|
|
|
function procSkill_Hyunmoo(obj)
|
|
{
|
|
local hyunmooObj = obj.getVar("hyunmooObj").get_obj_vector(0);
|
|
if(!sq_GetSkill(obj, SKILL_BYKK_HYUNMOO).isInCoolTime() && hyunmooObj){
|
|
obj.setSkillCommandEnable(SKILL_BYKK_HYUNMOO,true);
|
|
local b_useskill = obj.sq_IsEnterSkill(SKILL_BYKK_HYUNMOO);
|
|
if(b_useskill != -1){
|
|
obj.startSkillCoolTime(SKILL_BYKK_HYUNMOO, sq_GetSkillLevel(obj, SKILL_BYKK_HYUNMOO), -1);
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(hyunmooObj);
|
|
if(colObj.getState() == 21 || colObj.getState() == 22){
|
|
local distance = sq_GetIntData(obj, SKILL_BYKK_HYUNMOO, 1);
|
|
local xPos = sq_GetXPos(obj), yPos = sq_GetYPos(obj);
|
|
obj.getVar("HyunmooTar_boss").clear_obj_vector();
|
|
obj.getVar("HyunmooTar_named").clear_obj_vector();
|
|
obj.getVar("HyunmooTar_normal").clear_obj_vector();
|
|
obj.getVar("HyunmooTar").clear_obj_vector();
|
|
local objectManager = obj.getObjectManager();
|
|
for (local i = 0; i < objectManager.getCollisionObjectNumber(); i++){
|
|
local object = objectManager.getCollisionObject(i);
|
|
if (object && object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object) && sq_GetDistance(xPos, yPos, object.getXPos(), object.getYPos(), true) <= distance / 2){
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(object);
|
|
if(sq_IsBoss(activeObj)){
|
|
obj.getVar("HyunmooTar_boss").push_obj_vector(activeObj);
|
|
continue;
|
|
}
|
|
else if(sq_IsNamed(activeObj)){
|
|
obj.getVar("HyunmooTar_named").push_obj_vector(activeObj);
|
|
continue;
|
|
}
|
|
else{
|
|
obj.getVar("HyunmooTar_normal").push_obj_vector(activeObj);
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
local bossSize = obj.getVar("HyunmooTar_boss").get_obj_vector_size();
|
|
local namedSize = obj.getVar("HyunmooTar_named").get_obj_vector_size();
|
|
local normalSize = obj.getVar("HyunmooTar_normal").get_obj_vector_size();
|
|
if(bossSize > 0){
|
|
for(local i = 0; i < bossSize; i++){
|
|
local targetObj = obj.getVar("HyunmooTar_boss").get_obj_vector(i);
|
|
if(targetObj) obj.getVar("HyunmooTar").push_obj_vector(targetObj);
|
|
}
|
|
}
|
|
if(namedSize > 0){
|
|
for(local i = 0; i < namedSize; i++){
|
|
local targetObj = obj.getVar("HyunmooTar_named").get_obj_vector(i);
|
|
if(targetObj) obj.getVar("HyunmooTar").push_obj_vector(targetObj);
|
|
}
|
|
}
|
|
if(normalSize > 0){
|
|
for(local i = 0; i < normalSize; i++){
|
|
local targetObj = obj.getVar("HyunmooTar_normal").get_obj_vector(i);
|
|
if(targetObj) obj.getVar("HyunmooTar").push_obj_vector(targetObj);
|
|
}
|
|
}
|
|
if(obj.getVar("HyunmooTar").get_obj_vector_size() > 0){
|
|
local targetObj = obj.getVar("HyunmooTar").get_obj_vector(0);
|
|
colObj.getVar("atkTarget").clear_obj_vector();
|
|
colObj.getVar("atkTarget").push_obj_vector(targetObj);
|
|
colObj.addSetStatePacket(23, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
}
|
|
else if(colObj.getState() == 24){
|
|
colObj.stopTimeEvent(3);
|
|
colObj.setTimeEvent(3, 1000, 1, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//式神·殇
|
|
function checkExecutableSkill_Shikigami(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_SHIKIGAMI);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_SHIKIGAMI, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Shikigami(obj)
|
|
{
|
|
if (!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Shikigami(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
local Ani = obj.sq_GetThrowChargeAni(2);
|
|
obj.setCurrentAnimation(Ani);
|
|
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_BYKK_SHIKIGAMI);
|
|
local castTime = sq_GetCastTime(obj, SKILL_BYKK_SHIKIGAMI, skill_level) *0+100;
|
|
local timeRate = delaySum * 100 / castTime;
|
|
currentAni.setSpeedRate(timeRate.tofloat());
|
|
sq_StartDrawCastGauge(obj, castTime, true);//开始读条
|
|
break;
|
|
case 1:
|
|
sq_EndDrawCastGauge(obj);
|
|
local Ani = obj.sq_GetThrowShootAni(2);
|
|
obj.setCurrentAnimation(Ani);
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
|
|
local bonusRate = 1.0, chakraofgodLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD);
|
|
if(chakraofgodLevel > 0) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 1, chakraofgodLevel).tofloat() / 1000;
|
|
print("bonusRate = "+ bonusRate);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_SHIKIGAMI, -1, 0, bonusRate);
|
|
local totalDamageExp = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_SHIKIGAMI, -1, 1, bonusRate);
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_SHIKIGAMI);
|
|
local hitTime = sq_GetIntData(obj, SKILL_BYKK_SHIKIGAMI, 2);
|
|
local lifeTime = sq_GetIntData(obj, SKILL_BYKK_SHIKIGAMI, 3);
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_SHIKIGAMI, 7);
|
|
local sizeRateExp = sq_GetIntData(obj, SKILL_BYKK_SHIKIGAMI, 6);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643012,-75,-1,200,sq_GetDirection(obj),1,totalDamage,totalDamageExp,hitTime,lifeTime,sizeRate,sizeRateExp,0);
|
|
|
|
local apdPath = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath)){
|
|
obj.setTimeEvent(1, 50, 1, false);
|
|
}
|
|
else{
|
|
obj.setTimeEvent(1, lifeTime + 800, 1, false);
|
|
obj.getVar("shikigamiBool").setBool(0, false);
|
|
obj.getVar("shikigamiObj").clear_obj_vector();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Shikigami(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_SHIKIGAMI, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 1:
|
|
// obj.sq_IntVectClear();
|
|
// obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProcCon_Shikigami(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 1:
|
|
local apdPath = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath)) return;
|
|
sq_SetKeyxEnable(obj, E_JUMP_COMMAND, true);
|
|
if(sq_IsEnterCommand(obj, E_JUMP_COMMAND) && obj.getVar("shikigamiBool").getBool(0) == false){
|
|
obj.getVar("shikigamiBool").setBool(0, true);
|
|
obj.setTimeEvent(2, 50, 1, true);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_Shikigami(obj, flagIndex)
|
|
{
|
|
if(!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onTimeEvent_Shikigami(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
if(!obj) return false;
|
|
switch(timeEventIndex){
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 2:
|
|
local size = obj.getVar("shikigamiObj").get_obj_vector_size();
|
|
if(size > 0){
|
|
for(local i = 0; i < size; i++){
|
|
local atkObj = obj.getVar("shikigamiObj").get_obj_vector(0);
|
|
if(atkObj){
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(atkObj);
|
|
colObj.setTimeEvent(4, 1000, 1, true);
|
|
}
|
|
}
|
|
}
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndState_Shikigami(obj, new_state)
|
|
{
|
|
if(!obj) return;
|
|
if(new_state != STATE_BYKK_SHIKIGAMI)
|
|
sq_EndDrawCastGauge(obj);
|
|
}
|
|
|
|
//灭魂符
|
|
function checkExecutableSkill_Destroyspirittalisman(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_DESTROYSPIRITTALISMAN);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_DESTROYSPIRITTALISMAN, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Destroyspirittalisman(obj)
|
|
{
|
|
if (!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Destroyspirittalisman(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_DESTROYSPIRITTALISMAN);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Destroyspirittalisman(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProcCon_Destroyspirittalisman(obj)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onKeyFrameFlag_Destroyspirittalisman(obj, flagIndex)
|
|
{
|
|
if(!obj) return false;
|
|
switch(flagIndex){
|
|
case 1:
|
|
local bonusRate = 1.0, chakraofgodLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD);
|
|
if(chakraofgodLevel > 0) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 1, chakraofgodLevel).tofloat() / 1000;
|
|
print("bonusRate = "+ bonusRate);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DESTROYSPIRITTALISMAN, -1, 1, bonusRate);
|
|
local lifeTime = sq_GetIntData(obj, SKILL_BYKK_DESTROYSPIRITTALISMAN, 0);
|
|
local hitTime = sq_GetIntData(obj, SKILL_BYKK_DESTROYSPIRITTALISMAN, 23);
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_DESTROYSPIRITTALISMAN, 28);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643013,50,0,90,sq_GetDirection(obj),0,totalDamage,lifeTime,hitTime,sizeRate,0,0,0);
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function onTimeEvent_Destroyspirittalisman(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
if(!obj) return false;
|
|
}
|
|
|
|
function onEndState_Destroyspirittalisman(obj, new_state)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
//空斩打
|
|
function checkExecutableSkill_Antiairupper(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_ANTIAIRUPPER);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_ANTIAIRUPPER, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Antiairupper(obj)
|
|
{
|
|
if (!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Antiairupper(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_ANTIAIRUPPER);
|
|
obj.sq_PlaySound("PR_ANTIAIR");
|
|
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 upForceSet = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_ANTIAIRUPPER, -1, 1, 0.75) + 100;
|
|
local isCharge = 0;
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON) > 0) isCharge = 1;
|
|
if(isCharge > 0){
|
|
obj.getVar("isCharge").setBool(0, true);
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON);
|
|
bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHARGEWEAPON, 5, skillLevel).tofloat() / 100.0;
|
|
upForceSet = upForceSet * (100 + sq_GetLevelData(obj, SKILL_BYKK_CHARGEWEAPON, 6, skillLevel)) / 100;
|
|
}
|
|
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(174, -1, 0, bonusRate) + 100;
|
|
obj.getVar("Charge").setInt(0, totalDamage);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 2));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
setChakraAttackInfo(obj);
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
|
sq_SetCurrentAttacknUpForce(attackInfo, upForceSet);
|
|
if(isCharge > 0){
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delay = currentAni.getDelaySum(0, 1);
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/chargeweapon.ani", -75, 1, 15);
|
|
local pAni = pooledObj.getCurrentAnimation();
|
|
local speedRate = pAni.getDelaySum(false) * 100 / delay;
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Antiairupper(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_Antiairupper(obj, flagIndex)
|
|
{
|
|
if(!obj) return false;
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/antiairupper/front.ani"), 0, 0);
|
|
obj.sq_AddStateLayerAnimation(-1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/antiairupper/back.ani"), 0, 0);
|
|
if(obj.getVar("isCharge").getBool(0)){
|
|
local totalDamage = obj.getVar("Charge").getInt(0);
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON);
|
|
local sizeRate = sq_GetLevelData(obj, SKILL_BYKK_CHARGEWEAPON, 8, skillLevel);
|
|
local bonusRate = sq_GetLevelData(obj, SKILL_BYKK_CHARGEWEAPON, 7, skillLevel);
|
|
totalDamage = totalDamage * bonusRate / 100;
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643016,0,0,0,sq_GetDirection(obj),totalDamage,0,0,0,0,0,0,0);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643017,-165,0,0,sq_GetDirection(obj),totalDamage,sizeRate,0,0,0,0,0,0);
|
|
}
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0){
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
local bonusRate = sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 0, sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD));
|
|
local totalDamage = obj.getVar("Charge").getInt(0) * bonusRate / 100;
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)){
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/light/antiairupper_a.ani"), 0, 0);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643001,-165,0,30,sq_GetDirection(obj),totalDamage,1,0,0,0,0,0,0);
|
|
}
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)){
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/fire/antiairupper_a.ani"), 0, 0);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643001,-165,0,30,sq_GetDirection(obj),totalDamage,0,0,0,0,0,0,0);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STAGEOFHERMIT) > 0 && sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON) > 0){
|
|
setStageofhermitAppendage(obj);
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//疾风打
|
|
function checkExecutableSkill_Galesmash(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_GALESMASH);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GALESMASH, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Galesmash(obj)
|
|
{
|
|
if (!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Galesmash(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_GALESMASH1);
|
|
// 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 speedRate = 6000 / currentAni.getDelaySum(0, 0);
|
|
local speed = 10.0 * speedRate.tofloat();
|
|
if(sq_GetDirection(obj) == ENUM_DIRECTION_RIGHT) sq_SetVelocity(obj, 0, speed);
|
|
else sq_SetVelocity(obj, 0, -speed);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_GALESMASH, -1, 0, 1.0);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, PRATK_BYKK_GALESMASH1));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
setChakraAttackInfo(obj);
|
|
break;
|
|
case 1:
|
|
obj.getVar("galeCancel").setBool(1, true);
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_GALESMASH2);
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_GALESMASH, -1, 1, 1.0);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, PRATK_BYKK_GALESMASH2));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
setChakraAttackInfo(obj);
|
|
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)) obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/light/galesmash_smashg.ani"), 0, 0);
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)) obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/fire/galesmash_smashg.ani"), 0, 0);
|
|
obj.sq_PlaySound("PR_RWIND");
|
|
obj.sq_PlaySound("CROSS_SWING");
|
|
break;
|
|
}
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_GALESMASH);
|
|
local prob = sq_GetLevelData(obj, SKILL_BYKK_GALESMASH, 2, skillLevel);
|
|
local time = sq_GetLevelData(obj, SKILL_BYKK_GALESMASH, 4, skillLevel);
|
|
local level = sq_GetSkillLevel(obj, 174) + 20;
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
|
sq_SetChangeStatusIntoAttackInfo(attackInfo, 0, ACTIVESTATUS_STUN, prob, level, time);
|
|
}
|
|
|
|
function onEndCurrentAni_Galesmash(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GALESMASH, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProcCon_Galesmash(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
if(sq_GetCurrentFrameIndex(obj) >= 2){
|
|
sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
|
|
if(sq_IsEnterCommand(obj, E_ATTACK_COMMAND)){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GALESMASH, STATE_PRIORITY_AUTO, true);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_Galesmash(obj, flagIndex)
|
|
{
|
|
if(!obj) return false;
|
|
switch(flagIndex){
|
|
case 1:
|
|
obj.getVar("skillCancel").setBool(0, true);
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function onEndState_Galesmash(obj, new_state)
|
|
{
|
|
if(!obj) return;
|
|
if(new_state != STATE_BYKK_GALESMASH){
|
|
obj.getVar("skillCancel").setBool(0, false);
|
|
obj.getVar("galeCancel").setBool(1, false);
|
|
}
|
|
}
|
|
|
|
function onAttack_Galesmash(obj, damager, boundingBox, isStuck)
|
|
{
|
|
if(!obj || isStuck) return;
|
|
if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 1:
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0 && obj.getVar("galeCancel").getBool(1)){
|
|
obj.getVar("galeCancel").setBool(1, false);
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
local bonusRate = sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 0, sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD));
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_GALESMASH, -1, 1, 1.0) * bonusRate / 100;
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)){
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,damager,643001,0,0,sq_GetCenterZPos(boundingBox),sq_GetDirection(obj),totalDamage,1,1,0,0,0,0,0);
|
|
print(1);
|
|
}
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)){
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,damager,643001,0,0,sq_GetCenterZPos(boundingBox),sq_GetDirection(obj),totalDamage,0,1,0,0,0,0,0);
|
|
print(2);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
//断空捶击
|
|
function checkExecutableSkill_Groundcrash(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_GROUNDCRASH);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GROUNDCRASH, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Groundcrash(obj)
|
|
{
|
|
if (!obj) return false;
|
|
if(obj.getState() == STATE_BYKK_GALESMASH){
|
|
if(obj.getVar("skillCancel").getBool(0)) return true;
|
|
else return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Groundcrash(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_GROUNDCRASH);
|
|
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 chargeLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON);
|
|
if(chargeLevel > 0) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHARGEWEAPON, 17, chargeLevel).tofloat() / 100.0;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_GROUNDCRASH, -1, 0, bonusRate);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, PRATK_BYKK_GROUNDCRASH1));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
setChakraAttackInfo(obj);
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_GROUNDCRASHFINAL);
|
|
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 chargeLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON);
|
|
if(chargeLevel > 0) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHARGEWEAPON, 17, chargeLevel).tofloat() / 100.0;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_GROUNDCRASH, -1, 1, bonusRate);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, PRATK_BYKK_GROUNDCRASH2));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
setChakraAttackInfo(obj);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Groundcrash(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GROUNDCRASH, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_Groundcrash(obj, flagIndex)
|
|
{
|
|
if(!obj) return false;
|
|
switch(flagIndex){
|
|
case 1:
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON) > 0){
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delay = currentAni.getDelaySum(6, 6);
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/chargeweapon.ani", -50, 0, 80);
|
|
local pAni = pooledObj.getCurrentAnimation();
|
|
local speedRate = pAni.getDelaySum(false) * 100 / delay;
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
|
}
|
|
break;
|
|
case 2:
|
|
local bonusRate = 1.0;
|
|
local chargeLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON);
|
|
local sizeRate = 100;
|
|
local isSuck = 0;
|
|
if(chargeLevel > 0){
|
|
bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHARGEWEAPON, 17, chargeLevel).tofloat() / 100.0;
|
|
sizeRate = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_GROUNDCRASH, -1, 2, 1.0) + 100;
|
|
sizeRate = sizeRate * (100 + sq_GetLevelData(obj, SKILL_BYKK_CHARGEWEAPON, 18, sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON))) / 100;
|
|
}
|
|
print("bonusRate = "+bonusRate);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_GROUNDCRASH, -1, 3, bonusRate);
|
|
print("totalDamage = "+totalDamage);
|
|
print("sizeRate = "+sizeRate);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643018,155,0,0,sq_GetDirection(obj),totalDamage,sizeRate,isSuck,0,0,0,0,0);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0){
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
local bonusRate = sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 0, sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD));
|
|
totalDamage = totalDamage * bonusRate / 100;
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)){
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643001,155,0,30,sq_GetDirection(obj),totalDamage,1,0,0,0,0,0,0);
|
|
}
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)){
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643001,155,0,30,sq_GetDirection(obj),totalDamage,0,0,0,0,0,0,0);
|
|
isSuck = 1;
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STAGEOFHERMIT) > 0 && sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON) > 0){
|
|
setStageofhermitAppendage(obj);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//星落打
|
|
function checkExecutableSkill_Homerun(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_HOMERUN);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HOMERUN, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Homerun(obj)
|
|
{
|
|
if (!obj) return false;
|
|
if(obj.getState() == STATE_BYKK_GALESMASH){
|
|
if(obj.getVar("skillCancel").getBool(0)) return true;
|
|
else return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Homerun(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_HOMERUNGRAB);
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/homerun/homerun_grab_eff01.ani"), 0, 0);
|
|
obj.sq_AddStateLayerAnimation(2,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/homerun/homerun_grab_eff02.ani"), 0, 0);
|
|
obj.sq_AddStateLayerAnimation(3,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/homerun/homerun_grab_eff03.ani"), 0, 0);
|
|
obj.sq_AddStateLayerAnimation(4,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/homerun/homerun_grab_eff04.ani"), 0, 0);
|
|
obj.sq_AddStateLayerAnimation(4,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/homerun/homerun_grab_floor_eff01.ani"), 0, 0);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, PRATK_BYKK_HOMERUNGRAB));
|
|
obj.getVar("homerunAtk").setBool(0, true);
|
|
obj.getVar("homerunselect").setBool(0, true);
|
|
obj.getVar("homerunselect2").setInt(0, 0);
|
|
obj.getVar("homerunTar").clear_obj_vector();
|
|
obj.getVar("homerunObj").clear_obj_vector();
|
|
obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_HOMERUN);
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_HOMERUNCHARGE);
|
|
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 speedRate = 30000 / currentAni.getDelaySum(0, 0);
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/homerun/homerun_chargeholdtarget_upeff01.ani", 145, 1, 0);
|
|
local pAni = pooledObj.getCurrentAnimation();
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/homerun/homerun_charge_front_dust.ani", 0, 1, 0);
|
|
local pooledObj2 = sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/homerun/homerun_charge_back_dust02.ani", 0, -1, 0);
|
|
obj.getVar("homerunEff").clear_obj_vector();
|
|
obj.getVar("homerunEff").push_obj_vector(pooledObj);
|
|
obj.getVar("homerunEff").push_obj_vector(pooledObj2);
|
|
local range = sq_GetIntData(obj, SKILL_BYKK_HOMERUN, 3) / 2;
|
|
local appendage = sq_AttractToMe(obj, range, 145, 1000);
|
|
obj.getVar("homerun").setAppendage(0,appendage);
|
|
return;
|
|
break;
|
|
case 2:
|
|
local size = obj.getVar("homerunTar").get_obj_vector_size();
|
|
if(size > 0){
|
|
for(local i = 0; i < size; i++){
|
|
local targetObj = obj.getVar("homerunTar").get_obj_vector(i);
|
|
if(targetObj && targetObj.getState() != STATE_DIE) CNSquirrelAppendage.sq_RemoveAppendage(targetObj, "character/priest/3exorcist_bykk/ap_homerun_hold.nut");
|
|
}
|
|
}
|
|
local size = obj.getVar("homerunEff").get_obj_vector_size();
|
|
if(size > 0){
|
|
for(local i = 0; i < size; i++){
|
|
local pooledObj = obj.getVar("homerunEff").get_obj_vector(i);
|
|
if(pooledObj) pooledObj.setValid(false);
|
|
}
|
|
}
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_HOMERUNSMASH);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_HOMERUN, -1, 2, 1.0);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, PRATK_BYKK_HOMERUNSMASH));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
setChakraAttackInfo(obj);
|
|
local directionSelect = obj.sq_GetVectorData(datas, 1);
|
|
local isFullCharge = obj.sq_GetVectorData(datas, 2);
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
|
switch(directionSelect){
|
|
case 0:
|
|
sq_SetCurrentAttacknBackForce(attackInfo, 100);
|
|
sq_SetCurrentAttacknUpForce(attackInfo, 100);
|
|
break;
|
|
case 1:
|
|
sq_SetCurrentAttacknBackForce(attackInfo, 500);
|
|
sq_SetCurrentAttacknUpForce(attackInfo, 300);
|
|
break;
|
|
case 2:
|
|
sq_SetCurrentAttacknBackForce(attackInfo, 500);
|
|
sq_SetCurrentAttacknUpForce(attackInfo, 500);
|
|
break;
|
|
}
|
|
if(isFullCharge > 0) sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/homerun/homerun_hit_fullcharge_eff01.ani", 0, 0, 0);
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/homerun/homerun_smasha_rockhit_back09.ani", 0, -1, 0);
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/homerun/homerun_smasha_rockhit_front09.ani", 0, 1, 0);
|
|
sq_flashScreen(obj,80,100,240,150, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
|
sq_SetMyShake(obj, 5, 120);
|
|
local appendage = obj.getVar("homerun").getAppendage(0);
|
|
if(appendage) appendage.setValid(false);
|
|
obj.getVar("homerunAtk").setBool(1, true);
|
|
break;
|
|
case 3:
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_HOMERUN_SMASHA_BODY);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_HOMERUN, -1, 2, 1.0);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, PRATK_BYKK_HOMERUNSMASH));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
setChakraAttackInfo(obj);
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/homerun/homerun_smasha_rockhit_back09.ani", 0, -1, 0);
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/homerun/homerun_smasha_rockhit_front09.ani", 0, 1, 0);
|
|
sq_SetMyShake(obj, 5, 60);
|
|
break;
|
|
case 4:
|
|
local zPos = obj.sq_GetVectorData(datas, 1);
|
|
local stateTime = obj.sq_GetVectorData(datas, 2);
|
|
local isFullCharge = obj.sq_GetVectorData(datas, 3);
|
|
obj.getVar("homerunSet").setInt(0, zPos);
|
|
obj.getVar("homerunSet").setInt(1, stateTime);
|
|
obj.getVar("homerunSet").setInt(2, isFullCharge);
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_HOMERUNCHARGEHOLDTARGET);
|
|
local currentAni = obj.getCurrentAnimation();
|
|
sq_SetFrameDelayTime(currentAni, 0, stateTime);
|
|
// if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0){
|
|
// local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
// local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
// if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)){
|
|
// obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/light/homerun_smashe.ani"), 0, 0);
|
|
// }
|
|
// else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)){
|
|
// obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/fire/homerun_smashe.ani"), 0, 0);
|
|
// }
|
|
// }
|
|
return;
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
}
|
|
|
|
function onEndCurrentAni_Homerun(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
if(obj.getVar("homerunAtk").getBool(0) == false){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HOMERUN, STATE_PRIORITY_AUTO, true);
|
|
}
|
|
else {
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
}
|
|
break;
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(4);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HOMERUN, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 4:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(2);
|
|
obj.sq_IntVectPush(obj.getVar("homerunselect2").getInt(0));
|
|
obj.sq_IntVectPush(obj.getVar("homerunSet").getInt(2));
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HOMERUN, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProcCon_Homerun(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 1:
|
|
local stateTime = obj.sq_GetStateTimer();
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
local speedRate = 201800 / delaySum;
|
|
if(stateTime >= 30000 / speedRate){
|
|
local targetObj = obj.getVar("homerunTar").get_obj_vector(0);
|
|
local zPos = sq_GetZPos(targetObj);
|
|
if(!obj.isDownSkillLastKey()){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(4);
|
|
obj.sq_IntVectPush(zPos);
|
|
obj.sq_IntVectPush(stateTime);
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HOMERUN, STATE_PRIORITY_AUTO, true);
|
|
}
|
|
if(stateTime >= delaySum / 2){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(4);
|
|
obj.sq_IntVectPush(zPos);
|
|
obj.sq_IntVectPush(stateTime);
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HOMERUN, STATE_PRIORITY_AUTO, true);
|
|
}
|
|
}
|
|
case 4:
|
|
if(obj.getVar("homerunselect").getBool(0)){
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_LEFT || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_RIGHT){
|
|
obj.getVar("homerunselect").setBool(0, false);
|
|
obj.getVar("homerunselect2").setInt(0, 1);
|
|
}
|
|
else if( sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL)){
|
|
obj.getVar("homerunselect").setBool(0, false);
|
|
obj.getVar("homerunselect2").setInt(0, 2);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProc_Homerun(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 1:
|
|
local stateTime = obj.sq_GetStateTimer();
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
local targetObj = obj.getVar("homerunTar").get_obj_vector(0);
|
|
local zPos = sq_GetAccel(obj.getVar("homerunSet").getInt(0), 400, stateTime, delaySum / 2, true);
|
|
sq_setCurrentAxisPos(targetObj, 2, zPos);
|
|
break;
|
|
case 4:
|
|
local stateTime = obj.sq_GetStateTimer();
|
|
local targetObj = obj.getVar("homerunTar").get_obj_vector(0);
|
|
local zPos = sq_GetAccel(obj.getVar("homerunSet").getInt(0), 0, stateTime, obj.getVar("homerunSet").getInt(1), false);
|
|
sq_setCurrentAxisPos(targetObj, 2, zPos);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndState_Homerun(obj, new_state)
|
|
{
|
|
if(!obj) return;
|
|
if(new_state != STATE_BYKK_HOMERUN){
|
|
local size = obj.getVar("homerunTar").get_obj_vector_size();
|
|
if(size > 0){
|
|
for(local i = 0; i < size; i++){
|
|
local targetObj = obj.getVar("homerunTar").get_obj_vector(i);
|
|
if(targetObj && targetObj.getState() != STATE_DIE) CNSquirrelAppendage.sq_RemoveAppendage(targetObj, "character/priest/3exorcist_bykk/ap_homerun_hold.nut");
|
|
}
|
|
}
|
|
local size = obj.getVar("homerunEff").get_obj_vector_size();
|
|
if(size > 0){
|
|
for(local i = 0; i < size; i++){
|
|
local pooledObj = obj.getVar("homerunEff").get_obj_vector(i);
|
|
if(pooledObj) pooledObj.setValid(false);
|
|
}
|
|
}
|
|
local appendage = obj.getVar("homerun").getAppendage(0);
|
|
if(appendage) appendage.setValid(false);
|
|
}
|
|
}
|
|
|
|
function onAttack_Homerun(obj, damager, boundingBox, isStuck)
|
|
{
|
|
if(!obj || isStuck) return;
|
|
if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return;
|
|
if(obj.getVar("homerunAtk").getBool(0)){
|
|
obj.getVar("homerunAtk").setBool(0, false);
|
|
if(sq_IsFixture(damager)){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(3);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HOMERUN, STATE_PRIORITY_AUTO, true);
|
|
}
|
|
else{
|
|
obj.getVar("homerunTar").push_obj_vector(damager);
|
|
local apdPath = "character/priest/3exorcist_bykk/ap_homerun_hold.nut";
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(damager, apdPath)){
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, apdPath, true);
|
|
sq_HoldAndDelayDie(damager, obj, true, true, false, 200, 200, ENUM_DIRECTION_NEUTRAL , AddAppendage);
|
|
local stateTime = obj.sq_GetStateTimer();
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
local time = delaySum - stateTime;
|
|
if(time > 100) time = 100;
|
|
sq_MoveToAppendageForce(damager, obj, obj, 145, 0, 0, time, true, AddAppendage);
|
|
obj.getVar("homerunSet").setInt(0, sq_GetZPos(damager));
|
|
}
|
|
else{
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(3);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HOMERUN, STATE_PRIORITY_AUTO, true);
|
|
}
|
|
}
|
|
}
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) <= 0) return;
|
|
if(obj.getVar("homerunAtk").getBool(1)){
|
|
obj.getVar("homerunAtk").setBool(1, false);
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
local bonusRate = sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 0, sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD));
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_HOMERUN, -1, 2, 1.0) * bonusRate / 100;
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)){
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,damager,643001,0,0,sq_GetCenterZPos(boundingBox),sq_GetDirection(obj),totalDamage,1,1,0,0,0,0,0);
|
|
}
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)){
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,damager,643001,0,0,sq_GetCenterZPos(boundingBox),sq_GetDirection(obj),totalDamage,0,1,0,0,0,0,0);
|
|
}
|
|
}
|
|
}
|
|
|
|
//黑暗切割
|
|
function checkExecutableSkill_Cuttingdarkness(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CUTTINGDARKNESS);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CUTTINGDARKNESS, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Cuttingdarkness(obj)
|
|
{
|
|
if (!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Cuttingdarkness(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_CUTTINGDARKNESSCHARGE);
|
|
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(PRANI_BYKK_CUTTINGDARKNESSFULLSMASH);
|
|
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, chakraofgodLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD);
|
|
if(chakraofgodLevel > 0) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 1, chakraofgodLevel).tofloat() / 1000;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_CUTTINGDARKNESS, -1, 1, bonusRate);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, PRATK_BYKK_CUTTINGDARKNESS));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
setChakraAttackInfo(obj);
|
|
obj.sq_PlaySound("PR_STAR_THROW");
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Cuttingdarkness(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CUTTINGDARKNESS, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_Cuttingdarkness(obj, flagIndex)
|
|
{
|
|
if(!obj) return false;
|
|
switch(flagIndex){
|
|
case 1:
|
|
local bonusRate = 1.0, chakraofgodLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD);
|
|
if(chakraofgodLevel > 0) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 1, chakraofgodLevel).tofloat() / 1000;
|
|
print("bonusRate = "+ bonusRate);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_CUTTINGDARKNESS, -1, 2, bonusRate);
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_CUTTINGDARKNESS, 1);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643019,175,0,60,sq_GetDirection(obj),totalDamage,sizeRate,0,0,0,0,0,0);
|
|
break;
|
|
case 2:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//巨旋风
|
|
function checkExecutableSkill_Throwweapon(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_THROWWEAPON);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_THROWWEAPON, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Throwweapon(obj)
|
|
{
|
|
if (!obj) return false;
|
|
if(obj.getState() == STATE_BYKK_GALESMASH){
|
|
if(obj.getVar("skillCancel").getBool(0)) return true;
|
|
else return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Throwweapon(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_THROWWEAPONREADY);
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_THROWWEAPONTHROW);
|
|
local chargeLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON);
|
|
local bonusRate = 1.0;
|
|
if(chargeLevel > 0){
|
|
bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHARGEWEAPON, 11, chargeLevel).tofloat() / 100.0;
|
|
}
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_THROWWEAPON, -1, 0, bonusRate);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, PRATK_BYKK_THROWWEAPONSECOND));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
setChakraAttackInfo(obj);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0){
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)){
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/light/throwweapon_chargethrowh2.ani"), 0, 0);
|
|
}
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)){
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/fire/throwweapon_chargethrowh2.ani"), 0, 0);
|
|
}
|
|
}
|
|
obj.sq_PlaySound("PR_SPIN_FIN");
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
}
|
|
|
|
function onEndCurrentAni_Throwweapon(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_THROWWEAPON, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_Throwweapon(obj, flagIndex)
|
|
{
|
|
if(!obj) return false;
|
|
switch(flagIndex){
|
|
case 1:
|
|
local hitTime = sq_GetIntData(obj, SKILL_BYKK_THROWWEAPON, 2);
|
|
local lifeTime = sq_GetIntData(obj, SKILL_BYKK_THROWWEAPON, 1);
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_THROWWEAPON, 5);
|
|
local chargeLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON);
|
|
local bonusRate = 1.0;
|
|
if(chargeLevel > 0){
|
|
bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_BYKK_CHARGEWEAPON, 12, chargeLevel).tofloat() / 100.0;
|
|
lifeTime = lifeTime + sq_GetLevelData(obj, SKILL_BYKK_CHARGEWEAPON, 14, chargeLevel);
|
|
sizeRate = sq_GetIntData(obj, SKILL_BYKK_THROWWEAPON, 6);
|
|
}
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_THROWWEAPON, -1, 1, bonusRate);
|
|
local sub = 0;
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0){
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)) sub = 1;
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)){
|
|
sub = 2;
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STAGEOFHERMIT) > 0 && sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON) > 0){
|
|
setStageofhermitAppendage(obj);
|
|
}
|
|
}
|
|
}
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643020,75,0,60,sq_GetDirection(obj),totalDamage,lifeTime,hitTime,sizeRate,sub,0,0,0);
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//狂乱锤击
|
|
function checkExecutableSkill_Repeatedsmash(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_REPEATEDSMASH);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_REPEATEDSMASH, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Repeatedsmash(obj)
|
|
{
|
|
if (!obj) return false;
|
|
if(obj.getState() == STATE_BYKK_GALESMASH){
|
|
if(obj.getVar("skillCancel").getBool(0)) return true;
|
|
else return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Repeatedsmash(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_REPEATEDSMASHSTART);
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/repeatedsmash/swingstart.ani"), 150, 0);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0){
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)){
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/light/repeatedsmash_swingstart.ani"), 150, 0);
|
|
}
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)){
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/fire/repeatedsmash_swingstart.ani"), 150, 0);
|
|
}
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_REPEATEDSMASH, -1, 0, 1.0);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, PRATK_BYKK_REPEATEDSMASH));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
setChakraAttackInfo(obj);
|
|
obj.getVar("repeatedsmashSet").setInt(0, 0);
|
|
obj.startRapidInput();
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local speedRate = 7000 / currentAni.getDelaySum(0, 0);
|
|
local time = 15000 / speedRate;
|
|
obj.getVar("repeatedsmashSet").setInt(2, time);
|
|
obj.getVar("repeatedsmashSet").setInt(3, speedRate);
|
|
obj.setTimeEvent(1, time, 1, false);
|
|
sq_SetMyShake(obj, 2, 100);
|
|
obj.sq_PlaySound("PR_RATK");
|
|
break;
|
|
case 1:
|
|
if(obj.getVar("repeatedsmashSet").getInt(0) > 0){
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_REPEATEDSMASHUPGRADE);
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/repeatedsmash/crashrepeat1.ani"), 150, 0);
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/repeatedsmash/crashrepeat2.ani", 150, 0, 0);
|
|
sq_ChangeDrawLayer(pooledObj, ENUM_DRAWLAYER_BOTTOM);
|
|
}
|
|
else obj.sq_SetCurrentAnimation(PRANI_BYKK_REPEATEDSMASH);
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/repeatedsmash/swingrepeat.ani"), 150, 0);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0){
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)){
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/light/repeatedsmash_swingrepeat.ani"), 150, 0);
|
|
}
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)){
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/fire/repeatedsmash_swingrepeat.ani"), 150, 0);
|
|
}
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_REPEATEDSMASH, -1, 0, 1.0);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, PRATK_BYKK_REPEATEDSMASH));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
setChakraAttackInfo(obj);
|
|
sq_SetMyShake(obj, 2, 100);
|
|
obj.sq_PlaySound("PR_RATK");
|
|
break;
|
|
case 2:
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_REPEATEDSMASHFINAL);
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/repeatedsmash/swingfinal.ani"), 150, 0);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0){
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)){
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/light/repeatedsmash_swingfinalc.ani"), 150, 0);
|
|
}
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)){
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/fire/repeatedsmash_swingfinalc.ani"), 150, 0);
|
|
}
|
|
}
|
|
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 speedRate = 7000 / currentAni.getDelaySum(0, 0);
|
|
if(speedRate >= 130){
|
|
speedRate = 130;
|
|
currentAni.setSpeedRate(130.0);
|
|
}
|
|
obj.getVar("repeatedsmashSetSpeed").setInt(0, speedRate);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_REPEATEDSMASH, -1, 1, 1.0);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, PRATK_BYKK_REPEATEDSMASHFINAL));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
setChakraAttackInfo(obj);
|
|
obj.sq_PlaySound("PR_MUSSANG_FIN");
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Repeatedsmash(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.getVar("repeatedsmashSet").setInt(1, 1);
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_REPEATEDSMASH, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 1:
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_REPEATEDSMASH);
|
|
local hitMax = sq_GetLevelData(obj, SKILL_BYKK_REPEATEDSMASH, 2, skillLevel);
|
|
if(obj.getVar("repeatedsmashSet").getInt(0) > 0) hitMax = sq_GetLevelData(obj, SKILL_BYKK_REPEATEDSMASH, 3, skillLevel);
|
|
obj.getVar("repeatedsmashSet").setInt(1, obj.getVar("repeatedsmashSet").getInt(1) + 1);
|
|
print("hitcount = "+obj.getVar("repeatedsmashSet").getInt(1));
|
|
print("hitMax = "+hitMax);
|
|
obj.sq_IntVectClear();
|
|
if(obj.getVar("repeatedsmashSet").getInt(1) >= hitMax) obj.sq_IntVectPush(2);
|
|
else obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_REPEATEDSMASH, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 2:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProc_Repeatedsmash(obj)
|
|
{
|
|
if(!obj) return;
|
|
sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
|
|
if(sq_IsEnterCommand(obj, E_ATTACK_COMMAND)) obj.addRapidInput();
|
|
}
|
|
|
|
function onProcCon_Repeatedsmash(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
if(subState == 1){
|
|
sq_SetKeyxEnable(obj, E_JUMP_COMMAND, true);
|
|
if(sq_IsEnterCommand(obj, E_JUMP_COMMAND)){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(2);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_REPEATEDSMASH, STATE_PRIORITY_AUTO, true);
|
|
}
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_RIGHT || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_LEFT) obj.setTimeEvent(2, 1000, 1, true);
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_Repeatedsmash(obj, flagIndex)
|
|
{
|
|
if(!obj) return false;
|
|
switch(flagIndex){
|
|
case 0:
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/repeatedsmash/charge.ani", -50, 1, 30);
|
|
local pAni = pooledObj.getCurrentAnimation();
|
|
local speedRate = obj.getVar("repeatedsmashSetSpeed").getInt(0);
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
|
break;
|
|
case 1:
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_REPEATEDSMASH, -1, 5, 1.0);
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_REPEATEDSMASH);
|
|
local prob = sq_GetLevelData(obj, SKILL_BYKK_REPEATEDSMASH, 6, skillLevel);
|
|
local level = sq_GetSkillLevel(obj, 174) + 20;
|
|
local time = sq_GetLevelData(obj, SKILL_BYKK_REPEATEDSMASH, 8, skillLevel);
|
|
local size = sq_GetLevelData(obj, SKILL_BYKK_REPEATEDSMASH, 4, skillLevel);
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_REPEATEDSMASH, 6);
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,obj,643021,150,0,0,sq_GetDirection(obj),totalDamage,prob,level,time,size,sizeRate,0,0);
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function onTimeEvent_Repeatedsmash(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
if(!obj) return false;
|
|
switch(timeEventIndex){
|
|
case 1:
|
|
local rapidInput = obj.getRapidInputFrequency();
|
|
if(rapidInput > 2){
|
|
if(obj.getVar("repeatedsmashSet").getInt(0) == 0) obj.getVar("repeatedsmashSet").setInt(0, 1);
|
|
local delay = obj.getVar("repeatedsmashSet").getInt(2);
|
|
local speedRate = obj.getVar("repeatedsmashSet").getInt(3);
|
|
obj.setTimeEvent(1, delay, 1, false);
|
|
local currentAni = obj.getCurrentAnimation();
|
|
currentAni.setSpeedRate(speedRate.tofloat() * 2.0);
|
|
}
|
|
else{
|
|
local delay = obj.getVar("repeatedsmashSet").getInt(2);
|
|
local speedRate = obj.getVar("repeatedsmashSet").getInt(3);
|
|
obj.setTimeEvent(1, delay, 1, false);
|
|
local currentAni = obj.getCurrentAnimation();
|
|
currentAni.setSpeedRate(speedRate.tofloat());
|
|
}
|
|
break;
|
|
case 2:
|
|
sq_SetCurrentDirection(obj, sq_GetOppositeDirection(sq_GetDirection(obj)));
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndState_Repeatedsmash(obj, new_state)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
//疾空旋风破
|
|
function checkExecutableSkill_Giantswing(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_GIANTSWING);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GIANTSWING, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Giantswing(obj)
|
|
{
|
|
if (!obj) return false;
|
|
if(obj.getState() == STATE_BYKK_GALESMASH){
|
|
if(obj.getVar("skillCancel").getBool(0)) return true;
|
|
else return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Giantswing(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
print("subState = "+subState);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_GIANTSWINGREADY);
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
obj.startRapidInput();
|
|
obj.sq_PlaySound("PR_SPIN");
|
|
obj.sq_PlaySound("WIND_SPIN");
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_GIANTSWING);
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/giantswing/weaponloop.ani"), 0, 0);
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/giantswing/dustloop1.ani"), 0, 0);
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/giantswing/dustloop2.ani"), 0, 0);
|
|
obj.sq_AddStateLayerAnimation(-1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/giantswing/giantswing_talisman/sphereloop_01.ani"), 0, 0);
|
|
local appendage = sq_AttractToMe(obj, 250, 100, 1000);
|
|
obj.getVar("giantswingAp").setAppendage(0, appendage);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0){
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)){
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/light/giantswing_weaponloopi.ani"), 0, 0);
|
|
}
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)){
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/fire/giantswing_weaponloopi.ani"), 0, 0);
|
|
}
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
local chargeLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON);
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local speedRate = 9000 / currentAni.getDelaySum(0, 0);
|
|
if(speedRate >= 130) speedRate = 130;
|
|
print("speedRate = "+speedRate);
|
|
if(chargeLevel > 0){
|
|
speedRate = speedRate * (100 + sq_GetLevelData(obj, SKILL_BYKK_CHARGEWEAPON, 22, chargeLevel)) / 100;
|
|
}
|
|
local currentAni = obj.getCurrentAnimation();
|
|
currentAni.setSpeedRate(speedRate.tofloat());
|
|
local delay = currentAni.getDelaySum(false) / 2;
|
|
obj.getVar("giantswingSet").setInt(0, delay);
|
|
obj.getVar("giantswingSet").setInt(1, speedRate);
|
|
obj.getVar("giantswingSet").setInt(2, 0);
|
|
obj.getVar("giantswingSet").setInt(3, 0);
|
|
obj.setTimeEvent(1, delay, 1, false);
|
|
local time = (3000 / speedRate).tointeger();
|
|
if(time < 20) time = 30;
|
|
obj.setTimeEvent(3, time, -1, true);
|
|
break;
|
|
case 2:
|
|
obj.stopTimeEvent(2);
|
|
obj.stopTimeEvent(3);
|
|
obj.getVar("GiantswingAtk").setBool(1, true);
|
|
obj.sq_SetCurrentAnimation(PRANI_BYKK_GIANTSWINGFINAL);
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/giantswing/weaponfinal.ani"), 0, 0);
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/giantswing/finish.ani", 0, 0, 0);
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/giantswing/dustfinal1.ani", 0, -1, -1);
|
|
sq_ChangeDrawLayer(pooledObj, ENUM_DRAWLAYER_BOTTOM);
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "character/priest/effect/animation/3exorcist_bykk/giantswing/dustfinal2.ani", 0, -1, -1);
|
|
sq_ChangeDrawLayer(pooledObj, ENUM_DRAWLAYER_BOTTOM);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) > 0){
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)){
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/light/giantswing_weaponfinali.ani"), 0, 0);
|
|
}
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)){
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3exorcist_bykk/chakraofgod/fire/giantswing_weaponfinali.ani"), 0, 0);
|
|
}
|
|
}
|
|
local animation = obj.getCurrentAnimation();
|
|
sq_SetFrameDelayTime(animation, 6, 300);
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_GIANTSWING, -1, 1, 1.0);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, PRATK_BYKK_GIANTSWINGFINAL));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
setChakraAttackInfo(obj);
|
|
obj.sq_PlaySound("PR_SPIN_FIN");
|
|
local appendage = obj.getVar("giantswingAp").getAppendage(0);
|
|
if(appendage) appendage.setValid(false);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Giantswing(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_GIANTSWING, -1, 0, 1.0);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, PRATK_BYKK_GIANTSWING));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
setChakraAttackInfo(obj);
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GIANTSWING, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 2:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProc_Giantswing(obj)
|
|
{
|
|
if(!obj) return;
|
|
sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
|
|
if(sq_IsEnterCommand(obj, E_ATTACK_COMMAND)) obj.addRapidInput();
|
|
}
|
|
|
|
function onProcCon_Giantswing(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
if(subState == 1){
|
|
sq_SetKeyxEnable(obj, E_JUMP_COMMAND, true);
|
|
if(sq_IsEnterCommand(obj, E_JUMP_COMMAND)){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(2);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GIANTSWING, STATE_PRIORITY_AUTO, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_Giantswing(obj, flagIndex)
|
|
{
|
|
if(!obj) return false;
|
|
switch(flagIndex){
|
|
case 1:
|
|
if(obj.isExistTimeEvent(2)) return;
|
|
if(obj.getVar("giantswingSet").getInt(3) == 0){
|
|
obj.getVar("giantswingSet").setInt(3, obj.getVar("giantswingSet").getInt(3) + 1);
|
|
break;
|
|
}
|
|
else obj.getVar("giantswingSet").setInt(3, obj.getVar("giantswingSet").getInt(3) + 1);
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_GIANTSWING);
|
|
local hitMax = sq_GetLevelData(obj, SKILL_BYKK_GIANTSWING, 2, skillLevel);
|
|
if(obj.getVar("giantswingSet").getInt(2) > 0) hitMax = sq_GetLevelData(obj, SKILL_BYKK_GIANTSWING, 3, skillLevel);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON) > 0) hitMax = hitMax + sq_GetIntData(obj, SKILL_BYKK_CHARGEWEAPON, 2);
|
|
if(obj.getVar("giantswingSet").getInt(3) + 1 >= hitMax){
|
|
obj.setTimeEvent(2, 100, 1, false);
|
|
}
|
|
else obj.resetHitObjectList();
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function onTimeEvent_Giantswing(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
if(!obj) return false;
|
|
switch(timeEventIndex){
|
|
case 1:
|
|
local rapidInput = obj.getRapidInputFrequency();
|
|
if(rapidInput > 2){
|
|
if(obj.getVar("giantswingSet").getInt(2) == 0) obj.getVar("giantswingSet").setInt(2, 1);
|
|
local delay = obj.getVar("giantswingSet").getInt(0);
|
|
local speedRate = obj.getVar("giantswingSet").getInt(1);
|
|
obj.setTimeEvent(1, delay, 1, false);
|
|
local currentAni = obj.getCurrentAnimation();
|
|
currentAni.setSpeedRate(speedRate.tofloat() * 2.0);
|
|
}
|
|
else{
|
|
local delay = obj.getVar("giantswingSet").getInt(0);
|
|
local speedRate = obj.getVar("giantswingSet").getInt(1);
|
|
obj.setTimeEvent(1, delay, 1, false);
|
|
local currentAni = obj.getCurrentAnimation();
|
|
currentAni.setSpeedRate(speedRate.tofloat());
|
|
}
|
|
break;
|
|
case 2:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(2);
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GIANTSWING, STATE_PRIORITY_AUTO, true);
|
|
break;
|
|
case 3:
|
|
if(obj.isMyControlObject()){
|
|
local speedRate = obj.getVar("giantswingSet").getInt(1);
|
|
local xSpeed = 130 * speedRate / 100;
|
|
local ySpeed = speedRate * 80 / 100;
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL)) xSpeed = xSpeed;
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL)) xSpeed = -xSpeed;
|
|
else xSpeed = 0;
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL)) ySpeed = ySpeed;
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL)) ySpeed = -ySpeed;
|
|
else ySpeed = 0;
|
|
obj.sq_StartWrite();
|
|
obj.sq_WriteDword(xSpeed);
|
|
obj.sq_WriteDword(ySpeed);
|
|
sq_SendChangeSkillEffectPacket(obj, STATE_BYKK_GIANTSWING);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onChangeSkillEffect_Giantswing(obj, skillIndex, reciveData)
|
|
{
|
|
if(!obj) return;
|
|
local xSpeed = reciveData.readDword();
|
|
local ySpeed = reciveData.readDword();
|
|
sq_SetVelocity(obj, 0, xSpeed.tofloat());
|
|
sq_SetVelocity(obj, 1, ySpeed.tofloat());
|
|
}
|
|
|
|
function onEndState_Giantswing(obj, new_state)
|
|
{
|
|
if(!obj) return;
|
|
if(new_state != STATE_BYKK_GIANTSWING){
|
|
local appendage = obj.getVar("giantswingAp").getAppendage(0);
|
|
if(appendage) appendage.setValid(false);
|
|
}
|
|
}
|
|
|
|
function onAttack_Giantswing(obj, damager, boundingBox, isStuck)
|
|
{
|
|
if(!obj || isStuck) return;
|
|
if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return;
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD) <= 0) return;
|
|
if(obj.getVar("GiantswingAtk").getBool(1)){
|
|
obj.getVar("GiantswingAtk").setBool(1, false);
|
|
local apdPath1 = "character/priest/3exorcist_bykk/ap_chakraofcalmness.nut";
|
|
local apdPath2 = "character/priest/3exorcist_bykk/ap_chakraofpassion.nut";
|
|
local bonusRate = sq_GetLevelData(obj, SKILL_BYKK_CHAKRAOFGOD, 0, sq_GetSkillLevel(obj, SKILL_BYKK_CHAKRAOFGOD));
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_GIANTSWING, -1, 1, 1.0) * bonusRate / 100;
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath1)){
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,damager,643001,0,0,sq_GetCenterZPos(boundingBox),sq_GetDirection(obj),totalDamage,1,1,0,0,0,0,0);
|
|
}
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath2)){
|
|
createSkillPassive_Priest_3exorcist_bykk(obj,damager,643001,0,0,sq_GetCenterZPos(boundingBox),sq_GetDirection(obj),totalDamage,0,1,0,0,0,0,0);
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STAGEOFHERMIT) > 0 && sq_GetSkillLevel(obj, SKILL_BYKK_CHARGEWEAPON) > 0){
|
|
setStageofhermitAppendage(obj);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|