[Source TUT]Scroll of Unbinding

02/13/2012 18:11 Jopsi332#1
Da in einem anderen Thread dannach gefragt wurde hier:

WndField.Cpp
Code:
CWndUnbind::CWndUnbind void ) 
{
			m_pItemElem = NULL;
			m_pTexture = NULL;
}

CWndUnbind::~CWndUnbind( void )
{
		if( m_pItemElem != NULL )
        {
            if( !g_pPlayer->m_vtInfo.IsTrading( m_pItemElem ))
                m_pItemElem->SetExtra(0);
        }
					m_pItemElem = NULL;
			m_pTexture = NULL;
    DeleteDeviceObjects();
}

BOOL CWndUnbind::Initialize( CWndBase* pWndParent, DWORD dwType )
{
    return CWndNeuz::InitDialog( g_Neuz.GetSafeHwnd(), APP_UNBIND, 0, CPoint( 0, 0 ), pWndParent );
}

BOOL CWndUnbind::OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase ) 
{ 
    return CWndNeuz::OnCommand( nID, dwMessage, pWndBase ); 
} 
void CWndUnbind:OnDraw( C2DRender* p2DRender )
{
		CPoint point;
		CTexture* slot;
		slot = CWndBase::m_textureMng.AddTexture( D3DDEVICE, MakePath( DIR_THEME, "WndChgElemItem.bmp" ), 0xffff00ff );// pfad zu dem Weißen Slot Icon
				if(slot != NULL)
				{
					point.y = 25;//y koordinate für weißen hintergrund des waffenslots, also y von WIDC_CUSTOM1
					point.x = 20;//x koordinate für weißen hintergrund des waffenslots, also x von WIDC_CUSTOM1
					slot->Render( &g_Neuz.m_2DRender, point );
				}
	if( m_pTexture )
	{
		LPWNDCTRL wndCtrl = GetWndCtrl( WIDC_CUSTOM1 );
		if( wndCtrl && wndCtrl->rect )
		{
			m_pTexture->Render( p2DRender, CPoint( wndCtrl->rect.left, wndCtrl->rect.top ) );// waffen icon auf WIDC_CUSTOM1 rendern
		}
	}

}
BOOL CWndUnbind::OnDropIcon( LPSHORTCUT pShortcut, CPoint point )
{
	LPWNDCTRL pWndCtrl = GetWndCtrl( WIDC_CUSTOM1 );
	CRect rect = pWndCtrl->rect;
	if( rect && rect.PtInRect( point ) )
	{
		
		CItemElem *pItemElem = (CItemElem*)g_pPlayer->GetItemId( pShortcut->m_dwId );
		if( pItemElem && pItemElem->GetProp() && pItemElem->GetProp()->dwItemKind1 == IK1_WEAPON || pItemElem && pItemElem->GetProp() && pItemElem->GetProp()->dwItemKind1 == IK1_ARMOR  )
		{
			
			if( m_pItemElem )
			{
				m_pItemElem = NULL;
			}
			m_pItemElem = pItemElem;
			m_pTexture = CWndBase::m_textureMng.AddTexture( D3DDEVICE, MakePath( DIR_ITEM, m_pItemElem->GetProp()->szIcon ), 0xffff00ff );
		 CWndButton* unbind = (CWndButton*)GetDlgItem(WIDC_UNBIND_IT);
		 unbind->EnableWindow(TRUE);
		 	    if( m_pTexture)
	    m_pItemElem->SetExtra(1);
		}else{
			
			SetForbid( TRUE );
		}
	}else{
		
		SetForbid( TRUE );
	}
	return TRUE;
}
void CWndUnbind::OnSize( UINT nType, int cx, int cy ) 
{ 
    CWndNeuz::OnSize( nType, cx, cy ); 
} 
void CWndUnbind::OnLButtonUp( UINT nFlags, CPoint point ) 
{ 
} 
void CWndUnbind::OnLButtonDown( UINT nFlags, CPoint point ) 
{ 
} 
void CWndUnbind::OnDraw( C2DRender* p2DRender )
{
}
HRESULT CWndUnbind::RestoreDeviceObjects()
{
    CWndNeuz::RestoreDeviceObjects();
    return S_OK;
}
HRESULT CWndUnbind::InvalidateDeviceObjects()
{
    CWndNeuz::InvalidateDeviceObjects();
    return S_OK;
}
HRESULT CWndUnbind::DeleteDeviceObjects()
{
    CWndNeuz::DeleteDeviceObjects();
    InvalidateDeviceObjects();
    return S_OK;
}
void CWndUnbind::OnInitialUpdate( void )
{
    CWndNeuz::OnInitialUpdate(); 
    RestoreDeviceObjects();
    CRect rectRoot = m_pWndRoot->GetLayoutRect();
    CRect rectWindow = GetWindowRect();
    CPoint point( rectRoot.right - rectWindow.Width(), 110 );
    Move( point );
    MoveParentCenter();
}
BOOL CWndUnbind::OnChildNotify( UINT message, UINT nID, LRESULT* pLResult )
{
    switch (nID)
    {
    case WIDC_UNBIND_IT:// BUTTON drücken
        { 
			itemid = m_pItemElem->m_dwObjId;
            g_DPlay.SendUnbind( itemid ); // packet senden

            Destroy();//Fenster schließen Lassen
            break;
		}
    }
    return CWndNeuz::OnChildNotify( message, nID, pLResult );
}
WndField.h
Code:
class CWndUnbind : public CWndNeuz
{
public:
		CItemElem* m_pItemElem;
    CTexture*  m_pTexture;
    CWndUnbind( void );
    ~CWndUnbind( void );
	int itemid;


