Skip to content

Commit b797d87

Browse files
committed
battleground: fix bg_member_meets_requirements defined after its callers and queue_pc_cleanup removing from wrong queue during a match
1 parent 1523c93 commit b797d87

2 files changed

Lines changed: 43 additions & 32 deletions

File tree

src/map/battleground.c

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ static void bg_config_read(void)
477477

478478
libconfig->setting_lookup_int(arena, "requeue_delay", &requeue_delay);
479479

480-
if( requeue_delay < 0 ) {
480+
if (requeue_delay < 0) {
481481
ShowWarning("bg_config_read: invalid %d value for arena '%s' requeue_delay, defaulting to 300.\n",requeue_delay,aName);
482482
requeue_delay = 300;
483483
}
@@ -602,8 +602,14 @@ static void bg_queue_player_cleanup(struct map_session_data *sd)
602602
else
603603
clif->bgqueue_notice_delete(sd,BGQND_FAIL_NOT_QUEUING,bg->arena[0]->name);
604604
}
605-
if( sd->bg_queue.arena )
606-
script->queue_remove(sd->bg_queue.arena->queue_id,sd->status.account_id);
605+
if (sd->bg_queue.arena) {
606+
int qid;
607+
if (sd->bg_queue.arena->match_queue_id)
608+
qid = sd->bg_queue.arena->match_queue_id;
609+
else
610+
qid = sd->bg_queue.arena->queue_id;
611+
script->queue_remove(qid, sd->status.account_id);
612+
}
607613
sd->bg_queue.arena = NULL;
608614
sd->bg_queue.ready = 0;
609615
sd->bg_queue.client_has_bg_data = 0;
@@ -637,7 +643,7 @@ static void bg_match_over(struct bg_arena *arena, bool canceled)
637643
pc_setglobalreg(sd, script->add_variable(arena->delay_var), (unsigned int)time(NULL) + arena->requeue_delay);
638644
}
639645

640-
if( arena->match_queue_id == 0 ) {
646+
if (arena->match_queue_id == 0) {
641647
arena->begin_timer = INVALID_TIMER;
642648
arena->fillup_timer = INVALID_TIMER;
643649
}
@@ -723,7 +729,7 @@ static int bg_afk_timer(int tid, int64 tick, int id, intptr_t data)
723729
for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) {
724730
if( !sd->bg_queue.arena || !sd->bg_id )
725731
continue;
726-
if( DIFF_TICK(sockt->last_tick, sd->idletime) > (bg->mafksec * 1000) )
732+
if (DIFF_TICK(sockt->last_tick, sd->idletime) > (bg->mafksec * 1000))
727733
bg->team_leave(sd,BGTL_AFK);
728734
count++;
729735
}
@@ -779,6 +785,15 @@ static void bg_queue_check(struct bg_arena *arena)
779785
}
780786
}
781787

788+
static bool bg_member_meets_requirements(struct map_session_data *sd, struct bg_arena *arena)
789+
{
790+
if (sd->status.base_level < arena->min_level || sd->status.base_level > arena->max_level)
791+
return false;
792+
if ((sd->job & JOBL_2) == 0)
793+
return false;
794+
return true;
795+
}
796+
782797
static void bg_queue_add(struct map_session_data *sd, struct bg_arena *arena, enum bg_queue_types type)
783798
{
784799
enum BATTLEGROUNDS_QUEUE_ACK result = bg->can_queue(sd,arena,type);
@@ -787,7 +802,7 @@ static void bg_queue_add(struct map_session_data *sd, struct bg_arena *arena, en
787802

788803
nullpo_retv(sd);
789804
nullpo_retv(arena);
790-
if( arena->begin_timer != INVALID_TIMER ) {
805+
if (arena->begin_timer != INVALID_TIMER) {
791806
clif->bgqueue_ack(sd,BGQA_FAIL_QUEUING_FINISHED,arena->id);
792807
return;
793808
}
@@ -801,8 +816,10 @@ static void bg_queue_add(struct map_session_data *sd, struct bg_arena *arena, en
801816
case BGQT_PARTY: {
802817
struct party_data *p = party->search(sd->status.party_id);
803818
for( i = 0; i < MAX_PARTY; i++ ) {
804-
if( !p->data[i].sd || p->data[i].sd->bg_queue.arena != NULL ) continue;
805-
if( !bg_member_meets_requirements(p->data[i].sd, arena) ) continue;
819+
if (!p->data[i].sd || p->data[i].sd->bg_queue.arena != NULL)
820+
continue;
821+
if (!bg_member_meets_requirements(p->data[i].sd, arena))
822+
continue;
806823
count++;
807824
}
808825
}
@@ -811,7 +828,7 @@ static void bg_queue_add(struct map_session_data *sd, struct bg_arena *arena, en
811828
for ( i=0; i<sd->guild->max_member; i++ ) {
812829
if ( !sd->guild->member[i].sd || sd->guild->member[i].sd->bg_queue.arena != NULL )
813830
continue;
814-
if ( !bg_member_meets_requirements(sd->guild->member[i].sd, arena) )
831+
if (!bg_member_meets_requirements(sd->guild->member[i].sd, arena))
815832
continue;
816833
count++;
817834
}
@@ -840,8 +857,10 @@ static void bg_queue_add(struct map_session_data *sd, struct bg_arena *arena, en
840857
case BGQT_PARTY: {
841858
struct party_data *p = party->search(sd->status.party_id);
842859
for( i = 0; i < MAX_PARTY; i++ ) {
843-
if( !p->data[i].sd || p->data[i].sd->bg_queue.arena != NULL ) continue;
844-
if( !bg_member_meets_requirements(p->data[i].sd, arena) ) continue;
860+
if (!p->data[i].sd || p->data[i].sd->bg_queue.arena != NULL)
861+
continue;
862+
if (!bg_member_meets_requirements(p->data[i].sd, arena))
863+
continue;
845864
p->data[i].sd->bg_queue.type = type;
846865
p->data[i].sd->bg_queue.arena = arena;
847866
p->data[i].sd->bg_queue.ready = 0;
@@ -855,7 +874,7 @@ static void bg_queue_add(struct map_session_data *sd, struct bg_arena *arena, en
855874
for ( i=0; i<sd->guild->max_member; i++ ) {
856875
if ( !sd->guild->member[i].sd || sd->guild->member[i].sd->bg_queue.arena != NULL )
857876
continue;
858-
if ( !bg_member_meets_requirements(sd->guild->member[i].sd, arena) )
877+
if (!bg_member_meets_requirements(sd->guild->member[i].sd, arena))
859878
continue;
860879
sd->guild->member[i].sd->bg_queue.type = type;
861880
sd->guild->member[i].sd->bg_queue.arena = arena;
@@ -872,15 +891,6 @@ static void bg_queue_add(struct map_session_data *sd, struct bg_arena *arena, en
872891
bg->queue_check(arena);
873892
}
874893

875-
static bool bg_member_meets_requirements(struct map_session_data *msd, struct bg_arena *arena)
876-
{
877-
if (msd->status.base_level < arena->min_level || msd->status.base_level > arena->max_level)
878-
return false;
879-
if ((msd->job & JOBL_2) == 0)
880-
return false;
881-
return true;
882-
}
883-
884894
static enum BATTLEGROUNDS_QUEUE_ACK bg_canqueue(struct map_session_data *sd, struct bg_arena *arena, enum bg_queue_types type)
885895
{
886896
int tick;
@@ -928,11 +938,12 @@ static enum BATTLEGROUNDS_QUEUE_ACK bg_canqueue(struct map_session_data *sd, str
928938
return BGQA_NOT_PARTY_GUILD_LEADER;
929939
else {
930940
int i, count = 0;
931-
for ( i=0; i<sd->guild->max_member; i++ ) {
932-
struct map_session_data *msd = sd->guild->member[i].sd;
933-
if ( !msd || msd->bg_queue.arena != NULL )
941+
struct guild *guild = sd->guild;
942+
for (i = 0; i < guild->max_member; i++) {
943+
struct map_session_data *sd = guild->member[i].sd;
944+
if (!sd || sd->bg_queue.arena != NULL)
934945
continue;
935-
if ( !bg_member_meets_requirements(msd, arena) )
946+
if (!bg_member_meets_requirements(sd, arena))
936947
continue;
937948
count++;
938949
}
@@ -957,12 +968,12 @@ static enum BATTLEGROUNDS_QUEUE_ACK bg_canqueue(struct map_session_data *sd, str
957968
bool is_leader = false;
958969

959970
for(i = 0; i < MAX_PARTY; i++) {
960-
struct map_session_data *msd = p->data[i].sd;
961-
if( !msd )
962-
continue;
963-
if( p->party.member[i].leader && sd == msd )
971+
if (p->party.member[i].leader && p->data[i].sd == sd)
964972
is_leader = true;
965-
if( msd->bg_queue.arena == NULL && bg_member_meets_requirements(msd, arena) )
973+
struct map_session_data *sd = p->data[i].sd;
974+
if (!sd)
975+
continue;
976+
if (sd->bg_queue.arena == NULL && bg_member_meets_requirements(sd, arena))
966977
count++;
967978
}
968979

src/map/map.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2048,9 +2048,9 @@ static int map_quit(struct map_session_data *sd)
20482048
if (sd->npc_id)
20492049
npc->event_dequeue(sd);
20502050

2051-
if( sd->bg_id )
2051+
if (sd->bg_id)
20522052
bg->team_leave(sd,BGTL_QUIT);
2053-
else if( sd->bg_queue.arena )
2053+
else if (sd->bg_queue.arena)
20542054
bg->queue_pc_cleanup(sd);
20552055

20562056
if (sd->status.clan_id)

0 commit comments

Comments
 (0)