Преглед на файлове

Converted CZ_CHOOSE_MENU to struct

Lemongrass3110 преди 3 месеца
родител
ревизия
00701b942e
променени са 3 файла, в които са добавени 20 реда и са изтрити 11 реда
  1. 12 10
      src/map/clif.cpp
  2. 1 1
      src/map/clif_packetdb.hpp
  3. 7 0
      src/map/packets.hpp

+ 12 - 10
src/map/clif.cpp

@@ -13213,37 +13213,39 @@ void clif_parse_WeaponRefine( int32 fd, map_session_data *sd ){
 }
 
 
-/// Answer to script menu dialog (CZ_CHOOSE_MENU).
-/// 00b8 <npc id>.L <choice>.B
+/// Answer to script menu dialog.
+/// 00b8 <npc id>.L <choice>.B (CZ_CHOOSE_MENU)
 /// choice:
 ///     1~254 = menu item
 ///     255   = cancel
 /// NOTE: If there were more than 254 items in the list, choice
 ///     overflows to choice%256.
 void clif_parse_NpcSelectMenu(int32 fd,map_session_data *sd){
-	struct s_packet_db* info = &packet_db[RFIFOW(fd,0)];
-	int32 npc_id = RFIFOL(fd,info->pos[0]);
-	uint8 select = RFIFOB(fd,info->pos[1]);
+	if( sd == nullptr ){
+		return;
+	}
 
 #ifdef SECURE_NPCTIMEOUT
 	if( sd->npc_idle_timer == INVALID_TIMER && !sd->state.ignoretimeout )
 		return;
 #endif
 
-	if( (select > sd->npc_menu && select != 0xff) || select == 0 ) {
-			TBL_NPC* nd = map_id2nd(npc_id);
-			ShowWarning("Invalid menu selection on npc %d:'%s' - got %d, valid range is [%d..%d] (player AID:%d, CID:%d, name:'%s')!\n", npc_id, (nd)?nd->name:"invalid npc id", select, 1, sd->npc_menu, sd->bl.id, sd->status.char_id, sd->status.name);
+	const PACKET_CZ_CHOOSE_MENU* p = reinterpret_cast<PACKET_CZ_CHOOSE_MENU*>( RFIFOP( fd, 0 ) );
+
+	if( ( p->choice > sd->npc_menu && p->choice != 0xff ) || p->choice == 0 ){
+			npc_data* nd = map_id2nd( p->GID );
+			ShowWarning( "Invalid menu selection on npc %d:'%s' - got %d, valid range is [%d..%d] (player AID:%d, CID:%d, name:'%s')!\n", p->GID, ( nd != nullptr ) ? nd->name : "invalid npc id", select, 1, sd->npc_menu, sd->bl.id, sd->status.char_id, sd->status.name );
 			clif_GM_kick(nullptr,sd);
 		return;
 	}
 
-	sd->npc_menu = select;
+	sd->npc_menu = p->choice;
 
 	if( battle_config.idletime_option&IDLE_NPC_MENU ){
 		sd->idletime = last_tick;
 	}
 
-	npc_scriptcont(sd,npc_id, false);
+	npc_scriptcont( sd, p->GID, false );
 }
 
 

+ 1 - 1
src/map/clif_packetdb.hpp

@@ -61,7 +61,7 @@
 	parseable_packet(0x00ab,4,clif_parse_UnequipItem,2);
 	packet(0x00ae,-1);
 	parseable_packet(0x00b2,3,clif_parse_Restart,2);
-	parseable_packet(0x00b8,7,clif_parse_NpcSelectMenu,2,6);
+	parseable_packet( HEADER_CZ_CHOOSE_MENU, sizeof( PACKET_CZ_CHOOSE_MENU ), clif_parse_NpcSelectMenu, 0 );
 	parseable_packet(0x00b9,6,clif_parse_NpcNextClicked,2);
 	packet(0x00ba,2);
 	parseable_packet(0x00bb,5,clif_parse_StatusUp,2,4);

+ 7 - 0
src/map/packets.hpp

@@ -1731,6 +1731,13 @@ struct PACKET_ZC_UPDATE_MAPINFO{
 } __attribute__((packed));
 DEFINE_PACKET_HEADER(ZC_UPDATE_MAPINFO, 0x192);
 
+struct PACKET_CZ_CHOOSE_MENU{
+	int16 packetType;
+	uint32 GID;
+	uint8 choice;
+} __attribute__((packed));
+DEFINE_PACKET_HEADER(CZ_CHOOSE_MENU, 0x0b8);
+
 // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
 #if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
 	#pragma pack( pop )