111
This commit is contained in:
103
character/atmage/iceorbex/iceorbex.nut
Normal file
103
character/atmage/iceorbex/iceorbex.nut
Normal file
@@ -0,0 +1,103 @@
|
||||
|
||||
function checkExecutableSkill_IceOrbEx(obj)
|
||||
{
|
||||
if (!obj) return false;
|
||||
|
||||
local useSkill = obj.sq_IsUseSkill(SKILL_ICE_ORB_EX);
|
||||
if (useSkill) {
|
||||
obj.sq_AddSetStatePacket(STATE_ICE_ORB_EX, STATE_PRIORITY_IGNORE_FORCE, false);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function checkCommandEnable_IceOrbEx(obj)
|
||||
{
|
||||
if(!obj) return false;
|
||||
local state = obj.sq_GetState();
|
||||
|
||||
if(state == STATE_ATTACK) {
|
||||
// 念瘫潍缣怃朝 ?姜蝶鉴虏 警蜗桧 陛栋?栖棻. 蒙机濠:姜霞热 [2012.04.20]
|
||||
return obj.sq_IsCommandEnable(SKILL_ICE_ORB_EX);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function onSetState_IceOrbEx(obj, state, datas, isResetTimer)
|
||||
{
|
||||
if(!obj) return;
|
||||
|
||||
obj.sq_StopMove();
|
||||
obj.sq_SetCurrentAnimation(CUSTOM_ANI_ICE_ORB_EX);
|
||||
obj.sq_PlaySound("MW_ICEORB");
|
||||
}
|
||||
|
||||
function onEndCurrentAni_IceOrbEx(obj)
|
||||
{
|
||||
if(!obj) return;
|
||||
|
||||
local substate = obj.getSkillSubState();
|
||||
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false); // 拥栖 部釭贼 蝶鼹萄煎.
|
||||
}
|
||||
|
||||
function onKeyFrameFlag_IceOrbEx(obj, flagIndex)
|
||||
{
|
||||
|
||||
if(!obj) return false;
|
||||
|
||||
local substate = obj.getSkillSubState();
|
||||
local level = sq_GetSkillLevel(obj, SKILL_ICE_ORB_EX);
|
||||
|
||||
if(flagIndex == 1) {
|
||||
// ?卫粽 嫦饵.
|
||||
if(obj.isMyControlObject())
|
||||
{
|
||||
local distance = sq_GetIntData(obj, SKILL_ICE_ORB_EX, 0); // 0. 鼠殓溘 剪葬
|
||||
|
||||
|
||||
local leftPress = sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL);
|
||||
local rightPress = sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL);
|
||||
|
||||
if(leftPress && rightPress) // 翕卫缣 寰扬毓击阳 籀葬. 翕卫缣 扬毓击 隆 酝除戏煎.
|
||||
{
|
||||
//蛤?? 高桧晦缣 嬴鼠匙紫 ?虽强挤.
|
||||
}
|
||||
else if((sq_GetDirection(obj) == ENUM_DIRECTION_RIGHT && rightPress) // 伪擎 寞?击 扬毓击阳.
|
||||
|| (sq_GetDirection(obj) == ENUM_DIRECTION_LEFT && leftPress))
|
||||
{
|
||||
distance = sq_GetIntData(obj, SKILL_ICE_ORB_EX, 1); // STATIC 1. 姜寞? 剪葬
|
||||
}
|
||||
else if(leftPress || rightPress) // ?釭塭紫 殓溘 腑棻贼 羲寞?
|
||||
{
|
||||
distance = sq_GetIntData(obj, SKILL_ICE_ORB_EX, 2); // STATIC 2. 羲寞? 剪葬
|
||||
}
|
||||
|
||||
|
||||
local speed = sq_GetIntData(obj, SKILL_ICE_ORB_EX, 3);// STATIC 3. 掘羹 嫦饵 楼紫
|
||||
|
||||
local level = sq_GetSkillLevel(obj, SKILL_ICE_ORB_EX);
|
||||
local gap = sq_GetIntData(obj, SKILL_ICE_ORB_EX, 4); // STATIC 4. 陛卫 当撩 卫除 除问
|
||||
local pricklePower = obj.sq_GetBonusRateWithPassive(SKILL_ICE_ORB_EX , STATE_ICE_ORB_EX, 0, 1.0); // LEVEL 0. 陛卫 奢问溘
|
||||
local lastPower = obj.sq_GetBonusRateWithPassive(SKILL_ICE_ORB_EX , STATE_ICE_ORB_EX, 1, 1.0); // LEVEL 1. 虞颤 奢问溘
|
||||
local maxCount = sq_GetLevelData(obj, SKILL_ICE_ORB_EX, 2, level); // LEVEL 2. 陛卫 当撩 ?热
|
||||
local direction = sq_GetDirection(obj);
|
||||
local targetPos = sq_GetDistancePos(obj.getXPos(), direction, distance);
|
||||
|
||||
// 卫除 = 剪葬/楼溘
|
||||
obj.sq_StartWrite();
|
||||
obj.sq_WriteDword(speed); // 陈嬴陛朝 楼紫.
|
||||
obj.sq_WriteDword(gap);
|
||||
obj.sq_WriteFloat(pricklePower.tofloat()); //挤热橾热紫 毡晦阳侥缣 float?戏煎 尔鱼棻. sqr缣摹 DWORD ?击 濠翕戏煎 int?戏煎 夥脯 舆韩 强晦 阳侥.
|
||||
obj.sq_WriteFloat(lastPower.tofloat());
|
||||
obj.sq_WriteDword(maxCount);
|
||||
obj.sq_WriteWord(direction);
|
||||
obj.sq_WriteDword(targetPos);
|
||||
|
||||
obj.sq_SendCreatePassiveObjectPacket(24235, 0, 100, 0, 50); // 橡挤掘 当撩, 100,50暧 谢?缣 当撩
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
300
character/atmage/iceorbex/po_aticeorbex.nut
Normal file
300
character/atmage/iceorbex/po_aticeorbex.nut
Normal file
@@ -0,0 +1,300 @@
|
||||
getroottable()["IceOrbExCreatePos"] <- {};
|
||||
getroottable()["IceOrbExCreatePos"] = [[28,28], // 0
|
||||
[22,-24], // 1
|
||||
[-21,0], // 2
|
||||
[-5,-28], // 3
|
||||
[-17,36], // 4
|
||||
[8,-19], // 5
|
||||
[-31,9], // 6
|
||||
[-2,42], // 7
|
||||
[-24,-24], // 8
|
||||
[36,7]]; // 9
|
||||
|
||||
|
||||
|
||||
PO_ICE_ORB_ETC_ANI_READY <- 0; // 赅暮 1 : 姜虽, 遽绿
|
||||
PO_ICE_ORB_ETC_ANI_ATTACK <- 1; // 赅暮 2 : 陛卫奢问
|
||||
PO_ICE_ORB_ETC_ANI_EXPLOSION <- 2; // 赅暮 3 : ?嫦
|
||||
|
||||
PO_ICE_ORB_SUB_STATE_FLYING <- 2; // 陈嬴马
|
||||
PO_ICE_ORB_SUB_STATE_READY <- 3; // 奢问遽绿,姜虽
|
||||
PO_ICE_ORB_SUB_STATE_ATTACK <- 4; // 奢问,陛卫络挤
|
||||
PO_ICE_ORB_SUB_STATE_EXPLOSION <- 5; // ?嫦
|
||||
|
||||
//PO_ICE_ORB_VAR_TIME <- 0; // 陈嬴陛朝 卫除
|
||||
PO_ICE_ORB_VAR_SPEED <- 1; // 陈嬴陛朝 楼紫
|
||||
PO_ICE_ORB_VAR_GAP <- 2; // 陛卫 当撩 卫除除问
|
||||
PO_ICE_ORB_VAR_POWER <- 3; // 陛卫 奢问溘
|
||||
PO_ICE_ORB_VAR_MAXCOUNT <- 4; // 陛卫 当撩 譆渠 偎热.
|
||||
PO_ICE_ORB_VAR_TARGET_X <- 5; // 迹瞳虽 X谢?
|
||||
PO_ICE_ORB_VAR_TARGET_Z <- 6; // 迹瞳虽 z谢?
|
||||
|
||||
|
||||
PO_ICE_ORB_TIMER_FLYING <- 0; //陈嬴陛朝 卫除
|
||||
PO_ICE_ORB_TIMER_ATTACK_GAP <- 1; //陛卫 奢问 卫除 除问
|
||||
PO_ICE_ORB_TIMER_WAITING_END <- 2; //葆虽虞 陛卫 奢问? 拥栖 部陈阳 梱虽 卫除 除问
|
||||
|
||||
PO_ICE_ORB_CONST_PRICKLE_ANI_TIME <- 160; // 陛卫 拥栖暧 识 卫除. : 葆虽虞 陛卫陛 当撩胀? 葆虽虞 陛卫陛 饵塭韩阳梱虽 渠晦 卫除
|
||||
PO_ICE_ORB_CONST_START_FRAME <- 6; //籀挤 卫蒙? ?溯歜
|
||||
|
||||
function setCustomData_po_ATIceOrbEx(obj, reciveData)
|
||||
{
|
||||
if(!obj) return;
|
||||
|
||||
local speed = reciveData.readDword();
|
||||
local gap = reciveData.readDword();
|
||||
local pricklePower = reciveData.readFloat();
|
||||
local lastPower = reciveData.readFloat();
|
||||
local maxCount = reciveData.readDword();
|
||||
local direction = reciveData.readWord();
|
||||
local targetPos = reciveData.readDword();
|
||||
|
||||
obj.setDirection(direction); // 寞?击 睡赅偌羹谛 翕橾?啪
|
||||
|
||||
|
||||
local var = obj.getVar();
|
||||
var.setInt(PO_ICE_ORB_VAR_SPEED ,speed);
|
||||
var.setInt(PO_ICE_ORB_VAR_GAP ,gap);
|
||||
var.setFloat(PO_ICE_ORB_VAR_POWER ,pricklePower);
|
||||
var.setInt(PO_ICE_ORB_VAR_MAXCOUNT ,maxCount);
|
||||
var.setInt(PO_ICE_ORB_VAR_TARGET_X ,targetPos);
|
||||
var.setInt(PO_ICE_ORB_VAR_TARGET_Z ,obj.getZPos());
|
||||
|
||||
|
||||
obj.sendStateOnlyPacket(PO_ICE_ORB_SUB_STATE_FLYING);
|
||||
|
||||
// 虞颤 奢问溘 荡潍
|
||||
local currentAttackInfo = sq_GetCurrentAttackInfo(obj);
|
||||
sq_SetCurrentAttackBonusRate(currentAttackInfo, lastPower.tointeger());
|
||||
|
||||
}
|
||||
|
||||
//陛卫 当撩 ?热.
|
||||
function createIcePrickleByIceOrbEx(obj, index, isFirst)
|
||||
{
|
||||
// 当撩 嫔纂陛 蟾娄 肾贼 蟾娄 寰肾朝 彰嫔煎 虽姜
|
||||
local createPosMax = ::IceOrbExCreatePos.len();
|
||||
index = index % createPosMax;
|
||||
|
||||
local pos = ::IceOrbExCreatePos[index];
|
||||
local x = pos[0];
|
||||
local z = pos[1];
|
||||
|
||||
// 桧嘐虽蒂 1.5寡 ?渠 ?棻. 评塭怃 陛卫暧 当撩嫔纂紫 1.5寡 渗?棻.
|
||||
x = x.tofloat() * 1.0;
|
||||
z = z.tofloat() * 1.0;
|
||||
|
||||
local var = obj.getVar();
|
||||
local power = var.getFloat(PO_ICE_ORB_VAR_POWER);
|
||||
|
||||
sq_BinaryStartWrite();
|
||||
sq_BinaryWriteWord(index); // 当撩 陛卫 樯策蝶.
|
||||
sq_BinaryWriteFloat(power);
|
||||
sq_BinaryWriteBool(isFirst);
|
||||
sq_SendCreatePassiveObjectPacket(obj, 24236, 0, x.tointeger(), 1, z.tointeger(), obj.getDirection());
|
||||
}
|
||||
|
||||
function onTimeEvent_po_ATIceOrbEx(obj, timeEventIndex, timeEventCount)
|
||||
{
|
||||
if(!obj)
|
||||
return false;
|
||||
|
||||
if(timeEventIndex == PO_ICE_ORB_TIMER_ATTACK_GAP)
|
||||
{
|
||||
if(!obj.isMyControlObject())
|
||||
return true; // 颤桧该陛 true桧贼 ?轿 酝钦.
|
||||
|
||||
local var = obj.getVar();
|
||||
local maxCount = var.getInt(PO_ICE_ORB_VAR_MAXCOUNT);
|
||||
if(timeEventCount < maxCount) //譆渠 偎热 嘐虏桧贼 陛卫 当撩
|
||||
{
|
||||
// 陛卫 当撩 ?热 属
|
||||
createIcePrickleByIceOrbEx(obj, timeEventCount + PO_ICE_ORB_CONST_START_FRAME, false);
|
||||
return false; // 颤桧该陛 false桧贼 啗楼 ?轿 ?棻.
|
||||
}
|
||||
else {
|
||||
obj.setTimeEvent(PO_ICE_ORB_TIMER_WAITING_END, PO_ICE_ORB_CONST_PRICKLE_ANI_TIME ,1 , false);
|
||||
return true; // 颤桧该陛 true桧贼 ?轿 酝钦.
|
||||
}
|
||||
}
|
||||
else if(timeEventIndex == PO_ICE_ORB_TIMER_WAITING_END)
|
||||
{
|
||||
obj.sendStateOnlyPacket(PO_ICE_ORB_SUB_STATE_EXPLOSION);
|
||||
return true; // 颤桧该陛 true桧贼 ?轿 酝钦.
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function setState_po_ATIceOrbEx(obj, state, datas)
|
||||
{
|
||||
if(!obj) return;
|
||||
|
||||
if(state == PO_ICE_ORB_SUB_STATE_FLYING)
|
||||
{
|
||||
local var = obj.getVar();
|
||||
local speed = var.getInt(PO_ICE_ORB_VAR_SPEED);
|
||||
|
||||
obj.sq_SetMoveParticle("Particle/ATIceOrbEx.ptl", 0.0, 0.0);
|
||||
sq_SetSpeedToMoveParticle(obj,0,speed);
|
||||
|
||||
// 窒葬 试虽 : 绪蒂热烟 濠舆 当撩?棻.
|
||||
local dustTimeGap = 50.0 * (1000.0/speed.tofloat());
|
||||
|
||||
sq_CreateParticle("PassiveObject/Character/Mage/Particle/ATIceOrbDust.ptl",obj,0,-1,0,true,dustTimeGap.tointeger(),500,100);
|
||||
}
|
||||
else if(state == PO_ICE_ORB_SUB_STATE_READY)
|
||||
{
|
||||
obj.sq_RemoveMoveParticle(); // 桧翕 姜虽.
|
||||
setCurrentAnimationFromCutomIndex(obj, PO_ICE_ORB_ETC_ANI_READY); // 拥栖 掖羹
|
||||
local xPos = sq_GetVectorData(datas,0); // 紫杂? x谢?.
|
||||
sq_SetCurrentPos(obj, xPos, obj.getYPos(), obj.getZPos());
|
||||
|
||||
sq_RemoveParticle("PassiveObject/Character/Mage/Particle/ATIceOrbDust.ptl",obj);
|
||||
}
|
||||
else if(state == PO_ICE_ORB_SUB_STATE_ATTACK)
|
||||
{
|
||||
setCurrentAnimationFromCutomIndex(obj, PO_ICE_ORB_ETC_ANI_ATTACK); // 拥栖 掖羹
|
||||
}
|
||||
else if(state == PO_ICE_ORB_SUB_STATE_EXPLOSION)
|
||||
{
|
||||
setCurrentAnimationFromCutomIndex(obj, PO_ICE_ORB_ETC_ANI_EXPLOSION); // 拥栖 掖羹
|
||||
obj.stopSound(3711);
|
||||
}
|
||||
}
|
||||
|
||||
function procAppend_po_ATIceOrbEx(obj)
|
||||
{
|
||||
if(!obj) return;
|
||||
|
||||
local state = obj.getState();
|
||||
if(state == PO_ICE_ORB_SUB_STATE_FLYING)
|
||||
{
|
||||
local var = obj.getVar();
|
||||
local targetXPos = var.getInt(PO_ICE_ORB_VAR_TARGET_X);
|
||||
local direction = obj.getDirection();
|
||||
if( (direction == ENUM_DIRECTION_LEFT && targetXPos > obj.getXPos())
|
||||
|| (direction == ENUM_DIRECTION_RIGHT && targetXPos < obj.getXPos()) ) {
|
||||
|
||||
obj.sq_RemoveMoveParticle(); // 桧翕 姜虽.
|
||||
targetXPos = obj.getXPos();
|
||||
sq_SetCurrentPos(obj, targetXPos, obj.getYPos(), obj.getZPos());
|
||||
|
||||
// 桧翕 部 棻挤 鼻鹧煎 剩梯.
|
||||
obj.sendStatePacket(PO_ICE_ORB_SUB_STATE_READY, obj.getXPos());
|
||||
}
|
||||
}
|
||||
else if(state == PO_ICE_ORB_SUB_STATE_READY)
|
||||
{
|
||||
if(sq_GetCurrentFrameIndex(obj) < 1) {
|
||||
local var = obj.getVar();
|
||||
local targetXPos = var.getInt(PO_ICE_ORB_VAR_TARGET_X);
|
||||
local addX = sq_GetShuttleValue(0, 10, sq_GetObjectTime(obj), 30)-5;
|
||||
addX = addX >= 0 ? 2 : -2;
|
||||
|
||||
sq_SetCurrentPos(obj, targetXPos + addX, obj.getYPos(), obj.getZPos());
|
||||
}
|
||||
}
|
||||
|
||||
if(state == PO_ICE_ORB_SUB_STATE_ATTACK || state == PO_ICE_ORB_SUB_STATE_READY)
|
||||
{
|
||||
if(PO_ICE_ORB_SUB_STATE_READY && sq_GetCurrentFrameIndex(obj) < 2)
|
||||
return;
|
||||
|
||||
local var = obj.getVar();
|
||||
local x,z;
|
||||
local t = (sq_GetObjectTime(obj)/100)%4; //sq_GetShuttleValue(0, 4,sq_GetObjectTime(obj),80)%4;
|
||||
|
||||
switch(t)
|
||||
{
|
||||
case 0 : x = 0; z = 2; break;
|
||||
case 1 : x = 0; z = -2; break;
|
||||
case 2 : x = -2; z = 0; break;
|
||||
case 3 : x = 2; z = 0; break;
|
||||
default : x = 0; z = 0; break;
|
||||
}
|
||||
|
||||
x = x + var.getInt(PO_ICE_ORB_VAR_TARGET_X);
|
||||
z = z + var.getInt(PO_ICE_ORB_VAR_TARGET_Z);
|
||||
|
||||
|
||||
sq_SetCurrentPos(obj, x, obj.getYPos(), z);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function onKeyFrameFlag_po_ATIceOrbEx(obj, flagIndex)
|
||||
{
|
||||
if(!obj)
|
||||
return false;
|
||||
|
||||
if(obj.getState() == PO_ICE_ORB_SUB_STATE_READY)
|
||||
{
|
||||
if(flagIndex == 1)
|
||||
{
|
||||
// 籀挤缚 棻 廓翻 鼻鹧煎 赅舒 当撩.
|
||||
for(local i = 0; i<PO_ICE_ORB_CONST_START_FRAME ; ++i)
|
||||
{
|
||||
createIcePrickleByIceOrbEx(obj, i, true);
|
||||
}
|
||||
|
||||
local var = obj.getVar();
|
||||
local gap = var.getInt(PO_ICE_ORB_VAR_GAP);
|
||||
local power = var.getInt(PO_ICE_ORB_VAR_POWER);
|
||||
obj.setTimeEvent(PO_ICE_ORB_TIMER_ATTACK_GAP, gap, 999, true);
|
||||
obj.sq_PlaySound("ICEORB_THORN_LOOP",3711);
|
||||
}
|
||||
}
|
||||
else if(obj.getState() == PO_ICE_ORB_SUB_STATE_EXPLOSION)
|
||||
{
|
||||
if(flagIndex == 2)
|
||||
{
|
||||
sq_CreateParticleByGlobal(PARTICLE_CREATER_WATER_HIT_LIGHT, // ENUM_PARTICLE_CREATER
|
||||
obj, // CNRDObject* master,
|
||||
0, //int x,
|
||||
-1, //int y,
|
||||
0, //int z,
|
||||
true, //bool posistionFromMaster,
|
||||
30, //int timeGap,
|
||||
150, //int maxTime,
|
||||
5); //int maxCount
|
||||
|
||||
sq_CreateParticleByGlobal(PARTICLE_CREATER_WATER_HIT_ICE, // ENUM_PARTICLE_CREATER
|
||||
obj, // CNRDObject* master,
|
||||
0, //int x,
|
||||
-1, //int y,
|
||||
0, //int z,
|
||||
true, //bool posistionFromMaster,
|
||||
30, //int timeGap,
|
||||
150, //int maxTime,
|
||||
5); //int maxCount
|
||||
|
||||
sq_CreateParticleByGlobal(PARTICLE_CREATER_WATER_HIT, // ENUM_PARTICLE_CREATER
|
||||
obj, // CNRDObject* master,
|
||||
0, //int x,
|
||||
0, //int y,
|
||||
0, //int z,
|
||||
true, //bool posistionFromMaster,
|
||||
30, //int timeGap,
|
||||
150, //int maxTime,
|
||||
2); //int maxCount
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function onEndCurrentAni_po_ATIceOrbEx(obj)
|
||||
{
|
||||
if(!obj) return;
|
||||
|
||||
if(obj.getState() == PO_ICE_ORB_SUB_STATE_READY)
|
||||
{
|
||||
obj.sendStateOnlyPacket(PO_ICE_ORB_SUB_STATE_ATTACK);
|
||||
}
|
||||
else if(obj.getState() == PO_ICE_ORB_SUB_STATE_EXPLOSION)
|
||||
{
|
||||
sq_SendDestroyPacketPassiveObject(obj);
|
||||
}
|
||||
}
|
||||
BIN
character/atmage/iceorbex/po_aticeorbexprickle.nut
Normal file
BIN
character/atmage/iceorbex/po_aticeorbexprickle.nut
Normal file
Binary file not shown.
Reference in New Issue
Block a user