寒冰穿刺

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
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容