1 Star 0 Fork 0

Ailwyn / Game-Server

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
DataInterface_NPC.cpp 29.02 KB
一键复制 编辑 原始数据 按行查看 历史
denntono 提交于 2011-12-07 19:18 . Signed-off-by: denntono marasovic@gmx.de
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844
#include<winsock2.h>
#include<stdio.h>
#include"DataInterface.h"
unsigned int dataInterfaceSpawnpoolId;
void cb_dataInterface_NPC_getNPCList(MYSQL *dbCon, diJob_npcListData_t *job, void *cb, void *param)
{
char queryText[1024];
job->outNpcCount = 0;
job->outNpcList = NULL;
wsprintf(queryText, "SELECT "
"id,name,entityClassId,"
"mapContextId,posX,posY,posZ,rotation,"
"ad1_classId,ad1_hue,"
"ad2_classId,ad2_hue,"
"ad3_classId,ad3_hue,"
"ad4_classId,ad4_hue,"
"ad5_classId,ad5_hue,"
"ad6_classId,ad6_hue,"
"ad7_classId,ad7_hue,"
"ad8_classId,ad8_hue,"
"ad9_classId,ad9_hue,"
"ad10_classId,ad10_hue,"
"ad11_classId,ad11_hue,"
"ad12_classId,ad12_hue,"
"ad13_classId,ad13_hue,"
"ad14_classId,ad14_hue,"
"ad15_classId,ad15_hue,"
"ad16_classId,ad16_hue,"
"ad17_classId,ad17_hue,"
"ad18_classId,ad18_hue,"
"ad19_classId,ad19_hue,"
"ad20_classId,ad20_hue,"
"ad21_classId,ad21_hue"
" FROM npc WHERE mapContextId=%d", job->mapContextId);
//else
//{
// wsprintf(queryText, "SELECT "
// "id,name,slotId,gender,raceId,classId,"
// "currentContextId,posX,posY,posZ,"
// "ad1_classId,ad1_hue,"
// "ad2_classId,ad2_hue,"
// "ad3_classId,ad3_hue,"
// "ad4_classId,ad4_hue,"
// "ad5_classId,ad5_hue,"
// "ad6_classId,ad6_hue,"
// "ad7_classId,ad7_hue,"
// "ad8_classId,ad8_hue,"
// "ad9_classId,ad9_hue,"
// "ad10_classId,ad10_hue,"
// "ad11_classId,ad11_hue,"
// "ad12_classId,ad12_hue,"
// "ad13_classId,ad13_hue,"
// "ad14_classId,ad14_hue,"
// "ad15_classId,ad15_hue,"
// "ad16_classId,ad16_hue,"
// "ad17_classId,ad17_hue,"
// "ad18_classId,ad18_hue,"
// "ad19_classId,ad19_hue,"
// "ad20_classId,ad20_hue,"
// "ad21_classId,ad21_hue"
// " FROM characters WHERE userId=%I64u AND slotId=%d", job->userId, job->slotIndex);
//}
// execute query
if( mysql_query(dbCon, queryText) )
{
printf("Error in query\n");
while(1) Sleep(1000);
}
MYSQL_RES *dbResult = mysql_store_result(dbCon);
MYSQL_ROW dbRow;
// allocate npc data
int npcCount = mysql_num_rows(dbResult);
di_npcData_t *npcDataList = (di_npcData_t*)malloc(sizeof(di_npcData_t) * npcCount);
//allocate the spawntypes/pools the same way
int idx = 0;
while((dbRow = mysql_fetch_row(dbResult)))
{
di_npcData_t *npcData = npcDataList+idx;
idx++;
unsigned long long npc_id;
int npc_entityClassId;
int npc_currentContextId;
double npc_posX;
double npc_posY;
double npc_posZ;
double npc_rotation;
int idx = 0;
sscanf(dbRow[idx], "%I64u", &npcData->npcID); idx++;
strcpy(npcData->unicodeName, dbRow[idx]); idx++;
sscanf(dbRow[idx], "%d", &npc_entityClassId); idx++;
npcData->entityClassID = npc_entityClassId;
sscanf(dbRow[idx], "%d", &npc_currentContextId); idx++;
npcData->currentContextId = npc_currentContextId;
sscanf(dbRow[idx], "%lf", &npc_posX); idx++;
sscanf(dbRow[idx], "%lf", &npc_posY); idx++;
sscanf(dbRow[idx], "%lf", &npc_posZ); idx++;
sscanf(dbRow[idx], "%lf", &npc_rotation); idx++;
npcData->posX = npc_posX;
npcData->posY = npc_posY;
npcData->posZ = npc_posZ;
//npcData->rot = npc_rotation;
for(int i=0; i<21; i++)
{
sscanf(dbRow[idx+0], "%d", &npcData->appearanceData[i].classId);
sscanf(dbRow[idx+1], "%u", &npcData->appearanceData[i].hue);
idx += 2;
}
}
mysql_free_result(dbResult);
job->outNpcList = npcDataList;
job->outNpcCount = npcCount;
// do callback param1: mapchannel param2: list of npcdata
((void (*)(void*,void*))cb)(param, job);
//// free data
//for(int i=0; i<16; i++)
//{
// free(job->outPreviewData[i]);
//}
free(npcDataList);
dataInterface_freeJob(job);
}
void dataInterface_NPC_getNPCList(unsigned int mapContextId, void (*cb)(void *param, diJob_npcListData_t *jobData), void *param)
{
diJob_npcListData_t *job = (diJob_npcListData_t*)dataInterface_allocJob(sizeof(diJob_npcListData_t));
job->mapContextId = mapContextId;
dataInterface_queueJob(job, cb_dataInterface_NPC_getNPCList, cb, param);
}
void cb_dataInterface_NPC_updateNPC(MYSQL *dbCon, diJob_updateNPC_t *job, void *cb, void *param)
{
char queryText[1024*4];
di_npcData_t *npcData = job->npcData;
// check if npc exists first (maybe should lock table)
bool npcAlreadyExists = false;
sprintf(queryText, "SELECT id FROM npc WHERE id=%I64d", job->npcData->npcID);
if( mysql_query(dbCon, queryText) )
{
printf("Error in query\n");
puts(queryText);
puts(mysql_error(dbCon));
((void (*)(void*,void*))cb)(param, job);
return;
}
MYSQL_RES *dbResult = mysql_store_result(dbCon);
if( mysql_num_rows(dbResult) )
npcAlreadyExists = true;
mysql_free_result(dbResult);
if( npcAlreadyExists == false )
{
// create npc
sprintf(queryText, "INSERT INTO npc ("
"`id`,`name`,`entityClassId`,"
"`mapContextId`,`posX`,`posY`,`posZ`,"
"`ad1_classId`,`ad1_hue`,"
"`ad2_classId`,`ad2_hue`,"
"`ad3_classId`,`ad3_hue`,"
"`ad4_classId`,`ad4_hue`,"
"`ad5_classId`,`ad5_hue`,"
"`ad6_classId`,`ad6_hue`,"
"`ad7_classId`,`ad7_hue`,"
"`ad8_classId`,`ad8_hue`,"
"`ad9_classId`,`ad9_hue`,"
"`ad10_classId`,`ad10_hue`,"
"`ad11_classId`,`ad11_hue`,"
"`ad12_classId`,`ad12_hue`,"
"`ad13_classId`,`ad13_hue`,"
"`ad14_classId`,`ad14_hue`,"
"`ad15_classId`,`ad15_hue`,"
"`ad16_classId`,`ad16_hue`,"
"`ad17_classId`,`ad17_hue`,"
"`ad18_classId`,`ad18_hue`,"
"`ad19_classId`,`ad19_hue`,"
"`ad20_classId`,`ad20_hue`,"
"`ad21_classId`,`ad21_hue`"
") VALUES"
"(%I64u,'%s',%d,"
"%d,%f,%f,%f,"
"%d,%u,%d,%u,%d,%u,%d,%u," // 1
"%d,%u,%d,%u,%d,%u,%d,%u," // 5
"%d,%u,%d,%u,%d,%u,%d,%u," // 9
"%d,%u,%d,%u,%d,%u,%d,%u," // 13
"%d,%u,%d,%u,%d,%u,%d,%u," // 17
"%d,%u" // 21
")",
npcData->npcID, npcData->unicodeName, npcData->entityClassID,
npcData->currentContextId,(double)npcData->posX,(double)npcData->posY,(double)npcData->posZ,
npcData->appearanceData[0].classId,npcData->appearanceData[0].hue,
npcData->appearanceData[1].classId,npcData->appearanceData[1].hue,
npcData->appearanceData[2].classId,npcData->appearanceData[2].hue,
npcData->appearanceData[3].classId,npcData->appearanceData[3].hue,
npcData->appearanceData[4].classId,npcData->appearanceData[4].hue,
npcData->appearanceData[5].classId,npcData->appearanceData[5].hue,
npcData->appearanceData[6].classId,npcData->appearanceData[6].hue,
npcData->appearanceData[7].classId,npcData->appearanceData[7].hue,
npcData->appearanceData[8].classId,npcData->appearanceData[8].hue,
npcData->appearanceData[9].classId,npcData->appearanceData[9].hue,
npcData->appearanceData[10].classId,npcData->appearanceData[10].hue,
npcData->appearanceData[11].classId,npcData->appearanceData[11].hue,
npcData->appearanceData[12].classId,npcData->appearanceData[12].hue,
npcData->appearanceData[13].classId,npcData->appearanceData[13].hue,
npcData->appearanceData[14].classId,npcData->appearanceData[14].hue,
npcData->appearanceData[15].classId,npcData->appearanceData[15].hue,
npcData->appearanceData[16].classId,npcData->appearanceData[16].hue,
npcData->appearanceData[17].classId,npcData->appearanceData[17].hue,
npcData->appearanceData[18].classId,npcData->appearanceData[18].hue,
npcData->appearanceData[19].classId,npcData->appearanceData[19].hue,
npcData->appearanceData[20].classId,npcData->appearanceData[20].hue
);
// execute query
if( mysql_query(dbCon, queryText) )
{
//characterData->error = true;
printf("Error in query\n");
puts(queryText);
puts(mysql_error(dbCon));
if( cb )
((void (*)(void*,void*))cb)(param, job);
return;
}
// do callback
if( cb )
((void (*)(void*,void*))cb)(param, job);
}
else
{
// update npc
sprintf(queryText, "UPDATE npc SET "
"`name`='%s',`entityClassId`=%d,"
"`mapContextId`=%d,`posX`=%lf,`posY`=%lf,`posZ`=%lf,"
"`ad1_classId`=%u,`ad1_hue`=%u,"
"`ad2_classId`=%u,`ad2_hue`=%u,"
"`ad3_classId`=%u,`ad3_hue`=%u,"
"`ad4_classId`=%u,`ad4_hue`=%u,"
"`ad5_classId`=%u,`ad5_hue`=%u,"
"`ad6_classId`=%u,`ad6_hue`=%u,"
"`ad7_classId`=%u,`ad7_hue`=%u,"
"`ad8_classId`=%u,`ad8_hue`=%u,"
"`ad9_classId`=%u,`ad9_hue`=%u,"
"`ad10_classId`=%u,`ad10_hue`=%u,"
"`ad11_classId`=%u,`ad11_hue`=%u,"
"`ad12_classId`=%u,`ad12_hue`=%u,"
"`ad13_classId`=%u,`ad13_hue`=%u,"
"`ad14_classId`=%u,`ad14_hue`=%u,"
"`ad15_classId`=%u,`ad15_hue`=%u,"
"`ad16_classId`=%u,`ad16_hue`=%u,"
"`ad17_classId`=%u,`ad17_hue`=%u,"
"`ad18_classId`=%u,`ad18_hue`=%u,"
"`ad19_classId`=%u,`ad19_hue`=%u,"
"`ad20_classId`=%u,`ad20_hue`=%u,"
"`ad21_classId`=%u,`ad21_hue`=%u"
" WHERE id=%I64u LIMIT 1",
npcData->unicodeName, npcData->entityClassID,
npcData->currentContextId,(double)npcData->posX,(double)npcData->posY,(double)npcData->posZ,
npcData->appearanceData[0].classId,npcData->appearanceData[0].hue,
npcData->appearanceData[1].classId,npcData->appearanceData[1].hue,
npcData->appearanceData[2].classId,npcData->appearanceData[2].hue,
npcData->appearanceData[3].classId,npcData->appearanceData[3].hue,
npcData->appearanceData[4].classId,npcData->appearanceData[4].hue,
npcData->appearanceData[5].classId,npcData->appearanceData[5].hue,
npcData->appearanceData[6].classId,npcData->appearanceData[6].hue,
npcData->appearanceData[7].classId,npcData->appearanceData[7].hue,
npcData->appearanceData[8].classId,npcData->appearanceData[8].hue,
npcData->appearanceData[9].classId,npcData->appearanceData[9].hue,
npcData->appearanceData[10].classId,npcData->appearanceData[10].hue,
npcData->appearanceData[11].classId,npcData->appearanceData[11].hue,
npcData->appearanceData[12].classId,npcData->appearanceData[12].hue,
npcData->appearanceData[13].classId,npcData->appearanceData[13].hue,
npcData->appearanceData[14].classId,npcData->appearanceData[14].hue,
npcData->appearanceData[15].classId,npcData->appearanceData[15].hue,
npcData->appearanceData[16].classId,npcData->appearanceData[16].hue,
npcData->appearanceData[17].classId,npcData->appearanceData[17].hue,
npcData->appearanceData[18].classId,npcData->appearanceData[18].hue,
npcData->appearanceData[19].classId,npcData->appearanceData[19].hue,
npcData->appearanceData[20].classId,npcData->appearanceData[20].hue,
npcData->npcID
);
// execute query
if( mysql_query(dbCon, queryText) )
{
//characterData->error = true;
printf("Error in query\n");
puts(queryText);
puts(mysql_error(dbCon));
if( cb )
((void (*)(void*,void*))cb)(param, job);
return;
}
// do callback
if( cb )
((void (*)(void*,void*))cb)(param, job);
}
dataInterface_freeJob(job);
}
void dataInterface_NPC_updateNPC(di_npcData_t *npcData, void (*cb)(void *param, diJob_updateNPC_t *jobData), void *param)
{
diJob_updateNPC_t *job = (diJob_updateNPC_t*)dataInterface_allocJob(sizeof(diJob_updateNPC_t));
job->npcData = npcData;
dataInterface_queueJob(job, cb_dataInterface_NPC_updateNPC, cb, param);
}
//############################# TEST #########################################
void cb_dataInterface_Entity_updateEntityW(MYSQL *dbCon, diJob_updateEntityW_t *job, void *cb, void *param)
{
char queryText[4 * 1024];
di_entityDataW_t *npcData = job->entityData;
// check if npc exists first (maybe should lock table)
bool npcAlreadyExists = false;
sprintf(queryText, "SELECT id FROM npc WHERE id=%I64d", job->entityData->npcID);
if( mysql_query(dbCon, queryText) )
{
printf("Error in query\n");
puts(queryText);
puts(mysql_error(dbCon));
((void (*)(void*,void*))cb)(param, job);
return;
}
MYSQL_RES *dbResult = mysql_store_result(dbCon);
if( mysql_num_rows(dbResult) )
npcAlreadyExists = true;
mysql_free_result(dbResult);
if( npcAlreadyExists == false )
{
// create npc
sprintf(queryText, "INSERT INTO npc ("
"`id`,`name`,`entityClassId`,"
"`mapContextId`,`posX`,`posY`,`posZ`,`rotation`,"
"`ad1_classId`,`ad1_hue`,"
"`ad2_classId`,`ad2_hue`,"
"`ad3_classId`,`ad3_hue`,"
"`ad4_classId`,`ad4_hue`,"
"`ad5_classId`,`ad5_hue`,"
"`ad6_classId`,`ad6_hue`,"
"`ad7_classId`,`ad7_hue`,"
"`ad8_classId`,`ad8_hue`,"
"`ad9_classId`,`ad9_hue`,"
"`ad10_classId`,`ad10_hue`,"
"`ad11_classId`,`ad11_hue`,"
"`ad12_classId`,`ad12_hue`,"
"`ad13_classId`,`ad13_hue`,"
"`ad14_classId`,`ad14_hue`,"
"`ad15_classId`,`ad15_hue`,"
"`ad16_classId`,`ad16_hue`,"
"`ad17_classId`,`ad17_hue`,"
"`ad18_classId`,`ad18_hue`,"
"`ad19_classId`,`ad19_hue`,"
"`ad20_classId`,`ad20_hue`,"
"`ad21_classId`,`ad21_hue`"
") VALUES"
"(%I64u,'%s',%d,"
"%d,%f,%f,%f,%f,"
"%d,%u,%d,%u,%d,%u,%d,%u," // 1
"%d,%u,%d,%u,%d,%u,%d,%u," // 5
"%d,%u,%d,%u,%d,%u,%d,%u," // 9
"%d,%u,%d,%u,%d,%u,%d,%u," // 13
"%d,%u,%d,%u,%d,%u,%d,%u," // 17
"%d,%u" // 21
")",
npcData->npcID, npcData->unicodeName, npcData->entityClassID,
npcData->currentContextId,(double)npcData->posX,(double)npcData->posY,(double)npcData->posZ,
(double)npcData->rotation,
npcData->appearanceData[0].classId,npcData->appearanceData[0].hue,
npcData->appearanceData[1].classId,npcData->appearanceData[1].hue,
npcData->appearanceData[2].classId,npcData->appearanceData[2].hue,
npcData->appearanceData[3].classId,npcData->appearanceData[3].hue,
npcData->appearanceData[4].classId,npcData->appearanceData[4].hue,
npcData->appearanceData[5].classId,npcData->appearanceData[5].hue,
npcData->appearanceData[6].classId,npcData->appearanceData[6].hue,
npcData->appearanceData[7].classId,npcData->appearanceData[7].hue,
npcData->appearanceData[8].classId,npcData->appearanceData[8].hue,
npcData->appearanceData[9].classId,npcData->appearanceData[9].hue,
npcData->appearanceData[10].classId,npcData->appearanceData[10].hue,
npcData->appearanceData[11].classId,npcData->appearanceData[11].hue,
npcData->appearanceData[12].classId,npcData->appearanceData[12].hue,
npcData->appearanceData[13].classId,npcData->appearanceData[13].hue,
npcData->appearanceData[14].classId,npcData->appearanceData[14].hue,
npcData->appearanceData[15].classId,npcData->appearanceData[15].hue,
npcData->appearanceData[16].classId,npcData->appearanceData[16].hue,
npcData->appearanceData[17].classId,npcData->appearanceData[17].hue,
npcData->appearanceData[18].classId,npcData->appearanceData[18].hue,
npcData->appearanceData[19].classId,npcData->appearanceData[19].hue,
npcData->appearanceData[20].classId,npcData->appearanceData[20].hue
);
// execute query
if( mysql_query(dbCon, queryText) )
{
//characterData->error = true;
printf("Error in query\n");
puts(queryText);
puts(mysql_error(dbCon));
if( cb )
((void (*)(void*,void*))cb)(param, job);
return;
}
// do callback
if( cb )
((void (*)(void*,void*))cb)(param, job);
}
else
{
// update npc
sprintf(queryText, "UPDATE npc SET "
"`name`='%s',`entityClassId`=%d,"
"`mapContextId`=%d,`posX`=%lf,`posY`=%lf,`posZ`=%lf,`rotation=%f`,"
"`ad1_classId`=%u,`ad1_hue`=%u,"
"`ad2_classId`=%u,`ad2_hue`=%u,"
"`ad3_classId`=%u,`ad3_hue`=%u,"
"`ad4_classId`=%u,`ad4_hue`=%u,"
"`ad5_classId`=%u,`ad5_hue`=%u,"
"`ad6_classId`=%u,`ad6_hue`=%u,"
"`ad7_classId`=%u,`ad7_hue`=%u,"
"`ad8_classId`=%u,`ad8_hue`=%u,"
"`ad9_classId`=%u,`ad9_hue`=%u,"
"`ad10_classId`=%u,`ad10_hue`=%u,"
"`ad11_classId`=%u,`ad11_hue`=%u,"
"`ad12_classId`=%u,`ad12_hue`=%u,"
"`ad13_classId`=%u,`ad13_hue`=%u,"
"`ad14_classId`=%u,`ad14_hue`=%u,"
"`ad15_classId`=%u,`ad15_hue`=%u,"
"`ad16_classId`=%u,`ad16_hue`=%u,"
"`ad17_classId`=%u,`ad17_hue`=%u,"
"`ad18_classId`=%u,`ad18_hue`=%u,"
"`ad19_classId`=%u,`ad19_hue`=%u,"
"`ad20_classId`=%u,`ad20_hue`=%u,"
"`ad21_classId`=%u,`ad21_hue`=%u"
" WHERE id=%I64u LIMIT 1",
npcData->unicodeName, npcData->entityClassID,
npcData->currentContextId,(double)npcData->posX,(double)npcData->posY,(double)npcData->posZ,
(double)npcData->rotation,
npcData->appearanceData[0].classId,npcData->appearanceData[0].hue,
npcData->appearanceData[1].classId,npcData->appearanceData[1].hue,
npcData->appearanceData[2].classId,npcData->appearanceData[2].hue,
npcData->appearanceData[3].classId,npcData->appearanceData[3].hue,
npcData->appearanceData[4].classId,npcData->appearanceData[4].hue,
npcData->appearanceData[5].classId,npcData->appearanceData[5].hue,
npcData->appearanceData[6].classId,npcData->appearanceData[6].hue,
npcData->appearanceData[7].classId,npcData->appearanceData[7].hue,
npcData->appearanceData[8].classId,npcData->appearanceData[8].hue,
npcData->appearanceData[9].classId,npcData->appearanceData[9].hue,
npcData->appearanceData[10].classId,npcData->appearanceData[10].hue,
npcData->appearanceData[11].classId,npcData->appearanceData[11].hue,
npcData->appearanceData[12].classId,npcData->appearanceData[12].hue,
npcData->appearanceData[13].classId,npcData->appearanceData[13].hue,
npcData->appearanceData[14].classId,npcData->appearanceData[14].hue,
npcData->appearanceData[15].classId,npcData->appearanceData[15].hue,
npcData->appearanceData[16].classId,npcData->appearanceData[16].hue,
npcData->appearanceData[17].classId,npcData->appearanceData[17].hue,
npcData->appearanceData[18].classId,npcData->appearanceData[18].hue,
npcData->appearanceData[19].classId,npcData->appearanceData[19].hue,
npcData->appearanceData[20].classId,npcData->appearanceData[20].hue
);
// execute query
if( mysql_query(dbCon, queryText) )
{
//characterData->error = true;
printf("Error in query\n");
puts(queryText);
puts(mysql_error(dbCon));
if( cb )
((void (*)(void*,void*))cb)(param, job);
return;
}
// do callback
if( cb )
((void (*)(void*,void*))cb)(param, job);
}
dataInterface_freeJob(job);
}
void dataInterface_Entity_updateEntityW(di_entityDataW_t *entityData, void (*cb)(void *param, diJob_updateNPC_t *jobData), void *param)
{
diJob_updateEntityW_t *job = (diJob_updateEntityW_t*)dataInterface_allocJob(sizeof(diJob_updateEntityW_t));
job->entityData = entityData;
dataInterface_queueJob(job, cb_dataInterface_Entity_updateEntityW, cb, param);
}
//################################################## test # 2 ##################################################
void cb_dataInterface_Spawnpool_updateSpawnW2(MYSQL *dbCon, diJob_updateSpawnW2_t *job, void *cb, void *param)
{
char queryText[4 * 1024];
di_spawnDataW2_t *npcData = job->spawnData;
// check if spawnlocation exists first (maybe should lock table)
float currentX = npcData->posX;
float currentZ = npcData->posZ;
//--position
bool positionUsed = false;
sprintf(queryText, "SELECT posx,posz FROM spawnpool WHERE contextid=%d", job->spawnData->currentContextId);
if( mysql_query(dbCon, queryText) )
{
printf("Error in query\n");
puts(queryText);
puts(mysql_error(dbCon));
((void (*)(void*,void*))cb)(param, job);
return;
}
MYSQL_RES *dbResult = mysql_store_result(dbCon);
MYSQL_ROW dbRow;
//check spawnpool for double used spawnlocations
while((dbRow = mysql_fetch_row(dbResult)))
{
float tmpx,tmpz;
sscanf(dbRow[0], "%f", &tmpx);
sscanf(dbRow[1], "%f", &tmpz);
if( (currentX == tmpx) && (currentZ == tmpz) )
positionUsed = true;
}
mysql_free_result(dbResult);
if( positionUsed == false )
{
// create new spawnlocation
sprintf(queryText, "INSERT INTO spawnpool ("
"`type`,`posx`,`posy`,`posz`,`contextid`"
") VALUES (%d,%f,%f,%f,%d)",
npcData->spawntype, npcData->posX, npcData->posY,
npcData->posZ,npcData->currentContextId);
// execute query
if( mysql_query(dbCon, queryText) )
{
//characterData->error = true;
printf("Error in query\n");
puts(queryText);
puts(mysql_error(dbCon));
if( cb )
((void (*)(void*,void*))cb)(param, job);
return;
}
// do callback
if( cb )
((void (*)(void*,void*))cb)(param, job);
}
dataInterface_freeJob(job);
}
void dataInterface_Spawnpool_updateSpawnW2(di_spawnDataW2_t *spawnData, void (*cb)(void *param, diJob_updateNPC_t *jobData), void *param)
{
diJob_updateSpawnW2_t *job = (diJob_updateSpawnW2_t*)dataInterface_allocJob(sizeof(diJob_updateSpawnW2_t));
job->spawnData = spawnData;
dataInterface_queueJob(job, cb_dataInterface_Spawnpool_updateSpawnW2, cb, param);
}
//################################################### test3 ##############################################
void cb_dataInterface_Spawn_getSpawnpool(MYSQL *dbCon, diJob_spawnTypeW2_t *job, void *cb, void *param)
{
char queryText[1024];
job->scount = 0;
job->spawnType = NULL;
//__debugbreak();
wsprintf(queryText, "SELECT id,maxcreatures,spawnname,creatures,faction,spawnanim,locktime,attackspeed,velocity,attackaction,attakstyle,actionid,melee_damage,range_damage,hitpoints FROM spawntype");
// execute query
if( mysql_query(dbCon, queryText) )
{
printf("Error in query\n");
while(1) Sleep(1000);
}
MYSQL_RES *dbResult = mysql_store_result(dbCon);
MYSQL_ROW dbRow;
// allocate spawn data
int spawnCount = mysql_num_rows(dbResult);
di_spawnDataW2_t *spawnLocationList = NULL;
baseBehavior_baseNode *pNodesList = NULL;
di_spawnTypeW2_t *spawnTypeList = (di_spawnTypeW2_t*)malloc(sizeof(di_spawnTypeW2_t) * spawnCount);
//allocate the spawntypes/pools the same way
int idx = 0;
while((dbRow = mysql_fetch_row(dbResult)))
{
di_spawnTypeW2_t *npcData = spawnTypeList+idx;
idx++;
int tspawntype,maxcreatures,tspawnanim,tsctiveswawns,tlocktime;
int tfaction,tattckspeed,tattckanim,tattackstyle,tactionid,rng_dmg,melee_dmg,hps;
float tvelocity;
char tlabel[50];
char tvariant[70];
sscanf(dbRow[0], "%d", &tspawntype);
npcData->spawntype = tspawntype;
sscanf(dbRow[1], "%d", &maxcreatures);
npcData->maxcreatures = maxcreatures;
strcpy(npcData->label, dbRow[2]);
strcpy(npcData->creatures, dbRow[3]);
sscanf(dbRow[4], "%d", &tfaction);
npcData->faction = tfaction;
sscanf(dbRow[5], "%d", &tspawnanim);
npcData->anim_type = tspawnanim;
//sscanf(dbRow[6], "%d", &tsctiveswawns);
//npcData->activeSpawnCount = tsctiveswawns;
sscanf(dbRow[6], "%d", &tlocktime);
npcData->locktime = tlocktime;
sscanf(dbRow[7], "%d", &tattckspeed);
npcData->attackspeed = tattckspeed;
sscanf(dbRow[8], "%f", &tvelocity);
npcData->velocity = tvelocity;
sscanf(dbRow[9], "%d", &tattckanim);
npcData->attackaction = tattckanim;
sscanf(dbRow[10], "%d", &tattackstyle);
npcData->attackstyle = tattackstyle;
sscanf(dbRow[11], "%d", &tactionid);
npcData->actionid = tactionid;
sscanf(dbRow[12], "%d", &melee_dmg);
npcData->dmg_melee = melee_dmg;
sscanf(dbRow[13], "%d", &rng_dmg);
npcData->dmg_range = rng_dmg;
sscanf(dbRow[14], "%d", &hps);
npcData->hitpoints = hps;
//---get spawnlocations
wsprintf(queryText, "SELECT type,posx,posy,posz,contextid,id FROM spawnpool WHERE type=%d AND contextid=%d",
tspawntype,job->mapContextId);
// execute query
if( mysql_query(dbCon, queryText) )
{
printf("Error in query\n");
while(1) Sleep(1000);
}
MYSQL_RES *dbResult2 = mysql_store_result(dbCon);
MYSQL_ROW dbRow2;
//--- allocate spawnlocation data
int spawnLocCount = mysql_num_rows(dbResult2);
npcData->spawnlocCount = spawnLocCount;
if(spawnLocCount<= 0)
{
mysql_free_result(dbResult2);
continue;
}
spawnLocationList = (di_spawnDataW2_t*)malloc(sizeof(di_spawnDataW2_t) * spawnLocCount);
int cnt2 = 0;
while((dbRow2 = mysql_fetch_row(dbResult2)))
{
di_spawnDataW2_t *t_spawnData = spawnLocationList + cnt2;
cnt2++;
float tposx,tposy,tposz;
int tcontextid,ttype,tid;
sscanf(dbRow2[0],"%d",&ttype);
t_spawnData->spawntype = ttype;
sscanf(dbRow2[1],"%f",&tposx);
t_spawnData->posX = tposx;
sscanf(dbRow2[2],"%f",&tposy);
t_spawnData->posY = tposy;
sscanf(dbRow2[3],"%f",&tposz);
t_spawnData->posZ = tposz;
sscanf(dbRow2[4],"%d",&tcontextid);
t_spawnData->currentContextId = tcontextid;
//--- get pathnodes for current spawnlocation/-point
int tspawnid = 0;
sscanf(dbRow2[5],"%d",&tspawnid);
wsprintf(queryText, "SELECT spawnid,contextid,posx,posy,posz,pindex FROM pathnodes WHERE spawnid=%d",
tspawnid);
//--- execute query
if( mysql_query(dbCon, queryText) )
{
printf("Error in query\n");
while(1) Sleep(1000);
}
MYSQL_RES *dbResult3 = mysql_store_result(dbCon);
MYSQL_ROW dbRow3;
int pathNodeCount = mysql_num_rows(dbResult3);
pNodesList = (baseBehavior_baseNode*) malloc(sizeof(baseBehavior_baseNode) * pathNodeCount);
int cnt3 = 0;
while( dbRow3 = mysql_fetch_row(dbResult3) )
{
baseBehavior_baseNode *tNode = pNodesList + cnt3;
cnt3++;
float tx,ty,tz;
int tspawnid,tcontext,tpathindex;
sscanf(dbRow3[0],"%d",&tspawnid);
sscanf(dbRow3[1],"%d",&tcontextid);
tNode->contextid = tcontextid;
sscanf(dbRow3[2],"%f",&tx);
tNode->x = tx;
sscanf(dbRow3[3],"%f",&ty);
tNode->y = ty;
sscanf(dbRow3[4],"%f",&tz);
tNode->z = tz;
sscanf(dbRow3[5],"%d",&tpathindex);
tNode->pindex = tpathindex;
}//---while pathnodes
mysql_free_result(dbResult3);
if(pathNodeCount > 0)
{
t_spawnData->pathnodes = (baseBehavior_baseNode*) malloc(sizeof(baseBehavior_baseNode) * pathNodeCount);
t_spawnData->pathnodes = pNodesList;
t_spawnData->nodeCount = pathNodeCount;
}
}//---while(spawnlocations)
mysql_free_result(dbResult2);
if(spawnLocCount > 0)
{
npcData->locationlist = (di_spawnDataW2_t*)malloc(sizeof(di_spawnDataW2_t)* cnt2);
npcData->locationlist = spawnLocationList;
}
}//---while(spanwtypes)
mysql_free_result(dbResult);
job->spawnType = spawnTypeList;
job->scount = spawnCount;
// do callback param1: mapchannel param2: list of npcdata
((void (*)(void*,void*))cb)(param, job);
if(spawnTypeList != NULL)free(spawnTypeList);
if(spawnLocationList !=NULL)free(spawnLocationList);
if(pNodesList != NULL) free (pNodesList);
dataInterface_freeJob(job);
}
void dataInterface_Spawn_getSpawnpool(unsigned int mapContextId, void (*cb)(void *param, diJob_spawnTypeW2_t *jobData), void *param)
{
diJob_spawnTypeW2_t *job = (diJob_spawnTypeW2_t*)dataInterface_allocJob(sizeof(diJob_spawnTypeW2_t));
job->mapContextId = mapContextId;
dataInterface_queueJob(job, cb_dataInterface_Spawn_getSpawnpool, cb, param);
}
//###################### test 4 ###################
void cb_dataInterface_PathNode_updatePathNode(MYSQL *dbCon, diJob_updatePathNodeW2_t *job, void *cb, void *param)
{
__debugbreak();
char queryText[4 * 1024];
di_pathNodeDataW2_t *pNodeData = job->pnodedata;
int tcontextid,tspawnid,tpnodeindex;
float tx,ty,tz;
tcontextid = pNodeData->currentContextId;
tspawnid = pNodeData ->spawntype;
tpnodeindex = pNodeData ->pathindex;
tx = pNodeData ->posX;
ty = pNodeData ->posY;
tz = pNodeData ->posZ;
sprintf(queryText, "SELECT * FROM pathnodes WHERE spawnid ='%d' AND pindex='%d'",
pNodeData->spawntype,pNodeData->pathindex);
if( mysql_query(dbCon, queryText) )
{
//--- characterData->error = true;
printf("Error in query\n");
puts(queryText);
puts(mysql_error(dbCon));
if( cb )
((void (*)(void*,void*))cb)(param, job);
return;
}
MYSQL_RES *dbResult = mysql_store_result(dbCon);
MYSQL_ROW dbRow;
int spawnCount = mysql_num_rows(dbResult);
if(spawnCount)
{
printf("Pathnode already in use\n");
mysql_free_result(dbResult);
return;
}
//--- create new pathnode
sprintf(queryText, "INSERT INTO pathnodes (spawnid,contextid,posx,posy,posz,pindex)"
" VALUES (%d,%d,%f,%f,%f,%d)",
tspawnid,tcontextid,tx,ty,tz,tpnodeindex);
//--- execute query
if( mysql_query(dbCon, queryText) )
{
//--- characterData->error = true;
printf("Error in query\n");
puts(queryText);
puts(mysql_error(dbCon));
if( cb )
((void (*)(void*,void*))cb)(param, job);
return;
}
}
void dataInterface_PathNode_setPathnode(di_pathNodeDataW2_t *pnodedata, void (*cb)(void *param, diJob_spawnTypeW2_t *jobData), void *param)
{
diJob_updatePathNodeW2_t *job = (diJob_updatePathNodeW2_t*)dataInterface_allocJob(sizeof(diJob_updatePathNodeW2_t));
job->pnodedata = pnodedata;
dataInterface_queueJob(job, cb_dataInterface_PathNode_updatePathNode, cb, param);
}
void cb_dataInterface_NPC_getLastNPCEntityID(MYSQL *dbCon, diJob_getLastNPCEntityID_t *job, void *cb, void *param)
{
char queryText[512];
// find highest entityId of npcs
bool npcAlreadyExists = false;
sprintf(queryText, "SELECT max(id) FROM npc");
if( mysql_query(dbCon, queryText) )
{
printf("Error in query\n");
puts(queryText);
puts(mysql_error(dbCon));
job->outState = 2;
return;
}
MYSQL_RES *dbResult = mysql_store_result(dbCon);
if( mysql_num_rows(dbResult) )
{
MYSQL_ROW dbRow;
dbRow = mysql_fetch_row(dbResult);
if( dbRow[0] )
sscanf(dbRow[0], "%I64u", &job->outEntityId);
else
job->outEntityId = 0;
}
else
job->outEntityId = 0;
mysql_free_result(dbResult);
job->outState = 1;
// job is freed outside
}
unsigned long long dataInterface_NPC_getLastNPCEntityID()
{
diJob_getLastNPCEntityID_t *job = (diJob_getLastNPCEntityID_t*)dataInterface_allocJob(sizeof(diJob_getLastNPCEntityID_t));
job->outEntityId = 0;
job->outState = 0;
dataInterface_queueJob(job, cb_dataInterface_NPC_getLastNPCEntityID, NULL, NULL);
while( job->outState == 0 ) Sleep(10);
unsigned long long entityId = job->outEntityId;
if( job->outState == 2 ) // error
entityId = 0;
dataInterface_freeJob(job);
return entityId;
}
C++
1
https://gitee.com/xx_001/Game-Server.git
git@gitee.com:xx_001/Game-Server.git
xx_001
Game-Server
Game-Server
master

搜索帮助