Вернуться   D3Scene.Ru Софт портал игр | Хаки | Проги | Статьи > Основные игры > WarCraft 3 > WarCraft 3 Общая тематика
Присоединяйся к нам

WarCraft 3 Общая тематика Все остальное касающееся Warcraft 3.



Ответ
 
Опции темы Опции просмотра
Старый 06.06.2014, 09:47   #1
Support GuAI



 
Аватар для Abso!
 
Регистрация: 31.10.2009
Адрес: BY
Сообщений: 1,425
Монетки D3Scene.Ru: 200
Репутация: 700
Отправить сообщение для Abso! с помощью Skype™
Автор По умолчанию

[source] [C++] Класс для работы с кнопками Warcraft III [1.26a]


Написал класс для работы с кнопками/чек\текст боксами

(последняя версия всегда тут [Ссылки скрыты от гостей.] )

Код:
class WarcraftButton
{
    typedef void *( __fastcall * GetBtnAddrGAME )( const char * a2 , int  tmp );
    GetBtnAddrGAME GetBtnAddr_p;


    bool fistnameset = false;
    char * buttonname;


    unsigned char btnflag = 0;


public:




    enum BUTTONBIT : unsigned
    {
        STATE_BUTTON_ENABLED = 0 ,
        STATE_BUTTON_FOCUSED = 1 ,
        STATE_BUTTON_PRESSED = 2 ,
        STATE_BUTTON_MOUSEOVER = 4 ,
        STATE_BUTTON_CHECKED = 5 ,
        STATE_BUTTON_CURSOR = 5
    };




    ~WarcraftButton( )
    {
        if ( fistnameset )
            delete[ ] buttonname;
    }


    WarcraftButton( const char * name )
    {
        int namesize = strlen( name ) + 1;
        if ( fistnameset )
            delete[ ] buttonname;
        buttonname = new char[ strlen( name ) + 1 ];
        sprintf_s( buttonname , namesize , "%s" , name );
        fistnameset = true;
        
        if ( IsOk( ) )
        {
            btnflag = GetBtnFlag( );
        }
    
    }


    void SetButtonName( const char * name )
    {
        int namesize = strlen( name ) + 1;
        if ( fistnameset )
            delete[ ] buttonname;
        buttonname = new char[ strlen( name ) + 1 ];
        sprintf_s( buttonname , namesize , "%s" , name );
        fistnameset = true;
    }


    bool IsOk( )
    {
        if ( GetModuleHandle( "Game.dll" ) )
        {
            if ( fistnameset )
            {
                GetBtnAddr_p = ( GetBtnAddrGAME ) ( ( DWORD ) GetModuleHandle( "Game.dll" ) + 0x5FA970 );
                return GetBtnAddr( ) > 0;
            }
        }
        return false;
    }


    bool IsBtnEnabled( )
    {
        if ( IsOk() )
        {
            return is_btn_bit_set( STATE_BUTTON_ENABLED );
        }
        return false;
    }


    bool IsBtnFocused( )
    {
        if ( IsOk() )
        {
            return is_btn_bit_set( STATE_BUTTON_FOCUSED );
        }
        return false;
    }


    bool IsBtnPressed( )
    {
        if ( IsOk() )
        {
            return is_btn_bit_set( STATE_BUTTON_PRESSED );
        }
        return false;
    }


    bool IsBtnMouseOver( )
    {
        if ( IsOk() )
        {
            return is_btn_bit_set( STATE_BUTTON_MOUSEOVER );
        }
        return false;
    }


    bool IsChecked( )
    {
        if ( IsOk() )
        {
            return is_btn_bit_set( STATE_BUTTON_CHECKED);
        }
        return false;
    }


    int GetBtnStringSize( )
    {
        if ( IsOk() )
        {
            return *( int* ) ( GetBtnAddr( ) + 0x1E8 );
        }
        return 0;
    }


    int GetBtnStringAddr( )
    {
        if ( IsOk() )
        {
            if ( GetBtnStringSize( ) > 0 )
            {
                int returnaddr = *( int* ) ( GetBtnAddr( ) + 0x1E4 );
                if ( returnaddr < 1000 )
                {
                    returnaddr = *( int* ) ( GetBtnAddr( ) + 0x1E8 + 4 );
                }


                if ( returnaddr < 1000 )
                {
                    returnaddr = *( int* ) ( GetBtnAddr( ) + 0x1E8 + 8 );
                }


                if ( returnaddr < 1000 )
                {
                    returnaddr = 0;
                }


                return returnaddr;
            }
        }
        return 0;
    }


    const char * Author( )
    {
        return "Absol (d3scene.ru)";
    }


