This commit is contained in:
aixianling
2025-01-09 17:45:40 +08:00
commit 5c9f1dae4a
3482 changed files with 1146531 additions and 0 deletions

BIN
Gateway/.DS_Store vendored Normal file

Binary file not shown.

60
Gateway/.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,60 @@
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动GateServer",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/Gateway/gateway_d",
"args": ["${workspaceFolder}/build/Gateway/GateWay.txt"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [
{
"name":"LD_PRELOAD",
"value":"/usr/local/lib/faketime/libfaketime.so.1"
},
{
"name":"FAKETIME_TIMESTAMP_FILE",
"value":"${workspaceFolder}/../Server.time"
},
{
"name":"FAKETIME_CACHE_DURATION",
"value":"5"
},
],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"showDisplayString": true,
"additionalSOLibSearchPath": "${workspaceFolder}/common/libs;${workspaceFolder}/srvlib/libs;${workspaceFolder}/../common/cpp/libs/3rd/bin;"
},
{
"name": "(gdb) 附加GateServer",
"type": "cppdbg",
"request": "attach",
"program": "${workspaceFolder}/../build/GateServer/gateserver_d",
"processId": "${command:pickProcess}",
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"showDisplayString": true,
"additionalSOLibSearchPath": "${workspaceFolder}/common/libs;${workspaceFolder}/srvlib/libs;${workspaceFolder}/../../common/cpp/libs/3rd/bin;"
}
]
}

74
Gateway/CMakeLists.txt Normal file
View File

@@ -0,0 +1,74 @@
cmake_minimum_required (VERSION 2.8.1)
PROJECT(Server)
set( CMAKE_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../sdk) # include 文件夹
#头文件
include_directories(
${CMAKE_INCLUDE_DIR}/lua-5.1/src
${CMAKE_INCLUDE_DIR}/tolua++/src
srvlib/include/
srvlib/3rd/lua/
srvlib/3rd/zlib/
srvlib/3rd/tolua++/
srvlib/3rd/mysql/
common/
)
# Win10 / Linux 环境下的处理
if(MSVC)
# 头文件
include_directories(srvlib/3rd/mysql)
# 工具路径
SET(PATH_LUA "${CMAKE_SOURCE_DIR}/srvlib/bin/lua514")
SET(PATH_TOLUA "${CMAKE_SOURCE_DIR}/srvlib/bin/tolua++")
# 编译选项
ADD_DEFINITIONS(/W3 /wd"4996" /wd"4819" /wd"4091" /wd"4099" /wd"4800" /wd"4996")
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd /MP4")
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
else()
# 头文件
include_directories(/usr/local/mysql/include)
# 编译选项
set(CMAKE_C_FLAGS "-O0 -g3 -gdwarf-2 -std=c++0x -c -fmessage-length=0 -MMD -MP")
SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3 -Wall -Wextra -Wfatal-errors -std=c++11 -fpermissive -D_DEBUG -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "-O0 -g3 -Wall -std=c++11 -fpermissive -g -ggdb -DNDEBUG")
#add_definitions("-O0 -g3 -gdwarf-2 -std=c++11 -w -c -fmessage-length=0 -MMD -MP")
endif(MSVC)
# 项目内文件分组工具
function(group_by_dir source_dir)
message(STATUS "${ARGV0}")
foreach(FILE ${ARGN})
message(STATUS "${FILE}")
# 获取文件绝对路径
get_filename_component(FULL_NAME "${FILE}" ABSOLUTE)
# 获取文件父路径
get_filename_component(PARENT_DIR "${FULL_NAME}" PATH)
# 移除父路径中的源码根路径
string(REPLACE "${ARGV0}" "" GROUP "${PARENT_DIR}")
# 确保路径使用windows路径符号
string(REPLACE "/" "\\" GROUP "${GROUP}")
# 分组
source_group("${GROUP}" FILES "${FILE}")
endforeach()
endfunction(group_by_dir)
set( Root_Dir ${PROJECT_SOURCE_DIR} )
set( Libs_Dir
${PROJECT_SOURCE_DIR}/libs/gateway
${PROJECT_SOURCE_DIR}/../common/cpp/libs/3rd/bin
)
set( Bin_Dir ${PROJECT_SOURCE_DIR} )
SET(EXECUTABLE_OUTPUT_PATH ${Bin_Dir})
# 子路径
add_subdirectory(srvlib)
add_subdirectory(common)
add_subdirectory(gateway)

5
Gateway/build.bat Normal file
View File

@@ -0,0 +1,5 @@
@echo off
mkdir VS_Proj
cd VS_Proj
cmake .. -G "Visual Studio 14 2015 Win64" -DCMAKE_BUILD_TYPE=Debug
pause

20
Gateway/build.sh Normal file
View File

@@ -0,0 +1,20 @@
#!/bin/bash
cd $(cd "$(dirname "$0")" && pwd)
srcDIR=`pwd`
temp="/../temp"
name="/BuildGateway"
#cd gameworld/script/tolua++
#tolua++ -n server -o serverInterface.cc serverInterface.scp
#mkdir $srcDIR$temp
#mkdir $srcDIR$temp$name
mkdir temp_BuildGateway
cd temp_BuildGateway
if [ -n "$1" ]; then
BuiltType=$1
else
BuiltType=Release
fi
cmake .. -DCMAKE_BUILD_TYPE=${BuiltType}
make -j2
#svn log -l 1 > web/server.version

BIN
Gateway/common/.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,26 @@
cmake_minimum_required (VERSION 2.8.1)
set( CMAKE_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../sdk) # include 文件夹
#头文件
include_directories(
${CMAKE_INCLUDE_DIR}/public
${CMAKE_INCLUDE_DIR}/system
${CMAKE_INCLUDE_DIR}/utils
${CMAKE_INCLUDE_DIR}/lua-5.1/src
${CMAKE_INCLUDE_DIR}/tolua++/src
./
)
# 源文件及头文件
file(GLOB_RECURSE Common_LIST "${PROJECT_SOURCE_DIR}/common/*.cc" "${PROJECT_SOURCE_DIR}/common/*.h")
# 项目文件分组
group_by_dir( ${PROJECT_SOURCE_DIR}/common ${Common_LIST} )
# 输出目录
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${Root_Dir}/../libs/gateway)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${Root_Dir}/../libs/gateway)
#生成目标
add_library(common STATIC ${Common_LIST})

View File

