• logo_cipsoft
    Nowe serwery zostały otwarte 19 Lut 2025:
    Noctalia (Open PvP) Ignitera (Open PvP) us_logo Xybra (Open PvP)

Wy?wietlanie procent?w zamiast hp i many

Dantez

Moim sekretem jest ciasto
Dołączył
Maj 22, 2008
Posty
1206
Liczba reakcji
202
Author: Dantez

Dzia?anie:
Zamienia wy?wietlan? liczb? ?ycia i many na procenty.​

Jak doda??
Podmieniamy ca?? funkcj? AddPlayerStats w plikach protocolgame.cpp w przypadku wersji 0.3.6pl1+ lub protocol76.cpp w przypadku wersji TFS pod Tibi? 7.6. Przez lata si? porobi?y r??ne wariacje i r??ne cuda, w funkcji powinny inaczej wygl?da? tylko 4 linijki.​

The Forgotten Server Master
[CPP]void ProtocolGame::AddPlayerStats(NetworkMessage& msg)
{
msg.addByte(0xA0);

msg.add<uint16_t>(std::floor(player->getHealth() * 100.f / player->getMaxHealth()));
msg.add<uint16_t>(100);

msg.add<uint32_t>(player->getFreeCapacity());
msg.add<uint32_t>(player->getCapacity());

msg.add<uint64_t>(player->getExperience());

msg.add<uint16_t>(player->getLevel());
msg.addByte(player->getLevelPercent());

msg.add<uint16_t>(100); // base xp gain rate
msg.add<uint16_t>(0); // xp voucher
msg.add<uint16_t>(0); // low level bonus
msg.add<uint16_t>(0); // xp boost
msg.add<uint16_t>(100); // stamina multiplier (100 = x1.0)

msg.add<uint16_t>(std::floor(player->getMana() * 100.f / std::max<uint32_t>(player->getMaxMana(), 1)));
msg.add<uint16_t>(100);

msg.addByte(std::min<uint32_t>(player->getMagicLevel(), std::numeric_limits<uint8_t>::max()));
msg.addByte(std::min<uint32_t>(player->getBaseMagicLevel(), std::numeric_limits<uint8_t>::max()));
msg.addByte(player->getMagicLevelPercent());

msg.addByte(player->getSoul());

msg.add<uint16_t>(player->getStaminaMinutes());

msg.add<uint16_t>(player->getBaseSpeed() / 2);

Condition* condition = player->getCondition(CONDITION_REGENERATION);
msg.add<uint16_t>(condition ? condition->getTicks() / 1000 : 0x00);

msg.add<uint16_t>(player->getOfflineTrainingTime() / 60 / 1000);

msg.add<uint16_t>(0); // xp boost time (seconds)
msg.addByte(0); // enables exp boost in the store
}[/CPP]

The Forgotten Server 1.0 - 1.2​
[CPP]void ProtocolGame::AddPlayerStats(NetworkMessage& msg)
{
msg.AddByte(0xA0);

msg.add<uint16_t>(std::floor(player->getHealth() * 100.f / player->getPlayerInfo(PLAYERINFO_MAXHEALTH)));
msg.add<uint16_t>(100);

msg.add<uint32_t>(uint32_t(player->getFreeCapacity() * 100));
msg.add<uint32_t>(uint32_t(player->getCapacity() * 100));

msg.add<uint64_t>(player->getExperience());

msg.add<uint16_t>(player->getPlayerInfo(PLAYERINFO_LEVEL));
msg.AddByte(player->getPlayerInfo(PLAYERINFO_LEVELPERCENT));

msg.add<uint16_t>(std::floor(player->getMana() * 100.f / std::max<uint32_t>(player->getPlayerInfo(PLAYERINFO_MAXMANA), 1)));
msg.add<uint16_t>(100);

msg.AddByte(std::min<uint32_t>(0xFF, player->getMagicLevel()));
msg.AddByte(std::min<uint32_t>(0xFF, player->getBaseMagicLevel()));
msg.AddByte(player->getPlayerInfo(PLAYERINFO_MAGICLEVELPERCENT));

msg.AddByte(player->getPlayerInfo(PLAYERINFO_SOUL));

msg.add<uint16_t>(player->getStaminaMinutes());

msg.add<uint16_t>(player->getBaseSpeed() / 2);

Condition* condition = player->getCondition(CONDITION_REGENERATION);
msg.add<uint16_t>(condition ? condition->getTicks() / 1000 : 0x00);

msg.add<uint16_t>(player->getOfflineTrainingTime() / 60 / 1000);
}[/CPP]

The Forgotten Server 0.3.6pl1​

Nale?y usun?c spacj? z PLAYERINFO_MAXMANA je?li si? pojawia - nie moja wina
[CPP]void ProtocolGame::AddPlayerStats(NetworkMessage_ptr msg)
{
msg->AddByte(0xA0);

msg->AddU16((uint16_t)std::floor(player->getHealth() * 100.f / getPlayerInfo(PLAYERINFO_MAXHEALTH)));
msg->AddU16(100);

msg->AddU32(uint32_t(player->getFreeCapacity() * 100));
uint64_t experience = player->getExperience();
if(experience > 0x7FFFFFFF) // client debugs after 2,147,483,647 exp
msg->AddU32(0x7FFFFFFF);
else
msg->AddU32(experience);

msg->AddU16(player->getPlayerInfo(PLAYERINFO_LEVEL));
msg->AddByte(player->getPlayerInfo(PLAYERINFO_LEVELPERCENT));

msg->AddU16((uint16_t)std::floor(player->getMana() * 100.f / std::max<uint32_t>(getPlayerInfo(PLAYERINFO_MAXMANA), 1)));
msg->AddU16(100);

msg->AddByte(player->getPlayerInfo(PLAYERINFO_MAGICLEVEL));
msg->AddByte(player->getPlayerInfo(PLAYERINFO_MAGICLEVELPERCENT));
msg->AddByte(player->getPlayerInfo(PLAYERINFO_SOUL));
msg->AddU16(player->getStaminaMinutes());
}[/CPP]

OTServ 0.6.4​
[CPP]void ProtocolGame::AddPlayerStats(NetworkMessage_ptr msg)
{
msg->AddByte(0xA0);

msg->AddU16((uint16_t)std::floor(player->getHealth() * 100.f / std::max<uint32_t>(player->getPlayerInfo(PLAYERINFO_MAXHEALTH), 1)));
msg->AddU16(100);

msg->AddU32(uint32_t(player->getFreeCapacity() * 100));
uint64_t experience = player->getExperience();
if(experience > 0x7FFFFFFF) // client debugs after 2,147,483,647 exp
msg->AddU32(0x7FFFFFFF);
else
msg->AddU32(experience);

msg->AddU16(player->getPlayerInfo(PLAYERINFO_LEVEL));
msg->AddByte(player->getPlayerInfo(PLAYERINFO_LEVELPERCENT));

msg->AddU16((uint16_t)std::floor(player->getMana() * 100.f / std::max<uint32_t>(player->getPlayerInfo(PLAYERINFO_MAXMANA), 1)));
msg->AddU16(100);

msg->AddByte(player->getPlayerInfo(PLAYERINFO_MAGICLEVEL));
msg->AddByte(player->getPlayerInfo(PLAYERINFO_MAGICLEVELPERCENT));
msg->AddByte(player->getPlayerInfo(PLAYERINFO_SOUL));
msg->AddU16(player->getStaminaMinutes());
}[/CPP]

Chi?ski trunk 3777
[CPP]void ProtocolGame::AddPlayerStats(NetworkMessage_ptr msg)
{
msg->put<char>(0xA0);

msg->put<uint16_t>(std::floor(player->getHealth() * 100.f / std::max<uint32_t>(player->getPlayerInfo(PLAYERINFO_MAXHEALTH), 1)));
msg->put<uint16_t>(100);

msg->put<uint32_t>(uint32_t(player->getFreeCapacity() * 100));
uint64_t experience = player->getExperience();
if(experience > 0x7FFFFFFF) // client debugs after 2,147,483,647 exp
msg->put<uint32_t>(0x7FFFFFFF);
else
msg->put<uint32_t>(experience);

msg->put<uint16_t>(player->getPlayerInfo(PLAYERINFO_LEVEL));
msg->put<char>(player->getPlayerInfo(PLAYERINFO_LEVELPERCENT));

msg->put<uint16_t>(std::floor(player->getMana() * 100.f / std::max<uint32_t>(player->getPlayerInfo(PLAYERINFO_MAXMANA), 1)));
msg->put<uint16_t>(100);

msg->put<char>(player->getPlayerInfo(PLAYERINFO_MAGICLEVEL));
msg->put<char>(player->getPlayerInfo(PLAYERINFO_MAGICLEVELPERCENT));
msg->put<char>(player->getPlayerInfo(PLAYERINFO_SOUL));
msg->put<uint16_t>(player->getStaminaMinutes());
}[/CPP]

