//Limite Job Guild
Index: conf/map/battle/guild.conf
===================================================================
--- conf/map/battle/guild.conf (revision 18428)
+++ conf/map/battle/guild.conf (working copy)
@@ -71,3 +71,7 @@
// default: false
guild_castle_invite: false
guild_castle_expulsion: false
+
+// Limite de classes repetidas no clã
+// max_guild_class = 0 para desativar, quantidade máxima é 999
+max_guild_class: 1
\ No newline at end of file
Index: src/map/battle.c
===================================================================
--- src/map/battle.c (revision 18428)
+++ src/map/battle.c (working copy)
@@ -7333,6 +7333,7 @@
{ "max_summoner_parameter", &battle_config.max_summoner_parameter, 120, 10, 10000, },
{ "mvp_exp_reward_message", &battle_config.mvp_exp_reward_message, 0, 0, 1, },
{ "monster_eye_range_bonus", &battle_config.mob_eye_range_bonus, 0, 0, 10, },
+ { "max_guild_class", &battle_config.max_guild_class, 0, 0, 999, },
};
#ifndef STATS_OPT_OUT
/**
Index: src/map/battle.h
===================================================================
--- src/map/battle.h (revision 18428)
+++ src/map/battle.h (working copy)
@@ -552,6 +552,8 @@
int mvp_exp_reward_message;
int mob_eye_range_bonus; //Vulture's Eye and Snake's Eye range bonus
+
+ int max_guild_class;
};
/* criteria for battle_config.idletime_critera */
Index: src/map/guild.c
===================================================================
--- src/map/guild.c (revision 18428)
+++ src/map/guild.c (working copy)
@@ -626,6 +626,29 @@
}
/*=============================================
+ * Desenvolvedor: Gilmar B. Freitas(@Kyomai)
+ * Conta a quantidade de jogadores de uma determinada classe
+ *--------------------------------------------*/
+int guild_class_count( int guild_id, int16 class ) {
+
+ struct guild* g = guild->search(guild_id);
+
+ if (g == NULL) return 0;
+ int i, quantidade = 0;
+ for (i = 0; i < g->max_member; ++i) {
+
+ // Caso o jogador esteja online verifica a classe do personagem diretamente.
+ if (g->member[i].online) {
+ if (g->member[i].sd->status.class == class)++quantidade;
+ } else {
+ if (g->member[i].class == class)++quantidade;
+ }
+
+ }
+ return quantidade;
+}
+
+/*=============================================
* Player sd send a guild invatation to player tsd to join his guild
*--------------------------------------------*/
int guild_invite(struct map_session_data *sd, struct map_session_data *tsd) {
@@ -672,7 +695,7 @@
clif->guild_inviteack(sd,3);
return 0;
}
-
+
tsd->guild_invite=sd->status.guild_id;
tsd->guild_invite_account=sd->status.account_id;
@@ -745,7 +761,24 @@
sd->guild_invite_account = 0;
return 0;
}
+
+ // Verifica se está habilitado o recurso de limitação de classes repetidas
+ if ( battle_config.max_guild_class > 0 ) {
+ int quantidade = guild_class_count(g->guild_id,sd->status.class);
+
+ // Se a quantidade de membros da mesma classe for igual ou maior que a quantidade limite definida no arquivo guild.conf o jogador convidadonão será convidado
+ if ( quantidade >= battle_config.max_guild_class ) {
+ char mensagem[128];
+ sprintf( mensagem, "Você não pode se tornar membro do clã, porque o clã já possui %d %s.", quantidade, pc->job_name(sd->status.class) );
+ clif->messagecolor_self(sd->fd, COLOR_RED, mensagem);
+ sd->guild_invite = 0; // Apaga o convite ser membro do clã.
+ sd->guild_invite_account = 0;
+ return 0;
+ }
+ }
+ // Fim da verificação
+
ARR_FIND( 0, g->max_member, i, g->member[i].account_id == 0 );
if( i == g->max_member )
{
@@ -2359,6 +2399,7 @@
guild->recv_noinfo = guild_recv_noinfo;
guild->recv_info = guild_recv_info;
guild->npc_request_info = guild_npc_request_info;
+ guild->class_count = guild_class_count;
guild->invite = guild_invite;
guild->reply_invite = guild_reply_invite;
guild->member_joined = guild_member_joined;
Index: src/map/guild.h
===================================================================
--- src/map/guild.h (revision 18428)
+++ src/map/guild.h (working copy)
@@ -109,6 +109,7 @@
int (*recv_noinfo) (int guild_id);
int (*recv_info) (const struct guild *sg);
int (*npc_request_info) (int guild_id,const char *ev);
+ int (*class_count) ( int guild_id, int16 class);
int (*invite) (struct map_session_data *sd,struct map_session_data *tsd);
int (*reply_invite) (struct map_session_data *sd,int guild_id,int flag);
void (*member_joined) (struct map_session_data *sd);
Index: src/map/pc.c
===================================================================
--- src/map/pc.c (revision 18428)
+++ src/map/pc.c (working copy)
@@ -8747,7 +8747,47 @@
break;
}
}
-
+
+ // Verificação, caso o sistema de limitação de classe esteja ativo.
+ if ( battle_config.max_guild_class > 0 ) {
+
+ struct guild *g = sd->guild;
+ // Verifica a exitência do clã para determinado jogador.
+ if (g) {
+
+ // Verifica a quantidade de jogadores da mesma classe que estão na guild incluindo o próprio jogador.
+ int quantidade = guild->class_count(g->guild_id,sd->status.class);
+
+ // Caso contando com ele seja maior do que o limite, ele será expulso.
+ if (quantidade > battle_config.max_guild_class) {
+
+ /*
+ * Verifica se o jogador é o líder do clã, caso positivo ele terá de escolher outro membro da
+ * mesma classe para ser removido.
+ */
+ if (sd->state.gmaster_flag) {
+
+ // Percorre os membros do clã.
+ int indice;
+ for (indice = 0; indice < g->max_member; ++indice) {
+
+ // Porcura um membro da mesma classe para ser removido.
+ if ((g->member[indice].class == sd->status.class) && (g->member[indice].char_id != sd->status.char_id)) {
+ // Remove membro do clã
+ intif->guild_leave(g->guild_id,g->member[indice].account_id,g->member[indice].char_id,1,"Excesso de contigente");
+ // Finaliza o laço de repetição.
+ indice = g->max_member;
+ }
+ }
+ } else {
+ // Remove o membro do clã.
+ intif->guild_leave(g->guild_id,sd->status.account_id,sd->status.char_id,1,"Excesso de contigente");
+ }
+ }
+ }
+ }
+ // Fim da verificação.
+
return 0;
}
NOTE: The main topic has been cleared to leave only the most important ones and the following diffs have been removed due to the difficulty of finding collaborators, if someone is interested please contact me and I will provide the files.
Some diffs have already been converted thanks to the incredible @Dastgir work. All credits and thanks should be directed to it, I just supplied the diffs files with the codes. Every community is very happy and thanks for this contribution, thank you very much!
3) deadon/deadoff: Force Players into Trick Dead.
4) mapsit: Contains various commands like mapsit, mapstand, sit, stand, to.
Could someone teach me how to convert to this diff plugin, please?
1 - Show shop.
8 -
NOTE: The main topic has been cleared to leave only the most important ones and the following diffs have been removed due to the difficulty of finding collaborators, if someone is interested please contact me and I will provide the files.
2 - Fakename, 5 - Annouce item. Note: from rathena, 7 - MAC. , 9 - Get stuff item - [PVP]/[GVG]/[bTG],
Diffs already converted.
Some diffs have already been converted thanks to the incredible @Dastgir work. All credits and thanks should be directed to it, I just supplied the diffs files with the codes. Every community is very happy and thanks for this contribution, thank you very much!
3) deadon/deadoff: Force Players into Trick Dead.
4) mapsit: Contains various commands like mapsit, mapstand, sit, stand, to.
forcefully make player sit or stand.
6) guildjoin: Invites player offline into guild.
Share this post
Link to post
Share on other sites