    virtual HRESULT RestoreDeviceObjects();
    virtual HRESULT InvalidateDeviceObjects();
    virtual HRESULT DeleteDeviceObjects();

public:
    virtual BOOL Initialize( CWndBase* pWndParent = NULL, DWORD nType = MB_OK ); 
    virtual BOOL OnChildNotify( UINT message, UINT nID, LRESULT* pLResult ); 
    virtual void OnDraw( C2DRender* p2DRender ); 
    virtual    void OnInitialUpdate(); 
	virtual BOOL    OnDropIcon( LPSHORTCUT pShortcut, CPoint point );
    virtual BOOL OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase ); 
    virtual void OnSize( UINT nType, int cx, int cy ); 
    virtual void OnLButtonUp( UINT nFlags, CPoint point ); 
    virtual void OnLButtonDown( UINT nFlags, CPoint point ); 
};

DPClient.cpp
Code:
void CDPClient::SendUnbind( int itemid )
{
    BEFORESENDSOLE( ar, PACKETTYPE_NEWUNBIND, DPID_UNKNOWN );
    ar << itemid;
    SEND( ar, this, DPID_SERVERPLAYER );
}
DPClient.h
Code:
void	SendUnbind( int itemid );
DPSrvr.cpp
Code:
ON_MSG( PACKETTYPE_NEWUNBIND, OnUnbind );
&
Code:
void CDPSrvr::OnUnbind( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE lpBuf, u_long uBufSize )
{
	DWORD itemid;
	ar >> itemid;


	CUser* pUser	= g_UserMng.GetUser( dpidCache, dpidUser );
	CItemElem *	pItemElem = pUser->m_Inventory.GetAt(itemid);
			if(pItemElem->IsFlag(CItemElem::binds))
				{
					pItemElem->ResetFlag(CItemElem::binds);
					pUser->UpdateItem( (BYTE)( pItemElem->m_dwObjId ), UI_FLAG, MAKELONG( pItemElem->m_dwObjIndex, pItemElem->m_byFlag ) );
					pUser->AddText("Successfull unbinded!");
				}
			else
				{
					pUser->AddText("Unbind is not available!");
					 return;
				}
}
DPSrvr.cpp
Code:
void    OnUnbind( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long);
soo
was ihr machen müsst sind die resourcen vom fenster
undzwar so
Code:
APP_UNBIND // id definition der app
WIDC_UNBIND_IT // button definition
WIDC_CUSTOM1 // platz für den waffen slot
und euer packet
Code:
PACKETTYPE_NEWUNBIND
in msghdr definieren da ihc nicht weiß ob meine packets eure überschreiben müsst ihr das selber machen
und die koordinaten in wndfield angeben für widc_custom1 damit das slot hintergrund richtig angezeigt wird.
02/13/2012 18:28 Flash!#2
Na suppi.

Das ist aber nicht die "originale " Unbind-Scroll kann das sein?
02/13/2012 18:31 Jopsi332#3
Quote:
Originally Posted by Marvin! View Post
Na suppi.

