SOL / Lua + C++ 无法访问字段

huangapple go评论88阅读模式
英文:

SOL / Lua + C++ Cannot access field

问题

Sol & C++ embedding, cannot access usertype field

To start off with, I am pretty new to sol, however this is my implementation so far

  1. namespace lua
  2. {
  3. namespace lua_client
  4. {
  5. valve::ClientClass* GetAllClasses( )
  6. {
  7. auto client_class = csgo::base_client->GetAllClasses( );
  8. if ( !client_class )
  9. return nullptr;
  10. return client_class;
  11. }
  12. valve::ClientClass* GetClientClass( )
  13. {
  14. auto client_class = csgo::base_client->GetAllClasses( );
  15. while ( client_class )
  16. {
  17. if ( !strcmp( client_class->m_pNetworkName, "CBaseEntity" ) )
  18. return client_class;
  19. client_class = client_class->m_pNext;
  20. }
  21. return nullptr;
  22. }
  23. void init( )
  24. {
  25. // setup our usertype(s)
  26. auto recv_prop_usertype = sol_state.new_usertype< valve::RecvProp >( "RecvProp", sol::constructors< valve::RecvProp( ) >( ) );
  27. recv_prop_usertype.set( "m_pVarName", sol::readonly( &valve::RecvProp::m_pVarName ) );
  28. recv_prop_usertype.set( "m_RecvType", sol::readonly( &valve::RecvProp::m_RecvType ) );
  29. recv_prop_usertype.set( "m_Flags", sol::readonly( &valve::RecvProp::m_Flags ) );
  30. recv_prop_usertype.set( "m_StringBufferSize", sol::readonly( &valve::RecvProp::m_StringBufferSize ) );
  31. recv_prop_usertype.set( "m_bInsideArray", sol::readonly( &valve::RecvProp::m_bInsideArray ) );
  32. recv_prop_usertype.set( "m_pExtraData", sol::readonly( &valve::RecvProp::m_pExtraData ) );
  33. recv_prop_usertype.set( "m_pArrayProp", sol::readonly( &valve::RecvProp::m_pArrayProp ) );
  34. recv_prop_usertype.set( "m_pDataTable", sol::readonly( &valve::RecvProp::m_pDataTable ) );
  35. recv_prop_usertype.set( "m_Offset", sol::readonly( &valve::RecvProp::m_Offset ) );
  36. recv_prop_usertype.set( "m_ElementStride", sol::readonly( &valve::RecvProp::m_ElementStride ) );
  37. recv_prop_usertype.set( "m_nElements", sol::readonly( &valve::RecvProp::m_nElements ) );
  38. recv_prop_usertype.set( "m_pParentArrayPropName", sol::readonly( &valve::RecvProp::m_pParentArrayPropName ) );
  39. auto recv_table_usertype = sol_state.new_usertype< valve::RecvTable >( "RecvTable", sol::constructors< valve::RecvTable( ) >( ) );
  40. recv_table_usertype.set( "m_pProps", sol::readonly( &valve::RecvTable::m_pProps ) );
  41. recv_table_usertype.set( "m_nProps", sol::readonly( &valve::RecvTable::m_nProps ) );
  42. recv_table_usertype.set( "m_pNetTableName", sol::readonly( &valve::RecvTable::m_pNetTableName ) );
  43. auto client_class_usertype = sol_state.new_usertype< valve::ClientClass >( "ClientClass" );
  44. client_class_usertype.set( "m_pNetworkName", sol::readonly( &valve::ClientClass::m_pNetworkName ) );
  45. client_class_usertype.set( "m_pRecvTable", sol::readonly( &valve::ClientClass::m_pRecvTable ) );
  46. client_class_usertype.set( "m_pNext", sol::readonly( &valve::ClientClass::m_pNext ) );
  47. client_class_usertype.set( "m_ClassID", sol::readonly( &valve::ClientClass::m_ClassID ) );
  48. // setup our table(s)
  49. auto client_table = sol_state.create_table( "client" );
  50. client_table[ "GetAllClasses" ] = GetAllClasses;
  51. client_table[ "GetClientClass" ] = GetClientClass;
  52. }
  53. }
  54. }

Attempting to access it as so

  1. -- example script to dump netvars
  2. local client_class = client.GetAllClasses( )
  3. -- is clientclass still valid?
  4. while client_class do
  5. local table = client_class.m_pRecvTable
  6. -- do we have a valid table?
  7. if table ~= nil then
  8. print( "" .. table.m_ClassID )
  9. end
  10. client_class = client_class.m_pNext
  11. end

This is the following error produced:
[sol2] An error occurred and has been passed to an error handler: sol: runtime error: test.lua:11: attempt to concatenate a nil value (field 'm_ClassID')
stack traceback:
test.lua:11: in main chun

Calling the same function in c++ side works fine

Any ideas? Thank you

Using lua 5.4 & sol2

英文:

Sol & C++ embedding, cannot access usertype field

To start off with, I am pretty new to sol, however this is my implementation so far

  1. namespace lua
  2. {
  3. namespace lua_client
  4. {
  5. valve::ClientClass* GetAllClasses( )
  6. {
  7. auto client_class = csgo::base_client-&gt;GetAllClasses( );
  8. if ( !client_class )
  9. return nullptr;
  10. return client_class;
  11. }
  12. valve::ClientClass* GetClientClass( )
  13. {
  14. auto client_class = csgo::base_client-&gt;GetAllClasses( );
  15. while ( client_class )
  16. {
  17. if ( !strcmp( client_class-&gt;m_pNetworkName, &quot;CBaseEntity&quot; ) )
  18. return client_class;
  19. client_class = client_class-&gt;m_pNext;
  20. }
  21. return nullptr;
  22. }
  23. void init( )
  24. {
  25. // setup our usertype(s)
  26. auto recv_prop_usertype = sol_state.new_usertype&lt; valve::RecvProp &gt;( &quot;RecvProp&quot;, sol::constructors&lt; valve::RecvProp( ) &gt;( ) );
  27. recv_prop_usertype.set( &quot;m_pVarName&quot;, sol::readonly( &amp;valve::RecvProp::m_pVarName ) );
  28. recv_prop_usertype.set( &quot;m_RecvType&quot;, sol::readonly( &amp;valve::RecvProp::m_RecvType ) );
  29. recv_prop_usertype.set( &quot;m_Flags&quot;, sol::readonly( &amp;valve::RecvProp::m_Flags ) );
  30. recv_prop_usertype.set( &quot;m_StringBufferSize&quot;, sol::readonly( &amp;valve::RecvProp::m_StringBufferSize ) );
  31. recv_prop_usertype.set( &quot;m_bInsideArray&quot;, sol::readonly( &amp;valve::RecvProp::m_bInsideArray ) );
  32. recv_prop_usertype.set( &quot;m_pExtraData&quot;, sol::readonly( &amp;valve::RecvProp::m_pExtraData ) );
  33. recv_prop_usertype.set( &quot;m_pArrayProp&quot;, sol::readonly( &amp;valve::RecvProp::m_pArrayProp ) );
  34. recv_prop_usertype.set( &quot;m_pDataTable&quot;, sol::readonly( &amp;valve::RecvProp::m_pDataTable ) );
  35. recv_prop_usertype.set( &quot;m_Offset&quot;, sol::readonly( &amp;valve::RecvProp::m_Offset ) );
  36. recv_prop_usertype.set( &quot;m_ElementStride&quot;, sol::readonly( &amp;valve::RecvProp::m_ElementStride ) );
  37. recv_prop_usertype.set( &quot;m_nElements&quot;, sol::readonly( &amp;valve::RecvProp::m_nElements ) );
  38. recv_prop_usertype.set( &quot;m_pParentArrayPropName&quot;, sol::readonly( &amp;valve::RecvProp::m_pParentArrayPropName ) );
  39. auto recv_table_usertype = sol_state.new_usertype&lt; valve::RecvTable &gt;( &quot;RecvTable&quot;, sol::constructors&lt; valve::RecvTable( ) &gt;( ) );
  40. recv_table_usertype.set( &quot;m_pProps&quot;, sol::readonly( &amp;valve::RecvTable::m_pProps ) ); // BUG!!!: attempt to index a nil value (local &#39;prop&#39;)
  41. recv_table_usertype.set( &quot;m_nProps&quot;, sol::readonly( &amp;valve::RecvTable::m_nProps ) );
  42. recv_table_usertype.set( &quot;m_pNetTableName&quot;, sol::readonly( &amp;valve::RecvTable::m_pNetTableName ) );
  43. auto client_class_usertype = sol_state.new_usertype&lt; valve::ClientClass &gt;( &quot;ClientClass&quot; );
  44. client_class_usertype.set( &quot;m_pNetworkName&quot;, sol::readonly( &amp;valve::ClientClass::m_pNetworkName ) );
  45. client_class_usertype.set( &quot;m_pRecvTable&quot;, sol::readonly( &amp;valve::ClientClass::m_pRecvTable ) );
  46. client_class_usertype.set( &quot;m_pNext&quot;, sol::readonly( &amp;valve::ClientClass::m_pNext ) );
  47. client_class_usertype.set( &quot;m_ClassID&quot;, sol::readonly( &amp;valve::ClientClass::m_ClassID ) );
  48. // setup our table(s)
  49. auto client_table = sol_state.create_table( &quot;client&quot; );
  50. client_table[ &quot;GetAllClasses&quot; ] = GetAllClasses;
  51. client_table[ &quot;GetClientClass&quot; ] = GetClientClass;
  52. }
  53. }
  54. }

Attempting to access it as so

  1. -- example script to dump netvars
  2. local client_class = client.GetAllClasses( )
  3. -- is clientclass still valid?
  4. while client_class do
  5. local table = client_class.m_pRecvTable
  6. -- do we have a valid table?
  7. if table ~= nil then
  8. print( &quot;&quot; .. table.m_ClassID )
  9. end
  10. client_class = client_class.m_pNext
  11. end

This is the following error produced:
[sol2] An error occurred and has been passed to an error handler: sol: runtime error: test.lua:11: attempt to concatenate a nil value (field 'm_ClassID')
stack traceback:
test.lua:11: in main chun

Calling the same function in c++ side works fine

Any ideas? Thank you

Using lua 5.4 & sol2

答案1

得分: 0

以下是翻译好的部分:

"Here's the solution. I wrote the script in haste and I was attempting to access m_ClassID from table, which doesn't have that member.

Switching table.m_ClassID to client_class.m_ClassID did the trick

Thanks anyways everyone."

英文:

Here's the solution. I wrote the script in haste and I was attempting to access m_ClassID from table, which doesn't have that member.

Switching table.m_ClassID to client_class.m_ClassID did the trick

Thanks anyways everyone.

huangapple
  • 本文由 发表于 2023年3月21日 02:44:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/75794156.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定