3757 lines
134 KiB
C
3757 lines
134 KiB
C
|
|
|
||
|
|
//多重爆头
|
||
|
|
function checkExecutableSkill_MultiHeadShot(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(obj.getWeaponSubType() == 3) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_MULTIHEADSHOT);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_MULTIHEADSHOT, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_MultiHeadShot(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(obj.getWeaponSubType() == 3) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_MultiHeadShot_bykk(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_MULTIHEADSHOTREADY);
|
||
|
|
obj.sq_PlaySound("FG_MULTIHEAD_READY");
|
||
|
|
obj.getVar("MultiHeadShotSet").setInt(0, 2);
|
||
|
|
obj.getVar("MultiHeadShotCount").setInt(0, 0);
|
||
|
|
break;
|
||
|
|
case 1: obj.sq_SetCurrentAnimation(ATANI_BYKK_MULTIHEADSHOTSHOOT1); break;//左
|
||
|
|
case 2: obj.sq_SetCurrentAnimation(ATANI_BYKK_MULTIHEADSHOTSHOOT2); break;//右
|
||
|
|
case 3: obj.sq_SetCurrentAnimation(ATANI_BYKK_MULTIHEADSHOTSHOOT3); break;//上
|
||
|
|
case 4: obj.sq_SetCurrentAnimation(ATANI_BYKK_MULTIHEADSHOTSHOOT4); break;//下
|
||
|
|
case 5: obj.sq_SetCurrentAnimation(ATANI_BYKK_MULTIHEADSHOTFINISH);obj.sq_PlaySound("FG_MULTIHEAD_FIN"); break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 2.0, 2.0);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_MULTIHEADSHOT, -1, 0, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATATK_BYKK_MULTIHEADSHOTEXKICK));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
||
|
|
// local rateDamager = sq_GetAttackInfoHitDelayRateDamager(attackInfo);
|
||
|
|
local rateDamager = (obj.sq_GetBonusRateWithPassive(SKILL_BYKK_MULTIHEADSHOT, -1, 2, 1.0) + 100).tofloat() / 100.0;
|
||
|
|
sq_SetAttackInfoHitDelayRateDamager(attackInfo, rateDamager);
|
||
|
|
sq_SetCurrentAttacknUpForce(attackInfo, 10);
|
||
|
|
local aniPath = "character/gunner/effect/animation/multiheadshot/shoot.ani";
|
||
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_MULTIHEADSHOT, 1);
|
||
|
|
local direction = sq_GetDirection(obj), yPos = sq_GetYPos(obj);
|
||
|
|
switch(subState){
|
||
|
|
case 1:
|
||
|
|
local offsetX = sq_GetDistancePos(sq_GetXPos(obj), direction, -80);
|
||
|
|
local pooledObj = createOnlyDrawObject_ATGunner_bykk(obj,aniPath,true,direction,offsetX,yPos,90,ENUM_DRAWLAYER_NORMAL);
|
||
|
|
sq_SetCustomRotate(pooledObj, sq_ToRadian(180.0));
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,0,0,0,direction,1,SKILL_BYKK_MULTIHEADSHOT,1,subState,sizeRate,0,0,0,0,0,0);
|
||
|
|
break;//左
|
||
|
|
case 2:
|
||
|
|
local offsetX = sq_GetDistancePos(sq_GetXPos(obj), direction, 75);
|
||
|
|
local pooledObj = createOnlyDrawObject_ATGunner_bykk(obj,aniPath,true,direction,offsetX,yPos,100,ENUM_DRAWLAYER_NORMAL);
|
||
|
|
offsetX = sq_GetDistancePos(sq_GetXPos(obj), direction, 80);
|
||
|
|
pooledObj = createOnlyDrawObject_ATGunner_bykk(obj,aniPath,true,direction,offsetX,yPos,80,ENUM_DRAWLAYER_NORMAL);
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,0,0,0,direction,1,SKILL_BYKK_MULTIHEADSHOT,1,subState,sizeRate,0,0,0,0,0,0);
|
||
|
|
break;//右
|
||
|
|
case 3:
|
||
|
|
local offsetX = sq_GetDistancePos(sq_GetXPos(obj), direction, -50);
|
||
|
|
local pooledObj = createOnlyDrawObject_ATGunner_bykk(obj,aniPath,true,direction,offsetX,yPos,125,ENUM_DRAWLAYER_NORMAL);
|
||
|
|
sq_SetCustomRotate(pooledObj, sq_ToRadian(155.0));
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,0,0,0,direction,1,SKILL_BYKK_MULTIHEADSHOT,1,subState,sizeRate,0,0,0,0,0,0);
|
||
|
|
break;//上
|
||
|
|
case 4:
|
||
|
|
local offsetX = sq_GetDistancePos(sq_GetXPos(obj), direction, 42);
|
||
|
|
local pooledObj = createOnlyDrawObject_ATGunner_bykk(obj,aniPath,true,direction,offsetX,yPos,48,ENUM_DRAWLAYER_NORMAL);
|
||
|
|
sq_SetCustomRotate(pooledObj, sq_ToRadian(-45.0));
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,0,0,0,direction,1,SKILL_BYKK_MULTIHEADSHOT,1,subState,sizeRate,0,0,0,0,0,0);
|
||
|
|
break;//下
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_MultiHeadShot(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
local sub = obj.getVar("MultiHeadShotSet").getInt(0);
|
||
|
|
obj.sq_PlaySound("R_FG_MULTIHEAD");
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(sub);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_MULTIHEADSHOT, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
case 2:
|
||
|
|
case 3:
|
||
|
|
case 4:
|
||
|
|
obj.getVar("MultiHeadShotCount").setInt(0, obj.getVar("MultiHeadShotCount").getInt(0) + 1);
|
||
|
|
local sub = obj.getVar("MultiHeadShotSet").getInt(0);
|
||
|
|
local count = obj.getVar("MultiHeadShotCount").getInt(0);
|
||
|
|
local hitMax = sq_GetIntData(obj, SKILL_BYKK_MULTIHEADSHOT, 4);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(count >= hitMax) obj.sq_IntVectPush(5);
|
||
|
|
else obj.sq_IntVectPush(sub);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_MULTIHEADSHOT, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 5:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_MultiHeadShot(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 1:
|
||
|
|
case 2:
|
||
|
|
case 3:
|
||
|
|
case 4:
|
||
|
|
sq_SetKeyxEnable(obj, E_JUMP_COMMAND, true);
|
||
|
|
if(sq_IsEnterCommand(obj, E_JUMP_COMMAND)){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 0:
|
||
|
|
local direction = sq_GetDirection(obj);
|
||
|
|
if((sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) && direction == ENUM_DIRECTION_LEFT) || (sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL) && direction == ENUM_DIRECTION_RIGHT)){
|
||
|
|
obj.getVar("MultiHeadShotSet").setInt(0, 2);
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.getVar("MultiHeadShotSet").setInt(0, 3);
|
||
|
|
}
|
||
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.getVar("MultiHeadShotSet").setInt(0, 4);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if((sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL) && direction == ENUM_DIRECTION_LEFT) || (sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) && direction == ENUM_DIRECTION_RIGHT)){
|
||
|
|
obj.getVar("MultiHeadShotSet").setInt(0, 1);
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.getVar("MultiHeadShotSet").setInt(0, 3);
|
||
|
|
}
|
||
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.getVar("MultiHeadShotSet").setInt(0, 4);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.getVar("MultiHeadShotSet").setInt(0, 3);
|
||
|
|
}
|
||
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.getVar("MultiHeadShotSet").setInt(0, 4);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STYLISH) > 0) proc_atStylish_bykk(obj);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_MultiHeadShot(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
// print("flagIndex = "+flagIndex);
|
||
|
|
sq_SetMyShake(obj, 2, 120);
|
||
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
||
|
|
local weaponSubType = obj.getWeaponSubType();
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(30);
|
||
|
|
if(loadSlot && loadSlot.getRemainLoadNumber() > 0){
|
||
|
|
loadSlot.decreaseLoadCount(1);
|
||
|
|
attackInfo.setElement(ENUM_ELEMENT_LIGHT);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(30, -1, 1, 1.0) + 100;
|
||
|
|
obj.getVar("MultiHeadShot").setInt(0, totalDamage);
|
||
|
|
obj.sq_PlaySound("R_SILVER_SHOT");
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_MULTIHEADSHOT, -1, 0, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATATK_BYKK_MULTIHEADSHOTEXKICK));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
switch(weaponSubType){
|
||
|
|
case 0: obj.sq_PlaySound("G_WREVOLVERA"); break;//左轮
|
||
|
|
case 1: obj.sq_PlaySound("G_SMALLGUNA"); break;//自动
|
||
|
|
case 2: obj.sq_PlaySound("G_MUSKETA"); break;//步枪
|
||
|
|
case 3: obj.sq_PlaySound("G_HCANNONA"); break;//手炮
|
||
|
|
case 4: obj.sq_PlaySound("G_BOWGUNA"); break;//手弩
|
||
|
|
}
|
||
|
|
obj.getVar("MultiHeadShot").setInt(0, 0);
|
||
|
|
}
|
||
|
|
local range = sq_GetIntData(obj, SKILL_BYKK_MULTIHEADSHOT, 1) / 2;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
local direction = sq_GetDirection(obj);
|
||
|
|
local minDegree = 0, maxDegree = 0;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 102: minDegree = 135; maxDegree = -135; break;
|
||
|
|
case 202: minDegree = 45; maxDegree = -45; break;
|
||
|
|
case 302: minDegree = -45; maxDegree = -135; break;
|
||
|
|
case 402: minDegree = 45; maxDegree = 135; break;
|
||
|
|
}
|
||
|
|
local objectManager = obj.getObjectManager();
|
||
|
|
local objectNumber = objectManager.getCollisionObjectNumber();
|
||
|
|
for (local i = 0; i < objectNumber; i++){
|
||
|
|
local object = objectManager.getCollisionObject(i);
|
||
|
|
if(object && object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object) && object.isInDamagableState(obj)){
|
||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(object);
|
||
|
|
local disX = sq_GetXPos(activeObj) - sq_GetXPos(obj);
|
||
|
|
local disY = sq_GetYPos(activeObj) - sq_GetYPos(obj);
|
||
|
|
switch(subState){//1左2右3上4下
|
||
|
|
case 1:
|
||
|
|
if(((direction == ENUM_DIRECTION_RIGHT && disX < 0) || (direction == ENUM_DIRECTION_LEFT && disX > 0)) && sq_Abs(disX) <= range && sq_Abs(disY) <= range / 2 && sq_Abs(disY) <= sq_Abs(disX) / 2) sq_SendHitObjectPacket(obj,activeObj,0,0,sq_GetObjectHeight(activeObj) / 2);//print("disX = "+disX+",disY = "+disY+",test1");
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
if(((direction == ENUM_DIRECTION_RIGHT && disX > 0) || (direction == ENUM_DIRECTION_LEFT && disX < 0)) && sq_Abs(disX) <= range && sq_Abs(disY) <= range / 2 && sq_Abs(disY) <= sq_Abs(disX) / 2) sq_SendHitObjectPacket(obj,activeObj,0,0,sq_GetObjectHeight(activeObj) / 2);//print("disX = "+disX+",disY = "+disY+",test2");
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
if(disY < 0 && sq_Abs(disX) <= range && sq_Abs(disY) <= range / 2 && sq_Abs(disX) <= sq_Abs(disY) * 2) sq_SendHitObjectPacket(obj,activeObj,0,0,sq_GetObjectHeight(activeObj) / 2);//print("test3");
|
||
|
|
break;
|
||
|
|
case 4:
|
||
|
|
if(disY > 0 && sq_Abs(disX) <= range && sq_Abs(disY) <= range / 2 && sq_Abs(disX) <= sq_Abs(disY) * 2) sq_SendHitObjectPacket(obj,activeObj,0,0,sq_GetObjectHeight(activeObj) / 2);//print("test4");
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
local isSilver = obj.getVar("MultiHeadShot").getInt(0);
|
||
|
|
if(isSilver > 0){
|
||
|
|
local group = sq_GetGroup(activeObj);
|
||
|
|
local uniqueId = sq_GetUniqueId(activeObj);
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,0,0,0,sq_GetDirection(obj),1,SKILL_BYKK_HEADSHOT,3,isSilver,group,uniqueId,0,0,0,0,0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_MultiHeadShot(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_MultiHeadShot(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onAttack_MultiHeadShot(obj, damager, boundingBox, isStuck)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 1:
|
||
|
|
case 2:
|
||
|
|
case 3:
|
||
|
|
case 4:
|
||
|
|
if(damager.isObjectType(OBJECTTYPE_ACTIVE)){
|
||
|
|
local aniPath = "character/gunner/effect/animation/headshotmonsterdown.ani";
|
||
|
|
createOnlyDrawObject_ATGunner_bykk(obj,aniPath,true,obj.getDirection(),sq_GetXPos(damager),sq_GetYPos(damager),sq_GetCenterZPos(boundingBox),ENUM_DRAWLAYER_NORMAL);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//双鹰回旋
|
||
|
|
function checkExecutableSkill_DoubleGunhawk(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_DOUBLEGUNHAWK);
|
||
|
|
if (isUse){
|
||
|
|
obj.getVar("DoubleGunhawk_Phase").setInt(0, 1);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_DOUBLEGUNHAWK, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_DoubleGunhawk(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_DoubleGunhawk(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.removeAllTimeEvent();
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_DOUBLEGUNHAWKTHROW);
|
||
|
|
switch(obj.getVar("DoubleGunhawk_Phase").getInt(0)){
|
||
|
|
case 1: obj.sq_PlaySound("FG_DGUNHAWK_FIRST"); break;
|
||
|
|
case 2: obj.sq_PlaySound("FG_DGUNHAWK_SEC"); break;
|
||
|
|
case 3: obj.sq_PlaySound("FG_DGUNHAWK_THIRD"); break;
|
||
|
|
}
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_SAWBLADE) > 0){
|
||
|
|
switch(obj.getVar("DoubleGunhawk_Phase").getInt(0)){
|
||
|
|
case 1:
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/gunhawk1.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/gunhawk1.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/gunhawk2.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/gunhawk1.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/gunhawk2.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/gunhawk3.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/gunner/effect/animation/doublegunhawk/throw.ani", 0, 0, -35);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_DOUBLEGUNHAWKCATCH);
|
||
|
|
obj.getVar("DoubleGunhawk_Bool").setBool(0, true);
|
||
|
|
if(obj.isMyControlObject()) sq_flashScreen(obj,80,30,50,205, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_COVER);
|
||
|
|
obj.setTimeEvent(1, 80, 1, false);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_DoubleGunhawk(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_DoubleGunhawk(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 1:
|
||
|
|
if(obj.getVar("DoubleGunhawk_Bool").getBool(0)){
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_RIGHT ||sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_LEFT){
|
||
|
|
obj.getVar("DoubleGunhawk_Bool").setBool(0, false);
|
||
|
|
sq_SetCurrentDirection(obj, sq_GetOppositeDirection(sq_GetDirection(obj)));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_DOUBLEGUNHAWK, true);
|
||
|
|
sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
|
||
|
|
local b_useskill = obj.sq_IsEnterSkill(SKILL_BYKK_DOUBLEGUNHAWK);
|
||
|
|
if(b_useskill != -1 || sq_IsEnterCommand(obj, E_ATTACK_COMMAND)){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_DOUBLEGUNHAWK, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STYLISH) > 0) proc_atStylish_bykk(obj);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_DoubleGunhawk(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 101:
|
||
|
|
obj.sq_PlaySound("GUNHAWK_SHOT");
|
||
|
|
obj.sq_PlaySound("GUNHAWK_GUN");
|
||
|
|
local phase = obj.getVar("DoubleGunhawk_Phase").getInt(0);
|
||
|
|
local isSaw = 0;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_SAWBLADE) > 0){
|
||
|
|
isSaw = 1;
|
||
|
|
switch(phase){
|
||
|
|
case 1: obj.sq_PlaySound("CHAIN_POWDER_DGUNHAWK_01");obj.sq_PlaySound("GUNHAWK_12"); break;
|
||
|
|
case 2: obj.sq_PlaySound("CHAIN_POWDER_DGUNHAWK_02");obj.sq_PlaySound("GUNHAWK_12"); break;
|
||
|
|
case 3: obj.sq_PlaySound("CHAIN_POWDER_DGUNHAWK_03");obj.sq_PlaySound("GUNHAWK_3"); break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local sub = 0;
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL)) sub = 1;
|
||
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL)) sub = 2;
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DOUBLEGUNHAWK, -1, 0, 1.0) + 100;
|
||
|
|
if(phase == 1){totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DOUBLEGUNHAWK, -1, 1, 1.0) + 100;}
|
||
|
|
else if(phase == 2){totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DOUBLEGUNHAWK, -1, 2, 1.0) + 100;}
|
||
|
|
local sizeRate = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DOUBLEGUNHAWK, -1, 4, 1.0) + 100;
|
||
|
|
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,70,10,105,sq_GetDirection(obj),1,SKILL_BYKK_DOUBLEGUNHAWK,1,totalDamage,sizeRate,sub,isSaw,phase,0,0,0);
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,70,-10,85,sq_GetDirection(obj),1,SKILL_BYKK_DOUBLEGUNHAWK,1,totalDamage,sizeRate,sub,isSaw,phase,1,0,0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_DoubleGunhawk(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 1:
|
||
|
|
obj.getVar("move").setInt(0, sq_GetXPos(obj));
|
||
|
|
obj.setTimeEvent(2, 10, 10, true);
|
||
|
|
sq_SetMyShake(obj, 10, 100);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
local v = sq_GetAccel(0, 10, timeEventCount, 10, true);
|
||
|
|
local dstX = sq_GetDistancePos(obj.getVar("move").getInt(0), obj.getDirection(), -v);
|
||
|
|
sq_setCurrentAxisPos(obj, 0, dstX);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_DoubleGunhawk(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(new_state != STATE_BYKK_DOUBLEGUNHAWK){
|
||
|
|
sq_SimpleMoveToNearMovablePos(obj,200);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//血腥狂欢
|
||
|
|
function checkExecutableSkill_BloodyCarnival(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_BLOODYCARNIVAL);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BLOODYCARNIVAL, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_BloodyCarnival(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_BloodyCarnival(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_SetCurrentAnimation(91);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/finishstart1.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(2,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/finishstart2.ani"), 0, 0);
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_BLOODYCARNIVAL);
|
||
|
|
local minCount = sq_GetLevelData(obj, SKILL_BYKK_BLOODYCARNIVAL, 3, skillLevel);
|
||
|
|
local maxCount = sq_GetLevelData(obj, SKILL_BYKK_BLOODYCARNIVAL, 4, skillLevel);
|
||
|
|
local hitMax = sq_GetLevelData(obj, SKILL_BYKK_BLOODYCARNIVAL, 5, skillLevel);
|
||
|
|
obj.getVar("BloodyCarnival").setInt(0, minCount);
|
||
|
|
obj.getVar("BloodyCarnival").setInt(1, maxCount);
|
||
|
|
obj.getVar("BloodyCarnival").setInt(2, hitMax);
|
||
|
|
obj.getVar("BloodyCarnival").setInt(3, 0);
|
||
|
|
obj.getVar("BloodyCarnival").setInt(4, sq_GetXPos(obj));
|
||
|
|
obj.getVar("BloodyCarnival_Bool").setBool(0, true);
|
||
|
|
obj.getVar("BloodyCarnival_Bool").setBool(1, false);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_BLOODYCARNIVAL) >= 9) sq_SendMessage(obj, 0, 1, 0);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(92);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/finishrapid1.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(2,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/finishrapid2.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(3,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/finishrapid3.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(4,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/finishrapid4.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(5,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/finishrapid5.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(6,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/finishrapideffect1.ani"), 100, -150);
|
||
|
|
obj.sq_AddStateLayerAnimation(7,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/finishrapideffect2.ani"), 100, -150);
|
||
|
|
obj.sq_AddStateLayerAnimation(8,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/finishrapideffect3.ani"), 100, -150);
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
local bonusRate = 1.0;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_BLOODYCARNIVAL) >= 3) bonusRate = bonusRate + 0.1;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_BLOODYCARNIVAL) >= 9) bonusRate = bonusRate + 0.1;
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_BLOODYCARNIVAL, -1, 0, bonusRate);
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATATK_BYKK_TWINGUNBLADEFINISHRAPID));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(false);
|
||
|
|
obj.setTimeEvent(0, delay / (obj.getVar("BloodyCarnival").getInt(2) + 1), obj.getVar("BloodyCarnival").getInt(2), true);
|
||
|
|
sq_SetMyShake(obj, 1, delay);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_SetCurrentAnimation(93);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/finishfinal1.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(2,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/finishfinal2.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(3,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/finishfinal3.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(4,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/finishfinal4.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(5,obj.sq_CreateCNRDAnimation("effect/animation/attwingunblade/finishfinal5.ani"), 0, 0);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
sq_SetFrameDelayTime(currentAni, 6, 20);
|
||
|
|
sq_SetFrameDelayTime(currentAni, 7, 20);
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
sq_flashScreen(obj,20,150,120,150, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
local bonusRate = 1.0;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_BLOODYCARNIVAL) >= 6) bonusRate = bonusRate + 0.1;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_BLOODYCARNIVAL) >= 9) bonusRate = bonusRate + 0.1;
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_BLOODYCARNIVAL, -1, 1, 1.0);
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATATK_BYKK_TWINGUNBLADEFINISHFINAL));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(0, 0);
|
||
|
|
obj.setTimeEvent(1, delay, 1, false);
|
||
|
|
obj.stopSound(2000);
|
||
|
|
obj.stopSound(2001);
|
||
|
|
obj.sq_PlaySound("FG_TWINGUN_SWORD_FIN");
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_BloodyCarnival(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_PlaySound("R_FG_TWINGUN_SWORD", 2000);
|
||
|
|
obj.sq_PlaySound("TWINGUN_SWORD", 2001);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BLOODYCARNIVAL, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
if(obj.getRapidInputFrequency() > 0){
|
||
|
|
if(obj.getVar("BloodyCarnival").getInt(3) + 1 >= obj.getVar("BloodyCarnival").getInt(2)){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BLOODYCARNIVAL, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.getVar("BloodyCarnival").setInt(3, obj.getVar("BloodyCarnival").getInt(3) + 1);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BLOODYCARNIVAL, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BLOODYCARNIVAL, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_BloodyCarnival(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 1:
|
||
|
|
if(obj.getVar("BloodyCarnival_Bool").getBool(0)){
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_LEFT || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_RIGHT){
|
||
|
|
obj.getVar("BloodyCarnival_Bool").setBool(0, false);
|
||
|
|
obj.getVar("BloodyCarnival_Bool").setBool(1, true);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
|
||
|
|
if(sq_IsEnterCommand(obj, E_ATTACK_COMMAND)) obj.addRapidInput();
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STYLISH) > 0) proc_atStylish_bykk(obj);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_BloodyCarnival(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 301:
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(1, 2);
|
||
|
|
obj.getVar("BloodyCarnival").setInt(4, sq_GetXPos(obj));
|
||
|
|
obj.setTimeEvent(1, delay / 10, 10, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_BloodyCarnival(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 0: obj.resetHitObjectList(); break;
|
||
|
|
case 1:
|
||
|
|
sq_SetMyShake(obj, 10, 300);
|
||
|
|
local aniPath = "character/gunner/effect/animation/attwingunblade/finishfinaleffect.ani";
|
||
|
|
local direction = sq_GetDirection(obj), xPos = sq_GetXPos(obj), yPos = sq_GetYPos(obj);
|
||
|
|
createOnlyDrawObjectEX_ATGunner_bykk(obj,aniPath,true,direction,xPos,yPos,75,ENUM_DRAWLAYER_COVER,130,130);
|
||
|
|
createOnlyDrawObjectEX_ATGunner_bykk(obj,aniPath,true,direction,xPos,yPos,75,ENUM_DRAWLAYER_COVER,-130,130);
|
||
|
|
createOnlyDrawObjectEX_ATGunner_bykk(obj,aniPath,true,direction,xPos,yPos,75,ENUM_DRAWLAYER_COVER,130,-130);
|
||
|
|
createOnlyDrawObjectEX_ATGunner_bykk(obj,aniPath,true,direction,xPos,yPos,75,ENUM_DRAWLAYER_COVER,-130,-130);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(1, 3);
|
||
|
|
obj.setTimeEvent(2, delay / 10, 10, true);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
local MoveX = 50;
|
||
|
|
if(obj.getVar("BloodyCarnival_Bool").getBool(1)) MoveX = 150;
|
||
|
|
local v = sq_GetAccel(0, MoveX, timeEventCount, 10, true);
|
||
|
|
local dstX = sq_GetDistancePos(obj.getVar("BloodyCarnival").getInt(4), obj.getDirection(), v);
|
||
|
|
if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_BloodyCarnival(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(new_state != STATE_BYKK_BLOODYCARNIVAL){
|
||
|
|
sq_SendMessage(obj, 0, 0, 0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//鲜血劫击
|
||
|
|
function checkExecutableSkill_AirRaidEx(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_AIRRAIDEX);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(sq_GetIntData(obj, SKILL_BYKK_AIRRAIDEX, 6) > 0){
|
||
|
|
if(sq_GetZPos(obj) > 0) obj.sq_IntVectPush(11);
|
||
|
|
else obj.sq_IntVectPush(10);
|
||
|
|
}
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_AIRRAIDEX, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_AirRaidEx(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_AirRaidEx(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
obj.sq_ZStop();
|
||
|
|
switch(subState){
|
||
|
|
case 0: obj.sq_SetCurrentAnimation(ATANI_BYKK_BLOODYSPIKEUP); break;//225 100
|
||
|
|
case 1: obj.sq_SetCurrentAnimation(ATANI_BYKK_BLOODYSPIKEDOWN); break;
|
||
|
|
case 10: obj.sq_SetCurrentAnimation(ATANI_BYKK_BLOODYSPIKEBACKSTEP_TALISMAN);obj.sq_PlaySound("R_FG_SONIC_SPIKE"); break;
|
||
|
|
case 11: obj.sq_SetCurrentAnimation(ATANI_BYKK_BLOODYSPIKEDOWN_TALISMAN); break;
|
||
|
|
case 12: obj.sq_SetCurrentAnimation(ATANI_BYKK_BLOODYSPIKELANDING_TALISMAN); break;
|
||
|
|
}
|
||
|
|
local speed = 1.0;
|
||
|
|
if(subState >= 10) speed = 1.5;
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speed, speed);
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.getVar("AirRaidEx_Bool").setBool(0, false);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(false);
|
||
|
|
obj.getVar("airRaidEx_move").setInt(0, sq_GetXPos(obj));
|
||
|
|
obj.getVar("airRaidEx_move").setInt(1, sq_GetZPos(obj));
|
||
|
|
obj.setTimeEvent(1, delay / 50, 35, true);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AIRRAIDEX, -1, 2, 1.0);
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATATK_BYKK_AIRRAIDEX));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(0, 7);
|
||
|
|
obj.getVar("airRaidEx_move").setInt(1, sq_GetZPos(obj));
|
||
|
|
obj.setTimeEvent(2, delay / 50, 35, true);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AIRRAIDEX, -1, 12, 1.0);
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATATK_BYKK_ATAIRRAID));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
break;
|
||
|
|
case 10:
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(false);
|
||
|
|
obj.getVar("airRaidEx_move").setInt(0, sq_GetXPos(obj));
|
||
|
|
obj.getVar("airRaidEx_move").setInt(1, sq_GetZPos(obj));
|
||
|
|
obj.setTimeEvent(3, delay / 20, 20, true);
|
||
|
|
obj.sq_SetXScroll(0, delay, 0, 0);
|
||
|
|
break;
|
||
|
|
case 11:
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(false);
|
||
|
|
obj.getVar("airRaidEx_move").setInt(0, sq_GetXPos(obj));
|
||
|
|
obj.getVar("airRaidEx_move").setInt(1, sq_GetZPos(obj));
|
||
|
|
obj.setTimeEvent(4, delay / 35, 35, true);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_AIRRAIDEX, -1, 2, 2.0);
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATATK_BYKK_ATAIRRAID));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_AirRaidEx(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(obj.getVar("AirRaidEx_Bool").getBool(0)){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(subState + 1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_AIRRAIDEX, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
sq_SimpleMoveToNearMovablePos(obj, 225);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(200);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_JUMP, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 10:
|
||
|
|
case 11:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(subState + 1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_AIRRAIDEX, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
case 12:
|
||
|
|
sq_SimpleMoveToNearMovablePos(obj, 225);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_AirRaidEx(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(obj.getVar("AirRaidEx_Bool").getBool(0)) break;
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_AIRRAIDEX, true);
|
||
|
|
sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
|
||
|
|
local b_useskill = obj.sq_IsEnterSkill(SKILL_BYKK_AIRRAIDEX);
|
||
|
|
if(b_useskill != -1 || sq_IsEnterCommand(obj, E_ATTACK_COMMAND)){
|
||
|
|
obj.getVar("AirRaidEx_Bool").setBool(0, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STYLISH) > 0 && sq_GetZPos(obj) <= 0) proc_atStylish_bykk(obj);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_AirRaidEx(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_AirRaidEx(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 1:
|
||
|
|
local vx = sq_GetAccel(0, 225, timeEventCount, 35, true);
|
||
|
|
local vz = sq_GetAccel(0, 100, timeEventCount, 35, true);
|
||
|
|
local dstX = sq_GetDistancePos(obj.getVar("airRaidEx_move").getInt(0), obj.getDirection(), vx);
|
||
|
|
sq_setCurrentAxisPos(obj, 0, dstX);
|
||
|
|
sq_setCurrentAxisPos(obj, 2, obj.getVar("airRaidEx_move").getInt(1) + vz);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
local vz = sq_GetAccel(obj.getVar("airRaidEx_move").getInt(1), 0, timeEventCount, 35, false);
|
||
|
|
sq_setCurrentAxisPos(obj, 2, vz);
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
local vx = sq_GetUniformVelocity(0, -75, timeEventCount, 15);
|
||
|
|
local vz = sq_GetUniformVelocity(0, 100, timeEventCount, 15);
|
||
|
|
local dstX = sq_GetDistancePos(obj.getVar("airRaidEx_move").getInt(0), obj.getDirection(), vx);
|
||
|
|
sq_setCurrentAxisPos(obj, 0, dstX);
|
||
|
|
sq_setCurrentAxisPos(obj, 2, obj.getVar("airRaidEx_move").getInt(1) + vz);
|
||
|
|
break;
|
||
|
|
case 4:
|
||
|
|
local vx = sq_GetUniformVelocity(0, 75 + 100, timeEventCount, 30);
|
||
|
|
local vz = sq_GetUniformVelocity(obj.getVar("airRaidEx_move").getInt(1), 0, timeEventCount, 30);
|
||
|
|
local dstX = sq_GetDistancePos(obj.getVar("airRaidEx_move").getInt(0), obj.getDirection(), vx);
|
||
|
|
sq_setCurrentAxisPos(obj, 0, dstX);
|
||
|
|
sq_setCurrentAxisPos(obj, 2, vz);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_AirRaidEx(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//压制射击
|
||
|
|
function checkExecutableSkill_SuppressingFire(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_SUPPRESSINGFIRE);
|
||
|
|
if (isUse){
|
||
|
|
obj.getVar("SuppressingFireTar").clear_obj_vector();
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_SUPPRESSINGFIRE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_SuppressingFire(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_SuppressingFire(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0: obj.sq_SetCurrentAnimation(ATANI_BYKK_ATSUPPRESSINGFIRE_START_BODY);obj.sq_PlaySound("R_FG_SPGUN"); break;
|
||
|
|
case 1: obj.sq_SetCurrentAnimation(ATANI_BYKK_ATSUPPRESSINGFIRE_LOOP_BODY); break;
|
||
|
|
case 2: obj.sq_SetCurrentAnimation(ATANI_BYKK_ATSUPPRESSINGFIRE_FINISH_BODY); break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
if(subState == 0){
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local speedRate = 8000 / currentAni.getDelaySum(0, 0);
|
||
|
|
obj.getVar("SuppressingFireSet").setInt(0, speedRate);
|
||
|
|
}
|
||
|
|
else if(subState == 1){
|
||
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_SUPPRESSINGFIRE, 7);
|
||
|
|
local hitTime_min = sq_GetIntData(obj, SKILL_BYKK_SUPPRESSINGFIRE, 2) * 100 / obj.getVar("SuppressingFireSet").getInt(0);
|
||
|
|
local hitTime_max = sq_GetIntData(obj, SKILL_BYKK_SUPPRESSINGFIRE, 3) * 100 / obj.getVar("SuppressingFireSet").getInt(0);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_SUPPRESSINGFIRE, -1, 0, 1.0) + 100;
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local speedRate = 8000 / currentAni.getDelaySum(0, 0);
|
||
|
|
local istalisman = 0;
|
||
|
|
if(sq_GetIntData(obj, SKILL_BYKK_SUPPRESSINGFIRE, 14) > 0){
|
||
|
|
istalisman = 1;
|
||
|
|
local damage = totalDamage * 37 / 100;
|
||
|
|
local hitMax = 10;
|
||
|
|
sizeRate = sizeRate * 130 / 100;
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,0,0,0,sq_GetDirection(obj),1,SKILL_BYKK_SUPPRESSINGFIRE,3,totalDamage,sizeRate,hitTime_min,hitTime_max,speedRate,hitMax,0,0);
|
||
|
|
local appendage = sq_AttractToMe(obj, 250, 350 * speedRate / 100, 100);
|
||
|
|
obj.getVar("SuppressingFire").setAppendage(0,appendage);
|
||
|
|
}
|
||
|
|
print("totalDamage = "+totalDamage);
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,0,0,0,sq_GetDirection(obj),1,SKILL_BYKK_SUPPRESSINGFIRE,1,totalDamage,sizeRate,hitTime_min,hitTime_max,speedRate,0,0,0);
|
||
|
|
}
|
||
|
|
else if(subState == 2){
|
||
|
|
local speedRate = obj.getVar("SuppressingFireSet").getInt(0);
|
||
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_SUPPRESSINGFIRE, 7);
|
||
|
|
local aniPath = ["character/gunner/effect/animation/1_ranger/atsuppressingfire/03_finish/front/suppressingfire_finish_front.ani", "character/gunner/effect/animation/1_ranger/atsuppressingfire/03_finish/back/suppressingfire_finish_back.ani", "character/gunner/effect/animation/1_ranger/atsuppressingfire/03_finish/dust/suppressingfire_finish_dust01.ani"];
|
||
|
|
local direction = sq_GetDirection(obj), xPos = sq_GetXPos(obj), yPos = sq_GetYPos(obj) + 1, zPos = -30;
|
||
|
|
if(sizeRate > 100) zPos = 100 - sizeRate * 120 / 100;
|
||
|
|
local pooledObj1 = createOnlyDrawObjectEX_ATGunner_bykk(obj,aniPath[0],true,direction,xPos,yPos,zPos,ENUM_DRAWLAYER_NORMAL,sizeRate,sizeRate);
|
||
|
|
local pooledObj2 = createOnlyDrawObject_ATGunner_bykk(obj,aniPath[1],true,direction,xPos,yPos,0,ENUM_DRAWLAYER_NORMAL);
|
||
|
|
local pooledObj3 = createOnlyDrawObject_ATGunner_bykk(obj,aniPath[2],true,direction,xPos,yPos,0,ENUM_DRAWLAYER_NORMAL);
|
||
|
|
local pooledObj = [pooledObj1,pooledObj2,pooledObj3];
|
||
|
|
for(local i = 0; i < 3; i++){
|
||
|
|
local pAni = pooledObj[i].getCurrentAnimation();
|
||
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_SuppressingFire(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_SUPPRESSINGFIRE, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_SuppressingFire(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 1:
|
||
|
|
local stateTime = obj.sq_GetStateTimer();
|
||
|
|
local lifeTime = sq_GetIntData(obj, SKILL_BYKK_SUPPRESSINGFIRE, 1) * 100 / obj.getVar("SuppressingFireSet").getInt(0);
|
||
|
|
if(stateTime >= lifeTime){
|
||
|
|
print("stateTime = "+stateTime+",,lifeTime = "+lifeTime);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_SUPPRESSINGFIRE, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
|
||
|
|
sq_SetKeyxEnable(obj, E_JUMP_COMMAND, true);
|
||
|
|
if(sq_IsEnterCommand(obj, E_JUMP_COMMAND)){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_SUPPRESSINGFIRE, true);
|
||
|
|
local b_useskill = obj.sq_IsEnterSkill(SKILL_BYKK_SUPPRESSINGFIRE);
|
||
|
|
sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
|
||
|
|
if(sq_IsEnterCommand(obj, E_ATTACK_COMMAND) || b_useskill != -1) obj.addRapidInput();
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STYLISH) > 0) proc_atStylish_bykk(obj);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_SuppressingFire(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 101:
|
||
|
|
sq_SetMyShake(obj, 5, 200);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_SUPPRESSINGFIRE, -1, 1, 1.0) + 100;
|
||
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_SUPPRESSINGFIRE, 7);
|
||
|
|
if(sq_GetIntData(obj, SKILL_BYKK_SUPPRESSINGFIRE, 14) > 0){
|
||
|
|
sizeRate = sizeRate * 130 / 100;
|
||
|
|
totalDamage = totalDamage * 130 / 100;
|
||
|
|
}
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,0,0,0,sq_GetDirection(obj),1,SKILL_BYKK_SUPPRESSINGFIRE,2,totalDamage,sizeRate,0,0,0,0,0,0);
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_SuppressingFire(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_SuppressingFire(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(new_state != STATE_BYKK_SUPPRESSINGFIRE){
|
||
|
|
local appendage = obj.getVar("SuppressingFire").getAppendage(0);
|
||
|
|
if(appendage) appendage.setValid(false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
//死亡锁链
|
||
|
|
function checkExecutableSkill_KillPoint(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(obj.getVar("KillPoint_Bool").getBool(0)){
|
||
|
|
obj.getVar("KillPoint_Bool").setBool(0, false);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(obj.getWeaponSubType() == 0) obj.sq_IntVectPush(2);
|
||
|
|
else obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_KILLPOINT, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_KILLPOINT);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(sq_GetIntData(obj, SKILL_BYKK_KILLPOINT, 13) > 0) obj.sq_IntVectPush(10);
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_KILLPOINT, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_KillPoint(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_KillPoint(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_KILLPOINTREADY_BODY);
|
||
|
|
obj.getVar("KillPoint_Bool").setBool(0, false);
|
||
|
|
obj.sq_PlaySound("FG_KILL_POINT_01");
|
||
|
|
obj.sq_PlaySound("KILL_POINT_BLADE_THROW");
|
||
|
|
break;
|
||
|
|
case 1: obj.sq_SetCurrentAnimation(ATANI_BYKK_KILLPOINTFINISHE_BODY);obj.sq_PlaySound("FG_KILL_POINT_03"); break;
|
||
|
|
case 2: obj.sq_SetCurrentAnimation(ATANI_BYKK_KILLPOINTFINISHD_BODY);obj.sq_PlaySound("FG_KILL_POINT_03"); break;
|
||
|
|
case 10:
|
||
|
|
local weaponSubType = obj.getWeaponSubType();
|
||
|
|
if(weaponSubType == 0) obj.sq_SetCurrentAnimation(ATANI_BYKK_KILLPOINTTALISMANREADY_REVOLER_BODY);
|
||
|
|
else obj.sq_SetCurrentAnimation(ATANI_BYKK_KILLPOINTTALISMANREADY_NON_REVOLER_BODY);
|
||
|
|
break;
|
||
|
|
case 11: obj.sq_SetCurrentAnimation(ATANI_BYKK_KILLPOINTTALISMANFINISH_BODY); break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
if(subState == 0 || subState == 10){
|
||
|
|
obj.getVar("KillPointTar_boss").clear_obj_vector();
|
||
|
|
obj.getVar("KillPointTar_named").clear_obj_vector();
|
||
|
|
obj.getVar("KillPointTar_normal").clear_obj_vector();
|
||
|
|
obj.getVar("KillPointTar").clear_obj_vector();
|
||
|
|
obj.getVar("KillPointTar_Shoot").clear_obj_vector();
|
||
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_KILLPOINT, 14);
|
||
|
|
local rangeX = 400 * sizeRate / 100, rangeY = 150 * sizeRate / 100;
|
||
|
|
local objectManager = obj.getObjectManager();//得到對象管理器
|
||
|
|
for (local i = 0; i < objectManager.getCollisionObjectNumber(); i++){
|
||
|
|
local object = objectManager.getCollisionObject(i);//得到控制類對象
|
||
|
|
if (object && object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object) && object.isInDamagableState(obj) && IsFrontOf(obj,object) && sq_Abs(sq_GetXPos(obj) - sq_GetXPos(object)) <= rangeX && sq_Abs(sq_GetYPos(obj) - sq_GetYPos(object)) <= rangeY){
|
||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(object);
|
||
|
|
if(sq_IsBoss(activeObj)){
|
||
|
|
obj.getVar("KillPointTar_boss").push_obj_vector(activeObj);
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
else if(sq_IsNamed(activeObj)){
|
||
|
|
obj.getVar("KillPointTar_named").push_obj_vector(activeObj);
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.getVar("KillPointTar_normal").push_obj_vector(activeObj);
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local bossSize = obj.getVar("KillPointTar_boss").get_obj_vector_size();
|
||
|
|
local namedSize = obj.getVar("KillPointTar_named").get_obj_vector_size();
|
||
|
|
local normalSize = obj.getVar("KillPointTar_normal").get_obj_vector_size();
|
||
|
|
if(bossSize > 0){
|
||
|
|
for(local i = 0; i < bossSize; i++){
|
||
|
|
local targetObj = obj.getVar("KillPointTar_boss").get_obj_vector(i);
|
||
|
|
if(targetObj) obj.getVar("KillPointTar").push_obj_vector(targetObj);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if(namedSize > 0){
|
||
|
|
for(local i = 0; i < namedSize; i++){
|
||
|
|
local targetObj = obj.getVar("KillPointTar_named").get_obj_vector(i);
|
||
|
|
if(targetObj) obj.getVar("KillPointTar").push_obj_vector(targetObj);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if(normalSize > 0){
|
||
|
|
for(local i = 0; i < normalSize; i++){
|
||
|
|
local targetObj = obj.getVar("KillPointTar_normal").get_obj_vector(i);
|
||
|
|
if(targetObj) obj.getVar("KillPointTar").push_obj_vector(targetObj);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_KILLPOINT, -1, 7, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATATK_BYKK_KILLPOINTFINISH));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
if(subState < 10) obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/1_ranger/atkillpoint/finish/killpointfinishd_bullet_c.ani"), 0, 0);
|
||
|
|
else obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/1_ranger/atkillpoint/talisman/killpointtalismanfinish_bullet_c.ani"), 0, 0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_KillPoint(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 10:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(11);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_KILLPOINT, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 0:
|
||
|
|
case 1:
|
||
|
|
case 2:
|
||
|
|
case 11:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_KillPoint(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STYLISH) > 0) proc_atStylish_bykk(obj);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_KillPoint(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 106:
|
||
|
|
case 1011:
|
||
|
|
//`throw chain` 49 0 83
|
||
|
|
local createMax = sq_GetIntData(obj, SKILL_BYKK_KILLPOINT, 1);
|
||
|
|
local holdTime = sq_GetIntData(obj, SKILL_BYKK_KILLPOINT, 2);
|
||
|
|
local direction = sq_GetDirection(obj);
|
||
|
|
local size = obj.getVar("KillPointTar").get_obj_vector_size();
|
||
|
|
if(size < createMax) createMax = size;
|
||
|
|
for(local i = 0; i < createMax; i++){
|
||
|
|
local targetObj = obj.getVar("KillPointTar").get_obj_vector(i);
|
||
|
|
if(targetObj && targetObj.getState() != STATE_DIE){
|
||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(targetObj);
|
||
|
|
obj.getVar("KillPointTar_Shoot").push_obj_vector(activeObj);
|
||
|
|
local group = sq_GetGroup(activeObj);
|
||
|
|
local uniqueId = sq_GetUniqueId(activeObj);
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,49,0,83,direction,1,SKILL_BYKK_KILLPOINT,1,group,uniqueId,holdTime,0,0,0,0,0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 205:
|
||
|
|
case 2000:
|
||
|
|
//`attack`
|
||
|
|
local createMax = sq_GetIntData(obj, SKILL_BYKK_KILLPOINT, 1);
|
||
|
|
local size = obj.getVar("KillPointTar").get_obj_vector_size();
|
||
|
|
if(size < createMax) createMax = size;
|
||
|
|
for(local i = 0; i < createMax; i++){
|
||
|
|
local targetObj = obj.getVar("KillPointTar").get_obj_vector(i);
|
||
|
|
if(targetObj && targetObj.getState() != STATE_DIE){
|
||
|
|
sq_SendHitObjectPacket(obj,targetObj,0,0,sq_GetObjectHeight(targetObj) / 2);
|
||
|
|
sq_AddDrawOnlyAniFromParent(targetObj, "character/gunner/effect/animation/1_ranger/atkillpoint/hiteffect/hiteffect_1.ani", 0, 0, sq_GetObjectHeight(targetObj) / 2);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 224:
|
||
|
|
//`finish Last Attack`
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_KILLPOINT, -1, 8, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATATK_BYKK_KILLPOINTFINISHLASTSHOT));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
//`release Finish hold`
|
||
|
|
local apdPath = "character/atgunner/1_ranger_bykk/ap_killpoint.nut";
|
||
|
|
local createMax = sq_GetIntData(obj, SKILL_BYKK_KILLPOINT, 1);
|
||
|
|
local size = obj.getVar("KillPointTar").get_obj_vector_size();
|
||
|
|
if(size < createMax) createMax = size;
|
||
|
|
for(local i = 0; i < createMax; i++){
|
||
|
|
local targetObj = obj.getVar("KillPointTar").get_obj_vector(i);
|
||
|
|
if(targetObj && targetObj.getState() != STATE_DIE){
|
||
|
|
sq_SendHitObjectPacket(obj,targetObj,0,0,sq_GetObjectHeight(targetObj) / 2);
|
||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(targetObj, apdPath);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 1000:
|
||
|
|
obj.sq_PlaySound("FG_KILL_POINT_02");
|
||
|
|
obj.sq_PlaySound("KILL_POINT_BULLET");
|
||
|
|
break;
|
||
|
|
case 1005:
|
||
|
|
obj.sq_PlaySound("FG_KILL_POINT_01");
|
||
|
|
obj.sq_PlaySound("KILL_POINT_BLADE_THROW");
|
||
|
|
break;
|
||
|
|
case 2021:
|
||
|
|
//`finish Last Attack`
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_KILLPOINT, -1, 8, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATATK_BYKK_KILLPOINTFINISHLASTSHOT));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
//`release Finish hold`
|
||
|
|
local createMax = sq_GetIntData(obj, SKILL_BYKK_KILLPOINT, 1);
|
||
|
|
local size = obj.getVar("KillPointTar").get_obj_vector_size();
|
||
|
|
if(size < createMax) createMax = size;
|
||
|
|
for(local i = 0; i < createMax; i++){
|
||
|
|
local targetObj = obj.getVar("KillPointTar").get_obj_vector(i);
|
||
|
|
if(targetObj && targetObj.getState() != STATE_DIE){
|
||
|
|
sq_SendHitObjectPacket(obj,targetObj,0,0,sq_GetObjectHeight(targetObj) / 2);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_KillPoint(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_KillPoint(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(new_state != STATE_BYKK_KILLPOINT){
|
||
|
|
if(obj.getSkillSubState() >= 10) obj.getVar("KillPoint_Bool").setBool(0, false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//锁链切割
|
||
|
|
function checkExecutableSkill_ChainDevider(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CHAINDEVIDER);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(sq_GetIntData(obj, SKILL_BYKK_CHAINDEVIDER, 3) > 0){
|
||
|
|
obj.getVar("ChainDeviderTar").clear_obj_vector();
|
||
|
|
obj.sq_IntVectPush(10);
|
||
|
|
}
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CHAINDEVIDER, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_ChainDevider(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_ChainDevider(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
local attackIndex = 0;
|
||
|
|
switch(subState){
|
||
|
|
case 0: obj.sq_SetCurrentAnimation(ATANI_BYKK_CHAINDEVIDER01_BODY);attackIndex = ATATK_BYKK_CHAINDEVIDER1; break;
|
||
|
|
case 1: obj.sq_SetCurrentAnimation(ATANI_BYKK_CHAINDEVIDER02_BODY);attackIndex = ATATK_BYKK_CHAINDEVIDER2; break;
|
||
|
|
case 2: obj.sq_SetCurrentAnimation(ATANI_BYKK_CHAINDEVIDER03_BODY);attackIndex = ATATK_BYKK_CHAINDEVIDER3; break;
|
||
|
|
case 10: obj.sq_SetCurrentAnimation(ATANI_BYKK_CHAINDEVIDER01_BODY);attackIndex = ATATK_BYKK_CHAINDEVIDERTALISMAN1; break;
|
||
|
|
case 11: obj.sq_SetCurrentAnimation(ATANI_BYKK_CHAINDEVIDER02_BODY);attackIndex = ATATK_BYKK_CHAINDEVIDERTALISMAN2; break;
|
||
|
|
case 12: obj.sq_SetCurrentAnimation(ATANI_BYKK_CHAINDEVIDER03_BODY);attackIndex = ATATK_BYKK_CHAINDEVIDERTALISMAN3; break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
local bonus = subState;
|
||
|
|
if(subState >= 10) bonus = subState - 10;
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_CHAINDEVIDER, -1, bonus, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, attackIndex));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_ChainDevider(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 1:
|
||
|
|
case 10:
|
||
|
|
case 11:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(subState + 1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CHAINDEVIDER, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
case 12:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_ChainDevider(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STYLISH) > 0) proc_atStylish_bykk(obj);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_ChainDevider(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 101:
|
||
|
|
obj.sq_PlaySound("CHAINDEVIDER_03");
|
||
|
|
obj.sq_PlaySound("FG_TWINGUN_SWORD_03");
|
||
|
|
sq_flashScreen(obj,0,0,400,178, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 6, 100);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(2, 8);
|
||
|
|
obj.setTimeEvent(1, delay / 10, 10, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_ChainDevider(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 1:
|
||
|
|
local size = obj.getVar("ChainDeviderTar").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = obj.getVar("ChainDeviderTar").get_obj_vector(i);
|
||
|
|
if(targetObj && targetObj.getState() != STATE_DIE){
|
||
|
|
local baseY = sq_GetYPos(obj), tarY = sq_GetYPos(targetObj);
|
||
|
|
if(baseY < tarY) sq_setCurrentAxisPos(targetObj, 1, tarY - sq_Abs(baseY - tarY) / 10 - 1);
|
||
|
|
else sq_setCurrentAxisPos(targetObj, 1, tarY + sq_Abs(baseY - tarY) / 10 + 1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_ChainDevider(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onAttack_ChainDevider(obj, damager, boundingBox, isStuck)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
if(subState >= 10){
|
||
|
|
if(damager.isObjectType(OBJECTTYPE_ACTIVE)){
|
||
|
|
if(!obj.getVar("ChainDeviderTar").is_obj_vector(damager)) obj.getVar("ChainDeviderTar").push_obj_vector(damager);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//血舞祭
|
||
|
|
function checkExecutableSkill_BloodnChain(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_BLOODNCHAIN);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BLOODNCHAIN, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_BloodnChain(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_BloodnChain(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_BLOODNCHAIN_BODY);
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATATK_BYKK_BLOODNCHAINHOLDATTACK));
|
||
|
|
obj.getVar("BloodnChainTar").clear_obj_vector();
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
obj.sq_SetXScrollStart(400, currentAni.getDelaySum(0,5));
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_BloodnChain(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_BloodnChain(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STYLISH) > 0) proc_atStylish_bykk(obj);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_BloodnChain(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 103: sq_SetMyShake(obj, 2, 100); break;
|
||
|
|
case 105: sq_SetMyShake(obj, 7, 200); break;
|
||
|
|
case 114:
|
||
|
|
obj.sq_PlaySound("FG_BLOODCHAIN_02");
|
||
|
|
obj.sq_PlaySound("BLOODCHAIN_DASH_01");
|
||
|
|
break;
|
||
|
|
case 116:
|
||
|
|
sq_flashScreen(obj,50,100,150,178, sq_RGB(128,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 5, 300);
|
||
|
|
break;
|
||
|
|
case 118:
|
||
|
|
sq_SetMyShake(obj, 2, 100);
|
||
|
|
//`hold pos pass` 150 0 0
|
||
|
|
break;
|
||
|
|
case 119:
|
||
|
|
//`hold gather pos pass` 265 -20 0
|
||
|
|
local size = obj.getVar("BloodnChainTar").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(19, 20);
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = obj.getVar("BloodnChainTar").get_obj_vector(i);
|
||
|
|
if(targetObj && targetObj.getState() != STATE_DIE && !sq_IsFixture(targetObj)){
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(targetObj, "character/atgunner/1_ranger_bykk/ap_bloodnchain.nut");
|
||
|
|
if(addAppendage) sq_MoveToAppendageForce(targetObj, obj, obj, 265, -20, targetObj.getZPos(), delay, true, addAppendage);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 123: sq_SetMyShake(obj, 10, 200); break;
|
||
|
|
case 124:
|
||
|
|
//`hold pos pull` 355 -20 0
|
||
|
|
local size = obj.getVar("BloodnChainTar").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(24, 24);
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = obj.getVar("BloodnChainTar").get_obj_vector(i);
|
||
|
|
if(targetObj && targetObj.getState() != STATE_DIE && !sq_IsFixture(targetObj)){
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(targetObj, "character/atgunner/1_ranger_bykk/ap_bloodnchain.nut");
|
||
|
|
if(addAppendage) sq_MoveToAppendageForce(targetObj, obj, obj, 355, -20, targetObj.getZPos(), delay, true, addAppendage);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 126:
|
||
|
|
local size = obj.getVar("BloodnChainTar").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
local direction = sq_GetDirection(obj);
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = obj.getVar("BloodnChainTar").get_obj_vector(i);
|
||
|
|
if(targetObj && targetObj.getState() != STATE_DIE && sq_IsFixture(targetObj)){
|
||
|
|
sq_SetCurrentDirection(targetObj, direction);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 127:
|
||
|
|
sq_flashScreen(obj,50,100,50,178, sq_RGB(128,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 3, 150);
|
||
|
|
break;
|
||
|
|
case 130:
|
||
|
|
sq_SetMyShake(obj, 5, 50);
|
||
|
|
//`turn pos pull` 150 -10 0
|
||
|
|
local size = obj.getVar("BloodnChainTar").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
local direction = sq_GetDirection(obj);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(30, 31);
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = obj.getVar("BloodnChainTar").get_obj_vector(i);
|
||
|
|
if(targetObj && targetObj.getState() != STATE_DIE && !sq_IsFixture(targetObj)){
|
||
|
|
sq_SetCurrentDirection(targetObj, sq_GetOppositeDirection(direction));
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(targetObj, "character/atgunner/1_ranger_bykk/ap_bloodnchain.nut");
|
||
|
|
if(addAppendage) sq_MoveToAppendageForce(targetObj, obj, obj, 150, -10, targetObj.getZPos(), delay, true, addAppendage);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 133: sq_flashScreen(obj,500,500,1000,204, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); break;
|
||
|
|
case 136:
|
||
|
|
sq_flashScreen(obj,50,50,150,178, sq_RGB(128,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 20, 500);
|
||
|
|
obj.sq_SetXScrollStop(500);
|
||
|
|
//`finish` 106 0 91
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_BLOODNCHAIN, -1, 1, 1.0) + 100;
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,106,0,91,sq_GetDirection(obj),1,SKILL_BYKK_BLOODNCHAIN,1,totalDamage,0,0,0,0,0,0,0);
|
||
|
|
|
||
|
|
local size = obj.getVar("BloodnChainTar").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = obj.getVar("BloodnChainTar").get_obj_vector(i);
|
||
|
|
if(targetObj) CNSquirrelAppendage.sq_RemoveAppendage(targetObj, "character/atgunner/1_ranger_bykk/ap_bloodnchain.nut");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_BloodnChain(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_BloodnChain(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(new_state != STATE_BYKK_BLOODNCHAIN){
|
||
|
|
local size = obj.getVar("BloodnChainTar").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = obj.getVar("BloodnChainTar").get_obj_vector(i);
|
||
|
|
if(targetObj) CNSquirrelAppendage.sq_RemoveAppendage(targetObj, "character/atgunner/1_ranger_bykk/ap_bloodnchain.nut");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
obj.sq_SetXScrollStop(0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onAttack_BloodnChain(obj, damager, boundingBox, isStuck)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local apdPath = "character/atgunner/1_ranger_bykk/ap_bloodnchain.nut";
|
||
|
|
if(damager.isObjectType(OBJECTTYPE_ACTIVE)){
|
||
|
|
if(!obj.getVar("BloodnChainTar").is_obj_vector(damager)){
|
||
|
|
obj.getVar("BloodnChainTar").push_obj_vector(damager);
|
||
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, apdPath, true);
|
||
|
|
sq_HoldAndDelayDie(damager, obj, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL , AddAppendage);
|
||
|
|
}
|
||
|
|
if(sq_GetCurrentFrameIndex(obj) >= 36) sq_AddDrawOnlyAniFromParent(damager, "character/gunner/effect/animation/1_ranger/atbloodnchain/hit/bloodfinishhitattach_1.ani", 0, 0, sq_GetCenterZPos(boundingBox));
|
||
|
|
else sq_AddDrawOnlyAniFromParent(damager, "character/gunner/effect/animation/1_ranger/atbloodnchain/hit/bloodhitattach_1.ani", 0, 0, sq_GetCenterZPos(boundingBox));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//毁灭风暴
|
||
|
|
function checkExecutableSkill_RuinationArea(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_RUINATIONAREA);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_RUINATIONAREA, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_RuinationArea(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_RuinationArea(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0: obj.sq_SetCurrentAnimation(ATANI_BYKK_RUINATIONAREAST2_BODY);obj.sq_PlaySound("RUINATION_AREA_GUNBLADE_02"); break;
|
||
|
|
case 1: obj.sq_SetCurrentAnimation(ATANI_BYKK_RUINATIONAREAST3_BODY);obj.sq_PlaySound("RUINATION_AREA_GUNBLADE_03"); break;
|
||
|
|
case 2: obj.sq_SetCurrentAnimation(ATANI_BYKK_RUINATIONAREAST1_BODY);obj.sq_PlaySound("RUINATION_AREA_GUNBLADE_01"); break;
|
||
|
|
case 3: obj.sq_SetCurrentAnimation(ATANI_BYKK_RUINATIONAREAST2_BODY);obj.sq_PlaySound("RUINATION_AREA_GUNBLADE_02"); break;
|
||
|
|
case 4: obj.sq_SetCurrentAnimation(ATANI_BYKK_RUINATIONAREAST3_BODY);obj.sq_PlaySound("RUINATION_AREA_GUNBLADE_03"); break;
|
||
|
|
case 5: obj.sq_SetCurrentAnimation(ATANI_BYKK_RUINATIONAREAST4_BODY); break;
|
||
|
|
}
|
||
|
|
local speed = 1.0;
|
||
|
|
if(obj.getRapidInputFrequency() > 0) speed = 1.2;
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speed, speed);
|
||
|
|
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_PlaySound("R_FG_RUINATION_AREA_01");
|
||
|
|
if(obj.isMyControlObject()) sq_flashScreen(obj,40,0,40,10, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 1, 100);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_RUINATIONAREA, -1, 0, 1.03) + 100;
|
||
|
|
local hitMax = sq_GetIntData(obj, SKILL_BYKK_RUINATIONAREA, 6);
|
||
|
|
local speedRate = 3400 / currentAni.getDelaySum(0, 0);
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,0,0,0,sq_GetDirection(obj),1,SKILL_BYKK_RUINATIONAREA,1,totalDamage,hitMax,speedRate,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
if(obj.isMyControlObject()) sq_flashScreen(obj,50,0,50,10, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 4, 100);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_RUINATIONAREA, -1, 0, 1.06) + 100;
|
||
|
|
local hitMax = sq_GetIntData(obj, SKILL_BYKK_RUINATIONAREA, 8);
|
||
|
|
local speedRate = 2700 / currentAni.getDelaySum(0, 0);
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,0,0,0,sq_GetDirection(obj),1,SKILL_BYKK_RUINATIONAREA,2,totalDamage,hitMax,speedRate,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
if(obj.isMyControlObject()) sq_flashScreen(obj,60,0,60,10, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 7, 100);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_RUINATIONAREA, -1, 0, 1.09) + 100;
|
||
|
|
local hitMax = sq_GetIntData(obj, SKILL_BYKK_RUINATIONAREA, 4);
|
||
|
|
local speedRate = 4000 / currentAni.getDelaySum(0, 0);
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,0,0,0,sq_GetDirection(obj),1,SKILL_BYKK_RUINATIONAREA,3,totalDamage,hitMax,speedRate,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
if(obj.isMyControlObject()) sq_flashScreen(obj,40,0,40,10, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 1, 100);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_RUINATIONAREA, -1, 0, 1.12) + 100;
|
||
|
|
local hitMax = sq_GetIntData(obj, SKILL_BYKK_RUINATIONAREA, 6);
|
||
|
|
local speedRate = 3400 / currentAni.getDelaySum(0, 0);
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,0,0,0,sq_GetDirection(obj),1,SKILL_BYKK_RUINATIONAREA,4,totalDamage,hitMax,speedRate,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 4:
|
||
|
|
if(obj.isMyControlObject()) sq_flashScreen(obj,50,0,50,10, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 4, 100);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_RUINATIONAREA, -1, 0, 1.15) + 100;
|
||
|
|
local hitMax = sq_GetIntData(obj, SKILL_BYKK_RUINATIONAREA, 8);
|
||
|
|
local speedRate = 2700 / currentAni.getDelaySum(0, 0);
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,0,0,0,sq_GetDirection(obj),1,SKILL_BYKK_RUINATIONAREA,5,totalDamage,hitMax,speedRate,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 5:
|
||
|
|
local speedRate = 5000 / currentAni.getDelaySum(0, 0);
|
||
|
|
local delay1 = 30000 / speedRate, delay2 = 50000 / speedRate, delay3 = 40000 / speedRate;
|
||
|
|
obj.sq_PlaySound("R_FG_RUINATION_AREA_02");
|
||
|
|
obj.sq_PlaySound("RUINATION_AREA_EXP");
|
||
|
|
sq_flashScreen(obj,0,delay1,delay2,255, sq_RGB(139,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 15, delay3);
|
||
|
|
local totalDamage_Exp = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_RUINATIONAREA, -1, 1, 1.0) + 100;
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_RUINATIONAREA, -1, 2, 1.0) + 100;
|
||
|
|
local hitMax = sq_GetIntData(obj, SKILL_BYKK_RUINATIONAREA, 10);
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,0,0,0,sq_GetDirection(obj),1,SKILL_BYKK_RUINATIONAREA,6,totalDamage_Exp,speedRate,0,0,0,0,0,0);
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,0,0,0,sq_GetDirection(obj),1,SKILL_BYKK_RUINATIONAREA,7,totalDamage,hitMax,speedRate,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_RuinationArea(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 1:
|
||
|
|
case 2:
|
||
|
|
case 3:
|
||
|
|
case 4:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(subState + 1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_RUINATIONAREA, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 5:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_RuinationArea(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
obj.setSkillCommandEnable(SKILL_BYKK_RUINATIONAREA,true);
|
||
|
|
local b_useskill = obj.sq_IsEnterSkill(SKILL_BYKK_RUINATIONAREA);
|
||
|
|
sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
|
||
|
|
if(b_useskill != -1 || sq_IsEnterCommand(obj, E_ATTACK_COMMAND)) obj.addRapidInput();
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STYLISH) > 0) proc_atStylish_bykk(obj);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_RuinationArea(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_RuinationArea(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_RuinationArea(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
///////////////////////////////////////////////////////////////4spitfire
|
||
|
|
|
||
|
|
function isApplyConversionSkillPassiveObject_ATGunner(passiveObjectIndex)
|
||
|
|
{
|
||
|
|
if(passiveObjectIndex == 24396){
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function proc_appendage_common_debuff(appendage)
|
||
|
|
{
|
||
|
|
if(!appendage) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onStartDungeon_4SpitFire_bykk(obj)
|
||
|
|
{
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_GRENADENONE);
|
||
|
|
if(loadSlot) obj.sq_RemoveSkillLoad(SKILL_BYKK_GRENADENONE);
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_GRENADEWATER);
|
||
|
|
if(loadSlot) obj.sq_RemoveSkillLoad(SKILL_BYKK_GRENADEWATER);
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_GRENADELIGHT);
|
||
|
|
if(loadSlot) obj.sq_RemoveSkillLoad(SKILL_BYKK_GRENADELIGHT);
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
if(loadSlot) obj.sq_RemoveSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
|
||
|
|
for(local i = 0; i < 3; i++){
|
||
|
|
local timer = obj.getVar("grenade"+i.tostring()).get_ct_vector(0);
|
||
|
|
if(!timer){
|
||
|
|
obj.getVar("grenade"+i.tostring()).clear_ct_vector();
|
||
|
|
obj.getVar("grenade"+i.tostring()).push_ct_vector();
|
||
|
|
timer = obj.getVar("grenade"+i.tostring()).get_ct_vector(0);
|
||
|
|
timer.Reset();
|
||
|
|
timer.Start(10000,0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STRAYBULLETMASTERY) > 0){
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_N_02X) > 0){
|
||
|
|
obj.getVar("grenadeExSet").setInt(SKILL_BYKK_GRENADENONE, 0);
|
||
|
|
obj.getVar("grenadeExSet").setInt(SKILL_BYKK_GRENADELIGHT, 0);
|
||
|
|
obj.getVar("grenadeExSet").setInt(SKILL_BYKK_GRENADEWATER, 0);
|
||
|
|
obj.getVar("grenadeUiBool").setBool(SKILL_BYKK_GRENADENONE, false);
|
||
|
|
obj.getVar("grenadeUiBool").setBool(SKILL_BYKK_GRENADELIGHT, false);
|
||
|
|
obj.getVar("grenadeUiBool").setBool(SKILL_BYKK_GRENADEWATER, false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
setSkillBonusRate_At4SpitFire_bykk(obj);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(100);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GRENADENONE, STATE_PRIORITY_USER, true);
|
||
|
|
}
|
||
|
|
|
||
|
|
function reset_atSpitFire_bykk(obj)
|
||
|
|
{
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_GRENADENONE);
|
||
|
|
if(loadSlot) obj.sq_RemoveSkillLoad(SKILL_BYKK_GRENADENONE);
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_GRENADEWATER);
|
||
|
|
if(loadSlot) obj.sq_RemoveSkillLoad(SKILL_BYKK_GRENADEWATER);
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_GRENADELIGHT);
|
||
|
|
if(loadSlot) obj.sq_RemoveSkillLoad(SKILL_BYKK_GRENADELIGHT);
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
if(loadSlot) obj.sq_RemoveSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
|
||
|
|
for(local i = 0; i < 3; i++){
|
||
|
|
local timer = obj.getVar("grenade"+i.tostring()).get_ct_vector(0);
|
||
|
|
if(!timer){
|
||
|
|
obj.getVar("grenade"+i.tostring()).clear_ct_vector();
|
||
|
|
obj.getVar("grenade"+i.tostring()).push_ct_vector();
|
||
|
|
timer = obj.getVar("grenade"+i.tostring()).get_ct_vector(0);
|
||
|
|
timer.Reset();
|
||
|
|
timer.Start(10000,0);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
timer.Reset();
|
||
|
|
timer.Start(10000,0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STRAYBULLETMASTERY) > 0){
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_N_02X) > 0){
|
||
|
|
obj.getVar("grenadeExSet").setInt(SKILL_BYKK_GRENADENONE, 0);
|
||
|
|
obj.getVar("grenadeExSet").setInt(SKILL_BYKK_GRENADELIGHT, 0);
|
||
|
|
obj.getVar("grenadeExSet").setInt(SKILL_BYKK_GRENADEWATER, 0);
|
||
|
|
obj.getVar("grenadeUiBool").setBool(SKILL_BYKK_GRENADENONE, false);
|
||
|
|
obj.getVar("grenadeUiBool").setBool(SKILL_BYKK_GRENADELIGHT, false);
|
||
|
|
obj.getVar("grenadeUiBool").setBool(SKILL_BYKK_GRENADEWATER, false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
setSkillBonusRate_At4SpitFire_bykk(obj);
|
||
|
|
}
|
||
|
|
|
||
|
|
function ProcPassiveSkill_ATGunner_SpitFire(obj, skill_index, skill_level)
|
||
|
|
{
|
||
|
|
switch(skill_index){
|
||
|
|
case SKILL_BYKK_NITROMOTOR:
|
||
|
|
if(skill_level > 0){
|
||
|
|
local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, APDPATH_ATSPITFIRE_NITROMOTOR, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function procSkill_ATGunner_4SpitFire_bykk(obj)//2 4
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(!sq_IsMyControlObject(obj)) return;
|
||
|
|
local skillIndex = [SKILL_BYKK_GRENADENONE,SKILL_BYKK_GRENADEWATER,SKILL_BYKK_GRENADELIGHT];
|
||
|
|
local iconIndex = [0,2,4];
|
||
|
|
local coolTime = [1000, 2000, 1200];
|
||
|
|
local adjust = sq_GetIntData(obj, SKILL_BYKK_GRENADENONE, 16);
|
||
|
|
local airCoolTime = 500 * (100 - adjust) / 100;
|
||
|
|
for(local i = 0; i < 3; i++){
|
||
|
|
if(sq_GetSkillLevel(obj, skillIndex[i]) > 0){
|
||
|
|
local timer = obj.getVar("grenade"+(i).tostring()).get_ct_vector(0);
|
||
|
|
local currentT = timer.Get();
|
||
|
|
// if(i == 0) print("currentT = "+currentT);
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(skillIndex[i]);
|
||
|
|
if(loadSlot){
|
||
|
|
obj.setSkillCommandEnable(skillIndex[i], false);
|
||
|
|
local loadNumber = loadSlot.getRemainLoadNumber();
|
||
|
|
if(!loadSlot.isCooling()){
|
||
|
|
local loadMax = sq_GetIntData(obj, skillIndex[i], 0);
|
||
|
|
if(loadNumber < loadMax){
|
||
|
|
loadSlot.increaseLoadCount(1);
|
||
|
|
if(loadNumber + 1 != loadMax) loadSlot.setStartCool();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if(loadNumber > 0){
|
||
|
|
local sqrState = obj.getState();
|
||
|
|
if(sqrState == 0 || sqrState == 8 || sqrState == 14 || sqrState == 6 || sqrState == 7 || sqrState == STATE_BYKK_GRENADELIGHT || sqrState == STATE_BYKK_STANDBYREADY){
|
||
|
|
local loadSlotNit = obj.sq_GetSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
if(loadSlotNit && loadSlotNit.getRemainLoadNumber() == 0) return;
|
||
|
|
if((sq_GetZPos(obj) < 1 && currentT >= 3000) || (sq_GetZPos(obj) > 0 && currentT >= airCoolTime)){
|
||
|
|
obj.setSkillCommandEnable(skillIndex[i],true);
|
||
|
|
local b_useskill = obj.sq_IsEnterSkill(skillIndex[i]);
|
||
|
|
if(b_useskill != -1){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(sq_GetZPos(obj) > 0) obj.sq_IntVectPush(2);
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(skillIndex[i]);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GRENADENONE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut")){
|
||
|
|
if(loadNumber > 1) loadSlot.decreaseLoadCount(1);
|
||
|
|
if(loadNumber == 3) loadSlot.setStartCool();
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
loadSlot.decreaseLoadCount(1);
|
||
|
|
if(loadNumber == 3) loadSlot.setStartCool();
|
||
|
|
timer.Reset();
|
||
|
|
timer.Start(10000,0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
local loadMax = sq_GetIntData(obj, skillIndex[i], 0);
|
||
|
|
obj.sq_AddSkillLoad(skillIndex[i], iconIndex[i], loadMax, coolTime[i]);
|
||
|
|
//print("skillIndex = "+skillIndex[i]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
////////单兵推进器 icon = 80
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_NITROMOTOR) > 0){
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
if(!loadSlot){
|
||
|
|
local loadMax = sq_GetIntData(obj, SKILL_BYKK_NITROMOTOR, 0);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_N_02X) > 0) loadMax = loadMax + 1;
|
||
|
|
obj.sq_AddSkillLoad(SKILL_BYKK_NITROMOTOR, 80, loadMax, 0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
local state = obj.getState();
|
||
|
|
local stateLst = [STATE_SIT, STATE_DAMAGE, STATE_DOWN, STATE_HOLD];//STATE_SIT_FOREVER
|
||
|
|
for(local i = 0; i < stateLst.len(); i++){
|
||
|
|
if(state == stateLst[i]){
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
if(loadSlot && loadSlot.getRemainLoadNumber() > 0){
|
||
|
|
sq_SetKeyxEnable(obj, E_JUMP_COMMAND, true);
|
||
|
|
if(sq_IsEnterCommand(obj, E_JUMP_COMMAND)){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_RIGHT || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_LEFT) sq_SetCurrentDirection(obj, sq_GetOppositeDirection(sq_GetDirection(obj)));
|
||
|
|
}
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GRENADELIGHT, STATE_PRIORITY_AUTO, true);
|
||
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut")) loadSlot.decreaseLoadCount(1);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function drawCustomUI_ATGunner_4SpitFire(obj)
|
||
|
|
{
|
||
|
|
if(!obj || sq_isPVPMode()) return;
|
||
|
|
if(!obj.sq_IsMyControlObject()) return;
|
||
|
|
|
||
|
|
if(obj.getVar("grenadeUiBool").getBool(SKILL_BYKK_GRENADENONE)){
|
||
|
|
local sq_var = obj.getVar();
|
||
|
|
local uiAni = sq_var.GetAnimationMap("grenadeNoneUi", "character/gunner/effect/animation/4_spitfire/atchelli/standbyreadyui_00.ani");
|
||
|
|
sq_AnimationProc(uiAni);
|
||
|
|
sq_drawCurrentFrame(uiAni, 78, 477, false);
|
||
|
|
}
|
||
|
|
if(obj.getVar("grenadeUiBool").getBool(SKILL_BYKK_GRENADELIGHT)){
|
||
|
|
local sq_var = obj.getVar();
|
||
|
|
local uiAni = sq_var.GetAnimationMap("grenadeLightUi", "character/gunner/effect/animation/4_spitfire/atchelli/standbyreadyui_00.ani");
|
||
|
|
sq_AnimationProc(uiAni);
|
||
|
|
local offsetX = 78;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_GRENADENONE) > 0) offsetX = 135;
|
||
|
|
sq_drawCurrentFrame(uiAni, offsetX, 477, false);
|
||
|
|
}
|
||
|
|
if(obj.getVar("grenadeUiBool").getBool(SKILL_BYKK_GRENADEWATER)){
|
||
|
|
local sq_var = obj.getVar();
|
||
|
|
local uiAni = sq_var.GetAnimationMap("grenadeWaterUi", "character/gunner/effect/animation/4_spitfire/atchelli/standbyreadyui_00.ani");
|
||
|
|
sq_AnimationProc(uiAni);
|
||
|
|
local offsetX = 78;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_GRENADENONE) > 0) offsetX = 135;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_GRENADELIGHT) > 0) offsetX = 194;
|
||
|
|
sq_drawCurrentFrame(uiAni, offsetX, 477, false);
|
||
|
|
}
|
||
|
|
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut")){
|
||
|
|
local sq_var = obj.getVar();
|
||
|
|
local uiAni = sq_var.GetAnimationMap("standbyreadyUi", "character/gunner/effect/animation/4_spitfire/atchelli/standbyreadyui_00.ani");
|
||
|
|
sq_AnimationProc(uiAni);
|
||
|
|
local offsetX = 78;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_GRENADENONE) > 0) offsetX = 135;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_GRENADELIGHT) > 0) offsetX = 194;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_GRENADEWATER) > 0) offsetX = 252;
|
||
|
|
sq_drawCurrentFrame(uiAni, offsetX, 477, false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function determineNitromotor_bykk(obj, state)//判断单兵推进器滞空
|
||
|
|
{
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
if(loadSlot){
|
||
|
|
local loadNumber = loadSlot.getRemainLoadNumber();
|
||
|
|
if(loadNumber > 0){
|
||
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut") && ((state == SKILL_BYKK_GRENADENONE || state == SKILL_BYKK_GRENADELIGHT || state == SKILL_BYKK_GRENADEWATER) && sq_GetIntData(obj, SKILL_BYKK_GRENADENONE, 17) < 1)) loadSlot.decreaseLoadCount(1);
|
||
|
|
obj.getVar("determineNitromotor").setBool(0, true);
|
||
|
|
if(state == STATE_BYKK_OPENFIRE) return true;
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut")) {
|
||
|
|
obj.sq_AddStateLayerAnimation(-1,obj.sq_CreateCNRDAnimation("Effect/Animation/skl95_bykk/ATStandby-Ready/Standby-Ready_00.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("Effect/Animation/skl95_bykk/ATStandby-Ready/Standby-Ready_01.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(10002,obj.sq_CreateCNRDAnimation("Effect/Animation/skl95_bykk/ATStandby-Ready/Standby-Ready_02.ani"), 0, 0);
|
||
|
|
}
|
||
|
|
else obj.sq_AddStateLayerAnimation(-1,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atnitromotor/up_nitromotor_dodge1.ani"), 0, 0);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function nitroMotor_bykk(obj)
|
||
|
|
{
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
if(loadSlot){
|
||
|
|
local loadNumber = loadSlot.getRemainLoadNumber();
|
||
|
|
if(loadNumber > 0){
|
||
|
|
sq_SetKeyxEnable(obj, E_JUMP_COMMAND, true);
|
||
|
|
if(sq_IsEnterCommand(obj, E_JUMP_COMMAND)){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_RIGHT || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_LEFT) sq_SetCurrentDirection(obj, sq_GetOppositeDirection(sq_GetDirection(obj)));
|
||
|
|
}
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GRENADELIGHT, STATE_PRIORITY_AUTO, true);
|
||
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut")) loadSlot.decreaseLoadCount(1);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut")) return;
|
||
|
|
sq_SetKeyxEnable(obj, E_BUFF_COMMAND, true);
|
||
|
|
if(sq_IsEnterCommand(obj, E_BUFF_COMMAND)){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GRENADELIGHT, STATE_PRIORITY_AUTO, true);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//超负荷装填
|
||
|
|
function checkExecutableSkill_OverCharge(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_OVERCHARGE);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(SKILL_BYKK_OVERCHARGE);
|
||
|
|
obj.sq_IntVectPush(sq_GetCastTime(obj, SKILL_BYKK_OVERCHARGE, sq_GetSkillLevel(obj, SKILL_BYKK_OVERCHARGE)));
|
||
|
|
obj.sq_IntVectPush(500);
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(4);
|
||
|
|
obj.sq_IntVectPush(4);
|
||
|
|
obj.sq_IntVectPush(1000);
|
||
|
|
obj.sq_IntVectPush(1000);
|
||
|
|
obj.sq_IntVectPush(-1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_THROW, STATE_PRIORITY_USER, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_OverCharge(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_OverCharge(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
local Ani = obj.sq_GetThrowShootAni(1);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
obj.sq_PlaySound("OVERCHARGE_READY");
|
||
|
|
obj.sq_PlaySound("FG_DB_REVOLVER_02");
|
||
|
|
local elementSelect = obj.sq_GetVectorData(datas, 1);//0fire 1water 2dark 3light
|
||
|
|
// print("elementSelect = "+elementSelect);
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_OVERCHARGE)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_ATSPITFIRE_OVERCHARGE);
|
||
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, APDPATH_ATSPITFIRE_OVERCHARGE, true);
|
||
|
|
AddAppendage.setBuffIconImage(116);
|
||
|
|
AddAppendage.getVar("element").setInt(0, elementSelect);
|
||
|
|
AddAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_BYKK_OVERCHARGE, sq_GetSkillLevel(obj, SKILL_BYKK_OVERCHARGE));
|
||
|
|
CNSquirrelAppendage.sq_Append(AddAppendage, obj, obj, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_OverCharge(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_OverCharge(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_OverCharge(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_OverCharge(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_OverCharge(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_atgunner_throw(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local skillIndex = obj.getThrowIndex();
|
||
|
|
local substate = obj.getSkillSubState();
|
||
|
|
obj.setSkillSubState(substate)
|
||
|
|
if(skillIndex == SKILL_BYKK_OVERCHARGE){
|
||
|
|
switch(substate){
|
||
|
|
case 0:
|
||
|
|
sq_SetKeyxEnable(obj, E_BUFF_COMMAND, true);//设置其他按键
|
||
|
|
if(sq_IsEnterCommand(obj, E_BUFF_COMMAND)){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(4);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_OVERCHARGE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onAfterSetState_OverChargeThrow(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj.isMyControlObject()) return;
|
||
|
|
local skillIndex = obj.getThrowIndex();
|
||
|
|
if(skillIndex == SKILL_BYKK_OVERCHARGE){
|
||
|
|
local throwState = obj.getThrowState();
|
||
|
|
switch(throwState){
|
||
|
|
case 0:
|
||
|
|
obj.setIsCustomSelectSkill(true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local element = obj.getThrowElement();
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(element);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_OVERCHARGE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//特性弹
|
||
|
|
function checkExecutableSkill_BulletSpecific(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_OVERCHARGE)) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_BULLETSPECIFIC);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(SKILL_BYKK_BULLETSPECIFIC);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BULLETPENETRATE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_BulletSpecific(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_OVERCHARGE)) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_BulletSpecific(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_SetCurrentAnimation(0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_BulletSpecific(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_BulletSpecific(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_BulletSpecific(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_BulletSpecific(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_BulletSpecific(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//爆裂弹
|
||
|
|
function checkExecutableSkill_BulletExplosive(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_OVERCHARGE)) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_BULLETEXPLOSIVE);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(SKILL_BYKK_BULLETEXPLOSIVE);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BULLETPENETRATE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_BulletExplosive(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_OVERCHARGE)) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_BulletExplosive(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_SetCurrentAnimation(0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_BulletExplosive(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_BulletExplosive(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_BulletExplosive(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_BulletExplosive(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_BulletExplosive(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
//贯穿弹
|
||
|
|
function checkExecutableSkill_BulletPenetrate(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_OVERCHARGE)) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_BULLETPENETRATE);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(SKILL_BYKK_BULLETPENETRATE);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BULLETPENETRATE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_BulletPenetrate(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_OVERCHARGE)) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_BulletPenetrate(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
local Ani = obj.sq_GetThrowChargeAni(1);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
local skillIndex = obj.sq_GetVectorData(datas, 1);
|
||
|
|
obj.getVar("bulletSet").setInt(0, skillIndex);
|
||
|
|
local skill_level = sq_GetSkillLevel(obj, skillIndex);
|
||
|
|
local castTime = sq_GetCastTime(obj, skillIndex, skill_level);
|
||
|
|
sq_StartDrawCastGauge(obj, castTime, true);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
if(castTime > 180) castTime = castTime - 180;
|
||
|
|
sq_SetFrameDelayTime(currentAni, 2, castTime);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local Ani = obj.sq_GetThrowShootAni(1);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
local skillIndex = obj.sq_GetVectorData(datas, 1);
|
||
|
|
local apdPath = APDPATH_ATSPITFIRE_BULLETPENETRATE;
|
||
|
|
if(skillIndex == SKILL_BYKK_BULLETEXPLOSIVE) apdPath = APDPATH_ATSPITFIRE_BULLETEXPLOSIVE;
|
||
|
|
else if(skillIndex == SKILL_BYKK_BULLETSPECIFIC) apdPath = APDPATH_ATSPITFIRE_BULLETSPECIFIC;
|
||
|
|
local buffIcon = 118;
|
||
|
|
if(skillIndex == SKILL_BYKK_BULLETEXPLOSIVE) buffIcon = 119;
|
||
|
|
else if(skillIndex == SKILL_BYKK_BULLETSPECIFIC) buffIcon = 117;
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath)) CNSquirrelAppendage.sq_RemoveAppendage(obj, apdPath);
|
||
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, apdPath, true);
|
||
|
|
AddAppendage.setBuffIconImage(buffIcon);
|
||
|
|
AddAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), skillIndex, sq_GetSkillLevel(obj, skillIndex));
|
||
|
|
CNSquirrelAppendage.sq_Append(AddAppendage, obj, obj, true);
|
||
|
|
switch(skillIndex){
|
||
|
|
case SKILL_BYKK_BULLETEXPLOSIVE:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_BULLETPENETRATE)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_ATSPITFIRE_BULLETPENETRATE);
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_BULLETSPECIFIC)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_ATSPITFIRE_BULLETSPECIFIC);
|
||
|
|
break;
|
||
|
|
case SKILL_BYKK_BULLETPENETRATE:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_BULLETEXPLOSIVE)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_ATSPITFIRE_BULLETEXPLOSIVE);
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_BULLETSPECIFIC)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_ATSPITFIRE_BULLETSPECIFIC);
|
||
|
|
break;
|
||
|
|
case SKILL_BYKK_BULLETSPECIFIC:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_BULLETPENETRATE)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_ATSPITFIRE_BULLETPENETRATE);
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_BULLETEXPLOSIVE)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_ATSPITFIRE_BULLETEXPLOSIVE);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_BulletPenetrate(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(obj.getVar("bulletSet").getInt(0));
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_BULLETPENETRATE, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_BulletPenetrate(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_BulletPenetrate(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_BulletPenetrate(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_BulletPenetrate(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(new_state != STATE_BYKK_BULLETPENETRATE){
|
||
|
|
sq_EndDrawCastGauge(obj);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//交叉射击
|
||
|
|
function checkExecutableSkill_CrossShoot(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CROSSSHOOT);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(sq_GetZPos(obj) > 0) obj.sq_IntVectPush(1);
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CROSSSHOOT, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_CrossShoot(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == STATE_JUMP || state == STATE_JUMP_ATTACK || state == STATE_BYKK_GRENADELIGHT || state == STATE_BYKK_STANDBYREADY){
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_NITROMOTOR) > 0){
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
if(loadSlot){
|
||
|
|
local loadNumber = loadSlot.getRemainLoadNumber();
|
||
|
|
if(loadNumber > 0) return true;
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_CrossShoot(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
obj.sq_ZStop();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_CROSSSHOOT);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/crossshoot/atbody.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(2,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/crossshoot/gun.ani"), 0, 25);
|
||
|
|
obj.sq_AddStateLayerAnimation(3,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/crossshoot/gunbreak.ani"), 0, 25);
|
||
|
|
obj.sq_AddStateLayerAnimation(4,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/crossshoot/shoot.ani"), 0, 25);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_CROSSSHOOTAIR);
|
||
|
|
obj.sq_PlaySound("R_FG_CROSSM");
|
||
|
|
// obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/crossshoot/atbodyair.ani"), -50, -50);
|
||
|
|
obj.sq_AddStateLayerAnimation(2,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/crossshoot/gunair.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(3,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/crossshoot/gunbreakair.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(4,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/crossshoot/shootair.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_CrossShoot(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut")){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_STANDBYREADY, STATE_PRIORITY_AUTO, true);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(sq_GetZPos(obj));
|
||
|
|
obj.sq_AddSetStatePacket(STATE_JUMP, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_CrossShoot(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_CrossShoot(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 0:
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_CROSSSHOOT, -1, 0, 1.0);
|
||
|
|
local hitMax = sq_GetIntData(obj, SKILL_BYKK_CROSSSHOOT, 3);
|
||
|
|
local hitStunRate = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_CROSSSHOOT, -1, 1, 1.0) + 100;
|
||
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_CROSSSHOOT, 5);
|
||
|
|
local elementSelect = 4;
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_OVERCHARGE)){
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, APDPATH_ATSPITFIRE_OVERCHARGE);
|
||
|
|
elementSelect = addAppendage.getVar("element").getInt(0);
|
||
|
|
}
|
||
|
|
local isAir = 0, offsetX = 55, offsetY = 0, offsetZ = 85;
|
||
|
|
if(obj.getSkillSubState() == 1){ isAir = 1; offsetX = 55; offsetY = 0; offsetZ = 45;}
|
||
|
|
else{
|
||
|
|
switch(elementSelect){
|
||
|
|
case 0: obj.sq_PlaySound("CROSS_SHOT_FIRE"); break;
|
||
|
|
case 1: obj.sq_PlaySound("CROSS_SHOT_ICE"); break;
|
||
|
|
case 2: obj.sq_PlaySound("CROSS_SHOT"); break;
|
||
|
|
case 3: obj.sq_PlaySound("CROSS_SHOT_LIGHT"); break;
|
||
|
|
case 4: obj.sq_PlaySound("CROSS_SHOT"); break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,offsetX,offsetY,offsetZ,sq_GetDirection(obj),4,SKILL_BYKK_CROSSSHOOT,1,elementSelect,totalDamage,hitMax,hitStunRate,sizeRate,isAir,0,0);
|
||
|
|
local aniPath = ["character/gunner/effect/animation/4_spitfire/crossshootrenewal/floor_fire.ani","character/gunner/effect/animation/4_spitfire/crossshootrenewal/floor_ice.ani","character/gunner/effect/animation/4_spitfire/crossshootrenewal/floor_mu.ani","character/gunner/effect/animation/4_spitfire/crossshootrenewal/floor_light.ani","character/gunner/effect/animation/4_spitfire/crossshootrenewal/floor_mu.ani"];
|
||
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj, aniPath[elementSelect], 0, 0, 0);
|
||
|
|
if(elementSelect == 2){
|
||
|
|
local pAni = pooledObj.getCurrentAnimation();
|
||
|
|
pAni.setRGBA(50, 50, 50, 155);
|
||
|
|
}
|
||
|
|
sq_ChangeDrawLayer(pooledObj, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_CrossShoot(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_CrossShoot(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//聚合弹
|
||
|
|
function checkExecutableSkill_ChargeBuster(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CHARGEBUSTER);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(sq_GetZPos(obj) > 0) obj.sq_IntVectPush(10);
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CHARGEBUSTER, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_ChargeBuster(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == STATE_JUMP || state == STATE_JUMP_ATTACK || state == STATE_BYKK_GRENADELIGHT || state == STATE_BYKK_STANDBYREADY){
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_NITROMOTOR) > 0){
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
if(loadSlot){
|
||
|
|
local loadNumber = loadSlot.getRemainLoadNumber();
|
||
|
|
if(loadNumber > 0) return true;
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_ChargeBuster(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
obj.sq_ZStop();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_CHARGEBUSTERCHARGE);
|
||
|
|
obj.getVar("ChargeBusterBool").setBool(0, true);
|
||
|
|
obj.getVar("ChargeBusterSet").setInt(0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(-2,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atchargebuster/1_spin_back_dodge1.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(-1,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atchargebuster/1_spin_back_dodge2.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atchargebuster/3_spin_front_dodge1.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(2,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atchargebuster/3_spin_front_dodge2.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(2,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atchargebuster/2_gg_body_dodge1.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local isDown = obj.getVar("ChargeBusterSet").getInt(0);
|
||
|
|
if(isDown > 0){
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_CHARGEBUSTERSHOOTDOWN);
|
||
|
|
obj.sq_AddStateLayerAnimation(2,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atchargebuster/2_gg_body_dodge2_down.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(4,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atchargebuster/4_charge_dodge_down.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(5,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atchargebuster/5_shot_normal.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(6,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atchargebuster/6_shot_dodge_down.ani"), 0, 0);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_CHARGEBUSTERSHOOT);
|
||
|
|
obj.sq_AddStateLayerAnimation(2,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atchargebuster/2_gg_body_dodge2.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(4,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atchargebuster/4_charge_dodge.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(5,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atchargebuster/5_shot_normal_down.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(6,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atchargebuster/6_shot_dodge.ani"), 0, 0);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 10:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_CHARGEBUSTERSHOOTAIR);
|
||
|
|
obj.sq_AddStateLayerAnimation(5,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atchargebuster/5_shot_normal_air.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(6,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atchargebuster/6_shot_dodge_air.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_ChargeBuster(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CHARGEBUSTER, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 10:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut")){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_STANDBYREADY, STATE_PRIORITY_AUTO, true);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(sq_GetZPos(obj));
|
||
|
|
obj.sq_AddSetStatePacket(STATE_JUMP, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_ChargeBuster(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(obj.getVar("ChargeBusterBool").getBool(0)){
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.getVar("ChargeBusterBool").setBool(0, false);
|
||
|
|
obj.getVar("ChargeBusterSet").setInt(0, 1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_ChargeBuster(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 0:
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_CHARGEBUSTER, -1, 0, 1.0);
|
||
|
|
local elementSelect = 4;
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_OVERCHARGE)){
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, APDPATH_ATSPITFIRE_OVERCHARGE);
|
||
|
|
elementSelect = addAppendage.getVar("element").getInt(0);
|
||
|
|
}
|
||
|
|
local isAir = 0, offsetX = 105, offsetY = 0, offsetZ = 85, isDown = 0;
|
||
|
|
if(obj.getVar("ChargeBusterSet").getInt(0) > 0){
|
||
|
|
offsetX = 115; offsetY = 0; offsetZ = 55;isDown = 1;
|
||
|
|
}
|
||
|
|
if(obj.getSkillSubState() == 10){
|
||
|
|
isAir = 1; offsetX = 55; offsetY = 0; offsetZ = 35;
|
||
|
|
}
|
||
|
|
switch(elementSelect){
|
||
|
|
case 0: obj.sq_PlaySound("REVENGE_SHOT_FIRE_CHARGEBUSTER"); break;
|
||
|
|
case 1: obj.sq_PlaySound("REVENGE_SHOT_ICE_CHARGEBUSTER"); break;
|
||
|
|
case 2: obj.sq_PlaySound("REVENGE_SHOT_CHARGEBUSTER"); break;
|
||
|
|
case 3: obj.sq_PlaySound("REVENGE_SHOT_LIGHT_CHARGEBUSTER"); break;
|
||
|
|
case 4: obj.sq_PlaySound("REVENGE_SHOT_NONE_CHARGEBUSTER"); break;
|
||
|
|
}
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,offsetX,offsetY,offsetZ,sq_GetDirection(obj),4,SKILL_BYKK_CHARGEBUSTER,1,elementSelect,totalDamage,isAir,isDown,0,0,0,0);
|
||
|
|
obj.sq_PlaySound("KILL_POINT_SHOOT_03");
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_ChargeBuster(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_ChargeBuster(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//凝固汽油弹
|
||
|
|
function checkExecutableSkill_NapalmBomb(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_NAPALMBOMB);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(sq_GetZPos(obj) > 0) obj.sq_IntVectPush(1);
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_NAPALMBOMB, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_NapalmBomb(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == STATE_JUMP || state == STATE_JUMP_ATTACK || state == STATE_BYKK_GRENADELIGHT || state == STATE_BYKK_STANDBYREADY){
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_NITROMOTOR) > 0){
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
if(loadSlot){
|
||
|
|
local loadNumber = loadSlot.getRemainLoadNumber();
|
||
|
|
if(loadNumber > 0) return true;
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_NapalmBomb(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
obj.sq_ZStop();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_CHARGEBUSTERSHOOTDOWN);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_NAPALMBOMBSHOOTAIR);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_NapalmBomb(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut")){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_STANDBYREADY, STATE_PRIORITY_AUTO, true);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(sq_GetZPos(obj));
|
||
|
|
obj.sq_AddSetStatePacket(STATE_JUMP, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_NapalmBomb(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_NapalmBomb(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 0:
|
||
|
|
obj.sq_PlaySound("FG_LIGHTSHOT");
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_NAPALMBOMB, -1, 0, 1.0);
|
||
|
|
local lifeTime = sq_GetIntData(obj, SKILL_BYKK_NAPALMBOMB, 1);
|
||
|
|
local hitTime = sq_GetIntData(obj, SKILL_BYKK_NAPALMBOMB, 0);
|
||
|
|
local totalDamageGround = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_NAPALMBOMB, -1, 1, 1.0);
|
||
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_NAPALMBOMB, 2);
|
||
|
|
if(sq_GetIntData(obj, SKILL_BYKK_NAPALMBOMB, 6) > 0){
|
||
|
|
totalDamage = totalDamage * 140 / 100;
|
||
|
|
sizeRate = sizeRate * 120 / 100;
|
||
|
|
lifeTime = 0;
|
||
|
|
}
|
||
|
|
local elementSelect = 4;
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ATSPITFIRE_OVERCHARGE)){
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, APDPATH_ATSPITFIRE_OVERCHARGE);
|
||
|
|
elementSelect = addAppendage.getVar("element").getInt(0);
|
||
|
|
}
|
||
|
|
local isAir = 0, offsetX = 105, offsetY = 0, offsetZ = 65, isDown = 0;
|
||
|
|
if(subState == 1){ isAir = 1; offsetX = 55; offsetY = 0; offsetZ = 35;}
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,offsetX,offsetY,offsetZ,sq_GetDirection(obj),4,SKILL_BYKK_NAPALMBOMB,1,elementSelect,totalDamage,lifeTime,hitTime,totalDamageGround,sizeRate,0,0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_NapalmBomb(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_NapalmBomb(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//C4飞弹
|
||
|
|
function checkExecutableSkill_C4(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local size = obj.getVar("C4AtkObj").get_obj_vector_size();
|
||
|
|
if(size > 0 && obj.getVar("C4Bool").getBool(0)){
|
||
|
|
obj.getVar("C4Bool").setBool(0, false);
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local atkObj = obj.getVar("C4AtkObj").get_obj_vector(i);
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(atkObj);
|
||
|
|
if(colObj.isExistTimeEvent(2)){
|
||
|
|
colObj.stopTimeEvent(2);
|
||
|
|
colObj.setTimeEvent(2, 100, 1, true);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_C4);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(sq_GetZPos(obj) > 0) obj.sq_IntVectPush(1);
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_C4, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_C4(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == STATE_JUMP || state == STATE_JUMP_ATTACK || state == STATE_BYKK_GRENADELIGHT || state == STATE_BYKK_STANDBYREADY){
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_NITROMOTOR) > 0){
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
if(loadSlot){
|
||
|
|
local loadNumber = loadSlot.getRemainLoadNumber();
|
||
|
|
if(loadNumber > 0) return true;
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_C4(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
obj.sq_ZStop();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_C4REMOTEEXTHROW);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_C4REMOTEEX_AIR);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_C4(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut")){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(3);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_STANDBYREADY, STATE_PRIORITY_AUTO, true);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(sq_GetZPos(obj));
|
||
|
|
obj.sq_AddSetStatePacket(STATE_JUMP, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_C4(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_C4(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 1:
|
||
|
|
local range = 600;
|
||
|
|
obj.getVar("C4AtkObj").clear_obj_vector();
|
||
|
|
obj.getVar("C4Tar").clear_obj_vector();
|
||
|
|
obj.getVar("C4Tar_Boss").clear_obj_vector();
|
||
|
|
obj.getVar("C4Tar_Named").clear_obj_vector();
|
||
|
|
obj.getVar("C4Tar_Normal").clear_obj_vector();
|
||
|
|
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) && sq_Abs(sq_GetXPos(obj) - sq_GetXPos(targetObj)) <= range && sq_Abs(sq_GetYPos(obj) - sq_GetYPos(targetObj)) <= range && IsFrontOf(obj,targetObj)){
|
||
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(targetObj);
|
||
|
|
if(sq_IsBoss(activeObj)) obj.getVar("C4Tar_Boss").push_obj_vector(activeObj);
|
||
|
|
else if(sq_IsNamed(activeObj)) obj.getVar("C4Tar_Named").push_obj_vector(activeObj);
|
||
|
|
else obj.getVar("C4Tar_Normal").push_obj_vector(activeObj);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local bossNum = obj.getVar("C4Tar_Boss").get_obj_vector_size();
|
||
|
|
local namedNum = obj.getVar("C4Tar_Named").get_obj_vector_size();
|
||
|
|
local normalNum = obj.getVar("C4Tar_Normal").get_obj_vector_size();
|
||
|
|
if(bossNum> 0){
|
||
|
|
for(local i = 0; i < bossNum; i++){
|
||
|
|
local targetObj = obj.getVar("C4Tar_Boss").get_obj_vector(i);
|
||
|
|
if(targetObj){
|
||
|
|
obj.getVar("C4Tar").push_obj_vector(targetObj);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if(namedNum> 0){
|
||
|
|
for(local i = 0; i < namedNum; i++){
|
||
|
|
local targetObj = obj.getVar("C4Tar_Named").get_obj_vector(i);
|
||
|
|
if(targetObj){
|
||
|
|
obj.getVar("C4Tar").push_obj_vector(targetObj);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if(normalNum> 0){
|
||
|
|
for(local i = 0; i < normalNum; i++){
|
||
|
|
local targetObj = obj.getVar("C4Tar_Normal").get_obj_vector(i);
|
||
|
|
if(targetObj){
|
||
|
|
obj.getVar("C4Tar").push_obj_vector(targetObj);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local targetNum = obj.getVar("C4Tar").get_obj_vector_size();
|
||
|
|
if(targetNum > 0){
|
||
|
|
obj.getVar("C4Bool").setBool(0, true);
|
||
|
|
local createMax = sq_GetIntData(obj, SKILL_BYKK_C4, 2);
|
||
|
|
if(targetNum < createMax) createMax = targetNum;
|
||
|
|
local offsetX = 65, offsetY = 0, offsetZ = 80, subState = obj.getSkillSubState();
|
||
|
|
if(subState == 1){offsetX = 30; offsetY = 0; offsetZ = 55;}
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_C4, -1, 3, 1.0);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_C4);
|
||
|
|
local speedRate = sq_GetLevelData(obj, SKILL_BYKK_C4, 2, skillLevel);
|
||
|
|
local lifeTime = sq_GetIntData(obj, SKILL_BYKK_C4, 1);
|
||
|
|
for(local i = 0; i < createMax; i++){
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,offsetX,offsetY,offsetZ,sq_GetDirection(obj),4,SKILL_BYKK_C4,1,totalDamage,i,lifeTime,speedRate,subState,0,0,0);
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_C4(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_C4(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//G-14手雷
|
||
|
|
function checkExecutableSkill_GrenadeNone(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_GRENADENONE);
|
||
|
|
if(loadSlot) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_GRENADENONE);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(sq_GetZPos(obj) > 0) obj.sq_IntVectPush(2);
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(SKILL_BYKK_GRENADENONE);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GRENADENONE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_GrenadeNone(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_GRENADENONE);
|
||
|
|
if(loadSlot && loadSlot.getRemainLoadNumber() < 1) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_GrenadeNone(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
obj.sq_ZStop();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
local Ani = obj.sq_GetThrowChargeAni(2);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
local grenadeSkillIndex = obj.sq_GetVectorData(datas, 1);
|
||
|
|
obj.getVar("grenadeSkillIndex").setInt(0, grenadeSkillIndex);
|
||
|
|
obj.getVar("grenadeSet").setInt(0, 0);
|
||
|
|
obj.getVar("grenadeBool").setBool(0, true);
|
||
|
|
if(grenadeSkillIndex == SKILL_BYKK_LOCKONSUPPORT) obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/lockonsupport/lockonsupport_atmomentarythrow1_lockon01.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local Ani = obj.sq_GetThrowShootAni(2);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
if(obj.getVar("grenadeSkillIndex").getInt(0) == SKILL_BYKK_LOCKONSUPPORT) obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/lockonsupport/lockonsupport_atmomentarythrow2_lockon01.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_GRENADEAIR);
|
||
|
|
local grenadeSkillIndex = obj.sq_GetVectorData(datas, 1);
|
||
|
|
determineNitromotor_bykk(obj, grenadeSkillIndex);
|
||
|
|
obj.getVar("grenadeSkillIndex").setInt(0, grenadeSkillIndex);
|
||
|
|
if(grenadeSkillIndex == SKILL_BYKK_LOCKONSUPPORT) obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/lockonsupport/lockonsupport_atgrenadeair_lockon01.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
case 100:
|
||
|
|
local ani = obj.sq_GetStayAni();
|
||
|
|
obj.setCurrentAnimation(ani);
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 0));
|
||
|
|
|
||
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
||
|
|
if(attackInfo.isValidElement(ENUM_ELEMENT_FIRE)) obj.getVar("element_kk").setInt(0, 100);
|
||
|
|
else obj.getVar("element_kk").setInt(0, 0);
|
||
|
|
if(attackInfo.isValidElement(ENUM_ELEMENT_WATER)) obj.getVar("element_kk").setInt(1, 100);
|
||
|
|
else obj.getVar("element_kk").setInt(1, 0);
|
||
|
|
if(attackInfo.isValidElement(ENUM_ELEMENT_DARK)) obj.getVar("element_kk").setInt(2, 100);
|
||
|
|
else obj.getVar("element_kk").setInt(2, 0);
|
||
|
|
if(attackInfo.isValidElement(ENUM_ELEMENT_LIGHT)) obj.getVar("element_kk").setInt(3, 100);
|
||
|
|
else obj.getVar("element_kk").setInt(3, 0);
|
||
|
|
obj.setTimeEvent(1, 50, 1, false);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_GrenadeNone(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GRENADENONE, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut")){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(3);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_STANDBYREADY, STATE_PRIORITY_AUTO, true);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
local zpos = sq_GetZPos(obj) + 30;
|
||
|
|
// if(zpos > 200) zpos = 0;
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(zpos);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_JUMP, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_GrenadeNone(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 1:
|
||
|
|
if(obj.getVar("grenadeBool").getBool(0) == false) break;
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.getVar("grenadeSet").setInt(0, 2);
|
||
|
|
obj.getVar("grenadeBool").setBool(0, false);
|
||
|
|
}
|
||
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.getVar("grenadeSet").setInt(0, 1);
|
||
|
|
obj.getVar("grenadeBool").setBool(0, false);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_GrenadeNone(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 0://35 0 75
|
||
|
|
case 1://35 0 65
|
||
|
|
local skillIndex = obj.getVar("grenadeSkillIndex").getInt(0);
|
||
|
|
print("skillIndex = "+skillIndex);
|
||
|
|
local bonusRate = 100;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_STRAYBULLETMASTERY) > 0){
|
||
|
|
bonusRate = bonusRate * (100 + sq_GetLevelData(obj, SKILL_BYKK_STRAYBULLETMASTERY, 0, sq_GetSkillLevel(obj, SKILL_BYKK_STRAYBULLETMASTERY))) / 100;
|
||
|
|
print("bonusRate22 = "+bonusRate);
|
||
|
|
}
|
||
|
|
local exLevel = sq_GetSkillLevel(obj, SKILL_BYKK_GRENADEEX);
|
||
|
|
if(exLevel > 0) bonusRate = bonusRate * (100 + 10*exLevel) / 100;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_N_02X) > 0) bonusRate = bonusRate * (100 + sq_GetIntData(obj, SKILL_BYKK_N_02X, 10) / 10) / 100;
|
||
|
|
print("bonusRate = "+bonusRate);
|
||
|
|
bonusRate = bonusRate.tofloat() / 100.0;
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(skillIndex, -1, 0, bonusRate);
|
||
|
|
print("totalDamageGrenade = "+totalDamage);
|
||
|
|
local sizeRate = obj.sq_GetBonusRateWithPassive(skillIndex, -1, 1, 1.0) + 100;
|
||
|
|
if(exLevel > 0) sizeRate = sizeRate * (100 + 5*exLevel) / 100;
|
||
|
|
print("sizeRate = "+sizeRate);
|
||
|
|
local prob = 0, time = 0, level = 0;
|
||
|
|
if(skillIndex == SKILL_BYKK_GRENADELIGHT){
|
||
|
|
prob = 100;
|
||
|
|
level = sq_GetSkillLevel(obj, 174) + 15;
|
||
|
|
time = sq_GetLevelData(obj, skillIndex, 4, sq_GetSkillLevel(obj, skillIndex));
|
||
|
|
}
|
||
|
|
else if(skillIndex == SKILL_BYKK_GRENADEWATER){
|
||
|
|
prob = sq_GetLevelData(obj, skillIndex, 2, sq_GetSkillLevel(obj, skillIndex)) / 10;
|
||
|
|
level = sq_GetSkillLevel(obj, 174) + 15;
|
||
|
|
time = sq_GetLevelData(obj, skillIndex, 4, sq_GetSkillLevel(obj, skillIndex));
|
||
|
|
}
|
||
|
|
local isEx = 0;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_N_02X) > 0 && sq_GetSkillLevel(obj, SKILL_BYKK_STRAYBULLETMASTERY) > 0){
|
||
|
|
local nowSaveNum = obj.getVar("grenadeExSet").getInt(skillIndex);
|
||
|
|
if(nowSaveNum < 2){
|
||
|
|
obj.getVar("grenadeExSet").setInt(skillIndex, nowSaveNum + 1);
|
||
|
|
if(nowSaveNum + 1 == 2) obj.getVar("grenadeUiBool").setBool(skillIndex, true);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
isEx = 1;
|
||
|
|
sizeRate = 300;
|
||
|
|
obj.getVar("grenadeExSet").setInt(skillIndex, 0);
|
||
|
|
obj.getVar("grenadeUiBool").setBool(skillIndex, false);
|
||
|
|
totalDamage = totalDamage * sq_GetIntData(obj, SKILL_BYKK_N_02X, 9) / 100;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local ptlSelect = obj.getVar("grenadeSet").getInt(0);
|
||
|
|
local offsetZ = 75;
|
||
|
|
if(flagIndex == 1){offsetZ = 65;ptlSelect = 3;}
|
||
|
|
if(skillIndex == SKILL_BYKK_LOCKONSUPPORT){
|
||
|
|
totalDamage = obj.sq_GetBonusRateWithPassive(skillIndex, -1, 0, 1.0);
|
||
|
|
local hitMax = sq_GetIntData(obj, skillIndex, 0);
|
||
|
|
local sizeRate = sq_GetIntData(obj, skillIndex, 1);
|
||
|
|
local prob = obj.sq_GetBonusRateWithPassive(skillIndex, -1, 1, 1.0) + 100;
|
||
|
|
local time = obj.sq_GetBonusRateWithPassive(skillIndex, -1, 3, 1.0) + 100;
|
||
|
|
if(ptlSelect == 1) ptlSelect = 0;
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,35,0,offsetZ,sq_GetDirection(obj),4,skillIndex,1,totalDamage,sizeRate,hitMax,ptlSelect,prob,time,0,0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
else if(skillIndex == SKILL_BYKK_GRAVITYGRENADE){
|
||
|
|
totalDamage = obj.sq_GetBonusRateWithPassive(skillIndex, -1, 2, 1.0);
|
||
|
|
local totalDamageExp = obj.sq_GetBonusRateWithPassive(skillIndex, -1, 3, 1.0);
|
||
|
|
local lifeTime = obj.sq_GetBonusRateWithPassive(skillIndex, -1, 0, 1.0) + 100;
|
||
|
|
local hitTime = obj.sq_GetBonusRateWithPassive(skillIndex, -1, 1, 1.0) + 100;
|
||
|
|
local sizeRate = sq_GetIntData(obj, skillIndex, 1);
|
||
|
|
if(ptlSelect == 1) ptlSelect = 0;
|
||
|
|
//print("lifeTime = "+lifeTime);
|
||
|
|
//print("hitTime = "+hitTime);
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,35,0,offsetZ,sq_GetDirection(obj),4,skillIndex,1,totalDamage,totalDamageExp,lifeTime,hitTime,ptlSelect,sizeRate,0,0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,35,0,offsetZ,sq_GetDirection(obj),4,skillIndex,1,totalDamage,sizeRate,isEx,ptlSelect,prob,time,level,0);
|
||
|
|
if(isEx > 0){
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut")){
|
||
|
|
switch(skillIndex){
|
||
|
|
case SKILL_BYKK_GRENADENONE: obj.sq_PlaySound("R_FG_SBR_FIRE"); break;
|
||
|
|
case SKILL_BYKK_GRENADELIGHT: obj.sq_PlaySound("R_FG_SBR_FLASH"); break;
|
||
|
|
case SKILL_BYKK_GRENADEWATER: obj.sq_PlaySound("R_FG_SBR_ICE"); break;
|
||
|
|
}
|
||
|
|
print("test");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else obj.sq_PlaySound("FG_GRENADE");
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_GrenadeNone(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 1:
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_NITROMOTOR) > 0 && sq_GetSkillLevel(obj, 33) > 0){
|
||
|
|
sq_clearSkillData();
|
||
|
|
sq_setLevelData(obj, 33, 0, 999999, 0);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(33);
|
||
|
|
obj.sq_AddSetStatePacket(17, STATE_PRIORITY_USER, true);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_GrenadeNone(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//M18阔剑地雷
|
||
|
|
function checkExecutableSkill_M18Claymore(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_M18CLAYMORE);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(sq_GetZPos(obj) > 0) obj.sq_IntVectPush(1);
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_M18CLAYMORE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_M18Claymore(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == STATE_JUMP || state == STATE_JUMP_ATTACK || state == STATE_BYKK_GRENADELIGHT || state == STATE_BYKK_STANDBYREADY){
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_NITROMOTOR) > 0){
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
if(loadSlot){
|
||
|
|
local loadNumber = loadSlot.getRemainLoadNumber();
|
||
|
|
if(loadNumber > 0) return true;
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_M18Claymore(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
obj.sq_ZStop();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_N_02X) > 0){
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_ATM18CLAYMORE_GROUND_NO2X_BODY);
|
||
|
|
obj.getVar("grenadeBool").setBool(0, false);
|
||
|
|
obj.getVar("grenadeSet").setInt(0, 0);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(ATANI_BYKK_ATM18CLAYMORE_START_BODY);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_N_02X) > 0) obj.sq_SetCurrentAnimation(ATANI_BYKK_ATM18CLAYMORE_AIR_NO2X_BODY);
|
||
|
|
else obj.sq_SetCurrentAnimation(ATANI_BYKK_ATM18CLAYMORE_AIRSTART_BODY);
|
||
|
|
determineNitromotor_bykk(obj, 0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
obj.getVar("M18ClayMoreObj").clear_obj_vector();
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_M18Claymore(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut")){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(3);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_STANDBYREADY, STATE_PRIORITY_AUTO, true);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
local zpos = sq_GetZPos(obj) + 30;
|
||
|
|
// if(zpos > 200) zpos = 0;
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(zpos);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_JUMP, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_M18Claymore(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(obj.getVar("grenadeBool").getBool(0) == false){
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.getVar("grenadeSet").setInt(0, 2);
|
||
|
|
obj.getVar("grenadeBool").setBool(0, true);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_M18Claymore(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 101:
|
||
|
|
case 201:
|
||
|
|
case 102:
|
||
|
|
case 202:
|
||
|
|
//print("flagIndex = "+flagIndex);
|
||
|
|
obj.sq_PlaySound("R_NEO_GRENADE_THROW");
|
||
|
|
obj.sq_PlaySound("NEO_M18_DROP");
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_M18CLAYMORE, -1, 0, 1.0);
|
||
|
|
local hitMax = sq_GetIntData(obj, SKILL_BYKK_M18CLAYMORE, 3);
|
||
|
|
local lifeTime = sq_GetIntData(obj, SKILL_BYKK_M18CLAYMORE, 7);
|
||
|
|
local sizeRate = sq_GetIntData(obj, SKILL_BYKK_M18CLAYMORE, 15);
|
||
|
|
local prob = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_M18CLAYMORE, -1, 2, 1.0) + 100;
|
||
|
|
local time = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_M18CLAYMORE, -1, 3, 1.0) + 100;
|
||
|
|
local ptlSelect = obj.getVar("grenadeSet").getInt(0);
|
||
|
|
local offsetX = 50, offsetZ = 0, subtype = 1;
|
||
|
|
if(flagIndex == 201){offsetX = 35; offsetZ = 35;}
|
||
|
|
if(flagIndex > 200) {
|
||
|
|
switch(flagIndex){
|
||
|
|
case 201: offsetX = 35; offsetZ = 80; break;
|
||
|
|
case 202: offsetX = 35; offsetZ = 35; break;
|
||
|
|
}
|
||
|
|
subtype = 3;
|
||
|
|
}
|
||
|
|
createSkillPassive_ATGunner_bykk(obj,obj,PASSIVEOBJ_BYKK_ATGUNNER,offsetX,0,offsetZ,sq_GetDirection(obj),4,SKILL_BYKK_M18CLAYMORE,subtype,totalDamage,hitMax,lifeTime,sizeRate,prob,time,flagIndex,ptlSelect);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_M18Claymore(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_M18Claymore(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//G-35L感电手雷
|
||
|
|
function checkExecutableSkill_GrenadeLight(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_GRENADELIGHT);
|
||
|
|
if(loadSlot) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CRUXOFSHAPIEL);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CRUXOFSHAPIEL, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_GrenadeLight(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_GRENADELIGHT);
|
||
|
|
if(loadSlot && loadSlot.getRemainLoadNumber() < 1) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_GrenadeLight(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
obj.sq_ZStop();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_NITROMOTORJUMP);
|
||
|
|
obj.sq_AddStateLayerAnimation(-1,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atnitromotor/up_nitromotor_dodge1.ani"), 0, 0);
|
||
|
|
local zPos = sq_GetZPos(obj);
|
||
|
|
local speed = 300;
|
||
|
|
if(zPos > 100) speed = 200;
|
||
|
|
if(zPos > 120) speed = 130;
|
||
|
|
if(zPos > 160) speed = 80;
|
||
|
|
if(zPos > 220) speed = 30;
|
||
|
|
sq_SetZVelocity(obj,speed,0);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_NITROMOTORJUMP);
|
||
|
|
obj.sq_AddStateLayerAnimation(-1,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atnitromotor/side_nitromotor_dodge1.ani"), 0, 0);
|
||
|
|
local zPos = sq_GetZPos(obj);
|
||
|
|
local speed = 300;
|
||
|
|
if(zPos > 100) speed = 200;
|
||
|
|
if(zPos > 120) speed = 130;
|
||
|
|
if(zPos > 160) speed = 80;
|
||
|
|
if(zPos > 220) speed = 30;
|
||
|
|
sq_SetZVelocity(obj,speed,0);
|
||
|
|
local speed = 400.0;
|
||
|
|
if(sq_GetDirection(obj) == ENUM_DIRECTION_RIGHT) sq_SetVelocity(obj, 0, speed);
|
||
|
|
else sq_SetVelocity(obj, 0, -speed);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_SetCurrentAnimation(ATANI_BYKK_NITROMOTORDOWN);
|
||
|
|
obj.sq_AddStateLayerAnimation(-1,obj.sq_CreateCNRDAnimation("effect/animation/4_spitfire/atnitromotor/down_nitromotor_dodge3.ani"), 0, 0);
|
||
|
|
sq_SetZVelocity(obj,-1500,0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_GrenadeLight(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 1:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut")){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_STANDBYREADY, STATE_PRIORITY_AUTO, true);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(sq_GetZPos(obj));
|
||
|
|
obj.sq_AddSetStatePacket(STATE_JUMP, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_GrenadeLight(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 1:
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_RIGHT || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_LEFT){
|
||
|
|
sq_SetCurrentDirection(obj, sq_GetOppositeDirection(sq_GetDirection(obj)));
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atgunner/4_spitfire_bykk/ap_standbyready.nut")){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_STANDBYREADY, STATE_PRIORITY_AUTO, true);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(sq_GetZPos(obj));
|
||
|
|
obj.sq_AddSetStatePacket(STATE_JUMP, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_LEFT || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_RIGHT){
|
||
|
|
local speed = 600.0;
|
||
|
|
if(sq_GetDirection(obj) == ENUM_DIRECTION_RIGHT) sq_SetVelocity(obj, 0, speed);
|
||
|
|
else sq_SetVelocity(obj, 0, -speed);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
local speed = 400.0;
|
||
|
|
if(sq_GetDirection(obj) == ENUM_DIRECTION_RIGHT) sq_SetVelocity(obj, 0, speed);
|
||
|
|
else sq_SetVelocity(obj, 0, -speed);
|
||
|
|
}
|
||
|
|
case 0:
|
||
|
|
sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
|
||
|
|
if(sq_IsEnterCommand(obj, E_ATTACK_COMMAND)){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_JUMP_ATTACK, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
if(sq_GetZPos(obj) <= 0){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_GrenadeLight(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_GrenadeLight(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_GrenadeLight(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 2:
|
||
|
|
if(new_state == STATE_STAND){
|
||
|
|
if(sq_GetIntData(obj, SKILL_BYKK_GRENADENONE, 18) > 0){
|
||
|
|
if(new_state == STATE_STAND){
|
||
|
|
local skillIndex = [SKILL_BYKK_GRENADENONE,SKILL_BYKK_GRENADEWATER,SKILL_BYKK_GRENADELIGHT];
|
||
|
|
for(local i = 0; i < 3; i++){
|
||
|
|
if(sq_GetSkillLevel(obj, skillIndex[i]) > 0){
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(skillIndex[i]);
|
||
|
|
if(loadSlot){
|
||
|
|
local loadNumber = loadSlot.getRemainLoadNumber();
|
||
|
|
local loadMax = sq_GetIntData(obj, skillIndex[i], 0);
|
||
|
|
if(loadNumber < loadMax){
|
||
|
|
loadSlot.increaseLoadCount(loadMax - loadNumber);
|
||
|
|
// print("test"+i+" : "+loadSlot.getRemainLoadNumber());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//G-18C冰冻手雷
|
||
|
|
function checkExecutableSkill_GrenadeWater(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_GRENADELIGHT);
|
||
|
|
if(loadSlot) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CRUXOFSHAPIEL);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CRUXOFSHAPIEL, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_GrenadeWater(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_GRENADEWATER);
|
||
|
|
if(loadSlot && loadSlot.getRemainLoadNumber() < 1) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_GrenadeWater(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_SetCurrentAnimation(0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_GrenadeWater(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_GrenadeWater(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_GrenadeWater(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_GrenadeWater(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_GrenadeWater(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//镭射狙击
|
||
|
|
function checkExecutableSkill_LockOnSupport(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_LOCKONSUPPORT);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(sq_GetZPos(obj) > 0) obj.sq_IntVectPush(2);
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(SKILL_BYKK_LOCKONSUPPORT);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GRENADENONE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_LockOnSupport(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == STATE_JUMP || state == STATE_JUMP_ATTACK || state == STATE_BYKK_GRENADELIGHT || state == STATE_BYKK_STANDBYREADY){
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_NITROMOTOR) > 0){
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
if(loadSlot){
|
||
|
|
local loadNumber = loadSlot.getRemainLoadNumber();
|
||
|
|
if(loadNumber > 0) return true;
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_LockOnSupport(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_SetCurrentAnimation(0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_LockOnSupport(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_LockOnSupport(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_LockOnSupport(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_LockOnSupport(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_LockOnSupport(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//G-61重力手雷
|
||
|
|
function checkExecutableSkill_GravityGrenade(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_GRAVITYGRENADE);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(sq_GetZPos(obj) > 0) obj.sq_IntVectPush(2);
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(SKILL_BYKK_GRAVITYGRENADE);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GRENADENONE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_GravityGrenade(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local state = obj.getState();
|
||
|
|
if(state == STATE_JUMP || state == STATE_JUMP_ATTACK || state == STATE_BYKK_GRENADELIGHT || state == STATE_BYKK_STANDBYREADY){
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_NITROMOTOR) > 0){
|
||
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_BYKK_NITROMOTOR);
|
||
|
|
if(loadSlot){
|
||
|
|
local loadNumber = loadSlot.getRemainLoadNumber();
|
||
|
|
if(loadNumber > 0) return true;
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
else return false;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_GravityGrenade(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_SetCurrentAnimation(0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_GravityGrenade(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_GravityGrenade(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_GravityGrenade(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_GravityGrenade(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_GravityGrenade(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|