找回密码
 立即注册
查看: 4565|回复: 37

余波中的JASS研究

[复制链接]
发表于 2014-7-29 20:01:30 | 显示全部楼层 |阅读模式
专开一帖收录我在修改余波过程中研究过的JASS,除了方便整理之外也希望能对以后想做余波改图的人有所帮助
 楼主| 发表于 2014-7-29 20:03:22 | 显示全部楼层

Ability Engine - Weapons

function WeaponSounds takes nothing returns nothing
    设置局部单位变量u=触发单位
    设置局部玩家变量p=u的所有者
    设置局部整数变量i=施放技能
    设置局部整数变量id= 玩家引索p
    设置局部整数变量current=udg_Second
    设置局部布尔变量firing = false
    如果i是A00S则//伯奈利
        如果current减udg_BenelliLimit不等于0 then
            设置变量bj_meleeNearestMineDist = u的X轴坐标
            设置变量bj_lastTransmissionDuration = u的Y轴坐标
            设置udg_soundpath = "war3mapImported\\m3-4.wav"
            运行函数("PlaySoundPath3D")
        否则
            设置udg_BenelliLimit = current
    否则如果i=='A00T则//勃朗宁
        如果current减udg_BrowningLimit不等于0则
            设置bj_meleeNearestMineDist =u的X轴坐标
            设置bj_lastTransmissionDuration =u的Y轴坐标
            设置udg_soundpath = "war3mapImported\\xm1014-3.wav"
            运行函数("PlaySoundPath3D")
        否则
            设置udg_BrowningLimit = current
    否则如果i等于'M1911 柯尔特式自动手枪' 则//柯尔特
        如果udg_Pistol[id]>0则
            设置firing = true
            设置udg_Pistol[id] = udg_Pistol[id] - 1
            如果current减udg_ColtLimit不等于0则
                设置bj_meleeNearestMineDist =u的X轴坐标
                设置bj_lastTransmissionDuration =u的Y轴坐标
                设置udg_soundpath = "war3mapImported\\usp_unsil-2.wav"
                运行函数("PlaySoundPath3D")
            否则
                设置udg_ColtLimit = current
        如果firing等于true则
            等待1.5秒
        如果udg_Pistol[id]小于等于0而且u的'M1911 柯尔特式自动手枪'等级大于0则
            删除u的'M1911 柯尔特式自动手枪'
            设置bj_meleeNearestMineDist =u的X轴坐标
            设置bj_lastTransmissionDuration =u的Y轴坐标
            设置udg_soundpath = "war3mapImported\\usp_clipout.wav"
            运行函数"PlaySoundPath3D"
            等待4秒
            如果udg_Magazines[id]大于1或者(udg_Magazines[id]大于0而且udg_Reloading[id]不等于2而且udg_Reloading[id]不等于1) 则
                设置udg_PistolReload[id] = true
                设置udg_Magazines[id]=udg_Magazines[id]-1
                设置玩家属性(p,玩家木材资源属性,udg_Magazines[id] )
                增加移动速度(udg_Hero[id],1.4)
                设置current = udg_Second
                如果current减udg_ClipInLimit不等于0则
                    设置bj_meleeNearestMineDist 等于 u的X轴坐标
                    设置bj_lastTransmissionDuration 等于 u的Y轴坐标
                    设置udg_soundpath = "war3mapImported\\usp_clipin.wav"
                    运行函数"PlaySoundPath3D"
                否则
                    设置udg_ClipInLimit=current
                等待1.
                设置udg_Pistol[id] = 8
                给u添加技能‘M1911 柯尔特式自动手枪’
                如果udg_Experience[id]>65000则
                    提升u的'M1911 柯尔特式自动手枪'技能等级//柯尔特
                设置udg_PistolReload[id] = false
    否则如果i等于'沙漠之鹰'则//沙漠之鹰
        如果udg_Pistol[id]大于0则
            设置firing = true
            设置udg_Pistol[id] = udg_Pistol[id] - 1
            如果current减udg_DEagleLimit不等于0则
                设置bj_meleeNearestMineDist =u的X轴坐标
                设置bj_lastTransmissionDuration =u的Y轴坐标
                设置udg_soundpath = "war3mapImported\\deagle.wav"
                运行函数"PlaySoundPath3D"
            否则
                设置udg_DEagleLimit = current
        如果firing等于true则
            等待1.5
        如果udg_Pistol[id]小于等于0而且u的'沙漠之鹰'的技能等级大于0则
            删除u的‘沙漠之鹰’
            设置bj_meleeNearestMineDist 等于u的X轴坐标
            设置bj_lastTransmissionDuration 等于 u的Y轴坐标
            设置udg_soundpath = "war3mapImported\\usp_clipout.wav"
            运行函数"PlaySoundPath3D"
            等待4.
            如果udg_Magazines[id]大于1或者(udg_Magazines[id]大于0而且udg_Reloading[id]不等于2而且udg_Reloading[id]不等于1)则
                设置udg_PistolReload[id] = true
                设置udg_Magazines[id]=udg_Magazines[id]-1
                设置玩家属性( p,玩家木材资源属性,udg_Magazines[id] )
                增加udg_Hero[id]的移动速度1.4
                设置current 等于 udg_Second
                如果current-udg_ClipInLimit不等于0则
                    设置bj_meleeNearestMineDist =u的X轴坐标
                    设置bj_lastTransmissionDuration =u的Y轴坐标
                    设置udg_soundpath = "war3mapImported\\usp_clipin.wav"
                    运行函数"PlaySoundPath3D"
                否则
                    设置udg_ClipInLimit=current
                等待1.
                设置udg_Pistol[id] = 8
                给u添加技能‘沙漠之鹰’
                如果udg_Experience[id]大于65000则
                    提升u的‘沙漠之鹰’技能等级//沙漠之鹰
                设置udg_PistolReload[id] = false
    设置u = 没有
