Register for your free account! | Forgot your password?

Go Back   elitepvpers > MMORPGs > 12Sky2
You last visited: Today at 01:00

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



looking who can make new Suit

Discussion on looking who can make new Suit within the 12Sky2 forum part of the MMORPGs category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: May 2015
Posts: 4
Received Thanks: 0
Lightbulb looking who can make new Suit

hello , Anyone here know who can make new suit? for twelvesky 2.8?
jr1 is offline  
Old 10/30/2022, 16:33   #2
 
elite*gold: 0
Join Date: Nov 2011
Posts: 129
Received Thanks: 174
make new suit = Create a new 3D model?
make new suit = Add an existing suit from version 2.8?
lnwnuyhodd is offline  
Old 10/30/2022, 23:45   #3
 
migisenpai's Avatar
 
elite*gold: 0
Join Date: Jan 2019
Posts: 60
Received Thanks: 22
Quote:
Originally Posted by lnwnuyhodd View Post
make new suit = Create a new 3D model?
make new suit = Add an existing suit from version 2.8?
They are using 2.5 origin. Not 2.8 gxcw. They mistake 2.5 origin for "2.8"

Anyway. Methods to "create" suit is

1. Replace existing costume sobject with other costume sobject from different client. (Chinese 2.8 gxcw costume should also work for 2.5 cli)
2. Hook client avatar object draw, gimage init
migisenpai is offline  
Old 10/31/2022, 03:06   #4
 
elite*gold: 0
Join Date: Nov 2011
Posts: 129
Received Thanks: 174
Code:
if( !(make new suit = Add an existing suit from version 2.8) )
  return;
You must have an understanding of IDA or other debug programs and C++ skills to do this.
if you understand it it was easy.

1.hook right click item function
Code:
class INVENUI
{
public:
	INVENUI(){}
	static BOOL INVENUI::AskUseItem(int mX, int mY)
	{
		//Hook and Call Original function
		//BOOL INVENUI::AskUseItem(INVENUI* This, int mX, int mY);
		//INVENUI* This = 0x??????;
		BOOL res = ori_INVENUI_AskUseItem(This, mX, mY);
		if( !res )
			return 0;
		
		ITEM_INFO *a1 = ITEM::Search(mMYINFO[0].mUseAvatar.aInventory[tPage][tIndex][0]);
		if ( !a1 )
			return 1;

		int k;
	  
		switch( a1->iIndex )
		{
		case new_costume_id:
			if (a1->iIndex % 3 != (mMYINFO[0].mUseAvatar.aPreviousTribe + 1) % 3)
			{
				BASICUI::Insert1(1521);
				return 1;
			}
			
			for (k = 0; k < 10; ++k)
			{
				if (a1->iIndex == mMYINFO[0].mUseAvatar.aCostume[k])
				{
					BASICUI::Insert1(1514);
					return 1;
				}
				if (!mMYINFO[0].mUseAvatar.aCostume[k])
					break;
			}
			if (k == 10)
			{
				BASICUI::Insert1(1516);
				return 1;
			}
	
			GSOUND::Play(&mGDATA[0].mSOUND_05[2], 0, 100, 1);
			mMYINFO[0].mUseInventoryPage = tPage;
			mMYINFO[0].mUseInventoryIndex = tIndex;
			CBOXUI::Set(7, 1522, aEmptyChar);
	
			break;
		}

		return 1;
	}
};
1.1.add gimage/002 for item image

2.hook W_USE_INVENTORY_ITEM_RECV
Code:
#define MAX_NETWORK_BUFFER_SIZE										200000
class NETWORK
{
public:
	BOOL mCheckInitForNetwork;
	char mPacketEncryptionValue[4];
	BOOL mCheckConnectState;
	SOCKET mSocket;
	SOCKADDR_IN mAddress;
	BYTE mBuffer[MAX_NETWORK_BUFFER_SIZE];
	int mBufferSize;
};

NETWORK* mNETWORK = 0x?????;

#define SetInv( tPage, tIndex, v0, v1, v2, v3, v4, v5 ) \
{ \
    mMYINFO[0].mUseAvatar.aInventory[tPage][tIndex][0] = v0; \
    mMYINFO[0].mUseAvatar.aInventory[tPage][tIndex][1] = v1; \
    mMYINFO[0].mUseAvatar.aInventory[tPage][tIndex][2] = v2; \
    mMYINFO[0].mUseAvatar.aInventory[tPage][tIndex][3] = v3; \
    mMYINFO[0].mUseAvatar.aInventory[tPage][tIndex][4] = v4; \
    mMYINFO[0].mUseAvatar.aInventory[tPage][tIndex][5] = v5; \
}
#define SetInvSock( tPage, tIndex, v0, v1, v2 )  \
{ \
    mMYINFO[0].mUseAvatar.aInvenSocket[tPage][tIndex][0] = v0; \
    mMYINFO[0].mUseAvatar.aInvenSocket[tPage][tIndex][1] = v1; \
    mMYINFO[0].mUseAvatar.aInvenSocket[tPage][tIndex][2] = v2; \
}
#define ClearInv( tPage, tIndex )  \
{ \
    SetInv( tPage, tIndex, 0, 0, 0, 0, 0, 0 ); \
    SetInvSock( tPage, tIndex, 0, 0, 0 ); \
}

void W_USE_INVENTORY_ITEM_RECV()
{
    int tResult, tPage, tIndex, tValue;

    CopyMemory(&tResult, &mNETWORK[0].mBuffer[1], 4);
    CopyMemory(&tPage, &mNETWORK[0].mBuffer[5], 4);
    CopyMemory(&tIndex, &mNETWORK[0].mBuffer[9], 4);
    CopyMemory(&tValue, &mNETWORK[0].mBuffer[13], 4);  

    ITEM_INFO* a1 = ITEM::Search(mMYINFO[0].mUseAvatar.aInventory[tPage % 100][tIndex % 100][0]);
	if ( !a1 )
		return;
	switch( a1->iIndex )
	{
	case new_costume_id:    
		if (tResult)
		{
			BASICUI::Insert1(1869);
		}
		else
		{
			mMYINFO[0].mUseAvatar.aCostume[tValue] = tITEM_INFO->iIndex;
			ClearInv( tPage, tIndex );
			GSOUND::Play(&mGDATA[0].mSOUND_05[296], 0, 100, 1);
			BASICUI::Insert1(1517);
		}
		return;
	}

	//Hook and call Original function
	//void W_USE_INVENTORY_ITEM_RECV();
	ori_W_USE_INVENTORY_ITEM_RECV(); 
}
3.create GSOBJECT/GMOTION class
Code:
namespace TW2AddIn
{

class SKIN2_FOR_GXD
{
public:
	BYTE data[0x378];
};

class SOBJECT2_FOR_GXD
{
public:
	BOOL mCheckValidState;
	int mSkinNum;
	SKIN2_FOR_GXD *mSkin;
  
	SOBJECT2_FOR_GXD()
	{
		Init();
	}
	void Init()
	{
		this->mCheckValidState = 0;
		this->mSkinNum = 0;
		this->mSkin = 0;
	}
	void Free()
	{
		//Hook and Call Original function
		//void TW2AddIn::SOBJECT2_FOR_GXD::Free(TW2AddIn::SOBJECT2_FOR_GXD* This);
		ori_TW2AddIn_SOBJECT2_FOR_GXD_Free(this);
	}
};


class MOTION2_FOR_GXD
{
public:
	BOOL mCheckValidState;
	int mFrameNum;
	int mBoneNum;
	D3DXMATRIX *mKeyMatrix;
	
