diff options
Diffstat (limited to 'src/map/guild.c')
-rw-r--r-- | src/map/guild.c | 448 |
1 files changed, 295 insertions, 153 deletions
diff --git a/src/map/guild.c b/src/map/guild.c index 39d580bb7..f344878e1 100644 --- a/src/map/guild.c +++ b/src/map/guild.c @@ -2,8 +2,8 @@ * This file is part of Hercules. * http://herc.ws - http://github.com/HerculesWS/Hercules * - * Copyright (C) 2012-2015 Hercules Dev Team - * Copyright (C) Athena Dev Teams + * Copyright (C) 2012-2020 Hercules Dev Team + * Copyright (C) Athena Dev Teams * * Hercules is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -38,6 +38,7 @@ #include "map/storage.h" #include "common/HPM.h" #include "common/cbasetypes.h" +#include "common/conf.h" #include "common/ers.h" #include "common/memmgr.h" #include "common/mapindex.h" @@ -51,13 +52,13 @@ #include <stdlib.h> #include <string.h> -struct guild_interface guild_s; +static struct guild_interface guild_s; struct guild_interface *guild; /*========================================== * Retrieves and validates the sd pointer for this guild member [Skotlex] *------------------------------------------*/ -struct map_session_data *guild_sd_check(int guild_id, int account_id, int char_id) +static struct map_session_data *guild_sd_check(int guild_id, int account_id, int char_id) { struct map_session_data *sd = map->id2sd(account_id); @@ -74,14 +75,16 @@ struct map_session_data *guild_sd_check(int guild_id, int account_id, int char_i } // Modified [Komurka] -int guild_skill_get_max (int id) { +static int guild_skill_get_max(int id) +{ if (id < GD_SKILLBASE || id >= GD_SKILLBASE+MAX_GUILDSKILL) return 0; return guild->skill_tree[id-GD_SKILLBASE].max; } // Retrieve skill_lv learned by guild -int guild_checkskill(struct guild *g, int id) { +static int guild_checkskill(struct guild *g, int id) +{ int idx = id - GD_SKILLBASE; nullpo_ret(g); if (idx < 0 || idx >= MAX_GUILDSKILL) @@ -92,7 +95,7 @@ int guild_checkskill(struct guild *g, int id) { /*========================================== * guild_skill_tree.txt reading - from jA [Komurka] *------------------------------------------*/ -bool guild_read_guildskill_tree_db(char* split[], int columns, int current) +static bool guild_read_guildskill_tree_db(char *split[], int columns, int current) {// <skill id>,<max lv>,<req id1>,<req lv1>,<req id2>,<req lv2>,<req id3>,<req lv3>,<req id4>,<req lv4>,<req id5>,<req lv5> int k, id, skill_id; @@ -125,7 +128,7 @@ bool guild_read_guildskill_tree_db(char* split[], int columns, int current) /*========================================== * Guild skill check - from jA [Komurka] *------------------------------------------*/ -int guild_check_skill_require(struct guild *g,int id) +static int guild_check_skill_require(struct guild *g, int id) { int i; int idx = id-GD_SKILLBASE; @@ -145,37 +148,137 @@ int guild_check_skill_require(struct guild *g,int id) return 1; } -bool guild_read_castledb(char* str[], int columns, int current) -{// <castle id>,<map name>,<castle name>,<castle event>[,<reserved/unused switch flag>] - struct guild_castle *gc; - int index; +static bool guild_read_castledb_libconfig(void) +{ + struct config_t castle_conf; + struct config_setting_t *castle_db = NULL, *it = NULL; + char config_filename[256]; + libconfig->format_db_path("castle_db.conf", config_filename, sizeof(config_filename)); + int i = 0; - nullpo_retr(false, str); - index = mapindex->name2id(str[1]); - if (map->mapindex2mapid(index) < 0) // Map not found or on another map-server + if (libconfig->load_file(&castle_conf, config_filename) == 0) return false; + if ((castle_db = libconfig->setting_get_member(castle_conf.root, "castle_db")) == NULL) { + libconfig->destroy(&castle_conf); + ShowError("guild_read_castledb_libconfig: can't read %s\n", config_filename); + return false; + } + + while ((it = libconfig->setting_get_elem(castle_db, i++)) != NULL) { + guild->read_castledb_libconfig_sub(it, i - 1, config_filename); + } + + libconfig->destroy(&castle_conf); + ShowStatus("Done reading '"CL_WHITE"%u"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", db_size(guild->castle_db), config_filename); + return true; +} + +static bool guild_read_castledb_libconfig_sub(struct config_setting_t *it, int idx, const char *source) +{ + nullpo_ret(it); + nullpo_ret(source); + + struct guild_castle *gc = NULL; + const char *name = NULL; + int i32 = 0; CREATE(gc, struct guild_castle, 1); - gc->castle_id = atoi(str[0]); + + if (libconfig->setting_lookup_int(it, "CastleID", &i32) == CONFIG_FALSE) { + aFree(gc); + ShowWarning("guild_read_castledb_libconfig_sub: Invalid or missing CastleID (%d) in \"%s\", entry #%d, skipping.\n", i32, source, idx); + return false; + } + gc->castle_id = i32; + + if (libconfig->setting_lookup_string(it, "MapName", &name) == CONFIG_FALSE) { + aFree(gc); + ShowWarning("guild_read_castledb_libconfig_sub: Invalid or missing MapName in \"%s\", entry #%d, skipping.\n", source, idx); + return false; + } + int index = mapindex->name2id(name); + if (map->mapindex2mapid(index) < 0) { + aFree(gc); + ShowWarning("guild_read_castledb_libconfig_sub: Invalid MapName (%s) in \"%s\", entry #%d, skipping.\n", name, source, idx); + return false; + } gc->mapindex = index; - safestrncpy(gc->castle_name, str[2], sizeof(gc->castle_name)); - safestrncpy(gc->castle_event, str[3], sizeof(gc->castle_event)); - idb_put(guild->castle_db,gc->castle_id,gc); + if (libconfig->setting_lookup_string(it, "CastleName", &name) == CONFIG_FALSE) { + aFree(gc); + ShowWarning("guild_read_castledb_libconfig_sub: Invalid CastleName in \"%s\", entry #%d, skipping.\n", source, idx); + return false; + } + safestrncpy(gc->castle_name, name, sizeof(gc->castle_name)); - //intif->guild_castle_info(gc->castle_id); + if (libconfig->setting_lookup_string(it, "OnGuildBreakEventName", &name) == CONFIG_FALSE){ + aFree(gc); + ShowWarning("guild_read_castledb_libconfig_sub: Invalid OnGuildBreakEventName in \"%s\", entry #%d, skipping.\n", source, idx); + return false; + } + safestrncpy(gc->castle_event, name, sizeof(gc->castle_event)); + if (itemdb->lookup_const(it, "SiegeType", &i32) && (i32 >= SIEGE_TYPE_MAX || i32 < 0)) { + ShowWarning("guild_read_castledb_libconfig_sub: Invalid SiegeType in \"%s\", entry #%d, defaulting to SIEGE_TYPE_FE.\n", source, idx); + gc->siege_type = SIEGE_TYPE_FE; + } else { + gc->siege_type = i32; + } + + libconfig->setting_lookup_bool_real(it, "EnableClientWarp", &gc->enable_client_warp); + if (gc->enable_client_warp == true) { + struct config_setting_t *wd = libconfig->setting_get_member(it, "ClientWarp"); + guild->read_castledb_libconfig_sub_warp(wd, source, gc); + } + idb_put(guild->castle_db, gc->castle_id, gc); + return true; +} + +static bool guild_read_castledb_libconfig_sub_warp(struct config_setting_t *wd, const char *source, struct guild_castle *gc) +{ + nullpo_retr(false, wd); + nullpo_retr(false, gc); + nullpo_retr(false, source); + + int64 i64 = 0; + struct config_setting_t *it = libconfig->setting_get_member(wd, "Position"); + if (config_setting_is_list(it)) { + int m = map->mapindex2mapid(gc->mapindex); + + gc->client_warp.x = libconfig->setting_get_int_elem(it, 0); + gc->client_warp.y = libconfig->setting_get_int_elem(it, 1); + if (gc->client_warp.x < 0 || gc->client_warp.x >= map->list[m].xs || gc->client_warp.y < 0 || gc->client_warp.y >= map->list[m].ys) { + ShowWarning("guild_read_castledb_libconfig_sub_warp: Invalid Position in \"%s\", for castle (%d).\n", source, gc->castle_id); + return false; + } + } else { + ShowWarning("guild_read_castledb_libconfig_sub_warp: Invalid format for Position in \"%s\", for castle (%d).\n", source, gc->castle_id); + return false; + } + + if (libconfig->setting_lookup_int64(wd, "ZenyCost", &i64)) { + if (i64 > MAX_ZENY) { + ShowWarning("guild_read_castledb_libconfig_sub_warp: ZenyCost is too big in \"%s\", for castle (%d), capping to MAX_ZENY.\n", source, gc->castle_id); + } + gc->client_warp.zeny = cap_value((int)i64, 0, MAX_ZENY); + } + if (libconfig->setting_lookup_int64(wd, "ZenyCostSiegeTime", &i64)) { + if (i64 > MAX_ZENY) { + ShowWarning("guild_read_castledb_libconfig_sub_warp: ZenyCostSiegeTime is too big in \"%s\", for castle (%d), capping to MAX_ZENY.\n", source, gc->castle_id); + } + gc->client_warp.zeny_siege = cap_value((int)i64, 0, MAX_ZENY); + } return true; } /// lookup: guild id -> guild* -struct guild* guild_search(int guild_id) +static struct guild *guild_search(int guild_id) { return (struct guild*)idb_get(guild->db,guild_id); } /// lookup: guild name -> guild* -struct guild* guild_searchname(char* str) +static struct guild *guild_searchname(const char *str) { struct guild* g; struct DBIterator *iter = db_iterator(guild->db); @@ -192,13 +295,13 @@ struct guild* guild_searchname(char* str) } /// lookup: castle id -> castle* -struct guild_castle* guild_castle_search(int gcid) +static struct guild_castle *guild_castle_search(int gcid) { return (struct guild_castle*)idb_get(guild->castle_db,gcid); } /// lookup: map index -> castle* -struct guild_castle* guild_mapindex2gc(short map_index) +static struct guild_castle *guild_mapindex2gc(short map_index) { struct guild_castle* gc; struct DBIterator *iter = db_iterator(guild->castle_db); @@ -214,12 +317,12 @@ struct guild_castle* guild_mapindex2gc(short map_index) } /// lookup: map name -> castle* -struct guild_castle* guild_mapname2gc(const char* mapname) +static struct guild_castle *guild_mapname2gc(const char *mapname) { return guild->mapindex2gc(mapindex->name2id(mapname)); } -struct map_session_data* guild_getavailablesd(struct guild* g) +static struct map_session_data *guild_getavailablesd(struct guild *g) { int i; @@ -230,7 +333,7 @@ struct map_session_data* guild_getavailablesd(struct guild* g) } /// lookup: player AID/CID -> member index -int guild_getindex(const struct guild *g, int account_id, int char_id) +static int guild_getindex(const struct guild *g, int account_id, int char_id) { int i; @@ -245,7 +348,7 @@ int guild_getindex(const struct guild *g, int account_id, int char_id) } /// lookup: player sd -> member position -int guild_getposition(struct guild* g, struct map_session_data* sd) +static int guild_getposition(struct guild *g, struct map_session_data *sd) { int i; @@ -257,7 +360,7 @@ int guild_getposition(struct guild* g, struct map_session_data* sd) } //Creation of member information -void guild_makemember(struct guild_member *m,struct map_session_data *sd) +static void guild_makemember(struct guild_member *m, struct map_session_data *sd) { nullpo_retv(sd); nullpo_retv(m); @@ -268,13 +371,14 @@ void guild_makemember(struct guild_member *m,struct map_session_data *sd) m->hair = sd->status.hair; m->hair_color = sd->status.hair_color; m->gender = sd->status.sex; - m->class_ = sd->status.class_; + m->class = sd->status.class; m->lv = sd->status.base_level; //m->exp = 0; //m->exp_payper = 0; m->online = 1; m->position = MAX_GUILDPOSITION-1; memcpy(m->name,sd->status.name,NAME_LENGTH); + m->last_login = (uint32)time(NULL); // When player create or join a guild the date is updated return; } @@ -282,7 +386,7 @@ void guild_makemember(struct guild_member *m,struct map_session_data *sd) * Server cache to be flushed to inter the Guild EXP * @see DBApply */ -int guild_payexp_timer_sub(union DBKey key, struct DBData *data, va_list ap) +static int guild_payexp_timer_sub(union DBKey key, struct DBData *data, va_list ap) { int i; struct guild_expcache *c; @@ -310,7 +414,8 @@ int guild_payexp_timer_sub(union DBKey key, struct DBData *data, va_list ap) return 0; } -int guild_payexp_timer(int tid, int64 tick, int id, intptr_t data) { +static int guild_payexp_timer(int tid, int64 tick, int id, intptr_t data) +{ guild->expcache_db->clear(guild->expcache_db,guild->payexp_timer_sub); return 0; } @@ -319,7 +424,7 @@ int guild_payexp_timer(int tid, int64 tick, int id, intptr_t data) { * Taken from party_send_xy_timer_sub. [Skotlex] * @see DBApply */ -int guild_send_xy_timer_sub(union DBKey key, struct DBData *data, va_list ap) +static int guild_send_xy_timer_sub(union DBKey key, struct DBData *data, va_list ap) { struct guild *g = DB->data2ptr(data); int i; @@ -344,12 +449,13 @@ int guild_send_xy_timer_sub(union DBKey key, struct DBData *data, va_list ap) } //Code from party_send_xy_timer [Skotlex] -int guild_send_xy_timer(int tid, int64 tick, int id, intptr_t data) { +static int guild_send_xy_timer(int tid, int64 tick, int id, intptr_t data) +{ guild->db->foreach(guild->db,guild->send_xy_timer_sub,tick); return 0; } -int guild_send_dot_remove(struct map_session_data *sd) +static int guild_send_dot_remove(struct map_session_data *sd) { nullpo_ret(sd); if (sd->status.guild_id) @@ -358,13 +464,18 @@ int guild_send_dot_remove(struct map_session_data *sd) } //------------------------------------------------------------------------ -int guild_create(struct map_session_data *sd, const char *name) +static int guild_create(struct map_session_data *sd, const char *name) { char tname[NAME_LENGTH]; struct guild_member m; nullpo_ret(sd); nullpo_ret(name); + if (sd->clan != NULL) { + clif->messagecolor_self(sd->fd, COLOR_RED, "You cannot create a guild because you are in a clan."); + return 0; + } + safestrncpy(tname, name, NAME_LENGTH); trim(tname); @@ -387,7 +498,8 @@ int guild_create(struct map_session_data *sd, const char *name) } //Whether or not to create guild -int guild_created(int account_id,int guild_id) { +static int guild_created(int account_id, int guild_id) +{ struct map_session_data *sd=map->id2sd(account_id); if(sd==NULL) @@ -399,34 +511,35 @@ int guild_created(int account_id,int guild_id) { //struct guild *g; sd->status.guild_id=guild_id; clif->guild_created(sd,0); // Success - if(battle_config.guild_emperium_check) - pc->delitem(sd, pc->search_inventory(sd, ITEMID_EMPERIUM), 1, 0, DELITEM_NORMAL, LOG_TYPE_CONSUME); //emperium consumption + if (battle_config.guild_emperium_check) { + int n = pc->search_inventory(sd, ITEMID_EMPERIUM); + if (n != INDEX_NOT_FOUND) + pc->delitem(sd, n, 1, 0, DELITEM_NORMAL, LOG_TYPE_CONSUME); //emperium consumption + } return 0; } //Information request -int guild_request_info(int guild_id) +static int guild_request_info(int guild_id) { return intif->guild_request_info(guild_id); } //Information request with event -int guild_npc_request_info(int guild_id,const char *event) +static int guild_npc_request_info(int guild_id, const char *event) { - if( guild->search(guild_id) ) - { - if( event && *event ) + if (guild->search(guild_id) != NULL) { + if (event != NULL && *event != '\0') npc->event_do(event); return 0; } - if( event && *event ) - { + if (event != NULL && *event != '\0') { struct eventlist *ev; struct DBData prev; - ev=(struct eventlist *)aCalloc(sizeof(struct eventlist),1); - memcpy(ev->name,event,strlen(event)); + CREATE(ev, struct eventlist, 1); + safestrncpy(ev->name, event, sizeof(ev->name)); //The one in the db (if present) becomes the next event from this. if (guild->infoevent_db->put(guild->infoevent_db, DB->i2key(guild_id), DB->ptr2data(ev), &prev)) ev->next = DB->data2ptr(&prev); @@ -436,7 +549,7 @@ int guild_npc_request_info(int guild_id,const char *event) } //Confirmation of the character belongs to guild -int guild_check_member(const struct guild *g) +static int guild_check_member(const struct guild *g) { int i; struct map_session_data *sd; @@ -453,6 +566,7 @@ int guild_check_member(const struct guild *g) if (i == INDEX_NOT_FOUND) { sd->status.guild_id=0; sd->guild_emblem_id=0; + sd->guild = NULL; ShowWarning("guild: check_member %d[%s] is not member\n",sd->status.account_id,sd->status.name); } } @@ -462,15 +576,18 @@ int guild_check_member(const struct guild *g) } //Delete association with guild_id for all characters -int guild_recv_noinfo(int guild_id) +static int guild_recv_noinfo(int guild_id) { struct map_session_data *sd; struct s_mapiterator* iter; iter = mapit_getallusers(); for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) { - if( sd->status.guild_id == guild_id ) + if (sd->status.guild_id == guild_id) { sd->status.guild_id = 0; // erase guild + sd->guild_emblem_id = 0; + sd->guild = NULL; + } } mapit->free(iter); @@ -478,7 +595,7 @@ int guild_recv_noinfo(int guild_id) } //Get and display information for all member -int guild_recv_info(const struct guild *sg) +static int guild_recv_info(const struct guild *sg) { struct guild *g,before; int i,bm,m; @@ -542,10 +659,10 @@ int guild_recv_info(const struct guild *sg) before=*sg; //Perform the check on the user because the first load guild->check_member(sg); - if ((sd = map->nick2sd(sg->master)) != NULL) { + if ((sd = map->nick2sd(sg->master, false)) != NULL) { //If the guild master is online the first time the guild_info is received, //that means he was the first to join, so apply guild skill blocking here. - if( battle_config.guild_skill_relog_delay ) + if( battle_config.guild_skill_relog_delay == 1) guild->block_skill(sd, 300000); //Also set the guild master flag. @@ -627,7 +744,8 @@ int guild_recv_info(const struct guild *sg) /*============================================= * 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) { +static int guild_invite(struct map_session_data *sd, struct map_session_data *tsd) +{ struct guild *g; int i; @@ -681,7 +799,8 @@ int guild_invite(struct map_session_data *sd, struct map_session_data *tsd) { /// Guild invitation reply. /// flag: 0:rejected, 1:accepted -int guild_reply_invite(struct map_session_data* sd, int guild_id, int flag) { +static int guild_reply_invite(struct map_session_data *sd, int guild_id, int flag) +{ struct map_session_data* tsd; nullpo_ret(sd); @@ -707,7 +826,6 @@ int guild_reply_invite(struct map_session_data* sd, int guild_id, int flag) { } else {// accepted - struct guild_member m; struct guild* g; int i; @@ -727,8 +845,8 @@ int guild_reply_invite(struct map_session_data* sd, int guild_id, int flag) { return 0; } - guild->makemember(&m,sd); - intif->guild_addmember(guild_id, &m); + guild->makemember(&g->member[i], sd); + intif->guild_addmember(guild_id, &g->member[i]); //TODO: send a minimap update to this player } @@ -739,7 +857,7 @@ int guild_reply_invite(struct map_session_data* sd, int guild_id, int flag) { //- If guild is not in memory, it is requested //- Otherwise sd pointer is set up. //- Player must be authed and must belong to a guild before invoking this method -void guild_member_joined(struct map_session_data *sd) +static void guild_member_joined(struct map_session_data *sd) { struct guild* g; int i; @@ -753,12 +871,14 @@ void guild_member_joined(struct map_session_data *sd) // set the Guild Master flag sd->state.gmaster_flag = 1; // prevent Guild Skills from being used directly after relog - if( battle_config.guild_skill_relog_delay ) + if( battle_config.guild_skill_relog_delay == 1 ) guild->block_skill(sd, 300000); } i = guild->getindex(g, sd->status.account_id, sd->status.char_id); if (i == INDEX_NOT_FOUND) { sd->status.guild_id = 0; + sd->guild_emblem_id = 0; + sd->guild = NULL; } else { g->member[i].sd = sd; sd->guild = g; @@ -773,7 +893,8 @@ void guild_member_joined(struct map_session_data *sd) /*========================================== * Add a player to a given guild_id *----------------------------------------*/ -int guild_member_added(int guild_id,int account_id,int char_id,int flag) { +static int guild_member_added(int guild_id, int account_id, int char_id, int flag) +{ struct map_session_data *sd = map->id2sd(account_id),*sd2; struct guild *g; @@ -814,6 +935,11 @@ int guild_member_added(int guild_id,int account_id,int char_id,int flag) { //Next line commented because it do nothing, look at guild_recv_info [LuzZza] //clif->charnameupdate(sd); //Update display name [Skotlex] + // Makes the character join their respective guild's channel for #ally chat + if (channel->config->ally && channel->config->ally_autojoin) { + channel->join(g->channel, sd, "", true); + } + return 0; } @@ -821,7 +947,7 @@ int guild_member_added(int guild_id,int account_id,int char_id,int flag) { * Player request leaving a given guild_id * mes - non null terminated string *----------------------------------------*/ -int guild_leave(struct map_session_data* sd, int guild_id, int account_id, int char_id, const char* mes) +static int guild_leave(struct map_session_data *sd, int guild_id, int account_id, int char_id, const char *mes) { struct guild *g; @@ -850,7 +976,8 @@ int guild_leave(struct map_session_data* sd, int guild_id, int account_id, int c * Request remove a player to a given guild_id * mes - non null terminated string *----------------------------------------*/ -int guild_expulsion(struct map_session_data* sd, int guild_id, int account_id, int char_id, const char* mes) { +static int guild_expulsion(struct map_session_data *sd, int guild_id, int account_id, int char_id, const char *mes) +{ struct map_session_data *tsd; struct guild *g; int i,ps; @@ -885,7 +1012,7 @@ int guild_expulsion(struct map_session_data* sd, int guild_id, int account_id, i return 0; } -int guild_member_withdraw(int guild_id, int account_id, int char_id, int flag, const char* name, const char* mes) +static int guild_member_withdraw(int guild_id, int account_id, int char_id, int flag, const char *name, const char *mes) { int i; struct guild* g = guild->search(guild_id); @@ -909,9 +1036,9 @@ int guild_member_withdraw(int guild_id, int account_id, int char_id, int flag, c #endif if(!flag) - clif->guild_leave(online_member_sd, name, mes); + clif->guild_leave(online_member_sd, name, char_id, mes); else - clif->guild_expulsion(online_member_sd, name, mes, account_id); + clif->guild_expulsion(online_member_sd, name, char_id, mes, account_id); // remove member from guild memset(&g->member[i],0,sizeof(struct guild_member)); @@ -941,7 +1068,8 @@ int guild_member_withdraw(int guild_id, int account_id, int char_id, int flag, c return 0; } -void guild_retrieveitembound(int char_id,int aid,int guild_id) { +static void guild_retrieveitembound(int char_id, int aid, int guild_id) +{ #ifdef GP_BOUND_ITEMS struct map_session_data *sd = map->charid2sd(char_id); if (sd != NULL) { //Character is online @@ -963,8 +1091,9 @@ void guild_retrieveitembound(int char_id,int aid,int guild_id) { #endif } -int guild_send_memberinfoshort(struct map_session_data *sd,int online) -{ // cleaned up [LuzZza] +// cleaned up [LuzZza] +static int guild_send_memberinfoshort(struct map_session_data *sd, int online) +{ struct guild *g; nullpo_ret(sd); @@ -976,7 +1105,7 @@ int guild_send_memberinfoshort(struct map_session_data *sd,int online) return 0; intif->guild_memberinfoshort(g->guild_id, - sd->status.account_id,sd->status.char_id,online,sd->status.base_level,sd->status.class_); + sd->status.account_id,sd->status.char_id,online,sd->status.base_level,sd->status.class); if(!online){ int i = guild->getindex(g,sd->status.account_id,sd->status.char_id); @@ -995,8 +1124,9 @@ int guild_send_memberinfoshort(struct map_session_data *sd,int online) return 0; } -int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class_) -{ // cleaned up [LuzZza] +// cleaned up [LuzZza] +static int guild_recv_memberinfoshort(int guild_id, int account_id, int char_id, int online, int lv, int class, uint32 last_login) +{ int i, alv, c, idx = INDEX_NOT_FOUND, om = 0, oldonline = -1; struct guild *g = guild->search(guild_id); @@ -1010,7 +1140,8 @@ int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int onlin oldonline=m->online; m->online=online; m->lv=lv; - m->class_=class_; + m->class = class; + m->last_login = last_login; idx=i; } alv+=m->lv; @@ -1060,14 +1191,16 @@ int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int onlin /*==================================================== * Send a message to whole guild *---------------------------------------------------*/ -int guild_send_message(struct map_session_data *sd,const char *mes,int len) +static int guild_send_message(struct map_session_data *sd, const char *mes) { nullpo_ret(sd); - if(sd->status.guild_id==0) + if (sd->status.guild_id == 0 || sd->guild == NULL) return 0; - intif->guild_message(sd->status.guild_id,sd->status.account_id,mes,len); - guild->recv_message(sd->status.guild_id,sd->status.account_id,mes,len); + + int len = (int)strlen(mes); + + clif->guild_message(sd->guild, sd->status.account_id, mes, len); // Chat logging type 'G' / Guild Chat logs->chat(LOG_CHAT_GUILD, sd->status.guild_id, sd->status.char_id, sd->status.account_id, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y, NULL, mes); @@ -1076,21 +1209,9 @@ int guild_send_message(struct map_session_data *sd,const char *mes,int len) } /*==================================================== - * Guild receive a message, will be displayed to whole member - *---------------------------------------------------*/ -int guild_recv_message(int guild_id,int account_id,const char *mes,int len) -{ - struct guild *g; - if( (g=guild->search(guild_id))==NULL) - return 0; - clif->guild_message(g,account_id,mes,len); - return 0; -} - -/*==================================================== * Member changing position in guild *---------------------------------------------------*/ -int guild_change_memberposition(int guild_id,int account_id,int char_id,short idx) +static int guild_change_memberposition(int guild_id, int account_id, int char_id, short idx) { return intif->guild_change_memberinfo(guild_id,account_id,char_id,GMI_POSITION,&idx,sizeof(idx)); } @@ -1098,7 +1219,7 @@ int guild_change_memberposition(int guild_id,int account_id,int char_id,short id /*==================================================== * Notification of new position for member *---------------------------------------------------*/ -int guild_memberposition_changed(struct guild *g,int idx,int pos) +static int guild_memberposition_changed(struct guild *g, int idx, int pos) { nullpo_ret(g); Assert_ret(idx >= 0 && idx < MAX_GUILD); @@ -1108,14 +1229,14 @@ int guild_memberposition_changed(struct guild *g,int idx,int pos) // Update char position in client [LuzZza] if(g->member[idx].sd != NULL) - clif->charnameupdate(g->member[idx].sd); + clif->guild_position_selected(g->member[idx].sd); return 0; } /*==================================================== * Change guild title or member *---------------------------------------------------*/ -int guild_change_position(int guild_id,int idx,int mode,int exp_mode,const char *name) +static int guild_change_position(int guild_id, int idx, int mode, int exp_mode, const char *name) { struct guild_position p; nullpo_ret(name); @@ -1130,7 +1251,7 @@ int guild_change_position(int guild_id,int idx,int mode,int exp_mode,const char /*==================================================== * Notification of member has changed his guild title *---------------------------------------------------*/ -int guild_position_changed(int guild_id, int idx, const struct guild_position *p) +static int guild_position_changed(int guild_id, int idx, const struct guild_position *p) { struct guild *g=guild->search(guild_id); int i; @@ -1144,14 +1265,14 @@ int guild_position_changed(int guild_id, int idx, const struct guild_position *p // 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) - clif->charnameupdate(g->member[i].sd); + clif->guild_position_selected(g->member[i].sd); return 0; } /*==================================================== * Change guild notice *---------------------------------------------------*/ -int guild_change_notice(struct map_session_data *sd,int guild_id,const char *mes1,const char *mes2) +static int guild_change_notice(struct map_session_data *sd, int guild_id, const char *mes1, const char *mes2) { nullpo_ret(sd); @@ -1163,7 +1284,7 @@ int guild_change_notice(struct map_session_data *sd,int guild_id,const char *mes /*==================================================== * Notification of guild has changed his notice *---------------------------------------------------*/ -int guild_notice_changed(int guild_id,const char *mes1,const char *mes2) +static int guild_notice_changed(int guild_id, const char *mes1, const char *mes2) { int i; struct guild *g=guild->search(guild_id); @@ -1186,14 +1307,14 @@ int guild_notice_changed(int guild_id,const char *mes1,const char *mes2) /*==================================================== * Change guild emblem *---------------------------------------------------*/ -int guild_change_emblem(struct map_session_data *sd,int len,const char *data) +static int guild_change_emblem(struct map_session_data *sd, int len, const char *data) { struct guild *g; nullpo_ret(sd); if (battle_config.require_glory_guild && !((g = sd->guild) && guild->checkskill(g, GD_GLORYGUILD)>0)) { - clif->skill_fail(sd,GD_GLORYGUILD,USESKILL_FAIL_LEVEL,0); + clif->skill_fail(sd, GD_GLORYGUILD, USESKILL_FAIL_LEVEL, 0, 0); return 0; } @@ -1203,7 +1324,7 @@ int guild_change_emblem(struct map_session_data *sd,int len,const char *data) /*==================================================== * Notification of guild emblem changed *---------------------------------------------------*/ -int guild_emblem_changed(int len,int guild_id,int emblem_id,const char *data) +static int guild_emblem_changed(int len, int guild_id, int emblem_id, const char *data) { int i; struct map_session_data *sd; @@ -1263,7 +1384,7 @@ int guild_emblem_changed(int len,int guild_id,int emblem_id,const char *data) /** * @see DBCreateData */ -struct DBData create_expcache(union DBKey key, va_list args) +static struct DBData create_expcache(union DBKey key, va_list args) { struct guild_expcache *c; struct map_session_data *sd = va_arg(args, struct map_session_data*); @@ -1280,7 +1401,8 @@ struct DBData create_expcache(union DBKey key, va_list args) /*==================================================== * Return taxed experience from player sd to guild *---------------------------------------------------*/ -unsigned int guild_payexp(struct map_session_data *sd,unsigned int exp) { +static uint64 guild_payexp(struct map_session_data *sd, uint64 exp) +{ struct guild *g; struct guild_expcache *c; int per; @@ -1313,7 +1435,7 @@ unsigned int guild_payexp(struct map_session_data *sd,unsigned int exp) { * Add this experience to guild exp * [Celest] *---------------------------------------------------*/ -int guild_getexp(struct map_session_data *sd,int exp) +static int guild_getexp(struct map_session_data *sd, int exp) { struct guild_expcache *c; nullpo_ret(sd); @@ -1332,7 +1454,7 @@ int guild_getexp(struct map_session_data *sd,int exp) /*==================================================== * Ask to increase guildskill skill_id *---------------------------------------------------*/ -int guild_skillup(struct map_session_data *sd, uint16 skill_id) +static int guild_skillup(struct map_session_data *sd, uint16 skill_id) { struct guild* g; int idx = skill_id - GD_SKILLBASE; @@ -1356,7 +1478,8 @@ int guild_skillup(struct map_session_data *sd, uint16 skill_id) /*==================================================== * Notification of guildskill skill_id increase request *---------------------------------------------------*/ -int guild_skillupack(int guild_id,uint16 skill_id,int account_id) { +static int guild_skillupack(int guild_id, uint16 skill_id, int account_id) +{ struct map_session_data *sd=map->id2sd(account_id); struct guild *g=guild->search(guild_id); int i; @@ -1385,7 +1508,8 @@ int guild_skillupack(int guild_id,uint16 skill_id,int account_id) { return 0; } -void guild_guildaura_refresh(struct map_session_data *sd, uint16 skill_id, uint16 skill_lv) { +static void guild_guildaura_refresh(struct map_session_data *sd, uint16 skill_id, uint16 skill_lv) +{ struct skill_unit_group* group = NULL; int type = status->skill2sc(skill_id); nullpo_retv(sd); @@ -1411,7 +1535,7 @@ void guild_guildaura_refresh(struct map_session_data *sd, uint16 skill_id, uint1 * 0 = allied * 1 = enemy *---------------------------------------------------*/ -int guild_get_alliance_count(struct guild *g,int flag) +static int guild_get_alliance_count(struct guild *g, int flag) { int i,c; @@ -1425,7 +1549,7 @@ int guild_get_alliance_count(struct guild *g,int flag) } // Blocks all guild skills which have a common delay time. -void guild_block_skill(struct map_session_data *sd, int time) +static void guild_block_skill(struct map_session_data *sd, int time) { uint16 skill_id[] = { GD_BATTLEORDER, GD_REGENERATION, GD_RESTORE, GD_EMERGENCYCALL }; int i; @@ -1440,7 +1564,7 @@ void guild_block_skill(struct map_session_data *sd, int time) * 1 = enemy * Returns true if yes. *---------------------------------------------------*/ -int guild_check_alliance(int guild_id1, int guild_id2, int flag) +static int guild_check_alliance(int guild_id1, int guild_id2, int flag) { struct guild *g; int i; @@ -1456,7 +1580,8 @@ int guild_check_alliance(int guild_id1, int guild_id2, int flag) /*==================================================== * Player sd, asking player tsd an alliance between their 2 guilds *---------------------------------------------------*/ -int guild_reqalliance(struct map_session_data *sd,struct map_session_data *tsd) { +static int guild_reqalliance(struct map_session_data *sd, struct map_session_data *tsd) +{ struct guild *g[2]; int i; @@ -1512,7 +1637,8 @@ int guild_reqalliance(struct map_session_data *sd,struct map_session_data *tsd) /*==================================================== * Player sd, answer to player tsd (account_id) for an alliance request *---------------------------------------------------*/ -int guild_reply_reqalliance(struct map_session_data *sd,int account_id,int flag) { +static int guild_reply_reqalliance(struct map_session_data *sd, int account_id, int flag) +{ struct map_session_data *tsd; nullpo_ret(sd); @@ -1572,7 +1698,8 @@ int guild_reply_reqalliance(struct map_session_data *sd,int account_id,int flag) /*==================================================== * Player sd asking to break alliance with guild guild_id *---------------------------------------------------*/ -int guild_delalliance(struct map_session_data *sd,int guild_id,int flag) { +static int guild_delalliance(struct map_session_data *sd, int guild_id, int flag) +{ nullpo_ret(sd); if(map->agit_flag || map->agit2_flag) { @@ -1588,7 +1715,7 @@ int guild_delalliance(struct map_session_data *sd,int guild_id,int flag) { /*==================================================== * Player sd, asking player tsd a formal enemy relation between their 2 guilds *---------------------------------------------------*/ -int guild_opposition(struct map_session_data *sd,struct map_session_data *tsd) +static int guild_opposition(struct map_session_data *sd, struct map_session_data *tsd) { struct guild *g; int i; @@ -1631,7 +1758,8 @@ int guild_opposition(struct map_session_data *sd,struct map_session_data *tsd) /*==================================================== * Notification of a relationship between 2 guilds *---------------------------------------------------*/ -int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id2,int flag,const char *name1,const char *name2) { +static int guild_allianceack(int guild_id1, int guild_id2, int account_id1, int account_id2, int flag, const char *name1, const char *name2) +{ struct guild *g[2] = { NULL }; int guild_id[2] = { 0 }; const char *guild_name[2] = { NULL }; @@ -1721,7 +1849,7 @@ int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id * Notification for the guild disbanded * @see DBApply */ -int guild_broken_sub(union DBKey key, struct DBData *data, va_list ap) +static int guild_broken_sub(union DBKey key, struct DBData *data, va_list ap) { struct guild *g = DB->data2ptr(data); int guild_id=va_arg(ap,int); @@ -1747,7 +1875,7 @@ int guild_broken_sub(union DBKey key, struct DBData *data, va_list ap) * Invoked on Castles when a guild is broken. [Skotlex] * @see DBApply */ -int castle_guild_broken_sub(union DBKey key, struct DBData *data, va_list ap) +static int castle_guild_broken_sub(union DBKey key, struct DBData *data, va_list ap) { struct guild_castle *gc = DB->data2ptr(data); int guild_id = va_arg(ap, int); @@ -1768,7 +1896,7 @@ int castle_guild_broken_sub(union DBKey key, struct DBData *data, va_list ap) } //Invoked on /breakguild "Guild name" -int guild_broken(int guild_id,int flag) +static int guild_broken(int guild_id, int flag) { struct guild *g = guild->search(guild_id); struct map_session_data *sd = NULL; @@ -1812,28 +1940,33 @@ int guild_broken(int guild_id,int flag) } //Changes the Guild Master to the specified player. [Skotlex] -int guild_gm_change(int guild_id, struct map_session_data *sd) +static int guild_gm_change(int guild_id, int char_id) { - struct guild *g; - nullpo_ret(sd); + struct guild *g = guild->search(guild_id); + char *name; + int i; - if (sd->status.guild_id != guild_id) - return 0; + nullpo_ret(g); - g=guild->search(guild_id); + ARR_FIND(0, MAX_GUILD, i, g->member[i].char_id == char_id); - nullpo_ret(g); + if (i == MAX_GUILD ) { + // Not part of the guild + return 0; + } + + name = g->member[i].name; - if (strcmp(g->master, sd->status.name) == 0) //Nothing to change. + if (strcmp(g->master, name) == 0) //Nothing to change. return 0; //Notify servers that master has changed. - intif->guild_change_gm(guild_id, sd->status.name, strlen(sd->status.name)+1); + intif->guild_change_gm(guild_id, name, (int)strlen(name) + 1); return 1; } //Notification from Char server that a guild's master has changed. [Skotlex] -int guild_gm_changed(int guild_id, int account_id, int char_id) +static int guild_gm_changed(int guild_id, int account_id, int char_id) { struct guild *g; struct guild_member gm; @@ -1862,6 +1995,7 @@ int guild_gm_changed(int guild_id, int account_id, int char_id) if (g->member[pos].sd && g->member[pos].sd->fd) { 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; + clif->blname_ack(0, &g->member[pos].sd->bl); } if (g->member[0].sd && g->member[0].sd->fd) { @@ -1869,6 +2003,7 @@ int guild_gm_changed(int guild_id, int account_id, int char_id) g->member[0].sd->state.gmaster_flag = 1; //Block his skills for 5 minutes to prevent abuse. guild->block_skill(g->member[0].sd, 300000); + clif->blname_ack(0, &g->member[pos].sd->bl); } // announce the change to all guild members @@ -1878,6 +2013,7 @@ int guild_gm_changed(int guild_id, int account_id, int char_id) { clif->guild_basicinfo(g->member[i].sd); clif->guild_memberlist(g->member[i].sd); + clif->guild_belonginfo(g->member[i].sd, g); // Update clientside guildmaster flag } } @@ -1887,7 +2023,7 @@ int guild_gm_changed(int guild_id, int account_id, int char_id) /*==================================================== * Guild disbanded *---------------------------------------------------*/ -int guild_break(struct map_session_data *sd, const char *name) +static int guild_break(struct map_session_data *sd, const char *name) { struct guild *g; struct unit_data *ud; @@ -1949,7 +2085,7 @@ int guild_break(struct map_session_data *sd, const char *name) * Creates a list of guild castle IDs to be requested * from char-server. */ -void guild_castle_map_init(void) +static void guild_castle_map_init(void) { int num = db_size(guild->castle_db); @@ -1979,7 +2115,7 @@ void guild_castle_map_init(void) * @param index Type of data to change * @param value New value */ -int guild_castledatasave(int castle_id, int index, int value) +static int guild_castledatasave(int castle_id, int index, int value) { struct guild_castle *gc = guild->castle_search(castle_id); @@ -2040,7 +2176,7 @@ int guild_castledatasave(int castle_id, int index, int value) return 0; } -void guild_castle_reconnect_sub(void *key, void *data, va_list ap) +static void guild_castle_reconnect_sub(void *key, void *data, va_list ap) { int castle_id = GetWord((int)h64BPTRSIZE(key), 0); int index = GetWord((int)h64BPTRSIZE(key), 1); @@ -2053,7 +2189,7 @@ void guild_castle_reconnect_sub(void *key, void *data, va_list ap) * disconnected. * On reconnect pushes all changes to char-server for saving. */ -void guild_castle_reconnect(int castle_id, int index, int value) +static void guild_castle_reconnect(int castle_id, int index, int value) { static struct linkdb_node *gc_save_pending = NULL; @@ -2069,7 +2205,7 @@ void guild_castle_reconnect(int castle_id, int index, int value) } // Load castle data then invoke OnAgitInit* on last -int guild_castledataloadack(int len, const struct guild_castle *gc) +static int guild_castledataloadack(int len, const struct guild_castle *gc) { int i; int n = (len-4) / sizeof(struct guild_castle); @@ -2112,7 +2248,7 @@ int guild_castledataloadack(int len, const struct guild_castle *gc) /*==================================================== * Start normal woe and triggers all npc OnAgitStart *---------------------------------------------------*/ -void guild_agit_start(void) +static void guild_agit_start(void) { // Run All NPC_Event[OnAgitStart] int c = npc->event_doall("OnAgitStart"); @@ -2122,7 +2258,7 @@ void guild_agit_start(void) /*==================================================== * End normal woe and triggers all npc OnAgitEnd *---------------------------------------------------*/ -void guild_agit_end(void) +static void guild_agit_end(void) { // Run All NPC_Event[OnAgitEnd] int c = npc->event_doall("OnAgitEnd"); @@ -2132,7 +2268,7 @@ void guild_agit_end(void) /*==================================================== * Start woe2 and triggers all npc OnAgitStart2 *---------------------------------------------------*/ -void guild_agit2_start(void) +static void guild_agit2_start(void) { // Run All NPC_Event[OnAgitStart2] int c = npc->event_doall("OnAgitStart2"); @@ -2142,7 +2278,7 @@ void guild_agit2_start(void) /*==================================================== * End woe2 and triggers all npc OnAgitEnd2 *---------------------------------------------------*/ -void guild_agit2_end(void) +static void guild_agit2_end(void) { // Run All NPC_Event[OnAgitEnd2] int c = npc->event_doall("OnAgitEnd2"); @@ -2150,7 +2286,7 @@ void guild_agit2_end(void) } // How many castles does this guild have? -int guild_checkcastles(struct guild *g) +static int guild_checkcastles(struct guild *g) { int nb_cas = 0; struct guild_castle* gc = NULL; @@ -2166,7 +2302,7 @@ int guild_checkcastles(struct guild *g) } // Are these two guilds allied? -bool guild_isallied(int guild_id, int guild_id2) +static bool guild_isallied(int guild_id, int guild_id2) { int i; struct guild* g = guild->search(guild_id); @@ -2176,7 +2312,8 @@ bool guild_isallied(int guild_id, int guild_id2) return( i < MAX_GUILDALLIANCE && g->alliance[i].opposition == 0 ); } -void guild_flag_add(struct npc_data *nd) { +static void guild_flag_add(struct npc_data *nd) +{ int i; nullpo_retv(nd); @@ -2194,7 +2331,8 @@ void guild_flag_add(struct npc_data *nd) { guild->flags[i] = nd; } -void guild_flag_remove(struct npc_data *nd) { +static void guild_flag_remove(struct npc_data *nd) +{ int i, cursor; nullpo_retv(nd); if( guild->flags_count == 0 ) @@ -2223,7 +2361,7 @@ void guild_flag_remove(struct npc_data *nd) { /** * @see DBApply */ -int eventlist_db_final(union DBKey key, struct DBData *data, va_list ap) +static int eventlist_db_final(union DBKey key, struct DBData *data, va_list ap) { struct eventlist *next = NULL; struct eventlist *current = DB->data2ptr(data); @@ -2238,7 +2376,7 @@ int eventlist_db_final(union DBKey key, struct DBData *data, va_list ap) /** * @see DBApply */ -int guild_expcache_db_final(union DBKey key, struct DBData *data, va_list ap) +static int guild_expcache_db_final(union DBKey key, struct DBData *data, va_list ap) { ers_free(guild->expcache_ers, DB->data2ptr(data)); return 0; @@ -2247,7 +2385,7 @@ int guild_expcache_db_final(union DBKey key, struct DBData *data, va_list ap) /** * @see DBApply */ -int guild_castle_db_final(union DBKey key, struct DBData *data, va_list ap) +static int guild_castle_db_final(union DBKey key, struct DBData *data, va_list ap) { struct guild_castle* gc = DB->data2ptr(data); if( gc->temp_guardians ) @@ -2257,7 +2395,8 @@ int guild_castle_db_final(union DBKey key, struct DBData *data, va_list ap) } /* called when scripts are reloaded/unloaded */ -void guild_flags_clear(void) { +static void guild_flags_clear(void) +{ int i; for( i = 0; i < guild->flags_count; i++ ) { if( guild->flags[i] ) @@ -2267,7 +2406,8 @@ void guild_flags_clear(void) { guild->flags_count = 0; } -void do_init_guild(bool minimal) { +static void do_init_guild(bool minimal) +{ if (minimal) return; @@ -2277,8 +2417,7 @@ void do_init_guild(bool minimal) { 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); - + guild->read_castledb_libconfig(); 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] timer->add_func_list(guild->payexp_timer,"guild_payexp_timer"); @@ -2287,7 +2426,7 @@ void do_init_guild(bool minimal) { timer->add_interval(timer->gettick()+GUILD_SEND_XY_INVERVAL,guild->send_xy_timer,0,0,GUILD_SEND_XY_INVERVAL); } -void do_final_guild(void) +static void do_final_guild(void) { struct DBIterator *iter = db_iterator(guild->db); struct guild *g; @@ -2313,7 +2452,9 @@ void do_final_guild(void) if( guild->flags ) aFree(guild->flags); } -void guild_defaults(void) { + +void guild_defaults(void) +{ guild = &guild_s; guild->init = do_init_guild; @@ -2384,7 +2525,6 @@ void guild_defaults(void) { guild->change_emblem = guild_change_emblem; guild->emblem_changed = guild_emblem_changed; guild->send_message = guild_send_message; - guild->recv_message = guild_recv_message; guild->send_dot_remove = guild_send_dot_remove; guild->skillupack = guild_skillupack; guild->dobreak = guild_break; @@ -2411,7 +2551,9 @@ void guild_defaults(void) { guild->payexp_timer = guild_payexp_timer; guild->sd_check = guild_sd_check; guild->read_guildskill_tree_db = guild_read_guildskill_tree_db; - guild->read_castledb = guild_read_castledb; + guild->read_castledb_libconfig = guild_read_castledb_libconfig; + guild->read_castledb_libconfig_sub = guild_read_castledb_libconfig_sub; + guild->read_castledb_libconfig_sub_warp = guild_read_castledb_libconfig_sub_warp; guild->payexp_timer_sub = guild_payexp_timer_sub; guild->send_xy_timer_sub = guild_send_xy_timer_sub; guild->send_xy_timer = guild_send_xy_timer; |