endfunction
//==========================================================================
function InitTrig_Weapons takes nothing returns nothing
    设置gg_trg_Weapons =新建触发器
    触发器注册玩家单位事件(gg_trg_Weapons,玩家9, 玩家单位释放技能生效, null)
    触发器注册玩家单位事件(gg_trg_Weapons,玩家11, 玩家单位释放技能生效, null)
    触发器添加动作(gg_trg_Weapons,function WeaponSounds)
endfunction

没啥实际意义,纯粹的研究而已,这段应该是触发转的,看看能不能还原出最一开始的触发
回复

使用道具 举报

 楼主| 发表于 2014-7-29 20:46:21 | 显示全部楼层

Unknown Entities - AI Neutral Victim

传说中余波的怪物AI触发

function AIPink(粉红AI?) takes nothing returns nothing
    设置局部单位组变量g = 新建单位组
    设置局部单位组变量g2
    设置局部单位变量u
    设置局部实数变量x
    设置局部实数变量y
    设置整数变量i=1
    运行函数GroupEnumUnitsOfPlayer(枚举玩家单位组单位)(g,Player(13),null)(这个函数应该是设置g为玩家13的所有单位)
    如果GetWidgetLife(udg_AITarget)<0.405 则
        设置g2 = 新建单位组
        循环
            当 i>udg_Players 时退出循环
            如果udg_Hero[udg_Sorted]对于玩家13为可见 则
                为g2添加单位udg_Hero[udg_Sorted]
           设置i=i+1
        设置u = g2中的随机单位
        如果u =没有单位 则
            设置u = udg_Hero[udg_Sorted[随机整数1~udg_Players]]
            如果u=udg_Marksman 并且 udg_Marksman 的 减震消声器 技能等级 不等于 0 并且 udg_Players>1 则
                设置u = udg_Hero[udg_Sorted[随机整数1~udg_Players]]
(狙击的减震消声器是个坑队友的技能← ←当怪物的目标为狙击手而狙击手又有消声器技能的时候怪物会重新选择目标,当然还是有几率再次选中狙击手,但是选中其他玩家的几率更大哦
但是单通的时候这个技能就不管用了)
        如果GetWidgetLife(u)<=0.405则
            设置x = 随机实数-7000.0~11000.0
            设置y = 随机实数-4000.0~14000.0)
        否则
            设置x = u的X轴坐标
            设置y = u的Y轴坐标
        删除单位组g2
        设置g2 = 空单位组
    循环
        设置u = 单位组g中的第一个单位
        当 u==没有单位 时退出循环
        如果GetWidgetLife(udg_AITarget)>0.405 则
            设置x = udg_AITarget的X轴坐标+随机实数-500.0~500.0
            设置y = udg_AITarget的Y轴坐标+随机实数-500.0~500.0
        对 u 发布点目标命令attack 到坐标(x,y)
        将 u 从单位组 g 中移除
    删除单位组g
    设置g = 空单位组
    如果 随机整数0~12 ==1 而且 udg_CurrentWave(现在的波数)>2 then
        运行StartSound(udg_Ambience[5]) //雨天环境
    否则如果 随机整数1~75 ==1 则
        运行StartSound(udg_Ambience[随机整数1~8])
    否则如果 随机整数0~5 ==1 then
        对udg_EvilSheep 发布点目标命令 move到坐标(x,y)

