Browse Source

Implementation of getguildinfo script command (#8935)

Fixes #8931

Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
crazyarashi 3 months ago
parent
commit
304e87aae9
5 changed files with 149 additions and 0 deletions
  1. 31 0
      doc/sample/getguildinfo.txt
  2. 30 0
      doc/script_commands.txt
  3. 62 0
      src/map/script.cpp
  4. 14 0
      src/map/script.hpp
  5. 12 0
      src/map/script_constants.hpp

+ 31 - 0
doc/sample/getguildinfo.txt

@@ -0,0 +1,31 @@
+//===== rAthena Script =======================================
+//= getguildinfo sample
+//===== Description: =========================================
+//= Sample script for the getguildinfo script command
+//===== Additional Comments: =================================
+//= 1.0 First version. [crazyarashi]
+//============================================================
+
+prontera,255,55,5	script	test_getguildinfo	2_M_SAGE_OLD,{
+	.@gid = getcharid(2);
+	if ( !.@gid ) {
+		mes "You don't have a guild.";
+		close;
+	}
+	setarray .@data$[0], "Guild Name", "Guild Level", "Average Level", "Online Count", "Member Count", "Max Member Count", "EXP", "Next Exp", "Master CID", "Master Name";
+	setarray .@type[0], GUILDINFO_NAME, GUILDINFO_LEVEL, GUILDINFO_AVERAGELEVEL, GUILDINFO_ONLINECOUNT, GUILDINFO_MEMBERCOUNT, GUILDINFO_MAXMEMBERCOUNT, GUILDINFO_EXP, GUILDINFO_NEXTEXP, GUILDINFO_MASTERID, GUILDINFO_MASTERNAME;
+	for ( .@i = 0; .@i < getarraysize(.@data$); ++.@i )
+		dispbottom .@data$[.@i] + " : " + getguildinfo(.@gid, .@type[.@i]);
+	end;
+}
+
+prontera,255,57,5	script	test_getguildinfo2	2_M_SAGE_OLD,{
+	.@gid = 1234;
+	// Load guild information from char-server
+	requestguildinfo .@gid;
+	setarray .@data$[0], "Guild Name", "Guild Level", "Average Level", "Online Count", "Member Count", "Max Member Count", "EXP", "Next Exp", "Master CID", "Master Name";
+	setarray .@type[0], GUILDINFO_NAME, GUILDINFO_LEVEL, GUILDINFO_AVERAGELEVEL, GUILDINFO_ONLINECOUNT, GUILDINFO_MEMBERCOUNT, GUILDINFO_MAXMEMBERCOUNT, GUILDINFO_EXP, GUILDINFO_NEXTEXP, GUILDINFO_MASTERID, GUILDINFO_MASTERNAME;
+	for ( .@i = 0; .@i < getarraysize(.@data$); ++.@i )
+		dispbottom .@data$[.@i] + " : " + getguildinfo(.@gid, .@type[.@i]);
+	end;
+}

+ 30 - 0
doc/script_commands.txt

@@ -3512,6 +3512,36 @@ guild specified by the ID. 0 if the character is not a guild master of any guild
 
 ---------------------------------------
 
+*getguildinfo(<guild ID>, <type>);
+
+This function will look up and return the request type of guild information.
+
+Types:
+	GUILDINFO_NAME              - Guild's Name
+	GUILDINFO_LEVEL             - Guild's Level
+	GUILDINFO_AVERAGELEVEL      - Guild's Average Level
+	GUILDINFO_ONLINECOUNT       - Guild's Online Member Count
+	GUILDINFO_MEMBERCOUNT       - Guild's Current Member Count
+	GUILDINFO_MAXMEMBERCOUNT    - Guild's Max Member Count
+	GUILDINFO_EXP               - Guild's Current EXP
+	GUILDINFO_NEXTEXP           - Guild's Required EXP to Level
+	GUILDINFO_MASTERID          - Guild Master Character ID
+	GUILDINFO_MASTERNAME        - Guild Master Name
+
+Note: Make sure to use the requestguildinfo script command to load the guild data from the char-server.
+Example Case ( Newly formed guild ):
+
+.@gid = 1234;
+
+getguildinfo( .@gid, GUILDINFO_LEVEL ); //Returns 0
+
+requestguildinfo( .@gid );
+getguildinfo( .@gid, GUILDINFO_LEVEL ); //Returns current guild level
+
+See the sample in 'doc/sample/getguildinfo.txt'.
+
+---------------------------------------
+
 *is_guild_leader({<guild ID>})
 
 This command will return true if the player attached to the script is the leader

+ 62 - 0
src/map/script.cpp

@@ -9077,6 +9077,67 @@ BUILDIN_FUNC(getguildmasterid)
 	return SCRIPT_CMD_SUCCESS;
 }
 
+/*==========================================
+ * Returns the requested information of the provided guild ID
+ *------------------------------------------*/
+BUILDIN_FUNC(getguildinfo)
+{
+	int32 guild_id = script_getnum(st,2);
+	auto g = guild_search(guild_id);
+	
+	if ( g == nullptr ) {
+		ShowError( "buildin_getguildinfo: The guild ID '%d' doesn't exist or is not yet loaded into the map-server. \n", guild_id );
+		st->state = END;
+		return SCRIPT_CMD_FAILURE;
+	}
+	
+	int32 type = script_getnum(st,3);
+	
+	switch ( type ) {
+		case GUILDINFO_NAME:
+			script_pushstrcopy(st, g->guild.name);
+			break;
+		case GUILDINFO_LEVEL:
+			script_pushint(st, g->guild.guild_lv);
+			break;
+		case GUILDINFO_AVERAGELEVEL:
+			script_pushint(st, g->guild.average_lv);
+			break;
+		case GUILDINFO_ONLINECOUNT:
+			script_pushint(st, g->guild.connect_member);
+			break;
+		case GUILDINFO_MEMBERCOUNT: {
+			int32 c = 0;
+			for ( int32 i = 0; i < g->guild.max_member; ++i ) {
+				if( g->guild.member[i].account_id > 0 )
+					c++;
+			}
+			script_pushint(st, c);
+		} break;
+		case GUILDINFO_MAXMEMBERCOUNT:
+			script_pushint(st, g->guild.max_member);
+			break;
+		case GUILDINFO_EXP:
+			script_pushint(st, g->guild.exp);
+			break;
+		case GUILDINFO_NEXTEXP:
+			script_pushint(st, g->guild.next_exp);
+			break;
+		case GUILDINFO_MASTERID:
+			script_pushint(st, g->guild.member[0].char_id);
+			break;
+		case GUILDINFO_MASTERNAME:
+			script_pushstrcopy(st, g->guild.member[0].name);
+			break;
+		default:
+			ShowError( "buildin_getguildinfo: Invalid guildinfo type. \n", type );
+			st->state = END;
+			return SCRIPT_CMD_FAILURE;
+	}
+	
+	return SCRIPT_CMD_SUCCESS;
+}
+
 /*==========================================
  * Get char string information by type :
  * Return by @type :
@@ -27699,6 +27760,7 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF(getguildname,"i"),
 	BUILDIN_DEF(getguildmaster,"i"),
 	BUILDIN_DEF(getguildmasterid,"i"),
+	BUILDIN_DEF(getguildinfo,"ii"),
 	BUILDIN_DEF(strcharinfo,"i?"),
 	BUILDIN_DEF(strnpcinfo,"i"),
 	BUILDIN_DEF(getequipid,"??"),

+ 14 - 0
src/map/script.hpp

@@ -2210,6 +2210,20 @@ enum e_eleminfo : uint8 {
 	ELEMINFO_CLASS,
 };
 
+/* getguildinfo script command */
+enum e_guildinfo : uint8 {
+	GUILDINFO_NAME = 1,
+	GUILDINFO_LEVEL,
+	GUILDINFO_AVERAGELEVEL,
+	GUILDINFO_ONLINECOUNT,
+	GUILDINFO_MEMBERCOUNT,
+	GUILDINFO_MAXMEMBERCOUNT,
+	GUILDINFO_EXP,
+	GUILDINFO_NEXTEXP,
+	GUILDINFO_MASTERID,
+	GUILDINFO_MASTERNAME,
+};
+
 class ConstantDatabase : public YamlDatabase {
 public:
 	ConstantDatabase() : YamlDatabase("CONSTANT_DB", 1) {

+ 12 - 0
src/map/script_constants.hpp

@@ -10626,6 +10626,18 @@
 	export_constant(GROUP_ALGORITHM_RANDOM);
 	export_constant(GROUP_ALGORITHM_SHAREDPOOL);
 	export_constant(GROUP_ALGORITHM_ALL);
+	
+	/* guildinfo script command */
+	export_constant(GUILDINFO_NAME);
+	export_constant(GUILDINFO_LEVEL);
+	export_constant(GUILDINFO_AVERAGELEVEL);
+	export_constant(GUILDINFO_ONLINECOUNT);
+	export_constant(GUILDINFO_MEMBERCOUNT);
+	export_constant(GUILDINFO_MAXMEMBERCOUNT);
+	export_constant(GUILDINFO_EXP);
+	export_constant(GUILDINFO_NEXTEXP);
+	export_constant(GUILDINFO_MASTERID);
+	export_constant(GUILDINFO_MASTERNAME);
 
 	#undef export_constant
 	#undef export_constant2