Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Failed to build in VS2022. #13

Closed
ZombiesYard opened this issue Oct 18, 2024 · 5 comments
Closed

Failed to build in VS2022. #13

ZombiesYard opened this issue Oct 18, 2024 · 5 comments

Comments

@ZombiesYard
Copy link
Contributor

Hi D7ry,

Could you please specify the exact version of CommonLibSSE-NG you used for the build or mention which fork it is from?

Using the CommonLibSSE-NG linked in this project's README causes compiler errors, while using the version maintained by alandtse https://github.com/alandtse/CommonLibVR/tree/ng results in completely different errors, even though I haven't made any changes to the Wheeler code at all.

I have noticed that different versions of CommonLibSSE-NG handle things quite differently, which might be the reason for the different errors.

Thank you very much for your help.

@D7ry
Copy link
Owner

D7ry commented Oct 18, 2024

hi,或许能看一下error output?

@ZombiesYard
Copy link
Contributor Author

你好,我已经尝试构建并生了dll文件,并且游戏能加载到特定存档,

但是同时我也做了很多清理工作,
深入到repo里的代码,我发现很多类成员似乎是你自己实现的,例如:

RE:ExtraDataList::InitExtraDataList(a_extraList),这一行位于UniquelDHandler.cpp底部。

这里的InitExtraDataList我基本上找遍了所有能获取到的CommonLibSSE或NG版本,都没有正式的实现,我根据代码里上下文手动的内存分配,猜了一下InitExtraDataList的可能原型以及定义,并把C-Lib的代码里进行了修改,但是是不成功的,而且我觉得这样改也挺悬的。直接对C-Lib修改可能会遇到预期以外的问题(比如我测试下来游戏能加载到正常运行wheeler存档,开始新游戏会卡在RE::ExtraDataList::InitExtraDataList(a_extraList);,因为我的实现是在C-Lib里判断a_extraList是不是nullptr,如果不是就分配a_extraList->_extraData.GetData() = nullptr;)很明显我的猜测是错的,因为我没做过老滚的skse编程:p,很多东西例如你写的NiMemAlloc_1400F6B40里的RELOCATION_ID到底是如何找到的,C-Lib的Offset.h里没有这些数据。还有类似同文件下面的auto xID = new RE::ExtraUniqueID(0x14, nextID);,我只能通过0x14来猜测这是通过玩家角色加上地址偏移来实现内存设置。

而且由于我现在能找到的C-Lib可能有一些升级,一些变量名也更改,例如:
RE::PlaySoundRE(Config::Sound::SD_ENTRYSWITCH); 位于Wheel.cpp line64:
PlaySoundRE方法在C-Lib NG 3.6.0里是PlaySound,更改以后我测试声音相关功能没有问题

GetInventoryItemCount变为了GetItemCount等等

此外,我注意到你似乎也是自己实现的GetObject__(),因为这个方法在C-lib里应该是GetObject(),但是GetObject()会和Windows系统的头文件有冲突,我设法解决了这个问题,暂时还没测试相关功能是否正常

最后就是宏定义部分,你有很多以“INFO”开始的用于输出日志的行,我本地部署下来spdlog找不到INFO的宏定义在哪,于是只能改成spdlog::info...这种形式,同样的情况发生在TextureManager.cpp。“ASSERT”同样失去了宏定义,我自己添加了#define ASSERT(expr) assert(expr),但是让轮盘贴图功能基本上失效了

以上就是一些我暂时记录下的问题,感谢您的任何帮助,因为这基本上是我的第一个CMake项目(我以前的项目基本上是C用makefile比较多),并且我对C++也不是很熟练,以及老滚skse和C-Lib的一些编程范式也不熟悉.

可能有些是很蠢的问题,望海涵

@D7ry
Copy link
Owner

D7ry commented Oct 19, 2024

InitExtraDataList() 请参照这个, 这是我一年多前做的修改了,印象中应该是用ida挖出来的, NiMemAlloc也是,当时参照了原版游戏init extradatalist的方式。

PlaySoundRE记得当时也是一个朋友帮忙挖出来的。

GetObject()重命名确实是因为和windows header有冲突。

轮盘贴图功能这个有很多可能的地方会导致这个bug... 我建议新建一个窗口用ImGui::Image 来debug。我不觉得是INFO 和 ASSERT 导致的问题,但是INFO和ASSERT 我当时确实是这么定义的。

@ZombiesYard
Copy link
Contributor Author

hi,我修复了在库存中使用完自制药水后打开ui的崩溃问题,以及一些其他可能的潜在崩溃,并对代码做了一些清理,在遵循开源协议的情况下我希望将修复后的解决方案上传到N网,我会标明代码的来源,源mod以及所有有必要的信息

@D7ry
Copy link
Owner

D7ry commented Oct 21, 2024

没问题!也欢迎你submit一个pr进现有的repo。

@D7ry D7ry closed this as completed Jan 2, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants