summaryrefslogtreecommitdiff
path: root/src/map/party.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/party.c')
-rw-r--r--src/map/party.c316
1 files changed, 211 insertions, 105 deletions
diff --git a/src/map/party.c b/src/map/party.c
index 551c4d56f..7d7f69620 100644
--- a/src/map/party.c
+++ b/src/map/party.c
@@ -2,8 +2,8 @@
* This file is part of Hercules.
* http://herc.ws - http://github.com/HerculesWS/Hercules
*
- * Copyright (C) 2012-2015 Hercules Dev Team
- * Copyright (C) Athena Dev Teams
+ * Copyright (C) 2012-2020 Hercules Dev Team
+ * Copyright (C) Athena Dev Teams
*
* Hercules is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -31,10 +31,12 @@
#include "map/itemdb.h"
#include "map/log.h"
#include "map/map.h"
+#include "map/messages.h"
#include "map/mob.h" // struct mob_data
#include "map/pc.h"
#include "map/skill.h"
#include "map/status.h"
+#include "map/achievement.h"
#include "common/HPM.h"
#include "common/cbasetypes.h"
#include "common/memmgr.h"
@@ -50,18 +52,22 @@
#include <stdlib.h>
#include <string.h>
-struct party_interface party_s;
+static struct party_interface party_s;
struct party_interface *party;
/*==========================================
* Fills the given party_member structure according to the sd provided.
* Used when creating/adding people to a party. [Skotlex]
*------------------------------------------*/
-void party_fill_member(struct party_member* member, struct map_session_data* sd, unsigned int leader) {
+static void party_fill_member(struct party_member *member, struct map_session_data *sd, unsigned int leader)
+{
+ nullpo_retv(member);
+ nullpo_retv(sd);
+
member->account_id = sd->status.account_id;
member->char_id = sd->status.char_id;
safestrncpy(member->name, sd->status.name, NAME_LENGTH);
- member->class_ = sd->status.class_;
+ member->class = sd->status.class;
member->map = sd->mapindex;
member->lv = sd->status.base_level;
member->online = 1;
@@ -76,7 +82,7 @@ void party_fill_member(struct party_member* member, struct map_session_data* sd,
* @return the member_id.
* @retval INDEX_NOT_FOUND if not in party.
*/
-int party_getmemberid(struct party_data *p, struct map_session_data *sd)
+static int party_getmemberid(struct party_data *p, struct map_session_data *sd)
{
int member_id;
nullpo_retr(INDEX_NOT_FOUND, p);
@@ -94,7 +100,7 @@ int party_getmemberid(struct party_data *p, struct map_session_data *sd)
/*==========================================
* Request an available sd of this party
*------------------------------------------*/
-struct map_session_data* party_getavailablesd(struct party_data *p)
+static struct map_session_data *party_getavailablesd(struct party_data *p)
{
int i;
nullpo_retr(NULL, p);
@@ -105,7 +111,7 @@ struct map_session_data* party_getavailablesd(struct party_data *p)
/*==========================================
* Retrieves and validates the sd pointer for this party member [Skotlex]
*------------------------------------------*/
-struct map_session_data *party_sd_check(int party_id, int account_id, int char_id)
+static struct map_session_data *party_sd_check(int party_id, int account_id, int char_id)
{
struct map_session_data *sd = map->id2sd(account_id);
@@ -122,7 +128,7 @@ struct map_session_data *party_sd_check(int party_id, int account_id, int char_i
return sd;
}
-int party_db_final(union DBKey key, struct DBData *data, va_list ap)
+static int party_db_final(union DBKey key, struct DBData *data, va_list ap)
{
struct party_data *p;
@@ -135,7 +141,7 @@ int party_db_final(union DBKey key, struct DBData *data, va_list ap)
return 0;
}
/// Party data lookup using party id.
-struct party_data* party_search(int party_id)
+static struct party_data *party_search(int party_id)
{
if(!party_id)
return NULL;
@@ -143,7 +149,7 @@ struct party_data* party_search(int party_id)
}
/// Party data lookup using party name.
-struct party_data* party_searchname(const char* str)
+static struct party_data *party_searchname(const char *str)
{
struct party_data* p;
@@ -157,11 +163,14 @@ struct party_data* party_searchname(const char* str)
return p;
}
-int party_create(struct map_session_data *sd, const char *name,int item,int item2)
+static int party_create(struct map_session_data *sd, const char *name, int item, int item2)
{
struct party_member leader;
char tname[NAME_LENGTH];
+ nullpo_retr(0, sd);
+ nullpo_retr(0, name);
+
safestrncpy(tname, name, NAME_LENGTH);
trim(tname);
@@ -181,10 +190,13 @@ int party_create(struct map_session_data *sd, const char *name,int item,int item
party->fill_member(&leader, sd, 1);
intif->create_party(&leader,name,item,item2);
+
+ achievement->validate_party_create(sd); //Achievements (Smokexyz)
+
return 0;
}
-void party_created(int account_id, int char_id, int fail, int party_id, const char *name)
+static void party_created(int account_id, int char_id, int fail, int party_id, const char *name)
{
struct map_session_data *sd;
sd=map->id2sd(account_id);
@@ -208,13 +220,14 @@ void party_created(int account_id, int char_id, int fail, int party_id, const ch
}
-int party_request_info(int party_id, int char_id)
+static int party_request_info(int party_id, int char_id)
{
return intif->request_partyinfo(party_id, char_id);
}
/// Invoked (from char-server) when the party info is not found.
-int party_recv_noinfo(int party_id, int char_id) {
+static int party_recv_noinfo(int party_id, int char_id)
+{
party->broken(party_id);
if( char_id != 0 ) {
// requester
@@ -226,32 +239,39 @@ int party_recv_noinfo(int party_id, int char_id) {
return 0;
}
-void party_check_state(struct party_data *p) {
+static void party_check_state(struct party_data *p)
+{
int i;
+ nullpo_retv(p);
memset(&p->state, 0, sizeof(p->state));
- for (i = 0; i < MAX_PARTY; i ++) {
+ for (i = 0; i < MAX_PARTY; i++) {
if (!p->party.member[i].online) continue; //Those not online shouldn't apart to skill usage and all that.
- switch (p->party.member[i].class_) {
+ switch (p->party.member[i].class) {
case JOB_MONK:
case JOB_BABY_MONK:
case JOB_CHAMPION:
+ case JOB_SURA:
+ case JOB_SURA_T:
+ case JOB_BABY_SURA:
p->state.monk = 1;
- break;
+ break;
case JOB_STAR_GLADIATOR:
p->state.sg = 1;
- break;
+ break;
case JOB_SUPER_NOVICE:
case JOB_SUPER_BABY:
+ case JOB_SUPER_NOVICE_E:
+ case JOB_SUPER_BABY_E:
p->state.snovice = 1;
- break;
+ break;
case JOB_TAEKWON:
p->state.tk = 1;
- break;
+ break;
}
}
}
-int party_recv_info(const struct party *sp, int char_id)
+static int party_recv_info(const struct party *sp, int char_id)
{
struct party_data* p;
const struct party_member *member;
@@ -262,6 +282,7 @@ int party_recv_info(const struct party *sp, int char_id)
int added_count = 0;
int j;
int member_id;
+ int leader_account_id = 0, leader_char_id = 0;
nullpo_ret(sp);
@@ -275,8 +296,12 @@ int party_recv_info(const struct party *sp, int char_id)
ARR_FIND(0, MAX_PARTY, i,
sp->member[i].account_id == member->account_id &&
sp->member[i].char_id == member->char_id);
- if (i == MAX_PARTY)
+ if (i == MAX_PARTY) {
removed[removed_count++] = member_id;
+ } else if (member->leader != 0) {
+ leader_account_id = member->account_id;
+ leader_char_id = member->char_id;
+ }
}
for (member_id = 0; member_id < MAX_PARTY; ++member_id) {
member = &sp->member[member_id];
@@ -304,6 +329,7 @@ int party_recv_info(const struct party *sp, int char_id)
continue;// not online
party->member_withdraw(sp->party_id, sd->status.account_id, sd->status.char_id);
}
+
memcpy(&p->party, sp, sizeof(struct party));
memset(&p->state, 0, sizeof(p->state));
memset(&p->data, 0, sizeof(p->data));
@@ -312,6 +338,8 @@ int party_recv_info(const struct party *sp, int char_id)
if ( member->char_id == 0 )
continue;// empty
p->data[member_id].sd = party->sd_check(sp->party_id, member->account_id, member->char_id);
+ if (member->account_id == leader_account_id && member->char_id == leader_char_id)
+ p->party.member[member_id].leader = 1;
}
party->check_state(p);
while( added_count > 0 ) { // new in party
@@ -341,7 +369,7 @@ int party_recv_info(const struct party *sp, int char_id)
return 0;
}
-int party_invite(struct map_session_data *sd,struct map_session_data *tsd)
+static int party_invite(struct map_session_data *sd, struct map_session_data *tsd)
{
struct party_data *p;
int i;
@@ -355,7 +383,7 @@ int party_invite(struct map_session_data *sd,struct map_session_data *tsd)
ARR_FIND(0, MAX_PARTY, i, p->data[i].sd == sd);
if( i == MAX_PARTY || !p->party.member[i].leader ) {
- clif->message(sd->fd, msg_sd(sd,282));
+ clif->message(sd->fd, msg_sd(sd,282)); // You need to be a party leader to use this command.
return 0;
}
@@ -396,6 +424,12 @@ int party_invite(struct map_session_data *sd,struct map_session_data *tsd)
return 0;
}
+ if ((tsd->status.allow_party & 1) != 0) {
+ // party invite blocked by player
+ clif->party_inviteack(sd, tsd->status.name, 5);
+ return 0;
+ }
+
tsd->party_invite=sd->status.party_id;
tsd->party_invite_account=sd->status.account_id;
@@ -403,10 +437,13 @@ int party_invite(struct map_session_data *sd,struct map_session_data *tsd)
return 1;
}
-void party_reply_invite(struct map_session_data *sd,int party_id,int flag) {
+static void party_reply_invite(struct map_session_data *sd, int party_id, int flag)
+{
struct map_session_data* tsd;
struct party_member member;
+ nullpo_retv(sd);
+
if( sd->party_invite != party_id )
{// forged
sd->party_invite = 0;
@@ -434,10 +471,13 @@ void party_reply_invite(struct map_session_data *sd,int party_id,int flag) {
//- Loads up party data if not in server
//- Sets up the pointer to him
//- Player must be authed/active and belong to a party before calling this method
-void party_member_joined(struct map_session_data *sd)
+static void party_member_joined(struct map_session_data *sd)
{
- struct party_data* p = party->search(sd->status.party_id);
+ struct party_data* p;
int i;
+
+ nullpo_retv(sd);
+ p = party->search(sd->status.party_id);
if (!p) {
party->request_info(sd->status.party_id, sd->status.char_id);
return;
@@ -460,7 +500,8 @@ void party_member_joined(struct map_session_data *sd)
/// Invoked (from char-server) when a new member is added to the party.
/// flag: 0-success, 1-failure
-int party_member_added(int party_id,int account_id,int char_id, int flag) {
+static int party_member_added(int party_id, int account_id, int char_id, int flag)
+{
struct map_session_data *sd = map->id2sd(account_id),*sd2;
struct party_data *p = party->search(party_id);
int i, j;
@@ -520,7 +561,7 @@ int party_member_added(int party_id,int account_id,int char_id, int flag) {
}
/// Party member 'sd' requesting kick of member with <account_id, name>.
-int party_removemember(struct map_session_data* sd, int account_id, const char *name)
+static int party_removemember(struct map_session_data *sd, int account_id, const char *name)
{
struct party_data *p;
int i;
@@ -536,6 +577,7 @@ int party_removemember(struct map_session_data* sd, int account_id, const char *
if( !p->party.member[i].leader )
return 0; // only party leader may remove members
+ nullpo_retr(0, name);
ARR_FIND( 0, MAX_PARTY, i, p->party.member[i].account_id == account_id && strncmp(p->party.member[i].name,name,NAME_LENGTH) == 0 );
if( i == MAX_PARTY )
return 0; // no such char in party
@@ -545,11 +587,12 @@ int party_removemember(struct map_session_data* sd, int account_id, const char *
}
/// Party member 'sd' requesting exit from party.
-int party_leave(struct map_session_data *sd)
+static int party_leave(struct map_session_data *sd)
{
struct party_data *p;
int i;
+ nullpo_ret(sd);
p = party->search(sd->status.party_id);
if( p == NULL )
return 0;
@@ -563,7 +606,7 @@ int party_leave(struct map_session_data *sd)
}
/// Invoked (from char-server) when a party member leaves the party.
-int party_member_withdraw(int party_id, int account_id, int char_id)
+static int party_member_withdraw(int party_id, int account_id, int char_id)
{
struct map_session_data* sd = map->id2sd(account_id);
struct party_data* p = party->search(party_id);
@@ -572,11 +615,43 @@ int party_member_withdraw(int party_id, int account_id, int char_id)
int i;
ARR_FIND( 0, MAX_PARTY, i, p->party.member[i].account_id == account_id && p->party.member[i].char_id == char_id );
if( i < MAX_PARTY ) {
+ bool was_leader = false;
+ int prev_leader_accountId = 0;
+ if (p->party.member[i].leader != 0) {
+ was_leader = true;
+ prev_leader_accountId = p->party.member[i].account_id;
+ }
+
clif->party_withdraw(p,sd,account_id,p->party.member[i].name,0x0);
memset(&p->party.member[i], 0, sizeof(p->party.member[0]));
memset(&p->data[i], 0, sizeof(p->data[0]));
p->party.count--;
party->check_state(p);
+
+ if (was_leader) {
+ int k;
+ // Member was party leader, try to pick a new leader from online members
+ ARR_FIND(0, MAX_PARTY, k, p->party.member[k].account_id != 0 && p->party.member[k].online == 1);
+
+ if (k == MAX_PARTY) {
+ // No online members, get an offline one
+ ARR_FIND(0, MAX_PARTY, k, p->party.member[k].account_id != 0);
+ }
+
+ if (k < MAX_PARTY) {
+ // Update party's leader
+ p->party.member[k].leader = 1;
+
+ if (p->data[k].sd != NULL) {
+ /** update members **/
+ clif->PartyLeaderChanged(p->data[k].sd, prev_leader_accountId, p->data[k].sd->status.account_id);
+ }
+
+ //Update info.
+ intif->party_leaderchange(p->party.party_id, p->party.member[k].account_id, p->party.member[k].char_id);
+ clif->party_info(p, NULL);
+ }
+ }
}
}
@@ -600,7 +675,7 @@ int party_member_withdraw(int party_id, int account_id, int char_id)
}
/// Invoked (from char-server) when a party is disbanded.
-int party_broken(int party_id)
+static int party_broken(int party_id)
{
struct party_data* p;
int i, j;
@@ -620,6 +695,7 @@ int party_broken(int party_id)
if( p->data[i].sd!=NULL ) {
clif->party_withdraw(p,p->data[i].sd,p->party.member[i].account_id,p->party.member[i].name,0x10);
p->data[i].sd->status.party_id=0;
+ clif->charnameupdate(p->data[i].sd);
}
}
@@ -632,7 +708,7 @@ int party_broken(int party_id)
return 0;
}
-int party_changeoption(struct map_session_data *sd,int exp,int item)
+static int party_changeoption(struct map_session_data *sd, int exp, int item)
{
nullpo_ret(sd);
@@ -642,7 +718,8 @@ int party_changeoption(struct map_session_data *sd,int exp,int item)
return 0;
}
-int party_optionchanged(int party_id,int account_id,int exp,int item,int flag) {
+static int party_optionchanged(int party_id, int account_id, int exp, int item, int flag)
+{
struct party_data *p;
struct map_session_data *sd=map->id2sd(account_id);
if( (p=party->search(party_id))==NULL)
@@ -659,7 +736,7 @@ int party_optionchanged(int party_id,int account_id,int exp,int item,int flag) {
return 0;
}
-bool party_changeleader(struct map_session_data *sd, struct map_session_data *tsd)
+static bool party_changeleader(struct map_session_data *sd, struct map_session_data *tsd)
{
struct party_data *p;
int mi, tmi;
@@ -668,12 +745,19 @@ bool party_changeleader(struct map_session_data *sd, struct map_session_data *ts
return false;
if (!tsd || tsd->status.party_id != sd->status.party_id) {
- clif->message(sd->fd, msg_sd(sd,283));
+ clif->message(sd->fd, msg_sd(sd,283)); // Target character must be online and in your current party.
+ return false;
+ }
+
+ if (battle_config.party_change_leader_same_map && sd->bl.m != tsd->bl.m) {
+#if PACKETVER >= 20120307
+ clif->msgtable(sd, MSG_PARTY_MASTER_CHANGE_SAME_MAP); // It is only possible to change the party leader while on the same map.
+#endif
return false;
}
if( map->list[sd->bl.m].flag.partylock ) {
- clif->message(sd->fd, msg_sd(sd,287));
+ clif->message(sd->fd, msg_sd(sd,287)); // You cannot change party leaders in this map.
return false;
}
@@ -685,8 +769,7 @@ bool party_changeleader(struct map_session_data *sd, struct map_session_data *ts
return false; //Shouldn't happen
if (!p->party.member[mi].leader) {
- //Need to be a party leader.
- clif->message(sd->fd, msg_sd(sd,282));
+ clif->message(sd->fd, msg_sd(sd,282)); // You need to be a party leader to use this command.
return false;
}
@@ -711,7 +794,7 @@ bool party_changeleader(struct map_session_data *sd, struct map_session_data *ts
/// - changes maps
/// - logs in or out
/// - gains a level (disabled)
-int party_recv_movemap(int party_id,int account_id,int char_id, unsigned short mapid,int online,int lv)
+static int party_recv_movemap(int party_id, int account_id, int char_id, unsigned short mapid, int online, int lv)
{
struct party_member* m;
struct party_data* p;
@@ -739,10 +822,12 @@ int party_recv_movemap(int party_id,int account_id,int char_id, unsigned short m
return 0;
}
-void party_send_movemap(struct map_session_data *sd)
+static void party_send_movemap(struct map_session_data *sd)
{
struct party_data *p;
+ nullpo_retv(sd);
+
if( sd->status.party_id==0 )
return;
@@ -772,16 +857,18 @@ void party_send_movemap(struct map_session_data *sd)
return;
}
-void party_send_levelup(struct map_session_data *sd)
+static void party_send_levelup(struct map_session_data *sd)
{
intif->party_changemap(sd,1);
}
-int party_send_logout(struct map_session_data *sd)
+static int party_send_logout(struct map_session_data *sd)
{
struct party_data *p;
int i;
+ nullpo_ret(sd);
+
if(!sd->status.party_id)
return 0;
@@ -798,12 +885,22 @@ int party_send_logout(struct map_session_data *sd)
return 1;
}
-int party_send_message(struct map_session_data *sd,const char *mes,int len)
+static int party_send_message(struct map_session_data *sd, const char *mes)
{
- if(sd->status.party_id==0)
+ nullpo_ret(sd);
+ nullpo_ret(mes);
+
+ if (sd->status.party_id == 0)
+ return 0;
+
+ struct party_data *p = party->search(sd->status.party_id);
+
+ if (p == NULL)
return 0;
- intif->party_message(sd->status.party_id,sd->status.account_id,mes,len);
- party->recv_message(sd->status.party_id,sd->status.account_id,mes,len);
+
+ int len = (int)strlen(mes);
+
+ clif->party_message(p, sd->status.account_id, mes, len);
// Chat logging type 'P' / Party Chat
logs->chat(LOG_CHAT_PARTY, sd->status.party_id, sd->status.char_id, sd->status.account_id, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y, NULL, mes);
@@ -811,16 +908,7 @@ int party_send_message(struct map_session_data *sd,const char *mes,int len)
return 0;
}
-int party_recv_message(int party_id,int account_id,const char *mes,int len)
-{
- struct party_data *p;
- if( (p=party->search(party_id))==NULL)
- return 0;
- clif->party_message(p,account_id,mes,len);
- return 0;
-}
-
-int party_skill_check(struct map_session_data *sd, int party_id, uint16 skill_id, uint16 skill_lv)
+static int party_skill_check(struct map_session_data *sd, int party_id, uint16 skill_id, uint16 skill_lv)
{
struct party_data *p;
struct map_session_data *p_sd;
@@ -843,6 +931,8 @@ int party_skill_check(struct map_session_data *sd, int party_id, uint16 skill_id
return 0; //Unknown case?
}
+ nullpo_ret(sd);
+
for(i=0;i<MAX_PARTY;i++){
if ((p_sd = p->data[i].sd) == NULL)
continue;
@@ -850,15 +940,14 @@ int party_skill_check(struct map_session_data *sd, int party_id, uint16 skill_id
continue;
switch(skill_id) {
case TK_COUNTER: //Increase Triple Attack rate of Monks.
- if((p_sd->class_&MAPID_UPPERMASK) == MAPID_MONK
- && pc->checkskill(p_sd,MO_TRIPLEATTACK)) {
+ if ((p_sd->job & MAPID_UPPERMASK) == MAPID_MONK && pc->checkskill(p_sd, MO_TRIPLEATTACK)) {
sc_start4(&p_sd->bl,&p_sd->bl,SC_SKILLRATE_UP,100,MO_TRIPLEATTACK,
50+50*skill_lv, //+100/150/200% rate
0,0,skill->get_time(SG_FRIEND, 1));
}
break;
case MO_COMBOFINISH: //Increase Counter rate of Star Gladiators
- if((p_sd->class_&MAPID_UPPERMASK) == MAPID_STAR_GLADIATOR
+ if ((p_sd->job & MAPID_UPPERMASK) == MAPID_STAR_GLADIATOR
&& sd->sc.data[SC_COUNTERKICK_READY]
&& pc->checkskill(p_sd,SG_FRIEND)) {
sc_start4(&p_sd->bl,&p_sd->bl,SC_SKILLRATE_UP,100,TK_COUNTER,
@@ -871,7 +960,7 @@ int party_skill_check(struct map_session_data *sd, int party_id, uint16 skill_id
return 0;
}
-int party_send_xy_timer(int tid, int64 tick, int id, intptr_t data)
+static int party_send_xy_timer(int tid, int64 tick, int id, intptr_t data)
{
struct DBIterator *iter = db_iterator(party->db);
struct party_data* p;
@@ -910,7 +999,7 @@ int party_send_xy_timer(int tid, int64 tick, int id, intptr_t data)
return 0;
}
-int party_send_xy_clear(struct party_data *p)
+static int party_send_xy_clear(struct party_data *p)
{
int i;
@@ -926,15 +1015,13 @@ int party_send_xy_clear(struct party_data *p)
}
// exp share and added zeny share [Valaris]
-int party_exp_share(struct party_data* p, struct block_list* src, unsigned int base_exp, unsigned int job_exp, int zeny)
+static int party_exp_share(struct party_data *p, struct block_list *src, unsigned int base_exp, unsigned int job_exp, int zeny)
{
struct map_session_data* sd[MAX_PARTY];
unsigned int i, c;
-#ifdef RENEWAL_EXP
- unsigned int job_exp_bonus, base_exp_bonus;
-#endif
nullpo_ret(p);
+ nullpo_ret(src);
// count the number of players eligible for exp sharing
for (i = c = 0; i < MAX_PARTY; i++) {
@@ -959,21 +1046,7 @@ int party_exp_share(struct party_data* p, struct block_list* src, unsigned int b
zeny = (unsigned int) cap_value(zeny * bonus/100, INT_MIN, INT_MAX);
}
-#ifdef RENEWAL_EXP
- base_exp_bonus = base_exp;
- job_exp_bonus = job_exp;
-#endif
-
for (i = 0; i < c; i++) {
-#ifdef RENEWAL_EXP
- struct mob_data *md = BL_CAST(BL_MOB, src);
- if (md != NULL && md->db->mexp == 0) {
- int rate = pc->level_penalty_mod(md->level - (sd[i])->status.base_level, md->status.race, md->status.mode, 1);
-
- base_exp = (unsigned int)cap_value(base_exp_bonus * rate / 100, 1, UINT_MAX);
- job_exp = (unsigned int)cap_value(job_exp_bonus * rate / 100, 1, UINT_MAX);
- }
-#endif
pc->gainexp(sd[i], src, base_exp, job_exp, false);
if (zeny) // zeny from mobs [Valaris]
@@ -983,12 +1056,16 @@ int party_exp_share(struct party_data* p, struct block_list* src, unsigned int b
}
//Does party loot. first_charid holds the charid of the player who has time priority to take the item.
-int party_share_loot(struct party_data* p, struct map_session_data* sd, struct item* item_data, int first_charid)
+static int party_share_loot(struct party_data *p, struct map_session_data *sd, struct item *item_data, int first_charid)
{
struct map_session_data *target = NULL;
int i;
+
+ nullpo_ret(item_data);
+
if (p && p->party.item&2 && (first_charid || !(battle_config.party_share_type&1)))
{
+ nullpo_ret(sd);
//item distribution to party members.
if (battle_config.party_share_type&2) {
//Round Robin
@@ -1048,8 +1125,9 @@ int party_share_loot(struct party_data* p, struct map_session_data* sd, struct i
return 0;
}
-int party_send_dot_remove(struct map_session_data *sd)
+static int party_send_dot_remove(struct map_session_data *sd)
{
+ nullpo_ret(sd);
if (sd->status.party_id)
clif->party_xy_remove(sd);
return 0;
@@ -1058,13 +1136,14 @@ int party_send_dot_remove(struct map_session_data *sd)
// To use for Taekwon's "Fighting Chant"
// int c = 0;
// party_foreachsamemap(party->sub_count, sd, 0, &c);
-int party_sub_count(struct block_list *bl, va_list ap)
+static int party_sub_count(struct block_list *bl, va_list ap)
{
const struct map_session_data *sd = NULL;
nullpo_ret(bl);
Assert_ret(bl->type == BL_PC);
sd = BL_UCCAST(BL_PC, bl);
+ nullpo_ret(sd);
if (sd->state.autotrade)
return 0;
@@ -1079,7 +1158,8 @@ int party_sub_count(struct block_list *bl, va_list ap)
* Arglist-based version of party_foreachsamemap
* @see party_foreachsamemap
*/
-int party_vforeachsamemap(int (*func)(struct block_list*,va_list), struct map_session_data *sd, int range, va_list ap) {
+static int party_vforeachsamemap(int (*func)(struct block_list*, va_list), struct map_session_data *sd, int range, va_list ap)
+{
struct party_data *p;
int i;
int x0,y0,x1,y1;
@@ -1125,7 +1205,7 @@ int party_vforeachsamemap(int (*func)(struct block_list*,va_list), struct map_se
}
// Special check for Minstrel's and Wanderer's chorus skills.
-int party_sub_count_chorus(struct block_list *bl, va_list ap)
+static int party_sub_count_chorus(struct block_list *bl, va_list ap)
{
const struct map_session_data *sd = NULL;
@@ -1139,7 +1219,7 @@ int party_sub_count_chorus(struct block_list *bl, va_list ap)
if (battle_config.idle_no_share && pc_isidle(sd))
return 0;
- if ( (sd->class_&MAPID_THIRDMASK) != MAPID_MINSTRELWANDERER )
+ if ((sd->job & MAPID_THIRDMASK) != MAPID_MINSTRELWANDERER)
return 0;
return 1;
@@ -1153,7 +1233,8 @@ int party_sub_count_chorus(struct block_list *bl, va_list ap)
* @param ... Additional parameters to pass to func()
* @return Sum of the return values from func()
*/
-int party_foreachsamemap(int (*func)(struct block_list*,va_list), struct map_session_data *sd, int range, ...) {
+static int party_foreachsamemap(int (*func)(struct block_list*, va_list), struct map_session_data *sd, int range, ...)
+{
va_list ap;
int ret;
va_start(ap, range);
@@ -1166,17 +1247,22 @@ int party_foreachsamemap(int (*func)(struct block_list*,va_list), struct map_ses
* Party Booking in KRO [Spiria]
*------------------------------------------*/
-struct party_booking_ad_info* create_party_booking_data(void) {
+static struct party_booking_ad_info *create_party_booking_data(void)
+{
struct party_booking_ad_info *pb_ad;
CREATE(pb_ad, struct party_booking_ad_info, 1);
pb_ad->index = party->booking_nextid++;
return pb_ad;
}
-void party_recruit_register(struct map_session_data *sd, short level, const char *notice) {
+static void party_recruit_register(struct map_session_data *sd, short level, const char *notice)
+{
#ifdef PARTY_RECRUIT
struct party_booking_ad_info *pb_ad;
+ nullpo_retv(sd);
+ nullpo_retv(notice);
+
pb_ad = (struct party_booking_ad_info*)idb_get(party->booking_db, sd->status.char_id);
if( pb_ad == NULL )
@@ -1202,11 +1288,15 @@ void party_recruit_register(struct map_session_data *sd, short level, const char
#endif
}
-void party_booking_register(struct map_session_data *sd, short level, short mapid, short* job) {
+static void party_booking_register(struct map_session_data *sd, short level, short mapid, short *job)
+{
#ifndef PARTY_RECRUIT
struct party_booking_ad_info *pb_ad;
int i;
+ nullpo_retv(sd);
+ nullpo_retv(job);
+
pb_ad = (struct party_booking_ad_info*)idb_get(party->booking_db, sd->status.char_id);
if( pb_ad == NULL )
{
@@ -1236,10 +1326,12 @@ void party_booking_register(struct map_session_data *sd, short level, short mapi
#endif
}
-void party_recruit_update(struct map_session_data *sd, const char *notice) {
+static void party_recruit_update(struct map_session_data *sd, const char *notice)
+{
#ifdef PARTY_RECRUIT
struct party_booking_ad_info *pb_ad;
+ nullpo_retv(sd);
pb_ad = (struct party_booking_ad_info*)idb_get(party->booking_db, sd->status.char_id);
if( pb_ad == NULL )
@@ -1256,11 +1348,15 @@ void party_recruit_update(struct map_session_data *sd, const char *notice) {
return;
#endif
}
-void party_booking_update(struct map_session_data *sd, short* job) {
+static void party_booking_update(struct map_session_data *sd, short *job)
+{
#ifndef PARTY_RECRUIT
int i;
struct party_booking_ad_info *pb_ad;
+ nullpo_retv(sd);
+ nullpo_retv(job);
+
pb_ad = (struct party_booking_ad_info*)idb_get(party->booking_db, sd->status.char_id);
if( pb_ad == NULL )
@@ -1279,7 +1375,8 @@ void party_booking_update(struct map_session_data *sd, short* job) {
#endif
}
-void party_recruit_search(struct map_session_data *sd, short level, short mapid, unsigned long lastindex, short resultcount) {
+static void party_recruit_search(struct map_session_data *sd, short level, short mapid, unsigned long lastindex, short resultcount)
+{
#ifdef PARTY_RECRUIT
struct party_booking_ad_info *pb_ad;
int count = 0;
@@ -1287,6 +1384,7 @@ void party_recruit_search(struct map_session_data *sd, short level, short mapid,
bool more_result = false;
struct DBIterator *iter = db_iterator(party->booking_db);
+ nullpo_retv(sd);
memset(result_list, 0, sizeof(result_list));
for( pb_ad = dbi_first(iter); dbi_exists(iter); pb_ad = dbi_next(iter) )
@@ -1309,7 +1407,8 @@ void party_recruit_search(struct map_session_data *sd, short level, short mapid,
return;
#endif
}
-void party_booking_search(struct map_session_data *sd, short level, short mapid, short job, unsigned long lastindex, short resultcount) {
+static void party_booking_search(struct map_session_data *sd, short level, short mapid, short job, unsigned long lastindex, short resultcount)
+{
#ifndef PARTY_RECRUIT
struct party_booking_ad_info *pb_ad;
int i;
@@ -1318,6 +1417,8 @@ void party_booking_search(struct map_session_data *sd, short level, short mapid,
bool more_result = false;
struct DBIterator *iter = db_iterator(party->booking_db);
+ nullpo_retv(sd);
+
memset(result_list, 0, sizeof(result_list));
for( pb_ad = dbi_first(iter); dbi_exists(iter); pb_ad = dbi_next(iter) ) {
@@ -1349,10 +1450,12 @@ void party_booking_search(struct map_session_data *sd, short level, short mapid,
#endif
}
-bool party_booking_delete(struct map_session_data *sd)
+static bool party_booking_delete(struct map_session_data *sd)
{
struct party_booking_ad_info* pb_ad;
+ nullpo_retr(false, sd);
+
if((pb_ad = (struct party_booking_ad_info*)idb_get(party->booking_db, sd->status.char_id))!=NULL)
{
#ifdef PARTY_RECRUIT
@@ -1364,12 +1467,14 @@ bool party_booking_delete(struct map_session_data *sd)
}
return true;
}
-void do_final_party(void) {
+static void do_final_party(void)
+{
party->db->destroy(party->db,party->db_final);
db_destroy(party->booking_db); // Party Booking [Spiria]
}
// Constructor, init vars
-void do_init_party(bool minimal) {
+static void do_init_party(bool minimal)
+{
if (minimal)
return;
@@ -1378,12 +1483,14 @@ void do_init_party(bool minimal) {
timer->add_func_list(party->send_xy_timer, "party_send_xy_timer");
timer->add_interval(timer->gettick()+battle_config.party_update_interval, party->send_xy_timer, 0, 0, battle_config.party_update_interval);
}
+
/*=====================================
-* Default Functions : party.h
-* Generated by HerculesInterfaceMaker
-* created by Susu
-*-------------------------------------*/
-void party_defaults(void) {
+ * Default Functions : party.h
+ * Generated by HerculesInterfaceMaker
+ * created by Susu
+ *-------------------------------------*/
+void party_defaults(void)
+{
party = &party_s;
/* */
@@ -1420,7 +1527,6 @@ void party_defaults(void) {
party->send_levelup = party_send_levelup;
party->send_logout = party_send_logout;
party->send_message = party_send_message;
- party->recv_message = party_recv_message;
party->skill_check = party_skill_check;
party->send_xy_clear = party_send_xy_clear;
party->exp_share = party_exp_share;