DNF/sqr/character/atmage/brokenarrow/brokenarrow.nut

667 lines
18 KiB
Plaintext
Raw Normal View History

2024-03-30 00:19:16 +08:00
SUB_STATE_BROKENARROW_0 <- 0
SUB_STATE_BROKENARROW_1 <- 1
SUB_STATE_BROKENARROW_2 <- 2
SUB_STATE_BROKENARROW_3 <- 3
SUB_STATE_BROKENARROW_4 <- 4
BrokenArrow_state_0 <- 10
BrokenArrow_state_1 <- 11
BrokenArrow_state_2 <- 12
function checkExecutableSkill_BrokenArrow(obj)
{
if(!obj) return false;
//local targetObj = sq_GetObjectByObjectId(obj, BROKENARROW_UNIQUE_ID);
local flag = obj.getVar("brokenarrow").get_vector(VECTOR_FLAG_0);
local targetObj = sq_GetPassiveObjectByState(obj, 24250, BrokenArrow_state_1); // 24250 `Character/Mage/ATBrokenArrow.obj` // 陴彻饵 - 粽煎赎拥煎办 (?髦)
local expTime = obj.sq_GetIntData(SKILL_BROKENARROW, 1); // 1. 颤问 撩奢卫 渠莲晦栋击 饵辨? 热 毡朝 卫除 (?髦桧 笮?毡朝 卫除)
// 觼煎栖赝 嬴桧蛊 蒙机.. 颤问 撩奢卫 渠莲晦栋击 饵辨? 热 毡朝 卫除 (?髦桧 笮?毡朝 卫除)
// 0塭贼 渠莲蒂 ?虽 强朝棻..
if(!targetObj || flag == 0 || expTime == 0)
{
local b_useskill = obj.sq_IsUseSkill(SKILL_BROKENARROW);
if(b_useskill) {
obj.getVar("arrow").clear_vector();
obj.getVar("arrow").push_vector(0);
obj.sq_IntVectClear();
obj.sq_IntVectPush(SUB_STATE_BROKENARROW_0); // substate撮?
obj.sq_AddSetStatePacket(STATE_BROKENARROW, STATE_PRIORITY_IGNORE_FORCE, true);
return true;
}
}
else
{
print( " checkExecutableSkill_BrokenArrow targetObj:" + targetObj);
obj.sq_IntVectClear();
obj.sq_IntVectPush(SUB_STATE_BROKENARROW_2); // substate撮?
local group = sq_GetGroup(targetObj);
local uniqueId = sq_GetUniqueId(targetObj);
obj.sq_IntVectPush(group); // substate撮?
obj.sq_IntVectPush(uniqueId); // substate撮?
obj.sq_AddSetStatePacket(STATE_BROKENARROW, STATE_PRIORITY_IGNORE_FORCE, true);
return true;
}
return false;
}
//local arr=["one","two","three"]
//
//::print("FOREACH\n");
//
//foreach(i,val in arr)
//{
//::print("index ["+i+"]="+val+"\n");
//}
//
//::print("FOR\n");
//
//for(local i=0;i<arr.len();i+=1)
//{
//::print("index ["+i+"]="+arr[i]+"\n");
//}
//
//::print("WHILE\n");
//
//local i=0;
//while(i<arr.len())
//{
//::print("index ["+i+"]="+arr[i]+"\n");
//i+=1;
//}
//::print("DO WHILE\n");
//
//local i=0;
//do
//{
//::print("index ["+i+"]="+arr[i]+"\n");
//i+=1;
//}while(i<arr.len());
function checkCommandEnable_BrokenArrow(obj)
{
if(!obj) return false;
local state = obj.sq_GetState();
if(state == STATE_ATTACK)
{
// 念瘫潍缣怃朝 ?姜蝶鉴虏 警蜗桧 陛栋?栖棻. 蒙机濠:姜霞热 [2012.04.20]
return obj.sq_IsCommandEnable(SKILL_BROKENARROW); // 念瘫潍缣怃朝 ?姜蝶鉴虏 警蜗桧 陛栋?栖棻. 蒙机濠:姜霞热 [2012.04.20] obj.sq_IsCommandEnable(SKILL_BROKENARROW);
}
return true;
}
function onChangeSkillEffect_BrokenArrow(obj, skillIndex, reciveData)
{
if(!obj)
return;
}
function onSetState_BrokenArrow(obj, state, datas, isResetTimer)
{
if(!obj) return;
local substate = obj.sq_GetVectorData(datas, 0);
obj.setSkillSubState(substate);
obj.sq_StopMove();
local arrowLauchNum = obj.sq_GetIntData(SKILL_BROKENARROW, 0); // 0. ?髦 偎热
obj.getVar().clear_vector();
obj.getVar().push_vector(arrowLauchNum);
obj.getVar().push_vector(0);
obj.getVar().push_vector(0);
obj.getVar("flag").clear_vector();
obj.getVar("flag").push_vector(0);
local posX = obj.getXPos();
local posY = obj.getYPos();
local posZ = obj.getZPos();
if(substate == SUB_STATE_BROKENARROW_0) {
if(obj.getVar("brokenarrow").size_vector() == 0)
{
obj.sq_PlaySound("MW_BARROW");
obj.getVar("brokenarrow").clear_vector();
obj.getVar("brokenarrow").push_vector(1);
}
else
obj.getVar("brokenarrow").set_vector(VECTOR_FLAG_0, 1);
// 渠莲?楚斜
obj.getVar("dash").clear_vector();
obj.getVar("dash").push_vector(0);
obj.sq_SetCurrentAnimation(CUSTOM_ANI_BROKENARROW1);
local pAni = obj.sq_GetCurrentAni();
pAni.setSpeedRate(200.0);
}
else if(substate == SUB_STATE_BROKENARROW_1) {
obj.sq_SetCurrentAnimation(CUSTOM_ANI_BROKENARROW_LOOP1);
local pAni = obj.sq_GetCurrentAni();
pAni.setSpeedRate(200.0);
}
else if(substate == SUB_STATE_BROKENARROW_2) {
// 渠莲1
obj.getVar("brokenarrow").set_vector(VECTOR_FLAG_0, 0); // ?廓 ?溥耀棻贼..棻卫 葬掸桧 腌栖棻.
local group = obj.sq_GetVectorData(datas, 1);
local uniqueId = obj.sq_GetVectorData(datas, 2);
local targetObj = sq_GetObject(obj, group, uniqueId);
obj.getVar().push_vector(posX); // ?营 x : i: 3
obj.getVar().push_vector(posY); // ?营 y : i: 4
if(targetObj) {
local disX = sq_Abs(targetObj.getXPos() - posX);
local disY = targetObj.getYPos() - posY;
if(targetObj.getXPos() > posX)
{
obj.setDirection(ENUM_DIRECTION_RIGHT);
}
else
{
obj.setDirection(ENUM_DIRECTION_LEFT);
}
disX = disX - 60;
if(disX <= 0)
disX = 0;
obj.getVar().push_vector(disX); // x蹴 桧翕剪葬 : i: 5
obj.getVar().push_vector(disY); // y蹴 桧翕剪葬 : i: 6
}
else { // 蛤?? 桧翕剪葬
local defaultDistance = obj.sq_GetIntData(SKILL_BLUEDRAGONWILL, 1); // 除蕾 奢问 (虽霞 ?渠徽) (100~)
obj.getVar().push_vector(defaultDistance); // x蹴 桧翕剪葬
obj.getVar().push_vector(0); // y蹴 桧翕剪葬
}
obj.sq_SetCurrentAnimation(CUSTOM_ANI_BROKENARROW_DASH1);
}
else if(substate == SUB_STATE_BROKENARROW_3) {
obj.sq_SetCurrentAttackInfo(CUSTOM_ATTACK_INFO_AT_MAGE_BROKENARROW);
obj.sq_SetCurrentAnimation(CUSTOM_ANI_BROKENARROW_DASH2);
obj.sq_PlaySound("MW_BARROW_FIN");
local atk = sq_GetCurrentAttackInfo(obj);
local attackRate = obj.sq_GetBonusRateWithPassive(SKILL_BROKENARROW, STATE_BROKENARROW, 1, 1.0); //1.?萃楝纂晦 奢问溘(%)
sq_SetCurrentAttackBonusRate(atk, attackRate);
}
else if(substate == SUB_STATE_BROKENARROW_4) {
// SUB_STATE_BROKENARROW_4 怃粽蝶才桧? 蒙机
}
}
function prepareDraw_BrokenArrow(obj)
{
if(!obj) return;
local substate = obj.getSkillSubState();
if(substate == SUB_STATE_BROKENARROW_0) {
}
else if(substate == SUB_STATE_BROKENARROW_1) {
}
else if(substate == SUB_STATE_BROKENARROW_2) {
}
else if(substate == SUB_STATE_BROKENARROW_3) {
}
else if(substate == SUB_STATE_BROKENARROW_4) {
}
}
function getAngleArrow(obj, pTargetChr)
{
if(!obj) return;
if(!pTargetChr) return;
local offsetX = 58; // ?践朝 嫔纂
local offsetZ = 75; // ?践朝 嫔纂
local X = obj.getXPos() + sq_GetDistancePos(0, obj.getDirection(), offsetX);
local Y = obj.getYPos();
local Z = obj.getZPos() + offsetZ;
local posX = pTargetChr.getXPos();
local posY = pTargetChr.getYPos();
local posZ = pTargetChr.getZPos() + (sq_GetObjectHeight(pTargetChr) / 2);
local offset = posX - X;
local distance = sq_GetDistance( X, Y - Z, posX, posY - posZ, true);
local w = posX - X;
if(w < 0) w = -w;
// ?贼鼻暧 陕紫蒂 掘?怃 桧??蒂 赁紫釭 给溥捡 肾朝虽 掘?棻.
local h = (posY - posZ) - (Y - Z);
local width = sq_Abs(posX - X);
local angle = sq_Atan2( h.tofloat(), width.tofloat());
//if((posY - posZ) < (Y - Z))
{
angle = -angle;
}
local nRevision = distance;
local cos = nRevision.tofloat() * sq_Cos(angle);
local sin = nRevision.tofloat() * sq_Sin(angle);
local nX = sq_Abs( cos.tointeger() );
local nY = sq_Abs( sin.tointeger() );
return angle;
//sq_SetfRotateAngle(pAni, angle);
}
function onProc_BrokenArrow(obj)
{
if(!obj) return;
local substate = obj.getSkillSubState();
local pAni = obj.sq_GetCurrentAni();
local frmIndex = obj.sq_GetCurrentFrameIndex(pAni);
local sq_var = obj.getVar();
local currentT = sq_GetCurrentTime(pAni);
local posX = sq_GetXPos(obj);
local posY = sq_GetYPos(obj);
local posZ = sq_GetZPos(obj);
if(substate == SUB_STATE_BROKENARROW_0) {
// SUB_STATE_BROKENARROW_0 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_1) {
// SUB_STATE_BROKENARROW_1 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_2) {
local dash_t = pAni.getDelaySum(false); //
//obj.getVar().push_vector(posX); // ?营 x : i: 3
//obj.getVar().push_vector(posY); // ?营 y : i: 4
local srcX = obj.getVar().get_vector(3); // 卫蒙x
local srcY = obj.getVar().get_vector(4); // 卫蒙y
local dis_x_len = sq_var.get_vector(5); // 识 桧翕剪葬
local dis_y_len = obj.getVar().get_vector(6) + 1; // y蹴 桧翕剪葬
local v = sq_GetAccel(0, dis_x_len, currentT, dash_t, true);
local my = sq_GetUniformVelocity(0, dis_y_len, currentT, dash_t);
local dstX = sq_GetDistancePos(srcX, obj.getDirection(), v);
local dstY = srcY + my;
if(sq_var.get_vector(1))
{ // 瞪?溯歜缣怃 桧翕? 热 桡朝 虽羲击 虏陬棻贼..
if(sq_var.get_vector(2) != posY)
{ // 瞪 posY谛 绿掖?瑭怃 殖塭螺棻贼..
sq_var.set_vector(1, 0); // 桧翕?楚斜蒂 off?鄹栖棻..
sq_var.set_vector(2, posY);
}
}
if(obj.isMovablePos(dstX, dstY) && !sq_var.get_vector(1))
{ // 桧翕?楚斜谛 桧翕陛栋虽羲桧 赅舒 陛栋?捡 桧翕
sq_setCurrentAxisPos(obj, 0, dstX);
sq_setCurrentAxisPos(obj, 1, dstY);
}
else
{ // 桧翕? 热 桡朝 虽羲击 虏陬棻..
sq_var.set_vector(1,1); // 桧翕 ?楚斜 樯策蝶 3 桧翕? 热 桡朝 虽羲击 虏陬击 阳 斜牖除 涡桧鼻 桧翕跤?棻..
local offset = dstX - posX;
if(offset != 0) {
if(offset < 0)
offset = -offset;
local totalLen = sq_var.get_vector(5); // 识桧翕剪葬
sq_var.set_vector(5, totalLen - offset);
}
}
}
else if(substate == SUB_STATE_BROKENARROW_3) {
// SUB_STATE_BROKENARROW_3 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_4) {
// SUB_STATE_BROKENARROW_4 怃粽蝶才桧? 蒙机
}
}
function onProcCon_BrokenArrow(obj)
{
if(!obj) return;
local substate = obj.getSkillSubState();
if(substate == SUB_STATE_BROKENARROW_0 || substate == SUB_STATE_BROKENARROW_1)
{
local pAni = obj.getCurrentAnimation();
local frmIndex = obj.sq_GetCurrentFrameIndex(pAni);
//local x_range = obj.sq_GetIntData(SKILL_BLUEDRAGONWILL, 3); // 晦遴 醱瞪卫除
//local y_range = obj.sq_GetIntData(SKILL_BLUEDRAGONWILL, 4); // 晦遴 醱瞪卫除
//local z_range = obj.sq_GetIntData(SKILL_BLUEDRAGONWILL, 5); // 晦遴 醱瞪卫除
if(frmIndex >= 3)
{
if(obj.getVar("flag").get_vector(0) == 0)
{
local x_range = 400; // 匐仪彰嫔 x
local y_range = 200; // 匐仪彰嫔 y
local z_range = 50; // 匐仪彰嫔 z
x_range = obj.sq_GetIntData(SKILL_BROKENARROW, 3); // 3. x彰嫔
y_range = obj.sq_GetIntData(SKILL_BROKENARROW, 4); // 4. y彰嫔
z_range = obj.sq_GetIntData(SKILL_BROKENARROW, 5); // 5. z彰嫔
local x = sq_GetXPos(obj);
local y = sq_GetYPos(obj);
local z = sq_GetZPos(obj);
local attackRate = obj.sq_GetBonusRateWithPassive(SKILL_BROKENARROW, STATE_BROKENARROW, 0, 1.0); //2.奢问溘(%)
local expTime = obj.sq_GetIntData(SKILL_BROKENARROW, 1); // 1. 颤问 撩奢卫 渠莲晦栋击 饵辨? 热 毡朝 卫除 (?髦桧 笮?毡朝 卫除)
local stunTime = obj.sq_GetIntData(SKILL_BROKENARROW, 2); // 2. 瞳 唳霜卫除
local targetObj = sq_FindTarget(obj, 80, x_range, y_range, z_range);
//local my = sq_GetUniformVelocity(0, dis_y_len, currentT, dash_t);
local xLen = 400;
local yLen = 0;
local zLen = 75;
local angle = -1.0;
if(targetObj)
{
xLen = obj.getXDistance(targetObj);
yLen = sq_GetYPos(targetObj) - sq_GetYPos(obj);
zLen = sq_GetZPos(targetObj) + (sq_GetObjectHeight(targetObj) / 2);
angle = getAngleArrow(obj, targetObj);
print(" angle:" + angle);
}
//local fireOffsetX = 56;
if(obj.isMyControlObject())
{
local fireOffsetX = 65;
local fireOffsetY = 0;
local fireOffsetZ = 73;
sq_BinaryStartWrite();
sq_BinaryWriteDword(xLen); //
sq_BinaryWriteDword(yLen); //
sq_BinaryWriteDword(zLen); //
sq_BinaryWriteDword(attackRate); //
sq_BinaryWriteDword(expTime); //
sq_BinaryWriteDword(stunTime); //
sq_BinaryWriteFloat(angle); //
obj.sq_SendCreatePassiveObjectPacket(24250, 0, fireOffsetX, fireOffsetY + 1, fireOffsetZ); // ?髦
}
obj.getVar("flag").set_vector(0, 1);
}
}
if(obj.getVar("dash").get_vector(0) == 0)
{
obj.setSkillCommandEnable(SKILL_BROKENARROW, true);
local iEnterSkill = obj.sq_IsEnterSkill(SKILL_BROKENARROW);
if(iEnterSkill != -1)
{
obj.getVar("dash").set_vector(0, 1);
}
}
//local particleCreater = null;
//particleCreater = obj.getVar().GetparticleCreaterMap("BrokenArrowDownAttack", "Character/Mage/Particle/BrokenArrowDownAttack.ptl", obj);
//
//particleCreater = obj.getVar().GetparticleCreaterMap("BrokenArrowUpAttack", "Character/Mage/Particle/BrokenArrowUpAttack.ptl", obj);
//
//particleCreater.Restart(0);
//particleCreater.SetPos(x + dx, y + dy, z + dz);
//
//sq_AddParticleObject(obj, particleCreater);
}
else if(substate == SUB_STATE_BROKENARROW_2) {
// SUB_STATE_BROKENARROW_2 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_3) {
// SUB_STATE_BROKENARROW_3 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_4) {
// SUB_STATE_BROKENARROW_4 怃粽蝶才桧? 蒙机
}
}
function onEndCurrentAni_BrokenArrow(obj)
{
if(!obj) return;
local substate = obj.getSkillSubState();
if(!obj.isMyControlObject()) {
return;
}
local arrowNum = obj.getVar().get_vector(0);
if(substate == SUB_STATE_BROKENARROW_0 || substate == SUB_STATE_BROKENARROW_1)
{
local arrowIndex = obj.getVar("arrow").get_vector(0);
arrowIndex = arrowIndex + 1;
obj.getVar("arrow").set_vector(0, arrowIndex);
if(arrowIndex < arrowNum)
{
obj.sq_IntVectClear();
obj.sq_IntVectPush(SUB_STATE_BROKENARROW_1); // substate撮?
obj.sq_AddSetStatePacket(STATE_BROKENARROW, STATE_PRIORITY_IGNORE_FORCE, true);
}
else
{
local expTime = obj.sq_GetIntData(SKILL_BROKENARROW, 1); // 1. 颤问 撩奢卫 渠莲晦栋击 饵辨? 热 毡朝 卫除 (?髦桧 笮?毡朝 卫除)
// 觼煎栖赝 嬴桧蛊 蒙机.. 颤问 撩奢卫 渠莲晦栋击 饵辨? 热 毡朝 卫除 (?髦桧 笮?毡朝 卫除)
// 0塭贼 渠莲蒂 ?虽 强朝棻..
if(obj.getVar("dash").get_vector(0) == 1 && expTime > 0)
{
local targetObj = sq_GetPassiveObjectByState(obj, 24250, BrokenArrow_state_1); // 24250 `Character/Mage/ATBrokenArrow.obj` // 陴彻饵 - 粽煎赎拥煎办 (?髦)
if(!targetObj)
{
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
}
else
{
local group = sq_GetGroup(targetObj);
local uniqueId = sq_GetUniqueId(targetObj);
obj.sq_IntVectClear();
obj.sq_IntVectPush(SUB_STATE_BROKENARROW_2); // substate撮?
obj.sq_IntVectPush(group); // substate撮?
obj.sq_IntVectPush(uniqueId); // substate撮?
obj.sq_AddSetStatePacket(STATE_BROKENARROW, STATE_PRIORITY_IGNORE_FORCE, true);
}
}
else
{
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
}
//obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
}
}
else if(substate == SUB_STATE_BROKENARROW_2)
{
obj.sq_IntVectClear();
obj.sq_IntVectPush(SUB_STATE_BROKENARROW_3); // substate撮?
obj.sq_AddSetStatePacket(STATE_BROKENARROW, STATE_PRIORITY_IGNORE_FORCE, true);
}
else if(substate == SUB_STATE_BROKENARROW_3)
{
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
}
else if(substate == SUB_STATE_BROKENARROW_4) {
// SUB_STATE_BROKENARROW_4 怃粽蝶才桧? 蒙机
}
}
function onKeyFrameFlag_BrokenArrow(obj, flagIndex)
{
if(!obj) return false;
local substate = obj.getSkillSubState();
if(substate == SUB_STATE_BROKENARROW_0) {
// SUB_STATE_BROKENARROW_0 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_1) {
// SUB_STATE_BROKENARROW_1 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_2) {
// SUB_STATE_BROKENARROW_2 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_3) {
// SUB_STATE_BROKENARROW_3 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_4) {
// SUB_STATE_BROKENARROW_4 怃粽蝶才桧? 蒙机
}
return false;
}
function onEndState_BrokenArrow(obj, new_state)
{
if(!obj) return;
local substate = obj.getSkillSubState();
if(substate == SUB_STATE_BROKENARROW_0) {
// SUB_STATE_BROKENARROW_0 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_1) {
// SUB_STATE_BROKENARROW_1 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_2) {
// SUB_STATE_BROKENARROW_2 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_3) {
// SUB_STATE_BROKENARROW_3 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_4) {
// SUB_STATE_BROKENARROW_4 怃粽蝶才桧? 蒙机
}
}
function onAfterSetState_BrokenArrow(obj, state, datas, isResetTimer)
{
if(!obj) return;
local substate = obj.getSkillSubState();
if(substate == SUB_STATE_BROKENARROW_0) {
// SUB_STATE_BROKENARROW_0 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_1) {
// SUB_STATE_BROKENARROW_1 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_2) {
// SUB_STATE_BROKENARROW_2 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_3) {
// SUB_STATE_BROKENARROW_3 怃粽蝶才桧? 蒙机
}
else if(substate == SUB_STATE_BROKENARROW_4) {
// SUB_STATE_BROKENARROW_4 怃粽蝶才桧? 蒙机
}
}
function onAttack_BrokenArrow(obj, damager, boundingBox, isStuck)
{
if(!obj) return;
local substate = obj.getSkillSubState();
if(substate == SUB_STATE_BROKENARROW_3)
{
}
}