Ejemplo n.º 1
0
    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;
    }