找回密码
 点一下
查看: 2049|回复: 4

[已解决]这段何处声明的udg_Cache?还有I2S函数在哪里?!

[复制链接]
发表于 2009-9-10 16:53:39 | 显示全部楼层 |阅读模式
udg_Cach直接在变量编辑器里声明
I2S是CJ函数不用自己写

[jass]
//====================数据转换系统===(利用return bug)================
//====================取得句柄=======================================
function H2I takes handle h returns integer
return h
return 174
endfunction
//===================================================================
//====================由句柄取得计时器===============================
function I2T takes integer i returns timer
return i
return null
endfunction
//===================================================================
//====================由句柄取得单位=================================
function I2U takes integer i returns unit
return i
return null
endfunction
//===================================================================
//====================由句柄取得触发=================================
function I2TR takes integer i returns trigger
return i
return null
endfunction
//===================================================================
//====================由句柄取得特效=================================
function I2E takes integer i returns effect
return i
return null
endfunction
//=======================================================================
//====================缓存系统===========================================
//=============初始化缓存==(触发编辑器必须事先设定好全局变量udg_Cache)===
function LocalVars takes nothing returns gamecache
if udg_Cache==null then
call FlushGameCache(InitGameCache("lzf"))
set udg_Cache=InitGameCache("lzf")
endif
return udg_Cache
endfunction
//===================================================================
//====================存入整数=======================================
function SetHandleInt takes handle h,string s,integer i returns nothing
if i==0 then
call FlushStoredInteger(LocalVars(),I2S(H2I(h)),s)
else
call StoreInteger(LocalVars(),I2S(H2I(h)),s,i)
endif
endfunction
//===================================================================
//====================存入实数=======================================
function SetHandleReal takes handle h, string s,real r returns nothing
if r==0 then
call FlushStoredReal(LocalVars(),I2S(H2I(h)),s)
else
call StoreReal(LocalVars(),I2S(H2I(h)),s,r)
endif
endfunction
//===================================================================
//====================取得整数=======================================
function GetHandleInt takes handle h ,string s returns integer
return GetStoredInteger(LocalVars(),I2S(H2I(h)),s)
endfunction
//===================================================================
//====================取得实数=======================================
function GetHandleReal takes handle h,string s returns real
return GetStoredReal(LocalVars(),I2S(H2I(h)),s)
endfunction
//===================================================================
//====================释放缓存=======================================
function FlushHandleLocals takes handle h returns nothing
call FlushStoredMission(LocalVars(),I2S(H2I(h)))
endfunction
//=====================================================================
//============================调用公式=================================
//============================计算2点的角度============================
function R12 takes real x0,real y0,real x1,real y1 returns real
return Atan2(y1-y0,x1-x0)
endfunction
//=====================================================================
//=========================计算位移后的X坐标===========================
function X12 takes real x0,real r,real l returns real
return x0+Cos(r)*l
endfunction
//=====================================================================
//=========================计算位移后的Y坐标===========================
function Y12 takes real y0,real r,real l returns real
return y0+Sin(r)*l
endfunction
//=====================================================================
//=========================计算2点的距离===============================
function L12 takes real x0,real y0,real x1,real y1 returns real
return SquareRoot((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0))
endfunction
//=====================================================================
//============================判断技能=================================
function pd takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A000' ) ) then
        return false
    endif
    return true
endfunction
//=====================================================================
//============================删除特效=================================
function shan takes nothing returns nothing
local integer t=H2I(GetExpiredTimer())   //取得最后到期的计时器(也就是运行这个函数的计时器)
call DestroyEffect(I2E(GetHandleInt(I2T(t),"t1")))    //删除特效
call DestroyEffect(I2E(GetHandleInt(I2T(t),"t2")))
call FlushHandleLocals(I2T(t))       //清空这部分缓存
call DestroyTimer(I2T(t))         //销毁计时器
endfunction
//=====================================================================
//============================计算伤害=================================
function shuai takes integer u,real z returns nothing
local location l2=Location(GetUnitX(I2U(u)),GetUnitY(I2U(u)))
local integer t
set z=z-GetLocationZ(l2)
call RemoveLocation(l2)
set l2=null
if z>200 then
set t=H2I(CreateTimer()) //新建计时器
call SetUnitAnimation(I2U(u),"death") //播放死亡动画 下面的是命令单位对自己造成2*(z-200)的伤害
call UnitDamageTarget(I2U(u),I2U(u),2*(z-200),true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
//下面创建特效并存入缓存
call SetHandleInt(I2T(t),"t1",H2I(AddSpecialEffectTarget("Abilities\\Spells\\Items\\ScrollOfRejuvenation\\ScrollManaHealth.mdl",I2U(u),"chest")))
call SetHandleInt(I2T(t),"t2",H2I(AddSpecialEffectTarget("Abilities\\Spells\\Human\\Thunderclap\\ThunderclapTarget.mdl",I2U(u),"overhead")))
call TimerStart(I2T(t),2,false,function shan)   //计时2秒后运行一次shan函数  (布尔值为假 只运行一次)
endif
endfunction
//=====================================================================
//============================持续移动=================================
function tiao takes nothing returns nothing
local integer t=H2I(GetExpiredTimer())
local integer u=GetHandleInt(I2T(t),"u")
local real x0=GetUnitX(I2U(u))
local real y0=GetUnitY(I2U(u))
local real l=GetHandleReal(I2T(t),"l")-20
local real g=GetHandleReal(I2T(t),"g")+20
local real r
local real x1
local real y1
local real z
local location l2=null
if l>0 then
if g-l>0 then
call SetUnitFlyHeight(I2U(u),l,0)    //设置单位飞行高度
else
call SetUnitFlyHeight(I2U(u),g,0)
endif
set r=GetHandleReal(I2T(t),"r")
set x1=X12(x0,r,20)
set y1=Y12(y0,r,20)
set l2=Location(x1,y1)
set z=GetHandleReal(I2T(t),"z")-GetLocationZ(l2)
call RemoveLocation(l2)
set l2=null
if (IsTerrainPathable(x1,y1,PATHING_TYPE_FLYABILITY)==false)and(z>=-120) then
/////////判断目标地点是否可通行(避免跳出边界) 和判断目标地点是否太高(Z轴高上120就不能跳,可跳上一层悬崖)
call SetUnitX(I2U(u),x1) //设置单位x ,y 坐标(如果设置出了地图范围,会弹出魔兽)
call SetUnitY(I2U(u),y1)
endif
call SetHandleReal(I2T(t),"g",g)
call SetHandleReal(I2T(t),"l",l)
else
call PauseTimer(I2T(t))      //暂停计时器
call SetUnitFlyHeight(I2U(u),0,0)
call PauseUnit(I2U(u),false)  //恢复单位
call SetUnitPathing(I2U(u),true)     //打开单位的碰撞开关
call shuai(u,GetHandleReal(I2T(t),"z"))     //运行函数shuai 参数 单位是u 实数是(GetHandleReal(I2T(t),"z")取得的值)
call FlushHandleLocals(I2T(t))
call DestroyTimer(I2T(t))
endif
endfunction
//=====================================================================
//============================开始技能=================================
function kaiqitiao takes nothing returns nothing
local integer t=H2I(CreateTimer())
local integer u=H2I(GetTriggerUnit())       //取得触发单位的句柄
local real x0=GetUnitX(I2U(u))
local real y0=GetUnitY(I2U(u))
local real x1=GetLocationX(GetSpellTargetLoc())
local real y1=GetLocationY(GetSpellTargetLoc())
local real r=R12(x0,y0,x1,y1)        //初始化实数r 值为运行函数R12 参数x0,y0,x1,y1所返回的值
local real l=L12(x0,y0,x1,y1)
local location ul=GetUnitLoc(I2U(u))
local real z=GetLocationZ(ul)
call RemoveLocation(ul)         //清点而已
set ul=null
if l>741 then
set l=741
endif
call SetHandleInt(I2T(t),"u",u)
call SetHandleReal(I2T(t),"r",r)
call SetHandleReal(I2T(t),"l",l)
call SetHandleReal(I2T(t),"g",0)
call SetHandleReal(I2T(t),"z",z)
call PauseUnit(I2U(u),true)
call SetUnitPathing(I2U(u),false)        
call UnitAddAbility(I2U(u),'Amrf')          //添加删除乌鸦形态之后就能用触发更改单位的飞行高度
call UnitRemoveAbility(I2U(u),'Amrf')       //此时单位仍为地面单位
call TimerStart(I2T(t),0.02,true,function tiao)
//////计时每0.02秒运行tiao函数(布尔值为真,无限循环运行,直到被人暂停)
//////TimerStart所运行的函数 必须为不带参数的函数  (takes nothing returns nothing)
endfunction
//==============================施放技能事件===========================
//=====================================================================
function InitTrig_tiao takes nothing returns nothing        //事件了
local integer t=H2I(CreateTrigger())         //创建临时触发运行触发
call TriggerRegisterAnyUnitEventBJ(I2TR(t),EVENT_PLAYER_UNIT_SPELL_CAST)  //为该触发添加事件
call TriggerAddCondition(I2TR(t),Condition(function pd))   //为该触发添加条件
call TriggerAddAction(I2TR(t), function kaiqitiao )  //为该触发添加动作
endfunction
//=====================================================================

[/jass]

jass.jpg.jpg
这是橙子写的跳跃演示
我只看见这两条trigger- -...不是GC要在地图初始化的时候就创建么...
这两条trigger我都没看到声明udg_Cache但是却能够运行...为什么...

[jass]
                                                   function H2I takes handle h returns integer     //句柄转地址(将传入的句柄转成地址形式)
  return h
  return 174
  endfunction
 
function I2TR takes integer i returns trigger     //地址转句柄(将内存地址转换成trigger型)
  return i
  return null
  endfunction

function I2U takes integer i returns unit
  return i
  return null
  endfunction


function LocalVars takes nothing  returns nothing
  if udg_Cache == null then
  call FlushGameCache(InitGameCache("RS"))
  set udg_Cache = InitGameCache("RS")
  endif
  return udg_Cache
endfunction

function GoTimer takes nothing returns nothing
  local integer t = H2I(CreateTimer())
  local integer u = H2I(GetTriggerUnit())
  local real x = GetUnitX(I2U(u))
  local real y = GetUnitY(I2U(u))
    //return
endfunction
 
function pd takes nothing returns boolean       //触发器的条件
  if(IsUnitType(GetTriggerUnit(),UNIT_TYPE_HERO) == true) then   //如果触发单位是英雄 返还 true 否则 返还 false
    return true
    else
    return false
  endif
  endfunction
 
function InitTrig_Die takes nothing returns nothing
  local integer t = H2I(CreateTrigger())      //创建触发器(运行H2I把创建的触发器转为数字地址存入临时整形变量t)
  call TriggerRegisterAnyUnitEventBJ(I2TR(t),EVENT_PLAYER_UNIT_DEATH)  //给t(I2TR把地址转化为trigger形)添加任意单位死亡事件
  call TriggerAddCondition(I2TR(t),Condition(function pd))    //给I2TR(t)添加条件,运行条件判定函数"pd"
  call TriggerAddAction(I2TR(t),function GoTimer)
  endfunction
[/jass]
我写到这里...检查语法就出现了
Line 18:Undeclared variable:udg_Cache
Line 23:Cannot return value from function that returns nothing
这两个错误- -...未声明udg_Cache
无法return.....
求教....

还有也没有看见I2S的函数....为什么...?不解啊...

跳跃演示.w3x

25 KB, 下载次数: 6

发表于 2009-9-10 17:04:36 | 显示全部楼层
直接在触发编辑器里声明全局变量……
回复

使用道具 举报

 楼主| 发表于 2009-9-10 17:40:53 | 显示全部楼层
原来如此....那 I2S 呢...
回复

使用道具 举报

发表于 2009-9-10 17:45:46 | 显示全部楼层
I2S是cj函数………………不需要自己写
回复

使用道具 举报

 楼主| 发表于 2009-9-10 19:48:09 | 显示全部楼层

Re:这段何处声明的udg_Cache?还有I2S函数在哪里?!

谢谢各位- -已经得到解答
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 12:17 , Processed in 0.080183 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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