群友们,身为开发者,最近构建模组老是遇到CS0433这种错误,有知道咋回事吗?
两个月前还没有的,代码没改,到新版tmodloader就频繁报这个错,两次开发时间中途只是重装了一次系统,但是原mod文件保留并移动了,想过是新旧系统文件可能有冲突,于是把整个原tmodloader文件全删了,但还是有这种问题。
猜测好像是和那个叫tModCodeAssist的库文件有关,有知道咋回事的吗?
于是在tmodloader文件夹里找到了这个文件,但是点进去全是.dll文件,二进制的,怎么会和我的源码中的TileID冲突呢?于是一直找不到和我源码冲突的位置。(注:tModCodeAssist路径:C:\Program Files (x86)\Steam\steamapps\common\tModLoader\Libraries\tModCodeAssist)
tmodloader游戏完整性也校验过,没问题
源码改了好几次,其他问题出来又被解决,出来又被解决,但是就是改不了这个CS0433错误。SeedSearcherProgram.cs源码如下:
using System;
using Terraria;
using Terraria.WorldBuilding;
using Terraria.IO;
using Terraria.ID;
namespace SeedSearcher
{
class SeedSearcherProgram
{
static void Main(string[] args)
{
Console.WriteLine("开始搜索符合条件的种子...");
// 搜索符合条件的种子
int validSeed = SearchForValidSeed();
// 输出结果
Console.WriteLine($"找到符合条件的种子: {validSeed}");
Console.WriteLine("按任意键退出...");
Console.ReadKey();
}
static int SearchForValidSeed()
{
Random random = new Random();
int seed;
int attempts = 0;
do
{
seed = random.Next();
attempts++;
// 每搜索1000000次显示一次进度
if (attempts % 1000000 == 0)
{
Console.WriteLine($"已搜索 {attempts} 个种子...");
}
}
while (!CheckSeedConditions(seed));
Console.WriteLine($"总共搜索了 {attempts} 个种子");
return seed;
}
static bool CheckSeedConditions(int seed)
{
// 用户要求的条件:
// 1. 小世界
// 2. 存在世界树延伸至地狱层
// 3. 不实际创建世界,仅仅进行搜索
try
{
// 创建一个虚拟的世界生成进度对象
GenerationProgress progress = new GenerationProgress();
// 生成世界以检查条件
Terraria.WorldGen.generateWorld(seed, progress);
// 检查是否为小世界
bool isSmallWorld = Terraria.Main.maxTilesX <= 4200;
// 检查是否有世界树延伸到地狱层
bool hasTreeToUnderworld = CheckWorldTreeToUnderworld();
// 清理世界数据以避免内存问题
Terraria.Main.WorldFileMetadata = null;
Terraria.Main.worldName = "";
Terraria.Main.worldID = 0;
// 检查是否满足所有条件
return isSmallWorld && hasTreeToUnderworld;
}
catch (Exception ex)
{
// 如果生成世界时出现异常,认为该种子不符合条件
Console.WriteLine($"检查种子 {seed} 时出现异常: {ex.Message}");
return false;
}
}
private static bool CheckWorldTreeToUnderworld()
{
// 检查世界树的地下通道是否延伸到地狱层
// 世界树的地下通道通常由木板构成
// 地狱层的Y坐标
int underworldY = Terraria.Main.maxTilesY - 200;
// 遍历世界,寻找世界树的地下通道
for (int x = 0; x < Terraria.Main.maxTilesX; x++)
{
for (int y = underworldY; y < Terraria.Main.maxTilesY; y++)
{
Tile tile = Terraria.Main.tile[x, y];
// 检查是否为木板方块
if (tile != null && tile.HasTile && tile.TileType == TileID.Platforms)
{
// 如果发现木板,检查是否是连续的通道
if (IsTreeTrunk(x, y))
{
return true;
}
}
}
}
return false;
}
private static bool IsTreeTrunk(int startX, int startY)
{
// 检查从该点向上是否有一条连续的木板通道
int x = startX;
int y = startY;
// 向上检查最多200个方块
for (int i = 0; i < 200; i++)
{
if (y - i < 0) break;
Tile tile = Terraria.Main.tile[x, y - i];
// 如果遇到不是木板的方块,检查是否是世界树的根部
if (tile == null || !tile.HasTile || tile.TileType != TileID.Platforms)
{
// 检查是否是世界树的根部或树干
// 使用近似的检查方法,检查是否为树木相关的方块
if (tile != null && tile.HasTile && tile.TileType == TileID.Trees)
{
return true; // 找到了世界树
}
break; // 不是连续的木板通道
}
}
return false; // 没有找到连续的通道
}
}
}
两个月前还没有的,代码没改,到新版tmodloader就频繁报这个错,两次开发时间中途只是重装了一次系统,但是原mod文件保留并移动了,想过是新旧系统文件可能有冲突,于是把整个原tmodloader文件全删了,但还是有这种问题。
猜测好像是和那个叫tModCodeAssist的库文件有关,有知道咋回事的吗?
于是在tmodloader文件夹里找到了这个文件,但是点进去全是.dll文件,二进制的,怎么会和我的源码中的TileID冲突呢?于是一直找不到和我源码冲突的位置。(注:tModCodeAssist路径:C:\Program Files (x86)\Steam\steamapps\common\tModLoader\Libraries\tModCodeAssist)
tmodloader游戏完整性也校验过,没问题
源码改了好几次,其他问题出来又被解决,出来又被解决,但是就是改不了这个CS0433错误。SeedSearcherProgram.cs源码如下:
using System;
using Terraria;
using Terraria.WorldBuilding;
using Terraria.IO;
using Terraria.ID;
namespace SeedSearcher
{
class SeedSearcherProgram
{
static void Main(string[] args)
{
Console.WriteLine("开始搜索符合条件的种子...");
// 搜索符合条件的种子
int validSeed = SearchForValidSeed();
// 输出结果
Console.WriteLine($"找到符合条件的种子: {validSeed}");
Console.WriteLine("按任意键退出...");
Console.ReadKey();
}
static int SearchForValidSeed()
{
Random random = new Random();
int seed;
int attempts = 0;
do
{
seed = random.Next();
attempts++;
// 每搜索1000000次显示一次进度
if (attempts % 1000000 == 0)
{
Console.WriteLine($"已搜索 {attempts} 个种子...");
}
}
while (!CheckSeedConditions(seed));
Console.WriteLine($"总共搜索了 {attempts} 个种子");
return seed;
}
static bool CheckSeedConditions(int seed)
{
// 用户要求的条件:
// 1. 小世界
// 2. 存在世界树延伸至地狱层
// 3. 不实际创建世界,仅仅进行搜索
try
{
// 创建一个虚拟的世界生成进度对象
GenerationProgress progress = new GenerationProgress();
// 生成世界以检查条件
Terraria.WorldGen.generateWorld(seed, progress);
// 检查是否为小世界
bool isSmallWorld = Terraria.Main.maxTilesX <= 4200;
// 检查是否有世界树延伸到地狱层
bool hasTreeToUnderworld = CheckWorldTreeToUnderworld();
// 清理世界数据以避免内存问题
Terraria.Main.WorldFileMetadata = null;
Terraria.Main.worldName = "";
Terraria.Main.worldID = 0;
// 检查是否满足所有条件
return isSmallWorld && hasTreeToUnderworld;
}
catch (Exception ex)
{
// 如果生成世界时出现异常,认为该种子不符合条件
Console.WriteLine($"检查种子 {seed} 时出现异常: {ex.Message}");
return false;
}
}
private static bool CheckWorldTreeToUnderworld()
{
// 检查世界树的地下通道是否延伸到地狱层
// 世界树的地下通道通常由木板构成
// 地狱层的Y坐标
int underworldY = Terraria.Main.maxTilesY - 200;
// 遍历世界,寻找世界树的地下通道
for (int x = 0; x < Terraria.Main.maxTilesX; x++)
{
for (int y = underworldY; y < Terraria.Main.maxTilesY; y++)
{
Tile tile = Terraria.Main.tile[x, y];
// 检查是否为木板方块
if (tile != null && tile.HasTile && tile.TileType == TileID.Platforms)
{
// 如果发现木板,检查是否是连续的通道
if (IsTreeTrunk(x, y))
{
return true;
}
}
}
}
return false;
}
private static bool IsTreeTrunk(int startX, int startY)
{
// 检查从该点向上是否有一条连续的木板通道
int x = startX;
int y = startY;
// 向上检查最多200个方块
for (int i = 0; i < 200; i++)
{
if (y - i < 0) break;
Tile tile = Terraria.Main.tile[x, y - i];
// 如果遇到不是木板的方块,检查是否是世界树的根部
if (tile == null || !tile.HasTile || tile.TileType != TileID.Platforms)
{
// 检查是否是世界树的根部或树干
// 使用近似的检查方法,检查是否为树木相关的方块
if (tile != null && tile.HasTile && tile.TileType == TileID.Trees)
{
return true; // 找到了世界树
}
break; // 不是连续的木板通道
}
}
return false; // 没有找到连续的通道
}
}
}
附件
最后编辑: