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

猪头大哥,帮我看下这代码哪有问题,找不出了,先谢过

[复制链接]
发表于 2008-3-15 11:30:35 | 显示全部楼层 |阅读模式
主要是游戏缓存方面通不过,不知道是什么原因

function H2I takes handle h returns integer
      return h
      return 0
endfunction

function I2H takes integer i returns trigger
      return i
      return null
endfunction

function Trig_xjh03_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A004' ) ) then
        return false
    endif
    return true
endfunction

function Trig_xjh03_Func005Func001C takes nothing returns boolean
    if ( not ( UnitHasBuffBJ(GetTriggerUnit(), 'B000') == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_xjh03_Func005A takes nothing returns nothing
    local real int
    local integer exp
    local unit china
    set exp = GetStoredinteger(udg_GC,"one","one1"))
    set china = I2S(I2H(exp))
    if ( Trig_xjh03_Func005Func001C() ) then
        set int = ( ( I2R(GetHeroAgi(china, true)) / 100.00 ) + 1.00 )
    else
        set int = 1.00
    endif
    call Storereal(udg_GC,"one","one01",int)
    set int = 0.00
    set exp = 0
    set china =null
endfunction

function Trig_xjh03_Actions takes nothing returns nothing
    local unit china
    local location ti
    local location array unit01
    local group unit02
    local integer exp
    local real int
    local effect array look
    local lightning array look01
    call InitGameCacheBJ( "Mapgc.w3v" )
    set udg_GC = GetLastCreatedGameCacheBJ()
    set china = GetTriggerUnit()
    set ti = GetUnitLoc(GetTriggerUnit())
    set unit02 = GetUnitsInRangeOfLocAll(400.00, ti)
    set exp = 1
    set int = 0.00
    loop
        exitwhen exp > 12
        set unit01[exp] = PolarProjectionBJ(ti, 450.00, int)
        set unit01[( exp + 12 )] = PolarProjectionBJ(ti, 200.00, int)
        set int = ( int + 30.00 )
        set exp = exp + 1
    endloop
    set unit01[25] = ti
    set exp = 1
    loop
        exitwhen exp > 12
        call AddSpecialEffectLocBJ( unit01[exp],"Objects\\Spawnmodels\\Undead\\UDeathSmall\\UDeathSmall.mdl" )
        set look[exp] = bj_lastCreatedEffect
        call AddSpecialEffectLocBJ( unit01[( exp +12)],"Objects\\Spawnmodels\\Undead\\UndeadDissipate\\UndeadDissipate.mdl" )
        set look[( exp + 12 )] = bj_lastCreatedEffect
        call AddSpecialEffectLocBJ( unit01[( exp +12)],"Abilities\\Spells\\Undead\\DeathPact\\DeathPactTarget.mdl" )
        set look[( exp + 25 )] = bj_lastCreatedEffect
        set exp = exp + 1
    endloop
    call AddSpecialEffectLocBJ( unit01[25],"Abilities\\Spells\\Human\\Resurrect\\ResurrectCaster.mdl" )
    set look[25] = bj_lastCreatedEffect
    call PolledWait( 0.15 )
    set exp = 1
    loop
        exitwhen exp > 11
        call AddLightningLoc( "FORK", unit01[exp], unit01[( exp + 1 )] )
        set look01[exp] = bj_lastCreatedLightning
        set exp = exp + 1
    endloop
    call AddLightningLoc( "FORK", unit01[12], unit01[1] )
    set look01[12] = bj_lastCreatedLightning
    call Storeinteger(udg_GC,"one","one01",I2S(H2I(china)))
    call ForGroupBJ( unit02, function Trig_xjh03_Func005A )
    set int = GetStoredreal(udg_GC,"one","one1"))
    call UnitDamagePointLoc( china, 0.20, 400.00, ti, ( ( I2R(GetHeroAgi(china, true)) *2.00) * int ), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
    call PolledWait( 1.50 )
    set exp = 1
    loop
        exitwhen exp > 25
        call RemoveLocation( unit01[exp] )
        set exp = exp + 1
    endloop
    set exp = 1
    loop
        exitwhen exp > 37
        call DestroyEffect( look[exp] )
        set exp = exp + 1
    endloop
    set exp = 1
    loop
        exitwhen exp > 12
        call DestroyLightning( look01[exp] )
        set exp = exp + 1
    endloop
    call RemoveLocation( ti )
    call GroupClear( unit02 )
    call DestroyGroup( unit02 )
    set int = 0.00
    set exp = 0
    set china = null
    call FlushStoredMission(udg_GC,"one")
endfunction

//===========================================================================
function InitTrig_xjh03 takes nothing returns nothing
    set gg_trg_xjh03 = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_xjh03, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_xjh03, Condition( function Trig_xjh03_Conditions ) )
    call TriggerAddAction( gg_trg_xjh03, function Trig_xjh03_Actions )
