找回密码
 点一下
查看: 4987|回复: 17

[帖个演示罢]如何利用命令函数来判断目标是否无敌

[复制链接]
发表于 2008-3-3 20:45:43 | 显示全部楼层 |阅读模式
今天在回答hmmm的问题的时候连续说错2次~~暗暗~~

话说攻击命令是无法判断的~~因为还有移动攻击的存在~~不过可以用技能命令来判断~~

这里就用一个死亡之指的技能命令来判断目标单位是否无敌~~


对圣盾、巫毒、回城、无敌技能、触发无敌都有效~~


注意技能命令是否发送成功的判断条件~~必须有足够法力释放技能~~技能目标必须位于施放者的可见区域(不能在迷雾内)~~技能必须没有在cd~~施放者没有在进行其他无法打断的动作~~

InvulnerableCheck.w3x

14 KB, 下载次数: 125

评分

参与人数 1威望 +8 收起 理由
沉默の罪恶 + 8

查看全部评分

发表于 2008-3-3 20:51:50 | 显示全部楼层
赞!这个是比较好也是比较通用的解决方法,不过若是不想另外创建dummy caster去释放FOD的话,也可以直接用代码来解决,道理其实差不多的:
function IsUnitInvulnerable takes unit u returns boolean
    local real hp = GetWidgetLife(u)
    local real r = hp
    if hp<1.0 then
        call SetWidgetLife(u,1.0)
        set r=1.0
    endif
    call UnitDamageTargetBJ(u,u,0.01,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_UNIVERSAL)
    set r=(r-GetWidgetLife(u))*100
    call SetWidgetLife(u,hp)
    return r==0.0
endfunction
回复

使用道具 举报

 楼主| 发表于 2008-3-3 20:55:33 | 显示全部楼层
这道理上可完全不一样了~~

UnitDamageTarget的话是靠判断对象受到的伤害是否为0的~~

而用命令函数返回值的话是直接判断这个命令有没发出~~而不会去实际造成任何伤害~~
回复

使用道具 举报

发表于 2008-3-3 21:03:01 | 显示全部楼层
  太荣幸佬。。。竟然有我的名字
回复

使用道具 举报

发表于 2008-3-3 21:04:28 | 显示全部楼层
  DDWE吗?
回复

使用道具 举报

发表于 2008-3-3 21:07:15 | 显示全部楼层
汗,我说的差不多,是指基本思路都是通过某个操作,只能对无敌单位或者非无敌单位生效,通过返回布尔值的真假来判断是否无敌,和直接返回GetUnitAbilityLevel(u, 'Avul')==0相比,自然亲缘关系是近得多了,从这个大层面来说是不是够得上“差不多”呢?
回复

使用道具 举报

 楼主| 发表于 2008-3-3 21:09:02 | 显示全部楼层
嗯嗯~~确实是ddwe的~~

因为默认we里没有判断发送命令是否成功的GUI~~如果用默认we就必须用jass了的说~~
回复

使用道具 举报

 楼主| 发表于 2008-3-3 21:09:38 | 显示全部楼层
引用第5楼chieffle于2008-03-03 21:07发表的  :
汗,我说的差不多,是指基本思路都是通过某个操作,只能对无敌单位或者非无敌单位生效,通过返回布尔值的真假来判断是否无敌,和直接返回GetUnitAbilityLevel(u, 'Avul')==0相比,自然亲缘关系是近得多了,从这个大层面来说是不是够得上“差不多”呢?

哦哦哦~~
回复

使用道具 举报

发表于 2008-3-4 11:41:01 | 显示全部楼层
JASS里判断命令是否发送成功的命令怎么写的?怎么用的呀?
回复

使用道具 举报

发表于 2008-3-4 12:18:38 | 显示全部楼层
恩,IssueXXXOrder类的函数就是发布命令(有无目标、点目标、单位目标等,就是XXX的内容),这个函数是有返回值的,为布尔类,这个返回值就是指命令发布是否成功的(昨天蕾妮大人解答的,恩)

在这个演示里,把那个IsUnitInvulnerable触发转化成j,用下面的代码覆盖就好了

[codes=jass]function Trig_IsUnitInvulnerable_Func001C takes nothing returns boolean
    if ( not ( IssueTargetOrder(gg_unit_e000_0000, "fingerofdeath", GetTriggerUnit()) == false ) ) then
        return false
    endif
    if ( not ( IsUnitHiddenBJ(GetTriggerUnit()) == false ) ) then
        return false
    endif
    return true
endfunction

function Trig_IsUnitInvulnerable_Actions takes nothing returns nothing
    if ( Trig_IsUnitInvulnerable_Func001C() ) then
        call BJDebugMsg( ( GetUnitName(GetTriggerUnit()) + "是有敌的" ) )
    else
        call BJDebugMsg( ( GetUnitName(GetTriggerUnit()) + "是无敌的" ) )
    endif
    call IssueImmediateOrderBJ( gg_unit_e000_0000, "stop" )
endfunction

//===========================================================================
function InitTrig_IsUnitInvulnerable takes nothing returns nothing
    set gg_trg_IsUnitInvulnerable = CreateTrigger(  )
    call TriggerRegisterPlayerSelectionEventBJ( gg_trg_IsUnitInvulnerable, Player(0), true )
    call TriggerAddAction( gg_trg_IsUnitInvulnerable, function Trig_IsUnitInvulnerable_Actions )
endfunction[/codes]
回复

使用道具 举报

traxex 该用户已被删除
发表于 2008-3-4 12:30:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2008-3-4 12:39:27 | 显示全部楼层
攻击真的不可以~~至少在1.21b不可以~~

不过以前我记得是行的~~唉~~
回复

使用道具 举报

发表于 2008-3-4 14:26:19 | 显示全部楼层
无敌无非就那几个buff吧,判断下就可以了吧。
回复

使用道具 举报

 楼主| 发表于 2008-3-4 14:26:58 | 显示全部楼层
回城可没有buff~~
回复

使用道具 举报

发表于 2008-3-4 14:27:23 | 显示全部楼层
还有无buff的吧………………
回复

使用道具 举报

发表于 2008-3-5 23:50:04 | 显示全部楼层
RENEE,你太夸张了吧,我记得hmmm要的是把没有无敌的用传送过去,哪还会有群体传送的BUFF,直接判断需要的BUFF,简约而不简单,看自己情况,理论太多,
回复

使用道具 举报

发表于 2008-3-6 09:55:19 | 显示全部楼层
啊呀呀,貌似这个演示是为了判断单位是否无敌的的一种普遍性的做法
传送非无敌单位,需要通过一个方法来判断是否无敌的,这个就是派这个用处的

而且,ls的话,我貌似没看懂哦(可能因为头痛脑子烧坏掉了)………………
回复

使用道具 举报

发表于 2008-6-12 15:14:41 | 显示全部楼层
原来我又挖了坟
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-3 12:05 , Processed in 0.362863 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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