Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
Zloy_MoIIIeHHk
0 / 0 / 0
Регистрация: 31.08.2014
Сообщений: 13
1

Как скомпилировать в формат *.mix?

31.08.2014, 08:52. Просмотров 1574. Ответов 26
Метки нет (Все метки)

Я в С++ 0 полный.Помогите мне плыз.Есть код мапхака для варкрафт 3 как мне его скомпилировать в формат mix?
если можете объясните какой программой С++ или Delphi и по подробнее что куда тыкать чтоб получился mix формат)) ЗАРАНЕЕ СПАСИБО

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
/*==============================================================================
    Maphack.cpp for v1.26a
    
    *created by (c) wc3noobpl (2012)
    *originally based on Dennis(Zero) sources
==============================================================================*/
#include "System.h"
#include "WC3.h"
#include "MapHack.h"
#include "SafeClick.h"
#include <vector>
 
// Types
struct PatchOffset
{
    DWORD Addr;
    LPVOID Code;
    DWORD Length;
    BYTE* OriginalCode;
 
    // Construct
    PatchOffset(DWORD addr, LPVOID code, DWORD length)
    {
        Addr = addr;
        Code = code;
        Length = length;
        OriginalCode = NULL;
    }
};
 
// Vars
EMapHackType CurrentMapHackType = MAPHACK_OFF;
std::vector<PatchOffset> MapHackOffsets;
 
/*------------------------------------------------------------------------------
    InitMapHack
------------------------------------------------------------------------------*/
 
void InitMapHack()
{
    if(IsWC3Valid())
    {
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x3A15BA, "\xEB", 1));                      // MainUnits
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x3999F9, "\x09\xC3", 2));                  // Invisible
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x3A14C0, "\xEB\x30\x90\x90", 4));          // Items
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x282A50, "\x09\xC2", 2));                  // Illusions
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x38E9F0, "\xA8\xFF", 2));                  // Missles
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x04B7D3, "\x90\x90", 2));                  // RallyPoints
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x2851B2, "\xEB", 1));                      // Clickable Units
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x34F2A8, "\x90\x90", 2));                  // Skills #1
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x2026DC, "\x90\x90\x90\x90\x90\x90", 6));  // Skills #2
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x0C838C, "\x0F\x8C\xFC\x00\x00\x00", 6));  // Skills #3
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x34F2E8, "\x90\x90", 2));                  // Cooldowns
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x28E1DE, "\xEB\x31", 2));                  // Status
        //MapHackOffsets.push_back(PatchOffset(GameBase + 0x424C7C, "\x90\x90", 2));                    // Enemy Clicks [bug], 421690 - nevermind just note for me
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x43EE8B, "\xEB\x24\x90\x90\x90\x90", 6));  // Pings
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x361176, "\xEB", 1));                      // Creepdots
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x406B50, "\xE9\xED\x00\x00\x00\x90", 6));  // Ud Blight
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x0EE9A0, "\x90\x90", 2));                  // Build Blueprints #1
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x35C0E5, "\x90\x90", 2));                  // Build Blueprints #2
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x35FA2B, "\xEB\x1F", 2));                  // Clickable Resources
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x049F33, "\x90\x90\x90\x90\x90\x90", 6));  // Buildings #1
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x044A90, "\x90\x90\x90\x90\x90\x90", 6));  // Buildings #2
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x04B5FD, "\x90\x90\x90\x90\x90\x90", 6));  // Buildings #3
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x3C639C, "\xB8", 1));                      // Dota -ah Bypass #1
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x3C63A1, "\xEB", 1));                      // Dota -ah Bypass #2
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x3CB872, "\xEB", 1));                      // Dota -ah Bypass #3
        MapHackOffsets.push_back(PatchOffset(GameBase + 0x3A14DB, "\x71", 1));                      // Show Runes
 
        // backup original
        for(DWORD i = 0; i < MapHackOffsets.size(); i++)
        {
            MapHackOffsets[i].OriginalCode = new BYTE[MapHackOffsets[i].Length];
            for(DWORD j = 0; j < MapHackOffsets[i].Length; j++)
                MapHackOffsets[i].OriginalCode[j] = *((BYTE*)(MapHackOffsets[i].Addr + j));
        }
    }
}
 
/*------------------------------------------------------------------------------
    InitGameMapHack
------------------------------------------------------------------------------*/
 
void InitGameMapHack()
{
    switch(CurrentMapHackType)
    {
        case MAPHACK_FOG_STANDARD: PrintText(10, "|cFFAAAAAAMapHack FOG STANDARD|r"); break;
        case MAPHACK_FOG_SHARED:   PrintText(10, "|cFFAAAAAAMapHack FOG SHARED|r"); break;
        case MAPHACK_FOG_NONE:     PrintText(10, "|cFFAAAAAAMapHack FOG NONE|r"); break;
        case MAPHACK_OFF:          PrintText(10, "|cFFAAAAAAMapHack OFF|r"); break;
    }
    PrintText(10, "|cFFAAAAAASafeClick ON|r");
}
 
/*------------------------------------------------------------------------------
    EnableMapHack
------------------------------------------------------------------------------*/
 
void EnableMapHack()
{
    if(IsWC3Valid() && MapHackOffsets.size() > 0)
    {
        if(CurrentMapHackType == MAPHACK_OFF)
        {
            for(DWORD i = 0; i < MapHackOffsets.size(); i++)
                PatchMemory((void*)MapHackOffsets[i].Addr, MapHackOffsets[i].Code, MapHackOffsets[i].Length);
 
            EnableSafeClick();
            CurrentMapHackType = MAPHACK_FOG_STANDARD;
        }
    }
}
 
