Sqr/character/priest/spincutter.nut

391 lines
12 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.

S_SPINCUTTER_THROW <- 0
S_SPINCUTTER_RECALL <- 1
S_SPINCUTTER_ARRIVAL <- 2
CSI_THROW_LEN <- 0
CSI_STAY_TIME <- 1
CSI_SPIN_HIT_COUNT <- 2
I_OBJ_VECTOR_ROPE_ANI <- 0
I_OBJ_VECTOR_ROPE_DODGE_ANI <- 1
// 蝶鉴 撮睡嫦翕 亵勒击 虏菟横舆朝 ?热殓栖棻.. 嫦翕 亵勒 state朝 桧嘐 模蝶缣怃 掘?肾横 毡蝗栖棻. 桧够缣怃 useskill娄 setstate蒂 虽姜?舆贼 腌栖棻.
function checkExecutableSkill_Spincutter(obj)
{
if(!obj) return false;
local b_useskill = obj.sq_IsUseSkill(SKILL_SPINCUTTER);
if(b_useskill) {
obj.sq_IntVectClear();
obj.sq_IntVectPush(S_SPINCUTTER_THROW); // substate撮?
obj.sq_IntVectPush(obj.getDirection()); // substate撮?
obj.sq_addSetStatePacket(STATE_SPINCUTTER, STATE_PRIORITY_IGNORE_FORCE, true);
return true;
}
return false;
}
// 蝶鉴嬴桧夔 ?撩? 亵勒击 评虽朝 ?热殓栖棻. true蒂 葬欐?贼 蝶鉴 嬴桧夔桧 ?撩?陛 腌栖棻. (嫦翕亵勒 state朝 模蝶缣怃 籀葬腌栖棻.)
function checkCommandEnable_Spincutter(obj)
{
if(!obj) return false;
local state = obj.sq_GetSTATE();
if(state == STATE_ATTACK) {
// 念瘫潍缣怃朝 ?姜蝶鉴虏 警蜗桧 陛栋?栖棻. 蒙机濠:姜霞热 [2012.04.20]
return obj.sq_IsCommandEnable(SKILL_SPINCUTTER); // 念瘫潍缣怃朝 ?姜蝶鉴虏 警蜗桧 陛栋?栖棻. 蒙机濠:姜霞热 [2012.04.20] obj.sq_IsCommandEnable(SKILL_SPINCUTTER);
}
return true;
}
// loop 睡碟殓栖棻 ismycontrol煎 马谆虽 强擎 翱念胀 赅苌 object菟桧 桧够击 剪纂啪腌栖棻.
function onProc_spincutter(obj)
{
if(!obj) return;
local substate = obj.getSkillSubState();
local posX = obj.getXPos();
local posY = obj.getYPos();
local posZ = obj.getZPos();
local sq_var = obj.getVar();
local pAni = obj.sq_getCurrentAni();
local frmIndex = obj.sq_ani_GetCurrentFrameIndex(pAni);
local currentT = sq_GetCurrentTime(pAni);
if(substate == S_SPINCUTTER_THROW) {
local startT = pAni.GetFrameStartTime(1);
local pushT = pAni.getDelaySum(0, 6);
local pRope1 = sq_var.get_obj_vector(I_OBJ_VECTOR_ROPE_ANI); // 煎? 拥栖1
local pRope2 = sq_var.get_obj_vector(I_OBJ_VECTOR_ROPE_DODGE_ANI); // 煎? 拥栖2
local pRopeAniN = pRope1.getCurrentAnimation();
local pRopeAniD = pRope2.getCurrentAnimation();
local ropeObjX = pRope1.getXPos();
local len = sq_var.get_vector(1);
local delay = obj.sq_getIntData(SKILL_SPINCUTTER, CSI_STAY_TIME) + pushT;
local rate = 1.0;
if(currentT > startT && currentT < delay) {
//local v = sq_GetAccel(100, len, currentT, delay, true);
local v = sq_GetAccel(50, len, currentT, 650, true);
rate = v / 1000.0;
}
else if(currentT >= delay) {
rate = len / 1000.0;
}
//print("ropeObjX:" + ropeObjX + "obj.getDirection():" + obj.getDirection() + "len:" + len);
pRopeAniN.setImageRate(rate, 1.0);
pRopeAniD.setImageRate(rate, 1.0);
local size = sq_GetAniRealImageSize(pRopeAniD, ENUM_DIRECTION_RIGHT);
local ropeX = sq_GetDistancePos(ropeObjX, obj.getDirection(), size);
local pSickleObj = obj.sq_GetPassiveObject(24101); // sickle
if(pSickleObj) {
pSickleObj.setCurrentPos(ropeX, posY, posZ);
}
local pSpincutterObj = obj.sq_GetPassiveObject(24100); // 嫦饵?晦 瞪 蝶?醴搅陛 亵旎噶 擅戏煎 陛朝 ?娄蒂 翱轿?濠
if(pSpincutterObj) {
pSpincutterObj.setCurrentPos(ropeX, posY - 1, posZ);
}
if(frmIndex >= 2 && frmIndex < 6) {
local flag = sq_var.get_vector(0);
if(flag == 0) {
local offsetLen = 110;
local pRope = sq_var.get_obj_vector(I_OBJ_VECTOR_ROPE_DODGE_ANI); // 煎? 拥栖2
local pRopeAniD = pRope.getCurrentAnimation();
local size = sq_GetAniRealImageSize(pRopeAniD, ENUM_DIRECTION_RIGHT);
local distanceL = size + offsetLen;
local state = obj.sq_GetSTATE();
local attack_bonus_rate = obj.sq_getBonusRateWithPassive(SKILL_SPINCUTTER, state, 1 ,1.0);
local skill = sq_GetSkill(obj, SKILL_SPINCUTTER);
local bonus_rate = sq_GetAttackBonusRate(skill, 1, 1.0);
print("\n passive_bonus_rate:" + attack_bonus_rate + " attack_bonus_rate:" + bonus_rate);
local multiHit = obj.sq_getIntData(SKILL_SPINCUTTER, CSI_SPIN_HIT_COUNT);
if(obj.isMyControlObject()) {
obj.sq_binaryData_startWrite();
obj.sq_binaryData_writeDword(multiHit);
obj.sq_binaryData_writeDword(attack_bonus_rate);
obj.sq_p00_sendCreatePassiveObjectPacket(24100, 0, distanceL, -1, 0);
}
sq_var.set_vector(0, 1);
}
}
else if(frmIndex >= 6) {
local delay = obj.sq_getIntData(SKILL_SPINCUTTER, CSI_STAY_TIME);
local currentT = sq_GetCurrentTime(pAni) - pAni.getDelaySum(false);
if(obj.isMyControlObject()) {
obj.setSkillCommandEnable(SKILL_SPINCUTTER, true);
local iEnterSkill = obj.sq_IsEnterSkill(SKILL_SPINCUTTER);
if(currentT >= delay || iEnterSkill != -1) { // 蝶?醴搅 recall 嫦翕
local flag = sq_var.get_vector(2);
if(!flag) {
sq_var.set_vector(2,1);
obj.sq_IntVectClear();
obj.sq_IntVectPush(S_SPINCUTTER_RECALL);
obj.sq_IntVectPush(obj.getDirection()); // substate撮?
obj.sq_addSetStatePacket(STATE_SPINCUTTER, STATE_PRIORITY_USER, true);
}
}
}
}
}
else if(substate == S_SPINCUTTER_RECALL) {
}
else if(substate == S_SPINCUTTER_ARRIVAL) {
}
}
// loop 睡碟殓栖棻 ismycontrol ?蝶?陛 狱樯桧 object陛 桧够击 菟横骨栖棻. setstate 撮?桧釭 ?卫粽螃粽薛? 当撩 , 蛔蛔 籀葬?栖棻.
function onProcCon_spincutter(obj)
{
if(!obj) return;
local pAni = obj.sq_getCurrentAni();
local bEnd = obj.sq_ani_IsEnd(pAni);
local frmIndex = obj.sq_ani_GetCurrentFrameIndex(pAni);
local sq_var = obj.getVar();
//
local subState = obj.getSkillSubState();
if(subState == S_SPINCUTTER_RECALL) {
}
else if(subState == S_SPINCUTTER_ARRIVAL) {
}
if(bEnd) {
if(subState == S_SPINCUTTER_THROW) {
}
else if(subState == S_SPINCUTTER_RECALL) {
obj.sq_IntVectClear();
obj.sq_IntVectPush(S_SPINCUTTER_ARRIVAL);
obj.sq_IntVectPush(obj.getDirection()); // substate撮?
obj.sq_addSetStatePacket(STATE_SPINCUTTER, STATE_PRIORITY_USER, true);
}
else if(subState == S_SPINCUTTER_ARRIVAL) {
obj.sq_addSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
}
}
}
// state谦猿谛 翕卫缣 ?廓 ?轿肾朝 ?热殓栖棻. oldstate陛 谦猿肾朝 state殓栖棻. 鼠树陛 嫦饵胀匙桧 毡剪釭 谦猿籀葬腆匙桧 毡棻贼 桧够缣怃 籀葬?栖棻.
function onEndState_spincutter(obj, new_state)
{
if(!obj) return;
if(new_state != STATE_SPINCUTTER) {
local sq_var = obj.getVar();
local pRope1 = sq_var.get_obj_vector(I_OBJ_VECTOR_ROPE_ANI); // 煎? 拥栖1
local pRope2 = sq_var.get_obj_vector(I_OBJ_VECTOR_ROPE_DODGE_ANI); // 煎? 拥栖2
if(pRope1) {
pRope1.setValid(false);
}
if(pRope2) {
pRope2.setValid(false);
}
}
}
// state蒂 撮??坚 籀挤戏煎 菟横螃啪 腌栖棻. 陕谦 葬模蝶蒂 撮??栖棻.
function onSetState_spincutter(obj, state, datas, isResetTimer)
{
if(!obj) return;
local sq_var = obj.getVar();
local substate = obj.sq_getVectorData(datas, 0); // 罗廓箪 substate殓栖棻..
local direction = obj.sq_getVectorData(datas, 1); // 罗廓箪 substate殓栖棻..
obj.setSkillSubState(substate); //set substate
obj.sq_stopMove();
sq_var.clear_vector();
//sq_var.clear_obj_vector();
sq_var.push_vector(0);
local len = obj.sq_getIntData(SKILL_SPINCUTTER, CSI_THROW_LEN);
sq_var.push_vector(len);
sq_var.push_vector(0);
local posX = obj.getXPos();
local posY = obj.getYPos();
local posZ = obj.getZPos();
if(substate == S_SPINCUTTER_THROW) {
sq_var.clear_ani_vector(); // 拥栖诡桧暮 漱搅蒂 饷薯?棻..
obj.sq_setCurrentAttackInfo(CUSTOM_ATTACKINFO_SPINCUTTER); //
local firstAttackRate = obj.sq_getBonusRateWithPassive(SKILL_SPINCUTTER, state, 0, 1.0);
local skill = sq_GetSkill(obj, SKILL_SPINCUTTER);
local bonus_rate = sq_GetAttackBonusRate(skill, 0, 1.0);
print("\n state:" + state + " first_passive_bonus_rate:" + firstAttackRate + " first_attack_bonus_rate:" + bonus_rate);
obj.sq_setCurrentAttackBonusRate(firstAttackRate);
/////////////////////////////////////////////
if(obj.isMyControlObject()) {
obj.sq_binaryData_startWrite();
obj.sq_binaryData_writeDword(firstAttackRate);
obj.sq_p00_sendCreatePassiveObjectPacket(24101, 0, 0, 0, 0);
}
///////////////////////////////////////////////
obj.sq_setCurrentAnimation(CUSTOM_ANI_SPINCUTTER1);
local pAni = obj.sq_getCurrentAni();
local pRopeNormal = obj.sq_createCNRDAnimation("Effect/Animation/Spincutter/throw/4_rope_normal_0.ani");
local pRopeDodge = obj.sq_createCNRDAnimation("Effect/Animation/Spincutter/throw/5_rope_dodge_0.ani");
//local pSickleAni = obj.sq_createCNRDAnimation("Effect/Animation/Spincutter/throw/sickle/2_sickle_00_normal.ani");
pRopeNormal.setImageRate(0.1, 1.0);
pRopeDodge.setImageRate(0.1, 1.0);
local offsetLen = 101;
local ropeX = sq_GetDistancePos(posX, direction, offsetLen);
local pPooledObj = obj.sq_createCNRDPooledObject(pRopeNormal, false);
local pRopeDogeObj = obj.sq_createCNRDPooledObject(pRopeDodge, false);
//local pSickleObj = obj.sq_createCNRDPooledObject(pSickleAni, false);
pPooledObj.setCurrentDirection(direction);
pRopeDogeObj.setCurrentDirection(direction);
//pSickleObj.setCurrentDirection(direction);
pPooledObj.setCurrentPos(ropeX, posY, posZ);
pRopeDogeObj.setCurrentPos(ropeX, posY, posZ);
sq_var.clear_obj_vector();
sq_var.push_obj_vector(pPooledObj);
sq_var.push_obj_vector(pRopeDogeObj);
//sq_var.push_obj_vector(pSickleObj);
obj.sq_AddObject(pPooledObj);
obj.sq_AddObject(pRopeDogeObj);
//obj.sq_AddObject(pSickleObj);
local size = sq_GetAniRealImageSize(pRopeDodge, direction);
//pSickleObj.setCurrentPos(ropeX + size, posY, posZ);
}
else if(substate == S_SPINCUTTER_RECALL) {
obj.sq_setCurrentAnimation(CUSTOM_ANI_SPINCUTTER2);
local pA = obj.sq_getCurrentAni();
obj.sq_setAnimationSpeedRate(pA, 120.0);
local pRope1 = sq_var.get_obj_vector(I_OBJ_VECTOR_ROPE_ANI); // 煎? 拥栖1
local pRope2 = sq_var.get_obj_vector(I_OBJ_VECTOR_ROPE_DODGE_ANI); // 煎? 拥栖2
if(pRope1) {
pRope1.setValid(false);
}
if(pRope2) {
pRope2.setValid(false);
}
}
else if(substate == S_SPINCUTTER_ARRIVAL) {
obj.sq_setCurrentAnimation(CUSTOM_ANI_SPINCUTTER3);
}
}
// irdcharacter缣怃 setstate() -> IRDActiveObject::setState -> aftersetstate() 桧楛牖怃缣怃 葆虽虞 setstate殓栖棻. skill?撩缣 评塭怃 ?轿? ?蹂陛
// 毡棻贼 桧 ?热蒂 桧辨?栖棻.
function onAfterSetState_spincutter(obj, state, datas, isResetTimer)
{
if(!obj) return;
}
// onbeforeattack 属寥?热 殓栖棻
function onBeforeAttack_spincutter(obj, damager, boundingBox)
{
}
// onAttack 属寥?热 殓栖棻
function onAttack_spincutter(obj, damager, boundingBox)
{
}
// onAfterAttack 属寥?热 殓栖棻
function onAfterAttack_spincutter(obj, damager, boundingBox)
{
}
// onBeforeDamage 属寥?热 殓栖棻
function onBeforeDamage_spincutter(obj, attacker, boundingBox)
{
}
// onDamage 属寥?热 殓栖棻
function onDamage_spincutter(obj, attacker, boundingBox)
{
}
// onAfterDamage 属寥?热 殓栖棻
function onAfterDamage_spincutter(obj, attacker, boundingBox)
{
}