Rindro-Sqr/user/114.66.45.221/6_mage_1.c

3367 lines
139 KiB
C
Raw Normal View History

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