3678 lines
123 KiB
C
3678 lines
123 KiB
C
|
|
|
||
|
|
function onChangeSkillEffect_Thief_Necromancer(obj, skillIndex, reciveData)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
switch(skillIndex){
|
||
|
|
case SKILL_BYKK_SUMMONNICOLAS:
|
||
|
|
local subtype = reciveData.readDword();
|
||
|
|
switch(subtype){
|
||
|
|
case 1:
|
||
|
|
local id = reciveData.readDword();
|
||
|
|
local monster_obj = sq_GetCNRDObjectToActiveObject(sq_GetObject(obj, reciveData.readDword(), reciveData.readDword()));
|
||
|
|
switch(id){
|
||
|
|
case MONSTER_ID_NICOLAS:
|
||
|
|
setMonsterAppendage_Necromancer_byKK(obj, monster_obj, APDPATH_NICOLAS, "NicolasObj", SKILL_BYKK_SUMMONNICOLAS);
|
||
|
|
break;
|
||
|
|
case MONSTER_ID_ZOMBIE:
|
||
|
|
setMonsterAppendage_Necromancer_byKK(obj, monster_obj, APDPATH_ZOMBIE, "ZombieObj", SKILL_BYKK_NICOLASSUMMONZOMBIE);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function setMonsterAppendage_Necromancer_byKK(obj, monster_obj, appendagepath, monstername, skill_index)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(!monster_obj) return;
|
||
|
|
if(appendagepath == null || monstername == null || skill_index == null) return;
|
||
|
|
appendagepath = appendagepath.tostring();
|
||
|
|
monstername = monstername.tostring();
|
||
|
|
local monster_obj = sq_GetCNRDObjectToActiveObject(monster_obj);
|
||
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(monster_obj, appendagepath)){
|
||
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(monster_obj, monster_obj, skill_index, false, appendagepath, true);
|
||
|
|
AddAppendage.getVar("sqrChr").clear_obj_vector();
|
||
|
|
AddAppendage.getVar("sqrChr").push_obj_vector(obj);
|
||
|
|
local monsternum = obj.getVar(monstername).get_obj_vector_size();
|
||
|
|
if(monsternum > 0){
|
||
|
|
obj.getVar(monstername).push_obj_vector(monster_obj);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.getVar(monstername).clear_obj_vector();
|
||
|
|
obj.getVar(monstername).push_obj_vector(monster_obj);
|
||
|
|
}
|
||
|
|
setMonsterInfo_Thief_Necromancer(obj, monster_obj, skill_index, AddAppendage);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function setMonsterInfo_Thief_Necromancer(obj, monster_obj, skill_index, appendage)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
|
||
|
|
monster_obj.setMapFollowParent(obj);
|
||
|
|
monster_obj.setMapFollowType(1);
|
||
|
|
|
||
|
|
local monster_id = monster_obj.getCollisionObjectIndex();
|
||
|
|
switch(monster_id){
|
||
|
|
case MONSTER_ID_NICOLAS:
|
||
|
|
local coolt_01 = 1000, coolt_02 = 2000, coolt_03 = 3000, coolt_04 = 4000;
|
||
|
|
local coolTime = [coolt_01, coolt_02, coolt_03, coolt_04];
|
||
|
|
local skillIndex = ["skill_1", "skill_2", "skill_3", "skill_4"];
|
||
|
|
for(local i = 0; i < skillIndex.len(); i++){
|
||
|
|
appendage.getVar(skillIndex[i]).clear_timer_vector();
|
||
|
|
appendage.getVar(skillIndex[i]).push_timer_vector();
|
||
|
|
local t = appendage.getVar(skillIndex[i]).get_timer_vector(0);
|
||
|
|
t.setParameter(coolTime[i], -1);
|
||
|
|
t.resetInstant(0);
|
||
|
|
}
|
||
|
|
local sub = 0;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_SUMMONNICOLASEX) > 0) sub = 10;
|
||
|
|
appendage.getVar("custom").setInt(0, sub);
|
||
|
|
monsterattack_Thief_Necromancer_ksk(monster_obj,0);
|
||
|
|
break;
|
||
|
|
case MONSTER_ID_ZOMBIE:
|
||
|
|
appendage.getVar("skill_1").clear_timer_vector();
|
||
|
|
appendage.getVar("skill_1").push_timer_vector();
|
||
|
|
local t = appendage.getVar("skill_1").get_timer_vector(0);
|
||
|
|
t.setParameter(1000, -1);
|
||
|
|
t.resetInstant(0);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_NICOLASSUMMONZOMBIE);
|
||
|
|
local hitMax = sq_GetLevelData(obj, SKILL_BYKK_NICOLASSUMMONZOMBIE, 4, skillLevel);
|
||
|
|
appendage.getVar("custom").setInt(1, hitMax);
|
||
|
|
appendage.getVar("custom").setInt(0, 0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function procAppend_Thief_Necromancer(obj)
|
||
|
|
{
|
||
|
|
local size = obj.getVar("NicolasObj").get_obj_vector_size();
|
||
|
|
if(size < 1){
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_NICOLASBEHAVIOR, false);
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_NICOLASBLACKARACHNIA, false);
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_NICOLASBLACKAREA, false);
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_NICOLASBLACKWAVE, false);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_KEYOFACERON) < 1) obj.setSkillCommandEnable(SKILL_BYKK_NICOLASSUMMONZOMBIE, false);
|
||
|
|
}
|
||
|
|
size = obj.getVar("ballacreObj").get_obj_vector_size();
|
||
|
|
if(size < 1){
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_BALLACREADVENT, false);
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_BALLACRESTRONGATTACK, false);
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_MADNESSBALLACRE, false);
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_GRABCOLLAR, false);
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_AMBITIONOFBALLACRE, false);
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_GUILLOTINE, false);
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_PHANTOMSTROM, false);
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_EXECUTIONERSLASH, false);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_KEYOFACERON) > 0) setBallacreSkillEffet_bykk(obj);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_APPORTBALLACRE, false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function setCommandEnable_Thief_Necromancer(obj, skillIndex)
|
||
|
|
{
|
||
|
|
local currentMp = obj.getMp();
|
||
|
|
local skill = sq_GetSkill(obj, skillIndex);
|
||
|
|
local consumeMp = skill.getSpendMp(obj, -1);
|
||
|
|
if(!skill.isInCoolTime() && currentMp > consumeMp){
|
||
|
|
obj.setSkillCommandEnable(skillIndex, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function startSkillCoolTime_Thief_Necromancer_bykk(obj, skillIndex, skillLevel, currentCoolTime)
|
||
|
|
{
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_WANDMASTERY) > 0){
|
||
|
|
local weaponType = obj.getWeaponSubType();
|
||
|
|
if(weaponType == 3){
|
||
|
|
if(skillIndex != SKILL_BYKK_PHANTOMSTROM && skillIndex != SKILL_BYKK_BALLACREADVENT){
|
||
|
|
local newSkillCoolTime = currentCoolTime * 90 / 100;
|
||
|
|
print("currentCoolTime : "+currentCoolTime);
|
||
|
|
print("newSkillCoolTime : "+newSkillCoolTime);
|
||
|
|
return newSkillCoolTime;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return currentCoolTime;
|
||
|
|
}
|
||
|
|
|
||
|
|
function ProcPassiveSkill_NecroMancer_bykk(obj, skill_index, skill_level)
|
||
|
|
{
|
||
|
|
switch(skill_index){
|
||
|
|
case SKILL_BYKK_FEAROFBALLACRE:
|
||
|
|
if(skill_level > 0){
|
||
|
|
local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, skill_index, false, APDPATH_FEAROFBALLACRE, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case SKILL_BYKK_WANDMASTERY:
|
||
|
|
if(skill_level > 0){
|
||
|
|
local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, skill_index, false, APDPATH_WANDMASTERY, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onStart_appendage_fearofballacre_tochr(appendage)
|
||
|
|
{
|
||
|
|
if(!appendage) return;
|
||
|
|
appendage.getVar("coolTime").clear_timer_vector();
|
||
|
|
appendage.getVar("coolTime").push_timer_vector();
|
||
|
|
local t = appendage.getVar("coolTime").get_timer_vector(0);
|
||
|
|
t.setParameter(1000, -1);
|
||
|
|
t.resetInstant(0);
|
||
|
|
t.setEventOnStart(true);
|
||
|
|
local parentObj = appendage.getParent();
|
||
|
|
local obj = sq_GetCNRDObjectToSQRCharacter(parentObj);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_FEAROFBALLACRE);
|
||
|
|
local criticalRate = sq_GetLevelData(obj, SKILL_BYKK_FEAROFBALLACRE, 4, skillLevel);
|
||
|
|
local criticaldamageRate = sq_GetLevelData(obj, SKILL_BYKK_FEAROFBALLACRE, 5, skillLevel);
|
||
|
|
local lifeTime = sq_GetLevelData(obj, SKILL_BYKK_FEAROFBALLACRE, 3, skillLevel);
|
||
|
|
local range = sq_GetLevelData(obj, SKILL_BYKK_FEAROFBALLACRE, 6, skillLevel);
|
||
|
|
appendage.getVar("custom").setInt(0, lifeTime);
|
||
|
|
appendage.getVar("custom").setInt(1, range);
|
||
|
|
local change_appendage = appendage.sq_getChangeStatus("fearofballacre");
|
||
|
|
if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("fearofballacre",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 * 0.1).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_HIT_RATE, false, (criticalRate * 0.1).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_PHYSICAL_CRITICAL_DAMAGE_RATE, false, (criticaldamageRate * 0.1 / 0.667).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_DAMAGE_RATE, false, (criticaldamageRate * 0.1 / 0.667).tofloat());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function proc_appendage_fearofballacre_tochr(appendage)
|
||
|
|
{
|
||
|
|
if (!appendage) return;
|
||
|
|
local parentObj = appendage.getParent();
|
||
|
|
local obj = sq_GetCNRDObjectToSQRCharacter(parentObj);
|
||
|
|
if(!parentObj || parentObj.getState() == STATE_DIE){
|
||
|
|
appendage.setValid(false);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
local t = appendage.getVar("coolTime").get_timer_vector(0);
|
||
|
|
local currentT = appendage.getTimer().Get();
|
||
|
|
if(t && t.isOnEvent(currentT)){
|
||
|
|
local lifeTime = appendage.getVar("custom").getInt(0);
|
||
|
|
local range = appendage.getVar("custom").getInt(1);
|
||
|
|
local objectManager = obj.getObjectManager();
|
||
|
|
for (local i = 0; i < objectManager.getCollisionObjectNumber(); i++){
|
||
|
|
local object = objectManager.getCollisionObject(i);
|
||
|
|
if (object && object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object) && sq_Abs(sq_GetXPos(obj) - sq_GetXPos(object)) <= range && sq_Abs(sq_GetYPos(obj) - sq_GetYPos(object)) <= range / 2){
|
||
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(object, APDPATH_FEAROFBALLACRE_TOENEMY)){
|
||
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(object, obj, -1, false, APDPATH_FEAROFBALLACRE_TOENEMY, true);
|
||
|
|
AddAppendage.sq_SetValidTime(lifeTime);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function proc_appendage_fearofballacre_toenemy(appendage)
|
||
|
|
{
|
||
|
|
if (!appendage) return;
|
||
|
|
local parentObj = appendage.getParent();
|
||
|
|
if(!parentObj || parentObj.getState() == STATE_DIE){
|
||
|
|
appendage.setValid(false);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function drawAppend_appendage_fearofballacre_toenemy(appendage, isOver, x, y, isFlip)
|
||
|
|
{
|
||
|
|
if(!appendage) return;
|
||
|
|
local parentObj = appendage.getParent();
|
||
|
|
if(!parentObj || parentObj.getState() == STATE_DIE) {
|
||
|
|
appendage.setValid(false);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
local var = appendage.getVar();
|
||
|
|
local Ani = var.GetAnimationMap("fearofballacre_debuff", "character/thief/effect/animation/2_necromancer_bykk/fearofballacre/debuff.ani");
|
||
|
|
sq_AnimationProc(Ani);
|
||
|
|
sq_drawCurrentFrame(Ani, x, y - sq_GetHeightObject(parentObj), isFlip);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onStart_appendage_wandmastery(appendage)
|
||
|
|
{
|
||
|
|
if(!appendage) return;
|
||
|
|
local parentObj = appendage.getParent();
|
||
|
|
local obj = sq_GetCNRDObjectToSQRCharacter(parentObj);
|
||
|
|
local weaponType = obj.getWeaponSubType();
|
||
|
|
if(weaponType == -1) return;
|
||
|
|
if(weaponType == 3){
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_WANDMASTERY);
|
||
|
|
local castSpeed = sq_GetLevelData(obj, SKILL_BYKK_WANDMASTERY, 0, skillLevel);
|
||
|
|
local change_appendage = appendage.sq_getChangeStatus("wandmastery");
|
||
|
|
if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("wandmastery",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000);
|
||
|
|
if(change_appendage){
|
||
|
|
change_appendage.clearParameter();
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_CAST_SPEED, false, (castSpeed).tofloat());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//暗魂波
|
||
|
|
function checkExecutableSkill_DarkSoul(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_DARKSOUL);
|
||
|
|
if (isUse){
|
||
|
|
obj.getVar("DarkSoul_Bool").setBool(0, true);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(obj.getVar("ballacreObj").get_obj_vector_size() > 0){
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_KEYOFACERON) < 1){
|
||
|
|
obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_DARKSOUL);
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
}
|
||
|
|
else obj.sq_IntVectPush(1);
|
||
|
|
}
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_DARKSOUL, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_DarkSoul(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_DarkSoul(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_BYKK_DARKSOUL);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(ANI_BYKK_DARKSOULNONCHARGELAUNCH);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_SetCurrentAnimation(ANI_BYKK_DARKSOULCHARGECAST);
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
obj.sq_SetCurrentAnimation(ANI_BYKK_DARKSOULCHARGELAUNCH);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_DarkSoul(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 1:
|
||
|
|
case 3:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_DarkSoul(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 2:
|
||
|
|
local bDownKey = obj.isDownSkillLastKey();
|
||
|
|
if(bDownKey){
|
||
|
|
if(obj.getVar("DarkSoul_Bool").getBool(0)){
|
||
|
|
local stateTime = obj.sq_GetStateTimer();
|
||
|
|
if(stateTime >= sq_GetIntData(obj, SKILL_BYKK_DARKSOUL, 4)){
|
||
|
|
obj.getVar("DarkSoul_Bool").setBool(0, false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(3);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_DARKSOUL, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_DarkSoul(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 101:
|
||
|
|
local bonusRate = 0;
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_UNHOLYAURA);
|
||
|
|
if(skillLevel > 0) bonusRate = sq_GetLevelData(obj, SKILL_BYKK_UNHOLYAURA, 5, skillLevel).tofloat() / sq_GetLevelData(obj, SKILL_BYKK_UNHOLYAURA, 2, skillLevel).tofloat();
|
||
|
|
local totalDamage = 0;
|
||
|
|
local increaseRate = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 5, 1.0) + 100;
|
||
|
|
local hitMax = sq_GetIntData(obj, SKILL_BYKK_DARKSOUL, 1);
|
||
|
|
local hitTime = sq_GetIntData(obj, SKILL_BYKK_DARKSOUL, 0);
|
||
|
|
local offsetY = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 4, 1.0) + 100;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 3:
|
||
|
|
if(obj.getVar("DarkSoul_Bool").getBool(0) == false){
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 0, (1.0 + increaseRate.tofloat() / 100.0) * bonusRate) + 100;
|
||
|
|
local totalDamage_exp = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 3, (1.0 + increaseRate.tofloat() / 100.0) * bonusRate) + 100;
|
||
|
|
createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,60,0,68,obj.getDirection(),2,SKILL_BYKK_DARKSOUL,2,totalDamage,totalDamage_exp,hitMax,offsetY,hitTime,0,0,0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 0:
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 0, bonusRate) + 100;
|
||
|
|
local totalDamage_exp = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 3, bonusRate) + 100;
|
||
|
|
createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,60,0,68,obj.getDirection(),2,SKILL_BYKK_DARKSOUL,1,totalDamage,totalDamage_exp,hitMax,offsetY,hitTime,0,0,0);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 7, (1.0 + increaseRate.tofloat() / 100.0) * bonusRate) + 100;
|
||
|
|
local totalDamage_exp = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKSOUL, -1, 3, (1.0 + increaseRate.tofloat() / 100.0) * bonusRate) + 100;
|
||
|
|
createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,60,0,68,obj.getDirection(),2,SKILL_BYKK_DARKSOUL,3,totalDamage,totalDamage_exp,hitMax,offsetY,hitTime,0,0,0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_DarkSoul(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_DarkSoul(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//降临:尼古拉斯
|
||
|
|
function checkExecutableSkill_SummonNicolas(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local number = obj.getVar("NicolasObj").get_obj_vector_size();
|
||
|
|
if(number > 0 && obj.getVar("summonnicolas_bool").getBool(0)){
|
||
|
|
obj.getVar("summonnicolas_bool").setBool(0, false);
|
||
|
|
for(local i = 0; i < number; i++){
|
||
|
|
local nicolasObj = obj.getVar("NicolasObj").get_obj_vector(i);
|
||
|
|
if(nicolasObj){
|
||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(nicolasObj);
|
||
|
|
sq_IntVectorClear(sq_GetGlobalIntVector());
|
||
|
|
sq_AddSetStatePacketActiveObject(activeObj,12,sq_GetGlobalIntVector(), STATE_PRIORITY_USER);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == STATE_STAND || state == STATE_DASH){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_SUMMONNICOLAS);
|
||
|
|
if (isUse){
|
||
|
|
obj.getVar("summonnicolas_bool").setBool(0, true);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_SUMMONNICOLAS, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_SummonNicolas(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_SummonNicolas(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_BYKK_SUMMONNICOLAS);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_SummonNicolas(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_SummonNicolas(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_SummonNicolas(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 1:
|
||
|
|
local level = sq_GetSkillLevel(obj, 174);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_SUMMONNICOLAS);
|
||
|
|
local summonTime = sq_GetLevelData(obj, SKILL_BYKK_SUMMONNICOLAS, 10, skillLevel);
|
||
|
|
summonmonster_necromancer_bykk(obj,obj,50,0,0,0,MONSTER_ID_NICOLAS,summonTime,level,0);
|
||
|
|
print(120);
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_NICOLAS_TOCHR)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_NICOLAS_TOCHR);
|
||
|
|
print(121);
|
||
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, APDPATH_NICOLAS_TOCHR, true);
|
||
|
|
print(122);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_SummonNicolas(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_SummonNicolas(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSourceKeyFrameFlag_appendage_nicolas(appendage,flagIndex)
|
||
|
|
{
|
||
|
|
if(!appendage) return;
|
||
|
|
local parentObj = appendage.getParent();
|
||
|
|
if(!parentObj){
|
||
|
|
appendage.setValid(false);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
local sqrChr = sq_GetCNRDObjectToSQRCharacter(appendage.getVar("sqrChr").get_obj_vector(0));
|
||
|
|
if(!sqrChr) return true;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 100:
|
||
|
|
local currentAni = parentObj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(0, 0);
|
||
|
|
local speedRate = 30000 / delay;
|
||
|
|
createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,0,parentObj.getDirection(),2,SKILL_BYKK_SUMMONNICOLAS,10,speedRate,0,0,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 102: //蜘蛛团
|
||
|
|
local bonusRate = 100;
|
||
|
|
if(appendage.getVar("custom").getInt(0) == 12 || appendage.getVar("custom").getInt(0) == 2) bonusRate = bonusRate + appendage.getVar("custom").getInt(1);
|
||
|
|
bonusRate = bonusRate.tofloat() / 100.0;
|
||
|
|
// print("bonusRate_blackspi = "+bonusRate);
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_SUMMONNICOLAS, -1, 7, bonusRate) + 100;
|
||
|
|
local hitTime = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_SUMMONNICOLAS, -1, 3, 1.0) + 100;
|
||
|
|
createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,5,0,50,parentObj.getDirection(),2,SKILL_BYKK_SUMMONNICOLAS,1,totalDamage,hitTime,0,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 201: //召唤僵尸
|
||
|
|
local level = sq_GetSkillLevel(sqrChr, 174);
|
||
|
|
local skillLevel = sq_GetSkillLevel(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE);
|
||
|
|
local summonTime = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, 9, skillLevel);
|
||
|
|
local summonMax = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, 11, skillLevel);
|
||
|
|
createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,58,0,116,parentObj.getDirection(),2,SKILL_BYKK_NICOLASSUMMONZOMBIE,1,level,summonTime,summonMax,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 301: //吸魂暗劲波
|
||
|
|
if(sqrChr.isDownSkillLastKey()){
|
||
|
|
local offsetX = sq_GetDistancePos(sq_GetXPos(sqrChr), sqrChr.getDirection(), 100);
|
||
|
|
sq_setCurrentAxisPos(parentObj, 0, offsetX);
|
||
|
|
sq_setCurrentAxisPos(parentObj, 1, sq_GetYPos(sqrChr));
|
||
|
|
sq_SetCurrentDirection(parentObj, sq_GetDirection(sqrChr));
|
||
|
|
}
|
||
|
|
local currentAni = parentObj.getCurrentAnimation();
|
||
|
|
sq_SetFrameDelayTime(currentAni, 3, 200);
|
||
|
|
sqrChr.getVar("blackwave_tar").clear_obj_vector();
|
||
|
|
parentObj.getVar("blackwave_bool").setBool(0, true);
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKWAVE, -1, 1, 1.0) + 100;
|
||
|
|
local hitTime = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKWAVE, 0);
|
||
|
|
createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,0,parentObj.getDirection(),2,SKILL_BYKK_NICOLASBLACKWAVE,1,totalDamage,hitTime,0,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 304: //吸魂暗劲波
|
||
|
|
local aniPath = "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackwave/bodysmokenormal.ani";
|
||
|
|
local pooledObj = createOnlyDrawObject_Theif_bykk(parentObj,aniPath,true,parentObj.getDirection(),sq_GetXPos(parentObj),sq_GetYPos(parentObj),sq_GetZPos(parentObj),ENUM_DRAWLAYER_NORMAL);
|
||
|
|
parentObj.getVar("effect").clear_obj_vector();
|
||
|
|
parentObj.getVar("effect").push_obj_vector(pooledObj);
|
||
|
|
local aniPath2 = "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackwave/linestartnormal.ani";
|
||
|
|
local angle = [135,110,60,45,0,-40,-80,-120,-150,-175];
|
||
|
|
local xPos = sq_GetDistancePos(sq_GetXPos(parentObj), parentObj.getDirection(), 10), yPos = sq_GetYPos(parentObj), zPos = sq_GetZPos(parentObj) + 100;
|
||
|
|
for(local i = 0; i < angle.len(); i++){
|
||
|
|
local pooledObj = createOnlyDrawObject_Theif_bykk(parentObj, aniPath2, true, parentObj.getDirection(), xPos, yPos - 1, zPos, ENUM_DRAWLAYER_NORMAL);
|
||
|
|
sq_SetCustomRotate(pooledObj, sq_ToRadian(angle[i].tofloat()));
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 310: //吸魂暗劲波
|
||
|
|
local effect_obj = parentObj.getVar("effect").get_obj_vector(0);
|
||
|
|
if(effect_obj) effect_obj.setValid(false);
|
||
|
|
local aniPath = "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackwave/blastbeforebody.ani";
|
||
|
|
local aniPath2 = "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackwave/blastbeforeeffect.ani";
|
||
|
|
createOnlyDrawObject_Theif_bykk(parentObj,aniPath,true,parentObj.getDirection(),sq_GetXPos(parentObj),sq_GetYPos(parentObj),sq_GetZPos(parentObj),ENUM_DRAWLAYER_NORMAL);
|
||
|
|
createOnlyDrawObject_Theif_bykk(parentObj,aniPath2,true,parentObj.getDirection(),sq_GetXPos(parentObj),sq_GetYPos(parentObj) - 1,sq_GetZPos(parentObj) - 1,ENUM_DRAWLAYER_NORMAL);
|
||
|
|
break;
|
||
|
|
case 311: //吸魂暗劲波
|
||
|
|
local aniPath = "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackwave/blastbeforeeyedodge.ani";
|
||
|
|
createOnlyDrawObject_Theif_bykk(parentObj,aniPath,true,parentObj.getDirection(),sq_GetXPos(parentObj),sq_GetYPos(parentObj),sq_GetZPos(parentObj),ENUM_DRAWLAYER_NORMAL);
|
||
|
|
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKWAVE, -1, 3, 1.0) + 100;
|
||
|
|
local sizeRate = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKWAVE, 4) / 10;
|
||
|
|
local size = sqrChr.getVar("blackwave_tar").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = sqrChr.getVar("blackwave_tar").get_obj_vector(i);
|
||
|
|
if(targetObj){
|
||
|
|
createSkillPassive_Theif_bykk(sqrChr,targetObj,PASSIVEOBJ_NUM_THIEF,0,0,sq_GetHeightObject(targetObj) / 2,parentObj.getDirection(),2,SKILL_BYKK_NICOLASSUMMONZOMBIE,3,totalDamage,sizeRate,0,0,0,0,0,0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 322: //吸魂暗劲波
|
||
|
|
if(parentObj.getVar("blackwave_bool").getBool(0)){
|
||
|
|
parentObj.getVar("blackwave_bool").setBool(0, false);
|
||
|
|
local size = sqrChr.getVar("blackwave_tar").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = sqrChr.getVar("blackwave_tar").get_obj_vector(i);
|
||
|
|
if(targetObj){
|
||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(targetObj, APDPATH_NICOLAS_BLACKWAVE);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 404: //艾克洛索
|
||
|
|
local targetObj = parentObj.getVar("targetObj").get_obj_vector(0);
|
||
|
|
if(targetObj){
|
||
|
|
local bonusRate = 100;
|
||
|
|
if(appendage.getVar("custom").getInt(0) == 12 || appendage.getVar("custom").getInt(0) == 2) bonusRate = bonusRate + appendage.getVar("custom").getInt(2);
|
||
|
|
bonusRate = bonusRate.tofloat() / 100.0;
|
||
|
|
// print("bonusRate_ara = "+bonusRate);
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_SUMMONNICOLAS, -1, 8, bonusRate) + 100;
|
||
|
|
local totalDamage2 = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_SUMMONNICOLAS, -1, 9, bonusRate) + 100;
|
||
|
|
createSkillPassive_Theif_bykk(sqrChr,targetObj,PASSIVEOBJ_NUM_THIEF,0,0,400,parentObj.getDirection(),2,SKILL_BYKK_SUMMONNICOLAS,2,totalDamage,totalDamage2,0,0,0,0,0,0);
|
||
|
|
sq_AddDrawOnlyAniFromParent(targetObj, "passiveobject/common/animation/magictargetwarningterrible.ani", 0, 0, -sq_GetZPos(targetObj));
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 503: //暗影蛛丝阵
|
||
|
|
local skillLevel = sq_GetSkillLevel(sqrChr, SKILL_BYKK_NICOLASBLACKAREA);
|
||
|
|
local lifeTime = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASBLACKAREA, 4, skillLevel);
|
||
|
|
local totalDamage = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASBLACKAREA, 5, skillLevel);
|
||
|
|
local darkTol = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASBLACKAREA, 0, skillLevel);
|
||
|
|
local hitTime = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKAREA, 0);
|
||
|
|
local sizeRate = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASBLACKAREA, 2, skillLevel) / 2;
|
||
|
|
local ap = sq_CreateChangeStatus(CHANGE_STATUS_TYPE_ELEMENT_TOLERANCE_DARK, false, darkTol.tofloat() , 0);
|
||
|
|
if (ap){
|
||
|
|
ap.getAppendageInfo().setValidTime(lifeTime);
|
||
|
|
ap.sq_Append(parentObj, sqrChr);
|
||
|
|
}
|
||
|
|
local group = sq_GetGroup(parentObj);
|
||
|
|
local uniqueId = sq_GetUniqueId(parentObj);
|
||
|
|
createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,-sq_GetZPos(parentObj),parentObj.getDirection(),2,SKILL_BYKK_NICOLASBLACKAREA,1,totalDamage,lifeTime,hitTime,sizeRate,group,uniqueId,0,0);
|
||
|
|
break;
|
||
|
|
case 701: //tp黑蜘蛛
|
||
|
|
local bonusRate = 100;
|
||
|
|
if(appendage.getVar("custom").getInt(0) == 12 || appendage.getVar("custom").getInt(0) == 2) bonusRate = bonusRate + appendage.getVar("custom").getInt(1);
|
||
|
|
bonusRate = bonusRate.tofloat() / 100.0;
|
||
|
|
// print("bonusRate_blackspi_tp = "+bonusRate);
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_SUMMONNICOLAS, -1, 11, bonusRate) + 100;
|
||
|
|
local hitTime = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_SUMMONNICOLAS, -1, 3, 1.0) + 100;
|
||
|
|
createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,60,-1,10,parentObj.getDirection(),2,SKILL_BYKK_SUMMONNICOLAS,3,totalDamage,hitTime,0,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 802: //tp艾克尼亚的灵体
|
||
|
|
local targetObj = parentObj.getVar("targetObj").get_obj_vector(0);
|
||
|
|
if(targetObj){
|
||
|
|
local bonusRate = 100;
|
||
|
|
if(appendage.getVar("custom").getInt(0) == 12 || appendage.getVar("custom").getInt(0) == 2) bonusRate = bonusRate + appendage.getVar("custom").getInt(1);
|
||
|
|
bonusRate = bonusRate.tofloat() / 100.0;
|
||
|
|
// print("bonusRate_ara_tp = "+bonusRate);
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_SUMMONNICOLAS, -1, 14, bonusRate) + 100;
|
||
|
|
createSkillPassive_Theif_bykk(sqrChr,targetObj,PASSIVEOBJ_NUM_THIEF,0,0,-sq_GetZPos(targetObj),parentObj.getDirection(),2,SKILL_BYKK_SUMMONNICOLAS,5,totalDamage,0,0,0,0,0,0,0);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 901: //暗黑蛛丝引
|
||
|
|
if(sqrChr.isDownSkillLastKey()){
|
||
|
|
sq_AddDrawOnlyAniFromParent(parentObj, "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackarachnia/disappear_smokenormal.ani", 0, 0, 0);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 902: //暗黑蛛丝引
|
||
|
|
if(sqrChr.isDownSkillLastKey()){
|
||
|
|
local offsetX = sq_GetDistancePos(sq_GetXPos(sqrChr), sqrChr.getDirection(), 100);
|
||
|
|
sq_setCurrentAxisPos(parentObj, 0, offsetX);
|
||
|
|
sq_setCurrentAxisPos(parentObj, 1, sq_GetYPos(sqrChr));
|
||
|
|
sq_SetCurrentDirection(parentObj, sq_GetDirection(sqrChr));
|
||
|
|
sq_AddDrawOnlyAniFromParent(parentObj, "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackarachnia/disappear_smokenormal.ani", 0, 0, 0);
|
||
|
|
}
|
||
|
|
local aniPath = "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackarachnia/start_blackground.ani";
|
||
|
|
createOnlyDrawObject_Theif_bykk(parentObj,aniPath,true,parentObj.getDirection(),sq_GetXPos(parentObj),sq_GetYPos(parentObj),0,ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
break;
|
||
|
|
case 903: //暗黑蛛丝引
|
||
|
|
sq_SetMyShake(parentObj, 10, 500);
|
||
|
|
monsterattack_Thief_Necromancer_ksk(parentObj,13);
|
||
|
|
break;
|
||
|
|
case 1004: //近身攻击
|
||
|
|
local currentAni = parentObj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(0, 0);
|
||
|
|
local speedRate = 6000 / delay;
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBEHAVIOR, -1, 11, 1.0) + 100;
|
||
|
|
createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,0,parentObj.getDirection(),2,SKILL_BYKK_SUMMONNICOLAS,6,speedRate,totalDamage,0,0,0,0,0,0);
|
||
|
|
case 1101: //吸魂暗劲波护石
|
||
|
|
case 1200:
|
||
|
|
if(sqrChr.isDownSkillLastKey()){
|
||
|
|
sq_AddDrawOnlyAniFromParent(parentObj, "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackarachnia/disappear_smokenormal.ani", 0, 0, 0);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 1201: //暗黑蛛丝引
|
||
|
|
if(sqrChr.isDownSkillLastKey()){
|
||
|
|
local offsetX = sq_GetDistancePos(sq_GetXPos(sqrChr), sqrChr.getDirection(), 50);
|
||
|
|
sq_setCurrentAxisPos(parentObj, 0, offsetX);
|
||
|
|
sq_setCurrentAxisPos(parentObj, 1, sq_GetYPos(sqrChr));
|
||
|
|
sq_SetCurrentDirection(parentObj, sq_GetDirection(sqrChr));
|
||
|
|
sq_AddDrawOnlyAniFromParent(parentObj, "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackarachnia/disappear_smokenormal.ani", 0, 0, 0);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 1203://`create Dead Nicolas sister` 142 0 0
|
||
|
|
local currentAni = parentObj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(3, 7);
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, -1, 0, 1.0) + 100;
|
||
|
|
local totalDamage2 = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, -1, 2, 5.0) + 100;
|
||
|
|
local holdTime = 3000 + delay;
|
||
|
|
local sizeRate = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, 5);
|
||
|
|
local hitTime = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, 4);
|
||
|
|
sqrChr.getVar("blacjarachnia_tar").clear_obj_vector();
|
||
|
|
createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,142,0,0,parentObj.getDirection(),2,SKILL_BYKK_NICOLASBLACKARACHNIA,4,totalDamage,sizeRate,totalDamage2,holdTime,hitTime,0,0,0);
|
||
|
|
print("test");
|
||
|
|
break;
|
||
|
|
case 1301:
|
||
|
|
sq_flashScreen(parentObj,200,200,240,255, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
local currentAni = parentObj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(6, 15);
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, -1, 0, 1.0) + 100;
|
||
|
|
local totalDamage2 = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, -1, 2, 1.0) + 100;
|
||
|
|
local holdTime = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, -1, 3, 1.0) + 100 + delay;
|
||
|
|
local sizeRate = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, 5);
|
||
|
|
local hitTime = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, 4);
|
||
|
|
sqrChr.getVar("blacjarachnia_tar").clear_obj_vector();
|
||
|
|
createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,0,parentObj.getDirection(),2,SKILL_BYKK_NICOLASBLACKARACHNIA,1,totalDamage,sizeRate,totalDamage2,holdTime,hitTime,0,0,0);
|
||
|
|
break;
|
||
|
|
case 1306:
|
||
|
|
local aniPath = "monster/character/thief/2_necromancer_bykk/nicolas/animation/effect/blackarachnia/attack_blackground.ani";
|
||
|
|
createOnlyDrawObject_Theif_bykk(parentObj,aniPath,true,parentObj.getDirection(),sq_GetXPos(parentObj),sq_GetYPos(parentObj),0,ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
local size = sqrChr.getVar("blacjarachnia_tar").get_obj_vector_size();
|
||
|
|
local currentAni = parentObj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(6, 10);
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = sqrChr.getVar("blacjarachnia_tar").get_obj_vector(i);
|
||
|
|
if(targetObj){
|
||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(targetObj);
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(targetObj, APDPATH_NICOLAS_BLACKWAVE);
|
||
|
|
if(addAppendage && !sq_IsFixture(activeObj)) sq_MoveToAppendageForce(targetObj, sqrChr, parentObj, 100, 0, targetObj.getZPos(), delay, true, addAppendage);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 1307:
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, -1, 1, 1.0) + 100;
|
||
|
|
local sizeRate = sq_GetIntData(sqrChr, SKILL_BYKK_NICOLASBLACKARACHNIA, 5);
|
||
|
|
createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,0,parentObj.getDirection(),2,SKILL_BYKK_NICOLASBLACKARACHNIA,2,totalDamage,sizeRate,0,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function proc_appendage_nicolas_tochr(appendage)
|
||
|
|
{
|
||
|
|
if (!appendage) return;
|
||
|
|
local parentObj = appendage.getParent();
|
||
|
|
if(!parentObj || parentObj.getState() == STATE_DIE){
|
||
|
|
appendage.setValid(false);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function proc_appendage_nicolas(appendage)
|
||
|
|
{
|
||
|
|
if (!appendage) return;
|
||
|
|
local parentObj = appendage.getParent();
|
||
|
|
local sqrChr = sq_GetCNRDObjectToSQRCharacter(appendage.getVar("sqrChr").get_obj_vector(0));
|
||
|
|
if((!sqrChr || sqrChr.getState() == STATE_DIE) || (!parentObj || parentObj.getState() == STATE_DIE)){
|
||
|
|
appendage.setValid(false);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
local sub = appendage.getVar("custom").getInt(0);
|
||
|
|
if(sub == 3 || sub == 13) return;
|
||
|
|
|
||
|
|
if(!sq_IsMyControlObject(sqrChr)) return;
|
||
|
|
|
||
|
|
local t_01 = appendage.getVar("skill_1").get_timer_vector(0);
|
||
|
|
local t_02 = appendage.getVar("skill_2").get_timer_vector(0);
|
||
|
|
local t_03 = appendage.getVar("skill_3").get_timer_vector(0);
|
||
|
|
local t_04 = appendage.getVar("skill_4").get_timer_vector(0);
|
||
|
|
local currentT = appendage.getTimer().Get();
|
||
|
|
|
||
|
|
local state = parentObj.getState();
|
||
|
|
switch(state){
|
||
|
|
case STATE_STAND:
|
||
|
|
local timer = appendage.getVar("atktime").get_ct_vector(0);
|
||
|
|
local currentTT = timer.Get();
|
||
|
|
if(currentTT < ATK_TIME) return;
|
||
|
|
timer.Reset();
|
||
|
|
timer.Start(10000,0);
|
||
|
|
|
||
|
|
if(parentObj.getVar("blackwave_bool").getBool(0)){
|
||
|
|
parentObj.getVar("blackwave_bool").setBool(0, false);
|
||
|
|
local size = sqrChr.getVar("blackwave_tar").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = sqrChr.getVar("blackwave_tar").get_obj_vector(i);
|
||
|
|
if(targetObj) CNSquirrelAppendage.sq_RemoveAppendage(targetObj, APDPATH_NICOLAS_BLACKWAVE);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
local targetObj = sq_FindTarget( parentObj, 0, 1000, 800, 350);
|
||
|
|
if(targetObj){
|
||
|
|
parentObj.getVar("targetObj").clear_obj_vector();
|
||
|
|
parentObj.getVar("targetObj").push_obj_vector(targetObj);
|
||
|
|
local skillt, attackIndex, distanceX, distanceXmin, distanceY;
|
||
|
|
switch(sub){
|
||
|
|
case 1:
|
||
|
|
case 11:
|
||
|
|
skillt = [t_02,t_01,t_04];
|
||
|
|
attackIndex = [1,10,4];
|
||
|
|
if(sub == 11) attackIndex = [7,10,8];
|
||
|
|
distanceX = [160,160,500];
|
||
|
|
distanceXmin = [0,0,0];
|
||
|
|
distanceY = [16,38,200];
|
||
|
|
break;
|
||
|
|
case 0:
|
||
|
|
case 10:
|
||
|
|
case 2:
|
||
|
|
case 12:
|
||
|
|
skillt = [t_03,t_02];
|
||
|
|
attackIndex = [4,1];
|
||
|
|
if(sub == 10 || sub == 12) attackIndex = [8,7];
|
||
|
|
distanceX = [500,500];
|
||
|
|
distanceXmin = [0,0];
|
||
|
|
distanceY = [200,16];
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
for(local i = 0;i < skillt.len(); i++){
|
||
|
|
if(skillt[i] && skillt[i].isOnEvent(currentT)){
|
||
|
|
if(sq_IsMyControlObject(parentObj)){
|
||
|
|
if(sq_Abs(targetObj.getXPos() - parentObj.getXPos()) <= distanceX[i] && sq_Abs(targetObj.getXPos() - parentObj.getXPos()) >= distanceXmin[i] && sq_Abs(targetObj.getYPos() - parentObj.getYPos()) <= distanceY[i]){
|
||
|
|
monsterattack_Thief_Necromancer_ksk(parentObj,attackIndex[i]);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
targetObj = sq_FindTarget( parentObj, -1000, 1000, 800, 350);
|
||
|
|
if(targetObj){
|
||
|
|
sq_SetCurrentDirection(parentObj, sq_GetOppositeDirection(sq_GetDirection(parentObj)));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case STATE_ATTACK:
|
||
|
|
local attackIndex = parentObj.getAttackIndex();
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onStart_appendage_nicolas(appendage)
|
||
|
|
{
|
||
|
|
if (!appendage) return;
|
||
|
|
|
||
|
|
appendage.getVar("atktime").clear_ct_vector();
|
||
|
|
appendage.getVar("atktime").push_ct_vector();
|
||
|
|
local timer = appendage.getVar("atktime").get_ct_vector(0);
|
||
|
|
timer.Reset();
|
||
|
|
timer.Start(10000,0);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEnd_appendage_nicolas(appendage)
|
||
|
|
{
|
||
|
|
if (!appendage) return;
|
||
|
|
|
||
|
|
local parentObj = appendage.getParent();
|
||
|
|
if(!parentObj) return;
|
||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(parentObj);
|
||
|
|
sq_IntVectorClear(sq_GetGlobalIntVector());
|
||
|
|
sq_AddSetStatePacketActiveObject(activeObj, 12, sq_GetGlobalIntVector(), STATE_PRIORITY_USER);
|
||
|
|
}
|
||
|
|
|
||
|
|
//服从
|
||
|
|
function checkExecutableSkill_NicolasBehavior(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_NICOLASBEHAVIOR);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_NICOLASBEHAVIOR, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_NicolasBehavior(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_NicolasBehavior(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_BYKK_NICOLASBEHAVIOR_CASTING_BODY);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(ANI_BYKK_NICOLASBEHAVIOR_LOOP_BODY);
|
||
|
|
local sub = obj.getVar("NicolasBehavior_Sub").getInt(0);
|
||
|
|
local aniPath = ["character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/range.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/melee.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/guard.ani"];
|
||
|
|
obj.getVar("effect").clear_obj_vector();
|
||
|
|
switch(sub){
|
||
|
|
case 1://近战
|
||
|
|
case 11://近战
|
||
|
|
aniPath = ["character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/melee_sub.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/range.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/guard.ani"];
|
||
|
|
break;
|
||
|
|
case 2://远程
|
||
|
|
case 12://远程
|
||
|
|
aniPath = ["character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/melee.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/range_sub.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/guard.ani"];
|
||
|
|
break;
|
||
|
|
case 3://守护
|
||
|
|
case 13://守护
|
||
|
|
local aniPath = ["character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/melee.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/range.ani", "character/thief/effect/animation/2_necromancer_bykk/nicolasbehavior/guard_sub.ani"];
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
local offsetX = [-35, 35, 0], offsetZ = [130, 130, 165];
|
||
|
|
for(local i = 0; i < aniPath.len(); i++){
|
||
|
|
local pooledObj = createOnlyDrawObject_Theif_bykk(obj,aniPath[i],false,ENUM_DIRECTION_RIGHT,sq_GetDistancePos(sq_GetXPos(obj), ENUM_DIRECTION_RIGHT, offsetX[i]),sq_GetYPos(obj),sq_GetZPos(obj) + offsetZ[i],ENUM_DRAWLAYER_NORMAL);
|
||
|
|
obj.getVar("effect").push_obj_vector(pooledObj);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_SetCurrentAnimation(ANI_BYKK_NICOLASBEHAVIOR_END_BODY);
|
||
|
|
obj.sq_PlaySound("TF_NICOLAS_OBEY");
|
||
|
|
local size = obj.getVar("effect").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local pooledObj = obj.getVar("effect").get_obj_vector(i);
|
||
|
|
if(pooledObj) pooledObj.setValid(false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, APDPATH_NICOLAS_TOCHR);
|
||
|
|
if(addAppendage){//92近战 93远程 94守护
|
||
|
|
local sub = obj.getVar("NicolasBehavior_Sub").getInt(0);
|
||
|
|
if(sub > 0){
|
||
|
|
if(sub > 10) addAppendage.setBuffIconImage(sub + 81);
|
||
|
|
else addAppendage.setBuffIconImage(sub + 91);
|
||
|
|
}
|
||
|
|
local nicolasObj = obj.getVar("NicolasObj").get_obj_vector(0);
|
||
|
|
if(nicolasObj){
|
||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(nicolasObj);
|
||
|
|
local addAppendage2 = CNSquirrelAppendage.sq_GetAppendage(activeObj, APDPATH_NICOLAS);
|
||
|
|
addAppendage2.getVar("custom").setInt(0, sub);
|
||
|
|
switch(sub){
|
||
|
|
case 1:
|
||
|
|
case 11:
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_NICOLASBEHAVIOR);
|
||
|
|
local phyDefense = sq_GetLevelData(obj, SKILL_BYKK_NICOLASBEHAVIOR, 4, skillLevel);
|
||
|
|
local mglDefense = sq_GetLevelData(obj, SKILL_BYKK_NICOLASBEHAVIOR, 5, skillLevel);
|
||
|
|
local change_appendage2 = addAppendage2.sq_getChangeStatus("nicolas");
|
||
|
|
if(!change_appendage2) change_appendage2 = addAppendage2.sq_AddChangeStatus("nicolas",activeObj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000);
|
||
|
|
if(change_appendage2){
|
||
|
|
change_appendage2.clearParameter();
|
||
|
|
change_appendage2.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_DEFENSE, true, (phyDefense).tofloat());
|
||
|
|
change_appendage2.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_DEFENSE, true, (mglDefense).tofloat());
|
||
|
|
}
|
||
|
|
local change_appendage = addAppendage.sq_getChangeStatus("nicolas_tochr");
|
||
|
|
if(change_appendage) change_appendage.clearParameter();
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
case 12:
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_NICOLASBEHAVIOR);
|
||
|
|
local spiBonusRate = sq_GetLevelData(obj, SKILL_BYKK_NICOLASBEHAVIOR, 6, skillLevel);
|
||
|
|
local araBonusRate = sq_GetLevelData(obj, SKILL_BYKK_NICOLASBEHAVIOR, 7, skillLevel);
|
||
|
|
addAppendage2.getVar("custom").setInt(1, spiBonusRate);
|
||
|
|
addAppendage2.getVar("custom").setInt(2, araBonusRate);
|
||
|
|
|
||
|
|
local change_appendage = addAppendage.sq_getChangeStatus("nicolas_tochr");
|
||
|
|
if(change_appendage) change_appendage.clearParameter();
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
case 13:
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_NICOLASBEHAVIOR);
|
||
|
|
local phyDefense = sq_GetLevelData(obj, SKILL_BYKK_NICOLASBEHAVIOR, 8, skillLevel);
|
||
|
|
local mglDefense = sq_GetLevelData(obj, SKILL_BYKK_NICOLASBEHAVIOR, 9, skillLevel);
|
||
|
|
local change_appendage = addAppendage.sq_getChangeStatus("nicolas_tochr");
|
||
|
|
if(!change_appendage) change_appendage = addAppendage.sq_AddChangeStatus("nicolas_tochr",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000);
|
||
|
|
if(change_appendage){
|
||
|
|
change_appendage.clearParameter();
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_DEFENSE, false, (phyDefense).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_DEFENSE, false, (mglDefense).tofloat());
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_NicolasBehavior(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_NICOLASBEHAVIOR, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_NicolasBehavior(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 1:
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL)){//远程
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_SUMMONNICOLASEX) > 0) obj.getVar("NicolasBehavior_Sub").setInt(0, 12);
|
||
|
|
else obj.getVar("NicolasBehavior_Sub").setInt(0, 2);
|
||
|
|
local nicolasBehaviorObj = obj.getVar("NicolasBehavior_obj").get_obj_vector(0);
|
||
|
|
if(nicolasBehaviorObj) nicolasBehaviorObj.setValid(false);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_NICOLASBEHAVIOR, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
}
|
||
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL)){//守护
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_SUMMONNICOLASEX) > 0) obj.getVar("NicolasBehavior_Sub").setInt(0, 13);
|
||
|
|
else obj.getVar("NicolasBehavior_Sub").setInt(0, 3);
|
||
|
|
sq_SendCreatePassiveObjectPacket(obj, 1008611, 0, 0, 0, 0, obj.getDirection());
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_NICOLASBEHAVIOR, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
}
|
||
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL)){//近战
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_SUMMONNICOLASEX) > 0) obj.getVar("NicolasBehavior_Sub").setInt(0, 11);
|
||
|
|
else obj.getVar("NicolasBehavior_Sub").setInt(0, 1);
|
||
|
|
local nicolasBehaviorObj = obj.getVar("NicolasBehavior_obj").get_obj_vector(0);
|
||
|
|
if(nicolasBehaviorObj) nicolasBehaviorObj.setValid(false);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_NICOLASBEHAVIOR, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
}
|
||
|
|
local stateTime = obj.sq_GetStateTimer();
|
||
|
|
if(stateTime >= 2000){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_NicolasBehavior(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_NicolasBehavior(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_NicolasBehavior(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(new_state != SKILL_BYKK_NICOLASBEHAVIOR){
|
||
|
|
local size = obj.getVar("effect").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local pooledObj = obj.getVar("effect").get_obj_vector(i);
|
||
|
|
if(pooledObj) pooledObj.setValid(false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onCreateObject_NicolasBehavior(obj, createObject)
|
||
|
|
{
|
||
|
|
if(createObject.isObjectType(OBJECTTYPE_PASSIVE)){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(createObject);
|
||
|
|
local id = colObj.getCollisionObjectIndex();
|
||
|
|
if(id == 1008611){
|
||
|
|
sq_moveWithParent(obj, colObj);
|
||
|
|
obj.getVar("NicolasBehavior_obj").clear_obj_vector();
|
||
|
|
obj.getVar("NicolasBehavior_obj").push_obj_vector(colObj);
|
||
|
|
print("test");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//驱使僵尸
|
||
|
|
function checkExecutableSkill_NicolasSummonZombie(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_NICOLASSUMMONZOMBIE);
|
||
|
|
if (isUse){
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_KEYOFACERON) > 0){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_NICOLASSUMMONZOMBIE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
local size = obj.getVar("NicolasObj").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
local nicolasObj = obj.getVar("NicolasObj").get_obj_vector(0);
|
||
|
|
if(nicolasObj){
|
||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(nicolasObj);
|
||
|
|
monsterattack_Thief_Necromancer_ksk(activeObj,2);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local state = obj.getState();
|
||
|
|
switch(state){
|
||
|
|
case STATE_STAND:
|
||
|
|
case STATE_DASH:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_NicolasSummonZombie(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_NicolasSummonZombie(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_BYKK_SUMMONZOMBIE_ACHERON);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_NicolasSummonZombie(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_NicolasSummonZombie(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_NicolasSummonZombie(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 1:
|
||
|
|
local level = sq_GetSkillLevel(obj, 174);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_NICOLASSUMMONZOMBIE);
|
||
|
|
local summonTime = sq_GetLevelData(obj, SKILL_BYKK_NICOLASSUMMONZOMBIE, 9, skillLevel);
|
||
|
|
local summonMax = sq_GetLevelData(obj, SKILL_BYKK_NICOLASSUMMONZOMBIE, 11, skillLevel);
|
||
|
|
for(local i = 0; i < summonMax; i++){
|
||
|
|
summonmonster_necromancer_bykk(obj,obj,150+sq_getRandom(-15,15),sq_getRandom(-15,15),0,0,MONSTER_ID_ZOMBIE,summonTime,level,0);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_NicolasSummonZombie(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_NicolasSummonZombie(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSourceKeyFrameFlag_appendage_zombie(appendage,flagIndex)
|
||
|
|
{
|
||
|
|
if(!appendage) return;
|
||
|
|
local parentObj = appendage.getParent();
|
||
|
|
if(!parentObj){
|
||
|
|
appendage.setValid(false);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
local sqrChr = sq_GetCNRDObjectToSQRCharacter(appendage.getVar("sqrChr").get_obj_vector(0));
|
||
|
|
if(!sqrChr) return true;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 101:
|
||
|
|
//撕咬
|
||
|
|
parentObj.getVar("tar").clear_obj_vector();
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, -1, 2, 1.0) + 100;
|
||
|
|
if(appendage.getVar("custom").getInt(0) == appendage.getVar("custom").getInt(1) - 1) totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, -1, 3, 1.0) + 100;
|
||
|
|
local skillLevel = sq_GetSkillLevel(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE);
|
||
|
|
local level = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, 7, skillLevel);
|
||
|
|
local time = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, 6, skillLevel);
|
||
|
|
local prob = sq_GetLevelData(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, 5, skillLevel);
|
||
|
|
local group = sq_GetGroup(parentObj);
|
||
|
|
local uniqueId = sq_GetUniqueId(parentObj);
|
||
|
|
createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,0,parentObj.getDirection(),2,SKILL_BYKK_NICOLASSUMMONZOMBIE,2,totalDamage,level,time,prob,group,uniqueId,0,0);
|
||
|
|
break;
|
||
|
|
case 103:
|
||
|
|
if(parentObj.getVar("tar").get_obj_vector_size() > 0) monsterattack_Thief_Necromancer_ksk(parentObj, 1);
|
||
|
|
break;
|
||
|
|
case 202: monsterattack_Thief_Necromancer_ksk(parentObj, 2); break;
|
||
|
|
case 303:
|
||
|
|
if(appendage.getVar("custom").getInt(0) == appendage.getVar("custom").getInt(1) - 1){
|
||
|
|
//爆炸
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, -1, 12, 1.0) + 100;
|
||
|
|
local sizeRate = sq_GetBonusRateWithPassive(sqrChr, SKILL_BYKK_NICOLASSUMMONZOMBIE, -1, 14, 1.0) + 100;
|
||
|
|
createSkillPassive_Theif_bykk(sqrChr,parentObj,PASSIVEOBJ_NUM_THIEF,0,0,sq_GetHeightObject(parentObj) / 2,parentObj.getDirection(),2,SKILL_BYKK_NICOLASSUMMONZOMBIE,3,totalDamage,sizeRate,0,0,0,0,0,0);
|
||
|
|
parentObj.setValid(false);
|
||
|
|
}
|
||
|
|
else appendage.getVar("custom").setInt(0, appendage.getVar("custom").getInt(0) + 1);
|
||
|
|
local size = parentObj.getVar("tar").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = parentObj.getVar("tar").get_obj_vector(i);
|
||
|
|
if(targetObj) CNSquirrelAppendage.sq_RemoveAppendage(targetObj, APDPATH_ZOMBIE_HOLD);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function proc_appendage_zombie(appendage)
|
||
|
|
{
|
||
|
|
if (!appendage) return;
|
||
|
|
local parentObj = appendage.getParent();
|
||
|
|
local sqrChr = sq_GetCNRDObjectToSQRCharacter(appendage.getVar("sqrChr").get_obj_vector(0));
|
||
|
|
if((!sqrChr || sqrChr.getState() == STATE_DIE) || (!parentObj || parentObj.getState() == STATE_DIE)){
|
||
|
|
appendage.setValid(false);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(!sq_IsMyControlObject(sqrChr)) return;
|
||
|
|
|
||
|
|
local t_01 = appendage.getVar("skill_1").get_timer_vector(0);
|
||
|
|
local currentT = appendage.getTimer().Get();
|
||
|
|
|
||
|
|
local state = parentObj.getState();
|
||
|
|
switch(state){
|
||
|
|
case STATE_STAND:
|
||
|
|
local timer = appendage.getVar("atktime").get_ct_vector(0);
|
||
|
|
local currentTT = timer.Get();
|
||
|
|
if(currentTT < ATK_TIME) return;
|
||
|
|
timer.Reset();
|
||
|
|
timer.Start(10000,0);
|
||
|
|
|
||
|
|
local targetObj = sq_FindTarget( parentObj, 0, 1000, 800, 350);
|
||
|
|
if(targetObj){
|
||
|
|
parentObj.getVar("targetObj").clear_obj_vector();
|
||
|
|
parentObj.getVar("targetObj").push_obj_vector(targetObj);
|
||
|
|
if(t_01 && t_01.isOnEvent(currentT)){
|
||
|
|
if(sq_IsMyControlObject(parentObj)){
|
||
|
|
if(sq_Abs(targetObj.getXPos() - parentObj.getXPos()) <= 90 && sq_Abs(targetObj.getXPos() - parentObj.getXPos()) >= 0 && sq_Abs(targetObj.getYPos() - parentObj.getYPos()) <= 18){
|
||
|
|
monsterattack_Thief_Necromancer_ksk(parentObj, 0);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
targetObj = sq_FindTarget( parentObj, -1000, 1000, 800, 350);
|
||
|
|
if(targetObj){
|
||
|
|
sq_SetCurrentDirection(parentObj, sq_GetOppositeDirection(sq_GetDirection(parentObj)));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case STATE_ATTACK:
|
||
|
|
local attackIndex = parentObj.getAttackIndex();
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onStart_appendage_zombie(appendage)
|
||
|
|
{
|
||
|
|
if (!appendage) return;
|
||
|
|
|
||
|
|
appendage.getVar("atktime").clear_ct_vector();
|
||
|
|
appendage.getVar("atktime").push_ct_vector();
|
||
|
|
local timer = appendage.getVar("atktime").get_ct_vector(0);
|
||
|
|
timer.Reset();
|
||
|
|
timer.Start(10000,0);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEnd_appendage_zombie(appendage)
|
||
|
|
{
|
||
|
|
if (!appendage) return;
|
||
|
|
|
||
|
|
local parentObj = appendage.getParent();
|
||
|
|
if(!parentObj) return;
|
||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(parentObj);
|
||
|
|
sq_IntVectorClear(sq_GetGlobalIntVector());
|
||
|
|
sq_AddSetStatePacketActiveObject(activeObj, 12, sq_GetGlobalIntVector(), STATE_PRIORITY_USER);
|
||
|
|
}
|
||
|
|
|
||
|
|
//暗影蛛丝阵
|
||
|
|
function checkExecutableSkill_NicolasBlackArea(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local size = obj.getVar("NicolasObj").get_obj_vector_size();
|
||
|
|
if(size < 1) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_NICOLASBLACKAREA);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_NICOLASBLACKAREA);
|
||
|
|
local nicolasObj = obj.getVar("NicolasObj").get_obj_vector(0);
|
||
|
|
if(nicolasObj){
|
||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(nicolasObj);
|
||
|
|
monsterattack_Thief_Necromancer_ksk(activeObj,5);
|
||
|
|
}
|
||
|
|
local state = obj.getState();
|
||
|
|
switch(state){
|
||
|
|
case STATE_STAND:
|
||
|
|
case STATE_DASH:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_NicolasBlackArea(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_NicolasBlackArea(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(109);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(110);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_NicolasBlackArea(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_NicolasBlackArea(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_NicolasBlackArea(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_NicolasBlackArea(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_NicolasBlackArea(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//死亡之爪
|
||
|
|
function checkExecutableSkill_DarkNail(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_DARKNAIL);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_DARKNAIL, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_DarkNail(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_DarkNail(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_BYKK_DARKNAIL);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKNAIL, -1, 3, 1.0) + 100;
|
||
|
|
local sizeRate = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKNAIL, -1, 2, 1.0) + 100;
|
||
|
|
local speedRate = 8000 / currentAni.getDelaySum(0, 0);
|
||
|
|
createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,0,0,0,obj.getDirection(),2,SKILL_BYKK_DARKNAIL,1,totalDamage,sizeRate,speedRate,0,0,0,0,0);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_DarkNail(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_DarkNail(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_DarkNail(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_DarkNail(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_DarkNail(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//暗黑仪式
|
||
|
|
function checkExecutableSkill_DarkRitual(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_DARKRITUAL);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_DARKRITUAL, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_DarkRitual(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_DarkRitual(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_BYKK_DARKRITUAL);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
sq_SetFrameDelayTime(currentAni, 0, 80);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_DarkRitual(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_DarkRitual(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_DarkRitual(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 1:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DARKRITUAL)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_DARKRITUAL);
|
||
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, APDPATH_DARKRITUAL, true);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_DARKRITUAL);
|
||
|
|
local buffTime = sq_GetLevelData(obj, SKILL_BYKK_DARKRITUAL, 1, skillLevel);
|
||
|
|
if(buffTime > 0) AddAppendage.sq_SetValidTime(buffTime);
|
||
|
|
AddAppendage.setEnableIsBuff(true);
|
||
|
|
AddAppendage.setBuffIconImage(112);
|
||
|
|
AddAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_BYKK_DARKRITUAL, skillLevel);
|
||
|
|
CNSquirrelAppendage.sq_Append(AddAppendage, obj, obj, true);
|
||
|
|
setSkillBonusRate_NecroMancer_bykk(obj);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_DarkRitual(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_DarkRitual(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function proc_appendage_darkritual_tochr(appendage)
|
||
|
|
{
|
||
|
|
if(!appendage) return;
|
||
|
|
local parentObj = appendage.getParent();
|
||
|
|
if(!parentObj || parentObj.getState() == STATE_DIE){
|
||
|
|
appendage.setValid(false);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEnd_appendage_darkritual_tochr(appendage)
|
||
|
|
{
|
||
|
|
if(!appendage) return;
|
||
|
|
local parentObj = appendage.getParent();
|
||
|
|
local obj = sq_GetCNRDObjectToSQRCharacter(parentObj);
|
||
|
|
if(obj && obj.getState() != STATE_DIE){
|
||
|
|
setSkillBonusRate_NecroMancer_bykk(obj);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function setSkillBonusRate_NecroMancer_bykk(obj)
|
||
|
|
{
|
||
|
|
local bonusRate = 1000;
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DARKRITUAL)) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_DARKRITUAL, 0, sq_GetSkillLevel(obj, SKILL_BYKK_DARKRITUAL))) / 1000;
|
||
|
|
print("bonusRate1 = "+bonusRate);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_GRIMGRIMOIRE) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_GRIMGRIMOIRE, 13, sq_GetSkillLevel(obj, SKILL_BYKK_GRIMGRIMOIRE))) / 1000;
|
||
|
|
print("bonusRate2 = "+bonusRate);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_KEYOFACERON) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_KEYOFACERON, 0, sq_GetSkillLevel(obj, SKILL_BYKK_KEYOFACERON))) / 1000;
|
||
|
|
print("bonusRate3 = "+bonusRate);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_RINGOFDARKNESS) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_RINGOFDARKNESS, 0, sq_GetSkillLevel(obj, SKILL_BYKK_RINGOFDARKNESS))) / 1000;
|
||
|
|
print("bonusRate4 = "+bonusRate);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_SACRIFICIALPACT) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_SACRIFICIALPACT, 1, sq_GetSkillLevel(obj, SKILL_BYKK_SACRIFICIALPACT))) / 1000;
|
||
|
|
print("bonusRate5 = "+bonusRate);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_UNHOLYAURA) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_BYKK_UNHOLYAURA, 2, sq_GetSkillLevel(obj, SKILL_BYKK_UNHOLYAURA))) / 1000;
|
||
|
|
print("bonusRate6 = "+bonusRate);
|
||
|
|
obj.getVar("setSkillBonusRate").setInt(0, bonusRate.tointeger());
|
||
|
|
//sq_SetSkillAttackBonus(obj, bonusRate);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onStartDungeon_NecroMancer_bykk(obj)
|
||
|
|
{
|
||
|
|
setSkillBonusRate_NecroMancer_bykk(obj);
|
||
|
|
}
|
||
|
|
|
||
|
|
//百鬼夜行
|
||
|
|
function checkExecutableSkill_DarkLure(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local size = obj.getVar("darklure_obj").get_obj_vector_size();
|
||
|
|
if(size > 0 && sq_GetSkill(obj, SKILL_BYKK_DARKLURE).isInCoolTime()){
|
||
|
|
local attackObj = obj.getVar("darklure_obj").get_obj_vector(0);
|
||
|
|
if(attackObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(attackObj);
|
||
|
|
colObj.removeAllTimeEvent();
|
||
|
|
if(sq_GetZPos(colObj) > 0) colObj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, "");
|
||
|
|
else colObj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, "");
|
||
|
|
}
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == 0 || state == 14){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, false);
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_DARKLURE);
|
||
|
|
if (isUse){
|
||
|
|
obj.getVar("darklure_obj").clear_obj_vector();
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_DARKLURE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_DarkLure(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_DarkLure(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
local Ani = obj.sq_GetThrowChargeAni(0);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local Ani = obj.sq_GetThrowShootAni(0);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_DarkLure(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_DARKLURE, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_DARKLURE, -1, 0, 1.0) + 100;
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_DARKLURE);
|
||
|
|
local lifeTime = sq_GetIntData(obj, SKILL_BYKK_DARKLURE, 0);
|
||
|
|
local hitTime = sq_GetIntData(obj, SKILL_BYKK_DARKLURE, 2);
|
||
|
|
local increaseRate = sq_GetLevelData(obj, SKILL_BYKK_DARKLURE, 2, skillLevel);
|
||
|
|
local increaseRate_cur = sq_GetLevelData(obj, SKILL_BYKK_DARKLURE, 3, skillLevel);
|
||
|
|
local sizeRate = sq_GetLevelData(obj, SKILL_BYKK_DARKLURE, 7, skillLevel);
|
||
|
|
local autoTime = sq_GetLevelData(obj, SKILL_BYKK_DARKLURE, 5, skillLevel) * 10;
|
||
|
|
createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,75,0,50,obj.getDirection(),2,SKILL_BYKK_DARKLURE,1,totalDamage,lifeTime,hitTime,increaseRate,increaseRate_cur,sizeRate,autoTime,0);
|
||
|
|
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_DarkLure(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_DarkLure(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_DarkLure(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_DarkLure(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//死灵之怨
|
||
|
|
function checkExecutableSkill_BlameOfDead(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_BLAMEOFDEAD);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BLAMEOFDEAD, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_BlameOfDead(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_BlameOfDead(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_BYKK_BLAMEOFDEAD);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_BlameOfDead(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_BlameOfDead(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_BlameOfDead(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 1:
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_BLAMEOFDEAD, -1, 0, 1.0) + 100;
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_BLAMEOFDEAD);
|
||
|
|
local lifeTime = sq_GetLevelData(obj, SKILL_BYKK_BLAMEOFDEAD, 6, skillLevel);
|
||
|
|
local hitMax = sq_GetIntData(obj, SKILL_BYKK_BLAMEOFDEAD, 1);
|
||
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_BLAMEOFDEAD, 0) + 30;
|
||
|
|
createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,0,0,0,obj.getDirection(),2,SKILL_BYKK_BLAMEOFDEAD,1,totalDamage,lifeTime,hitMax,sizeRate,0,0,0,0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_BlameOfDead(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_BlameOfDead(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//降临:暴君巴拉克
|
||
|
|
function checkExecutableSkill_ApportBallacre(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
colObj.setTimeEvent(1, 1000, 1, true);
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_BALLACRE_TOCHR);
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == STATE_STAND || state == STATE_DASH){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_APPORTBALLACRE);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_APPORTBALLACRE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_ApportBallacre(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(obj.getVar("ballacreObj").get_obj_vector_size() > 0) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_ApportBallacre(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_BYKK_BALLACRECAST);
|
||
|
|
break;
|
||
|
|
case 1: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_PIERCE); break;
|
||
|
|
case 2: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_SWINGRL); break;
|
||
|
|
case 3: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_HAND_PIERCE); break;
|
||
|
|
case 4: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_SWING_DOWN); break;
|
||
|
|
case 5: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_DASH_UPPER); break;
|
||
|
|
}
|
||
|
|
if(subState > 0){
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(0, 0);
|
||
|
|
local speedRate = 100.0;
|
||
|
|
switch(subState){
|
||
|
|
case 1: speedRate = 10000.0 / delay.tofloat(); break;
|
||
|
|
case 2: speedRate = 12000.0 / delay.tofloat(); break;
|
||
|
|
case 3: speedRate = 10000.0 / delay.tofloat(); break;
|
||
|
|
case 4: speedRate = 20000.0 / delay.tofloat(); break;
|
||
|
|
case 5: speedRate = 20000.0 / delay.tofloat(); break;
|
||
|
|
}
|
||
|
|
local attackState = [22,23,24,25,27];
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
colObj.getVar("setSpeedRate").setFloat(0, speedRate);
|
||
|
|
colObj.addSetStatePacket(attackState[subState - 1], null, STATE_PRIORITY_IGNORE_FORCE, false, "");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_ApportBallacre(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 1:
|
||
|
|
case 2:
|
||
|
|
case 3:
|
||
|
|
case 4:
|
||
|
|
case 5:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProc_ApportBallacre(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 4:
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
if(colObj.getState() >= 26) break;
|
||
|
|
}
|
||
|
|
case 1:
|
||
|
|
case 2:
|
||
|
|
case 3:
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL) && sq_IsKeyDown(OPTION_HOTKEY_JUMP, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(200);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_JUMP, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
}
|
||
|
|
local startFrame = [5, 5, 8, 5];
|
||
|
|
local frameIndex = sq_GetCurrentFrameIndex(obj);
|
||
|
|
if(frameIndex >= startFrame[subState - 1]){
|
||
|
|
sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
|
||
|
|
if(sq_IsEnterCommand(obj, E_ATTACK_COMMAND)){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(subState == 4) obj.sq_IntVectPush(1);
|
||
|
|
else obj.sq_IntVectPush(subState + 1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_APPORTBALLACRE, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_ApportBallacre(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 101:
|
||
|
|
setBallacreSkillEffet_bykk(obj);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_ApportBallacre(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_ApportBallacre(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function setBallacreSkillEffet_bykk(obj)
|
||
|
|
{
|
||
|
|
local size = obj.getVar("ballacreObj").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local aObj = obj.getVar("ballacreObj").get_obj_vector(i);
|
||
|
|
if(aObj) aObj.setValid(false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
obj.getVar("ballacreObj").clear_obj_vector();
|
||
|
|
obj.sq_PlaySound("R_TF_APPORT_BALLACRE");
|
||
|
|
obj.sq_PlaySound("BAL_SUMMON");
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_APPORTBALLACRE);
|
||
|
|
local phyDefense = sq_GetLevelData(obj, SKILL_BYKK_APPORTBALLACRE, 3, skillLevel);
|
||
|
|
local mglDefense = sq_GetLevelData(obj, SKILL_BYKK_APPORTBALLACRE, 4, skillLevel);
|
||
|
|
local darkTol = sq_GetIntData(obj, SKILL_BYKK_APPORTBALLACRE, 2);
|
||
|
|
local lightTol = sq_GetIntData(obj, SKILL_BYKK_APPORTBALLACRE, 3);
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_BALLACRE_TOCHR);
|
||
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, APDPATH_BALLACRE_TOCHR, true);
|
||
|
|
AddAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_BYKK_APPORTBALLACRE, skillLevel);
|
||
|
|
CNSquirrelAppendage.sq_Append(AddAppendage, obj, obj, true);
|
||
|
|
|
||
|
|
local change_appendage = AddAppendage.sq_getChangeStatus("apportballacre");
|
||
|
|
if(!change_appendage) change_appendage = AddAppendage.sq_AddChangeStatus("apportballacre", obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000);
|
||
|
|
if(change_appendage){
|
||
|
|
change_appendage.clearParameter();
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_DEFENSE, true, (phyDefense * 0.1).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_DEFENSE , true, (mglDefense * 0.1).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_ELEMENT_TOLERANCE_DARK, false, (darkTol).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_ELEMENT_TOLERANCE_LIGHT, false, (lightTol * -1).tofloat());
|
||
|
|
}
|
||
|
|
|
||
|
|
createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,-25,-1,0,obj.getDirection(),2,SKILL_BYKK_APPORTBALLACRE,1,0,0,0,0,0,0,0,0);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function getAttackAni_Thief_necromancer(obj, index)
|
||
|
|
{
|
||
|
|
local animation = obj.sq_GetAttackAni(index);
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)){
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
if(colObj.getState() >= 25) return animation;
|
||
|
|
}
|
||
|
|
switch(index){
|
||
|
|
case 0: animation = obj.sq_GetCustomAni(ANI_BYKK_BALLACRE_PIERCE); break;
|
||
|
|
case 1: animation = obj.sq_GetCustomAni(ANI_BYKK_BALLACRE_SWINGRL); break;
|
||
|
|
case 2: animation = obj.sq_GetCustomAni(ANI_BYKK_BALLACRE_HAND_PIERCE); break;
|
||
|
|
case 3: animation = obj.sq_GetCustomAni(ANI_BYKK_BALLACRE_SWING_DOWN); break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return animation;
|
||
|
|
}
|
||
|
|
|
||
|
|
function getDashAttackAni_Thief_necromancer(obj)
|
||
|
|
{
|
||
|
|
local animation = obj.sq_GetDashAttackAni();
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR) && !sq_GetSkill(obj, SKILL_BYKK_GRABCOLLAR).isInCoolTime()){
|
||
|
|
animation = obj.sq_GetCustomAni(ANI_BYKK_BALLACRE_DASH_UPPER);
|
||
|
|
}
|
||
|
|
return animation;
|
||
|
|
}
|
||
|
|
|
||
|
|
function getJumpAttackAni_Thief_necromancer(obj)
|
||
|
|
{
|
||
|
|
local animation = obj.sq_GetJumpAttackAni();
|
||
|
|
return animation;
|
||
|
|
}
|
||
|
|
|
||
|
|
function getRestAni_Thief_necromancer(obj)
|
||
|
|
{
|
||
|
|
local animation = obj.sq_GetRestAni();
|
||
|
|
return animation;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_attack_thief_necromancer(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)){
|
||
|
|
obj.getVar("ballacre_move").setInt(0, sq_GetXPos(obj));
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
local state = colObj.getState();
|
||
|
|
if(state >= 26) return;
|
||
|
|
}
|
||
|
|
local attackIndex = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
switch(attackIndex){
|
||
|
|
case 0: obj.sq_IntVectPush(1); break;
|
||
|
|
case 1: obj.sq_IntVectPush(2); break;
|
||
|
|
case 2: obj.sq_IntVectPush(3); break;
|
||
|
|
case 3: obj.sq_IntVectPush(4); break;
|
||
|
|
}
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_APPORTBALLACRE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onAfterSetState_attack_thief_necromancer(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
// if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)){
|
||
|
|
// local attackIndex = obj.sq_GetVectorData(datas, 0);
|
||
|
|
// if(attackIndex == 0){
|
||
|
|
// obj.sq_IntVectClear();
|
||
|
|
// obj.sq_IntVectPush(1);
|
||
|
|
// obj.sq_AddSetStatePacket(STATE_BYKK_APPORTBALLACRE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
// }
|
||
|
|
// // if(attackIndex > 3){
|
||
|
|
// // obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
// // return;
|
||
|
|
// // }
|
||
|
|
// // obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 0.75, 0.75);
|
||
|
|
// // local currentAni = obj.getCurrentAnimation();
|
||
|
|
// // local delay = currentAni.getDelaySum(0, 0);
|
||
|
|
// // local speedRate = 100.0;
|
||
|
|
// // switch(attackIndex){
|
||
|
|
// // case 0: speedRate = 10000.0 / delay.tofloat(); break;
|
||
|
|
// // case 1: speedRate = 12000.0 / delay.tofloat(); break;
|
||
|
|
// // case 2: speedRate = 10000.0 / delay.tofloat(); break;
|
||
|
|
// // case 3: speedRate = 20000.0 / delay.tofloat(); break;
|
||
|
|
// // }
|
||
|
|
// // print("attackIndex = "+attackIndex+",speedRate = "+speedRate);
|
||
|
|
// // local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
// // obj.getVar("ballacre_move").setInt(0, sq_GetXPos(obj));
|
||
|
|
// // if(ballacreObj){
|
||
|
|
// // local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
// // if(colObj.getState() >= 25) return;
|
||
|
|
// // colObj.getVar("setSpeedRate").setFloat(0, speedRate);
|
||
|
|
// // switch(attackIndex){
|
||
|
|
// // case 0: colObj.addSetStatePacket(22, null, STATE_PRIORITY_IGNORE_FORCE, false, ""); break;
|
||
|
|
// // case 1: colObj.addSetStatePacket(23, null, STATE_PRIORITY_IGNORE_FORCE, false, ""); break;
|
||
|
|
// // case 2: colObj.addSetStatePacket(24, null, STATE_PRIORITY_IGNORE_FORCE, false, ""); break;
|
||
|
|
// // case 3: colObj.addSetStatePacket(25, null, STATE_PRIORITY_IGNORE_FORCE, false, ""); break;
|
||
|
|
// // }
|
||
|
|
// // }
|
||
|
|
// }
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_attack_thief_necromancer(obj, flagIndex)
|
||
|
|
{}
|
||
|
|
|
||
|
|
function onProc_attack_thief_necromancer(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)){
|
||
|
|
sq_setCurrentAxisPos(obj, 0, obj.getVar("ballacre_move").getInt(0));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_dashattack_thief_necromancer(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)){
|
||
|
|
if(!sq_GetSkill(obj, SKILL_BYKK_GRABCOLLAR).isInCoolTime()){
|
||
|
|
obj.startSkillCoolTime(SKILL_BYKK_GRABCOLLAR, sq_GetSkillLevel(obj, SKILL_BYKK_GRABCOLLAR), -1);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(5);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_APPORTBALLACRE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onAfterSetState_dashattack_thief_necromancer(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
// if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)){
|
||
|
|
// obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 0.5, 0.5);
|
||
|
|
// local currentAni = obj.getCurrentAnimation();
|
||
|
|
// local delay = currentAni.getDelaySum(0, 0);
|
||
|
|
// local speedRate = 10000.0 / delay.tofloat();
|
||
|
|
// print("delay = "+currentAni.getDelaySum(false));
|
||
|
|
// obj.getVar("ballacre_speedRate").setFloat(4, speedRate);
|
||
|
|
// }
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_dashattack_thief_necromancer(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_dashattack_thief_necromancer(obj, flagIndex)
|
||
|
|
{}
|
||
|
|
|
||
|
|
function onSetState_jumpattack_thief_necromancer(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_BALLACRE_TOCHR)){
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
if(colObj.getState() != 26) colObj.addSetStatePacket(26, null, STATE_PRIORITY_IGNORE_FORCE, false, "");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onAfterSetState_jumpattack_thief_necromancer(obj, state, datas, isResetTimer)
|
||
|
|
{}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_jumpattack_thief_necromancer(obj, flagIndex)
|
||
|
|
{}
|
||
|
|
|
||
|
|
|
||
|
|
//吸魂暗劲波
|
||
|
|
function checkExecutableSkill_NicolasBlackWave(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local size = obj.getVar("NicolasObj").get_obj_vector_size();
|
||
|
|
if(size < 1) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_NICOLASBLACKWAVE);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_NICOLASBLACKWAVE);
|
||
|
|
local nicolasObj = obj.getVar("NicolasObj").get_obj_vector(0);
|
||
|
|
if(nicolasObj){
|
||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(nicolasObj);
|
||
|
|
monsterattack_Thief_Necromancer_ksk(activeObj,3);
|
||
|
|
}
|
||
|
|
local state = obj.getState();
|
||
|
|
switch(state){
|
||
|
|
case STATE_STAND:
|
||
|
|
case STATE_DASH:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_NicolasBlackWave(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_NicolasBlackWave(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(109);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(110);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_NicolasBlackWave(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_NicolasBlackWave(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_NicolasBlackWave(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_NicolasBlackWave(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_NicolasBlackWave(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//巴拉克的野心
|
||
|
|
function checkExecutableSkill_AmbitionOfBallacre(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
if(colObj.getState() > 25){
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == STATE_STAND || state == STATE_DASH){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_AMBITIONOFBALLACRE);
|
||
|
|
if (isUse){
|
||
|
|
obj.getVar("ambitionObj").clear_obj_vector();
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_AMBITIONOFBALLACRE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_AmbitionOfBallacre(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_AmbitionOfBallacre(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_BYKK_BALLACRE_HAND_APPEAR); break;
|
||
|
|
case 1: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_HAND_GRAB); break;
|
||
|
|
case 2: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_HAND_APPEAR); break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 0.75, 0.75);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(0, 0);
|
||
|
|
local speedRate = 8000.0 / delay.tofloat();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
local delayTime = currentAni.getDelaySum(0, 6) + sq_GetIntData(obj, SKILL_BYKK_AMBITIONOFBALLACRE, 1);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_SACRIFICIALPACT) > 0) delayTime = currentAni.getDelaySum(0, 6) + 200;
|
||
|
|
local delay = (delayTime.tofloat() / speedRate * 100.0).tointeger();
|
||
|
|
obj.setTimeEvent(1, delay, 1, false);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local ambitionObj = obj.getVar("ambitionObj").get_obj_vector(0);
|
||
|
|
if(ambitionObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ambitionObj);
|
||
|
|
colObj.getVar("setSpeedRate").setFloat(0, speedRate);
|
||
|
|
colObj.addSetStatePacket(21, null, STATE_PRIORITY_IGNORE_FORCE, false, "");
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
local delay = (740.0 / speedRate * 100.0).tointeger();
|
||
|
|
obj.setTimeEvent(2, delay, 1, false);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
local attackState = [31, 32, 33];
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
colObj.getVar("setSpeedRate").setFloat(0, speedRate);
|
||
|
|
colObj.addSetStatePacket(attackState[subState], null, STATE_PRIORITY_IGNORE_FORCE, false, "");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_AmbitionOfBallacre(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_AMBITIONOFBALLACRE, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
case 2:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_AmbitionOfBallacre(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(sq_GetCurrentFrameIndex(obj) == 7 && obj.isExistTimeEvent(1)){
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_AMBITIONOFBALLACRE, true);
|
||
|
|
local b_useskill = obj.sq_IsEnterSkill(SKILL_BYKK_AMBITIONOFBALLACRE);
|
||
|
|
if(b_useskill != -1){
|
||
|
|
obj.stopTimeEvent(1);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_AMBITIONOFBALLACRE, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_AmbitionOfBallacre(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_AmbitionOfBallacre(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_AMBITIONOFBALLACRE, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_AmbitionOfBallacre(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 1:
|
||
|
|
if(new_state != STATE_BYKK_AMBITIONOFBALLACRE){
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
colObj.addSetStatePacket(21, null, STATE_PRIORITY_IGNORE_FORCE, false, "");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//暗击拳
|
||
|
|
function checkExecutableSkill_Grabcollar(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
// local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CROSSOFPUNISHMENT);
|
||
|
|
// if (isUse){
|
||
|
|
// obj.sq_IntVectClear();
|
||
|
|
// obj.sq_IntVectPush(0);
|
||
|
|
// obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
// return true;
|
||
|
|
// }
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Grabcollar(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Grabcollar(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(109);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(110);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_Grabcollar(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_Grabcollar(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Grabcollar(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Grabcollar(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Grabcollar(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//杀戮乱舞
|
||
|
|
function checkExecutableSkill_Madnessballacre(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
// local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CROSSOFPUNISHMENT);
|
||
|
|
// if (isUse){
|
||
|
|
// obj.sq_IntVectClear();
|
||
|
|
// obj.sq_IntVectPush(0);
|
||
|
|
// obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
// return true;
|
||
|
|
// }
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Madnessballacre(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Madnessballacre(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(109);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(110);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_Madnessballacre(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_Madnessballacre(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Madnessballacre(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Madnessballacre(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Madnessballacre(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//巴拉克强击
|
||
|
|
function checkExecutableSkill_Ballacrestrongattack(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
// local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CROSSOFPUNISHMENT);
|
||
|
|
// if (isUse){
|
||
|
|
// obj.sq_IntVectClear();
|
||
|
|
// obj.sq_IntVectPush(0);
|
||
|
|
// obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
// return true;
|
||
|
|
// }
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Ballacrestrongattack(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Ballacrestrongattack(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(109);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(110);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_Ballacrestrongattack(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_Ballacrestrongattack(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Ballacrestrongattack(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Ballacrestrongattack(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Ballacrestrongattack(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//降临:僵尸莱迪亚
|
||
|
|
function checkExecutableSkill_Livingdead(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_LIVINGDEAD);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_LIVINGDEAD);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_LIVINGDEAD, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Livingdead(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Livingdead(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_BYKK_LIVINGDEAD);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_Livingdead(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_Livingdead(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Livingdead(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 0:
|
||
|
|
if(false){//CP武器效果
|
||
|
|
createLivingDeadExplosion(obj);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_LIVINGDEAD, -1, 0, 1.0) + 100;
|
||
|
|
local lifeTime = sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 2);
|
||
|
|
local hitTime = sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 0);
|
||
|
|
local sizeRate = 100;
|
||
|
|
local addSizeRate = sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 8);
|
||
|
|
local increaseRate = sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 13);
|
||
|
|
createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,50,0,0,obj.getDirection(),2,SKILL_BYKK_LIVINGDEAD,1,totalDamage,lifeTime,hitTime,sizeRate,increaseRate,addSizeRate,0,0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Livingdead(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Livingdead(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function createLivingDeadExplosion(obj)
|
||
|
|
{
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local speedRate = 10200 / currentAni.getDelaySum(0, 0);
|
||
|
|
local bonusRate = (100 + sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 13)).tofloat() / 100.0;
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_LIVINGDEAD, -1, 0, bonusRate) + 100;
|
||
|
|
local lifeTime = sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 2);
|
||
|
|
local hitTime = sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 0);
|
||
|
|
local hitCount = lifeTime / hitTime;
|
||
|
|
totalDamage = totalDamage * hitCount * 45 / 100;
|
||
|
|
local sizeRate = 100 + sq_GetIntData(obj, SKILL_BYKK_LIVINGDEAD, 8);
|
||
|
|
createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,50,0,0,obj.getDirection(),2,SKILL_BYKK_LIVINGDEAD,3,totalDamage,sizeRate,speedRate,0,0,0,0,0);
|
||
|
|
}
|
||
|
|
|
||
|
|
//巴拉克的愤怒
|
||
|
|
function checkExecutableSkill_Guillotine(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
if(colObj.getState() > 25){
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == STATE_STAND || state == STATE_DASH){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_GUILLOTINE);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(false){
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
}
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GUILLOTINE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Guillotine(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Guillotine(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_BYKK_BALLACRE_GUILLOTINE_START); break;
|
||
|
|
case 1: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_GUILLOTINE_CHARGE); break;
|
||
|
|
case 2: obj.sq_SetCurrentAnimation(ANI_BYKK_BALLACRE_GUILLOTINE_FINISH); break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 0.75, 0.75);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(0, 0);
|
||
|
|
local speedRate = 8000.0 / delay.tofloat();
|
||
|
|
local attackState = [34, 35, 36];
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
colObj.getVar("setSpeedRate").setFloat(0, speedRate);
|
||
|
|
if(subState == 2 && obj.sq_GetVectorData(datas, 1) > 0) colObj.getVar("guillotine_bool").setBool(0, true);
|
||
|
|
else colObj.getVar("guillotine_bool").setBool(0, false);
|
||
|
|
colObj.addSetStatePacket(attackState[subState], null, STATE_PRIORITY_IGNORE_FORCE, false, "");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_Guillotine(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(subState == 0 && sq_GetSkillLevel(obj, SKILL_BYKK_SACRIFICIALPACT) > 0) obj.sq_IntVectPush(2);
|
||
|
|
else obj.sq_IntVectPush(subState + 1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GUILLOTINE, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_Guillotine(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 1:
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_GUILLOTINE,true);
|
||
|
|
local b_useskill = obj.sq_IsEnterSkill(SKILL_BYKK_GUILLOTINE);
|
||
|
|
if(b_useskill != -1){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GUILLOTINE, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Guillotine(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Guillotine(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Guillotine(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//千魂杀
|
||
|
|
function checkExecutableSkill_Phantomstrom(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
if(colObj.getState() > 25){
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == STATE_STAND || state == STATE_DASH){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_PHANTOMSTROM);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_PHANTOMSTROM, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Phantomstrom(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Phantomstrom(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_BYKK_BALLACRE_PHANTOM_STROM);
|
||
|
|
obj.sq_PlaySound("R_TF_ADESPHANTOM_03_A");
|
||
|
|
obj.sq_PlaySound("BALAC_FANTOM");
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 0.75, 0.75);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(0, 0);
|
||
|
|
local speedRate = 8000.0 / delay.tofloat();
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
colObj.getVar("setSpeedRate").setFloat(0, speedRate);
|
||
|
|
colObj.addSetStatePacket(37, null, STATE_PRIORITY_IGNORE_FORCE, false, "");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_Phantomstrom(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_PHANTOMSTROM);
|
||
|
|
if(skillLevel >= 6){
|
||
|
|
local addLevel = sq_GetLevelData(obj, SKILL_BYKK_PHANTOMSTROM, 4, skillLevel);
|
||
|
|
local addSkillLevelTime = sq_GetLevelData(obj, SKILL_BYKK_PHANTOMSTROM, 5, skillLevel);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_SUMMONNICOLAS) > 0) obj.addSkillLevelAppendage(SKILL_BYKK_SUMMONNICOLAS, addLevel, addSkillLevelTime);
|
||
|
|
}
|
||
|
|
if(skillLevel >= 9){
|
||
|
|
local addLevel = sq_GetLevelData(obj, SKILL_BYKK_PHANTOMSTROM, 6, skillLevel);
|
||
|
|
local addSkillLevelTime = sq_GetLevelData(obj, SKILL_BYKK_PHANTOMSTROM, 7, skillLevel);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_APPORTBALLACRE) > 0) obj.addSkillLevelAppendage(SKILL_BYKK_APPORTBALLACRE, addLevel, addSkillLevelTime);
|
||
|
|
}
|
||
|
|
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_Phantomstrom(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Phantomstrom(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Phantomstrom(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Phantomstrom(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//死灵之缚
|
||
|
|
function checkExecutableSkill_BlameOfDeadEx(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_BLAMEOFDEADEX);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BLAMEOFDEADEX, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_BlameOfDeadEx(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_BlameOfDeadEx(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_BYKK_BLAMEOFDEADEX);
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_BlameOfDeadEx(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_BlameOfDeadEx(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_BlameOfDeadEx(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 1:
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
if(false){
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_BLAMEOFDEADEX);
|
||
|
|
local lifeTime = sq_GetLevelData(obj, SKILL_BYKK_BLAMEOFDEADEX, 5, skillLevel);
|
||
|
|
local hitTime = sq_GetLevelData(obj, SKILL_BYKK_BLAMEOFDEADEX, 4, skillLevel);
|
||
|
|
local hitMax = lifeTime / hitTime;
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_BLAMEOFDEADEX, -1, 0, 1.0) + 100;
|
||
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_BLAMEOFDEADEX, 1);
|
||
|
|
local skillLevel2 = sq_GetSkillLevel(obj, SKILL_BYKK_GRIMGRIMOIRE);
|
||
|
|
if(skillLevel2 > 0) sizeRate = sizeRate * (100 + sq_GetLevelData(obj, SKILL_BYKK_GRIMGRIMOIRE, 11, skillLevel2)) / 100;
|
||
|
|
local multiHit = (totalDamage * hitMax) * 18 / 100;
|
||
|
|
local expHit = (totalDamage * hitMax) * 35 / 100;
|
||
|
|
createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,200,0,0,obj.getDirection(),2,SKILL_BYKK_BLAMEOFDEADEX,2,multiHit,expHit,hitTime,sizeRate,0,0,0,0);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_BLAMEOFDEADEX, -1, 0, 1.0) + 100;
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_BLAMEOFDEADEX);
|
||
|
|
local lifeTime = sq_GetLevelData(obj, SKILL_BYKK_BLAMEOFDEADEX, 5, skillLevel);
|
||
|
|
local hitTime = sq_GetLevelData(obj, SKILL_BYKK_BLAMEOFDEADEX, 4, skillLevel);
|
||
|
|
local prob = sq_GetLevelData(obj, SKILL_BYKK_BLAMEOFDEADEX, 1, skillLevel) / 10;
|
||
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_BLAMEOFDEADEX, 1);
|
||
|
|
local skillLevel2 = sq_GetSkillLevel(obj, SKILL_BYKK_GRIMGRIMOIRE);
|
||
|
|
if(skillLevel2 > 0) sizeRate = sizeRate * (100 + sq_GetLevelData(obj, SKILL_BYKK_GRIMGRIMOIRE, 11, skillLevel2)) / 100;
|
||
|
|
createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,200,0,0,obj.getDirection(),2,SKILL_BYKK_BLAMEOFDEADEX,1,totalDamage,lifeTime,hitTime,prob,sizeRate,0,0,0);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_BlameOfDeadEx(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_BlameOfDeadEx(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//怨噬之沼
|
||
|
|
function checkExecutableSkill_Hatefulghost(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local attackObj = obj.getVar("hatefulGhostObj").get_obj_vector(0);
|
||
|
|
if(attackObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(attackObj);
|
||
|
|
if(!colObj.isExistTimeEvent(12)){
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == STATE_STAND || state == STATE_DASH){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
local objPhase = colObj.getVar("phaseSet").getInt(0);
|
||
|
|
switch(objPhase){
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(sq_getRandom(2,3));
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HATEFULGHOST, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return false;
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(sq_getRandom(4,5));
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HATEFULGHOST, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return false;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_HATEFULGHOST);
|
||
|
|
if (isUse){
|
||
|
|
obj.getVar("hatefulGhostObj").clear_obj_vector();
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HATEFULGHOST, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Hatefulghost(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Hatefulghost(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_BYKK_HATEFULGHOSTSTAY);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(ANI_BYKK_HATEFULGHOSTATTACK1_BODY);
|
||
|
|
obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/2_necromancer_bykk/hatefulghost/character/hatefulghostattack1front_00.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_SetCurrentAnimation(ANI_BYKK_HATEFULGHOSTATTACK2A_BODY);
|
||
|
|
obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/2_necromancer_bykk/hatefulghost/character/hatefulghostattack2afront_00.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
obj.sq_SetCurrentAnimation(ANI_BYKK_HATEFULGHOSTATTACK2B_BODY);
|
||
|
|
obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/2_necromancer_bykk/hatefulghost/character/hatefulghostattack2afront_00.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
case 4:
|
||
|
|
obj.sq_SetCurrentAnimation(ANI_BYKK_HATEFULGHOSTATTACK3A_BODY);
|
||
|
|
obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/2_necromancer_bykk/hatefulghost/character/hatefulghostattack2bfront_00.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
case 5:
|
||
|
|
obj.sq_SetCurrentAnimation(ANI_BYKK_HATEFULGHOSTATTACK3B_BODY);
|
||
|
|
obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/2_necromancer_bykk/hatefulghost/character/hatefulghostattack3front_00.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_Hatefulghost(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(subState + 1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HATEFULGHOST, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
case 2:
|
||
|
|
case 3:
|
||
|
|
case 4:
|
||
|
|
case 5:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_Hatefulghost(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Hatefulghost(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 105:
|
||
|
|
//[OFFSET] `create attack Front Effect` 0 0 0
|
||
|
|
//[OFFSET] `create attack Bottom Effect` 0 0 0
|
||
|
|
//[OFFSET] `create Hand Effect` 0 0 0
|
||
|
|
//[OFFSET] `create Hand bottom Effect` 2000 0 0
|
||
|
|
local totalDamage_1st = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_HATEFULGHOST, -1, 0, 1.0) + 100;
|
||
|
|
local totalDamage_2nd = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_HATEFULGHOST, -1, 1, 1.0) + 100;
|
||
|
|
local totalDamage_3th1 = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_HATEFULGHOST, -1, 2, 1.0) + 100;
|
||
|
|
local totalDamage_3th2 = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_HATEFULGHOST, -1, 3, 1.0) + 100;
|
||
|
|
local lifeTime = 20000;
|
||
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_HATEFULGHOST, 1);
|
||
|
|
createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,150,0,0,obj.getDirection(),2,SKILL_BYKK_HATEFULGHOST,1,totalDamage_1st,totalDamage_2nd,totalDamage_3th1,totalDamage_3th2,lifeTime,sizeRate,0,0);
|
||
|
|
break;
|
||
|
|
case 106: sq_SetMyShake(obj, 3, 300); break;
|
||
|
|
case 200:
|
||
|
|
//[OFFSET] `create attack Front Effect` 0 0 0
|
||
|
|
local attackObj = obj.getVar("hatefulGhostObj").get_obj_vector(0);
|
||
|
|
if(attackObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(attackObj);
|
||
|
|
colObj.getVar("setState").setInt(0, 24);
|
||
|
|
colObj.stopTimeEvent(12);
|
||
|
|
colObj.getVar("move").setInt(0, sq_GetXPos(colObj));
|
||
|
|
colObj.getVar("move").setInt(1, sq_GetYPos(colObj));
|
||
|
|
colObj.setTimeEvent(13, 1, 50, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 204: sq_SetMyShake(obj, 3, 300); break;
|
||
|
|
case 211:
|
||
|
|
//[OFFSET] `create attack Front Effect` 0 0 0
|
||
|
|
local attackObj = obj.getVar("hatefulGhostObj").get_obj_vector(0);
|
||
|
|
if(attackObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(attackObj);
|
||
|
|
colObj.getVar("setState").setInt(0, 25);
|
||
|
|
colObj.stopTimeEvent(12);
|
||
|
|
colObj.getVar("move").setInt(0, sq_GetXPos(colObj));
|
||
|
|
colObj.getVar("move").setInt(1, sq_GetYPos(colObj));
|
||
|
|
colObj.setTimeEvent(13, 1, 50, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 217: sq_SetMyShake(obj, 3, 300); break;
|
||
|
|
case 308:
|
||
|
|
case 313:
|
||
|
|
sq_SetMyShake(obj, 3, 300);
|
||
|
|
//[OFFSET] `create attack Front Effect` 0 0 0
|
||
|
|
local attackObj = obj.getVar("hatefulGhostObj").get_obj_vector(0);
|
||
|
|
if(attackObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(attackObj);
|
||
|
|
colObj.getVar("setState").setInt(0, 27);
|
||
|
|
colObj.stopTimeEvent(12);
|
||
|
|
colObj.getVar("move").setInt(0, sq_GetXPos(colObj));
|
||
|
|
colObj.getVar("move").setInt(1, sq_GetYPos(colObj));
|
||
|
|
colObj.setTimeEvent(13, 1, 50, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Hatefulghost(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Hatefulghost(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//暗黑蛛丝引
|
||
|
|
function checkExecutableSkill_Nicolasblackarachnia(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local size = obj.getVar("NicolasObj").get_obj_vector_size();
|
||
|
|
if(size < 1) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_NICOLASBLACKARACHNIA);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_NICOLASBLACKARACHNIA);
|
||
|
|
local nicolasObj = obj.getVar("NicolasObj").get_obj_vector(0);
|
||
|
|
if(nicolasObj){
|
||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(nicolasObj);
|
||
|
|
local attackIndex = 9;
|
||
|
|
if(false) attackIndex = 12;
|
||
|
|
monsterattack_Thief_Necromancer_ksk(activeObj, attackIndex);
|
||
|
|
}
|
||
|
|
local state = obj.getState();
|
||
|
|
switch(state){
|
||
|
|
case STATE_STAND:
|
||
|
|
case STATE_DASH:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Nicolasblackarachnia(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Nicolasblackarachnia(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(109);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(110);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_Nicolasblackarachnia(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CROSSOFPUNISHMENT, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_Nicolasblackarachnia(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Nicolasblackarachnia(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Nicolasblackarachnia(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Nicolasblackarachnia(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//暴君极刑斩
|
||
|
|
function checkExecutableSkill_Executionerslash(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
if(colObj.getState() > 25){
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == STATE_STAND || state == STATE_DASH){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_EXECUTIONERSLASH);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_EXECUTIONERSLASH, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Executionerslash(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Executionerslash(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
local Ani = obj.sq_GetThrowChargeAni(1);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local Ani = obj.sq_GetThrowShootAni(1);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 0.75, 0.75);
|
||
|
|
if(subState == 0){
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(0, 0);
|
||
|
|
local speedRate = 8000.0 / delay.tofloat();
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
colObj.getVar("setSpeedRate").setFloat(0, speedRate);
|
||
|
|
if(false) colObj.getVar("isStone_executionerslash").setBool(0, true);
|
||
|
|
else colObj.getVar("isStone_executionerslash").setBool(0, true);
|
||
|
|
colObj.addSetStatePacket(38, null, STATE_PRIORITY_IGNORE_FORCE, false, "");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_Executionerslash(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_EXECUTIONERSLASH, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_Executionerslash(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Executionerslash(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Executionerslash(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Executionerslash(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//亡者君临:巴拉克之戮
|
||
|
|
function checkExecutableSkill_Ballacreadvent(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
if(colObj.getState() > 25){
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == STATE_STAND || state == STATE_DASH){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(state, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_BALLACREADVENT);
|
||
|
|
if (isUse){
|
||
|
|
obj.getVar("Ballacreadvent_Effect").clear_obj_vector();
|
||
|
|
obj.getVar("Ballacreadvent_Background").clear_obj_vector();
|
||
|
|
obj.getVar("Ballacreadvent_Attract").clear_obj_vector();
|
||
|
|
obj.getVar("Ballacreadvent_Tar").clear_obj_vector();
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BALLACREADVENT, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Ballacreadvent(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Ballacreadvent(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
local Ani = obj.sq_GetThrowChargeAni(2);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/ballacreadvent/casting/casting01_set01d01.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local Ani = obj.sq_GetThrowShootAni(2);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/ballacreadvent/casting/casting01_set02d01.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/ballacreadvent/casting/casting01_set02n01.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 0.75, 0.75);
|
||
|
|
if(subState == 0){
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(0, 0);
|
||
|
|
local speedRate = 6000.0 / delay.tofloat();
|
||
|
|
local ballacreObj = obj.getVar("ballacreObj").get_obj_vector(0);
|
||
|
|
if(ballacreObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(ballacreObj);
|
||
|
|
colObj.getVar("setSpeedRate").setFloat(0, speedRate);
|
||
|
|
colObj.addSetStatePacket(39, null, STATE_PRIORITY_IGNORE_FORCE, false, "");
|
||
|
|
local totalDamage_start = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_BALLACREADVENT, -1, 0, 1.0) + 100;
|
||
|
|
local totalDamage_multihit = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_BALLACREADVENT, -1, 1, 1.0) + 100;
|
||
|
|
local totalDamage_finish = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_BALLACREADVENT, -1, 2, 1.0) + 100;
|
||
|
|
local hitMax = sq_GetIntData(obj, SKILL_BYKK_BALLACREADVENT, 18);
|
||
|
|
speedRate = (speedRate * 100.0).tointeger();
|
||
|
|
createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,0,-1,0,obj.getDirection(),2,SKILL_BYKK_BALLACREADVENT,1,totalDamage_start,totalDamage_multihit,totalDamage_finish,hitMax,speedRate,0,0,0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if(subState == 1){
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(0, 1);
|
||
|
|
obj.setTimeEvent(1, delay, 1, false);
|
||
|
|
local aniPath = "character/thief/effect/animation/ballacreadvent/casting/casting02_groundn.ani";
|
||
|
|
createOnlyDrawObject_Theif_bykk(obj,aniPath,true,obj.getDirection(),sq_GetXPos(obj),sq_GetYPos(obj),0,ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_Ballacreadvent(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BALLACREADVENT, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_Ballacreadvent(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Ballacreadvent(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Ballacreadvent(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 1:
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/2_necromancer_bykk/ballacreadvent/casting/casting01_set03n01.ani", 0, 0, 0);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/2_necromancer_bykk/ballacreadvent/casting/casting01_set03n02.ani", 0, 0, 0);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/2_necromancer_bykk/ballacreadvent/casting/casting01_set03d01.ani", 0, 1, 1);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/thief/effect/animation/2_necromancer_bykk/ballacreadvent/casting/casting01_set03d02.ani", 0, 1, 1);
|
||
|
|
local aniPath = "character/thief/effect/animation/2_necromancer_bykk/ballacreadvent/casting/flooreffect_d01.ani";
|
||
|
|
local pooledObj = createOnlyDrawObject_Theif_bykk(obj,aniPath,true,obj.getDirection(),sq_GetXPos(obj),sq_GetYPos(obj),0,ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
obj.getVar("Ballacreadvent_Effect").push_obj_vector(pooledObj);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Ballacreadvent(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//亡者之茧
|
||
|
|
function checkExecutableSkill_Coconofundead(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local attackObj = obj.getVar("coconofundeadObj").get_obj_vector(0);
|
||
|
|
if(attackObj && attackObj.getState() != 25){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(attackObj);
|
||
|
|
colObj.addSetStatePacket(25, null, STATE_PRIORITY_AUTO, false, "");
|
||
|
|
local size = obj.getVar("coconofundeadObj_b").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local effect = obj.getVar("coconofundeadObj_b").get_obj_vector(i);
|
||
|
|
if(effect){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(effect);
|
||
|
|
colObj.setTimeEvent(1, 1000, 1, true);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_COCONOFUNDEAD);
|
||
|
|
if (isUse){
|
||
|
|
obj.getVar("coconofundeadObj").clear_obj_vector();
|
||
|
|
obj.getVar("coconofundeadObj_b").clear_obj_vector();
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_COCONOFUNDEAD, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Coconofundead(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Coconofundead(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_BYKK_COCOONOFUNDEADSTART_BODY);
|
||
|
|
obj.sq_PlaySound("R_TF_COCOON_UNDEAD");
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_Coconofundead(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_Coconofundead(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Coconofundead(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 107:
|
||
|
|
local aniPath = "character/thief/effect/animation/2_necromancer_bykk/cocoonofundead/cocoonofundeadstartbottom_00.ani";
|
||
|
|
createOnlyDrawObject_Theif_bykk(obj,aniPath,true,obj.getDirection(),sq_GetXPos(obj),sq_GetYPos(obj),0,ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
break;
|
||
|
|
case 108:
|
||
|
|
//[OFFSET] `start attraction` 170 0 0
|
||
|
|
local totalDamage = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_COCONOFUNDEAD, -1, 0, 1.0) + 100;
|
||
|
|
local totalDamage_exp = sq_GetBonusRateWithPassive(obj, SKILL_BYKK_COCONOFUNDEAD, -1, 1, 1.0) + 100;
|
||
|
|
local lifeTime = 4500;
|
||
|
|
createSkillPassive_Theif_bykk(obj,obj,PASSIVEOBJ_NUM_THIEF,170,0,0,obj.getDirection(),2,SKILL_BYKK_COCONOFUNDEAD,1,totalDamage,totalDamage_exp,lifeTime,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 112:
|
||
|
|
//[OFFSET] `create cocoon side object` 170 0 0
|
||
|
|
break;
|
||
|
|
case 116:
|
||
|
|
//[OFFSET] `create cocoon Monster` 170 0 0
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Coconofundead(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Coconofundead(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function summonmonster_necromancer_bykk(obj,monsterobj,x,y,z,substate,monsterId,summontime,level,team)
|
||
|
|
{
|
||
|
|
if(obj.getVar("Summonnum").size_vector() == 0){
|
||
|
|
obj.getVar("Summonnum").clear_vector();
|
||
|
|
obj.getVar("Summonnum").push_vector(0);
|
||
|
|
}
|
||
|
|
|
||
|
|
sq_BinaryStartWrite();
|
||
|
|
sq_BinaryWriteByte(substate);
|
||
|
|
sq_BinaryWriteDword(monsterId);
|
||
|
|
sq_BinaryWriteWord(team);
|
||
|
|
sq_BinaryWriteWord(level);
|
||
|
|
sq_BinaryWriteWord(obj.getVar("Summonnum").get_vector(0));
|
||
|
|
sq_BinaryWriteDword(0);
|
||
|
|
sq_BinaryWriteDword(summontime);
|
||
|
|
sq_BinaryWriteWord(1);
|
||
|
|
sq_BinaryWriteWord(1);
|
||
|
|
sq_BinaryWriteWord(1);
|
||
|
|
local destX_01 = 0;
|
||
|
|
local destY_01 = 0;
|
||
|
|
if(!isSameObject(obj, monsterobj)){
|
||
|
|
destX_01 = monsterobj.getXPos() - obj.getXPos();
|
||
|
|
destY_01 = monsterobj.getYPos() - obj.getYPos();
|
||
|
|
if(monsterobj.getDirection() == ENUM_DIRECTION_LEFT) destX_01 = obj.getXPos() - monsterobj.getXPos();
|
||
|
|
}
|
||
|
|
sq_SendCreatePassiveObjectPacket(obj, 48024, 0, destX_01 + x, destY_01 + y, z, monsterobj.getDirection());
|
||
|
|
obj.getVar("Summonnum").set_vector(0,obj.getVar("Summonnum").get_vector(0) + 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
function monsterattack_Thief_Necromancer_ksk(monsterObj,attackIndex)
|
||
|
|
{
|
||
|
|
if(!monsterObj) return;
|
||
|
|
local activeObj = sq_GetCNRDObjectToCollisionObject(monsterObj);
|
||
|
|
sq_IntVectorClear(sq_GetGlobalIntVector());
|
||
|
|
sq_IntVectorPush(sq_GetGlobalIntVector(),attackIndex);
|
||
|
|
sq_AddSetStatePacketCollisionObject(activeObj, 8, sq_GetGlobalIntVector(), STATE_PRIORITY_USER, true);
|
||
|
|
}
|
||
|
|
|
||
|
|
function createOnlyDrawObject_Theif_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_Theif_bykk(obj,aniPath,isTrue,direction,x,y,z,drawlayer,sizeRateX,sizeRateY)
|
||
|
|
{
|
||
|
|
local ani = sq_CreateAnimation("",aniPath);
|
||
|
|
local pooledObj = sq_CreatePooledObject(ani,isTrue);
|
||
|
|
sq_SetCurrentDirection(pooledObj, direction);
|
||
|
|
pooledObj.setCurrentPos(x,y,z);
|
||
|
|
local currentAni = pooledObj.getCurrentAnimation();
|
||
|
|
sizeRateX = sizeRateX.tofloat() / 100.0;
|
||
|
|
sizeRateY = sizeRateY.tofloat() / 100.0;
|
||
|
|
currentAni.setImageRateFromOriginal(sizeRateX, sizeRateY);
|
||
|
|
pooledObj = sq_SetEnumDrawLayer(pooledObj, drawlayer);
|
||
|
|
sq_AddObject(obj, pooledObj, OBJECTTYPE_DRAWONLY, false);
|
||
|
|
return pooledObj;
|
||
|
|
}
|
||
|
|
|
||
|
|
function createSkillPassive_Theif_bykk(obj,passiveObj,objnum,x,y,z,direction,job,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(job);
|
||
|
|
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);
|
||
|
|
}
|
||
|
|
|