summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-10-23 18:21:49 +0000
committerskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-10-23 18:21:49 +0000
commit42e1d3fd8849d608dc1e4136b0acc99b8649f083 (patch)
tree4981e0c2a37334d0d794edff259011143d1b91ec
parent05e7279f4ea2579a3d67b5339fa834e107a967c5 (diff)
downloadhercules-42e1d3fd8849d608dc1e4136b0acc99b8649f083.tar.gz
hercules-42e1d3fd8849d608dc1e4136b0acc99b8649f083.tar.bz2
hercules-42e1d3fd8849d608dc1e4136b0acc99b8649f083.tar.xz
hercules-42e1d3fd8849d608dc1e4136b0acc99b8649f083.zip
- char_family now returns the char_id of the children when previously it would return true.
- Expanded the family check to work as it should, exp-share-range is respected, and the child is not considered for it (thanks to TheUltraMage for the investigation) git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@9049 54d463be-8e91-2dee-dedb-b68131a5f0ec
-rw-r--r--Changelog-Trunk.txt3
-rw-r--r--src/char/char.c6
-rw-r--r--src/char/int_party.c29
-rw-r--r--src/char_sql/char.c6
-rw-r--r--src/char_sql/int_party.c27
5 files changed, 42 insertions, 29 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 1e533d3a1..c0609c498 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -4,6 +4,9 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2006/10/23
+ * Expanded the family check to work as it should, exp-share-range is
+ respected, and the child is not considered for it (thanks to TheUltraMage
+ for the investigation) [Skotlex]
* Double Casting will no longer fail when used. [Skotlex]
* Modified SC_STONE so that the duration of the "petrifying" time is 5 secs
reduced by your natural resistance to petrify (which is mdef%) [Skotlex]
diff --git a/src/char/char.c b/src/char/char.c
index f08e0a76b..0e23f99ab 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -1792,15 +1792,15 @@ int char_family(int cid1, int cid2, int cid3) {
//we could do a lot more checks and force cross-reference integrity.
if(char_dat[idx1].status.partner_id == cid2 &&
char_dat[idx1].status.child == cid3)
- return 1; //cid1/cid2 parents. cid3 child.
+ return cid3; //cid1/cid2 parents. cid3 child.
if(char_dat[idx1].status.partner_id == cid3 &&
char_dat[idx1].status.child == cid2)
- return 1; //cid1/cid3 parents. cid2 child.
+ return cid2; //cid1/cid3 parents. cid2 child.
if(char_dat[idx2].status.partner_id == cid3 &&
char_dat[idx2].status.child == cid1)
- return 1; //cid2/cid3 parents. cid1 child.
+ return cid1; //cid2/cid3 parents. cid1 child.
return 0;
}
diff --git a/src/char/int_party.c b/src/char/int_party.c
index cae69193f..13fbaf489 100644
--- a/src/char/int_party.c
+++ b/src/char/int_party.c
@@ -20,8 +20,8 @@ char party_txt[1024] = "save/party.txt";
struct party_data {
struct party party;
unsigned int min_lv, max_lv;
+ int family; //Is this party a family? if so, this holds the child id.
unsigned char size; //Total size of party.
- unsigned family :1; //Is this party a family?
};
static struct dbt *party_db;
@@ -67,17 +67,12 @@ static void int_party_calc_state(struct party_data *p)
p->size =
p->family = 0;
- //Check party size, max/min levels.
+ //Check party size.
for(i=0;i<MAX_PARTY;i++){
- lv=p->party.member[i].lv;
- if (!lv) continue;
+ if (!p->party.member[i].lv) continue;
p->size++;
if(p->party.member[i].online)
- {
- if( lv < p->min_lv ) p->min_lv=lv;
- if( p->max_lv < lv ) p->max_lv=lv;
p->party.count++;
- }
}
if(p->size == 3) {
//Check Family State.
@@ -87,6 +82,18 @@ static void int_party_calc_state(struct party_data *p)
p->party.member[2].char_id
);
}
+ //max/min levels.
+ for(i=0;i<MAX_PARTY;i++){
+ lv=p->party.member[i].lv;
+ if (!lv) continue;
+ if(p->party.member[i].online &&
+ //On families, the kid is not counted towards exp share rules.
+ p->party.member[i].char_id != p->family)
+ {
+ if( lv < p->min_lv ) p->min_lv=lv;
+ if( p->max_lv < lv ) p->max_lv=lv;
+ }
+ }
if (p->party.exp && !party_check_exp_share(p)) {
p->party.exp = 0; //Set off even share.
@@ -257,11 +264,9 @@ struct party_data* search_partyname(char *str) {
return p;
}
-// EXP公平分配できるかチェック
+// Returns whether this party can keep having exp share or not.
int party_check_exp_share(struct party_data *p) {
- return (p->party.count == 0 || //If noone is online, don't mess with the share type.
- (p->family && p->party.count == 3) || //All 3 MUST be online for share to trigger.
- p->max_lv - p->min_lv <= party_share_level);
+ return (p->party.count < 2|| p->max_lv - p->min_lv <= party_share_level);
}
// パ?ティが空かどうかチェック
diff --git a/src/char_sql/char.c b/src/char_sql/char.c
index dd5b31770..3edc30c9c 100644
--- a/src/char_sql/char.c
+++ b/src/char_sql/char.c
@@ -4384,7 +4384,7 @@ int char_family(int pl1,int pl2,int pl3) {
(pl3 == partnerid && pl2 == childid)
) {
mysql_free_result (sql_res);
- return 1;
+ return childid;
}
}
if(charid == pl2) {
@@ -4392,7 +4392,7 @@ int char_family(int pl1,int pl2,int pl3) {
(pl3 == partnerid && pl1 == childid)
) {
mysql_free_result (sql_res);
- return 1;
+ return childid;
}
}
if(charid == pl3) {
@@ -4400,7 +4400,7 @@ int char_family(int pl1,int pl2,int pl3) {
(pl2 == partnerid && pl1 == childid)
) {
mysql_free_result (sql_res);
- return 1;
+ return childid;
}
}
}
diff --git a/src/char_sql/int_party.c b/src/char_sql/int_party.c
index fe46ac9c6..3ea997229 100644
--- a/src/char_sql/int_party.c
+++ b/src/char_sql/int_party.c
@@ -18,8 +18,8 @@
struct party_data {
struct party party;
unsigned int min_lv, max_lv;
+ int family; //Is this party a family? if so, this holds the child id.
unsigned char size; //Total size of party.
- unsigned family :1; //Is this party a family?
};
static struct party_data *party_pt;
@@ -74,17 +74,12 @@ static void int_party_calc_state(struct party_data *p)
p->size =
p->family = 0;
- //Check party size, max/min levels.
+ //Check party size
for(i=0;i<MAX_PARTY;i++){
- lv=p->party.member[i].lv;
- if (!lv) continue;
+ if (!p->party.member[i].lv) continue;
p->size++;
if(p->party.member[i].online)
- {
- if( lv < p->min_lv ) p->min_lv=lv;
- if( p->max_lv < lv ) p->max_lv=lv;
p->party.count++;
- }
}
if(p->size == 3) {
//Check Family State.
@@ -94,6 +89,18 @@ static void int_party_calc_state(struct party_data *p)
p->party.member[2].char_id
);
}
+ //max/min levels.
+ for(i=0;i<MAX_PARTY;i++){
+ lv=p->party.member[i].lv;
+ if (!lv) continue;
+ if(p->party.member[i].online &&
+ //On families, the kid is not counted towards exp share rules.
+ p->party.member[i].char_id != p->family)
+ {
+ if( lv < p->min_lv ) p->min_lv=lv;
+ if( p->max_lv < lv ) p->max_lv=lv;
+ }
+ }
if (p->party.exp && !party_check_exp_share(p)) {
p->party.exp = 0; //Set off even share.
@@ -346,9 +353,7 @@ struct party_data* search_partyname(char *str)
// Returns whether this party can keep having exp share or not.
int party_check_exp_share(struct party_data *p)
{
- return (p->party.count == 0 || //If noone is online, don't mess with the share type.
- (p->family && p->party.count == 3) || //All 3 MUST be online for share to trigger.
- p->max_lv - p->min_lv <= party_share_level);
+ return (p->party.count < 2 || p->max_lv - p->min_lv <= party_share_level);
}
// Is there any member in the party?