summaryrefslogtreecommitdiff
path: root/src/map/guild.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/guild.c')
-rw-r--r--src/map/guild.c180
1 files changed, 83 insertions, 97 deletions
diff --git a/src/map/guild.c b/src/map/guild.c
index 936b4c900..7a187b625 100644
--- a/src/map/guild.c
+++ b/src/map/guild.c
@@ -4,38 +4,39 @@
#define HERCULES_CORE
-#include "../config/core.h" // GP_BOUND_ITEMS
+#include "config/core.h" // GP_BOUND_ITEMS
#include "guild.h"
+#include "map/battle.h"
+#include "map/channel.h"
+#include "map/clif.h"
+#include "map/instance.h"
+#include "map/intif.h"
+#include "map/log.h"
+#include "map/map.h"
+#include "map/mob.h"
+#include "map/npc.h"
+#include "map/pc.h"
+#include "map/skill.h"
+#include "map/status.h"
+#include "map/storage.h"
+#include "common/HPM.h"
+#include "common/cbasetypes.h"
+#include "common/ers.h"
+#include "common/malloc.h"
+#include "common/mapindex.h"
+#include "common/nullpo.h"
+#include "common/showmsg.h"
+#include "common/strlib.h"
+#include "common/timer.h"
+#include "common/utils.h"
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "battle.h"
-#include "channel.h"
-#include "clif.h"
-#include "instance.h"
-#include "intif.h"
-#include "log.h"
-#include "map.h"
-#include "mob.h"
-#include "npc.h"
-#include "pc.h"
-#include "skill.h"
-#include "status.h"
-#include "storage.h"
-#include "../common/HPM.h"
-#include "../common/cbasetypes.h"
-#include "../common/ers.h"
-#include "../common/malloc.h"
-#include "../common/mapindex.h"
-#include "../common/nullpo.h"
-#include "../common/showmsg.h"
-#include "../common/strlib.h"
-#include "../common/timer.h"
-#include "../common/utils.h"
-
struct guild_interface guild_s;
+struct guild_interface *guild;
/*==========================================
* Retrieves and validates the sd pointer for this guild member [Skotlex]
@@ -226,7 +227,7 @@ int guild_getposition(struct guild* g, struct map_session_data* sd)
if( g == NULL && (g=sd->guild) == NULL )
return -1;
-
+
ARR_FIND( 0, g->max_member, i, g->member[i].account_id == sd->status.account_id && g->member[i].char_id == sd->status.char_id );
return( i < g->max_member ) ? g->member[i].position : -1;
}
@@ -262,7 +263,7 @@ int guild_payexp_timer_sub(DBKey key, DBData *data, va_list ap) {
struct guild *g;
c = DB->data2ptr(data);
-
+
if (
(g = guild->search(c->guild_id)) == NULL ||
(i = guild->getindex(g, c->account_id, c->char_id)) < 0
@@ -343,14 +344,12 @@ int guild_create(struct map_session_data *sd, const char *name)
if( !tname[0] )
return 0; // empty name
- if( sd->status.guild_id )
- {// already in a guild
- clif->guild_created(sd,1);
+ if( sd->status.guild_id ) {
+ clif->guild_created(sd,1); // You're already in a guild
return 0;
}
if (battle_config.guild_emperium_check && pc->search_inventory(sd, ITEMID_EMPERIUM) == INDEX_NOT_FOUND) {
- // item required
- clif->guild_created(sd,3);
+ clif->guild_created(sd,3); // You need the necessary item to create a guild
return 0;
}
@@ -367,14 +366,14 @@ int guild_created(int account_id,int guild_id) {
if(sd==NULL)
return 0;
if(!guild_id) {
- clif->guild_created(sd, 2); // Creation failure (presence of the same name Guild)
+ clif->guild_created(sd, 2); // Creation failure (The guild name already exists)
return 0;
}
//struct guild *g;
sd->status.guild_id=guild_id;
- clif->guild_created(sd,0);
+ clif->guild_created(sd,0); // Success
if(battle_config.guild_emperium_check)
- pc->delitem(sd,pc->search_inventory(sd,ITEMID_EMPERIUM),1,0,0,LOG_TYPE_CONSUME); //emperium consumption
+ pc->delitem(sd, pc->search_inventory(sd, ITEMID_EMPERIUM), 1, 0, DELITEM_NORMAL, LOG_TYPE_CONSUME); //emperium consumption
return 0;
}
@@ -476,7 +475,7 @@ int guild_recv_info(struct guild *sg) {
if (channel->config->ally_autojoin) {
struct s_mapiterator* iter = mapit_getallusers();
struct guild *tg[MAX_GUILDALLIANCE];
-
+
for (i = 0; i < MAX_GUILDALLIANCE; i++) {
tg[i] = NULL;
if( sg->alliance[i].opposition == 0 && sg->alliance[i].guild_id )
@@ -508,11 +507,8 @@ int guild_recv_info(struct guild *sg) {
}
}
}
-
mapit->free(iter);
-
}
-
aChSysSave = chan;
}
@@ -541,16 +537,16 @@ int guild_recv_info(struct guild *sg) {
instances_save = g->instances;
}
memcpy(g,sg,sizeof(struct guild));
-
+
g->channel = aChSysSave;
g->instance = instance_save;
g->instances = instances_save;
-
+
if(g->max_member > MAX_GUILD) {
ShowError("guild_recv_info: Received guild with %d members, but MAX_GUILD is only %d. Extra guild-members have been lost!\n", g->max_member, MAX_GUILD);
g->max_member = MAX_GUILD;
}
-
+
for(i=bm=m=0;i<g->max_member;i++){
if(g->member[i].account_id>0){
sd = g->member[i].sd = guild->sd_check(g->guild_id, g->member[i].account_id, g->member[i].char_id);
@@ -615,7 +611,7 @@ int guild_invite(struct map_session_data *sd, struct map_session_data *tsd) {
if(tsd==NULL || g==NULL)
return 0;
- if( (i=guild->getposition(g,sd))<0 || !(g->position[i].mode&0x0001) )
+ if( (i=guild->getposition(g,sd)) < 0 || !(g->position[i].mode&GPERM_INVITE) )
return 0; //Invite permission.
if(!battle_config.invite_request_check) {
@@ -624,7 +620,7 @@ int guild_invite(struct map_session_data *sd, struct map_session_data *tsd) {
return 0;
}
}
-
+
if (!tsd->fd) { //You can't invite someone who has already disconnected.
clif->guild_inviteack(sd,1);
return 0;
@@ -736,12 +732,11 @@ void guild_member_joined(struct map_session_data *sd)
if (i == -1)
sd->status.guild_id = 0;
else {
-
g->member[i].sd = sd;
sd->guild = g;
-
+
if (channel->config->ally && channel->config->ally_autojoin) {
- channel->join(g->channel, sd, NULL, true);
+ channel->join(g->channel, sd, "", true);
}
}
@@ -840,7 +835,7 @@ int guild_expulsion(struct map_session_data* sd, int guild_id, int account_id, i
if(sd->status.guild_id!=guild_id)
return 0;
- if( (ps=guild->getposition(g,sd))<0 || !(g->position[ps].mode&0x0010) )
+ if ((ps=guild->getposition(g,sd))<0 || !(g->position[ps].mode&GPERM_EXPEL))
return 0; //Expulsion permission
//Can't leave inside guild castles.
@@ -869,7 +864,7 @@ int guild_member_withdraw(int guild_id, int account_id, int char_id, int flag, c
if(g == NULL)
return 0; // no such guild (error!)
-
+
i = guild->getindex(g, account_id, char_id);
if( i == -1 )
return 0; // not a member (inconsistency!)
@@ -877,7 +872,7 @@ int guild_member_withdraw(int guild_id, int account_id, int char_id, int flag, c
online_member_sd = guild->getavailablesd(g);
if(online_member_sd == NULL)
return 0; // no one online to inform
-
+
#ifdef GP_BOUND_ITEMS
//Guild bound item check
guild->retrieveitembound(char_id,account_id,guild_id);
@@ -895,7 +890,7 @@ int guild_member_withdraw(int guild_id, int account_id, int char_id, int flag, c
// update char, if online
if(sd != NULL && sd->status.guild_id == guild_id) {
// do stuff that needs the guild_id first, BEFORE we wipe it
- if (sd->state.storage_flag == 2) //Close the guild storage.
+ if (sd->state.storage_flag == STORAGE_FLAG_GUILD) //Close the guild storage.
gstorage->close(sd);
guild->send_dot_remove(sd);
if (channel->config->ally) {
@@ -926,7 +921,7 @@ void guild_retrieveitembound(int char_id,int aid,int guild_id) {
if(gstor && gstor->storage_status == 1) { //Someone is in guild storage, close them
struct s_mapiterator* iter = mapit_getallusers();
for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) {
- if(sd->status.guild_id == guild_id && sd->state.storage_flag == 2) {
+ if(sd->status.guild_id == guild_id && sd->state.storage_flag == STORAGE_FLAG_GUILD) {
gstorage->close(sd);
break;
}
@@ -941,9 +936,9 @@ void guild_retrieveitembound(int char_id,int aid,int guild_id) {
int guild_send_memberinfoshort(struct map_session_data *sd,int online)
{ // cleaned up [LuzZza]
struct guild *g;
-
+
nullpo_ret(sd);
-
+
if(sd->status.guild_id <= 0)
return 0;
@@ -961,7 +956,7 @@ int guild_send_memberinfoshort(struct map_session_data *sd,int online)
ShowError("guild_send_memberinfoshort: Failed to locate member %d:%d in guild %d!\n", sd->status.account_id, sd->status.char_id, g->guild_id);
return 0;
}
-
+
if (sd->state.connect_new) {
//Note that this works because it is invoked in parse_LoadEndAck before connect_new is cleared.
clif->guild_belonginfo(sd,g);
@@ -972,13 +967,12 @@ int guild_send_memberinfoshort(struct map_session_data *sd,int online)
int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class_)
{ // cleaned up [LuzZza]
-
int i,alv,c,idx=-1,om=0,oldonline=-1;
struct guild *g = guild->search(guild_id);
-
+
if(g == NULL)
return 0;
-
+
for(i=0,alv=0,c=0,om=0;i<g->max_member;i++){
struct guild_member *m=&g->member[i];
if(!m->account_id) continue;
@@ -994,7 +988,7 @@ int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int onlin
if(m->online)
om++;
}
-
+
if(idx == -1 || c == 0) {
//Treat char_id who doesn't match guild_id (not found as member)
struct map_session_data *sd = map->id2sd(account_id);
@@ -1005,7 +999,7 @@ int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int onlin
ShowWarning("guild: not found member %d,%d on %d[%s]\n", account_id,char_id,guild_id,g->name);
return 0;
}
-
+
g->average_lv=alv/c;
g->connect_member=om;
@@ -1014,14 +1008,14 @@ int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int onlin
if(oldonline!=online)
clif->guild_memberlogin_notice(g, idx, online);
-
+
if(!g->member[idx].sd)
return 0;
//Send XY dot updates. [Skotlex]
//Moved from guild_send_memberinfoshort [LuzZza]
for(i=0; i < g->max_member; i++) {
-
+
if(!g->member[i].sd || i == idx ||
g->member[i].sd->bl.m != g->member[idx].sd->bl.m)
continue;
@@ -1080,7 +1074,7 @@ int guild_memberposition_changed(struct guild *g,int idx,int pos)
g->member[idx].position=pos;
clif->guild_memberpositionchanged(g,idx);
-
+
// Update char position in client [LuzZza]
if(g->member[idx].sd != NULL)
clif->charnameupdate(g->member[idx].sd);
@@ -1095,9 +1089,7 @@ int guild_change_position(int guild_id,int idx,int mode,int exp_mode,const char
struct guild_position p;
exp_mode = cap_value(exp_mode, 0, battle_config.guild_exp_limit);
- //Mode 0x01 <- Invite
- //Mode 0x10 <- Expel.
- p.mode=mode&0x11;
+ p.mode=mode&GPERM_BOTH; // Invite and Expel
p.exp_mode=exp_mode;
safestrncpy(p.name,name,NAME_LENGTH);
return intif->guild_position(guild_id,idx,&p);
@@ -1114,7 +1106,7 @@ int guild_position_changed(int guild_id,int idx,struct guild_position *p)
return 0;
memcpy(&g->position[idx],p,sizeof(struct guild_position));
clif->guild_positionchanged(g,idx);
-
+
// Update char name in client [LuzZza]
for(i=0;i<g->max_member;i++)
if(g->member[i].position == idx && g->member[i].sd != NULL)
@@ -1254,29 +1246,27 @@ unsigned int guild_payexp(struct map_session_data *sd,unsigned int exp) {
struct guild *g;
struct guild_expcache *c;
int per;
-
+
nullpo_ret(sd);
if (!exp) return 0;
-
+
if (sd->status.guild_id == 0 ||
(g = sd->guild) == NULL ||
(per = guild->getposition(g,sd)) < 0 ||
(per = g->position[per].exp_mode) < 1)
return 0;
-
if (per < 100)
exp = exp * per / 100;
//Otherwise tax everything.
-
c = DB->data2ptr(guild->expcache_db->ensure(guild->expcache_db, DB->i2key(sd->status.char_id), guild->create_expcache, sd));
if (c->exp > UINT64_MAX - exp)
c->exp = UINT64_MAX;
else
c->exp += exp;
-
+
return exp;
}
@@ -1364,7 +1354,7 @@ void guild_guildaura_refresh(struct map_session_data *sd, uint16 skill_id, uint1
return;
if( !skill_lv )
return;
- if( sd->sc.data[type] && (group = skill->id2group(sd->sc.data[type]->val4)) ) {
+ if (sd->sc.data[type] && (group = skill->id2group(sd->sc.data[type]->val4)) != NULL) {
skill->del_unitgroup(group,ALC_MARK);
status_change_end(&sd->bl,type,INVALID_TIMER);
}
@@ -1436,7 +1426,6 @@ int guild_reqalliance(struct map_session_data *sd,struct map_session_data *tsd)
return 0;
}
-
nullpo_ret(sd);
if(tsd==NULL || tsd->status.guild_id<=0)
@@ -1502,7 +1491,7 @@ int guild_reply_reqalliance(struct map_session_data *sd,int account_id,int flag)
struct guild *g, *tg; // Reconfirm the number of alliance
g=sd->guild;
tg=tsd->guild;
-
+
if(g==NULL || guild->get_alliance_count(g,0) >= battle_config.max_guild_alliance){
clif->guild_allianceack(sd,4);
clif->guild_allianceack(tsd,3);
@@ -1642,7 +1631,7 @@ int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id
channel->guild_leave_alliance(g[1],g[0]);
}
}
-
+
if (!(flag & 0x08)) { // new relationship
for(i=0;i<2-(flag&1);i++) {
if(g[i]!=NULL) {
@@ -1674,7 +1663,6 @@ int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id
clif->guild_oppositionack(sd[0],0);
}
-
for (i = 0; i < 2 - (flag & 1); i++) { // Retransmission of the relationship list to all members
if (g[i] != NULL) {
for (j = 0; j < g[i]->max_member; j++) {
@@ -1750,7 +1738,7 @@ int guild_broken(int guild_id,int flag)
for(i=0;i<g->max_member;i++){
// Destroy all relationships
if((sd=g->member[i].sd)!=NULL){
- if(sd->state.storage_flag == 2)
+ if(sd->state.storage_flag == STORAGE_FLAG_GUILD)
gstorage->pc_quit(sd,1);
sd->status.guild_id=0;
sd->guild = NULL;
@@ -1774,7 +1762,7 @@ int guild_broken(int guild_id,int flag)
}
if( g->instance )
aFree(g->instance);
-
+
if( g->hdata )
{
for( i = 0; i < g->hdatac; i++ ) {
@@ -1785,7 +1773,7 @@ int guild_broken(int guild_id,int flag)
}
aFree(g->hdata);
}
-
+
idb_remove(guild->db,guild_id);
return 0;
}
@@ -1798,7 +1786,7 @@ int guild_gm_change(int guild_id, struct map_session_data *sd)
if (sd->status.guild_id != guild_id)
return 0;
-
+
g=guild->search(guild_id);
nullpo_ret(g);
@@ -1842,7 +1830,7 @@ int guild_gm_changed(int guild_id, int account_id, int char_id)
clif->message(g->member[pos].sd->fd, msg_sd(g->member[pos].sd,878)); //"You no longer are the Guild Master."
g->member[pos].sd->state.gmaster_flag = 0;
}
-
+
if (g->member[0].sd && g->member[0].sd->fd) {
clif->message(g->member[0].sd->fd, msg_sd(g->member[0].sd,879)); //"You have become the Guild Master!"
g->member[0].sd->state.gmaster_flag = 1;
@@ -1870,7 +1858,7 @@ int guild_break(struct map_session_data *sd,char *name) {
struct guild *g;
struct unit_data *ud;
int i;
-
+
nullpo_ret(sd);
if( (g=sd->guild)==NULL )
@@ -1891,7 +1879,7 @@ int guild_break(struct map_session_data *sd,char *name) {
clif->guild_broken(sd,2);
return 0;
}
-
+
/* regardless of char server allowing it, we clear the guild master's auras */
if( (ud = unit->bl2ud(&sd->bl)) ) {
int count = 0;
@@ -1908,9 +1896,8 @@ int guild_break(struct map_session_data *sd,char *name) {
groups[count++] = ud->skillunit[i];
break;
}
-
}
- for(i = 0; i < count; i++) {
+ for(i = 0; i < count; i++) { // FIXME: Why is this not done in the above loop?
skill->del_unitgroup(groups[i],ALC_MARK);
}
}
@@ -1918,7 +1905,7 @@ int guild_break(struct map_session_data *sd,char *name) {
#ifdef GP_BOUND_ITEMS
pc->bound_clear(sd,IBT_GUILD);
#endif
-
+
intif->guild_break(g->guild_id);
return 1;
}
@@ -2156,7 +2143,7 @@ bool guild_isallied(int guild_id, int guild_id2)
void guild_flag_add(struct npc_data *nd) {
int i;
-
+
/* check */
for( i = 0; i < guild->flags_count; i++ ) {
if( guild->flags[i] && guild->flags[i]->bl.id == nd->bl.id ) {
@@ -2187,11 +2174,10 @@ void guild_flag_remove(struct npc_data *nd) {
for( i = 0, cursor = 0; i < guild->flags_count; i++ ) {
if( guild->flags[i] == NULL )
continue;
-
+
if( cursor != i ) {
memmove(&guild->flags[cursor], &guild->flags[i], sizeof(struct npc_data*));
}
-
cursor++;
}
@@ -2237,7 +2223,7 @@ void guild_flags_clear(void) {
if( guild->flags[i] )
guild->flags[i] = NULL;
}
-
+
guild->flags_count = 0;
}
@@ -2250,7 +2236,7 @@ void do_init_guild(bool minimal) {
guild->expcache_db = idb_alloc(DB_OPT_BASE);
guild->infoevent_db = idb_alloc(DB_OPT_BASE);
guild->expcache_ers = ers_new(sizeof(struct guild_expcache),"guild.c::expcache_ers",ERS_OPT_NONE);
-
+
sv->readdb(map->db_path, "castle_db.txt", ',', 4, 5, -1, guild->read_castledb);
sv->readdb(map->db_path, "guild_skill_tree.txt", ',', 2+MAX_GUILD_SKILL_REQUIRE*2, 2+MAX_GUILD_SKILL_REQUIRE*2, -1, guild->read_guildskill_tree_db); //guild skill tree [Komurka]
@@ -2265,7 +2251,7 @@ void do_final_guild(void) {
DBIterator *iter = db_iterator(guild->db);
struct guild *g;
int i;
-
+
for( g = dbi_first(iter); dbi_exists(iter); g = dbi_next(iter) ) {
if( g->channel != NULL )
channel->delete(g->channel);
@@ -2284,21 +2270,21 @@ void do_final_guild(void) {
aFree(g->hdata);
}
}
-
+
dbi_destroy(iter);
-
+
db_destroy(guild->db);
guild->castle_db->destroy(guild->castle_db,guild->castle_db_final);
guild->expcache_db->destroy(guild->expcache_db,guild->expcache_db_final);
guild->infoevent_db->destroy(guild->infoevent_db,guild->eventlist_db_final);
ers_destroy(guild->expcache_ers);
-
+
if( guild->flags )
aFree(guild->flags);
}
void guild_defaults(void) {
guild = &guild_s;
-
+
guild->init = do_init_guild;
guild->final = do_final_guild;
/* */