3013 lines
122 KiB
C
3013 lines
122 KiB
C
|
|
|
|||
|
|
|
|||
|
|
/////////////////////////elementalmaster//////////////////////
|
|||
|
|
|
|||
|
|
|
|||
|
|
function setState_elementalmaster_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
if(state == 17 && sq_GetVectorData(datas, 0) == 29){
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(0);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_STATE_ELEMENTALCHAIN, STATE_PRIORITY_IGNORE_FORCE, true);
|
|||
|
|
}
|
|||
|
|
else if(state == 17 && sq_GetVectorData(datas, 0) == 2){
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(0);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_ASSIMILATE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onAfterSetState_Throw_elementalmaster_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
local ThrowIndex = obj.getThrowIndex();
|
|||
|
|
local throwState = obj.getThrowState();
|
|||
|
|
|
|||
|
|
local Mightyrune_T =
|
|||
|
|
{//light,ice,fire,dark
|
|||
|
|
[15] = [0,0,1,0],
|
|||
|
|
[16] = [0,1,0,0],
|
|||
|
|
[18] = [0,0,0,1],
|
|||
|
|
[17] = [1,0,0,0],
|
|||
|
|
[57] = [0,0,1,0],
|
|||
|
|
[56] = [0,1,0,0],
|
|||
|
|
[26] = [0,0,0,1],
|
|||
|
|
[31] = [1,0,0,0],
|
|||
|
|
[27] = [0,0,1,0],
|
|||
|
|
[59] = [0,1,0,0],
|
|||
|
|
[55] = [1,0,0,0],
|
|||
|
|
[58] = [0,0,0,1]
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(throwState == 0 && Mightyrune_T.rawin(ThrowIndex)){
|
|||
|
|
switch(ThrowIndex){
|
|||
|
|
case 15:
|
|||
|
|
case 26:
|
|||
|
|
case 58:
|
|||
|
|
case 59:
|
|||
|
|
case 27:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(10);
|
|||
|
|
obj.sq_IntVectPush(ThrowIndex);
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_STATE_ELEMENTALCHAIN, STATE_PRIORITY_IGNORE_FORCE, true);
|
|||
|
|
break;
|
|||
|
|
case 16:
|
|||
|
|
case 31:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(20);
|
|||
|
|
obj.sq_IntVectPush(ThrowIndex);
|
|||
|
|
obj.sq_IntVectPush(3);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_STATE_ELEMENTALCHAIN, STATE_PRIORITY_IGNORE_FORCE, true);
|
|||
|
|
break;
|
|||
|
|
case 17:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(30);
|
|||
|
|
obj.sq_IntVectPush(ThrowIndex);
|
|||
|
|
obj.sq_IntVectPush(2);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_STATE_ELEMENTALCHAIN, STATE_PRIORITY_IGNORE_FORCE, true);
|
|||
|
|
break;
|
|||
|
|
case 18:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(40);
|
|||
|
|
obj.sq_IntVectPush(ThrowIndex);
|
|||
|
|
obj.sq_IntVectPush(0);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_STATE_ELEMENTALCHAIN, STATE_PRIORITY_IGNORE_FORCE, true);
|
|||
|
|
break;
|
|||
|
|
case 57:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(0);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_FLAMESTRIKE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|||
|
|
break;
|
|||
|
|
case 55:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(0);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_THUNDERCALLING, STATE_PRIORITY_IGNORE_FORCE, true);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(throwState == 1 && Mightyrune_T.rawin(ThrowIndex)){
|
|||
|
|
sq_BinaryStartWrite();
|
|||
|
|
foreach(elsement in Mightyrune_T[ThrowIndex]){
|
|||
|
|
sq_BinaryWriteDword(elsement);
|
|||
|
|
}
|
|||
|
|
sq_SendChangeSkillEffectPacket(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN);
|
|||
|
|
if(ThrowIndex == 56){
|
|||
|
|
elementalmaster_setelementSkillBonusRate(obj, 56);
|
|||
|
|
}
|
|||
|
|
else if(ThrowIndex == 74){
|
|||
|
|
elementalmaster_setelementSkillBonusRate(obj, 74);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_Mage_Throw_elementalmaster(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function reset_elementalmaster_bykk(obj)
|
|||
|
|
{
|
|||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"appendage/character/ap_common_suck.nut");
|
|||
|
|
if(!addAppendage) return;
|
|||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "appendage/character/ap_common_suck.nut");
|
|||
|
|
local size = obj.getVar("blackhole").get_obj_vector_size();
|
|||
|
|
if(size > 0){
|
|||
|
|
for(local i = 0; i < size; i++){
|
|||
|
|
local bhObj = obj.getVar("blackhole").get_obj_vector(i);
|
|||
|
|
if(bhObj) bhObj.setValid(false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
obj.getVar("blackhole").clear_obj_vector();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onChangeSkillEffect_Mage_elementalmaster(obj, skillIndex, reciveData)
|
|||
|
|
{
|
|||
|
|
switch(skillIndex){
|
|||
|
|
case ELEMENTALMASTER_SKILL_ELEMENTALCHAIN:
|
|||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_elementalchain.nut");
|
|||
|
|
if(!addAppendage) return;
|
|||
|
|
local pushstate = 22;
|
|||
|
|
if(sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_MIGHTYRUNE) > 0) pushstate = 25;
|
|||
|
|
local assimilate_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ASSIMILATE);
|
|||
|
|
local buff1 = reciveData.readDword();
|
|||
|
|
local buff2 = reciveData.readDword();
|
|||
|
|
local buff3 = reciveData.readDword();
|
|||
|
|
local buff4 = reciveData.readDword();
|
|||
|
|
local buffnum = [];
|
|||
|
|
local buffname = ["","light","ice","fire","dark"];
|
|||
|
|
if(buff1 > 0) buffnum.push(1);
|
|||
|
|
if(buff2 > 0) buffnum.push(2);
|
|||
|
|
if(buff3 > 0) buffnum.push(3);
|
|||
|
|
if(buff4 > 0) buffnum.push(4);
|
|||
|
|
for(local i = 0; i < buffnum.len(); i++){
|
|||
|
|
local anum = buffnum[i];
|
|||
|
|
addAppendage.getVar().setBool(anum, true);
|
|||
|
|
local effectObj = obj.getVar("elementalchain_"+buffname[anum]).get_obj_vector(0);
|
|||
|
|
if(effectObj){
|
|||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(effectObj);
|
|||
|
|
if(assimilate_level > 0){
|
|||
|
|
local pooledObj = createOnlyDrawObject_elementalmaster_bykk(obj,"character/mage/effect/animation/elementalmaster_bykk/mightyrune/lv95assimilate/"+buffname[anum]+"activate_00.ani",true,colObj.getDirection(),sq_GetXPos(colObj),sq_GetYPos(colObj) + 1,sq_GetZPos(colObj) + 1,ENUM_DRAWLAYER_NORMAL);
|
|||
|
|
sq_moveWithParent(colObj, pooledObj);
|
|||
|
|
}
|
|||
|
|
else colObj.addSetStatePacket(pushstate, null, STATE_PRIORITY_AUTO, false, "");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
setElementalChainBuff_bykk(obj,skillIndex,addAppendage);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onStartDungeon_Elementalmaster_bykk(obj)
|
|||
|
|
{
|
|||
|
|
local loadSlot = obj.sq_GetSkillLoad(ELEMENTALMASTER_SKILL_ELEMENTMASTERY);
|
|||
|
|
if(loadSlot) obj.sq_RemoveSkillLoad(ELEMENTALMASTER_SKILL_ELEMENTMASTERY);
|
|||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_elementalchain.nut");
|
|||
|
|
if(!addAppendage) return;
|
|||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_elementalchain.nut");
|
|||
|
|
local addAppendage2 = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_moveoncast.nut");
|
|||
|
|
if(!addAppendage2) return;
|
|||
|
|
addAppendage2.getVar().setBool(0, false);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function setElementalChainBuff_bykk(obj,skillIndex,addAppendage)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
// local skillLevel = sq_GetSkillLevel(obj, skillIndex);
|
|||
|
|
// local buff_num = [];
|
|||
|
|
// if(addAppendage.getVar().getBool(1)) buff_num.push(1);
|
|||
|
|
// if(addAppendage.getVar().getBool(2)) buff_num.push(1);
|
|||
|
|
// if(addAppendage.getVar().getBool(3)) buff_num.push(1);
|
|||
|
|
// if(addAppendage.getVar().getBool(4)) buff_num.push(1);
|
|||
|
|
// local value1 = 0;
|
|||
|
|
// switch(buff_num.len()){
|
|||
|
|
// case 1: value1 = sq_GetLevelData(obj, skillIndex, 6, skillLevel); break;
|
|||
|
|
// case 2: value1 = sq_GetLevelData(obj, skillIndex, 7, skillLevel); break;
|
|||
|
|
// case 3: value1 = sq_GetLevelData(obj, skillIndex, 8, skillLevel); break;
|
|||
|
|
// case 4: value1 = sq_GetLevelData(obj, skillIndex, 9, skillLevel); break;
|
|||
|
|
// }
|
|||
|
|
// local change_appendage = addAppendage.sq_getChangeStatus("elementalchain");
|
|||
|
|
// if(!change_appendage) change_appendage = addAppendage.sq_AddChangeStatus("elementalchain",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK,true, value1);
|
|||
|
|
// if(change_appendage){
|
|||
|
|
// change_appendage.clearParameter();
|
|||
|
|
// if(value1 > 0){
|
|||
|
|
// change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_ATTACK, true, (value1 * 0.01).tofloat());
|
|||
|
|
// change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_ATTACK, true, (value1 * 0.01).tofloat());
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onStart_appendage_elementmastery_bykk(appendage)
|
|||
|
|
{
|
|||
|
|
local parentObj = sq_GetCNRDObjectToSQRCharacter(appendage.getParent());
|
|||
|
|
if(!parentObj || parentObj.getState() == STATE_DIE){appendage.setValid(false);return;}
|
|||
|
|
|
|||
|
|
local skillLevel = parentObj.sq_GetSkillLevel(ELEMENTALMASTER_SKILL_ELEMENTMASTERY);
|
|||
|
|
local value1 = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_ELEMENTMASTERY, 4, skillLevel);
|
|||
|
|
local value2 = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_ELEMENTMASTERY, 5, skillLevel);
|
|||
|
|
local mightyrune_level = parentObj.sq_GetSkillLevel(ELEMENTALMASTER_SKILL_MIGHTYRUNE);
|
|||
|
|
if(mightyrune_level > 0){
|
|||
|
|
local add_Rate = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_MIGHTYRUNE, 3, mightyrune_level);
|
|||
|
|
value1 = value1 * (1000 + add_Rate) / 1000;
|
|||
|
|
}
|
|||
|
|
local change_appendage = appendage.sq_getChangeStatus("elementmastery");
|
|||
|
|
if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("elementmastery",parentObj, parentObj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, value1);
|
|||
|
|
if(change_appendage){
|
|||
|
|
change_appendage.clearParameter();
|
|||
|
|
//change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_ATTACK, true, (value1 * 0.1).tofloat());
|
|||
|
|
//change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_ATTACK, true, (value1 * 0.1).tofloat());
|
|||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_ELEMENT_TOLERANCE_ALL, false, (value2).tofloat());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onStart_appendage_assimilate_bykk(appendage)
|
|||
|
|
{
|
|||
|
|
local parentObj = sq_GetCNRDObjectToSQRCharacter(appendage.getParent());
|
|||
|
|
if(!parentObj || parentObj.getState() == STATE_DIE){appendage.setValid(false);return;}
|
|||
|
|
|
|||
|
|
// local skillLevel = parentObj.sq_GetSkillLevel(ELEMENTALMASTER_SKILL_ASSIMILATE);
|
|||
|
|
// local value1 = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_ASSIMILATE, 0, skillLevel);
|
|||
|
|
// local change_appendage = appendage.sq_getChangeStatus("assimilate");
|
|||
|
|
// if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("assimilate",parentObj, parentObj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, value1);
|
|||
|
|
// if(change_appendage){
|
|||
|
|
// change_appendage.clearParameter();
|
|||
|
|
// change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_ATTACK, true, (value1 * 0.1).tofloat());
|
|||
|
|
// change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_ATTACK, true, (value1 * 0.1).tofloat());
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onStart_appendage_elementalpotential_bykk(appendage)
|
|||
|
|
{
|
|||
|
|
local parentObj = sq_GetCNRDObjectToSQRCharacter(appendage.getParent());
|
|||
|
|
if(!parentObj || parentObj.getState() == STATE_DIE){appendage.setValid(false);return;}
|
|||
|
|
|
|||
|
|
local skillLevel = parentObj.sq_GetSkillLevel(ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL);
|
|||
|
|
local value1 = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 7, skillLevel);
|
|||
|
|
local change_appendage = appendage.sq_getChangeStatus("elementalpotential");
|
|||
|
|
if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("elementalpotential",parentObj, parentObj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, value1);
|
|||
|
|
if(change_appendage){
|
|||
|
|
change_appendage.clearParameter();
|
|||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_ATTACK, true, (value1 * 0.1).tofloat());
|
|||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_ATTACK, true, (value1 * 0.1).tofloat());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onStart_appendage_elementalweak_bykk(appendage)
|
|||
|
|
{
|
|||
|
|
local parentObj = sq_GetCNRDObjectToSQRCharacter(appendage.getParent());
|
|||
|
|
if(!parentObj || parentObj.getState() == STATE_DIE){appendage.setValid(false);return;}
|
|||
|
|
|
|||
|
|
local skillLevel = parentObj.sq_GetSkillLevel(ELEMENTALMASTER_SKILL_ELEMENTALWEAK);
|
|||
|
|
local value1 = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_ELEMENTALWEAK, 5, skillLevel);
|
|||
|
|
local value2 = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_ELEMENTALWEAK, 6, skillLevel);
|
|||
|
|
local mightyrune_level = parentObj.sq_GetSkillLevel(ELEMENTALMASTER_SKILL_MIGHTYRUNE);
|
|||
|
|
if(mightyrune_level > 0){
|
|||
|
|
local add_Rate = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_MIGHTYRUNE, 2, mightyrune_level);
|
|||
|
|
value2 = value2 * (1000 + add_Rate) / 1000;
|
|||
|
|
}
|
|||
|
|
local change_appendage = appendage.sq_getChangeStatus("elementalweak");
|
|||
|
|
if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("elementalweak",parentObj, parentObj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, value1);
|
|||
|
|
if(change_appendage){
|
|||
|
|
change_appendage.clearParameter();
|
|||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_ATTACK, true, (value1 * 0.1).tofloat());
|
|||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_ATTACK, true, (value1 * 0.1).tofloat());
|
|||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_HIT_RATE, false, (value2 * 0.1).tofloat());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onAttackParent_appendage_elementalweak(appendage, realAttacker, damager, boundingBox, isStuck)
|
|||
|
|
{
|
|||
|
|
if(!appendage) return;
|
|||
|
|
return;
|
|||
|
|
if(isStuck) return;
|
|||
|
|
local parentObj = appendage.getParent();
|
|||
|
|
local obj = sq_GetCNRDObjectToSQRCharacter(parentObj);
|
|||
|
|
if(!obj || obj.getState() == STATE_DIE) return;
|
|||
|
|
if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return;
|
|||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(damager);
|
|||
|
|
local maxLoad = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ELEMENTALWEAK, 0);
|
|||
|
|
local skillLevel = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALWEAK);
|
|||
|
|
local decrease = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALWEAK, 0, skillLevel);
|
|||
|
|
local time = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALWEAK, 2, skillLevel);
|
|||
|
|
local attackInfo = sq_GetCurrentAttackInfo(realAttacker);
|
|||
|
|
local element = [ENUM_ELEMENT_FIRE,ENUM_ELEMENT_WATER,ENUM_ELEMENT_DARK,ENUM_ELEMENT_LIGHT];
|
|||
|
|
local element2 = ["attack_fire","attack_ice","attack_dark","attack_light"];
|
|||
|
|
for(local i = 0; i < 4; i++){
|
|||
|
|
if(attackInfo.isValidElement(element[i])){
|
|||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(activeObj, ELEMENTALWEAKDEBUFF_APDPATH);
|
|||
|
|
if(!addAppendage){
|
|||
|
|
addAppendage = CNSquirrelAppendage.sq_AppendAppendage(activeObj, obj, -1, false, ELEMENTALWEAKDEBUFF_APDPATH, true);
|
|||
|
|
addAppendage.getVar("custom").setInt(10, maxLoad);
|
|||
|
|
addAppendage.getVar("custom").setInt(11, decrease);
|
|||
|
|
addAppendage.getVar("custom").setInt(12, time);
|
|||
|
|
}
|
|||
|
|
for(local ui = 10; ui < 10 + maxLoad; ui++){
|
|||
|
|
if(addAppendage.getVar(element2[i]).getBool(ui) == false){
|
|||
|
|
addAppendage.getVar(element2[i]).setBool(ui, true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function proc_appendage_elementalweakdebuff(appendage)
|
|||
|
|
{
|
|||
|
|
if(!appendage) return;
|
|||
|
|
local targetObj = appendage.getParent();
|
|||
|
|
local sqrChr = appendage.getSource();
|
|||
|
|
targetObj = sq_GetCNRDObjectToActiveObject(targetObj);
|
|||
|
|
sqrChr = sq_GetCNRDObjectToSQRCharacter(sqrChr);
|
|||
|
|
if(!targetObj || targetObj.getState() == STATE_DIE){
|
|||
|
|
appendage.setValid(false);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
local maxLoad = appendage.getVar("custom").getInt(10);
|
|||
|
|
local decrease = appendage.getVar("custom").getInt(11);
|
|||
|
|
local time = appendage.getVar("custom").getInt(12);
|
|||
|
|
|
|||
|
|
local element = ["attack_fire","attack_ice","attack_dark","attack_light"];
|
|||
|
|
for(local i = 0; i < element.len(); i++){
|
|||
|
|
local timer = appendage.getVar(element[i]).get_ct_vector(0);
|
|||
|
|
if(!timer){
|
|||
|
|
appendage.getVar(element[i]).clear_ct_vector();
|
|||
|
|
appendage.getVar(element[i]).push_ct_vector();
|
|||
|
|
timer = appendage.getVar(element[i]).get_ct_vector(0);
|
|||
|
|
timer.Reset();
|
|||
|
|
timer.Start(10000,0);
|
|||
|
|
}
|
|||
|
|
local currentT = timer.Get();
|
|||
|
|
if(currentT >= time){
|
|||
|
|
for(local oi = 0; oi < maxLoad; oi++){
|
|||
|
|
appendage.getVar(element[i]).setBool(10 + oi, false);
|
|||
|
|
appendage.getVar(element[i]).setBool(20 + oi, false);
|
|||
|
|
}
|
|||
|
|
timer.Reset();
|
|||
|
|
timer.Start(10000,0);
|
|||
|
|
}
|
|||
|
|
for(local ui = 0; ui < maxLoad; ui++){
|
|||
|
|
if(appendage.getVar(element[i]).getBool(10 + ui) && appendage.getVar(element[i]).getBool(20 + ui) == false){
|
|||
|
|
appendage.getVar(element[i]).setBool(20 + ui, true);
|
|||
|
|
local ap = sq_CreateChangeStatus(20 + i, false, -decrease.tofloat() , 0);
|
|||
|
|
if (ap){
|
|||
|
|
ap.getAppendageInfo().setValidTime(time);
|
|||
|
|
ap.sq_Append(targetObj, sqrChr);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function useSkill_before_Mage_elementalmaster_bykk(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate)
|
|||
|
|
{
|
|||
|
|
//printp(" consumpMp:" + consumeMp + " oldSkillMpRate:" + oldSkillMpRate);
|
|||
|
|
local skillLevel = obj.sq_GetSkillLevel(ELEMENTALMASTER_SKILL_ELEMENTMASTERY);
|
|||
|
|
if(skillLevel > 0){
|
|||
|
|
local mpComsumeRate = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTMASTERY, 3, skillLevel);
|
|||
|
|
if(oldSkillMpRate != 1.0) oldSkillMpRate = 1.0;
|
|||
|
|
local newMpRate = oldSkillMpRate.tofloat() * (100 - mpComsumeRate.tofloat()) / 100;
|
|||
|
|
// print(" newMpRate:" + newMpRate);
|
|||
|
|
obj.setSkillMpRate(skillIndex, newMpRate.tofloat());
|
|||
|
|
}
|
|||
|
|
//print(" now consumpMp:" + obj.getSkillMpRate(skillIndex));
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function cearteSkillPassive_Elementalmaster_bykk(obj,passiveObj,objnum,x,y,z,direction,skillIndex,subtype,pushv1,pushv2,pushv3,pushv4,pushv5,pushv6,pushv7,pushv8,bonusnum,powernum)
|
|||
|
|
{
|
|||
|
|
if(!obj || !passiveObj) return;
|
|||
|
|
if(pushv1 == null) pushv1 = 0;
|
|||
|
|
if(pushv2 == null) pushv2 = 0;
|
|||
|
|
if(pushv3 == null) pushv3 = 0;
|
|||
|
|
if(pushv4 == null) pushv4 = 0;
|
|||
|
|
if(pushv5 == null) pushv5 = 0;
|
|||
|
|
if(pushv6 == null) pushv6 = 0;
|
|||
|
|
if(pushv7 == null) pushv7 = 0;
|
|||
|
|
if(pushv8 == null) pushv8 = 0;
|
|||
|
|
if(bonusnum > 0){
|
|||
|
|
local bonusRate = 1.0;//obj.getVar("witchs_bonusRate").get_vector(0).tofloat() / 1000.0;
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL);
|
|||
|
|
if(skill_level > 0){
|
|||
|
|
local add_Rate = 0.0;
|
|||
|
|
switch(skillIndex){
|
|||
|
|
case ELEMENTALMASTER_SKILL_ELEMENTALCHAIN: add_Rate = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 7, skill_level);
|
|||
|
|
case ELEMENTALMASTER_SKILL_FLAMESTRIKE:
|
|||
|
|
case ELEMENTALMASTER_SKILL_VOID:
|
|||
|
|
case ELEMENTALMASTER_SKILL_SUNBURST:
|
|||
|
|
add_Rate = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 8, skill_level);
|
|||
|
|
break;
|
|||
|
|
case ELEMENTALMASTER_SKILL_THUNDERCALLING: add_Rate = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 12, skill_level); break;
|
|||
|
|
case ELEMENTALMASTER_SKILL_ARCTICPISTE: add_Rate = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 15, skill_level); break;
|
|||
|
|
case ELEMENTALMASTER_SKILL_BLACKHOLE: add_Rate = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 14, skill_level); break;
|
|||
|
|
case ELEMENTALMASTER_SKILL_HALLOWEENBUSTER: add_Rate = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 13, skill_level); break;
|
|||
|
|
case ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND:
|
|||
|
|
case ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN:
|
|||
|
|
case ELEMENTALMASTER_SKILL_ELEMENTALQUAKE:
|
|||
|
|
case ELEMENTALMASTER_SKILL_THEGATE:
|
|||
|
|
case ELEMENTALMASTER_SKILL_SESTOELEMENTO:
|
|||
|
|
case ELEMENTALMASTER_SKILL_THUNDERRAGE:
|
|||
|
|
add_Rate = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 16, skill_level);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
bonusRate += add_Rate.tofloat() / 1000.0;
|
|||
|
|
}
|
|||
|
|
switch (bonusnum) {
|
|||
|
|
case 1: pushv1 = (pushv1.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
case 2: pushv2 = (pushv2.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
case 3: pushv3 = (pushv3.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
case 4: pushv4 = (pushv4.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
case 5: pushv5 = (pushv5.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
case 6: pushv6 = (pushv6.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
case 7: pushv7 = (pushv7.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
case 8: pushv8 = (pushv8.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if(powernum > 0){
|
|||
|
|
local bonusRate = 1.0;//obj.getVar("witchs_bonusRate").get_vector(0).tofloat() / 1000.0;
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL);
|
|||
|
|
if(skill_level > 0){
|
|||
|
|
local add_Rate = 0.0;
|
|||
|
|
if(skillIndex == ELEMENTALMASTER_SKILL_ELEMENTALCHAIN) add_Rate = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 7, skill_level);
|
|||
|
|
bonusRate += add_Rate.tofloat() / 1000.0;
|
|||
|
|
}
|
|||
|
|
switch (powernum) {
|
|||
|
|
case 1: pushv1 = (pushv1.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
case 2: pushv2 = (pushv2.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
case 3: pushv3 = (pushv3.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
case 4: pushv4 = (pushv4.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
case 5: pushv5 = (pushv5.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
case 6: pushv6 = (pushv6.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
case 7: pushv7 = (pushv7.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
case 8: pushv8 = (pushv8.tofloat() * bonusRate).tointeger(); break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
local destX_01 = 0;
|
|||
|
|
local destY_01 = 0;
|
|||
|
|
if(!isSameObject(obj, passiveObj)){
|
|||
|
|
destX_01 = passiveObj.getXPos() - obj.getXPos();
|
|||
|
|
destY_01 = passiveObj.getYPos() - obj.getYPos();
|
|||
|
|
z = z - obj.getZPos();
|
|||
|
|
if(direction == ENUM_DIRECTION_LEFT) destX_01 = obj.getXPos() - passiveObj.getXPos();
|
|||
|
|
}
|
|||
|
|
sq_BinaryStartWrite();
|
|||
|
|
sq_BinaryWriteDword(skillIndex);
|
|||
|
|
sq_BinaryWriteDword(subtype);
|
|||
|
|
sq_BinaryWriteDword(pushv1);
|
|||
|
|
sq_BinaryWriteDword(pushv2);
|
|||
|
|
sq_BinaryWriteDword(pushv3);
|
|||
|
|
sq_BinaryWriteDword(pushv4);
|
|||
|
|
sq_BinaryWriteDword(pushv5);
|
|||
|
|
sq_BinaryWriteDword(pushv6);
|
|||
|
|
sq_BinaryWriteDword(pushv7);
|
|||
|
|
sq_BinaryWriteDword(pushv8);
|
|||
|
|
sq_SendCreatePassiveObjectPacket(obj, objnum, 0, destX_01 + x, destY_01 + y, z, direction);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function createOnlyDrawObject_elementalmaster_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 onStart_appendage_elementalchain_bykk(appendage)
|
|||
|
|
{
|
|||
|
|
local parentObj = sq_GetCNRDObjectToSQRCharacter(appendage.getParent());
|
|||
|
|
|
|||
|
|
local skillLevel = sq_GetSkillLevel(parentObj,ELEMENTALMASTER_SKILL_ELEMENTALCHAIN);
|
|||
|
|
local lightTime = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN, 1, skillLevel);
|
|||
|
|
|
|||
|
|
appendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, ENUM_CHARACTERJOB_MAGE, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN, skillLevel);
|
|||
|
|
appendage.setEnableIsBuff(true);
|
|||
|
|
appendage.setBuffIconImage(28);
|
|||
|
|
|
|||
|
|
local value0 = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN, 6, skillLevel)
|
|||
|
|
local value1 = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN, 7, skillLevel);
|
|||
|
|
local value2 = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN, 8, skillLevel);
|
|||
|
|
local value3 = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN, 9, skillLevel);
|
|||
|
|
appendage.getVar("custom").setInt(0, value0);
|
|||
|
|
appendage.getVar("custom").setInt(1, value1);
|
|||
|
|
appendage.getVar("custom").setInt(2, value2);
|
|||
|
|
appendage.getVar("custom").setInt(3, value3);
|
|||
|
|
|
|||
|
|
appendage.getVar().setBool(1,false);
|
|||
|
|
appendage.getVar().setBool(2,false);
|
|||
|
|
appendage.getVar().setBool(3,false);
|
|||
|
|
appendage.getVar().setBool(4,false);
|
|||
|
|
|
|||
|
|
local offset_x = [35,35,-35,-35];
|
|||
|
|
local offset_y = [-20,20,20,-20];
|
|||
|
|
local offset_z = [23,30,30,30];
|
|||
|
|
local sub = 0;
|
|||
|
|
local mightyrune_level = sq_GetSkillLevel(parentObj, ELEMENTALMASTER_SKILL_MIGHTYRUNE);
|
|||
|
|
if(mightyrune_level > 0){
|
|||
|
|
sub = 1;
|
|||
|
|
offset_z = [30,30,30,30];
|
|||
|
|
lightTime = lightTime * (1000 + sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_MIGHTYRUNE, 0, mightyrune_level)) / 1000;
|
|||
|
|
}
|
|||
|
|
local assimilate_level = sq_GetSkillLevel(parentObj, ELEMENTALMASTER_SKILL_ASSIMILATE);
|
|||
|
|
if(assimilate_level > 0){
|
|||
|
|
sub = 2;
|
|||
|
|
offset_z = [30,30,30,30];
|
|||
|
|
appendage.getVar().setBool(1,true);
|
|||
|
|
appendage.getVar().setBool(2,true);
|
|||
|
|
appendage.getVar().setBool(3,true);
|
|||
|
|
appendage.getVar().setBool(4,true);
|
|||
|
|
setElementalChainBuff_bykk(parentObj,ELEMENTALMASTER_SKILL_ELEMENTALCHAIN,appendage);
|
|||
|
|
}
|
|||
|
|
for(local i = 1; i < 5; i++){
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(parentObj,parentObj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,offset_x[i-1],offset_y[i-1],offset_z[i-1],ENUM_DIRECTION_RIGHT,ELEMENTALMASTER_SKILL_ELEMENTALCHAIN,i,lightTime,sub,0,0,0,0,0,0,0,0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEnd_appendage_elementalchain_bykk(appendage)
|
|||
|
|
{
|
|||
|
|
local parentObj = sq_GetCNRDObjectToSQRCharacter(appendage.getParent());
|
|||
|
|
local name = ["elementalchain_light","elementalchain_ice","elementalchain_fire","elementalchain_dark"];
|
|||
|
|
for(local i = 0; i < name.len(); i++){
|
|||
|
|
local size = parentObj.getVar(name[i]).get_obj_vector_size();
|
|||
|
|
for(local ui = 0; ui < size; ui++){
|
|||
|
|
local effectObj = parentObj.getVar(name[i]).get_obj_vector(ui);
|
|||
|
|
if(effectObj) effectObj.setValid(false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onStart_appendage_magicaltempoup_bykk(appendage)
|
|||
|
|
{
|
|||
|
|
local parentObj = sq_GetCNRDObjectToSQRCharacter(appendage.getParent());
|
|||
|
|
|
|||
|
|
local skillLevel = sq_GetSkillLevel(parentObj,ELEMENTALMASTER_SKILL_MAGICALTEMPOUP);
|
|||
|
|
appendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, ENUM_CHARACTERJOB_MAGE, ELEMENTALMASTER_SKILL_MAGICALTEMPOUP, skillLevel);
|
|||
|
|
appendage.setEnableIsBuff(true);
|
|||
|
|
appendage.setBuffIconImage(34);
|
|||
|
|
|
|||
|
|
local lifeTime = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_MAGICALTEMPOUP, 0, skillLevel);
|
|||
|
|
local value1 = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_MAGICALTEMPOUP, 1, skillLevel);
|
|||
|
|
local value2 = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_MAGICALTEMPOUP, 2, skillLevel);
|
|||
|
|
local mightyrune_level = parentObj.sq_GetSkillLevel(ELEMENTALMASTER_SKILL_MIGHTYRUNE);
|
|||
|
|
if(mightyrune_level > 0){
|
|||
|
|
appendage.getAppendageInfo().setValidTime(0);
|
|||
|
|
local add_Rate = sq_GetLevelData(parentObj, ELEMENTALMASTER_SKILL_MIGHTYRUNE, 4, mightyrune_level);
|
|||
|
|
value1 = value1 * (1000 + add_Rate) / 1000;
|
|||
|
|
value2 = value2 * (1000 + add_Rate) / 1000;
|
|||
|
|
}
|
|||
|
|
else if((sq_getGrowType(parentObj) == 4 && sq_GetSkillLevel(parentObj, SKILL_BYKK_LAPISPHILOSOPHORUM) > 0) || (sq_getGrowType(parentObj) == 2 && parentObj.getVar("eclipsehive_select").getBool(0))){
|
|||
|
|
appendage.getAppendageInfo().setValidTime(0);
|
|||
|
|
}
|
|||
|
|
else appendage.getAppendageInfo().setValidTime(lifeTime);
|
|||
|
|
|
|||
|
|
local change_appendage = appendage.sq_getChangeStatus("magicaltempoup");
|
|||
|
|
if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("magicaltempoup",parentObj, parentObj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, value1);
|
|||
|
|
if(change_appendage){
|
|||
|
|
change_appendage.clearParameter();
|
|||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_CAST_SPEED, false, (value2 * 1).tofloat());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onStart_appendage_mightyrune_bykk(appendage)
|
|||
|
|
{
|
|||
|
|
local parentObj = sq_GetCNRDObjectToSQRCharacter(appendage.getParent());
|
|||
|
|
|
|||
|
|
local skillLevel = sq_GetSkillLevel(parentObj,ELEMENTALMASTER_SKILL_MIGHTYRUNE);
|
|||
|
|
appendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, ENUM_CHARACTERJOB_MAGE, ELEMENTALMASTER_SKILL_MIGHTYRUNE, skillLevel);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onStart_appendage_moveoncast_bykk(appendage)
|
|||
|
|
{
|
|||
|
|
//
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function proc_appendage_moveoncast_bykk(appendage)
|
|||
|
|
{
|
|||
|
|
if(!appendage) return;
|
|||
|
|
local parentObj = sq_GetCNRDObjectToSQRCharacter(appendage.getParent());
|
|||
|
|
|
|||
|
|
if(parentObj.getState() == 13 && parentObj.getThrowIndex() == 74){
|
|||
|
|
sq_SetKeyxEnable(parentObj, E_JUMP_COMMAND, true);
|
|||
|
|
if(sq_IsEnterCommand(parentObj, E_JUMP_COMMAND)){
|
|||
|
|
parentObj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(appendage.getVar().getBool(0)){
|
|||
|
|
for(local i = 1; i < 255; i++){
|
|||
|
|
parentObj.setSkillCommandEnable(i, false);
|
|||
|
|
}
|
|||
|
|
if(parentObj.getState() == 0 || parentObj.getState() == 14){
|
|||
|
|
local bDownKey = parentObj.isDownSkillLastKey();
|
|||
|
|
if(!bDownKey){
|
|||
|
|
appendage.getVar().setBool(0, false);
|
|||
|
|
if(appendage.getVar().getInt(1) == ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN){
|
|||
|
|
parentObj.sq_IntVectClear();
|
|||
|
|
parentObj.sq_IntVectPush(1);
|
|||
|
|
parentObj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN, STATE_PRIORITY_USER, true);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
else if(appendage.getVar().getInt(1) == ELEMENTALMASTER_SKILL_ELEMENTALQUAKE){
|
|||
|
|
parentObj.sq_IntVectClear();
|
|||
|
|
parentObj.sq_IntVectPush(1);
|
|||
|
|
parentObj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_ELEMENTALQUAKE, STATE_PRIORITY_USER, true);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
else if(appendage.getVar().getInt(1) == ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND){
|
|||
|
|
parentObj.sq_IntVectClear();
|
|||
|
|
parentObj.sq_IntVectPush(1);
|
|||
|
|
parentObj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND, STATE_PRIORITY_USER, true);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
else if(appendage.getVar().getInt(1) == ELEMENTALMASTER_SKILL_THUNDERRAGE){
|
|||
|
|
parentObj.sq_IntVectClear();
|
|||
|
|
parentObj.sq_IntVectPush(2);
|
|||
|
|
parentObj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_THUNDERRAGE, STATE_PRIORITY_USER, true);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
else if(appendage.getVar().getInt(1) == ELEMENTALMASTER_SKILL_SESTOELEMENTO){
|
|||
|
|
parentObj.sq_IntVectClear();
|
|||
|
|
parentObj.sq_IntVectPush(0);
|
|||
|
|
parentObj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_SESTOELEMENTO, STATE_PRIORITY_USER, true);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
parentObj.sq_IntVectClear();
|
|||
|
|
parentObj.sq_IntVectPush(appendage.getVar().getInt(3) + 1);
|
|||
|
|
parentObj.sq_IntVectPush(appendage.getVar().getInt(1));
|
|||
|
|
parentObj.sq_IntVectPush(appendage.getVar().getInt(2));
|
|||
|
|
// print(appendage.getVar().getInt(3)+" && "+appendage.getVar().getInt(1)+" && "+appendage.getVar().getInt(2));
|
|||
|
|
parentObj.sq_AddSetStatePacket(ELEMENTALMASTER_STATE_ELEMENTALCHAIN, STATE_PRIORITY_USER, true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEnd_appendage_moveoncast_bykk(appendage)
|
|||
|
|
{
|
|||
|
|
//
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function monsterpulled_elementalmaster_bykk(obj,monsterobj,x,y,z,time,range)
|
|||
|
|
{
|
|||
|
|
if(!obj.isMovablePos(sq_GetXPos(monsterobj), sq_GetYPos(monsterobj))) return;
|
|||
|
|
local objectManager = obj.getObjectManager();
|
|||
|
|
local objectNumber = objectManager.getCollisionObjectNumber();
|
|||
|
|
for(local i = 0; i < objectNumber; i++){
|
|||
|
|
local targetObj = objectManager.getCollisionObject(i);
|
|||
|
|
if(targetObj && targetObj.isObjectType(OBJECTTYPE_ACTIVE) && targetObj.isEnemy(obj) && !CNSquirrelAppendage.sq_IsAppendAppendage(targetObj, "character/mage/k_k_made/appendage/aptomonster/debuff/ap_pulledmonster.nut") && sq_GetDistanceObject(monsterobj, targetObj, true) <= range){
|
|||
|
|
local appendagePath = "character/mage/k_k_made/appendage/aptomonster/debuff/ap_pulledmonster.nut";
|
|||
|
|
local MasterAppendage = CNSquirrelAppendage.sq_AppendAppendage(targetObj, obj, -1, false, appendagePath, true);
|
|||
|
|
if(MasterAppendage){
|
|||
|
|
sq_AccelMoveToAppendageForce(targetObj, obj, monsterobj, x, y, z, time, true, MasterAppendage, true);
|
|||
|
|
local validT = MasterAppendage.getAppendageInfo()
|
|||
|
|
validT.setValidTime(2000);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function elementalmaster_setbonusRate(obj)
|
|||
|
|
{
|
|||
|
|
local bonusRate = 1000;
|
|||
|
|
if(sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ASSIMILATE) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj,ELEMENTALMASTER_SKILL_ASSIMILATE, 0, sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ASSIMILATE))) / 1000;
|
|||
|
|
if(sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALWEAK) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj,ELEMENTALMASTER_SKILL_ELEMENTALWEAK, 5, sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALWEAK))) / 1000;
|
|||
|
|
if(sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTMASTERY) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTMASTERY, 4, sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTMASTERY))) / 1000;
|
|||
|
|
if(sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL) > 0){
|
|||
|
|
if(obj.sq_GetState() == 13){
|
|||
|
|
switch(obj.getThrowIndex()){
|
|||
|
|
case 56:
|
|||
|
|
bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 8, sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL))) / 1000;
|
|||
|
|
break;
|
|||
|
|
case 74:
|
|||
|
|
bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 16, sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL))) / 1000;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ELEMENTMASTERYBUFF)){
|
|||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, APDPATH_ELEMENTMASTERYBUFF);
|
|||
|
|
if(!addAppendage){
|
|||
|
|
obj.getVar("setSkillBonusRate").setInt(0, bonusRate.tointeger());
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
local addRate = addAppendage.getVar("custom").getInt(10);
|
|||
|
|
bonusRate = bonusRate * (1000 + addRate) / 1000;
|
|||
|
|
}
|
|||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_elementalchain.nut")){
|
|||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_elementalchain.nut");
|
|||
|
|
if(!addAppendage){
|
|||
|
|
obj.getVar("setSkillBonusRate").setInt(0, bonusRate.tointeger());
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
local skillLevel = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN);
|
|||
|
|
local buff_num = [];
|
|||
|
|
if(addAppendage.getVar().getBool(1)) buff_num.push(1);
|
|||
|
|
if(addAppendage.getVar().getBool(2)) buff_num.push(1);
|
|||
|
|
if(addAppendage.getVar().getBool(3)) buff_num.push(1);
|
|||
|
|
if(addAppendage.getVar().getBool(4)) buff_num.push(1);
|
|||
|
|
local value1 = 0;
|
|||
|
|
switch(buff_num.len()){
|
|||
|
|
case 1: value1 = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN, 6, skillLevel); break;
|
|||
|
|
case 2: value1 = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN, 7, skillLevel); break;
|
|||
|
|
case 3: value1 = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN, 8, skillLevel); break;
|
|||
|
|
case 4: value1 = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN, 9, skillLevel); break;
|
|||
|
|
}
|
|||
|
|
bonusRate = bonusRate * (10000 + value1) / 10000;
|
|||
|
|
}
|
|||
|
|
obj.getVar("setSkillBonusRate").setInt(0, bonusRate.tointeger());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getElementalMaster_RestAni(obj)
|
|||
|
|
{
|
|||
|
|
local animation = obj.sq_GetRestAni();
|
|||
|
|
if(obj.sq_GetSkillLevel(ELEMENTALMASTER_SKILL_ASSIMILATE) > 0) animation = obj.sq_GetCustomAni(ANIMATION_ELEMENTALMASTER_ELEMENTALMASTER_3RD_BODY);
|
|||
|
|
return animation;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
function elementalmaster_setelementSkillBonusRate(obj, skillIndex)
|
|||
|
|
{
|
|||
|
|
if(sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTMASTERY, 10, sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTMASTERY)) > 0){
|
|||
|
|
local AddAppendage;
|
|||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ELEMENTMASTERYBUFF)){
|
|||
|
|
AddAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,APDPATH_ELEMENTMASTERYBUFF);
|
|||
|
|
AddAppendage.sq_SetValidTime(8000);
|
|||
|
|
AddAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), ELEMENTALMASTER_SKILL_ELEMENTMASTERY, sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTMASTERY));
|
|||
|
|
CNSquirrelAppendage.sq_Append(AddAppendage, obj, obj, true);
|
|||
|
|
}
|
|||
|
|
else{
|
|||
|
|
AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, APDPATH_ELEMENTMASTERYBUFF, true);
|
|||
|
|
AddAppendage.getVar("custom").setInt(10, 0);
|
|||
|
|
obj.sq_AddSkillLoad(ELEMENTALMASTER_SKILL_ELEMENTMASTERY, 64, 0, 500);
|
|||
|
|
}
|
|||
|
|
local now_BonusRate = AddAppendage.getVar("custom").getInt(10);
|
|||
|
|
local new_BonusRate = 0;
|
|||
|
|
switch(skillIndex){
|
|||
|
|
case 15:
|
|||
|
|
case 16:
|
|||
|
|
case 17:
|
|||
|
|
case 18:
|
|||
|
|
new_BonusRate = now_BonusRate + 30;
|
|||
|
|
break;
|
|||
|
|
case ELEMENTALMASTER_SKILL_VOID:
|
|||
|
|
case ELEMENTALMASTER_SKILL_SUNBURST:
|
|||
|
|
case ELEMENTALMASTER_SKILL_WALLOFICE:
|
|||
|
|
case ELEMENTALMASTER_SKILL_FLAMESTRIKE:
|
|||
|
|
new_BonusRate = now_BonusRate + 30;
|
|||
|
|
break;
|
|||
|
|
case ELEMENTALMASTER_SKILL_HALLOWEENBUSTER:
|
|||
|
|
case ELEMENTALMASTER_SKILL_BLACKHOLE:
|
|||
|
|
case ELEMENTALMASTER_SKILL_THUNDERCALLING:
|
|||
|
|
case ELEMENTALMASTER_SKILL_ARCTICPISTE:
|
|||
|
|
new_BonusRate = now_BonusRate + 50;
|
|||
|
|
break;
|
|||
|
|
case ELEMENTALMASTER_SKILL_ELEMENTALSHOWER:
|
|||
|
|
case ELEMENTALMASTER_SKILL_ELEMENTALQUAKE:
|
|||
|
|
case ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN:
|
|||
|
|
case ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND:
|
|||
|
|
case ELEMENTALMASTER_SKILL_THEGATE:
|
|||
|
|
case ELEMENTALMASTER_SKILL_SESTOELEMENTO:
|
|||
|
|
case ELEMENTALMASTER_SKILL_THUNDERRAGE:
|
|||
|
|
new_BonusRate = now_BonusRate + 80;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if(new_BonusRate > 500) new_BonusRate = 500;
|
|||
|
|
AddAppendage.getVar("custom").setInt(10, new_BonusRate);
|
|||
|
|
local loadSlot = obj.sq_GetSkillLoad(ELEMENTALMASTER_SKILL_ELEMENTMASTERY);
|
|||
|
|
if(loadSlot){
|
|||
|
|
local getload = loadSlot.getRemainLoadNumber();
|
|||
|
|
if(new_BonusRate / 10 + getload > 50) loadSlot.increaseLoadCount(50 - getload);
|
|||
|
|
else loadSlot.increaseLoadCount(new_BonusRate / 10);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else{
|
|||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ELEMENTMASTERYBUFF)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_ELEMENTMASTERYBUFF);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEnd_appendage_elementmastery_buff(appendage)
|
|||
|
|
{
|
|||
|
|
if(!appendage) return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
function proc_appendage_elementmastery_buff(appendage)
|
|||
|
|
{
|
|||
|
|
if(!appendage) return;
|
|||
|
|
if(!appendage.isValid()) return;
|
|||
|
|
local parentObj = appendage.getParent();
|
|||
|
|
if(!parentObj || parentObj.getState() == STATE_DIE){
|
|||
|
|
appendage.setValid(false);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onStart_appendage_elementmastery_buff(appendage)
|
|||
|
|
{
|
|||
|
|
if(!appendage) return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onVaildTimeEnd_appendage_elementmastery_buff(appendage)
|
|||
|
|
{
|
|||
|
|
if(!appendage) return;
|
|||
|
|
local parentObj = appendage.getParent();
|
|||
|
|
if(!parentObj || parentObj.getState() == STATE_DIE){
|
|||
|
|
appendage.setValid(false);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
local obj = sq_GetCNRDObjectToSQRCharacter(parentObj);
|
|||
|
|
local loadSlot = obj.sq_GetSkillLoad(ELEMENTALMASTER_SKILL_ELEMENTMASTERY);
|
|||
|
|
if(loadSlot) obj.sq_RemoveSkillLoad(ELEMENTALMASTER_SKILL_ELEMENTMASTERY);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
function proc_appendage_elementalquake_bykk(appendage)
|
|||
|
|
{
|
|||
|
|
local sourceObj = appendage.getSource();
|
|||
|
|
if(!sourceObj){
|
|||
|
|
appendage.setValid(false);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_Arcticpiste_bykk(obj)
|
|||
|
|
{
|
|||
|
|
// print("test Arcticpiste");
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_Arcticpiste_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_Arcticpiste_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_Arcticpiste_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_Arcticpiste_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_Arcticpiste_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_Arcticpiste_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_BlackHole_bykk(obj)
|
|||
|
|
{
|
|||
|
|
// print("test BlackHole");
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_BlackHole_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_BlackHole_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_BlackHole_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_BlackHole_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_BlackHole_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_BlackHole_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_Crystalofovermind_bykk(obj)
|
|||
|
|
{
|
|||
|
|
// print("test Crystalofovermind");
|
|||
|
|
local istalisman = obj.getVar("crystal_talisman").getInt(0);
|
|||
|
|
if(istalisman > 0){
|
|||
|
|
local crystalObj = obj.getVar("crystal").get_obj_vector(0);
|
|||
|
|
if(crystalObj){
|
|||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(crystalObj);
|
|||
|
|
local state = colObj.getState();
|
|||
|
|
if(state <= 23){
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND);
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND, 0, skill_level);
|
|||
|
|
switch(state){
|
|||
|
|
case 20: totalDamage = totalDamage * 80 / 100; break;
|
|||
|
|
case 21: totalDamage = totalDamage * 90 / 100; break;
|
|||
|
|
case 22: totalDamage = totalDamage * 100 / 100; break;
|
|||
|
|
case 23: totalDamage = totalDamage * 125 / 100; break;
|
|||
|
|
}
|
|||
|
|
colObj.getVar("custom").setInt(2,totalDamage);
|
|||
|
|
colObj.addSetStatePacket(24, null, STATE_PRIORITY_AUTO, false, "");
|
|||
|
|
obj.getVar("crystal_talisman").setInt(0,0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
local b_useskill = obj.sq_IsUseSkill(ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND);
|
|||
|
|
if(b_useskill){
|
|||
|
|
obj.sq_IsEnterSkillLastKeyUnits(ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND);
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(0);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND, STATE_PRIORITY_USER, true);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_Crystalofovermind_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
obj.sq_StopMove();
|
|||
|
|
local substate = obj.sq_GetVectorData(datas, 0);
|
|||
|
|
obj.setSkillSubState(substate);
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
local Ani = obj.sq_GetThrowChargeAni(1);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND);
|
|||
|
|
local castTime = sq_GetCastTime(obj, ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND, skill_level);
|
|||
|
|
if(castTime > 1000){local pAni = obj.getCurrentAnimation();sq_SetFrameDelayTime(pAni, 1, castTime);}
|
|||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|||
|
|
local pAni = obj.getCurrentAnimation();
|
|||
|
|
local delaySum = pAni.getDelaySum(false);
|
|||
|
|
sq_StartDrawCastGauge(obj, delaySum, true);
|
|||
|
|
obj.getVar("crystal").setInt(1,delaySum);
|
|||
|
|
//音效
|
|||
|
|
if(sq_getRandom(1,100) > 50) obj.sq_PlaySound("WZ_CRYSTALOVERMIND_01_1");
|
|||
|
|
else obj.sq_PlaySound("WZ_CRYSTALOVERMIND_01_2");
|
|||
|
|
//设置效果
|
|||
|
|
sq_SetBodyEffect(obj, obj, true, sq_RGB(255, 255, 255), 100, 200, 999000, sq_ALPHA(100));
|
|||
|
|
//蓄气时钟开启
|
|||
|
|
obj.getVar("Crystalofovermind").clear_ct_vector();
|
|||
|
|
obj.getVar("Crystalofovermind").push_ct_vector();
|
|||
|
|
local timer = obj.getVar("Crystalofovermind").get_ct_vector(0);
|
|||
|
|
timer.Reset();
|
|||
|
|
timer.Start(10000,0);
|
|||
|
|
//获取蓄气上限
|
|||
|
|
local energycharge_Max = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND, 3);
|
|||
|
|
local minus_Rate = 0,minus_Rate2 = 0,minus_Rate3 = 0;
|
|||
|
|
local memorize_level = sq_GetSkillLevel(obj, 19);
|
|||
|
|
if(memorize_level > 0){
|
|||
|
|
minus_Rate = sq_GetLevelData(obj, 19, 1, memorize_level);
|
|||
|
|
}
|
|||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_magicaltempoup.nut")){
|
|||
|
|
local magicaltempoup_level = sq_GetSkillLevel(obj, 2);
|
|||
|
|
minus_Rate3 = sq_GetLevelData(obj, 2, 3, magicaltempoup_level);
|
|||
|
|
}
|
|||
|
|
local minus_Rate4 = 1000 - minus_Rate - minus_Rate3;
|
|||
|
|
local fullcharge = 0;
|
|||
|
|
if(minus_Rate4 > 0) energycharge_Max = energycharge_Max * minus_Rate4 / 1000;
|
|||
|
|
else fullcharge = 1;
|
|||
|
|
obj.getVar("moveoncast").setInt(2,energycharge_Max);
|
|||
|
|
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,0,0,80,obj.getDirection(),38,1,energycharge_Max,4,fullcharge,0,0,0,0,0,0,0);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_SetCurrentAnimation(ANIMATION_ELEMENTALMASTER_ELEMENTALQUAKE_CASTINGLOOPA_BODY);
|
|||
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/mage/effect/animation/elementalmaster_bykk/crystalofovermind/crystalofovermind_summon_body_front.ani",0,0,0);
|
|||
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/mage/effect/animation/elementalmaster_bykk/crystalofovermind/crystalofovermind_side_front_start01.ani",250,0,0);
|
|||
|
|
obj.stopSound(18);
|
|||
|
|
//设置效果
|
|||
|
|
sq_SetBodyEffect(obj, obj, true, sq_RGB(255, 255, 255), 100, 100, 0, sq_ALPHA(100));
|
|||
|
|
//声音
|
|||
|
|
if(sq_getRandom(1,100) > 50) obj.sq_PlaySound("WZ_CRYSTALOVERMIND_02_1");
|
|||
|
|
else obj.sq_PlaySound("WZ_CRYSTALOVERMIND_02_2");
|
|||
|
|
|
|||
|
|
local charge_obj = obj.getVar("moveoncast").get_obj_vector(0);
|
|||
|
|
if(charge_obj) charge_obj.setValid(false);
|
|||
|
|
|
|||
|
|
local timer = obj.getVar("Crystalofovermind").get_ct_vector(0);
|
|||
|
|
local currentT = 0;
|
|||
|
|
if(timer) currentT = timer.Get();
|
|||
|
|
local energycharge_Max = obj.getVar("moveoncast").getInt(2);
|
|||
|
|
|
|||
|
|
local xiuzheng = 1;
|
|||
|
|
if(currentT > energycharge_Max) xiuzheng = 0;
|
|||
|
|
|
|||
|
|
sq_BinaryStartWrite();
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_SendChangeSkillEffectPacket(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN);
|
|||
|
|
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND);
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND, 0, skill_level);
|
|||
|
|
local sizeRate = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND, 3 - xiuzheng);
|
|||
|
|
local istalisman = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND, 9);
|
|||
|
|
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,300,0,0,obj.getDirection(),ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND,1,totalDamage,sizeRate,istalisman,0,0,0,0,0,1,0);
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,300,0,0,obj.getDirection(),ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND,2,sizeRate,0,0,0,0,0,0,0,0,0);
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,300,0,0,obj.getDirection(),ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND,3,sizeRate,0,0,0,0,0,0,0,0,0);
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,300,0,0,obj.getDirection(),ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND,4,sizeRate,0,0,0,0,0,0,0,0,0);
|
|||
|
|
obj.getVar("crystal_talisman").setInt(0,istalisman);
|
|||
|
|
elementalmaster_setelementSkillBonusRate(obj, ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_Crystalofovermind_bykk(obj)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(!obj.sq_IsMyControlObject()) return;
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_Crystalofovermind_bykk(obj)
|
|||
|
|
{
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
local stateTime = obj.sq_GetStateTimer();
|
|||
|
|
if(stateTime < obj.getVar("crystal").getInt(1)) return;
|
|||
|
|
local bDownKey = obj.isDownSkillLastKey();
|
|||
|
|
if(!bDownKey){
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND, STATE_PRIORITY_USER, true);
|
|||
|
|
}
|
|||
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL)){
|
|||
|
|
//移动施法技能大于0时,获取人物身上移动施法AP,push技能子状态及技能编号等
|
|||
|
|
if(sq_GetSkillLevel(obj, 38) > 0){
|
|||
|
|
local mocAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_moveoncast.nut");
|
|||
|
|
if(mocAppendage){
|
|||
|
|
mocAppendage.getVar().setInt(1, ELEMENTALMASTER_SKILL_CRYSTALOFOVERMIND);
|
|||
|
|
mocAppendage.getVar().setBool(0, true);
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_Crystalofovermind_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_Crystalofovermind_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_Crystalofovermind_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(new_state != ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN){
|
|||
|
|
sq_EndDrawCastGauge(obj);
|
|||
|
|
}
|
|||
|
|
if(new_state == STATE_DIE || new_state == STATE_DAMAGE || new_state == STATE_DOWN || new_state == STATE_HOLD){
|
|||
|
|
if(sq_GetSkillLevel(obj, 38) > 0){
|
|||
|
|
local mocAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_moveoncast.nut");
|
|||
|
|
if(mocAppendage) mocAppendage.getVar().setBool(0, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_ElementalChain_bykk(obj)
|
|||
|
|
{
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_ElementalChain_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
obj.sq_StopMove();
|
|||
|
|
local substate = obj.sq_GetVectorData(datas, 0);
|
|||
|
|
obj.setSkillSubState(substate);
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
local Ani = obj.sq_GetThrowChargeAni(3);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN);
|
|||
|
|
local castTime = sq_GetCastTime(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN, skill_level);
|
|||
|
|
if(castTime > 800){local pAni = obj.getCurrentAnimation();sq_SetFrameDelayTime(pAni, 1, castTime);}
|
|||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|||
|
|
local pAni = obj.getCurrentAnimation();
|
|||
|
|
local delaySum = pAni.getDelaySum(false);
|
|||
|
|
sq_StartDrawCastGauge(obj, castTime, true);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
local Ani = obj.sq_GetThrowShootAni(3);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
createOnlyDrawObject_elementalmaster_bykk(obj,"character/mage/effect/animation/elementalmaster_bykk/elementalchain/start.ani",true,obj.getDirection(),sq_GetXPos(obj),sq_GetYPos(obj),sq_GetZPos(obj) + 40,ENUM_DRAWLAYER_NORMAL);
|
|||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_elementalchain.nut"))
|
|||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_elementalchain.nut");
|
|||
|
|
local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN, false, "character/mage/elementalmaster_bykk/ap/ap_elementalchain.nut", true);
|
|||
|
|
break;
|
|||
|
|
case 10:
|
|||
|
|
case 20:
|
|||
|
|
case 30:
|
|||
|
|
case 40:
|
|||
|
|
local skillIndex = obj.sq_GetVectorData(datas, 1);
|
|||
|
|
local sub = obj.sq_GetVectorData(datas, 2);
|
|||
|
|
local Ani = obj.sq_GetThrowChargeAni(sub);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
obj.getVar("moveoncast").setInt(0,skillIndex);
|
|||
|
|
obj.getVar("moveoncast").setInt(1,sub);
|
|||
|
|
//移動施法技能大于0時,獲取人物身上移動施法AP,push技能子狀態及技能編號等
|
|||
|
|
if(sq_GetSkillLevel(obj, 38) > 0){
|
|||
|
|
obj.sq_IsEnterSkillLastKeyUnits(skillIndex);
|
|||
|
|
local mocAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_moveoncast.nut");
|
|||
|
|
if(mocAppendage){
|
|||
|
|
mocAppendage.getVar().setInt(3, obj.sq_GetVectorData(datas, 0));
|
|||
|
|
mocAppendage.getVar().setInt(1, skillIndex);
|
|||
|
|
mocAppendage.getVar().setInt(2, sub);
|
|||
|
|
mocAppendage.getVar().setBool(0, true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if(skillIndex == 31) obj.getVar("sunburst_bool").setBool(0, false);
|
|||
|
|
//蓄氣時鍾開啓
|
|||
|
|
obj.getVar("ElementalChain").clear_ct_vector();
|
|||
|
|
obj.getVar("ElementalChain").push_ct_vector();
|
|||
|
|
local timer = obj.getVar("ElementalChain").get_ct_vector(0);
|
|||
|
|
timer.Reset();
|
|||
|
|
timer.Start(10000,0);
|
|||
|
|
//設置效果
|
|||
|
|
sq_SetBodyEffect(obj, obj, true, sq_RGB(255, 255, 255), 100, 200, 999000, sq_ALPHA(100));
|
|||
|
|
//獲取蓄氣上限
|
|||
|
|
local energycharge_Max = 0;
|
|||
|
|
switch(skillIndex){
|
|||
|
|
case 15: energycharge_Max = sq_GetIntData(obj, skillIndex, 1); break;//傑克爆彈
|
|||
|
|
case 16: energycharge_Max = sq_GetIntData(obj, skillIndex, 5); break;//冰霜雪人
|
|||
|
|
case 17: energycharge_Max = sq_GetIntData(obj, skillIndex, 2); break;//光電鳗
|
|||
|
|
case 18: energycharge_Max = sq_GetIntData(obj, skillIndex, 1); break;//暗影夜貓
|
|||
|
|
case 26: energycharge_Max = sq_GetIntData(obj, skillIndex, 2); break;//虛無之球
|
|||
|
|
case 27: energycharge_Max = sq_GetIntData(obj, skillIndex, 2); break;//傑克降臨
|
|||
|
|
case 31: energycharge_Max = sq_GetIntData(obj, skillIndex, 0); break;//雷旋
|
|||
|
|
case 58: energycharge_Max = sq_GetIntData(obj, skillIndex, 0); break;//黑洞
|
|||
|
|
case 59: energycharge_Max = sq_GetIntData(obj, skillIndex, 3); break;//極冰盛宴
|
|||
|
|
}
|
|||
|
|
local minus_Rate = 0,minus_Rate2 = 0,minus_Rate3 = 0;
|
|||
|
|
local memorize_level = sq_GetSkillLevel(obj, 19);
|
|||
|
|
if(memorize_level > 0){
|
|||
|
|
minus_Rate = sq_GetLevelData(obj, 19, 1, memorize_level);
|
|||
|
|
minus_Rate2 = sq_GetLevelData(obj, 19, 2, memorize_level);
|
|||
|
|
}
|
|||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_magicaltempoup.nut")){
|
|||
|
|
local magicaltempoup_level = sq_GetSkillLevel(obj, 2);
|
|||
|
|
minus_Rate3 = sq_GetLevelData(obj, 2, 3, magicaltempoup_level);
|
|||
|
|
}
|
|||
|
|
local minus_Rate4 = 1000 - minus_Rate - minus_Rate3;
|
|||
|
|
local minus_Rate5 = 1000 - minus_Rate - minus_Rate2 - minus_Rate3;
|
|||
|
|
local fullcharge = 0;
|
|||
|
|
if(minus_Rate5 > 0 && skillIndex <= 20) energycharge_Max = energycharge_Max * minus_Rate5 / 1000;
|
|||
|
|
else if(minus_Rate5 < 0 && skillIndex <= 20){energycharge_Max = 0;fullcharge = 1;}
|
|||
|
|
else if(minus_Rate4 > 0) energycharge_Max = energycharge_Max * minus_Rate4 / 1000;
|
|||
|
|
else fullcharge = 1;
|
|||
|
|
obj.getVar("moveoncast").setInt(2,energycharge_Max);
|
|||
|
|
|
|||
|
|
if(skillIndex > 20 && sq_GetSkillLevel(obj,ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL) > 0){
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,0,0,80,obj.getDirection(),38,1,energycharge_Max,4,fullcharge,0,0,0,0,0,0,0);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
switch(skillIndex){
|
|||
|
|
case 15:
|
|||
|
|
case 27:
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,0,0,80,obj.getDirection(),38,1,energycharge_Max,0,fullcharge,0,0,0,0,0,0,0);
|
|||
|
|
break;
|
|||
|
|
case 16:
|
|||
|
|
case 59:
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,0,0,80,obj.getDirection(),38,1,energycharge_Max,1,fullcharge,0,0,0,0,0,0,0);
|
|||
|
|
break;
|
|||
|
|
case 26:
|
|||
|
|
case 18:
|
|||
|
|
case 58:
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,0,0,80,obj.getDirection(),38,1,energycharge_Max,2,fullcharge,0,0,0,0,0,0,0);
|
|||
|
|
break;
|
|||
|
|
case 17:
|
|||
|
|
case 31:
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,0,0,80,obj.getDirection(),38,1,energycharge_Max,3,fullcharge,0,0,0,0,0,0,0);
|
|||
|
|
if(skillIndex == 31){
|
|||
|
|
local aniPath = ["character/mage/effect/animation/sunburstcast1.ani","character/mage/effect/animation/sunburstcast2.ani","character/mage/effect/animation/sunburstcast3.ani","character/mage/effect/animation/sunburstfloor1.ani","character/mage/effect/animation/sunburstfloor2.ani"];
|
|||
|
|
local drawlayer = [ENUM_DRAWLAYER_NORMAL,ENUM_DRAWLAYER_NORMAL,ENUM_DRAWLAYER_NORMAL,ENUM_DRAWLAYER_BOTTOM,ENUM_DRAWLAYER_BOTTOM];
|
|||
|
|
for(local i = 0; i < aniPath.len(); i++){
|
|||
|
|
createOnlyDrawObject_elementalmaster_bykk(obj,aniPath[i],true,obj.getDirection(),sq_GetXPos(obj),sq_GetYPos(obj),sq_GetZPos(obj),drawlayer[i]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case 11:
|
|||
|
|
case 21:
|
|||
|
|
case 31:
|
|||
|
|
case 41:
|
|||
|
|
local skillIndex = obj.sq_GetVectorData(datas, 1);
|
|||
|
|
obj.getVar("skillIndex").setInt(100, skillIndex);
|
|||
|
|
local sub = obj.sq_GetVectorData(datas, 2);
|
|||
|
|
local Ani = obj.sq_GetThrowShootAni(sub);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
obj.stopSound(18);
|
|||
|
|
//設置效果
|
|||
|
|
sq_SetBodyEffect(obj, obj, true, sq_RGB(255, 255, 255), 100, 100, 0, sq_ALPHA(100));
|
|||
|
|
//聲音
|
|||
|
|
switch(skillIndex){
|
|||
|
|
case 26: obj.sq_PlaySound("WZ_VOID"); break;
|
|||
|
|
case 31: obj.sq_PlaySound("WZ_SUNBURST"); break;
|
|||
|
|
case 15: obj.sq_PlaySound("WZ_LANTERN_FIRE"); break;
|
|||
|
|
case 16: obj.sq_PlaySound("WZ_FROSTHEAD"); break;
|
|||
|
|
case 17: obj.sq_PlaySound("WZ_FLUORE"); break;
|
|||
|
|
case 18: obj.sq_PlaySound("WZ_LAUNCH_PLUTO"); break;
|
|||
|
|
case 27: obj.sq_PlaySound("R_WZ_SHOOTING_STAR"); break;
|
|||
|
|
case 58: obj.sq_PlaySound("WZ_NIGHTH_02"); break;
|
|||
|
|
case 59: obj.sq_PlaySound("WZ_MAGIC_MISSILE"); break;
|
|||
|
|
}
|
|||
|
|
local timer = obj.getVar("ElementalChain").get_ct_vector(0);
|
|||
|
|
local currentT = 0;
|
|||
|
|
if(timer) currentT = timer.Get();
|
|||
|
|
local energycharge_Max = obj.getVar("moveoncast").getInt(2);
|
|||
|
|
obj.getVar("ElementalChain").clear_ct_vector();
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, skillIndex);
|
|||
|
|
|
|||
|
|
local Mightyrune_T =
|
|||
|
|
{//light,ice,fire,dark
|
|||
|
|
[15] = [0,0,1,0],
|
|||
|
|
[16] = [0,1,0,0],
|
|||
|
|
[18] = [0,0,0,1],
|
|||
|
|
[17] = [1,0,0,0],
|
|||
|
|
[26] = [0,0,0,1],
|
|||
|
|
[31] = [1,0,0,0],
|
|||
|
|
[27] = [0,0,1,0],
|
|||
|
|
[59] = [0,1,0,0],
|
|||
|
|
[55] = [1,0,0,0],
|
|||
|
|
[58] = [0,0,0,1]
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(Mightyrune_T.rawin(skillIndex)){
|
|||
|
|
sq_BinaryStartWrite();
|
|||
|
|
foreach(elsement in Mightyrune_T[skillIndex]){
|
|||
|
|
sq_BinaryWriteDword(elsement);
|
|||
|
|
}
|
|||
|
|
sq_SendChangeSkillEffectPacket(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
local charge_obj = obj.getVar("moveoncast").get_obj_vector(0);
|
|||
|
|
if(charge_obj) charge_obj.setValid(false);
|
|||
|
|
|
|||
|
|
local xiuzheng = 1;
|
|||
|
|
if(currentT > energycharge_Max) xiuzheng = 0;
|
|||
|
|
switch(skillIndex){//滿蓄力
|
|||
|
|
case 15://傑克爆彈
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, skillIndex, 1 - xiuzheng, skill_level);
|
|||
|
|
local powerDamage = sq_GetLevelData(obj, skillIndex, 9 - xiuzheng, skill_level);
|
|||
|
|
local nurmal_rate = sq_GetLevelData(obj, skillIndex, 5 - xiuzheng, skill_level) * 130 /100;
|
|||
|
|
local exp_rate = sq_GetLevelData(obj, skillIndex, 7 - xiuzheng, skill_level) * 130 /100;
|
|||
|
|
local shoot_range = sq_GetLevelData(obj, skillIndex, 3 - xiuzheng, skill_level);
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,75,0,50,obj.getDirection(),ELEMENTALMASTER_SKILL_ELEMENTALCHAIN,15,totalDamage,powerDamage,nurmal_rate,exp_rate,shoot_range,0,0,0,1,2);
|
|||
|
|
break;
|
|||
|
|
case 16://冰霜雪人
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, skillIndex, 1 - xiuzheng, skill_level);
|
|||
|
|
local powerDamage = sq_GetLevelData(obj, skillIndex, 15 - xiuzheng, skill_level);
|
|||
|
|
local nurmal_rate = sq_GetLevelData(obj, skillIndex, 6 - xiuzheng, skill_level) * 150 /100;
|
|||
|
|
local lifeTime = sq_GetLevelData(obj, skillIndex, 3 - xiuzheng, skill_level);
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,50,0,80,obj.getDirection(),ELEMENTALMASTER_SKILL_ELEMENTALCHAIN,16,totalDamage,powerDamage,nurmal_rate,lifeTime,0,0,0,0,1,2);
|
|||
|
|
local size = sq_GetLevelData(obj, skillIndex, 20, skill_level);
|
|||
|
|
if(size > 0){
|
|||
|
|
for(local i = 0; i < size; i++){
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,50,0,80 + 10 * (i + 1),obj.getDirection(),ELEMENTALMASTER_SKILL_ELEMENTALCHAIN,16,totalDamage,powerDamage,nurmal_rate,lifeTime,0,0,0,0,1,2);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case 17://光電鳗
|
|||
|
|
local number = sq_GetIntData(obj, skillIndex, 1);
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, skillIndex, 1 - xiuzheng, skill_level);
|
|||
|
|
local powerDamage = sq_GetLevelData(obj, skillIndex, 7 - xiuzheng, skill_level);
|
|||
|
|
local nurmal_rate = sq_GetLevelData(obj, skillIndex, 5 - xiuzheng, skill_level) * 150 /100;
|
|||
|
|
local lifeTime = sq_GetLevelData(obj, skillIndex, 3 - xiuzheng, skill_level);
|
|||
|
|
for(local i = 0; i < number; i++){
|
|||
|
|
local angle = 360 / number * i;
|
|||
|
|
local x = (sq_Cos(sq_ToRadian(angle.tofloat())) * 65.0).tointeger();
|
|||
|
|
local y = (sq_Sin(sq_ToRadian(angle.tofloat())) * 65.0).tointeger();
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,x,y,40,obj.getDirection(),ELEMENTALMASTER_SKILL_ELEMENTALCHAIN,17,totalDamage,powerDamage,nurmal_rate,lifeTime,angle,sq_GetXPos(obj),sq_GetYPos(obj),0,1,2);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case 18://暗影夜貓
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, skillIndex, 1 - xiuzheng, skill_level);
|
|||
|
|
local powerDamage = sq_GetLevelData(obj, skillIndex, 9 - xiuzheng, skill_level);
|
|||
|
|
local sizeRate = sq_GetLevelData(obj, skillIndex, 7 - xiuzheng, skill_level) * 130 /100;
|
|||
|
|
local speed_rate = sq_GetLevelData(obj, skillIndex, 3 - xiuzheng, skill_level);
|
|||
|
|
local shoot_range = sq_GetLevelData(obj, skillIndex, 5 - xiuzheng, skill_level);
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,75,0,50,obj.getDirection(),ELEMENTALMASTER_SKILL_ELEMENTALCHAIN,18,totalDamage,powerDamage,sizeRate,speed_rate,shoot_range,0,0,0,1,2);
|
|||
|
|
break;
|
|||
|
|
case 26://虛無之球
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, skillIndex, 1 - xiuzheng, skill_level);
|
|||
|
|
local sizeRate = sq_GetIntData(obj, skillIndex, 7 - xiuzheng) * 230 / 100;
|
|||
|
|
if(sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_VOIDEX) > 0){
|
|||
|
|
local prob = 100 - sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_VOIDEX) * 8 - sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_VOID, 9, sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_VOID));
|
|||
|
|
if(sq_getRandom(1, 100) > prob) sizeRate = sizeRate * 250 / 100;
|
|||
|
|
}
|
|||
|
|
local shoot_range = sq_GetLevelData(obj, skillIndex, 3 - xiuzheng, skill_level) / 20;
|
|||
|
|
local hittime = sq_GetIntData(obj, skillIndex, 1);
|
|||
|
|
if(sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ASSIMILATE) > 0){
|
|||
|
|
hittime = hittime / 2;
|
|||
|
|
local timeMax = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ASSIMILATE, 2);
|
|||
|
|
local damageRate = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ASSIMILATE, 4);
|
|||
|
|
local damageRate2 = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ASSIMILATE, 5);
|
|||
|
|
local isExp = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ASSIMILATE, 16);
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,120,0,60,obj.getDirection(),ELEMENTALMASTER_SKILL_VOID,2,totalDamage,hittime,timeMax,damageRate,damageRate2,sizeRate,isExp,0,1,0);
|
|||
|
|
}
|
|||
|
|
else cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,75,0,50,obj.getDirection(),ELEMENTALMASTER_SKILL_VOID,1,totalDamage,sizeRate,shoot_range,hittime,0,0,0,0,1,0);
|
|||
|
|
break;
|
|||
|
|
case 27://傑克降臨
|
|||
|
|
local sub = sq_GetIntData(obj, skillIndex, 6);
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, skillIndex, 1 - xiuzheng, skill_level);
|
|||
|
|
local totalDamage2 = sq_GetLevelData(obj, skillIndex, 3 - xiuzheng, skill_level);
|
|||
|
|
local sizeRate = sq_GetLevelData(obj, skillIndex, 7 - xiuzheng, skill_level) * 110 / 100;
|
|||
|
|
local sizeRate2 = sq_GetLevelData(obj, skillIndex, 5 - xiuzheng, skill_level) * 110 / 100;
|
|||
|
|
local damageRate = (totalDamage2.tofloat() / totalDamage.tofloat() * 100.0).tointeger();
|
|||
|
|
local number = sq_GetIntData(obj, skillIndex, 3) + 1;
|
|||
|
|
local x = 150, y = 0, z = 0, targetObj = obj;
|
|||
|
|
if(sq_GetIntData(obj, ELEMENTALMASTER_SKILL_HALLOWEENBUSTER, 4) > 0){
|
|||
|
|
local bhObj = obj.getVar("blackhole").get_obj_vector(0);
|
|||
|
|
if(bhObj){x = 0; y = 0;targetObj = bhObj;}
|
|||
|
|
else{
|
|||
|
|
local totalDamage = 100;
|
|||
|
|
local totalDamage2 = 100;
|
|||
|
|
local sizeRate = 40;
|
|||
|
|
local lifeTime = 1200;
|
|||
|
|
local attractPower = 600;
|
|||
|
|
local range = 400;
|
|||
|
|
local damageRate = (totalDamage2.tofloat() / totalDamage.tofloat() * 100.0).tointeger();
|
|||
|
|
local hitTime = 2000;
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,x,y,80,obj.getDirection(),ELEMENTALMASTER_SKILL_BLACKHOLE,1,totalDamage,sizeRate,lifeTime,damageRate,attractPower,range,0,hitTime,0,0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if(sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL) > 0 && !sq_GetSkill(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL).isSealFunction()){
|
|||
|
|
local elementalpotential_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL);
|
|||
|
|
local add_sizeRate = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 8);
|
|||
|
|
// local add_damageRate = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 13, elementalpotential_level);
|
|||
|
|
// totalDamage = totalDamage * (1000 + add_damageRate) / 1000;
|
|||
|
|
sizeRate = sizeRate * (100 + add_sizeRate) / 100;
|
|||
|
|
sizeRate2 = sizeRate2 * (100 + add_sizeRate) / 100;
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,targetObj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,x,y,z,obj.getDirection(),ELEMENTALMASTER_SKILL_HALLOWEENBUSTER,0,totalDamage,sizeRate,sizeRate2,damageRate,sub,2,number,0,1,0);
|
|||
|
|
}
|
|||
|
|
else{
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,targetObj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,x,y,z,obj.getDirection(),ELEMENTALMASTER_SKILL_HALLOWEENBUSTER,0,totalDamage,sizeRate,sizeRate2,damageRate,sub,1,number,0,1,0);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case 31://雷旋
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, skillIndex, 1 - xiuzheng, skill_level);
|
|||
|
|
local sizeRate = sq_GetIntData(obj, skillIndex, 2 - xiuzheng) * 230 /100;
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,0,0,50,obj.getDirection(),ELEMENTALMASTER_SKILL_SUNBURST,1,totalDamage,sizeRate,0,0,0,0,0,0,1,0);
|
|||
|
|
|
|||
|
|
local aniPath = ["passiveobject/elementalmaster_bykk/animation/sunburst/sunburstlayer2.ani","passiveobject/elementalmaster_bykk/animation/sunburst/sunburstlayer1.ani"];
|
|||
|
|
local offset_y = [1,-1];
|
|||
|
|
sizeRate = sizeRate.tofloat() / 100.0;
|
|||
|
|
for(local i = 0; i < aniPath.len(); i++){
|
|||
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj,aniPath[i],0,offset_y[i],50 + offset_y[i]);
|
|||
|
|
local pAni = pooledObj.getCurrentAnimation();
|
|||
|
|
pAni.setImageRateFromOriginal(sizeRate, sizeRate);
|
|||
|
|
pAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case 58://黑洞
|
|||
|
|
local size = obj.getVar("blackhole").get_obj_vector_size();
|
|||
|
|
if(size > 0){
|
|||
|
|
for(local i = 0; i < size; i++){
|
|||
|
|
local bhObj = obj.getVar("blackhole").get_obj_vector(i);
|
|||
|
|
if(bhObj){
|
|||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(bhObj);
|
|||
|
|
colObj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, "");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
local sub = sq_GetIntData(obj, skillIndex, 6);
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, skillIndex, 7 - xiuzheng, skill_level);
|
|||
|
|
local totalDamage2 = sq_GetLevelData(obj, skillIndex, 9 - xiuzheng, skill_level);
|
|||
|
|
local sizeRate = 100 + sq_GetIntData(obj, skillIndex, 5);
|
|||
|
|
local lifeTime = sq_GetLevelData(obj, skillIndex, 5 - xiuzheng, skill_level);
|
|||
|
|
local attractPower = sq_GetLevelData(obj, skillIndex, 1 - xiuzheng, skill_level);
|
|||
|
|
local range = sq_GetIntData(obj, skillIndex, 2 + xiuzheng);
|
|||
|
|
local damageRate = (totalDamage2.tofloat() / totalDamage.tofloat() * 100.0).tointeger();
|
|||
|
|
local hitTime = 300;
|
|||
|
|
if(sub > 0){
|
|||
|
|
lifeTime = lifeTime / 2;
|
|||
|
|
hitTime = hitTime / 3;
|
|||
|
|
}
|
|||
|
|
if(sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL) > 0 && !sq_GetSkill(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL).isSealFunction()){
|
|||
|
|
local elementalpotential_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL);
|
|||
|
|
local add_sizeRate = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 0);
|
|||
|
|
local minus_Rate = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 2);
|
|||
|
|
// local add_damageRate = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 14, elementalpotential_level);
|
|||
|
|
// totalDamage = totalDamage * (1000 + add_damageRate) / 1000;
|
|||
|
|
sizeRate = sizeRate * (100 + add_sizeRate) / 100;
|
|||
|
|
hitTime = hitTime * (100 - minus_Rate) / 100;
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,150,0,120,obj.getDirection(),ELEMENTALMASTER_SKILL_BLACKHOLE,2,totalDamage,sizeRate,lifeTime,damageRate,attractPower,range,sub,hitTime,1,0);
|
|||
|
|
}
|
|||
|
|
else{
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,150,0,100,obj.getDirection(),ELEMENTALMASTER_SKILL_BLACKHOLE,1,totalDamage,sizeRate,lifeTime,damageRate,attractPower,range,sub,hitTime,1,0);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case 59://極冰盛宴
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, skillIndex, 1 - xiuzheng, skill_level);
|
|||
|
|
local sizeRate = sq_GetLevelData(obj, skillIndex, 9 - xiuzheng, skill_level) * 160 / 100;
|
|||
|
|
local hitMax = sq_GetIntData(obj, skillIndex, 5);
|
|||
|
|
local hitTime = sq_GetIntData(obj, skillIndex, 2 - xiuzheng);
|
|||
|
|
local offset_x = sq_GetIntData(obj, skillIndex, 4);
|
|||
|
|
local speedRate = 30000 / sq_GetIntData(obj, skillIndex, 0);
|
|||
|
|
if(sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL) > 0 && !sq_GetSkill(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL).isSealFunction()){
|
|||
|
|
local elementalpotential_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL);
|
|||
|
|
local speed_rate = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 2);
|
|||
|
|
hitMax = hitMax + sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 16, elementalpotential_level);
|
|||
|
|
// local add_damageRate = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 15, elementalpotential_level);
|
|||
|
|
// totalDamage = totalDamage * (1000 + add_damageRate) / 1000;
|
|||
|
|
hitTime = hitTime * (100 - speed_rate) / 100;
|
|||
|
|
local sub = 0;
|
|||
|
|
local isBig = sq_GetLevelData(obj, skillIndex, 11, skill_level);
|
|||
|
|
if(isBig > 0){sub = 2;offset_x = offset_x - 150;}
|
|||
|
|
else if(sq_GetLevelData(obj, skillIndex, 10, skill_level) > 0) sub = 1;
|
|||
|
|
if(sub == 2) cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,offset_x,0,0,obj.getDirection(),ELEMENTALMASTER_SKILL_ARCTICPISTE,4,totalDamage * hitMax,sizeRate * 15 / 10, speedRate, isBig,0,0,0,0,1,0);
|
|||
|
|
else cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,offset_x,0,0,obj.getDirection(),ELEMENTALMASTER_SKILL_ARCTICPISTE,2,totalDamage,sizeRate,hitMax,hitTime,speedRate,sub,0,0,1,0);
|
|||
|
|
obj.setTimeEvent(100,50,1,false);
|
|||
|
|
}
|
|||
|
|
else{
|
|||
|
|
local sub = 0;
|
|||
|
|
local isBig = sq_GetLevelData(obj, skillIndex, 11, skill_level);
|
|||
|
|
if(isBig > 0){sub = 2;offset_x = offset_x - 150;}
|
|||
|
|
else if(sq_GetLevelData(obj, skillIndex, 10, skill_level) > 0) sub = 1;
|
|||
|
|
if(sub == 2) cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,offset_x,0,0,obj.getDirection(),ELEMENTALMASTER_SKILL_ARCTICPISTE,3,totalDamage * hitMax,sizeRate * 15 / 10, speedRate, isBig,0,0,0,0,1,0);
|
|||
|
|
else cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,offset_x,0,0,obj.getDirection(),ELEMENTALMASTER_SKILL_ARCTICPISTE,1,totalDamage,sizeRate,hitMax,hitTime,speedRate,sub,0,0,1,0);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
elementalmaster_setelementSkillBonusRate(obj, skillIndex);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_ElementalChain_bykk(obj)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(!obj.sq_IsMyControlObject()) return;
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_STATE_ELEMENTALCHAIN, STATE_PRIORITY_USER, true);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
case 11:
|
|||
|
|
case 21:
|
|||
|
|
case 31:
|
|||
|
|
case 41:
|
|||
|
|
if(obj.getVar("skillIndex").getInt(100) == 31 && sq_GetLevelData(obj, 31, 4, sq_GetSkillLevel(obj, 31)) > 0 && obj.getVar("sunburst_bool").getBool(0) == false){
|
|||
|
|
if(sq_getRandom(1, 99) > 100 - sq_GetLevelData(obj, 31, 4, sq_GetSkillLevel(obj, 31))){
|
|||
|
|
obj.getVar("sunburst_bool").setBool(0, true);
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,0,0,50,obj.getDirection(),ELEMENTALMASTER_SKILL_SUNBURST,2,200,0,0,0,0,0,0,0,0,0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_ElementalChain_bykk(obj)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 10:
|
|||
|
|
case 20:
|
|||
|
|
case 30:
|
|||
|
|
case 40:
|
|||
|
|
local bDownKey = obj.isDownSkillLastKey();
|
|||
|
|
if(!bDownKey){
|
|||
|
|
local mocAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_moveoncast.nut");
|
|||
|
|
if(mocAppendage) mocAppendage.getVar().setBool(0, false);
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(substate + 1);
|
|||
|
|
obj.sq_IntVectPush(obj.getVar("moveoncast").getInt(0));
|
|||
|
|
obj.sq_IntVectPush(obj.getVar("moveoncast").getInt(1));
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_STATE_ELEMENTALCHAIN, STATE_PRIORITY_USER, true);
|
|||
|
|
}
|
|||
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL)){
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_ElementalChain_bykk(obj, flagIndex)
|
|||
|
|
{}
|
|||
|
|
|
|||
|
|
function onTimeEvent_ElementalChain_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
switch(timeEventIndex){
|
|||
|
|
case 100: obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false); break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_ElementalChain_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(new_state != ELEMENTALMASTER_SKILL_ELEMENTALCHAIN){
|
|||
|
|
sq_EndDrawCastGauge(obj);
|
|||
|
|
}
|
|||
|
|
if(new_state == STATE_DIE || new_state == STATE_DAMAGE || new_state == STATE_DOWN || new_state == STATE_HOLD){
|
|||
|
|
if(sq_GetSkillLevel(obj, 38) > 0){
|
|||
|
|
local mocAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_moveoncast.nut");
|
|||
|
|
if(mocAppendage) mocAppendage.getVar().setBool(0, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onCreateObject_ElementalChain_bykk(obj, createObject)
|
|||
|
|
{}
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_Elementalcurtain_bykk(obj)
|
|||
|
|
{
|
|||
|
|
//print("test Elementalcurtain");
|
|||
|
|
local b_useskill = obj.sq_IsUseSkill(ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN);
|
|||
|
|
if(b_useskill){
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN);
|
|||
|
|
obj.startSkillCoolTime(ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN, skill_level, -1);
|
|||
|
|
obj.sq_IsEnterSkillLastKeyUnits(ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN);
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(0);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN, STATE_PRIORITY_USER, true);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_Elementalcurtain_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
obj.sq_StopMove();
|
|||
|
|
local substate = obj.sq_GetVectorData(datas, 0);
|
|||
|
|
obj.setSkillSubState(substate);
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
obj.sq_SetCurrentAnimation(ANIMATION_ELEMENTALMASTER_ELEMENTALCURTAIN_CAST_BODY);
|
|||
|
|
obj.getVar("moveoncast").setInt(0,ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN);
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN);
|
|||
|
|
local castTime = sq_GetCastTime(obj, ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN, skill_level);
|
|||
|
|
if(castTime > 1000){local pAni = obj.getCurrentAnimation();sq_SetFrameDelayTime(pAni, 4, castTime);}
|
|||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|||
|
|
local pAni = obj.getCurrentAnimation();
|
|||
|
|
local delaySum = pAni.getDelaySum(false);
|
|||
|
|
sq_StartDrawCastGauge(obj, delaySum, true);
|
|||
|
|
obj.getVar("elementalcurtain").setInt(1,delaySum);
|
|||
|
|
//音效
|
|||
|
|
obj.sq_PlaySound("WZ_ELEMENTALCURTAIN_01_1",18);//WZ_ELEMENTALCURTAIN_01_2
|
|||
|
|
//设置效果
|
|||
|
|
sq_SetBodyEffect(obj, obj, true, sq_RGB(255, 255, 255), 100, 200, 999000, sq_ALPHA(100));
|
|||
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/mage/effect/animation/elementalmaster_bykk/elementalcurtain/elementalcurtain_cast_effect.ani",0,0,0);
|
|||
|
|
|
|||
|
|
//蓄气时钟开启
|
|||
|
|
obj.getVar("ElementalChain").clear_ct_vector();
|
|||
|
|
obj.getVar("ElementalChain").push_ct_vector();
|
|||
|
|
local timer = obj.getVar("ElementalChain").get_ct_vector(0);
|
|||
|
|
timer.Reset();
|
|||
|
|
timer.Start(10000,0);
|
|||
|
|
//获取蓄气上限
|
|||
|
|
local energycharge_Max = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN, 4);
|
|||
|
|
local minus_Rate = 0,minus_Rate2 = 0,minus_Rate3 = 0;
|
|||
|
|
local memorize_level = sq_GetSkillLevel(obj, 19);
|
|||
|
|
if(memorize_level > 0){
|
|||
|
|
minus_Rate = sq_GetLevelData(obj, 19, 1, memorize_level);
|
|||
|
|
}
|
|||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_magicaltempoup.nut")){
|
|||
|
|
local magicaltempoup_level = sq_GetSkillLevel(obj, 2);
|
|||
|
|
minus_Rate3 = sq_GetLevelData(obj, 2, 3, magicaltempoup_level);
|
|||
|
|
}
|
|||
|
|
local minus_Rate4 = 1000 - minus_Rate - minus_Rate3;
|
|||
|
|
local fullcharge = 0;
|
|||
|
|
if(minus_Rate4 > 0) energycharge_Max = energycharge_Max * minus_Rate4 / 1000;
|
|||
|
|
else fullcharge = 1;
|
|||
|
|
obj.getVar("moveoncast").setInt(2,energycharge_Max);
|
|||
|
|
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,0,0,80,obj.getDirection(),38,1,energycharge_Max,4,fullcharge,0,0,0,0,0,0,0);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_SetCurrentAnimation(ANIMATION_ELEMENTALMASTER_ELEMENTALCURTAIN_SHOOT_BODY);
|
|||
|
|
obj.stopSound(18);
|
|||
|
|
//设置效果
|
|||
|
|
sq_SetBodyEffect(obj, obj, true, sq_RGB(255, 255, 255), 100, 100, 0, sq_ALPHA(100));
|
|||
|
|
//声音
|
|||
|
|
obj.sq_PlaySound("WZ_ELEMENTALCURTAIN_02_1");//WZ_ELEMENTALCURTAIN_02_2
|
|||
|
|
|
|||
|
|
local charge_obj = obj.getVar("moveoncast").get_obj_vector(0);
|
|||
|
|
if(charge_obj) charge_obj.setValid(false);
|
|||
|
|
|
|||
|
|
local timer = obj.getVar("ElementalChain").get_ct_vector(0);
|
|||
|
|
local currentT = 0;
|
|||
|
|
if(timer) currentT = timer.Get();
|
|||
|
|
local energycharge_Max = obj.getVar("moveoncast").getInt(2);
|
|||
|
|
|
|||
|
|
local xiuzheng = 1;
|
|||
|
|
if(currentT > energycharge_Max) xiuzheng = 0;
|
|||
|
|
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN);
|
|||
|
|
local istalisman = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN, 8) + 1;
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN, 0, skill_level);
|
|||
|
|
local totalDamage2 = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN, 1, skill_level);
|
|||
|
|
local damageRate = (totalDamage2.tofloat() / totalDamage.tofloat() * 100.0).tointeger();
|
|||
|
|
local sizeRate = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN, 1 - xiuzheng);
|
|||
|
|
local lifeTime = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN, 2);
|
|||
|
|
local hitTime = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN, 3);
|
|||
|
|
local hitMax = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN, 7);
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,300,0,0,obj.getDirection(),ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN,1,totalDamage,sizeRate,lifeTime,damageRate,hitTime,hitMax,istalisman,0,1,0);
|
|||
|
|
|
|||
|
|
if(istalisman > 0) obj.setTimeEvent(2,660,1,false);
|
|||
|
|
|
|||
|
|
sq_BinaryStartWrite();
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_SendChangeSkillEffectPacket(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN);
|
|||
|
|
elementalmaster_setelementSkillBonusRate(obj, ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_Elementalcurtain_bykk(obj)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(!obj.sq_IsMyControlObject()) return;
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_Elementalcurtain_bykk(obj)
|
|||
|
|
{
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
local stateTime = obj.sq_GetStateTimer();
|
|||
|
|
if(stateTime < obj.getVar("elementalcurtain").getInt(1)) return;
|
|||
|
|
local bDownKey = obj.isDownSkillLastKey();
|
|||
|
|
if(!bDownKey){
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN, STATE_PRIORITY_USER, true);
|
|||
|
|
}
|
|||
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL)){
|
|||
|
|
//移动施法技能大于0时,获取人物身上移动施法AP,push技能子状态及技能编号等
|
|||
|
|
if(sq_GetSkillLevel(obj, 38) > 0){
|
|||
|
|
local mocAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_moveoncast.nut");
|
|||
|
|
if(mocAppendage){
|
|||
|
|
mocAppendage.getVar().setInt(1, ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN);
|
|||
|
|
mocAppendage.getVar().setBool(0, true);
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_Elementalcurtain_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_Elementalcurtain_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
switch(timeEventIndex){
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN, STATE_PRIORITY_USER, true);
|
|||
|
|
break;
|
|||
|
|
case 2:
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_Elementalcurtain_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(new_state != ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN){
|
|||
|
|
sq_EndDrawCastGauge(obj);
|
|||
|
|
}
|
|||
|
|
if(new_state == STATE_DIE || new_state == STATE_DAMAGE || new_state == STATE_DOWN || new_state == STATE_HOLD){
|
|||
|
|
if(sq_GetSkillLevel(obj, 38) > 0){
|
|||
|
|
local mocAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_moveoncast.nut");
|
|||
|
|
if(mocAppendage) mocAppendage.getVar().setBool(0, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onCreateObject_Elementalcurtain_bykk(obj, createObject)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_Elementalquake_bykk(obj)
|
|||
|
|
{
|
|||
|
|
// print("test Elementalquake");
|
|||
|
|
local b_useskill = obj.sq_IsUseSkill(ELEMENTALMASTER_SKILL_ELEMENTALQUAKE);
|
|||
|
|
if(b_useskill){
|
|||
|
|
// local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALQUAKE);
|
|||
|
|
// obj.startSkillCoolTime(ELEMENTALMASTER_SKILL_ELEMENTALQUAKE, skill_level, -1);
|
|||
|
|
obj.sq_IsEnterSkillLastKeyUnits(ELEMENTALMASTER_SKILL_ELEMENTALQUAKE);
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(0);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_ELEMENTALQUAKE, STATE_PRIORITY_USER, true);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_Elementalquake_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
obj.sq_StopMove();
|
|||
|
|
local substate = obj.sq_GetVectorData(datas, 0);
|
|||
|
|
obj.setSkillSubState(substate);
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
obj.sq_SetCurrentAnimation(ANIMATION_ELEMENTALMASTER_ELEMENTALQUAKE_CASTINGSTART_BODY);
|
|||
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/mage/effect/animation/elementalmaster_bykk/elementalquake/castingstart_crack.ani",0,0,0);
|
|||
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/mage/effect/animation/elementalmaster_bykk/elementalquake/castingstarteffect_stone.ani",0,0,0);
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALQUAKE);
|
|||
|
|
local castTime = sq_GetCastTime(obj, ELEMENTALMASTER_SKILL_ELEMENTALQUAKE, skill_level);
|
|||
|
|
if(castTime > 1000){local pAni = obj.getCurrentAnimation();sq_SetFrameDelayTime(pAni, 1, castTime);}
|
|||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|||
|
|
local pAni = obj.getCurrentAnimation();
|
|||
|
|
local delaySum = pAni.getDelaySum(false);
|
|||
|
|
sq_StartDrawCastGauge(obj, delaySum, true);
|
|||
|
|
obj.getVar("elementalquake").setInt(1,delaySum);
|
|||
|
|
//音效
|
|||
|
|
if(sq_getRandom(1,100) > 50) obj.sq_PlaySound("WZ_ELEMENTALQUAKE_01_1");
|
|||
|
|
else obj.sq_PlaySound("WZ_ELEMENTALQUAKE_01_2");
|
|||
|
|
//设置效果
|
|||
|
|
sq_SetBodyEffect(obj, obj, true, sq_RGB(255, 255, 255), 100, 200, 999000, sq_ALPHA(100));
|
|||
|
|
//蓄气时钟开启
|
|||
|
|
obj.getVar("Elementalquake").clear_ct_vector();
|
|||
|
|
obj.getVar("Elementalquake").push_ct_vector();
|
|||
|
|
local timer = obj.getVar("Elementalquake").get_ct_vector(0);
|
|||
|
|
timer.Reset();
|
|||
|
|
timer.Start(10000,0);
|
|||
|
|
//获取蓄气上限
|
|||
|
|
local energycharge_Max = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ELEMENTALQUAKE, 3);
|
|||
|
|
local minus_Rate = 0,minus_Rate2 = 0,minus_Rate3 = 0;
|
|||
|
|
local memorize_level = sq_GetSkillLevel(obj, 19);
|
|||
|
|
if(memorize_level > 0){
|
|||
|
|
minus_Rate = sq_GetLevelData(obj, 19, 1, memorize_level);
|
|||
|
|
}
|
|||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_magicaltempoup.nut")){
|
|||
|
|
local magicaltempoup_level = sq_GetSkillLevel(obj, 2);
|
|||
|
|
minus_Rate3 = sq_GetLevelData(obj, 2, 3, magicaltempoup_level);
|
|||
|
|
}
|
|||
|
|
local minus_Rate4 = 1000 - minus_Rate - minus_Rate3;
|
|||
|
|
local fullcharge = 0;
|
|||
|
|
if(minus_Rate4 > 0) energycharge_Max = energycharge_Max * minus_Rate4 / 1000;
|
|||
|
|
else fullcharge = 1;
|
|||
|
|
obj.getVar("moveoncast").setInt(2,energycharge_Max);
|
|||
|
|
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,0,0,80,obj.getDirection(),38,1,energycharge_Max,4,fullcharge,0,0,0,0,0,0,0);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_SetCurrentAnimation(ANIMATION_ELEMENTALMASTER_ELEMENTALQUAKE_CASTINGLOOPA_BODY);
|
|||
|
|
obj.stopSound(18);
|
|||
|
|
//设置效果
|
|||
|
|
sq_SetBodyEffect(obj, obj, true, sq_RGB(255, 255, 255), 100, 100, 0, sq_ALPHA(100));
|
|||
|
|
//声音
|
|||
|
|
if(sq_getRandom(1,100) > 50) obj.sq_PlaySound("WZ_ELEMENTALQUAKE_02_1");
|
|||
|
|
else obj.sq_PlaySound("WZ_ELEMENTALQUAKE_02_2");
|
|||
|
|
|
|||
|
|
local charge_obj = obj.getVar("moveoncast").get_obj_vector(0);
|
|||
|
|
if(charge_obj) charge_obj.setValid(false);
|
|||
|
|
|
|||
|
|
local timer = obj.getVar("Elementalquake").get_ct_vector(0);
|
|||
|
|
local currentT = 0;
|
|||
|
|
if(timer) currentT = timer.Get();
|
|||
|
|
local energycharge_Max = obj.getVar("moveoncast").getInt(2);
|
|||
|
|
|
|||
|
|
local xiuzheng = 1;
|
|||
|
|
if(currentT > energycharge_Max) xiuzheng = 0;
|
|||
|
|
|
|||
|
|
sq_BinaryStartWrite();
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_SendChangeSkillEffectPacket(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN);
|
|||
|
|
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALQUAKE);
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALQUAKE, 0, skill_level);
|
|||
|
|
local totalDamage2 = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALQUAKE, 1, skill_level);
|
|||
|
|
local damageRate = (totalDamage2.tofloat() / totalDamage.tofloat() * 100.0).tointeger();
|
|||
|
|
local sizeRate = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ELEMENTALQUAKE, 8 - xiuzheng);
|
|||
|
|
local istalisman = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ELEMENTALQUAKE, 9) + 1;
|
|||
|
|
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,300,0,0,obj.getDirection(),ELEMENTALMASTER_SKILL_ELEMENTALQUAKE,1,totalDamage,damageRate,sizeRate,istalisman,0,0,0,0,1,0);
|
|||
|
|
obj.getVar("elementalquake_talisman").setInt(0,istalisman);
|
|||
|
|
elementalmaster_setelementSkillBonusRate(obj, ELEMENTALMASTER_SKILL_ELEMENTALQUAKE);
|
|||
|
|
break;
|
|||
|
|
case 2:
|
|||
|
|
obj.sq_SetCurrentAnimation(ANIMATION_ELEMENTALMASTER_ELEMENTALQUAKE_CASTINGLOOPB_BODY);
|
|||
|
|
if(obj.getVar("elementalquake_talisman").getInt(0) > 0) obj.setTimeEvent(1,500,1,false);
|
|||
|
|
break;
|
|||
|
|
case 3:
|
|||
|
|
obj.sq_SetCurrentAnimation(ANIMATION_ELEMENTALMASTER_ELEMENTALQUAKE_CASTINGEND_BODY);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_Elementalquake_bykk(obj)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(!obj.sq_IsMyControlObject()) return;
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
// obj.sq_IntVectClear();
|
|||
|
|
// obj.sq_IntVectPush(1);
|
|||
|
|
// obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_ELEMENTALQUAKE, STATE_PRIORITY_USER, true);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(2);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_ELEMENTALQUAKE, STATE_PRIORITY_USER, true);
|
|||
|
|
break;
|
|||
|
|
case 3:
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_Elementalquake_bykk(obj)
|
|||
|
|
{
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
local stateTime = obj.sq_GetStateTimer();
|
|||
|
|
if(stateTime < obj.getVar("elementalquake").getInt(1)) return;
|
|||
|
|
local bDownKey = obj.isDownSkillLastKey();
|
|||
|
|
if(!bDownKey){
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_ELEMENTALQUAKE, STATE_PRIORITY_USER, true);
|
|||
|
|
}
|
|||
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL)){
|
|||
|
|
//移动施法技能大于0时,获取人物身上移动施法AP,push技能子状态及技能编号等
|
|||
|
|
if(sq_GetSkillLevel(obj, 38) > 0){
|
|||
|
|
local mocAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_moveoncast.nut");
|
|||
|
|
if(mocAppendage){
|
|||
|
|
mocAppendage.getVar().setInt(1, ELEMENTALMASTER_SKILL_ELEMENTALQUAKE);
|
|||
|
|
mocAppendage.getVar().setBool(0, true);
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_Elementalquake_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_Elementalquake_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
switch(timeEventIndex){
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(3);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_ELEMENTALQUAKE, STATE_PRIORITY_USER, true);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_Elementalquake_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(new_state != ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN){
|
|||
|
|
sq_EndDrawCastGauge(obj);
|
|||
|
|
}
|
|||
|
|
if(new_state == STATE_DIE || new_state == STATE_DAMAGE || new_state == STATE_DOWN || new_state == STATE_HOLD){
|
|||
|
|
if(sq_GetSkillLevel(obj, 38) > 0){
|
|||
|
|
local mocAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_moveoncast.nut");
|
|||
|
|
if(mocAppendage) mocAppendage.getVar().setBool(0, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_ElementalShower_bykk(obj)
|
|||
|
|
{
|
|||
|
|
//print("test ElementalShower");
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALSHOWER);
|
|||
|
|
if(sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALSHOWER, 9, skill_level) > 0){
|
|||
|
|
local b_useskill = obj.sq_IsUseSkill(ELEMENTALMASTER_SKILL_ELEMENTALSHOWER);
|
|||
|
|
if(b_useskill){
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(0);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_ELEMENTALSHOWER, STATE_PRIORITY_IGNORE_FORCE, true);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_ElementalShower_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
obj.sq_StopMove();
|
|||
|
|
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_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|||
|
|
// local currentAni = obj.getCurrentAnimation();
|
|||
|
|
// currentAni.setSpeedRate(80.0);
|
|||
|
|
// local delaySum = currentAni.getDelaySum(false);
|
|||
|
|
// obj.sq_SetXScrollStart(200, delaySum);
|
|||
|
|
//obj.sq_PlaySound("WZ_SHOOTING_STAR_READY", 2000);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
local Ani = obj.sq_GetThrowShootAni(2);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|||
|
|
// local currentAni = obj.getCurrentAnimation();
|
|||
|
|
// local delaySum = currentAni.getDelaySum(false);
|
|||
|
|
obj.stopSound(2000);
|
|||
|
|
obj.sq_PlaySound("WZ_SHOOTING_STAR");
|
|||
|
|
|
|||
|
|
local skillLevel = sq_GetSkillLevel(obj, 74);
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, 74, 3, skillLevel);
|
|||
|
|
local totalDamage2 = sq_GetLevelData(obj, 74, 4, skillLevel);
|
|||
|
|
local number = sq_GetIntData(obj, 74, 10);
|
|||
|
|
local baseangle = sq_getRandom(0, 90);
|
|||
|
|
for(local i = 0; i < number; i++){
|
|||
|
|
local angle = 360 / number * i + baseangle;
|
|||
|
|
local x = (sq_Cos(sq_ToRadian(angle.tofloat())) * 130.0).tointeger();
|
|||
|
|
local y = (sq_Sin(sq_ToRadian(angle.tofloat())) * 65.0).tointeger();
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,225 + x, y, 300, obj.getDirection(),ELEMENTALMASTER_SKILL_ELEMENTALSHOWER,1,totalDamage,totalDamage2,0,0,0,0,0,0,1,0);
|
|||
|
|
}
|
|||
|
|
elementalmaster_setelementSkillBonusRate(obj, ELEMENTALMASTER_SKILL_ELEMENTALSHOWER);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_ElementalShower_bykk(obj)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(!obj.sq_IsMyControlObject()) return;
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_ELEMENTALSHOWER, STATE_PRIORITY_USER, true);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_ElementalShower_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_ElementalShower_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_ElementalShower_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_ElementalShower_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(new_state != ELEMENTALMASTER_SKILL_ELEMENTALCHAIN){
|
|||
|
|
obj.sq_SetXScrollStop(100);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_FlameStrike_bykk(obj)
|
|||
|
|
{
|
|||
|
|
//print("test FlameStrike");
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_FlameStrike_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
obj.sq_StopMove();
|
|||
|
|
local substate = obj.sq_GetVectorData(datas, 0);
|
|||
|
|
obj.setSkillSubState(substate);
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
obj.sq_RemoveAimPointMark();
|
|||
|
|
local Ani = obj.sq_GetThrowChargeAni(1);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
sq_StartDrawCastGauge(obj, 200, true);
|
|||
|
|
obj.setTimeEvent(0,100,1,true);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_RemoveAimPointMark();
|
|||
|
|
local Ani = obj.sq_GetThrowShootAni(1);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_FLAMESTRIKE);
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_FLAMESTRIKE, 0, skill_level);
|
|||
|
|
local sizeRate = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_FLAMESTRIKE, 5) * 125 /100;
|
|||
|
|
local etcTime = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_FLAMESTRIKE, 3, skill_level);
|
|||
|
|
local aimPosX = obj.sq_GetVectorData(datas, 1) - sq_GetXPos(obj);
|
|||
|
|
local aimPosY = obj.sq_GetVectorData(datas, 2) - sq_GetYPos(obj);
|
|||
|
|
if(sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ASSIMILATE) > 0){
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,aimPosX.tointeger(),aimPosY.tointeger(),0,ENUM_DIRECTION_RIGHT,ELEMENTALMASTER_SKILL_FLAMESTRIKE,2,totalDamage,sizeRate,etcTime,0,0,0,0,0,1,0);
|
|||
|
|
}
|
|||
|
|
else{
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,aimPosX.tointeger(),aimPosY.tointeger(),0,ENUM_DIRECTION_RIGHT,ELEMENTALMASTER_SKILL_FLAMESTRIKE,1,totalDamage,sizeRate,0,0,0,0,0,0,1,0);}
|
|||
|
|
|
|||
|
|
// [56] = [0,1,0,0],
|
|||
|
|
|
|||
|
|
sq_BinaryStartWrite();
|
|||
|
|
sq_BinaryWriteDword(0);
|
|||
|
|
sq_BinaryWriteDword(0);
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_BinaryWriteDword(0);
|
|||
|
|
sq_SendChangeSkillEffectPacket(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_FlameStrike_bykk(obj)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(!obj.sq_IsMyControlObject()) return;
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
// obj.sq_IntVectClear();
|
|||
|
|
// obj.sq_IntVectPush(1);
|
|||
|
|
// obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_FLAMESTRIKE, STATE_PRIORITY_USER, true);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_FlameStrike_bykk(obj)
|
|||
|
|
{
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
local stateTime = obj.sq_GetStateTimer();
|
|||
|
|
if(stateTime <= 200) return;
|
|||
|
|
local bDownKey = obj.isDownSkillLastKey();
|
|||
|
|
|
|||
|
|
local posX = obj.getXPos();
|
|||
|
|
local posY = obj.getYPos();
|
|||
|
|
|
|||
|
|
if(!bDownKey || stateTime >= 1000){
|
|||
|
|
local aimPosX = obj.sq_GetAimPosX(posX, posY, false);
|
|||
|
|
local aimPosY = obj.sq_GetAimPosY(posX, posY, false);
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_IntVectPush(aimPosX);
|
|||
|
|
obj.sq_IntVectPush(aimPosY);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_FLAMESTRIKE, STATE_PRIORITY_USER, true);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_FlameStrike_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_FlameStrike_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
switch(timeEventIndex){
|
|||
|
|
case 0:
|
|||
|
|
local posX = obj.getXPos();
|
|||
|
|
local posY = obj.getYPos();
|
|||
|
|
local posZ = obj.getZPos();
|
|||
|
|
|
|||
|
|
local offsetX = 150;
|
|||
|
|
offsetX = obj.sq_GetDistancePos(posX, obj.sq_GetDirection(), offsetX);
|
|||
|
|
|
|||
|
|
local vX = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_FLAMESTRIKE, 2) * 2;
|
|||
|
|
local vY = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_FLAMESTRIKE, 3) * 2;
|
|||
|
|
|
|||
|
|
obj.sq_AddAimPointMark(offsetX, posY, vX, vY);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_FlameStrike_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
if(new_state != ELEMENTALMASTER_SKILL_FLAMESTRIKE) obj.sq_RemoveAimPointMark();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_HalloweenBuster_bykk(obj)
|
|||
|
|
{
|
|||
|
|
// print("test HalloweenBuster");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_HalloweenBuster_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_HalloweenBuster_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_HalloweenBuster_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_HalloweenBuster_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_HalloweenBuster_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_HalloweenBuster_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_MagicalTempoUp_bykk(obj)
|
|||
|
|
{
|
|||
|
|
print("test MagicalTempoUp");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_MagicalTempoUp_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
obj.sq_StopMove();
|
|||
|
|
local substate = obj.sq_GetVectorData(datas, 0);
|
|||
|
|
obj.setSkillSubState(substate);
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
local Ani = obj.sq_GetThrowChargeAni(3);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_MAGICALTEMPOUP);
|
|||
|
|
local castTime = sq_GetCastTime(obj, ELEMENTALMASTER_SKILL_MAGICALTEMPOUP, skill_level);
|
|||
|
|
if(castTime > 800){local pAni = obj.getCurrentAnimation();sq_SetFrameDelayTime(pAni, 1, castTime);}
|
|||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|||
|
|
sq_StartDrawCastGauge(obj, castTime, true);
|
|||
|
|
local pAni = obj.getCurrentAnimation();
|
|||
|
|
print(pAni.getDelaySum(false));
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
local Ani = obj.sq_GetThrowShootAni(3);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_magicaltempoup.nut"))
|
|||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_magicaltempoup.nut");
|
|||
|
|
local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, ELEMENTALMASTER_SKILL_MAGICALTEMPOUP, false, "character/mage/elementalmaster_bykk/ap/ap_magicaltempoup.nut", true);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_MagicalTempoUp_bykk(obj)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(!obj.sq_IsMyControlObject()) return;
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_ASSIMILATE, STATE_PRIORITY_USER, true);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_MagicalTempoUp_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_MagicalTempoUp_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_MagicalTempoUp_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_MagicalTempoUp_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(new_state != ELEMENTALMASTER_SKILL_ASSIMILATE) sq_EndDrawCastGauge(obj);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_Mightyrune_bykk(obj)
|
|||
|
|
{
|
|||
|
|
// print("test Mightyrune");
|
|||
|
|
// if(obj.getVar("elementalchain_light").get_obj_vector_size() > 0){
|
|||
|
|
// local name = ["elementalchain_light","elementalchain_ice","elementalchain_fire","elementalchain_dark"];
|
|||
|
|
// for(local i = 0; i < 4; i++){
|
|||
|
|
// local effectObj = obj.getVar(name[i]).get_obj_vector(0);
|
|||
|
|
// if(effectObj){local colObj = sq_GetCNRDObjectToCollisionObject(effectObj);colObj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, "");}
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
local b_useskill = obj.sq_IsUseSkill(ELEMENTALMASTER_SKILL_MIGHTYRUNE);
|
|||
|
|
if(b_useskill){
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(0);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_STATE_MIGHTYRUNE, STATE_PRIORITY_USER, true);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_Mightyrune_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
obj.sq_StopMove();
|
|||
|
|
local substate = obj.sq_GetVectorData(datas, 0);
|
|||
|
|
obj.setSkillSubState(substate);
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
local Ani = obj.sq_GetThrowChargeAni(3);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN);
|
|||
|
|
local castTime = sq_GetCastTime(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN, skill_level);
|
|||
|
|
if(castTime > 800){local pAni = obj.getCurrentAnimation();sq_SetFrameDelayTime(pAni, 1, castTime);}
|
|||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|||
|
|
local pAni = obj.getCurrentAnimation();
|
|||
|
|
local delaySum = pAni.getDelaySum(false);
|
|||
|
|
sq_StartDrawCastGauge(obj, delaySum, true);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
local Ani = obj.sq_GetThrowShootAni(3);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
obj.sq_PlaySound("WZ_MIGHTYRUNE");
|
|||
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/mage/effect/animation/elementalmaster_bykk/mightyrune/runecast_01.ani",0,0,0);
|
|||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_elementalchain.nut"))
|
|||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_elementalchain.nut");
|
|||
|
|
CNSquirrelAppendage.sq_AppendAppendage(obj, obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN, false, "character/mage/elementalmaster_bykk/ap/ap_elementalchain.nut", true);
|
|||
|
|
|
|||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_magicaltempoup.nut"))
|
|||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_magicaltempoup.nut");
|
|||
|
|
CNSquirrelAppendage.sq_AppendAppendage(obj, obj, ELEMENTALMASTER_SKILL_MAGICALTEMPOUP, false, "character/mage/elementalmaster_bykk/ap/ap_magicaltempoup.nut", true);
|
|||
|
|
|
|||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_mightyrune.nut"))
|
|||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_mightyrune.nut");
|
|||
|
|
CNSquirrelAppendage.sq_AppendAppendage(obj, obj, ELEMENTALMASTER_SKILL_MIGHTYRUNE, false, "character/mage/elementalmaster_bykk/ap/ap_mightyrune.nut", true);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_Mightyrune_bykk(obj)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(!obj.sq_IsMyControlObject()) return;
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_STATE_MIGHTYRUNE, STATE_PRIORITY_USER, true);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_Mightyrune_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_Mightyrune_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_Mightyrune_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_Mightyrune_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(new_state != ELEMENTALMASTER_SKILL_ELEMENTALCHAIN) sq_EndDrawCastGauge(obj);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_Sestoelemento_bykk(obj)
|
|||
|
|
{
|
|||
|
|
// print("test Sestoelemento");
|
|||
|
|
local b_useskill = obj.sq_IsUseSkill(ELEMENTALMASTER_SKILL_SESTOELEMENTO);
|
|||
|
|
if(b_useskill){
|
|||
|
|
obj.sq_IsEnterSkillLastKeyUnits(ELEMENTALMASTER_SKILL_SESTOELEMENTO);
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(10);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_SESTOELEMENTO, STATE_PRIORITY_USER, true);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_Sestoelemento_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
obj.sq_StopMove();
|
|||
|
|
local substate = obj.sq_GetVectorData(datas, 0);
|
|||
|
|
obj.setSkillSubState(substate);
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
obj.sq_SetCurrentAnimation(ANIMATION_ELEMENTALMASTER_SESTOELEMENTOCAST);
|
|||
|
|
obj.setTimeEvent(1,2500,1,false);
|
|||
|
|
// local pooledObj = sq_AddDrawOnlyAniFromParent(obj,"passiveobject/elementalmaster_bykk/animation/sestoelemento/start_main.ani",350,-1,150);
|
|||
|
|
sq_SetBodyEffect(obj, obj, true, sq_RGB(255, 255, 255), 100, 100, 0, sq_ALPHA(100));
|
|||
|
|
sq_flashScreen(obj,1000,3500,300,255, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
|||
|
|
obj.sq_SetXScroll(350, 300, 3000, 100);
|
|||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(ELEMENTALMASTER_SKILL_SESTOELEMENTO, ELEMENTALMASTER_SKILL_SESTOELEMENTO, 0, 1.0) + 100;
|
|||
|
|
local hitMax = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_SESTOELEMENTO, 0);
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,350,0,150,obj.getDirection(),ELEMENTALMASTER_SKILL_SESTOELEMENTO,1,totalDamage,hitMax,0,0,0,0,0,0,1,0);
|
|||
|
|
sq_SendMessage(obj, 0, 1, 0);
|
|||
|
|
elementalmaster_setelementSkillBonusRate(obj, ELEMENTALMASTER_SKILL_SESTOELEMENTO);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_SetCurrentAnimation(ANIMATION_ELEMENTALMASTER_SESTOELEMENTOREADY);
|
|||
|
|
break;
|
|||
|
|
case 2:
|
|||
|
|
obj.sq_SetCurrentAnimation(ANIMATION_ELEMENTALMASTER_SESTOELEMENTOCHARGE);
|
|||
|
|
break;
|
|||
|
|
case 3:
|
|||
|
|
obj.sq_SetCurrentAnimation(ANIMATION_ELEMENTALMASTER_SESTOELEMENTOEXP);
|
|||
|
|
obj.sq_PlaySound("WZ_SESTOELEMENTO");
|
|||
|
|
// sq_AddDrawOnlyAniFromParent(obj,"passiveobject/elementalmaster_bykk/animation/sestoelemento/explosion_main.ani",350,-1,150);
|
|||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(ELEMENTALMASTER_SKILL_SESTOELEMENTO, ELEMENTALMASTER_SKILL_SESTOELEMENTO, 1, 1.0) + 100;
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,350,0,150,obj.getDirection(),ELEMENTALMASTER_SKILL_SESTOELEMENTO,2,totalDamage,0,0,0,0,0,0,0,1,0);
|
|||
|
|
break;
|
|||
|
|
case 10:
|
|||
|
|
local Ani = obj.sq_GetThrowChargeAni(1);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
obj.sq_PlaySound("WZ_SESTOELEMENTO_CAST");
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_SESTOELEMENTO);
|
|||
|
|
local castTime = sq_GetCastTime(obj, ELEMENTALMASTER_SKILL_SESTOELEMENTO, skill_level);
|
|||
|
|
if(castTime > 300){local pAni = obj.getCurrentAnimation();sq_SetFrameDelayTime(pAni, 2, castTime - 200);}
|
|||
|
|
local pAni = obj.getCurrentAnimation();
|
|||
|
|
local delaySum = pAni.getDelaySum(false);
|
|||
|
|
sq_StartDrawCastGauge(obj, delaySum, true);
|
|||
|
|
obj.sq_IsEnterSkillLastKeyUnits(ELEMENTALMASTER_SKILL_SESTOELEMENTO);
|
|||
|
|
sq_SetBodyEffect(obj, obj, true, sq_RGB(255, 255, 255), 100, 200, 999000, sq_ALPHA(100));
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_Sestoelemento_bykk(obj)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(!obj.sq_IsMyControlObject()) return;
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_SESTOELEMENTO, STATE_PRIORITY_USER, true);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(2);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_SESTOELEMENTO, STATE_PRIORITY_USER, true);
|
|||
|
|
break;
|
|||
|
|
case 2:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(3);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_SESTOELEMENTO, STATE_PRIORITY_USER, true);
|
|||
|
|
break;
|
|||
|
|
case 3:
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
break;
|
|||
|
|
// case 10:
|
|||
|
|
// obj.sq_IntVectClear();
|
|||
|
|
// obj.sq_IntVectPush(0);
|
|||
|
|
// obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_SESTOELEMENTO, STATE_PRIORITY_USER, true);
|
|||
|
|
// break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_Sestoelemento_bykk(obj)
|
|||
|
|
{
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 10:
|
|||
|
|
local stateTime = obj.sq_GetStateTimer();
|
|||
|
|
if(stateTime < 200) return;
|
|||
|
|
local bDownKey = obj.isDownSkillLastKey();
|
|||
|
|
if(!bDownKey){
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(0);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_SESTOELEMENTO, STATE_PRIORITY_USER, true);
|
|||
|
|
}
|
|||
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL)){
|
|||
|
|
//移动施法技能大于0时,获取人物身上移动施法AP,push技能子状态及技能编号等
|
|||
|
|
if(sq_GetSkillLevel(obj, 38) > 0){
|
|||
|
|
local mocAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_moveoncast.nut");
|
|||
|
|
if(mocAppendage){
|
|||
|
|
mocAppendage.getVar().setInt(1, ELEMENTALMASTER_SKILL_SESTOELEMENTO);
|
|||
|
|
mocAppendage.getVar().setBool(0, true);
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_Sestoelemento_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_Sestoelemento_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
switch(timeEventIndex){
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_SESTOELEMENTO, STATE_PRIORITY_USER, true);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_Sestoelemento_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
sq_SendMessage(obj, 0, 0, 0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onCreateObject_Sestoelemento_bykk(obj, createObject)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_SunBurst_bykk(obj)
|
|||
|
|
{
|
|||
|
|
// print("test SunBurst");
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_SunBurst_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_SunBurst_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_SunBurst_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_SunBurst_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_SunBurst_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_SunBurst_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_Thegate_bykk(obj)
|
|||
|
|
{
|
|||
|
|
// print("test Thegate");
|
|||
|
|
local b_useskill = obj.sq_IsUseSkill(ELEMENTALMASTER_SKILL_THEGATE);
|
|||
|
|
if(b_useskill){
|
|||
|
|
obj.sq_IsEnterSkillLastKeyUnits(ELEMENTALMASTER_SKILL_THEGATE);
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_THEGATE, STATE_PRIORITY_USER, true);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_Thegate_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
obj.sq_StopMove();
|
|||
|
|
local substate = obj.sq_GetVectorData(datas, 0);
|
|||
|
|
obj.setSkillSubState(substate);
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
local Ani = obj.sq_GetThrowChargeAni(1);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_SetCurrentAnimation(ANIMATION_ELEMENTALMASTER_THEGATECAST_BODY);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_Thegate_bykk(obj)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(!obj.sq_IsMyControlObject()) return;
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_THEGATE, STATE_PRIORITY_USER, true);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_Thegate_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_Thegate_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
switch(flagIndex){
|
|||
|
|
case 1:
|
|||
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/mage/effect/animation/elementalmaster_bykk/thegate/cast_start_maincircle.ani",75,0,60);
|
|||
|
|
break;
|
|||
|
|
case 2:
|
|||
|
|
local target_number = 0;
|
|||
|
|
local target_Max = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_THEGATE, 0);
|
|||
|
|
local create_time = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_THEGATE, 2);
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_THEGATE);
|
|||
|
|
local create_number = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_THEGATE, 0, skill_level);
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_THEGATE, 1, skill_level);
|
|||
|
|
print("totalDamage = "+totalDamage);
|
|||
|
|
local damageRate = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_THEGATE, 2, skill_level);
|
|||
|
|
obj.getVar("thegate_target").clear_obj_vector();
|
|||
|
|
local objectManager = obj.getObjectManager();//得到对象管理器
|
|||
|
|
local objectNumber = objectManager.getCollisionObjectNumber();//总数
|
|||
|
|
for (local i = 0; i < objectNumber; i++){
|
|||
|
|
local object = objectManager.getCollisionObject(i);//得到控制类对象
|
|||
|
|
if(object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object) && object.isInDamagableState(obj)){
|
|||
|
|
target_number = target_number + 1;
|
|||
|
|
obj.getVar("thegate_target").push_obj_vector(object);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(target_number > 0){
|
|||
|
|
if(target_number.tofloat() / target_Max.tofloat() <= 0.5) totalDamage = totalDamage * damageRate / 100;
|
|||
|
|
print("totalDamage count: "+totalDamage);
|
|||
|
|
//local skill = sq_GetSkill(obj, ELEMENTALMASTER_SKILL_THEGATE);
|
|||
|
|
local sub = sq_getRandom(0,3), isSeal = false;
|
|||
|
|
if(sq_GetIntData(obj, ELEMENTALMASTER_SKILL_THEGATE, 12) > 0){
|
|||
|
|
isSeal = true;
|
|||
|
|
totalDamage = totalDamage * 15;
|
|||
|
|
print("totalDamage on: "+totalDamage);
|
|||
|
|
}
|
|||
|
|
for(local i = 0; i < target_number; i++){
|
|||
|
|
local targetObj = obj.getVar("thegate_target").get_obj_vector(i);
|
|||
|
|
if(targetObj){
|
|||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(targetObj);
|
|||
|
|
if(isSeal == true){
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,activeObj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,0,0,380,obj.getDirection(),ELEMENTALMASTER_SKILL_THEGATE,10,totalDamage,sub,sq_GetGroup(activeObj),sq_GetUniqueId(activeObj),0,0,0,0,1,0);
|
|||
|
|
}
|
|||
|
|
else cearteSkillPassive_Elementalmaster_bykk(obj,activeObj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,0,0,380,obj.getDirection(),ELEMENTALMASTER_SKILL_THEGATE,1,totalDamage,create_number,create_time,sq_getRandom(1,4),sq_GetGroup(activeObj),sq_GetUniqueId(activeObj),0,0,1,0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
elementalmaster_setelementSkillBonusRate(obj, ELEMENTALMASTER_SKILL_THEGATE);
|
|||
|
|
break;
|
|||
|
|
case 3:
|
|||
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/mage/effect/animation/elementalmaster_bykk/thegate/cast_end_maincircle.ani",75,0,60);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_Thegate_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_Thegate_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onCreateObject_Thegate_bykk(obj, createObject)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_ThunderCalling_bykk(obj)
|
|||
|
|
{
|
|||
|
|
// print("test ThunderCalling");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_ThunderCalling_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
obj.sq_StopMove();
|
|||
|
|
local substate = obj.sq_GetVectorData(datas, 0);
|
|||
|
|
obj.setSkillSubState(substate);
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
obj.sq_RemoveAimPointMark();
|
|||
|
|
obj.sq_IsEnterSkillLastKeyUnits(ELEMENTALMASTER_SKILL_THUNDERCALLING);
|
|||
|
|
local Ani = obj.sq_GetThrowChargeAni(3);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
obj.setTimeEvent(0,200,1,false);
|
|||
|
|
sq_StartDrawCastGauge(obj, 200, true);
|
|||
|
|
// obj.sq_PlaySound("WZ_THUNDERC_01");
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_RemoveAimPointMark();
|
|||
|
|
local Ani = obj.sq_GetThrowShootAni(3);
|
|||
|
|
obj.setCurrentAnimation(Ani);
|
|||
|
|
obj.sq_PlaySound("WZ_THUNDERC_02");
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_THUNDERCALLING);
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_THUNDERCALLING, 3, skill_level);
|
|||
|
|
local countMax = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_THUNDERCALLING, 0, skill_level);
|
|||
|
|
if(sq_GetIntData(obj, ELEMENTALMASTER_SKILL_THUNDERCALLING, 11) > 0) countMax = 1;
|
|||
|
|
local sizeRate = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_THUNDERCALLING, 10) * 125 /100;
|
|||
|
|
local hitTime = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_THUNDERCALLING, 2);
|
|||
|
|
local aimPosX = obj.sq_GetVectorData(datas, 1) - sq_GetXPos(obj);
|
|||
|
|
local aimPosY = obj.sq_GetVectorData(datas, 2) - sq_GetYPos(obj);
|
|||
|
|
local thunderstrikeEx_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_THUNDERSTRIKEEX)
|
|||
|
|
if(thunderstrikeEx_level > 0){
|
|||
|
|
local add_Rate = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_THUNDERSTRIKEEX, 0, thunderstrikeEx_level);
|
|||
|
|
totalDamage = totalDamage * (1000 + add_Rate) / 1000;
|
|||
|
|
hitTime = hitTime / 2;
|
|||
|
|
}
|
|||
|
|
if(sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL) > 0 && !sq_GetSkill(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL).isSealFunction()){
|
|||
|
|
local range = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 3, sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL));
|
|||
|
|
local minus_Rate = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_ELEMENTALPOTENTIAL, 1);
|
|||
|
|
hitTime = hitTime * (100 - minus_Rate) / 100;
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,aimPosX.tointeger(),aimPosY.tointeger(),0,ENUM_DIRECTION_RIGHT,ELEMENTALMASTER_SKILL_THUNDERCALLING,0,totalDamage,sizeRate,countMax,hitTime,range,2,0,0,1,0);
|
|||
|
|
}
|
|||
|
|
else{
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,aimPosX.tointeger(),aimPosY.tointeger(),0,ENUM_DIRECTION_RIGHT,ELEMENTALMASTER_SKILL_THUNDERCALLING,0,totalDamage,sizeRate,countMax,hitTime,0,1,0,0,1,0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(sq_GetIntData(obj, ELEMENTALMASTER_SKILL_THUNDERCALLING, 12) > 1000){
|
|||
|
|
local objectManager = obj.getObjectManager();
|
|||
|
|
local objectNumber = objectManager.getCollisionObjectNumber();
|
|||
|
|
local damage = totalDamage * 33 / 100;
|
|||
|
|
for (local i = 0; i < objectNumber; i++){
|
|||
|
|
local object = objectManager.getCollisionObject(i);
|
|||
|
|
if(object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object) && object.isInDamagableState(obj) && sq_Abs(sq_GetXPos(obj) - sq_GetXPos(object)) <= 650 && sq_Abs(sq_GetYPos(obj) - sq_GetYPos(object)) <= 325){
|
|||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(object);
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,activeObj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,0,0,0,ENUM_DIRECTION_RIGHT,ELEMENTALMASTER_SKILL_THUNDERCALLING,3,damage,0,0,0,0,0,0,0,1,0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
sq_BinaryStartWrite();
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_BinaryWriteDword(0);
|
|||
|
|
sq_BinaryWriteDword(0);
|
|||
|
|
sq_BinaryWriteDword(0);
|
|||
|
|
sq_SendChangeSkillEffectPacket(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN);
|
|||
|
|
elementalmaster_setelementSkillBonusRate(obj, ELEMENTALMASTER_SKILL_THUNDERCALLING);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_ThunderCalling_bykk(obj)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(!obj.sq_IsMyControlObject()) return;
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_ThunderCalling_bykk(obj)
|
|||
|
|
{
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
local stateTime = obj.sq_GetStateTimer();
|
|||
|
|
if(stateTime <= 200) return;
|
|||
|
|
local bDownKey = obj.isDownSkillLastKey();
|
|||
|
|
|
|||
|
|
local posX = obj.getXPos();
|
|||
|
|
local posY = obj.getYPos();
|
|||
|
|
|
|||
|
|
if(!bDownKey || stateTime >= 1200){
|
|||
|
|
local aimPosX = obj.sq_GetAimPosX(posX, posY, false);
|
|||
|
|
local aimPosY = obj.sq_GetAimPosY(posX, posY, false);
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_IntVectPush(aimPosX);
|
|||
|
|
obj.sq_IntVectPush(aimPosY);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_THUNDERCALLING, STATE_PRIORITY_USER, true);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_ThunderCalling_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_ThunderCalling_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
switch(timeEventIndex){
|
|||
|
|
case 0:
|
|||
|
|
local posX = obj.getXPos();
|
|||
|
|
local posY = obj.getYPos();
|
|||
|
|
local posZ = obj.getZPos();
|
|||
|
|
|
|||
|
|
local offsetX = 150;
|
|||
|
|
offsetX = obj.sq_GetDistancePos(posX, obj.sq_GetDirection(), offsetX);
|
|||
|
|
|
|||
|
|
local vX = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_THUNDERCALLING, 5);
|
|||
|
|
local vY = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_THUNDERCALLING, 6);
|
|||
|
|
|
|||
|
|
// local thunderstrikeEx_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_THUNDERSTRIKEEX)
|
|||
|
|
// if(thunderstrikeEx_level > 0){vX = vX * 2;vY = vY * 2;}
|
|||
|
|
|
|||
|
|
obj.sq_AddAimPointMark(offsetX, posY, vX, vY);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_ThunderCalling_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
if(new_state != ELEMENTALMASTER_SKILL_FLAMESTRIKE) obj.sq_RemoveAimPointMark();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_Thunderrage_bykk(obj)
|
|||
|
|
{
|
|||
|
|
// print("test Thunderrage");
|
|||
|
|
local b_useskill = obj.sq_IsUseSkill(ELEMENTALMASTER_SKILL_THUNDERRAGE);
|
|||
|
|
if(b_useskill){
|
|||
|
|
obj.sq_IsEnterSkillLastKeyUnits(ELEMENTALMASTER_SKILL_THUNDERRAGE);
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(0);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_THUNDERRAGE, STATE_PRIORITY_USER, true);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_Thunderrage_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
obj.sq_StopMove();
|
|||
|
|
local substate = obj.sq_GetVectorData(datas, 0);
|
|||
|
|
obj.setSkillSubState(substate);
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
obj.sq_SetCurrentAnimation(ANIMATION_ELEMENTALMASTER_THUNDERRAGE_CAST_START_00);
|
|||
|
|
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_THUNDERRAGE);
|
|||
|
|
local castTime = sq_GetCastTime(obj, ELEMENTALMASTER_SKILL_THUNDERRAGE, skill_level);
|
|||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|||
|
|
local pAni = obj.getCurrentAnimation();
|
|||
|
|
local delaySum = pAni.getDelaySum(false);
|
|||
|
|
sq_StartDrawCastGauge(obj, delaySum, true);
|
|||
|
|
obj.getVar("thunderrage").setInt(1,delaySum);
|
|||
|
|
//音效
|
|||
|
|
obj.sq_PlaySound("R_WZ_THUNDER_RAGE_01_1",18);
|
|||
|
|
// else obj.sq_PlaySound("WZ_CRYSTALOVERMIND_01_2");
|
|||
|
|
//设置效果
|
|||
|
|
sq_SetBodyEffect(obj, obj, true, sq_RGB(255, 255, 255), 100, 200, 999000, sq_ALPHA(100));
|
|||
|
|
//蓄气时钟开启
|
|||
|
|
obj.getVar("Thunderrage").clear_ct_vector();
|
|||
|
|
obj.getVar("Thunderrage").push_ct_vector();
|
|||
|
|
local timer = obj.getVar("Thunderrage").get_ct_vector(0);
|
|||
|
|
timer.Reset();
|
|||
|
|
timer.Start(10000,0);
|
|||
|
|
//获取蓄气上限
|
|||
|
|
local energycharge_Max = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_THUNDERRAGE, 4);
|
|||
|
|
local minus_Rate = 0,minus_Rate2 = 0,minus_Rate3 = 0;
|
|||
|
|
local memorize_level = sq_GetSkillLevel(obj, 19);
|
|||
|
|
if(memorize_level > 0){
|
|||
|
|
minus_Rate = sq_GetLevelData(obj, 19, 1, memorize_level);
|
|||
|
|
}
|
|||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/elementalmaster_bykk/ap/ap_magicaltempoup.nut")){
|
|||
|
|
local magicaltempoup_level = sq_GetSkillLevel(obj, 2);
|
|||
|
|
minus_Rate3 = sq_GetLevelData(obj, 2, 3, magicaltempoup_level);
|
|||
|
|
}
|
|||
|
|
local minus_Rate4 = 1000 - minus_Rate - minus_Rate3;
|
|||
|
|
local fullcharge = 0;
|
|||
|
|
if(minus_Rate4 > 0) energycharge_Max = energycharge_Max * minus_Rate4 / 1000;
|
|||
|
|
else fullcharge = 1;
|
|||
|
|
obj.getVar("moveoncast").setInt(2,energycharge_Max);
|
|||
|
|
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,0,0,80,obj.getDirection(),38,1,energycharge_Max,4,fullcharge,0,0,0,0,0,0,0);
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
obj.sq_SetCurrentAnimation(ANIMATION_ELEMENTALMASTER_THUNDERRAGE_CAST_LOOP_00);
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
case 2:
|
|||
|
|
obj.sq_SetCurrentAnimation(ANIMATION_ELEMENTALMASTER_THUNDERRAGE_CAST_END_BODY);
|
|||
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/mage/effect/animation/elementalmaster_bykk/thunderrage/thunderrage_cast_end_shot_front_00.ani",45,0,55);
|
|||
|
|
obj.stopSound(18);
|
|||
|
|
//设置效果
|
|||
|
|
sq_SetBodyEffect(obj, obj, true, sq_RGB(255, 255, 255), 100, 100, 0, sq_ALPHA(100));
|
|||
|
|
//声音
|
|||
|
|
obj.sq_PlaySound("R_WZ_THUNDER_RAGE_01_2");
|
|||
|
|
// else obj.sq_PlaySound("WZ_CRYSTALOVERMIND_02_2");
|
|||
|
|
|
|||
|
|
local charge_obj = obj.getVar("moveoncast").get_obj_vector(0);
|
|||
|
|
if(charge_obj) charge_obj.setValid(false);
|
|||
|
|
|
|||
|
|
local timer = obj.getVar("Thunderrage").get_ct_vector(0);
|
|||
|
|
local currentT = 0;
|
|||
|
|
if(timer) currentT = timer.Get();
|
|||
|
|
local energycharge_Max = obj.getVar("moveoncast").getInt(2);
|
|||
|
|
|
|||
|
|
local xiuzheng = 100;
|
|||
|
|
if(currentT > energycharge_Max) xiuzheng = 120;
|
|||
|
|
|
|||
|
|
sq_BinaryStartWrite();
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_BinaryWriteDword(1);
|
|||
|
|
sq_SendChangeSkillEffectPacket(obj, ELEMENTALMASTER_SKILL_ELEMENTALCHAIN);
|
|||
|
|
|
|||
|
|
local skill_level = sq_GetSkillLevel(obj, ELEMENTALMASTER_SKILL_THUNDERRAGE);
|
|||
|
|
local totalDamage = sq_GetLevelData(obj, ELEMENTALMASTER_SKILL_THUNDERRAGE, 0, skill_level) * xiuzheng / 100;
|
|||
|
|
local hitMax = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_THUNDERRAGE, 0);
|
|||
|
|
local sizeRate = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_THUNDERRAGE, 2);
|
|||
|
|
if(xiuzheng > 100) sizeRate = sq_GetIntData(obj, ELEMENTALMASTER_SKILL_THUNDERRAGE, 3);
|
|||
|
|
|
|||
|
|
cearteSkillPassive_Elementalmaster_bykk(obj,obj,PASSIVEOBJECT_BYKK_ELEMENTALMASTER,45,0,55,obj.getDirection(),ELEMENTALMASTER_SKILL_THUNDERRAGE,1,totalDamage,sizeRate,hitMax,0,0,0,0,0,1,0);
|
|||
|
|
elementalmaster_setelementSkillBonusRate(obj, ELEMENTALMASTER_SKILL_THUNDERRAGE);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_Thunderrage_bykk(obj)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(!obj.sq_IsMyControlObject()) return;
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(1);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_THUNDERRAGE, STATE_PRIORITY_USER, true);
|
|||
|
|
break;
|
|||
|
|
case 2:
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_Thunderrage_bykk(obj)
|
|||
|
|
{
|
|||
|
|
local substate = obj.getSkillSubState();
|
|||
|
|
switch(substate){
|
|||
|
|
case 0:
|
|||
|
|
case 1:
|
|||
|
|
local timer = obj.getVar("Thunderrage").get_ct_vector(0);
|
|||
|
|
if(!timer) return;
|
|||
|
|
local currentT = timer.Get();
|
|||
|
|
if(currentT < obj.getVar("thunderrage").getInt(1)) return;
|
|||
|
|
local bDownKey = obj.isDownSkillLastKey();
|
|||
|
|
if(!bDownKey){
|
|||
|
|
obj.sq_IntVectClear();
|
|||
|
|
obj.sq_IntVectPush(2);
|
|||
|
|
obj.sq_AddSetStatePacket(ELEMENTALMASTER_SKILL_THUNDERRAGE, STATE_PRIORITY_USER, true);
|
|||
|
|
}
|
|||
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL)){
|
|||
|
|
//移动施法技能大于0时,获取人物身上移动施法AP,push技能子状态及技能编号等
|
|||
|
|
if(sq_GetSkillLevel(obj, 38) > 0){
|
|||
|
|
local mocAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_moveoncast.nut");
|
|||
|
|
if(mocAppendage){
|
|||
|
|
mocAppendage.getVar().setInt(1, ELEMENTALMASTER_SKILL_THUNDERRAGE);
|
|||
|
|
mocAppendage.getVar().setBool(0, true);
|
|||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_Thunderrage_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_Thunderrage_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_Thunderrage_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
if(!obj) return;
|
|||
|
|
if(new_state != ELEMENTALMASTER_SKILL_ELEMENTALCURTAIN){
|
|||
|
|
sq_EndDrawCastGauge(obj);
|
|||
|
|
}
|
|||
|
|
if(new_state == STATE_DIE || new_state == STATE_DAMAGE || new_state == STATE_DOWN || new_state == STATE_HOLD){
|
|||
|
|
if(sq_GetSkillLevel(obj, 38) > 0){
|
|||
|
|
local mocAppendage = CNSquirrelAppendage.sq_GetAppendage(obj,"character/mage/elementalmaster_bykk/ap/ap_moveoncast.nut");
|
|||
|
|
if(mocAppendage) mocAppendage.getVar().setBool(0, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_Void_bykk(obj)
|
|||
|
|
{
|
|||
|
|
// print("test Void");
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_Void_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_Void_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_Void_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_Void_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_Void_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_Void_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function checkExecutableSkill_WallOfIce_bykk(obj)
|
|||
|
|
{
|
|||
|
|
// print("test WallOfIce");
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSetState_WallOfIce_bykk(obj, state, datas, isResetTimer)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndCurrentAni_WallOfIce_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onProcCon_WallOfIce_bykk(obj)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onKeyFrameFlag_WallOfIce_bykk(obj, flagIndex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onTimeEvent_WallOfIce_bykk(obj, timeEventIndex, timeEventCount)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onEndState_WallOfIce_bykk(obj, new_state)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//聖靈符文
|
|||
|
|
function procSkill_Mightyrue(obj)
|
|||
|
|
{
|
|||
|
|
if(sq_GetSkillLevel(obj, 34) < 1) return;
|
|||
|
|
obj.setSkillCommandEnable(2 , false);
|
|||
|
|
obj.setSkillCommandEnable(29 , false);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/////////////////////////elementalmaster_end//////////////////////
|
|||
|
|
|
|||
|
|
|