浏览代码

Added atcommand for limited sale (#3103)

Removed permission
Added state tracking instead to make sure player can use the atcommand

Thanks to @secretdataz for his idea.
Lemongrass3110 7 年之前
父节点
当前提交
ce324ad13d
共有 7 个文件被更改,包括 39 次插入14 次删除
  1. 0 1
      conf/groups.conf
  2. 1 0
      conf/help.txt
  3. 13 0
      src/map/atcommand.cpp
  4. 23 11
      src/map/clif.cpp
  5. 1 0
      src/map/clif.hpp
  6. 1 0
      src/map/pc.hpp
  7. 0 2
      src/map/pc_groups.hpp

+ 0 - 1
conf/groups.conf

@@ -293,7 +293,6 @@ groups: (
 		item_unconditional: false
 		bypass_stat_onclone: true
 		bypass_max_stat: true
-		cashshop_sale: true
 		/* all_permission: true */
 	}
 }

+ 1 - 0
conf/help.txt

@@ -321,3 +321,4 @@ reload: "Params: <type>\n" "Reload a database or configuration file.\n"
 	"   pcdb                    motd             script\n"
 	"   questdb              msgconf       packetdb\n"
 langtype: "Params: <language>\n" "Changes your language setting."
+limitedsale: "Opens the limited sale window."

+ 13 - 0
src/map/atcommand.cpp

@@ -9987,6 +9987,18 @@ ACMD_FUNC(adopt)
 	return -1;
 }
 
+/**
+ * Opens the limited sale window.
+ * Usage: @limitedsale or client command /limitedsale on supported clients
+ */
+ACMD_FUNC(limitedsale){
+	nullpo_retr(-1, sd);
+
+	clif_sale_open(sd);
+
+	return 0;
+}
+
 #include "../custom/atcommand.inc"
 
 /**
@@ -10284,6 +10296,7 @@ void atcommand_basecommands(void) {
 		ACMD_DEF(adopt),
 		ACMD_DEF(agitstart3),
 		ACMD_DEF(agitend3),
+		ACMD_DEFR(limitedsale, ATCMD_NOCONSOLE|ATCMD_NOAUTOTRADE),
 	};
 	AtCommandInfo* atcommand;
 	int i;

+ 23 - 11
src/map/clif.cpp

@@ -19924,9 +19924,15 @@ void clif_parse_sale_refresh( int fd, struct map_session_data* sd ){
 /// 09b5 (ZC_OPEN_BARGAIN_SALE_TOOL)
 void clif_sale_open( struct map_session_data* sd ){
 #if PACKETVER_SUPPORTS_SALES
-	int fd = sd->fd;
+	nullpo_retv(sd);
+
+	if( sd->state.sale_open ){
+		return;
+	}
 
-	// TODO: do we want state tracking?
+	sd->state.sale_open = true;
+
+	int fd = sd->fd;
 
 	WFIFOHEAD(fd, 2);
 	WFIFOW(fd, 0) = 0x9b5;
@@ -19945,11 +19951,11 @@ void clif_parse_sale_open( int fd, struct map_session_data* sd ){
 		return;
 	}
 
-	if( !pc_has_permission( sd, PC_PERM_CASHSHOP_SALE ) ){
-		return;
-	}
+	char command[CHAT_SIZE_MAX];
 
-	clif_sale_open(sd);
+	safesnprintf( command, sizeof(command), "%climitedsale", atcommand_symbol );
+
+	is_atcommand(fd, sd, command, 1);
 #endif
 }
 
@@ -19957,6 +19963,14 @@ void clif_parse_sale_open( int fd, struct map_session_data* sd ){
 /// 09bd (ZC_CLOSE_BARGAIN_SALE_TOOL)
 void clif_sale_close(struct map_session_data* sd) {
 #if PACKETVER_SUPPORTS_SALES
+	nullpo_retv(sd);
+
+	if( !sd->state.sale_open ){
+		return;
+	}
+
+	sd->state.sale_open = false;
+
 	int fd = sd->fd;
 
 	WFIFOHEAD(fd, 2);
@@ -19975,8 +19989,6 @@ void clif_parse_sale_close(int fd, struct map_session_data* sd) {
 		return;
 	}
 
-	// TODO: do we want state tracking?
-
 	clif_sale_close(sd);
 #endif
 }
@@ -20015,7 +20027,7 @@ void clif_parse_sale_search( int fd, struct map_session_data* sd ){
 		return;
 	}
 
-	if( !pc_has_permission( sd, PC_PERM_CASHSHOP_SALE ) ){
+	if( !sd->state.sale_open ){
 		return;
 	}
 
@@ -20069,7 +20081,7 @@ void clif_parse_sale_add( int fd, struct map_session_data* sd ){
 		return;
 	}
 
-	if( !pc_has_permission( sd, PC_PERM_CASHSHOP_SALE ) ){
+	if( !sd->state.sale_open ){
 		return;
 	}
 
@@ -20112,7 +20124,7 @@ void clif_parse_sale_remove( int fd, struct map_session_data* sd ){
 		return;
 	}
 
-	if( !pc_has_permission( sd, PC_PERM_CASHSHOP_SALE ) ){
+	if( !sd->state.sale_open ){
 		return;
 	}
 

+ 1 - 0
src/map/clif.hpp

@@ -1031,6 +1031,7 @@ void clif_clan_leave( struct map_session_data* sd );
 void clif_sale_start(struct sale_item_data* sale_item, struct block_list* bl, enum send_target target);
 void clif_sale_end(struct sale_item_data* sale_item, struct block_list* bl, enum send_target target);
 void clif_sale_amount(struct sale_item_data* sale_item, struct block_list* bl, enum send_target target);
+void clif_sale_open(struct map_session_data* sd);
 
 /**
  * Color Table

+ 1 - 0
src/map/pc.hpp

@@ -266,6 +266,7 @@ struct map_session_data {
 		bool keepshop; // Whether shop data should be removed when the player disconnects
 		bool mail_writing; // Whether the player is currently writing a mail in RODEX or not
 		bool cashshop_open;
+		bool sale_open;
 	} state;
 	struct {
 		unsigned char no_weapon_damage, no_magic_damage, no_misc_damage;

+ 0 - 2
src/map/pc_groups.hpp

@@ -51,7 +51,6 @@ enum e_pc_permission : uint32 {
 	PC_PERM_ENABLE_COMMAND      = 0x01000000,
 	PC_PERM_BYPASS_STAT_ONCLONE = 0x02000000,
 	PC_PERM_BYPASS_MAX_STAT     = 0x04000000,
-	PC_PERM_CASHSHOP_SALE		= 0x08000000,
 	//.. add other here
 	PC_PERM_ALLPERMISSION       = 0xFFFFFFFF,
 };
@@ -87,7 +86,6 @@ static const struct s_pcg_permission_name {
 	{ "command_enable",PC_PERM_ENABLE_COMMAND },
 	{ "bypass_stat_onclone",PC_PERM_BYPASS_STAT_ONCLONE },
 	{ "bypass_max_stat",PC_PERM_BYPASS_MAX_STAT },
-	{ "cashshop_sale", PC_PERM_CASHSHOP_SALE },
 	{ "all_permission", PC_PERM_ALLPERMISSION },
 };