发一篇帖子,算是交流,也算是记录一下心路历程
先说一下起因,我最开始是想实现地图全开的效果,但是七日杀的类很多,没有什么思路
后面看到了关于homelist的帖子,自定义传送HomeV2 修复1.11版 适配V1.2(开源)12.11更新
在里面提到一个XUiC_MapArea类,提到onOpen方法(这类挺大的,将近两千行代码)
我这里想到一个思路,既然打开地图了,那肯定是会调用相关的渲染
然后我通过AI分析找到了updateMapSection方法,其中提到如下内容(以下为AI分析结果)(完整代码我就不展示了,自行反编译)
// 检查地图数据库中是否有该区块的数据
long chunkKey = WorldChunkCache.MakeChunkKey(num3, num4);
ushort[] mapColors = mapDatabase.GetMapColors(chunkKey);
if (mapColors == null)
{
// 如果没有数据,显示迷雾(黑色)
…
}
else
{
// 如果有数据,根据迷雾掩码显示部分或全部
bool flag2 = mapDatabase.Contains(WorldChunkCache.MakeChunkKey(num3, num4 + 1));
bool flag3 = mapDatabase.Contains(WorldChunkCache.MakeChunkKey(num3, num4 – 1));
bool flag4 = mapDatabase.Contains(WorldChunkCache.MakeChunkKey(num3 – 1, num4));
bool flag5 = mapDatabase.Contains(WorldChunkCache.MakeChunkKey(num3 + 1, num4));
// … 后续代码处理迷雾边缘效果
}
可以看到这里找到了mapDatabase,地图数据都存在这个变量里面,我只需要找到再哪里给这个变量赋值的,就能够实现地图全开,但事与愿违。
分析this.localPlayer.ChunkObserver.mapDatabase的被调用
// 在PlayerId方法中
entityPlayerLocal.ChunkObserver = this.m_World.m_ChunkManager.AddChunkObserver(entityPlayerLocal.GetPosition(), true, GameUtils.GetViewDistance(), -1);
// 在RequestToSpawnPlayer方法中
entityPlayer.ChunkObserver = this.m_World.m_ChunkManager.AddChunkObserver(entityPlayer.GetPosition(), false, _chunkViewDim, entityPlayer.entityId);
一个是通过GameUtils.GetViewDistance()方法去赋值的,另一个是
int num = GamePrefs.GetInt(EnumGamePrefs.ServerMaxAllowedViewDistance);
_chunkViewDim = Mathf.Clamp(_chunkViewDim, 4, num);
(以下为AI分析结果)
这里的GameUtils.GetViewDistance()返回的是玩家的区块观察距离,这直接影响地图上迷雾的显示范围。
ServerMaxAllowedViewDistance是服务器可以通过配置限制玩家的最大观察距离,从而间接控制迷雾的显示半径。
其实已经不用向下继续分析了,整套分析结果总结下来就是,七日杀地图通过玩家可见范围,进行实时渲染绘制地图的(这还玩个蛋啊),已经卡在这里了,希望中文网能有大佬提供新思路。另外补几张分析图
没啥好分析的 原理就是弄个人开飞行模式挨着飞一遍
定制+Q417983415
有种地图渲染的感觉
求大佬先出一个视野范围在1千米范围的mod,我拿来做地图用,原版的范围只有100米
还有一个问题,地图本来就是已经完全生成了的,用上帝上天就知道,,只是地图不放开而已