fanqi1234 发表于 2009-7-16 00:06:28

仅供研究lua者参考:锁定友机后闪HUD(单机版)

每个模拟帧之后检查当前锁定的目标是否为友机。如果是则changeHUD赋值为真
每个模拟帧之前检查changeHUD,如果为真则发出改变HUD颜色的指令(156)

无论是HOJ模式还是光电锁定,都能识别敌友……请自觉吧……

主机端如果想屏蔽可以把lockon\Config\export\config.lua中的EnableExportScript = true改成false,即可屏蔽掉相应的接口。
经测试装了LRM的主机也可以屏蔽此方式。

感谢以下几贴:
F-15视距内识别的最新发现,有效防止误伤!
LOCKON的LUA SOCKET发包到网络应用程序功能很不错                                                                       
(最新更新)曝图一张,LOCKON 和 单片机 结合应用~~                                                                       

另外请教一下:
下面这个lua的逻辑处理和指令传递都是内部的,没有延迟问题(至少延迟小得可以忽略)
如果需要从lockon外部向lockon发送指令应该怎么写能减小延迟问题?
即使是在本机向本机发包,如果每帧都要等待数据的话,即使是1ms也可能会大幅降低游戏性能(未经实测,还说不准),毕竟模拟帧一秒钟NN多。



.function LuaExportStart()            -- 此function在每次进入任务时由Lockon自动调用

-- 先准备准备一些全局变量:

      ok = true            -- 用于存储LoGetObjectById是否可用

      changeHUD = false            -- 没有情况不要变HUD颜色

      HUDtimer = 0.0            -- 用于记录上次改变HUD颜色的时间

      myID = LoGetPlayerPlaneId()            -- 找到本机ID

      myObj = LoGetObjectById(myID)            -- 通过本机ID获得本机OBJECT

      if type(myObj) == \"nil\" then            -- 如果获得不到OBJECT就放弃了

                ok = false            -- 所以说cheat就not possible了。

      end

end            -- LuaExportStart()结束



function LuaExportBeforeNextFrame()            -- 每个模拟帧之前由lockon调用此函数,用于向模拟器输入各种指令

      if changeHUD then            -- 如果上一帧的数据说,应该改变HUD颜色,那么

                LoSetCommand(156)            -- 指令156就是改HUD颜色

                changeHUD = false            -- 既然改完了,下次就不用改了。

      end

end



function LuaExportAfterNextFrame()            -- 每一帧模拟完毕后,lockon调用此函数用于将模拟结果输出


-- 先准备一些本地变量