    const char * Version( )
    {
        return "2 beta!";
    }


    void SetBtnFlag( unsigned value )
    {
        bit_set( btnflag , value );
        WriteBtnFlag( btnflag );
    }
    void ClearBtnFlag( unsigned value )
    {
        bit_clear( btnflag , value );
        WriteBtnFlag( btnflag );
    }


    void WriteText( const char * text )
    {
        *( int* ) ( GetBtnAddr( ) + 0x1E8 ) = strlen( text );
        if ( GetBtnStringAddr( ) < 1000 )
        {
            ;
        }
        else
        {
            unsigned char nullbyte = 0;
            WriteProcessMemory( GetCurrentProcess( ) , ( void * ) ( GetBtnStringAddr( ) ) , text , strlen( text ) , 0 );
            WriteProcessMemory( GetCurrentProcess( ) , ( void * ) ( GetBtnStringAddr( ) + strlen( text ) ) , &nullbyte ,1 , 0 );
        }
    }


    int GetBtnAddr( )
    {
        if ( !fistnameset )
            return 0;


        if ( !buttonname )
            return 0;


        return ( int ) GetBtnAddr_p( buttonname , 0 );
    }


    unsigned char GetBtnFlag( )
    {
        if ( IsOk( ) )
        {
            return *( unsigned char * ) ( GetFlagAddr( ) );
        }
        return 0;
    }


    void WriteBtnFlag( unsigned char flag )
    {
        if ( IsOk( ) )
        {
            *( unsigned char * ) ( GetFlagAddr( ) ) = flag;
        }
    }


private:




    int GetFlagAddr( )
    {
        return GetBtnAddr( ) + 0x1D4;
    }


    bool is_btn_bit_set( unsigned bitindex )
    {
        unsigned value = GetBtnFlag();
        return ( value & ( 1 << bitindex ) ) != 0;
    }


    unsigned bit_set( unsigned value , unsigned bitindex )
    {
        return  value | ( 1 << bitindex );
    }


    unsigned bit_clear( unsigned value , unsigned bitindex )
    {
        return  value  & ~( 1 << bitindex );
    }


};
Использовать этот код можно только внутри процесса Warcraft III.

Что можно сделать с помощью этого кода?
• Получить текст с *EDITBOX'а"
• Узнать состояние(активна,нажата или под курсором,доступность и т.п ) кнопки/чекбокса/едитбокса (смотрите в BUTTONBIT )
Что планирую добавить?
• Установку флагов (состояние) - ГОТОВО
• Установка дополнительных флагов
• и т.п

Пример использования кода:

Код:
unsigned long __stdcall thread( LPVOID a1 )
{
	WarcraftButton tempbutton ( "AccountName" );

	while ( !tempbutton.IsOk( ) )
	{
		Sleep( 100 );
	}

	while ( true )
	{
		if ( !tempbutton.IsChecked( ) )
		{
			
			while ( !tempbutton.IsChecked( ) )
			{
				Sleep( 10 );
			}

			int btntextsize = tempbutton.GetBtnStringSize( );
			if ( btntextsize > 1 )
			{
				char * accountc = new char[ btntextsize+1 ];
				accountc[ btntextsize ] = '\0';
				ReadProcessMemory( GetCurrentProcess( ) , ( void* ) tempbutton.GetBtnStringAddr( ) , accountc , btntextsize , 0 );
				MessageBox( NULL , accountc , tempbutton.Author() , MB_OK );
				delete[ ]accountc;
			}
			

		}


		Sleep( 20 );
	}

	return 0;
}

HANDLE hThread;

BOOL WINAPI DllMain( HINSTANCE hDLL , UINT reason , LPVOID reserved )
{

	if ( reason == DLL_PROCESS_ATTACH )
	{
		hThread = CreateThread( 0 , 0 , thread , 0 , 0 , 0 );

	}
	else if ( reason == DLL_PROCESS_DETACH )
	{
		TerminateThread( hThread , 0 );
	}
	return TRUE;

}
- При входе в батлнет(если кликнуть на ник), появится сообщение с вашим ником

Пример для V2

Код:
unsigned long __stdcall thread( LPVOID a1 )
{
	WarcraftButton BattleNetButton = WarcraftButton( "BattleNetButton" ); // from mainmenu.fdf
	WarcraftButton BattleNetButtonText = WarcraftButton( "BattleNetButtonText" );
	int counter = 0;
	while ( true )
	{
		while ( !BattleNetButtonText.IsOk( ) )
		{
			Sleep( 50 );
		}
		while ( !BattleNetButton.IsOk( ) )
		{
			Sleep( 50 );
		}


		if ( BattleNetButton.IsBtnMouseOver( ) )
		{
			while ( BattleNetButton.IsBtnMouseOver( ) )
			{
				Sleep( 100 );
			}
			counter++;
			char * ccount = new char[ 50 ];
			sprintf_s( ccount , 50 , "|c0000FF00BATTLE.NET-%d" , counter );
			BattleNetButtonText.WriteText( ccount );
			delete [] ccount;
		}
		Sleep( 100 );
	}


	return 0;
}