	MOTION2_FOR_GXD()
	{
		Init();
	}
	void Init()
	{
	    this->mCheckValidState = 0;
		this->mKeyMatrix = 0;
	}
	void Free()
	{
		//Hook and Call Original function
		//void TW2AddIn::MOTION2::FOR_GXD::Free(MOTION2_FOR_GXD* This);
		ori_TW2AddIn_MOTION2_FOR_GXD_Free(this);
	}
};


}


class GMOTION
{
public:
	BOOL mCheckFrameNum;
	char mFileName[100];
	int mFrameNum;
	float mLastUsedTime;
	CRITICAL_SECTION mLock;
	TW2AddIn::MOTION2_FOR_GXD mDATA;
	BOOL mCheckValidState;
};


class GSOBJECT
{
public:
	BOOL mCheckValidState;
	char mFileName[100];
	TW2AddIn::SOBJECT2_FOR_GXD mDATA;
	float mLastUsedTime;
	CRITICAL_SECTION mCritical;
  
	GSOBJECT()
	{
		Init();
		InitializeCriticalSection(&this->mCritical);
	}
	void Init()
	{
		this->mCheckValidState = FALSE;
		this->mFileName[0] = 0;
		this->mDATA.mCheckValidState = FALSE;
	}
	void Free()
	{
	    EnterCriticalSection(&this->mCritical);
		this->mCheckValidState = 0;
		this->mDATA.Free();
		LeaveCriticalSection(&this->mCritical);
	}
	
	void DisplaySObject(int tDrawSort, float pFrame, float *tL, float tYAngle, float tHeightForCulling, GMOTION *tMOTION, BOOL tLoadSort)
	{
		//Hook and Call Original function
		//void GSOBJECT::DisplaySObject(GSOBJECT* This, int tDrawSort, float pFrame, float *tL, float tYAngle, float tHeightForCulling, GMOTION *tMOTION, BOOL tLoadSort);
		ori_GSOBJECT_DisplaySObject(this, tDrawSort, pFrame, tL, tYAngle, tHeightForCulling, tMOTION, tLoadSort);
	}
};


//initialize new object
GSOBJECT new_gsobject;

//init mFileName
sprintf( new_gsobject.mFileName, "%s", "G03_GDATA\\D04_GSOBJECT\\010\\A%03d001%03d.SOBJECT", 1, 28 );
4.Use GSOBJECT and Hook AVATAR_OBJECT:: Draw
Code:
class UTIL
{
public:
	static BOOL CheckPossibleDrawMeWithCamera(float tCoord[3], float tLength)
	{
		//Hook and Call Original function
		BOOL res = ori_UTIL_CheckPossibleDrawMeWithCamera(  );
		return res;
		
		//float v3; // [esp+8h] [ebp-Ch]
		//float v4; // [esp+10h] [ebp-4h]
		//v4 = (mGXD[0].mCameraEye.z - tCoord[2]) * (mGXD[0].mCameraEye.z - tCoord[2]) + (mGXD[0].mCameraEye.y - (tLength * 0.5 + tCoord[1])) * (mGXD[0].mCameraEye.y - (tLength * 0.5 + tCoord[1])) + (mGXD[0].mCameraEye.x - *tCoord) * (mGXD[0].mCameraEye.x - *tCoord);
		//v3 = sqrt(v4);
		//return v3 >= 10.0f;
	}
}

class GDATA
{
public:
	static GMOTION* ReturnCharacterMotion(int aPreviousTribe, int aGender, int aType, int aSort, int aLevel1, int aLevel2, int aAnimalNumber)
	{
		//Hook and Call Original function
		GMOTION* res = ori_GDATA_ReturnCharacterMotion(aPreviousTribe, aGender, aType, aSort, aLevel1, aLevel2, aAnimalNumber);
		return res;
	}
};

class AVATAR_OBJECT
{
public:

	BOOL mCheckValidState;
	DWORD mServerIndex;
	DWORD mUniqueNumber;
	float mUpdateTime;
	float mUpdateTimeForRageTime;
	float mUpdateTime3;
	OBJECT_FOR_AVATAR mDATA;	
	BYTE data[1];//other unknow data
	
	//find and hook this function
	static void Draw( AVATAR_OBJECT* This, int tDrawSort, int tObjIndex, float dTime )
	{
		BOOL isLocalClient = tObjIndex == 0;
		GMOTION *tMOTION;
		
		if ( !This->mCheckValidState || tDrawSort < 1 || tDrawSort > 2 || !This->mDATA.aVisibleState || !UTIL::CheckPossibleDrawMeWithCamera(This->mDATA.aAction.aLocation, 20.0f) )
			return;
		
		int tAnimalNumber = 0;
		if ( !This->mDATA.aAnimalAbsorbState )
			tAnimalNumber = This->mDATA.aAnimalNumber;			
		tMOTION = GDATA::ReturnCharacterMotion(This->mDATA.aPreviousTribe, This->mDATA.aGender, This->mDATA.aAction.aType, This->mDATA.aAction.aSort, This->mDATA.aLevel1, This->mDATA.aLevel2, tAnimalNumber);
				
		if( This->mDATA.aCostume == new_costume_id ) {
			new_gsobject.DisplaySObject( tDrawSort, This->mDATA.aAction.aFrame, This->mDATA.aAction.aLocation, This->mDATA.aAction.aFront, 20.0f, tMOTION, isLocalClient );
		}
	}
};
Code:
on exit dll function
void dll_exit()
{
	new_gsobject.Free();
}
lnwnuyhodd is offline  
Thanks
1 User
Old 10/31/2022, 10:16   #5
 
elite*gold: 0
Join Date: Apr 2020
Posts: 243
Received Thanks: 51
Other functions

@ can u pls say something about existing other systems. Like bottle system. Why is that slipping rows on every log in? Bottle1 878 price1 30 bottle2 879 price2 30 for example in game but after relogin it shows bottle and price1 is 0 but bottle+price2 and 3 gets new value.
zahter55 is offline  
Old 10/31/2022, 10:28   #6
 
elite*gold: 0
Join Date: Feb 2017
Posts: 73
Received Thanks: 48
Quote:
Originally Posted by lnwnuyhodd View Post
Code:
if( !(make new suit = Add an existing suit from version 2.8) )
  return;
You must have an understanding of IDA or other debug programs and C++ skills to do this.
if you understand it it was easy.

