summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/char/int_party.c7
-rw-r--r--src/char_sql/int_party.c6
-rw-r--r--src/map/atcommand.c65
-rw-r--r--src/map/atcommand.h1
-rw-r--r--src/map/clif.c12
-rw-r--r--src/map/intif.c4
-rw-r--r--src/map/party.c4
7 files changed, 80 insertions, 19 deletions
diff --git a/src/char/int_party.c b/src/char/int_party.c
index b0cedabe6..e7d2044a5 100644
--- a/src/char/int_party.c
+++ b/src/char/int_party.c
@@ -569,10 +569,9 @@ int mapif_parse_PartyAddMember(int fd, int party_id, struct party_member *member
}
// パ?ティ?設定?更要求
-int mapif_parse_PartyChangeOption(int fd, int party_id, int account_id, int exp, int flag) {
+int mapif_parse_PartyChangeOption(int fd, int party_id, int account_id, int exp, int item) {
struct party_data *p;
- //NOTE: No clue what that flag is about, in all observations so far it always comes as 0. [Skotlex]
- flag = 0;
+ int flag = 0;
p = idb_get(party_db, party_id);
if (p == NULL)
@@ -583,7 +582,7 @@ int mapif_parse_PartyChangeOption(int fd, int party_id, int account_id, int exp,
flag |= 0x01;
p->party.exp = 0;
}
-
+ p->party.item = item&0x3;
mapif_party_optionchanged(fd, &p->party, account_id, flag);
return 0;
}
diff --git a/src/char_sql/int_party.c b/src/char_sql/int_party.c
index bfd0cef79..e3056f8d5 100644
--- a/src/char_sql/int_party.c
+++ b/src/char_sql/int_party.c
@@ -634,11 +634,10 @@ int mapif_parse_PartyAddMember(int fd, int party_id, struct party_member *member
return 0;
}
// パーティー設定変更要求
-int mapif_parse_PartyChangeOption(int fd,int party_id,int account_id,int exp,int flag)
+int mapif_parse_PartyChangeOption(int fd,int party_id,int account_id,int exp,int item)
{
struct party_data *p;
- //NOTE: No clue what that flag is about, in all observations so far it always comes as 0. [Skotlex]
- flag = 0;
+ int flag = 0;
p = inter_party_fromsql(party_id);
if(!p)
@@ -649,6 +648,7 @@ int mapif_parse_PartyChangeOption(int fd,int party_id,int account_id,int exp,int
flag|=0x01;
p->party.exp=0;
}
+ p->party.item = item&0x3; //Filter out invalid values.
mapif_party_optionchanged(fd,&p->party,account_id,flag);
inter_party_tosql(p, PS_BASIC, 0);
return 0;
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index 29b055687..d22483f8a 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -281,6 +281,7 @@ ACMD_FUNC(showzeny);
ACMD_FUNC(showdelay); //moved from charcommand [Kevin]
ACMD_FUNC(autotrade);// durf
ACMD_FUNC(changeleader);// [Skotlex]
+ACMD_FUNC(partyoption);// [Skotlex]
ACMD_FUNC(changegm);// durf
// Duel [LuzZza]
@@ -608,6 +609,7 @@ static AtCommandInfo atcommand_info[] = {
{ AtCommand_AutoTrade, "@at", 10, atcommand_autotrade },
{ AtCommand_ChangeGM, "@changegm", 10, atcommand_changegm }, // durf
{ AtCommand_ChangeLeader, "@changeleader", 10, atcommand_changeleader }, // durf
+ { AtCommand_PartyOption, "@partyoption", 10, atcommand_partyoption}, // durf
{ AtCommand_Invite, "@invite", 1, atcommand_invite }, // By LuzZza
{ AtCommand_Duel, "@duel", 1, atcommand_duel }, // By LuzZza
{ AtCommand_Leave, "@leave", 1, atcommand_leave }, // By LuzZza
@@ -7667,8 +7669,8 @@ atcommand_changeleader(
nullpo_retr(-1, sd);
if (sd->status.party_id == 0 || (p = party_search(sd->status.party_id)) == NULL)
- {
- clif_displaymessage(fd, "You need to be a party's leader to use this command.");
+ { //Need to be a party leader.
+ clif_displaymessage(fd, msg_txt(282));
return -1;
}
@@ -7678,8 +7680,8 @@ atcommand_changeleader(
return -1; //Shouldn't happen
if (!p->party.member[mi].leader)
- {
- clif_displaymessage(fd, "You need to be the party's leader to use this command.");
+ { //Need to be a party leader.
+ clif_displaymessage(fd, msg_txt(282));
return -1;
}
@@ -7690,7 +7692,7 @@ atcommand_changeleader(
}
if((pl_sd=map_nick2sd((char *) message)) == NULL || pl_sd->status.party_id != sd->status.party_id) {
- clif_displaymessage(fd, "Target character must be online and be in your party.");
+ clif_displaymessage(fd, msg_txt(283));
return -1;
}
@@ -7702,10 +7704,10 @@ atcommand_changeleader(
//Change leadership.
p->party.member[mi].leader = 0;
if (p->data[mi].sd->fd)
- clif_displaymessage(p->data[mi].sd->fd, "Leadership transferred.");
+ clif_displaymessage(p->data[mi].sd->fd, msg_txt(284));
p->party.member[pl_mi].leader = 1;
if (p->data[pl_mi].sd->fd)
- clif_displaymessage(p->data[pl_mi].sd->fd, "You've become the party leader.");
+ clif_displaymessage(p->data[pl_mi].sd->fd, msg_txt(285));
intif_party_leaderchange(p->party.party_id,p->party.member[pl_mi].account_id,p->party.member[pl_mi].char_id);
//Update info.
@@ -7716,6 +7718,55 @@ atcommand_changeleader(
}
/*==========================================
+ * Used to change the item share setting of a party.
+ *------------------------------------------
+ *by Skotlex
+ */
+int
+atcommand_partyoption(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct party_data *p;
+ int mi, option;
+ char w1[15], w2[15];
+ nullpo_retr(-1, sd);
+
+ if (sd->status.party_id == 0 || (p = party_search(sd->status.party_id)) == NULL)
+ {
+ clif_displaymessage(fd, msg_txt(282));
+ return -1;
+ }
+
+ for (mi = 0; mi < MAX_PARTY && p->data[mi].sd != sd; mi++);
+
+ if (mi == MAX_PARTY)
+ return -1; //Shouldn't happen
+
+ if (!p->party.member[mi].leader)
+ {
+ clif_displaymessage(fd, msg_txt(282));
+ return -1;
+ }
+
+ if(!message || !*message || sscanf(message, "%15s %15s", w1, w2) < 2)
+ {
+ clif_displaymessage(fd, "Command usage: @changeoption <pickup share: yes/no> <item distribution: yes/no>");
+ return -1;
+ }
+ w1[14] = w2[14] = '\0'; //Assure a proper string terminator.
+ option = (battle_config_switch(w1)?1:0)|(battle_config_switch(w2)?2:0);
+
+ //Change item share type.
+ if (option != p->party.item)
+ party_changeoption(sd, p->party.exp, option);
+ else
+ clif_displaymessage(fd, msg_txt(286));
+
+ return 0;
+}
+
+/*==========================================
*Turns on/off AutoLoot for a specific player
*------------------------------------------
*by Upa-Kun
diff --git a/src/map/atcommand.h b/src/map/atcommand.h
index 11cf113f0..f6b256eff 100644
--- a/src/map/atcommand.h
+++ b/src/map/atcommand.h
@@ -256,6 +256,7 @@ enum AtCommandType {
AtCommand_AutoTrade,//durf
AtCommand_ChangeGM,//durf
AtCommand_ChangeLeader,
+ AtCommand_PartyOption,
AtCommand_Invite, // By LuzZza
AtCommand_Duel, // By LuzZza
diff --git a/src/map/clif.c b/src/map/clif.c
index 81c43cb09..3953b356c 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -10346,8 +10346,18 @@ void clif_parse_RemovePartyMember(int fd, struct map_session_data *sd) {
*------------------------------------------
*/
void clif_parse_PartyChangeOption(int fd, struct map_session_data *sd) {
+ struct party_data *p;
RFIFOHEAD(fd);
- party_changeoption(sd, RFIFOW(fd,2), RFIFOW(fd,4));
+
+ if(!sd->status.party_id)
+ return;
+
+ p = party_search(sd->status.party_id);
+ if (!p) return;
+ //The client no longer can change the item-field, therefore it always
+ //comes as zero. Here, resend the item data as it is.
+// party_changeoption(sd, RFIFOW(fd,2), RFIFOW(fd,4));
+ party_changeoption(sd, RFIFOW(fd,2), p->party.item);
}
/*==========================================
diff --git a/src/map/intif.c b/src/map/intif.c
index bb12fa673..5df6dd0ae 100644
--- a/src/map/intif.c
+++ b/src/map/intif.c
@@ -417,7 +417,7 @@ int intif_party_addmember(int party_id,struct party_member *member)
return 1;
}
// パーティ設定変更
-int intif_party_changeoption(int party_id,int account_id,int exp,int flag)
+int intif_party_changeoption(int party_id,int account_id,int exp,int item)
{
if (CheckForCharServer())
return 0;
@@ -426,7 +426,7 @@ int intif_party_changeoption(int party_id,int account_id,int exp,int flag)
WFIFOL(inter_fd,2)=party_id;
WFIFOL(inter_fd,6)=account_id;
WFIFOW(inter_fd,10)=exp;
- WFIFOW(inter_fd,12)=flag;
+ WFIFOW(inter_fd,12)=item;
WFIFOSET(inter_fd,14);
return 0;
}
diff --git a/src/map/party.c b/src/map/party.c
index 24f29a603..c6aebda4a 100644
--- a/src/map/party.c
+++ b/src/map/party.c
@@ -452,13 +452,13 @@ int party_broken(int party_id)
return 0;
}
-int party_changeoption(struct map_session_data *sd,int exp,int flag)
+int party_changeoption(struct map_session_data *sd,int exp,int item)
{
nullpo_retr(0, sd);
if( sd->status.party_id==0)
return 0;
- intif_party_changeoption(sd->status.party_id,sd->status.account_id,exp,flag);
+ intif_party_changeoption(sd->status.party_id,sd->status.account_id,exp,item);
return 0;
}