/*------------------------------------------------------------------------------
    DisableMapHack
------------------------------------------------------------------------------*/
 
void DisableMapHack()
{
    if(IsWC3Valid() && MapHackOffsets.size() > 0)
    {
        if(CurrentMapHackType != MAPHACK_OFF)
        {
            // original standard fog
            PatchMemory((void*)(GameBase + 0x74C9F1), "\x8B\x54\x24\x28\x52", 5);
            PatchMemory((void*)(GameBase + 0x3564B8), "\x66\x23\xC2", 3);
 
            // original map code
            DisableSafeClick();
            for(DWORD i = 0; i < MapHackOffsets.size(); i++)
                PatchMemory((void*)MapHackOffsets[i].Addr, MapHackOffsets[i].OriginalCode, MapHackOffsets[i].Length);
 
            CurrentMapHackType = MAPHACK_OFF;
        }
    }
}
 
/*------------------------------------------------------------------------------
    ExitMapHack
------------------------------------------------------------------------------*/
 
void ExitMapHack()
{
    if(MapHackOffsets.size() > 0)
    {
        DisableMapHack();
        for(DWORD i = 0; i < MapHackOffsets.size(); i++)
            delete[] MapHackOffsets[i].OriginalCode;
        MapHackOffsets.clear();
    }
}
 
/*------------------------------------------------------------------------------
    ToggleMapHack
------------------------------------------------------------------------------*/
 
void ToggleMapHack()
{
    if(IsInGame())
    {
        switch(CurrentMapHackType)
        {
            case MAPHACK_OFF:
            {
                EnableMapHack();
                PrintText(10, "|cFFAAAAAAMapHack FOG STANDARD|r");
                break;
            }
            case MAPHACK_FOG_STANDARD:
            {
                // shared fog
                PatchMemory((void*)(GameBase + 0x74C9F1), "\x68\xFF\x00\x00\x00", 5);
                PatchMemory((void*)(GameBase + 0x3564B8), "\x66\x21\xC0", 3);
                CurrentMapHackType = MAPHACK_FOG_SHARED;
                PrintText(10, "|cFFAAAAAAMapHack FOG SHARED|r");
                break;
            }
            case MAPHACK_FOG_SHARED:
            {
                // none fog
                PatchMemory((void*)(GameBase + 0x74C9F1), "\x8B\x14\x24\x90\x52", 5);
                PatchMemory((void*)(GameBase + 0x3564B8), "\x66\x09\xD0", 3);
                CurrentMapHackType = MAPHACK_FOG_NONE;
                PrintText(10, "|cFFAAAAAAMapHack FOG NONE|r");
                break;
            }
            case MAPHACK_FOG_NONE:
            {
                DisableMapHack();
                PrintText(10, "|cFFAAAAAAMapHack OFF|r");
                break;
            }
        }
    }
}
 
/*------------------------------------------------------------------------------
    GetMapHackType
------------------------------------------------------------------------------*/
 
EMapHackType GetMapHackType()
{
    return CurrentMapHackType;
}
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2014, 08:52
Ответы с готовыми решениями:

Задача с Mix Contest 3
Всем привет. Обращаюсь к вам за помощью с задачей &quot;Курфюрста ужасов&quot;, прикрепила условие во...

Как скомпилировать формат ui в py
Помогите как скомпилировать формат ui в py

Как скомпилировать программу в формат exe?
У меня на компьютере спокойно запускаются все мои проекты, а вот когда запускают друзья у них...

Как скомпилировать модуль BlueDroid в формат apk на linux?
Недавно решил написать простую програмку с модулем pybluez для android,но при запуске оно даже не...

Скомпилировать python код в формат exe
Я пытался скомпилировать python код в формат exe с помощью pyinstaller но когда я ввожу pyinstaller...

26
-NEURON-
Заблокирован
01.09.2014, 09:26 2
Цитата Сообщение от Zloy_MoIIIeHHk Посмотреть сообщение
Я в С++ 0 полный.
Поздравляю
Цитата Сообщение от Zloy_MoIIIeHHk Посмотреть сообщение
как мне его скомпилировать в формат mix?
Ну а что - такое твой mix формат? Небойс плагин какой - то? Тогда в dll собирай и переименовывай, хотя я тут не вижу ни одной экспортной функции...
Возможно это просто класс с реализацией функциональности, тогда создавай какой - нибуть простой проект с окном диалога и парочкой нужных кнопок - энабле, дизабле и используй свой класс.
1
Zloy_MoIIIeHHk
0 / 0 / 0
Регистрация: 31.08.2014
Сообщений: 13
01.09.2014, 10:19  [ТС] 3
Собственно mix работает при запуске Warcraft3 , он как плугин.Значит мне про100 собрать нужно в dll и переименовать.... спс. Но как собрать dll я хз :-) У меня не только Maphack.cpp но и "System.h" , "WC3.h" , "MapHack.h" , "SafeClick.h" И как соединить их в 1 dll не могу представить) Если не трудно напишите плыз мб разберусь....

Добавлено через 5 минут
Ещё вопрос... Можно-ли как-нибудь отредактировать уже скомпилированный mix или dll ?
0
-NEURON-
Заблокирован
01.09.2014, 11:04 4
Цитата Сообщение от Zloy_MoIIIeHHk Посмотреть сообщение
Можно-ли как-нибудь отредактировать уже скомпилированный mix или dll ?
Можно, но только HEX редактором или же воспользоваться профессиональными хакерскими шутками типа IDA PRO, но всё это дело всё равно придётся реализовывать через дизассемблер, который на выходе будет показывать только команды masm Так что - забей.

Цитата Сообщение от Zloy_MoIIIeHHk Посмотреть сообщение
Собственно mix работает при запуске Warcraft3 , он как плугин
В таком видео он не может работать как ПЛУГин, т.к. обычно плагины - это динамические библиотеки, который подгружаются на лету, если речь идёт в Windows, то там по крайней мере должен быть DllMain и несколько экспортных функций. Ты выкладывай сюда код всех
Цитата Сообщение от Zloy_MoIIIeHHk Посмотреть сообщение
"System.h" , "WC3.h" , "MapHack.h" , "SafeClick.h"
, тогда посмотрю, что можно сделать.
1
01.09.2014, 11:04
Zloy_MoIIIeHHk
0 / 0 / 0
Регистрация: 31.08.2014
Сообщений: 13
01.09.2014, 11:50  [ТС] 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*==============================================================================
    Maphack.h
    
    *created by (c) wc3noobpl (2012)
==============================================================================*/
#pragma once
 
/*------------------------------------------------------------------------------
    Types
------------------------------------------------------------------------------*/
 
enum EMapHackType
{
    MAPHACK_OFF,
    MAPHACK_FOG_STANDARD,
    MAPHACK_FOG_SHARED,
    MAPHACK_FOG_NONE,
};
 
/*------------------------------------------------------------------------------
    Methods
------------------------------------------------------------------------------*/
 
void InitMapHack();
void InitGameMapHack();
void EnableMapHack();
void ToggleMapHack();
EMapHackType GetMapHackType();
void DisableMapHack();
void ExitMapHack();
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*==============================================================================
    SafeClick.h
    
    *created by (c) wc3noobpl (2012)
    *originally based on el patron sources
==============================================================================*/
#pragma once
 
/*------------------------------------------------------------------------------
    Types
------------------------------------------------------------------------------*/
 
#pragma pack(push,1)
struct SelectionAction
{
    BYTE OpCode;            //0x16
    BYTE Mode;              //1 - select, 2 unselect
    WORD Count;
    DWORD UnitIDs[12][2];
};
#pragma pack(pop)
 
/*------------------------------------------------------------------------------
    Methods
------------------------------------------------------------------------------*/
 
Unit* GetUnitByIDs(DWORD id1, DWORD id2);
void EnableSafeClick();
void DisableSafeClick();
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*==============================================================================
    System.h
    
    *created by (c) wc3noobpl (2012)
==============================================================================*/
#pragma once
 
// System includes
#define _CRT_SECURE_NO_WARNINGS
#define WIN32_LEAN_AND_MEAN
#define XP_WIN
 
#include <windows.h>
#include <mmsystem.h>   // timeGetTime
#include <stdio.h>
#include <math.h>
//#include <shlwapi.h>
//#include <ctime>
//#include <direct.h>
//#include <stdlib.h>
//#include <errno.h>
//#include <io.h>
//#include <string.h>
//#include <Tlhelp32.h>
//#include <string>
//#include <sstream>
Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
/*==============================================================================
    WC3.cpp
    
    *created by (c) wc3noobpl (2012)
    *originally based on Sheppard sources
    *also based on YourName sources (IsInGame, stayUpTime)
==============================================================================*/
#include "System.h"
#include "WC3.h"
 
// Link extern vars
#define _DEFINE_VARS
#include "WC3Ptrs.h"
#undef _DEFINE_VARS
 
// Vars
DWORD GameBase = NULL;
DWORD GameVersion = 0;  // 0x1A for 1.26a (low word == number, high word == letter)
 
/*------------------------------------------------------------------------------
    InitWC3Ptrs
------------------------------------------------------------------------------*/
 
void InitWC3Ptrs()
{
    GameBase = (DWORD)GetModuleHandle("Game.dll");
 
    // init ptrs before calling other wc3 functions
    #define _SET_GAMEBASE GameBase
    #include "WC3Ptrs.h"
    #undef _SET_GAMEBASE
 
    // init wc3 version
    DWORD  verHandle = NULL;
    UINT   size      = 0;
    LPBYTE lpBuffer  = NULL;
    DWORD  verSize   = GetFileVersionInfoSize("Game.dll", &verHandle);
    if(verSize != NULL)
    {
        LPSTR verData = new char[verSize];
        if(GetFileVersionInfo("Game.dll", verHandle, verSize, verData))
        {
            if(VerQueryValue(verData, "\\", (VOID FAR* FAR*)&lpBuffer, &size))
            {
                if(size)
                {
                    VS_FIXEDFILEINFO* verInfo = (VS_FIXEDFILEINFO*) lpBuffer;
                    if(verInfo->dwSignature == 0xfeef04bd)
                    {
                        // example for 1.26.0.6401
                        DWORD majorMS = HIWORD(verInfo->dwFileVersionMS);   // 1
                        DWORD minorMS = LOWORD(verInfo->dwFileVersionMS);   // 26
                        DWORD majorLS = HIWORD(verInfo->dwFileVersionLS);   // 0
                        DWORD minorLS = LOWORD(verInfo->dwFileVersionLS);   // 6401
                        
                        // we need only middle numbers 26.0
                        GameVersion = minorMS | majorLS << 16;
                    }
                }
            }
        }
    }
}
 