HANDLE hThread;


BOOL WINAPI DllMain( HINSTANCE hDLL , UINT reason , LPVOID reserved )
{


	if ( reason == DLL_PROCESS_ATTACH )
	{
		hThread = CreateThread( 0 , 0 , thread , 0 , 0 , 0 );


	}
	else if ( reason == DLL_PROCESS_DETACH )
	{
		TerminateThread( hThread , 0 );
	}
	return TRUE;


}
- Отображает на кнопке BATTLE.NET сколько раз мышь была наведена на кнопку

Последний раз редактировалось Abso!; 17.08.2014 в 18:34. Причина: Добавлено сообщение
  Ответить с цитированием Наверх
3 пользователя(ей) сказали cпасибо:
DeaTHSeeKeR (07.06.2014), h4ckeR (08.06.2014), Misery (06.06.2014)
Старый 08.10.2015, 07:08   #2
Местный
 
Аватар для МедведИв
 
Регистрация: 13.07.2014
Адрес: Я живу на d3scene.ru
Сообщений: 55
Репутация: 11
По умолчанию

Re: [source] [C++] Класс для работы с кнопками Warcraft III [1.26a]


Тема не свежай, но тем не менее приятно пахнущая для меня
Хочу узнать, можешь ли ты написать программу, чтобы не нужно было ковырять mainmenu.fdf в ручную, а чтобы каждый смог изменять положение блоков в главном меню и текст этих блоков?
Например, блок "Credits" или "Титры" совершенно не нужен в варе. и его можно удалить.
Или вместо "Сохранение" написать " Предохранится" :D ну, то есть каждый, как захочет.
Не буду спрашивать, возможно ли это, для тебя возможно, но сделаешь ли?
__________________

  Ответить с цитированием Наверх
Старый 08.10.2015, 09:10   #3
Support GuAI



 
Аватар для Abso!
 
Регистрация: 31.10.2009
Адрес: BY
Сообщений: 1,425
Монетки D3Scene.Ru: 200
Репутация: 700
Отправить сообщение для Abso! с помощью Skype™
Автор По умолчанию

Re: [source] [C++] Класс для работы с кнопками Warcraft III [1.26a]


Я редактор fdf файлов варкрафта как-то раньше пытался написать но так и не закончил его))) Скорее всего нет но если появится время попробую сделать редактор.
  Ответить с цитированием Наверх
Пользователь сказал cпасибо:
HydraQ (10.10.2015)
Старый 10.10.2015, 20:00   #4
Местный
 
Аватар для HydraQ
 
Регистрация: 04.05.2009
Сообщений: 138
Репутация: 67
По умолчанию

Re: [source] [C++] Класс для работы с кнопками Warcraft III [1.26a]


Abso!, давно гуглил, и не нашел редактор. Тоже есть жедание покопаться в фдф, но вручную это ад. Тоже буду ждать редактора от тебя.
__________________
[Ссылки скрыты от гостей.]
  Ответить с цитированием Наверх
Старый 12.10.2015, 12:37   #5
Support GuAI



 
Аватар для Abso!
 
Регистрация: 31.10.2009
Адрес: BY
Сообщений: 1,425
Монетки D3Scene.Ru: 200
Репутация: 700
Отправить сообщение для Abso! с помощью Skype™
Автор По умолчанию

Re: [source] [C++] Класс для работы с кнопками Warcraft III [1.26a]


Мне кажется вряд ли близзард вручную в нотепаде создавали интерфейс))) Наверно у них должен быть какой-то специальный редактор может даже в ворлдедиторе должна была быть какая-нибудь вкладка для редактирования fdf )))

Учитесь в нотепаде редактировать там ничего сложного нет, если я и напишу редактор то точно не в ближайшие несколько месяцев
  Ответить с цитированием Наверх
Пользователь сказал cпасибо:
Misery (12.10.2015)
Ответ

Метки
Abso, Absol, C++, source


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Powered by vBulletin
Copyright © 2017 vBulletin Solutions, Inc.
Перевод: zCarot | Дизайн: G-A | Верстка: OldEr
Текущее время: 17:19. Часовой пояс GMT +4.