1.hook right click item function
Code:
class INVENUI
{
public:
	INVENUI(){}
	static BOOL INVENUI::AskUseItem(int mX, int mY)
	{
		//Hook and Call Original function
		//BOOL INVENUI::AskUseItem(INVENUI* This, int mX, int mY);
		//INVENUI* This = 0x??????;
		BOOL res = ori_INVENUI_AskUseItem(This, mX, mY);
		if( !res )
			return 0;
		
		ITEM_INFO *a1 = ITEM::Search(mMYINFO[0].mUseAvatar.aInventory[tPage][tIndex][0]);
		if ( !a1 )
			return 1;

		int k;
	  
		switch( a1->iIndex )
		{
		case new_costume_id:
			if (a1->iIndex % 3 != (mMYINFO[0].mUseAvatar.aPreviousTribe + 1) % 3)
			{
				BASICUI::Insert1(1521);
				return 1;
			}
			
			for (k = 0; k < 10; ++k)
			{
				if (a1->iIndex == mMYINFO[0].mUseAvatar.aCostume[k])
				{
					BASICUI::Insert1(1514);
					return 1;
				}
				if (!mMYINFO[0].mUseAvatar.aCostume[k])
					break;
			}
			if (k == 10)
			{
				BASICUI::Insert1(1516);
				return 1;
			}
	
			GSOUND::Play(&mGDATA[0].mSOUND_05[2], 0, 100, 1);
			mMYINFO[0].mUseInventoryPage = tPage;
			mMYINFO[0].mUseInventoryIndex = tIndex;
			CBOXUI::Set(7, 1522, aEmptyChar);
	
			break;
		}

		return 1;
	}
};
1.1.add gimage/002 for item image

2.hook W_USE_INVENTORY_ITEM_RECV
Code:
#define MAX_NETWORK_BUFFER_SIZE										200000
class NETWORK
{
public:
	BOOL mCheckInitForNetwork;
	char mPacketEncryptionValue[4];
	BOOL mCheckConnectState;
	SOCKET mSocket;
	SOCKADDR_IN mAddress;
	BYTE mBuffer[MAX_NETWORK_BUFFER_SIZE];
	int mBufferSize;
};

NETWORK* mNETWORK = 0x?????;

#define SetInv( tPage, tIndex, v0, v1, v2, v3, v4, v5 ) \
{ \
    mMYINFO[0].mUseAvatar.aInventory[tPage][tIndex][0] = v0; \
    mMYINFO[0].mUseAvatar.aInventory[tPage][tIndex][1] = v1; \
    mMYINFO[0].mUseAvatar.aInventory[tPage][tIndex][2] = v2; \
    mMYINFO[0].mUseAvatar.aInventory[tPage][tIndex][3] = v3; \
    mMYINFO[0].mUseAvatar.aInventory[tPage][tIndex][4] = v4; \
    mMYINFO[0].mUseAvatar.aInventory[tPage][tIndex][5] = v5; \
}
#define SetInvSock( tPage, tIndex, v0, v1, v2 )  \
{ \
    mMYINFO[0].mUseAvatar.aInvenSocket[tPage][tIndex][0] = v0; \
    mMYINFO[0].mUseAvatar.aInvenSocket[tPage][tIndex][1] = v1; \
    mMYINFO[0].mUseAvatar.aInvenSocket[tPage][tIndex][2] = v2; \
}
#define ClearInv( tPage, tIndex )  \
{ \
    SetInv( tPage, tIndex, 0, 0, 0, 0, 0, 0 ); \
    SetInvSock( tPage, tIndex, 0, 0, 0 ); \
}

void W_USE_INVENTORY_ITEM_RECV()
{
    int tResult, tPage, tIndex, tValue;

    CopyMemory(&tResult, &mNETWORK[0].mBuffer[1], 4);
    CopyMemory(&tPage, &mNETWORK[0].mBuffer[5], 4);
    CopyMemory(&tIndex, &mNETWORK[0].mBuffer[9], 4);
    CopyMemory(&tValue, &mNETWORK[0].mBuffer[13], 4);  

    ITEM_INFO* a1 = ITEM::Search(mMYINFO[0].mUseAvatar.aInventory[tPage % 100][tIndex % 100][0]);
	if ( !a1 )
		return;
	switch( a1->iIndex )
	{
	case new_costume_id:    
		if (tResult)
		{
			BASICUI::Insert1(1869);
		}
		else
		{
			mMYINFO[0].mUseAvatar.aCostume[tValue] = tITEM_INFO->iIndex;
			ClearInv( tPage, tIndex );
			GSOUND::Play(&mGDATA[0].mSOUND_05[296], 0, 100, 1);
			BASICUI::Insert1(1517);
		}
		return;
	}

	//Hook and call Original function
	//void W_USE_INVENTORY_ITEM_RECV();
	ori_W_USE_INVENTORY_ITEM_RECV(); 
}
3.create GSOBJECT/GMOTION class
Code:
namespace TW2AddIn
{

class SKIN2_FOR_GXD
{
public:
	BYTE data[0x378];
};

class SOBJECT2_FOR_GXD
{
public:
	BOOL mCheckValidState;
	int mSkinNum;
	SKIN2_FOR_GXD *mSkin;
  
	SOBJECT2_FOR_GXD()
	{
		Init();
	}
	void Init()
	{
		this->mCheckValidState = 0;
		this->mSkinNum = 0;
		this->mSkin = 0;
	}
	void Free()
	{
		//Hook and Call Original function
		//void TW2AddIn::SOBJECT2_FOR_GXD::Free(TW2AddIn::SOBJECT2_FOR_GXD* This);
		ori_TW2AddIn_SOBJECT2_FOR_GXD_Free(this);
	}
};


class MOTION2_FOR_GXD
{
public:
	BOOL mCheckValidState;
	int mFrameNum;
	int mBoneNum;
	D3DXMATRIX *mKeyMatrix;
	
	MOTION2_FOR_GXD()
	{
		Init();
	}
	void Init()
	{
	    this->mCheckValidState = 0;
		this->mKeyMatrix = 0;
	}
	void Free()
	{
		//Hook and Call Original function
		//void TW2AddIn::MOTION2::FOR_GXD::Free(MOTION2_FOR_GXD* This);
		ori_TW2AddIn_MOTION2_FOR_GXD_Free(this);
	}
};


}


class GMOTION
{
public:
	BOOL mCheckFrameNum;
	char mFileName[100];
	int mFrameNum;
	float mLastUsedTime;
	CRITICAL_SECTION mLock;
	TW2AddIn::MOTION2_FOR_GXD mDATA;
	BOOL mCheckValidState;
};


class GSOBJECT
{
public:
	BOOL mCheckValidState;
	char mFileName[100];
	TW2AddIn::SOBJECT2_FOR_GXD mDATA;
	float mLastUsedTime;
	CRITICAL_SECTION mCritical;
  
	GSOBJECT()
	{
		Init();
		InitializeCriticalSection(&this->mCritical);
	}
	void Init()
	{
		this->mCheckValidState = FALSE;
		this->mFileName[0] = 0;
		this->mDATA.mCheckValidState = FALSE;
	}
	void Free()
	{
	    EnterCriticalSection(&this->mCritical);
		this->mCheckValidState = 0;
		this->mDATA.Free();
		LeaveCriticalSection(&this->mCritical);
	}
	
	void DisplaySObject(int tDrawSort, float pFrame, float *tL, float tYAngle, float tHeightForCulling, GMOTION *tMOTION, BOOL tLoadSort)
	{
		//Hook and Call Original function
		//void GSOBJECT::DisplaySObject(GSOBJECT* This, int tDrawSort, float pFrame, float *tL, float tYAngle, float tHeightForCulling, GMOTION *tMOTION, BOOL tLoadSort);
		ori_GSOBJECT_DisplaySObject(this, tDrawSort, pFrame, tL, tYAngle, tHeightForCulling, tMOTION, tLoadSort);
	}
};


//initialize new object
GSOBJECT new_gsobject;

