bool checkCode(Player *player, Creature *_Creature, const char* sCode) { // Some variables declarations. PreparedQueryResult result; int32 item_id = 0; uint32 quantity = 0; uint32 uses = 0; uint32 account = 0; uint64 charguid = 0; uint8 newlevel = 0; bool found = false; uint32 creatureID = _Creature->GetEntry(); creatureID = creatureID == 1000104 ? 90001 : creatureID; PreparedStatement *stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_CODEBOX_ITEM); stmt->setUInt32(0, creatureID); stmt->setUInt32(1, player->GetSession()->GetAccountId()); result = CharacterDatabase.Query(stmt); if(!result) { sLog->outError("CodeBox: Player %u request code (%s) on npc %u but no code found.", player->GetGUID(), sCode, creatureID); _Creature->MonsterWhisper("Der Code ist falsch! Komme wieder, wenn du einen gueltigen Code hast!", player->GetGUID()); return false; } do { Field *fields = result->Fetch(); item_id = fields[0].GetInt32(); quantity = fields[1].GetUInt32(); uses = fields[2].GetUInt8(); account = fields[3].GetUInt32(); charguid = fields[4].GetUInt64(); newlevel = fields[5].GetUInt8(); const char* dbcode = fields[6].GetCString(); sLog->outDebug(LOG_FILTER_TSCR, "CodeBox: Found Code (%s) in DB", dbcode); if(!strcmp(dbcode, sCode)) { sLog->outDebug(LOG_FILTER_TSCR, "CodeBox: DB Code %s matches player code %s", dbcode, sCode); found = true; break; } } while (result->NextRow()); result.release(); if(!found) { sLog->outError("CodeBox: Player %u request not existing code (%s).", player->GetGUID(), sCode); _Creature->MonsterWhisper("Der Code ist falsch! Komme wieder, wenn du einen gueltigen Code hast!", player->GetGUID()); return false; } if(account != player->GetSession()->GetAccountId()) { sLog->outError("CodeBox: Player %u request correct code (%s) but account doesn't match. Playeraccount: %u CodeAccount: %u", player->GetGUID(), sCode, player->GetSession()->GetAccountId(), account); _Creature->MonsterWhisper("Der Code ist falsch! Komme wieder, wenn du einen gueltigen Code hast!", player->GetGUID()); return false; } if(charguid && player->GetGUID() != charguid) { sLog->outError("CodeBox: Player %u request correct code (%s) but guid doesn't match. CodeGUID: ", player->GetGUID(), charguid); _Creature->MonsterWhisper("Leider kannst du diesen Code nicht mit diesem Charakter Einloesen!", player->GetGUID()); return false; } if(!uses) { sLog->outError("CodeBox: Player %u request correct code (%s) but available uses reached 0.", player->GetGUID(), sCode); _Creature->MonsterWhisper("Der Code wurde bereits eingeloest! Komme wieder, wenn du einen gueltigen Code hast!", player->GetGUID()); return false; } if(newlevel && player->getLevel() >= newlevel) { sLog->outError("CodeBox: Player %u request correct code (%s) but playerlevel is to high. Playerlevel: %u Codelevel: %u", player->GetGUID(), player->getLevel(), newlevel); _Creature->MonsterWhisper("Leider kannst du diesen Code nicht mit diesem Charakter Einloesen denn dein Level ist zu hoch!", player->GetGUID()); return false; } // levelcode if(newlevel > 0) { player->GiveLevel(newlevel); player->InitTalentForLevel(); player->SetUInt32Value(PLAYER_XP,0); _Creature->MonsterWhisper("Herzlichen Glueckwunsch zu deinem neuem Level!", player->GetGUID()); } // itemcode else if(item_id > 0) { if(!AddItem(_Creature, player, item_id, quantity)) return false; } // itemcode for randomitem else if(item_id < 0) { PreparedQueryResult items; uint32 item; PreparedStatement *itemGroupStmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_CODEBOX_ITEMGROUP); itemGroupStmt->setUInt32(0, -item_id); items = CharacterDatabase.Query(itemGroupStmt); if(!items) { sLog->outError("CodeBox: Player %u request item from itemgroup: %u but itemgroup not found.", player->GetGUID(), -item_id); _Creature->MonsterWhisper("Bei dem Verarbeiten deines Codes ist ein Interner Fehler aufgetreten. Bitte melde diesen mit genauer Zeit in einem Ticket!", player->GetGUID()); } item = items->Fetch()[0].GetUInt32(); items.release(); if(!AddItem(_Creature, player, item, quantity)) return false; } CharacterDatabase.PExecute("UPDATE `codes` SET `uses` = (`uses` - 1) WHERE `npc_id` = %u AND `account_id` = %u AND `code` = '%s'",creatureID, account, sCode); /*PreparedStatement* used_stmt = CharacterDatabase.GetPreparedStatement(CHAR_SET_CODEBOX_CODE_USED); used_stmt->setUInt32(0, creatureID); used_stmt->setUInt32(1, account); CharacterDatabase.Execute(used_stmt);*/ if(item_id != 0) { if(item_id == 200000 || item_id == 200005) _Creature->MonsterWhisper("Viel Spass mit dem Item!", player->GetGUID()); else _Creature->MonsterWhisper("Danke, dass du dem Server mit deiner Spende unterstuetzt und viel Spass mit dem Item!", player->GetGUID()); } return true; }