/*------------------------------------------------------------------------------
    IsWC3Valid
------------------------------------------------------------------------------*/
 
bool IsWC3Valid()
{
    // pointers inited and version match
    return GameBase && GameVersion == 26;   // 1.26a
}
 
/*------------------------------------------------------------------------------
    IsInGame
------------------------------------------------------------------------------*/
 
bool IsInGame()
{
    return (IsWC3Valid() && (*GAME_GameInfo) && *GAME_InGame1 == 4 && *GAME_InGame2 == 4);
}
 
/*------------------------------------------------------------------------------
    GetGameState
------------------------------------------------------------------------------*/
 
EGameState GetGameState()
{
    return (EGameState)(*GAME_GameState);
}
 
/*------------------------------------------------------------------------------
    GetGameState2
------------------------------------------------------------------------------*/
 
EGameState2 GetGameState2()
{
    // works much better for main menu than game state 1,
    // game state 1 returns main menu when game loading.
    return (EGameState2)(*GAME_GameState2);
}
 
/*------------------------------------------------------------------------------
    GetPlayerCount
------------------------------------------------------------------------------*/
 
DWORD GetPlayerCount()
{
    if(!IsInGame())
        return 0;
 
    return (*GAME_GameInfo)->PlayerCount;
}
 
/*------------------------------------------------------------------------------
    GetLocalPlayerSlot
------------------------------------------------------------------------------*/
 
DWORD GetLocalPlayerSlot()
{
    if(!IsInGame())
        return INVALID_SLOT;
 
    return (*GAME_GameInfo)->PlayerSlot;
}
 
/*------------------------------------------------------------------------------
    GetPlayer
------------------------------------------------------------------------------*/
 
Player* GetPlayer(DWORD slot)
{
    if(!IsInGame())
        return NULL;
 
    if((*GAME_GameInfo) && (*GAME_GameInfo)->PlayerCount > slot)
        return (*GAME_GameInfo)->PlayerList[slot];
 
    return NULL;
}
 
/*------------------------------------------------------------------------------
    GetLocalPlayer
------------------------------------------------------------------------------*/
 
Player* GetLocalPlayer()
{
    return GetPlayer(GetLocalPlayerSlot());
}
 
/*------------------------------------------------------------------------------
    PrintText
------------------------------------------------------------------------------*/
 
void PrintText(float stayUpTime, char* message)
{
    // note: stayUpTime is in seconds (==0 means stay forever, ==10 default)
 
    if(!IsInGame())
        return;
 
    DWORD ptrList = GAME_GetPtrList();
    if(!ptrList)
        return;
 
    // *basicly taken from Sheppard PrintText_ASM and translated to C++,
    // didn't research what exactly means offset 0x3EC, possibly its chatPtrList or smth,
    // it's just working and thats all (c) wc3noobpl.
    static DWORD color = 0xFFFFFFFF;    // (c) Dennis
    GAME_Print(*((DWORD*)(ptrList + 0x3EC)), ptrList, message, &color, *((DWORD*)&stayUpTime), NULL);
}
 
/*------------------------------------------------------------------------------
    PrintTextFormat
------------------------------------------------------------------------------*/
 
void PrintTextFormat(float stayUpTime, char* format, ...)
{
    char str[8192] = {0};
    va_list args;
 
    va_start(args, format);
    vsprintf(str, format, args);
    va_end(args);
 
    PrintText(stayUpTime, str);
}
 
/*------------------------------------------------------------------------------
    PrintChat
------------------------------------------------------------------------------*/
 
void PrintChat(float stayUpTime, EChatRecipient msgType, char* message)
{
    // note: stayUpTime is in seconds (==0 means stay forever, ==10 default)
 
    if(!IsInGame())
        return;
 
    GAME_PrintChat(*GAME_ChatPtrList, 0, GetLocalPlayerSlot(), message, (DWORD)msgType, *((DWORD*)&stayUpTime));
}
 
/*------------------------------------------------------------------------------
    PrintChatFormat
------------------------------------------------------------------------------*/
 
void PrintChatFormat(float stayUpTime, EChatRecipient msgType, char* format, ...)
{
    char str[8192] = {0};
    va_list args;
 
    va_start(args, format);
    vsprintf(str, format, args);
    va_end(args);
 
    PrintChat(stayUpTime, msgType, str);
}
 
/*------------------------------------------------------------------------------
    SendPacket
------------------------------------------------------------------------------*/
 
void SendPacket(BYTE* packetData, DWORD size)
{
    // @warning: this function thread-unsafe, do not use it in other thread.
    // note: this is very useful function, in fact this function
    // does wc3 ingame action, so you can use it for anything you want,
    // including unit commands and and gameplay commands,
    // i suppose its wc3 single action W3GS_INCOMING_ACTION (c) wc3noobpl.
0
Zloy_MoIIIeHHk
0 / 0 / 0
Регистрация: 31.08.2014
Сообщений: 13
01.09.2014, 11:53  [ТС] 6
продолжение вышестоящего кода

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
/
    if(!IsInGame())
        return;
 
    Packet packet;
    memset(&packet, 0, sizeof(Packet));
 
    packet.PacketClassPtr = (DWORD)GAME_PacketClassPtr; // Packet Class
    packet.PacketData = packetData;
    packet.Size = size;
    packet._3 = 0xFFFFFFFF;
    GAME_SendPacket(&packet, 0);
}
 
/*------------------------------------------------------------------------------
    Player Info
------------------------------------------------------------------------------*/
 