@@ -0,0 +1,504 @@
#pragma once
/****************************************************************************************
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE>ͨ<EFBFBD><CDA8>Э<EFBFBD><EFBFBD><E9B6A8>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B7B6>
* namespace <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Proto
* {
* enum eĿ<65><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Code
* {
* //ͨ<><CDA8><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ע<EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>ݶθ<DDB6>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͡<EFBFBD>byte,short,int,shortString,string<6E><67><EFBFBD><EFBFBD>
* c<><63>Ϣ<EFBFBD>ű<EFBFBD><C5B1><EFBFBD> = <20><>Ϣ<EFBFBD><CFA2>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>c<EFBFBD><63>ʾͨ<CABE><CDA8>˫<EFBFBD><CBAB><EFBFBD>еĿͻ<C4BF><CDBB>˷<EFBFBD><CBB7><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>1<EFBFBD><31>ʼ
* //ͨ<><CDA8><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ע<EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>ݶθ<DDB6>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͡<EFBFBD>byte,short,int,shortString,string<6E><67><EFBFBD><EFBFBD>
* s<><73>Ϣ<EFBFBD>ű<EFBFBD><C5B1><EFBFBD> = <20><>Ϣ<EFBFBD><CFA2>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD><73>ʾͨ<CABE><CDA8>˫<EFBFBD><CBAB><EFBFBD>еķ<D0B5><C4B7><EFBFBD><EFBFBD>˷<EFBFBD><CBB7><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>1<EFBFBD><31>ʼ
* };
* };
****************************************************************************************/
namespace InterSrvComm
{
static const int DBSER_VER = 161122;
namespace DbServerProto
{
enum SystemId
{
siDefault = 0, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
siActor = 1,
siGuild = 2,
siConsignment = 3,
siMsg = 4,
siRank = 5,
siGlobal = 6,
siFight = 7,
siMail = 8,
siCommon = 9,
siConfig = 10,
siWarTeam = 11,
siTxApi = 12,
siCommonDB = 13,
siAuction = 14,
siTrading = 15,
};
enum DefaultSysId
{
dcInitDB = 1, //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ݿ⣬<DDBF><E2A3AC><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
dcExecDB = 2, //ִ<><D6B4>sql<71><6C><EFBFBD><EFBFBD>
};
/**<2A><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**/
// <20><><EFBFBD><EFBFBD><EFBFBD>ڽű<DABD>ʹ<EFBFBD>õ<EFBFBD><C3B5>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>Բ<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
// ע<><EFBFBD><E2A3BA><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD>ս<EFBFBD>в<EFBFBD><D0B2>ö<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
enum EntityMgrId
{
dcDefault, //Ĭ<>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>0
// g-d
dcQuery = 1, //<2F><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>
dcSave = 2, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> actors
dcSaveRole, // roles
dcSaveVar, //<2F><><EFBFBD>ؽ<EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD> actorvariable.variable
dcSaveItem, // items
dcSaveMail,
dcSaveStore,
dcSaveTogHitEquip, //<2F><><EFBFBD><EFBFBD><EFBFBD>ϻ<EFBFBD>װ<EFBFBD><D7B0>
dcLogout, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// d-g
dcLoad,
dcLoadRole,
dcLoadItem,
dcLoadMail,
dcLoadVar, //<2F><><EFBFBD>ؽ<EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
dcLoadStore, //<2F><><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD>
dcLoadTogHitEquip, //<2F><><EFBFBD>غϻ<D8BA>װ<EFBFBD><D7B0>
dcLoadFriends = 35, // <20><>ȡ<EFBFBD><C8A1><EFBFBD>˵ĺ<CBB5><C4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
dcUpdateFriend = 36, // <20><><EFBFBD>º<EFBFBD><C2BA>ѵ<EFBFBD><D1B5><EFBFBD>Ϣ
dcDelFriend = 37, // ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
dcLoadMsg = 27, //<2F><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
dcDeleteMsg = 28, //ɾ<><C9BE>ij<EFBFBD><C4B3><EFBFBD><EFBFBD>Ϣ
// todo<64><6F><EFBFBD><EFBFBD><EFBFBD>Ǿɵģ<C9B5><C4A3>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>
//dcLoadQuest = 3, //װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//dcSaveQuest = 4, //<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD>
//dcLoadSkill = 5, //װ<>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
////dcSaveSkill = 6, //<2F><><EFBFBD><EFBFBD><E6BCBC><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD>
//dcLoadBagItem = 7, //װ<>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>Ʒ
//dcSaveBagItem = 8, //<2F><><EFBFBD><EFBFBD><E6B1B3><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>սҪ<D5BD><D2AA><EFBFBD><EFBFBD><E6A3AC>ΪҪ<CEAA><D2AA><EFBFBD><EFBFBD>ҩƷ<D2A9><C6B7>
//dcLoadEquipItem = 9, //װ<><D7B0>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>Ʒ
//dcSaveEquipItem = 10, //<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD>
//dcLoadDepotItem = 11, //װ<>زֿ<D8B2><D6BF><EFBFBD>Ʒ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
//dcSaveDepotItem = 12, //<2F><><EFBFBD><EFBFBD><EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD>Ʒ<EFBFBD><C6B7>13<31><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD>
dcLoadBuff = 15, //<2F><><EFBFBD>ؽ<EFBFBD>ɫbuff<66><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcSaveBuff = 16, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫbuff<66><66><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><E6A3AC>buffʱ<66>
dcAddMember = 23, //<2F><><EFBFBD>Ӱ<EFBFBD><D3B0>ɳ<EFBFBD>Ա
dcSaveActorGuild = 24, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˰<EFBFBD><CBB0><EFBFBD><EFBFBD><EFBFBD>Ϣ
dcDeleteMember = 25, //ɾ<><C9BE>ij<EFBFBD><C4B3><EFBFBD><EFBFBD>Ա
dcLoadConsiTimeoutItem = 26, //<2F><>ȡ<EFBFBD>Ѿ<EFBFBD><D1BE>¼ܵĸ<DCB5><C4B8><EFBFBD><EFBFBD><EFBFBD>Ʒ <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
dcLoadSpiritItemData = 29, // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcSaveGemItemData = 30, // <20><><EFBFBD><EFBFBD><E6B1A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD>
dcLoadMountData = 31, //װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcSaveMountData = 32, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD>
dcSaveDmkjItem = 33, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJֿ<C4B2><D6BF><EFBFBD>Ʒ <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD>
dcLoadDmkjItem = 34, //<2F><>ȡ<EFBFBD><EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
dcUpdateFriendInfo = 38, //<2F><><EFBFBD>º<EFBFBD><C2BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>
dcUpdateFriendContact = 39, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵʱ<CFB5><EFBFBD><E4A3A8><EFBFBD>ߵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
dcSaveCale = 40, //<2F><><EFBFBD><EFBFBD><E6B8B1>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
dcLoadCale = 41, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcLoadFbCountData = 42, // <20><>ȡÿ<C8A1><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
dcSaveFbCountData = 43, // <20><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><E9B6AF>
dcLoadPlotData = 48, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
dcSavePlotData = 49, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//dcLoadMiscStruct = 50, // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
//dcSaveMiscStruct = 51, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcLoadFightLog = 55, // <20><>ȡPK<50><4B>¼ <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
dcAddFightLog = 56, // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>PK<50><4B>¼
dcSlaveAll = 57, // <20>๤ϵͳ<CFB5><CDB3><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD>ɽű<C9BD><C5B1><EFBFBD><EFBFBD><EFBFBD><><C8A1><EFBFBD><EFBFBD>
dcDelFightLog = 58, // ɾ<><C9BE>һ<EFBFBD><D2BB>PK<50><4B>¼
// dcLoadMail = 59, //<2F><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
dcDeleteMail = 60, //ɾ<><C9BE><EFBFBD>ʼ<EFBFBD>
dcUpdateMailStatus = 61, //<2F><><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>״̬
dcDeleteMailFile = 62, //ɾ<><C9BE><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>
dcGetActorIdFromActroName = 63, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ID
dcSaveEntrustItem = 64, //<2F><><EFBFBD><EFBFBD><E6B8B1>ί<EFBFBD>еIJֿ<C4B2><D6BF><EFBFBD>Ʒ <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
dcLoadEntrustItem = 65, //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ί<EFBFBD>вֿ<D0B2><D6BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcSaveActorMisc = 68, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ˵<D3B0><CBB5><EFBFBD><EFBFBD><EFBFBD>
dcLoadActorMisc = 69, // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>Ӱ˵<D3B0><CBB5><EFBFBD><EFBFBD><EFBFBD>
dcSavePetCrossItem = 70, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>زֿ⣨<D6BF><EFBFBD>ң<EFBFBD><D2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD>
dcLoadPetCrossItem = 71, //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>زֿ⣨<D6BF><EFBFBD>ң<EFBFBD><D2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
dcResetCrossPos = 80, // <20><><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>λ<EFBFBD><CEBB>
dcLoadCrossVar = 81, //<2F><><EFBFBD>ؽ<EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>
dcSaveCrossVar = 82, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>
dcLoadSkillMiji = 83, //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD>
dcSaveSkillMiji = 84, //<2F><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD>
dcSaveTongTianTaStoreItem = 85, //<2F><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>ֿ<EFBFBD>(<28><><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
dcLoadTongTianTaStoreItem = 86, //<2F><>ȡͨ<C8A1><CDA8><EFBFBD><EFBFBD><EFBFBD>ֿ<EFBFBD>(<28><><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>ȡ)
dcSaveWing = 87, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcLoadWing = 88, //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//dcLoadAllPet = 96, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD>
//dcDeletePet = 97, // ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcLoadPetBase = 98, // <20><><EFBFBD>س<EFBFBD><D8B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcSavePetBase = 99, // <20><><EFBFBD>³<EFBFBD><C2B3><EFBFBD>
dcPetSkill = 100, // <20><><EFBFBD><EFBFBD><EFBCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//dcLoadPetGotType = 101, // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
//dcAddPetGotType = 102, // <20><><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD>
dcPetLoadEquip = 103, // <20><><EFBFBD>س<EFBFBD><D8B3><EFBFBD>װ<EFBFBD><D7B0>
dcPetSaveEquip = 104, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
dcClearActorDbCache = 105, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵĻ<D2B5><C4BB><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcAddEqSign = 106,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
dcInheritEqSign = 107,//<2F>̳<EFBFBD><CCB3><EFBFBD><E6BBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
dcGetEqSignList = 108,//<2F><>ȡijװ<C4B3><D7B0><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
dcSaveOnceTime = 111, // <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>һ<EFBFBD>ε<EFBFBD>ʱ<EFBFBD><CAB1>
dcSaveRankVar = 112, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcSetDataValid = 115, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>Ա<EFBFBD>ʶ
dcEnableCheckValid = 116, // <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
dcLoadActorGuild = 117, //<2F><>ȡ<EFBFBD><C8A1>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
dcSaveMarryInfo = 118, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
dcLoadMarryInfo = 119, //<2F><><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD><EFBFBD><EFBFBD>Ϣ
dcOfflineLogout = 120, //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcOfflineDivorce = 121, //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcSaveCsWarVar = 122, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>ר<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
dcLoadCsWarVar = 123, //<2F><><EFBFBD>ؽ<EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>ר<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
dcActorCacheSave = 124,
dcActorCacheLoad = 125,
};
enum ConsignmentSysId
{
dcLoadConsignment = 1, //<2F><>ȡ<EFBFBD><C8A1><EFBFBD>еļ<D0B5><C4BC><EFBFBD><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7>Ϣ
dcSaveConsignmentItem, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ,<2C><><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcConsignmentCount, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD>
};
enum GuildMgrId
{
dcLoadGuildList = 1, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD><D0B0>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD>
dcLoadGuildDetail, // <20><><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD>
dcAddGuild, // <20><><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD>
dcDeleteGuild, // <20><>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD>
dcSaveGuild, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD>Ϣ
dcLoadGuildMgrData, // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>
dcLoadGuildDepot, // <20><>ȡ<EFBFBD><C8A1><EFBFBD>ڲֿ<DAB2><D6BF><EFBFBD>Ʒ<EFBFBD><C6B7>Ϣ
dcSaveGuildDepot, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲֿ<DAB2><D6BF><EFBFBD>Ʒ<EFBFBD><C6B7>Ϣ
dcLoadBeastLog, // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޼<EFBFBD>¼
dcAddBeastLog, // <20><><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޼<EFBFBD>¼
dcDeleteBeastLog, // ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޼<EFBFBD>¼
dcLoadGuildLog, // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
dcAddGuildLog, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
dcDelGuildLog, // ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
dcLoadOneGuild, // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD>
dcGuildCount, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcSaveGuildVar, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>)
dcLoadGuildVar, // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>)
dcSaveGuildChat, // <20><><EFBFBD><EFBFBD><E6B9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼
dcLoadGuildStore, // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><CCB5><EFBFBD>¼
dcSaveGuildStore, // <20><><EFBFBD><EFBFBD><E6B9AB><EFBFBD>̵<EFBFBD><CCB5><EFBFBD>¼
};
enum AuctionId
{
dcAuctionAdd = 1,
dcAuctionDel,
dcAuctionUpdate,
};
enum TopTitleId
{
dcLoadRank = 1, //<2F><>ȡ<EFBFBD>й<EFBFBD>ͷ<EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD>
dcLoadRankUser = 2, // <20>û<EFBFBD><C3BB><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD>
dcLoadRankPet = 3, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD>
dcRankUserCount, // <20>û<EFBFBD><C3BB><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
};
enum MsgMgrId
{
dcAddMsg = 1, //<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣ
dcAddChat = 2, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>Ϣ
};
enum MailMgrId
{
dcAddMail = 1, //<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ʼ<EFBFBD>
dcAddMailByActorName, // <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>
dcAddMailByAccountName, // <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ͨ<EFBFBD><CDA8>open id<69><64>
};
enum GlobalMgr
{
dcLoadBossKiller = 1, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>boss<73>Ļ<EFBFBD>ɱ<EFBFBD><C9B1>
dcSaveBossKiller,
dcLoadMaster, // <20><>ȡ<EFBFBD><C8A1>Ԫ֮<D4AA><D6AE>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>Ϣ
dcSaveMaster, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ֮<D4AA><D6AE>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>Ϣ
dcGmCmd, // <20><><EFBFBD><EFBFBD>gm<67><6D><EFBFBD><EFBFBD> <20><>ʱ<EFBFBD>ĵ<EFBFBD>lua<75><61>ע<EFBFBD><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϢʱҪ<CAB1><D2AA>
//dcAllActorBI, // <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ݵ<EFBFBD>BIϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>
dcCheckVer, // <20><><EFBFBD><EFBFBD>gameworld<6C>İ汾<C4B0>Ƿ<EFBFBD><C7B7><EFBFBD>dbserverһ<72><D2BB>
dcLoadMarry, // <20><>ȡȫ<C8A1><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcAddMarry, // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼
dcBattleFlag, // <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><C7A3>򲻶<EFBFBD>ȡgmcmd<6D><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcAddQuestion = 10, //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcLoadQuestions, //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
dcLoadQuestion, //<2F><>ȡijһ<C4B3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcUpdateQuestion, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ķ<EFBFBD>
dcAddBug = 14, //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>bug
dcLoadGoldRank, //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dcAddGameServerInfo, //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>gameworld<6C><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
};
enum FightRankId
{
dcLoadFightRank = 1, // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD>
dcSaveFightRank, // <20><><EFBFBD><EFBFBD><E6BEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD>
};
enum SysVarMgrId
{
dcAddSysVar = 1,
dcLoadSysVar,
dcUpdateSysVar,
dcSysVarCount,
};
enum configType
{
ctLoadGiftItem = 1, //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ctLoadGiftConfig = 2, //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
// ͨ<>ŵĴ<C5B5><C4B4><EFBFBD><EFBFBD><EFBFBD><EBB6A8>
enum tagResultError
{
reSucc = 0,
reDbErr, //<2F><><EFBFBD>ݿ<EFBFBD>ִ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>
reNoActor, //û<>иý<D0B8>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
reSaveErr, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
reNoLoad, //<2F><>û<EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reDbNotConnected, //DB<44><42><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>
reParamError, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reNameError, //<2F><><EFBFBD>ֲ<EFBFBD><D6B2>Ϸ<EFBFBD>
reNameInUse, //<2F><><EFBFBD>ֱ<EFBFBD>ʹ<EFBFBD><CAB9>
reTimeOut, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
reInterErr, //<2F>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
};
// ս<><D5BD><EFBFBD><EFBFBD>ϢID
enum WarTeamSysId
{
dcLoadWarTeam = 0,
dcAddWarTeam,
dcDelWarTeam,
dcUpdateWarTeam,
dcLoadWarTeamMember,
dcAddWarTeamMember,
dcDelWarTeamMember,
dcUpdateWarTeamMember,
dcLoadOneWarTeam, // <20><>ȡһ<C8A1><D2BB>ս<EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>Ϣ
dcWarTeamCount, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ص<EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
enum TxApiMsg
{
// <20><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
sFeeCallBack = 1,
// <20><>Ѷapi<70><69><EFBFBD><EFBFBD>
sTxApiMsg = 2,
// <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD>
sUpdateIdentity = 4,
// <20>رջ<D8B1><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD>ϵͳ
sCloseGamble = 5,
// <20>û<EFBFBD><C3BB><EFBFBD>ֵ<EFBFBD><D6B5>ȡtoken
sChargeToken = 6,
// <20><>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD>ȡtoken
sGetToken = 7,
//<2F><>ֵ<EFBFBD><D6B5><EFBFBD>к<EFBFBD>
sAddValueCard = 8,
// <20><>ѯ<EFBFBD><D1AF>ֵ<EFBFBD><D6B5>
sQueryAddValueCard = 9,
// <20><>ѯԪ<D1AF><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sQueryYuanbaoCount = 10,
// <20><>ȡԪ<C8A1><D4AA>
sWithdrawYuanbao = 11,
// <20><><EFBFBD>͵<EFBFBD>½<EFBFBD><C2BD>key
sLoginKey = 12,
};
enum CommonDBMsg
{
dcDBExec = 1, // ִ<><D6B4>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>
};
enum TradingMgrId
{
dcAddTrading = 1,
dcUpdateTrading,
dcDelTrading,
};
}
namespace AsyncOperatorCode
{
enum tagAsyncOpError
{
soeSucc = 0, // <20>ɹ<EFBFBD>
soeDBErr, // dbִ<62>д<EFBFBD><D0B4>󣨻<EFBFBD><F3A3A8BB><EFBFBD>db<64>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӣ<EFBFBD>
soeNoCardInfo, // <20><><EFBFBD><EFBFBD><EFBFBD>ڴ˿<DAB4><CBBF><EFBFBD>Ϣ
soeTimeExpired, // <20><>ѯ<EFBFBD><D1AF>ʱ
};
}
// gameworld֮<64><D6AE>ͨ<EFBFBD>ŵ<EFBFBD>Э<EFBFBD><D0AD>
namespace GameWorldProto
{
enum GwP
{
gpRegReq = 1, // ע<><D7A2><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>serverid
gpRegResp = 2,
gpKeyReq = 3, // <20><><EFBFBD><EFBFBD>key<65><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻظ<CDBB>
gpKeyResp = 4,
gpUserLogin = 5, // <20><EFBFBD><E3B2A5><EFBFBD>ҵ<EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD>Ϣ
gpBatchOnline = 6, // ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>Ϣ
gpUserExit = 7, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
gpCloseUser = 8, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gpGateway = 9, // ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>Ϣ
gpTtData = 10, // ת<><D7AA>Э<EFBFBD><D0AD>
gpSsData = 11, // C++<2B><><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD>߼<EFBFBD><DFBC><EFBFBD>Ϣ
gpLfData = 12, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3>Ϣ
// <20><><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>Ϸ<EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>Ϣ
gpCommonMsg, // <20><>Ϸ<EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>Ϣ
gpCrossRelogin, // ֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>¼
};
enum LfSysType {
lsDefault = 0,
lsGuild,
lsRank,
};
enum SSP
{
stBroadCast, //<2F>
stRankList, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD><D0B0>б<EFBFBD>
stUserLogin, //<2F><><EFBFBD>ҵ<EFBFBD>¼
stUserLogout, //<2F><><EFBFBD>ҵdz<D2B5>
stBatchOnline, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><CDAC><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>¼<EFBFBD><C2BC>Ϣ)
//stRecvMail, //֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD> todo luaʵ<61><CAB5>
stKickUser, //<2F>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//stRecvOfflineMsg, //֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ todo luaʵ<61><CAB5>
stNormalMax = 100, //<2F><><EFBFBD>ʼ<E6BFAA>ǽű<C7BD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
};
enum LfGuildCmd {
lcGuildList, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
lcGuildUnion, // <20><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>
lcGuildDelUnion, //
lcCreateGuild, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lcDelGuild, // ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lcUpdateGuild, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
lcDelGuildMem, //
lcAddGuildMem, //
lcGuildBroadCast, // <20><><EFBFBD>ڹ㲥
lcUpGuildMemInfo, //
lcGuildOnline, // <20><>ͨ<EFBFBD><CDA8>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
lcGuildLeaderInfo, //<2F><><EFBFBD>Ͱ<EFBFBD><CDB0><EFBFBD><EFBFBD><EFBFBD>һЩ<D2BB><D0A9>Ϣ
lcAddItemToDepot, //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5>ֿ<EFBFBD>
lcAddGuildLog, //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD>
lcSendFightVal, //<2F><><EFBFBD>Ͱ<EFBFBD><CDB0><EFBFBD>ս<EFBFBD><D5BD>
lcChangePos, //<2F>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>ְλ
lcDepotAvailible, //<2F><><EFBFBD>ɲֿ<C9B2>ʣ<EFBFBD><CAA3>λ<EFBFBD><CEBB>
lcImpeach, //<2F><><EFBFBD><EFBFBD>
};
enum LfRankCmd {
lcRankList = 0, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD><D0B0>б<EFBFBD>
lcRankTitle = 1, //<2F><><EFBFBD><EFBFBD>֪ͨ<CDA8>޸<EFBFBD><DEB8><EFBFBD><EFBFBD>а<EFBFBD><D0B0>ƺ<EFBFBD>
};
};
// gameworld <20><> centerserver ֮<><D6AE><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>Э<EFBFBD><D0AD>
namespace CenterProto
{
enum CWP
{
cwComm = 1, // ֱ<><D6B1>ת<EFBFBD><D7AA><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD>ݰ<EFBFBD>
cwActorOnline = 2, //<2F><>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD>߻<EFBFBD><DFBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cwActorServer = 3, //<2F><><EFBFBD><EFBFBD>actorid<69><64><EFBFBD>͵<EFBFBD>actorid<69><64><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD>
cwActorServerInfo = 4, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
struct ActorOnline
{
int actorid_;
int sid_;
inline bool operator != (const ActorOnline& data) const
{
return actorid_ != data.actorid_;
}
inline bool operator > (const ActorOnline& data) const
{
return actorid_ > data.actorid_;
}
inline bool operator < (const ActorOnline& data) const
{
return actorid_ < data.actorid_;
}
};
}
}

10
Gateway/common/common.h Normal file
View File

@@ -0,0 +1,10 @@
#include <cstring>
#include <stdint.h>
#include <vector>
#include <list>
#include <map>
#include "server_def.h"
#include "share_util.h"
#include "data_packet.hpp"
#include "container/static_hash_table.h"

View File

@@ -0,0 +1,57 @@
#ifndef _CONFIG_DATA_DEF_H_
#define _CONFIG_DATA_DEF_H_
//<2F><><EFBFBD>ݶ<EFBFBD>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>һЩ<D2BB><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>һЩ<D2BB><D0A9><EFBFBD><EFBFBD>
template <class T>
struct DataList
{
DataList<T>()
{
data_ = NULL;
count_ = 0;
}
T* data_;
int count_;
//inline operator T* () const { return data_; }
inline T* GetDataPtr(int nIndex)
{
if (data_ && nIndex >= 0 && nIndex < count_)
{
return data_ + nIndex;
}
else
{
return NULL;
}
}
};
template <class T, int MAX_NUM = 16>
struct StaticDataList
{
StaticDataList<T, MAX_NUM>()
{
count_ = 0;
}
~StaticDataList(){
count_ = 0;
}
T data_[MAX_NUM];
int count_;
//inline operator T* () const { return data_; }
inline T* GetDataPtr(int nIndex)
{
if (nIndex >= 0 && nIndex < count_ && nIndex < MAX_NUM)
{
return &data_[nIndex];
}
else
{
return NULL;
}
}
};
#endif

View File

@@ -0,0 +1,76 @@
#ifndef _GEM_DEF_H_
#define _GEM_DEF_H_
#include "common.h"
#define MAX_SPIRIT_SKILL 8
#define MAX_SPIRIT_COUNT 5
#define MAX_SPIRIT_SLOT 8
// <20>ɻ<EFBFBD><C9BB><EFBFBD><EFBFBD><EFBFBD>
// <20>ɻ<EFBFBD><C9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#pragma pack( push, 1 )
struct SoulPropData {
uint8_t type; // <20><><EFBFBD><EFBFBD>
uint8_t quality; // Ʒ<><C6B7>
uint8_t level; // <20>ȼ<EFBFBD>
int expr; // <20><><EFBFBD><EFBFBD>
uint8_t lock; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
};
struct SpiritSoul
{
enum Type { tGem = 0, tHunt = 1 }; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɻ<EFBFBD>
int id; // ϵͳ<CFB5><CDB3><EFBFBD>ɻ<EFBFBD><C9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
SoulPropData prop_data; // <20>ɻ<EFBFBD><C9BB><EFBFBD><EFBFBD><EFBFBD>
};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct GemInfo
{
int state; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int level; // <20><><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
int expr; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int score; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
struct GemGuard
{
int type; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int level; //<2F><><EFBFBD>̵ȼ<CCB5>
int expr; //<2F><><EFBFBD>̾<EFBFBD><CCBE><EFBFBD>
GemGuard()
{
type = 0;
level = 0;
expr = 0;
}
GemGuard(int type, int level = 1, int expr = 0)
{
this->type = type;
this->level = level;
this->expr = expr;
}
};
struct SpiritRankData
{
int level_; //<2F><><EFBFBD>ѵȼ<D1B5>
int model_id_; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int max_slot_cnt_; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
int spirit_cnt_; //Ԫ<>ظ<EFBFBD><D8B8><EFBFBD>
int slot_cnt_[MAX_SPIRIT_COUNT];
SpiritSoul spirit_[MAX_SPIRIT_COUNT][MAX_SPIRIT_SLOT];
int skill_cnt_; //<2F><><EFBFBD>ܸ<EFBFBD><DCB8><EFBFBD>
BaseSkillData skill_list_[MAX_SPIRIT_SKILL];
};
#pragma pack( pop )
#endif

View File

@@ -0,0 +1,164 @@
#ifndef _PROPERTY_ID_DEF_H_
#define _PROPERTY_ID_DEF_H_
///<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>ID<49><44><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>õ<EFBFBD><><CDA8>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>id<69><64><EFBFBD>Ի<EFBFBD>ȡʵ<C8A1><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//tolua_begin
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>ƫ<EFBFBD><C6AB>
enum enPropEntity
{
P_ID = 0, // ʵ<><CAB5><EFBFBD><EFBFBD>id
P_POS_X , // λ<><CEBB> posx
P_POS_Y , // λ<><CEBB>pos y
P_MODELID, // ʵ<><CAB5><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>ID
P_ICON, // ͷ<><CDB7>ID
P_DIR, // ʵ<><CAB5><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
P_MAX_ENTITY,
};
enum enPropCreature
{
P_LEVEL = P_MAX_ENTITY, // <20>ȼ<EFBFBD>
P_HP , //Ѫ
P_MP , //<2F><>
P_SPEED, //<2F>ƶ<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ʱ<EFBFBD><EFBFBD><E4A3AC>λms
P_MAXHP, //<2F><><EFBFBD><EFBFBD>Ѫ<EFBFBD><D1AA>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P_MAXMP,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P_OUT_ATTACK, //<2F><EFBFBD><E2B9A6><EFBFBD><EFBFBD>
P_OUT_DEFENCE,//<2F><EFBFBD><E2B9A6><EFBFBD><EFBFBD>
P_DEFCRITICALSTRIKES,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
P_ALL_ATTACK, // <20><><EFBFBD>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD>
P_SUB_DEF, // <20><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>
P_IN_ATTACK,//<2F>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD>
P_IN_DEFENCE,//<2F>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD>
P_CRITICALSTRIKES, // <20><><EFBFBD><EFBFBD>ֵ
P_DODGERATE, // <20><><EFBFBD><EFBFBD>ֵ
P_HITRATE, // <20><><EFBFBD><EFBFBD>ֵ
P_ATTACK_ADD, // <20>˺<EFBFBD>׷<EFBFBD><D7B7>
P_HP_RENEW,//HP<48>ָ<EFBFBD>
P_MP_RENEW,//MP<4D>ָ<EFBFBD>
P_ATTACK_SPEED, //<2F><><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>
P_IN_ATTACK_DAMAGE_ADD, // <20><><EFBFBD><EFBFBD><EFBFBD>ڹ<EFBFBD><DAB9>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
P_OUT_ATTACK_DAMAGE_ADD, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
P_THUNDER_ATTACK, //<2F>׹<EFBFBD>
P_THUNDER_DEFENCE, //<2F>׿<EFBFBD>
P_POISON_ATTACK, //<2F><><EFBFBD><EFBFBD>
P_POISON_DEFENCE, //<2F><><EFBFBD><EFBFBD>
P_ICE_ATTACK, //<2F><><EFBFBD><EFBFBD>
P_ICE_DEFENCE, //<2F><><EFBFBD><EFBFBD>
P_FIRE_ATTACK, //<2F><><EFBFBD><EFBFBD>
P_FIRE_DEFENCE, //<2F><><EFBFBD><EFBFBD>
P_STATE, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD>
P_BASE_MAXHP, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѫ,<2C>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MaxHp,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>buff<66><66>װ<EFBFBD><D7B0><EFBFBD>ȸ<EFBFBD><C8B8>ӵ<EFBFBD>
P_BASE_MAXMP, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MaxMp,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>buff<66><66>װ<EFBFBD><D7B0><EFBFBD>ȸ<EFBFBD><C8B8>ӵ<EFBFBD>
P_STAND_POINT, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>ȵĿ<C8B5><C4BF>Ի<EFBFBD><D4BB><EFBFBD><E0B9A5>
P_RESEVS0, //<2F><><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
P_RESEVS1, //<2F><><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
P_MAX_CREATURE, //
};
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enum enPropMonster
{
P_MONSTER_START = P_MAX_CREATURE,
P_BORNPOINT = P_MONSTER_START, // <20><><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD>ã<EFBFBD>
P_LEVEL_DIFF, // <20><><EFBFBD><EFBFBD>
//// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>˸<EFBFBD><CBB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P_PET_TITLE, // <20><><EFBFBD><EFBFBD><EFBFBD>ijƺţ<C6BA><C5A3><EFBFBD><32>ǵȽ׳ƺţ<C6BA><C5A3><EFBFBD><32><CEBB><EFBFBD>޽׳ƺţ<C6BA><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dz<EFBFBD><C7B3><EFBFBD><EFA3AC>Ϊ0
P_PET_COLOR,
P_PET_RANK_TITLE,
P_MAX_MONSTER,
};
enum enPropActor
{
P_WEAPON = P_MAX_CREATURE, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P_MOUNT, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P_DIZZY_RATE11, // <20><><32><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѣ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>,<2C><><32>Ƿ<EFBFBD><C7B7><EFBFBD>ѣ<EFBFBD><D1A3><EFBFBD><EFBFBD><><C8A1>
P_DIZZY_TIME1, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѣ<EFBFBD><D1A3>ʱ<EFBFBD>䣨ȡ<E4A3A8><C8A1><EFBFBD><EFBFBD>
P_HP_STORE, //hp<68><70><EFBFBD><EFBFBD>
P_MP_STORE, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>hp<68><70><EFBFBD><EFBFBD>(<28><>:mp<6D><70><EFBFBD><EFBFBD>)
P_SPIRIT, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
P_PK_MOD, //<2F><><EFBFBD>ҵ<EFBFBD>PKģʽ
P_STRONG_EFFECT, //ǿ<><C7BF><EFBFBD><EFBFBD>Ч
P_WING, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
P_STAGE_EFFECT, //Ʒ<><C6B7><EFBFBD><EFBFBD>Ч
P_PET_HP_STORE, // <20><><EFBFBD><EFBFBD>ҩ<EFBFBD><D2A9>
PROP_ACTOR_XIUWEI_RENEW_RATE, //<2F><><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>Ϊ<EFBFBD>Ļָ<C4BB><D6B8>ٶ<EFBFBD><><C8A1><EFBFBD><EFBFBD>
P_SEX , //<2F>Ա<EFBFBD>
P_VOCATION , //ְҵ
P_EXP , //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ֽ<EFBFBD>,uint64<36><34>
P_PK_VALUE = P_EXP + 2, //<2F><><EFBFBD>ҵ<EFBFBD>pkֵ(ɱ¾ֵ)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>
P_BAG_GRID, //<2F><><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P_WEEK_CHARM, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
P_BIND_COIN, //<2F>󶨽<EFBFBD>Ǯ
P_COIN, //<2F>ǰ󶨽<C7B0>Ǯ
P_BIND_YB, //<2F><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
P_YB, //<2F>ǰ<EFBFBD><C7B0><EFBFBD>Ԫ<EFBFBD><D4AA>
P_SHENGWANG, //<2F><><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>
P_CHARM, //<2F><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>еĽ<D0B5>˧<EFBFBD><CBA7>ֵ<EFBFBD><D6B5>Ů<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD>ֵ
P_SPIRIT_SLOT, //<2F><><EFBFBD>↑ͨ<EFBFAA>IJ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ŀ(ò<><C3B2>û<EFBFBD>ã<EFBFBD>
P_RENOWN, //<2F><><EFBFBD><EFBFBD>
P_GUILD_ID , //<2F><><EFBFBD>ɵ<EFBFBD>ID
P_TEAM_ID, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
P_SOCIAL,// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>mask<73><6B><EFBFBD><EFBFBD>һЩbitλ<74><CEBB><EFBFBD>õ<EFBFBD>
P_GUILD_EXP, //<2F><><EFBFBD><EFBFBD>׶<EFBFBD>
P_LUCKY, //<2F><><EFBFBD><EFBFBD>ֵ
P_SYS_OPEN, // <20><><EFBFBD><EFBFBD>ϵͳ<CFB5>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P_ROOT_EXP_POWER, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>
P_CHANGE_MODEL, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
PROP_BANGBANGTANG_EXP, ////<2F><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>(<28><EFBFBD><E2B9A6>Ӧ<EFBFBD><D3A6>û<EFBFBD><C3BB><EFBFBD>ˣ<EFBFBD>
PROP_ACTOR_MAX_EXP, //<2F><><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>飬64λ<34><CEBB><><C3B2><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>
P_GIVE_YB = PROP_ACTOR_MAX_EXP + 2, //Ԫ<><D4AA><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>Ԫ<EFBFBD><D4AA>
P_CRITICAL_STRIKE, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><CBBA>ٷֱ<D9B7>
P_EXP_RATE, //<2F><><EFBFBD>Ҿ<EFBFBD><D2BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȣ<D9B6>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>
P_DEPOT_GRID, // <20>ֿ<EFBFBD><D6BF>򿪸<EFBFBD><F2BFAAB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P_ANGER, // ŭ<><C5AD>ֵ
P_ROOT_EXP, // <20><><EFBFBD><EFBFBD>ֵ
P_ACHIEVEPOINT, //<2F><><EFBFBD>ɵijɾ͸<C9BE><CDB8><EFBFBD>(<28><><EFBFBD>а<EFBFBD>)
P_ZYCONT,//<2F><>Ӫ<EFBFBD>Ĺ<EFBFBD><C4B9>׶<EFBFBD>(<28><>Ҫֱ<D2AA><D6B1><EFBFBD>޸ģ<DEB8><C4A3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Actor<6F>Ľӿ<C4BD>ChangeZYCount<6E><74><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>)
P_QQ_VIP, // vip<69><70>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
P_WING_ID, // <20><><EFBFBD><EFBFBD>id
P_WING_SCORE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P_PET_SCORE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PROP_ACTOR_VIPFLAG, // VIP<49><50>ͨ<EFBFBD><CDA8><EFBFBD>ǣ<EFBFBD>ͨ<EFBFBD><CDA8>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD><C7B8><EFBFBD>VIP<49><50><EFBFBD>͡<EFBFBD>enVIPType<70><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>VIP<49><50><EFBFBD>ͣ<EFBFBD><CDA3>ֱ<EFBFBD><D6B1><EFBFBD>Ӧ0-2λ<32><CEBB><EFBFBD>롣(<28><><EFBFBD><EFBFBD>û<EFBFBD>ã<EFBFBD>
P_CAMP, //<2F><><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>Ӫ 1<><31>ң<EFBFBD><D2A3>2<EFBFBD>dz<EFBFBD><C7B3><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD>
P_PET_SLOT, //<2F><><EFBFBD>ҿ<EFBFBD><D2BF><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
P_HONOR, //<2F><><EFBFBD><EFBFBD>ֵ
P_QING_YUAN, //<2F><>Եֵ
PROP_ACTOR_DUR_KILLTIMES, //<2F><>ն<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
PROP_ACTOR_BASE_FIGHT, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õľ<C3B5><C4BE>飨ȡ<E9A3A8><C8A1><EFBFBD><EFBFBD>
P_FIGHT_VALUE, //ս<><D5BD><EFBFBD><EFBFBD>
P_MAX_RENOWN, //<2F><><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
P_RECHARGE, // <20><><EFBFBD>ҳ<EFBFBD>ֵ<EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
P_VIP_LEVEL, // <20><><EFBFBD>ҵ<EFBFBD>ͷ<EFBFBD><CDB7>,<2C><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>Σ<EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ0<CEAA><30>ȡ<EFBFBD><C8A1>
P_BEAST_LEVEL, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD><DAB0>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޵ȼ<DEB5><><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>PROP_FOOT_EFFECT)
P_FOOT_EFFECT, // <20>
P_EQUIP_SCORE, //<2F><><EFBFBD>ҵ<EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD>
P_HAIR_MODEL, //ʱװñ<D7B0><C3B1><EFBFBD><EFBFBD>
P_BUBBLE, // <20><><EFBFBD><EFBFBD>
P_ACTOR_STATE, //<2F><><EFBFBD>ҵ<EFBFBD>״̬
P_JINGJIE_TITLE, //<2F><><EFBFBD><EFBFBD><EFBFBD>ƺ<EFBFBD>
P_ZHUMOBI, //<2F><>ħ<EFBFBD><C4A7>
P_MAX_ACTOR,
};
//tolua_end
#endif

View File

@@ -0,0 +1,306 @@
#ifndef _PROPERTY_SET_H_
#define _PROPERTY_SET_H_
#include "common.h"
#include "property_id_def.h"
#pragma pack(4)
// <20><>ʱ֧<CAB1><D6A7>32*8<><38><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>255<35><35><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD> <20><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><D8B7><EFBFBD>uint8_t<5F><74>ʾ<EFBFBD><CABE><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD>
static const unsigned int MAX_BYTE = 32;
static char s_forbit_mask[MAX_BYTE] = {};
class UpdateMask
{
public:
UpdateMask(): used_count_(0), mask_count_(0)
{
memset(lock_, 0, sizeof(lock_));
clear();
}
inline void clear()
{
memset(mask_, 0, sizeof(mask_));
used_count_ = 0;
mask_count_ = 0;
}
inline UpdateMask& operator &= (UpdateMask& mask)
{
int count = __max(used_count_, mask.count());
if (count == 0) return *this;
int max_count = 0;
unsigned char* s = mask;
for (int i = 0; i < count; ++i)
{
mask_[i] &= s[i];
if (mask_[i]) max_count = i + 1;
}
used_count_ = max_count;
mask_count_ = 0;
int total = used_count_ << 3;
for (int i = 0; i < total; ++i)
{
if (IsMask(i)) ++mask_count_;
}
return *this;
}
/*
*<2A><><EFBFBD>õ<EFBFBD>nPos<6F><73>int<6E>Ƿ<EFBFBD><C7B7>޸Ĺ<DEB8>
* nPos <20>ڼ<EFBFBD><DABC><EFBFBD>4<EFBFBD>ֽ<EFBFBD>
* flag flag=true<75><65>ʾ<EFBFBD>޸Ĺ<DEB8>,<2C><><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸ı<DEB8><C4B1><EFBFBD>
*/
inline void SetMask(int pos/*, bool flag = true*/)
{
if (IsForbid(pos)) return; // <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
unsigned int bit_pos = pos & 7;
unsigned int byte_pos = pos >> 3;
if (byte_pos >= MAX_BYTE) return;
unsigned char value = 1 << bit_pos;
//if (flag)
{
if (!(mask_[byte_pos] & value)) ++mask_count_;
mask_[byte_pos] |= value;
}
//else
//{
// <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>masked<65><64>mask_countҪ<74><D2AA>һ
// if (mask_[byte_pos] & value){ assert(mask_count_ > 0);--mask_count_;}
// value = ~value;
// mask_[byte_pos] &= value;
//}
if (used_count_ <= byte_pos)
used_count_ = byte_pos + 1;
}
//<2F><>nPos<6F><73>int<6E>Ƿ<EFBFBD><C7B7>޸Ĺ<DEB8>
inline bool IsMask(int pos)
{
unsigned int bit_pos = pos & 7;
unsigned int byte_pos = pos >> 3;
if (byte_pos >= MAX_BYTE) return false;
unsigned char value = 1 << bit_pos;
return mask_[byte_pos] & value ? true : false;
}
inline unsigned int count()
{
return used_count_;
}
inline unsigned int MaskCount()
{
return mask_count_;
}
inline operator unsigned char* ()
{
return mask_;
}
static void SetArrayBit(char* arr, int pos, bool flag)
{
unsigned int bit_pos = pos & 7;
unsigned int byte_pos = pos >> 3;
if (byte_pos >= MAX_BYTE) return;
unsigned char value = 1 << bit_pos;
if (flag) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
arr[byte_pos] |= value;
}
else
{
value = ~value; //ȡ<><C8A1>
arr[byte_pos] &= value; //<2F><>λ<EFBFBD><CEBB>
}
}
static bool IsArrayBit(char* arr, int pos)
{
unsigned int bit_pos = pos & 7;
unsigned int byte_pos = pos >> 3;
if (byte_pos >= MAX_BYTE) return false;
unsigned char value = 1 << bit_pos;
return arr[byte_pos] & value ? true : false;
}
//<2F><><EFBFBD>ý<EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD>Ե<EFBFBD>λ
static void SetForbid(int pos, bool flag)
{
SetArrayBit(s_forbit_mask, pos, flag);
}
//ij<><C4B3>λ<EFBFBD><CEBB><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
inline bool IsForbid(int pos)
{
return IsArrayBit(s_forbit_mask, pos);
}
inline bool IsLock(int pos)
{
return IsArrayBit(lock_, pos);
}
void Lock(int pos)
{
SetArrayBit(lock_, pos, true);
}
void UnLock(int pos)
{
SetArrayBit(lock_, pos, false);
}
static void Init()
{
memset(s_forbit_mask, 0 , sizeof(s_forbit_mask));
}
private:
unsigned char mask_[MAX_BYTE]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mask<73>Ĵ洢<C4B4>ط<EFBFBD>
unsigned int used_count_; //<2F>Ѿ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5>ֽ<EFBFBD><D6BD><EFBFBD>
unsigned int mask_count_;
char lock_[MAX_BYTE]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
};
//ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD><C7B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>mask<73><6B>¼<EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>int<6E><74>ֵ<EFBFBD>޸Ĺ<DEB8>
class PropertySet:
public UpdateMask
{
public:
PropertySet() {}
template<typename T>
inline bool set(int pid, const T& value)
{
if (IsLock(pid)) return false;
T* pos = (T*)ptr(pid);
if (*pos == value) return false; //û<>ı<EFBFBD>
int offset = (int)((char*)pos - (char*)this - sizeof(UpdateMask)); //ƫ<><C6AB><EFBFBD>˶<EFBFBD><CBB6><EFBFBD><EFBFBD>ֽ<EFBFBD>
if (offset < 0) return false;
*pos = value; //<2F><><EFBFBD><EFBFBD>ֵ
if (offset > 0) offset = offset >> 2;
int size = sizeof(T);
size = __max(size >> 2, 1); //<2F><><EFBFBD>ٸ<EFBFBD>4<EFBFBD>ֽ<EFBFBD>
for (int i = 0; i < size; ++i)
{
SetMask(offset + i);
}
return true;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>nPos<6F><73>int<6E><74>ָ<EFBFBD><D6B8>
inline const char* ptr(int pos) const
{
const char* ptr = (const char*)this + sizeof(UpdateMask) + (pos << 2);
return ptr;
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ݵ<EFBFBD><DDB5>׵<EFBFBD>ַ
inline const char* ptr() const
{
return (const char*)this + sizeof(UpdateMask);
}
template < class T>
inline T GetProperty(int pos) const
{
return *(T*)this->ptr(pos);
}
template < class T>
inline void SetProperty(int pos, const T& value)
{
if (IsLock(pos)) return;
T oldValue = GetProperty<T>(pos);
if (oldValue == value) return;
this->set(pos, value);
}
// d<><64>true<75><65>ʾ<EFBFBD><CABE>ȡ8<C8A1>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>϶<EFBFBD><CFB6><EFBFBD>4<EFBFBD>ֽڣ<D6BD>int<6E><74>float<61><74><EFBFBD>͵ij<CDB5><C4B3>ȣ<EFBFBD>
inline void set(int pos, PropertySet* set, bool d)
{
memcpy((char*)(this->ptr(pos)), set->ptr(pos), d ? 8 : 4);
}
};
class EntityProperty:
public PropertySet
{
public:
int data_[P_MAX_ENTITY];
EntityProperty()
{
memset(this, 0, sizeof(EntityProperty));
}
};
STATIC_ASSERT((P_MAX_ENTITY - P_ID) == (sizeof(EntityProperty) - sizeof(PropertySet)) / sizeof(int));
//<2F><><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>Լ<EFBFBD>,<2C><><EFBFBD><EFBFBD> <20><><EFBFBD>ҵ<EFBFBD>db<64><62><EFBFBD><EFBFBD>,1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class ActorProperty:
public PropertySet
{
public:
int data_[P_MAX_ACTOR];
ActorProperty()
{
memset(this, 0, sizeof(ActorProperty));
}
};
// <20><><EFBFBD><EFBFBD><EFBFBD>޸Ĺ<DEB8>ActorProperty<74><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>Ӧ<EFBFBD><D3A6><EFBFBD>޸ij<DEB8><C4B3>µ<EFBFBD>PROP_MAX_ACTOR<4F><52>ֵ<EFBFBD><D6B5>ͬʱ֪<CAB1><D6AA><EFBFBD>ͻ<EFBFBD><CDBB>˳<EFBFBD><CBB3><EFBFBD>
STATIC_ASSERT((sizeof(ActorProperty) - sizeof(UpdateMask)) / sizeof(int) == P_MAX_ACTOR);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>
class MonsterProperty:
public PropertySet
{
public:
int data_[P_MAX_MONSTER];
MonsterProperty()
{
memset(this, 0, sizeof(MonsterProperty));
}
};
STATIC_ASSERT((sizeof(MonsterProperty) - sizeof(UpdateMask)) / sizeof(int) == P_MAX_MONSTER);
#pragma pack()
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,42 @@
#ifndef _ACHIEVE_DATA_H_
#define _ACHIEVE_DATA_H_
#include "common.h"
#include "skill_data.h"
#include "common/datalist.h"
// <20>ƺŵĴ洢<C4B4><E6B4A2>BYTE<54><45><EFBFBD><EFBFBD>
#define MAX_TITLE_DATA_SIZE 32
// <20>ɾʹһ<E6B4A2><D2BB>ռ<EFBFBD>õ<EFBFBD><C3B5>ֽ<EFBFBD><D6BD><EFBFBD>Ŀ
#define MAX_ACHIEVE_DATA_SIZE 256
// <20>ɾ<EFBFBD>ѫ<EFBFBD><D1AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define MAX_MEDALS_COUNT 256
#pragma once
#pragma pack (push, 1)
//<2F>ɾ͵<C9BE><CDB5><EFBFBD><EFBFBD><EFBFBD>
struct ACHIEVECONDITION
{
uint16_t eventId_; //<2F>ɾ<EFBFBD><C9BE>¼<EFBFBD>ID
int count_; //<2F>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
struct ACHIEVEMEDAL
{
uint8_t id_; //<2F>ɾ<EFBFBD>ѫ<EFBFBD>µ<EFBFBD>ID
unsigned int reach_time_; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
};
struct AchieveRankData
{
int medal_cnt; //ѫ<>¸<EFBFBD><C2B8><EFBFBD>
ACHIEVEMEDAL medal_list_[MAX_MEDALS_COUNT];
AchieveRankData() : medal_cnt(0){}
};
#pragma pack(pop)
#endif

View File

@@ -0,0 +1,56 @@
#pragma once
enum DBCacheType
{
DBCacheType_Undefined = -1, // <20><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DBCacheType_ActorBasic = 0, // <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DBCacheType_RoleData, // <20>ӽ<EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
DBCacheType_ScriptData,
DBCacheType_ItemBag, // <20><><EFBFBD>߰<EFBFBD>
DBCacheType_EquipBag, // װ<><D7B0><EFBFBD><EFBFBD>
DBCacheType_Mail, // <20>ʼ<EFBFBD>
DBCacheType_Store, // <20>̳<EFBFBD>
DBCacheType_Depot, // <20>ֿ<EFBFBD>
DBCacheType_Guild, // <20><><EFBFBD><EFBFBD>
DBCacheType_TogHitEquip, // <20>ϻ<EFBFBD>װ<EFBFBD><D7B0>
DBCacheType_CsScriptData, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lua
DBCacheType_ActorCache, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DBCacheType_Max,
};
// <20><>ɫCache<68><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28>ɵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̫<EFBFBD><CCAB>)
enum enActorCacheDataType
{
enCT_ActorBasicData, // <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enCT_BagItemData, // <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enCT_EquipItemData, // <20><>ɫװ<C9AB><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enCT_DepotItemData, // <20><>ɫ<EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD><EFBFBD><EFBFBD>
enCT_SkillData, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enCT_QuestData, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enCT_GuildData, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enCT_MiscData, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enCT_ScriptData, // <20>ű<EFBFBD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enCT_GemData, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enCT_MountData, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enCT_DmkjItemData, //<2F><><EFBFBD>οռ<CEBF><D5BC>ֿ<EFBFBD>
enCT_WingData, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enCT_BuffData, //buff<66><66><EFBFBD><EFBFBD>
enCT_AchieveData, // <20>ɾ<EFBFBD>
enCT_CaleData, //<2F><><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enCT_FbCountData, //ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enCT_PlotData, // <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>
enCT_MiscStruct, // <20><><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>
enCT_PetSkill, // <20><><EFBFBD><EFBFBD><EFBCBC>
enCT_EntrustItemData, // <20><><EFBFBD><EFBFBD>ί<EFBFBD>вֿ<D0B2>
enCT_PetItemData, //<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
enCT_PetCrossItem, //<2F><><EFBFBD><EFBFBD>زֿ<D8B2>
enCT_CrossScriptData, // <20><><EFBFBD><EFBFBD>ս<EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD><EFBFBD>
enCT_TongTianTaData, //ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enCT_MijiItem, //<2F>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD>
enCT_PetBase, //<2F><><EFBFBD><EFBFBD>ϵͳ
enCT_MarryBase, //<2F><><EFBFBD><EFBFBD>ϵͳ
enCT_Max, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫCache<68><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};

View File

@@ -0,0 +1,274 @@
#pragma once
#ifndef _ACTOR_DB_DATA_H_
#define _ACTOR_DB_DATA_H_
#include "common.h"
#include "common/datalist.h"
#include "common/property_set.h"
#pragma pack(push,4)
/*
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>̵<EFBFBD><CCB5><EFBFBD><EFBFBD>ݽṹ<DDBD><E1B9B9>
*/
using namespace SrvDef;
//tolua_begin
struct ActorBasicData
{
unsigned int account_id; //<2F>˻<EFBFBD><CBBB><EFBFBD>ID
//ACCOUNT account_name; //<2F>˻<EFBFBD><CBBB><EFBFBD><EFBFBD><EFBFBD>
char account_name[ACCOUNT_LENGTH]; //<2F>˻<EFBFBD><CBBB><EFBFBD><EFBFBD><EFBFBD>
int actor_id; //<2F><>ɫid
//ACTORNAME actor_name; //<2F><><EFBFBD><EFBFBD>
char actor_name[ACTOR_NAME_BUFF_LENGTH]; //<2F><><EFBFBD><EFBFBD>
unsigned int server_idnex;
unsigned char job; // <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ɫְҵ
unsigned char sex; // <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ɫ<EFBFBD>Ա<EFBFBD>
unsigned int level;
unsigned int exp;
long long int fb_uid; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uid
unsigned int fb_scene_id; //<2F><><EFBFBD><EFBFBD><EFBFBD>ڵij<DAB5><C4B3><EFBFBD>id
unsigned int create_time; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
unsigned int last_online_time; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
unsigned long long last_login_ip;//<2F>ϴε<CFB4>¼<EFBFBD><C2BC>ip,<2C><>û֧<C3BB><D6A7>
unsigned int total_online; //<2F>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
unsigned int daily_online; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
unsigned int bag_grid; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
long long int gold;
long long int yuanbao;
long long int total_power; // <20><>ս<EFBFBD><D5BD>
long long int rank_power; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD><D0B0><EFBFBD>ս<EFBFBD><D5BD>
unsigned int recharge; // <20><>ֵԪ<D6B5><D4AA><EFBFBD><EFBFBD>
unsigned int paid; // <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
unsigned int chapter_level; // <20><><EFBFBD>ڹؿ<DAB9><D8BF><EFBFBD> ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵij<DAB5><C4B3><EFBFBD>
unsigned int vip_level; // vip<69>ȼ<EFBFBD>
int essence; // <20><><EFBFBD><EFBFBD>
int zhuansheng_lv; // ת<><D7AA><EFBFBD>ȼ<EFBFBD>
int zhuansheng_exp; // ת<><D7AA><EFBFBD><EFBFBD>Ϊ
unsigned char monthcard; //0Ϊû<CEAA><C3BB><EFBFBD><EFBFBD>1,Ϊû<CEAA><C3BB><EFBFBD><EFBFBD>,2Ϊ<32><CEAA><EFBFBD><EFBFBD>
int tianti_level; //<2F><><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>
int tianti_dan; //<2F><><EFBFBD>ݶ<EFBFBD>λ
int tianti_win_count; //<2F><><EFBFBD>ݾ<EFBFBD>ʤ
int tianti_week_refres; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD><CBA2>
long long int total_wing_power; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD>
long long int warrior_power; //սʿս<CABF><D5BD>
long long int mage_power; //<2F><>ʦս<CAA6><D5BD>
long long int taoistpriest_power; //<2F><>ʿս<CABF><D5BD>
int train_level; //<2F><><EFBFBD><EFBFBD>(<28><>λ)<29>ȼ<EFBFBD>
int train_exp; //<2F><><EFBFBD><EFBFBD>(<28><>λ)<29><><EFBFBD><EFBFBD>
int total_stone_level; //<2F><>ʯ(<28><><EFBFBD><EFBFBD>)<29>ܵȼ<DCB5>
int total_zhuling_level;//<2F><><EFBFBD><EFBFBD><EFBFBD>ܵȼ<DCB5>
int guild_id_; //<2F><><EFBFBD><EFBFBD>ID
char guild_name_[32];//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int zhan_ling_star; //
int zhan_ling_stage; //
int total_loongsoul_level;
int prestige_exp; //<2F><><EFBFBD><EFBFBD>ֵ
long long int feats; // <20><>ѫ
unsigned int ex_ring_lv[8];//<2F>ؽ<EFBFBD><D8BD>ȼ<EFBFBD>,<2C><><EFBFBD><EFBFBD>λΪ1ʱ<31><CAB1><EFBFBD><EFBFBD>ս
long long int shatter; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭ
long long int spcshatter; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭ
unsigned int knighthood_lv;//ѫ<>µȼ<C2B5>
long long int togeatter;//<2F>ϻ<EFBFBD><CFBB><EFBFBD>Ƭ
int total_wing_lv; //<2F><><EFBFBD><EFBFBD><EFBFBD>ܽ׼<DCBD>
long long int total_tujian_power;//ͼ<><CDBC><EFBFBD><EFBFBD>ս<EFBFBD><D5BD>
long long int total_equip_power;//װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
long long int togeatterhigh;//<2F>߼<EFBFBD><DFBC>ϻ<EFBFBD><CFBB><EFBFBD>Ƭ
unsigned char privilege_monthcard; //<2F><>Ȩ<EFBFBD>¿<EFBFBD><C2BF><EFBFBD> δ<><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>Ϊ0,1Ϊû<CEAA><C3BB><EFBFBD><EFBFBD>
int reincarnate_lv; // <20>ֻصȼ<D8B5>
int reincarnate_exp; // <20>ֻ<EFBFBD><D6BB><EFBFBD>Ϊ
long long int dianquan;//<2F><>ȯ
int quota; //<2F><><EFBFBD>׶<EFBFBD><D7B6><EFBFBD>
};
inline ActorBasicData* toActorBasicData(void* data) { return (ActorBasicData*)data; }
//tolua_end
struct ActorCsData {
unsigned int actor_id; //<2F><>ɫid
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned long long cw_fbhdl_sid_; // <20><><EFBFBD><EFBFBD>ս<EFBFBD><D5BD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϣ,<2C><><34><CEBB>fuben<65><6E>handle<6C><65><EFBFBD><EFBFBD><34><CEBB>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sid
unsigned long long cw_scene_xy_; // <20><><EFBFBD><EFBFBD>ս<EFBFBD><D5BD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϣ,<2C><><34>dz<EFBFBD><C7B3><EFBFBD>id<69><64><EFBFBD><EFBFBD><34>еĵ͸<C4B5><CDB8><EFBFBD>λ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>x<EFBFBD><78>y
unsigned long long cw_static_pos_; // <20><><EFBFBD><EFBFBD><EBB8B1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><34>dz<EFBFBD><C7B3><EFBFBD>id<69><64><EFBFBD><EFBFBD><34>еĵ͸<C4B5><CDB8><EFBFBD>λ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>x<EFBFBD><78>y
ActorCsData() {
memset(this, 0, sizeof(ActorCsData));
}
};
#pragma pack(pop)
inline void ReadActorBasicData(ActorBasicData& actor_data, MYSQL_ROW &pRow, unsigned long *fieldLength)
{
/*select level, exp, baggridcount, gold, yuanbao, totalpower, paid, fbhandle, sceneid,
createtime, lastlogouttime, totalonline, dailyonline
from actors
where actorid = nactorid and(status & 2) = 2;
*/
#define GetRowInt(i, data) sscanf(pRow[i], "%d", &(data))
#define GetRowUChar(i, data) int temp##i; sscanf(pRow[i], "%d", &(temp##i)); data = temp##i;
#define GetRowLInt(i, data) sscanf(pRow[i], "%lld", &(data))
#define GetRowString(i, data) sscanf(pRow[i], "%s", (data))
#define GetRowData(i,data) if(pRow[i]!=NULL) memcpy(&(data),pRow[i],fieldLength[i])
#ifdef _MSC_VER
#pragma message("todo <20><>װ<EFBFBD><D7B0><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD>")
#endif
GetRowInt(0, actor_data.account_id);
GetRowString(1, actor_data.account_name);
GetRowInt(2, actor_data.actor_id);
GetRowString(3, actor_data.actor_name);
GetRowUChar(4, actor_data.job);
GetRowUChar(5, actor_data.sex);
//GetRowInt(6, actor_data.status);
GetRowInt(7, actor_data.level);
GetRowInt(8, actor_data.exp);
GetRowInt(9, actor_data.server_idnex);
//GetRowInt(10, actor_data.create_time);
tm t;
memset(&t, 0, sizeof(t));
sscanf(pRow[10], "%d-%d-%d %d:%d:%d",
&t.tm_year,
&t.tm_mon,
&t.tm_mday,
&t.tm_hour,
&t.tm_min,
&t.tm_sec
);
t.tm_year -= 1900;
t.tm_mon -= 1;
actor_data.create_time = (unsigned int)mktime(&t);
//GetRowInt(11, actor_data.updatetime);
GetRowInt(12, actor_data.last_online_time);
GetRowLInt(13, actor_data.last_login_ip);
GetRowInt(14, actor_data.bag_grid);
GetRowLInt(15, actor_data.gold);
GetRowLInt(16, actor_data.yuanbao);
GetRowLInt(17, actor_data.total_power);
GetRowInt(18, actor_data.recharge);
GetRowInt(19, actor_data.paid);
GetRowLInt(20, actor_data.fb_uid);
GetRowInt(21, actor_data.fb_scene_id);
GetRowInt(22, actor_data.total_online);
GetRowInt(23, actor_data.daily_online);
GetRowInt(24, actor_data.chapter_level);
GetRowInt(25, actor_data.vip_level);
GetRowInt(26, actor_data.essence);
GetRowInt(27, actor_data.zhuansheng_lv);
GetRowInt(28, actor_data.zhuansheng_exp);
GetRowUChar(29, actor_data.monthcard);
GetRowInt(30, actor_data.tianti_level);
GetRowInt(31, actor_data.tianti_dan);
GetRowInt(32, actor_data.tianti_win_count);
GetRowInt(33, actor_data.tianti_week_refres);
GetRowLInt(34, actor_data.total_wing_power);
GetRowLInt(35, actor_data.warrior_power);
GetRowLInt(36, actor_data.mage_power);
GetRowLInt(37, actor_data.taoistpriest_power);
GetRowInt(38, actor_data.train_level);
GetRowInt(39, actor_data.train_exp);
GetRowInt(40, actor_data.total_stone_level);
GetRowInt(41, actor_data.guild_id_);
GetRowInt(42, actor_data.zhan_ling_star);
GetRowInt(43, actor_data.zhan_ling_stage);
GetRowInt(44, actor_data.total_loongsoul_level);
GetRowLInt(45, actor_data.feats);
GetRowData(46, actor_data.ex_ring_lv);
GetRowLInt(47, actor_data.shatter);
GetRowLInt(48, actor_data.spcshatter);
GetRowInt(49, actor_data.knighthood_lv);
GetRowLInt(50, actor_data.togeatter);
GetRowLInt(51, actor_data.rank_power);
GetRowInt(52, actor_data.total_wing_lv);
GetRowLInt(53, actor_data.total_tujian_power);
GetRowLInt(54, actor_data.total_equip_power);
GetRowLInt(55, actor_data.togeatterhigh);
GetRowInt(56, actor_data.total_zhuling_level);
GetRowInt(57, actor_data.prestige_exp);
GetRowInt(58, actor_data.reincarnate_lv);
GetRowInt(59, actor_data.reincarnate_exp);
GetRowLInt(60, actor_data.dianquan);
GetRowInt(61, actor_data.quota);
//<2F>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> appid<69><64>pfid
GetRowString(64, actor_data.guild_name_);
}
#endif
/*
//<2F><><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD>ǰն<C7B0>ɣ<EFBFBD><C9A3><EFBFBD>dbͨ<62>ŵİ<C5B5>
typedef struct tagActorDbData:
ActorProperty
{
ACTORNAME name; //<2F><><EFBFBD><EFBFBD>
unsigned nFbHandle; //<2F><><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ͨ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
unsigned nScenceID; //<2F><><EFBFBD><EFBFBD>id
unsigned nEnterFbScenceID;
int nEnterFbPos; //X <20><>y<EFBFBD><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
unsigned int nCreateTime; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
unsigned long long lLastLoginIp ;//<2F>ϴε<CFB4>¼<EFBFBD><C2BC>ip,<2C><>û֧<C3BB><D6A7>
unsigned int nLastLogoutTime; //<2F>ϴε<CFB4><CEB5><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>,minidate<74><65>ʽ
unsigned int nFbTeamId; // <20><><EFBFBD>˻<EFBFBD><CBBB><EFBFBD>(<28><><EFBFBD><EFBFBD>)
ACCOUNT accountName; //<2F>˻<EFBFBD><CBBB><EFBFBD><EFBFBD><EFBFBD>
unsigned int achieveTime; //<2F>ɾʹ<C9BE><CDB4><EFBFBD>ʱ<EFBFBD><CAB1>
unsigned int nAccountId; //<2F>˻<EFBFBD><CBBB><EFBFBD>ID
int64_t csrevivepoint; //<2F><>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>dz<EFBFBD><C7B3><EFBFBD>id,x,y<><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int64_t fbrevivepoint; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>dz<EFBFBD><C7B3><EFBFBD>id,x,y<><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int64_t cityrevivepoint; //<2F><><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>dz<EFBFBD><C7B3><EFBFBD>id,x,y<><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int free_baptize_; // <20><><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
int one_key_time_; // ʣ<><CAA3>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ѵĴ<D1B5><C4B4><EFBFBD>
int mount_score_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int friend_cong_; // <20><><EFBFBD><EFBFBD>ף<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
int reserve_data_; // <20><><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>ʹ<EFBFBD><CAB9>
unsigned int spirit_score_; //<2F><><EFBFBD>ҵľ<D2B5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD>
int lianfuTeamId; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>id
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned long long cw_fbhdl_sid_; // <20><><EFBFBD><EFBFBD>ս<EFBFBD><D5BD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϣ,<2C><><34><CEBB>fuben<65><6E>handle<6C><65><EFBFBD><EFBFBD><34><CEBB>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sid
unsigned long long cw_scene_xy_; // <20><><EFBFBD><EFBFBD>ս<EFBFBD><D5BD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϣ,<2C><><34>dz<EFBFBD><C7B3><EFBFBD>id<69><64><EFBFBD><EFBFBD><34>еĵ͸<C4B5><CDB8><EFBFBD>λ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>x<EFBFBD><78>y
unsigned long long cw_static_pos_; // <20><><EFBFBD><EFBFBD><EBB8B1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><34>dz<EFBFBD><C7B3><EFBFBD>id<69><64><EFBFBD><EFBFBD><34>еĵ͸<C4B5><CDB8><EFBFBD>λ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>x<EFBFBD><78>y
int war_team_id_; // ս<><D5BD>ID
int cross_honor_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
unsigned int upgrade_time_; //<2F><><EFBFBD>ҵȼ<D2B5><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
unsigned int total_online_; //<2F>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
unsigned int daily_online_; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
char quest[1000]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char mis_for_php_[128]; //<2F><><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>ѯ<EFBFBD><D1AF>һЩ<D2BB><D0A9><EFBFBD><EFBFBD>
tagActorDbData()
{
memset(this, 0, sizeof(tagActorDbData));
}
} ACTORDBDATA, *PACTORDBDATA;
*/

View File

@@ -0,0 +1,57 @@
#ifndef _CONFIG_DB_DATA_H_
#define _CONFIG_DB_DATA_H_
#define MAX_NAME_LEN 64
#define MAX_LEN_BUFF 64
#define MAX_LEN_DESC 1024
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ
typedef struct staticaward
{
int itemid; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒid
int needgrid; //<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char itemname[MAX_NAME_LEN];
char itemdesc[MAX_LEN_DESC];
//int itype; //<2F><>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD>
//int sell_type;
int icon; //ͼ<><CDBC>id
//int color;
//int dura;
int dup; //<2F><>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
//int colGroup;
//int dealType;
//int dealPrice;
int itime; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned int flag; //<2F><><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
int grouptype; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>û<EFBFBD><C3BB><EFBFBD>û<EFBFBD>0<EFBFBD><30>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9A3AC>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,1<><31>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int cond_cons_id; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒid,û<><C3BB><EFBFBD><EFBFBD>0
int cond_cons_count; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒid<69><64><EFBFBD><EFBFBD><><C3BB><EFBFBD><EFBFBD>0
int cond_money_type; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǯ<EFBFBD><C7AE><EFBFBD>ͣ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>0
int cond_money_count; // <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǯ<EFBFBD><C7AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>0
char cond_value[MAX_LEN_BUFF]; //<2F><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> c1=v1&c2=v2&c3=v3<76><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
} Staticaward_t;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct staticawardconfig
{
int giftitemid; // <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒid
int rewardtype; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <20><>Ʒ 2 <20><>Ǯ ... <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>
int contenttype;// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD> Ŀǰֻ<C7B0><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǯ<EFBFBD><C7AE><EFBFBD><EFBFBD>
int amount; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
int itemid; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>id<69><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒid<69><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>id<69><64>
int bind; //<2F>Ƿ<EFBFBD><C7B7>󶨣<EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>1<EFBFBD><31>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
int group; // <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int rate; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int noworldrate; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><E7BEAD><EFBFBD>ӳɣ<D3B3>0<EFBFBD>ӳɣ<D3B3>1<EFBFBD><31>ʾ<EFBFBD><CABE><EFBFBD>޼ӳ<DEBC>
int quality;
int strong;
}Staticawardconfig_t;
#endif

View File

@@ -0,0 +1,44 @@
#ifndef _CONSIGNMENT_H_
#define _CONSIGNMENT_H_
#include "common.h"
#include "item_data.h"
#include "common/datalist.h"
//<2F><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ˽ṹ<CBBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD>ֽڶ<D6BD><DAB6><EFBFBD>
#pragma pack (push, 1)
//
typedef struct tagConsingmentData
{
ItemSeries id_; // Ψһ<CEA8><D2BB>id
ItemData* item_; //<2F><>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>Ʒ<EFBFBD>
int sell_money_; // <20><><EFBFBD>۵<EFBFBD><DBB5>ǽ<EFBFBD>Ǯ
int sell_money_type_; // <20><>Ǯ<EFBFBD><C7AE><EFBFBD>ͣ<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>Ƿǰ󶨵<C7B0>
UINT restTime_; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3>ʱ<EFBFBD><CAB1>
UINT price_; //<2F><>Ǯ
ActorId actorId_; //<2F><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>id
uint8_t moneyType_; //Ԫ<><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t bJob; //<2F><><EFBFBD>õ<EFBFBD>ְҵ<D6B0><D2B5>0<EFBFBD><30>ͨ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ְҵ<D6B0><D2B5><EFBFBD><EFBFBD>
uint8_t bType; //<2F><><EFBFBD>ͣ<EFBFBD>
uint8_t bLevel; //<2F><>Ʒʹ<C6B7><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵȼ<C4B5>
uint8_t timeOut_; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڣ<EFBFBD>0<EFBFBD><30>ʾû<CABE><C3BB><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
unsigned int handle_; //<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>handle
ACTORNAME actor_name_; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char account_name_[64]; // <20>˻<EFBFBD><CBBB><EFBFBD><EFBFBD><EFBFBD>
tagConsingmentData()
{
ZeroMemory(this, sizeof(*this));
}
static bool SortRule(tagConsingmentData* data1, tagConsingmentData* data2)
{
return (data1->moneyType_ == data2->moneyType_) ? (data1->price_ < data2->price_) : (data1->moneyType_ > data2->moneyType_);
}
}ConsingmentData;
#pragma pack(pop)
#endif

View File

@@ -0,0 +1,151 @@
#ifndef _DB_FIGHT_H_
#define _DB_FIGHT_H_
#include "common.h"
#include "skill_data.h"
#include "common/datalist.h"
#define MAX_DB_SKILL 16
#define MAX_FIGHT_DATA 1000
#define FIGHT_PER_PAGE 15
#define MAX_FIGHT_LOG 50
#pragma pack(push, 1)
struct FightDBData
{
ActorId aid_;
ACTORNAME name_;
int serverid_;
int sex_;
int job_;
int fight_value_;
int gid_; // <20><><EFBFBD>ڰ<EFBFBD><DAB0>ɵ<EFBFBD>ID
int weapon_; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int wing_; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int props_[P_MAX_CREATURE]; //һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>
int hair_;
int sprite_; //<2F><><EFBFBD><EFBFBD>
int social_; //<2F><><EFBFBD><EFBFBD>ְλ
int guild_level_; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>props<70><73>
//int level_;
//int icon_;
//int model_;
//int max_hp_;
//int max_mp_;
//int speed_;
//int out_attack_;
//int out_defence_;
//int in_attack_;
//int in_defence_;
//int all_attack_;
//int sub_def_;
//int baoji_;
//int shanbi_;
//int hit_rate_;
//int attack_append_;
//float hp_renew_;
//float mp_renew_;
//int attack_speed_;
//int in_attack_damage_add_;
//int out_attack_damage_add_;
//int lilian_; // <20><><EFBFBD>ڻ<EFBFBD><DABB>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>)
int skill_cnt_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BaseSkillData skills_[MAX_DB_SKILL]; // <20><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>(<28><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>)
int other_skill_cnt_; //<2F><><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BaseSkillData other_skills_[MAX_DB_SKILL]; //<2F><><EFBFBD><EFBFBD>ϵͳ<CFB5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>б<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
int nIndex; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
int prev_index; // <20>ϴε<CFB4><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ƣ<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>賿<EFBFBD><E8B3BF>¼
int attack_type_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int init_data_; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
FightDBData()
{
wing_ = 0;
hair_ = 0;
sprite_ = 0;
skill_cnt_ = 0;
other_skill_cnt_ = 0;
attack_type_ = 1;
weapon_ = 0;
social_ = 0;
guild_level_ = 0;
memset(props_, 0, sizeof(props_));
prev_index = 1000000;
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int GetTrend()
{
if (nIndex > prev_index)
return 0;
else if (nIndex < prev_index)
return 2;
return 1;
}
};
// <20><>ս<EFBFBD><D5BD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>
struct FightActorData
{
ActorId id_;
int rank_; // <20><>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int serverid_;
int sex_;
int job_;
int level_;
ACTORNAME name_;
};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD>¼
struct FightLogData
{
unsigned int time_; // ʱ<><CAB1>
FightActorData aid1_; // <20><>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>
FightActorData aid2_; // <20><><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>
int result_; // <20><>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>
};
// <20><><EFBFBD>˶<EFBFBD>ս<EFBFBD><D5BD>¼
struct FightLog
{
int date_;
int type_;
int result_;
int rank_; // <20><>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int enemyid_;
int encamp_;
int ensex_;
int enjob_;
int enlevel_;
ACTORNAME enname_;
};
// <20><><EFBFBD><EFBFBD><EFBCBC><EFBFBD><EFBFBD>Ϣ
struct FightPetSkill
{
int skillId_; // <20><><EFBFBD><EFBFBD>id
int level_;
};
struct FightPetData
{
int title_; //
int mid_; // <20><><EFBFBD><EFBFBD>ID
int level_;
//int name_rgb_;
};
#pragma pack(pop)
#endif

View File

@@ -0,0 +1,44 @@
#ifndef _FRIEND_DATA_H_
#define _FRIEND_DATA_H_
#include "common.h"
#pragma pack(push,1)
struct FriendInfo
{
ActorId actor_id_; //<2F><><EFBFBD>ѽ<EFBFBD>ɫid
//int qq_vip_;
//unsigned int friendly_;//<2F><><EFBFBD>ú<EFBFBD><C3BA>ѵ<EFBFBD><D1B5>Ѻö<D1BA>
//uint8_t icon_; //<2F>ú<EFBFBD><C3BA>ѵ<EFBFBD>ͷ<EFBFBD><CDB7>
uint8_t f_type_;
//int level_;
//uint8_t camp_;
//uint8_t job_;
//uint8_t sex_;
//uint32_t fight_; //ս<><D5BD><EFBFBD><EFBFBD>
//uint32_t last_logout_time_;//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
//uint32_t server_id_; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
uint32_t add_friend_time_; //<2F><><EFBFBD>Ӻ<EFBFBD><D3BA><EFBFBD>ʱ<EFBFBD><CAB1>
uint32_t last_contact_time_; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵʱ<CFB5><CAB1>
// <20><><EFBFBD>رȽϲ<C8BD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1>л<EFBFBD><D0BB><EFBFBD><EFBFBD>ݽ<EFBFBD>ɫid<69><64><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
inline bool operator != (const FriendInfo& data) const
{
return actor_id_ != data.actor_id_;
}
inline bool operator > (const FriendInfo& data) const
{
return actor_id_ > data.actor_id_;
}
inline bool operator < (const FriendInfo& data) const
{
return actor_id_ < data.actor_id_;
}
};
#pragma pack (pop)
#endif

View File

@@ -0,0 +1,42 @@
#ifndef _GUILD_DB_H_
#define _GUILD_DB_H_
#include "common.h"
#define MAXMEMOCOUNT 1024
struct GuildMemberInfo
{
ActorId actorId_;
int total_contrib_;
int today_contrib_;
uint8_t job_; // ְҵ
uint8_t sex_;
uint8_t level_;//<2F>ȼ<EFBFBD>
uint8_t zs_level_;//ת<><D7AA><EFBFBD>ȼ<EFBFBD>
uint8_t pos_; //<2F><>λ
double fight_; // ս<><D5BD>
int vip_; // vip<69>ȼ<EFBFBD>
int monthcard_; // <20>¿<EFBFBD>״̬
uint8_t icon_; //ͷ<><CDB7>ID
unsigned int lastLogoutTime_;
unsigned int recharge_;
ACTORNAME actor_name_;
uint64_t handle_;
GuildMemberInfo()
{
ZeroMemory(this, sizeof(*this));
}
int compare(GuildMemberInfo& node)
{
if (total_contrib_ > node.total_contrib_) return 1;
else if (total_contrib_ < node.total_contrib_) return -1;
else return 0;
}
};
#endif

View File

@@ -0,0 +1,90 @@
#ifndef _USER_ITEM_H_
#define _USER_ITEM_H_
#include "common.h"
// <20><>ʱû<CAB1>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>varchar64<36><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//#define ITEM_DATA_RESERVED_SIZE 64
#define EQUIP_ATTR_COUNT 8
#define ITEM_ATTR_TYPEVALUE 2
#define ITEM_ATTR_TYPE 0
#define ITEM_ATTR_VALUE 1
enum BagType
{
BagType_Item = 0,
BagType_Equip,
BagType_Depot,
};
#pragma pack (push, 1)
union ItemSeries
{
int64_t llId;
struct
{
unsigned int time_; //31-0λ<30><CEBB>ʾ<EFBFBD><CABE>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD>ʱ<EFBFBD>䣬ֵΪ<D6B5><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
uint16_t series_; //47-32λ<32><CEBB>ʾ<EFBFBD><CABE>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>У<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ+1<><31>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
uint16_t sid_; //55-48λ<38><CEBB>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
} t;
public:
//inline operator int64_t () const { return llId; }
//inline bool operator == (const ItemSeries& series) const { return llId == series.llId; }
//inline bool operator != (const ItemSeries& series) const { return llId != series.llId; }
};
union ItemAttrData
{
// define:
struct EquipAttr
{
int attr[EQUIP_ATTR_COUNT][ITEM_ATTR_TYPEVALUE]; // <20><><EFBFBD><EFBFBD>+value
};
// public:
EquipAttr equip_attr;
};
struct ItemData
{
int64_t uid; //<2F><>ƷΨһϵ<D2BB>к<EFBFBD> ItemSeries
int id;
int count;
ItemAttrData attr_data; // <20>󲿷<EFBFBD><F3B2BFB7><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD><D4BA>٣<EFBFBD><D9A3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ż<EFBFBD>
ItemAttrData ex_attr_data;
ItemData()
{
memset(this, 0, sizeof(ItemData));
}
public:
//<2F>޸<EFBFBD>useritem ע<><D7A2><EFBFBD><EFBFBD>Ҫ<EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD> writeToPack, writeDbPack, writeCrcPack
//<2F><>װ<EFBFBD><D7B0><EFBFBD>͸<EFBFBD><CDB8>ͻ<EFBFBD><CDBB>˵İ<CBB5>
void writeData(DataPacket& pack) {
pack.writeBuf(this, sizeof(ItemData));
}
void readData(DataPacketReader& pack) {
pack.readBuf(this, sizeof(ItemData));
}
static void copy(ItemData* dstItem, ItemData* srcItem)
{
if (!dstItem || !srcItem || dstItem == srcItem) return;
memcpy(dstItem, srcItem, sizeof(ItemData));
}
};
#pragma pack(pop)
//STATIC_ASSERT(sizeof(ItemData) < ITEM_DATA_RESERVED_SIZE);
typedef std::vector<ItemData*> ItemList ;
#endif

View File

@@ -0,0 +1,89 @@
#ifndef _MAIL_DATA_H_
#define _MAIL_DATA_H_
#include "common.h"
enum MailAwardType
{
MailAwardType_Currency,
MailAwardType_Item,
};
enum MailReadStatusType
{
MailReadStatusType_NotRead,
MailReadStatusType_HaveRead,
};
enum MailAwardStatusType
{
MailAwardStatusType_NoAward = -1, //<2F>޸<EFBFBD><DEB8><EFBFBD>
MailAwardStatusType_CanAward = 0, //<2F><><EFBFBD><EFBFBD>ȡ
MailAwardStatusType_HaveAward = 1, //<2F><><EFBFBD><EFBFBD>ȡ
};
#pragma pack (push, 4)
union MailSeries
{
int64_t llId;
struct
{
unsigned int time_; //31-0λ<30><CEBB>ʾ<EFBFBD><CABE>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD>ʱ<EFBFBD>䣬ֵΪ<D6B5><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
uint16_t series_; //47-32λ<32><CEBB>ʾ<EFBFBD><CABE>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>У<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ+1<><31>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
uint16_t sid_; //55-48λ<38><CEBB>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
} t;
public:
//inline operator int64_t () const { return llId; }
//inline bool operator == (const ItemSeries& series) const { return llId == series.llId; }
//inline bool operator != (const ItemSeries& series) const { return llId != series.llId; }
};
struct MailAwardData
{
int type; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int id; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ<EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒid<69><64><EFBFBD>ǻ<EFBFBD><C7BB>ҵĻ<D2B5><C4BB><EFBFBD>û<EFBFBD><C3BB>
int count; //<2F><><EFBFBD><EFBFBD>
MailAwardData() :type(0), id(0), count(0) {}
};
struct MailAwardList
{
int awardCount; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MailAwardData awardList[10]; //<2F><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
};
struct MailData
{
static const int HEAD_SIZE = 128;
static const int CONTEXT_SIZE = 1024;
int uid; //<2F>ʼ<EFBFBD>Ψһϵ<D2BB>к<EFBFBD> MailSeries
int readStatus; //<2F><>ȡ״̬
int awardStatus; //<2F>콱״̬
int sendtime; //<2F><><EFBFBD>͵<EFBFBD>ʱ<EFBFBD><CAB1>
char head[128]; //<2F>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>
char context[1024]; //<2F>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>
MailAwardList award_data; // <20>󲿷<EFBFBD><F3B2BFB7><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD><D4BA>٣<EFBFBD><D9A3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ż<EFBFBD>
MailData()
{
memset(this, 0, sizeof(MailData));
}
public:
//<2F>޸<EFBFBD>useritem ע<><D7A2><EFBFBD><EFBFBD>Ҫ<EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD> writeToPack, writeDbPack, writeCrcPack
//<2F><>װ<EFBFBD><D7B0><EFBFBD>͸<EFBFBD><CDB8>ͻ<EFBFBD><CDBB>˵İ<CBB5>
void writeData(DataPacket& pack) {
pack.writeBuf(this, sizeof(MailData));
}
void readData(DataPacketReader& pack) {
pack.readBuf(this, sizeof(MailData));
}
};
#pragma pack(pop)
#endif

104
Gateway/common/db/msg.h Normal file
View File

@@ -0,0 +1,104 @@
#ifndef _MSG_H_
#define _MSG_H_
#define MAX_MSG_COUNT 1024 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿⶨ<DDBF><E2B6A8><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD>ܸ<EFBFBD>
#define MAX_MAIL_COUNT 1024 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿⶨ<DDBF><E2B6A8><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD>ܸ<EFBFBD>
#define MAX_MAIL_FILE_COUNT 3
#define MAX_MAIL_NOTIFY 180
//<2F><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ˽ṹ<CBBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD>ֽڶ<D6BD><DAB6><EFBFBD>
#pragma pack (push, 1)
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>ʼ<EFBFBD><CABC><EFBFBD>Ϣ
struct MailFile
{
uint8_t type_; // 0 NULL 1 <20><>Ʒ 2 <20><>Ǯ
int sort_; // <20><>ƷID<49><44><EFBFBD><EFBFBD>Ǯ<EFBFBD><C7AE><EFBFBD>ࣨ1 Ԫ<><D4AA><EFBFBD><EFBFBD> 2 <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> 3 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4 <20>ɱң<C9B1>
int num_; // <20><><EFBFBD><EFBFBD>
uint8_t bind_; // <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
int quality_; // Ʒ<><C6B7>
MailFile()
{
ZeroMemory(this, sizeof(*this));
}
void reset()
{
ZeroMemory(this, sizeof(*this));
}
};
// struct MailData
// {
// int64_t id_;
// int actor_id_;
// uint8_t type_;
// uint8_t status_;
// int sender_id_;
// int sender_level_;
// uint32_t send_tick_;
// char send_name_[33];
// char context_[MAX_MAIL_COUNT];
// MailFile attachment_[MAX_MAIL_FILE_COUNT];
//
// MailData()
// {
// ZeroMemory(this, sizeof(*this));
// }
// void reset()
// {
// ZeroMemory(this, sizeof(*this));
// }
// };
struct GmQuestionData
{
int64_t id_;
int server_id_;
int actor_id_;
char name_[128];
int status_;
int hasread_;
char title_[128];
int type_;
char question_[1024];
char qq_[16];
unsigned int question_time_;
char answer_[1024];
unsigned int answer_time_;
GmQuestionData()
{
ZeroMemory(this, sizeof(*this));
}
void reset()
{
ZeroMemory(this, sizeof(*this));
}
};
struct FeeData
{
int id_;
char openid_[128];
int itemId_;
int num_;
int actor_id_;
char order_num_[128];
};
struct TxApiMsgData
{
int id_;
char openid_[128];
int type_;
char para1_[64];
char para2_[64];
char para3_[64];
char para4_[64];
char para5_[64];
};
#pragma pack(pop)
#endif

View File

@@ -0,0 +1,19 @@
#ifndef _PET_H_
#define _PET_H_
#include "common/system_param_def.h"
#pragma pack(push,1)
struct PropData
{
int data_[PI_MAX];
};
#pragma pack (pop)
//lua<75><61><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define MAX_BLOOD 20
#endif

View File

@@ -0,0 +1,159 @@
#ifndef _DB_RANK_H_
#define _DB_RANK_H_
#include "container/static_array_list.h"
#include "common/datalist.h"
#include "common/gem_def.h"
#include "item_data.h"
#include "wing_data.h"
#include "achieve_data.h"
using namespace container;
#define MAX_USER_EQUIP 19
#define MAX_PET_SKILL 16
#define MAX_PET_BASE 8
#define MAX_FIGHT 40
#define NEED_REMEMBER_PROPERTY 20
#define MAX_PET_EQUIP 4
enum RankType
{
rtNone = 0,
rtFightVal = 1, // ս<><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rtLevel = 2, // <20>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>
rtCharmWeek = 3,// ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rtAchieve = 4, // <20>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD>
rtPet = 5, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD>
rtMount = 6, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rtWing = 7, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD>
rtSpirit = 8, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rtCharm = 9, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>)
rtRoot = 10, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD>ã<EFBFBD>
rtMax,
};
#pragma pack(push, 1)
struct RankDbItem
{
ActorId actorId_;
int rankId_; // <20><><EFBFBD>а<EFBFBD><D0B0>ı<EFBFBD><C4B1><EFBFBD>
int point_; // <20><><EFBFBD>еķ<D0B5><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵȼ<C7B5><C8BC><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵȼ<C7B5><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ)
int camp_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>id
int level_; // <20>ȼ<EFBFBD>
int job_; // ְҵ
int sex_; // <20>Ա<EFBFBD>
int fightVal_; // ս<><D5BD><EFBFBD><EFBFBD>
int mount_id_;// <20><><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ڿͻ<DABF><CDBB><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int spirit_id_; // <20><><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><E7A3AC><EFBFBD>ڿͻ<DABF><CDBB><EFBFBD>ȡ<EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD>ע<EFBFBD><EFBFBD><E2A3AC>Щ<EFBFBD>ֶ<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int wing_; // <20><><EFBFBD><EFBFBD>id
int pet_type_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>id
int pet_id_; // <20><><EFBFBD><EFBFBD>id
int qq_vip_; // qqvip<69>ȼ<EFBFBD>
int weapon_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int model_; // <20>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>
int hair_; // ͷ<><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int stone_effect_;//<2F><>ʯ<EFBFBD><CAAF>Ч
int stage_effect_;//<2F>׼<EFBFBD><D7BC><EFBFBD>Ч
int wing_model_;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int last_rank_; // <20><>һ<EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD>
int like_; //<2F><><EFBFBD>޴<EFBFBD><DEB4><EFBFBD>
int srvid_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>id
char actorName_[32]; //<2F><>ɫ<EFBFBD><C9AB>
char guild_[32]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char petName_[32]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static const int MAX_COUNT = 100;
RankDbItem() : actorId_(0), rankId_(0), point_(0), camp_(0), level_(1), job_(0), sex_(0), fightVal_(0), mount_id_(0),
spirit_id_(0), wing_(0), pet_type_(0), pet_id_(0), qq_vip_(0), weapon_(0), model_(0), hair_(0), stone_effect_(0), stage_effect_(0), wing_model_(0), last_rank_(0), like_(0), srvid_(0)
{
actorName_[0] = 0;
guild_[0] = 0;
petName_[0] = 0;
}
};
#pragma pack(pop)
#pragma pack(push, 1)
struct PetRankDbItem
{
ActorId actorId_;
int jingjie_; //<2F><><EFBFBD><EFBFBD><EFBEB3>
int nature_; //<2F><><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD>
short pet_type_; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>idx
short skill_count_; //<2F><><EFBFBD>ܸ<EFBFBD><DCB8><EFBFBD>
int skill_list_[MAX_PET_SKILL]; //һ<><D2BB>int<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>id<69>͵ȼ<CDB5> (<28><>16 <20><><EFBFBD><EFBFBD>id <20><>16 <20>ȼ<EFBFBD>)
StaticDataList<ItemData, MAX_PET_EQUIP> items_;//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
static const int MAX_COUNT = 100;
PetRankDbItem() : actorId_(0), jingjie_(0), nature_(0), pet_type_(0), skill_count_(0)
{
memset(skill_list_, 0, sizeof(skill_list_));
}
};
#pragma pack(pop)
typedef StaticArrayList<RankDbItem, RankDbItem::MAX_COUNT> RankList;
typedef StaticArrayList<PetRankDbItem, PetRankDbItem::MAX_COUNT> PetRankList;
typedef StaticHashTable<int, RankDbItem::MAX_COUNT> LastRankList;
typedef StaticDataList<RankList, rtMax> AllRankList;
typedef StaticDataList<LastRankList, rtMax> AllLastRankList;
#pragma pack(push, 1)
struct RankData
{
int property_[NEED_REMEMBER_PROPERTY]; //<2F><><EFBFBD><EFBFBD>ֵ
int fight_list_[MAX_FIGHT]; //ս<><D5BD><EFBFBD><EFBFBD>ֵ
RankData()
{
memset(property_, (int)0, sizeof(property_));
memset(fight_list_, (int)-1, sizeof(fight_list_));
}
};
#pragma pack(pop)
struct ActorRankData
{
ActorId actorId_; //<2F><>ɫid
int dragon_; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><><EFBFBD><EFBFBD>)
int hasMount_; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//MountDataDb mount_data_;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
StaticDataList<ItemData, MAX_USER_EQUIP> items_;//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
int hasWing_; //<2F>Ƿ<EFBFBD><C7B7>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WingRankDbData wing_data_;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int hasSpirit_; //<2F>Ƿ<EFBFBD><C7B7>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SpiritRankData spirit_data_; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AchieveRankData achieve_data_; //<2F>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD>
RankData rank_data_; //<2F><><EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD>
uint8_t rankNum_[rtMax]; // <20><>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>0
ActorRankData() : actorId_(0), dragon_(0), hasMount_(0), hasWing_(0), hasSpirit_(0)
{
memset(rankNum_, 0, sizeof(rankNum_));
}
};
struct ActorRankDataEx
{
ActorRankData base_;
char guild_[32]; // <20><><EFBFBD><EFBFBD><E0A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int mount_id_; // <20><><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ڿͻ<DABF><CDBB><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int spirit_id_; // <20><><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><E7A3AC><EFBFBD>ڿͻ<DABF><CDBB><EFBFBD>ȡ<EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD>ע<EFBFBD><EFBFBD><E2A3AC>Щ<EFBFBD>ֶ<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int root_; // <20><><EFBFBD><EFBFBD><EFBFBD>ĵȼ<C4B5><C8BC><EFBFBD><EFBFBD><EFBFBD>
int wing_; // <20><><EFBFBD><EFBFBD>
ActorRankDataEx() : mount_id_(0), spirit_id_(0), root_(0), wing_(0)
{
guild_[0] = 0;
}
};
#endif

View File

@@ -0,0 +1,170 @@
#ifndef _DB_ROLE_DATA_H_
#define _DB_ROLE_DATA_H_
#include "common.h"
#include "common/datalist.h"
#include "common/property_set.h"
#define MAX_FUWEN 8
#define MAX_WING_PILL 2 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#pragma pack(push,1)
using namespace SrvDef;
//tolua_begin
struct SkillsData
{
int skill_level[5];
};
struct YuanShenData
{
bool slot_filled[6];
};
enum EquipSlotType
{
EquipSlotType_Weapon = 0,//<2F><><EFBFBD><EFBFBD>
EquipSlotType_Helmet,//1.ͷ<><CDB7>
EquipSlotType_Coat,//2.<2E>·<EFBFBD>
EquipSlotType_Necklace,//3.<2E><><EFBFBD><EFBFBD>
EquipSlotType_Wrist,//4.<2E><><EFBFBD><EFBFBD>
EquipSlotType_Belt,//5.<2E><><EFBFBD><EFBFBD>
EquipSlotType_Ring,//6.<2E><>ָ
EquipSlotType_Shoes,//7.Ь<><D0AC>
EquipSlotType_Dzi, //8.<2E><>ӡ
EquipSlotType_Hats, //9.<2E><><EFBFBD><EFBFBD>
EquipSlotType_Mark, //10.<2E><><EFBFBD><EFBFBD>
EquipSlotType_Cloak, //11.<2E><><EFBFBD><EFBFBD>
EquipSlotType_Shield, //12.<2E><><EFBFBD><EFBFBD>
EquipSlotType_Max,
};
enum WingSlotType
{
WingSlotType_Hub = 0,
WingSlotType_Stone,
WingSlotType_Feathers,
WingSlotType_Colorplume,
WingSlotType_Max,
};
struct EquipSlotData
{
int strength_lv; //ǿ<><C7BF><EFBFBD>ȼ<EFBFBD>
int fuling_lv; //<2F><><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
int gem_lv; //<2F><>ʯ<EFBFBD>ȼ<EFBFBD>
ItemData equip_data;
int zhuling_lv; //ע<><D7A2><EFBFBD>ȼ<EFBFBD>
int soul_lv; //ħ<><C4A7><EFBFBD>ȼ<EFBFBD>(1-8<><38>λ<EFBFBD><CEBB>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD>9-12<31><32>ʾħ<CABE><C4A7><EFBFBD>ȼ<EFBFBD>)
int bless_lv; //ף<><D7A3><EFBFBD>ȼ<EFBFBD>(<28><><EFBFBD><EFBFBD>)(<28><>û<EFBFBD>õ<EFBFBD>)
int fuling_exp; //<2F><><EFBFBD><EFBFBD><E9BEAD>
};
struct EquipsData
{
EquipSlotData slot_data[EquipSlotType_Max];
};
struct ExRingsData
{
int ring_level[4];
};
struct WingsData
{
int level;
//int star_lv;
int exp;
int openStatus;
unsigned int ctime;//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
short pill[MAX_WING_PILL];
};
struct WingsEquip
{
EquipSlotData wing_slot[WingSlotType_Max];
};
//<2F><><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
struct JingMaiData
{
int level;
int stage;
};
struct SkillsBreakData
{
int skill_break_level[5];
};
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct LoogsoulData
{
int stage;
int level;
int exp;
char act;
};
struct ShieldData
{
int stage;
int level;
int exp;
char act;
};
struct XueyuData
{
int stage;
int level;
int exp;
char act;
};
struct FuWenData
{
ItemData fuwen_slot[MAX_FUWEN];
};
#define HEIRLOOM_TYPE_MAX 8 //<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
//<2F>޸<EFBFBD>RoleData<74>Ļ<EFBFBD><C4BB><EFBFBD>Ҫ֪ͨ<CDA8>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD>޸<EFBFBD>ͬ<EFBFBD><CDAC>RoleData<74><61>Э<EFBFBD>
struct RoleData
{
int id;
int job;
int sex;
double power;
SkillsData skills;
SkillsBreakData skillbreaks;
int yuanshen_level;
YuanShenData yuanshen_data;
EquipsData equips_data;
ExRingsData ex_rings;
WingsData wings;
//WingsEquip wingequips_data;
JingMaiData jingmai_data;
LoogsoulData loogsoul_data;
//ShieldData shield_data;
//XueyuData xueyu_data;
FuWenData fuwen_data;
int heirloom[HEIRLOOM_TYPE_MAX];
int weapon_soul_id;//<2F><>ǰʹ<C7B0>õı<C3B5><C4B1><EFBFBD>ID
};
struct RoleDatas
{
int role_count;
RoleData roles[3];
RoleDatas() { memset(this, 0, sizeof(RoleDatas)); }
};
//tolua_end
#pragma pack(pop)
#endif

View File

@@ -0,0 +1,36 @@
#ifndef _SKILL_DB_DATA_H_
#define _SKILL_DB_DATA_H_
#include "common.h"
/****************************************************************************************
* <20><><EFBFBD><EFBFBD>DB<44><42><EFBFBD>ص<EFBFBD>һЩ<D2BB><EFBFBD><E1B9B9><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>
****************************************************************************************/
//<2F><><EFBFBD>ҵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD>
#pragma pack(push, 1)
struct BaseSkillData
{
uint16_t sid_; //<2F><><EFBFBD>ܵ<EFBFBD>ID
unsigned char level_; //<2F><><EFBFBD>ܵĵȼ<C4B5>,<2C><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ѧϰ<D1A7><CFB0><EFBFBD><EFBFBD>0
unsigned int cool_sec_; //<2F><>ȴʱ<C8B4><CAB1>(<28><>λ<EFBFBD>
unsigned int exp_; //<2F><><EFBFBD>ܵľ<DCB5><C4BE><EFBFBD>
};
struct PetSkillDb
{
int skillid_;
int level_;
int exp_;
unsigned int cd_;
int r1_;
int r2_;
int r3_;
PetSkillDb()
{
memset(this, 0, sizeof(*this));
}
};
#pragma pack(pop)
#endif

View File

@@ -0,0 +1,33 @@
#ifndef _STORE_DATA_H_
#define _STORE_DATA_H_
#include "common.h"
#include "item_data.h"
struct StoreItemData
{
int id; //<2F><>Ʒid
int currency_type; //<2F><><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int currency; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int discount; //<2F>ۿ<EFBFBD><DBBF><EFBFBD><EFBFBD>ͣ<EFBFBD>1<EFBFBD><31>8<EFBFBD>ۣ<EFBFBD>2<EFBFBD><32>5<EFBFBD><35>
ItemData itemData; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
StoreItemData()
{
memset(this, 0, sizeof(StoreItemData));
}
public:
//<2F>޸<EFBFBD>useritem ע<><D7A2><EFBFBD><EFBFBD>Ҫ<EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD> writeToPack, writeDbPack, writeCrcPack
//<2F><>װ<EFBFBD><D7B0><EFBFBD>͸<EFBFBD><CDB8>ͻ<EFBFBD><CDBB>˵İ<CBB5>
void writeData(DataPacket& pack) {
pack.writeBuf(this, sizeof(StoreItemData));
}
void readData(DataPacketReader& pack) {
pack.readBuf(this, sizeof(StoreItemData));
}
};
#endif

View File

@@ -0,0 +1,15 @@
#ifndef _TABLE_DEFS_H_
#define _TABLE_DEFS_H_
// <20><><EFBFBD>ݿ<EFBFBD><DDBF>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
enum DB_FILED_TYPE {
ftInt = 0,
ftDouble,
ftString,
ftInt64,
ftBlob,
ftCount,
};
#endif

View File

@@ -0,0 +1,32 @@
#ifndef _WING_H_
#define _WING_H_
#include "common.h"
#include "skill_data.h"
#include "common/datalist.h"
#define MAX_WING_SKILL 8 //<2F><>Ӧwingsystem<65><6D>MAX_SKILL
#define MAX_WING_EQUIP 4
#pragma pack(push, 1)
struct WingSkill : public BaseSkillData
{
int64_t guid_;
};
struct WingRankData
{
int skill_grid_; //<2F><><EFBFBD>ܿո<DCBF>
int skill_cnt_; //<2F><><EFBFBD>ܸ<EFBFBD><DCB8><EFBFBD>
BaseSkillData skill_list_[MAX_WING_SKILL];
};
struct WingRankDbData
{
WingRankData data_;
StaticDataList<ItemData, MAX_WING_EQUIP> equip_;
};
#pragma pack(pop)
#endif

4926
Gateway/common/dbghelp.h Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,19 @@
EXPORTS
;MBCSDef
CreateMBCSFilter
FreeMBCSFilter
MemoryUsageOfMBCSFilter
LoadMBCSFilterWords
SaveMBCSFilterWords
MatchMBCSFilterWord
AddMBCSFilterStrToTable
;UCSDef
CreateUCSFilter
FreeUCSFilter
MemoryUsageOfUCSFilter
LoadUCSFilterWords
SaveUCSFilterWords
MatchUCSFilterWord
AddUCSFilterStrToTable

View File

@@ -0,0 +1,8 @@
#ifndef _FASTFTMAIN_H_
#define _FASTFTMAIN_H_
#include "MBCSDef.h"
//#include "UCSDef.h"
#endif

View File

@@ -0,0 +1,69 @@
#--------------------------makefile description-----------------------------#
#use for gcc/g++ compiler to complate/link
#edited: miros
#edit time: Sep 8, 2007
#------------------------compiler and compiler fags-------------------------#
COMPILER=gcc
#COMPLATEFLAGS=-g -D LINUX -D GUN_GCC -I ./../../common/
COMPLATEFLAGS=-g -D FREEBSD -D GUN_GCC -I ./../../common/
LINKER=ar
LINKFLAGS=cvr
DEBUGER=gdb
#--------------------------project settings---------------------------------#
PROJECTNAME=../libs/bsd/dbg/fastFT.a
INCLUDES=./MBCSFilter.c\
./UCSFilter.c
#LIBS=
LIBS=
OBJECTS=./MBCSFilter.o ./UCSFilter.o
#EXTEDOBJECTS=
EXTEDOBJECTS=
#------------------------------make actions---------------------------------#
#use build to be default command
build: complate link
complate:
@echo "compiler: ${COMPILER}"
@echo "begin complate source files:"
@echo "${INCLUDES}"
@$(COMPILER) $(COMPLATEFLAGS) $(INCLUDES) -c $^
@echo "complate succeeded"
recomplate: cleanobjs complate
link:
@echo "linker: ${LINKER}"
@echo "begin link object files:"
@echo "${OBJECTS}"
@$(LINKER) $(LINKFLAGS) $(PROJECTNAME) $(OBJECTS)
@echo "Done!"
cleanobjs:
@-rm $(OBJECTS)
cleanapps:
@-rm $(PROJECTNAME)
cleanall: cleanobjs cleanapps
rebuild: cleanall build
build-clear: build cleanobjs
all: rebuild cleanobjs
#----------------------------exports labdles--------------------------------#
.PHONY: all build rebuild complate recomplate link cleanobjs cleanapps cleanall build-clear

View File

@@ -0,0 +1,74 @@
#ifndef _MBCSDEF_H_
#define _MBCSDEF_H_
#define MBCSARRAY_SIZE 255
#define NEW_FILTER
#pragma pack(push, 1)
typedef struct tagFT_mbcs_char
{
char wordEnd; //<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>Ƿ񹹳<C7B7>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD>
#ifdef NEW_FILTER
unsigned char idx[MBCSARRAY_SIZE];
unsigned char count;
tagFT_mbcs_char** mem;
#else
struct tagFT_mbcs_char* next[MBCSARRAY_SIZE]; //<2F><>ǰ<EFBFBD>ַ<EFBFBD><D6B7>ĺ<EFBFBD><C4BA><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ַ<EFBFBD>ֵ-1
#endif
#ifdef NEW_FILTER
tagFT_mbcs_char* getNext(int index)
{
if (!mem) return NULL;
unsigned char ridx = idx[index];
if (ridx == 0) return NULL;
return mem[ridx - 1];
}
void addNext(int index, tagFT_mbcs_char* next);
#else
tagFT_mbcs_char* getNext(int index)
{
return next[index];
}
void addNext(int index, tagFT_mbcs_char* next)
{
next[index] = next;
}
#endif
}FT_MBCS_CHAR, *PFT_MBCS_CHAR;
#pragma pack(pop)
#ifdef __cplusplus
extern "C"
{
#endif
#ifndef STDCALL
#if (defined(WIN32) || defined(WINDOWS))
#define STDCALL __stdcall
#else
#define STDCALL
#endif
#endif
/*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>MBCS<EFBFBD><EFBFBD><EFBFBD>δʱ<EFBFBD>
*/
PFT_MBCS_CHAR CreateMBCSFilter(void*);
/*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>MBCS<EFBFBD><EFBFBD><EFBFBD>δʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷű<EFBFBD>ʹ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
*/
void STDCALL FreeMBCSFilter(PFT_MBCS_CHAR filter);
int STDCALL LoadMBCSFilterWords(PFT_MBCS_CHAR filter, const char *fn);
char* STDCALL MatchMBCSFilterWord(const PFT_MBCS_CHAR filter, const char *input, int *matchLen);
//<2F><>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB5BD><EFBFBD>δʱ<CEB4><CAB1><EFBFBD>
int STDCALL AddMBCSFilterStrToTable(PFT_MBCS_CHAR filter,const char* str);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,174 @@
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "mbcs_def.h"
#include "memory/base_allocator.hpp"
#define toupper(c) (((c) >= 'a' && (c) <= 'z') ? (c) ^ 0x20 : (c))
BaseAllocator mbcsFilter("mbcsFilter");
#ifdef NEW_FILTER
void tagFT_mbcs_char::addNext(int index, tagFT_mbcs_char* next)
{
unsigned char ridx = idx[index];
assert(ridx == 0);
mem = (tagFT_mbcs_char**)mbcsFilter.ReAllocBuffer(mem, (count + 1) * sizeof(tagFT_mbcs_char*));
mem[count] = next;
count++;
idx[index] = count;
}
#endif
//<2F><>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB5BD><EFBFBD>δʱ<CEB4><CAB1><EFBFBD>
int STDCALL AddMBCSFilterStrToTable(PFT_MBCS_CHAR filter, const char* str)
{
int len = (int)strlen(str);
PFT_MBCS_CHAR prev = filter;
if (!filter)
return 0;
for (int i = 0; i < len; i++)
{
unsigned char index = str[i];
index = toupper(index) - 1;
PFT_MBCS_CHAR next = prev->getNext(index);
if (!next)
{
next = CreateMBCSFilter(0);
prev->addNext(index, next);
}
if (i == (len - 1))
next->wordEnd = 1;
prev = next;
}
return 1;
}
//-----------------------------------------------------------------------
PFT_MBCS_CHAR CreateMBCSFilter(void*)
{
PFT_MBCS_CHAR pMBCSChar =
(PFT_MBCS_CHAR)mbcsFilter.AllocBuffer(sizeof(FT_MBCS_CHAR));
memset(pMBCSChar, 0, sizeof(FT_MBCS_CHAR));
return pMBCSChar;
}
void STDCALL FreeMBCSFilter(PFT_MBCS_CHAR filter)
{
if (!filter) return;
#ifdef NEW_FILTER
if (filter->count > 0)
{
for (int i = 0; i < filter->count; i++)
{
PFT_MBCS_CHAR next = filter->mem[i];
if (next) FreeMBCSFilter(next);
}
}
mbcsFilter.FreeBuffer(filter->mem);
#else
for (int i = 0; i < MBCSARRAY_SIZE; i++)
{
PFT_MBCS_CHAR next = filter->next[i];
if (next) FreeMBCSFilter(next);
}
#endif
mbcsFilter.FreeBuffer(filter);
filter = NULL;
}
int STDCALL LoadMBCSFilterWords(PFT_MBCS_CHAR filter, const char* fn)
{
int nStrCount = 0;
char szText[256] = {0};
char* pStr = 0;
FILE* fl = fopen(fn, "r");
//<2F><><EFBFBD><EFBFBD><E9B2A2><EFBFBD><EFBFBD>UTF-8<>ļ<EFBFBD>BOM
fread(szText, 3, 1, fl);
if ((*(int*)szText & 0x00FFFFFF) != 0xBFBBEF)
fseek(fl, 0, 0);
while ((pStr = fgets(szText, 256, fl)))
{
size_t nLen = strlen(szText);
while (nLen > 0 && ((unsigned int)szText[nLen - 1] <= 0x20))
{
szText[nLen - 1] = 0;
nLen--;
}
if (nLen > 0 && AddMBCSFilterStrToTable(filter, szText))
++nStrCount;
}
fclose(fl);
return nStrCount;
}
char* STDCALL MatchMBCSFilterWord(const PFT_MBCS_CHAR filter, const char* input, int* matchLen)
{
char* matchStart = NULL; //<2F><>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>ַ<EFBFBD>ָ<EFBFBD><D6B8>
char* matchEnd = NULL; //<2F><>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD>ַ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ָ<EFBFBD><D6B8>,<2C><>ֵ<EFBFBD><D6B5>ȥlpMatchStart<72><74>Ϊ<EFBFBD><CEAA>ƥ<EFBFBD><C6A5><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
unsigned char ch;
while ((ch = *input))
{
ch = toupper(ch);
PFT_MBCS_CHAR curFTChar = filter->getNext(ch - 1);
if (curFTChar)
{
char* test = matchStart = (char*)input;
do
{
test++;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>Ƿ񴦹<C7B7><F1B4A6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD>
if (curFTChar->wordEnd)
matchEnd = test;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>
ch = *test;
if (!ch) break;
ch = toupper(ch);
curFTChar = curFTChar->getNext(ch - 1);
}
while (curFTChar && *test);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ
if (matchEnd)
break;
}
//<2F><><EFBFBD><EFBFBD>MBCS<43><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD>ַ<EFBFBD>
//if ( (unsigned char)(*pInput) >= 0x80 )
// pInput += 2;
//else pInput += 1;
input++;
}
char* result = (matchEnd ? matchStart : NULL);
if (matchLen)
*matchLen = (int)(size_t)(result ? (matchEnd - matchStart) : 0);
return result;
}

View File

@@ -0,0 +1,177 @@
#include <stdio.h>
#include "os_def.h"
#include "_ast.h"
#include <zlib.h>
#include "stream.h"
#include "zstream.h"
#include "game_map.h"
#include "memory/base_allocator.hpp"
#ifndef _MSC_VER
#include <arpa/inet.h>
#endif
using namespace stream;
using namespace zstream;
BaseAllocator GameMap::mapAlloc_("mapAlloc");
GameMap::GameMap()
{
width_ = 0;
height_ = 0;
moveable_index_ = NULL;
moveable_ount_ = 0;
}
GameMap::~GameMap()
{
if (moveable_index_)
mapAlloc_.FreeBuffer(moveable_index_);
}
bool GameMap::LoadFromStream(BaseStream& stream, bool newver)
{
MAPFILE_HEADER hdr;
MAPGrid* map_grid, *grid_ptr;
MAPFILE_HEADER_NEW hdr_n;
MAPGrid_NEW* map_grid_n, *grid_ptr_n;
if (!newver)
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ͷ
if (stream.read(&hdr, sizeof(hdr)) != sizeof(hdr))
return false;
if (hdr.version_ != MapFileVersion_Current)
return false;
}
//<2F><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶζ<DDB6>ȡ<EFBFBD><C8A1><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
MemoryStream ms(NULL);
if (newver)
ms.copyFrom(stream, stream.getSize());
else
ms.copyFrom(stream, hdr.data_size_);
ms.setPosition(0);
//<2F><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ZDecompressionStream deStream(ms, NULL);
if (newver)
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ͷ
if (deStream.read(&hdr_n, sizeof(hdr_n)) != sizeof(hdr_n))
return false;
// <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hdr_n.width_ = ntohl(hdr_n.width_);
hdr_n.height_ = ntohl(hdr_n.height_);
}
int max = 0;
if (newver)
{
size_t grid_count = sizeof(MAPGrid_NEW) * hdr_n.width_ * hdr_n.height_;
grid_ptr_n = map_grid_n = (MAPGrid_NEW*)mapAlloc_.AllocBuffer(grid_count);
if (grid_count != (const size_t)deStream.read(map_grid_n, (const int)grid_count))
return false;
max = hdr_n.width_ * hdr_n.height_;
}
else
{
size_t grid_count = sizeof(MAPGrid) * hdr.width_ * hdr.height_;
grid_ptr = map_grid = (MAPGrid*)mapAlloc_.AllocBuffer(grid_count);
if (grid_count != (const size_t)deStream.read(map_grid, (const int)grid_count))
return false;
max = hdr.width_ * hdr.height_;
}
moveable_ount_ = 0;
int* index_ptr = moveable_index_ = (int*)mapAlloc_.ReAllocBuffer(moveable_index_, max * sizeof(*index_ptr));
memset(index_ptr, -1, max * sizeof(*index_ptr)); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>memset<65><74><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>߶<EFBFBD><DFB6><EFBFBD><EFBFBD><EFBFBD>
if (newver)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ɰ汾<C9B0>IJ<EFBFBD>һ<EFBFBD><D2BB>
for (int i = 0; i < max; ++i)
{
if (grid_ptr_n->flag_ != gfBlock /*&& grid_ptr_n->flag_ != gfNofly*/)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>ߵ<EFBFBD>,<2C><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>߾<EFBFBD><DFBE><EFBFBD><EFBFBD><EFBFBD>
{
int x = i / hdr_n.height_;
int y = i % hdr_n.height_;
(*(index_ptr + (y * hdr_n.width_ + x))) = moveable_ount_;
moveable_ount_++;
}
//index_ptr++;
grid_ptr_n++;
}
width_ = hdr_n.width_;
height_ = hdr_n.height_;
mapAlloc_.FreeBuffer(map_grid_n);
}
else
{
for (int i = 0; i < max; ++i)
{
if ((grid_ptr->flag_ & MAPFLAG_MOVEABLE) != 0)
{
(*index_ptr) = moveable_ount_;
moveable_ount_++;
}
index_ptr++;
grid_ptr++;
}
width_ = hdr.width_;
height_ = hdr.height_;
mapAlloc_.FreeBuffer(map_grid);
}
return true;
}
bool GameMap::LoadFromFile(const char* fn, bool newver)
{
FileStream fs(fn, FileStream::faRead || FileStream::faShareRead, NULL);
return LoadFromStream(fs, newver);
}
void GameMap::initDefault(unsigned int w, unsigned int h)
{
// <20>ض<EFBFBD><D8B6>ط<EFBFBD><D8B7>Ż<EFBFBD><C5BB>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>óɿ<C3B3><C9BF><EFBFBD><EFBFBD>߶<EFBFBD>
//<2F><><EFBFBD>ɳ<EFBFBD><C9B3><EFBFBD><EFBFBD>Ҷȵ<D2B6>ͼ
int max = w * h;
moveable_ount_ = 0;
int* index_ptr = moveable_index_ = (int*)mapAlloc_.ReAllocBuffer(moveable_index_, max * sizeof(*index_ptr));
for (int i = 0; i < max; ++i)
{
(*index_ptr) = moveable_ount_;
moveable_ount_++;
index_ptr++;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>߶<EFBFBD><DFB6><EFBFBD><EFBFBD><EFBFBD>
width_ = w;
height_ = h;
}

View File

@@ -0,0 +1,142 @@
#ifndef _GAME_MAP_H_
#define _GAME_MAP_H_
/*************************************************************
* <09><>ͼ<EFBFBD><CDBC><EFBFBD>ݶ<EFBFBD>ȡ<EFBFBD>󽫲<EFBFBD><F3BDABB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ͼƬ<CDBC><C6AC><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD><DDA1><EFBFBD>ʹ<EFBFBD><CAB9>һ<EFBFBD><D2BB><EFBFBD>ֽڱ<D6BD>ʾһ<CABE><D2BB><EFBFBD><EFBFBD><EFBFBD>
* <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ֵΪ1<CEAA><31>ʱ<EFBFBD>򣬱<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>
* <09><><EFBFBD><EFBFBD><EAB2BB><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD>
*
************************************************************/
//<2F><>ǰ<EFBFBD><C7B0>ͼ<EFBFBD><EFBFBD><E6B1BE>
const unsigned int MapFileVersion_Current = 0x0102;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>
const unsigned int MAPFLAG_MOVEABLE = 0x8000;
/*
* <20><>ͼ<EFBFBD>ļ<EFBFBD>ͷ<EFBFBD>
*/
#pragma pack(push, 1)
struct MAPFILE_HEADER_NEW
{
char hdr_[5]; //"map"
int ver_;
unsigned char grid_size_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>64<36><34><EFBFBD><EFBFBD>
int pxi_width_; // <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>С
int pix_height_;
int width_; //<2F><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
int height_; //<2F><>ͼ<EFBFBD>߶<EFBFBD>
};
struct MAPFILE_HEADER
{
unsigned int version_; //<2F>ļ<EFBFBD><C4BC>汾0x0101
int width_; //<2F><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
int height_; //<2F><>ͼ<EFBFBD>߶<EFBFBD>
int bg_img_; //<2F><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
unsigned int data_size_; //<2F><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6>ֽڳ<D6BD><DAB3><EFBFBD>
unsigned char reseve_[32];
};
// <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>Ľṹ
struct MAPGrid
{
unsigned short bg_img_; // <20><><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
unsigned short ft_img_; // ǰ<><C7B0>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
unsigned short flag_; // <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־λ
unsigned char obj_root_; // <20>زķ<D8B2><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned char reseve_; // ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
unsigned short effect_id_; // <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>Чid
unsigned short width_; // <20><>Ч<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>
unsigned short height_; // <20><>Ч<EFBFBD>ĸ߶<C4B8>
} ;
enum GripFlag
{
gfBlock = 0, //<2F>
gfCanMove = 1, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gfThrough = 2, //͸<><CDB8><EFBFBD><EFBFBD>
gfNofly = 3, //<2F><EFBFBD>Ҳ<EFBFBD><D2B2>ܷ<EFBFBD>Ծ
};
struct MAPGrid_NEW
{
unsigned char flag_; // 0=<3D><EFBFBD><E8B5B5>1=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,2=͸<><CDB8><EFBFBD><EFBFBD>,3=<3D><EFBFBD>Ҳ<EFBFBD><D2B2>ܷ<EFBFBD>Ծ
};
#pragma pack(pop)
class GameMap
{
private:
static BaseAllocator mapAlloc_;
protected:
unsigned int width_; // <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
unsigned int height_; // <20><>ͼ<EFBFBD>߶<EFBFBD>
int* moveable_index_; // ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ŀ<EFBFBD><C4BF>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʡ<EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>ʱûʹ<C3BB>õ<EFBFBD>
int moveable_ount_; // <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
GameMap();
virtual ~GameMap();
/* <20><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC>ص<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD> */
bool LoadFromStream(stream::BaseStream& stream, bool newver);
/* <20><><EFBFBD>ļ<EFBFBD><C4BC>м<EFBFBD><D0BC>ص<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD> */
bool LoadFromFile(const char* fn, bool newver);
/* <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6>ĵ<EFBFBD>ͼ */
void initDefault(unsigned int w, unsigned int h);
/* <20><>ȡ<EFBFBD><C8A1>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD> */
inline int getWidth()
{
return width_;
}
/* <20><>ȡ<EFBFBD><C8A1>ͼ<EFBFBD>߶<EFBFBD> */
inline int getHeight()
{
return height_;
}
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
inline int getMoveableCount()
{
return moveable_ount_;
}
/* <20><>ȡ<EFBFBD><C8A1>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>Ԫ<EFBFBD><D4AA>Ŀ */
inline int getUnitCount() const
{
return width_ * height_;
}
inline int getPosIndex(unsigned int x, unsigned int y)
{
if (x >= width_ || y >= height_)
return -1;
return y * width_ + x;
}
/* <20>жϵ<D0B6>ͼ<EFBFBD><CDBC>x, y<><79><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>true<75><65>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD> */
inline bool canMove(unsigned int x, unsigned int y)
{
if (x >= width_ || y >= height_)
return false;
return moveable_index_[y * width_ + x] != -1;
}
int getMapPosValue(unsigned int x, unsigned int y)
{
if (x >= width_ || y >= height_)
return -1;
return moveable_index_[y * width_ + x] != -1 ? 0 : -1;
}
};
#endif

View File

@@ -0,0 +1,766 @@
/*
A* Algorithm Implementation using STL is
Copyright (C)2001-2005 Justin Heyes-Jones
Permission is given by the author to freely redistribute and
include this code in any program as long as this credit is
given where due.
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE
IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND
PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED
CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL
DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY
NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF
WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE
OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
THIS DISCLAIMER.
Use at your own risk!
*/
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <_ast.h>
#include <stream.h>
//#include <iostream>
//#include <conio.h>
#include <assert.h>
#include "memory/objpool.hpp"
// stl includes
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
// fast fixed size memory allocator, used for fast node memory management
//#include "fsa.h"
// Fixed size memory allocator can be disabled to compare performance
// Uses std new and delete instead if you turn it off
#define USE_FSA_MEMORY 1
// disable warning that debugging information has lines that are truncated
// occurs in stl headers
#pragma warning( disable : 4786 )
// The AStar search class. UserState is the users state space type
template <class UserState> class AStarSearch
{
public: // data
enum
{
SEARCH_STATE_NOT_INITIALISED,
SEARCH_STATE_SEARCHING,
SEARCH_STATE_SUCCEEDED,
SEARCH_STATE_FAILED,
SEARCH_STATE_OUT_OF_MEMORY,
SEARCH_STATE_INVALID
};
// A node represents a possible state in the search
// The user provided state type is included inside this type
public:
class Node
{
public:
Node *parent; // used during the search to record the parent of successor nodes
Node *child; // used after the search for the application to view the search in reverse
int g; // cost of this node + it's predecessors
int h; // heuristic estimate of distance to goal
int f; // sum of cumulative cost of predecessors and self and heuristic
Node() :
parent( 0 ),
child( 0 ),
g(0 ),
h( 0),
f( 0 )
{
}
UserState m_UserState;
};
// For sorting the heap the STL needs compare function that lets us compare
// the f value of two nodes
class HeapCompare_f
{
public:
bool operator() ( const Node *x, const Node *y ) const
{
return x->f > y->f;
}
};
public: // methods
// constructor just initialises private data
AStarSearch( int MaxNodes = 1000 ) :
m_AllocateNodeCount(0),
#if USE_FSA_MEMORY
m_FixedSizeAllocator( "Astar" ),
#endif
m_State( SEARCH_STATE_NOT_INITIALISED ),
m_CurrentSolutionNode( NULL ),
m_CancelRequest( false )
{
}
// call at any time to cancel the search and free up all the memory
void CancelSearch()
{
m_CancelRequest = true;
}
// Set Start and goal states
void SetStartAndGoalStates( UserState &Start, UserState &Goal )
{
m_CancelRequest = false;
m_Start = AllocateNode();
m_Goal = AllocateNode();
assert((m_Start != NULL && m_Goal != NULL));
m_Start->m_UserState = Start;
m_Goal->m_UserState = Goal;
m_State = SEARCH_STATE_SEARCHING;
// Initialise the AStar specific parts of the Start Node
// The user only needs fill out the state information
m_Start->g = 0;
m_Start->h = m_Start->m_UserState.GoalDistanceEstimate( m_Goal->m_UserState );
m_Start->f = m_Start->g + m_Start->h;
m_Start->parent = 0;
// Push the start node on the Open list
m_OpenList.push_back( m_Start ); // heap now unsorted
// Sort back element into heap
push_heap( m_OpenList.begin(), m_OpenList.end(), HeapCompare_f() );
// Initialise counter for search steps
m_Steps = 0;
}
// Advances search one step
unsigned int SearchStep()
{
// Firstly break if the user has not initialised the search
assert( (m_State > SEARCH_STATE_NOT_INITIALISED) &&
(m_State < SEARCH_STATE_INVALID) );
// Next I want it to be safe to do a searchstep once the search has succeeded...
if ( (m_State == SEARCH_STATE_SUCCEEDED) ||
(m_State == SEARCH_STATE_FAILED)
)
{
return m_State;
}
// Failure is defined as emptying the open list as there is nothing left to
// search...
// New: Allow user abort
if ( m_OpenList.empty() || m_CancelRequest )
{
FreeAllNodes();
m_State = SEARCH_STATE_FAILED;
return m_State;
}
// Incremement step count
m_Steps ++;
// Pop the best node (the one with the lowest f)
Node *n = m_OpenList.front(); // get pointer to the node
pop_heap( m_OpenList.begin(), m_OpenList.end(), HeapCompare_f() );
m_OpenList.pop_back();
// Check for the goal, once we pop that we're done
if ( n->m_UserState.IsGoal( m_Goal->m_UserState ) )
{
// The user is going to use the Goal Node he passed in
// so copy the parent pointer of n
m_Goal->parent = n->parent;
// A special case is that the goal was passed in as the start state
// so handle that here
if ( false == n->m_UserState.IsSameState( m_Start->m_UserState ) )
{
FreeNode( n );
// set the child pointers in each node (except Goal which has no child)
Node *nodeChild = m_Goal;
Node *nodeParent = m_Goal->parent;
do
{
nodeParent->child = nodeChild;
nodeChild = nodeParent;
nodeParent = nodeParent->parent;
}
while( nodeChild != m_Start ); // Start is always the first node by definition
}
// delete nodes that aren't needed for the solution
FreeUnusedNodes();
m_State = SEARCH_STATE_SUCCEEDED;
return m_State;
}
else // not goal
{
// We now need to generate the successors of this node
// The user helps us to do this, and we keep the new nodes in
// m_Successors ...
m_Successors.clear(); // empty vector of successor nodes to n
// User provides this functions and uses AddSuccessor to add each successor of
// node 'n' to m_Successors
bool ret = n->m_UserState.GetSuccessors( this, n->parent ? &n->parent->m_UserState : NULL );
if ( !ret )
{
typename vector< Node * >::iterator successor;
// free the nodes that may previously have been added
for ( successor = m_Successors.begin(); successor != m_Successors.end(); successor ++ )
{
FreeNode( (*successor) );
}
m_Successors.clear(); // empty vector of successor nodes to n
// free up everything else we allocated
FreeAllNodes();
m_State = SEARCH_STATE_OUT_OF_MEMORY;
return m_State;
}
// Now handle each successor to the current node ...
for ( typename vector< Node * >::iterator successor = m_Successors.begin(); successor != m_Successors.end(); successor ++ )
{
// The g value for this successor ...
int newg = n->g + n->m_UserState.GetCost( (*successor)->m_UserState );
// Now we need to find whether the node is on the open or closed lists
// If it is but the node that is already on them is better (lower g)
// then we can forget about this successor
// First linear search of open list to find node
typename vector< Node * >::iterator openlist_result;
for ( openlist_result = m_OpenList.begin(); openlist_result != m_OpenList.end(); openlist_result ++ )
{
if ( (*openlist_result)->m_UserState.IsSameState( (*successor)->m_UserState ) )
{
break;
}
}
if ( openlist_result != m_OpenList.end() )
{
// we found this state on open
if ( (*openlist_result)->g <= newg )
{
FreeNode( (*successor) );
// the one on Open is cheaper than this one
continue;
}
}
typename vector< Node * >::iterator closedlist_result;
for ( closedlist_result = m_ClosedList.begin(); closedlist_result != m_ClosedList.end(); closedlist_result ++ )
{
if ( (*closedlist_result)->m_UserState.IsSameState( (*successor)->m_UserState ) )
{
break;
}
}
if ( closedlist_result != m_ClosedList.end() )
{
// we found this state on closed
if ( (*closedlist_result)->g <= newg )
{
// the one on Closed is cheaper than this one
FreeNode( (*successor) );
continue;
}
}
// This node is the best node so far with this particular state
// so lets keep it and set up its AStar specific data ...
(*successor)->parent = n;
(*successor)->g = newg;
(*successor)->h = (*successor)->m_UserState.GoalDistanceEstimate( m_Goal->m_UserState );
(*successor)->f = (*successor)->g + (*successor)->h;
// Remove successor from closed if it was on it
if ( closedlist_result != m_ClosedList.end() )
{
// remove it from Closed
FreeNode( (*closedlist_result) );
m_ClosedList.erase( closedlist_result );
// Fix thanks to ...
// Greg Douglas <gregdouglasmail@gmail.com>
// who noticed that this code path was incorrect
// Here we have found a new state which is already CLOSED
// anus
}
// Update old version of this node
if ( openlist_result != m_OpenList.end() )
{
FreeNode( (*openlist_result) );
m_OpenList.erase( openlist_result );
// re-make the heap
// make_heap rather than sort_heap is an essential bug fix
// thanks to Mike Ryynanen for pointing this out and then explaining
// it in detail. sort_heap called on an invalid heap does not work
make_heap( m_OpenList.begin(), m_OpenList.end(), HeapCompare_f() );
}
// heap now unsorted
m_OpenList.push_back( (*successor) );
// sort back element into heap
push_heap( m_OpenList.begin(), m_OpenList.end(), HeapCompare_f() );
}
// push n onto Closed, as we have expanded it now
m_ClosedList.push_back( n );
} // end else (not goal so expand)
return m_State; // Succeeded bool is false at this point.
}
// User calls this to add a successor to a list of successors
// when expanding the search frontier
bool AddSuccessor( UserState &State )
{
Node *node = AllocateNode();
if ( node )
{
node->m_UserState = State;
m_Successors.push_back( node );
return true;
}
return false;
}
// Free the solution nodes
// This is done to clean up all used Node memory when you are done with the
// search
void FreeSolutionNodes()
{
Node *n = m_Start;
if ( m_Start->child )
{
do
{
Node *del = n;
n = n->child;
FreeNode( del );
del = NULL;
} while( n != m_Goal );
FreeNode( n ); // Delete the goal
}
else
{
// if the start node is the solution we need to just delete the start and goal
// nodes
FreeNode( m_Start );
FreeNode( m_Goal );
}
}
// Functions for traversing the solution
// Get start node
UserState *GetSolutionStart()
{
m_CurrentSolutionNode = m_Start;
if ( m_Start )
{
return &m_Start->m_UserState;
}
else
{
return NULL;
}
}
// Get next node
UserState *GetSolutionNext()
{
if ( m_CurrentSolutionNode )
{
if ( m_CurrentSolutionNode->child )
{
Node *child = m_CurrentSolutionNode->child;
m_CurrentSolutionNode = m_CurrentSolutionNode->child;
return &child->m_UserState;
}
}
return NULL;
}
// Get end node
UserState *GetSolutionEnd()
{
m_CurrentSolutionNode = m_Goal;
if ( m_Goal )
{
return &m_Goal->m_UserState;
}
else
{
return NULL;
}
}
// Step solution iterator backwards
UserState *GetSolutionPrev()
{
if ( m_CurrentSolutionNode )
{
if ( m_CurrentSolutionNode->parent )
{
Node *parent = m_CurrentSolutionNode->parent;
m_CurrentSolutionNode = m_CurrentSolutionNode->parent;
return &parent->m_UserState;
}
}
return NULL;
}
// For educational use and debugging it is useful to be able to view
// the open and closed list at each step, here are two functions to allow that.
UserState *GetOpenListStart()
{
int f,g,h;
return GetOpenListStart( f,g,h );
}
UserState *GetOpenListStart( int &f, int &g, int &h )
{
iterDbgOpen = m_OpenList.begin();
if ( iterDbgOpen != m_OpenList.end() )
{
f = (*iterDbgOpen)->f;
g = (*iterDbgOpen)->g;
h = (*iterDbgOpen)->h;
return &(*iterDbgOpen)->m_UserState;
}
return NULL;
}
UserState *GetOpenListNext()
{
int f,g,h;
return GetOpenListNext( f,g,h );
}
UserState *GetOpenListNext( int &f, int &g, int &h )
{
iterDbgOpen++;
if ( iterDbgOpen != m_OpenList.end() )
{
f = (*iterDbgOpen)->f;
g = (*iterDbgOpen)->g;
h = (*iterDbgOpen)->h;
return &(*iterDbgOpen)->m_UserState;
}
return NULL;
}
UserState *GetClosedListStart()
{
int f,g,h;
return GetClosedListStart( f,g,h );
}
UserState *GetClosedListStart( int &f, int &g, int &h )
{
iterDbgClosed = m_ClosedList.begin();
if ( iterDbgClosed != m_ClosedList.end() )
{
f = (*iterDbgClosed)->f;
g = (*iterDbgClosed)->g;
h = (*iterDbgClosed)->h;
return &(*iterDbgClosed)->m_UserState;
}
return NULL;
}
UserState *GetClosedListNext()
{
int f,g,h;
return GetClosedListNext( f,g,h );
}
UserState *GetClosedListNext( int &f, int &g, int &h )
{
iterDbgClosed++;
if ( iterDbgClosed != m_ClosedList.end() )
{
f = (*iterDbgClosed)->f;
g = (*iterDbgClosed)->g;
h = (*iterDbgClosed)->h;
return &(*iterDbgClosed)->m_UserState;
}
return NULL;
}
// Get the number of steps
int GetStepCount() { return m_Steps; }
void EnsureMemoryFreed()
{
#if USE_FSA_MEMORY
assert(m_AllocateNodeCount == 0);
#endif
}
private: // methods
// This is called when a search fails or is cancelled to free all used
// memory
void FreeAllNodes()
{
// iterate open list and delete all nodes
typename vector< Node * >::iterator iterOpen = m_OpenList.begin();
while( iterOpen != m_OpenList.end() )
{
Node *n = (*iterOpen);
FreeNode( n );
iterOpen ++;
}
m_OpenList.clear();
// iterate closed list and delete unused nodes
typename vector< Node * >::iterator iterClosed;
for ( iterClosed = m_ClosedList.begin(); iterClosed != m_ClosedList.end(); iterClosed ++ )
{
Node *n = (*iterClosed);
FreeNode( n );
}
m_ClosedList.clear();
// delete the goal
FreeNode(m_Goal);
}
// This call is made by the search class when the search ends. A lot of nodes may be
// created that are still present when the search ends. They will be deleted by this
// routine once the search ends
void FreeUnusedNodes()
{
// iterate open list and delete unused nodes
typename vector< Node * >::iterator iterOpen = m_OpenList.begin();
while( iterOpen != m_OpenList.end() )
{
Node *n = (*iterOpen);
if ( !n->child )
{
FreeNode( n );
n = NULL;
}
iterOpen ++;
}
m_OpenList.clear();
// iterate closed list and delete unused nodes
typename vector< Node * >::iterator iterClosed;
for ( iterClosed = m_ClosedList.begin(); iterClosed != m_ClosedList.end(); iterClosed ++ )
{
Node *n = (*iterClosed);
if ( !n->child )
{
FreeNode( n );
n = NULL;
}
}
m_ClosedList.clear();
}
// Node memory management
Node *AllocateNode()
{
#if !USE_FSA_MEMORY
Node *p = new Node;
return p;
#else
Node *address = m_FixedSizeAllocator.Alloc();
if ( !address )
{
return NULL;
}
m_AllocateNodeCount ++;
Node *p = new (address) Node;
return p;
#endif
}
void FreeNode( Node *node )
{
m_AllocateNodeCount --;
#if !USE_FSA_MEMORY
delete node;
#else
m_FixedSizeAllocator.Free( node );
#endif
}
private: // data
// Heap (simple vector but used as a heap, cf. Steve Rabin's game gems article)
vector< Node *> m_OpenList;
// Closed list is a vector.
vector< Node * > m_ClosedList;
// Successors is a vector filled out by the user each type successors to a node
// are generated
vector< Node * > m_Successors;
// State
unsigned int m_State;
// Counts steps
int m_Steps;
// Start and goal state pointers
Node *m_Start;
Node *m_Goal;
Node *m_CurrentSolutionNode;
#if USE_FSA_MEMORY
// Memory
ObjPool<Node>m_FixedSizeAllocator;
//FixedSizeAllocator<Node> m_FixedSizeAllocator;
#endif
//Debug : need to keep these two iterators around
// for the user Dbg functions
typename vector< Node * >::iterator iterDbgOpen;
typename vector< Node * >::iterator iterDbgClosed;
// debugging : count memory allocation and free's
int m_AllocateNodeCount;
bool m_CancelRequest;
};

View File

@@ -0,0 +1,65 @@
#include <stdlib.h>
#include <stdio.h>
#include "os_def.h"
#include "_ast.h"
#include "x_thread.h"
#include "x_tick.h"
#include "x_lock.h"
#include "container/queue_list.h"
#include "net/base_socket.h"
#include "share_util.h"
#include "memory/buffer_allocator.h"
#include "gate_proto.h"
#include "server_def.h"
#include "appitnmsg.h"
#include "data_packet.hpp"
#include "net/send_packet_pool.h"
#include "net/work_socket.h"
#include "net/net_session.h"
#include "net/server_socket.h"
#include "gate_user.h"
#include "gate_session.h"
#include "gate_manager.h"
GateManager::GateManager(const char* name) : Inherited(name)
{
ZeroMemory(gate_list_, sizeof(gate_list_));
}
GateManager::~GateManager()
{
}
bool GateManager::Startup()
{
for (int i = 0; i < MaxGateCount; ++i)
{
gate_list_[i]->gate_idx_ = i;
}
return Inherited::Startup();
}
NetSession* GateManager::NewSession(SOCKET s, sockaddr_in* addrIn)
{
for (int i = 0; i < MaxGateCount; ++i)
{
if (!gate_list_[i]->connected())
{
gate_list_[i]->SetClientSocket(s, addrIn);
gate_list_[i]->ClearSendBuffers();
OutputMsg(rmError, "new gate connect,idx=%d", gate_list_[i]->gate_idx_);
return gate_list_[i];
}
}
return NULL;
}
void GateManager::DestroySession(NetSession*)
{
}

View File

@@ -0,0 +1,60 @@
#ifndef _GATE_MANAGER_H_
#define _GATE_MANAGER_H_
class GateSession;
using namespace container;
class GateManager
: public ServerSocket
{
public:
typedef ServerSocket Inherited;
static const int MaxGateCount = 1;
public:
GateManager(const char* name);
~GateManager();
virtual void Initialize() = 0;
virtual void Uninitialize() = 0;
bool Startup();
inline GateSession* GetGate(int idx)
{
if (idx >= 0 && idx < (int)ArrayCount(gate_list_))
return gate_list_[idx];
return NULL;
}
inline GateUser* GetUser(NetId& netid)
{
GateSession* gate = GetGate(netid.gate_id_);
return gate ? gate->GetUser(netid) : NULL;
}
inline void PostCloseUser(NetId& netid, const char* reason, int p1 = 0, int p2 = 0)
{
OutputMsg(rmError, "GateManager::PostCloseUser %s:%d:%d", reason ? reason : "", p1, p2);
GateSession* gate = GetGate(netid.gate_id_);
if (gate)
{
gate->PostCloseUser(netid, 0, reason, p1, p2);
}
}
protected:
NetSession* NewSession(SOCKET socket, sockaddr_in* addrin);
void DestroySession(NetSession* client);
protected:
GateSession* gate_list_[MaxGateCount]; //<2F><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
};
#endif

View File

@@ -0,0 +1,28 @@
#ifndef _GATE_PROTO_H_
#define _GATE_PROTO_H_
/********************************************************
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>Э<EFBFBD><D0AD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ<DDBD><E1B9B9><EFBFBD><EFBFBD>
**********************************************************/
#define GW_OPEN 1 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><E1BBB0><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>Ϣ
#define GW_CLOSE 2 //<2F>ر<EFBFBD><D8B1>û<EFBFBD><C3BB><EFBFBD><E1BBB0><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>ӶϿ<D3B6>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>Ϣ
//#define GW_CHECKSERVER 3 //<2F><><EFBFBD>ػ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
//#define GW_CHECKCLIENT 4 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
#define GW_DATA 5 //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>û<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD>û<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳʹ<D2B2>ô<EFBFBD><C3B4><EFBFBD>Ϣ
#define GW_CHANNEL 6 //ͬ<><CDAC>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
#define GW_TEST 1026 // <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غͷ<D8BA><CDB7><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD>Ƿ񶪰<C7B7>
#define GW_CMD 1027
enum
{
ccAddUser = 1, // <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>
ccDelUser = 2, // ɾ<><C9BE><EFBFBD>û<EFBFBD>
ccBroadCast = 3, // <20>
};
#endif

View File

@@ -0,0 +1,207 @@
#include <stdio.h>
#include <stdlib.h>
#include "os_def.h"
#include "_ast.h"
#include "container/queue_list.h"
#include "x_tick.h"
#include "x_lock.h"
#include "x_thread.h"
#include "net/base_socket.h"
#include "server_def.h"
#include "gate_proto.h"
#include "share_util.h"
#include "memory/buffer_allocator.h"
#include "appitnmsg.h"
#include "data_packet.hpp"
#include "data_packet_reader.hpp"
#include "net/send_packet_pool.h"
#include "net/work_socket.h"
#include "net/net_session.h"
#include "net/server_socket.h"
#include "gate_user.h"
#include "gate_session.h"
#include "gate_manager.h"
GateSession::GateSession(const char* name) : Inherited(name)
{
gate_idx_ = 0;
}
GateSession::~GateSession()
{
CloseAllUser();
FreeBuffers();
}
void GateSession::FreeBuffers()
{
ClearSendList();
}
DataPacket& GateSession::AllocGateSendPacket(uint16_t cmd, NetId& netid)
{
DataPacket& packet = Inherited::allocProtoPacket(cmd);
packet << netid;
return packet;
}
DataPacket& GateSession::AllocGateSendPacket(NetId& netid)
{
DataPacket& packet = Inherited::allocProtoPacket(GW_DATA);
packet << netid;
return packet;
}
void GateSession::Disconnected()
{
Inherited::Disconnected();
FreeBuffers();
CloseAllUser();
}
void GateSession::OnRecvSysMsg(unsigned int msg, size_t p1, size_t p2, size_t p3, size_t p4)
{
switch (msg)
{
case CLOSE_GATE_SESSION:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺر<C4B9><D8B1><EFBFBD><EFBFBD><EFBFBD>
NetId netid;
netid.socket_ = MAKEINT64(p1, p2);
netid.index_ = LOINT16(p3);
netid.gate_id_ = HIINT16(p3);
CloseUser(netid, "OnRecvSysMsg");
SendGateCloseUser(netid);
break;
}
}
void GateSession::OnRecv(const uint16_t cmd, char* buf, int size)
{
if (size < (int)sizeof(NetId) || buf == NULL) return;
NetId* netid = (NetId*)buf;
buf += sizeof(NetId);
size -= sizeof(NetId);
if (netid->index_ >= MAX_GATE_USER) return;
GateUser& user = user_list_[netid->index_];
netid->gate_id_ = (uint16_t)gate_idx_;
switch (cmd)
{
case GW_OPEN:
{
OpenNewUser(*netid, buf);
break;
}
case GW_CLOSE:
{
CloseUser(*netid, "GW_CLOSE");
break;
}
case GW_DATA:
{
if (!user.closed_ && user.netid_.socket_ == netid->socket_)
{
OnRecv(*netid, buf, size);
}
break;
}
case GW_TEST:
case GW_CMD:
{
// ԭ<><D4AD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>
DataPacket& packet = AllocGateSendPacket(cmd, *netid);
packet.writeBuf(buf, size);
flushProtoPacket(packet);
break;
}
}
}
NetId* GateSession::OpenNewUser(NetId& netid, const char* addr)
{
if (netid.index_ >= MAX_GATE_USER) return NULL;
GateUser& user = user_list_[netid.index_];
user.netid_ = netid;
user.netid_.gate_id_ = (uint16_t)gate_idx_;
user.account_id_ = 0;
_STRNCPY_A(user.remote_addr_, addr);
user.closed_ = false;
user.account_name_[0] = 0;
user.gm_ = -1;
OnOpenUser(&user);
return &user.netid_;
}
void GateSession::OnOpenUser(GateUser*)
{
}
void GateSession::OnCloseUser(GateUser*, const char* reason)
{
}
bool GateSession::CloseUser(NetId& netid, const char* reason)
{
if (netid.index_ >= MAX_GATE_USER) return false;
if (netid.gate_id_ != gate_idx_) return false;
GateUser& user = user_list_[netid.index_];
if (user.closed_ == true) return true;
if (user.netid_.socket_ != netid.socket_) return false;
user.closed_ = true;
OnCloseUser(&user, reason);
return true;
}
void GateSession::CloseAllUser()
{
for (int i = 0; i < MAX_GATE_USER; i++)
{
GateUser& user = user_list_[i];
CloseUser(user.netid_, "CloseAllUser");
}
}
void GateSession::SendGateCloseUser(NetId& netid)
{
OutputMsg(rmNormal, ("close Socket=%d, GateSessionIdx=%d,reason=GW_CLOSE"), netid.socket_, netid.index_);
DataPacket& packet = AllocGateSendPacket(GW_CLOSE, netid);
flushProtoPacket(packet);
}
bool GateSession::OnValidateRegData(const SrvDef::PSERVER_REGDATA regData)
{
return (regData && regData->GameType == SrvDef::SERVER_REGDATA::GT_ID && regData->ServerType == SrvDef::GateServer);
}
GateUser* GateSession::GetUser(NetId& netid)
{
if (netid.index_ >= MAX_GATE_USER) return NULL;
if (netid.gate_id_ != gate_idx_) return NULL;
return &user_list_[netid.index_];
}

View File

@@ -0,0 +1,63 @@
#ifndef _GATE_CONNECTION_H_
#define _GATE_CONNECTION_H_
class GateManager;
class GateUser;
using namespace container;
class GateSession
: public NetSession
{
friend class GateManager;
public:
typedef NetSession Inherited;
public:
DataPacket& AllocGateSendPacket(uint16_t cmd, NetId& netid);
DataPacket& AllocGateSendPacket(NetId& netid);
inline void PostCloseUser(NetId& netid, int accountId, const char* reason, int p1 = 0, int p2 = 0)
{
OutputMsg(rmError, "GateSession::PostCloseUser %s:%d:%d", reason ? reason : "", p1, p2);
PostMsg(CLOSE_GATE_SESSION, LOINT32(netid.socket_), HIINT32(netid.socket_), MAKEINT32(netid.index_, netid.gate_id_), accountId);
}
GateUser* GetUser(NetId& netid);
protected:
virtual void OnOpenUser(GateUser* user);
virtual void OnCloseUser(GateUser* user, const char* reason);
virtual bool OnValidateRegData(const SrvDef::PSERVER_REGDATA regData);
protected:
void Disconnected();
void OnRecvSysMsg(unsigned int msg, size_t p1, size_t p2, size_t p3, size_t p4);
virtual void OnRecv(const uint16_t cmd, char* buf, int size);
NetId* OpenNewUser(NetId& netid, const char* addr);
bool CloseUser(NetId& netid, const char* reason);
void CloseAllUser();
virtual void OnRecv(NetId& netid, char* buf, int size) = 0;
void SendGateCloseUser(NetId& netid);
void FreeBuffers();
public:
GateSession(const char* name);
~GateSession();
protected:
static const int MAX_GATE_USER = 8192; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>
static const unsigned int CLOSE_GATE_SESSION = 102;
int gate_idx_; //<2F><><EFBFBD>ر<EFBFBD><D8B1><EFBFBD>
GateUser user_list_[MAX_GATE_USER];
};
#endif

View File

@@ -0,0 +1,26 @@
#ifndef _GATE_USER_H_
#define _GATE_USER_H_
class GateUser
{
public:
NetId netid_;
int account_id_; //<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ȫ<EFBFBD>ֻỰID
ActorId actor_id_; // ѡ<><D1A1><EFBFBD>Ľ<EFBFBD>ɫid<69><64><EFBFBD>ڴ<EFBFBD>֮ǰ<D6AE><C7B0>0
bool closed_; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>
int64_t handle_;
int gm_; // gm<67>ȼ<EFBFBD>
char remote_addr_[32]; //<2F>ͻ<EFBFBD><CDBB>˵<EFBFBD>ַ
SrvDef::ACCOUNT account_name_; //<2F>ʺ<EFBFBD><CABA>ַ<EFBFBD><D6B7><EFBFBD>
public:
GateUser(): account_id_(0), actor_id_(0), closed_(true), handle_(0), gm_(-1)
{
STATIC_ASSERT(sizeof(netid_.index_) == 2);
netid_.index_ = 0xffff;
remote_addr_[0] = 0;
account_name_[0] = 0;
}
};
#endif

View File

@@ -0,0 +1,203 @@
#ifndef _LOG_TYPE_H_
#define _LOG_TYPE_H_
using namespace SrvDef;
// new
enum LogMsgCmd
{
lmCounter = 1,
lmInstall = 2,
lmDau = 3,
lmEconomy = 4,
lmMilestone = 5,
lmCounterDB = 6,
lmPayment = 7,
lmGameInfo = 8,
lmOnline = 9, // ͳ<><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lmDcApiData = 10, //QQͳһ<CDB3><D2BB><EFBFBD><EFBFBD>ƽ̨<C6BD>ӿ<EFBFBD>
lmDcApiDataList = 11, //QQͳһ<CDB3><D2BB><EFBFBD><EFBFBD>ƽ̨<C6BD>ӿ<EFBFBD>
lmDcApiProto = 12, //QQͳһ<CDB3><D2BB><EFBFBD><EFBFBD>ƽ̨<C6BD>ӿ<EFBFBD>(<28>ӿ<EFBFBD>6.20)
lmTLog = 13, // <20><><EFBFBD>͵<EFBFBD>TLog<6F><67><EFBFBD><EFBFBD>
lmChat = 14, // ͳ<><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
lmDKMLog = 15, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
};
enum LogFlagInter
{
lfiDB = 1, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD>
lfiBI = 2, // <20><><EFBFBD>浽BI
lfiText = 4, // <20><><EFBFBD><EFBFBD>ı<EFBFBD>
lfiIsPay = 8, // <20>Ƿ<EFBFBD><C7B7><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
struct LDcApiLogTable
{
char key_[16];
char value_[64];
bool mustUrlencode_;
};
typedef Vector<LDcApiLogTable*, 128> LDcApiLogTableList;
struct LDcApiData
{
char log_name_[128];
short log_type_; // <20><><EFBFBD><EFBFBD>DC_API_manual_C++_V2.1.pdf<64><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD> : 0=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>1=ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>4=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
char content_[2048];
};
struct LDcApiProtoLog
{
//=====head=====
char openId[128]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʺ<EFBFBD>
int domain; //ƽ̨ID
int serverId;
char svrip[32]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ip
char userip[32]; //<2F>û<EFBFBD>ip
//=====end head=====
//===body=====
int roleId;
int protoId;
int gameFeatrueId; //ֱ<><D6B1><EFBFBD><EFBFBD>дϵͳID
int protoType;
int protoResult;
//===end body====
};
struct LCounter
{
ActorId actorid_;
char aid_[64];
char user_level_[32];
char counter_[32];
char value_[32];
char extra_[128];
char kingdom_[32];
char phylum_[32];
char classfield_[32];
char family_[32];
char genus_[128];
bool save_db_; // <20>Ƿ񱣴浽<F1B1A3B4><E6B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ⣬<DDBF><E2A3AC><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD>û<EFBFBD><C3BB>
int flag_;
};
struct LInstall
{
char aid_[64];
char source_[32];
char affiliate_[32];
char creative_[32];
char family_[32];
char genus_[32];
char from_uid_[32];
char extra_[32];
int flag_;
};
struct LDau
{
char aid_[64];
char source_[32];
char affiliate_[32];
char creative_[32];
char family_[32];
char genus_[32];
char ip_[32];
char from_uid_[32];
char extra_[32];
int flag_;
};
struct LEconomy
{
ActorId actorid_;
char aid_[64];
char currency_[32]; // currency type
char amount_[32]; //numerical amount
char value_[32]; // numerical value
char kingdom_[32];
char phylum_[32];
char classfield_[32];
char family_[32];
char genus_[32];
char extra_[128];
char extra2_[32];
char pf_[128];
int flag_;
char openkey_[512];
char pfkey_[128];
char pfid_[128];
};
struct LMilestone
{
ActorId actorid_;
char aid_[64];
char milestone_[32];
char value_[32];
char extra_[32];
int flag_;
};
struct LPayment
{
ActorId actorId_;
char aid_[64];
int amount_;
int value_;
char kingdom_[32];
char phylum_[32];
char transactionid_[32];
char extra_[32];
int mstType_;
int p1_;
int p2_;
int p3_;
int p4_;
int p5_;
int ret_;
int flag_;
};
struct LGameInfo
{
char aid_[64];
char user_level_[32];
char value_[32];
char extra_[32];
char kingdom_[32];
char phylum_[32];
char classfield_[32];
char family_[32];
char genus_[32];
int flag_;
};
struct LChat
{
ActorId actorid_;
char aid_[64];
char name_[32];
char ip_[32];
char pf_[32];
int type_;
char toaid_[64];
char toname_[32];
char content_[1024];
};
enum ChatType
{
ctSecret = 1, // ˽<><CBBD>,<2C><><EFBFBD><EFBFBD>
ctMail = 3,
ctWorld = 4, // <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
ctCamp = 5,
ctGuild = 6, // <20><><EFBFBD><EFBFBD><E1A3AC><EFBFBD><EFBFBD>
ctTeam = 7, // <20><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>,5<><35>
ctNear = 8, // (ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>
ctOther = 9,
};
#endif

View File

@@ -0,0 +1,641 @@
#include <stdlib.h>
#include <stdio.h>
#include "os_def.h"
#include "_ast.h"
#include "x_tick.h"
#include "x_lock.h"
#include "container/queue_list.h"
#include "net/base_socket.h"
#include "share_util.h"
#include "memory/buffer_allocator.h"
#include "appitnmsg.h"
#include "data_packet.hpp"
#include "net/send_packet_pool.h"
#include "net/work_socket.h"
#include "net/net_client.h"
#include "server_def.h"
#include "log_def.h"
#include "encrypt/CRC.h"
#include "encrypt/Encrypt.h"
#include "log_sender.h"
using namespace SrvDef;
LogSender::LogSender(int ServerType, int ServerIndex, char* ServerName) : NetClient("LogSender")
{
this->ServerType = ServerType;
this->ServerIndex = ServerIndex;
_STRNCPY_A(this->ServerName, ServerName);
this->SetClientName(("logger server"));
stop_log_ = false;
stop_counter_log_ = false;
stop_economy_log_ = false;
}
LogSender::LogSender() : NetClient("LogSender")
{
this->SetClientName(("logger server"));
stop_log_ = false;
stop_counter_log_ = false;
stop_economy_log_ = false;
}
LogSender::~LogSender(void)
{
}
void LogSender::SetServerName(const char* sServerName)
{
_STRNCPY_S(ServerName, sServerName, ArrayCount(ServerName) - 1);
ServerName[ArrayCount(ServerName) - 1] = 0;
}
int LogSender::GetLocalServerType()
{
return ServerType;
}
const char* LogSender::GetLocalServerName()
{
return ServerName;
}
int LogSender::GetLocalServerIndex()
{
return ServerIndex;
}
void LogSender::OnConnected()
{
setRecvBufSize(1024 * 1024);
setSendBufSize(1024 * 1024);
}
void LogSender::LogCounter(ActorId actorId, const char* aid, const char* user_level /*= ""*/,
const char* counter /*= ""*/, const char* value /*= ""*/, const char* extra /*= ""*/,
const char* kingdom /*= ""*/, const char* phylum /*= ""*/, const char* classfield /*= ""*/,
const char* family /*= ""*/, const char* genus /*= ""*/, int flag)
{
if (stop_log_ || stop_counter_log_) return;
LCounter data;
memset(&data, 0, sizeof(data));
data.actorid_ = actorId;
data.flag_ = flag;
if (aid)
{
_STRNCPY_A(data.aid_, aid);
}
if (user_level)
{
_STRNCPY_A(data.user_level_, user_level);
}
if (counter)
{
_STRNCPY_A(data.counter_, counter);
}
if (value)
{
_STRNCPY_A(data.value_, value);
}
if (extra)
{
_STRNCPY_A(data.extra_, extra);
}
if (kingdom)
{
_STRNCPY_A(data.kingdom_, kingdom);
}
if (phylum)
{
_STRNCPY_A(data.phylum_, phylum);
}
if (classfield)
{
_STRNCPY_A(data.classfield_, classfield);
}
if (family)
{
_STRNCPY_A(data.family_, family);
}
if (genus)
{
_STRNCPY_A(data.genus_, genus);
}
DataPacket& pdata = allocProtoPacket(lmCounter);
pdata << data;
flushProtoPacket(pdata);
}
void LogSender::LogDcApiLogByStr(const char* logName, const char* logContent)
{
if (stop_log_) return;
if(!logName || !logContent) return;
LDcApiData data;
memset(&data, 0, sizeof(data));
data.log_type_ = 4;
_STRNCPY_A(data.log_name_, logName);
_STRNCPY_A(data.content_ ,logContent);
DataPacket& pdata = allocProtoPacket(lmDcApiData);
pdata << data;
flushProtoPacket(pdata);
}
void LogSender::LogDcApiProto(const char* openId, int pfId, int serverId, int roleId, int systemId, int protoId, int protoType, int protoResult, const char* svrip, const char* userip)
{
//if (!et || ((Entity*)et)->GetType() != enActor)
// return;
//Actor* pActor =(Entity*)et;
if (stop_log_) return;
if(!openId) return;
LDcApiProtoLog logData;
memset(&logData, 0, sizeof(logData));
//_STRNCPY_A(logData.openId, pActor->GetAccount());
_STRNCPY_A(logData.openId, openId);
logData.domain = pfId;
//logData.serverId = ServerInstance()->GetServerIndex();
logData.serverId = serverId;
_STRNCPY_A(logData.svrip, svrip);
_STRNCPY_A(logData.userip, userip);
//logData.roleId = pActor->GetActorId();
logData.roleId = roleId;
logData.protoId = MAKEINT16(protoId, systemId);
logData.gameFeatrueId = systemId;
logData.protoType = protoType;
logData.protoResult = protoResult;
DataPacket& pdata = allocProtoPacket(lmDcApiProto);
pdata << logData;
flushProtoPacket(pdata);
}
void LogSender::LogInstall(const char* aid, const char* source /*= ""*/,
const char* affiliate /*= ""*/, const char* creative /*= ""*/,
const char* family /*= ""*/, const char* genus /*= ""*/,
const char* from_uid /*= ""*/ , const char* extra, int flag/* = 3*/)
{
if (stop_log_) return;
LInstall data;
memset(&data, 0, sizeof(data));
data.flag_ = flag;
if (aid)
{
_STRNCPY_A(data.aid_, aid);
}
if (source)
{
_STRNCPY_A(data.source_, source);
}
if (affiliate)
{
_STRNCPY_A(data.affiliate_, affiliate);
}
if (creative)
{
_STRNCPY_A(data.creative_, creative);
}
if (family)
{
_STRNCPY_A(data.family_, family);
}
if (genus)
{
_STRNCPY_A(data.genus_, genus);
}
if (from_uid)
{
_STRNCPY_A(data.from_uid_, from_uid);
}
if (extra)
{
_STRNCPY_A(data.extra_, extra);
}
DataPacket& pdata = allocProtoPacket(lmInstall);
pdata << data;
flushProtoPacket(pdata);
}
void LogSender::LogDau(const char* aid, const char* source /*= ""*/,
const char* affiliate /*= ""*/, const char* creative /*= ""*/,
const char* family /*= ""*/, const char* genus /*= ""*/,
const char* ip /*= ""*/, const char* from_uid /*= ""*/, const char* extra, int flag/* = 3*/)
{
if (stop_log_) return;
LDau data;
memset(&data, 0, sizeof(data));
data.flag_ = flag;
if (aid)
{
_STRNCPY_A(data.aid_, aid);
}
if (source)
{
_STRNCPY_A(data.source_, source);
}
if (affiliate)
{
_STRNCPY_A(data.affiliate_, affiliate);
}
if (creative)
{
_STRNCPY_A(data.creative_, creative);
}
if (family)
{
_STRNCPY_A(data.family_, family);
}
if (genus)
{
_STRNCPY_A(data.genus_, genus);
}
if (ip)
{
_STRNCPY_A(data.ip_, ip);
}
if (from_uid)
{
_STRNCPY_A(data.from_uid_, from_uid);
}
if (extra)
{
_STRNCPY_A(data.extra_, extra);
}
DataPacket& pdata = allocProtoPacket(lmDau);
pdata << data;
flushProtoPacket(pdata);
}
void LogSender::LogEnconomy(ActorId actorid, const char* aid, const char* currency /*= ""*/,
const char* amount /*= ""*/, const char* value /*= ""*/,
const char* kingdom /*= ""*/, const char* phylum /*= ""*/,
const char* classfield /*= ""*/, const char* family /*= ""*/,
const char* genus /*= ""*/ , const char* extra, const char* extra2, const char* pf, int flag/* = 3*/,
bool isPay, const char* openkey, const char* pfkey, const char* pfid)
{
if (stop_log_ || stop_economy_log_) return;
LEconomy data;
memset(&data, 0, sizeof(data));
data.flag_ = flag;
data.flag_ |= (isPay ? lfiIsPay : 0);
data.actorid_ = actorid;
if (aid)
{
_STRNCPY_A(data.aid_, aid);
}
if (currency)
{
_STRNCPY_A(data.currency_, currency);
}
if (amount)
{
_STRNCPY_A(data.amount_, amount);
}
if (value)
{
_STRNCPY_A(data.value_, value);
}
if (kingdom)
{
_STRNCPY_A(data.kingdom_, kingdom);
}
if (phylum)
{
_STRNCPY_A(data.phylum_, phylum);
}
if (classfield)
{
_STRNCPY_A(data.classfield_, classfield);
}
if (family)
{
_STRNCPY_A(data.family_, family);
}
if (genus)
{
_STRNCPY_A(data.genus_, genus);
}
if (extra)
{
_STRNCPY_A(data.extra_, extra);
}
if (extra2)
{
_STRNCPY_A(data.extra2_, extra2);
}
if (pf)
{
_STRNCPY_A(data.pf_, pf);
}
if (openkey)
{
_STRNCPY_A(data.openkey_, openkey);
}
if (pfkey)
{
_STRNCPY_A(data.pfkey_, pfkey);
}
if (pfid) {
_STRNCPY_A(data.pfid_, pfid);
}
DataPacket& pdata = allocProtoPacket(lmEconomy);
pdata << data;
flushProtoPacket(pdata);
}
void LogSender::LogMilestone(ActorId actorid, const char* aid, const char* milestone /*= ""*/, const char* value /*= ""*/, const char* extra, int flag/* = 3*/)
{
if (stop_log_) return;
LMilestone data;
memset(&data, 0, sizeof(data));
data.flag_ = flag;
data.actorid_ = actorid;
if (aid)
{
_STRNCPY_A(data.aid_, aid);
}
if (milestone)
{
_STRNCPY_A(data.milestone_, milestone);
}
if (value)
{
_STRNCPY_A(data.value_, value);
}
if (extra)
{
_STRNCPY_A(data.extra_, extra);
}
DataPacket& pdata = allocProtoPacket(lmMilestone);
pdata << data;
flushProtoPacket(pdata);
}
void LogSender::LogPayment(int ret, ActorId actorId, const char* aid, int amount,
int mstType, int p1, int p2, int p3,
int value /*= 1*/, const char* kingdom /*= ""*/, const char* phylum /*= ""*/, const char* transactionid /*= ""*/,
const char* extra /*= ""*/, int p4 /*= 0*/, int p5 /*= 0*/, int flag/* = 3*/)
{
if (stop_log_) return;
LPayment data;
memset(&data, 0, sizeof(data));
data.ret_ = ret;
data.actorId_ = actorId;
data.amount_ = amount;
data.value_ = value;
data.mstType_ = mstType;
data.p1_ = p1;
data.p2_ = p2;
data.p3_ = p3;
data.p4_ = p4;
data.p5_ = p5;
data.flag_ = flag;
if (aid)
{
_STRNCPY_A(data.aid_, aid);
}
if (kingdom)
{
_STRNCPY_A(data.kingdom_, kingdom);
}
if (phylum)
{
_STRNCPY_A(data.phylum_, phylum);
}
if (transactionid)
{
_STRNCPY_A(data.transactionid_, transactionid);
}
if (extra)
{
_STRNCPY_A(data.extra_, extra);
}
DataPacket& pdata = allocProtoPacket(lmPayment);
pdata << data;
flushProtoPacket(pdata);
}
void LogSender::LogGameInfo(const char* aid, const char* user_level /*= ""*/,
const char* value /*= ""*/, const char* extra /*= ""*/, const char* kingdom /*= ""*/,
const char* phylum /*= ""*/, const char* classfield /*= ""*/, const char* family /*= ""*/,
const char* genus /*= ""*/,
int flag/* = 3*/)
{
if (stop_log_) return;
LGameInfo data;
memset(&data, 0, sizeof(data));
data.flag_ = flag;
if (aid)
{
_STRNCPY_A(data.aid_, aid);
}
if (user_level)
{
_STRNCPY_A(data.user_level_, user_level);
}
if (value)
{
_STRNCPY_A(data.value_, value);
}
if (extra)
{
_STRNCPY_A(data.extra_, extra);
}
if (kingdom)
{
_STRNCPY_A(data.kingdom_, kingdom);
}
if (phylum)
{
_STRNCPY_A(data.phylum_, phylum);
}
if (classfield)
{
_STRNCPY_A(data.classfield_, classfield);
}
if (family)
{
_STRNCPY_A(data.family_, family);
}
if (genus)
{
_STRNCPY_A(data.genus_, genus);
}
DataPacket& pdata = allocProtoPacket(lmGameInfo);
pdata << data;
flushProtoPacket(pdata);
}
void LogSender::LogChat(const char* aid, const char* name, const char* ip, const char* pf, int actorid, int type,
const char* content, const char* toaid /* = "" */, const char* toname /* = "" */)
{
if (stop_log_) return;
LChat data;
memset(&data, 0, sizeof(data));
if (aid)
{
_STRNCPY_A(data.aid_, aid);
}
if (name)
{
_STRNCPY_A(data.name_, name);
}
if (pf)
{
_STRNCPY_A(data.pf_, pf);
}
if (ip)
{
_STRNCPY_A(data.ip_, ip);
}
data.type_ = type;
data.actorid_ = actorid;
if (content)
{
_STRNCPY_A(data.content_, content);
}
if (toaid)
{
_STRNCPY_A(data.toaid_, toaid);
}
if (toname)
{
_STRNCPY_A(data.toname_, toname);
}
DataPacket& pdata = allocProtoPacket(lmChat);
pdata << data;
flushProtoPacket(pdata);
}
void LogSender::LogOnline(int cnt, int extra)
{
if (stop_log_) return;
DataPacket& pdata = allocProtoPacket(lmOnline);
pdata << (int)cnt;
pdata << (int)extra;
flushProtoPacket(pdata);
}
void LogSender::LogTLog(const char* logstr)
{
if (stop_log_) return;
DataPacket& pdata = allocProtoPacket(lmTLog);
pdata.writeString(logstr);
flushProtoPacket(pdata);
}
void LogSender::LogDKMLog(const char* logstr, const char* pf)
{
if (!logstr || !pf) return;
if (stop_log_) return;
DataPacket& pdata = allocProtoPacket(lmDKMLog);
pdata.writeString(logstr);
pdata.writeString(pf);
flushProtoPacket(pdata);
}

View File

@@ -0,0 +1,187 @@
#ifndef _LOG_SENDER_H_
#define _LOG_SENDER_H_
class NetClient;
class LogSender:
public NetClient
{
public:
// DC API<50><49>־
void LogDcApiLogByStr(const char* logName, const char* logContent);
// DC API<50><49>ϷЭ<CFB7><D0AD><EFBFBD><EFBFBD>־
void LogDcApiProto(const char* openId, int pf, int serverId, int roleId, int systemId, int protoId, int protoType, int protoResult, const char* svrip, const char* userip);
void LogCounter(ActorId actorid, const char* aid,
const char* user_level = "",
const char* counter = "",
const char* value = "",
const char* extra = "",
const char* kingdom = "",
const char* phylum = "",
const char* classfield = "",
const char* family = "",
const char* genus = "",
int flag = 1);
void LogInstall(const char* actorId, const char* source = "",
const char* affiliate = "",
const char* creative = "",
const char* family = "",
const char* genus = "",
const char* from_uid = "",
const char* extra = "",
int flag = 3);
void LogDau(const char* aid,
const char* source = "",
const char* affiliate = "",
const char* creative = "",
const char* family = "",
const char* genus = "",
const char* ip = "",
const char* from_uid = "",
const char* extra = "",
int flag = 3);
void LogEnconomy(ActorId actorid, const char* aid,
const char* currency = "",
const char* amount = "",
const char* value = "",
const char* kingdom = "",
const char* phylum = "",
const char* classfield = "",
const char* family = "",
const char* genus = "",
const char* extra = "",
const char* extra2 = "",
const char* pf = "",
int flag = 3,
bool isPay = true,
const char* openkey = "",
const char* pfkey = "", const char* pfid = ""); // <20><>ʾ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void LogMilestone(
ActorId actorid,
const char* aid,
const char* milestone = "",
const char* value = "",
const char* extra = "",
int flag = 3);
void LogPayment(int ret, ActorId actorId, const char* aid, int amount,
int mstType,
int p1,
int p2,
int p3,
int value = 1,
const char* kingdom = "",
const char* phylum = "",
const char* transactionid = "",
const char* extra = "",
int p4 = 0,
int p5 = 0,
int flag = 3);
void LogGameInfo(const char* aid,
const char* user_level = "",
const char* value = "",
const char* extra = "",
const char* kingdom = "",
const char* phylum = "",
const char* classfield = "",
const char* family = "",
const char* genus = "",
int flag = 3);
void LogChat(const char* aid,
const char* name,
const char* ip,
const char* pf,
ActorId actorid,
int type,
const char* content,
const char* toaid = "",
const char* toname = "");
// <20><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void LogOnline(int cnt, int extra);
void LogTLog(const char* logstr);
void LogDKMLog(const char* logstr, const char* pf = "0");
inline int GetServerIndex()
{
return ServerIndex;
}
inline int GetServerType()
{
return ServerType;
}
inline const char* GetServerName()
{
return ServerName;
}
void SetServerIndex(const int nSerIdx)
{
ServerIndex = nSerIdx;
}
void SetServerType(const int nSrvType)
{
ServerType = nSrvType;
}
void SetServerName(const char* sServerName);
// <20>Ƿ<EFBFBD>ֹͣ<CDA3><D6B9>¼<EFBFBD><C2BC>־
inline void StopLog(bool flag = true)
{
stop_log_ = flag;
}
inline void StopCounterLog(bool flag = true)
{
stop_counter_log_ = flag;
}
inline void StopEconomyLog(bool flag = true)
{
stop_economy_log_ = flag;
}
public:
LogSender();
LogSender(int ServerType, int ServerIndex, char* ServerName);
~LogSender(void);
protected:
// /*** <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵĺ<C7B5><C4BA><EFBFBD><EFBFBD><EFBFBD> ***/
///* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
// * nCmd ͨ<><CDA8><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
// * inPacket <09>Ѿ<EFBFBD><D1BE><EFBFBD>ȡ<EFBFBD><C8A1>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0>Ķ<EFBFBD>ȡλ<C8A1><CEBB>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// */
//virtual void OnRecv(const uint16_t cmd, DataPacketReader &data);
/*** <20><><EFBFBD>к<EFBFBD><D0BA><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ǵĺ<C7B5><C4BA><EFBFBD><EFBFBD><EFBFBD> ***/
/* <20><><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3>Ա<EFBFBD><D4B1><EFBFBD>ȷ<EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
virtual int GetLocalServerType();
/* <20><><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3>Ա<EFBFBD><D4B1><EFBFBD>ȷ<EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
virtual const char* GetLocalServerName();
/* <20><><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD>ID<49><44><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>ȷ<EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>Ĭ<EFBFBD>ϵķ<CFB5><C4B7><EFBFBD>ֵ<EFBFBD><D6B5>0 */
virtual int GetLocalServerIndex();
void OnConnected();
private:
//<2F><><EFBFBD><EFBFBD>4<EFBFBD><34>ֵ<EFBFBD><D6B5><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>
int ServerType; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>ֵΪSERVERTYPEö<45><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ö<EFBFBD><C3B6>ֵ
int ServerIndex; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ψһ<CEA8><D2BB><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD><C5BD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char ServerName[128]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ֹ<EFBFBD><D6B9>
bool stop_log_;
bool stop_counter_log_;
bool stop_economy_log_;
};
#endif

View File

@@ -0,0 +1,142 @@
#ifndef _LUA_SOCKET_HPP_
#define _LUA_SOCKET_HPP_
/******************************************************************
*<2A><>װһ<D7B0><D2BB><EFBFBD>򵥵<EFBFBD>socket<65><74><EFBFBD><EFBFBD>lua<75><61><EFBFBD><EFBFBD>
*
*****************************************************************/
#include "net/base_socket.h"
using namespace net;
class LuaSocket : public BaseSocket
{
public:
LuaSocket(): buff_(NULL)
{
//printf("LuaSocket():%lld \n", (long long int)this);
}
virtual ~LuaSocket()
{
//printf("~LuaSocket():%lld \n", (long long int)this);
if (buff_)
{
free(buff_);
buff_ = NULL;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ʱֻ֧<D6BB><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
//ͨ<><CDA8>32λIP<49><50>ַ<EFBFBD><D6B7><EFBFBD>ӵ<EFBFBD><D3B5>ƶ<EFBFBD><C6B6>Ķ˿ڣ<CBBF><DAA3><EFBFBD><EFBFBD><EFBFBD>ֵΪsocket<65><74><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int connect(const double addr, const int port, bool block = true)
{
unsigned long long d;
memcpy(&d, &addr, sizeof(addr));
return BaseSocket::connect((u_long)d, port, block);
}
//<2F><><EFBFBD>׽<EFBFBD><D7BD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>ѶϿ<D1B6><CFBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SOCKET_ERROR<4F><52>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ʱֻ֧<D6BB><D6A7>д<EFBFBD><D0B4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>httpЭ<70><D0AD>
int send(char* buf)
{
if (!buf) return SOCKET_ERROR;
return BaseSocket::send((void*)buf, (int)strlen(buf));
}
const char* readline(int& retval)
{
retval = 0;
// <20><><EFBFBD><EFBFBD>SOCKET_ERROR != retval && 0 != retval <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>Զ<EFBFBD>
const int max_size = 1024;
if (!buff_) buff_ = (char*)malloc(max_size);
retval = recv(buff_, max_size - 1, 0);
if (retval >= 0)
buff_[retval] = 0;
return buff_;
}
const char* readall(int& retval)
{
//printf("readall start:%lld \n", (long long int)this);
const int max_size = 1024;
int total = 0;
retval = 0;
for (;;)
{
total += max_size;
buff_ = (char*)(buff_ ? realloc(buff_, total) : malloc(total));
assert(buff_);
int len = recv(buff_ + retval, total - retval - 1);
if (len <= 0)
{
break;
}
else
{
retval += len;
if (retval < (total - 1)) break;
}
}
//printf("readall end:%lld \n", (long long int)this);
buff_[retval] = 0;
return buff_;
}
public:
static LuaSocket* NewSocket()
{
//printf("NewSocket threadid %d\n", (int)GetCurrentThreadId());
LuaSocket* s = new LuaSocket();
int err = createSocket(&s->socket_);
if (err)
{
delete s;
return NULL;
}
//printf("NewSocket:%lld \n", (long long int)s);
return s;
}
static void Release(LuaSocket* s, int step)
{
if (!s) return;
//printf("Release:%lld \n", (long long int)s);
s->Close();
delete s;
}
static double GetHostByName(const char* host)
{
hostent* hostn = gethostbyname(host);
u_long addr = 0;
if (hostn)
{
addr = *(u_long*)hostn->h_addr_list[0];
}
double d;
memcpy(&d, &addr, sizeof(d));
return d;
}
private:
char* buff_;
};
#endif

View File

@@ -0,0 +1,217 @@
#ifdef _MSC_VER
#include <stdio.h>
#include <stdlib.h>
#include "os_def.h"
#include <_ast.h>
#include <x_thread.h>
#include <x_lock.h>
#include <x_tick.h>
#include <stream.h>
#include <wrand.h>
#include <time.h>
#include <container/vector.h>
#include <x_lock.h>
#include "second_time.h"
//#include <LinkedList.h>
#include "time_stat.h"
static const char s_szLogFileName[] = ("TimeStat.xml");
static const char* s_szTimeProfIndent[] = {
(""), // level_1
(" "), // level_2
(" "), // level_3
(" "), // level_4
(" "), // level_5
(" "), // level_6
(" "), // level_7
(" "), // level_8
(" "), // level_9
(" "), // level_10
(" "), // level_11
(" "), // level_12
(" "), // level_13
(" "), // level_14
(" ") // level_15
};
const char s_szSep[] = ("-------------------------------------------------------------------------------------------\r\n");
const char s_szStartRecordsLabel[] = ("<Records>\r\n");
const char s_szEndRecordsLabel[] = ("</Records>\r\n");
const char s_szStartProfRecord[] = ("<ProfRecord timeSpan=\"");
const char s_szEndProfRecord[] = ("</ProfRecord>\r\n");
const char s_szThreadLabel[] = (" threadId=%d");
const char szXmlEndLable[] = ("\">\r\n");
DWORD TimeProfMgr::s_dwTlsIdx = TLS_OUT_OF_INDEXES;
TimeProfDummy::TimeProfDummy(const char* szUnitName, unsigned int nHashCode)
{
TimeProfMgr& profMgr = *TimeProfMgr::getSingleton().getThreadInst();
TimeProfRecord *pCurRecord = profMgr.getCurrTimeProfRecord();
if (pCurRecord)
{
TimeProfRecord* pChild = pCurRecord->getChildByHash(nHashCode);
if (!pChild)
{
pChild = profMgr.allocRecord();
pChild->reInitBasicData(szUnitName, nHashCode);
pCurRecord->addChild(pChild);
}
pChild->startProf();
profMgr.OnTimeProfRecordStart(pChild);
}
}
TimeProfDummy::~TimeProfDummy()
{
TimeProfMgr& mgr = *TimeProfMgr::getSingleton().getThreadInst();
TimeProfRecord *pCurRecord = mgr.getCurrTimeProfRecord();
pCurRecord->endProf();
mgr.OnTimeProfRecordEnd(pCurRecord);
}
void TimeProfRecord::dump(stream::BaseStream& stream, int level)
{
level = level >= (int)(ArrayCount(s_szTimeProfIndent)) ? (int)(ArrayCount(s_szTimeProfIndent)-1) : level;
stream.write(s_szTimeProfIndent[level], strlen(s_szTimeProfIndent[level])*sizeof(char));
char szData[512] = {0};
float nAvgTime = 0;
if (m_nTotalCount > 0)
nAvgTime = (float)m_nTotalTime / m_nTotalCount;
SNPRINTFA(szData, sizeof(szData), ("<%s ttime=\"%I64u\" tcount=\"%I64u\" atime=\"%f\" maxtime=\"%I64u\" mintime=\"%I64u\" ottime=\"%I64u\" otcount=\"%I64u\" omaxtime=\"%I64u\" omintime=\"%I64u\">\r\n"),
m_szExecUnitName,m_nTotalTime, m_nTotalCount, nAvgTime, m_nMaxTime, m_nMinTime,
m_nOccuTotalTime, m_nOccuTotalCount, m_nOccuMaxTime, m_nOccuMinTime);
stream.write(szData, strlen(szData) * sizeof(szData[0]));
reset();
for (int i = 0; i < m_childrenNode.count(); i++)
m_childrenNode[i]->dump(stream, level+1);
SNPRINTFA(szData, sizeof(szData), ("%s</%s>\r\n"), s_szTimeProfIndent[level], m_szExecUnitName);
stream.write(szData, strlen(szData) * sizeof(szData[0]));
}
void TimeProfRecord::setName(const char* szName)
{
_STRNCPY_A(m_szExecUnitName, szName);
}
TimeProfRecord::TimeProfRecord(const char*, unsigned int)
{
}
TimeProfRecord::~TimeProfRecord(){
clear();
}
void TimeProfRecord::clear()
{
for (int i = 0; i < m_childrenNode.count(); i++)
{
TimeProfRecord *pRecord = m_childrenNode[i];
pRecord->clear();
TimeProfMgr::getSingleton().getThreadInst()->freeRecord(pRecord);
}
m_childrenNode.empty();
}
TimeProfMgr::TimeProfMgr() : m_execUnitRoot("", 0), m_dwThreadId(0)
{
//::timeBeginPeriod(1);
m_execUnitRoot.setName("Root");
m_execUnitRoot.reset(true);
m_execUnitStack.reserve(500);
getCurrentTm(m_lastDumpTime);
m_execUnitStack.push(&m_execUnitRoot);
m_freeRecordList.reserve(500);
allocTimeProfRecord();
}
TimeProfMgr::~TimeProfMgr()
{
//::timeEndPeriod(1);
clear();
}
void TimeProfMgr::getCurrentTm(tm &t)
{
time_t szClock;
time(&szClock);
struct tm *curTime = localtime(&szClock);
t = *curTime;
}
void TimeProfMgr::dumpImpl(stream::BaseStream& stream)
{
dumpDateTimeHeader(stream);
m_execUnitRoot.dump(stream);
stream.write(s_szEndProfRecord, strlen(s_szEndProfRecord)*sizeof(char));
}
void TimeProfMgr::dump()
{
using namespace stream;
FileStream fs(s_szLogFileName, FileStream::faWrite, FileStream::AlwaysOpen, NULL);
int fileSize = fs.getSize();
bool bFirstTime = true;
if (fileSize > (LONGLONG)(strlen(s_szEndProfRecord)*sizeof(char)))
{
bFirstTime = false;
fileSize -= (int)(strlen(s_szEndRecordsLabel)*sizeof(char));
fs.setPosition(fileSize);
}
else
{
fs.setPosition(fileSize);
fs.write(s_szStartRecordsLabel, strlen(s_szStartRecordsLabel)*sizeof(char));
}
for (int i = 0; i < m_vecTimeProfMgr.count(); i++)
{
m_vecTimeProfMgr[i]->dumpImpl(fs);
}
////dumpDateTimeSep(fs);
//dumpDateTimeHeader(fs);
//m_execUnitRoot.dump(fs);
//fs.write(s_szEndProfRecord, strlen(s_szEndProfRecord)*sizeof(char));
////dumpDateTimeSep(fs);
fs.write(s_szEndRecordsLabel, strlen(s_szEndRecordsLabel)*sizeof(char));
}
void TimeProfMgr::dumpDateTimeHeader(stream::BaseStream& stream)
{
char szBeginDateTime[256] = {0};
formatTimeStr(szBeginDateTime, ArrayCount(szBeginDateTime)-1, &m_lastDumpTime);
szBeginDateTime[ArrayCount(szBeginDateTime)-1] = ('\0');
stream.write(s_szStartProfRecord, strlen(s_szStartProfRecord)*sizeof(char));
stream.write(szBeginDateTime, strlen(szBeginDateTime) * sizeof(char));
stream.write("--", 2);
char szDateTime[256] = {0};
getCurrentTm(m_lastDumpTime);
formatTimeStr(szDateTime, ArrayCount(szDateTime)-1, &m_lastDumpTime);
szDateTime[ArrayCount(szDateTime)-1] = ('\0');
stream.write(szDateTime, strlen(szDateTime) * sizeof(char));
// dump thread id
char szThreadInfo[64] = {0};
SNPRINTFA(szThreadInfo, sizeof(szThreadInfo), s_szThreadLabel, m_dwThreadId);
stream.write(szThreadInfo, strlen(szThreadInfo) * sizeof(char));
stream.write(szXmlEndLable, strlen(szXmlEndLable) * sizeof(char));
}
void TimeProfMgr::formatTimeStr(char* szDataBuff, size_t nLen, tm *t)
{
//_tcsftime(szDataBuff, nLen-1, ("%Y-%m-%d_%H:%M:%S"), t);
SNPRINTFA(szDataBuff, (int)(nLen - 1), "%d-%d-%d_%d:%d:%d", t->tm_year + 1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
}
void TimeProfMgr::dumpDateTimeSep(stream::BaseStream& stream)
{
stream.write(s_szSep, strlen(s_szSep) * sizeof(char));
}
#endif

View File

@@ -0,0 +1,295 @@
#ifndef _TIME_STAT_H_
#define _TIME_STAT_H_
#ifdef _MSC_VER
//////////////////////////////////////////////////////////////////////////
// ʱ<><CAB1>ͳ<EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD>
// <20><> <09>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD>ٳ<EFBFBD><D9B3><EFBFBD><EFBFBD>е<EFBFBD><D0B5>õĺ<C3B5><C4BA><EFBFBD>ִ<EFBFBD><D6B4>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF>
// ˵ <09><><EFBFBD><EFBFBD>ͳ<EFBFBD>ư<EFBFBD><C6B0><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <09>ڵ<EFBFBD><DAB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD><CEBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF>ٵķ<D9B5><C4B7><EFBFBD><EFBFBD><EFBFBD>
// 2<><32><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>ÿ<EFBFBD><C3BF>ִ<EFBFBD>е<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD><CBB6><EFBFBD>ʱ<EFBFBD><EFBFBD>ҳ<EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>ڡ<EFBFBD>
// <20><><EFBFBD><EFBFBD><E7A3BA><EFBFBD>߼<EFBFBD><DFBC>̣߳<DFB3><CCA3><EFBFBD><EFBFBD>߼<EFBFBD><DFBC>߳<EFBFBD>ÿ<EFBFBD><C3BF>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>׷<EFBFBD>ٽڵ㣬<DAB5><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7B4A6><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵȶ<C8B5><C8B6><EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD>ٽڵ㣬<DAB5><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>ĸ<EFBFBD><C4B8>ٵ<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ʱռ<CAB1><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <09><>Ϊ<EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><E6B1BE><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD>
// ͳ<>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><EFBFBD><ECA3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD><CBA2>ռ<EFBFBD><D5BC>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>50%<25><><EFBFBD>ҵ<EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD>
// <20><>Ϊ<EFBFBD><CEAA>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>ˢ<EFBFBD>³<EFBFBD><C2B3><EFBFBD><EFBFBD>⣬Ҳ<E2A3AC><D2B2><EFBFBD><EFBFBD><E2B2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <09><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>⣬Ҫô<D2AA><C3B4><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>˷<EFBFBD>ʱ<EFBFBD><CAB1>Ҫô<D2AA><C3B4><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>÷<EFBFBD>ʱ׷<CAB1>ٽ<EFBFBD><D9BD>
//////////////////////////////////////////////////////////////////////////
#include <new>
//#include "ObjectCounter.h"
class TimeProfDummy
{
public:
TimeProfDummy(const char* szUnitName, unsigned int nHashCode);
~TimeProfDummy();
};
// ִ<><D6B4>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>¼<EFBFBD>ڵ<EFBFBD>
class TimeProfRecord
{
public:
enum
{
MAX_EXEC_UNIT_NAME_LEN = 64, // <20><><EFBFBD><EFBFBD>ִ<EFBFBD>е<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
};
TimeProfRecord(){}
TimeProfRecord(const char* szUnitName, unsigned int nHashCode);
~TimeProfRecord();
//<2F><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
void setName(const char* szName);
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ִ<EFBFBD>н<EFBFBD><D0BD><EFBFBD>
inline void addChild(TimeProfRecord* record)
{
m_childrenNode.add(record);
}
// <20><>ѯ<EFBFBD>ڵ<EFBFBD>
//CTimeProfRecord* getChild(const char* szUnitName);
inline TimeProfRecord* getChildByHash(int nHashCode)
{
for (int i = 0; i < m_childrenNode.count(); i++)
{
if ((unsigned int)nHashCode == m_childrenNode[i]->m_nNameHashCode)
return m_childrenNode[i];
}
return NULL;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8>Ϣ
void dump(stream::BaseStream& stream, int level = 0);
// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
inline void reset(bool bIncOccuData = false)
{
m_nTotalCount = 0;
m_nMaxTime = 0;
m_nMinTime = 0;
m_nTotalTime = 0;
if (bIncOccuData)
{
m_nOccuTotalCount = 0;
m_nOccuTotalTime = 0;
m_nOccuMaxTime = 0;
m_nOccuMinTime = 0;
}
}
inline void reInitBasicData(const char* szUnitName, unsigned int nHashCode)
{
ZeroMemory(this, offsetof(TimeProfRecord, m_childrenNode));
_STRNCPY_A(m_szExecUnitName, szUnitName);
for (int i = 0; i < (int)strlen(m_szExecUnitName); i++)
{
if (m_szExecUnitName[i] == ('\"') || m_szExecUnitName[i] == (',') || m_szExecUnitName[i] == ('<')
|| m_szExecUnitName[i] == ('>') || m_szExecUnitName[i] == (':') || m_szExecUnitName[i] == (' '))
m_szExecUnitName[i] = ('_');
}
m_nNameHashCode = nHashCode;
}
inline void startProf()
{
m_nStartTime = _getTickCount();
m_nTotalCount++;
m_nOccuTotalCount++;
}
inline void endProf()
{
m_nEndTime = _getTickCount();
unsigned long long nTimeConsume = m_nEndTime - m_nStartTime;
if (m_nMaxTime < nTimeConsume)
m_nMaxTime = nTimeConsume;
if (m_nMinTime > nTimeConsume)
m_nMinTime = nTimeConsume;
if (m_nOccuMaxTime < nTimeConsume)
m_nOccuMaxTime = nTimeConsume;
if (m_nOccuMinTime > nTimeConsume)
m_nOccuMinTime = nTimeConsume;
m_nTotalTime += nTimeConsume;
m_nOccuTotalTime += nTimeConsume;
}
void clear();
//<2F>ַ<EFBFBD><D6B7><EFBFBD>hash<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><E1B9A9><EFBFBD><EFBFBD>
inline static unsigned int hashlstr(const char* str, size_t len)
{
unsigned int h = (unsigned int)len;
size_t step = (len>>5)+1; /* if string is too long, don't hash all its chars */
size_t l1;
for (l1=len; l1>=step; l1-=step) /* compute hash */
h = h ^ ((h<<5)+(h>>2)+(unsigned char)str[l1-1]);
return h;
}
protected:
unsigned int m_nNameHashCode; // <20><><EFBFBD><EFBFBD>Hash<73><68>
unsigned long long m_nTotalCount; // ִ<>д<EFBFBD><D0B4><EFBFBD>
unsigned long long m_nOccuTotalCount; // <20>ۻ<EFBFBD>ִ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>
unsigned long long m_nMaxTime; // <20><><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>к<EFBFBD>ʱ
unsigned long long m_nMinTime; // <20><><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD>Сִ<D0A1>к<EFBFBD>ʱ
unsigned long long m_nOccuMaxTime; // <20>ۻ<EFBFBD><DBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>к<EFBFBD>ʱ
unsigned long long m_nOccuMinTime; // <20>ۻ<EFBFBD><DBBB><EFBFBD><EFBFBD><EFBFBD>Сִ<D0A1>к<EFBFBD>ʱ
unsigned long long m_nTotalTime; // <20><><EFBFBD><EFBFBD>ִ<EFBFBD>к<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
unsigned long long m_nOccuTotalTime; // <20>ۻ<EFBFBD>ִ<EFBFBD><D6B4>ʱ<EFBFBD><CAB1>
unsigned long long m_nStartTime; // <20><>ʼִ<CABC><D6B4>ʱ<EFBFBD><CAB1>
unsigned long long m_nEndTime; // <20><><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>ʱ<EFBFBD><CAB1>
char m_szExecUnitName[MAX_EXEC_UNIT_NAME_LEN]; // ִ<>е<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
container::Vector<TimeProfRecord*> m_childrenNode; // <20><><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD><DAB5>б<EFBFBD>
};
// ִ<><D6B4>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class TimeProfMgr
{
public:
TimeProfMgr();
~TimeProfMgr();
enum
{
ALLOC_RECORD_NUM = 200,
};
bool InitMgr()
{
if (TLS_OUT_OF_INDEXES == s_dwTlsIdx)
{
s_dwTlsIdx = TlsAlloc();
return s_dwTlsIdx != TLS_OUT_OF_INDEXES ? true : false;
}
return false;
}
static TimeProfMgr& getSingleton()
{
static TimeProfMgr mgr;
return mgr;
}
TimeProfMgr* getThreadInst()
{
TimeProfMgr* profMgr = (TimeProfMgr *)TlsGetValue(s_dwTlsIdx);
if (!profMgr)
{
profMgr = new TimeProfMgr();
profMgr->setThreadId(GetCurrentThreadId());
TlsSetValue(s_dwTlsIdx, profMgr);
m_lock.Lock();
m_vecTimeProfMgr.add(profMgr);
m_lock.Unlock();
}
return profMgr;
}
// <20><>ʼִ<CABC>м<EFBFBD>ʱ
inline void OnTimeProfRecordStart(TimeProfRecord *record)
{
m_execUnitStack.push(record);
}
// <20><><EFBFBD><EFBFBD>ִ<EFBFBD>м<EFBFBD>ʱ
inline void OnTimeProfRecordEnd(TimeProfRecord *)
{
m_execUnitStack.pop();
}
// <20><>ȡ<EFBFBD><C8A1>ǰִ<C7B0>е<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
inline TimeProfRecord* getCurrTimeProfRecord()
{
int count = m_execUnitStack.count();
if (count > 0)
return m_execUnitStack[count-1];
return NULL;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8>Ϣ
void dump();
inline TimeProfRecord* allocRecord()
{
if (m_freeRecordList.count() <= 0)
allocTimeProfRecord();
return m_freeRecordList.pop();
}
inline void freeRecord(TimeProfRecord *record)
{
m_freeRecordList.add(record);
}
inline void clear()
{
m_execUnitRoot.clear();
for (int i = 0; i < m_freeRecordList.count(); i++)
{
TimeProfRecord *pRecord = m_freeRecordList[i];
if (pRecord)
{
pRecord->~TimeProfRecord();
free(pRecord);
}
}
m_freeRecordList.empty();
m_execUnitStack.empty();
if (s_dwTlsIdx != TLS_OUT_OF_INDEXES)
{
TlsFree(s_dwTlsIdx);
s_dwTlsIdx = TLS_OUT_OF_INDEXES;
}
for (int i = 0; i < m_vecTimeProfMgr.count(); i++)
{
delete m_vecTimeProfMgr[i];
}
m_vecTimeProfMgr.empty();
}
protected:
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ͷ
void dumpDateTimeHeader(stream::BaseStream& stream);
// <20><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>
void dumpDateTimeSep(stream::BaseStream& stream);
// <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
void getCurrentTm(tm &t);
// dump
void dumpImpl(stream::BaseStream& stream);
// <20><>ʽ<EFBFBD><CABD>ʱ<EFBFBD><CAB1>
void formatTimeStr(char* szDataBuff, size_t nLen, tm *t);
// ִ<><D6B4>һ<EFBFBD>η<EFBFBD><CEB7>䣨ÿ<E4A3A8>η<EFBFBD><CEB7><EFBFBD>ALLOC_RECORD_NUM<55><4D><EFBFBD><EFBFBD>
inline void allocTimeProfRecord()
{
for (int i = 0; i < ALLOC_RECORD_NUM; i++)
{
TimeProfRecord* pRecords = (TimeProfRecord *)malloc(sizeof(TimeProfRecord));
if (pRecords)
{
new (pRecords)TimeProfRecord();
m_freeRecordList.add(pRecords);
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>Id
inline void setThreadId(DWORD dwThreadId) { m_dwThreadId = dwThreadId; }
protected:
container::Vector<TimeProfRecord *> m_execUnitStack; // ִ<>е<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ջ
TimeProfRecord m_execUnitRoot; // ִ<>е<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ĸ<EFBFBD><C4B8>ڵ<EFBFBD>
tm m_lastDumpTime; // <20>ϴ<EFBFBD>dump<6D><70><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
container::Vector<TimeProfRecord*> m_freeRecordList;
static DWORD s_dwTlsIdx; // Tls Slot Index
lock::Mutex m_lock; // Sync for multithread create timeprofmgr object
container::Vector<TimeProfMgr*> m_vecTimeProfMgr; // TimeProfMgr list
DWORD m_dwThreadId; // Current ThreadId
};
#ifdef _TIME_STATE_CHECK_
#define DECLARE_TIME_PROF(name) static unsigned int _STATIC_FUNCTION_HASH_VALUE_= TimeProfRecord::hashlstr(name,strlen(name)); \
TimeProfDummy LocalTimeProfRecord(name, _STATIC_FUNCTION_HASH_VALUE_ );
#define DECLARE_FUN_TIME_PROF() DECLARE_TIME_PROF(__FUNCTION__)
#else
#define DECLARE_TIME_PROF(name_)
#define DECLARE_FUN_TIME_PROF() DECLARE_TIME_PROF(__FUNCTION__)
#endif
#endif
#endif

View File

@@ -0,0 +1,59 @@
#define DEBUG_LOGIC_TIME
#define DEBUG_LOG_INTERVAL 600000
#define DEBUG_LOG_MAX_TIME 500
#ifdef DEBUG_LOGIC_TIME
#define LOGTIME_BEGIN \
static int __LOG_TIME_LOGS[100] = { 0 }; \
int64_t __log_last_t, __log_curr_t; \
__log_curr_t = __log_last_t = _getTickCount(); \
int64_t __log_tick_t; \
int __log_diff_t; \
int __log_idx = 0; \
static int64_t __log_log_t = __log_curr_t + DEBUG_LOG_INTERVAL;
#define LOGTIME \
__log_tick_t = _getTickCount(); \
__log_diff_t = (int)(__log_tick_t - __log_last_t); \
if (__log_idx >= 0 && __log_idx < 100 && __log_diff_t > __LOG_TIME_LOGS[__log_idx]) \
{ \
__LOG_TIME_LOGS[__log_idx] = __log_diff_t; \
} \
__log_last_t = __log_tick_t; \
__log_idx ++;
#define SW_LOGTIME(__log_idx_) \
__log_tick_t = _getTickCount(); \
__log_diff_t = (int)(__log_tick_t - __log_last_t); \
if (__log_idx_ >= 0 && __log_idx_ < 100 && __log_diff_t > __LOG_TIME_LOGS[__log_idx_]) \
{ \
__LOG_TIME_LOGS[__log_idx_] = __log_diff_t; \
} \
__log_idx = __log_idx_;
#define LOGTIME_END(__log_fun, __log_max_time) \
if (__log_curr_t >= __log_log_t && __log_idx >= 0 && __log_idx < 100) \
{ \
bool __log_haslog = true; \
for (int i=0; i<__log_idx; i++) \
{ \
if (__LOG_TIME_LOGS[i] > __log_max_time) \
{ \
if (__log_haslog) { \
OutputMsg(rmError, "=============debug %s time:============", __log_fun); \
__log_haslog = false; \
} \
OutputMsg(rmError, "%d=%d", i, __LOG_TIME_LOGS[i]); \
} \
} \
memset(__LOG_TIME_LOGS, 0, sizeof(__LOG_TIME_LOGS)); \
__log_log_t = __log_curr_t + DEBUG_LOG_INTERVAL; \
}
#else
#define LOGTIME_BEGIN
#define LOGTIME
#define SW_LOGTIME(__log_idx_)
#define LOGTIME_END(__log_fun, __log_max_time)
#endif

View File

@@ -0,0 +1,172 @@
#include <stdlib.h>
#include <stdio.h>
#include "os_def.h"
#include "_ast.h"
extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "ltm.h"
}
#include "x_thread.h"
#include "x_tick.h"
#include "x_lock.h"
#include "ref_string.hpp"
#include "stream.h"
#include "share_util.h"
#include "container/str_hash_table.h"
#include "container/queue_list.h"
#include "memory/buffer_allocator.h"
#include "luabase/base_lua.h"
#include "luabase/base_lua_config.h"
#include "luabase/lua_pre_process.h"
#include "luabase/clvariant.h"
#include "luabase/lua_clvariant.h"
#include "luabase/lua_profiler.h"
#include "luabase/script_value.hpp"
#include "luabase/script_value_list.h"
#include "luabase/vsp_def.h"
#include "luabase/base_script.h"
#include "async_worker.h"
AsyncWorker::AsyncWorker(const char* lua_file) : Inherited(),
alloc_("AsyncWorker"), wcb_(NULL), reload_(false)
{
cb_list_.setLock(&cb_list_lock_);
LoadScript(lua_file);
_STRNCPY_A(lua_file_, lua_file);
}
AsyncWorker::~AsyncWorker()
{
cb_list_.flush();
int count = cb_list_.count();
for (int i = 0; i < count; ++i)
{
CBData* cb = cb_list_[i];
if (!cb) continue;
if (cb->params_ && cb->free_func_)
{
cb->free_func_(cb);
}
alloc_.FreeBuffer(cb);
}
cb_list_.clear();
}
int AsyncWorker::Run()
{
if (reload_)
{
reload_ = false;
LoadScript(lua_file_);
}
if (cb_list_.appendCount() <= 0) return 0;
cb_list_.flush();
int count = cb_list_.count();
for (int i = 0; i < count; ++i)
{
CBData* cb = cb_list_[i];
cb->work_func_(cb);
this->wcb_(cb);
}
cb_list_.clear();
return count;
}
void AsyncWorker::OnRoutine()
{
OnStart();
while (!terminated())
{
if (Run() <= 0)
Sleep(1);
}
OnStop();
}
void AsyncWorker::OnStart()
{
OutputMsg(rmError, "AsyncWorker start!");
}
void AsyncWorker::OnStop()
{
OutputMsg(rmError, "AsyncWorker stop!");
}
void AsyncWorker::AppendWork(CBData* cb)
{
cb_list_.append(cb);
}
void AsyncWorker::LoadScript(const char* lua_file)
{
if (lua_file)
{
CVSPDefinition vsp_def;
vsp_def.LoadDefinitions("./data/vspdef.txt");
script_.SetVspDef(&vsp_def);
if (!script_.LoadScript(lua_file))
{
OutputMsg(rmError, "load AsyncWorker script fail!!!file:%s", lua_file);
}
}
}
unsigned int AsyncWorker::SendLuaMessage(ScriptValueList& req, WordFunc func)
{
id_++;
if (id_ == 0) id_++;
CBData* cb = (CBData*)alloc_.AllocBuffer(sizeof(*cb));
new(cb)CBData(this, id_);
cb->worker_ = this;
cb->work_func_ = &AsyncWorker::ExecuteLua;
cb->after_func_ = func;
cb->free_func_ = &AsyncWorker::FreeLuaParams;
cb->params_ = alloc_.AllocBuffer(sizeof(LuaParams));
new(cb->params_)LuaParams();
LuaParams* p = (LuaParams*)cb->params_;
p->req_ = req;
p->result_ << cb->guid_;
AppendWork(cb);
return cb->guid_;
}
void AsyncWorker::FreeLuaParams(void* callback)
{
CBData* cb = (CBData*)callback;
if (cb->params_)
{
((LuaParams*)cb->params_)->~LuaParams();
cb->worker_->GetAlloc().FreeBuffer(cb->params_);
cb->params_ = NULL;
}
}
void AsyncWorker::ExecuteLua(void* cb)
{
CBData* c = (CBData*)cb;
LuaParams* p = (LuaParams*)c->params_;
c->worker_->script_.Call("main", &p->req_, &p->result_);
}

View File

@@ -0,0 +1,93 @@
#ifndef _ASYNC_WORKER_H_
#define _ASYNC_WORKER_H_
/*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5>̣߳<DFB3><CCA3><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>߳<EFBFBD>ִ<EFBFBD>еIJ<D0B5><C4B2><EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>web<65>ӿڡ<D3BF>
* <20><><EFBFBD><EFBFBD><EFBFBD>µĹ<C2B5><C4B9>ܣ<EFBFBD>ֻ<EFBFBD><D6BB>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>̵߳<DFB3>ִ<EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
*/
using namespace thread;
using namespace container;
class AsyncWorker: public thread::BaseThread
{
public:
typedef BufferAllocator AsyncWorkerAlloc;
typedef BaseThread Inherited;
typedef void (*WordFunc)(void* cb);
typedef void (*WorkerCallBack)(void* cb);
typedef void (*FreeFunc)(void* cb);
struct LuaParams
{
ScriptValueList req_; // <20><><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>б<EFBFBD>
ScriptValueList result_; // ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD>󷵻ص<F3B7B5BB>ֵ
};
struct CBData
{
unsigned int guid_; // <20><><EFBFBD>кţ<D0BA>ÿ<EFBFBD><C3BF>ִ<EFBFBD>еĺ<D0B5><C4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ψһ<CEA8><D2BB>id<69><64><EFBFBD><EFBFBD><EFBFBD>ڻص<DABB>
WordFunc work_func_; // <20>ڱ<EFBFBD><DAB1>߳<EFBFBD><DFB3><EFBFBD>ִ<EFBFBD>еĹ<D0B5><C4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>web
WordFunc after_func_; // <20><><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>߳<EFBFBD>Ҫִ<D2AA>еĺ<D0B5><C4BA><EFBFBD>ָ<EFBFBD><D6B8>,<2C><><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
FreeFunc free_func_;
void* params_;
AsyncWorker* worker_;
CBData(AsyncWorker* worker, unsigned int guid):
guid_(guid), work_func_(NULL), after_func_(NULL),
free_func_(NULL), params_(NULL), worker_(worker)
{
}
};
public:
AsyncWorker(const char* lua_file = NULL);
void LoadScript(const char* lua_file);
virtual ~AsyncWorker();
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>߳<EFBFBD>ִ<EFBFBD>еIJ<D0B5><C4B2><EFBFBD>
void AppendWork(CBData* cb);
public:
AsyncWorkerAlloc& GetAlloc()
{
return alloc_;
}
void SetWorkCallBack(WorkerCallBack wcb)
{
wcb_ = wcb;
}
void Reload()
{
reload_ = true;
}
// <20><><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>lua<75><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned int SendLuaMessage(ScriptValueList& req, WordFunc func);
protected:
void OnRoutine();
//<2F><><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD>
int Run();
void OnStart();
void OnStop();
private:
static void FreeLuaParams(void* callback);
static void ExecuteLua(void* cb);
private:
QueueList<CBData*> cb_list_;
Mutex cb_list_lock_;
AsyncWorkerAlloc alloc_;
unsigned int id_;
WorkerCallBack wcb_;
BaseScript script_; // <20><><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>lua<75>Ĵ<EFBFBD><C4B4><EFBFBD>
bool reload_; // ֪ͨ<CDA8><D6AA><EFBFBD>¼<EFBFBD><C2BC>ؽű<D8BD>
char lua_file_[128]; //<2F>ļ<EFBFBD><C4BC><EFBFBD>
};
#endif

View File

@@ -0,0 +1,241 @@
#include <stdio.h>
#include <stdlib.h>
#include "os_def.h"
#include "_ast.h"
#include "share_util.h"
#include "fdop.h"
#ifndef _MSC_VER
#include <sys/stat.h>
#endif
using namespace FDOP;
bool FDOP::FileExists(const char* sFilePath)
{
#ifdef _MSC_VER
DWORD dwAttr = GetFileAttributes(sFilePath);
if (dwAttr == (DWORD) - 1)
return false;
else return true;
#else
if (!access(sFilePath, F_OK))
{
return true;
}
else
{
return false;
}
#endif
}
bool FDOP::DeepCreateDirectory(const char* sDirPath)
{
#ifdef _MSC_VER
char sPath[4096];
LPTSTR sPathPtr = sPath;
size_t dwNameLen, dwBufLen = ArrayCount(sPath) - 1;
DWORD dwAttr;
while (true)
{
dwNameLen = ExtractTopDirectoryName(sDirPath, &sDirPath, sPathPtr, dwBufLen);
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>Ƴ<EFBFBD><C6B3>ȳ<EFBFBD><C8B3><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (dwNameLen >= dwBufLen)
return false;
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (dwNameLen == 0)
return true;
sPathPtr += dwNameLen;
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>Ŀ¼
if (sPathPtr[-1] != ':')
{
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򴴽<EFBFBD><F2B4B4BD><EFBFBD>Ŀ¼
dwAttr = GetFileAttributes(sPath);
if ((dwAttr == (DWORD) - 1 && GetLastError() == ERROR_FILE_NOT_FOUND))
{
if (!CreateDirectory(sPath, NULL))
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF>򷵻<EFBFBD>false
else if (!(dwAttr & FILE_ATTRIBUTE_DIRECTORY))
{
return false;
}
}
sPathPtr[0] = '\\';
sPathPtr++;
if (dwBufLen > dwNameLen)
dwBufLen -= dwNameLen + 1;
else dwBufLen = 0;
}
return false;
#else
char dirName[256];
_STRNCPY_A(dirName, sDirPath);
int len = strlen(dirName);
if (dirName[len - 1] != '/')
_STRNCAT_A(dirName, "/");
len = strlen(dirName);
for (int i = 1; i < len; i++)
{
if (dirName[i] == '/')
{
dirName[i] = 0;
if (access(dirName, F_OK) != 0)
{
if (mkdir(dirName, 0755) == -1)
{
//OutputMsg(rmError, "mkdir error, %s", dirName);
return false;
}
}
dirName[i] = '/';
}
}
return true;
#endif
}
size_t FDOP::ExtractFileDirectory(const char* sFilePath, char* sDirBuf, size_t dwBufLen)
{
const char* sDirEnd = sFilePath + strlen(sFilePath) - 1;
while (sDirEnd >= sFilePath && *sDirEnd != '/' && *sDirEnd != '\\')
{
sDirEnd--;
}
if (sDirEnd > sFilePath)
{
size_t dwNameLen = sDirEnd - sFilePath;
if (dwBufLen > 0)
{
if (dwBufLen > dwNameLen)
dwBufLen = dwNameLen;
else dwBufLen--;
memcpy(sDirBuf, sFilePath, sizeof(*sDirBuf) * dwBufLen);
sDirBuf[dwBufLen] = 0;
}
return dwNameLen;
}
return 0;
}
size_t FDOP::ExtractTopDirectoryName(const char* sDirPath, const char* *ppChildDirPath, char* sDirName, size_t dwBufLen)
{
const char* sNameEnd;
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>'/'<27><>'\'
while (*sDirPath && (*sDirPath == '/' || *sDirPath == '\\'))
{
sDirPath++;
}
sNameEnd = sDirPath;
//<2F><>λĿ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>λ<EFBFBD><CEBB>
while (*sNameEnd)
{
if (*sNameEnd == '/' || *sNameEnd == '\\')
break;
sNameEnd++;
}
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD>
if (sNameEnd > sDirPath)
{
size_t dwNameLen = sNameEnd - sDirPath;
if (dwBufLen > 0)
{
if (dwBufLen > dwNameLen)
dwBufLen = dwNameLen;
else dwBufLen--;
memcpy(sDirName, sDirPath, sizeof(*sDirPath) * dwBufLen);
sDirName[dwBufLen] = 0;
if (ppChildDirPath)
*ppChildDirPath = sNameEnd;
}
return dwNameLen;
}
return 0;
}
size_t FDOP::ExtractFileName(const char* sFilePath, char* sNameBuf, size_t dwBufLen)
{
const char* sNameStart;
const char* sNameEnd = sFilePath + strlen(sFilePath) - 1;
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>ƺ<EFBFBD><C6BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>'/'<27><>'\'
while (sNameEnd >= sFilePath && (*sNameEnd == '/' || *sNameEnd == '\\'))
{
sNameEnd--;
}
sNameStart = sNameEnd;
sNameEnd++;
//<2F><>λĿ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>λ<EFBFBD><CEBB>
while (sNameStart >= sFilePath)
{
if (*sNameStart == '/' || *sNameStart == '\\')
break;
sNameStart--;
}
sNameStart++;
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD>
if (sNameStart < sNameEnd)
{
size_t dwNameLen = sNameEnd - sNameStart;
if (dwBufLen > 0)
{
if (dwBufLen > dwNameLen)
dwBufLen = dwNameLen;
else dwBufLen--;
memcpy(sNameBuf, sNameStart, sizeof(*sNameStart) * dwBufLen);
sNameBuf[dwBufLen] = 0;
}
return dwNameLen;
}
return 0;
}

View File

@@ -0,0 +1,66 @@
#ifndef _FDOP_H_
#define _FDOP_H_
/************************************************************************
*
* <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
************************************************************************/
namespace FDOP
{
/* <20>ж<EFBFBD><D0B6>ļ<EFBFBD><C4BC><EFBFBD>Ŀ¼<C4BF>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
* <20>ڲ<EFBFBD><DAB2><EFBFBD>ϵͳ<CFB5>У<EFBFBD>Ŀ¼Ҳ<C2BC><D2B2>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ж<EFBFBD>һ<EFBFBD><D2BB>Ŀ¼<C4BF>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>ʹ<EFBFBD><CAB9>DirectoryExists<74><73>
* Ҫ<>ж<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ӧ<EFBFBD><D3A6>ʹ<EFBFBD><CAB9>IsArchive<76><65>
* @<40><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD>true<75><65><EFBFBD>򷵻<EFBFBD>false
* %<25>ļ<EFBFBD>·<EFBFBD><C2B7><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2>ó<EFBFBD><C3B3><EFBFBD>MAX_PATH
*/
bool FileExists(const char* sFilePath);
/* <20><><EFBFBD><EFBFBD><E3B4B4>Ŀ¼
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼C:\a\b\c\d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF>ĸ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𼶴<EFBFBD><F0BCB6B4><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
* @<40><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>true<75><65><EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD>false<73><65>
* %<25><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD>Ŀ¼<C4BF>ɹ<EFBFBD><C9B9>󲢴<EFBFBD><F3B2A2B4><EFBFBD><EFBFBD><EFBFBD>Ŀ¼ʧ<C2BC>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>false<73><65><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>ᱻɾ<E1B1BB><C9BE><EFBFBD><EFBFBD>
* %Ŀ¼·<C2BC><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAX_PATH<54><48><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
bool DeepCreateDirectory(const char* sDirPath);
/* <20><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ŀ¼·<C2BC><C2B7>
* c:\abc\efg\123.txt --> c:\abc\efg\
* c:\abc\efg\ --> c:\abc\
* <20><><EFBFBD><EFBFBD>sDirBuf<75><66><EFBFBD>ڴ洢Ŀ¼<C4BF>ַ<EFBFBD><D6B7><EFBFBD>
* <20><><EFBFBD><EFBFBD>dwBufLenΪsDirName<6D><65><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
<20><><EFBFBD><EFBFBD>dwBufLenֵΪ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ὫĿ¼·<C2BC><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sDirBuf<75>У<EFBFBD>
<20><><EFBFBD><EFBFBD>dwBufLenֵ<6E><D6B5>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ὫĿ¼·<C2BC><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sDirBuf<75>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD>sDirBuf<75><66>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>;
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>dwBufLen-1<><31><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sDirBuf<75><66>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD>Ŀ¼·<C2BC><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
*/
size_t ExtractFileDirectory(const char* sFilePath, char* sDirBuf, size_t dwBufLen);
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD>
* (abc\efg\ --> abc)
* <20><><EFBFBD><EFBFBD>ppChildDirPath<74><68><EFBFBD>ڴ涥<DAB4><E6B6A5>Ŀ¼֮<C2BC><D6AE><EFBFBD><EFBFBD>Ŀ¼·<C2BC><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
* <20><><EFBFBD><EFBFBD>sDirName<6D><65><EFBFBD>ڴ洢Ŀ¼<C4BF>ַ<EFBFBD><D6B7><EFBFBD>
* <20><><EFBFBD><EFBFBD>dwBufLenΪsDirName<6D><65><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
<20><><EFBFBD><EFBFBD>dwBufLenֵΪ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ὫĿ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sDirName<6D>У<EFBFBD>
<20><><EFBFBD><EFBFBD>dwBufLenֵ<6E><D6B5>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ὫĿ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sDirName<6D>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD>sDirName<6D><65>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>;
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>dwBufLen-1<><31><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sDirName<6D><65>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
*/
size_t ExtractTopDirectoryName(const char* sDirPath, const char* *ppChildDirPath, char* sDirName, size_t dwBufLen);
/* <20><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD>
* c:\abc\123.txt --> 123.txt
* c:\abc\efg\ --> efg
* <20><><EFBFBD><EFBFBD>sDirBuf<75><66><EFBFBD>ڴ洢<DAB4>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
* <20><><EFBFBD><EFBFBD>dwBufLenΪsNameBuf<75><66><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
<20><><EFBFBD><EFBFBD>dwBufLenֵΪ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sNameBuf<75>У<EFBFBD>
<20><><EFBFBD><EFBFBD>dwBufLenֵ<6E><D6B5>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sNameBuf<75>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD>sNameBuf<75><66>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>;
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>dwBufLen-1<><31><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sNameBuf<75><66>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
*/
size_t ExtractFileName(const char* sFilePath, char* sNameBuf, size_t dwBufLen);
}
#endif

View File

@@ -0,0 +1,36 @@
#pragma once
#include "luabase/base_lua_config.h"
#include "string_ex.h"
/*
ly:ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><E1B9A9>ȡlua<75>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD>ͽӿڣ<D3BF><DAA3><EFBFBD>ȡlua<75><61><EFBFBD>õĵط<C4B5>ֻ<EFBFBD><D6BB>Ҫ<EFBFBD><D2AA>Դ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<09><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>о<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>̳<EFBFBD>BaseLuaConfig<69><67>
*/
class LuaReader :public BaseLuaConfig
{
typedef BaseLuaConfig Base;
public:
void showError(const char* sError) { OutputMsg(rmError, sError); }
void showTableNotExists(const char* sTableName) { return Base::showTableNotExists(sTableName); }
void showFieldDoesNotContainValue(const char* sFieldName, const char* sValueType) { return Base::showFieldDoesNotContainValue(sFieldName, sValueType); }
bool openGlobalTable(const char* sTableName) { return Base::openGlobalTable(sTableName); }
bool openFieldTable(const char* sTableName) { return Base::openFieldTable(sTableName); }
bool enumTableFirst(){ return Base::enumTableFirst(); }
bool enumTableNext() { return Base::enumTableNext(); }
void endTableEnum() { return Base::endTableEnum(); }
bool getFieldIndexTable(const int IndexStartFromOne) { return Base::getFieldIndexTable(IndexStartFromOne); }
bool fieldTableExists(const char* sTableName) { return Base::feildTableExists(sTableName); }
void closeTable() { return Base::closeTable(); }
const char* getTablePath() { String r; return Base::getTablePath(r); }
const char* getKeyName() { String r; return Base::getKeyName(r); }
inline int getValueType(){ return Base::getValueType(); }
bool getFieldBoolean(const char* sFieldName, const bool* pDefValue = nullptr, int* pIsValid = nullptr) { return Base::getFieldBoolean(sFieldName, pDefValue, pIsValid); }
double getFieldNumber(const char* sFieldName, const double* pDefValue = nullptr, int* pIsValid = nullptr) { return Base::getFieldNumber(sFieldName, pDefValue, pIsValid); }
int64_t getFieldInt64(const char* sFieldName, const int64_t* pDefValue = nullptr, int* pIsValid = nullptr) { return Base::getFieldInt64(sFieldName, pDefValue, pIsValid); }
int getFieldInt(const char* sFieldName, const int* pDefValue = nullptr, int* pIsValid = nullptr) { return Base::getFieldInt(sFieldName, pDefValue, pIsValid); }
const char* getFieldString(const char* sFieldName, const char* pDefValue = nullptr, int* pIsValid = nullptr) { return Base::getFieldString(sFieldName, pDefValue, pIsValid); }
int getFieldStringBuffer(const char* sFieldName, char* sBuffer, size_t dwBufLen) { return Base::getFieldStringBuffer(sFieldName, sBuffer, dwBufLen); }
int getTableLen() { return (int)lua_objlen(lua_, -1); }
};

View File

@@ -0,0 +1,40 @@
#pragma once
template< typename T >
struct Singleton
{
typedef T value_type;
typedef Singleton self_type;
private:// not to be implemented
Singleton(const self_type&){}
self_type& operator = (const self_type&){}
Singleton(){}
friend T;
private:// this struct promises thread safty
struct creator
{
creator()
{ // ensure that instance() called before main() starts
self_type::instance();
}
inline void null_action() const
{
//empty
}
};
static creator creator_;
public:
static value_type& instance()
{ // the object to be returned
static value_type instance_;
// force the initialization of creator_
creator_.null_action();
return instance_;
}
};
template<typename T>
typename Singleton<T>::creator Singleton<T>::creator_;

View File

@@ -0,0 +1,250 @@
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include "os_def.h"
#include "_ast.h"
#include "x_tick.h"
#include "x_lock.h"
#include "container/queue_list.h"
#include "share_util.h"
#include "os_def.h"
#include "appitnmsg.h"
#include "server_def.h"
#include "watch_thread.h"
WatchThread::WatchThread()
{
#ifdef _MSC_VER
handle_ = NULL;
#endif
stoped_ = true;
exit_ = true;
msg_list_.setLock(&msg_lock_);
Startup();
}
WatchThread::~WatchThread()
{
Stop();
msg_list_.flush();
msg_list_.clear();
}
void WatchThread::SingleRun()
{
ProcessSysMsg();
//check
time_t now_t = _getTickCount();
for (int i = 0; i < list_.count(); ++i)
{
WatchData& data = list_[i];
if (now_t - data.last_t_ >= data.timeout_)
{
printf("watch thread: %d block!time:%lld current = %d\n",
data.id_, (long long int)(now_t - data.last_t_), list_.count());
if (data.func_)
data.func_(data.params_);
data.last_t_ = now_t; // <20><><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD>
}
}
}
void WatchThread::PostMsg(UINT uMsg, size_t para1, size_t para2, BlockFunc func, void* params)
{
InterMsg msg;
msg.uMsg = uMsg;
msg.uParam1 = para1;
msg.uParam2 = para2;
msg.func = func;
msg.params = params;
msg_list_.append(msg);
}
void WatchThread::OnRecvSysMsg(UINT msg, size_t p1, size_t p2, BlockFunc func, void* params)
{
switch (msg)
{
case wmAddWatch:
{
int id = (int)p1;
if (Find(id))
{
OutputMsg(rmError, "this id exist:%d", id);
}
WatchData data;
data.id_ = id;
data.last_t_ = _getTickCount();
data.timeout_ = (int)p2;
data.func_ = func;
data.params_ = params;
list_.add(data);
break;
}
case wmReport:
{
WatchData* data = Find((int)p1);
if (data)
{
data->last_t_ = _getTickCount();
}
else
{
printf("%d is not find. report error!!!!\n", (int)p1);
}
break;
}
case wmRemove:
{
int id = (int)p1;
for (int i = 0; i < list_.count(); ++i)
{
WatchData& data = list_[i];
if (data.id_ == id)
{
int count = list_.count();
//<2F><><EFBFBD><EFBFBD>
//list_.remove(i);
for (int j = i + 1, t = i; j < list_.count(); j++, t++)
{
WatchData& srcData = list_[j];
WatchData& destData = list_[t];
memcpy(&destData, &srcData, sizeof(WatchData));
}
list_.trunc(count-1);
return;
}
}
break;
}
default:
break;
}
}
void WatchThread::ProcessSysMsg()
{
msg_list_.flush();
int count = msg_list_.count();
for (int i = 0; i < count; ++i)
{
InterMsg& msg = msg_list_[i];
OnRecvSysMsg(msg.uMsg, msg.uParam1, msg.uParam2, msg.func, msg.params);
}
msg_list_.clear();
}
void WatchThread::OnWorkThreadStart()
{
OutputMsg(rmError, "watch thread start");
}
void WatchThread::OnWorkThreadStop()
{
OutputMsg(rmError, "watch thread stop");
}
#ifdef _MSC_VER
void STDCALL WatchThread::Work_R(WatchThread* ptr)
#else
void* WatchThread::Work_R(void* ptr)
#endif
{
WatchThread* watch = (WatchThread*)ptr;
watch->OnWorkThreadStart();
while (!watch->stoped_)
{
watch->SingleRun();
Sleep(1);
}
watch->OnWorkThreadStop();
watch->exit_ = true;
#ifdef _MSC_VER
ExitThread(0);//<2F><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD><DFB3>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>ֵ
#else
return NULL;
#endif
}
bool WatchThread::Startup()
{
bool ret = true;
int err = 0;
stoped_ = false;
#ifdef _MSC_VER
handle_ = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Work_R, this, 0, &thread_id_);
if (!handle_)
{
err = GetLastError();
ret = false;
}
#else
if (pthread_create(&thread_id_, NULL, Work_R, this))
{
err = errno;
ret = false;
}
#endif
if (!ret)
{
OutputError(err, ("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>ʧ<EFBFBD><EFBFBD>"));
return false;
}
exit_ = false;
return true;
}
void WatchThread::Stop()
{
stoped_ = true;
while (!exit_)
{
Sleep(10);
}
#ifdef _MSC_VER
CloseThread(handle_);
#endif
}
WatchThread::WatchData* WatchThread::Find(int id)
{
for (int i = 0; i < list_.count(); ++i)
{
WatchData& data = list_[i];
if (data.id_ == id)
{
return &data;
}
}
return NULL;
}

View File

@@ -0,0 +1,102 @@
#ifndef _WATCH_THREAD_H_
#define _WATCH_THREAD_H_
using namespace tick64;
using namespace container;
using namespace lock;
typedef void (*BlockFunc)(void*);
class WatchThread
{
// <20><><EFBFBD>Կ<EFBFBD><D4BF>ǼӸ<C7BC><D3B8><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct WatchData
{
int id_;
int64_t last_t_;
int timeout_;
BlockFunc func_;
void* params_;
WatchData() : id_(0), last_t_(0), timeout_(0), func_(NULL), params_(NULL)
{
}
};
enum WatchMsg
{
wmAddWatch,
wmReport,
wmRemove,
};
typedef struct
{
unsigned int uMsg; //<2F><>Ϣ<EFBFBD><CFA2>
size_t uParam1;//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>1
size_t uParam2;//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>2
BlockFunc func;
void* params;
}InterMsg;
public:
WatchThread();
virtual ~WatchThread();
bool Startup();
void Stop();
#ifdef _MSC_VER
unsigned long GetThreadId()
#else
pthread_t GetThreadId()
#endif
{
return thread_id_;
}
void AddWatch(int id, int timeout, BlockFunc func = NULL, void* params = NULL)
{
PostMsg(wmAddWatch, id, timeout, func, params);
}
void RemoveWatch(int id)
{
PostMsg(wmRemove, id, 0, NULL, NULL);
}
void Report(int id)
{
PostMsg(wmReport, id, 0, NULL, NULL);
}
protected:
virtual void OnWorkThreadStart();
virtual void OnWorkThreadStop();
protected:
void SingleRun();
void ProcessSysMsg();
void OnRecvSysMsg(UINT msg, size_t p1, size_t p2, BlockFunc func, void* params);
void PostMsg(UINT uMsg, size_t para1, size_t para2, BlockFunc func, void* params);
WatchData* Find(int id);
private:
#ifdef _MSC_VER
static void STDCALL Work_R(WatchThread* ptr);
#else
static void* Work_R(void* ptr);
#endif
private:
#ifdef _MSC_VER
HANDLE handle_; //<2F><><EFBFBD><EFBFBD><EFBFBD>߳̾<DFB3><CCBE><EFBFBD>
unsigned long thread_id_; //<2F>߳<EFBFBD>ID
#else
pthread_t thread_id_;
#endif
bool stoped_; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ϊֹͣ
bool exit_;
QueueList<InterMsg> msg_list_; //<2F>ڲ<EFBFBD><DAB2><EFBFBD>Ϣ<EFBFBD>б<EFBFBD>
Mutex msg_lock_; //<2F>ڲ<EFBFBD><DAB2><EFBFBD>Ϣ<EFBFBD>б<EFBFBD><D0B1><EFBFBD>
Vector<WatchData> list_;
};
#endif

BIN
Gateway/gateway/.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,62 @@
cmake_minimum_required (VERSION 2.8.12.2)
#项目名
project (gate)
#cmake_policy(SET CMP0015 OLD)
#头文件
include_directories(
./
)
# 源文件及头文件
file(GLOB_RECURSE Gate_CODELIST "${PROJECT_SOURCE_DIR}/*.cc" "${PROJECT_SOURCE_DIR}/*.h")
# 代码分组
#group_by_dir(${PROJECT_SOURCE_DIR}/gateway ${Gate_CODELIST})
#链接库
link_directories( ${Libs_Dir} )
if(MSVC)
set(GAME_LIBRARIES
ws2_32
srv
Mswsock
Dbghelp
Winmm
libmysql
mysqlclient
common
)
else()
set(GAME_LIBRARIES
rt
pthread
mysqlclient
#lua
srv
common
)
endif(MSVC)
# Gate输出目录
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/../../Exec/Gateway)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/../../Exec/Gateway)
if ( ${CMAKE_BUILD_TYPE} STREQUAL "Release" )
set( _DEBUG 0 )
else ()
set( _DEBUG 1 )
endif()
if ( _DEBUG )
set( EXE_NAME gateway_d )
else()
set( EXE_NAME gateway_r )
endif()
add_executable(${EXE_NAME} ${Gate_CODELIST})
add_dependencies(${EXE_NAME} common)
target_link_libraries(${EXE_NAME} ${GAME_LIBRARIES})

View File

@@ -0,0 +1,2 @@
#include "StdAfx.h"

81
Gateway/gateway/StdAfx.h Normal file
View File

@@ -0,0 +1,81 @@
#define USE_EPOLL false
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "os_def.h"
#include <_ast.h>
#ifndef _MSC_VER
#include <netinet/in.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/errno.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#endif
#include <x_thread.h>
#include <net/base_socket.h>
#include <x_lock.h>
#include <x_tick.h>
#include <container/queue_list.h>
#include "share_util.h"
#include "memory/buffer_allocator.h"
#include "memory/memory_container.hpp"
#include "appitnmsg.h"
#include "data_packet.hpp"
#include "data_packet_reader.hpp"
#include "net/send_packet_pool.h"
#include "net/work_socket.h"
#include "net/net_client.h"
#include "net/server_socket.h"
#include "server_def.h"
#include "gate/gate_proto.h"
#include <stream.h>
#ifdef _MSC_VER
#include "statistic/time_stat.h"
#endif
#include "encrypt/CRC.h"
#include "encrypt/Encrypt.h"
#include "flog/file_logger.h"
#include "second_time.h"
#include "container/static_hash_table.h"
#include <ref_class.hpp>
#include <ref_string.hpp>
#include <time.h>
#include "encrypt/EDPass.h"
extern "C"
{
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}
#include "luabase/base_lua.h"
#include "luabase/base_lua_config.h"
#include "luabase/script_value.hpp"
#include "luabase/script_value_list.h"
#include "luabase/lua_pre_process.h"
#include "luabase/vsp_def.h"
#include "luabase/base_script.h"
#include "utils/fdop.h"
#include "gate_def.h"
#include "srv/socket_srv.h"
#include "gate_server.h"
#include "config/ws_gate_config.h"
#include "client/client.h"
#include "srv/game_client_mgr.h"
#include "gameworld/game_world_client.h"

View File

@@ -0,0 +1,590 @@
/*
* sha1.cpp
*
* Copyright (C) 1998, 2009
* Paul E. Jones <paulej@packetizer.com>
* All Rights Reserved.
*
*****************************************************************************
* $Id: sha1.cpp 12 2009-06-22 19:34:25Z paulej $
*****************************************************************************
*
* Description:
* This class implements the Secure Hashing Standard as defined
* in FIPS PUB 180-1 published April 17, 1995.
*
* The Secure Hashing Standard, which uses the Secure Hashing
* Algorithm (SHA), produces a 160-bit message digest for a
* given data stream. In theory, it is highly improbable that
* two messages will produce the same message digest. Therefore,
* this algorithm can serve as a means of providing a "fingerprint"
* for a message.
*
* Portability Issues:
* SHA-1 is defined in terms of 32-bit "words". This code was
* written with the expectation that the processor has at least
* a 32-bit machine word size. If the machine word size is larger,
* the code should still function properly. One caveat to that
* is that the input functions taking characters and character arrays
* assume that only 8 bits of information are stored in each character.
*
* Caveats:
* SHA-1 is designed to work with messages less than 2^64 bits long.
* Although SHA-1 allows a message digest to be generated for
* messages of any number of bits less than 2^64, this implementation
* only works with messages with a length that is a multiple of 8
* bits.
*
*/
#include "sha1.h"
/*
* SHA1
*
* Description:
* This is the constructor for the sha1 class.
*
* Parameters:
* None.
*
* Returns:
* Nothing.
*
* Comments:
*
*/
SHA1::SHA1()
{
Reset();
}
/*
* ~SHA1
*
* Description:
* This is the destructor for the sha1 class
*
* Parameters:
* None.
*
* Returns:
* Nothing.
*
* Comments:
*
*/
SHA1::~SHA1()
{
// The destructor does nothing
}
/*
* Reset
*
* Description:
* This function will initialize the sha1 class member variables
* in preparation for computing a new message digest.
*
* Parameters:
* None.
*
* Returns:
* Nothing.
*
* Comments:
*
*/
void SHA1::Reset()
{
Length_Low = 0;
Length_High = 0;
Message_Block_Index = 0;
H[0] = 0x67452301;
H[1] = 0xEFCDAB89;
H[2] = 0x98BADCFE;
H[3] = 0x10325476;
H[4] = 0xC3D2E1F0;
Computed = false;
Corrupted = false;
}
/*
* Result
*
* Description:
* This function will return the 160-bit message digest into the
* array provided.
*
* Parameters:
* message_digest_array: [out]
* This is an array of five unsigned integers which will be filled
* with the message digest that has been computed.
*
* Returns:
* True if successful, false if it failed.
*
* Comments:
*
*/
bool SHA1::Result(unsigned *message_digest_array)
{
int i; // Counter
if (Corrupted)
{
return false;
}
if (!Computed)
{
PadMessage();
Computed = true;
}
for(i = 0; i < 5; i++)
{
message_digest_array[i] = H[i];
}
return true;
}
/*
* Input
*
* Description:
* This function accepts an array of octets as the next portion of
* the message.
*
* Parameters:
* message_array: [in]
* An array of characters representing the next portion of the
* message.
*
* Returns:
* Nothing.
*
* Comments:
*
*/
void SHA1::Input( const unsigned char *message_array,
unsigned length)
{
if (!length)
{
return;
}
if (Computed || Corrupted)
{
Corrupted = true;
return;
}
while(length-- && !Corrupted)
{
Message_Block[Message_Block_Index++] = (*message_array & 0xFF);
Length_Low += 8;
Length_Low &= 0xFFFFFFFF; // Force it to 32 bits
if (Length_Low == 0)
{
Length_High++;
Length_High &= 0xFFFFFFFF; // Force it to 32 bits
if (Length_High == 0)
{
Corrupted = true; // Message is too long
}
}
if (Message_Block_Index == 64)
{
ProcessMessageBlock();
}
message_array++;
}
}
/*
* Input
*
* Description:
* This function accepts an array of octets as the next portion of
* the message.
*
* Parameters:
* message_array: [in]
* An array of characters representing the next portion of the
* message.
* length: [in]
* The length of the message_array
*
* Returns:
* Nothing.
*
* Comments:
*
*/
void SHA1::Input( const char *message_array,
unsigned length)
{
Input((unsigned char *) message_array, length);
}
/*
* Input
*
* Description:
* This function accepts a single octets as the next message element.
*
* Parameters:
* message_element: [in]
* The next octet in the message.
*
* Returns:
* Nothing.
*
* Comments:
*
*/
void SHA1::Input(unsigned char message_element)
{
Input(&message_element, 1);
}
/*
* Input
*
* Description:
* This function accepts a single octet as the next message element.
*
* Parameters:
* message_element: [in]
* The next octet in the message.
*
* Returns:
* Nothing.
*
* Comments:
*
*/
void SHA1::Input(char message_element)
{
Input((unsigned char *) &message_element, 1);
}
/*
* operator<<
*
* Description:
* This operator makes it convenient to provide character strings to
* the SHA1 object for processing.
*
* Parameters:
* message_array: [in]
* The character array to take as input.
*
* Returns:
* A reference to the SHA1 object.
*
* Comments:
* Each character is assumed to hold 8 bits of information.
*
*/
SHA1& SHA1::operator<<(const char *message_array)
{
const char *p = message_array;
while(*p)
{
Input(*p);
p++;
}
return *this;
}
/*
* operator<<
*
* Description:
* This operator makes it convenient to provide character strings to
* the SHA1 object for processing.
*
* Parameters:
* message_array: [in]
* The character array to take as input.
*
* Returns:
* A reference to the SHA1 object.
*
* Comments:
* Each character is assumed to hold 8 bits of information.
*
*/
SHA1& SHA1::operator<<(const unsigned char *message_array)
{
const unsigned char *p = message_array;
while(*p)
{
Input(*p);
p++;
}
return *this;
}
/*
* operator<<
*
* Description:
* This function provides the next octet in the message.
*
* Parameters:
* message_element: [in]
* The next octet in the message
*
* Returns:
* A reference to the SHA1 object.
*
* Comments:
* The character is assumed to hold 8 bits of information.
*
*/
SHA1& SHA1::operator<<(const char message_element)
{
Input((unsigned char *) &message_element, 1);
return *this;
}
/*
* operator<<
*
* Description:
* This function provides the next octet in the message.
*
* Parameters:
* message_element: [in]
* The next octet in the message
*
* Returns:
* A reference to the SHA1 object.
*
* Comments:
* The character is assumed to hold 8 bits of information.
*
*/
SHA1& SHA1::operator<<(const unsigned char message_element)
{
Input(&message_element, 1);
return *this;
}
/*
* ProcessMessageBlock
*
* Description:
* This function will process the next 512 bits of the message
* stored in the Message_Block array.
*
* Parameters:
* None.
*
* Returns:
* Nothing.
*
* Comments:
* Many of the variable names in this function, especially the single
* character names, were used because those were the names used
* in the publication.
*
*/
void SHA1::ProcessMessageBlock()
{
const unsigned K[] = { // Constants defined for SHA-1
0x5A827999,
0x6ED9EBA1,
0x8F1BBCDC,
0xCA62C1D6
};
int t; // Loop counter
unsigned temp; // Temporary word value
unsigned W[80]; // Word sequence
unsigned A, B, C, D, E; // Word buffers
/*
* Initialize the first 16 words in the array W
*/
for(t = 0; t < 16; t++)
{
W[t] = ((unsigned) Message_Block[t * 4]) << 24;
W[t] |= ((unsigned) Message_Block[t * 4 + 1]) << 16;
W[t] |= ((unsigned) Message_Block[t * 4 + 2]) << 8;
W[t] |= ((unsigned) Message_Block[t * 4 + 3]);
}
for(t = 16; t < 80; t++)
{
W[t] = CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]);
}
A = H[0];
B = H[1];
C = H[2];
D = H[3];
E = H[4];
for(t = 0; t < 20; t++)
{
temp = CircularShift(5,A) + ((B & C) | ((~B) & D)) + E + W[t] + K[0];
temp &= 0xFFFFFFFF;
E = D;
D = C;
C = CircularShift(30,B);
B = A;
A = temp;
}
for(t = 20; t < 40; t++)
{
temp = CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1];
temp &= 0xFFFFFFFF;
E = D;
D = C;
C = CircularShift(30,B);
B = A;
A = temp;
}
for(t = 40; t < 60; t++)
{
temp = CircularShift(5,A) +
((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];
temp &= 0xFFFFFFFF;
E = D;
D = C;
C = CircularShift(30,B);
B = A;
A = temp;
}
for(t = 60; t < 80; t++)
{
temp = CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3];
temp &= 0xFFFFFFFF;
E = D;
D = C;
C = CircularShift(30,B);
B = A;
A = temp;
}
H[0] = (H[0] + A) & 0xFFFFFFFF;
H[1] = (H[1] + B) & 0xFFFFFFFF;
H[2] = (H[2] + C) & 0xFFFFFFFF;
H[3] = (H[3] + D) & 0xFFFFFFFF;
H[4] = (H[4] + E) & 0xFFFFFFFF;
Message_Block_Index = 0;
}
/*
* PadMessage
*
* Description:
* According to the standard, the message must be padded to an even
* 512 bits. The first padding bit must be a '1'. The last 64 bits
* represent the length of the original message. All bits in between
* should be 0. This function will pad the message according to those
* rules by filling the message_block array accordingly. It will also
* call ProcessMessageBlock() appropriately. When it returns, it
* can be assumed that the message digest has been computed.
*
* Parameters:
* None.
*
* Returns:
* Nothing.
*
* Comments:
*
*/
void SHA1::PadMessage()
{
/*
* Check to see if the current message block is too small to hold
* the initial padding bits and length. If so, we will pad the
* block, process it, and then continue padding into a second block.
*/
if (Message_Block_Index > 55)
{
Message_Block[Message_Block_Index++] = 0x80;
while(Message_Block_Index < 64)
{
Message_Block[Message_Block_Index++] = 0;
}
ProcessMessageBlock();
while(Message_Block_Index < 56)
{
Message_Block[Message_Block_Index++] = 0;
}
}
else
{
Message_Block[Message_Block_Index++] = 0x80;
while(Message_Block_Index < 56)
{
Message_Block[Message_Block_Index++] = 0;
}
}
/*
* Store the message length as the last 8 octets
*/
Message_Block[56] = (Length_High >> 24) & 0xFF;
Message_Block[57] = (Length_High >> 16) & 0xFF;
Message_Block[58] = (Length_High >> 8) & 0xFF;
Message_Block[59] = (Length_High) & 0xFF;
Message_Block[60] = (Length_Low >> 24) & 0xFF;
Message_Block[61] = (Length_Low >> 16) & 0xFF;
Message_Block[62] = (Length_Low >> 8) & 0xFF;
Message_Block[63] = (Length_Low) & 0xFF;
ProcessMessageBlock();
}
/*
* CircularShift
*
* Description:
* This member function will perform a circular shifting operation.
*
* Parameters:
* bits: [in]
* The number of bits to shift (1-31)
* word: [in]
* The value to shift (assumes a 32-bit integer)
*
* Returns:
* The shifted value.
*
* Comments:
*
*/
unsigned SHA1::CircularShift(int bits, unsigned word)
{
return ((word << bits) & 0xFFFFFFFF) | ((word & 0xFFFFFFFF) >> (32-bits));
}

View File

@@ -0,0 +1,90 @@
/*
* sha1.h
*
* Copyright (C) 1998, 2009
* Paul E. Jones <paulej@packetizer.com>
* All Rights Reserved.
*
*****************************************************************************
* $Id: sha1.h 12 2009-06-22 19:34:25Z paulej $
*****************************************************************************
*
* Description:
* This class implements the Secure Hashing Standard as defined
* in FIPS PUB 180-1 published April 17, 1995.
*
* Many of the variable names in this class, especially the single
* character names, were used because those were the names used
* in the publication.
*
* Please read the file sha1.cpp for more information.
*
*/
#ifndef _SHA1_H_
#define _SHA1_H_
class SHA1
{
public:
SHA1();
virtual ~SHA1();
/*
* Re-initialize the class
*/
void Reset();
/*
* Returns the message digest
*/
bool Result(unsigned *message_digest_array);
/*
* Provide input to SHA1
*/
void Input( const unsigned char *message_array,
unsigned length);
void Input( const char *message_array,
unsigned length);
void Input(unsigned char message_element);
void Input(char message_element);
SHA1& operator<<(const char *message_array);
SHA1& operator<<(const unsigned char *message_array);
SHA1& operator<<(const char message_element);
SHA1& operator<<(const unsigned char message_element);
private:
/*
* Process the next 512 bits of the message
*/
void ProcessMessageBlock();
/*
* Pads the current message block to 512 bits
*/
void PadMessage();
/*
* Performs a circular left shift operation
*/
inline unsigned CircularShift(int bits, unsigned word);
unsigned H[5]; // Message digest buffers
unsigned Length_Low; // Message length in bits
unsigned Length_High; // Message length in bits
unsigned char Message_Block[64]; // 512-bit message blocks
int Message_Block_Index; // Index into message block array
bool Computed; // Is the digest computed?
bool Corrupted; // Is the message digest corruped?
};
#endif // _SHA1_H_

8
Gateway/gateway/build.sh Normal file
View File

@@ -0,0 +1,8 @@
#!/bin/bash
cd $(cd "$(dirname "$0")" && pwd)
srcDIR=`pwd`
cd $srcDIR/build
cmake ..
make -j2

View File

@@ -0,0 +1,399 @@
#include "StdAfx.h"
#include "client.h"
#include "base/sha1.h"
#include "base64.h"
BaseAllocator Client::alloc("ClientAlloc");
Client::Client(GameClientMgr *cli_mgr, SOCKET s, sockaddr_in* addr) {
shake_hands_ = false;
fd_ = s;
cli_mgr_ = cli_mgr;
send_packet_ = new DataPacket(&alloc);
send_packet_->reserve(SEND_PACKET_MAX);
send_packet_->setLength(0);
memcpy(&remote_addr_, addr, sizeof(sockaddr_in));
net_id_.socket_ = s;
conn_status_ = ConnStatusDef::CS_CONNED;
skey_ = 0;
is_close_ = false;
real_ip[0] = 0;
}
Client ::~Client() {
for (auto it : recv_list_) {
SafeDelete(it);
}
SafeDelete(send_packet_);
recv_list_.clear();
for (auto it : gw_recv_list_) {
SafeDelete(it);
}
real_ip[0] = 0;
}
int Client::SetBlockMode(const bool block) {
unsigned long flag = block ? 0 : 1;
#ifdef _MSC_VER
return ioctlsocket(fd_, FIONBIO, &flag);
#else
return ioctl(fd_, FIONBIO, &flag);//改为非阻塞;
#endif
}
void Client::RecvData(void) {
if (is_close_) return;
static char buf[1024];
while (true) {
int buflen = recv(fd_, buf, sizeof(buf), 0);
if (buflen < 0) {
// 由于是非阻塞的模式,所以当errno为EAGAIN时,表示当前缓冲区已无数据可读
// 在这里就当作是该次事件已处理
#ifdef _MSC_VER
if (WSAGetLastError() == WSAECONNABORTED) {
Close();
return;
} else if (WSAGetLastError() == WSAEWOULDBLOCK) {
#else
if (WSAGetLastError() == EINPROGRESS || WSAGetLastError() == EAGAIN) {
#endif
break;
} else {
MSG_ERR("not handle errno:[%d]%s", WSAGetLastError(), strerror(WSAGetLastError()));
Close();
return;
}
} else if (buflen == 0) {
// 这里表示对端的socket已正常关闭.
Close();
return;
}
if (shake_hands_) {
DataPacket* dp = new DataPacket(&alloc);
dp->writeBuf(buf, buflen);
dp->setPosition(0);
recv_list_.push_back(dp);
} else {
//进行websocket握手
ShakeHandsHandle(buf, buflen);
return;
}
}
}
bool Client::SendData(void) {
size_t splen = send_packet_->getAvaliableLength();
if (splen <= 0) { return true; }
int lsed = send(fd_, send_packet_->getOffsetPtr(), (int)splen, 0);
if(lsed <= 0) { return true; }
if (lsed < splen) {
send_packet_->setPosition(send_packet_->getPosition() + lsed);
return false;
} else {
send_packet_->setLength(0);
}
return true;
}
void Client::WriteEvent(void) {
if (is_close_) return;
DataPacket* dp = NULL;
while (true) {
if (gw_recv_list_.empty()) { break; }
dp = *(gw_recv_list_.begin());
gw_recv_list_.pop_front();
FlushWsPack(dp->getOffsetPtr(), dp->getAvaliableLength());
SafeDelete(dp);
}
if(send_packet_->getAvaliableLength() > 0) {
cli_mgr_->HaveData(this);
}
}
void Client::Flush(const char *buf, size_t len) {
if (send_packet_->getAvaliableLength() + len > SEND_PACKET_MAX) {
MSG_ERR("send packet is max, fd:%d", fd_);
Close();
return;
} else {
size_t pos = send_packet_->getPosition();
send_packet_->setPosition(pos + send_packet_->getAvaliableLength());
send_packet_->writeBuf(buf, len);
send_packet_->setPosition(pos);
}
}
void Client::SendNewSession(void) {
static GameWorldClient* wgc = cli_mgr_->GetGameWorldClient();
DataPacket &dp = wgc->AllocProtoPacket(GM_OPEN,net_id_.socket_,net_id_.index_,net_id_.gate_id_);
if (real_ip[0] != 0)
dp.writeBuf(real_ip, 32);
else
dp.writeBuf(inet_ntoa(remote_addr_.sin_addr), 32);
wgc->flushProtoPacket(dp);
OutputMsg(rmTip, _T("[Login] (2) 握手成功通知LogicServer创建一个玩家Gate gatekey(%d)socket(%lld)GateIdx(%d)LogicIdx(%d)CurrentThreadId(%d)。"),
skey_, net_id_.socket_, net_id_.index_, net_id_.gate_id_, GetCurrentThreadId());
}
void Client::SendSessionClose(void) {
static GameWorldClient* wgc = cli_mgr_->GetGameWorldClient();
DataPacket &dp = wgc->AllocProtoPacket(GM_CLOSE,net_id_.socket_,net_id_.index_,net_id_.gate_id_);
wgc->flushProtoPacket(dp);
}
void Client::Close(void) {
MSG_ERR("close client, fd:%d,index:%d", net_id_.socket_, net_id_.index_);
cli_mgr_->CloseClient(this);
SendSessionClose();
is_close_ = true;
}
#define WEB_SOCKET_HANDS_RE "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: %s\r\n\r\n"
#define MAGIC_KEY "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
void Client::ShakeHandsHandle(const char* buf, int buflen) {
char key[512]; memset(key, 0, 512);
for (int i = 0; i < buflen; ++i)
{
if (FindHttpParam("Sec-WebSocket-Key", buf+i)) {
short k = i + 17, ki = 0;
while(*(buf + k) != '\r' && *(buf + k) != '\n' && *(buf + k) != '\0') {
if (*(buf + k) == ':' || *(buf + k) == ' '){
++k; continue;
} else {
key[ki++] = *(buf + k);
}
++k;
}
break;
}
}
memset(real_ip, 0, sizeof(real_ip));
for (int i = 0; i < buflen; ++i)
{
if (FindHttpParam("X-Real-IP", buf+i)) {
short k = i + 9, ki = 0;
while(*(buf + k) != '\r' && *(buf + k) != '\n' && *(buf + k) != '\0') {
if (*(buf + k) == ':' || *(buf + k) == ' '){
++k; continue;
} else {
real_ip[ki++] = *(buf + k);
}
++k;
}
break;
}
}
//MSG_LOG("key:%s...", key);
memcpy(key + strlen(key), MAGIC_KEY, sizeof(MAGIC_KEY));
//MSG_LOG("megerkey:%s...", key);
//求哈希1
SHA1 sha;
unsigned int message_digest[5];
sha.Reset();
sha << key;
sha.Result(message_digest);
for (int i = 0; i < 5; i++) {
message_digest[i] = htonl(message_digest[i]);
}
memset(key, 0, 512);
base64_encode(key, reinterpret_cast<const char*>(message_digest), 20);
char http_res[512] = "";
sprintf(http_res, WEB_SOCKET_HANDS_RE, key);
Flush(http_res, strlen(http_res));
//MSG_LOG("res:%s...",http_res);//fkYTdNEVkParesYkrM4S
SendData();
shake_hands_ = true;
SendNewSession();//发送到gameworld新增连接
}
void Client::PacketHandle(void) {
if (is_close_) return;
while (!recv_list_.empty()) {
auto dpit = recv_list_.begin();
DataPacket* dp = *dpit;
//读取websocket固定包头
if (!ws_head_.rh) {
//这个包不够一个头部的大小
if (dp->getAvaliableLength() < 2) {
if (MergePacketList(dpit)) continue;
else break;
}
//读取
uint8_t head = 0;
dp->readBuf(&head, 1);
ws_head_.fin = head >> 7;
ws_head_.opcode = head & 0xF;
dp->readBuf(&head, 1);
ws_head_.len = head & 0x7F;
ws_head_.mask = head >> 7;
ws_head_.rh = 1;//标记头部读取完成
}
//读取长度
if (!ws_head_.rl) {
uint8_t nsize = ws_head_.GetLenNeedByte();
if (nsize) {
//这个包不够一个长度
if (dp->getAvaliableLength() < nsize) {
if (MergePacketList(dpit)) continue;
else break;
}
if (nsize == 2) {
(*dp) >> ws_head_.ex_len.v16;
ws_head_.ex_len.v16 = ntohs(ws_head_.ex_len.v16);
} else {
(*dp) >> ws_head_.ex_len.v32;
ws_head_.ex_len.v32 = ntohl((u_long)ws_head_.ex_len.v32);
}
}
ws_head_.rl = 1;
}
//读取MKEY
if (!ws_head_.rk) {
if (ws_head_.mask) {
//这个包不够一个key
if (dp->getAvaliableLength() < 4) {
if (MergePacketList(dpit)) continue;
else break;
}
(*dp) >> ws_head_.mkey[0];
(*dp) >> ws_head_.mkey[1];
(*dp) >> ws_head_.mkey[2];
(*dp) >> ws_head_.mkey[3];
}
ws_head_.rk = 1;
}
//读取数据段
uint64_t data_len = ws_head_.GetLen();
if (dp->getAvaliableLength() < data_len) {
if (MergePacketList(dpit)) continue;
else break;
}
if (ws_head_.mask) {
char* dptr = dp->getOffsetPtr();
for (size_t i = 0; i < data_len; ++i) {
dptr[i] = dptr[i] ^ ws_head_.mkey[i % 4];
}
}
if (!OnRecv(dp->getOffsetPtr(), data_len)) {
return;
}
ws_head_.reset();
dp->adjustOffset(data_len);
//这个包读取完了
if (dp->getAvaliableLength() <= 0) {
recv_list_.pop_front();
SafeDelete(dp);
}
}
}
bool Client::OnRecv(const char* buf, size_t size) {
if (conn_status_ == CS_COMMUNICATE) {
if (ws_head_.opcode == OPCODE_CLR) {
Close();
return false;
}
if (size < 4 + 2) {
MSG_ERR("size is min");
return true;
}
//截去key
unsigned short tag = *((unsigned short*)buf);
if (tag != skey_) {
Close();
return false;
}
char* pdata = (char*)buf + sizeof(unsigned short);
size -= 2;
//截去验证
uint32_t check = *((uint32_t*)pdata);
pdata = pdata + sizeof(uint32_t);
size -= 4;
//发送给游戏服
static GameWorldClient* wgc = cli_mgr_->GetGameWorldClient();
DataPacket &pack = wgc->AllocProtoPacket(GM_DATA,net_id_.socket_,net_id_.index_,net_id_.gate_id_);
#ifdef _DEBUG
const unsigned char* proto = pdata;
OutputMsg(rmTip, "<[sock:%d,idx:%d] Recv(%d,%d)", fd_, GetSessionId(), *proto, *(proto+1));
#endif
pack.writeBuf(pdata, size);
wgc->flushProtoPacket(pack);
//MSG_ERR("size is [%d + 4 + 2]", size);
return true;
}
if (conn_status_ == CS_CONNED) { //刚连接上来
uint32_t tag = *((uint32_t*)buf);
if (tag != DEFAULT_TAG) {
Close();
return false;
}
skey_ = wrand(SHRT_MAX);
FlushWsPack((char *)&skey_, 2);
SendData();
conn_status_ = CS_COMMUNICATE;
}
return true;
}
void Client::FlushWsPack(const char* buf, size_t size) {
static DataPacket pack(&alloc);
pack.setLength(0);
pack << (uint8_t)0x82;//写头部
//写长度
if (size >= 126) {//7位放不下
if (size <= 0xFFFF) {//16位放
pack << (uint8_t)126;
pack << (uint16_t)htons((u_short)size);
} else {//64位放
pack << (uint8_t)127;
pack << (uint64_t)OrderSwap64(size);
}
} else {
pack << (uint8_t)size;
}
//写数据
pack.writeBuf(buf, size);
pack.setPosition(0);
Flush(pack.getOffsetPtr(), pack.getAvaliableLength());
}
void Client::OnGameWorldRecv(const char* buf, size_t size) {
DataPacket *dp = new DataPacket(&alloc);
(*dp) << (uint16_t)skey_;
#ifdef _DEBUG
const unsigned char* proto = buf;
OutputMsg(rmTip, ">[sock:%d,idx:%d] Send(%d,%d)", fd_, GetSessionId(), *proto, *(proto+1));
#endif
dp->writeBuf(buf, size);
dp->setPosition(0);
gw_recv_list_.push_back(dp);
}
bool Client::MergePacketList(std::list<DataPacket*>::iterator &dpit) {
auto sdpit = dpit++;
if (dpit == recv_list_.end()) return false;
DataPacket* sdp = *sdpit;
//合并第二个到第一个
sdp->writeBuf((*dpit)->getOffsetPtr(), (*dpit)->getAvaliableLength());
SafeDelete((*dpit));
recv_list_.erase(dpit);
return true;
}
bool Client::FindHttpParam(const char * param, const char * buf) {
while (*param == *buf) {
if (*(param + 1) == '\0') return true;
++param; ++buf;
}
return false;
}

View File

@@ -0,0 +1,106 @@
#pragma once
#include <list>
#define SEND_PACKET_MAX 1024*1024*8
#define DEFAULT_TAG 0xCA0FFFFF
enum WebSocketOpcode { //操作码定义类型
OPCODE_MID = 0x0,//标识一个中间数据包
OPCODE_TXT = 0x1,//标识一个text类型数据包
OPCODE_BIN = 0x2,//标识一个binary类型数据包
//0x3 - 7保留
OPCODE_CLR = 0x8,//标识一个断开连接类型数据包
OPCODE_PIN = 0x9,//标识一个ping类型数据包
OPCODE_PON = 0xA,//表示一个pong类型数据包
};
#pragma pack(push,1)
struct WebSocketHead {
uint8_t fin : 1;//标识是否为此消息的最后一个数据包
uint8_t rsv1 : 1;//保留位1
uint8_t rsv2 : 1;//保留位2
uint8_t rsv3 : 1;//保留位3
uint8_t opcode : 4;//操作码
uint8_t mask : 1; //是否需要掩码
uint8_t len : 7;//长度
union {
uint16_t v16;//长度为126时
uint32_t v32;//长度为127时
} ex_len;
uint8_t mkey[4];
uint8_t rh : 1;//head读取完成
uint8_t rl : 1;//len读取完成
uint8_t rk : 1;//mkey读取完成
uint8_t rs : 5;//扩展保留
WebSocketHead(void) { reset(); }
void reset(void) { memset(this,0,sizeof(WebSocketHead)); }
inline uint32_t GetLen(void) {
if (len == 126) {
return ex_len.v16;
} else if (len == 127) {
return ex_len.v32;
}
return len;
}
inline uint8_t GetLenNeedByte(void) {
if (len == 126) {
return 2;
} else if (len == 127) {
return 8;
}
return 0;
}
};
#pragma pack(pop)
enum ConnStatusDef {
CS_CONNED,//连接上
CS_COMMUNICATE,//通信状态
};
typedef std::list<DataPacket*> DataPacketList;
class Client {
public:
Client(GameClientMgr *cli_mgr, SOCKET s, sockaddr_in* addr);
~Client();
//设置阻塞模式。true表示阻塞false表示非阻塞返回值为socket错误号0表示成功
int SetBlockMode(const bool block);
void SetSessionId(const uint16_t sid) { net_id_.index_ = sid; }
uint16_t GetSessionId(void) { return net_id_.index_; }
NetId &GetNetId(void) { return net_id_; }
void RecvData(void);
bool SendData(void);
void WriteEvent(void);
void Flush(const char *buf, size_t len);
void SendNewSession(void);
void SendSessionClose(void);
void Close(void);
bool OnRecv(const char* buf, size_t size);
void FlushWsPack(const char* buf, size_t size);
void OnGameWorldRecv(const char* buf, size_t size);
inline SOCKET GetFd(void) { return fd_; }
inline bool IsClose(void) { return is_close_; }
void PacketHandle(void);
uint16_t GetSKey() { return skey_; }
protected:
void ShakeHandsHandle(const char* buf, int buflen);
private:
inline bool MergePacketList(std::list<DataPacket*>::iterator &dpit);
bool FindHttpParam(const char* param, const char* buf);
bool shake_hands_;//是否已经握手
SOCKET fd_; //套接字
bool is_close_; //是否已经关闭连接
sockaddr_in remote_addr_;//远程地址
DataPacketList recv_list_;//收到的包列表
DataPacket* send_packet_;//需要发包的缓冲区
DataPacketList gw_recv_list_;//从游戏服收到的包列表
WebSocketHead ws_head_;//包头
NetId net_id_;
uint8_t conn_status_;//连接状态
uint16_t skey_;//服务端KEY
static BaseAllocator alloc;
GameClientMgr* cli_mgr_;
char real_ip[64];
};

View File

@@ -0,0 +1,67 @@
#include "StdAfx.h"
#include "client_obj_mgr.h"
#include <map>
ClientObjMgr::ClientObjMgr() {
cur_idx_ = 0;
max_session_ = 0;
}
ClientObjMgr::~ClientObjMgr() {
flush();
for (auto cli:client_list_) {
SafeDelete(cli.second);
}
client_list_.clear();
}
void ClientObjMgr::SetMaxSession(int max_session) {
max_session_ = max_session;
}
bool ClientObjMgr::setNewClient(Client *cli) {
client_lock_.Lock();
if (max_session_ <= cur_idx_) return false;
uint16_t index = 0;
if (free_cli_idx_.empty()) {
index = cur_idx_++;
} else {
index = free_cli_idx_.front();
free_cli_idx_.pop_front();
}
cli->SetSessionId(index);
client_append_list_.push_back(cli);
client_lock_.Unlock();
return true;
}
void ClientObjMgr::flush(void) {
client_lock_.Lock();
for (auto it:client_append_list_) {
client_list_.insert(std::make_pair(it->GetSessionId(), it));
}
client_append_list_.clear();
client_lock_.Unlock();
}
Client* ClientObjMgr::get(uint16_t index) {
auto it = client_list_.find(index);
if (it == client_list_.end()) return NULL;
return it->second;
}
Client * ClientObjMgr::remove(uint16_t index) {
auto it = client_list_.find(index);
if (it == client_list_.end()) return NULL;
Client *cli = it->second;
client_list_.erase(it);
client_lock_.Lock();
if (index == cur_idx_ - 1) {
--cur_idx_;
} else {
free_cli_idx_.push_back(index);
}
client_lock_.Unlock();
return cli;
}

View File

@@ -0,0 +1,24 @@
#pragma once
#include <map>
class ClientObjMgr {
public:
ClientObjMgr();
~ClientObjMgr();
void SetMaxSession(int max_session);
bool setNewClient(Client *cli);
void flush(void);
std::map<uint16_t, Client*> &getClientMap(void) {
return client_list_;
}
Client* get(uint16_t index);
Client* remove(uint16_t index);
private:
uint16_t max_session_;//<2F><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t cur_idx_;
std::list<uint16_t> free_cli_idx_;//<2F><><EFBFBD>еĿͻ<C4BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<Client*> client_append_list_;
Mutex client_lock_; //<2F>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>append_list<73><74>
std::map<uint16_t, Client*> client_list_;
};

View File

@@ -0,0 +1,78 @@
#include "StdAfx.h"
#include "ws_gate_config.h"
const char WsGateConfig::ConfigFileName[] = ("GateWay.txt");
WsGateConfig::WsGateConfig(){
}
WsGateConfig::~WsGateConfig() {
}
void WsGateConfig::showError(const char* err) {
SetErrDesc(err);
RefString s = ("[Config Error]");
s += err;
throw s;
}
bool WsGateConfig::loadServerConfig(GateServer * gate_srv)
{
using namespace stream;
MemoryStream ms(NULL);
try {
if (ms.loadFromFile(ConfigFileName) <= 0) {
showError("unable to load config from file GateWay.txt");
return false;
}
if (!setScript((const char*)ms.getMemory())) {
showError("parse config script failed");
return false;
}
if (openGlobalTable("GateServer")) {
if (enumTableFirst()) {
char str[32];
GameClientMgr* gcmgr = NULL;
do {
if (openFieldTable("LocalService")) {
getFieldStringBuffer(("ServerName"), str, sizeof(str));
gcmgr = gate_srv->AddGameClientMgr(str);
getFieldStringBuffer(("Address"), str, sizeof(str));
gcmgr->SetServiceHost(str);
int port = getFieldInt("Port");
gcmgr->SetServicePort(port);
gcmgr->SetMaxSession(getFieldInt("MaxSession"));
closeTable();
}
if (gcmgr && openFieldTable("BackServer")) {
getFieldStringBuffer(("Host"), str, sizeof(str));
int port = getFieldInt("Port");
gcmgr->InitGameWorldClient(str, port);
closeTable();
}
} while (enumTableNext());
}
closeTable();
}
} catch (RefString& s) {
OutputMsg(rmNormal, s.rawStr());
} catch (...) {
MSG_ERR("unexpected error on load config");
}
return true;
}

View File

@@ -0,0 +1,18 @@
#pragma once
class BaseLuaConfig;
class WsGateConfig :
public BaseLuaConfig {
public:
WsGateConfig();
~WsGateConfig();
static const char ConfigFileName[]; //定义配置文件名称
//加载并读取服务器服务配置
bool loadServerConfig(GateServer *gate_srv);
protected:
void showError(const char* err);
};

View File

@@ -0,0 +1,18 @@
#include "StdAfx.h"
#include "base_event.h"
BaseEvent::BaseEvent(GameClientMgr* cli_mgr)
:cli_mgr_(cli_mgr) {
}
BaseEvent::~BaseEvent()
{
}
bool BaseEvent::init(void) {
return true;
}
void BaseEvent::RunOne(void) {
}

View File

@@ -0,0 +1,16 @@
#pragma once
class BaseEvent
{
public:
BaseEvent(GameClientMgr* cli_mgr);
~BaseEvent();
virtual bool init(void);
virtual void RunOne(void);
virtual void AddReadFd(SOCKET fd, void *ptr = NULL) {}
virtual void DelFd(SOCKET fd, void *ptr = NULL) {}
virtual void AddWriteFd(SOCKET fd, void *ptr = NULL) {}
protected:
GameClientMgr* cli_mgr_;
};

View File

@@ -0,0 +1,52 @@
#include "StdAfx.h"
#include "epoll_event.h"
#ifndef _MSC_VER
EpollEvent::EpollEvent(GameClientMgr* cli_mgr) : BaseEvent(cli_mgr) {
epollfd_ = 0;
listen_fd_ = 0;
}
EpollEvent::~EpollEvent() {
if (epollfd_) {
close(epollfd_);
}
}
bool EpollEvent::init(void) {
epollfd_ = epoll_create(EPOLLEVENTS);
return true;
}
void EpollEvent::RunOne(void) {
int ret = epoll_wait(epollfd_, events_, EPOLLEVENTS, 0);
for (int i = 0; i < ret; i++) {
if (Client *ptr = (Client*)events_[i].data.ptr)
{
if (events_[i].events & EPOLLIN) {
cli_mgr_->HandleReadEvent(ptr->GetFd(), ptr);
} else if (events_[i].events & EPOLLOUT) {
cli_mgr_->HandleWriteEvent(ptr->GetFd(), ptr);
}
}
}
}
void EpollEvent::AddReadFd(SOCKET fd, void *ptr) {
struct epoll_event ev;
ev.events = EPOLLIN;
ev.data.ptr = ptr;
epoll_ctl(epollfd_, EPOLL_CTL_ADD, fd, &ev);
}
void EpollEvent::DelFd(SOCKET fd, void *ptr) {
epoll_ctl(epollfd_, EPOLL_CTL_DEL, fd, NULL);
}
void EpollEvent::AddWriteFd(SOCKET fd, void *ptr) {
struct epoll_event ev;
ev.events = EPOLLIN | EPOLLOUT;
ev.data.ptr = ptr;
epoll_ctl(epollfd_, EPOLL_CTL_MOD, fd, &ev);
}
#endif

View File

@@ -0,0 +1,22 @@
#pragma once
#ifndef _MSC_VER
#include "base_event.h"
#include <sys/epoll.h>
#define EPOLLEVENTS 1024
class EpollEvent :
public BaseEvent {
public:
EpollEvent(GameClientMgr* cli_mgr);
~EpollEvent();
virtual bool init(void);
virtual void RunOne(void);
virtual void AddReadFd(SOCKET fd, void *ptr = NULL);
virtual void DelFd(SOCKET fd, void *ptr = NULL);
virtual void AddWriteFd(SOCKET fd, void *ptr = NULL);
private:
SOCKET epollfd_;
SOCKET listen_fd_;
struct epoll_event events_[EPOLLEVENTS];
};
#endif

View File

@@ -0,0 +1,13 @@
#include "StdAfx.h"
#include "select_event.h"
SelectEvent::SelectEvent(GameClientMgr* cli_mgr) : BaseEvent(cli_mgr){
}
SelectEvent::~SelectEvent() {
}
void SelectEvent::RunOne(void) {
cli_mgr_->ProssClient();
}

View File

@@ -0,0 +1,11 @@
#pragma once
#include "base_event.h"
#include <map>
class SelectEvent : public BaseEvent {
public:
typedef std::map<SOCKET, void*> FdPtrMap;
SelectEvent(GameClientMgr* cli_mgr);
~SelectEvent();
virtual void RunOne(void);
};

View File

@@ -0,0 +1,144 @@
#include "StdAfx.h"
#include "game_world_client.h"
GameWorldClient::GameWorldClient(GateServer* serv, GameClientMgr* gcmgr, const char* name) :
NetClient(name),
serv_(serv),
gcmgr_(gcmgr) {
SetClientName(name);
free_.setLock(&lock_);
}
GameWorldClient::~GameWorldClient() {
free_.flush();
for (int i = 0; i < free_.count(); i++)
{
DataPacket* dp = free_[i];
dp->setPosition(0);
Flush(*dp);
}
free_.clear();
}
void GameWorldClient::OnRecv(const uint16_t cmd, char * buf, int size)
{
GATEMSGHDR* hdr = (GATEMSGHDR*)buf;
buf = (char*)(hdr + 1);
switch (cmd) {
case GM_DATA: {
//NetId net_id;
//net_id.socket_ = hdr->nSocket;
//net_id.index_ = hdr->wSessionIdx;
//net_id.gate_id_ = hdr->wServerIdx;
DataPacket *dp = AllocPostPacket();
dp->writeBuf(buf , size);
dp->setPosition(0);
GateInterMsg msg;
msg.msg_id_ = gcGWData;
msg.data_.index_ = hdr->wSessionIdx;
msg.data_.packet_ = dp;
gcmgr_->PostMsg(msg);
break;
}
case GM_CLOSE: {
GateInterMsg msg;
msg.msg_id_ = gcGWClose;
msg.data_.index_ = hdr->wSessionIdx;
gcmgr_->PostMsg(msg);
break;
}
case GM_SERVERUSERINDEX: {
GateInterMsg msg;
msg.msg_id_ = gcServerIdx;
msg.data_.idx_ = hdr->wSessionIdx;
msg.data_.para_ = hdr->wServerIdx;
gcmgr_->PostMsg(msg);
break;
}
case GM_CHECKCLIENT: {
break;
}
default:
MSG_LOG("not handle gameword cmd:%d", cmd);
break;
}
}
void GameWorldClient::OnChannelMsg(char* buf, int size) {
Channel info = *((Channel*)buf);
switch (info.type) {
case ccBroadCast: {
uint8_t nsize = sizeof(Channel);
DataPacket *dp = AllocPostPacket();
dp->writeBuf(buf + nsize, size - nsize);
dp->setPosition(0);
GateInterMsg msg;
msg.msg_id_ = gcChBro;
msg.data_.b_channel_ = info.channelId;
msg.data_.b_para_ = info.para;
msg.data_.dp_ = dp;
gcmgr_->PostMsg(msg);
break;
}
case ccAddUser: {
GateInterMsg msg;
msg.msg_id_ = gcChAdd;
msg.data_.channel_ = info.channelId;
msg.data_.para_ = info.para;
msg.data_.idx_ = info.index_;
gcmgr_->PostMsg(msg);
break;
}
case ccDelUser: {
GateInterMsg msg;
msg.msg_id_ = gcChDel;
msg.data_.channel_ = info.channelId;
msg.data_.para_ = info.para;
msg.data_.idx_ = info.index_;
gcmgr_->PostMsg(msg);
break;
}
default:
MSG_LOG("not handle channel type:%d", info.type);
break;
}
}
int GameWorldClient::GetLocalServerType() {
return SrvDef::GateServer;
}
const char * GameWorldClient::GetLocalServerName() {
return gcmgr_->GetServiceName();
}
void GameWorldClient::OnDisconnected() {
GateInterMsg msg;
msg.msg_id_ = gcGWDisconn;
gcmgr_->PostMsg(msg);
}
void GameWorldClient::FreeBackUserDataPacket(DataPacket* pack) {
free_.append(pack);
}
DataPacket* GameWorldClient::AllocPostPacket()
{
if (free_.count() <= 0)
{
free_.flush();
}
if (free_.count() <= 0)
{
AllocSendPack(&free_, 512);
}
DataPacket* dp = free_.pop();//<2F>õ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>Datapacket
dp->setLength(0);
return dp;
}

View File

@@ -0,0 +1,34 @@
#pragma once
struct Channel {
int type;// == 0 ? ccAddUser : ccDelUser;
int channelId;
int para;
int index_;
};
class GameWorldClient :
public NetClient
{
public:
GameWorldClient(GateServer* serv, GameClientMgr* gcmgr, const char* name);
~GameWorldClient();
// 回收空闲的CDataPacket类
void FreeBackUserDataPacket(DataPacket* pack);
protected:
// 以下是实现基类的虚函数
virtual void OnRecv(const uint16_t cmd, char* buf, int size);
void OnChannelMsg(char* buf, int size);
virtual int GetLocalServerType();
/* 查询本地服务器的名称,以便正确的发送注册数据 */
virtual const char* GetLocalServerName();
virtual void OnDisconnected();
private:
// 分配一个包,这个包传递给游戏主逻辑处理
DataPacket* AllocPostPacket();
private:
QueueList<DataPacket*> free_; //用来存放空闲的数据包
Mutex lock_;
GateServer* serv_;
GameClientMgr* gcmgr_;
};

View File

@@ -0,0 +1,12 @@
#pragma once
#include <syscall.h>
#define GetCurrentThreadId() syscall(SYS_gettid)
#define MSG_LOG(format, ...) OutputMsg(rmNormal, "[%s:%d %s] "#format, __FILE__, __LINE__, __FUNCTION__,##__VA_ARGS__);
#define MSG_WAR(format, ...) OutputMsg(rmWarning, "[%s:%d %s] "#format, __FILE__, __LINE__, __FUNCTION__,##__VA_ARGS__);
#define MSG_TIP(format, ...) OutputMsg(rmTip, "[%s:%d %s] "#format, __FILE__, __LINE__, __FUNCTION__,##__VA_ARGS__);
#define MSG_ERR(format, ...) OutputMsg(rmError, "[%s:%d %s] "#format, __FILE__, __LINE__, __FUNCTION__,##__VA_ARGS__);
#define OrderSwap16(A) (((uint16_t)(A) >> 8) | ((uint16_t)(A & 0xFF) << 8))
#define OrderSwap32(A) (OrderSwap16((uint32_t)(A) >> 16) | ((uint32_t)(OrderSwap16(A)) << 16))
#define OrderSwap64(A) (OrderSwap32((uint64_t)(A) >> 32) | ((uint64_t)(OrderSwap32(A)) << 32));

View File

@@ -0,0 +1,38 @@
#include "StdAfx.h"
GateServer::GateServer() {
GateServer::Instance = this;
GetSystemTime(cur_sys_time_);
now_sec_.encode(cur_sys_time_);
}
GateServer::~GateServer() {
for (auto gcmgr : game_client_mgr_) {
SafeDelete(gcmgr);
}
game_client_mgr_.clear();
}
bool GateServer::StartServer() {
MSG_LOG("start server...................");
for (auto gcmgr : game_client_mgr_) {
gcmgr->Startup();
}
return true;
}
void GateServer::StopServer() {
MSG_LOG("stop server................... start");
for (auto gcmgr : game_client_mgr_) {
gcmgr->Stop();
}
MSG_LOG("stop server................... ok");
}
GameClientMgr* GateServer::AddGameClientMgr(const char *name)
{
GameClientMgr* gcmgr = new GameClientMgr(name, this);
gcmgr->SetServiceName(name);
game_client_mgr_.push_back(gcmgr);
return gcmgr;
}

View File

@@ -0,0 +1,31 @@
#pragma once
class GameClientMgr;
class GateServer {
public:
GateServer();
~GateServer();
//启动服务器
bool StartServer();
//停止服务器
void StopServer();
//获取同步的逻辑短日期时间值
inline unsigned int getMiniDateTime() {
GetSystemTime(cur_sys_time_);
now_sec_.encode(cur_sys_time_);
return now_sec_;
}
GameClientMgr* AddGameClientMgr(const char *name);
public:
static GateServer* Instance;
private:
std::vector<GameClientMgr*> game_client_mgr_;//游戏客户端管理类
SYSTEMTIME cur_sys_time_;
SecondTime now_sec_; //当前短日期时间
};

148
Gateway/gateway/main.cc Normal file
View File

@@ -0,0 +1,148 @@
#include "StdAfx.h"
#include <signal.h>
void Exit() {
#ifdef _MLIB_DUMP_MEMORY_LEAKS_
_CrtDumpMemoryLeaks();
#endif
}
#ifdef _MSC_VER
const char szExceptionDumpFile[] = ".\\wsgate.dmp";
#endif
bool SetupLogicServerConfig(GateServer* gate_srv);
void ServerMain();
GateServer* GateServer::Instance = NULL;
void sighup_handler(int) {
MSG_TIP("log the perfermance ");
MemoryCounter::getSingleton().logToFile();
}
bool runing = false;
void sigterm_handler(int arg) {
sighup_handler(arg);
runing = false;
}
int main(int argc, char** argv) {
winitseed((unsigned int)time(NULL));
#ifdef _MSC_VER
//初始化网络库
int err = WorkSocket::InitSocketLib();
if (err) {
MSG_ERR("initialize inet library failure");
return 0;
}
SetMiniDumpFlag(MiniDumpWithFullMemory, szExceptionDumpFile);
SetUnhandledExceptionFilter(DefaultUnHandleExceptionFilter);
#else
//改为正确的启动目录
const int MAX_PATH = 256;
char startDir[MAX_PATH];
FDOP::ExtractFileDirectory(argv[1], startDir, MAX_PATH - 1);
//merge
char dir[MAX_PATH];
if (startDir[0] == '/') {
SNPRINTFA(dir, MAX_PATH - 1, "%s", startDir);
} else {
char p[MAX_PATH];
getcwd(p, MAX_PATH - 1);
SNPRINTFA(dir, MAX_PATH - 1, "%s/%s", p, startDir);
}
int err = chdir(dir);
printf("chdir:%s, ret:%d\n", dir, err);
//daemon(1, 0);
#endif
InitDefMsgOut();
#ifdef _MSC_VER
TimeProfMgr::getSingleton().InitMgr();
#endif
ServerMain();
MemoryCounter::getSingleton().logToFile();
#ifdef _MSC_VER
TimeProfMgr::getSingleton().clear();
WorkSocket::UnintSocketLib();
#endif
MemoryCounter::getSingleton().clear();
UninitDefMsgOut();
return 0;
}
void ServerMain() {
//设置窗口标题
#ifdef _MSC_VER
SetConsoleTitle("gateway");
#endif
char logpath[256] = "./log/";
if (!FDOP::FileExists(logpath)) {
FDOP::DeepCreateDirectory(logpath);
}
FileLogger flog(("./log/gateway"));
GateServer::Instance = new GateServer();
if (SetupLogicServerConfig(GateServer::Instance)) {
if (GateServer::Instance->StartServer()) {
MSG_TIP("===========================");
MSG_TIP("gateway start ok");
MSG_TIP("quit:stop server and exit");
MSG_TIP("===========================");
#ifndef _MSC_VER
runing = true;
signal(SIGTERM, sigterm_handler);
signal(SIGPIPE, SIG_IGN);
signal(SIGHUP, sighup_handler);
#endif
while (true) {
#ifdef _MSC_VER
char cmd_buf[512];
//gets(cmd_buf);
scanf("%s", cmd_buf);
if (cmd_buf == NULL || *cmd_buf == 0) {
Sleep(500);
continue;
}
if (strncmp(cmd_buf, ("\\q"), 2) == 0
|| strncmp(cmd_buf, ("exit"), 4) == 0
|| strncmp(cmd_buf, ("quit"), 4) == 0) {
sighup_handler(0);
MSG_TIP("stop gate...");
break;
} else if (strncmp(cmd_buf, "spf", 3) == 0) {
sighup_handler(0);
} else if (strncmp(cmd_buf, "dmp", 3) == 0) {
DebugBreak();
}
#else
if (!runing) break;
#endif
Sleep(10);
}
GateServer::Instance->StopServer();
} else {
MSG_ERR("Press Any Key To Exit...\n");
getc(stdin);
}
}
delete GateServer::Instance;
MSG_LOG("delete GateServer::Instance");
}
bool SetupLogicServerConfig(GateServer* gate_srv) {
WsGateConfig config;
return config.loadServerConfig(gate_srv);
}

View File

@@ -0,0 +1,235 @@
#include "StdAfx.h"
#include <map>
#include "client/client_obj_mgr.h"
#include "event/select_event.h"
#include "event/epoll_event.h"
GameClientMgr::GameClientMgr(const char *name, GateServer *srv) {
srv_ = srv;
gw_cli_ = new GameWorldClient(srv, this, name);
cli_obj_mgr_ = new ClientObjMgr();
inner_msg_list_.setLock(&inner_msg_lock_);
#if USE_EPOLL
event_ = new EpollEvent(this);
#else
event_ = new SelectEvent(this);
#endif
}
GameClientMgr::~GameClientMgr() {
cli_obj_mgr_->flush();
SafeDelete(cli_obj_mgr_);
inner_msg_list_.flush();
inner_msg_list_.clear();
SafeDelete(gw_cli_);
}
void GameClientMgr::SetMaxSession(int max_session) {
cli_obj_mgr_->SetMaxSession(max_session);
}
void GameClientMgr::InitGameWorldClient(const char * ip, int port) {
gw_cli_ = new GameWorldClient(srv_, this, GetServiceName());
gw_cli_->UseBaseAlloc(true);
gw_cli_->SetHost(ip);
gw_cli_->SetPort(port);
}
bool GameClientMgr::onConnect(SOCKET nSocket, sockaddr_in * pAddrIn) {
if (!gw_cli_->connected()) return false;
Client *cli = new Client(this, nSocket, pAddrIn);
cli_obj_mgr_->setNewClient(cli);
cli_obj_mgr_->flush();
cli->SetBlockMode(false);
GateInterMsg msg;
msg.msg_id_ = gcAddClient;
msg.data_.fd_ = nSocket;
msg.data_.sessidx_ = cli->GetSessionId();
PostMsg(msg);
OutputMsg(rmTip, _T("[Login] (1) 客户端连接上来: gatekey(%d)socket(%lld)GateIdx(%d)LogicIdx(%d)CurrentThreadId(%d)。"),
cli->GetSKey(), nSocket, cli->GetNetId().index_, cli->GetNetId().gate_id_, GetCurrentThreadId());
//MSG_TIP("new client connect fd:%d, sid:%d", cli->GetFd(), cli->GetSessionId());
return true;
}
int GameClientMgr::Run() {
inner_msg_list_.flush();
int count = inner_msg_list_.count();
for (int i = 0; i < count; ++i)
{
GateInterMsg& msg = inner_msg_list_[i];
OnRecvSysMsg(msg);
}
inner_msg_list_.clear();
event_->RunOne();
return count;
}
void GameClientMgr::OnStart() {
MSG_LOG("GameClientMgr::OnStart");
event_->init();
}
void GameClientMgr::OnStop() {
MSG_LOG("GameClientMgr::OnStop");
}
void GameClientMgr::Stop() {
MSG_LOG("%s, start", GetServiceName());
while (gw_cli_->GetPacketCount()) {//这里还有包没发完,导致一致没法停止
gw_cli_->SingleRun();
Sleep(1);
}
gw_cli_->Stop();
Inherited::Stop();
MSG_LOG("%s, ok", GetServiceName());
}
void GameClientMgr::OnRecvSysMsg(GateInterMsg & msg)
{
switch (msg.msg_id_)
{
case gcAddClient:
{
event_->AddReadFd(msg.data_.fd_, cli_obj_mgr_->get(msg.data_.sessidx_));
break;
}
case gcServerIdx:
{
Client* cli = cli_obj_mgr_->get(msg.data_.idx_);
if (cli) {
cli->GetNetId().gate_id_ = msg.data_.para_;
OutputMsg(rmTip, _T("[Login] (5) LogicServer已成功添加玩家Gate gatekey(%d)socket(%lld)GateIdx(%d)LogicIdx(%d)CurrentThreadId(%d)。"),
cli->GetSKey(), cli->GetNetId().socket_, cli->GetNetId().index_, cli->GetNetId().gate_id_, GetCurrentThreadId());
}
break;
}
case gcGWData:
{
Client* cli = cli_obj_mgr_->get(msg.data_.index_);
if (cli) {
auto dp = msg.data_.packet_;
cli->OnGameWorldRecv(dp->getOffsetPtr(), dp->getAvaliableLength());
}
gw_cli_->FreeBackUserDataPacket(msg.data_.packet_);
break;
}
case gcGWClose:
{
Client* cli = cli_obj_mgr_->get(msg.data_.index_);
if (cli) {
cli->Close();
}
break;
}
case gcChAdd:
{
uint64_t key = MAKEINT64(msg.data_.channel_, msg.data_.para_);
channel_indexs_map_[key].insert(msg.data_.idx_);
break;
}
case gcChDel:
{
uint64_t key = MAKEINT64(msg.data_.channel_, msg.data_.para_);
channel_indexs_map_[key].erase(msg.data_.idx_);
break;
}
case gcChBro:
{
uint64_t key = MAKEINT64(msg.data_.b_channel_, msg.data_.b_para_);
auto &list = channel_indexs_map_[key];
for (auto idx:list) {
Client* cli = cli_obj_mgr_->get(idx);
if (cli) {
auto dp = msg.data_.packet_;
cli->OnGameWorldRecv(dp->getOffsetPtr(), dp->getAvaliableLength());
}
}
gw_cli_->FreeBackUserDataPacket(msg.data_.dp_);
break;
}
case gcGWDisconn:
{
CloseAllClient();
break;
}
}
}
void GameClientMgr::ProssClient(void) {
//cli_obj_mgr_->flush();
auto &list = cli_obj_mgr_->getClientMap();
std::vector<uint16_t> remove_list;
for (auto it:list) {
Client *cli = it.second;
if(cli)
{
if (cli->IsClose()) {
remove_list.push_back(cli->GetSessionId());
continue;
}
cli->RecvData();
cli->PacketHandle();
cli->WriteEvent();
cli->SendData();
}
}
for (auto idx: remove_list) {
Client *cli = cli_obj_mgr_->remove(idx);
SafeDelete(cli);
}
remove_list.clear();
}
void GameClientMgr::HandleReadEvent(SOCKET fd, Client * cli) {
if (cli) {
cli->RecvData();
cli->PacketHandle();
event_->AddWriteFd(fd, cli);
}
}
void GameClientMgr::HandleWriteEvent(SOCKET fd, Client * cli) {
if (cli) {
cli->WriteEvent();
if (!cli->SendData()) {
event_->AddWriteFd(fd, cli);
}
}
}
void GameClientMgr::CloseAllClient() {
cli_obj_mgr_->flush();
auto &list = cli_obj_mgr_->getClientMap();
std::vector<uint16_t> remove_list;
for (auto it : list) {
Client *cli = it.second;
cli->Close();
}
}
void GameClientMgr::HaveData(Client * cli) {
if(cli) {
event_->AddWriteFd(cli->GetFd(), cli);
}
}
void GameClientMgr::CloseClient(Client * cli) {
event_->DelFd(cli->GetFd());
closesocket(cli->GetFd());
if (cli_obj_mgr_->get(cli->GetSessionId()))
{
cli_obj_mgr_->remove(cli->GetSessionId());
}
}
bool GameClientMgr::Startup() {
if (!Inherited::Startup()) {
return false;
}
// 创建发送线程
return gw_cli_->Startup();
}

View File

@@ -0,0 +1,95 @@
#pragma once
#include <map>
#include <set>
typedef union GateInterMsgData {
struct {
uint32_t b_channel_;
uint32_t b_para_;
DataPacket* dp_;
};
struct {
uint32_t index_;
DataPacket* packet_;
};
struct {
uint32_t idx_;
uint32_t para_;
uint32_t channel_;
};
struct {
uint32_t sessidx_;
SOCKET fd_;
};
} tagGateInterMsgData;
typedef struct GateInterMsg
{
int msg_id_;
GateInterMsgData data_;
} tagGateInterMsg;
class GameWorldClient;
class BaseEvent;
class SocketSrv;
class ClientObjMgr;
enum {
gcAddClient = 1, //增加一个新的客户端连接
gcGWData = 2, //游戏服给客户端发消息
gcGWClose = 3, //游戏服主动关闭客户端
gcChBro = 4,//频道广播消息
gcChAdd = 5,//频道信息增加
gcChDel = 6,//频道信息删除
gcGWDisconn = 7,//游戏服断开连接
gcServerIdx = 8,//游戏服的玩家对应gateid
};
class GameClientMgr : public SocketSrv {
public:
typedef SocketSrv Inherited;
GameClientMgr(const char *name, GateServer *srv);
~GameClientMgr();
void SetMaxSession(int max_session);
bool Startup();
void InitGameWorldClient(const char *ip, int port);
GameWorldClient* GetGameWorldClient(void) { return gw_cli_; }
virtual bool onConnect(SOCKET nSocket, sockaddr_in* pAddrIn);
//单次逻辑处理
virtual int Run();
virtual void OnStart();
virtual void OnStop();
virtual void Stop();
void PostMsg(GateInterMsg& msg) {
inner_msg_list_.append(msg);
}
void OnRecvSysMsg(GateInterMsg& msg);
//select模式使用
void ProssClient(void);
//epoll模式使用
void HandleReadEvent(SOCKET fd, Client* cli);
void HandleWriteEvent(SOCKET fd, Client* cli);
//断开所有客户端连接
void CloseAllClient();
void HaveData(Client* cli);
void CloseClient(Client *cli);
protected:
GateServer *srv_;
GameWorldClient *gw_cli_;
ClientObjMgr *cli_obj_mgr_;
std::map<uint64_t, std::set<int> > channel_indexs_map_;
QueueList<GateInterMsg> inner_msg_list_;//内部消息列表
Mutex inner_msg_lock_;//内部消息列表锁
BaseEvent *event_;//事件处理
};

View File

@@ -0,0 +1,148 @@
#ifdef _MSC_VER
#include <Windows.h>
#include <process.h>
#else
#include <pthread.h>
#endif
#include "StdAfx.h"
#include "socket_srv.h"
SocketSrv::SocketSrv() {
srv_stoped_ = true;
memset(server_name_, 0, sizeof(server_name_));
#ifdef _MSC_VER
accept_thread_ = NULL;
#else
accept_thread_ = 0;
#endif
accept_exit_ = true;
}
SocketSrv::~SocketSrv()
{
#ifdef _MSC_VER
if (NULL != accept_thread_) {
CloseHandle(accept_thread_);
}
accept_thread_ = NULL;
#else
accept_thread_ = 0;
#endif
}
#ifdef _MSC_VER
void STDCALL SocketSrv::ServerSocketAcceptThreadRoutine(void* arg) {
#else
void * SocketSrv::ServerSocketAcceptThreadRoutine(void * arg) {
#endif
SocketSrv *srv = (SocketSrv*)arg;
struct sockaddr_in server_addr;
SOCKET listen_fd_ = 0;
if ((listen_fd_ = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR) {
MSG_ERR("create socket error:%d",errno);
assert(false);
}
#ifdef _MSC_VER
char optval = 1;
#else
int optval = 1;
#endif
if (setsockopt(listen_fd_, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == SOCKET_ERROR) {
MSG_ERR("setsockopt");
assert(false);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(srv->GetServicePort());
server_addr.sin_addr.s_addr = inet_addr(srv->GetServiceHost());
memset(server_addr.sin_zero, 0, sizeof(server_addr.sin_zero));
if (::bind(listen_fd_, (struct sockaddr *)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) {
MSG_ERR("bind error");
assert(false);
}
if (listen(listen_fd_, 5) == SOCKET_ERROR) {
MSG_ERR("listen error");
assert(false);
}
socklen_t len = sizeof(sockaddr);
do {
sockaddr_in cli_addr;
SOCKET nSocket = accept(listen_fd_, (sockaddr*)&cli_addr, &len);
if (srv->Started() && !srv->onConnect(nSocket, &cli_addr)) {
closesocket(nSocket);
}
} while (srv->Started());
closesocket(listen_fd_);
srv->accept_exit_ = true;
#ifdef _MSC_VER
ExitThread(0);//设置线程退出返回值
#else
return NULL;
#endif
}
void SocketSrv::SetServiceName(const char * sName)
{
_STRNCPY_A(server_name_, sName);
}
void SocketSrv::SetServiceHost(const char * sHost)
{
_STRNCPY_A(host_, sHost);
}
void SocketSrv::SetServicePort(const int nPort) {
port_ = nPort;
}
bool SocketSrv::Startup() {
Inherited:Start();
bool ret = true;
int err = 0;
srv_stoped_ = false;
#ifdef _MSC_VER
accept_thread_ = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ServerSocketAcceptThreadRoutine, this, 0, NULL);
if (!accept_thread_) {
err = GetLastError();
ret = false;
}
#else
if (pthread_create(&accept_thread_, NULL, ServerSocketAcceptThreadRoutine, this)) {
err = errno;
ret = false;
}
#endif
if (!ret) {
MSG_ERR("create listen thread error %d", err);
return false;
}
accept_exit_ = false;
return true;
}
void SocketSrv::Stop() {
if (srv_stoped_) return;
MSG_LOG("start");
srv_stoped_ = true;
// while (!accept_exit_) {
// Sleep(1);
// }
//#ifdef _MSC_VER
// CloseThread(accept_thread_);
//#endif
Inherited::Stop();
MSG_LOG("ok");
}
void SocketSrv::OnRoutine() {
OnStart();
while (!terminated()) {
if (Run() <= 0)
Sleep(1);
}
OnStop();
}

View File

@@ -0,0 +1,55 @@
#pragma once
class SocketSrv : public thread::BaseThread {
public:
typedef thread::BaseThread Inherited;
SocketSrv();
~SocketSrv();
#ifdef _MSC_VER
static void STDCALL ServerSocketAcceptThreadRoutine(void* srv);
#else
static void* ServerSocketAcceptThreadRoutine(void* arg);
#endif
virtual bool onConnect(SOCKET nSocket, sockaddr_in* pAddrIn) = 0;
virtual void OnRoutine();
//单次逻辑处理
virtual int Run() = 0;
virtual void OnStart() = 0;
virtual void OnStop() = 0;
inline const char* GetServiceName()
{
return server_name_;
}
inline const char* GetServiceHost()
{
return host_;
}
inline int GetServicePort()
{
return port_;
}
inline bool Started()
{
return !srv_stoped_;
}
void SetServiceName(const char* sName);
void SetServiceHost(const char* sHost);
void SetServicePort(const int nPort);
bool Startup();
virtual void Stop();
private:
#ifdef _MSC_VER
HANDLE accept_thread_; //接受客户端连接线程
#else
pthread_t accept_thread_;
#endif
bool srv_stoped_; //是否停止工作线程
bool accept_exit_; //监听线程完整退出
char server_name_[256]; //服务名称
char host_[256]; //服务绑定地址
int port_; //服务绑定端口
};

BIN
Gateway/libs/common.lib Normal file

Binary file not shown.

BIN
Gateway/libs/common.pdb Normal file

Binary file not shown.

BIN
Gateway/libs/libmysql.dll Normal file

Binary file not shown.

BIN
Gateway/libs/libmysql.lib Normal file

Binary file not shown.

Binary file not shown.

BIN
Gateway/srvlib/.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,108 @@
MANIFEST contents of Lua 5.1 distribution on Mon Feb 20 11:37:30 BRT 2006
lua-5.1
lua-5.1/COPYRIGHT
lua-5.1/HISTORY
lua-5.1/INSTALL
lua-5.1/MANIFEST
lua-5.1/Makefile
lua-5.1/README
lua-5.1/doc
lua-5.1/doc/contents.html
lua-5.1/doc/logo.gif
lua-5.1/doc/lua.1
lua-5.1/doc/lua.css
lua-5.1/doc/lua.html
lua-5.1/doc/luac.1
lua-5.1/doc/luac.html
lua-5.1/doc/manual.html
lua-5.1/doc/readme.html
lua-5.1/etc
lua-5.1/etc/Makefile
lua-5.1/etc/README
lua-5.1/etc/all.c
lua-5.1/etc/lua.hpp
lua-5.1/etc/lua.ico
lua-5.1/etc/lua.pc
lua-5.1/etc/luavs.bat
lua-5.1/etc/min.c
lua-5.1/etc/noparser.c
lua-5.1/etc/strict.lua
lua-5.1/src
lua-5.1/src/Makefile
lua-5.1/src/lapi.c
lua-5.1/src/lapi.h
lua-5.1/src/lauxlib.c
lua-5.1/src/lauxlib.h
lua-5.1/src/lbaselib.c
lua-5.1/src/lcode.c
lua-5.1/src/lcode.h
lua-5.1/src/ldblib.c
lua-5.1/src/ldebug.c
lua-5.1/src/ldebug.h
lua-5.1/src/ldo.c
lua-5.1/src/ldo.h
lua-5.1/src/ldump.c
lua-5.1/src/lfunc.c
lua-5.1/src/lfunc.h
lua-5.1/src/lgc.c
lua-5.1/src/lgc.h
lua-5.1/src/linit.c
lua-5.1/src/liolib.c
lua-5.1/src/llex.c
lua-5.1/src/llex.h
lua-5.1/src/llimits.h
lua-5.1/src/lmathlib.c
lua-5.1/src/lmem.c
lua-5.1/src/lmem.h
lua-5.1/src/loadlib.c
lua-5.1/src/lobject.c
lua-5.1/src/lobject.h
lua-5.1/src/lopcodes.c
lua-5.1/src/lopcodes.h
lua-5.1/src/loslib.c
lua-5.1/src/lparser.c
lua-5.1/src/lparser.h
lua-5.1/src/lstate.c
lua-5.1/src/lstate.h
lua-5.1/src/lstring.c
lua-5.1/src/lstring.h
lua-5.1/src/lstrlib.c
lua-5.1/src/ltable.c
lua-5.1/src/ltable.h
lua-5.1/src/ltablib.c
lua-5.1/src/ltm.c
lua-5.1/src/ltm.h
lua-5.1/src/lua.c
lua-5.1/src/lua.h
lua-5.1/src/luac.c
lua-5.1/src/luaconf.h
lua-5.1/src/lualib.h
lua-5.1/src/lundump.c
lua-5.1/src/lundump.h
lua-5.1/src/lvm.c
lua-5.1/src/lvm.h
lua-5.1/src/lzio.c
lua-5.1/src/lzio.h
lua-5.1/src/print.c
lua-5.1/test
lua-5.1/test/README
lua-5.1/test/bisect.lua
lua-5.1/test/cf.lua
lua-5.1/test/echo.lua
lua-5.1/test/env.lua
lua-5.1/test/factorial.lua
lua-5.1/test/fib.lua
lua-5.1/test/fibfor.lua
lua-5.1/test/globals.lua
lua-5.1/test/hello.lua
lua-5.1/test/life.lua
lua-5.1/test/luac.lua
lua-5.1/test/printf.lua
lua-5.1/test/readonly.lua
lua-5.1/test/sieve.lua
lua-5.1/test/sort.lua
lua-5.1/test/table.lua
lua-5.1/test/trace-calls.lua
lua-5.1/test/trace-globals.lua
lua-5.1/test/xd.lua
END OF MANIFEST

View File

@@ -0,0 +1,182 @@
# makefile for building Lua
# see ../INSTALL for installation instructions
# see ../Makefile and luaconf.h for further customization
# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================
# Your platform. See PLATS for possible values.
PLAT= none
CC= gcc
CFLAGS= -O2 -Wall $(MYCFLAGS)
AR= ar rcu
RANLIB= ranlib
RM= rm -f
LIBS= -lm $(MYLIBS)
MYCFLAGS=
MYLDFLAGS=
MYLIBS=
# == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE =========
PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris
LUA_A= liblua.a
CORE_O= lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o \
lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o \
lundump.o lvm.o lzio.o
LIB_O= lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o \
lstrlib.o loadlib.o linit.o
LUA_T= lua
LUA_O= lua.o
LUAC_T= luac
LUAC_O= luac.o print.o
ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O)
ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)
ALL_A= $(LUA_A)
default: $(PLAT)
all: $(ALL_T)
o: $(ALL_O)
a: $(ALL_A)
$(LUA_A): $(CORE_O) $(LIB_O)
$(AR) $@ $?
$(RANLIB) $@
$(LUA_T): $(LUA_O) $(LUA_A)
$(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)
$(LUAC_T): $(LUAC_O) $(LUA_A)
$(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)
clean:
$(RM) $(ALL_T) $(ALL_O)
depend:
@$(CC) $(CFLAGS) -MM l*.c print.c
echo:
@echo "PLAT = $(PLAT)"
@echo "CC = $(CC)"
@echo "CFLAGS = $(CFLAGS)"
@echo "AR = $(AR)"
@echo "RANLIB = $(RANLIB)"
@echo "RM = $(RM)"
@echo "MYCFLAGS = $(MYCFLAGS)"
@echo "MYLDFLAGS = $(MYLDFLAGS)"
@echo "MYLIBS = $(MYLIBS)"
# convenience targets for popular platforms
none:
@echo "Please choose a platform:"
@echo " $(PLATS)"
aix:
$(MAKE) all CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl" MYLDFLAGS="-brtl -bexpall"
ansi:
$(MAKE) all MYCFLAGS=-DLUA_ANSI
bsd:
$(MAKE) all MYCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-Wl,-E"
freebsd:
$(MAKE) all MYCFLAGS="-DLUA_USE_LINUX" MYLIBS="-Wl,-E -lreadline"
generic:
$(MAKE) all MYCFLAGS=
linux:
$(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"
macosx:
$(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-lreadline"
# use this on Mac OS X 10.3-
# $(MAKE) all MYCFLAGS=-DLUA_USE_MACOSX
mingw:
$(MAKE) "LUA_A=lua51.dll" "LUA_T=lua.exe" \
"AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \
"MYCFLAGS=-DLUA_BUILD_AS_DLL" "MYLIBS=" "MYLDFLAGS=-s" lua.exe
$(MAKE) "LUAC_T=luac.exe" luac.exe
posix:
$(MAKE) all MYCFLAGS=-DLUA_USE_POSIX
solaris:
$(MAKE) all MYCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl"
# list targets that do not create files (but not all makes understand .PHONY)
.PHONY: all $(PLATS) default o a clean depend echo none
# DO NOT DELETE
lapi.o: lapi.c lua.h luaconf.h lapi.h lobject.h llimits.h ldebug.h \
lstate.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h \
lundump.h lvm.h
lauxlib.o: lauxlib.c lua.h luaconf.h lauxlib.h
lbaselib.o: lbaselib.c lua.h luaconf.h lauxlib.h lualib.h
lcode.o: lcode.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \
lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h lgc.h \
ltable.h
ldblib.o: ldblib.c lua.h luaconf.h lauxlib.h lualib.h
ldebug.o: ldebug.c lua.h luaconf.h lapi.h lobject.h llimits.h lcode.h \
llex.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \
lfunc.h lstring.h lgc.h ltable.h lvm.h
ldo.o: ldo.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lparser.h lstring.h \
ltable.h lundump.h lvm.h
ldump.o: ldump.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h \
lzio.h lmem.h lundump.h
lfunc.o: lfunc.c lua.h luaconf.h lfunc.h lobject.h llimits.h lgc.h lmem.h \
lstate.h ltm.h lzio.h
lgc.o: lgc.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h
linit.o: linit.c lua.h luaconf.h lualib.h lauxlib.h
liolib.o: liolib.c lua.h luaconf.h lauxlib.h lualib.h
llex.o: llex.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h ltm.h \
lzio.h lmem.h llex.h lparser.h lstring.h lgc.h ltable.h
lmathlib.o: lmathlib.c lua.h luaconf.h lauxlib.h lualib.h
lmem.o: lmem.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
ltm.h lzio.h lmem.h ldo.h
loadlib.o: loadlib.c lua.h luaconf.h lauxlib.h lualib.h
lobject.o: lobject.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h \
ltm.h lzio.h lmem.h lstring.h lgc.h lvm.h
lopcodes.o: lopcodes.c lopcodes.h llimits.h lua.h luaconf.h
loslib.o: loslib.c lua.h luaconf.h lauxlib.h lualib.h
lparser.o: lparser.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \
lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \
lfunc.h lstring.h lgc.h ltable.h
lstate.o: lstate.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h llex.h lstring.h ltable.h
lstring.o: lstring.c lua.h luaconf.h lmem.h llimits.h lobject.h lstate.h \
ltm.h lzio.h lstring.h lgc.h
lstrlib.o: lstrlib.c lua.h luaconf.h lauxlib.h lualib.h
ltable.o: ltable.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
ltm.h lzio.h lmem.h ldo.h lgc.h ltable.h
ltablib.o: ltablib.c lua.h luaconf.h lauxlib.h lualib.h
ltm.o: ltm.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h lzio.h \
lmem.h lstring.h lgc.h ltable.h
lua.o: lua.c lua.h luaconf.h lauxlib.h lualib.h
luac.o: luac.c lua.h luaconf.h lauxlib.h ldo.h lobject.h llimits.h \
lstate.h ltm.h lzio.h lmem.h lfunc.h lopcodes.h lstring.h lgc.h \
lundump.h
lundump.o: lundump.c lua.h luaconf.h ldebug.h lstate.h lobject.h \
llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h lundump.h
lvm.o: lvm.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h ltable.h lvm.h
lzio.o: lzio.c lua.h luaconf.h llimits.h lmem.h lstate.h lobject.h ltm.h \
lzio.h
print.o: print.c ldebug.h lstate.h lua.h luaconf.h lobject.h llimits.h \
ltm.h lzio.h lmem.h lopcodes.h lundump.h
# (end of Makefile)

View File

@@ -0,0 +1,37 @@
README for Lua 5.1
See INSTALL for installation instructions.
See HISTORY for a summary of changes since the last released version.
* What is Lua?
------------
Lua is a powerful, light-weight programming language designed for extending
applications. Lua is also frequently used as a general-purpose, stand-alone
language. Lua is free software.
For complete information, visit Lua's web site at http://www.lua.org/ .
For an executive summary, see http://www.lua.org/about.html .
Lua has been used in many different projects around the world.
For a short list, see http://www.lua.org/uses.html .
* Availability
------------
Lua is freely available for both academic and commercial purposes.
See COPYRIGHT and http://www.lua.org/license.html for details.
Lua can be downloaded at http://www.lua.org/download.html .
* Installation
------------
Lua is implemented in pure ANSI C, and compiles unmodified in all known
platforms that have an ANSI C compiler. In most Unix-like platforms, simply
do "make" with a suitable target. See INSTALL for detailed instructions.
* Origin
------
Lua is developed at Lua.org, a laboratory of the Department of Computer
Science of PUC-Rio (the Pontifical Catholic University of Rio de Janeiro
in Brazil).
For more information about the authors, see http://www.lua.org/authors.html .
(end of README)

Some files were not shown because too many files have changed in this diff Show More