Hello.
Sorry for my bad english
I am working on a game and i just started with sql so i would need some help here.
I am working on changing the limit on how much stat i can save in database.
It was TINYINT and thats a range of 0-255, i want to change it to SMALLINT.
And thats when i got into problems, i think i found out what i need to change and i did it,
but it wont save over 255, so i am stuck
So i am here asking for some help if anyone would like to help me.
ill post the stuff here if anyone offer their help
Thanks,
xRisenx
Helbreath SQL (Help needed)
Did you check that your table has been altered successfully? When you try to insert or update values over 255, are you directly executing SQL statements or you're doing it through your application? If it's from your application, did you change the type of the data you're submitting?
Yea i changed the info in the table to SmallInt.
1 exe sends to another exe that sends it to database.
Game server sends:
player->SetStr( bGetOffsetValue(pData, 46), false );
player->m_iVit = bGetOffsetValue(pData, 47);
player->SetDex( bGetOffsetValue(pData, 48) );
player->SetInt( bGetOffsetValue(pData, 49), false );
player->SetMag( bGetOffsetValue(pData, 50) );
player->m_iCharisma = bGetOffsetValue(pData, 51);
to Login Server that uses this:
else if(IsSame(field[f]->name, "Strenght")) PutOffsetValue(Data, 47, BYTESIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Vitality")) PutOffsetValue(Data, 48, BYTESIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Dexterity")) PutOffsetValue(Data, 49, BYTESIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Intelligence")) PutOffsetValue(Data, 50, BYTESIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Magic")) PutOffsetValue(Data, 51, BYTESIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Agility")) PutOffsetValue(Data, 52, BYTESIZE, atoi(myRow[f]));
Its are more places it sends but thats how it works..
BYTESIZE = 1 = TinyInt
WORDSIZE = 2 = SmallInt
and i changed this to WORDSIZE
else if(IsSame(field[f]->name, "Strenght")) PutOffsetValue(Data, 47, WORDSIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Vitality")) PutOffsetValue(Data, 49, WORDSIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Dexterity")) PutOffsetValue(Data, 51, WORDSIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Intelligence")) PutOffsetValue(Data, 53, WORDSIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Magic")) PutOffsetValue(Data, 55, WORDSIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Agility")) PutOffsetValue(Data, 57, WORDSIZE, atoi(myRow[f]));
So it goes up from 47 to 49 and so on.. cause thats right when WORDSIZE takes 2 slots insted of 1 like BYTESIZE.
And this is only a part of the code..
There are a couple of 100 lines that are linked to this part.
Thanks,
xRisenx
1 exe sends to another exe that sends it to database.
Game server sends:
player->SetStr( bGetOffsetValue(pData, 46), false );
player->m_iVit = bGetOffsetValue(pData, 47);
player->SetDex( bGetOffsetValue(pData, 48) );
player->SetInt( bGetOffsetValue(pData, 49), false );
player->SetMag( bGetOffsetValue(pData, 50) );
player->m_iCharisma = bGetOffsetValue(pData, 51);
to Login Server that uses this:
else if(IsSame(field[f]->name, "Strenght")) PutOffsetValue(Data, 47, BYTESIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Vitality")) PutOffsetValue(Data, 48, BYTESIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Dexterity")) PutOffsetValue(Data, 49, BYTESIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Intelligence")) PutOffsetValue(Data, 50, BYTESIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Magic")) PutOffsetValue(Data, 51, BYTESIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Agility")) PutOffsetValue(Data, 52, BYTESIZE, atoi(myRow[f]));
Its are more places it sends but thats how it works..
BYTESIZE = 1 = TinyInt
WORDSIZE = 2 = SmallInt
and i changed this to WORDSIZE
else if(IsSame(field[f]->name, "Strenght")) PutOffsetValue(Data, 47, WORDSIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Vitality")) PutOffsetValue(Data, 49, WORDSIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Dexterity")) PutOffsetValue(Data, 51, WORDSIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Intelligence")) PutOffsetValue(Data, 53, WORDSIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Magic")) PutOffsetValue(Data, 55, WORDSIZE, atoi(myRow[f]));
else if(IsSame(field[f]->name, "Agility")) PutOffsetValue(Data, 57, WORDSIZE, atoi(myRow[f]));
So it goes up from 47 to 49 and so on.. cause thats right when WORDSIZE takes 2 slots insted of 1 like BYTESIZE.
And this is only a part of the code..
There are a couple of 100 lines that are linked to this part.
Thanks,
xRisenx
Honestly, I have no idea of what this code is doing, but something tells me that the bug is in your code and not in the DB. I don't see any SQL in that code either. I don't know what are these functions, but this code is really awkward and seems to be error prone.
Edit: you should provide the code executing the SQL statement. Also, did you try to debug your application? Put a breakpoint to see what data you're actually sending to the DB.
Edit: you should provide the code executing the SQL statement. Also, did you try to debug your application? Put a breakpoint to see what data you're actually sending to the DB.
Here are the full function that saves character info when u log out
void CLoginServer::SaveCharacter(char* Data, MYSQL myConn)
{
char *cp, AccName[15], AccPwd[15], CharName[15], Location[15], MapName[15], BlockDate[25], SaveDate[25],
GuildName[25], GoodGuildName[50], LockedMapName[15], MagicMastery[105], Profile[260], GoodProfile[520], QueryConsult[10000];
sBYTE DownSkillIndex;
BYTE /*STR, DEX, VIT, INT, MAG, AGI,*/ Luck, Sex, Skin, HairStyle,
HairColor, Underwear, HungerStatus, FightzoneNumber,
FightzoneTicketNumber, CrusadeDuty, NItems, NBankItems, SkillMastery;
sWORD MapLocX, MapLocY, GuildRank, GuildID, CharID1, CharID2, CharID3, QuestRewardType;
WORD STR, DEX, VIT, INT, MAG, AGI, Level, Quest, CurQuestCount, SuperAttackLeft, Gizon, w,
IndexForItem, Index;
sDWORD Rating;
long elo;
DWORD HP, MP, SP, Exp, EK, TotalEK, PK, RewardGold, TimeLeftShutUp, TimeLeftRating, TimeLeftForceRecall,
TimeLeftFirmStaminar, QuestID, QuestRewardAmmount, Contribution, WarContribution, SpecialEventID,
ReserveTime, LockedMapTime, CrusadeGUID, ConstructionPoint, DeadPenaltyTime,
PartyID, SpecialAbilityTime, Appr1, Appr2, Appr3, Appr4, ApprColor, SkillSSN, CharID;
uint64 CurItemID;
BOOL Flag, IsQuestCompleted, bIsBankModified;
SYSTEMTIME SaveTime;
st_mysql_res *pQueryResult = NULL;
cItem *ItemInfo;
string itemQuery;
static long charIndexEnd = 252;
//uint32 bench = timeGetTime();
ZeroMemory(CharName, sizeof(CharName));
SafeCopy(CharName, Data, 10);
ZeroMemory(AccName, sizeof(AccName));
SafeCopy(AccName, Data+10, 10);
ZeroMemory(AccPwd, sizeof(AccPwd));
SafeCopy(AccPwd, Data+20, 10);
Flag = (BOOL)bGetOffsetValue(Data, 30);
CharID = GetCharID(CharName, AccName, myConn);
cp = (Data+31);
SaveTime.wYear = wGetOffsetValue(cp, 0);
SaveTime.wMonth = bGetOffsetValue(cp, 2);
SaveTime.wDay = bGetOffsetValue(cp, 3);
SaveTime.wHour = bGetOffsetValue(cp, 4);
SaveTime.wMinute = bGetOffsetValue(cp, 5);
SaveTime.wSecond = bGetOffsetValue(cp, 6);
ZeroMemory(SaveDate, sizeof(SaveDate));
sprintf(SaveDate, "%d-%d-%d %d:%d:%d", SaveTime.wYear, SaveTime.wMonth, SaveTime.wDay, SaveTime.wHour, SaveTime.wMinute, SaveTime.wSecond);
ZeroMemory(Location, sizeof(Location));
SafeCopy(Location, cp+7, 10);
ZeroMemory(MapName, sizeof(MapName));
SafeCopy(MapName, cp+17, 10);
MapLocX = (sWORD)wGetOffsetValue(cp, 27);
MapLocY = (sWORD)wGetOffsetValue(cp, 29);
ZeroMemory(GuildName, sizeof(GuildName));
SafeCopy(GuildName, cp+31, 20);
GuildID = wGetOffsetValue(cp, 51);
GuildRank = (sWORD)wGetOffsetValue(cp, 53);
HP = dwGetOffsetValue(cp, 55);
MP = dwGetOffsetValue(cp, 59);
SP = dwGetOffsetValue(cp, 63);
Level = wGetOffsetValue(cp, 67);
Rating = (sDWORD)dwGetOffsetValue(cp, 69);
STR = bGetOffsetValue(cp, 73);
VIT = bGetOffsetValue(cp, 75);
DEX = bGetOffsetValue(cp, 77);
INT = bGetOffsetValue(cp, 79);
MAG = bGetOffsetValue(cp, 81);
AGI = bGetOffsetValue(cp, 83);
Luck = bGetOffsetValue(cp, 84);
Exp = dwGetOffsetValue(cp, 85);
EK = dwGetOffsetValue(cp, 89);
PK = dwGetOffsetValue(cp, 93);
RewardGold = dwGetOffsetValue(cp, 97);
DownSkillIndex = (sBYTE)bGetOffsetValue(cp, 101);
CharID1 = (sWORD)dwGetOffsetValue(cp, 102);
CharID2 = (sWORD)dwGetOffsetValue(cp, 106);
CharID3 = (sWORD)dwGetOffsetValue(cp, 110);
Sex = bGetOffsetValue(cp, 114);
Skin = bGetOffsetValue(cp, 115);
HairStyle = bGetOffsetValue(cp, 116);
HairColor = bGetOffsetValue(cp, 117);
Underwear = bGetOffsetValue(cp, 118);
HungerStatus = bGetOffsetValue(cp, 119);
TimeLeftShutUp = dwGetOffsetValue(cp, 120);
TimeLeftRating = dwGetOffsetValue(cp, 124);
TimeLeftForceRecall = dwGetOffsetValue(cp, 128);
TimeLeftFirmStaminar = dwGetOffsetValue(cp, 132);
bIsBankModified = (BOOL)bGetOffsetValue(cp, 136);
ZeroMemory(BlockDate, sizeof(BlockDate));
SafeCopy(BlockDate, cp+137, 20);
Quest = wGetOffsetValue(cp, 157);
QuestID = wGetOffsetValue(cp, 159);
CurQuestCount = wGetOffsetValue(cp, 161);
QuestRewardType = (sWORD)wGetOffsetValue(cp, 163);
QuestRewardAmmount = dwGetOffsetValue(cp, 165);
Contribution = dwGetOffsetValue(cp, 169);
WarContribution = dwGetOffsetValue(cp, 173);
IsQuestCompleted = (BOOL)bGetOffsetValue(cp, 177);
SpecialEventID = dwGetOffsetValue(cp, 178);
SuperAttackLeft = wGetOffsetValue(cp, 182);
FightzoneNumber = bGetOffsetValue(cp, 184);
ReserveTime = dwGetOffsetValue(cp, 185);
FightzoneTicketNumber = bGetOffsetValue(cp, 189);
SpecialAbilityTime = dwGetOffsetValue(cp, 190);
ZeroMemory(LockedMapName, sizeof(LockedMapName));
SafeCopy(LockedMapName, cp+194, 10);
LockedMapTime = dwGetOffsetValue(cp, 204);
CrusadeDuty = bGetOffsetValue(cp, 208);
CrusadeGUID = dwGetOffsetValue(cp, 209);
ConstructionPoint = dwGetOffsetValue(cp, 213);
DeadPenaltyTime = dwGetOffsetValue(cp, 217);
PartyID = dwGetOffsetValue(cp, 221);
//PartyID = 0;
Gizon = wGetOffsetValue(cp, 225);
SpecialAbilityTime = dwGetOffsetValue(cp, 227);
Appr1 = wGetOffsetValue(cp, 231);
Appr2 = wGetOffsetValue(cp, 235);
Appr3 = wGetOffsetValue(cp, 239);
Appr4 = wGetOffsetValue(cp, 243);
ApprColor = dwGetOffsetValue(cp, 247);
elo = wGetOffsetValue(cp, 251);
TotalEK = dwGetOffsetValue(cp, 253);
ZeroMemory(MagicMastery, sizeof(MagicMastery));
SafeCopy(MagicMastery, cp+charIndexEnd, 100);
string skillQuery;
skillQuery.append("UPDATE `skill` SET `SkillMastery` = CASE SkillID ");
for (w = 0; w < 24; w++)
{
SkillMastery = bGetOffsetValue(cp, charIndexEnd+100+w);
sprintf(QueryConsult, "WHEN %u THEN %u ", w, SkillMastery);
skillQuery.append(QueryConsult);
}
skillQuery.append("END,");
skillQuery.append("`SkillSSN` = CASE SkillID ");
for (w = 0; w < 24; w++)
{
SkillSSN = dwGetOffsetValue(cp, charIndexEnd+124+(w*4));
sprintf(QueryConsult, "WHEN %u THEN %u ", w, SkillSSN);
skillQuery.append(QueryConsult);
}
skillQuery.append("END ");
sprintf(QueryConsult, "WHERE `CharID` = '%lu' LIMIT 24;", CharID);
skillQuery.append(QueryConsult);
if(ProcessQuery(&myConn, (char*)skillQuery.c_str()) == -1) return;
pQueryResult = mysql_store_result(&myConn);
SAFEFREERESULT(pQueryResult);
NItems = bGetOffsetValue(cp, charIndexEnd+224);
CurItemID = (GetLastInsertedItemID(myConn)+1);
DeleteAllItemsFromChar(CharID, myConn, bIsBankModified);
ItemInfo = new cItem;
if(NItems > 0)
{
itemQuery.append("INSERT INTO `item` ( `CharID` , `ItemName`, `Count` , `ItemType`, `ID1`, `ID2`, `ID3`, `Color`, \
`Effect1`, `Effect2`, `Effect3`, `LifeSpan`, `Attribute`, `Socket1`, `Socket2`, `Socket3`, `ItemEquip`, \
`ItemPosX`, `ItemPosY`, `ItemID`, `ItemPos`) VALUES");
for(w = 0; w < NItems; w++)
{
IndexForItem = (WORD)(charIndexEnd+225 + (w*67));
ZeroMemory(ItemInfo->ItemName, sizeof(ItemInfo->ItemName));
SafeCopy(ItemInfo->ItemName, cp+IndexForItem, 20);
if(strlen(ItemInfo->ItemName) == 0) continue;
ItemInfo->ItemCount = dwGetOffsetValue(cp, (IndexForItem+20));
ItemInfo->TouchEffectType = (sWORD)wGetOffsetValue(cp, (IndexForItem+24));
ItemInfo->TouchEffectValue1 = (sWORD)wGetOffsetValue(cp, (IndexForItem+26));
ItemInfo->TouchEffectValue2 = (sWORD)wGetOffsetValue(cp, (IndexForItem+30));
ItemInfo->TouchEffectValue3 = (sWORD)dwGetOffsetValue(cp, (IndexForItem+34));
ItemInfo->ItemColor = bGetOffsetValue(cp, (IndexForItem+38));
ItemInfo->ItemSpecEffectValue1 = (sWORD)wGetOffsetValue(cp, (IndexForItem+39));
ItemInfo->ItemSpecEffectValue2 = (sWORD)wGetOffsetValue(cp, (IndexForItem+41));
ItemInfo->ItemSpecEffectValue3 = (sWORD)wGetOffsetValue(cp, (IndexForItem+43));
ItemInfo->CurLifeSpan = wGetOffsetValue(cp, (IndexForItem+45));
ItemInfo->Attribute = dwGetOffsetValue(cp, (IndexForItem+47));
ItemInfo->socket1 = bGetOffsetValue(cp, (IndexForItem+51));
ItemInfo->socket2 = bGetOffsetValue(cp, (IndexForItem+52));
ItemInfo->socket3 = bGetOffsetValue(cp, (IndexForItem+53));
ItemInfo->IsItemEquipped = (BOOL)bGetOffsetValue(cp, (IndexForItem+54));
ItemInfo->ItemPosX = (sWORD)wGetOffsetValue(cp, (IndexForItem+55));
ItemInfo->ItemPosY = (sWORD)wGetOffsetValue(cp, (IndexForItem+57));
ItemInfo->ItemUniqueID = ullGetOffsetValue(cp, (IndexForItem+59));
if(ItemInfo->ItemUniqueID == 0){
ItemInfo->ItemUniqueID = CurItemID;
CurItemID++;
}
//ItemInfo->DupItemCode = CheckDupItem(ItemInfo, myConn, FALSE);
ItemInfo->PutItemInBank = FALSE;
if(w) itemQuery.append(",");
sprintf(QueryConsult, "(%lu,'%s',%lu,%d,%d,%d,%d,%d,%d,%d,%d,%u,%lu,",
CharID ,ItemInfo->ItemName,ItemInfo->ItemCount, ItemInfo->TouchEffectType, ItemInfo->TouchEffectValue1, ItemInfo->TouchEffectValue2, ItemInfo->TouchEffectValue3, ItemInfo->ItemColor, ItemInfo->ItemSpecEffectValue1, ItemInfo->ItemSpecEffectValue2, ItemInfo->ItemSpecEffectValue3, ItemInfo->CurLifeSpan, ItemInfo->Attribute);
itemQuery.append(QueryConsult);
if(ItemInfo->socket1 != SG_NONE)
sprintf(QueryConsult, "%u,", ItemInfo->socket1);
else
sprintf(QueryConsult, "NULL,", ItemInfo->socket1);
itemQuery.append(QueryConsult);
if(ItemInfo->socket2 != SG_NONE)
sprintf(QueryConsult, "%u,", ItemInfo->socket2);
else
sprintf(QueryConsult, "NULL,", ItemInfo->socket2);
itemQuery.append(QueryConsult);
if(ItemInfo->socket3 != SG_NONE)
sprintf(QueryConsult, "%u,", ItemInfo->socket3);
else
sprintf(QueryConsult, "NULL,", ItemInfo->socket3);
itemQuery.append(QueryConsult);
sprintf(QueryConsult, "%d,%d,%d,%I64u,'BAG')", ItemInfo->IsItemEquipped, ItemInfo->ItemPosX, ItemInfo->ItemPosY, ItemInfo->ItemUniqueID);
itemQuery.append(QueryConsult);
DeleteItemOnDB(ItemInfo, CharID, myConn);
}
itemQuery.append(";");
if(ProcessQuery(&myConn, (char *) itemQuery.c_str()) == -1) return;
pQueryResult = mysql_store_result(&myConn);
SAFEFREERESULT(pQueryResult);
}
Index = (WORD)(charIndexEnd+225+(NItems*67));
NBankItems = bGetOffsetValue(cp, Index);
if(NBankItems > 0){
itemQuery.clear();
itemQuery.append("INSERT INTO `item` ( `CharID` , `ItemName`, `Count` , `ItemType`, `ID1`, `ID2`, `ID3`, \
`Color`, `Effect1`, `Effect2`, `Effect3`, `LifeSpan`, `Attribute`, `Socket1`, `Socket2`, `Socket3`, `ItemID`, `ItemPos`) VALUES ");
for(w = 0; w < NBankItems; w++){
IndexForItem = (WORD)(Index+1+(w*62));
ZeroMemory(ItemInfo->ItemName, sizeof(ItemInfo->ItemName));
SafeCopy(ItemInfo->ItemName, cp+IndexForItem, 20);
if(strlen(ItemInfo->ItemName) == 0) continue;
ItemInfo->ItemCount = dwGetOffsetValue(cp, (IndexForItem+20));
ItemInfo->TouchEffectType = (sWORD)wGetOffsetValue(cp, (IndexForItem+24));
ItemInfo->TouchEffectValue1 = (sWORD)wGetOffsetValue(cp, (IndexForItem+26));
ItemInfo->TouchEffectValue2 = (sWORD)wGetOffsetValue(cp, (IndexForItem+30));
ItemInfo->TouchEffectValue3 = (sWORD)dwGetOffsetValue(cp, (IndexForItem+34));
ItemInfo->ItemColor = bGetOffsetValue(cp, (IndexForItem+38));
ItemInfo->ItemSpecEffectValue1 = (sWORD)wGetOffsetValue(cp, (IndexForItem+39));
ItemInfo->ItemSpecEffectValue2 = (sWORD)wGetOffsetValue(cp, (IndexForItem+41));
ItemInfo->ItemSpecEffectValue3 = (sWORD)wGetOffsetValue(cp, (IndexForItem+43));
ItemInfo->CurLifeSpan = wGetOffsetValue(cp, (IndexForItem+45));
ItemInfo->Attribute = dwGetOffsetValue(cp, (IndexForItem+47));
ItemInfo->socket1 = bGetOffsetValue(cp, (IndexForItem+51));
ItemInfo->socket2 = bGetOffsetValue(cp, (IndexForItem+52));
ItemInfo->socket3 = bGetOffsetValue(cp, (IndexForItem+53));
ItemInfo->ItemUniqueID = ullGetOffsetValue(cp, (IndexForItem+54));
if(ItemInfo->ItemUniqueID == 0){
ItemInfo->ItemUniqueID = CurItemID;
CurItemID++;
}
//ItemInfo->DupItemCode = CheckDupItem(ItemInfo, myConn, TRUE);
ItemInfo->PutItemInBank = TRUE;
if(w) itemQuery.append(",");
sprintf(QueryConsult, "(%lu,'%s',%lu,%d,%d,%d,%d,%d,%d,%d,%d,%u,%lu,",
CharID ,ItemInfo->ItemName,ItemInfo->ItemCount, ItemInfo->TouchEffectType, ItemInfo->TouchEffectValue1, ItemInfo->TouchEffectValue2, ItemInfo->TouchEffectValue3, ItemInfo->ItemColor, ItemInfo->ItemSpecEffectValue1, ItemInfo->ItemSpecEffectValue2, ItemInfo->ItemSpecEffectValue3, ItemInfo->CurLifeSpan, ItemInfo->Attribute);
itemQuery.append(QueryConsult);
if(ItemInfo->socket1 != SG_NONE)
sprintf(QueryConsult, "%u,", ItemInfo->socket1);
else
sprintf(QueryConsult, "NULL,", ItemInfo->socket1);
itemQuery.append(QueryConsult);
if(ItemInfo->socket2 != SG_NONE)
sprintf(QueryConsult, "%u,", ItemInfo->socket2);
else
sprintf(QueryConsult, "NULL,", ItemInfo->socket2);
itemQuery.append(QueryConsult);
if(ItemInfo->socket3 != SG_NONE)
sprintf(QueryConsult, "%u,", ItemInfo->socket3);
else
sprintf(QueryConsult, "NULL,", ItemInfo->socket3);
itemQuery.append(QueryConsult);
sprintf(QueryConsult, "%I64u, 'WH')", ItemInfo->ItemUniqueID);
itemQuery.append(QueryConsult);
DeleteItemOnDB(ItemInfo, CharID, myConn);
}
itemQuery.append(";");
if(ProcessQuery(&myConn, (char *) itemQuery.c_str()) == -1) return;
pQueryResult = mysql_store_result(&myConn);
SAFEFREERESULT(pQueryResult);
}
SAFEDELETE(ItemInfo);
Index += ((NBankItems*62)+1);
ZeroMemory(Profile, sizeof(Profile));
SafeCopy(Profile, (cp+Index), strlen(cp+Index));
ZeroMemory(QueryConsult, sizeof(QueryConsult));
ZeroMemory(GoodGuildName, sizeof(GoodGuildName));
MakeGoodName(GoodGuildName, GuildName);
ZeroMemory(GoodProfile, sizeof(GoodProfile));
MakeGoodName(GoodProfile, Profile);
sprintf(QueryConsult, "UPDATE `char_database` SET `LastSaveDate` = '%s',`ID1` = '%d',`ID2` = '%d',`ID3` = '%d',`Level` = '%d',`Strenght` = '%d',`Vitality` = '%d',`Dexterity` = '%d',`Intelligence` = '%d',`Magic` = '%d',`Agility` = '%d',`Luck` = '%d',`Exp` = '%lu',`Gender` = '%d',`Skin` = '%d',`HairStyle` = '%d',`HairColor` = '%d',`Underwear` = '%d',`ApprColor` = '%lu',`Appr1` = '%lu',`Appr2` = '%lu',`Appr3` = '%lu',`Appr4` = '%lu',`Nation` = '%s',`MapLoc` = '%s',`LocX` = '%d',`LocY` = '%d',`Profile` = '%s',`Contribution` = '%lu',`LeftSpecTime` = '%lu',`LockMapName` = '%s',`LockMapTime` = '%lu',`BlockDate` = '%s',`GuildName` = '%s',`GuildID` = '%d',`GuildRank` = '%d',`FightNum` = '%d',`FightDate` = '%lu',`FightTicket` = '%d',`QuestNum` = '%u',`QuestID` = '%u',`QuestCount` = '%u',`QuestRewType` = '%d',`QuestRewAmmount` = '%lu',\
`QuestCompleted` = '%d',`EventID` = '%lu',`WarCon` = '%lu',`CruJob` = '%d',`CruID` = '%lu',`CruConstructPoint` = '%lu', `Popularity` = '%li' ,`HP` = '%lu',`MP` = '%lu',`SP` = '%lu',`EK` = '%lu',`PK` = '%lu',`RewardGold` = '%lu',`DownSkillID` = '%d',`Hunger` = '%d',`LeftSAC` = '%u',`LeftShutupTime` = '%lu',`LeftPopTime` = '%lu',`LeftForceRecallTime` = '%lu',`LeftFirmStaminarTime` = '%lu',`LeftDeadPenaltyTime` = '%lu',`MagicMastery` = '%s',`PartyID` = '%lu',`GizonItemUpgradeLeft` = '%lu',`elo` = '%lu',`TotalEK` = '%lu' WHERE `CharID` = '%lu' LIMIT 1;",
SaveDate, CharID1, CharID2, CharID3, Level, STR, VIT, DEX, INT, MAG, AGI, Luck, Exp, Sex, Skin, HairStyle, HairColor, Underwear, ApprColor, Appr1, Appr2, Appr3, Appr4, Location, MapName, MapLocX, MapLocY, GoodProfile, Contribution, SpecialAbilityTime, LockedMapName, LockedMapTime, BlockDate, GoodGuildName, GuildID, GuildRank, FightzoneNumber, ReserveTime, FightzoneTicketNumber, Quest, QuestID, CurQuestCount, QuestRewardType, QuestRewardAmmount, IsQuestCompleted, SpecialEventID, WarContribution, CrusadeDuty, CrusadeGUID, ConstructionPoint, Rating, HP, MP, SP, EK, PK, RewardGold, DownSkillIndex, HungerStatus, SuperAttackLeft, TimeLeftShutUp, TimeLeftRating, TimeLeftForceRecall, TimeLeftFirmStaminar, DeadPenaltyTime, MagicMastery, PartyID, Gizon, elo, TotalEK, CharID);
//PutLogFileList(QueryConsult, "Logs/SaveCharQuery.txt");
if(ProcessQuery(&myConn, QueryConsult) == -1) return;
pQueryResult = mysql_store_result(&myConn);
SAFEFREERESULT(pQueryResult);
//char cTxt[50];
//sprintf(cTxt, "save bench: %u", timeGetTime() - bench);
//PutLogList(cTxt, WARN_MSG);
}
void CLoginServer::SaveCharacter(char* Data, MYSQL myConn)
{
char *cp, AccName[15], AccPwd[15], CharName[15], Location[15], MapName[15], BlockDate[25], SaveDate[25],
GuildName[25], GoodGuildName[50], LockedMapName[15], MagicMastery[105], Profile[260], GoodProfile[520], QueryConsult[10000];
sBYTE DownSkillIndex;
BYTE /*STR, DEX, VIT, INT, MAG, AGI,*/ Luck, Sex, Skin, HairStyle,
HairColor, Underwear, HungerStatus, FightzoneNumber,
FightzoneTicketNumber, CrusadeDuty, NItems, NBankItems, SkillMastery;
sWORD MapLocX, MapLocY, GuildRank, GuildID, CharID1, CharID2, CharID3, QuestRewardType;
WORD STR, DEX, VIT, INT, MAG, AGI, Level, Quest, CurQuestCount, SuperAttackLeft, Gizon, w,
IndexForItem, Index;
sDWORD Rating;
long elo;
DWORD HP, MP, SP, Exp, EK, TotalEK, PK, RewardGold, TimeLeftShutUp, TimeLeftRating, TimeLeftForceRecall,
TimeLeftFirmStaminar, QuestID, QuestRewardAmmount, Contribution, WarContribution, SpecialEventID,
ReserveTime, LockedMapTime, CrusadeGUID, ConstructionPoint, DeadPenaltyTime,
PartyID, SpecialAbilityTime, Appr1, Appr2, Appr3, Appr4, ApprColor, SkillSSN, CharID;
uint64 CurItemID;
BOOL Flag, IsQuestCompleted, bIsBankModified;
SYSTEMTIME SaveTime;
st_mysql_res *pQueryResult = NULL;
cItem *ItemInfo;
string itemQuery;
static long charIndexEnd = 252;
//uint32 bench = timeGetTime();
ZeroMemory(CharName, sizeof(CharName));
SafeCopy(CharName, Data, 10);
ZeroMemory(AccName, sizeof(AccName));
SafeCopy(AccName, Data+10, 10);
ZeroMemory(AccPwd, sizeof(AccPwd));
SafeCopy(AccPwd, Data+20, 10);
Flag = (BOOL)bGetOffsetValue(Data, 30);
CharID = GetCharID(CharName, AccName, myConn);
cp = (Data+31);
SaveTime.wYear = wGetOffsetValue(cp, 0);
SaveTime.wMonth = bGetOffsetValue(cp, 2);
SaveTime.wDay = bGetOffsetValue(cp, 3);
SaveTime.wHour = bGetOffsetValue(cp, 4);
SaveTime.wMinute = bGetOffsetValue(cp, 5);
SaveTime.wSecond = bGetOffsetValue(cp, 6);
ZeroMemory(SaveDate, sizeof(SaveDate));
sprintf(SaveDate, "%d-%d-%d %d:%d:%d", SaveTime.wYear, SaveTime.wMonth, SaveTime.wDay, SaveTime.wHour, SaveTime.wMinute, SaveTime.wSecond);
ZeroMemory(Location, sizeof(Location));
SafeCopy(Location, cp+7, 10);
ZeroMemory(MapName, sizeof(MapName));
SafeCopy(MapName, cp+17, 10);
MapLocX = (sWORD)wGetOffsetValue(cp, 27);
MapLocY = (sWORD)wGetOffsetValue(cp, 29);
ZeroMemory(GuildName, sizeof(GuildName));
SafeCopy(GuildName, cp+31, 20);
GuildID = wGetOffsetValue(cp, 51);
GuildRank = (sWORD)wGetOffsetValue(cp, 53);
HP = dwGetOffsetValue(cp, 55);
MP = dwGetOffsetValue(cp, 59);
SP = dwGetOffsetValue(cp, 63);
Level = wGetOffsetValue(cp, 67);
Rating = (sDWORD)dwGetOffsetValue(cp, 69);
STR = bGetOffsetValue(cp, 73);
VIT = bGetOffsetValue(cp, 75);
DEX = bGetOffsetValue(cp, 77);
INT = bGetOffsetValue(cp, 79);
MAG = bGetOffsetValue(cp, 81);
AGI = bGetOffsetValue(cp, 83);
Luck = bGetOffsetValue(cp, 84);
Exp = dwGetOffsetValue(cp, 85);
EK = dwGetOffsetValue(cp, 89);
PK = dwGetOffsetValue(cp, 93);
RewardGold = dwGetOffsetValue(cp, 97);
DownSkillIndex = (sBYTE)bGetOffsetValue(cp, 101);
CharID1 = (sWORD)dwGetOffsetValue(cp, 102);
CharID2 = (sWORD)dwGetOffsetValue(cp, 106);
CharID3 = (sWORD)dwGetOffsetValue(cp, 110);
Sex = bGetOffsetValue(cp, 114);
Skin = bGetOffsetValue(cp, 115);
HairStyle = bGetOffsetValue(cp, 116);
HairColor = bGetOffsetValue(cp, 117);
Underwear = bGetOffsetValue(cp, 118);
HungerStatus = bGetOffsetValue(cp, 119);
TimeLeftShutUp = dwGetOffsetValue(cp, 120);
TimeLeftRating = dwGetOffsetValue(cp, 124);
TimeLeftForceRecall = dwGetOffsetValue(cp, 128);
TimeLeftFirmStaminar = dwGetOffsetValue(cp, 132);
bIsBankModified = (BOOL)bGetOffsetValue(cp, 136);
ZeroMemory(BlockDate, sizeof(BlockDate));
SafeCopy(BlockDate, cp+137, 20);
Quest = wGetOffsetValue(cp, 157);
QuestID = wGetOffsetValue(cp, 159);
CurQuestCount = wGetOffsetValue(cp, 161);
QuestRewardType = (sWORD)wGetOffsetValue(cp, 163);
QuestRewardAmmount = dwGetOffsetValue(cp, 165);
Contribution = dwGetOffsetValue(cp, 169);
WarContribution = dwGetOffsetValue(cp, 173);
IsQuestCompleted = (BOOL)bGetOffsetValue(cp, 177);
SpecialEventID = dwGetOffsetValue(cp, 178);
SuperAttackLeft = wGetOffsetValue(cp, 182);
FightzoneNumber = bGetOffsetValue(cp, 184);
ReserveTime = dwGetOffsetValue(cp, 185);
FightzoneTicketNumber = bGetOffsetValue(cp, 189);
SpecialAbilityTime = dwGetOffsetValue(cp, 190);
ZeroMemory(LockedMapName, sizeof(LockedMapName));
SafeCopy(LockedMapName, cp+194, 10);
LockedMapTime = dwGetOffsetValue(cp, 204);
CrusadeDuty = bGetOffsetValue(cp, 208);
CrusadeGUID = dwGetOffsetValue(cp, 209);
ConstructionPoint = dwGetOffsetValue(cp, 213);
DeadPenaltyTime = dwGetOffsetValue(cp, 217);
PartyID = dwGetOffsetValue(cp, 221);
//PartyID = 0;
Gizon = wGetOffsetValue(cp, 225);
SpecialAbilityTime = dwGetOffsetValue(cp, 227);
Appr1 = wGetOffsetValue(cp, 231);
Appr2 = wGetOffsetValue(cp, 235);
Appr3 = wGetOffsetValue(cp, 239);
Appr4 = wGetOffsetValue(cp, 243);
ApprColor = dwGetOffsetValue(cp, 247);
elo = wGetOffsetValue(cp, 251);
TotalEK = dwGetOffsetValue(cp, 253);
ZeroMemory(MagicMastery, sizeof(MagicMastery));
SafeCopy(MagicMastery, cp+charIndexEnd, 100);
string skillQuery;
skillQuery.append("UPDATE `skill` SET `SkillMastery` = CASE SkillID ");
for (w = 0; w < 24; w++)
{
SkillMastery = bGetOffsetValue(cp, charIndexEnd+100+w);
sprintf(QueryConsult, "WHEN %u THEN %u ", w, SkillMastery);
skillQuery.append(QueryConsult);
}
skillQuery.append("END,");
skillQuery.append("`SkillSSN` = CASE SkillID ");
for (w = 0; w < 24; w++)
{
SkillSSN = dwGetOffsetValue(cp, charIndexEnd+124+(w*4));
sprintf(QueryConsult, "WHEN %u THEN %u ", w, SkillSSN);
skillQuery.append(QueryConsult);
}
skillQuery.append("END ");
sprintf(QueryConsult, "WHERE `CharID` = '%lu' LIMIT 24;", CharID);
skillQuery.append(QueryConsult);
if(ProcessQuery(&myConn, (char*)skillQuery.c_str()) == -1) return;
pQueryResult = mysql_store_result(&myConn);
SAFEFREERESULT(pQueryResult);
NItems = bGetOffsetValue(cp, charIndexEnd+224);
CurItemID = (GetLastInsertedItemID(myConn)+1);
DeleteAllItemsFromChar(CharID, myConn, bIsBankModified);
ItemInfo = new cItem;
if(NItems > 0)
{
itemQuery.append("INSERT INTO `item` ( `CharID` , `ItemName`, `Count` , `ItemType`, `ID1`, `ID2`, `ID3`, `Color`, \
`Effect1`, `Effect2`, `Effect3`, `LifeSpan`, `Attribute`, `Socket1`, `Socket2`, `Socket3`, `ItemEquip`, \
`ItemPosX`, `ItemPosY`, `ItemID`, `ItemPos`) VALUES");
for(w = 0; w < NItems; w++)
{
IndexForItem = (WORD)(charIndexEnd+225 + (w*67));
ZeroMemory(ItemInfo->ItemName, sizeof(ItemInfo->ItemName));
SafeCopy(ItemInfo->ItemName, cp+IndexForItem, 20);
if(strlen(ItemInfo->ItemName) == 0) continue;
ItemInfo->ItemCount = dwGetOffsetValue(cp, (IndexForItem+20));
ItemInfo->TouchEffectType = (sWORD)wGetOffsetValue(cp, (IndexForItem+24));
ItemInfo->TouchEffectValue1 = (sWORD)wGetOffsetValue(cp, (IndexForItem+26));
ItemInfo->TouchEffectValue2 = (sWORD)wGetOffsetValue(cp, (IndexForItem+30));
ItemInfo->TouchEffectValue3 = (sWORD)dwGetOffsetValue(cp, (IndexForItem+34));
ItemInfo->ItemColor = bGetOffsetValue(cp, (IndexForItem+38));
ItemInfo->ItemSpecEffectValue1 = (sWORD)wGetOffsetValue(cp, (IndexForItem+39));
ItemInfo->ItemSpecEffectValue2 = (sWORD)wGetOffsetValue(cp, (IndexForItem+41));
ItemInfo->ItemSpecEffectValue3 = (sWORD)wGetOffsetValue(cp, (IndexForItem+43));
ItemInfo->CurLifeSpan = wGetOffsetValue(cp, (IndexForItem+45));
ItemInfo->Attribute = dwGetOffsetValue(cp, (IndexForItem+47));
ItemInfo->socket1 = bGetOffsetValue(cp, (IndexForItem+51));
ItemInfo->socket2 = bGetOffsetValue(cp, (IndexForItem+52));
ItemInfo->socket3 = bGetOffsetValue(cp, (IndexForItem+53));
ItemInfo->IsItemEquipped = (BOOL)bGetOffsetValue(cp, (IndexForItem+54));
ItemInfo->ItemPosX = (sWORD)wGetOffsetValue(cp, (IndexForItem+55));
ItemInfo->ItemPosY = (sWORD)wGetOffsetValue(cp, (IndexForItem+57));
ItemInfo->ItemUniqueID = ullGetOffsetValue(cp, (IndexForItem+59));
if(ItemInfo->ItemUniqueID == 0){
ItemInfo->ItemUniqueID = CurItemID;
CurItemID++;
}
//ItemInfo->DupItemCode = CheckDupItem(ItemInfo, myConn, FALSE);
ItemInfo->PutItemInBank = FALSE;
if(w) itemQuery.append(",");
sprintf(QueryConsult, "(%lu,'%s',%lu,%d,%d,%d,%d,%d,%d,%d,%d,%u,%lu,",
CharID ,ItemInfo->ItemName,ItemInfo->ItemCount, ItemInfo->TouchEffectType, ItemInfo->TouchEffectValue1, ItemInfo->TouchEffectValue2, ItemInfo->TouchEffectValue3, ItemInfo->ItemColor, ItemInfo->ItemSpecEffectValue1, ItemInfo->ItemSpecEffectValue2, ItemInfo->ItemSpecEffectValue3, ItemInfo->CurLifeSpan, ItemInfo->Attribute);
itemQuery.append(QueryConsult);
if(ItemInfo->socket1 != SG_NONE)
sprintf(QueryConsult, "%u,", ItemInfo->socket1);
else
sprintf(QueryConsult, "NULL,", ItemInfo->socket1);
itemQuery.append(QueryConsult);
if(ItemInfo->socket2 != SG_NONE)
sprintf(QueryConsult, "%u,", ItemInfo->socket2);
else
sprintf(QueryConsult, "NULL,", ItemInfo->socket2);
itemQuery.append(QueryConsult);
if(ItemInfo->socket3 != SG_NONE)
sprintf(QueryConsult, "%u,", ItemInfo->socket3);
else
sprintf(QueryConsult, "NULL,", ItemInfo->socket3);
itemQuery.append(QueryConsult);
sprintf(QueryConsult, "%d,%d,%d,%I64u,'BAG')", ItemInfo->IsItemEquipped, ItemInfo->ItemPosX, ItemInfo->ItemPosY, ItemInfo->ItemUniqueID);
itemQuery.append(QueryConsult);
DeleteItemOnDB(ItemInfo, CharID, myConn);
}
itemQuery.append(";");
if(ProcessQuery(&myConn, (char *) itemQuery.c_str()) == -1) return;
pQueryResult = mysql_store_result(&myConn);
SAFEFREERESULT(pQueryResult);
}
Index = (WORD)(charIndexEnd+225+(NItems*67));
NBankItems = bGetOffsetValue(cp, Index);
if(NBankItems > 0){
itemQuery.clear();
itemQuery.append("INSERT INTO `item` ( `CharID` , `ItemName`, `Count` , `ItemType`, `ID1`, `ID2`, `ID3`, \
`Color`, `Effect1`, `Effect2`, `Effect3`, `LifeSpan`, `Attribute`, `Socket1`, `Socket2`, `Socket3`, `ItemID`, `ItemPos`) VALUES ");
for(w = 0; w < NBankItems; w++){
IndexForItem = (WORD)(Index+1+(w*62));
ZeroMemory(ItemInfo->ItemName, sizeof(ItemInfo->ItemName));
SafeCopy(ItemInfo->ItemName, cp+IndexForItem, 20);
if(strlen(ItemInfo->ItemName) == 0) continue;
ItemInfo->ItemCount = dwGetOffsetValue(cp, (IndexForItem+20));
ItemInfo->TouchEffectType = (sWORD)wGetOffsetValue(cp, (IndexForItem+24));
ItemInfo->TouchEffectValue1 = (sWORD)wGetOffsetValue(cp, (IndexForItem+26));
ItemInfo->TouchEffectValue2 = (sWORD)wGetOffsetValue(cp, (IndexForItem+30));
ItemInfo->TouchEffectValue3 = (sWORD)dwGetOffsetValue(cp, (IndexForItem+34));
ItemInfo->ItemColor = bGetOffsetValue(cp, (IndexForItem+38));
ItemInfo->ItemSpecEffectValue1 = (sWORD)wGetOffsetValue(cp, (IndexForItem+39));
ItemInfo->ItemSpecEffectValue2 = (sWORD)wGetOffsetValue(cp, (IndexForItem+41));
ItemInfo->ItemSpecEffectValue3 = (sWORD)wGetOffsetValue(cp, (IndexForItem+43));
ItemInfo->CurLifeSpan = wGetOffsetValue(cp, (IndexForItem+45));
ItemInfo->Attribute = dwGetOffsetValue(cp, (IndexForItem+47));
ItemInfo->socket1 = bGetOffsetValue(cp, (IndexForItem+51));
ItemInfo->socket2 = bGetOffsetValue(cp, (IndexForItem+52));
ItemInfo->socket3 = bGetOffsetValue(cp, (IndexForItem+53));
ItemInfo->ItemUniqueID = ullGetOffsetValue(cp, (IndexForItem+54));
if(ItemInfo->ItemUniqueID == 0){
ItemInfo->ItemUniqueID = CurItemID;
CurItemID++;
}
//ItemInfo->DupItemCode = CheckDupItem(ItemInfo, myConn, TRUE);
ItemInfo->PutItemInBank = TRUE;
if(w) itemQuery.append(",");
sprintf(QueryConsult, "(%lu,'%s',%lu,%d,%d,%d,%d,%d,%d,%d,%d,%u,%lu,",
CharID ,ItemInfo->ItemName,ItemInfo->ItemCount, ItemInfo->TouchEffectType, ItemInfo->TouchEffectValue1, ItemInfo->TouchEffectValue2, ItemInfo->TouchEffectValue3, ItemInfo->ItemColor, ItemInfo->ItemSpecEffectValue1, ItemInfo->ItemSpecEffectValue2, ItemInfo->ItemSpecEffectValue3, ItemInfo->CurLifeSpan, ItemInfo->Attribute);
itemQuery.append(QueryConsult);
if(ItemInfo->socket1 != SG_NONE)
sprintf(QueryConsult, "%u,", ItemInfo->socket1);
else
sprintf(QueryConsult, "NULL,", ItemInfo->socket1);
itemQuery.append(QueryConsult);
if(ItemInfo->socket2 != SG_NONE)
sprintf(QueryConsult, "%u,", ItemInfo->socket2);
else
sprintf(QueryConsult, "NULL,", ItemInfo->socket2);
itemQuery.append(QueryConsult);
if(ItemInfo->socket3 != SG_NONE)
sprintf(QueryConsult, "%u,", ItemInfo->socket3);
else
sprintf(QueryConsult, "NULL,", ItemInfo->socket3);
itemQuery.append(QueryConsult);
sprintf(QueryConsult, "%I64u, 'WH')", ItemInfo->ItemUniqueID);
itemQuery.append(QueryConsult);
DeleteItemOnDB(ItemInfo, CharID, myConn);
}
itemQuery.append(";");
if(ProcessQuery(&myConn, (char *) itemQuery.c_str()) == -1) return;
pQueryResult = mysql_store_result(&myConn);
SAFEFREERESULT(pQueryResult);
}
SAFEDELETE(ItemInfo);
Index += ((NBankItems*62)+1);
ZeroMemory(Profile, sizeof(Profile));
SafeCopy(Profile, (cp+Index), strlen(cp+Index));
ZeroMemory(QueryConsult, sizeof(QueryConsult));
ZeroMemory(GoodGuildName, sizeof(GoodGuildName));
MakeGoodName(GoodGuildName, GuildName);
ZeroMemory(GoodProfile, sizeof(GoodProfile));
MakeGoodName(GoodProfile, Profile);
sprintf(QueryConsult, "UPDATE `char_database` SET `LastSaveDate` = '%s',`ID1` = '%d',`ID2` = '%d',`ID3` = '%d',`Level` = '%d',`Strenght` = '%d',`Vitality` = '%d',`Dexterity` = '%d',`Intelligence` = '%d',`Magic` = '%d',`Agility` = '%d',`Luck` = '%d',`Exp` = '%lu',`Gender` = '%d',`Skin` = '%d',`HairStyle` = '%d',`HairColor` = '%d',`Underwear` = '%d',`ApprColor` = '%lu',`Appr1` = '%lu',`Appr2` = '%lu',`Appr3` = '%lu',`Appr4` = '%lu',`Nation` = '%s',`MapLoc` = '%s',`LocX` = '%d',`LocY` = '%d',`Profile` = '%s',`Contribution` = '%lu',`LeftSpecTime` = '%lu',`LockMapName` = '%s',`LockMapTime` = '%lu',`BlockDate` = '%s',`GuildName` = '%s',`GuildID` = '%d',`GuildRank` = '%d',`FightNum` = '%d',`FightDate` = '%lu',`FightTicket` = '%d',`QuestNum` = '%u',`QuestID` = '%u',`QuestCount` = '%u',`QuestRewType` = '%d',`QuestRewAmmount` = '%lu',\
`QuestCompleted` = '%d',`EventID` = '%lu',`WarCon` = '%lu',`CruJob` = '%d',`CruID` = '%lu',`CruConstructPoint` = '%lu', `Popularity` = '%li' ,`HP` = '%lu',`MP` = '%lu',`SP` = '%lu',`EK` = '%lu',`PK` = '%lu',`RewardGold` = '%lu',`DownSkillID` = '%d',`Hunger` = '%d',`LeftSAC` = '%u',`LeftShutupTime` = '%lu',`LeftPopTime` = '%lu',`LeftForceRecallTime` = '%lu',`LeftFirmStaminarTime` = '%lu',`LeftDeadPenaltyTime` = '%lu',`MagicMastery` = '%s',`PartyID` = '%lu',`GizonItemUpgradeLeft` = '%lu',`elo` = '%lu',`TotalEK` = '%lu' WHERE `CharID` = '%lu' LIMIT 1;",
SaveDate, CharID1, CharID2, CharID3, Level, STR, VIT, DEX, INT, MAG, AGI, Luck, Exp, Sex, Skin, HairStyle, HairColor, Underwear, ApprColor, Appr1, Appr2, Appr3, Appr4, Location, MapName, MapLocX, MapLocY, GoodProfile, Contribution, SpecialAbilityTime, LockedMapName, LockedMapTime, BlockDate, GoodGuildName, GuildID, GuildRank, FightzoneNumber, ReserveTime, FightzoneTicketNumber, Quest, QuestID, CurQuestCount, QuestRewardType, QuestRewardAmmount, IsQuestCompleted, SpecialEventID, WarContribution, CrusadeDuty, CrusadeGUID, ConstructionPoint, Rating, HP, MP, SP, EK, PK, RewardGold, DownSkillIndex, HungerStatus, SuperAttackLeft, TimeLeftShutUp, TimeLeftRating, TimeLeftForceRecall, TimeLeftFirmStaminar, DeadPenaltyTime, MagicMastery, PartyID, Gizon, elo, TotalEK, CharID);
//PutLogFileList(QueryConsult, "Logs/SaveCharQuery.txt");
if(ProcessQuery(&myConn, QueryConsult) == -1) return;
pQueryResult = mysql_store_result(&myConn);
SAFEFREERESULT(pQueryResult);
//char cTxt[50];
//sprintf(cTxt, "save bench: %u", timeGetTime() - bench);
//PutLogList(cTxt, WARN_MSG);
}
Sorry... I give up.
I don't want to be rude, but you should learn how to structure your code and make it readable. And learn how to use the debugger.
I don't want to be rude, but you should learn how to structure your code and make it readable. And learn how to use the debugger.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement