Quote:
Originally Posted by Мentus
Mann muss bedenken das der FlyFF Source im Jahre 2000-2003~ programmiert wurde, zwischen drin updates hatte jedoch die Base jetzt schon älter als 10 fast 15 Jahre ist.
Ich verstehe nicht, was genau du casten möchtest, wenn du bereits einen short sendest. Der FlyFF Source ist wie mann bereits aus deinem Code-Schnipsel entnehmen kann auf einem short aufgebaut was die Item Anzahl angeht. Jetzt erkläre mir doch bitte noch einmal was man hier dran casten muss:
DPClient.h
PHP Code:
void SendPutItemGuildBank( BYTE nId, short ItemNum, BYTE p_Mode );
DPClient.cpp
PHP Code:
void CDPClient::SendPutItemGuildBank( BYTE nId, short ItemNum, BYTE p_Mode )
{
BEFORESENDSOLE( ar, PACKETTYPE_PUTITEMGUILDBANK, DPID_UNKNOWN );
ar << nId << ItemNum << p_Mode;
SEND( ar, this, DPID_SERVERPLAYER );
}
DPSrvr.cpp
PHP Code:
void CDPSrvr::OnPutItemGuildBank( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE lpBuf, u_long uBufSize )
{
#ifdef __DEBUG_LOG
FILEOUT( "Debug.log", "CDPSrvr::OnPutItemGuildBank" );
#endif
if( g_eLocal.GetState( ENABLE_GUILD_INVENTORY ) == FALSE )
return;
BYTE nId, mode;
short nItemNum;
ar >> nId >> nItemNum >> mode;
CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
if( IsValidObj( pUser ) )
{
#if __VER >= 15 // __GUILD_HOUSE
if( !pUser->GetWorld() || !GuildHouseMng->IsGuildHouse( pUser->GetWorld()->GetID() ) )
#endif // __GUILD_HOUSE
if( !CNpcChecker::GetInstance()->IsCloseNpc( MMI_GUILDBANKING, pUser->GetWorld(), pUser->GetPos() ) )
return;
if( mode == 0 )
return;
if( pUser->m_dwAuthorization >= AUTH_GAMEMASTER && pUser->m_dwAuthorization < AUTH_GAMEMASTER3 )
{
pUser->AddText( "Du hast kein Recht das zu tun." );
return;
}
CItemElem* pItemElem = pUser->m_Inventory.GetAtId( nId );
if( IsUsableItem( pItemElem ) == FALSE )
return;
if( pItemElem->IsQuest() )
return;
if( pItemElem->IsBinds() )
return;
if( pUser->IsUsing( pItemElem ) )
{
pUser->AddDefinedText( TID_GAME_CANNOT_DO_USINGITEM );
return;
}
ItemProp* pProp = pItemElem->GetProp();
if( pProp->dwParts == PARTS_RIDE && pProp->dwItemJob == JOB_VAGRANT )
return;
if( pUser->m_Inventory.IsEquip( nId ) )
{
pUser->AddDefinedText( TID_GAME_EQUIPTRADE, "" );
return;
}
if( pItemElem->IsCharged() )
return;
if( nItemNum > pItemElem->m_nItemNum )
nItemNum = pItemElem->m_nItemNum;
if( nItemNum < 1 )
nItemNum = 1;
CGuild* pGuild = pUser->GetGuild();
if( pGuild )
{
CItemElem itemElem;
itemElem = *pItemElem;
itemElem.m_nItemNum = nItemNum;
if ( pGuild->m_GuildBank.Add( &itemElem ) )
{
LogItemInfo aLogItem;
aLogItem.Action = "W";
aLogItem.SendName = pUser->GetName();
aLogItem.RecvName = "GUILDBANK";
aLogItem.WorldId = pUser->GetWorld()->GetID();
aLogItem.Gold = aLogItem.Gold2 = pUser->GetGold();
OnLogItem( aLogItem, &itemElem, nItemNum );
OnLogItem( aLogItem, &itemElem, nItemNum );
pUser->RemoveItem( (BYTE)( nId ), nItemNum );
UpdateGuildBank( pGuild, GUILD_PUT_ITEM, 0, pUser->m_idPlayer, &itemElem, 0, nItemNum );
pUser->AddPutItemGuildBank( &itemElem );
g_UserMng.AddPutItemElem( pUser, &itemElem );
}
else
{
pUser->AddDefinedText( TID_GAME_GUILDBANKFULL, "" );
}
}
}
}
Kann nicht genau nachvollziehen wo genau du nun casten möchtest.
Vielleicht solltest du dir noch einmal den FlyFF Source anschauen, vielleicht fällt es dir dann auf.
|
Da stellt sich mir die Frage, was genau du der Funktion
Code:
CDPClient::SendPutItemGuildBank
übergibst und wo die aufgerufen wird.
Es wird sicherlich default kein short übergeben, sondern int
Code:
g_DPlay.SendPutItemGuildBank( (BYTE)( m_Shortcut.m_dwId ), nCost, 1 );
Und zum Thema Cast und deinem Buch, ist mir eben noch eingefallen, steht in deinem Buch auch, wie man Polymorphie und späte Bindung ohne Upcast realisieren kann?
Aber wir wollen das Thema jetzt auch nicht auseinanderdiskutieren wie blöde, ich halte beide Lösungen für valide und für beide werden Casts benötigt, es sei denn du änderst die Item Struktur oder lässt es als Int stehen.
Jedoch muss ich sagen, dass mit Lethals Version auch besser gefällt, da es im Endeffekt nach der Abfrage egal ist, ob nun int in short gecastet wurde oder ob bereits mit short überprüft wurde.
Und die Gschichte mit dem Flyff Source, ja, es stimmt, Objective C und C++ sind ein riesen Unterschied, aber es lohnt sich einfach nicht, neue Systeme in validem C++ zu implementieren. Das würde dem Source sämtliche gebliebene Struktur nehmen. In valid bzw native C++ wird nämlich eigentlich nicht mit etwaigen char Arrays gearbeitet wie im Source, aber lassen wir diese Diskussionen, letztendlich kommt es für mich auf die Funktionalität an.