avatar_spekinskii

Как избавиться от дисконнектов в Offtrade в MU online

Автор spekinskii, 2012 Янв. 12, 21:13

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

Ключевые слова [SEO] mu onlineдисконнектofftradeзащита аккаунта

spekinskii

Имеются сырки оффтрейд, но в них 1 косяк.Что бы их использовать на сайте нужно иметь функцию дисконект(очень поганая функция, через нее крутить можно).
Собственно может кто знает как поставить зависимость от OffTrade.Что бы была защита от дабл входа?
вот сами сырки
.cpp
#include "StdAfx.h"
//------------------------------------------------------------------------------------------------------
CRITICAL_SECTION criti; // Cross-thread safety
OffTrade OfflineTrade; // Class Init
extern Insomina_gObj Inso_gObj[OBJ_MAX]; // Extern of my server gObjStruct, but u can use GOBJECTSTRUCT from your GS, i don't use bcoz no more place in it.
//------------------------------------------------------------------------------------------------------
OffTrade::OffTrade(void)
{
//-- CONSTRUCTOR --
}
//------------------------------------------------------------------------------------------------------
void OffTrade::InitOfflineTrade()
{
// Just Hook two functions.
// First: PShopClose
// Second: CloseClient
HookThis((DWORD)&CGPShopAnsClose_Ex,CGPShopAnsClose_Hook);
HookThis((DWORD)&CloseClient2Ex,CloseClient2_Hook);
cLog.ConsoleOutput("OffTrade::InitOfflineTrade();");
}
//------------------------------------------------------------------------------------------------------
OffTrade::~OffTrade(void)
{
//-- DESTRUCTOR ----
}
//------------------------------------------------------------------------------------------------------
void OffTrade::CreateOfflineStore(int aIndex)
{
// This function must be called from chat handler, like this:
/*
//-------------------------------------------------------------------------
char offlinetradecommand[]="/offline";
if (!memcmp(&aRecv[13],Config.SyntaxCmd.OffTrade,strlen(Config.SyntaxCmd.OffTrade)))
bResult = OffTrade(gObj,(char*)aRecv+13+strlen(Config.SyntaxCmd.OffTrade));
//-------------------------------------------------------------------------
*/
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
if(gObj->m_bPShopOpen == false) // Check if PStore is open.
{
Messages.outBlue(aIndex,"Please, at first open Your Personal Store");
return;
}
if(gObj->MapNumber != 0)
{
Messages.outBlue(aIndex,"Offline trade can be used only in Lorencia");
return;
}
Inso_gObj[aIndex].OfflineTrade=true;
CloseClient(aIndex);
}
//------------------------------------------------------------------------------------------------------
void CGPShopAnsClose_Ex(int aIndex, BYTE btResult)
{
// Function calling when Personal store is closing.
// Also it is calling when Personal store become empty.

CGPShopAnsClose(aIndex,btResult);

if(Inso_gObj[aIndex].OfflineTrade == true)
{
Inso_gObj[aIndex].OfflineTrade = false;
cLog.ConsoleOutput("PSHOp cLOSE");
gObjDel_Ex(aIndex);
}
}
//------------------------------------------------------------------------------------------------------
void CloseClient2Ex(_PER_SOCKET_CONTEXT_2 * lpPerSocketContext, int result)
{
// Very easy function hooking. Just disable auto log-off of Disconnected Characters ;)
int index = -1;
index = lpPerSocketContext->nIndex ;
//---
if ( index >= 8000 && index < 9000 )
{
if ( gObj[index].m_socket != INVALID_SOCKET )
{
if ( closesocket(gObj[index].m_socket) == -1 )
if ( WSAGetLastError() != WSAENOTSOCK )
return;
gObj[index].m_socket = INVALID_SOCKET;
}
gObjDel_Ex(index);
}
}//------------------------------------------------------------------------------------------------------


.h
#pragma once
class OffTrade
{
public:
OffTrade(void);
~OffTrade(void);
void CreateOfflineStore(int aIndex);
void InitOfflineTrade();
};extern OffTrade OfflineTrade;

