Ver código fonte

- Corrected the mapif_parse_PartyChangeMap function to correctly update level-range when someone logs on/off, fixes being unable to set even-share on once it's been broken even when the characters out of range logoff.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@8254 54d463be-8e91-2dee-dedb-b68131a5f0ec
skotlex 19 anos atrás
pai
commit
9080a1b373
4 arquivos alterados com 40 adições e 18 exclusões
  1. 5 0
      Changelog-Trunk.txt
  2. 18 10
      src/char/int_party.c
  3. 16 7
      src/char_sql/int_party.c
  4. 1 1
      src/map/status.c

+ 5 - 0
Changelog-Trunk.txt

@@ -3,6 +3,11 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
+2006/08/13
+	* Corrected the mapif_parse_PartyChangeMap function to correctly update
+	  level-range when someone logs on/off, fixes being unable to set even-share
+	  on once it's been broken even when the characters out of range logoff.
+	  [Skotlex]
 2006/08/11
 	* Fixed Kagebunshin no Jutsu crashing for dyes > 0; though this solution
 	  might seem hackish (changing clothes colour to 0 when it starts while

+ 18 - 10
src/char/int_party.c

@@ -620,8 +620,8 @@ int mapif_parse_PartyLeave(int fd, int party_id, int account_id, int char_id) {
 	return 0;
 }
 
-// ƒp?ƒeƒBƒ}ƒbƒv�X�V—v‹�
-int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, int char_id, unsigned short map, int online, int lv) {
+int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, int char_id, unsigned short map, int online, int lv)
+{
 	struct party_data *p;
 	int i;
 
@@ -634,14 +634,23 @@ int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, int char_id
 			p->party.member[i].char_id == char_id)
 		{
 			p->party.member[i].map = map;
-			if (p->party.member[i].online != online) {
+			if (p->party.member[i].online != online)
+			{
 				p->party.member[i].online = online;
-				if (online) p->party.count++;
-				else p->party.count--;
-				if (p->family && p->party.exp && !party_check_exp_share(p))
-			  	{	//Even-share lost.
-					p->party.exp = 0;
-					mapif_party_optionchanged(0, &p->party, 0, 0);
+				if (online)
+					p->party.count++;
+				else
+					p->party.count--;
+				// Even share check situations: Family state (always breaks)
+				// character logging on/off is max/min level (update level range) 
+				// or character logging on/off has a different level (update level range using new level)
+				if (p->family ||
+					(p->party.member[i].lv <= p->min_lv || p->party.member[i].lv >= p->max_lv) ||
+					(p->party.member[i].lv != lv && (lv <= p->min_lv || lv >= p->max_lv))
+					)
+				{
+					p->party.member[i].lv = lv;
+					int_party_check_lv(p);
 				}
 			}
 			if (p->party.member[i].lv != lv) {
@@ -657,7 +666,6 @@ int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, int char_id
 			break;
 		}
 	}
-
 	return 0;
 }
 

+ 16 - 7
src/char_sql/int_party.c

@@ -722,14 +722,23 @@ int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, int char_id
 			p->party.member[i].char_id == char_id)
 		{
 			p->party.member[i].map = map;
-			if (p->party.member[i].online != online) {
+			if (p->party.member[i].online != online)
+			{
 				p->party.member[i].online = online;
-				if (online) p->party.count++;
-				else p->party.count--;
-				if (p->family && p->party.exp && !party_check_exp_share(p))
-			  	{	//Even-share lost.
-					p->party.exp = 0;
-					mapif_party_optionchanged(0, &p->party, 0, 0);
+				if (online)
+					p->party.count++;
+				else
+					p->party.count--;
+				// Even share check situations: Family state (always breaks)
+				// character logging on/off is max/min level (update level range) 
+				// or character logging on/off has a different level (update level range using new level)
+				if (p->family ||
+					(p->party.member[i].lv <= p->min_lv || p->party.member[i].lv >= p->max_lv) ||
+					(p->party.member[i].lv != lv && (lv <= p->min_lv || lv >= p->max_lv))
+					)
+				{
+					p->party.member[i].lv = lv;
+					int_party_check_lv(p);
 				}
 			}
 			if (p->party.member[i].lv != lv) {

+ 1 - 1
src/map/status.c

@@ -407,7 +407,7 @@ void initChangeTables(void) {
 	StatusIconChangeTable[SC_SPEEDUP1] = SI_SPEEDPOTION2;
 	StatusIconChangeTable[SC_INCSTR] = SI_INCSTR;
 	StatusIconChangeTable[SC_MIRACLE] = SI_SPIRIT;
-		
+	
 	//Other SC which are not necessarily associated to skills.
 	StatusChangeFlagTable[SC_ASPDPOTION0] = SCB_ASPD;
 	StatusChangeFlagTable[SC_ASPDPOTION1] = SCB_ASPD;