what about not from IA Julia source?
example s3ep1 1.00.18 gs offtrade source:
.cpp
Code:
#include "OfflineTrade.h"
#include "GameServer.h"
#include "Utilits.h"
#include "ConsoleNew.h"
#include "Log.h"
#include <WinSock2.h>
CRITICAL_SECTION criti;
COFFTrade OFFTrade;
OFFLINETRADE OfflineShop[OBJECT_MAX];
OFFLINETRADELOGIN OfflineLogin[OBJECT_MAX];
void COFFTrade::Init()
{
cLog.ConsoleOutput(WHITE,"[FAVORITE] (OFFTrade) System is Loaded");
}
void COFFTrade::CreateOfflineTrade(int aIndex)
{
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
if(gObj->m_bPShopOpen == false)
{
Messages.outNormal(aIndex,"Сперва откройте свой Personal Store!");
return;
}
OfflineShop[aIndex].IsOffTrade=1;
CloseClient(aIndex);
}
void CGPShopAnsCloseHook(int aIndex, BYTE btResult)
{
if(OfflineShop[aIndex].IsOffTrade)
gObjDel(aIndex);
CGPShopAnsClose(aIndex,btResult);
}
void CloseClientHook(int aIndex)
{
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
if ( aIndex < 0 || aIndex > OBJECT_MAX-1 )
return;
if(OfflineShop[aIndex].IsOffTrade != 0)
return;
if ( gObj->Connected == PLAYER_EMPTY )
return;
if ( gObj->m_socket != INVALID_SOCKET )
{
closesocket(gObj->m_socket );
gObj->m_socket = INVALID_SOCKET;
}
}
void ResponErrorCloseClientHook(int aIndex)
{
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*) OBJECT_POINTER(aIndex);
if ( aIndex < 0 || aIndex > OBJECT_MAX-1 )
return;
if(OfflineShop[aIndex].IsOffTrade == 1)
return;
if (gObj->Connected == PLAYER_EMPTY )
return;
closesocket(gObj->m_socket);
gObj->m_socket = INVALID_SOCKET;
gObjDel(aIndex);
}
void CloseClient2Hook(_PER_SOCKET_CONTEXT * lpPerSocketContext, int result)
{
int index = -1;
index = lpPerSocketContext->nIndex ;
if ( index >= OBJECT_MIN && index < OBJECT_MAX )
{
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*) OBJECT_POINTER(index);
if(OfflineShop[index].IsOffTrade != 0)
return;
if ( gObj->m_socket != INVALID_SOCKET )
{
if (closesocket(gObj->m_socket) == -1 )
{
if ( WSAGetLastError() != WSAENOTSOCK )
return;
}
gObj->m_socket = INVALID_SOCKET;
}
gObjDel(index);
}
.h
Code:
#include "StdAfx.h"
#include "User.h"
class COFFTrade
{
public:
void Init();
void CreateOfflineTrade(int aIndex);
}; extern COFFTrade OFFTrade;
struct _PER_SOCKET_CONTEXT
{
char unk[4]; //
int nIndex; // 4
char Unk[0x5E28];
// _PER_IO_CONTEXT IOContext[2]; // 8
// int dwIOCount; // 5E28
};
struct OFFLINETRADE{
int IsOffTrade;
}; extern OFFLINETRADE OfflineShop[OBJECT_MAX];
struct OFFLINETRADELOGIN{
int aIndex;
LPBYTE aRecv;
}; extern OFFLINETRADELOGIN OfflineLogin[OBJECT_MAX];
void CGPShopAnsCloseHook(int aIndex, BYTE btResult); //00441070 - 0x00404174
void ResponErrorCloseClientHook(int aIndex); //0048CC50 - 0x00403CF1
void CloseClient2Hook(_PER_SOCKET_CONTEXT * lpPerSocketContext, int result); //0048CAB0 - 0x004054F7
void CloseClientHook(int aIndex); //0048CB60 - 0x401046
although posted by d@nger this one maybe is better
.cpp
Code:
//================================================================================
==================
// Offline Trade System
//================================================================================
==================
#include "OffTrade.h"
#include "Protocol.h"
#include "g_Console.h"
#include <WinSock2.h>
#include "USER.h"
#include "Defines.h"
#include "LogAdd.h"
CRITICAL_SECTION criti;
COFFTrade OFFTrade;
OFFLINETRADE OfflineShop[OBJECT_MAX];
int OffPrice = GetPrivateProfileInt("Common","CreateCost",250000,"..\\Data\\Custom\\OffTrade.cfg");
int MapAllow = GetPrivateProfileInt("MapSystem","Enable",1,"..\\Data\\Custom\\OffTrade.cfg");
int Map1 = GetPrivateProfileInt("MapSystem","Map1",0,"..\\Data\\Custom\\OffTrade.cfg");
int Map2 = GetPrivateProfileInt("MapSystem","Map2",3,"..\\Data\\Custom\\OffTrade.cfg");
int Map3 = GetPrivateProfileInt("MapSystem","Map3",2,"..\\Data\\Custom\\OffTrade.cfg");
//==========================
// Functions Hook
//==========================
void COFFTrade::Init()
{
HookThis((DWORD)&CloseClient2Hook,0x00405CA4);//finished
HookThis((DWORD)&CGPShopAnsCloseHook,0x00404552);//finished
HookThis((DWORD)&ResponErrorCloseClientHook,0x0040422D);
HookThis((DWORD)&CloseClientHook,0x00407E82);//finished
}
//==========================
// OffTrade Create
//==========================
void COFFTrade::CreateOfflineTrade(int aIndex)
{
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
if(gObj->m_bPShopOpen == false)
{
MsgNormal(aIndex,"[SYSTEM] You need create Personal Store to use this command");
return;
}
else
{
if(MapAllow == 1)
{
if(gObj->MapNumber == Map1 || gObj->MapNumber == Map2 || gObj->MapNumber == Map3)
{
(gObj->Money -= OffPrice);
GCMoneySend(gObj->m_Index, gObj->Money);
OfflineShop[aIndex].IsOffTrade=1;
//SQL.OffTradeOn(aIndex);
CloseClient(aIndex);
g_Console.ConsoleOutput(4,"[OFFTRADE][%s][%s] Open Offline Shop",gObj->AccountID,gObj->Name);
LogAdder ("OFFTRADE","Open Offline Shop",aIndex);
}
MsgNormal(aIndex,"[SYSTEM] OffTrade work only special maps");
return;
}
}
if(MapAllow == 0)
{
(gObj->Money -= OffPrice);
GCMoneySend(gObj->m_Index, gObj->Money);
OfflineShop[aIndex].IsOffTrade=1;
//SQL.OffTradeOn(aIndex);
CloseClient(aIndex);
g_Console.ConsoleOutput(4,"[OFFTRADE][%s][%s] Open Offline Shop",gObj->AccountID,gObj->Name);
LogAdder ("OFFTRADE","Close Offline Shop",aIndex);
//int TimeDelayCorrect = ( 60 - t.GetSecond() ) * 1000;
//Sleep(TimeDelayCorrect);
}
}
//==========================
// Shop Close
//==========================
void CGPShopAnsCloseHook(int aIndex, BYTE btResult)
{
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
if(OfflineShop[aIndex].IsOffTrade)
gObjDel(aIndex);
OfflineShop[aIndex].IsOffTrade = 0;
//SQL.OffTradeOff(aIndex);
CGPShopAnsClose(aIndex,btResult);
}
//==========================
// Client Close
//==========================
void CloseClientHook(int aIndex)
{
if ( aIndex < 0 || aIndex > OBJECT_MAX-1 )
{
return;
}
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
if ( gObj->Connected == PLAYER_EMPTY )
{
return;
}
if(OfflineShop[aIndex].IsOffTrade != 0)
{
gObj->CheckTick = GetTickCount();
return;
}
if(gObj->m_socket != INVALID_SOCKET)
{
closesocket(gObj->m_socket );
gObj->m_socket = INVALID_SOCKET;
//SQL.OffTradeOff(aIndex);
}
else
{
}
}
//==========================
// Error Checker
//==========================
void ResponErrorCloseClientHook(int aIndex)
{
if ( aIndex < 0 || aIndex > OBJECT_MAX-1 )
{
//g_Console.ConsoleOutput(1,"error-L1 : CloseClient index error");
//return;
}
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
if ( gObj->Connected == PLAYER_EMPTY )
{
return;
}
if(OfflineShop[aIndex].IsOffTrade != 0)
{
gObj->CheckTick = GetTickCount();
return;
}
closesocket(gObj->m_socket);
gObj->m_socket = INVALID_SOCKET;
if ( gObj->m_socket == INVALID_SOCKET )
{
}
if(gObj->m_socket != INVALID_SOCKET)
//SQL.OffTradeOff(aIndex);
gObjDel(aIndex);
}
//==========================
// Client Close 2
//==========================
void CloseClient2Hook(_PER_SOCKET_CONTEXT * lpPerSocketContext, int result)
{
int index = -1;
index = lpPerSocketContext->nIndex ;
if ( index >= OBJECT_MIN && index < OBJECT_MAX )
{
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*) OBJECT_POINTER(index);
if(OfflineShop[index].IsOffTrade != 0)
{
gObj->CheckTick = GetTickCount();
return;
}
if ( gObj->m_socket != INVALID_SOCKET )
{
if (closesocket(gObj->m_socket) == -1 )
{
if (WSAGetLastError() != WSAENOTSOCK)
{
return;
}
}
gObj->m_socket = INVALID_SOCKET;
}
//SQL.OffTradeOff(index);
gObjDel(index);
}
}
.h
Code:
#include "StdAfx.h"
class COFFTrade
{
public:
void Init();
void CreateOfflineTrade(int aIndex);
}; extern COFFTrade OFFTrade;
struct _PER_SOCKET_CONTEXT
{
char unk[4];
int nIndex;
char Unk[0x5E2C];
};
void CGPShopAnsCloseHook(int aIndex, BYTE btResult);
void ResponErrorCloseClientHook(int aIndex);
void CloseClient2Hook(_PER_SOCKET_CONTEXT * lpPerSocketContext, int result);
void CloseClientHook(int aIndex);
oh and im not sure if this protocls will help
Zippyshare.com - offtradeprotocols.rar