//init mFileName
sprintf( new_gsobject.mFileName, "%s", "G03_GDATA\\D04_GSOBJECT\\010\\A%03d001%03d.SOBJECT", 1, 28 );
4.Use GSOBJECT and Hook AVATAR_OBJECT:: Draw
Code:
class UTIL
{
public:
	static BOOL CheckPossibleDrawMeWithCamera(float tCoord[3], float tLength)
	{
		//Hook and Call Original function
		BOOL res = ori_UTIL_CheckPossibleDrawMeWithCamera(  );
		return res;
		
		//float v3; // [esp+8h] [ebp-Ch]
		//float v4; // [esp+10h] [ebp-4h]
		//v4 = (mGXD[0].mCameraEye.z - tCoord[2]) * (mGXD[0].mCameraEye.z - tCoord[2]) + (mGXD[0].mCameraEye.y - (tLength * 0.5 + tCoord[1])) * (mGXD[0].mCameraEye.y - (tLength * 0.5 + tCoord[1])) + (mGXD[0].mCameraEye.x - *tCoord) * (mGXD[0].mCameraEye.x - *tCoord);
		//v3 = sqrt(v4);
		//return v3 >= 10.0f;
	}
}

class GDATA
{
public:
	static GMOTION* ReturnCharacterMotion(int aPreviousTribe, int aGender, int aType, int aSort, int aLevel1, int aLevel2, int aAnimalNumber)
	{
		//Hook and Call Original function
		GMOTION* res = ori_GDATA_ReturnCharacterMotion(aPreviousTribe, aGender, aType, aSort, aLevel1, aLevel2, aAnimalNumber);
		return res;
	}
};

class AVATAR_OBJECT
{
public:

	BOOL mCheckValidState;
	DWORD mServerIndex;
	DWORD mUniqueNumber;
	float mUpdateTime;
	float mUpdateTimeForRageTime;
	float mUpdateTime3;
	OBJECT_FOR_AVATAR mDATA;	
	BYTE data[1];//other unknow data
	
	//find and hook this function
	static void Draw( AVATAR_OBJECT* This, int tDrawSort, int tObjIndex, float dTime )
	{
		BOOL isLocalClient = tObjIndex == 0;
		GMOTION *tMOTION;
		
		if ( !This->mCheckValidState || tDrawSort < 1 || tDrawSort > 2 || !This->mDATA.aVisibleState || !UTIL::CheckPossibleDrawMeWithCamera(This->mDATA.aAction.aLocation, 20.0f) )
			return;
		
		int tAnimalNumber = 0;
		if ( !This->mDATA.aAnimalAbsorbState )
			tAnimalNumber = This->mDATA.aAnimalNumber;			
		tMOTION = GDATA::ReturnCharacterMotion(This->mDATA.aPreviousTribe, This->mDATA.aGender, This->mDATA.aAction.aType, This->mDATA.aAction.aSort, This->mDATA.aLevel1, This->mDATA.aLevel2, tAnimalNumber);
				
		if( This->mDATA.aCostume == new_costume_id ) {
			new_gsobject.DisplaySObject( tDrawSort, This->mDATA.aAction.aFrame, This->mDATA.aAction.aLocation, This->mDATA.aAction.aFront, 20.0f, tMOTION, isLocalClient );
		}
	}
};
Code:
on exit dll function
void dll_exit()
{
	new_gsobject.Free();
}
Hello,
First of all thank you for your sharing.

Can you please say to us how can we create a new SOBJECT or MOTION file
kapgankaan is offline  
Old 10/31/2022, 12:12   #7
 
elite*gold: 0
Join Date: Nov 2011
Posts: 129
Received Thanks: 174
Quote:
Originally Posted by zahter55 View Post
@ can u pls say something about existing other systems. Like bottle system. Why is that slipping rows on every log in? Bottle1 878 price1 30 bottle2 879 price2 30 for example in game but after relogin it shows bottle and price1 is 0 but bottle+price2 and 3 gets new value.
save it to db.

Quote:
Originally Posted by kapgankaan View Post
Hello,
First of all thank you for your sharing.

Can you please say to us how can we create a new SOBJECT or MOTION file
You need to understand the structure of 3D and animation in order to create them. If you don't understand, don't do it.

Code:
#ifndef MYHEADER_H
#define MYHEADER_H

#include <GXD.h>

#include "./CString.h"
#include "./DXHelper.h"

#ifndef MYMACRO_H
#define MYMACRO_H

#define HeapCreate( type, size ) (type)HeapAlloc( GetProcessHeap(), 0, size )
#define HeapFree( ptr ) if( ptr ){ ::HeapFree( GetProcessHeap(), 0, ptr ); ptr = NULL; }
#define LodReleaseFree( ptr ) { \
    if ( ptr ) \
    { \
        for ( int i = 0; i < mLODStepNum; i++ ) \
            SAFE_RELEASE( ptr[i] ); \
        HeapFree( ptr ); \
    } \
}

#define LodHeapFree( ptr ) { \
    if ( ptr ) \
    { \
        for ( int i = 0; i < mLODStepNum; i++ ) { \
            HeapFree( ptr[i] ); \
        } \
        HeapFree( ptr ); \
    } \
}

#define ClassFreeArray( ptr, num ) { \
    if ( ptr ) \
    { \
        for ( int k = 0; k < num; k++ ) \
            ptr[k].Free(); \
        HeapFree( ptr ); \
    } \
}

#endif


typedef void (*LOAD_CALLBACK)(void*);

template<typename T>
void ObjectLoadCallback( void* ptr )
{
    T* v = (T*)ptr;
    if( !v->mCheckValidState )
        v->Free();
}

template<typename HEADER, typename T>
static BOOL ReadValue( HEADER h, T val, int size )
{
    if( h->mReadPos + size > (int)h->tOriginal.size() )
        return FALSE;
    memcpy( val, &h->tOriginal[h->mReadPos], size );
    h->mReadPos += size;
    return TRUE;
}

template<typename HEADER, typename T>
static BOOL ReadValue( HEADER h, T val )
{
    return ReadValue( h, val, sizeof(*val) );
}

typedef struct V3HEADER {
    char IsValid = 0;
    char IsCompress = 0;
    char pad0 = 0;
    char pad1 = 0;
    BOOL IsReady = FALSE;
    HANDLE hFile = NULL;
    std::vector<BYTE> tOriginal;
    std::vector<BYTE> tCompress;
    int mReadPos = 0;
    void* cPtr = NULL;
    LOAD_CALLBACK callback = NULL;

    V3HEADER( char* tFileName, const char* tVersionTex, void* ClassPointer, LOAD_CALLBACK Callback )
    {
        if( ClassPointer && Callback )
        {
            cPtr = ClassPointer;
            callback = Callback;
        }
        
        hFile = CreateFileA( tFileName, 0x80000000, 1u, 0, 3u, 0x80u, 0 );
        if ( hFile == INVALID_HANDLE_VALUE )
            return;
        DWORD dwFileSize = GetFileSize( hFile, NULL );
        if( !dwFileSize )
            return;
        tOriginal.resize( dwFileSize );

        DWORD NumberOfBytesRead;
        if ( !ReadFile( hFile, &tOriginal[0], dwFileSize, &NumberOfBytesRead, 0 ) || NumberOfBytesRead != dwFileSize )
            return;

        size_t versionLen = strlen(tVersionTex);
        if( versionLen > 0 )
        {
            std::vector<BYTE> tBuffer;
            tBuffer.resize( versionLen );
            if( !ReadValue( this, &tBuffer[0], tBuffer.size() ) )
                return;
            tBuffer.push_back( '\0' );//safe last char
            if( strcmp( (const char*)&tBuffer[0], tVersionTex ) != 0 )
                return;
            if( !ReadValue( this, &IsValid, 1 ) )
                return;
            if( !ReadValue( this, &IsCompress, 1 ) )
                return;
            if( !ReadValue( this, &pad0, 1 ) )
                return;
            if( !ReadValue( this, &pad1, 1 ) )
                return;
            if( !IsValid )
                return;        
            if ( IsCompress )
            {
                DWORD tOriginalSize, tCompressSize;
                if ( !ReadValue( this, &tOriginalSize ) )
                    return;
                if ( !ReadValue( this, &tCompressSize ) )
                    return;
                tOriginal.resize( tOriginalSize );
                tCompress.resize( tCompressSize );
                if ( !ReadValue( this, &tCompress[0], tCompressSize ) )
                    return;
                if ( !mGXD.Decompress( tCompressSize, (BYTE*)&tCompress[0], tOriginalSize, (BYTE*)&tOriginal[0] ) )
                    return;
            }
        }
        MYDEBUG();
        mReadPos = 0;
        IsReady = TRUE;
    }
    ~V3HEADER()
    {
        if ( hFile )
        {
            CloseHandle( hFile );
        }
        if( cPtr && callback )
            callback( cPtr );
        tOriginal.clear();
        tCompress.clear();
    }
} V3HEADER;

