Rindro-Sqr/user/114.66.45.221/7_swordman_3.c

1256 lines
49 KiB
C
Raw Normal View History

2025-11-08 12:21:06 +08:00
//极·神剑术(瞬斩)
function checkExecutableSkill_FlashCut(obj)
{
if (!obj) return false;
local isUse = obj.sq_IsUseSkill(SKILL_SMBYKK_FLASHCUT);
if (isUse){
obj.sq_IntVectClear();
obj.sq_IntVectPush(0);
obj.sq_AddSetStatePacket(STATE_SMBYKK_FLASHCUT, STATE_PRIORITY_IGNORE_FORCE, true);
return true;
}
return false;
}
function checkCommandEnable_FlashCut(obj)
{
if (!obj) return false;
return true;
}
function onSetState_FlashCut(obj, state, datas, isResetTimer)
{
if(!obj) return;
local subState = obj.sq_GetVectorData(datas, 0);
obj.setSkillSubState(subState);
obj.sq_StopMove();
switch(subState){
case 0: obj.sq_SetCurrentAnimation(ANI_SMBYKK_FLASHCUTREADY_BODY); break;
case 1: obj.sq_SetCurrentAnimation(ANI_SMBYKK_FLASHCUTATK_BODY); break;
case 2: obj.sq_SetCurrentAnimation(ANI_SMBYKK_FLASHCUTEND_BODY); break;
}
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
switch(subState){
case 0:
obj.getVar("flashCutTar").clear_obj_vector();
local currentAni = obj.getCurrentAnimation();
local speedRate = 7500 / currentAni.getDelaySum(0, 0);
currentAni.setSpeedRate(speedRate.tofloat());
break;
case 1:
sq_AddDrawOnlyAniFromParent(obj, "character/swordman/effect/animation/1_swordman_bykk/flashcut/flashcutsmoke_eff_00.ani", 0, -1, 0);
local currentAni = obj.getCurrentAnimation();
local delay = currentAni.getDelaySum(false);
obj.getVar("FlashCutSet").setInt(0, sq_GetXPos(obj));
obj.setTimeEvent(0, delay / 20, 20, true);
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_FLASHCUT, -1, 0, 1.0);
local sizeRate = sq_GetIntData(obj, SKILL_SMBYKK_FLASHCUT, 2);
local speedRate = 4000 / currentAni.getDelaySum(0, 0);
createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,0,0,0,sq_GetDirection(obj),1,SKILL_SMBYKK_FLASHCUT,2,totalDamage,sizeRate,speedRate,0,0,0,0,0);
break;
case 2:
local currentAni = obj.getCurrentAnimation();
local speedRate = 8000 / currentAni.getDelaySum(0, 0);
currentAni.setSpeedRate(speedRate.tofloat() * 1.5);
break;
}
}
function onEndCurrentAni_FlashCut(obj)
{
if(!obj) return;
local subState = obj.getSkillSubState();
switch(subState){
case 0:
case 1:
obj.sq_IntVectClear();
obj.sq_IntVectPush(subState + 1);
obj.sq_AddSetStatePacket(STATE_SMBYKK_FLASHCUT, STATE_PRIORITY_AUTO, true);
break;
case 2:
obj.sq_IntVectClear();
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
break;
}
}
function onProcCon_FlashCut(obj)
{
if(!obj) return;
}
function onKeyFrameFlag_FlashCut(obj, flagIndex)
{
if(!obj) return false;
switch(flagIndex){
case 1002://`darkchange`
local currentAni = obj.getCurrentAnimation();
local delay = currentAni.getDelaySum(2, 7)
local flashScreenObj = sq_flashScreen(obj,delay,9999999,0,205,sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
obj.getVar("FlashCutObj").clear_obj_vector();
obj.getVar("FlashCutObj").push_obj_vector(flashScreenObj);
break;
case 1003: sq_SetMyShake(obj, 6, 50); break;
case 2000: sq_SetMyShake(obj, 7, 90); break;
case 2001:
obj.sq_PlaySound("SM_FLASHCUT");
obj.sq_PlaySound("FLASHCUT");
//`createBackground`
local direction = sq_GetDirection(obj), xPos = sq_GetDistancePos(sq_GetXPos(obj), direction, 200), yPos = sq_GetYPos(obj);
createOnlyDrawObjectEX_Swordman_bykk(obj,"character/swordman/effect/animation/1_swordman_bykk/flashcut/flashcutbg_02.ani",true,direction,xPos,yPos - 1,75,ENUM_DRAWLAYER_NORMAL,120,200);
createOnlyDrawObjectEX_Swordman_bykk(obj,"character/swordman/effect/animation/1_swordman_bykk/flashcut/flashcutbg_01.ani",true,direction,xPos,yPos + 1,75,ENUM_DRAWLAYER_NORMAL,200,175);
break;
case 3000: sq_SetMyShake(obj, 10, 200); break;
case 3010://`delayAttack`
local flashScreenObj = obj.getVar("FlashCutObj").get_obj_vector(0);
local pflashScreen = sq_GetCNRDObjectToFlashScreen(flashScreenObj);
if(pflashScreen){
pflashScreen.fadeOut();
sq_flashScreen(obj,0,0,200,150,sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
}
local size = obj.getVar("flashCutTar").get_obj_vector_size();
if(size > 0){
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_FLASHCUT, -1, 1, 1.0);
local totalDamageExp = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_FLASHCUT, -1, 2, 1.0);
local hitMax = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_FLASHCUT, -1, 3, 0.9) + 100;
for(local i = 0; i < size; i++){
local targetObj = obj.getVar("flashCutTar").get_obj_vector(i);
if(targetObj){
local group = sq_GetGroup(targetObj);
local uniqueId = sq_GetUniqueId(targetObj);
createSkillPassive_Swordman_bykk(obj,targetObj,PASSIVEOBJ_BYKK_SWORDMAN,0,0,sq_GetZPos(targetObj) + sq_GetObjectHeight(targetObj) / 2,sq_GetDirection(obj),1,SKILL_SMBYKK_FLASHCUT,1,totalDamage,totalDamageExp,hitMax,group,uniqueId,0,0,0);
}
}
}
break;
}
return true;
}
function onTimeEvent_FlashCut(obj, timeEventIndex, timeEventCount)
{
if(!obj) return false;
switch(timeEventIndex){
case 0:
local v = sq_GetUniformVelocity(0, 375, timeEventCount, 13);
local dstX = sq_GetDistancePos(obj.getVar("FlashCutSet").getInt(0), sq_GetDirection(obj), v);
if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX);
else obj.stopTimeEvent(0);
break;
}
}
function onEndState_FlashCut(obj, new_state)
{
if(!obj) return;
}
//万剑归宗
function checkExecutableSkill_HandlingSword(obj)
{
if (!obj) return false;
// print("test1");
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_SM_HANDLINGSWORD_BUFF)) return false;
// print("test2");
local isUse = obj.sq_IsUseSkill(SKILL_SMBYKK_HANDLINGSWORD);
if (isUse){
obj.sq_IntVectClear();
obj.sq_IntVectPush(0);
obj.sq_AddSetStatePacket(STATE_SMBYKK_HANDLINGSWORD, STATE_PRIORITY_IGNORE_FORCE, true);
return true;
}
return false;
}
function checkCommandEnable_HandlingSword(obj)
{
if (!obj) return false;
return true;
}
function onSetState_HandlingSword(obj, state, datas, isResetTimer)
{
if(!obj) return;
local subState = obj.sq_GetVectorData(datas, 0);
obj.setSkillSubState(subState);
obj.sq_StopMove();
switch(subState){
case 0:
obj.sq_SetCurrentAnimation(ANI_SMBYKK_HANDLINGSWORD_SRART_BODY);
break;
}
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
}
function onEndCurrentAni_HandlingSword(obj)
{
if(!obj) return;
local subState = obj.getSkillSubState();
switch(subState){
case 0:
obj.sq_IntVectClear();
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
break;
}
}
function onProcCon_HandlingSword(obj)
{
if(!obj) return;
}
function onKeyFrameFlag_HandlingSword(obj, flagIndex)
{
if(!obj) return false;
switch(flagIndex){
case 1:
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_SM_HANDLINGSWORD_BUFF)){
CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_SM_HANDLINGSWORD_BUFF);
local size = obj.getVar("handlingsword_mainAtkObj").get_obj_vector_size();
if(size > 0){
for(local i = 0; i < size; i++){
local attackObj = obj.getVar("handlingsword_mainAtkObj").get_obj_vector(i);
if(attackObj) attackObj.setValid(false);
}
}
}
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, SKILL_SMBYKK_HANDLINGSWORD, false, APDPATH_SM_HANDLINGSWORD_BUFF, true);
break;
}
return true;
}
function onTimeEvent_HandlingSword(obj, timeEventIndex, timeEventCount)
{
if(!obj) return false;
}
function onEndState_HandlingSword(obj, new_state)
{
if(!obj) return;
}
function onStart_appendage_handlingsword_buff(appendage)
{
appendage.getVar().setBool(0, false);
appendage.getVar().setBool(1, false);
local parentObj = appendage.getParent();
local obj = sq_GetCNRDObjectToSQRCharacter(parentObj);
local skillLevel = sq_GetSkillLevel(obj, SKILL_SMBYKK_HANDLINGSWORD);
appendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_SMBYKK_HANDLINGSWORD, skillLevel);
local buffTime = sq_GetLevelData(obj, SKILL_SMBYKK_HANDLINGSWORD, 0, skillLevel);
if(buffTime != 0) appendage.sq_SetValidTime(buffTime);
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_HANDLINGSWORD, -1, 4, 1.0);
createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,0,0,0,sq_GetDirection(obj),1,SKILL_SMBYKK_HANDLINGSWORD,1,totalDamage,0,0,0,0,0,0,0);
}
function proc_appendage_handlingsword_buff(appendage)
{
if(!appendage) return;
local parentObj = appendage.getParent();
if(!parentObj || parentObj.getState() == STATE_DIE) {
appendage.setValid(false);
return;
}
if(appendage.getTimer().Get() <= 5000) return;
local obj = sq_GetCNRDObjectToSQRCharacter(parentObj);
if(sq_GetSkill(obj, SKILL_SMBYKK_HANDLINGSWORD).isInCoolTime()) return;
if(appendage.getVar().getBool(0) && appendage.isValid() && appendage.getVar().getBool(1) == false){
appendage.getVar().setBool(0, false);
appendage.getVar().setBool(1, true);
return;
}
}
function proc_appendage_handlingsword_hold(appendage)
{
if(!appendage) return;
local parentObj = appendage.getParent();
if(!parentObj || parentObj.getState() == STATE_DIE) {
appendage.setValid(false);
return;
}
local sourceObj = appendage.getSource();
if(!sourceObj && appendage.getVar().getBool(0) == false){
appendage.getVar().setBool(0, true);
appendage.sq_SetValidTime(1000);
return;
}
}
function onEnd_appendage_handlingsword_buff(appendage)
{
if(!appendage) return;
local parentObj = appendage.getParent();
local obj = sq_GetCNRDObjectToSQRCharacter(parentObj);
if(obj && obj.getState() != STATE_DIE){
local size = obj.getVar("handlingsword_mainAtkObj").get_obj_vector_size();
if(size > 0){
local canShootCount = 0;
for(local i = 0; i < size; i++){
local attackObj = obj.getVar("handlingsword_mainAtkObj").get_obj_vector(i);
if(attackObj){
local colObj = sq_GetCNRDObjectToCollisionObject(attackObj);
colObj.setTimeEvent(255, 1000, 1, true);
}
}
}
if(appendage.getVar().getBool(0) == false && appendage.getVar().getBool(1) == false) createEndHandlingSword_bykk(obj);
}
}
function shootHandlingSword_bykk(obj, group, uniqueId)
{
local state = obj.getState();
local shootCount = 0;
switch(state){
case STATE_ATTACK:
case STATE_DASH_ATTACK:
case STATE_JUMP_ATTACK:
case 22:
case STATE_SMBYKK_RAPIDMOVESLASH:
case STATE_SMBYKK_WEAPONCOMBO:
shootCount = 1;
break;
case STATE_SMBYKK_FLOWMINDONE:
case STATE_SMBYKK_FLOWMINDTWO:
case STATE_SMBYKK_FLOWMINDTHREE:
shootCount = 2;
break;
case STATE_SMBYKK_ILLUSIONSLASH:
case STATE_SMBYKK_SWORDOFMIND:
shootCount = 4;
break;
case STATE_SMBYKK_CHARGEBURST:
shootCount = 5;
break;
}
if(shootCount > 0){
obj.getVar("handlingsword_canShoot").setBool(0, false);
local mainAtkObj = obj.getVar("handlingsword_mainAtkObj").get_obj_vector(0);
if(mainAtkObj){
local colObj = sq_GetCNRDObjectToCollisionObject(mainAtkObj);
local swordCount = colObj.getVar("custom").getInt(1);
if(swordCount > 0){
if(swordCount < shootCount) shootCount = swordCount;
colObj.getVar("custom").setInt(2, group);
colObj.getVar("custom").setInt(3, uniqueId);
if(!colObj.isExistTimeEvent(20)) colObj.setTimeEvent(20, 120, shootCount, false);
}
}
}
}
function createEndHandlingSword_bykk(obj)
{
obj.getVar("setTar_boss").clear_obj_vector();
obj.getVar("setTar_named").clear_obj_vector();
obj.getVar("setTar_normal").clear_obj_vector();
obj.getVar("setTar").clear_obj_vector();
obj.getVar("setTar_Shoot").clear_obj_vector();
local rangeX = 1000, rangeY = 1000;
local objectManager = obj.getObjectManager();//得到對象管理器
for (local i = 0; i < objectManager.getCollisionObjectNumber(); i++){
local object = objectManager.getCollisionObject(i);//得到控制類對象
if (object && object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object) && object.isInDamagableState(obj) && sq_Abs(sq_GetXPos(obj) - sq_GetXPos(object)) <= rangeX && sq_Abs(sq_GetYPos(obj) - sq_GetYPos(object)) <= rangeY){
local activeObj = sq_GetCNRDObjectToActiveObject(object);
if(sq_IsBoss(activeObj)){
obj.getVar("setTar_boss").push_obj_vector(activeObj);
continue;
}
else if(sq_IsNamed(activeObj)){
obj.getVar("setTar_named").push_obj_vector(activeObj);
continue;
}
else{
obj.getVar("setTar_normal").push_obj_vector(activeObj);
continue;
}
}
}
local bossSize = obj.getVar("setTar_boss").get_obj_vector_size();
local namedSize = obj.getVar("setTar_named").get_obj_vector_size();
local normalSize = obj.getVar("setTar_normal").get_obj_vector_size();
if(bossSize > 0){
for(local i = 0; i < bossSize; i++){
local targetObj = obj.getVar("setTar_boss").get_obj_vector(i);
if(targetObj) obj.getVar("setTar").push_obj_vector(targetObj);
}
}
if(namedSize > 0){
for(local i = 0; i < namedSize; i++){
local targetObj = obj.getVar("setTar_named").get_obj_vector(i);
if(targetObj) obj.getVar("setTar").push_obj_vector(targetObj);
}
}
if(normalSize > 0){
for(local i = 0; i < normalSize; i++){
local targetObj = obj.getVar("setTar_normal").get_obj_vector(i);
if(targetObj) obj.getVar("setTar").push_obj_vector(targetObj);
}
}
local sizeTar = obj.getVar("setTar").get_obj_vector_size();
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_HANDLINGSWORD, -1, 5, 1.0);
local totalDamageExp = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_HANDLINGSWORD, -1, 6, 1.0);
if(sizeTar > 0){
local targetObj = obj.getVar("setTar").get_obj_vector(0);
if(targetObj && targetObj.getState() != STATE_DIE){
local group = sq_GetGroup(targetObj);
local uniqueId = sq_GetUniqueId(targetObj);
createSkillPassive_Swordman_bykk(obj,targetObj,PASSIVEOBJ_BYKK_SWORDMAN,0,0,-sq_GetZPos(obj),sq_GetDirection(obj),1,SKILL_SMBYKK_HANDLINGSWORD,4,totalDamage,totalDamageExp,14,group,uniqueId,0,0,0);
}
}
else{
createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,225,0,-sq_GetZPos(obj),sq_GetDirection(obj),1,SKILL_SMBYKK_HANDLINGSWORD,4,totalDamage,totalDamageExp,14,-1,-1,0,0,0);
}
}
//极·神剑术(无形斩)
function checkExecutableSkill_InvisibleSwordCut(obj)
{
if (!obj) return false;
local isUse = obj.sq_IsUseSkill(SKILL_SMBYKK_INVISIBLESWORDCUT);
if (isUse){
obj.sq_IntVectClear();
obj.sq_IntVectPush(0);
obj.sq_AddSetStatePacket(STATE_SMBYKK_INVISIBLESWORDCUT, STATE_PRIORITY_IGNORE_FORCE, true);
return true;
}
return false;
}
function checkCommandEnable_InvisibleSwordCut(obj)
{
if (!obj) return false;
return true;
}
function onSetState_InvisibleSwordCut(obj, state, datas, isResetTimer)
{
if(!obj) return;
local subState = obj.sq_GetVectorData(datas, 0);
obj.setSkillSubState(subState);
obj.sq_StopMove();
switch(subState){
case 0:
obj.sq_SetCurrentAnimation(ANI_SMBYKK_INVISIBLESWORDCUT_BODY);
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
local currentAni = obj.getCurrentAnimation();
local speedRate = 4000 / currentAni.getDelaySum(0, 0);
speedRate = speedRate.tofloat() * 1.2;
currentAni.setSpeedRate(speedRate);
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_INVISIBLESWORDCUT, -1, 0, 1.0);
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_SMBYKK_INVISIBLESWORDCUT));
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/1_swordman_bykk/invisibleswordcut/startfront_18.ani"), 0, 0);
break;
}
}
function onEndCurrentAni_InvisibleSwordCut(obj)
{
if(!obj) return;
local subState = obj.getSkillSubState();
switch(subState){
case 0:
obj.sq_IntVectClear();
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
break;
}
}
function onProcCon_InvisibleSwordCut(obj)
{
if(!obj) return;
}
function onKeyFrameFlag_InvisibleSwordCut(obj, flagIndex)
{
if(!obj) return false;
switch(flagIndex){
case 1006:
obj.sq_PlaySound("INVISIBLE_SWORDCUT");
obj.sq_PlaySound("R_SM_INVISIBLE_SWORDCUT");
break;
case 1007:
sq_flashScreen(obj,0,20,260,127, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
sq_SetMyShake(obj, 10, 180);
break;
case 1008:
//`CreateInvisibleSword`
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_INVISIBLESWORDCUT, -1, 1, 1.0);
local totalDamageExp = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_INVISIBLESWORDCUT, -1, 2, 1.0);
local hitMax = sq_GetIntData(obj, SKILL_SMBYKK_INVISIBLESWORDCUT, 0);
local currentAni = obj.getCurrentAnimation();
local speedRate = 4000 / currentAni.getDelaySum(0, 0);
createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,0,0,0,sq_GetDirection(obj),1,SKILL_SMBYKK_INVISIBLESWORDCUT,1,totalDamage,totalDamageExp,hitMax,speedRate,0,0,0,0);
break;
}
return true;
}
function onTimeEvent_InvisibleSwordCut(obj, timeEventIndex, timeEventCount)
{
if(!obj) return false;
}
function onEndState_InvisibleSwordCut(obj, new_state)
{
if(!obj) return;
}
function onAttack_SwordMaster_byKK(obj, damager, boundingBox, isStuck)
{
//
if(isStuck) return;
if(damager.isObjectType(OBJECTTYPE_ACTIVE) && obj.getVar("handlingsword_canShoot").getBool(0)){
local group = sq_GetGroup(damager);
local uniqueId = sq_GetUniqueId(damager);
shootHandlingSword_bykk(obj, group, uniqueId);
}
}
function setState_weaponMaster_bykk(obj, state, datas, isResetTimer)
{
switch(state){
case 19:
if(obj.getWeaponSubType() == 0 && sq_GetSkillLevel(obj, SKILL_SMBYKK_SHORTSWORDMASTERY) >= 5){
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_SHORTSWORDMASTERY, -1, 4, 1.0);
local skillLevel = sq_GetSkillLevel(obj, SKILL_SMBYKK_SHORTSWORDMASTERY);
local proc = sq_GetLevelData(obj, SKILL_SMBYKK_SHORTSWORDMASTERY, 5, skillLevel);
local time = sq_GetLevelData(obj, SKILL_SMBYKK_SHORTSWORDMASTERY, 7, skillLevel);
local level = sq_GetSkillLevel(obj, 174) + 5;
createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,0,0,0,sq_GetDirection(obj),1,SKILL_SMBYKK_SHORTSWORDMASTERY,1,totalDamage,proc,time,level,0,0,0,0);
sq_AddDrawOnlyAniFromParent(obj, "passiveobject/0_swordman_bykk/1weaponmaster/animation/guardwavedust.ani", 75, 0, 0);
}
else if(obj.getWeaponSubType() == 3 && sq_GetSkillLevel(obj, SKILL_SMBYKK_HEAVYSWORDMASTERY) >= 5){
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_HEAVYSWORDMASTERY, -1, 3, 1.0);
local skillLevel = sq_GetSkillLevel(obj, SKILL_SMBYKK_HEAVYSWORDMASTERY);
local proc = sq_GetLevelData(obj, SKILL_SMBYKK_HEAVYSWORDMASTERY, 4, skillLevel);
local time = sq_GetLevelData(obj, SKILL_SMBYKK_HEAVYSWORDMASTERY, 6, skillLevel);
local level = sq_GetSkillLevel(obj, 174) + 5;
createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,0,0,0,sq_GetDirection(obj),1,SKILL_SMBYKK_SHORTSWORDMASTERY,1,totalDamage,proc,time,level,0,0,0,0);
sq_AddDrawOnlyAniFromParent(obj, "passiveobject/0_swordman_bykk/1weaponmaster/animation/guardwavedust.ani", 75, 0, 0);
}
break;
}
}
///////刺伤
function proc_appendage_puncture_bykk(appendage)
{
local parentObj = sq_GetCNRDObjectToActiveObject(appendage.getParent());
local sourceObj = appendage.getSource();
if(!parentObj || parentObj.getState() == STATE_DIE || !sourceObj || sourceObj.getState() == STATE_DIE){
appendage.setValid(false);
return;
}
local obj = sq_GetCNRDObjectToSQRCharacter(sourceObj);
if(appendage.getVar("bool").getBool(0)){
local timer = appendage.getVar().get_ct_vector(0);
if(!timer){
appendage.getVar().clear_ct_vector();
appendage.getVar().push_ct_vector();
timer = appendage.getVar().get_ct_vector(0);
timer.Reset();
timer.Start(10000,0);
}
local currentT = timer.Get();
if(currentT >= appendage.getVar("custom").getInt(2)){
local totalDamageMin = appendage.getVar("custom").getInt(0);
local totalDamageMax = appendage.getVar("custom").getInt(1);
local count = appendage.getVar("punctureCount").getInt(0);
if(count > 17) count = 17;
local totalDamage = totalDamageMin;
if(count > 3) totalDamage = totalDamage + ((totalDamageMax - totalDamageMin).tofloat() * (count.tofloat() / 17.0)).tointeger();
local group = sq_GetGroup(parentObj);
local uniqueId = sq_GetUniqueId(parentObj);
local sizeRate = 100 + (100.0 * (count.tofloat() / 17.0)).tointeger();
createSkillPassive_Swordman_bykk(obj,parentObj,PASSIVEOBJ_BYKK_SWORDMAN,0,0,sq_GetHeightObject(parentObj) / 2,sq_GetDirection(obj),1,SKILL_SMBYKK_BLADEMASTERY,2,totalDamage,group,uniqueId,sizeRate,0,0,0,0);
appendage.getVar("punctureCount").setInt(0, 0);
appendage.getVar("bool").setBool(0, false);
appendage.getVar().clear_ct_vector();
return;
}
}
local t = appendage.getVar("setCoolTime").get_timer_vector(0);
local currentT = appendage.getTimer().Get();
if(t && t.isOnEvent(currentT) && appendage.getVar("punctureCount").getInt(0) >= 3){
local totalDamageMin = appendage.getVar("custom").getInt(0);
local totalDamageMax = appendage.getVar("custom").getInt(1);
local count = appendage.getVar("punctureCount").getInt(0);
local totalDamage = totalDamageMin;
if(count > 3)totalDamage = totalDamage + ((totalDamageMax - totalDamageMin).tofloat() * (count.tofloat() / 17.0)).tointeger();
totalDamage = totalDamage * appendage.getVar("custom").getInt(3) / 100;
local group = sq_GetGroup(parentObj);
local uniqueId = sq_GetUniqueId(parentObj);
createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,0,0,0,sq_GetDirection(obj),1,SKILL_SMBYKK_BLADEMASTERY,1,totalDamage,group,uniqueId,0,0,0,0,0);
}
}
function onStart_appendage_puncture_bykk(appendage)
{
if(!appendage) return;
}
function onEnd_appendage_puncture_bykk(appendage)
{
if(!appendage) return;
}
function onStart_appendage_smblademastery(appendage)
{
local obj = sq_GetCNRDObjectToSQRCharacter(appendage.getParent());
if(!obj || obj.getState() == STATE_DIE) return;
local weaponSubType = obj.getWeaponSubType();
if(weaponSubType == 1) appendage.getVar("bool").setBool(0, true);
else appendage.getVar("bool").setBool(0, false);
}
function onAttackParent_appendage_smblademastery(appendage, realAttacker, damager, boundingBox, isStuck)
{
if(!appendage) return;
if(appendage.getVar("bool").getBool(0) == false) return;
if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return;
if(damager.getState() == STATE_DIE) return;
if(realAttacker.isObjectType(OBJECTTYPE_CHARACTER)){
local obj = sq_GetCNRDObjectToSQRCharacter(realAttacker);
local skillLevel = sq_GetSkillLevel(obj, SKILL_SMBYKK_BLADEMASTERY);
local proc = sq_GetLevelData(obj, SKILL_SMBYKK_BLADEMASTERY, 14, skillLevel) + 100;
local time = sq_GetLevelData(obj, SKILL_SMBYKK_BLADEMASTERY, 18, skillLevel) + 5;
local number = 1, isExplosion = 0, state = obj.getState();
switch(state){
case STATE_SMBYKK_CHARGEBURST:
local skill_level = sq_GetSkillLevel(obj, SKILL_SMBYKK_CHARGEBURST);
proc = proc + sq_GetLevelData(obj, SKILL_SMBYKK_CHARGEBURST, 8, skill_level);
number = number + sq_GetLevelData(obj, SKILL_SMBYKK_CHARGEBURST, 9, skill_level);
if(skillLevel >= 10 && obj.getVar("blademastery_canExp").getBool(0)){
obj.getVar("blademastery_canExp").setBool(0, false);
isExplosion = 1;
}
break;
case STATE_SMBYKK_CHARGECRASH:
local skill_level = sq_GetSkillLevel(obj, SKILL_SMBYKK_CHARGECRASH);
proc = proc + sq_GetLevelData(obj, SKILL_SMBYKK_CHARGECRASH, 2, skill_level) / 10;
number = number + sq_GetLevelData(obj, SKILL_SMBYKK_CHARGECRASH, 3, skill_level);
break;
case STATE_SMBYKK_FLOWMINDONE:
local skill_level = sq_GetSkillLevel(obj, SKILL_SMBYKK_FLOWMINDONE);
proc = proc + sq_GetLevelData(obj, SKILL_SMBYKK_FLOWMINDONE, 3, skill_level);
number = number + sq_GetLevelData(obj, SKILL_SMBYKK_FLOWMINDONE, 4, skill_level);
if(skillLevel >= 10 && obj.getVar("blademastery_canExp").getBool(0)){
obj.getVar("blademastery_canExp").setBool(0, false);
isExplosion = 1;
}
break;
case STATE_SMBYKK_FLOWMINDTWO:
local skill_level = sq_GetSkillLevel(obj, SKILL_SMBYKK_FLOWMINDTWO);
proc = proc + sq_GetLevelData(obj, SKILL_SMBYKK_FLOWMINDTWO, 8, skill_level);
number = number + sq_GetLevelData(obj, SKILL_SMBYKK_FLOWMINDTWO, 9, skill_level);
if(skillLevel >= 10 && obj.getVar("blademastery_canExp").getBool(0)){
obj.getVar("blademastery_canExp").setBool(0, false);
isExplosion = 1;
}
break;
case STATE_SMBYKK_FLOWMINDTHREE:
local skill_level = sq_GetSkillLevel(obj, SKILL_SMBYKK_FLOWMINDTHREE);
proc = proc + sq_GetLevelData(obj, SKILL_SMBYKK_FLOWMINDTHREE, 1, skill_level);
number = number + sq_GetLevelData(obj, SKILL_SMBYKK_FLOWMINDTHREE, 2, skill_level);
if(skillLevel >= 10 && obj.getVar("blademastery_canExp").getBool(0)){
obj.getVar("blademastery_canExp").setBool(0, false);
isExplosion = 1;
}
break;
case STATE_SMBYKK_FLOWMINDTHREE:
local skill_level = sq_GetSkillLevel(obj, SKILL_SMBYKK_FLOWMINDTHREE);
proc = proc + sq_GetLevelData(obj, SKILL_SMBYKK_FLOWMINDTHREE, 1, skill_level);
number = number + sq_GetLevelData(obj, SKILL_SMBYKK_FLOWMINDTHREE, 2, skill_level);
if(skillLevel >= 10 && obj.getVar("blademastery_canExp").getBool(0)){
obj.getVar("blademastery_canExp").setBool(0, false);
isExplosion = 1;
}
break;
}
puncture_bykk(obj, damager, boundingBox, isStuck, proc, number, time, isExplosion);
}
else if(realAttacker.isObjectType(OBJECTTYPE_PASSIVE)){
local colObj = sq_GetCNRDObjectToCollisionObject(realAttacker);
local obj = sq_GetCNRDObjectToSQRCharacter(appendage.getParent());
if(colObj.getCollisionObjectIndex() != PASSIVEOBJ_BYKK_SWORDMAN) return;
local skillLevel = sq_GetSkillLevel(obj, SKILL_SMBYKK_BLADEMASTERY);
local proc = sq_GetLevelData(obj, SKILL_SMBYKK_BLADEMASTERY, 14, skillLevel) + 100;
local time = sq_GetLevelData(obj, SKILL_SMBYKK_BLADEMASTERY, 18, skillLevel) + 5;
local number = 1, isExplosion = 0;
local skillIndex = colObj.getVar("skillIndex").getInt(0), subtype = colObj.getVar("subtype").getInt(0);
switch(skillIndex){
case SKILL_SMBYKK_METEORSWORD:
switch(subtype){
case 4:
case 6:
case 7:
local skill_level = sq_GetSkillLevel(obj, SKILL_SMBYKK_METEORSWORD);
proc = proc + sq_GetLevelData(obj, SKILL_SMBYKK_METEORSWORD, 7, skill_level);
number = number + sq_GetLevelData(obj, SKILL_SMBYKK_METEORSWORD, 8, skill_level);
break;
case 15:
local skill_level = sq_GetSkillLevel(obj, SKILL_SMBYKK_STATEOFLIMIT);
proc = proc + sq_GetLevelData(obj, SKILL_SMBYKK_STATEOFLIMIT, 27, skill_level);
number = number + sq_GetLevelData(obj, SKILL_SMBYKK_STATEOFLIMIT, 28, skill_level);
break;
}
break;
case SKILL_SMBYKK_ILLUSIONSLASH:
local skill_level = sq_GetSkillLevel(obj, SKILL_SMBYKK_ILLUSIONSLASH);
proc = proc + sq_GetLevelData(obj, SKILL_SMBYKK_ILLUSIONSLASH, 4, skill_level);
number = number + sq_GetLevelData(obj, SKILL_SMBYKK_ILLUSIONSLASH, 5, skill_level);
if(skillLevel >= 10 && obj.getVar("blademastery_canExp").getBool(0)){
obj.getVar("blademastery_canExp").setBool(0, false);
isExplosion = 1;
}
break;
case SKILL_SMBYKK_MOMENTARYSLASH:
local sub = colObj.getVar("custom").getInt(4);
switch(sub){
case 0:
local skill_level = sq_GetSkillLevel(obj, SKILL_SMBYKK_MOMENTARYSLASH);
proc = proc + sq_GetLevelData(obj, SKILL_SMBYKK_MOMENTARYSLASH, 1, skill_level);
number = number + sq_GetLevelData(obj, SKILL_SMBYKK_MOMENTARYSLASH, 2, skill_level);
break;
case 1:
local skill_level = sq_GetSkillLevel(obj, SKILL_SMBYKK_MOMENTARYSLASH);
proc = proc + sq_GetLevelData(obj, SKILL_SMBYKK_MOMENTARYSLASH, 4, skill_level);
number = number + sq_GetLevelData(obj, SKILL_SMBYKK_MOMENTARYSLASH, 5, skill_level);
break;
}
if(skillLevel >= 10 && obj.getVar("blademastery_canExp").getBool(0)){
obj.getVar("blademastery_canExp").setBool(0, false);
isExplosion = 1;
}
break;
case SKILL_SMBYKK_BLADEMASTERY:
case SKILL_SMBYKK_MYSTICEQUIP:
return;
break;
}
puncture_bykk(obj, damager, boundingBox, isStuck, proc, number, time, isExplosion);
}
}
function puncture_bykk(obj, damager, boundingBox, isStuck, proc, number, time, isExplosion)
{
if(!obj) return;//APDPATH_SM_PUNCTURE
if(sq_getRandom(1, 100) < 100 - proc) return;
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(damager, APDPATH_SM_PUNCTURE);
if(!addAppendage){
addAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, APDPATH_SM_PUNCTURE, true);
local totalDamageMin = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_BLADEMASTERY, -1, 15, 1.0);
local totalDamageMax = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_BLADEMASTERY, -1, 16, 1.0);
local hitRate = sq_GetLevelData(obj, SKILL_SMBYKK_BLADEMASTERY, 17, sq_GetSkillLevel(obj, SKILL_SMBYKK_BLADEMASTERY));
local hitTime = sq_GetIntData(obj, SKILL_SMBYKK_BLADEMASTERY, 14);
addAppendage.getVar("punctureCount").setInt(0, number);
addAppendage.getVar("custom").setInt(0, totalDamageMin);
addAppendage.getVar("custom").setInt(1, totalDamageMax);
addAppendage.getVar("custom").setInt(2, time);
addAppendage.getVar("custom").setInt(3, hitRate);
addAppendage.getVar("setCoolTime").clear_timer_vector();
addAppendage.getVar("setCoolTime").push_timer_vector();
local t = addAppendage.getVar("setCoolTime").get_timer_vector(0);
t.setParameter(hitTime, -1);
t.resetInstant(0);
print("setAppendage");
}
else{
addAppendage.getVar("punctureCount").setInt(0, addAppendage.getVar("punctureCount").getInt(0) + number);
local count = addAppendage.getVar("punctureCount").getInt(0);
print("count = "+count);
if(addAppendage.getVar("bool").getBool(0) == false && count >= 3){
addAppendage.getVar("bool").setBool(0, true);
}
if(count >= 17 || isExplosion == 1){
local totalDamageMin = addAppendage.getVar("custom").getInt(0);
local totalDamageMax = addAppendage.getVar("custom").getInt(1);
local count = addAppendage.getVar("punctureCount").getInt(0);
if(count > 17) count = 17;
local totalDamage = totalDamageMin;
if(count > 3) totalDamage = totalDamage + ((totalDamageMax - totalDamageMin).tofloat() * (count.tofloat() / 17.0)).tointeger();
local group = sq_GetGroup(damager);
local uniqueId = sq_GetUniqueId(damager);
local sizeRate = 100 + (100.0 * (count.tofloat() / 17.0)).tointeger();
createSkillPassive_Swordman_bykk(obj,damager,PASSIVEOBJ_BYKK_SWORDMAN,0,0,sq_GetHeightObject(damager) / 2,sq_GetDirection(obj),1,SKILL_SMBYKK_BLADEMASTERY,2,totalDamage,group,uniqueId,sizeRate,0,0,0,0);
addAppendage.getVar("punctureCount").setInt(0, 0);
addAppendage.getVar("bool").setBool(0, false);
addAppendage.getVar().clear_ct_vector();
}
}
}
///////////////被动
function onStart_appendage_smequiplightsword(appendage)
{
local obj = sq_GetCNRDObjectToSQRCharacter(appendage.getParent());
if(!obj || obj.getState() == STATE_DIE) return;
local weaponSubType = obj.getWeaponSubType();
if(weaponSubType != 5) return;
local skillLevel = sq_GetSkillLevel(obj, SKILL_SMBYKK_EQUIPLIGHTSWORD);
if(sq_GetSkill(obj, SKILL_SMBYKK_EQUIPLIGHTSWORD) && skillLevel > 0){
local coolTime = sq_GetLevelData(obj, SKILL_SMBYKK_EQUIPLIGHTSWORD, 0, skillLevel);
local attackSpeed = sq_GetLevelData(obj, SKILL_SMBYKK_EQUIPLIGHTSWORD, 1, skillLevel);
local change_appendage = appendage.sq_getChangeStatus("smequiplightsword");
if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("smequiplightsword",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000);
if(change_appendage){
change_appendage.clearParameter();
change_appendage.addParameter(CHANGE_STATUS_TYPE_ATTACK_SPEED, false, (attackSpeed).tofloat());
change_appendage.addParameter(CHANGE_STATUS_TYPE_COOLTIME_DECLINE, true, (coolTime * -1).tofloat());
}
}
}
function onStart_appendage_smmysticequip(appendage)
{
if(sq_GetCurrentModuleType() != 3) return;
local obj = sq_GetCNRDObjectToSQRCharacter(appendage.getParent());
if(!obj || obj.getState() == STATE_DIE) return;
local weaponSubType = obj.getWeaponSubType();
if(weaponSubType == -1) return;
if(weaponSubType == obj.getVar("weaponSubTypeSave").getInt(0)){
obj.getVar("weaponSubTypeSave").setInt(0, weaponSubType);
return;
}
obj.getVar("weaponSubTypeSave").setInt(0, weaponSubType);
local apdPath = "character/swordman/1weaponmaster_bykk/ap_smmysticequip_buff.nut";
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath)) CNSquirrelAppendage.sq_RemoveAppendage(obj, apdPath);
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, apdPath, true);
AddAppendage.getVar("custom").setInt(0, 1);
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_MYSTICEQUIP, -1, 1, 1.0);
local sub = 0;
if(sq_GetZPos(obj) > 0) sub = 1;
createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,0,1,0,sq_GetDirection(obj),1,SKILL_SMBYKK_MYSTICEQUIP,1,totalDamage,sub,0,0,0,0,0,0);
}
function onStart_appendage_smfastequip(appendage)
{
if(sq_GetCurrentModuleType() != 3) return;
local obj = sq_GetCNRDObjectToSQRCharacter(appendage.getParent());
if(!obj || obj.getState() == STATE_DIE) return;
local weaponSubType = obj.getWeaponSubType();
if(weaponSubType == -1) return;
if(weaponSubType == obj.getVar("weaponSubTypeSave").getInt(0)){
obj.getVar("weaponSubTypeSave").setInt(0, weaponSubType);
return;
}
obj.getVar("weaponSubTypeSave").setInt(0, weaponSubType);
local apdPath = "character/swordman/1weaponmaster_bykk/ap_smmysticequip_buff.nut";
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath)) CNSquirrelAppendage.sq_RemoveAppendage(obj, apdPath);
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, apdPath, true);
AddAppendage.getVar("custom").setInt(0, 0);
local buffTime = sq_GetIntData(obj, SKILL_SMBYKK_FASTEQUIP, 2);
if(sq_GetSkillLevel(obj, SKILL_SMBYKK_MYSTICEQUIP) > 0){
buffTime = sq_GetIntData(obj, SKILL_SMBYKK_MYSTICEQUIP, 2);
AddAppendage.getVar("custom").setInt(0, 1);
}
if(buffTime != 0) AddAppendage.sq_SetValidTime(buffTime);
local skillLevel = sq_GetSkillLevel(obj, SKILL_SMBYKK_FASTEQUIP);
local moveSpeed = 0;
local attackSpeed = 0;
local criticalRate = sq_GetLevelData(obj, SKILL_SMBYKK_FASTEQUIP, 3, skillLevel);
local addAttack = sq_GetLevelData(obj, SKILL_SMBYKK_FASTEQUIP, 4, skillLevel);
if(AddAppendage.getVar("custom").getInt(0) > 0){
moveSpeed = sq_GetLevelData(obj, SKILL_SMBYKK_MYSTICEQUIP, 3, skillLevel);
attackSpeed = sq_GetLevelData(obj, SKILL_SMBYKK_MYSTICEQUIP, 2, skillLevel);
AddAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_SMBYKK_MYSTICEQUIP, skillLevel);
}
else{
skillLevel = sq_GetSkillLevel(obj, SKILL_SMBYKK_FASTEQUIP);
AddAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_SMBYKK_FASTEQUIP, skillLevel);
}
CNSquirrelAppendage.sq_Append(AddAppendage, obj, obj, true);
print("moveSpeed = "+moveSpeed);
print("attackSpeed = "+attackSpeed);
print("criticalRate = "+criticalRate);
print("addAttack = "+addAttack);
local change_appendage = AddAppendage.sq_getChangeStatus("smfastequip");
if(!change_appendage) change_appendage = AddAppendage.sq_AddChangeStatus("smfastequip",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000);
if(change_appendage){
change_appendage.clearParameter();
change_appendage.addParameter(CHANGE_STATUS_TYPE_PHYSICAL_CRITICAL_HIT_RATE , false, criticalRate.tofloat() * 0.1);
change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_ATTACK, true, addAttack.tofloat() * 0.1);
if(moveSpeed > 0){
change_appendage.addParameter(CHANGE_STATUS_TYPE_ATTACK_SPEED, false, (attackSpeed).tofloat());
change_appendage.addParameter(CHANGE_STATUS_TYPE_MOVE_SPEED, false, (moveSpeed).tofloat());
}
}
if(sq_GetSkillLevel(obj, SKILL_SMBYKK_MYSTICEQUIP) > 0){
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_SMBYKK_MYSTICEQUIP, -1, 1, 1.0);
local sub = 0;
if(sq_GetZPos(obj) > 0) sub = 1;
createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,0,1,0,sq_GetDirection(obj),1,SKILL_SMBYKK_MYSTICEQUIP,1,totalDamage,sub,0,0,0,0,0,0);
}
}
function onStart_appendage_smmysticequip_buff(appendage)
{
//
}
function ProcPassiveSkill_WeaponMaster_Swordman(obj, skill_index, skill_level)
{
switch(skill_index){
case SKILL_SMBYKK_BLADEMASTERY:
if(skill_level > 0){
local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, "character/swordman/1weaponmaster_bykk/passiveskill_ap/ap_smblademastery.nut", true);
}
break;
case SKILL_SMBYKK_EQUIPLIGHTSWORD:
if(skill_level > 0){
local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, "character/swordman/1weaponmaster_bykk/passiveskill_ap/ap_smequiplightsword.nut", true);
}
break;
// case SKILL_SMBYKK_MYSTICEQUIP:
// if(skill_level > 0){
// local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, "character/swordman/1weaponmaster_bykk/passiveskill_ap/ap_smmysticequip.nut", true);
// }
// break;
case SKILL_SMBYKK_FASTEQUIP:
if(skill_level > 0){
local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, "character/swordman/1weaponmaster_bykk/passiveskill_ap/ap_smfastequip.nut", true);
}
break;
}
}
function setWeaponMasterBuff_bykk(obj)
{
local apdPath = "character/swordman/1weaponmaster_bykk/ap_smoverdrive.nut";
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath)) CNSquirrelAppendage.sq_RemoveAppendage(obj, apdPath);
local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, apdPath, false);
local skillLevel = sq_GetSkillLevel(obj, SKILL_SMBYKK_OVERDRIVE);
local bufftmime = sq_GetLevelData(obj, SKILL_SMBYKK_OVERDRIVE, 0, skillLevel);
if(bufftmime > 0) appendage.sq_SetValidTime(bufftmime);
appendage.setEnableIsBuff(true);
appendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_SMBYKK_OVERDRIVE, skillLevel);
CNSquirrelAppendage.sq_Append(appendage, obj, obj, true);
// appendage.setBuffIconImage(7);
setSkillBonusBate_Swordman_1WeaponMaster_bykk(obj);
}
function onStartDungeon_Swordman_1Swordmaster(obj)
{
local weaponSubType = obj.getWeaponSubType();
obj.getVar("weaponSubTypeSave").setInt(0, weaponSubType);
setSkillBonusBate_Swordman_1WeaponMaster_bykk(obj);
}
function onStartMap_1Swordmaster_bykk(obj)
{
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, APDPATH_SM_HANDLINGSWORD_BUFF);
if(addAppendage && addAppendage.isValid() && addAppendage.getVar().getBool(0) == false){
local mainAtkObj = obj.getVar("handlingsword_mainAtkObj").get_obj_vector(0);
if(mainAtkObj){
local colObj = sq_GetCNRDObjectToCollisionObject(mainAtkObj);
local swordCount = colObj.getVar("custom").getInt(1);
if(swordCount < 5) colObj.getVar("custom").setInt(1, 5);
colObj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, "");
}
}
}
function procAppend_Swordman_1WeaponMaster(obj)
{
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, APDPATH_SM_HANDLINGSWORD_BUFF);
if(addAppendage && addAppendage.isValid() && addAppendage.getVar().getBool(0) == false){
obj.setSkillCommandEnable(SKILL_SMBYKK_HANDLINGSWORD, true);
if(obj.sq_IsEnterSkill(SKILL_SMBYKK_HANDLINGSWORD) != -1){
if(!sq_GetSkill(obj, SKILL_SMBYKK_HANDLINGSWORD).isInCoolTime()){
if(addAppendage.getVar().getBool(1)){
obj.sq_IntVectClear();
obj.sq_IntVectPush(0);
obj.sq_AddSetStatePacket(STATE_SMBYKK_HANDLINGSWORD, STATE_PRIORITY_IGNORE_FORCE, true);
return;
}
obj.startSkillCoolTime(SKILL_SMBYKK_HANDLINGSWORD, sq_GetSkillLevel(obj, SKILL_SMBYKK_HANDLINGSWORD), -1);
}
addAppendage.getVar().setBool(0, true);
createEndHandlingSword_bykk(obj);
}
}
}
function setSkillBonusBate_Swordman_1WeaponMaster_bykk(obj)
{
local bonusRate = 1000;
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/swordman/1weaponmaster_bykk/ap_smoverdrive.nut")) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_SMBYKK_OVERDRIVE, 4, sq_GetSkillLevel(obj, SKILL_SMBYKK_OVERDRIVE))) / 1000;
print("bonusRate1 = "+bonusRate);
if(sq_GetSkillLevel(obj, 91) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, 91, 1, sq_GetSkillLevel(obj, 91))) / 1000;
print("bonusRate2 = "+bonusRate);
if(sq_GetSkillLevel(obj, SKILL_SMBYKK_FARTHERHIT) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_SMBYKK_FARTHERHIT, 0, sq_GetSkillLevel(obj, SKILL_SMBYKK_FARTHERHIT))) / 1000;
print("bonusRate3 = "+bonusRate);
if(sq_GetSkillLevel(obj, SKILL_SMBYKK_STATEOFINVISIBLESWORD) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_SMBYKK_STATEOFINVISIBLESWORD, 0, sq_GetSkillLevel(obj, SKILL_SMBYKK_STATEOFINVISIBLESWORD))) / 1000;
print("bonusRate4 = "+bonusRate);
obj.getVar("setSkillBonusRate").setInt(0, bonusRate.tointeger());
//sq_SetSkillAttackBonus(obj, bonusRate);
}
//剑魂结束
SKILL_BYKK_FORCEOFTHUNDERER <- 251
function setforceholdAppendage_bykk(passiveobj, damager, bounding_box, is_stuck)
{
if(!passiveobj) return;
local ID = passiveobj.getPassiveObjectIndex();
print("ID = "+ID);
switch(ID){
case 20101:
local sqrChr = sq_GetCNRDObjectToSQRCharacter(passiveobj.getTopCharacter());
if(sqrChr){
local skillLevel = sq_GetSkillLevel(sqrChr, SKILL_BYKK_FORCEOFTHUNDERER);
if(skillLevel > 0){
if(!CNSquirrelAppendage.sq_IsAppendAppendage(damager, "appendage/character/ap_common_hold.nut")){
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, passiveobj, -1, false, "appendage/character/ap_common_hold.nut", true);
sq_HoldAndDelayDie(damager, passiveobj, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL , AddAppendage);
}
}
}
break;
case 20108:
case 24357:
local sqrChr = sq_GetCNRDObjectToSQRCharacter(passiveobj.getTopCharacter());
if(sqrChr){
local skillLevel = sq_GetSkillLevel(sqrChr, SKILL_BYKK_FORCEOFTHUNDERER);
if(skillLevel > 0){
if(!CNSquirrelAppendage.sq_IsAppendAppendage(damager, "appendage/character/ap_common_hold2.nut")){
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, passiveobj, -1, false, "appendage/character/ap_common_hold2.nut", true);
sq_HoldAndDelayDie(damager, passiveobj, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL , AddAppendage);
}
}
}
break;
case 20132:
case 21192:
if(CNSquirrelAppendage.sq_IsAppendAppendage(damager, "appendage/character/ap_common_hold2.nut")){
CNSquirrelAppendage.sq_RemoveAppendage(damager, "appendage/character/ap_common_hold2.nut");
}
break;
}
}
function proc_appendage_common_hold(appendage)
{
if(!appendage) return;
local sourceObj = appendage.getSource();
if(!sourceObj){
appendage.setValid(false);
return;
}
}
function proc_appendage_common_hold2(appendage)
{
if(!appendage) return;
}
//////剑影
//无式·极影剑
function checkExecutableSkill_UnlimitedSpeedSlashBvs(obj)
{
if (!obj) return false;
local isUse = obj.sq_IsUseSkill(231);
if (isUse){
obj.sq_IntVectClear();
local state = obj.getState();
switch(state){
case 0:
case 14:
obj.sq_IntVectPush(0);//共鸣系列
break;
case STATE_SPIRITMOVE:
obj.sq_IntVectPush(1);//剑术系列
break;
default:
obj.sq_IntVectPush(2);//幻鬼系列
break;
}
obj.sq_AddSetStatePacket(231, STATE_PRIORITY_IGNORE_FORCE, true);
return true;
}
return false;
}
function checkCommandEnable_UnlimitedSpeedSlashBvs(obj)
{
if (!obj) return false;
return false;
}
function onSetState_UnlimitedSpeedSlashBvs(obj, state, datas, isResetTimer)
{
if(!obj) return;
local subState = obj.sq_GetVectorData(datas, 0);
obj.setSkillSubState(subState);
obj.sq_StopMove();
switch(subState){
case 0://共鸣系列
obj.sq_SetCurrentAnimation(345);
obj.sq_PlaySound("R_SM_UNLIMITEDSPEEDSLASH_BS");
break;
case 1://剑术系列
obj.sq_SetCurrentAnimation(346);
obj.sq_PlaySound("R_SM_UNLIMITEDSPEEDSLASH_BS");
break;
case 2://幻鬼系列
obj.sq_SetCurrentAnimation(344);
obj.sq_PlaySound("R_SM_UNLIMITEDSPEEDSLASH_BS");
local totalDamage = obj.sq_GetBonusRateWithPassive(231, -1, 4, 1.0);
local totalDamageFinish = obj.sq_GetBonusRateWithPassive(231, -1, 5, 1.0);
local VSObject = getVSObject(obj);
if(VSObject){
createSkillPassive_Swordman_bykk(obj,VSObject,PASSIVEOBJ_BYKK_SWORDMAN,0,0,0,sq_GetDirection(obj),5,231,4,totalDamage,totalDamageFinish,0,0,0,0,0,0);
local colObj = sq_GetCNRDObjectToCollisionObject(VSObject);
if(colObj.getVar("set").getInt(0) > 0) colObj.setTimeEvent(10, 1000, 1, true);
else sq_SendDestroyPacketPassiveObject(VSObject);
}
else createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,0,-1,0,sq_GetDirection(obj),5,231,4,totalDamage,totalDamageFinish,0,0,0,0,0,0);
break;
case 3:
obj.sq_SetCurrentAnimation(347);
break;
}
}
function onEndCurrentAni_UnlimitedSpeedSlashBvs(obj)
{
if(!obj) return;
local subState = obj.getSkillSubState();
switch(subState){
case 0:
obj.sq_IntVectClear();
obj.sq_IntVectPush(3);
obj.sq_AddSetStatePacket(231, STATE_PRIORITY_AUTO, true);
break;
case 1:
case 2:
case 3:
obj.sq_IntVectClear();
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
break;
}
}
function onKeyFrameFlag_UnlimitedSpeedSlashBvs(obj, flagIndex)
{
if(!obj) return false;
switch(flagIndex){
case 106://`slash1` 58 0 16
local totalDamage = obj.sq_GetBonusRateWithPassive(231, -1, 0, 1.0);
createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,0,0,0,sq_GetDirection(obj),5,231,1,totalDamage,1,0,0,0,0,0,0);
local totalDamage = obj.sq_GetBonusRateWithPassive(231, -1, 1, 1.0);
local VSObject = getVSObject(obj);
if(VSObject){
createSkillPassive_Swordman_bykk(obj,VSObject,PASSIVEOBJ_BYKK_SWORDMAN,0,0,0,sq_GetDirection(obj),5,231,2,totalDamage,1,0,0,0,0,0,0);
local colObj = sq_GetCNRDObjectToCollisionObject(VSObject);
if(sq_GetDirection(obj) == ENUM_DIRECTION_RIGHT) obj.getVar("UnlimitedSpeedSlashBvsSet").setInt(0, sq_GetXPos(colObj) - sq_GetXPos(obj));
else obj.getVar("UnlimitedSpeedSlashBvsSet").setInt(0, sq_GetXPos(obj) - sq_GetXPos(colObj));
obj.getVar("UnlimitedSpeedSlashBvsSet").setInt(1, sq_GetYPos(colObj) - sq_GetYPos(obj));
if(colObj.getVar("set").getInt(0) > 0) colObj.setTimeEvent(10, 1000, 1, true);
else sq_SendDestroyPacketPassiveObject(VSObject);
}
else{
obj.getVar("UnlimitedSpeedSlashBvsSet").setInt(0, 0);
obj.getVar("UnlimitedSpeedSlashBvsSet").setInt(1, -1);
createSkillPassive_Swordman_bykk(obj,VSObject,PASSIVEOBJ_BYKK_SWORDMAN,0,-1,0,sq_GetDirection(obj),5,231,2,totalDamage,1,0,0,0,0,0,0);
}
break;
case 110://`slash2` 64 0 49
local totalDamage = obj.sq_GetBonusRateWithPassive(231, -1, 0, 1.0);
createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,0,0,0,sq_GetDirection(obj),5,231,1,totalDamage,2,0,0,0,0,0,0);
break;
case 114://`slash3` 100 0 24
local totalDamage = obj.sq_GetBonusRateWithPassive(231, -1, 0, 1.0);
createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,0,0,0,sq_GetDirection(obj),5,231,1,totalDamage,3,0,0,0,0,0,0);
break;
case 118://`slash4` 66 0 88
local totalDamage = obj.sq_GetBonusRateWithPassive(231, -1, 0, 1.0);
createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,0,0,0,sq_GetDirection(obj),5,231,1,totalDamage,4,0,0,0,0,0,0);
break;
case 121://`slash5` 62 0 13
local totalDamage = obj.sq_GetBonusRateWithPassive(231, -1, 0, 1.0);
createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,0,0,0,sq_GetDirection(obj),5,231,1,totalDamage,5,0,0,0,0,0,0);
break;
case 201://`start move`
local speed = 2000.0;
if(sq_GetDirection(obj) == ENUM_DIRECTION_RIGHT) sq_SetVelocity(obj, 0, speed);
else sq_SetVelocity(obj, 0, -speed);
break;
case 202:
sq_SetMyShake(obj, 10, 80);
break;
case 203:
sq_flashScreen(obj,0,0,360,178, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
break;
case 204:
sq_SetVelocity(obj, 0, 0.0);
local totalDamage = obj.sq_GetBonusRateWithPassive(231, -1, 2, 1.0) + obj.sq_GetBonusRateWithPassive(231, -1, 3, 1.0) + 100;
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 191));
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
break;
case 304:
break;
case 306:
local totalDamage = obj.sq_GetBonusRateWithPassive(231, -1, 2, 1.0);
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 191));
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
sq_flashScreen(obj,0,0,360,178, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
sq_SetMyShake(obj, 12, 240);
sq_AddDrawOnlyAniFromParent(obj, "character/swordman/effect/animation/ultimatespeedslashbvs/ultimatespeedslashfinishbs_29.ani", 280, 0, 55);
local totalDamage = obj.sq_GetBonusRateWithPassive(231, -1, 3, 1.0);
createSkillPassive_Swordman_bykk(obj,obj,PASSIVEOBJ_BYKK_SWORDMAN,obj.getVar("UnlimitedSpeedSlashBvsSet").getInt(0),obj.getVar("UnlimitedSpeedSlashBvsSet").getInt(1),0,sq_GetDirection(obj),5,231,3,totalDamage,0,0,0,0,0,0,0);
break;
}
return true;
}
function onEndState_UnlimitedSpeedSlashBvs(obj, new_state)
{
if(!obj) return;
}