前言
这是一个非常老的玩意了,由MTA社区的一位大佬CrystalMV所开发,但是可惜的是,对于内部的文件结构描述,作者并没有做过详细的描述,交通地图文件又是二进制的,所以从直观上来看并没有那么好入手。
在此我挖了下这座屎山的源码,稍微吧它的文件结构做一下文档,以方便后人填坑(如果有)
在此我挖了下这座屎山的源码,稍微吧它的文件结构做一下文档,以方便后人填坑(如果有)
由于原帖我是直接发布在MTA官方论坛上的,所以再次我就不在图片上直接翻译了,我会把翻译附在下面描述。
变量
交通地图文件结构
Node Block (节点路径)
- X float (4 字节), 除以1000获取实际坐标
- Y float (4 字节), 除以1000获取实际坐标
- Z float (4 字节), 除以1000获取实际坐标
- RX float (4 字节), 除以1000获取实际坐标
- RY float (4 字节), 除以1000获取实际坐标
- RZ float (4 字节), 除以1000获取实际坐标
- Start int (4 字节) 起点节点ID
- End int (4字节) 终点节点ID
- Bend int(4字节) 拐点ID (用于平滑载具过弯)
- TrafficType unsigned integer (1 字节) 交通路径类型 (1: 行人, 2: 车辆, 3: 船, 4: 飞机)
- Lights unsigned shorts(2 字节) 路径的朝向, (1: “南北”, 2: “东西” 3: “无方向” (全交通灯红灯,只允许行人过,类似步行街)
- Speed unsigned integer (1 字节) 速度,用来限制该路径交通能通过的最大速度。
- LeftLanes 左行道数
- RightLanes 右行道数
- Density 密度,用来控制该路径生成的最大交通密度
- C1 int (4 字节) 起始节点ID
- C2 int (4 字节) 终点节点ID
输出
function testGenerateTrafficFile()
local nodes_block = {
{0,0,10,0,0},
{5,5,10,0,0},
{10,10,10,0,0},
}
local connection_block = {
{1,2,-1,2,1+1*4,50,1,1,1000}
}
local forbidden_block = {}
-- write header
local f = fileCreate("testpath")
fileWrite(f,dataToBytes("3i",#nodes_block,#connection_block,#forbidden_block))
-- write nodes
for node_index,node in ipairs(nodes_block) do
local x,y,z,rx,ry = unpack(node)
x,y,z = math.floor(x*1000),math.floor(y*1000),math.floor(z*1000)
rx,ry = math.floor(rx*1000),math.floor(ry*1000)
fileWrite(f,dataToBytes("3i2s",x,y,z,rx,ry))
end
-- write connections
for node_index,conn in ipairs(connection_block) do
local n1,n2,nb,trtype,lights,speed,ll,rl,density = unpack(conn)
fileWrite(f,dataToBytes("3i2ubus2ubus",n1,n2,nb,trtype,lights,speed,ll,rl,density))
iprint(conn)
end
fileClose(f)
print("path wroted")
end