typedef struct UHEADER
{
    BOOL IsReady = FALSE;
    void* cPtr = NULL;
    LOAD_CALLBACK callback = NULL;
    std::vector<BYTE> tOriginal;
    int mReadPos = 0;

    UHEADER( V3HEADER* h, void* ClassPointer, LOAD_CALLBACK Callback )
    {
        if( ClassPointer && Callback )
        {
            cPtr = ClassPointer;
            callback = Callback;
        }
        //for( int i = 0; i < h->tOriginal.size(); i++ )
        //    tOriginal.push_back( h->tOriginal[i] );
        tOriginal = h->tOriginal;
        mReadPos = h->mReadPos;
        IsReady = TRUE;
    }
    ~UHEADER()
    {
        //tOriginal.clear();
        if( cPtr && callback )
            callback( cPtr );
    }
} UHEADER;


typedef struct THEADER {
    BOOL IsReady = FALSE;
    void* cPtr = NULL;
    LOAD_CALLBACK callback = NULL;
    std::vector<BYTE> tOriginal;
    std::vector<BYTE> tCompress;
    int mReadPos = 0;

    THEADER( UHEADER* h, void* ClassPointer, LOAD_CALLBACK Callback )
    {
        if( ClassPointer && Callback )
        {
            cPtr = ClassPointer;
            callback = Callback;
        }
        DWORD tOriginalSize, tCompressSize;
        if ( !ReadValue( h, &tOriginalSize ) )
            return;
        if ( !ReadValue( h, &tCompressSize ) )
            return;
        tOriginal.resize( tOriginalSize );
        tCompress.resize( tCompressSize );
        if ( !ReadValue( h, &tCompress[0], tCompressSize ) )
            return;
        if ( !mGXD.Decompress( tCompressSize, (BYTE*)&tCompress[0], tOriginalSize, (BYTE*)&tOriginal[0] ) )
            return;
        IsReady = TRUE;
    }
    ~THEADER()
    {
        tOriginal.clear();
        tCompress.clear();
        if( cPtr && callback )
            callback( cPtr );
    }
} THEADER;


typedef struct MHEADER {
    BOOL IsReady = FALSE;
    void* cPtr = NULL;
    LOAD_CALLBACK callback = NULL;
    std::vector<BYTE> tOriginal;
    std::vector<BYTE> tCompress;
    int mReadPos = 0;

    MHEADER( V3HEADER* h, void* ClassPointer, LOAD_CALLBACK Callback )
    {
        if( ClassPointer && Callback )
        {
            cPtr = ClassPointer;
            callback = Callback;
        }
        DWORD tOriginalSize, tCompressSize;
        if ( !ReadValue( h, &tOriginalSize ) )
            return;
        MYDEBUG();
        if ( !ReadValue( h, &tCompressSize ) )
            return;
        MYDEBUG();
        tOriginal.resize( tOriginalSize );
        tCompress.resize( tCompressSize );
        if ( !ReadValue( h, &tCompress[0], tCompressSize ) )
            return;
        MYDEBUG();
        if ( !mGXD.Decompress( tCompressSize, (BYTE*)&tCompress[0], tOriginalSize, (BYTE*)&tOriginal[0] ) )
            return;
        MYDEBUG();
        IsReady = TRUE;
    }
    ~MHEADER()
    {
        tOriginal.clear();
        tCompress.clear();
        if( cPtr && callback )
            callback( cPtr );
    }
} MHEADER;

#endif // !MYHEADER_H

struct MOTION2_MATRIX
{
    D3DXQUATERNION mQuaternion;
    D3DXVECTOR3 mPosition;
};

BOOL MOTION2_FOR_GXD::Load( char *tFileName )
{
    if ( mCheckValidState )
        return 0;
    
    V3HEADER v3( tFileName, "MOTION3", this, (LOAD_CALLBACK)ObjectLoadCallback<MOTION2_FOR_GXD> );
    if( !v3.IsReady )
        return FALSE;

    if( !ReadValue( &v3, &mFrameNum ) || mFrameNum < 1 )
        return FALSE;
    if( !ReadValue( &v3, &mBoneNum ) || mBoneNum < 1 )
        return FALSE;

    mKeyMatrix = (D3DXMATRIX*)HeapAlloc( GetProcessHeap(), 0, (mBoneNum * mFrameNum) * sizeof(D3DXMATRIX) );
    if (!mKeyMatrix)
        return FALSE;

    MOTION2_MATRIX v32;
    for ( int i = 0; i < mBoneNum * mFrameNum; i++ )
    {
        if( !ReadValue( &v3, &v32 ) )
            return FALSE;
        D3DXMatrixRotationQuaternion( &mKeyMatrix[i], &v32.mQuaternion );
        mKeyMatrix[i]._41 = v32.mPosition.x;
        mKeyMatrix[i]._42 = v32.mPosition.y;
        mKeyMatrix[i]._43 = v32.mPosition.z;
    }
    mCheckValidState = v3.mReadPos == v3.tOriginal.size();
    return mCheckValidState;
}

BOOL TEXTURE_FOR_GXD::Load( HANDLE hFile, BOOL tCheckCreateTexture, BOOL tCheckRemoveFileData )
{
    BOOL result = FALSE; // eax

    int v24; // [esp+8h] [ebp-A0h]
    unsigned int v25; // [esp+8h] [ebp-A0h]
    unsigned int v26; // [esp+8h] [ebp-A0h]
    char Src[4]; // [esp+Ch] [ebp-9Ch] BYREF
    int v28[31]; // [esp+10h] [ebp-98h] BYREF

    if ( mCheckValidState )
        return FALSE;

    UHEADER* h = (UHEADER*)hFile;
    if ( !ReadValue( h, &mFileDataSize ) )
        return FALSE;

    if ( !mFileDataSize )
        return TRUE;
    THEADER t( h, this, (LOAD_CALLBACK)ObjectLoadCallback<TEXTURE_FOR_GXD> );
    if( !t.IsReady )
        return FALSE;

    mFileData = (BYTE*)HeapAlloc( GetProcessHeap(), 0, mFileDataSize );
    if ( !mFileData )
        return FALSE;
    if( !ReadValue( &t, mFileData, mFileDataSize ) )
        return FALSE;
    if( !ReadValue( &t, &mProcessModeCase ) )
        return FALSE;
    if( !ReadValue( &t, &mAlphaModeCase ) )
        return FALSE;

    if (D3DXGetImageInfoFromFileInMemory( mFileData, mFileDataSize, &mTextureInfo ) >= 0 )
    {
        if (tCheckCreateTexture)
        {
            switch (mGXD.mTextureOptionValue)
            {
            case 0:
                if (mTextureInfo.Format != D3DFMT_DXT1 && mTextureInfo.Format != D3DFMT_DXT2 && mTextureInfo.Format != D3DFMT_DXT3 && mTextureInfo.Format != D3DFMT_DXT5 || 
                    D3DXCreateTextureFromFileInMemoryEx(mGXD.mGraphicDevice, mFileData, mFileDataSize, mTextureInfo.Width, mTextureInfo.Height, 0, 0, mTextureInfo.Format, D3DPOOL_MANAGED, 1, 1, 0, 0, 0, &mTexture) >= 0)
                    goto LABEL_93;
                return FALSE;
            case 1:
                if (!tCheckRemoveFileData || mTextureInfo.Format != D3DFMT_DXT1 && mTextureInfo.Format != D3DFMT_DXT2 && mTextureInfo.Format != D3DFMT_DXT3 && mTextureInfo.Format != D3DFMT_DXT5)
                    goto LABEL_93;
                memcpy(Src, mFileData, sizeof(Src));
                memcpy(v28, mFileData + 4, sizeof(v28));
                if (v28[0] == 124 && (v28[1] & 2) != 0 && (v28[1] & 4) != 0 && (v28[1] & 0x80000) != 0 && (v28[1] & 0x20000) != 0 && v28[4] >> 2 >= 8 && (v28[6] - 1) >= 2)
                {
                    v24 = v28[4];
                    v28[2] = v28[2] >> 1;
                    if (!v28[2])
                        v28[2] = 1;
                    v28[3] = v28[3] >> 1;
                    if (!v28[3])
                        v28[3] = 1;
                    v28[4] = v28[4] >> 2;
                    --v28[6];
                    memcpy(&mFileData[v24], Src, 4u);
                    memcpy(&mFileData[v24 + 4], v28, 124u);
                    D3DXCreateTextureFromFileInMemoryEx(mGXD.mGraphicDevice, &mFileData[v24], mFileDataSize - v24, v28[3], v28[2], 0, 0, mTextureInfo.Format, D3DPOOL_MANAGED, 1, 1, 0, 0, 0, &mTexture);
                    goto LABEL_93;
                }
                if (D3DXCreateTextureFromFileInMemoryEx(mGXD.mGraphicDevice, mFileData, mFileDataSize, mTextureInfo.Width, mTextureInfo.Height, 0, 0, mTextureInfo.Format, D3DPOOL_MANAGED, 1, 1, 0, 0, 0, &mTexture) >= 0)
                    goto LABEL_93;
                break;
            case 2:
                if (!tCheckRemoveFileData || mTextureInfo.Format != D3DFMT_DXT1 && mTextureInfo.Format != D3DFMT_DXT2 && mTextureInfo.Format != D3DFMT_DXT3 && mTextureInfo.Format != D3DFMT_DXT5)
                    goto LABEL_93;
                memcpy(Src, mFileData, sizeof(Src));
                memcpy(v28, mFileData + 4, sizeof(v28));
                if (v28[0] == 124 && (v28[1] & 2) != 0 && (v28[1] & 4) != 0 && (v28[1] & 0x80000) != 0 && (v28[1] & 0x20000) != 0 && v28[4] >> 4 >= 8 && (v28[6] - 2) >= 2)
                {
                    v25 = v28[4] + (v28[4] >> 2);
                    v28[2] = v28[2] >> 2;
                    if (!v28[2])
                        v28[2] = 1;
                    v28[3] = v28[3] >> 2;
                    if (!v28[3])
                        v28[3] = 1;
                    v28[4] = v28[4] >> 4;
                    v28[6] -= 2;
                    memcpy(&mFileData[v25], Src, 4u);
                    memcpy(&mFileData[v25 + 4], v28, 0x7Cu);
                    D3DXCreateTextureFromFileInMemoryEx(mGXD.mGraphicDevice, &mFileData[v25], mFileDataSize - v25, v28[3], v28[2], 0, 0, mTextureInfo.Format, D3DPOOL_MANAGED, 1, 1, 0, 0, 0, &mTexture);
                }
                else if (D3DXCreateTextureFromFileInMemoryEx(mGXD.mGraphicDevice, mFileData, mFileDataSize, mTextureInfo.Width, mTextureInfo.Height, 0, 0, mTextureInfo.Format, D3DPOOL_MANAGED, 1, 1, 0, 0, 0, &mTexture) < 0)
                {
                    break;
                }
                goto LABEL_93;
            case 3:
                if (!tCheckRemoveFileData || mTextureInfo.Format != D3DFMT_DXT1 && mTextureInfo.Format != D3DFMT_DXT2 && mTextureInfo.Format != D3DFMT_DXT3 && mTextureInfo.Format != D3DFMT_DXT5)
                    goto LABEL_93;
                memcpy(Src, mFileData, sizeof(Src));
                memcpy(v28, mFileData + 4, sizeof(v28));
                if (v28[0] == 124 && (v28[1] & 2) != 0 && (v28[1] & 4) != 0 && (v28[1] & 0x80000) != 0 && (v28[1] & 0x20000) != 0 && v28[4] >> 6 >= 8 && (v28[6] - 3) >= 2)
                {
                    v26 = (v28[4] >> 4) + v28[4] + (v28[4] >> 2);
                    v28[2] = v28[2] >> 3;
                    if (!v28[2])
                        v28[2] = 1;
                    v28[3] = v28[3] >> 3;
                    if (!v28[3])
                        v28[3] = 1;
                    v28[4] = v28[4] >> 6;
                    v28[6] -= 3;
                    memcpy(&mFileData[v26], Src, 4u);
                    memcpy(&mFileData[v26 + 4], v28, 0x7Cu);
                    D3DXCreateTextureFromFileInMemoryEx(mGXD.mGraphicDevice, &mFileData[v26], mFileDataSize - v26, v28[3], v28[2], 0, 0, mTextureInfo.Format, D3DPOOL_MANAGED, 1, 1, 0, 0, 0, &mTexture);
                    goto LABEL_93;
                }
                if (D3DXCreateTextureFromFileInMemoryEx(mGXD.mGraphicDevice, mFileData, mFileDataSize, mTextureInfo.Width, mTextureInfo.Height, 0, 0, mTextureInfo.Format, D3DPOOL_MANAGED, 1, 1, 0, 0, 0, &mTexture) >= 0)
                    goto LABEL_93;
            default:
                break;
            }
        }
        else
        {
        LABEL_93:
            mCheckValidState = TRUE;
            if ( tCheckRemoveFileData )
            {
                HeapFree( mFileData );
            }
            result = TRUE;
        }
    }
    return result;
}

BOOL SKIN2_FOR_GXD::Load( HANDLE hFile )
{
    int i;
    LPVOID v31;
    LPVOID v32;

    if ( mCheckValidState )
        return 0;

    UHEADER h( (V3HEADER*)hFile, this, (LOAD_CALLBACK)ObjectLoadCallback<SKIN2_FOR_GXD> );

    if ( !ReadValue( &h, &mCheckValidState ) )
        return 0;
    if ( !mCheckValidState )
        return 1;
    mCheckValidState = FALSE;
    if ( !ReadValue( &h,&mEffect ) )
        return 0;
    if ( !ReadValue( &h,&mSize ) )
        return 0;
    if ( !ReadValue( &h, mVertexBufferForBillboard, sizeof(mVertexBufferForBillboard) ) )
        return 0;
    if ( !ReadValue( &h,&mLODStepNum ) )
        return 0;
    int lodSize = 4 * mLODStepNum;
    mVertexNum = HeapCreate( int*, lodSize );
    if ( !mVertexNum )
        return 0;
    mVertexBuffer = HeapCreate( IDirect3DVertexBuffer9**, lodSize );
    if ( !mVertexBuffer )
        return 0;
    for ( i = 0; i < mLODStepNum; mVertexBuffer[i++] = 0 )
        ;
    mTrisNum = HeapCreate( int*, lodSize );
    if ( !mTrisNum )
        return 0;
    mIndexBuffer = HeapCreate( IDirect3DIndexBuffer9**, lodSize );
    if ( !mIndexBuffer )
        return 0;
    for ( i = 0; i < mLODStepNum; mIndexBuffer[i++] = 0 )
        ;
    mShadowVertexBuffer = HeapCreate( SKINSHADOWVERTEX2_FOR_GXD**, lodSize );
    if ( !mShadowVertexBuffer )
        return 0;
    for ( i = 0; i < mLODStepNum; mShadowVertexBuffer[i++] = 0 )
        ;
    mShadowIndexBuffer = HeapCreate( WORD**, lodSize );
    if ( !mShadowIndexBuffer )
        return 0;
    for ( i = 0; i < mLODStepNum; mShadowIndexBuffer[i++] = 0 )
        ;
    mShadowEdgeBuffer = HeapCreate( WORD**, lodSize );
    if ( !mShadowEdgeBuffer )
        return 0;
    for ( i = 0; i < mLODStepNum; mShadowEdgeBuffer[i++] = 0 )
        ;
    for ( i = 0; i < mLODStepNum; ++i )
    {
        if ( !ReadValue( &h, &mVertexNum[i] ) )
            return 0;
        int vertexSize = sizeof(SKINVERTEX2_FOR_GXD) * mVertexNum[i];
        if( mGXD.mGraphicDevice->CreateVertexBuffer( vertexSize, D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED, &mVertexBuffer[i], 0) < 0 || mVertexBuffer[i]->Lock( 0, 0, &v31, 0 ) < 0 )
            return 0;
        if ( !ReadValue( &h, v31, vertexSize ) )
        {
            mVertexBuffer[i]->Unlock();
            return 0;
        }
        if ( mVertexBuffer[i]->Unlock() < 0 )
            return 0;
        if( !ReadValue( &h, &mTrisNum[i] ) )
            return 0;
        int indexSize = 6 * mTrisNum[i];
        if ( mGXD.mGraphicDevice->CreateIndexBuffer( indexSize, D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &mIndexBuffer[i], 0 ) < 0 || mIndexBuffer[i]->Lock( 0, 0, &v32, 0) < 0 )
            return 0;
        if ( !ReadValue( &h, v32, indexSize ) )
        {
            mIndexBuffer[i]->Unlock();
            return 0;
        }
        if ( mIndexBuffer[i]->Unlock() < 0 )
            return 0;
        int v24 = sizeof(SKINSHADOWVERTEX2_FOR_GXD) * mVertexNum[i];
        mShadowVertexBuffer[i] = HeapCreate( SKINSHADOWVERTEX2_FOR_GXD*, v24 );
        if ( !mShadowVertexBuffer[i] )
            return 0;
        if ( !ReadValue( &h, mShadowVertexBuffer[i], v24 ) )
            return 0;
        mShadowIndexBuffer[i] = HeapCreate( WORD*, indexSize );
        if ( !mShadowIndexBuffer[i] )
            return 0;
        if ( !ReadValue( &h, mShadowIndexBuffer[i], indexSize ) )
            return 0;
        mShadowEdgeBuffer[i] = HeapCreate( WORD*, indexSize );
        if ( !mShadowEdgeBuffer[i] || !ReadValue( &h, mShadowEdgeBuffer[i], indexSize ) )
            return 0;
    }
    if ( !mDiffuseMap.Load( (HANDLE)&h, 1, 1 ) || !mNormalMap.Load( (HANDLE)&h, 1, 1 ) )
        return 0;
    if ( !mGXD.mNormalMapOptionValue )
        mNormalMap.Free();
    if ( !mSpecularMap.Load( (HANDLE)&h, 1, 1 ) )
        return 0;
    if ( mGXD.mNormalMapOptionValue != 2 )
        mSpecularMap.Free();
    if ( !ReadValue( &h, &mAnimationMapNum ) )
        return 0;
    if ( mAnimationMapNum > 0 )
    {
        mAnimationMap = HeapCreate( TEXTURE_FOR_GXD*, sizeof(TEXTURE_FOR_GXD) * mAnimationMapNum );
        if ( !mAnimationMap )
        {
            return 0;
        }
        for ( i = 0; i < mAnimationMapNum; ++i )
            mAnimationMap[i].Init();
        for ( i = 0; i < mAnimationMapNum; ++i )
        {
            if ( !mAnimationMap[i].Load( (HANDLE)&h, 1, 1) )
                return 0;
        }
    }

    ((V3HEADER*)hFile)->mReadPos = h.mReadPos;

    mCheckValidState = TRUE;

    return 1;
}

BOOL SOBJECT2_FOR_GXD::Load( char* tFileName )
{
    BOOL result = FALSE;
    int i;

    if ( mCheckValidState )
        return 0;

    V3HEADER v3( tFileName, "SOBJECT3", this, (LOAD_CALLBACK)ObjectLoadCallback<SKIN2_FOR_GXD> );
    if( !v3.IsReady )
        return FALSE;

    if( !ReadValue( &v3, &mSkinNum ) || mSkinNum < 1 )
        return FALSE;

    mSkin = (SKIN2_FOR_GXD*)HeapAlloc( GetProcessHeap(), 0, sizeof(*mSkin) * mSkinNum );
    if ( !mSkin )
        return FALSE;
    
    for ( i = 0; i < mSkinNum; i++ )
        mSkin[i].Init();
    for ( i = 0; i < mSkinNum; i++ )
    {
        mSkin[i].Init();
        if ( !mSkin[i].Load( (HANDLE)&v3 ) )
            return FALSE;
    }

    mCheckValidState = v3.mReadPos == v3.tOriginal.size();

    return mCheckValidState;
}
lnwnuyhodd is offline  
Thanks
1 User
Old 10/31/2022, 13:10   #8
 
elite*gold: 0
Join Date: Apr 2020
Posts: 243
Received Thanks: 51
Quote:
Originally Posted by lnwnuyhodd View Post
save it to db.
Already saving. I have written its ints to my sql, to db.cpps, when i use a bottle price goes down it saves but as i say i use 3rd bottle but after relogin as i see i have been used 2nd bottle.
zahter55 is offline  
Old 10/31/2022, 13:32   #9
 