Das ist aber nicht die "originale " Unbind-Scroll kann das sein?
ja, aber ist der selbe effekt.
Spiele kein offi weiß nicht wie die offi aufgebaut ist.
Es ging mir um den effekt -> unbinden
02/13/2012 18:37 guardianangel#4
Danke sehr ...
Endlich ein Normaler unter Primaten :)
02/13/2012 19:12 Flyff_Service#5
1. Wozu ein Tutorial dafür?
2. Wieso nicht OnDoUseItemTarget
02/13/2012 21:34 yannickFlyff#6
Was ich komisch finde. Bei SendUnbind benutzt er den datentype int für itemtype.
Bei der annehme des Packets in der OnUnbind benutzt er plötzlich den datentype DWORD.

Njoa kommt davon wenn man scheis Variablen namen benutzt wie "itemid". Offi macht nicht umsonst die abkürzung des datentypes vor dem variablen namen like "dwItemId" "nItemId".

Quote:
Originally Posted by Flyff_Service View Post
2. Wieso nicht OnDoUseItemTarget
Lass ihn Schatz. Er ist langsam.

Eventuell kann er bis jetzt nur Windows in Flyff adden. Wie man komplexere/größere Funktionen in Flyff erweitert hat er wohl noch nicht gelernt.

Was ich am Code lustig finde:

Code:
	CUser* pUser	= g_UserMng.GetUser( dpidCache, dpidUser );
	CItemElem *	pItemElem = pUser->m_Inventory.GetAt(itemid);
5000 senden und bb server

Quote:
Originally Posted by guardianangel View Post
Danke sehr ...
Endlich ein Normaler unter Primaten :)
Höchstens ein Primat unter %EPVPUSERCOUNT% anderen.
02/14/2012 07:33 Incestus#7
Ich frag mich wieso ihr immer alles so kompliziert macht? lol

PHP Code:
void CDPSrvr::OnDoUseItemTargetCAr arDPID dpidCacheDPID dpidUserLPBYTE lpBufu_long uBufSize)
{
    
DWORD dwMaterialdwTarget;
    
ar >> dwMaterial >> dwTarget;
    
CUserpUser    g_UserMng.GetUserdpidCachedpidUser );
    if( 
IsValidObjpUser ) )
    {
        
CItemElempMaterial    = (CItemElem*)pUser->GetItemIddwMaterial );
        
CItemElempTarget    = (CItemElem*)pUser->GetItemIddwTarget );
        if( !
IsUsableItempMaterial ) || !IsUsableItempTarget ) )
            return;
        if( 
pUser->m_Inventory.IsEquipdwTarget ) )
        {
            
pUser->AddDefinedTextTID_GAME_EQUIPPUT );
            return;
        }
        
BOOL    b    FALSE;
        switch( 
pMaterial->m_dwItemId 
        {
            case 
II_SYS_SYS_QUE_PETRESURRECTION02_S:
            case 
II_SYS_SYS_QUE_PETRESURRECTION02_A:
            case 
II_SYS_SYS_QUE_PETRESURRECTION02_B:
                {
                    
CPetpPet    pTarget->m_pPet;
                    if( !
pPet || !pTarget->IsFlagCItemElem::expired ) )
                    {
                        
pUser->AddDefinedTextTID_GAME_PETRESURRECTION_WRONG_TARGET_01 );
                    }
                    else
                    {
                        
BYTE nLevel        pPet->GetLevel();
                        if( ( 
nLevel == PL_B && pMaterial->m_dwItemId != II_SYS_SYS_QUE_PETRESURRECTION02_B )
                            || ( 
nLevel == PL_A && pMaterial->m_dwItemId != II_SYS_SYS_QUE_PETRESURRECTION02_A )
                            || ( 
nLevel == PL_S && pMaterial->m_dwItemId != II_SYS_SYS_QUE_PETRESURRECTION02_S )
                            || ( 
nLevel PL_B )
                            )
                        {
                            
pUser->AddDefinedTextTID_GAME_PETRESURRECTION_WRONG_TARGET_02 );
                        }
                        else
                        {
                            
PutItemLogpUser"r""::PetResurrection"pTarget );

                            
pTarget->ResetFlagCItemElem::expired );
                            
pUser->UpdateItem( (BYTE)( pTarget->m_dwObjId ), UI_FLAGMAKELONGpTarget->m_dwObjIndexpTarget->m_byFlag ) );
                            
