From adffa9ac73a5429b6ab3cfa3b80f283b8d4459b4 Mon Sep 17 00:00:00 2001 From: shennetsind Date: Sat, 17 Mar 2012 21:29:56 +0000 Subject: Fixed bugreport:5458 server crashing when a character with guild-exp-tax kills a monster. dev note: Gepard I tried to reach you but you weren't available, so I've done my own fix although my lack of familiarity with your new system, make yourself comfortable to modify as you wish. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@15701 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/guild.c | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/map/guild.c b/src/map/guild.c index 528560ee8..66ba01369 100644 --- a/src/map/guild.c +++ b/src/map/guild.c @@ -49,7 +49,6 @@ struct guild_expcache { int guild_id, account_id, char_id; uint64 exp; }; -static struct eri *expcache_ers; //For handling of guild exp payment. #define MAX_GUILD_SKILL_REQUIRE 5 struct{ @@ -298,7 +297,7 @@ int guild_payexp_timer_sub(DBKey key, DBData *data, va_list ap) (g = guild_search(c->guild_id)) == NULL || (i = guild_getindex(g, c->account_id, c->char_id)) < 0 ) { - ers_free(expcache_ers, data); + db_remove(guild_expcache_db, db_i2key(c->char_id)); return 0; } @@ -311,7 +310,7 @@ int guild_payexp_timer_sub(DBKey key, DBData *data, va_list ap) GMI_EXP,&g->member[i].exp,sizeof(g->member[i].exp)); c->exp=0; - ers_free(expcache_ers, data); + db_remove(guild_expcache_db, db_i2key(c->char_id)); return 0; } @@ -1134,16 +1133,17 @@ int guild_emblem_changed(int len,int guild_id,int emblem_id,const char *data) /** * @see DBCreateData */ -static DBData create_expcache(DBKey key, va_list args) -{ +static DBData create_expcache(DBKey key, va_list args) { struct guild_expcache *c; struct map_session_data *sd = va_arg(args, struct map_session_data*); - c = ers_alloc(expcache_ers, struct guild_expcache); + CREATE(c, struct guild_expcache, 1); + c->guild_id = sd->status.guild_id; c->account_id = sd->status.account_id; c->char_id = sd->status.char_id; c->exp = 0; + return db_ptr2data(c); } @@ -1189,6 +1189,7 @@ int guild_getexp(struct map_session_data *sd,int exp) return 0; c = db_data2ptr(guild_expcache_db->ensure(guild_expcache_db, db_i2key(sd->status.char_id), create_expcache, sd)); + if (c->exp > UINT64_MAX - exp) c->exp = UINT64_MAX; else @@ -1934,15 +1935,6 @@ static int eventlist_db_final(DBKey key, DBData *data, va_list ap) return 0; } -/** - * @see DBApply - */ -static int guild_expcache_db_final(DBKey key, DBData *data, va_list ap) -{ - ers_free(expcache_ers, db_data2ptr(data)); - return 0; -} - /** * @see DBApply */ @@ -1959,9 +1951,8 @@ void do_init_guild(void) { guild_db=idb_alloc(DB_OPT_RELEASE_DATA); castle_db=idb_alloc(DB_OPT_BASE); - guild_expcache_db=idb_alloc(DB_OPT_BASE); + guild_expcache_db=idb_alloc(DB_OPT_RELEASE_DATA); guild_infoevent_db=idb_alloc(DB_OPT_BASE); - expcache_ers = ers_new(sizeof(struct guild_expcache)); sv_readdb(db_path, "castle_db.txt", ',', 4, 5, -1, &guild_read_castledb); @@ -1974,11 +1965,8 @@ void do_init_guild(void) add_timer_interval(gettick()+GUILD_SEND_XY_INVERVAL,guild_send_xy_timer,0,0,GUILD_SEND_XY_INVERVAL); } -void do_final_guild(void) -{ +void do_final_guild(void) { db_destroy(guild_db); castle_db->destroy(castle_db,guild_castle_db_final); - guild_expcache_db->destroy(guild_expcache_db,guild_expcache_db_final); guild_infoevent_db->destroy(guild_infoevent_db,eventlist_db_final); - ers_destroy(expcache_ers); } -- cgit v1.2.3-70-g09d2