summaryrefslogtreecommitdiff
path: root/src/map/battleground.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/battleground.c')
-rw-r--r--src/map/battleground.c149
1 files changed, 88 insertions, 61 deletions
diff --git a/src/map/battleground.c b/src/map/battleground.c
index e7fe4085b..65f475124 100644
--- a/src/map/battleground.c
+++ b/src/map/battleground.c
@@ -42,12 +42,12 @@ struct map_session_data* bg_getavailablesd(struct battleground_data *bgd) {
}
/// Deletes BG Team from db
-int bg_team_delete(int bg_id) {
+bool bg_team_delete(int bg_id) {
int i;
struct map_session_data *sd;
struct battleground_data *bgd = bg->team_search(bg_id);
- if( bgd == NULL ) return 0;
+ if( bgd == NULL ) return false;
for( i = 0; i < MAX_BG_MEMBERS; i++ ) {
if( (sd = bgd->members[i].sd) == NULL )
continue;
@@ -56,35 +56,34 @@ int bg_team_delete(int bg_id) {
sd->bg_id = 0;
}
idb_remove(bg->team_db, bg_id);
- return 1;
+ return true;
}
/// Warps a Team
-int bg_team_warp(int bg_id, unsigned short mapindex, short x, short y) {
+bool bg_team_warp(int bg_id, unsigned short map_index, short x, short y) {
int i;
struct battleground_data *bgd = bg->team_search(bg_id);
- if( bgd == NULL ) return 0;
+ if( bgd == NULL ) return false;
for( i = 0; i < MAX_BG_MEMBERS; i++ )
- if( bgd->members[i].sd != NULL ) pc->setpos(bgd->members[i].sd, mapindex, x, y, CLR_TELEPORT);
- return 1;
+ if( bgd->members[i].sd != NULL ) pc->setpos(bgd->members[i].sd, map_index, x, y, CLR_TELEPORT);
+ return true;
}
-int bg_send_dot_remove(struct map_session_data *sd) {
+void bg_send_dot_remove(struct map_session_data *sd) {
if( sd && sd->bg_id )
clif->bg_xy_remove(sd);
- return 0;
}
/// Player joins team
-int bg_team_join(int bg_id, struct map_session_data *sd) {
+bool bg_team_join(int bg_id, struct map_session_data *sd) {
int i;
struct battleground_data *bgd = bg->team_search(bg_id);
struct map_session_data *pl_sd;
- if( bgd == NULL || sd == NULL || sd->bg_id ) return 0;
+ if( bgd == NULL || sd == NULL || sd->bg_id ) return false;
ARR_FIND(0, MAX_BG_MEMBERS, i, bgd->members[i].sd == NULL);
- if( i == MAX_BG_MEMBERS ) return 0; // No free slots
+ if( i == MAX_BG_MEMBERS ) return false; // No free slots
sd->bg_id = bg_id;
bgd->members[i].sd = sd;
@@ -110,7 +109,7 @@ int bg_team_join(int bg_id, struct map_session_data *sd) {
clif->bg_hp(sd);
clif->bg_xy(sd);
- return 1;
+ return true;
}
/// Single Player leaves team
@@ -156,26 +155,26 @@ int bg_team_leave(struct map_session_data *sd, int flag) {
}
/// Respawn after killed
-int bg_member_respawn(struct map_session_data *sd) {
+bool bg_member_respawn(struct map_session_data *sd) {
struct battleground_data *bgd;
if( sd == NULL || !pc_isdead(sd) || !sd->bg_id || (bgd = bg->team_search(sd->bg_id)) == NULL )
- return 0;
+ return false;
if( bgd->mapindex == 0 )
- return 0; // Respawn not handled by Core
+ return false; // Respawn not handled by Core
pc->setpos(sd, bgd->mapindex, bgd->x, bgd->y, CLR_OUTSIGHT);
status->revive(&sd->bl, 1, 100);
- return 1; // Warped
+ return true; // Warped
}
-int bg_create(unsigned short mapindex, short rx, short ry, const char *ev, const char *dev) {
+int bg_create(unsigned short map_index, short rx, short ry, const char *ev, const char *dev) {
struct battleground_data *bgd;
bg->team_counter++;
CREATE(bgd, struct battleground_data, 1);
bgd->bg_id = bg->team_counter;
bgd->count = 0;
- bgd->mapindex = mapindex;
+ bgd->mapindex = map_index;
bgd->x = rx;
bgd->y = ry;
safestrncpy(bgd->logout_event, ev, sizeof(bgd->logout_event));
@@ -219,14 +218,14 @@ int bg_team_get_id(struct block_list *bl) {
return 0;
}
-int bg_send_message(struct map_session_data *sd, const char *mes, int len) {
+bool bg_send_message(struct map_session_data *sd, const char *mes, int len) {
struct battleground_data *bgd;
nullpo_ret(sd);
if( sd->bg_id == 0 || (bgd = bg->team_search(sd->bg_id)) == NULL )
- return 0;
+ return false; // Couldn't send message
clif->bg_message(bgd, sd->bl.id, sd->status.name, mes, len);
- return 0;
+ return true;
}
/**
@@ -249,7 +248,7 @@ int bg_send_xy_timer_sub(DBKey key, DBData *data, va_list ap) {
return 0;
}
-int bg_send_xy_timer(int tid, unsigned int tick, int id, intptr_t data) {
+int bg_send_xy_timer(int tid, int64 tick, int id, intptr_t data) {
bg->team_db->foreach(bg->team_db, bg->send_xy_timer_sub, tick);
return 0;
}
@@ -258,34 +257,34 @@ void bg_config_read(void) {
config_setting_t *data = NULL;
const char *config_filename = "conf/battlegrounds.conf"; // FIXME hardcoded name
- if (conf_read_file(&bg_conf, config_filename))
+ if (libconfig->read_file(&bg_conf, config_filename))
return;
- data = config_lookup(&bg_conf, "battlegrounds");
+ data = libconfig->lookup(&bg_conf, "battlegrounds");
if (data != NULL) {
- config_setting_t *settings = config_setting_get_elem(data, 0);
+ config_setting_t *settings = libconfig->setting_get_elem(data, 0);
config_setting_t *arenas;
const char *delay_var;
int i, arena_count = 0, offline = 0;
- if( !config_setting_lookup_string(settings, "global_delay_var", &delay_var) )
+ if( !libconfig->setting_lookup_string(settings, "global_delay_var", &delay_var) )
delay_var = "BG_Delay_Tick";
safestrncpy(bg->gdelay_var, delay_var, BG_DELAY_VAR_LENGTH);
- config_setting_lookup_int(settings, "maximum_afk_seconds", &bg->mafksec);
+ libconfig->setting_lookup_int(settings, "maximum_afk_seconds", &bg->mafksec);
- config_setting_lookup_bool(settings, "feature_off", &offline);
+ libconfig->setting_lookup_bool(settings, "feature_off", &offline);
if( offline == 0 )
bg->queue_on = true;
- if( (arenas = config_setting_get_member(settings, "arenas")) != NULL ) {
- arena_count = config_setting_length(arenas);
+ if( (arenas = libconfig->setting_get_member(settings, "arenas")) != NULL ) {
+ arena_count = libconfig->setting_length(arenas);
CREATE( bg->arena, struct bg_arena *, arena_count );
for(i = 0; i < arena_count; i++) {
- config_setting_t *arena = config_setting_get_elem(arenas, i);
+ config_setting_t *arena = libconfig->setting_get_elem(arenas, i);
config_setting_t *reward;
const char *aName, *aEvent, *aDelayVar;
int minLevel = 0, maxLevel = 0;
@@ -296,18 +295,18 @@ void bg_config_read(void) {
bg->arena[i] = NULL;
- if( !config_setting_lookup_string(arena, "name", &aName) ) {
+ if( !libconfig->setting_lookup_string(arena, "name", &aName) ) {
ShowError("bg_config_read: failed to find 'name' for arena #%d\n",i);
continue;
}
- if( !config_setting_lookup_string(arena, "event", &aEvent) ) {
+ if( !libconfig->setting_lookup_string(arena, "event", &aEvent) ) {
ShowError("bg_config_read: failed to find 'event' for arena #%d\n",i);
continue;
}
- config_setting_lookup_int(arena, "minLevel", &minLevel);
- config_setting_lookup_int(arena, "maxLevel", &maxLevel);
+ libconfig->setting_lookup_int(arena, "minLevel", &minLevel);
+ libconfig->setting_lookup_int(arena, "maxLevel", &maxLevel);
if( minLevel < 0 ) {
ShowWarning("bg_config_read: invalid %d value for arena '%s' minLevel\n",minLevel,aName);
@@ -318,14 +317,14 @@ void bg_config_read(void) {
maxLevel = MAX_LEVEL;
}
- if( !(reward = config_setting_get_member(arena, "reward")) ) {
+ if( !(reward = libconfig->setting_get_member(arena, "reward")) ) {
ShowError("bg_config_read: failed to find 'reward' for arena '%s'/#%d\n",aName,i);
continue;
}
- config_setting_lookup_int(reward, "win", &prizeWin);
- config_setting_lookup_int(reward, "loss", &prizeLoss);
- config_setting_lookup_int(reward, "draw", &prizeDraw);
+ libconfig->setting_lookup_int(reward, "win", &prizeWin);
+ libconfig->setting_lookup_int(reward, "loss", &prizeLoss);
+ libconfig->setting_lookup_int(reward, "draw", &prizeDraw);
if( prizeWin < 0 ) {
ShowWarning("bg_config_read: invalid %d value for arena '%s' reward:win\n",prizeWin,aName);
@@ -340,9 +339,9 @@ void bg_config_read(void) {
prizeDraw = 0;
}
- config_setting_lookup_int(arena, "minPlayers", &minPlayers);
- config_setting_lookup_int(arena, "maxPlayers", &maxPlayers);
- config_setting_lookup_int(arena, "minTeamPlayers", &minTeamPlayers);
+ libconfig->setting_lookup_int(arena, "minPlayers", &minPlayers);
+ libconfig->setting_lookup_int(arena, "maxPlayers", &maxPlayers);
+ libconfig->setting_lookup_int(arena, "minTeamPlayers", &minTeamPlayers);
if( minPlayers < 0 ) {
ShowWarning("bg_config_read: invalid %d value for arena '%s' minPlayers\n",minPlayers,aName);
@@ -357,20 +356,20 @@ void bg_config_read(void) {
minTeamPlayers = 0;
}
- if( !config_setting_lookup_string(arena, "delay_var", &aDelayVar) ) {
+ if( !libconfig->setting_lookup_string(arena, "delay_var", &aDelayVar) ) {
ShowError("bg_config_read: failed to find 'delay_var' for arena '%s'/#%d\n",aName,i);
continue;
}
- config_setting_lookup_int(arena, "maxDuration", &maxDuration);
+ libconfig->setting_lookup_int(arena, "maxDuration", &maxDuration);
if( maxDuration < 0 ) {
ShowWarning("bg_config_read: invalid %d value for arena '%s' maxDuration\n",maxDuration,aName);
maxDuration = 30;
}
- config_setting_lookup_int(arena, "fillDuration", &fillup_duration);
- config_setting_lookup_int(arena, "pGameDuration", &pregame_duration);
+ libconfig->setting_lookup_int(arena, "fillDuration", &fillup_duration);
+ libconfig->setting_lookup_int(arena, "pGameDuration", &pregame_duration);
if( fillup_duration < 20 ) {
ShowWarning("bg_config_read: invalid %d value for arena '%s' fillDuration, minimum has to be 20, defaulting to 20.\n",fillup_duration,aName);
@@ -409,7 +408,7 @@ void bg_config_read(void) {
bg->arenas = arena_count;
}
- config_destroy(&bg_conf);
+ libconfig->destroy(&bg_conf);
}
}
struct bg_arena *bg_name2arena (char *name) {
@@ -496,7 +495,7 @@ void bg_match_over(struct bg_arena *arena, bool canceled) {
if( canceled )
clif->colormes(sd->fd,COLOR_RED,"BG Match Cancelled: not enough players");
else {
- pc_setglobalreg(sd, arena->delay_var, (unsigned int)time(NULL));
+ pc_setglobalreg(sd, script->add_str(arena->delay_var), (unsigned int)time(NULL));
}
}
}
@@ -520,13 +519,43 @@ void bg_begin(struct bg_arena *arena) {
bg->queue_pc_cleanup(sd);
}
}
+ /* TODO/FIXME? I *think* it should check what kind of queue the player used, then check if his party/guild
+ * (his team) still meet the join criteria (sort of what bg->can_queue does)
+ */
if( count < arena->min_players ) {
bg->match_over(arena,true);
} else {
arena->ongoing = true;
- mapreg->setreg(script->add_str("$@bg_queue_id"),arena->queue_id);/* TODO: make this a arena-independant var? or just .@? */
+ /* TODO: make this a arena-independant var? or just .@? */
+ mapreg->setreg(script->add_str("$@bg_queue_id"),arena->queue_id);
mapreg->setregstr(script->add_str("$@bg_delay_var$"),bg->gdelay_var);
+
+ count = 0;
+ for( i = 0; i < queue->size; i++ ) {
+ struct map_session_data * sd = NULL;
+
+ if( queue->item[i] > 0 && ( sd = map->id2sd(queue->item[i]) ) ) {
+ if( sd->bg_queue.ready == 1 ) {
+
+ mapreg->setreg(reference_uid(script->add_str("$@bg_member"), count), sd->status.account_id);
+
+ mapreg->setreg(reference_uid(script->add_str("$@bg_member_group"), count),
+ sd->bg_queue.type == BGQT_GUILD ? sd->status.guild_id :
+ sd->bg_queue.type == BGQT_PARTY ? sd->status.party_id :
+ 0
+ );
+ mapreg->setreg(reference_uid(script->add_str("$@bg_member_type"), count),
+ sd->bg_queue.type == BGQT_GUILD ? 1 :
+ sd->bg_queue.type == BGQT_PARTY ? 2 :
+ 0
+ );
+ count++;
+ }
+ }
+ }
+ mapreg->setreg(script->add_str("$@bg_member_size"),count);
+
npc->event_do(arena->npc_event);
/* we split evenly? */
/* but if a party of say 10 joins, it cant be split evenly unless by luck there are 10 soloers in the queue besides them */
@@ -534,7 +563,7 @@ void bg_begin(struct bg_arena *arena) {
/* currently running only on solo mode so we do it evenly */
}
}
-int bg_begin_timer(int tid, unsigned int tick, int id, intptr_t data) {
+int bg_begin_timer(int tid, int64 tick, int id, intptr_t data) {
bg->begin(bg->arena[id]);
bg->arena[id]->begin_timer = INVALID_TIMER;
return 0;
@@ -553,7 +582,7 @@ void bg_queue_pregame(struct bg_arena *arena) {
}
arena->begin_timer = timer->add( timer->gettick() + (arena->pregame_duration*1000), bg->begin_timer, arena->id, 0 );
}
-int bg_fillup_timer(int tid, unsigned int tick, int id, intptr_t data) {
+int bg_fillup_timer(int tid, int64 tick, int id, intptr_t data) {
bg->queue_pregame(bg->arena[id]);
bg->arena[id]->fillup_timer = INVALID_TIMER;
return 0;
@@ -663,7 +692,7 @@ enum BATTLEGROUNDS_QUEUE_ACK bg_canqueue(struct map_session_data *sd, struct bg_
tsec = (unsigned int)time(NULL);
- if ( ( tick = pc_readglobalreg(sd, bg->gdelay_var) ) && tsec < tick ) {
+ if ( ( tick = pc_readglobalreg(sd, script->add_str(bg->gdelay_var)) ) && tsec < tick ) {
char response[100];
if( (tick-tsec) > 60 )
sprintf(response, "You are a deserter! Wait %d minute(s) before you can apply again",(tick-tsec)/60);
@@ -673,7 +702,7 @@ enum BATTLEGROUNDS_QUEUE_ACK bg_canqueue(struct map_session_data *sd, struct bg_
return BGQA_FAIL_DESERTER;
}
- if ( ( tick = pc_readglobalreg(sd, arena->delay_var) ) && tsec < tick ) {
+ if ( ( tick = pc_readglobalreg(sd, script->add_str(arena->delay_var)) ) && tsec < tick ) {
char response[100];
if( (tick-tsec) > 60 )
sprintf(response, "You can't reapply to this arena so fast. Apply to the different arena or wait %d minute(s)",(tick-tsec)/60);
@@ -685,12 +714,7 @@ enum BATTLEGROUNDS_QUEUE_ACK bg_canqueue(struct map_session_data *sd, struct bg_
if( sd->bg_queue.arena != NULL )
return BGQA_DUPLICATE_REQUEST;
-
- if( type != BGQT_INDIVIDUAL ) {/* until we get the damn balancing correct */
- clif->colormes(sd->fd,COLOR_RED,"Queueing is only currently enabled only for Solo Mode");
- return BGQA_FAIL_TEAM_COUNT;
- }
-
+
switch(type) {
case BGQT_GUILD:
if( !sd->guild || !sd->state.gmaster_flag )
@@ -757,7 +781,10 @@ enum BATTLEGROUNDS_QUEUE_ACK bg_canqueue(struct map_session_data *sd, struct bg_
return BGQA_SUCCESS;
}
-void do_init_battleground(void) {
+void do_init_battleground(bool minimal) {
+ if (minimal)
+ return;
+
bg->team_db = idb_alloc(DB_OPT_RELEASE_DATA);
timer->add_func_list(bg->send_xy_timer, "bg_send_xy_timer");
timer->add_interval(timer->gettick() + battle_config.bg_update_interval, bg->send_xy_timer, 0, 0, battle_config.bg_update_interval);