local i = 0            -- 这个其实是原来debug用的……现在没用了。

      local lock = false                  -- 默认当然是没有锁定目标

      local t = LoGetModelTime()            -- 刚刚结束的那个模拟帧是什么时间?

      local targets = LoGetLockedTargetInformation()            -- 获取被锁定的目标们的table(Lockon此函数可能会返回很多未锁定的目标……所以下面要自己手工过滤)

      local target            -- 预备的空白变量,准备等会确认了究竟锁定了哪个后,存储单独的那个被锁目标

      local stop = false            -- 没情况就不要停下

      for k,v in targets do            -- 一个循环,targets的每个元素折腾一遍。每次循环的时候v就是那个元素的内容。

                if not stop then            -- 如果发现了一个被锁定目标那就不要再折腾下一个了。不知道怎么跳出循环只好用这个笨办法

                if v.flags - 2048 >=0 then --0x800 HOJ            -- 不知道怎么搞二进制运算。只好用这个笨笨笨笨办法用十进制加减法来算。x800是HOJ模式

                        lock=true            -- HOJ模式当然是锁定了的

                        v.flags = v.flags - 2048

                end

                if v.flags - 1024 >=0 then --0x400 EasyRadar            -- 简易雷达模式。其实没啥用

                        v.flags = v.flags - 1024            -- 就算没用,也要按从大到小顺序,先减掉大的数字

                end

                if v.flags - 512 >=0 then --0x200
                        v.flags = 0 - 512
                        lock=false
                end

                if v.flags - 64 >=0 then--0x40 TWS             -- TWS锁定,减掉

                        v.flags = v.flags - 64

                end

                if v.flags - 32 >=0 then --0x20 TWS            -- 另一种TWS,总之减掉……

                        v.flags = v.flags - 32

                end

                if v.flags - 16 >=0 then --0x10 SST EOS            -- EOS单目标锁定状态

                        lock = true            -- 这个是锁定状态

                        v.flags = v.flags - 16            -- 减掉

                end               

                if v.flags - 8 >=0 then --0x08 SST Rdr            -- 雷达单目标锁定状态

                        lock=true            -- 这个是正宗锁定啊

                        v.flags = v.flags - 8            -- 减掉。

                end            -- 后面还有俩模式,都是扫描,不是锁定,所以不用处理了。






                if lock then             -- 如果前面的标记确认了是锁定状态

                        target = v            -- 那么当前这个目标就是要检查的目标

                        stop = true            -- 跳出循环吧(话说究竟怎么跳出更简单啊……)

                end            -- if lock的end

                end            -- if stop的end

      end            -- for的end

      

      if ((t-HUDtimer) > 0.2 and lock ) then            -- 如果是锁定状态,并且距离上次改变HUD颜色已经超过了0.2秒(改这里就可以改HUD闪动频率)那么:

                if ok then            -- 如果LoGetObjectById可以用,那么:

                        local targetObj = LoGetObjectById(target.ID)            -- 通过被锁定的目标的id获得目标OBJECT

                        if targetObj.Coalition == myObj.Coalition then            -- 如果目标的阵营与自己的阵营相同,那么:

                              changeHUD = true            -- 下一帧的时候要改HUD颜色

                              HUDtimer = t            -- 现在时间是最新一次改变HUD颜色的时间

                        end            -- 没有

                end            -- 自动

      end            -- 配对

end            -- 果然不爽……这是function的end



function LuaExportStop()

            -- 这是退出任务时由lockon调用的函数


            -- 如果用于文件导出应该在此关闭文件

end



function LuaExportActivityNextEvent(t)

      local tNext = t

            -- 这个函数是啥一直没弄懂,留空就是。

      return tNext

end



dofile(\"./Config/Export/TacviewExportFlamingCliffs.lua\")            -- 这个是acmi(tacview)的include,没山寨啥事。


[ 本帖最后由 fanqi1234 于 2009-7-17 16:32 编辑 ]

weidang 发表于 2009-7-16 00:17:26

这个代码挺好的.怎么用啊?替换?

YuWulun 发表于 2009-7-16 10:01:55

主机端如果想屏蔽可以把lockon\\Config\\export\\config.lua中的EnableExportScript = true改成false,即可屏蔽掉相应的接口。
经测试装了LRM的主机也可以屏蔽此方式

支持此类研究,联赛主机可以考虑加入这点。

silverliu 发表于 2009-7-16 10:04:29

好东西!

qixiaosong 发表于 2009-7-16 10:40:47

哇哇哇
牛人现身!!!
嘿嘿,没想到本人N久前提供了线索,如今真有人弄出来鸟
一定要顶,一定会用!

song1036 发表于 2009-7-16 11:23:57

好东西啊 建议高手们多发布此类的东东 呵呵

fanqi1234 发表于 2009-7-16 12:15:14

原本就以F15敌我识别出名的LRM好像最近也开放下载了?
参考此贴:http://www.insky.cn/bbs/viewthread.php?tid=40287&highlight=%CA%B6%B1%F0
不过LRM可以算是大部头的作品了……除了F15闪HUD之外还有很多其它改动。

注意,替换任何文件之前要备份。
页: [1]
查看完整版本: 仅供研究lua者参考:锁定友机后闪HUD(单机版)