啃传奇服务器端的源码
最近开启的新项目是使用python写一个传奇2的模拟器,所以先分析一下原来的程序,貌似很困难,反正闲着也是闲着,无聊还是无聊
//
#include “stdafx.h”
// **************************************************************************************
BOOL InitApplication(HANDLE hInstance);
BOOL InitInstance(HANDLE hInstance, int nCmdShow);
LPARAM APIENTRY MainWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
BOOL jRegSetKey(LPCTSTR pSubKeyName, LPCTSTR pValueName, DWORD dwFlags, LPBYTEpValue, DWORD nValueSize);
BOOL jRegGetKey(LPCTSTR pSubKeyName, LPCTSTR pValueName, LPBYTE pValue);
BOOL CALLBACK ConfigDlgFunc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAMlParam);
// **************************************************************************************
//
// Global Variables Definition
//
// **************************************************************************************
HINSTANCE g_hInst = NULL; // Application instance
HWND g_hMainWnd = NULL; // Main window handle
HWND g_hLogMsgWnd = NULL;
HWND g_hToolBar = NULL;
HWND g_hStatusBar = NULL;
BOOL g_fTerminated = FALSE;
static WSADATA g_wsd;
TBBUTTON tbButtons[] =
{
{ 0, IDM_STARTSERVICE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
{ 1, IDM_STOPSERVICE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}
};
// **************************************************************************************
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, intnCmdShow)
{
MSG msg;
#ifndef _SOCKET_ASYNC_IO
if (CheckAvailableIOCP())
{
#endif
if (!InitApplication(hInstance))
return (FALSE);
if (!InitInstance(hInstance, nCmdShow))
return (FALSE);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
#ifndef _SOCKET_ASYNC_IO
}
else
{
TCHAR szMsg[1024];
LoadString(hInstance, IDS_NOTWINNT, szMsg, sizeof(szMsg));
MessageBox(NULL, szMsg, _GAMEGATE_SERVER_TITLE, MB_OK|MB_ICONINFORMATION);
return -1;
}
#endif
return (msg.wParam);
}
// **************************************************************************************
//
//
//
// **************************************************************************************
BOOL InitApplication(HANDLE hInstance)
{
WNDCLASS wc;
wc.style = CS_GLOBALCLASS|CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hIcon = LoadIcon((HINSTANCE)hInstance, MAKEINTRESOURCE(IDI_MIR2));
wc.hInstance = (HINSTANCE)hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU);
wc.lpszClassName = _GAMEGATE_SERVER_CLASS;
return RegisterClass(&wc);
}
// **************************************************************************************
//
//
//
// **************************************************************************************
BOOL InitInstance(HANDLE hInstance, int nCmdShow)
{
g_hInst = (HINSTANCE)hInstance;
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_LISTVIEW_CLASSES | ICC_BAR_CLASSES | ICC_INTERNET_CLASSES;
InitCommonControlsEx(&icex);
g_hMainWnd = CreateWindowEx(0, _GAMEGATE_SERVER_CLASS, _GAMEGATE_SERVER_TITLE,
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, (HINSTANCE)hInstance, NULL);
g_hToolBar = CreateToolbarEx(g_hMainWnd, WS_CHILD|CCS_TOP|WS_VISIBLE|WS_BORDER,
_IDW_TOOLBAR, sizeof(tbButtons) / sizeof(TBBUTTON), (HINSTANCE)hInstance,IDB_TOOLBAR,
(LPCTBBUTTON)&tbButtons, sizeof(tbButtons) / sizeof(TBBUTTON),
_BMP_CX, _BMP_CY, _BMP_CX, _BMP_CY, sizeof(TBBUTTON));
RECT rcMainWnd, rcToolBar, rcStatusBar;
GetClientRect(g_hMainWnd, &rcMainWnd);
GetWindowRect(g_hToolBar, &rcToolBar);
g_hStatusBar = CreateWindowEx(0L, STATUSCLASSNAME, _TEXT(“”),WS_CHILD|WS_BORDER|WS_VISIBLE|SBS_SIZEGRIP,
0, rcMainWnd.bottom - _STATUS_HEIGHT, (rcMainWnd.right - rcMainWnd.left),_STATUS_HEIGHT, g_hMainWnd, (HMENU)_IDW_STATUSBAR, g_hInst, NULL);
int nStatusPartsWidths[_NUMOFMAX_STATUS_PARTS];
int nCnt = 0;
for (int i = _NUMOFMAX_STATUS_PARTS - 1; i >= 0; i–)
nStatusPartsWidths[nCnt++] = (rcMainWnd.right - rcMainWnd.left) - (90 * i);
SendMessage(g_hStatusBar, SB_SETPARTS, _NUMOFMAX_STATUS_PARTS,(LPARAM)nStatusPartsWidths);
SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(1, 0), (LPARAM)_TEXT(“Not Connected”));
GetWindowRect(g_hStatusBar, &rcStatusBar);
g_hLogMsgWnd = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, _TEXT(“”),
WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_EDITLABELS,
0, (rcToolBar.bottom - rcToolBar.top), (rcMainWnd.right - rcMainWnd.left),
(rcMainWnd.bottom - rcMainWnd.top) - (rcToolBar.bottom - rcToolBar.top) -(rcStatusBar.bottom - rcStatusBar.top),
g_hMainWnd, NULL, (HINSTANCE)hInstance, NULL);
ListView_SetExtendedListViewStyleEx(g_hLogMsgWnd, 0, LVS_EX_FULLROWSELECT);
LV_COLUMN lvc;
TCHAR szText[64];
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT;
lvc.cx = 150;
lvc.pszText = szText;
for (i = 0; i < 3; i++)
{
lvc.iSubItem = i;
LoadString((HINSTANCE)hInstance, IDS_LVS_LABEL1 + i, szText,sizeof(szText)/sizeof(TCHAR));
ListView_InsertColumn(g_hLogMsgWnd, i, &lvc);
}
SendMessage(g_hToolBar, TB_SETSTATE, (WPARAM)IDM_STOPSERVICE,(LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));
ShowWindow(g_hMainWnd, SW_SHOW);
UpdateWindow(g_hMainWnd);
if (WSAStartup(MAKEWORD(2, 2), &g_wsd) != 0)
return (FALSE);
BYTE btInstalled;
if (!jRegGetKey(_GAMEGATE_SERVER_REGISTRY, _TEXT(“Installed”), (LPBYTE)&btInstalled))
DialogBox(g_hInst, MAKEINTRESOURCE(IDD_CONFIGDLG), NULL, (DLGPROC)ConfigDlgFunc);
return TRUE;
}
// **************************************************************************************
//
//
//
// **************************************************************************************
int AddNewLogMsg()
{
LV_ITEM lvi;
TCHAR szText[64];
int nCount = ListView_GetItemCount(g_hLogMsgWnd);
if (nCount >= 50)
{
ListView_DeleteItem(g_hLogMsgWnd, 0);
nCount–;
}
lvi.mask = LVIF_TEXT;
lvi.iItem = nCount;
lvi.iSubItem = 0;
_tstrdate(szText);
lvi.pszText = szText;
ListView_InsertItem(g_hLogMsgWnd, &lvi);
_tstrtime(szText);
ListView_SetItemText(g_hLogMsgWnd, nCount, 1, szText);
return nCount;
}
void InsertLogMsg(UINT nID)
{
TCHAR szText[256];
int nCount = AddNewLogMsg();
LoadString(g_hInst, nID, szText, sizeof(szText)/sizeof(TCHAR));
ListView_SetItemText(g_hLogMsgWnd, nCount, 2, szText);
ListView_Scroll(g_hLogMsgWnd, 0, 8);
}
void InsertLogMsg(LPTSTR lpszMsg)
{
int nCount = AddNewLogMsg();
ListView_SetItemText(g_hLogMsgWnd, nCount, 2, lpszMsg);
ListView_Scroll(g_hLogMsgWnd, 0, 8);
}
void InsertLogMsgParam(UINT nID, void *pParam, BYTE btFlags)
{
TCHAR szText[128];
TCHAR szMsg[256];
int nCount = AddNewLogMsg();
LoadString(g_hInst, nID, szText, sizeof(szText)/sizeof(TCHAR));
switch (btFlags)
{
case LOGPARAM_STR:
_stprintf(szMsg, szText, (LPTSTR)pParam);
break;
case LOGPARAM_INT:
_stprintf(szMsg, szText, *(int *)pParam);
break;
}
if (lstrlen(szMsg) <= 256)
{
ListView_SetItemText(g_hLogMsgWnd, nCount, 2, szMsg);
ListView_Scroll(g_hLogMsgWnd, 0, 8);
}
}
啃传奇服务器端的源码相关推荐
- python 传奇服务端_传奇游戏服务器源码学习
依据传奇游戏服务器源码总结了一下服务器开发中比较关心的一些问题. (1)线程之间的共享数据如何同步 CIntLock封装了临界区管理,包含了Lock()和Unlock()两个操作函数,所有 需要同步的 ...
- JAVA毕业设计健康食谱系统服务器端计算机源码+lw文档+系统+调试部署+数据库
JAVA毕业设计健康食谱系统服务器端计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计健康食谱系统服务器端计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S架构 ...
- 传奇游戏服务器源码学习
依据传奇游戏服务器源码总结了一下服务器开发中比较关心的一些问题. (1)线程之间的共享数据如何同步 CIntLock封装了临界区管理,包含了Lock()和Unlock()两个操作函数,所有 需要同步的 ...
- 传奇h5私服源码+教程
传奇h5私服源码+教程 这几天突然想拿服务器做些什么,就想到搭一个私服游戏,学习娱乐一下.废话不多说下面给教程和源码. 传奇h5源码:https://download.csdn.net/downloa ...
- 麻将服务端架设linux,湖南房卡麻将客户端/服务器端完整源码及编译教程
客户端源码是基于cocos2d-x 3.10版本开发的.代码完整可编译.本人在WINDOWS平台下成功编译了android包并正常运行.源码里面也有服务器的源码(C++),经过再次鉴定应该是配套的,服 ...
- subversion linux 服务器端搭建 源码安装
为什么80%的码农都做不了架构师?>>> 下载源码包 1.1 subversion 源码包 http://subversion.apache.org/download/ 1.2 ...
- [3]传奇3服务器源码分析一 DBServer
留存 服务端下载地址: 点击这里
- 传说ol服务器端网站源码,千古传说一键服务端+IP修改+GM+ID+搭建教程
千古传说一键服务端+IP修改教程+GM后台+数据修改+人物ID 架设教程: 1.必须安装-jdk8.exe,一直下一步等到安装完成. 2.将压缩包解压到D盘根目录.D:\I4sy_Qgcs 3.本端默 ...
- 如何搭建一个完全可用的传奇私服,我需要详细步骤以及部署的源码
搭建传奇私服是一项比较复杂的任务,需要具备一定的技术知识和经验.如果您想要搭建一个完全可用的传奇私服,您需要遵循以下步骤: 准备所需的软件和工具:首先,您需要准备一台运行 Windows 操作系统的电 ...
最新文章
- ECharts 之 环形图
- 全球及中国小水电行业投资规模及运行动态分析报告2021年版
- python中的函数、生成器的工作原理
- Java的内存--存储
- 大话InnoDB索引原理
- 【python】pycharm启动 一直index,无法运行
- 会考计算机考试vb知识点,高中会考计算机vb知识点.doc
- python中写入文件数据及文件定位操作命令
- Spring Boot(17)配置文件解析
- linux下巧用tail命令 创建自解压tar文件
- qt如何在TetxEdit设置背景色(可以设置行或列)
- 美赛小队集训-2019年D题O奖讨论
- HBase常用命令使用
- Java接口与实现类的转换
- 广告机CE认证 FCC认证费用构成
- Linux查看日志命令,压缩日志不解压直接查看
- 数学分析教程(科大)——3.4笔记+习题
- 谷歌浏览器无法调用java_怎么才能正常使用谷歌浏览器
- Cygwin下安装apt-cyg
- c0语言语法,《Groovy语言规范》-语法