Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

Enable Background Video in FW

Junior Spellweaver
Joined
Oct 15, 2020
Messages
152
Reaction score
184
We assume that custom code will be in bold and colored Blue.
---FW1 versions:


We will be modifying SMElement/SMElementClient/EC_LoginUIMan.cpp
In this function below:
Code:
bool CECLoginUIMan::Init(A3DEngine *pA3DEngine, A3DDevice *pA3DDevice, const char *pszFilename, int nDefaultWidth, int nDefaultHeight)
Some blocks of code will need to be uncommented:
Code:
[COLOR=#0000cd][B]     EC_RELEASE_DELETE(m_pBackGroundVideo);
     m_pBackGroundVideo = new AMVideoClip; 
     if(_InitBackGroundVideo())
     {
         m_pBackGroundVideo->Start(true);
         const EC_SYSTEM_SETTING& ss = g_pGame->GetConfigs()->GetSystemSettings();
         int nVolume = ss.bEnableMusic ? ss.nMusicVol : 0;
         a_Clamp(nVolume, 0, 100);
         m_pBackGroundVideo->SetVolume(DWORD(nVolume));
     }[/B][/COLOR]
That's how you enable background video in FW1 versions such as Dysil or Bloodharvest!


---FW2 versions:
Here is a provided Sample with AwakeningClientSource as a basis:



1)We will be modifying SMElement/SMElementClient/EC_Resource.h
Code:
enum
{
    RES_ICON_UNKNOWN = 0,
    RES_ICON_PROF_WARRIOR,        //战士
    RES_ICON_PROF_GUARD,        //巨灵
    RES_ICON_PROF_THIEF,        //刺客
    RES_ICON_PROF_GUNMAN,        //火枪手        
    RES_ICON_PROF_ENCHANTER,    //法师
    RES_ICON_PROF_PRIEST,        //牧师
    RES_ICON_PROF_BLOOD,        //血魔    
    RES_ICON_PROF_POET,            //吟游诗人
    RES_ICON_PROF_BLOODRAIDER,    //血袭者
    RES_ICON_PROF_WIZARD,        //断罪者
    RES_ICON_GT_ONLINE,            //GT在线图标
    RES_ICON_GT_DOWNLINE,        //GT不在线图标
    RES_ICON_CROSS_SERVER_ONLINE,        //跨服在线标志
    RES_ICON_CROSS_FRIEND_ONLINE,        //跨服好友在线标志
    RES_ICON_CROSS_FRIEND_OFFLINE,        //跨服好友不在线标志
    NUM_RES_ICON_NUM,
};

