Jump to content
  • 0

PK Mode: 1 (But with Aura, Timer and Ranking that is properly working)


Gidz Cross

Question


  • Group:  Members
  • Topic Count:  123
  • Topics Per Day:  0.03
  • Content Count:  640
  • Reputation:   82
  • Joined:  04/07/14
  • Last Seen:  

Is this possible? I have managed to make it work but the ranking system is not properly working. I am requesting to have PK Mode set to 1 with PVP Aura, Timer and Ranking that is properly working.

In clif.c

	if(!pc_isinvisible(sd) && mapdata->flag[MF_PVP]) {
		//if(!battle_config.pk_mode) { // remove pvp stuff for pk_mode [Valaris]
			if (!mapdata->flag[MF_PVP_NOCALCRANK])
				sd->pvp_timer = add_timer(gettick()+200, pc_calc_pvprank_timer, sd->bl.id, 0);
			sd->pvp_rank = 0;
			sd->pvp_lastusers = 0;
			sd->pvp_point = 5;
			sd->pvp_won = 0;
			sd->pvp_lost = 0;
		//}

 

Edited by Gidz Cross
Link to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 0

  • Group:  Members
  • Topic Count:  123
  • Topics Per Day:  0.03
  • Content Count:  640
  • Reputation:   82
  • Joined:  04/07/14
  • Last Seen:  

I have managed to solved the ranking issue but i think its quite yet missing something. But it works (partially).

Scenario:
Me kills Player 2. The Player 2 Rank will become 2/2. Warp out then goes back then the same ranking shown 2/2. But when player 2 killed me. The player 2 rank will becomes 1/2. That means the player 2 is in Rank 1 for pvp in that specific map. But when i go back to savepoint then re warp to the same map the player 2 ranking will become 2/2 when my account becomes 1/2.

Here's what i did to make the ranking works in pk_mode: 1 (conf/misc)

in pc.c

	// disable certain pvp functions on pk_mode [Valaris]
	//if( !battle_config.pk_mode && mapdata->flag[MF_PVP] && !mapdata->flag[MF_PVP_NOCALCRANK] ) {
		sd->pvp_point -= 5;
		sd->pvp_lost++;
		if( src && src->type == BL_PC ) {
			struct map_session_data *ssd = (struct map_session_data *)src;
			ssd->pvp_point++;
			ssd->pvp_won++;
		}
		//if( sd->pvp_point < 0 ) {
			//sd->respawn_tid = add_timer(tick+1000, pc_respawn_timer,sd->bl.id,0);
			//return 1|8;
		//}
	//}

This is paired with the initical post in clif.c.

Tagging @joecalis XD

Is there a proper way to activate or port PVP Ranking, Timer with PK Mode: 1 enabled?

Edited by Gidz Cross
Call a friend
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  25
  • Topics Per Day:  0.01
  • Content Count:  283
  • Reputation:   76
  • Joined:  06/13/13
  • Last Seen:  

1 hour ago, Gidz Cross said:

But when i go back to savepoint then re warp to the same map the player 2 ranking will become 2/2 when my account becomes 1/2.

that because current pvp ranking system has it own point rank logic.

suppose there is 2 player A & B currently in pvp map so the flow should go like..
 

- player A 5 point, rank 2/2
- player B 5 point, rank 2/2
- player A kill player B
- player A 6 (5 + 1) point, rank 1/2
- player B 4 (5 - 1) point, rank 2/2
- player B warp out then goes back
- player A 6 point, rank 1/2
- player B 5 point, rank 2/2
- player B kill player A
- player B 6 (5 + 1) point, rank 1/2
- player A 4 (5 - 1) point, rank 2/2
- player A warp out then goes back
- player B 6 point, rank 1/2
- player A 5 point, rank 2/2

anyway you can debug the code, to see the point acquired by player on map.
 

/*==========================================
 * Update PVP rank for sd1 in cmp to sd2
 *------------------------------------------*/
static int pc_calc_pvprank_sub(struct block_list *bl,va_list ap)
{
	map_session_data *sd1,*sd2;

	sd1=(map_session_data *)bl;
	sd2=va_arg(ap,map_session_data *);

	if( pc_isinvisible(sd1) || pc_isinvisible(sd2) )
	{// cannot register pvp rank for hidden GMs
		return 0;
	}

+	ShowDebug("pc_calc_pvprank_sub: player %s (%d:%d) %d pvp point.\n", sd1->status.name, sd1->status.account_id, sd1->status.char_id, sd1->pvp_point);
+
	if( sd1->pvp_point > sd2->pvp_point )
		sd2->pvp_rank++;
	return 0;
}
/*==========================================
 * Calculate new rank beetween all present players (map_foreachinallarea)
 * and display result
 *------------------------------------------*/
int pc_calc_pvprank(map_session_data *sd)
{
	int old = sd->pvp_rank;
	struct map_data *mapdata = map_getmapdata(sd->bl.m);

+	ShowDebug("pc_calc_pvprank: player %s (%d:%d) %d pvp point.\n", sd->status.name, sd->status.account_id, sd->status.char_id, sd->pvp_point);
+
	sd->pvp_rank=1;
	map_foreachinmap(pc_calc_pvprank_sub,sd->bl.m,BL_PC,sd);
	if(old!=sd->pvp_rank || sd->pvp_lastusers!=mapdata->users_pvp)
		clif_pvpset(sd,sd->pvp_rank,sd->pvp_lastusers=mapdata->users_pvp,0);
	return sd->pvp_rank;
}

 

though its bit weird pvp rank timer is allocated to each player in map instead run like dynamic mob,
i mean the timer attached to map will run when there is player come to map (clif_parse_LoadEndAck ?)
and stop when there is no one in map.

albeit it will send 2 times the rank packet (clif_pvpset) when player come to map and timer executed at same time, but it should be no biggie.

 

Oh or try use client command "/pvpinfo" in each player client to see current point, since rank is based point.

 

Edited by Litro Endemic
adding more info.
  • Like 1
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  123
  • Topics Per Day:  0.03
  • Content Count:  640
  • Reputation:   82
  • Joined:  04/07/14
  • Last Seen:  

10 hours ago, Litro Endemic said:

that because current pvp ranking system has it own point rank logic.

suppose there is 2 player A & B currently in pvp map so the flow should go like..
 

- player A 5 point, rank 2/2
- player B 5 point, rank 2/2
- player A kill player B
- player A 6 (5 + 1) point, rank 1/2
- player B 4 (5 - 1) point, rank 2/2
- player B warp out then goes back
- player A 6 point, rank 1/2
- player B 5 point, rank 2/2
- player B kill player A
- player B 6 (5 + 1) point, rank 1/2
- player A 4 (5 - 1) point, rank 2/2
- player A warp out then goes back
- player B 6 point, rank 1/2
- player A 5 point, rank 2/2

anyway you can debug the code, to see the point acquired by player on map.
 

/*==========================================
 * Update PVP rank for sd1 in cmp to sd2
 *------------------------------------------*/
static int pc_calc_pvprank_sub(struct block_list *bl,va_list ap)
{
	map_session_data *sd1,*sd2;

	sd1=(map_session_data *)bl;
	sd2=va_arg(ap,map_session_data *);

	if( pc_isinvisible(sd1) || pc_isinvisible(sd2) )
	{// cannot register pvp rank for hidden GMs
		return 0;
	}

+	ShowDebug("pc_calc_pvprank_sub: player %s (%d:%d) %d pvp point.\n", sd1->status.name, sd1->status.account_id, sd1->status.char_id, sd1->pvp_point);
+
	if( sd1->pvp_point > sd2->pvp_point )
		sd2->pvp_rank++;
	return 0;
}
/*==========================================
 * Calculate new rank beetween all present players (map_foreachinallarea)
 * and display result
 *------------------------------------------*/
int pc_calc_pvprank(map_session_data *sd)
{
	int old = sd->pvp_rank;
	struct map_data *mapdata = map_getmapdata(sd->bl.m);

+	ShowDebug("pc_calc_pvprank: player %s (%d:%d) %d pvp point.\n", sd->status.name, sd->status.account_id, sd->status.char_id, sd->pvp_point);
+
	sd->pvp_rank=1;
	map_foreachinmap(pc_calc_pvprank_sub,sd->bl.m,BL_PC,sd);
	if(old!=sd->pvp_rank || sd->pvp_lastusers!=mapdata->users_pvp)
		clif_pvpset(sd,sd->pvp_rank,sd->pvp_lastusers=mapdata->users_pvp,0);
	return sd->pvp_rank;
}

 

though its bit weird pvp rank timer is allocated to each player in map instead run like dynamic mob,
i mean the timer attached to map will run when there is player come to map (clif_parse_LoadEndAck ?)
and stop when there is no one in map.

albeit it will send 2 times the rank packet (clif_pvpset) when player come to map and timer executed at same time, but it should be no biggie.

 

Oh or try use client command "/pvpinfo" in each player client to see current point, since rank is based point.

 

Wow. Thank you so much for these new information.

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  16
  • Topics Per Day:  0.06
  • Content Count:  74
  • Reputation:   1
  • Joined:  06/22/23
  • Last Seen:  

Hello @Gidz Cross can  you share diff patch of that?

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  123
  • Topics Per Day:  0.03
  • Content Count:  640
  • Reputation:   82
  • Joined:  04/07/14
  • Last Seen:  

On 1/19/2024 at 7:18 PM, Dev j said:

Hello @Gidz Cross can  you share diff patch of that?

I did already on the previous thread.

 

In clif.c

	if(!pc_isinvisible(sd) && mapdata->flag[MF_PVP]) {
		//if(!battle_config.pk_mode) { // remove pvp stuff for pk_mode [Valaris]
			if (!mapdata->flag[MF_PVP_NOCALCRANK])
				sd->pvp_timer = add_timer(gettick()+200, pc_calc_pvprank_timer, sd->bl.id, 0);
			sd->pvp_rank = 0;
			sd->pvp_lastusers = 0;
			sd->pvp_point = 5;
			sd->pvp_won = 0;
			sd->pvp_lost = 0;
		//}

in pc.c

	// disable certain pvp functions on pk_mode [Valaris]
	//if( !battle_config.pk_mode && mapdata->flag[MF_PVP] && !mapdata->flag[MF_PVP_NOCALCRANK] ) {
		sd->pvp_point -= 5;
		sd->pvp_lost++;
		if( src && src->type == BL_PC ) {
			struct map_session_data *ssd = (struct map_session_data *)src;
			ssd->pvp_point++;
			ssd->pvp_won++;
		}
		//if( sd->pvp_point < 0 ) {
			//sd->respawn_tid = add_timer(tick+1000, pc_respawn_timer,sd->bl.id,0);
			//return 1|8;
		//}
	//}

 

This will enable the timers, ranking when server is set to pk mode: 1 and doesn't warp out players when died twice.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...