const char* GetName(DWORD slot)
{
    if(!IsInGame())
        return "";
 
    return GAME_GetPlayerName(slot);
}
ERace GetRace(DWORD slot)
{
    if(IsInGame())
    {
        Player* player = GetPlayer(slot);
        if(player != NULL)
            return (ERace)player->Race;
    }
    return RACE_UNKNOWN;
}
const char* GetRaceString(DWORD slot)
{
    ERace race = GetRace(slot);
    switch(race)
    {
        case RACE_HUMAN: return "HUM";
        case RACE_ORC: return "ORC";
        case RACE_NIGHTELVE: return "ELF";
        case RACE_UNDEAD: return "UD";
    }
    return "UNKNOWN";
}
DWORD GetGold(DWORD slot)
{
    if(!IsInGame())
        return 0;
 
    return GAME_GetGold(GetPlayer(slot));
}
DWORD GetWood(DWORD slot)
{
    if(!IsInGame())
        return 0;
 
    return GAME_GetLumber(GetPlayer(slot));
}
DWORD GetMinSupply(DWORD slot)
{
    if(!IsInGame())
        return 0;
 
    return GAME_GetMinSupply(GetPlayer(slot));
}
DWORD GetMaxSupply(DWORD slot)
{
    if(!IsInGame())
        return 0;
 
    return GAME_GetMaxSupply(GetPlayer(slot));
}
DWORD GetColor(DWORD slot)
{
    if(!IsInGame())
        return 0;
 
    Player* player = GetPlayer(slot);
    return player != NULL ? *GAME_GetPlayerColor(slot) : 0;
}
const char* GetColorString(char* outStr, DWORD slot)
{
    // @warning: make sure outStr have size >= 8 + 1 for null terminating
    DWORD color = GetColor(slot);
    sprintf(outStr, "%02X%02X%02X%02X", ((color & 0xFF000000)>>24), ((color & 0x00FF0000)>>16), ((color & 0x0000FF00)>>8), (color & 0x000000FF));
    return outStr;
}
 
/*------------------------------------------------------------------------------
    Feed
------------------------------------------------------------------------------*/
 
void Feed(DWORD toPlayerSlot, DWORD feedGoldCount, DWORD feedWoodCount)
{
    // @warning: this function doesn't work through thread, its not thread-safe,
    // use windows message hook instead (c) wc3noobpl.
    
    if(!IsInGame())
        return;
 
    if(feedGoldCount > 0 || feedWoodCount > 0)
    {
        // dont give more than you have
        DWORD feedGold = min(GetGold(GetLocalPlayerSlot()), feedGoldCount);
        DWORD feedWood = min(GetWood(GetLocalPlayerSlot()), feedWoodCount);
        if(feedGold > 0 || feedWood > 0)
        {
            BYTE packet[10] = {0x51,(BYTE)toPlayerSlot};
            *((DWORD*)(&packet[2])) = feedGold;
            *((DWORD*)(&packet[6])) = feedWood;
            SendPacket(packet, 10);
        }
    }
}
 
/*------------------------------------------------------------------------------
    IsAlly
------------------------------------------------------------------------------*/
 
bool IsAlly(DWORD slot)
{
    if(slot < GetPlayerCount())
    {
        Player* localPlayer = GetLocalPlayer();
        Player* player = GetPlayer(slot);
        if(localPlayer->Team == player->Team)
            return true;
    }
    return false;
}
 
/*------------------------------------------------------------------------------
    GetAllySlot
------------------------------------------------------------------------------*/
 
DWORD GetAllySlot(DWORD allyIndex)
{
    DWORD playerCount = GetPlayerCount();
    Player* localPlayer = GetLocalPlayer();
    if(localPlayer != NULL)
    {
        DWORD currentAllyIndex = 0;
        for(DWORD i = 0; i < playerCount; i++)
        {
            Player* player = GetPlayer(i);
            if(player != NULL && player != localPlayer && player->Team == localPlayer->Team)
            {
                if(currentAllyIndex == allyIndex)
                    return player->Slot;
 
                currentAllyIndex++;
            }
        }
    }
    return INVALID_SLOT;    // not found
}
 
/*------------------------------------------------------------------------------
    IsHighUpkeep
------------------------------------------------------------------------------*/
 
bool IsHighUpkeep(DWORD slot)
{
    return GetMinSupply(slot) > 80;
}
 
/*------------------------------------------------------------------------------
    IsLowOrHighUpkeep
------------------------------------------------------------------------------*/
 
bool IsLowOrHighUpkeep(DWORD slot)
{
    return GetMinSupply(slot) > 50;
}
 
/*------------------------------------------------------------------------------
    ConvertGoldToLowUpkeep
------------------------------------------------------------------------------*/
 
DWORD ConvertGoldToLowUpkeep(DWORD goldCount, DWORD slot)
{
    // converts to mid for both mid and high supply
    return IsLowOrHighUpkeep(slot) ? (DWORD)((double)goldCount / 0.7) : goldCount;
}
 
/*------------------------------------------------------------------------------
    IsAllys
------------------------------------------------------------------------------*/
 
bool IsAllys()
{
    return GetAllySlot(0) != INVALID_SLOT ? true : false;
}
 
/*------------------------------------------------------------------------------
    IsLagScreen
------------------------------------------------------------------------------*/
 
bool IsLagScreen()
{
    // @todo: not work properly, perhaps its only for specified player slot.
 
    if(!IsInGame())
        return false;
 
    return (*GAME_IsLagScreen) != 0 ? true : false;
}
 
