| 
		
			| realityincarnate | 05-01-2009 01:48 PM |  
 Augment Item Info
 This creates the "Item Info" message at the bottom of augments, telling which solvent can be used to remove them.  It also (incidentally) enables a couple of other pieces of item info that previously appeared in the Titanium client but not SoF. 
	Code: 
 Index: common/emu_oplist.h===================================================================
 --- common/emu_oplist.h        (revision 451)
 +++ common/emu_oplist.h        (working copy)
 @@ -427,3 +427,4 @@
 N(OP_ItemVerifyReply),
 N(OP_GMTrainSkillConfirm),
 N(OP_RestState),
 +N(OP_AugmentInfo),
 Index: common/eq_packet_structs.h
 ===================================================================
 --- common/eq_packet_structs.h        (revision 451)
 +++ common/eq_packet_structs.h        (working copy)
 @@ -2037,8 +2037,8 @@
 // Use ` as a newline character in the text.
 // Variable length.
 struct BookText_Struct {
 -        uint8 unknown0; //always 0xFF
 -        uint8 type;             //type: 0=scroll, 1=book.. prolly others.
 +        uint8 window;        // where to display the text (0xFF means new window)
 +        uint8 type;             //type: 0=scroll, 1=book, 2=item info.. prolly others.
 uint32 invslot;        // Only used in SoF and later clients.
 char booktext[1]; // Variable Length
 };
 @@ -2046,8 +2046,8 @@
 // This is just a "text file" on the server
 // or in our case, the 'name' column in our books table.
 struct BookRequest_Struct {
 -        uint8 unknown0; //always 0xFF
 -        uint8 type;             //type: 0=scroll, 1=book.. prolly others.
 +        uint8 window;        // where to display the text (0xFF means new window)
 +        uint8 type;             //type: 0=scroll, 1=book, 2=item info.. prolly others.
 uint32 invslot;        // Only used in Sof and later clients;
 char txtfile[20];
 };
 @@ -3738,7 +3738,13 @@
 /*007*/                                 // no idea what these last three bytes represent
 };
 
 +struct AugmentInfo_Struct {
 +/*000*/ uint32        itemid;                // id of the solvent needed
 +/*004*/ uint8        window;                // window to display the information in
 +// total packet length 72, all the rest were always 00
 +};
 
 +
 //old structures live here:
 #include "eq_old_structs.h"
 
 Index: common/patches/Client62.cpp
 ===================================================================
 --- common/patches/Client62.cpp        (revision 451)
 +++ common/patches/Client62.cpp        (working copy)
 @@ -629,7 +629,7 @@
 
 structs::BookText_Struct *eq_BookText_Struct = (structs::BookText_Struct*)in->pBuffer;
 
 -        eq_BookText_Struct->unknown0 = emu_BookText_Struct->unknown0;
 +        eq_BookText_Struct->window = emu_BookText_Struct->window;
 eq_BookText_Struct->type = emu_BookText_Struct->type;
 strcpy(eq_BookText_Struct->booktext, emu_BookText_Struct->booktext);
 
 @@ -711,7 +711,7 @@
 DECODE_LENGTH_ATLEAST(structs::BookRequest_Struct);
 SETUP_DIRECT_DECODE(BookRequest_Struct, structs::BookRequest_Struct);
 
 -        IN(unknown0);
 +        IN(window);
 IN(type);
 strn0cpy(emu->txtfile, eq->txtfile, sizeof(emu->txtfile));
 
 Index: common/patches/Client62_structs.h
 ===================================================================
 --- common/patches/Client62_structs.h        (revision 451)
 +++ common/patches/Client62_structs.h        (working copy)
 @@ -1844,16 +1844,16 @@
 // Use ` as a newline character in the text.
 // Variable length.
 struct BookText_Struct {
 -        uint8 unknown0; //always 0xFF
 -        uint8 type;             //type: 0=scroll, 1=book.. prolly others.
 +        uint8 window;        // where to display the text (0xFF means new window)
 +        uint8 type;             //type: 0=scroll, 1=book, 2=item info.. prolly others.
 char booktext[1]; // Variable Length
 };
 // This is the request to read a book.
 // This is just a "text file" on the server
 // or in our case, the 'name' column in our books table.
 struct BookRequest_Struct {
 -        uint8 unknown0; //always 0xFF
 -        uint8 type;             //type: 0=scroll, 1=book.. prolly others.
 +        uint8 window;        // where to display the text (0xFF means new window)
 +        uint8 type;             //type: 0=scroll, 1=book, 2=item info.. prolly others.
 char txtfile[1]; // Variable Length
 };
 
 Index: common/patches/SoF.cpp
 ===================================================================
 --- common/patches/SoF.cpp        (revision 451)
 +++ common/patches/SoF.cpp        (working copy)
 @@ -1513,7 +1512,9 @@
 ENCODE_LENGTH_ATLEAST(BookText_Struct);
 SETUP_DIRECT_ENCODE(BookText_Struct, structs::BookRequest_Struct);
 
 -        eq->unknown0000 = 0xFFFFFFFF;
 +        if (emu->window == 0xFF)
 +                eq->window = 0xFFFFFFFF;
 +        else eq->window = emu->window;
 OUT(type);
 OUT(invslot);
 strn0cpy(eq->txtfile, emu->booktext, sizeof(eq->txtfile));
 @@ -1880,6 +1881,7 @@
 
 IN(type);
 IN(invslot);
 +        emu->window = (uint8) eq->window;
 strn0cpy(emu->txtfile, eq->txtfile, sizeof(emu->txtfile));
 
 FINISH_DIRECT_DECODE();
 Index: common/patches/SoF_structs.h
 ===================================================================
 --- common/patches/SoF_structs.h        (revision 451)
 +++ common/patches/SoF_structs.h        (working copy)
 @@ -2163,17 +2163,17 @@
 // The BookRequest_Struct is used instead for both request and reply.
 //
 struct BookText_Struct {
 -        uint8 unknown0; //always 0xFF
 -        uint8 type;             //type: 0=scroll, 1=book.. prolly others.
 +        uint8 window;        // where to display the text (0xFF means new window)
 +        uint8 type;             //type: 0=scroll, 1=book, 2=item info.. prolly others.
 char booktext[1]; // Variable Length - was 1
 };
 // This is the request to read a book.
 // This is just a "text file" on the server
 // or in our case, the 'name' column in our books table.
 struct BookRequest_Struct {
 -/*0000*/        uint32 unknown0000;        // always 0xFFFFFFFF
 +/*0000*/        uint32 window;                // where to display the text (0xFFFFFFFF means new window)
 /*0004*/        uint32 invslot;                // The inventory slot the book is in. Not used, but echoed in the response packet.
 -/*0008*/        uint32 type;                // 0 = Scroll, 1 = Book, Possibly others
 +/*0008*/        uint32 type;                // 0 = Scroll, 1 = Book, 2 = Item Info, Possibly others
 /*0012*/        uint32 unknown0012;
 /*0016*/        uint16 unknown0016;
 /*0018*/        char txtfile[8194];
 Index: common/patches/Titanium.cpp
 ===================================================================
 --- common/patches/Titanium.cpp        (revision 451)
 +++ common/patches/Titanium.cpp        (working copy)
 @@ -800,7 +799,7 @@
 
 structs::BookText_Struct *eq_BookText_Struct = (structs::BookText_Struct*)in->pBuffer;
 
 -        eq_BookText_Struct->unknown0 = emu_BookText_Struct->unknown0;
 +        eq_BookText_Struct->window = emu_BookText_Struct->window;
 eq_BookText_Struct->type = emu_BookText_Struct->type;
 strcpy(eq_BookText_Struct->booktext, emu_BookText_Struct->booktext);
 
 @@ -895,7 +894,7 @@
 DECODE_LENGTH_ATLEAST(structs::BookRequest_Struct);
 SETUP_DIRECT_DECODE(BookRequest_Struct, structs::BookRequest_Struct);
 
 -        IN(unknown0);
 +        IN(window);
 IN(type);
 strn0cpy(emu->txtfile, eq->txtfile, sizeof(emu->txtfile));
 
 Index: common/patches/Titanium_structs.h
 ===================================================================
 --- common/patches/Titanium_structs.h        (revision 451)
 +++ common/patches/Titanium_structs.h        (working copy)
 @@ -1906,16 +1906,16 @@
 // Use ` as a newline character in the text.
 // Variable length.
 struct BookText_Struct {
 -        uint8 unknown0; //always 0xFF
 -        uint8 type;             //type: 0=scroll, 1=book.. prolly others.
 +        uint8 window;        // where to display the text (0xFF means new window)
 +        uint8 type;             //type: 0=scroll, 1=book, 2=item info.. prolly others.
 char booktext[1]; // Variable Length
 };
 // This is the request to read a book.
 // This is just a "text file" on the server
 // or in our case, the 'name' column in our books table.
 struct BookRequest_Struct {
 -        uint8 unknown0; //always 0xFF
 -        uint8 type;             //type: 0=scroll, 1=book.. prolly others.
 +        uint8 window;        // where to display the text (0xFF means new window)
 +        uint8 type;             //type: 0=scroll, 1=book, 2=item info.. prolly others.
 char txtfile[1];        // Variable length
 };
 
 Index: utils/patch_SoF.conf
 ===================================================================
 --- utils/patch_SoF.conf        (revision 451)
 +++ utils/patch_SoF.conf        (working copy)
 @@ -285,6 +285,7 @@
 OP_Sacrifice=0x0x55C9                        #
 OP_PopupResponse=0x028B                        #
 OP_OnLevelMessage=0x0332                #
 +OP_AugmentInfo=0x08f8                        #RealityIncarnate 4/28/09
 
 #Looting
 OP_LootRequest=0x36E3                        #Trevius 02/16/09
 Index: utils/patch_Titanium.conf
 ===================================================================
 --- utils/patch_Titanium.conf        (revision 451)
 +++ utils/patch_Titanium.conf        (working copy)
 @@ -272,6 +272,7 @@
 OP_Sacrifice=0x727a
 OP_KeyRing=0x68c4
 OP_ApplyPoison=0x0c2c
 +OP_AugmentInfo=0x45ff                #RealityIncarnate 4/28/09
 
 #bazaar trader stuff stuff:
 #become and buy from
 Index: zone/client.cpp
 ===================================================================
 --- zone/client.cpp        (revision 451)
 +++ zone/client.cpp        (working copy)
 @@ -1750,7 +1751,7 @@
 EQApplicationPacket* outapp = new EQApplicationPacket(OP_ReadBook, length + sizeof(BookText_Struct));
 
 BookText_Struct *out = (BookText_Struct *) outapp->pBuffer;
 -                out->unknown0 = book->unknown0;
 +                out->window = book->window;
 out->type = book->type;
 out->invslot = book->invslot;
 memcpy(out->booktext, booktxt2.c_str(), length);
 Index: zone/client_packet.cpp
 ===================================================================
 --- zone/client_packet.cpp        (revision 451)
 +++ zone/client_packet.cpp        (working copy)
 @@ -336,6 +336,7 @@
 ConnectedOpcodes[OP_Barter] = &Client::Handle_OP_Barter;
 ConnectedOpcodes[OP_VoiceMacroIn] = &Client::Handle_OP_VoiceMacroIn;
 ConnectedOpcodes[OP_ApplyPoison] = &Client::Handle_OP_ApplyPoison;
 +        ConnectedOpcodes[OP_AugmentInfo] = &Client::Handle_OP_AugmentInfo;
 }
 
 int Client::HandlePacket(const EQApplicationPacket *app)
 @@ -8745,3 +8750,26 @@
 FastQueuePacket(&outapp);
 }
 
 +void Client::Handle_OP_AugmentInfo(const EQApplicationPacket *app) {
 +        AugmentInfo_Struct* AugInfo = (AugmentInfo_Struct*) app->pBuffer;
 +        char * outstring ("");
 +        const Item_Struct * item = database.GetItem(AugInfo->itemid);
 +        if (item)
 +                MakeAnyLenString(&outstring, "You must use the solvent %s to remove this augment safely.", item->Name);
 +
 +        int length = strlen(outstring);
 +        // the same opcode is used to both send extra item info and to send book/scroll text
 +        EQApplicationPacket* outapp = new EQApplicationPacket(OP_ReadBook, length + sizeof(BookText_Struct));
 +
 +        BookText_Struct *out = (BookText_Struct *) outapp->pBuffer;
 +        out->window = AugInfo->window;
 +        out->type = 2;        // type 2 equals item information
 +        out->invslot = 0;        // invslot doesn't seem to matter
 +        strcpy(out->booktext, outstring);
 +        safe_delete_array(outstring);
 +
 +        FastQueuePacket(&outapp);
 +        safe_delete(outapp);
 +
 +}
 +
 Index: zone/client_packet.h
 ===================================================================
 --- zone/client_packet.h        (revision 451)
 +++ zone/client_packet.h        (working copy)
 @@ -232,3 +232,4 @@
 void Handle_OP_Barter(const EQApplicationPacket *app);
 void Handle_OP_VoiceMacroIn(const EQApplicationPacket *app);
 void Handle_OP_ApplyPoison(const EQApplicationPacket *app);
 +        void Handle_OP_AugmentInfo(const EQApplicationPacket *app);
 |