• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!
  • 2026 staff recruitment is open! Check it out and consider applying!

Rozdzielanie expa w stos. do zadanych obrażeń - PVP-ENFO

GarQet

Own3d!
Joined
Feb 10, 2009
Messages
1,381
Solutions
14
Reaction score
81
Siemaneczko.
Mam serwer pvp-enfo, za zabicie gracza dostaje się level. Próbowałem rozdawać experience za pomocą tej możliwości w configu:
Code:
rateExperienceFromPlayers = 110
Gdy gracz z poziomem 50-tym zabije innego gracza z tym samym poziomem to dostaje 7,5lvl, wszystko fajnie, tylko jeśli powtórzy się sytuacja i ten gracz który zabił wcześniej 50 i będzie miał już 57,5 i ponownie zabije gracza z 50 poziomem to system nie przyzna mu żadnego expa (min/maxLevelThresholdForKilledPlayer zmieniałem ale zero efektu), zaś jeśli gracz z poziomem 50 zabije tego z 57,5 to otrzyma aż 68 poziom.
Nie mam pomysłu jak rozdzielać experience. Próbowałem zrobić to w lua, ale nie znalazłem funkcji która pobiera ilość graczy która zaatakowała daną postać a następnie dzieli exp w stosunku do zadanych obrażeń.
Jeśli nie lua to poszedłem szukać w źródłach, w źródłach znalazłem funkcję
Code:
double Player::getGainedExperience(Creature* attacker) const
, która jako jedyna odnosi się do
Code:
rateExperienceFromPlayers = 110
Zacząłem ją modyfikować w tym miejscu:
Code:
	uint32_t a = (uint32_t)std::floor(attackerLevel * 0.9), b = level;
	uint64_t c = getExperience();
	return (double)std::max((uint64_t)0, (uint64_t)std::floor(getDamageRatio(attacker)
		* std::max((double)0, ((double)(1 - (((double)a / b))))) * 0.05 * c)) * rate;
Próbowałem wielu kombinacji, ale zawsze kończyło się na tym, że nie ważne czy gracz walnął raz z rózgi czy praktycznie sam zabił to i tak i tak dostawał tyle samo expa co osoba, która zadała mu np. 30 obrażenia. Oczywiście minimalna różnica była.
Chciałbym się dowiedzieć czy ktoś ma jakiś pomysł jak to oskryptować aby działało w taki mniej więcej sposób:
50 atakuje 50 i ma 57...
57 atakuje 50 i ma 59...
...
50 atakuje 57 i ma 55...
50 atakuje 68 i ma 75...
...
Jeśli nie ma nikt pomysłu jak to napisać, to może wie jak wyedytować kod źródłowy, żeby np. 700000 expa dzieliło na wszystkich atakujących i rozdzielało go w zależności od zadanych obrażeń.

Cała funkcja z kodu:
Code:
double Player::getGainedExperience(Creature* attacker) const
{
	if(!skillLoss)
		return 0;

	double rate = g_config.getDouble(ConfigManager::RATE_PVP_EXPERIENCE);
	if(rate <= 0)
		return 0;

	Player* attackerPlayer = attacker->getPlayer();
	if(!attackerPlayer || attackerPlayer == this)
		return 0;

	double attackerLevel = (double)attackerPlayer->getLevel(), min = g_config.getDouble(
		ConfigManager::EFP_MIN_THRESHOLD), max = g_config.getDouble(ConfigManager::EFP_MAX_THRESHOLD);
	if((min > 0 && level < (uint32_t)std::floor(attackerLevel * min)) || (max > 0 &&
		level > (uint32_t)std::floor(attackerLevel * max)))
		return 0;

	/*
		Formula
		a = attackers level * 0.9
		b = victims level
		c = victims experience

		result = (1 - (a / b)) * 0.05 * c
		Not affected by special multipliers(!)
	*/
	uint32_t a = (uint32_t)std::floor(attackerLevel * 0.9), b = level;
	uint64_t c = getExperience();
	return (double)std::max((uint64_t)0, (uint64_t)std::floor((getDamageRatio(attacker)
		* std::max(((double)0, ((double)(1 - (((double)a / b))))) + 100000) * 0.05 * c) * rate)) + 183;
}

Prosiłbym o pomoc, z góry dzięki ; )
 
Last edited:
Code:
double Player::getGainedExperience(Creature* attacker) const
{
 double rate = this->getExperience()*0.6;
 
 Player* attackerPlayer = attacker->getPlayer();
 
 if(!attackerPlayer || attackerPlayer == this)
  return 0;
 
 if(rate > 0)
  return getDamageRatio(attacker)*rate;
 return 0;
}
Łap to z mojego dawnego pvpenfo
głownie chodziło Ci pewnie o metodę getDemageRation(), bo to dzięki niej można tak dzielić exp
 

Similar threads

Back
Top