//===========================================================================
function InitTrig_AI_Neutral_Victim takes nothing returns nothing
    设置gg_trg_AI_Neutral_Victim = 新建触发器
    为gg_trg_AI_Neutral_Victim添加动作 函数AIPink
endfunction(这段是是个触发就自带的)


[ 本帖最后由 大谎言家 于 2014-7-29 20:51 编辑 ]
回复

使用道具 举报

发表于 2014-7-29 20:57:58 | 显示全部楼层
EvilSheep好像是没有中立(游荡者)技能吧?不记得有没有了
回复

使用道具 举报

 楼主| 发表于 2014-7-29 21:43:34 | 显示全部楼层
function TheCloud(云) takes nothing returns nothing
    设置局部单位变量u
    设置局部整数变量i = 1
    设置局部整数变量i2 = 随机整数2~12
    设置局部整数变量i3 = udg_Sorted[随机整数1~udg_Players]
    设置局部实数变量x1 = udg_Hero[i3]的X轴坐标
    设置局部实数变量y1 = udg_Hero[i3]的Y轴坐标
    设置局部点变量l2 = SelectPoint2(x1,y1,1200,2500)
    设置局部实数变量x2 = l2的X轴坐标
    设置局部实数变量y2 = l2的Y轴坐标
    设置udg_TheCloud = true
    如果 udg_SectorClear 或者 udg_CurrentWave==5(现在第五波) then
        删除点l2
        设置l2=没有点
    设置u = 创建一个 云 给 玩家14 在 (x2,y2)面向0.0方向
    运行SuspendHeroXP(u,true)
    如果udg_Mode==2 then(新兵营吧)
        显示信息在屏幕的10.0处: "|cfff3ad00格瑞姆斯少校|r : 我们发现一个未知现象出现在 ( " + 转换(转换(x2)为整数)为字符串 + ", " + 转换(转换(y2)为整数)为字符串 + " )." )
    删除点l2
    设置l2 = 空
    循环
        当 i>i2 时退出循环
        如果 GetWidgetLife(u)>0.405 则
            对所有玩家发送小地图信号到坐标(u的X轴坐标,u的Y轴坐标)持续2.5秒,信号颜色(125,100,200)信号类型 普通
            播放音效gg_snd_HeartBeat
            等待8.
        否则
            当 1==1时退出
        设置i=i+1

    如果GetWidgetLife(u)>0.405 then
        杀死单位u

    如果u不等于 没有单位 则
        设置u = 没有单位

    设置udg_TheCloud = false

function AIGray takes nothing returns nothing
    设置局部单位组变量g = 新建单位组
    设置局部单位组变量g2 = 新建单位组
    设置局部单位变量u
    设置局部实数变量x
    设置局部实数变量y
    设置整数变量i=1
    运行函数GroupEnumUnitsOfPlayer(枚举玩家单位组单位)(g,Player(14),null)
    循环
        当 i>udg_Players 时退出循环
        如果udg_Hero[udg_Sorted]对于玩家14为可见 则
            为g2添加单位udg_Hero[udg_Sorted]
        设置i=i+1
    设置u = g2中的随机单位
    如果u =没有单位 则
            设置u = udg_Hero[udg_Sorted[随机整数1~udg_Players]]
            如果u=udg_Marksman 并且 udg_Marksman 的 减震消声器 技能等级 不等于 0 并且 udg_Players>1 则
                设置u = udg_Hero[udg_Sorted[随机整数1~udg_Players]]
    如果GetWidgetLife(u)<=0.405则
            设置x = 随机实数-7000.0~11000.0
            设置y = 随机实数-4000.0~14000.0)
        否则
            设置x = u的X轴坐标
            设置y = u的Y轴坐标
        删除单位组g2
        设置g2 = 空单位组
    循环
        设置u = 单位组g中的第一个单位
        当 u==没有单位 时退出循环
        如果GetWidgetLife(udg_AITarget)>0.405 则
            设置x = udg_AITarget的X轴坐标+随机实数-500.0~500.0
            设置y = udg_AITarget的Y轴坐标+随机实数-500.0~500.0
        对 u 发布点目标命令attack 到坐标(x,y)
        将 u 从单位组 g 中移除
     删除单位组g
    设置g = 空单位组
    设置i = 1
    循环
        当i>udg_InitialPlayers 时退出循环
        运行RankSet(udg_Sorted)
        设置i=i+1
    如果随机整数1~65 ==1 则
        播放音效udg_ZombieAmbience[随机整数1~6]
    否则如果 随机整数1~udg_CloudFactor ==1 而且 udg_TheCloud==false 而且 ((udg_CurrentWave>2 而且 udg_SquadXP>5000) 或者 udg_Mode==3) 则
        运行函数"TheCloud"
    否则如果 随机整数1~200 ==1 而且 udg_Intermission==false 而且 udg_SectorClear==false 则
        运行函数"SatelliteCamera"
