Guten Tag,
ich veröffentliche hier eine kleine Funktionalität, welche für den ein oder anderen vielleicht nützlich ist.
Was kann man damit machen?
Ihr könnt mithilfe dieser Kleinigkeit, ein Item erstellen, für welches die Informationen (Vnum, Anzahl, Sockets, ...) auf einem anderem Game-Core liegen, als der, auf dem es erstellt werden soll.
Um das ganze einzubauen, benötigt ihr den Source der Game- und des DB-Cores!
Erstellt ein Backup, falls ihr nicht genau wisst, was ihr da tut.
Zum Einbau:
1. Öffnet die service.h ("common"-Ordner) und fügt folgende #define-Direktive hinzu:
2. Öffnet die tables.h ("common"-Ordner) und fügt folgende Header für die Game-DB-Core-Kommunikation hinzu:
3. Fügt der Item-Manager-Klasse die Methode GiveItemCrossCore hinzu.
Öffnet dazu die Datei item_manager.h (Game-Core-Source) und hängt unter der Methode GetSpecialGroupFromItem folgendes an:
Öffnet nun noch die Datei item_manager.cpp (Game-Core-Source) und fügt ganz unten folgendes hinzu:
- #ifdef __GIVE_ITEM_CROSS_CORE__
- void ITEM_MANAGER::GiveItemCrossCore(TPlayerItem* pkItem)
- {
- if (pkItem->vnum == 0 || pkItem->count == 0)
- return;
- if (pkItem->owner == 0)
- {
- sys_err("ITEM_MANAGER::GiveItemCrossCore :: Tried to give item (vnum %u; count %u) core cross without specified owner!", pkItem->vnum, pkItem->count);
- return;
- }
- db_clientdesc->DBPacketHeader(HEADER_GD_GIVE_ITEM_CROSS_CORE, 0, sizeof(TPlayerItem));
- db_clientdesc->Packet(&(*pkItem), sizeof(TPlayerItem));
- }
- #endif
4. Öffnet die Datei ClientManager.cpp (DB-Core-Source) und fügt in das switch-Statement in der Methode ProcessPackets der Klasse ClientManager ("void CClientManager::ProcessPackets(CPeer * peer)" suchen) folgenden case-Block ein:
5. Öffnet die ClientManager.h Datei (DB-Core-Source) und fügt der ClientManager-Klasse die Methode GiveItemCrossCore hinzu. Kopiert dazu einfach unter die Methode BlockChat folgendes:
Öffnet nun die Datei ClientManager.cpp (DB-Core-Source) und hängt das an:
- #ifdef __GIVE_ITEM_CROSS_CORE__
- void CClientManager::GiveItemCrossCore(TPlayerItem* pkItem)
- {
- if (pkItem->vnum == 0 || pkItem->count == 0 || pkItem->owner == 0)
- {
- sys_err("CClientManager::GiveItemCrossCore :: Giving an item cross core needs a specified vnum (%u), count (%u) and owner (%u)!", pkItem->vnum, pkItem->count, pkItem->owner);
- return;
- }
- ForwardPacket(HEADER_DG_GIVE_ITEM_CROSS_CORE, &(*pkItem), sizeof(TPlayerItem));
- }
- #endif
6. Öffnet die input_db.cpp (Game-Core-Source) und fügt in das switch-Statement in der Methode Analyze der InputDB-Klasse ("int CInputDB::Analyze(LPDESC d, BYTE bHeader, const char * c_pData)" suchen) diesen case-Block ein:
7. Öffnet nun noch die input.h Datei (Game-Core-Source) und fügt der InputDB-Klasse folgende Methode hinzu:
Zu guter letzt hängt ihr nun noch an die Datei input_db.cpp (Game-Core-Source) folgendes an:
- #ifdef __GIVE_ITEM_CROSS_CORE__
- void CInputDB::GiveItemCrossCore(TPlayerItem* pkItemInfo)
- {
- if (pkItemInfo->vnum == 0 || pkItemInfo->count == 0 || pkItemInfo->owner == 0)
- return;
- LPCHARACTER pkCharacter = CHARACTER_MANAGER::instance().FindByPID(pkItemInfo->owner);
- if (!pkCharacter)
- return;
- LPITEM pkItem = ITEM_MANAGER::instance().CreateItem(pkItemInfo->vnum, pkItemInfo->count);
- if (!pkItem)
- return;
- pkItem->SetSockets(&(*pkItemInfo->alSockets));
- pkItem->SetAttributes(&(*pkItemInfo->aAttr));
- pkCharacter->AutoGiveItem(pkItem);
- }
- #endif
Nun könnt ihr bspw. so ein Item Core-übergreifend erstellen:
Was ihr nun damit anstellt, ist eure Sache.
Mit freundlichen Grüßen
Yiv