/*------------------------------------------------------------------------------
    Intercept helpers
------------------------------------------------------------------------------*/
 
bool PatchMemory(void* addr, void* data, DWORD size)
{
    DWORD oldProtect;
    if(!VirtualProtect(addr, size, PAGE_READWRITE, &oldProtect))
        return false;
 
    memcpy(addr, data, size);
    return VirtualProtect(addr, size, oldProtect, &oldProtect) ? true : false;
}
bool InterceptCall(DWORD instAddr, DWORD func)
{
    // asm code uses offsets from next position instead of direct address,
    // 5 is current CALL instruction code length (instID + funcOffset).
 
    // ensure we have CALL instruction here
    DWORD funcOffset = func - (instAddr + 5);
    if(*((BYTE*)instAddr) == 0xE8)
        return PatchMemory((void*)(instAddr + 1), &funcOffset, 4);
 
    return false;
}
bool InterceptCallSafe(DWORD instAddr, DWORD oldFunc, DWORD func)
{
    // ensure we have old func offset here, to prevent wrong patch
    DWORD oldFuncOffset = oldFunc - (instAddr + 5);
    if(*((DWORD*)(instAddr + 1)) == oldFuncOffset)
        return InterceptCall(instAddr, func);
 
    return false;
}
0
Zloy_MoIIIeHHk
0 / 0 / 0
Регистрация: 31.08.2014
Сообщений: 13
01.09.2014, 11:55  [ТС] 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
/*==============================================================================
    WC3.h
    
    *created by (c) wc3noobpl (2012)
    *originally based on Sheppard sources
    *also base on YourName sources (GameState)
==============================================================================*/
#pragma once
 
#define INVALID_SLOT ((DWORD)(-1))
 
/*------------------------------------------------------------------------------
    Types
------------------------------------------------------------------------------*/
 
enum EGameState : DWORD
{
    GSTATE_LOADING_CUSTOM_GAME_BNET     = 14,
    GSTATE_LOADING_CUSTOM_GAME_SP       = 14,
    GSTATE_LOADING_SAVED_GAME_LAN       = 23,
    GSTATE_LOADING_CUSTOM_GAME_LAN      = 23,
    GSTATE_LOADIND_REGULAR_GAME_BNET    = 26,
    GSTATE_LOADING_REGULAR_GAME_LAN     = 26,
    GSTATE_LOADING_REGULAR_GAME_SP      = 26,
    GSTATE_MAIN_MENU_WC                 = 38,
    GSTATE_MAIN_MENU_SP                 = 47,
    GSTATE_MAIN_MENU_LAN                = 63,
    GSTATE_CHOOSE_MAP_LAN               = 64,
    GSTATE_SCORE_SCREEN_WC              = 65,
    GSTATE_HOST_LOBBY_BNET              = 85,
    GSTATE_HOST_LOBBY_LAN               = 85,
    GSTATE_CHOOSE_MAP_SP                = 93,
    GSTATE_LOGON_SCREEN_BNET            = 107,
    GSTATE_OPTION_MENU_WC               = 119,
    GSTATE_MAIN_SCREEN_BNET             = 197,
    GSTATE_CHAT_SCREEN_BNET             = 197,
    GSTATE_JOIN_LOBBY_BNET              = 229,
    GSTATE_JOIN_LOBBY_LAN               = 229,
    GSTATE_CHOOSE_MAP_BNET              = 267,
    GSTATE_CUSTOM_GAMES_LIST_BNET       = 269,
    GSTATE_AT_SCREEN_BNET               = 291,
    GSTATE_INGAME_SP                    = 388,
    GSTATE_WATCHING_REPLAY_2_SP         = 395,
    GSTATE_INGAME_SAVED_SP              = 400,
    GSTATE_INGAME_BNET                  = 404,
    GSTATE_INGAME_LAN                   = 404,
    GSTATE_INGAME_2_SP                  = 410,
    GSTATE_INGAME_SAVED_BNET            = 416,
    GSTATE_INGAME_SAVED_LAN             = 416,
    GSTATE_AFTER_MODE_SP                = 438,
    GSTATE_WATCHING_REPLAY_SP           = 445,
    GSTATE_AFTER_MODE_BNET              = 454,
    GSTATE_AFTER_MODE_LAN               = 454,
    GSTATE_VIEWING_PROFILE_BNET         = 460,
    GSTATE_VIEWING_PROFILE_2_BNET       = 464,
    GSTATE_INGAME_3_BNET                = 476,
    GSTATE_INGAME_2_LAN                 = 500,
    GSTATE_INGAME_2_BNET                = 508
};
 
enum EGameState2 : DWORD
{
    GSTATE2_MAIN_MENU_WC = 24
};
 
enum EChatRecipient : DWORD
{
    CHAT_RECIPIENT_ALL          = 0,
    CHAT_RECIPIENT_ALLIES       = 1,
    CHAT_RECIPIENT_OBSERVERS    = 2,
    CHAT_RECIPIENT_REFEREES     = 2,
    CHAT_RECIPIENT_PRIVATE      = 3     // basicly this is used
};
 
enum ERace : DWORD
{
    RACE_UNKNOWN = 0,
    RACE_HUMAN,
    RACE_ORC,
    RACE_UNDEAD,
    RACE_NIGHTELVE,
};
 
#pragma pack(push,1)
 
