Пример #1
0
//=============================================================================
//
// database callback
//
void ObjectController::handleDatabaseJobComplete(void* ref,DatabaseResult* result)
{
    ObjControllerAsyncContainer* asyncContainer = reinterpret_cast<ObjControllerAsyncContainer*>(ref);

    switch(asyncContainer->mQueryType)
    {
    case OCQuery_StatRead:
    {
        if(!asyncContainer->playerObject)
            break;

        Ham* ourHam = asyncContainer->playerObject->getHam();

        StatTargets theTargets;

        DataBinding* binding = mDatabase->createDataBinding(9);
        binding->addField(DFT_uint32,offsetof(StatTargets,TargetHealth),4,0);
        binding->addField(DFT_uint32,offsetof(StatTargets,TargetStrength),4,1);
        binding->addField(DFT_uint32,offsetof(StatTargets,TargetConstitution),4,2);
        binding->addField(DFT_uint32,offsetof(StatTargets,TargetAction),4,3);
        binding->addField(DFT_uint32,offsetof(StatTargets,TargetQuickness),4,4);
        binding->addField(DFT_uint32,offsetof(StatTargets,TargetStamina),4,5);
        binding->addField(DFT_uint32,offsetof(StatTargets,TargetMind),4,6);
        binding->addField(DFT_uint32,offsetof(StatTargets,TargetFocus),4,7);
        binding->addField(DFT_uint32,offsetof(StatTargets,TargetWillpower),4,8);

        uint64	count	= result->getRowCount();
        //make sure we have some values set in case the statmigration table wont hold anything on us
        if(count != 1)
        {
            ourHam->setTargetStatValue(HamBar_Health,ourHam->getPropertyValue(HamBar_Health,HamProperty_BaseHitpoints));
            ourHam->setTargetStatValue(HamBar_Strength,ourHam->getPropertyValue(HamBar_Strength,HamProperty_BaseHitpoints));
            ourHam->setTargetStatValue(HamBar_Constitution,ourHam->getPropertyValue(HamBar_Constitution,HamProperty_BaseHitpoints));

            ourHam->setTargetStatValue(HamBar_Action,ourHam->getPropertyValue(HamBar_Action,HamProperty_BaseHitpoints));
            ourHam->setTargetStatValue(HamBar_Quickness,ourHam->getPropertyValue(HamBar_Quickness,HamProperty_BaseHitpoints));
            ourHam->setTargetStatValue(HamBar_Stamina,ourHam->getPropertyValue(HamBar_Stamina,HamProperty_BaseHitpoints));

            ourHam->setTargetStatValue(HamBar_Mind,ourHam->getPropertyValue(HamBar_Mind,HamProperty_BaseHitpoints));
            ourHam->setTargetStatValue(HamBar_Focus,ourHam->getPropertyValue(HamBar_Focus,HamProperty_BaseHitpoints));
            ourHam->setTargetStatValue(HamBar_Willpower,ourHam->getPropertyValue(HamBar_Willpower,HamProperty_BaseHitpoints));

        }
        else
        {
            result->getNextRow(binding,&theTargets);
            ourHam->setTargetStatValue(HamBar_Health,theTargets.TargetHealth);
            ourHam->setTargetStatValue(HamBar_Strength,theTargets.TargetStrength);
            ourHam->setTargetStatValue(HamBar_Constitution,theTargets.TargetConstitution);

            ourHam->setTargetStatValue(HamBar_Action,theTargets.TargetAction);
            ourHam->setTargetStatValue(HamBar_Quickness,theTargets.TargetQuickness);
            ourHam->setTargetStatValue(HamBar_Stamina,theTargets.TargetStamina);

            ourHam->setTargetStatValue(HamBar_Mind,theTargets.TargetMind);
            ourHam->setTargetStatValue(HamBar_Focus,theTargets.TargetFocus);
            ourHam->setTargetStatValue(HamBar_Willpower,theTargets.TargetWillpower);
        }

        mDatabase->destroyDataBinding(binding);
        gMessageLib->sendStatMigrationStartMessage(asyncContainer->playerObject);
    }
    break;

    case OCQuery_FindFriend:
    {
        DataBinding* binding = mDatabase->createDataBinding(1);
        binding->addField(DFT_uint64,0,8);

        uint64	ret		= 0;
        uint64	count	= result->getRowCount();

        result->getNextRow(binding,&ret);

        mDatabase->destroyDataBinding(binding);
        if(count == 0)
            ret = 0;

        _handleFindFriendDBReply(ret,asyncContainer->mString);

    }
    break;

    case OCQuery_AddFriend:
    {
        DataBinding* binding = mDatabase->createDataBinding(1);
        binding->addField(DFT_uint32,0,4);

        uint32	ret		= 0;
        //uint64	count	= result->getRowCount();

        result->getNextRow(binding,&ret);

        mDatabase->destroyDataBinding(binding);

        _handleAddFriendDBReply(ret,asyncContainer->mString);
    }
    break;

    case OCQuery_RemoveFriend:
    {
        DataBinding* binding = mDatabase->createDataBinding(1);
        binding->addField(DFT_uint32,0,4);

        uint32	ret		= 0;
        //uint64	count	= result->getRowCount();

        result->getNextRow(binding,&ret);

        mDatabase->destroyDataBinding(binding);

        _handleRemoveFriendDBReply(ret,asyncContainer->mString);
    }
    break;

    case OCQuery_AddIgnore:
    {
        DataBinding* binding = mDatabase->createDataBinding(1);
        binding->addField(DFT_uint32,0,4);

        uint32	ret		= 0;
        //uint64	count	= result->getRowCount();

        result->getNextRow(binding,&ret);

        mDatabase->destroyDataBinding(binding);

        _handleAddIgnoreDBReply(ret,asyncContainer->mString);
    }
    break;

    case OCQuery_RemoveIgnore:
    {
        DataBinding* binding = mDatabase->createDataBinding(1);
        binding->addField(DFT_uint32,0,4);

        uint32	ret		= 0;
        //uint64	count	= result->getRowCount();

        result->getNextRow(binding,&ret);

        mDatabase->destroyDataBinding(binding);

        _handleRemoveIgnoreDBReply(ret,asyncContainer->mString);
    }
    break;

    case OCQuery_CloneAtPreDes:
    {
        if (!asyncContainer->playerObject)
            break;

        if (!result->getRowCount()) {
        	break;
        }

        DataBinding* binding = mDatabase->createDataBinding(9);
        binding->addField(DFT_uint32,offsetof(PlayerObject,mHam.mHealth.mWounds),4,0);
        binding->addField(DFT_uint32,offsetof(PlayerObject,mHam.mStrength.mWounds),4,1);
        binding->addField(DFT_uint32,offsetof(PlayerObject,mHam.mConstitution.mWounds),4,2);
        binding->addField(DFT_uint32,offsetof(PlayerObject,mHam.mAction.mWounds),4,3);
        binding->addField(DFT_uint32,offsetof(PlayerObject,mHam.mQuickness.mWounds),4,4);
        binding->addField(DFT_uint32,offsetof(PlayerObject,mHam.mStamina.mWounds),4,5);
        binding->addField(DFT_uint32,offsetof(PlayerObject,mHam.mMind.mWounds),4,6);
        binding->addField(DFT_uint32,offsetof(PlayerObject,mHam.mFocus.mWounds),4,7);
        binding->addField(DFT_uint32,offsetof(PlayerObject,mHam.mWillpower.mWounds),4,8);

        result->getNextRow(binding,asyncContainer->playerObject);

        // Update HAM
        // asyncContainer->playerObject->getHam()->calcAllModifiedHitPoints();
        asyncContainer->playerObject->getHam()->updateAllWounds(0);

        // Invoke the actual cloning process.
        SpawnPoint* sp = reinterpret_cast<SpawnPoint*>(asyncContainer->anyPtr);
        if (sp)
        {
            asyncContainer->playerObject->clone(sp->mCellId,sp->mDirection,sp->mPosition,true);
        }

        mDatabase->destroyDataBinding(binding);
    }
    break;

    default:
    {
    }
    break;
    }

    mDBAsyncContainerPool.free(asyncContainer);
}