mirror of
https://github.com/ChronosX88/mta-mono.git
synced 2024-12-23 01:11:48 +00:00
Fixed GetVehicleColor crash (Lua fails if use LUA_MULTRET or more than 10 results in lua_pcall)
This commit is contained in:
parent
2007d6d5ab
commit
d8acda6a8e
@ -93,7 +93,9 @@ MonoObject* CMonoFunctions::Vehicle::GetColor( DWORD pUserData )
|
||||
|
||||
for( int i = 0; i < 4; i++ )
|
||||
{
|
||||
args[ i ] = pMTALib->Color->New( pVehicleColor.GetRGBColor( i ) );
|
||||
MonoObject* pObject = pMTALib->Color->New( pVehicleColor.GetRGBColor( i ) );
|
||||
|
||||
args[ i ] = pObject;
|
||||
}
|
||||
|
||||
return pMTALib->GetClass( "VehicleColor" )->New( args, 4 );
|
||||
|
@ -52,6 +52,10 @@ extern "C"
|
||||
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=nullptr; } }
|
||||
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=nullptr; } }
|
||||
|
||||
#define ASSERT(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
|
||||
|
||||
#define ASSERT_MSG(_Expression, _Message) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(_Message), _CRT_WIDE(__FILE__), __LINE__), 0) )
|
||||
|
||||
#include "extra/Vector2.h"
|
||||
#include "extra/Vector3.h"
|
||||
|
||||
|
@ -26,7 +26,6 @@ extern "C"
|
||||
#include <lua.h>
|
||||
}
|
||||
|
||||
#include "CReferenceCounter.h"
|
||||
#include "CLuaArguments.h"
|
||||
|
||||
typedef vector< CLuaArgument > CLuaArgumentsVector;
|
||||
|
@ -18,7 +18,6 @@
|
||||
|
||||
#include "../StdInc.h"
|
||||
#include "CLuaArguments.h"
|
||||
#include <assert.h>
|
||||
|
||||
CLuaArguments::CLuaArguments( const CLuaArguments& Arguments )
|
||||
{
|
||||
@ -76,15 +75,15 @@ void CLuaArguments::PushArguments( CLuaArguments& Arguments )
|
||||
|
||||
bool CLuaArguments::Call( lua_State* luaVM, const char* szFunction, int iResults, int iErrorFunc ) const
|
||||
{
|
||||
assert( szFunction );
|
||||
assert( luaVM );
|
||||
ASSERT( szFunction );
|
||||
ASSERT( luaVM );
|
||||
|
||||
lua_pushstring( luaVM, szFunction );
|
||||
lua_gettable( luaVM, LUA_GLOBALSINDEX );
|
||||
|
||||
this->PushArguments( luaVM );
|
||||
|
||||
int iret = lua_pcall( luaVM, m_Arguments.size(), iResults, iErrorFunc );
|
||||
int iret = lua_pcall( luaVM, this->m_Arguments.size(), iResults, iErrorFunc );
|
||||
|
||||
return iret != LUA_ERRRUN && iret != LUA_ERRMEM;
|
||||
}
|
||||
|
@ -3058,26 +3058,41 @@ bool CLuaFunctionDefinitions::GetVehicleColor( lua_State* pLuaVM, PVOID pUserDat
|
||||
pLuaArguments.PushUserData( pUserData );
|
||||
pLuaArguments.PushBoolean( true );
|
||||
|
||||
if( pLuaArguments.Call( pLuaVM, "getVehicleColor", 12 ) )
|
||||
int iLuaTop = lua_gettop( pLuaVM );
|
||||
|
||||
if( pLuaArguments.Call( pLuaVM, "getVehicleColor", 9 ) )
|
||||
{
|
||||
SColor
|
||||
color1, color2, color3, color4;
|
||||
SColor color1, color2, color3, color4;
|
||||
|
||||
color1.R = CLuaArgument( pLuaVM, -12 ).GetNumber< unsigned char >();
|
||||
color1.G = CLuaArgument( pLuaVM, -11 ).GetNumber< unsigned char >();
|
||||
color1.B = CLuaArgument( pLuaVM, -10 ).GetNumber< unsigned char >();
|
||||
int iResults = lua_gettop( pLuaVM ) - iLuaTop;
|
||||
|
||||
color2.R = CLuaArgument( pLuaVM, -9 ).GetNumber< unsigned char >();
|
||||
color2.G = CLuaArgument( pLuaVM, -8 ).GetNumber< unsigned char >();
|
||||
color2.B = CLuaArgument( pLuaVM, -7 ).GetNumber< unsigned char >();
|
||||
for( int iArgument = -iResults, i = 1; iArgument < 0; iArgument++, i++ )
|
||||
{
|
||||
ASSERT( lua_type( pLuaVM, iArgument ) == LUA_TNUMBER );
|
||||
|
||||
color3.R = CLuaArgument( pLuaVM, -6 ).GetNumber< unsigned char >();
|
||||
color3.G = CLuaArgument( pLuaVM, -5 ).GetNumber< unsigned char >();
|
||||
color3.B = CLuaArgument( pLuaVM, -4 ).GetNumber< unsigned char >();
|
||||
unsigned char ucValue = static_cast< unsigned char >( lua_tonumber( pLuaVM, iArgument ) );
|
||||
|
||||
color4.R = CLuaArgument( pLuaVM, -3 ).GetNumber< unsigned char >();
|
||||
color4.G = CLuaArgument( pLuaVM, -2 ).GetNumber< unsigned char >();
|
||||
color4.B = CLuaArgument( pLuaVM, -1 ).GetNumber< unsigned char >();
|
||||
switch( i )
|
||||
{
|
||||
case 1: color1.R = ucValue; break;
|
||||
case 2: color1.G = ucValue; break;
|
||||
case 3: color1.B = ucValue; break;
|
||||
|
||||
case 4: color2.R = ucValue; break;
|
||||
case 5: color2.G = ucValue; break;
|
||||
case 6: color2.B = ucValue; break;
|
||||
|
||||
case 7: color3.R = ucValue; break;
|
||||
case 8: color3.G = ucValue; break;
|
||||
case 9: color3.B = ucValue; break;
|
||||
|
||||
case 10: color4.R = ucValue; break;
|
||||
case 11: color4.G = ucValue; break;
|
||||
case 12: color4.B = ucValue; break;
|
||||
}
|
||||
}
|
||||
|
||||
color1.A = color2.A = color3.A = color4.A = 255;
|
||||
|
||||
color.SetRGBColors( color1, color2, color3, color4 );
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user