Pod 7.6 z funkcjami "msg." w pliku protocol76.cpp
[CPP]void Protocol76::AddPlayerStats(NetworkMessage &msg,const Player *player)
{
msg.AddByte(0xA0);
msg.AddU16((uint16_t)std::floor(player->getHealth() * 100.f / std::max<uint32_t>(player->getPlayerInfo(PLAYERINFO_MAXHEALTH), 1)));
msg.AddU16(100);
msg.AddU16((unsigned short)std::floor(player->getFreeCapacity()));

#ifdef YUR_HIGH_LEVELS
if (player->getPlayerInfo(PLAYERINFO_LEVEL) > 65535)
{
msg.AddU32(player->getPlayerInfo(PLAYERINFO_LEVEL));
msg.AddU16(0);
}
else if (player->getExperience() > 2000000000L)
{
msg.AddU32(0);
msg.AddU16(player->getPlayerInfo(PLAYERINFO_LEVEL));
}
else
{
msg.AddU32((unsigned long)player->getExperience());
msg.AddU16(player->getPlayerInfo(PLAYERINFO_LEVEL));
}
#else
msg.AddU32(player->getExperience());
msg.AddU16(player->getPlayerInfo(PLAYERINFO_LEVEL));
#endif //YUR_HIGH_LEVELS

msg.AddByte(player->getPlayerInfo(PLAYERINFO_LEVELPERCENT));
msg.AddU16((uint16_t)std::floor(player->getMana() * 100.f / std::max<uint32_t>(player->getPlayerInfo(PLAYERINFO_MAXMANA), 1)));
msg.AddU16(100);
msg.AddByte(player->getMagicLevel());
msg.AddByte(player->getPlayerInfo(PLAYERINFO_MAGICLEVELPERCENT));
msg.AddByte(player->getPlayerInfo(PLAYERINFO_SOUL));
}[/CPP]
 
Odp: Wy?wietlanie procent?w zamiast hp i many

skrypt wygl?da ciekawie ale pytanie - jak teraz np na takim ots enfo 7.6 gdzie lataj? 9999999 lvle skapn?? si? ile si? ma hp w danej chwili - czyt czy ma sie 20k czy 30k : P
 
Odp: Wy?wietlanie procent?w zamiast hp i many

@up
Mo?na np. sobie doda? !hp/!mp :hah:
 
Odp: Wy?wietlanie procent?w zamiast hp i many

Nom, pami?tam te czasy gdzie mege enfo by?o popularne, po 50 os i sie napierdalaj? ka?dy z kazdym... i teraz jak by z czym? takim sprawdzali ile maj? many i hp? jeszcze? no okej % by mieli ale % to nie znaczy hp, bo maj?c 1% to mozesz miec 1kkk hp a mozesz miec 1 ^ ^

po 2 stestowali?cie czy ten % nie ro?nie przypadkiem i ?e nie ma sposobu jakiegokolwiek ?eby zrobi? 200% lub wi?cej? :D tak z ciekawo?ci - ew czy nie ma problemu ?e mob zadaj?cy 100dmg zdejmie ca?y pasek ;d
 
Odp: Wy?wietlanie procent?w zamiast hp i many

Mo?esz mie? 200% - wystarczy, ?e b?dziesz mia? 2x wi?cej hp ni? na max. Mo?liwe to jest jedynie w przypadku edycji playera. (Sam w sobie player nie mo?e mie? wi?cej hp ni? jego maxhp)
Skoro masz 1% to kto? lub co? musia?o cie zbi? do tego 1%, wi?c wiesz, ?e padasz. Nic nie poradz? na to, dok?adniejszy wynik mo?esz poda? w promilach, jednak nadal 1 promil mo?e oznacza? 1k jak i 1 hp.

