魔兽作图笔记

// 单位事件 函数

// 任意单位** 伤害 **事件

.registerAnyUnitDamagedEvent()

// 任意单位** 死亡 **事件

registerAnyUnitDeathEvent()

// 任意单位** 发动技能效果 **事件

registerAnyUnitEvent(EVENT_PLAYER_UNIT_SPELL_EFFECT)

// 条件 判断:

是否是敌对单位:IsUnitEnemy(xdw, GetOwningPlayer(u)) == true

是否是活着的:GetUnitState(xdw, UNIT_STATE_LIFE) >= 0

是否在单位组中:IsUnitInGroup(xdw, dwz1) == false

单位是否是英雄:IsUnitType(xdw, UNIT_TYPE_HERO) == false

随机实数:GetRandomReal(0, 1)

地面可通行状态为关闭:!IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY)

坐标是否在可用地图区域内:RectContainsCoords(bj_mapInitialPlayableArea, x, y)

/*****************************************************************************/

// 获取单位属性 函数

"力量", GetHeroStr(GetTriggerUnit(), true)

"敏捷", GetHeroAgi(GetTriggerUnit(), false)

"智力", GetHeroInt(GetTriggerUnit(), false)

"英雄等级", GetHeroLevel(GetTriggerUnit())

"当前生命值", GetUnitState(GetTriggerUnit(), UNIT_STATE_LIFE)

"最大生命", GetUnitState(GetTriggerUnit(), UNIT_STATE_MAX_LIFE)

"当前魔法值", GetUnitState(GetTriggerUnit(), UNIT_STATE_MANA)

"最大魔法值", GetUnitState(GetTriggerUnit(), UNIT_STATE_MAX_MANA)

"白字攻击", GetUnitState(GetTriggerUnit(), ConvertUnitState(0x12))

"绿字攻击", GetUnitState(GetTriggerUnit(), ConvertUnitState(0x13))

 "最大攻击力", GetUnitState(GetTriggerUnit(), ConvertUnitState(0x15))

 "攻击距离", GetUnitState(GetTriggerUnit(), ConvertUnitState(0x16))

"攻击间隔", GetUnitState(GetTriggerUnit(),ConvertUnitState(0x25))

"攻击速度", GetUnitState(GetTriggerUnit(), ConvertUnitState(0x51))

"最大护甲", GetUnitState(GetTriggerUnit(), ConvertUnitState(0x20))

/*****************************************************************************/

// 设置单位属性 函数

// 设置单位当前生命值

SetUnitState(GetTriggerUnit(), UNIT_STATE_LIFE, 100)

// 设置单位当前魔法值

SetUnitState(GetTriggerUnit(), UNIT_STATE_MANA, 100)

// 设置单位基础攻击值

SetUnitState(GetTriggerUnit(), ConvertUnitState(0x12), 100)

// 设置单位附加攻击值

SetUnitState(GetTriggerUnit(), ConvertUnitState(0x13), 100)

// 设置单位攻击距离

SetUnitState(GetTriggerUnit(), ConvertUnitState(0x16), 100)

// 设置单位攻击间隔

SetUnitState(GetTriggerUnit(), ConvertUnitState(0x25), 100)

// 设置单位攻击速度

SetUnitState(GetTriggerUnit(), ConvertUnitState(0x51), 100)

// 设置单位护甲

SetUnitState(GetTriggerUnit(), ConvertUnitState(0x20), 100)

// 设置单位最大生命值

SetUnitState(GetTriggerUnit(), UNIT_STATE_MAX_LIFE, 100)

// 设置单位最大魔法值

SetUnitState(GetTriggerUnit(), UNIT_STATE_MAX_MANA, 100)

// 设置单位状态攻击1武器类型

SetUnitState(GetTriggerUnit(), ConvertUnitState(0x58), 0)

// 设置单位攻击类型

SetUnitState(GetTriggerUnit(), ConvertUnitState(0x23), 0)

// 设置单位护甲类型

SetUnitState(GetTriggerUnit(), ConvertUnitState(0x50), 0)

/*****************************************************************************/

// 获取单位 函数

       	 删除单位:RemoveUnit()

"伤害来源", GetEventDamageSource()

        "触发单位", GetTriggerUnit()

        "凶手单位", GetKillingUnitBJ()

        "死亡单位", GetDyingUnit()

        "选取单位", GetEnumUnit()

        "匹配单位", GetFilterUnit()

        "攻击单位", GetAttacker()

        "被攻击单位", GetAttackedUnitBJ())

        "施法单位", GetSpellAbilityUnit())

        "技能释放目标", GetSpellTargetUnit())

        "购买者", 

        "贩卖者", GetSellingUnit())

        "被贩卖的单位", GetSoldUnit())

        "操作物品的单位", GetManipulatingUnit())

        "进入单位", GetEnteringUnit())

        "离开单位", GetLeavingUnit())

        "单位组第一个单位", FirstOfGroup(udg_dwz))

        "单位组随机单位", GroupPickRandomUnit(udg_dwz))

        "命令发布目标", GetOrderTargetUnit())

        "发布命令的单位", GetOrderedUnit())

        "召唤单位", GetSummonedUnit())

        "召唤者", GetSummoningUnit())

        "被装载的单位", GetLoadedUnitBJ())

        "升级的英雄", GetLevelingUnit())

        "被改变所有者的单位", GetChangingUnit())

        "学习技能的英雄", GetLearningUnit())

        "被取消的建筑", GetCancelledStructure())

        "正在建造的单位", GetConstructingStructure())

        "完成的建造", GetConstructedStructure())

/************************************************************************/

// 坐标获取 函数

"鼠标在游戏内的x坐标", DzGetMouseTerrainX()

 "鼠标在游戏内的y坐标", DzGetMouseTerrainY()

 "鼠标在游戏内的z坐标", DzGetMouseTerrainZ()

 "技能释放点x坐标", GetSpellTargetX()

 "技能释放点y坐标", GetSpellTargetY()

 "单位的x坐标", GetUnitX(GetTriggerUnit())

 "单位的y坐标", GetUnitY(GetTriggerUnit())

 "命令发布点x坐标", GetOrderPointX()

 "命令发布点y坐标", GetOrderPointY()

 "当前镜头目标x坐标", GetCameraTargetPositionX()

 "当前镜头目标y坐标", GetCameraTargetPositionY()

 "当前镜头目标z坐标", GetCameraTargetPositionZ()

 "矩形的中心x坐标", GetRectCenterX(GetPlayableMapRect())

 "矩形的中心y坐标", GetRectCenterY(GetPlayableMapRect())

 "矩形的左下x坐标", GetRectMinX(GetPlayableMapRect())

 "矩形的左下y坐标", GetRectMinY(GetPlayableMapRect())

 "矩形的右上角x坐标", GetRectMaxX(GetPlayableMapRect())

 "矩形的右上角y坐标", GetRectMaxY(GetPlayableMapRect())

/************************************************************************/

// 单位属性 设置 函数

单位动画:SetUnitAnimation(GetTrainedUnit(), "attack")

单位无敌:SetUnitInvulnerable(GetTriggerUnit(), true)

碰撞开关:关 SetUnitPathing(GetTriggerUnit(), false)

碰撞开关:开 SetUnitPathing(GetTriggerUnit(), true)

设置单位可以飞行,添加风暴之鸦:UnitAddAbility(u,FourCC('Amrf'))

设置单位可以飞行,删除风暴之鸦:UnitRemoveAbility(u,FourCC('Amrf'))

添加蝗虫: UnitAddAbility(mj,FourCC('Aloc'))

单位设置移动类型: EXSetUnitMoveType(u, 0x00)

暂停单位:PauseUnit(GetTriggerUnit(), true)

恢复单位:PauseUnit(GetTriggerUnit(), false)

眩晕单位:EXPauseUnit(u1, true)

单位添加技能:UnitAddAbility(GetTriggerUnit(), 'Arav')

单位删除技能:UnitRemoveAbility(GetTriggerUnit(), 'Arav')

设置飞行高度:SetUnitFlyHeight(callunit, 240.00, 0.00)

设置单位为飞行类型:EXSetUnitMoveType(u, 0x04)

// 提升等级为2级

IncUnitAbilityLevel( FourCC('Arll'))

DecUnitAbilityLevel(u,FourCC('Arll') )

给玩家 创建单位: CreateUnit(GetOwningPlayer(u), 单位类型id, x, y, GetUnitFacing(u))

设置角度: SetUnitFacing( GetTriggerUnit(), jd )

获取单位面向角度: GetUnitFacing(u)

获取单位类型: GetUnitTypeId(u)

替换单位模型: DzSetUnitModel(u, “模型路径”)

设置单位模型大小: SetUnitScale(u, 1, 1, 1)

设置单位 水元素生命周期: UnitApplyTimedLife(u, FourCC('BHwe'), 5)

// 特效函数:

删除特效:DestroyEffect();

创建特效坐标:AddSpecialEffect("特效路径", x, y)

创建特效单位:AddSpecialEffectTarget("路径", u, "overhead")

特效高度: EXSetEffectZ(tx, 0)

特效大小: EXSetEffectSize(txt, 1)

特效动画速度: EXSetEffectSpeed(tx, 1)

EXEffectMatScale( eff, 1, 1, 1 )

/*****************************************************************************/

// 伤害类型 函数

****** 平A *****

// 正常攻击 -- 攻击伤害--英雄攻击,普通伤害类型

UnitDamageTarget(GetTriggerUnit(), GetTriggerUnit(), 500, true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)

// 正常攻击 -- 攻击伤害--魔法攻击,普通伤害类型

UnitDamageTarget(GetTriggerUnit(), GetTriggerUnit(), 500, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)

****** 技能 *****

// 物理技能伤害 	-- 魔法攻击--力量伤害类型

 UnitDamageTarget(GetTriggerUnit(), GetTriggerUnit(), 500, false, false, ATTACK_TYPE_MAGICE, DAMAGE_TYPE_FORCE, WEAPON_TYPE_WHOKNOWS)

// 魔法技能伤害	 -- 魔法攻击--魔法伤害类型

 UnitDamageTarget(GetTriggerUnit(), GetTriggerUnit(), 500, false, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, WEAPON_TYPE_WHOKNOWS)

/*****************************************************************************/

// 判断 ** 伤害类型: 【平A类型:英雄,魔法】; 【技能类型:力量,法术】;

// 判断是否是攻击伤害

EXGetEventDamageData(2) == 1

// 判断是否是--英雄--攻击伤害

ConvertAttackType(EXGetEventDamageData(6)) == ATTACK_TYPE_HERO

// 判断是否是--魔法--攻击伤害

ConvertAttackType(EXGetEventDamageData(6)) == ATTACK_TYPE_MAGIC

// 判断是否是--力量--伤害伤害

ConvertAttackType(EXGetEventDamageData(4)) == DAMAGE_TYPE_FORCE

// 判断是否是--法术--伤害类型

ConvertAttackType(EXGetEventDamageData(4)) == ATTACK_TYPE_NORMAL

/*****************************************************************************/

// 魔兽护甲计算公式:

// 单位所受伤害 护甲免伤过后的 数值

let sh: number = GetEventDamage();

// 设置伤害值0.0

EXSetEventDamage(0);

// 获取触发单位 护甲

let hj: number = GetUnitState(GetTriggerUnit(), ConvertUnitState(0x20));

// 计算 魔兽护甲减伤 因子 (护甲 hj != 0)

正护甲: let yinzi: number = (0.06 * hj) / (0.06 * hj + 1);

负护甲: let yinzi: number = 2 - (1- 0.06)* hj;

// 得到没有护甲减伤的 数值

let ys: number = sh / (1 - yinzi);

// LOL护甲计算公式:

护甲穿透(减少)百分比计算:

护甲实际值=护甲值-(护甲值*护甲穿透(减少)百分比);

护甲穿透(减少)计算:

护甲实际值=护甲值-护甲穿透(减少)值。

计算lol护甲值:当护甲大于等于零时:

实际对你造成的物理伤害=100/(100+护甲值);

实际生命值=最大生命值*(100+护甲值)/100;

(生命数值 + 护甲 = 实际生命值)

计算lol护甲值:当护甲少于零时:

实际对你造成的物理伤害=1-护甲值/100;

实际生命值=最大生命值*100/(100-护甲值)。

/*****************************************************************************/

// 魔兽技能公式:

57.2958 = 180 / 3.14159;

0.01745 = 3.14159 / 180;

// 坐标到坐标的距离 x1是目标单位,x是施法单位

SquareRoot(Pow((x1-x), 2.00) + Pow((y1-y), 2.00))

// 冲锋 坐标到坐标的角度,x1,y1代表技能施法坐标,x2,y2代表技能目标坐标

let jd: number = 57.29582 * Atan2(y1 - y2, x1 - x2)

// 移动距离 (触发单位的x,y加上cosx,siny,就是冲锋移动的距离)

let cosx: number = 40 * Cos(jd * 0.01745);

let siny: number = 40 * Sin(jd * 0.01745);

// 移动单位,设置坐标

SetUnitPosition(u, x, y);

Ps: 要暂停单位,关闭单位的碰撞

/*********************************************************************/

// 跳跃 跳跃的距离 x1是目标单位,x2是施法单位

let distance: number = SquareRoot(Pow((x1 - x2), 2.00) + Pow((y1 - y2), 2.00))

// 弧度 (抛物线太垂直了,不好看,所以要给它弧度)

let radian: number = distance / 3.5;

// 已完成距离 (这里x,y放在计时器里面,加了cosx,siny,所以距离越来越短)

