thewisp1 发表于 2009-4-26 05:58:19

判断技能是否在CD等状态

用GetUnitAbilityState对不同单位的技能做试验..

    /*返回结果
    若状态同时存在, 施法中 > CD中 > 不能使用

    无目标, 坐标目标
    (仅包含不能选择单位作目标的技能如透视)
    刀阵, 闪烁
    魔法盾
    战争践踏, 重生
    疾风步, 镜像, 剑刃风暴
    幽灵狼, 透视, 地震

    不是自己的单位, 或者未选中:
    5 = 正常 = 不能使用
    6 = CD中
    7 = 施法中

    自己的单位并且选中
    5 = 不能使用
    6 = 正常
    7 = CD中
    8 = 施法中   


    //
    单位目标
    (包括既可以坐标也可以单位目标的技能如冲击波)
    死亡缠绕
    毒镖
    叉状闪电
    冲击波
    闪电链
   
    不是自己的单位, 或者未选中:
    6 = 正常 = 不能使用
    7 = CD中
    8 = 施法中
   
    自己的单位并且选中
    6 = 不能使用
    7 = 正常
    8 = CD中
    9 = 施法中

    //
    光环
    耐久光环
    总是8

    //
    被动技能和不能使用的技能
    致命一击
    以及剑刃风暴时其他3个技能的状态
    总是1

    //
    箭技能
    似乎连技能object都找不到...

    //
    试验鸟德...
    初级, 开精灵火自动, 3个技能(精灵火, 变乌鸦, 吹风)
    14, 8, 6
    关掉自动精灵火
    13, 8, 6

    不选中状态下每个 -1 ...
    */








jInt jNATIVE GetUnitHash(jInt punit)
{
    return *((int *)punit+3);
    //0x31F 这样的数据,唯一对应该单位
}

int * GetUnitAbilityObj(PVOID pUnit, ULONG abil)
{
   int * result;
   ULONG addr = GameAdd(0x79340);//1.23
   //ECX=单位,参数(技能,0,0,1,1)返回该单位该技能object
   //如果单位没有该技能为0

   __asm
   {
   mov ecx, pUnit
   push 1
   push 1
   push 0
   push 0
   push abil
   moveax, addr
   call    eax
   mov   result, eax
   }
   return result;
}

jInt jNATIVE GetUnitAbilTargHash(int punit, int abil)
{
    if (GetUnitAbilityObj(punit,abil)==0)return 0;

    if(abil==0x416D6F76)//Amov
    {
      return *(GetUnitAbilityObj(punit,abil)+0x33);
    }
    else if(abil==0x41556463)//AUdc
    {
      return *(GetUnitAbilityObj(punit,abil)+0x39);
    }
    return 0;
   //不同技能不同位置,记录技能当前目标,形如 0x31F 这样的数据
   //与单位有唯一对应
}

jInt jNATIVE GetUnitAbilityState(jInt punit, jInt abil)
{
    if (GetUnitAbilityObj(punit,abil)==0)return 0;
    return *(GetUnitAbilityObj(punit,abil)+1);
}

马甲君 发表于 2009-4-26 07:42:12

japi么

那么就支持非民用研究吧

eff 发表于 2009-4-26 09:33:53

去测试一下当自定义技能太多时,一个单位的 obj内存占用是否线性递增?
页: [1]
查看完整版本: 判断技能是否在CD等状态