ENUM_ICE_CRASH_SUBSTATE_START <-0 ; //代表第一个状态,准备
ENUM_ICE_CRASH_SUBSTATE_LOOP <-1 ; //
ENUM_ICE_CRASH_SUBSTATE_LOOP_ATTACKING <-2 ;
ENUM_ICE_CRASH_SUBSTATE_END <-3 ;
ENUM_ICE_CRASH_TIMER_SPIN <- 0;
ENUM_ICE_CRASH_MULTI_HIT <- 1;
VAR_ICE_CRASH <-0
function checkExecutableSkill_IceCrash(obj)
{
if(!obj) return false;
local b_useskill = obj.sq_IsUseSkill(SKILL_ICE_CRASH);
if(b_useskill) {
obj.sq_IntVectClear();
//可以理解为定义全局数组,这个数组内,该数组可以被这个技能的所有函数所访问
obj.sq_IntVectPush(ENUM_ICE_CRASH_SUBSTATE_START);
//数组放入 0 上面的变量定义
obj.sq_AddSetStatePacket(STATE_ICE_CRASH , STATE_PRIORITY_USER, true);
//执行完毕立马跳转onSetState_IceCrash
return true;
}
return false;
}
function checkCommandEnable_IceCrash(obj)
{
if(!obj)
return false;
local state = obj.sq_GetState();
if(state == STATE_ATTACK) {
return obj.sq_IsCommandEnable(SKILL_ICE_CRASH);
}
return true;
}
function onEndState_IceCrash(obj, newState)
{
if(!obj)
return;
if(newState != STATE_ICE_CRASH)
{
removeAllIceCrashAppendage(obj);
sq_RemoveParticle("Character/Mage/Particle/IceCrashIceDust.ptl",obj);
}
}
function onSetState_IceCrash(obj, state, datas, isResetTimer)
{
if(!obj) return;
local level = sq_GetSkillLevel(obj, SKILL_ICE_CRASH);
//获取寒冰穿刺的等级
local spinDistance = sq_GetIntData(obj, SKILL_ICE_CRASH, 0, level);
//获取静态数据编号0数据(最后的参数可要可不要)
local spinSpeed = sq_GetIntData(obj, SKILL_ICE_CRASH, 1, level);
//获取静态数据编号1数据(最后的参数可要可不要)
local spinTime = (spinDistance.tofloat()/spinSpeed.tofloat()) * 1000.0;
//根据0 和 1 算出时间(路径 = 速度 * 时间)
local multiHitGap = sq_GetLevelData(obj, SKILL_ICE_CRASH, 0, level);
//获取动态数据0,其实为打击次数
local subState = sq_GetVectorData(datas, 0);
//获取checkExecutableSkill里定义的全局数组,获取第0个(就是刚刚push进去的值0)
obj.setSkillSubState(subState);
//这个数开始代表了全局的小状态
if(subState == ENUM_ICE_CRASH_SUBSTATE_START) {
//如果我的小状态为 0
local attackPower = obj.sq_GetBonusRateWithPassive(SKILL_ICE_CRASH , STATE_ICE_CRASH, 1, 1.0);
//获取攻击参数动态数据编号为1,obj.sq_GetBonusRateWithPassive是获取百分比伤害
//参数 技能lst,状态参数,在动态数据里的编号,1.0代表了1倍伤害,如果改成10.0就是10倍伤害
//最后的参数必须要加小数点!!!代表浮点数
local var = obj.getVar();
//obj.getVar()也是定义全局数组。var相当于指向这个数组
//关于啥是全局数组
//举例子吧 onSetState现在执行了语句obj.getVar().clear_vector()清除数组所有元素;obj.getVar().push_vector(99);放进一个数,编号为0
//那么 onEndCurrentAni 里如果写上语句 local a = obj.getVar().get_vector(0);获取编号为0的数,那么a 为 99
//如果在onSetState再obj.getVar().push_vector(9222) 在onEndCurrentAni 里 local b = obj.getVar().get_vector(1); 这个b就是 9222
//数组有很多种,最常用的是数值数组和对象数组。
//数值数组存储的是数值,而对象数组存储的是指向了这个对象的一个变量。
//以后会有接触的
//还有数组怎么定义名称
// local var1 = obj.getVar("1")
// local var2 = obj.getVar("2")
//那么var1和var2分别指向了数组名称为"1"和"2"的数组,互不干扰,getVar里不写也没有关系。代表名称为空
var.setBool(VAR_ICE_CRASH,true);
//设定布尔代数 数组第0个为真,
obj.sq_StopMove();
//禁止我的上下左右键可以移动
obj.sq_SetCurrentAnimation(CUSTOM_ANI_ICE_CRASH_START);
//设定帧
obj.sq_SetCurrentAttackInfo(CUSTOM_ATTACK_INFO_ICE_CRASH);
//设定攻击信息
local currentAttackInfo = sq_GetCurrentAttackInfo(obj);
//获取我的攻击信息,这个一定要获取
sq_SetCurrentAttackBonusRate(currentAttackInfo, attackPower);
//设定攻击伤害,为特定数据
sq_SetCurrentAttackeHitStunTime(currentAttackInfo, 0);
//???????可以无视
obj.sq_PlaySound("MW_ICECRASH");
}
else if(subState == ENUM_ICE_CRASH_SUBSTATE_LOOP) {
obj.sq_SetCurrentAnimation(CUSTOM_ANI_ICE_CRASH_LOOP);
obj.setTimeEvent(ENUM_ICE_CRASH_TIMER_SPIN,spinTime.tointeger(),1,false);
//时间控制函数 去看看onTimeEvent函数有两个参数对不 timeEventIndex, timeEventCount
//setTimeEvent 参数 第一个是 id 对应了 timeEventIndex
//第二个是时间 为整数型 第三个是 时间触发次数 第四个是是否一开始触发 true就是一开始触发,反之没有
//举个例子obj.setTimeEvent(0,100,100,false)
//函数执行后,每100毫秒就会执行函数onTimeEvent timeEventIndex 对应0 timeEventCount 对应触发次数
//当执行了100次以后,就不会再次执行了,写0,可以无限执行。
obj.setTimeEvent(ENUM_ICE_CRASH_MULTI_HIT,multiHitGap,9999,false);
//同上理
}
else if(subState == ENUM_ICE_CRASH_SUBSTATE_LOOP_ATTACKING) {
if(!obj.isExistTimeEvent(ENUM_ICE_CRASH_TIMER_SPIN)) {
obj.setTimeEvent(ENUM_ICE_CRASH_TIMER_SPIN,spinTime.tointeger(),1,false);
obj.setTimeEvent(ENUM_ICE_CRASH_MULTI_HIT,multiHitGap,9999,false);
}
obj.sq_SetCurrentAnimation(CUSTOM_ANI_ICE_CRASH_LOOP_ATTACK);
}
else if(subState == ENUM_ICE_CRASH_SUBSTATE_END) {
obj.sq_StopMove();
obj.sq_SetCurrentAnimation(CUSTOM_ANI_ICE_CRASH_END);
obj.sq_SetCurrentAttackInfo(CUSTOM_ATTACK_INFO_ICE_CRASH_LAST);
sq_RemoveParticle("Character/Mage/Particle/IceCrashIceDust.ptl",obj);
local attackPower = obj.sq_GetBonusRateWithPassive(SKILL_ICE_CRASH , STATE_ICE_CRASH, 2, 1.0);
//获取攻击参数动态数据编号为2,obj.sq_GetBonusRateWithPassive是获取百分比伤害
//参数 技能lst,状态参数,在动态数据里的编号,1.0代表了1倍伤害,如果改成10.0就是10倍伤害
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), attackPower);
sq_SetMyShake(obj,2,120);
//屏幕震动,2为等级,120为时间
}
}
function onTimeEvent_IceCrash(obj, timeEventIndex, timeEventCount)
{
//setTimeEvent函数注意下
if(!obj)
return false;
if(!obj.isMyControlObject())
return false;
if(timeEventIndex == ENUM_ICE_CRASH_TIMER_SPIN)
{
//时间id 为 0 ,那么久设定状态为结束
obj.sq_IntVectClear();
obj.sq_IntVectPush(ENUM_ICE_CRASH_SUBSTATE_END);
obj.sq_AddSetStatePacket(STATE_ICE_CRASH , STATE_PRIORITY_USER, true);
return true;
}
else if( timeEventIndex == ENUM_ICE_CRASH_MULTI_HIT )
{
//如果时间id 为 1,那么就对当前敌人进行打击--代码解析
if(obj.getSkillSubState() == ENUM_ICE_CRASH_SUBSTATE_END)
//获取我的状态,onSetState 里的 obj.setSkillSubState(subState)了解一下
//如果我的状态为结束,就返回;
return true;
local sq_var = obj.getVar();
//指向数组
local i=0;
//定义 i 为 0
local objectsSize = sq_var.get_obj_vector_size();
//获取指向对象数组的元素数量
obj.sq_SetCurrentAttackInfo(CUSTOM_ATTACK_INFO_ICE_CRASH);
local attackPower = obj.sq_GetBonusRateWithPassive(SKILL_ICE_CRASH , STATE_ICE_CRASH, 1, 1.0);
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), attackPower);
//设定攻击
for(;i<objectsSize;++i)
{
local damager = sq_var.get_obj_vector(i);
//去遍历对象数组的每一个对象,生成damager get_obj_vector()就是获取对象数组的
if(damager)
//damager还存在的话
sq_SendHitObjectPacket(obj,damager,0,0,0);
//我,obj 对damager实行一次打击行为。不用attack box
}
}
return false;
}
function removeAllIceCrashAppendage(obj)
{
if(!obj)
return;
local sq_var = obj.getVar();
local objectsSize = sq_var.get_obj_vector_size();
for(local i=0;i<objectsSize;++i)
{
local damager = sq_var.get_obj_vector(i);
if(damager)
CNSquirrelAppendage.sq_RemoveAppendage(damager, "Character/ATMage/IceCrash/ap_IceCrash.nut");
}
sq_var.clear_obj_vector();
//清除掉对象数组的所有对象
}
function prepareDraw_IceCrash(obj)
{
if(!obj) return;
local substate = obj.getSkillSubState();
}
function onEndCurrentAni_IceCrash(obj)
{
if(!obj) return;
local subState = obj.getSkillSubState();
if(subState == ENUM_ICE_CRASH_SUBSTATE_START) {
obj.sq_IntVectClear();
obj.sq_IntVectPush(ENUM_ICE_CRASH_SUBSTATE_LOOP);
obj.sq_AddSetStatePacket(STATE_ICE_CRASH, STATE_PRIORITY_USER, true);
}
else if(subState == ENUM_ICE_CRASH_SUBSTATE_END) {
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
}
}
function onAttack_IceCrash(obj, damager, boundingBox, isStuck)
{
if(!obj)
return 0;
local subState = obj.getSkillSubState();
local var = obj.getVar();
if(subState < ENUM_ICE_CRASH_SUBSTATE_END && !var.is_obj_vector(damager)) {
if(sq_IsHoldable(obj,damager) && sq_IsGrabable(obj,damager) && !sq_IsFixture(damager)) {
//上述的if是对收到伤害的对象进行类别判断,如果能够被抓住,能够搬运,不是建筑怪啥的
local masterAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, SKILL_ICE_CRASH, false, "Character/ATMage/IceCrash/ap_IceCrash.nut", true);
//给这个damager附加上一个appendage(具体看文件是干啥的)
if(masterAppendage) {
//如果这个ap是存在的。
sq_HoldAndDelayDie(damager, obj, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL , masterAppendage);
//把这个ap变成为强控性的
damager.setCurrentDirection(sq_GetOppositeDirection(obj.getDirection()));
//设定损伤者的朝向为我的朝向。
//obj.getDirection()获取obj的朝向(left,right) sq_GetOppositeDirection() 为获取参数朝向的反方向 (right,left) damager.setCurrentDirection()为设定damager的朝向为参数
var.push_obj_vector(damager);
//将收到伤害的对象放进对象数组(是指向这个对象)
}
}
}
if(subState < ENUM_ICE_CRASH_SUBSTATE_LOOP_ATTACKING && var.get_obj_vector_size() > 0) {
obj.sq_IntVectClear();
obj.sq_IntVectPush(ENUM_ICE_CRASH_SUBSTATE_LOOP_ATTACKING);
obj.sq_AddSetStatePacket(STATE_ICE_CRASH , STATE_PRIORITY_USER, true);
}
}
function onKeyFrameFlag_IceCrash(obj, flagIndex)
{
if(!obj) return true;
if(flagIndex == 1) {
obj.sq_SetStaticMoveInfo(0, 200, 100, false);
//设定x轴移动信息
obj.sq_SetMoveDirection(obj.getDirection(), ENUM_DIRECTION_NEUTRAL);
//开始移动X轴
}
else if(flagIndex == 2) {
local level = sq_GetSkillLevel(obj, SKILL_ICE_CRASH);
local speed = sq_GetIntData(obj, SKILL_ICE_CRASH, 1, level);
obj.sq_SetStaticMoveInfo(0, speed, speed, false);
obj.sq_SetMoveDirection(obj.getDirection(), ENUM_DIRECTION_NEUTRAL);
sq_CreateParticle("Character/Mage/Particle/IceCrashIceDust.ptl",obj,0,0,50,true,100,500,100);
}
else if(flagIndex == 3) {
removeAllIceCrashAppendage(obj);
}
return true;
}
© 版权声明
THE END
暂无评论内容