summaryrefslogtreecommitdiff
path: root/src/emap/party.c
blob: 482fbd658df904163e1ee20708e686dec2d69aca (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// Copyright (c) Copyright (c) Hercules Dev Team, licensed under GNU GPL.
// Copyright (c) 2014 - 2015 Evol developers

#include "common/hercules.h"
#include "common/HPMi.h"
#include "common/nullpo.h"
#include "common/timer.h"
#include "common/socket.h" // last_tick
#include "common/utils.h"
#include "map/battle.h"
#include "map/intif.h"
#include "map/map.h"
#include "map/party.h"
#include "map/pc.h"


#include "plugins/HPMHooking.h"

// exp share and added zeny share [Valaris]
int eparty_exp_share(struct party_data **p, struct block_list **src, unsigned int *baseexp, unsigned int *jobexp, int *zeny __attribute__ ((unused)))
{
	hookStop();
	struct map_session_data* sd[MAX_PARTY];
	unsigned int i, c, lvl;
	unsigned int base_exp, job_exp;

	nullpo_ret(p);
	nullpo_ret(src);
	lvl=0;

	// count the number of players eligible for exp sharing
	// TODO: (battle_config.idle_no_share && pc_isidle(sd[c]))
	// i.e. Do not force the battle conf settings!! (Specially if it can explode)
	for (i = c = 0; i < MAX_PARTY; i++) {
		if( (sd[c] = (*p)->data[i].sd) == NULL || sd[c]->bl.m != (*src)->m || pc_isdead(sd[c]) || pc_isidle(sd[c]) )
			continue;
		c++;
		lvl += sd[c]->status.base_level; // XXX
	}
	if (c < 1)
		return 0;

	// We don't care for pointers...
	base_exp=*baseexp;
	job_exp=*jobexp;

	/* GP sharing defunct */
	//zeny/=c;

	// TODO: Apply bonuses
	/*
	if (battle_config.party_even_share_bonus && c > 1) {
		double bonus = 100 + battle_config.party_even_share_bonus*(c-1);
		if (base_exp)
			base_exp = (unsigned int) cap_value(base_exp * bonus/100, 0, UINT_MAX);
		if (job_exp)
			job_exp = (unsigned int) cap_value(job_exp * bonus/100, 0, UINT_MAX);
		//if (zeny)
		//	zeny = (unsigned int) cap_value(zeny * bonus/100, INT_MIN, INT_MAX);
	}
	*/

	for (i = 0; i < c; i++) {
		//pc->gainexp(sd[i], src, base_exp, job_exp, false);
		// XXX
		pc->gainexp(sd[i], (*src),
		            base_exp*sd[i]->status.base_level/lvl,
		            job_exp*sd[i]->status.base_level/lvl,
		            false);

		//if (zeny) // zeny from mobs [Valaris]
		//	pc->getzeny(sd[i],zeny,LOG_TYPE_PICKDROP_MONSTER,NULL);
	}
	return 0;
}

// TODO: Override party_share_loot
// party_share_type does not contains 2 ("random")
// Use level as randomness criteria