|
用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
mov eax, 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);
} |
|