PaulEndri Posted February 6, 2018 Share Posted February 6, 2018 Hey guys, I'm trying to work on a dedicated server client for DST, I've got most of it figured it out but in order for it to have any real features, I need to know what all TheNet and TheWorld actually do. It's my understanding that they're C++ classes, which is why they're not in the source code. So does anyone have even a semi-comprehensive list of what these are? Link to comment Share on other sites More sharing options...
CarlZalph Posted February 6, 2018 Share Posted February 6, 2018 They're userdata objects on the LUA-side that have bindings and proxies on the C-side. Think of them like singletons. TheWorld is the stage in which the map data and world data exists, and has a lot of networked variables. TheNet is a multitool handler for all things networking related. You can read each object's functions list from a snippet I posted at: As for any data about the objects such as internal mechanics on the C-side, I think you'll have to find those out for yourself with a debugger and time. Link to comment Share on other sites More sharing options...
secXsQuared Posted February 6, 2018 Share Posted February 6, 2018 "C:\dst-jobs\workspace\DST_BuildGame_Windows\bin\dontstarve_steam.pdb". I thought it's a good idea to strip the debug information from release. Link to comment Share on other sites More sharing options...
secXsQuared Posted February 6, 2018 Share Posted February 6, 2018 (edited) I think starting with luaL_newmetatable() (lauxlib.h) and lua_register() (lua.h) is the right direction. These two functions are called when registering a C++ class to lua. DST_steam.exe is statically linked to the lua library. (most likely 5.1.5, maybe 5.2.X, "loop in gettable" appeared in DST_steam.exe but only present in lua library 5.2.X and below). It's quite obvious which functions are lua library functions and which are game's. Lua library functions are all _cdecl i.e. caller clears stack and in game mostly _thiscall or _stdcall/_fastcall, both require that callee clears stack. The objective is to find the two lua library calls above and backtrace to "TheWorld" class. Since lua registration requires the name of the object. I did a quick search in dst_steam.exe, there is one definition of char* "TheWorld" and one global reference. ....... push offset aTheworld ; "TheWorld" push 0FFFFD8EEh ; -10002, i.e. LUA_GLOBALSINDEX defined in lua.h push esi ; must be lua_State* call sub_700850 ; lua_getfield(esi, -10002, "TheWorld") ...... After some investigation, sub_700850() is lua_getfield(). This is probably a call to lua_getglobal(L, "TheWorld"), see in lua.h: #define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, (s)) Well.. this is fun. This actually implies that TheWorld is defined in Lua and referenced in C/C++. So I disproved my assumption. After taking a closer look at source scripts.. just as I suspected: in main.lua: global("TheWorld") TheWorld = nil and in world.lua, MakeWorld(): ...... local inst = CreateEntity() assert(TheWorld == nil) TheWorld = inst ......... inst.ismastersim = TheNet:GetIsMasterSimulation() inst.ismastershard = inst.ismastersim and not TheShard:IsSlave() ........ inst.entity:AddTransform() inst.entity:AddMap() inst.entity:AddPathfinder() inst.entity:AddGroundCreep() inst.entity:AddSoundEmitter() .......... Conclusion: TheWorld is indeed defined in Lua scripts not C++/C. Edit: For your question, you probably misunderstood. You can actually find the list of functions under TheWorld. See entityscript.lua since "TheWorld = CreateEntity()". In fact, CreateEntity() is defined in mainfunctions.lua: function CreateEntity() local ent = TheSim:CreateEntity() local guid = ent:GetGUID() local scr = EntityScript(ent) Ents[guid] = scr NumEnts = NumEnts + 1 return scr end The interesting part is TheSim:CreateEntity(). I think TheSim is actually from the C/C++ side because a lot of functions under TheSim is not defined in the script. EDIT2: In DST_steam.exe: ...... push eax push esi call sub_4AB9C0 push offset aThesim ; "TheSim" push 0FFFFD8EEh push esi call sub_700A80 ...... After some diggin, sub_700A80() is lua_setfield(), which confirms that TheSim is actually from the C side. So to find the list of functions under TheWorld, which is created by TheSim, I think you need to look into TheSim:CreateEntity(), which is C code. I recommend you look into sub_4AB9C0() - the function call before lua_setfield(): sub_4AB9C0() ...... mov ecx, off_7CD7AC push ecx push offset aSMissingMetata ; "%s missing metatable" push esi call sub_701270 ..... Looks like one of the execution path complains about missing metatable. Metatable is used to register C++ classes to lua and contains member functions of a class. This is a good starting point. You can backtrace the parameters and see how the metatable is defined and populated, thereby ultimately finding the member functions. But without debugging symbols it's some serious commitment. You basically have to "guess" what each function does. Or you can attach a debugger and break on some member functions to match them with lua function calls. Edited February 6, 2018 by secXsQuared Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now