#define HIDE_ERRORL10
#define MAX_EXSENDBUF_SIZE 7024
#define MAX_IO_BUFFER_SIZE  6000
#define MAX_IO_THREAD_HANDLES    16

struct _PER_IO_CONTEXT_2
{
WSAOVERLAPPED Overlapped; // 0
WSABUF wsabuf;
unsigned char Buffer[MAX_IO_BUFFER_SIZE]; // 1C
unsigned char BufferSecond[MAX_IO_BUFFER_SIZE]; // 178C
int nSecondOfs; // 2EFC
int nTotalBytes;    // 2F00
int nSentBytes; // 2F04
int IOOperation; // 2F08
int nWaitIO; // 2F0C
};
struct _PER_SOCKET_CONTEXT_2
{
SOCKET m_socket;    // 0
int nIndex;    // 4
_PER_IO_CONTEXT_2 IOContext[2];    // 8
int dwIOCount;    // 5E28
};
#define CGPShopAnsClose_Hook 0x004041C4
#define CGPShopAnsClose ((void(*)(int,BYTE))0x0044B2C0)
#define ResponErrorCloseClient ((void(*)(int,BYTE))0x0044B2C0)
#define ResponErrorCloseClient_Hook 0x00403E95

#define CloseClient2_Ex ((void(*)(_PER_SOCKET_CONTEXT*,int))0x004B3F70)
#define CloseClient2_Hook 0x004057D6

void CGPShopAnsClose_Ex(int aIndex, BYTE btResult);
void CloseClient2Ex(_PER_SOCKET_CONTEXT_2 * lpPerSocketContext, int result);



Что нет знающий людей?Или как всегда Вы предложите помощь исключительно в $? :fuuu:

Profesor08

Тебе нужна функция, которая при попытке входа на аккаунт будет давать ему дисконнект. Дабы закрыть оффтрейд. А далее - как обычно.

Paqpka

Может кто помочь поставить оффтрейд ?

spekinskii

Profesor08 это я конечно понимаю, но я ведь не программист, я нюбик  
И сделать сам такое не смогу  

И кстати, этим можно будет пользоваться не в корысных целых.
Зашли на сайт, глянули акк, хоп, ночь, ага он уже спит, нада ему дц впелить

Sweng

А JoinServer с авто-дисконнектом никак?

spekinskii

джоин с авто дц не помогает

Mr.Kernighan

#6
Ну с сайтом в принципе это хороший вариант, нужно только правильно реализовать дисконнект чтобы нельзя как ты говоришь делать какие-то накрутки. (Хотя не имею понятия о каких накрутках ты говоришь).
Ты знаешь сколько работы нужно сделать чтобы проверить является ли твой персонаж online?
Представь себе, твоим профилем на данный момент играешь ты, данные твоего профиля известны и другому человеку. (брату, дяде, другу) не важно, в случае если данная функция будет реализована, получается на тот момент когда ты можешь играть, при попытке подключиться к серверу другим человеком тебя выкинет из игры так как кто-то другой попытается зайти на твой профиль. То есть, уже получается что нужно проверять еще не является ли твой персонаж в состояние оффтрейда!?
То что тебе нужно сделать, это обмен данными по протоколу, знать как работают сокеты и не только, поэтому не думаю что здесь найдется доброволец чтобы сделать тебе это бесплатно.

spekinskii

опиши пожалуйста как ты представляешь написание такой функции, попробую реализовать.
Ибо дисконнект система на сайт очень бажнутая.

берем 400лвл>Выбрать чара>сворачиваем окно>заходим на акк>делаем ресет>заходим в игру> и так по кругу.

cswars

Это бред полный. Оффтрейд создает имитацию игрока на сервере, но при заходе пишет что аккаунт уже в сети. Смысла от этого скрипта, как от киллограмового брилианта при конце света.

DangeR

Вот взято с паблик исходников сдесь уже с функцией дц при входе на акк
.cpp
Спойлер
//================================================================================
==================
// 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
Спойлер
#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);
[свернуть]

Похожие темы (5)