pPet->SetLife);
                            
pPet->SetEnergypPet->GetMaxEnergy() / );
                            
pUser->AddPetStatepTarget->m_dwObjIdpPet->GetLife(), pPet->GetEnergy(), pPet->GetExp() );
                            
pUser->AddDefinedTextTID_GAME_PETRESURRECTION_SUCCESS );
                            
b    TRUE;
                        }
                    }
                    break;
                }
            case 
II_SYS_SYS_SCR_AWAKECANCEL:
            case 
II_SYS_SYS_SCR_AWAKECANCEL02:
                
b    DoUseItemTarget_InitializeRandomOptionpUserpTargetCRandomOptionProperty::eAwakening,
                    
TID_GAME_AWAKECANCEL_INFOTID_GAME_AWAKECANCEL,
                    
"r""::AwakeCancel" );
                break;
            case 
II_SYS_SYS_SCR_AWAKE:
                
b    DoUseItemTarget_GenRandomOptionpUserpTargetCRandomOptionProperty::eAwakening
                    
0TID_GAME_INVALID_TARGET_ITEMTID_GAME_AWAKE_OR_BLESSEDNESS01,
                    
"r""::Awake" );
                break;
            case 
II_SYS_SYS_SCR_BLESSEDNESS:
            case 
II_SYS_SYS_SCR_BLESSEDNESS02:
                
b    DoUseItemTarget_GenRandomOptionpUserpTargetCRandomOptionProperty::eBlessing
                    
0TID_GAME_USE_BLESSEDNESS_INFOTID_GAME_BLESSEDNESS_INVALID_ITEM,
                    
"r""::Blessedness" );
                break;
#if __VER >= 12 // __PET_0519
            
case II_SYS_SYS_SCR_EATPETAWAKE:    // ¸ÔÆê °¢¼º
                
b    DoUseItemTarget_GenRandomOptionpUserpTargetCRandomOptionProperty::eEatPet,
                    
TID_GAME_PETAWAKE_S00TID_GAME_PETAWAKE_E00TID_GAME_PETAWAKE_E00,
                    
"r""EATPETAWAKE" );
                break;
            case 
II_SYS_SYS_SCR_PETAWAKE:    // ½Ã½ºÅÛ Æê °¢¼º
                
b    DoUseItemTarget_GenRandomOptionpUserpTargetCRandomOptionProperty::eSystemPet
                    
TID_GAME_PETAWAKE_S00TID_GAME_PETAWAKE_E00TID_GAME_PETAWAKE_E00,
                    
"r""PETAWAKE" );
                break;
            case 
II_SYS_SYS_SCR_PETAWAKECANCEL:        // ½Ã½ºÅÛ Æê °¢¼º Ãë¼Ò
                
b    DoUseItemTarget_InitializeRandomOptionpUserpTargetCRandomOptionProperty::eSystemPet,
                    
TID_GAME_PETAWAKECANCEL_S00TID_GAME_PETAWAKECANCEL_E00,
                    
"r""PETAWAKECANCEL" );
                break;
#endif    // __PET_0519
            
case II_SYS_SYS_SCR_LEVELDOWN01:
            case 
II_SYS_SYS_SCR_LEVELDOWN02:
                
b    DoUseItemTarget_ItemLevelDownpUserpMaterialpTarget );
                break;
                
// Scroll of Unbind
            
case II_SYS_SYS_SCR_BINDREMV:
                
Unbind Funktion;
                break;
            default:
                break;
        }
        if( 
)
        {
            
pUser->AddPlaySoundSND_INF_UPGRADESUCCESS );
            if( 
pUser->IsModeTRANSPARENT_MODE ) == )
                
g_UserMng.AddCreateSfxObjpUserXI_INT_SUCCESSpUser->GetPos().xpUser->GetPos().ypUser->GetPos().);

            
PutItemLogpUser"u""OnDoUseItemTarget"pMaterial );

            
pUser->UpdateItem( (BYTE)( pMaterial->m_dwObjId ), UI_NUMpMaterial->m_nItemNum );    
        }
    }

Und das wars lol
Eine eigne Funktion wird nicht mal benötigt, nur ist übersichtlicher, lul.
Der kommt hier mit Fenster etc was kaputt

Aber naja, jetzt hat wieder jeder Noob Server Scroll of Unbind in der nächsten Server Wartung xD