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:
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ę
, która jako jedyna odnosi się do
Zacząłem ją modyfikować w tym miejscu:
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:
Prosiłbym o pomoc, z góry dzięki ; )
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
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
Code:
rateExperienceFromPlayers = 110
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;
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: