# jass.code 跟 jass 进行交互

jass 里面 有 2 种函数

  • 1 是 native 在 common.j 里的接口 简称 cj
  • 2 是 blizzard.j 以及 war3map.j 里的 自定义函数 简称 bj

# lua 调用 cj

  • 原 ydlua 功能
    local jass = require 'jass.common'

    jass.DisplayTextToPlayer(jass.Player(0), 0, 0, "hello world!")
1
2
3

# 重载 cj jass 调用 lua

  • 原 ydlua 功能

  • 由于 cj 参数类型 参数数量 返回值 都是固定的 不便做扩展

    local jass = require 'jass.common'
    local hook = require 'jass.hook'

    local DisplayTextToPlayer = DisplayTextToPlayer
    function hook.DisplayTextToPlayer(player, x, y, msg)
        print(player, x, y, msg)
        DisplayTextToPlayer(player, x, y, msg)
    end
1
2
3
4
5
6
7
8

# 遍历 cj 函数

  • 原 ydlua 功能
    local jass = require 'jass.common'
    for name, func in pairs(jass) do 
        print(name, func)
    end

1
2
3
4
5

# lua 调用 bj

  • 内置 lua 功能
  • 要注意优化混淆 j 文件后的名字
    local code = require 'jass.code'

    code.BJDebugMsg("hello world!")

1
2
3
4

# 重载 bj jass 调用 lua

  • 内置 lua 功能
  • bj 可以自定义扩展参数类型 参数数量
  • 要注意优化混淆 j 文件后的名字
    function add takes integer a, integer b returns integer 
        call GetTriggeringTrigger() //随便调用一句jass 防止 空函数被jass虚拟机内联优化掉
        return 0
    endfunction

    function test takes nothing returns nothing
        call BJDebugMsg(I2S(add(10, 20)))
    endfunction
1
2
3
4
5
6
7
8
    local code = require 'jass.code'

    function code.add(a, b)
        return a + b
    end 

    function code.BJDebugMsg(msg)
        print(msg)
    end 


    code.test() --控制台将会输出 30 而游戏内屏幕不会打印。

1
2
3
4
5
6
7
8
9
10
11
12
13

# 遍历 bj 函数

  • 内置 lua 功能
    local code = require 'jass.code'
    for name, func in pairs(code) do 
        print(name, func)
    end

1
2
3
4
5