hsBool plUpdatableClient::Init()
{
    if (plClient::Init())
    {
        GetResMgr()->ForceLoadDirectory(fDataPath, true);
        // Page in the SceneViewer now that our key is ready
        GetResMgr()->PageInSceneViewer();
        return true;
    }

    return false;
}
StoneMine::StoneMine(IHoeScene * scn) : SourceBuilding(scn, v_build), m_stone(EBS_Stone)
{
	SetModel((IHoeModel*)GetResMgr()->ReqResource(model_STONEMINE));
	m_stone.SetOwner(this); CRR::Get()->Register(&m_stone);
	m_stone.SetPriority(EBSP_TimeWork);
	m_stone.SetNum(101);
}
//-----------------------------------------------------------------------------
MBOOL 
ResourceLockImp::
SetMode(ECamAdapter Type)
{
    MBOOL Result = MTRUE;
    //
    Mutex::Autolock lock(mLock);
    //
    MY_LOGD("Type(%d)",Type);
    //
    if(mUser <= 0)
    {
        MY_LOGE("No user");
        Result = MFALSE;
        goto EXIT;
    }
    //
    if(mpResMgr != NULL)
    {
        RES_MGR_DRV_MODE_STRUCT rResMode;
        GetResMgr(Type, rResMode);
        mpResMgr->SetMode(&rResMode);
    }
    //
    EXIT:
    return Result;
}
plNetMessage* plNetClientStreamRecorder::IGetNextMessage()
{
    plNetMessage* msg = nil;

    if (!IsQueueEmpty() && GetNextMessageTimeDelta() <= 0 )
    {
        msg = plNetMessage::ConvertNoRef(GetResMgr()->ReadCreatableVersion(fRecordStream));
        // msg->SetPeeked(true);

        // Fix the flags on game messages, so we won't get an assert later
        plNetMsgGameMessage* gameMsg = plNetMsgGameMessage::ConvertNoRef(msg);
        if (gameMsg)
        {
            plMessage* plMsg = gameMsg->GetContainedMsg(GetResMgr());
            plNetClientApp::GetInstance()->UnInheritNetMsgFlags(plMsg);

            // write message (and label) to ram stream
            hsRAMStream stream;
            GetResMgr()->WriteCreatable(&stream, plMsg);

            // put stream in net msg wrapper
            gameMsg->StreamInfo()->CopyStream(&stream);
            // gameMsg->StreamInfo()->SetStreamType(plMsg->ClassIndex());       // type of game msg
        }

        double nextPlaybackTime = fRecordStream->ReadLEDouble();
        if (nextPlaybackTime < fNextPlaybackTime)
            fBetweenAges = true;

        fNextPlaybackTime = nextPlaybackTime;

        // If this was the last message, stop playing back
        if (fRecordStream->AtEnd())
        {
            fRecordStream->Close();
            delete fRecordStream;
            fRecordStream = nil;
        }
    }
    
    return msg;
}
void plNetClientStreamRecorder::RecordMsg(plNetMessage* msg, double secs)
{
    if (!fRecordStream)
        return;

    if (IProcessRecordMsg(msg,secs))
    {
        fRecordStream->WriteLEDouble(secs - fPlaybackTimeOffset);
        GetResMgr()->WriteCreatableVersion(fRecordStream, msg);

        ILogMsg(msg);
    }
}
示例#6
0
bool ConsoleDialog::Load(IHoe3DEngine *eng)
{
	engine = eng;
	m_fontcolor = 0xffcf0000;

	font = (IHoeFont *)eng->Create("font 'resource/font.ttf' 12");
	if (!font)
		return false;
	background = (IHoePicture*)GetResMgr()->ReqResource(model_CONSOLE_BACK);
	if (!background)
		return false;

	return true;
}
示例#7
0
Sugar::Sugar(IHoeScene * scn) : FactoryBuilding(scn, v_recept, v_build), 
	m_cane(EBS_Cane),m_sugar(EBS_Sugar)
{
	SetModel((IHoeModel*)GetResMgr()->ReqResource(model_SUGAR));
	//m_w.SetOwner(this);
	m_cane.SetOwner(this);
	m_sugar.SetOwner(this);

	m_part.emitor = (IHoeParticleEmitor*)GetEngine()->Create("particle");
	m_part.pos.Set(-14.f, 23.f, 10.f);
	GetCtrl()->Link(THoeSubObject::Particle, &m_part);

	m_it.Start(v_idiottime, true);
	m_cooker.SetUsage(&v_coalusage);

	CRR::Get()->Register(&m_sugar);
}
hsBool plUpdatableClient::Shutdown()
{
    if (fDirty && fDataPath)
    {
        char oldCwd[MAX_PATH];
        getcwd(oldCwd, sizeof(oldCwd));

        // Even bigger hack
        char tempCrap[MAX_PATH];
        strcpy(tempCrap, fDataPath);
        tempCrap[strlen(tempCrap)-strlen("dat\\")] = '\0';
        chdir(tempCrap);

        GetResMgr()->WriteSceneViewer();

        chdir(oldCwd);
    }

    return plClient::Shutdown();
}
void plNetClientStreamRecorder::ILogMsg(plNetMessage* msg, const char* preText)
{
    if (msg->ClassIndex() == CLASS_INDEX_SCOPED(plNetMsgGameMessage))
    {
        plNetMsgGameMessage* gameMsg = plNetMsgGameMessage::ConvertNoRef(msg);
        fLog->AddLineF("%s%s(%s)", preText, msg->ClassName(), plFactory::GetNameOfClass(gameMsg->StreamInfo()->GetStreamType()));

        if (gameMsg->StreamInfo()->GetStreamType() == CLASS_INDEX_SCOPED(plNotifyMsg))
        {
            plNotifyMsg* notifyMsg = plNotifyMsg::ConvertNoRef(gameMsg->GetContainedMsg(GetResMgr()));
            int numEvents = notifyMsg->GetEventCount();
            for (int i = 0; i < numEvents; i++)
            {
                const char* eventName = "";

                proEventData* event = notifyMsg->GetEventRecord(i);
                switch (event->fEventType)
                {
                case proEventData::kCollision:      eventName = "Collision";        break;
                case proEventData::kPicked:         eventName = "Picked";           break;
                case proEventData::kControlKey:     eventName = "ControlKey";       break;
                case proEventData::kVariable:       eventName = "Variable";         break;
                case proEventData::kFacing:         eventName = "Facing";           break;
                case proEventData::kContained:      eventName = "Contained";        break;
                case proEventData::kActivate:       eventName = "Activate";         break;
                case proEventData::kCallback:       eventName = "Callback";         break;
                case proEventData::kResponderState: eventName = "ResponderState";   break;
                case proEventData::kMultiStage:     eventName = "MultiStage";       break;
                case proEventData::kSpawned:        eventName = "Spawned";          break;
                case proEventData::kClickDrag:      eventName = "ClickDrag";        break;
                }

                fLog->AddLineF("\t%s", eventName);
            }

            hsRefCnt_SafeUnRef(notifyMsg);
        }
    }
    else if (plNetMsgSDLState* sdlMsg = plNetMsgSDLState::ConvertNoRef(msg))
    {
        hsReadOnlyStream stream(sdlMsg->StreamInfo()->GetStreamLen(), sdlMsg->StreamInfo()->GetStreamBuf());        
        char* descName=nil;
        int ver;
        if (plStateDataRecord::ReadStreamHeader(&stream, &descName, &ver))
        {
            fLog->AddLineF("%s%s(%s)", preText, msg->ClassName(), descName);

            int i;

            plStateDataRecord sdRec(descName, ver);
            sdRec.Read(&stream, 0);
            plStateDataRecord::SimpleVarsList vars;
            sdRec.GetDirtyVars(&vars);
            for (i = 0; i < vars.size(); i++)
            {
                fLog->AddLineF("\t%s", vars[i]->GetVarDescriptor()->GetName());
            }

            plStateDataRecord::SDVarsList sdVars;
            sdRec.GetDirtySDVars(&sdVars);
            for (i = 0; i < sdVars.size(); i++)
            {
                fLog->AddLineF("\t%s", sdVars[i]->GetSDVarDescriptor()->GetName());
            }
        }
        delete [] descName;
    }
    else
        fLog->AddLineF("%s%s", preText, msg->ClassName());
}
bool plNetClientStreamRecorder::IIsValidMsg(plNetMessage* msg)
{
    if (plNetMsgGameMessage* gameMsg = plNetMsgGameMessage::ConvertNoRef(msg))
    {
        int16_t type = gameMsg->StreamInfo()->GetStreamType();

        //
        // These messages will be regenerated if they are for the local avatar,
        // so don't dispatch them in that case.
        //

        if (type == CLASS_INDEX_SCOPED(plLinkEffectsTriggerMsg))
        {
            plLinkEffectsTriggerMsg* linkMsg = plLinkEffectsTriggerMsg::ConvertNoRef(gameMsg->GetContainedMsg(GetResMgr()));
            if (plNetClientApp::GetInstance())
            {
                bool isLocal = (linkMsg->GetLinkKey() == plNetClientApp::GetInstance()->GetLocalPlayerKey());
                hsRefCnt_SafeUnRef(linkMsg);

                if (isLocal)
                {
                    ILogMsg(msg, "IGNORING ");
                    return false;
                }
            }
        }
        else if (type == CLASS_INDEX_SCOPED(plLoadAvatarMsg))
        {
            plLoadAvatarMsg* loadAvMsg = plLoadAvatarMsg::ConvertNoRef(gameMsg->GetContainedMsg(GetResMgr()));
            if (plNetClientApp::GetInstance())
            {
                bool isLocal = (loadAvMsg->GetCloneKey() == plNetClientApp::GetInstance()->GetLocalPlayerKey());
                hsRefCnt_SafeUnRef(loadAvMsg);

                if (isLocal)
                {
                    ILogMsg(msg, "IGNORING ");
                    return false;
                }
            }
        }
    }

    ILogMsg(msg);
    return true;
}
void plUpdatableClient::IGetUpdate()
{
    // If the semaphore is signaled an update is ready
    if (fUpdateSignal && fUpdateSignal->Wait(0))
    {
        hsNamedPipeStream s;
        s.Open(fPipeName, "r");

#ifdef LOG_SCENEVIWER
        fLog->Clear();
        static int numUpdates = 0;
        numUpdates++;
        fLog->AddLineF(plStatusLog::kBlue, "SceneViewer Update #%d", numUpdates);
#endif // LOG_SCENEVIWER

        uint8_t type = s.ReadByte();

        if (type == ClientUpdate::kShutdown)
        {
            #ifdef LOG_SCENEVIWER
            fLog->AddLine("Client shutdown");
            #endif // LOG_SCENEVIWER

            PostMessage(GetWindowHandle(), WM_SYSCOMMAND, SC_CLOSE, 0);
        }
        else if (type == ClientUpdate::kUpdate)
        {
            fDirty = true;
            
            IEnableProxies(false);

            int i;

            //
            // Delete the deleted keys
            //
            int numDeleted = s.ReadSwap32();
            std::vector<plKey*> delKeys;
            delKeys.reserve(numDeleted);

            for (i = 0; i < numDeleted; i++)
            {
                plUoid uoid;
                uoid.Read(&s);
                plKey *key = hsgResMgr::ResMgr()->FindKey(uoid);
                hsAssert(key, "Key to delete not found");
                if (key)
                {
                    #ifdef LOG_SCENEVIWER
                    fLog->AddLineF("Remove: %s", key->GetName());
                    #endif // LOG_SCENEVIWER

                    GetResMgr()->RemoveObject(key, false);
                    delKeys.push_back(key);
                }
            }

            GetResMgr()->DelayLoad(true);

            //
            // Read in the changed spans
            //
            hsStatusMessage("ReadChangedSpans\n");
            GetResMgr()->ReadChangedSpans(&s);

            //
            // Read in the new keys and objects
            //
            int numNew = s.ReadSwap32();
            for (i = 0; i < numNew; i++)
            {
                plCreatable *cre = GetResMgr()->ReadCreatable(&s);

                hsKeyedObject *ko = hsKeyedObject::ConvertNoRef(cre);

                #ifdef LOG_SCENEVIWER
                if (ko)
                    fLog->AddLineF("Read: %s", ko->GetKey()->GetName());
                else
                    fLog->AddLine("Read: (null)");
                #endif // LOG_SCENEVIWER
            }

            GetResMgr()->DelayLoad(false);

            // Clear out any objects that were never reloaded (really deleted)
            for (i = 0; i < delKeys.size(); i++)
            {
                plKey *key = delKeys[i];
                if (!key->ObjectIsLoaded())
                {
                    #ifdef LOG_SCENEVIWER
                    fLog->AddLineF("Key deleted: %s", key->GetName());
                    #endif // LOG_SCENEVIWER

                    GetResMgr()->RemoveObject(key);
                }
            }

            IEnableProxies(true);
        }

        s.Close();
    }
}