Sqr/character/atmage/brokenarrow/brokenarrow.nut

667 lines
18 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
{
}
}