let distance1: number = SquareRoot(Pow((x - x2), 2.00) + Pow((y - y2), 2.00))

// sin函数

let height: number = Sin(((distance1 / distance) * 180) * 0.01745)* radian

// 移动单位,设置高度

SetUnitFlyHeight(u, height, 0)

Ps: 要暂停单位,关闭单位的碰撞

// 自适应高度:

开始高度: let startheight: number = GetUnitFlyHeight(u);

适应的高度: (开始高度 + 50) + (当前的距离 / 原本的距离) * (开始高度 - 当前的高度)

let selfheight: number = (startheight + 50) + (distance1 / distance) * (startheight - GetUnitFlyHeight(u))

// 单位,设置自适应高度:跳跃的高度 + 适应高度

SetUnitFlyHeight(u, height + selfheight, 0)

// 环绕 公式:

//循环创建马甲,以触发单位为圆心,75弧度差距)

for (let i = 0; i <= 5; i++) {

// 计算马甲的x,y坐标  创建6个马甲

let aroundx: number = GetUnitX(u) + 300 * Cos(60 * 0.01745 * i);

let aroundy: number = GetUnitY(u) + 300 * Sin(60 * 0.01745 * i);

// 单位数组 记录马甲

let mjarray[i] = CreateUnit(GetOwningPlayer(around.u), FourCC("马甲id"), aroundx, aroundy, 0);

};

// 计时器 循环移动马甲坐标:(0.03的计时器循环这个for循环)

for (let d = 0; d <= 5; d++) {

// 获取数组马甲的坐标

let mjX = GetUnitX(mjarray[i] );

let mjY = GetUnitY(mjarray[i] );

// 计算数组马甲 到 施法单位u的角度

let jd = 57.2958 * Atan2(mjY - GetUnitY(u), mjX - GetUnitX(u));

// 这里的(jd+12),这个12需要根据实际调节

let x = GetUnitX(around.u) + 300 * Cos((jd+12) * 0.01745);

let y = GetUnitY(around.u) + 300 * Sin((jd+12) * 0.01745);

SetUnitPosition(mj, x, y);

};

/*****************************************************************************/

// 单位组函数

// 选取单位组所有单位做动作 ** 少用这个函数,自己循环单位组

ForGroupBJ(udg_dwz, function Trig____________________004Func002A)

// 为单位组添加单位

GroupAddUnit(udg_dwz, GetTriggerUnit())

// 为单位组移除单位

GroupRemoveUnit(udg_dwz, GetTriggerUnit())

// 清空单位组

GroupClear(udg_dwz)

// 删除单位组

DestroyGroup(udg_dwz)

// 单位是否在单位组中

IsUnitInGroup(xdw, dwz1)

// 范围的 选取单位添加到单位组

GroupEnumUnitsInRange(dwz, x, y, range, null)

// 提高镜头属性

SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, GetCameraField(CAMERA_FIELD_TARGET_DISTANCE) + 1500.00, 0)

/*****************************************************************************/

// ts **** for循环迭代

// 迭代数组,删除 特效 tx是个数组变量

// K: 当前值

// V:数组的索引

// tx: Array

tx.forEach((k, v, tx) => {

	DestroyEffect(tx[v])

});

//************************************************************************//

// 对象 创建 键值 键不能数值

let tab:{} = {a:"一", b:"二", c:"三",};

console.log(tab);

console.log(typeof(tab));

console.log(tab.a);

tab.a = null;

console.log(tab.a);

//************************************************************************//

// 中心计时器 构思

1:创建父级函数

创建一个0.01的循环计时器

记录计时器循环的值

2:父级 循环的动作函数,

判断条件,符合条件

判断 秒

调用触发(记录的名字)

3:子级 传参的函数

需要计时器时,传参(多少秒,是否循环,回调的动作“名字”)

用一个表 记录{秒,循环,名字}

4: 动作暂停函数

清空表的 {秒,循环,名字}

命令ID:

无目标:

打开人族建造菜单: humanbuild

大厅 -- 战斗号召: townbellon

大厅 -- 返回工作: townbelloff

人族农民 -- 激活修理:

人族农民 -- 关闭修理:

人族农民 -- 激活防御

人族农民 -- 激活治疗-医疗:

人族农民 -- 心灵之火

人族农民 -- 减速

魔法盗取

魔法防御

天神下凡

神圣护甲

建造菜单

水元素

火凤凰

雷霆一击

复活

兽族:

建造菜单

单位目标:

修理: repair

心灵之火: innerfire

驱散: dispel

治疗: heal

减速: slow