endfunction

//===========================================================================
function InitTrig_AI_Neutral_Extra takes nothing returns nothing
    设置gg_trg_AI_Neutral_Extra = 新建触发器
    call TriggerAddAction(gg_trg_AI_Neutral_Extra,function AIGray)
endfunction
回复

使用道具 举报

 楼主| 发表于 2014-7-29 21:47:19 | 显示全部楼层
话说我居然没找到这两个AI动作是在什么地方运行的……略神奇,Wave波数的触发里头也没有提到过这俩触发,本身又不带事件,到底是哪里有的运行?

————————————————————————

新发现,AITarget在Wave数字的触发里头设置了,不过依然不像是跟玩家挂钩,比如车队的时候AITarget是卡车,三角的时候是三角头

[ 本帖最后由 大谎言家 于 2014-7-30 19:48 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2014-7-29 21:54:42 | 显示全部楼层
找到了一处,Operation Silent Hill里的
call TriggerRegisterTimerEvent(gg_trg_AI_Neutral_Victim,6.1,true)
    call TriggerRegisterTimerEvent(gg_trg_AI_Neutral_Extra,6.2,true)

不过这个时间事件不是触发里有的几个时间事件里头的任何一个,这个6.1和6.2也许是每隔这么多秒运行一次的意思?

[ 本帖最后由 大谎言家 于 2014-7-29 21:56 编辑 ]
回复

使用道具 举报

发表于 2014-7-30 02:40:45 | 显示全部楼层
我只想知道R2L什么样,R2H这种东西能实现么,不能理解H的数据类型和内存结构
回复

使用道具 举报

 楼主| 发表于 2014-7-30 13:26:05 | 显示全部楼层
肾好,余波播放声音的这个函数被我找到了

function PlaySoundPath3D takes nothing returns nothing
    local sound s = CreateSound( udg_soundpath, false, true, false, 10, 10, "DefaultEAXON" )
    call SetSoundDuration(s,565)
    call SetSoundChannel(s,0)
    call SetSoundVolume(s,udg_Sound3DVolume)
    call SetSoundPitch(s,1.0)
    call SetSoundDistances(s,600.0,10000.0)
    call SetSoundDistanceCutoff(s,3000.0)
    call SetSoundConeAngles(s, 0.0, 0.0, 127 )
    call SetSoundConeOrientation(s, 0.0, 0.0, 0.0 )
    call SetSoundPosition(s, bj_meleeNearestMineDist, bj_lastTransmissionDuration, 0)
    call StartSound(s)
    call TriggerSleepAction(12.)
    call KillSoundWhenDone(s)
    set s = null
endfunction
回复

使用道具 举报

 楼主| 发表于 2014-8-4 16:12:59 | 显示全部楼层
运行PlaySoundPath3D之前的动作:

    set bj_meleeNearestMineDist = x
    set bj_lastTransmissionDuration = y
    set udg_soundpath = "Abilities\\Spells\\NightElf\\Immolation\\ImmolationDecay1.wav"
    call ExecuteFunc("PlaySoundPath3D")

差不多也就是设置点,然后设置音效路径,最后运行这个函数

另外x,y也是两个局部变量


local real x = GetLocationX(udg_LZPoint)

local real y = GetLocationY(udg_LZPoint)

注意设置局部变量要放在触发动作的最顶端

也就是说先弄个触发器弄出
PSP3D这个函数,然后在其他触发里用上面的这些代码就OK

涉及变量:soundpath(字符串)Sound3DVolume(整数,初始127)

[ 本帖最后由 大谎言家 于 2014-8-4 16:30 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|夜天使联盟论坛

GMT+8, 2026-10-5 17:01 , Processed in 0.018987 second(s), 18 queries .

Powered by Discuz! X5.0

© 2005-2025  技术支持 by 夜天使联盟.

快速回复 返回顶部 返回列表