endfunction
发表于 2008-3-15 12:59:02 | 显示全部楼层
I2H函数是不对的,unit之类的都是handle的子类,父类变量可以引用子类变量的内容,但反过来不可以
应该把那些变量类型分开写成I2U等等

set exp = GetStoredinteger(udg_GC,"one","one1"))中GetStoredinteger的i应该是大写,而且右边多了一个括号
set china = I2S(I2H(exp))在胡扯,变量类型完全对不上
call Storereal(udg_GC,"one","one01",int)中Storereal的r应该大写
call Storeinteger(udg_GC,"one","one01",I2S(H2I(china)))中Storeinteger的i大写,而且不需要I2S
set int = GetStoredreal(udg_GC,"one","one1"))中GetStoredreal的r大写,右边多了括号

还有个建议,
call InitGameCacheBJ( "Mapgc.w3v" )
set udg_GC = GetLastCreatedGameCacheBJ()
这种最好在地图初始化是执行吧,每用一次技能产生一个实例,貌似记得缓存有上限的,超过了就无法再产生实例了
回复

使用道具 举报

 楼主| 发表于 2008-3-15 13:53:30 | 显示全部楼层
我是想把单位用整数保存,再在子函数中把保存的整数转成单位,这要怎么做呢,就是这2句不是很明白要啥搞

set exp = GetStoredInteger(udg_GC,"one","one1")这是把单位类型转成整数类型,记得是可以的


set china = I2S(I2H(exp)这是把整数类型改成单位类型

让你帮我改下这2句

I2H函数是不对的,unit之类的都是handle的子类,父类变量可以引用子类变量的内容,但反过来不可以
应该把那些变量类型分开写成I2U等等
你说不能这样写,那你帮我改下,我刚学缓存,很多不懂
回复

使用道具 举报

发表于 2008-3-15 14:03:25 | 显示全部楼层
I2H函数改成如下
[codes=jass]function I2U takes integer i returns unit
    return i
    return null
endfunction[/codes]

set exp没什么大问题,只是指出原来的错误
set china = I2U(exp)
回复

使用道具 举报

 楼主| 发表于 2008-3-15 14:08:18 | 显示全部楼层
教材上一直没写,我想问下,
所谓的H2I,I2U是随便取的函数名,还是有规定的必需用的函数名

还有I2S和S2I是不是也是一样,只是随便取的函数名,或是系统自带的函数名

如果是系统自带的,也麻烦猪头大哥告诉下还有哪些是自带的,谢过了!

还有个问题,这句为什么会通不过,说是无效的变量类型
call ForGroupBJ( unit02, function Trig_xjh03_Func005A )
回复

使用道具 举报

发表于 2008-3-15 16:02:15 | 显示全部楼层
所谓的H2I,I2U   应该是随便取的函数名  
你可以更改的  但那样代码可读性不高   最好别改

I2S和S2I 好像在教程里  没看过

一些常用的转换函数 教程里  仔细看看吧
http://www.ourga.com/bbs/read.ph ... 6%D3%EB%D3%A6%D3%C3
回复

使用道具 举报

发表于 2008-3-15 16:05:25 | 显示全部楼层
不知道
报错不一定是对这句话的,前后数行都有可能貌似
回复

使用道具 举报

 楼主| 发表于 2008-3-15 16:10:31 | 显示全部楼层
还是找不到,我发现少了个I2S的函数,但不知道S的返回是null还是什么,反正通不过

麻烦告诉下S类型的返回是什么

call Storeinteger(udg_GC,"one","one01",I2S(H2I(china)))这条语句的I2S有必要吗?
但是如果删了的话,就不能把单位类型带到另个函数里
回复

使用道具 举报

发表于 2008-3-15 16:28:47 | 显示全部楼层
S是string的缩写,不需要的
这个和能不能带到另个函数是无关的………………
加了是语法错误
回复

使用道具 举报

 楼主| 发表于 2008-3-15 16:31:25 | 显示全部楼层
删了I2S,语法是通过了,但还是没伤害,不知道哪出问题
回复

使用道具 举报

发表于 2008-3-15 16:49:45 | 显示全部楼层
………………
我觉得完全看不懂你的代码想表达什么
回复

使用道具 举报

 楼主| 发表于 2008-3-15 16:56:23 | 显示全部楼层
call StoreReal(udg_GC,"one","one1",int)   在函数B中存一个实数到缓存

    set int = GetStoredReal(udg_GC,"one","one1")  在函数A中从缓存取1个实数


    call StoreInteger(udg_GC,"one","one1",H2I(china))  在函数A中把一个单位转成整数存入缓存


    set exp = GetStoredInteger(udg_GC,"one","one1")   在函数B中把整数地址转成单位,并把这个
    set china = I2U(exp)                                                         单位做为触发单位做命令动作
        set int = ( ( I2R(GetHeroAgi(china, true)) / 100.00 ) + 1.00 )


发现前2条语句有问题,不能存入或不能取出实数,关于单位的那2句,估计也有问题
回复

使用道具 举报

发表于 2008-3-15 17:00:41 | 显示全部楼层
我是指整体的代码,尤其是ForGroup那段和调用的代码
回复

使用道具 举报

 楼主| 发表于 2008-3-15 17:01:20 | 显示全部楼层
哦,是一个技能
大部份是效果

因为单位组不能传递参数,又不想用全局变量,所以触发单位的传递和实数变量的传递成为困难,没办法,听你的,只能用缓存
回复

使用道具 举报

发表于 2008-3-15 17:09:21 | 显示全部楼层
我记得我说的是用全局变量或者缓存………………
你的代码是在看不通………………
对于这种不是持续性的技能,用全局变量就好了
回复

使用道具 举报

 楼主| 发表于 2008-3-15 17:14:17 | 显示全部楼层
为什么看不通

我用全局变量的话就已经解决了,但是要占用2个全局变量,就是不想用,所以才想用缓存解决,可以的话,再帮我解决下缓存就好,关于别的,我用了大量的循环,可能看的是累了点
回复

使用道具 举报

发表于 2008-3-15 17:24:39 | 显示全部楼层
关于那个ForGroup我就看不懂
ForGroup是枚举单位组里每一个单位做动作,而你的ForGroup调用的函数却与GetEnumUnit毫无关系,全是在用GetTriggerUnit,而那里面的局部变量exp和china更看不懂了,获取了一个什么都不是的数字,却把它取转换成单位………………
如果是选取单位组内单位做伤害,那应该在ForGroup调用的函数里用UnitDamageTarget,但是你确是在外面用UnitDamagePointLoc,准备连友军一起打………………
回复

使用道具 举报

 楼主| 发表于 2008-3-15 17:29:38 | 显示全部楼层
问题解决了,原来是我的破UI只能用BJ函数,我汗了

function Trig_xjh03_Func005A takes nothing returns nothing
    local real int
    local integer exp
    local unit china
    set exp = GetStoredIntegerBJ("one","one1",udg_GC)    把缓存中的整数带给EXP
    set china = I2U(exp)     把单位的内存地址转成单位,主要是为了计算伤害需要加几倍
    if ( Trig_xjh03_Func005Func001C() ) then
        set int = ( ( I2R(GetHeroAgi(china, true)) / 100.00 ) + 1.00 )    就这里,带入单位就为这步
    else
        set int = 1.00
    endif
    call StoreRealBJ(int,"one","one1",udg_GC)   这是返回伤害实际加强了多少倍,就是主函数中的INT


call StoreIntegerBJ(H2I(china),"one","one1",udg_GC)      这是保存触发单位
    call ForGroupBJ( unit02, function Trig_xjh03_Func005A )    单位组做动作
    set int = GetStoredRealBJ("one","one1",udg_GC)      取出伤害加强了几倍
    call UnitDamagePointLoc( china, 0.20, 400.00, ti, ( ( I2R(GetHeroAgi(china,     伤害敌人

伤害部份主要就是这样的
其它的都是技能效果
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-9 05:57 , Processed in 0.030678 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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