[COLOR=#0000cd][B]//    Movie resources
enum
{
    NUM_RES_VIDEO = 1,
};[/B][/COLOR]


Code:
const char* res_ProIcon(int n);
[B][COLOR=#0000cd]const char* res_VideoFile(int n);[/COLOR][/B]



2)We will be modifying SMElement/SMElementClient/EC_Resource.cpp
Code:
static const AString l_aProIcon[NUM_RES_ICON_NUM] =
{
    "未知.tga",
    "战士.tga",
    "守护者.tga",
    "刺客.tga",
    "火枪手.tga",
    "法师.tga",
    "牧师.tga",
    "血魔.tga",
    "吟游诗人.tga",
    "血袭者.tga",
    "断罪者.tga",
    "gtonline.tga",
    "gtdownline.tga",
    "跨服在线.tga",
    "跨服好友_on.tga",
    "跨服好友_off.tga",
};

[COLOR=#0000cd][B]//    Video files
static const AString l_aVideoFiles[NUM_RES_VIDEO] =
{
    "Maps\\login\\video1.mpx",
};
[/B][/COLOR]


Code:
const char* res_ProIcon(int n)
{
    ASSERT(n >= RES_ICON_UNKNOWN && n < NUM_RES_ICON_NUM);
    return l_aProIcon[n];
}

[COLOR=#0000cd][B]const char* res_VideoFile(int n)
{
    ASSERT(n >=0 && n < NUM_RES_VIDEO);
    return l_aVideoFiles[n];
}[/B][/COLOR]



3)We will be modifying SMElement/SMElementClient/EC_LoginUIMan.h
Code:
protected:
    virtual PAUIDIALOG CreateDlgInstance(const AString strTemplName);
    bool OnCommand_Login(const char* szCommand, AUIDialog* pDlg);
    bool RefreshPlayerList();
    void InitDialogs();
    void _OnConfirm();
[COLOR=#0000cd][B]    bool _InitBackGroundVideo();        // Background video[/B][/COLOR]
protected://    Attributes
    int m_nCreatePhase;
    int m_nCurProfession;
    int m_nCurGender;
    int m_nCurRace;
    A2DSprite*    m_pLoginBack;
    A2DSprite*    m_pCreateBack;
[COLOR=#0000cd][B]    AMVideoClip* m_pBackGroundVideo;        // Background video[/B][/COLOR]



4)We will be modifying SMElement/SMElementClient/EC_LoginUIMan.cpp
Code:
CECLoginUIMan::CECLoginUIMan()
{
    m_pLoginBack        = NULL;
    m_pCreateBack        = NULL;
//    m_pLogo                = NULL;
[COLOR=#0000cd][B]    m_pBackGroundVideo    = NULL;//Background video[/B][/COLOR]
    m_nCurProfession = PROF_WARRIOR;
    m_nCurGender = DEFAULT_GENDER;
    m_nCurRace = RACE_HUMAN;
    memset(m_aModel, 0, sizeof(m_aModel));

    m_bDragRole = false;
    m_iState        =    STATE_LOGIN;
}

We must modify blocks of code within following function:
bool CECLoginUIMan::Init(A3DEngine *pA3DEngine, A3DDevice *pA3DDevice, const char *pszFilename, int nDefaultWidth, int nDefaultHeight)

Code:
    const char* login_video_file_name = "RoleSettings\\video1";
    if (!g_FileExist(login_video_file_name))
    {
        InitBackgroundVideo("Maps\\login\\video1.wmv");
        FILE* fp = fopen(login_video_file_name, "wb");
        if (fp)
        { 
            fclose(fp); 
            fp = NULL;
        }
    }
    
[COLOR=#0000cd][B]    //Background video    initialization
     EC_RELEASE_DELETE(m_pBackGroundVideo);
     m_pBackGroundVideo = new AMVideoClip; 
     if(_InitBackGroundVideo())
     {
         m_pBackGroundVideo->Start(true);
         const EC_SYSTEM_SETTING& ss = g_pGame->GetConfigs()->GetSystemSettings();
         int nVolume = ss.bEnableMusic ? ss.nMusicVol : 0;
         a_Clamp(nVolume, 0, 100);
         m_pBackGroundVideo->SetVolume(DWORD(nVolume));
     }
    //Background video    initialization[/B][/COLOR]
    AfxGetGFXExMan()->SetPriority(5);


Code:
[B][COLOR=#0000cd]bool CECLoginUIMan::_InitBackGroundVideo()
{
    if(!m_pBackGroundVideo)
    {
        return false;
    }
    int nPlayIndex = rand() % NUM_RES_VIDEO;
    bool bResult = m_pBackGroundVideo->InitSafe(g_pGame->GetA3DDevice(), g_pGame->GetA3DDevice()->GetA3DEngine()->GetAMVideoEngine(), res_VideoFile(nPlayIndex));
    if(!bResult)
    {
        a_LogOutput(1, "Failed to initialize video %s.", res_VideoFile(nPlayIndex));
        EC_RELEASE_DELETE(m_pBackGroundVideo);
    }
    return m_pBackGroundVideo ? true : false;
}[/COLOR][/B]

bool CECLoginUIMan::Release(void)
{
    g_pGame->GetConfigs()->SaveSystemSettings();

    EC_RELEASE_DELETE(m_pLoginBack);
    EC_RELEASE_DELETE(m_pCreateBack);
    for (int iRace = 1; iRace < RACE_LAST; ++iRace)
    {
        for (int iGender = 0; iGender < NUM_GENDER; ++iGender)
        {
            EC_RELEASE_DELETE(m_aModel[iRace][iGender]);
        }
    }

    return AUISkinManager::Release();
}


Code:
bool CECLoginUIMan::Render(void)
{
    if (RenderBackgroundVideo())
    {
        return true;
    }
    
[COLOR=#0000cd][B]    // Video rendering
    if (m_pBackGroundVideo && m_iState<STATE_SELECT_CHAR )
    {
        g_pGame->GetA3DDevice()->Clear(D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
        
        if (m_pBackGroundVideo->GetVideoWidth() &&
            m_pBackGroundVideo->GetVideoHeight())
        {
            m_pBackGroundVideo->SetVidPos(A3DPOINT2(0,0));
            m_pBackGroundVideo->SetAutoScaleFlags(AMVID_FIT_X | AMVID_FIT_Y);
        }
        m_pBackGroundVideo->DrawToBack();
    }
    // Video rendering[/B][/COLOR]
Please feel free to correct me if you notice a mistake!
I'm grateful for the people who have supported me in my FW work and Special Thanks to my friends.
 
Back
Top