仅供研究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 编辑 ] 这个代码挺好的.怎么用啊?替换? 主机端如果想屏蔽可以把lockon\\Config\\export\\config.lua中的EnableExportScript = true改成false,即可屏蔽掉相应的接口。
经测试装了LRM的主机也可以屏蔽此方式
支持此类研究,联赛主机可以考虑加入这点。 好东西! 哇哇哇
牛人现身!!!
嘿嘿,没想到本人N久前提供了线索,如今真有人弄出来鸟
一定要顶,一定会用! 好东西啊 建议高手们多发布此类的东东 呵呵 原本就以F15敌我识别出名的LRM好像最近也开放下载了?
参考此贴:http://www.insky.cn/bbs/viewthread.php?tid=40287&highlight=%CA%B6%B1%F0
不过LRM可以算是大部头的作品了……除了F15闪HUD之外还有很多其它改动。
注意,替换任何文件之前要备份。
页:
[1]