// total size = 0x430
struct Player
{
    BYTE _1[0x30];          //0x00
    WORD Slot;              //0x30
    WORD _2;                //0x32
    DWORD PtrList;          //0x34, Necessary to get ahold of the current selected units!
    BYTE _3[0x228];         //0x38
    DWORD Race;             //0x260
    DWORD ColorIndex;       //0x264
    BYTE _4[0x10];          //0x268
    DWORD Team;             //0x278
};
 
struct GameInfo
{
    DWORD PtrList;          //0x00, PtrList means pointer to some unknown list of pointers
    DWORD _1[0x9];          //0x24, _1 _2 _3 ... means unknown skipped data
    WORD PlayerSlot;        //0x28 
    WORD _2;                //0x30
    DWORD _3[0x6];          //0x40 
    DWORD MaxPlayerCount;   //0x44 
    DWORD _4;               //0x48 
    DWORD PlayerCount;      //0x4C 
    DWORD _5[0x2];          //0x50 
    Player* PlayerList[15]; //0x58 
};
 
struct Packet
{
    DWORD PacketClassPtr;   //+00, some unknown, but needed, Class Pointer
    BYTE* PacketData;       //+04
    DWORD _1;               //+08, zero
    DWORD _2;               //+0C, ??
    DWORD Size;             //+10, size of PacketData
    DWORD _3;               //+14, 0xFFFFFFFF
};
 
struct UnitInfo
{
    DWORD Ptr;              //0x0
    DWORD _1[3];            //0x4
    DWORD XTargetCoord;     //0x8 <- Not sure about these two, but they only appear when a unit is moving
    DWORD YTargetCoord;     //0xC more investigation is needed!
    BYTE _2[0x24];
    DWORD _3[2];            // 0x30
    DWORD MapX;             // 0x34
    DWORD MapY;             // 0x38
};
 
struct Unit
{
    DWORD _1[3];            //0x00
    DWORD ID1;              //0xC
    DWORD ID2;              //0x10
    BYTE _2[0x1C];          //0x2C (0x28 -> Unit Type ..?)
    DWORD ClassId;          //0x30
    BYTE _3[0x24];          //0x54
    DWORD OwnerSlot;        //0x58
    BYTE _4[0x108];         //0x5C
    //1A0
    UnitInfo Info;          //0x164
};
 
#pragma pack(pop)
 
/*------------------------------------------------------------------------------
    Includes
------------------------------------------------------------------------------*/
 
#include "WC3Ptrs.h"
 
/*------------------------------------------------------------------------------
    Vars
------------------------------------------------------------------------------*/
 
extern DWORD GameBase;
extern DWORD GameVersion;
 
/*------------------------------------------------------------------------------
    Methods
------------------------------------------------------------------------------*/
 
void InitWC3Ptrs();
bool IsWC3Valid();
bool IsInGame();
EGameState GetGameState();
EGameState2 GetGameState2();
DWORD GetPlayerCount();
DWORD GetLocalPlayerSlot();
Player* GetPlayer(DWORD slot);
Player* GetLocalPlayer();
void PrintText(float stayUpTime, char* message);
void PrintTextFormat(float stayUpTime, char* format, ...);
void PrintChat(float stayUpTime, EChatRecipient msgType, char* message);
void PrintChatFormat(float stayUpTime, EChatRecipient msgType, char* format, ...);
void SendPacket(BYTE* packetData, DWORD size);
const char* GetName(DWORD slot);
ERace GetRace(DWORD slot);
DWORD GetColor(DWORD slot);
const char* GetColorString(char* outStr, DWORD slot);
DWORD GetGold(DWORD slot);
DWORD GetWood(DWORD slot);
DWORD GetMinSupply(DWORD slot);
DWORD GetMaxSupply(DWORD slot);
 
// Feed helpers
void Feed(DWORD toPlayerSlot, DWORD feedGoldCount, DWORD feedWoodCount);
bool IsAlly(DWORD slot);
DWORD GetAllySlot(DWORD allyIndex);
bool IsHighUpkeep(DWORD slot);
bool IsLowOrHighUpkeep(DWORD slot);
DWORD ConvertGoldToLowUpkeep(DWORD goldCount, DWORD slot);
bool IsAllys();
bool IsLagScreen();
 
// Intercept helpers
bool PatchMemory(void* addr, void* data, DWORD size);
bool InterceptCall(DWORD instAddr, DWORD func);
bool InterceptCallSafe(DWORD instAddr, DWORD oldFunc, DWORD func);
Добавлено через 1 минуту
там ещё есть кучу файлов... ,но я думаю они к мх не относятся.
0
-NEURON-
Заблокирован
01.09.2014, 12:00 8
Я не вижу тут ни одной экспортной функции, значит mix - это не dll. Ты можешь собрать это всё в DLL, но тольку от этого будет ноль.

Это просто какой - то код, который в отдельной программе - чите надо использовать просто.

Добавлено через 2 минуты
Попробуй найди хоть в каком - то файле строчку __declspec(dllexport), это будет означать, что это DLL и ты сможешь узнать, откуда начинать копать. А лучше все файлы архивом прикрепляй
1
Zloy_MoIIIeHHk
0 / 0 / 0
Регистрация: 31.08.2014
Сообщений: 13
01.09.2014, 12:05  [ТС] 9
но какой проге пишут мх...? я думал на с++ или делпфи

Добавлено через 2 минуты
могу выложить всё что у меня есть архивом... Посмотришь?
0
-NEURON-
Заблокирован
01.09.2014, 12:09 10
Цитата Сообщение от Zloy_MoIIIeHHk Посмотреть сообщение
но какой проге пишут мх...? я думал на с++
Я не знаю что такое формат mix ... Любую программу можно написать на c++.