elite*gold: 0
Join Date: Nov 2011
Posts: 129
Received Thanks: 174
Quote:
Originally Posted by zahter55 View Post
Already saving. I have written its ints to my sql, to db.cpps, when i use a bottle price goes down it saves but as i say i use 3rd bottle but after relogin as i see i have been used 2nd bottle.
Code:
void __thiscall DRUNKUI::Draw(DRUNKUI *self, int mX, int mY)
{
    int v3; // esi
    int v4; // esi
    int v5; // eax
    int v6; // eax
    int v7; // eax
    int v8; // eax
    int v9; // eax
    int v10; // eax
    int v11; // esi
    int v12; // [esp-Ch] [ebp-414h]
    int v13; // [esp-Ch] [ebp-414h]
    int v14; // [esp-4h] [ebp-40Ch]
    int v15; // [esp-4h] [ebp-40Ch]
    int v16; // [esp-4h] [ebp-40Ch]
    int v17; // [esp-4h] [ebp-40Ch]
    ITEM_INFO *v19; // [esp+8h] [ebp-400h]
    int sX; // [esp+Ch] [ebp-3FCh]
    int sXa; // [esp+Ch] [ebp-3FCh]
    char tString[1000]; // [esp+10h] [ebp-3F8h] BYREF
    int i; // [esp+3FCh] [ebp-Ch]
    int sY; // [esp+400h] [ebp-8h]
    int v25; // [esp+404h] [ebp-4h]

    if ( self->mActive )
    {
        i = 0;
        sY = 0;
        v25 = 0;
        tString[0] = 0;
        memset(&tString[1], 0, 999u);
        v3 = mMYINFO[0].mScreenXSize / 2;
        self->uX = v3 - GIMAGE2D::GetXSize(&mGDATA[0].mUI_MAIN[3945]) / 2;
        v4 = mMYINFO[0].mScreenYSize / 2;
        self->uY = v4 - GIMAGE2D::GetYSize(&mGDATA[0].mUI_MAIN[3945]) / 2;
        if ( GIMAGE2D::CheckIn(&mGDATA[0].mUI_MAIN[3945], self->uX, self->uY, mX, mY) )
            POINTER::Set(0);
        GIMAGE2D::Display(&mGDATA[0].mUI_MAIN[3945], self->uX, self->uY);
        for ( i = 0; i < 10; ++i )
        {
            if ( mMYINFO[0].mUseAvatar.aBottle[i] >= 1 )
            {
                sX = self->uX + 55 * (i % 5) + 19;
                sY = self->uY + 55 * (i / 5) + 41;
                v19 = ITEM::Search(mMYINFO[0].mUseAvatar.aBottle[i]);
                if ( v19 )
                {
                    v25 = v19->iDataNumber2D - 1;
                    GIMAGE2D::Display(&mGDATA[0].mUI_ITEM[v25], sX, sY);
                    if ( mMYINFO[0].mUseAvatar.aBottleIndex == i && mMYINFO[0].mUseAvatar.aBottleTime > 0 )
                        GIMAGE2D::Display(&mGDATA[0].mUI_MAIN[2792], sX, sY);
                    if ( mMYINFO[0].mBottleIndex == i )
                        GIMAGE2D::Display(&mGDATA[0].mUI_MAIN[2627], sX, sY);
                }
            }
        }
        if ( self->bIsClick[0] )
        {
            v15 = self->uY + DRUNKUI::GetPosY(3947);
            v7 = DRUNKUI::GetPosX(3947);
            GIMAGE2D::Display(&mGDATA[0].mUI_MAIN[3947], self->uX + v7, v15);
        }
        else
        {
            v12 = self->uY + DRUNKUI::GetPosY(3946);
            v5 = DRUNKUI::GetPosX(3946);
            if ( GIMAGE2D::CheckIn(&mGDATA[0].mUI_MAIN[3946], self->uX + v5, v12, mX, mY) )
            {
                v14 = self->uY + DRUNKUI::GetPosY(3946);
                v6 = DRUNKUI::GetPosX(3946);
                GIMAGE2D::Display(&mGDATA[0].mUI_MAIN[3946], self->uX + v6, v14);
            }
        }
        if ( self->bIsClick[2] )
        {
            v17 = self->uY + DRUNKUI::GetPosY(3951);
            v10 = DRUNKUI::GetPosX(3951);
            GIMAGE2D::Display(&mGDATA[0].mUI_MAIN[3951], self->uX + v10, v17);
        }
        else
        {
            v13 = self->uY + DRUNKUI::GetPosY(3950);
            v8 = DRUNKUI::GetPosX(3950);
            if ( GIMAGE2D::CheckIn(&mGDATA[0].mUI_MAIN[3950], self->uX + v8, v13, mX, mY) )
            {
                v16 = self->uY + DRUNKUI::GetPosY(3950);
                v9 = DRUNKUI::GetPosX(3950);
                GIMAGE2D::Display(&mGDATA[0].mUI_MAIN[3950], self->uX + v9, v16);
            }
        }
        for ( i = 0; i < 10; ++i )
        {
            if ( mMYINFO[0].mUseAvatar.aBottle[i] )
            {
                sprintf(tString, "%d / %d", mMYINFO[0].mUseAvatar.aBottleCount[i], 30);
                v11 = self->uX + 55 * (i % 5) + 44;
                sXa = v11 - UTIL::ReturnStringLength(tString) / 2;
                sY = self->uY + 55 * (i / 5) + 77;
                UTIL::DrawFont2D(tString, sXa, sY, 1);
            }
        }
    }
}
It's either wrong with your structure or you're doing it wrong, that's all.
lnwnuyhodd is offline  
Thanks
1 User
Old 10/31/2022, 14:19   #10
 
elite*gold: 0
Join Date: Apr 2020
Posts: 243
Received Thanks: 51
.
zahter55 is offline  
Reply


Similar Threads Similar Threads
[Professor Linebeck] You can teach how to make suit fashion ?
03/15/2018 - Flyff Private Server - 5 Replies
Professor Linebeck my beginner i want to make suit fashion - gloves fashion - shoes fashion you can teach how to make it ? can use suit fashion from aeria games - aura kingdom - grand fantasia to teach so good thank you so much
S> FREEDOM SUIT, ANNIVERSARY SUIT (FEMALE) & 4 VIP 6 SLOTS
05/01/2015 - Conquer Online 2 Trading - 3 Replies
Hi Guys!!!! :mofo: GARMENTS Freedom Suit - 1 (OFFER IN PM, prefer cash payment via Skrill or Paypal (Send as gift) Anniversary Suit (Female) - 1 (AS of above) VIP 6 - 4 SLOTS (1075CPS EACH) Buyers can credit to my game account as a form of payment!
Cant use my thief suit or other suit help!!!
01/10/2010 - SRO Private Server - 0 Replies
i guys i play on sjsro old i i have a problem i cant use enymore my thief suit can some1 help me ??
[B] Snow Suit (M) [S] Sailor suit (M) [Blau] + Cats Ears (M)
03/15/2008 - Trading - 0 Replies
Hallo, Suche Auf dem DFlyFF Steamwalker Server: - Sailor Suit (M) in Blau - Cats (M) Hat / Ears Biete euch dafür: - SnowBoarder (M) Suit (Wert 35 mio Penja)



All times are GMT +1. The time now is 01:06.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.