Bardziej bym wykorzysta? to pod serwery high exp, gdzie bez !hp nie wiesz ile masz tak na prawd? ?ycia.

Co do dmg - kod tylko wy?wietla procenty, a nie zamienia na 100%. Tak na prawd? nadal masz te 1000 hp, dlatego mob zadaj?cy 100 dmg spowoduje, ?e b?dziesz mia? 900 hp, a wy?wietli 90%.
 
Odp: Wy?wietlanie procent?w zamiast hp i many

@UPx2
To jest tylko wysy?anie statystyk dla clienta. Wi?c nijak to si? ma do zadawanych obra?e?.
 
Odp: Wy?wietlanie procent?w zamiast hp i many

rozumiem ?e tak ma dzia?a? , chodzi mi o to czy nie znajdzie si?w tym kodzie ?adnej luki przez kt?r? mo?na sko?czy? ?le ;D
 
Odp: Wy?wietlanie procent?w zamiast hp i many

@Topic,
Skrypt fajny, ?adnie przedstawiony, pod 2 wersje.
Leci rep.
 
Odp: Wy?wietlanie procent?w zamiast hp i many

Gdzie wklejamy w wersji 7.6?
 
Odp: Wy?wietlanie procent?w zamiast hp i many

protocol76.cpp
 
Odp: Wy?wietlanie procent?w zamiast hp i many

Do?? fajny skrypt ,nawet do?? pomocny do balansacji czar?w ze wzgl?du na to ile tw?j czar b?dzie % zadawa? graczom ;d.
 
Odp: Wy?wietlanie procent?w zamiast hp i many

a co je?li nie mam pliku protocolgame.cpp?
 
Odp: Wy?wietlanie procent?w zamiast hp i many

To nie zrobisz... bo nie masz plikow ?r?dlowych (Source
 
Odp: Wy?wietlanie procent?w zamiast hp i many

to sk?d je mam wzi??? ? daj link do silnika kt?ry to ma.
 
Odp: Wy?wietlanie procent?w zamiast hp i many

Ka?dy ma
A jak kto? udost?pnia bez ?r?de? to wina jego i administracji, ?e nie dopilnowali

masz na przyk?ad
 
Odp: Wy?wietlanie procent?w zamiast hp i many

tylko ?e ja potrzebuje pod 8.6 / dobra ju? znalaz?em teraz jak doda? to do silnika ? lub je?li dobrze mi si? wydaje jak to wszystko kompilowa? itd. nic nie czaje. wyt?umaczy kto? krok po kroku?

___________
Dobra chyba zrozumia?em sam do tego tzn je?li mamy pliki source to za ka?dym razem gdy chcemy co? zmieni? musimy kompilowa? nowy silnik z zmianami i dodawa? stare ?mieci typu data mods.
Je?li jestem w b??dzie to napiszcie.
Tylko jeszcze jeden problem, nie ogarniam tego protocolgame.cpp gdy podmieniam to mam jakie? errory przy kompilacji to chyba wina tego ze mam tfs 0.3.6
Je?li kto? by by? tak mi?y i mnie uszcz??liwi? robi?c to za mnie:

By? bym wdzi?czny ;D repp..
 
Ostatnia edycja:
Odp: Wy?wietlanie procent?w zamiast hp i many

?ci?gnij Forgotten Dev-Cpp albo Stian's Repack Dev-Cpp.

S? to paczki Dev-C++ z wgranymi bibliotekami potrzebnymi do kompilacji TFS. Jak ju? b?dziesz je mia? otwierasz projekt TheForgottenServer, wprowadzasz m?j kod i kompilujesz.
Je?li nadal potrzebujesz pomocy poszukaj poradniki dotycz?ce kompilacji.
 
Odp: Wy?wietlanie procent?w zamiast hp i many

Robie wszystko dobrze, ale od razu wida? ?e mam inn? wersje tfsa i mi wyskakuj? b??dy na twoim kodzie

To jest m?j plik protocolgame.cpp
jakby? m?g? to przer?b bo ja totalnie nie ogarniam co mia?bym zmieni?
 
Do góry