Вот тут есть какой - то редактор твоих mix файлов http://xgm.guru/p/xm/ladikmpq, правда его надо переименовать из mix в какой - то w3 чего - то там, посомтришь в списке открывания для варкрафта.

Добавлено через 10 секунд
выкладывай
1
ForEveR
В астрале
Эксперт С++
8009 / 4766 / 654
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
01.09.2014, 12:12 11
Zloy_MoIIIeHHk, Уважаемый, неужели так трудно пойти в гугл да посмотреть что к чему? Если нет знаний - зачем лезть в реализацию читов?
Вбиваем в гугл: .mix file Warcraft 3 и читаем подходящие ссылки (естесно выборочно).
И да, по-моему данный форум не особо подходит для обсуждения данного мапхака.
0
Zloy_MoIIIeHHk
0 / 0 / 0
Регистрация: 31.08.2014
Сообщений: 13
01.09.2014, 12:18  [ТС] 12
там есть скомпилированный мапхак в папке bin

Добавлено через 3 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
Zloy_MoIIIeHHk, Уважаемый, неужели так трудно пойти в гугл да посмотреть что к чему? Если нет знаний - зачем лезть в реализацию читов?
Вбиваем в гугл: .mix file Warcraft 3 и читаем подходящие ссылки (естесно выборочно).
Если бы было всё так про100 я тут не сидел и не отписывал про это
ты папробуй найти в гугле хотябы эти скрипты какие я рыл гдето месяц и то не нанаших форумах мапхпкерах

Добавлено через 1 минуту
Цитата Сообщение от -NEURON- Посмотреть сообщение
http://xgm.guru/p/xm/ladikmpq
у меня не открывается страница(
0
-NEURON-
Заблокирован
01.09.2014, 12:19 13
Цитата Сообщение от Zloy_MoIIIeHHk Посмотреть сообщение
там есть скомпилированный мапхак в папке bin
Слушай, мне что - то так лень стало капатсья в твоём чите Работы много, время мало
Тут спроси, тебе помогут мои старые кореша [url]
Надеюсь за геймдев тут не карают ?
1
-NEURON-
Заблокирован
01.09.2014, 12:20 14
ну вот что там лежало по ссылке
0
Вложения
Тип файла: zip mpqediten32_listfiles2.zip (1.30 Мб, 4 просмотров)
Zloy_MoIIIeHHk
0 / 0 / 0
Регистрация: 31.08.2014
Сообщений: 13
01.09.2014, 12:32  [ТС] 15
Цитата Сообщение от -NEURON- Посмотреть сообщение
Можно, но только HEX редактором или же воспользоваться профессиональными хакерскими шутками типа IDA PRO
HeX редактор бинарный файлов я открывал им мх но там зашифрованые каракули...
а IDA PRO я даже и не пробывал я шитал это прога для взлома программ там графичиский интерфейс если я не ошибаюсь

эта проба типа Ольки-OlliDBG

Добавлено через 4 минуты
Не эта прога у меня есть... Она открывает варкрафт3 карты через неё взламывают карты и засовывают читы в карту
она не для мх

Добавлено через 52 секунды
Всё равно спс за старание в помощи

Добавлено через 4 минуты
как будет свободная минутка отпиши если не трудно
0
-NEURON-
Заблокирован
01.09.2014, 12:45 16
Цитата Сообщение от Zloy_MoIIIeHHk Посмотреть сообщение
как будет свободная минутка отпиши если не трудно
Ладно, хрен с тобой лентяй , выкладывай сюда архив со всем
0
Zloy_MoIIIeHHk
0 / 0 / 0
Регистрация: 31.08.2014
Сообщений: 13
01.09.2014, 13:06  [ТС] 17
я выкинул выше

Добавлено через 2 минуты
и кстати я так и не смог зарегится там ссылка на иайл приходит на сам сайт а не на регистрацыю

Добавлено через 2 минуты
ааа ссылку удалили...
как суда залить?
0
SatanaXIII
Почетный модератор
Эксперт С++
5807 / 2803 / 386
Регистрация: 01.11.2011
Сообщений: 6,816
Завершенные тесты: 1
01.09.2014, 13:08 18
Цитата Сообщение от Zloy_MoIIIeHHk Посмотреть сообщение
как суда залить?
Обновленная Памятка «Как работать в редакторе сообщений»
1
Zloy_MoIIIeHHk
0 / 0 / 0
Регистрация: 31.08.2014
Сообщений: 13
01.09.2014, 13:15  [ТС] 19
wHack.rar
0
-NEURON-
Заблокирован
01.09.2014, 13:27 20
Держи собранный чит твой, я теб два файла прилагаю, один собирал для совместимости с WinXP, не знаю, нужен он тебе или нет. Сам чит настроен на выходное расширение файла mixtype, если игры требует именно mix - просто переименую его. Собирал под x86.
С тебя флакон читак
0
01.09.2014, 13:27
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2014, 13:27

Как преобразовать формат String в формат времени?
Dim time1 As date Dim time2 As Date Dim totaltime As Date Dim str As String str = &quot;SELECT...

а Mix-market скончался?
Вчера обещали с девяти вечера минут 40 полежать, дык уже 10 утра а на главной странице лишь одно...

Ошибка Illegal mix of collations
Здравствуйте! подскажите, пожалуйста, как исправить ошибку: PHP Fatal error: Uncaught Exception:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.