找回密码
 点一下
查看: 2798|回复: 18

几率 暴击系统..(极品脑残)

  [复制链接]
发表于 2008-8-2 17:24:20 | 显示全部楼层 |阅读模式
[jass]//===============暴击系统==========================
//参数:1.单位2.几率3.暴击伤害4.动画损伤时间5.是否远程(如果是近战,第4项可以随意填写)5.技能名字
function D_big2_A takes nothing returns nothing
local timer TM = GetExpiredTimer()
local trigger TG2 = I2TG(GetStoredInteger(udg_cache,I2S(H2I(TM )),"TG2"))
call FlushStoredMission(udg_cache,I2S(H2I(TM )))
call FlushStoredMission(udg_cache,I2S(H2I(TG2)))
call DestroyTrigger(TG2)
call DestroyTimer( TM )
set TG2 =null
set TM =null
endfunction

function big3_A takes nothing returns nothing
local trigger TG3 =     GetTriggeringTrigger()
local trigger TG2 = I2TG(GetStoredInteger(udg_cache,I2S(H2I(TG3)),"TG2"))
local timer TM= I2TM(GetStoredInteger(udg_cache,I2S(H2I(TG3)),"Timer"))
local unit U = I2U(GetStoredInteger(udg_cache,I2S(H2I(TG3)),"U"))
local unit TU = GetTriggerUnit()
local real D =GetStoredReal(udg_cache,I2S(H2I(TG3)),"D")
local real I =GetStoredReal(udg_cache,I2S(H2I(TG3)),"I")
call FlushStoredMission(udg_cache,I2S(H2I(TG3)))
call FlushStoredMission(udg_cache,I2S(H2I(TG2)))
call FlushStoredMission(udg_cache,I2S(H2I(TM)))
call DestroyTimer(TM)
call DestroyTrigger( TG3 )
call DestroyTrigger(TG2)
if (GetEventDamageSource() == U and GetRandomInt(1, 100)<=I)then
call UnitDamageTarget(U,TU,D,true,false,ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
endif
set TG3 = null
set TG2 = null
set TM = null
set TU =null
set U =null
endfunction

function big2_A takes nothing returns nothing
local trigger TG2 = GetTriggeringTrigger()
local trigger TG3 = I2TG(GetStoredInteger(udg_cache,I2S(H2I(TG2)),"TG3"))
local timer TM =  I2TM(GetStoredInteger(udg_cache,I2S(H2I(TG2)),"Timer"))
call FlushStoredMission(udg_cache,I2S(H2I(TG3)))
call FlushStoredMission(udg_cache,I2S(H2I(TG2)))
call FlushStoredMission(udg_cache,I2S(H2I(TM)))
call DestroyTimer(TM)
call DestroyTrigger(TG2)
call DestroyTrigger( TG3 )
set TG3 = null
set TG2 = null
set TM = null
endfunction

function big_A takes nothing returns nothing
local timer TM = CreateTimer()
local unit U =  GetTriggerUnit()
local trigger TG =     GetTriggeringTrigger()
local trigger TG2 =     CreateTrigger()
local trigger TG3 =     CreateTrigger()
local integer I = GetStoredInteger(udg_cache,I2S(H2I(TG)),"I")
local real D = GetStoredReal(udg_cache,I2S(H2I(TG)),"D")
local real T = GetStoredReal(udg_cache,I2S(H2I(TG)),"T")
local boolean TL = GetStoredBoolean(udg_cache,I2S(H2I(TG)),"TL")
call StoreInteger(udg_cache,I2S(H2I(TG3)),"U",H2I(U))
call StoreReal(udg_cache,I2S(H2I(TG3)),"D",D)
call StoreReal(udg_cache,I2S(H2I(TG3)),"I",I)
call StoreInteger(udg_cache,I2S(H2I(TG2)),"Timer",H2I(TM))
call StoreInteger(udg_cache,I2S(H2I(TG3)),"Timer",H2I(TM))
call StoreInteger(udg_cache,I2S(H2I(TM)),"TG2",H2I(TG2))
call StoreInteger(udg_cache,I2S(H2I(TG2)),"TG3",H2I(TG3))
call StoreInteger(udg_cache,I2S(H2I(TG3)),"TG2",H2I(TG2))
call TriggerRegisterUnitEvent( TG2, U, EVENT_UNIT_ISSUED_TARGET_ORDER )//发布指定目标命令
call TriggerRegisterUnitEvent( TG2, U, EVENT_UNIT_ISSUED_POINT_ORDER )//发布指定点命令
call TriggerRegisterUnitEvent( TG2, U, EVENT_UNIT_ISSUED_ORDER )//发布无目标命令
call TriggerAddAction( TG2, function big2_A )
call TriggerRegisterUnitEvent( TG3, GetEventTargetUnit() , EVENT_UNIT_DAMAGED ) //指定单位接受伤害
call TriggerAddAction( TG3,function big3_A )
if (TL==true)then
call TimerStart(TM,T,false,function D_big2_A)
else
call FlushStoredMission(udg_cache,I2S(H2I(TM)))
call DestroyTimer(TM)
endif
set TM =null
set U =null
set TG= null  
set TG2 =null
set TG3 =null  
endfunction

function Big_Dam takes unit U,integer I,real D,real T,boolean TL,string S returns nothing
local trigger TG = CreateTrigger()
call StoreInteger(udg_cache,S,I2S(H2I(U)),H2I(TG))
call StoreBoolean(udg_cache,I2S(H2I(TG)),"TL",TL)
call StoreInteger(udg_cache,I2S(H2I(TG)),"I",I)
call StoreReal(udg_cache,I2S(H2I(TG)),"D",D)
call StoreReal(udg_cache,I2S(H2I(TG)),"T",T)
call TriggerRegisterUnitEvent( TG, U, EVENT_UNIT_TARGET_IN_RANGE )//指定单位获得攻击目标
call TriggerAddAction( TG, function big_A )
endfunction


//========================删除暴击=====================
//参数:1.单位2.技能名字
function Del_Big_Dam takes unit U,string S returns nothing
local trigger TG =  I2TG(GetStoredInteger(udg_cache,S,I2S(H2I(U))))
call FlushStoredMission(udg_cache,I2S(H2I(TG)))
call FlushStoredMission(udg_cache,S)
call DestroyTrigger(TG)
set TG = null
endfunction[/jass]

此系统可以避免 S流...
并且 可以精确输出伤害
可以衍生出很多形式的 几率技能

鉴于之前函数比较混乱
刚刚进行了改进和 整理
目前比较函数清楚

此函数 对于之前所提出来的局限性...
发现其实 延迟技能 的话 要出现BUG是非常小几率的....(具体只有在一个技能 伤害非常非常慢...就是比如一个投射无 飞出去的很慢....而且 就在此时你单位获取了目标...而且你的 攻击还没到达...那个 技能伤害刚好到达...而且 满足几率...
这个几率非常小...而且基本没有满足所有条件的技能出现....)
不过对于持续伤害 ...可能 出现BUG的几率就比较大点了...
所以用这个函数的话...英雄还是不能有持续伤害技能...或者持续伤害的伤害输出单位不是 此英雄

评分

参与人数 1威望 +20 收起 理由
crazyforyou + 20

查看全部评分

发表于 2008-8-2 18:11:59 | 显示全部楼层
箭矢攻击的单位获取攻击目标和接受伤害事件时间隔相差很多


还有就是触发器动作不删除也会泄露
回复

使用道具 举报

发表于 2008-8-2 18:41:41 | 显示全部楼层
感觉有点问题
就像1楼讲的

当用远程单位攻击时  在投射物飞行过程中
随便发布一个指定点命令
这种情况就没有暴击了    受伤害这个触发已被你销毁了
回复

使用道具 举报

发表于 2008-8-2 19:15:03 | 显示全部楼层
那就改为近战暴击吧(JASS盲路过)
回复

使用道具 举报

 楼主| 发表于 2008-8-2 19:36:39 | 显示全部楼层
失箭不会导致销毁
有暴击效果

销毁要到那个单位接受了 来自那个单位的伤害才销毁
回复

使用道具 举报

发表于 2008-8-2 20:11:32 | 显示全部楼层
还是看不太明白
是如何实现 销毁要到那个单位接受了 来自那个单位的伤害才销毁


[jass]function big2_A takes nothing returns nothing
local trigger TG2 = GetTriggeringTrigger()
call DisableTrigger( TG2 )
call DestroyTrigger( I2TG(GetStoredInteger(udg_cache,I2S(H2I(GetTriggerUnit())),"TG3")) ) //受伤害的触发被销毁了 对吧
call DestroyTrigger( TG2 )
call FlushStoredMission(udg_cache,I2S(H2I(GetTriggerUnit())))
set TG2 = null
endfunction

[/jass]
回复

使用道具 举报

 楼主| 发表于 2008-8-2 20:13:28 | 显示全部楼层
就是注册目标接受伤害事件啊
在那个触发里才销毁 暴击

或者是单位发布了任何命令

你上面那个是 单位发布了命令
回复

使用道具 举报

发表于 2008-8-2 20:28:07 | 显示全部楼层
想再问下那个 发布了任何命令的触发
有什么具体作用
回复

使用道具 举报

 楼主| 发表于 2008-8-2 20:31:49 | 显示全部楼层
发布任何命令就作废啊
比如你发布了stop
就不会产生暴击了
就不能S流了
知道么
回复

使用道具 举报

发表于 2008-8-2 20:39:48 | 显示全部楼层
ok
谢谢lz
终于懂了
回复

使用道具 举报

发表于 2008-8-2 21:26:51 | 显示全部楼层
就LZ的代码来看,攻击者获取攻击目标后,只要被攻击者接受伤害或攻击者发布任意指令,这次的暴击触发就会销毁,如果是近战或立即攻击的单位一般是没什么问题,但对于箭矢攻击的单位,假如箭射出后,被攻击者受到其他人的攻击,那么这次暴击就取消了,或者箭射出后,攻击者移动了亦会取消暴击。
回复

使用道具 举报

 楼主| 发表于 2008-8-2 21:48:59 | 显示全部楼层
对于 LS的问题
我对函数做了改进加入了
动画损伤的时间的概念
到了那个时间 就自动删除 判断 命令的触发
不过这个函数拥有了 比较尴尬的效率
回复

使用道具 举报

发表于 2008-8-2 21:56:50 | 显示全部楼层
原来如此复杂,我还是不伤脑筋了
回复

使用道具 举报

 楼主| 发表于 2008-8-2 22:00:01 | 显示全部楼层
太麻烦了....
我做的无语了...
看来这个问题 还是等暴雪来解决比较好

目前支持 远程单位.使用

那个动画时间...只要和物体管理器里 动画损伤一样就OK了
注意 近战也要设置啊
不然变畜力攻击啦...

脑残ING...
回复

使用道具 举报

发表于 2008-8-4 21:51:20 | 显示全部楼层
大哥有T化的挖,出本人是J文盲哈
回复

使用道具 举报

发表于 2008-8-5 08:52:06 | 显示全部楼层
到底怎么用的 LZ详细说明下啊 是一个怪物遭受多人攻击的时候就不能用了吗?
回复

使用道具 举报

 楼主| 发表于 2008-8-5 11:23:45 | 显示全部楼层
不会啊...和那个没关系吧
回复

使用道具 举报

发表于 2008-8-5 11:36:28 | 显示全部楼层
那个动画时间...只要和物体管理器里 动画损伤一样就OK了
注意 近战也要设置啊
不然变畜力攻击啦...

这句什么意思啊?每个单位动画损伤都要改吗?
回复

使用道具 举报

 楼主| 发表于 2008-8-5 11:45:45 | 显示全部楼层
现在的版本不用了
第五个参数 填false就是近战了
第四项随意
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-1 16:23 , Processed in 0.042929 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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