1. Autor: Baabuseek
2. Link do oryginalnego tematu: [7.6] Pvp System
3. Opis: Ode mnie info: Ostrzegam, ?e kod do ko?ca nie dzia?a dobrze tzn. niema w sieci nigdzie napisanego w 100% sprawnego PVP Systemu, ale niebawem si? taki pojawi pod t? wersje klienta, czyli 7.60
---------------------
Opis:
Bez r?czki(niezaci?ni?ta):
*Nie zabijesz nikogo z miecza ani z czaru.
*Gdy walniesz z czaru lub z runki i obok Ciebie stoi inny gracz to nie robi Ci si? skull,
Z zaci?ni?t? r?czka:
*Mo?esz bi? z czar?w, run lub z pi??ci tylko w zaznaczonego gracza.
(*Zabijesz wszystkich bez zaznaczania je?li maj? skull; patrz: skull-kill),
Fix:
*Po nieudanym atakowaniu nie pojawia si? pz,
*Na pvp arenie nie obowi?zuje nowy system pvp,
*Przy party r?wnie? nie obowi?zuje nowy system pvp,
*Access bez limit?w (config: accessprotect) mo?e atakowa? wszystkich po zaci?ni?ciu r?czki,
(je?i b?dzie mia? niezaci?ni?t? nie zaatakuje ?adnego gracza),
*Pvp arena: Brak skulli, po wyj?ciu nie mamy pz.
4. Kod:
Zaczynamy!
game.cpp pod:
[CPP]#ifdef YUR_RINGS_AMULETS
damage = applyAmulets(targetPlayer, damage, me->attackType);
#endif //YUR_RINGS_AMULETS[/CPP]
dodaj:
[CPP]#ifdef _NG_BBK_PVP__
pvpArena = isPvpArena(attackPlayer) && isPvpArena(targetPlayer);
Creature *monster = dynamic_cast<Monster*>(targetCreature);
if (damage > 0) {
Creature *targetMonster = dynamic_cast<Creature*>(targetCreature);
if(attackPlayer && attackPlayer->atkMode == 1 && !pvpArena)
{
if(targetPlayer == targetMonster)
{
if(targetPlayer->party == 0 || attackPlayer->party == 0 && attackPlayer->party != targetPlayer->party){
damage = 0;
}
}
}
}
if (attackPlayer && !monster && damage > 0) {
Creature *attackedCreature = game->getPlayerByID(attackPlayer->attackedCreature);
if(attackPlayer->atkMode == 0 && attackPlayer->access <= g_config.ACCESS_PROTECT && !pvpArena)
{
if(attackedCreature != targetPlayer)
{
if(targetPlayer->party == 0 || attackPlayer->party == 0 && attackPlayer->party != targetPlayer->party){
damage = 0;
}
}
}
}
#endif //_NG_BBK_PVP__[/CPP]
troszk? ni?ej pod:
[CPP]if (damage > 0) {
if(attackPlayer && attackPlayer->access < g_config.ACCESS_PROTECT) {[/CPP]
zamie?:
[CPP]if(targetPlayer && targetPlayer != attackPlayer && game->getWorldType() != WORLD_TYPE_NO_PVP)[/CPP]
na:
[CPP]#ifdef _NG_BBK_PVP__
if(targetPlayer && targetPlayer != attackPlayer && game->getWorldType() != WORLD_TYPE_NO_PVP && damage != 0 && !pvpArena)
#else
if(targetPlayer && targetPlayer != attackPlayer && game->getWorldType() != WORLD_TYPE_NO_PVP)
#endif //_NG_BBK_PVP__[/CPP]
zn?w troszke ni?ej pod:
[CPP]attackPlayer->pzLocked = true;
}[/CPP]
zamie?:
[CPP]if(targetCreature->access < g_config.ACCESS_PROTECT && targetPlayer && game->getWorldType() != WORLD_TYPE_NO_PVP)[/CPP]
na:
[CPP]#ifdef _NG_BBK_PVP__
if(targetCreature->access < g_config.ACCESS_PROTECT && targetPlayer && game->getWorldType() != WORLD_TYPE_NO_PVP && !pvpArena)
#else
if(targetCreature->access < g_config.ACCESS_PROTECT && targetPlayer && game->getWorldType() != WORLD_TYPE_NO_PVP)
#endif //_NG_BBK_PVP__[/CPP]
dalej w game.cpp, znajd?:
[CPP]case FIGHT_MAGICDIST:
if((std::abs(creature->pos.x-attackedCreature->pos.x) <= 8) &&
(std::abs(creature->pos.y-attackedCreature->pos.y) <= 5) &&
(creature->pos.z == attackedCreature->pos.z)) {
//if(map->canThrowItemTo(creature->pos, attackedCreature->pos, false, true))
if(map->canThrowObjectTo(creature->pos, attackedCreature->pos, BLOCK_PROJECTILE) == RET_NOERROR)
inReach = true;
}
break;
}[/CPP]
i pod tym, zmie? tak? linijk?:
[CPP]if (player && player->access < g_config.ACCESS_PROTECT)[/CPP]
na to:
[CPP]#ifdef _NG_BBK_PVP__
bool pvpArena = false;
pvpArena = isPvpArena(player) && isPvpArena(attackedPlayer);
if (player && player->access < g_config.ACCESS_PROTECT && !pvpArena)
#else
if (player && player->access < g_config.ACCESS_PROTECT)
#endif //_NG_BBK_PVP__[/CPP]
ni?ej pod:
[CPP]player->sendIcons();
if(attackedPlayer)
player->pzLocked = true;
}[/CPP]
zamie?:
[CPP]if(attackedPlayer && attackedPlayer->access < g_config.ACCESS_PROTECT)[/CPP]
na:
[CPP]#ifdef _NG_BBK_PVP__
if(attackedPlayer && attackedPlayer->access < g_config.ACCESS_PROTECT && !pvpArena)
#else
if(attackedPlayer && attackedPlayer->access < g_config.ACCESS_PROTECT)
#endif //_NG_BBK_PVP__[/CPP]
dalej game.cpp w funkcji:
[CPP]void Game::checkCreatureAttacking(unsigned long id)[/CPP]
znajd?:
[CPP]else {
if (creature->attackedCreature != 0)
{
Creature *attackedCreature = getCreatureByID(creature->attackedCreature);[/CPP]
i pod dodaj:
[CPP]#ifdef _NG_BBK_PVP__
Player *player = dynamic_cast<Player*>(creature);
Player *attackedPlayer = dynamic_cast<Player*>(attackedCreature);
bool pvpArena = false;
pvpArena = isPvpArena(player) && isPvpArena(attackedPlayer);
if(player && player->atkMode == 1 && attackedPlayer && !pvpArena) {
if(attackedPlayer->party == 0 || player->party == 0 && player->party != attackedPlayer->party){
player->sendCancelAttacking();
player->sendTextMessage(MSG_SMALLINFO, "Turn off secure mode if you really want to attack unmarked players.");
playerSetAttackedCreature(player, 0);
return;
}
}
#endif //_NG_BBK_PVP__[/CPP]
w funkcji:
[CPP]void Game:
nPvP(Creature* creature, Creature* attacked, bool murder)[/CPP]
pod:
[CPP]if (player->party != 0 && attackedPlayer->party != 0 && player->party == attackedPlayer->party)
return;[/CPP]
dodaj:
[CPP]#ifdef _NG_BBK_PVP__
bool pvpArena = false;
pvpArena = isPvpArena(player) && isPvpArena(attackedPlayer);
if (pvpArena)
return;
Creature *attackedCreature = getCreatureByID(player->attackedCreature);
if(player->atkMode == 0)
{
if(attackedCreature != attackedPlayer)
{
return;
}
}
if (player->atkMode == 1)
return;
#endif //_NG_BBK_PVP__[/CPP]
Na samym dole game.cpp dodaj:
[CPP]#ifdef _NG_BBK_PVP__
bool Game::isPvpArena(Creature* c)
{
if (!c)
return false;
Tile *tile = map->getTile(c->pos);
return tile && tile->isPvpArena();
}
#endif //_NG_BBK_PVP__[/CPP]
w game.h pod:
[CPP]class Game {
public:
Game();
~Game();[/CPP]
dodaj:
[CPP]#ifdef _NG_BBK_PVP__
bool isPvpArena(Creature* c);
#endif //_NG_BBK_PVP__[/CPP]
player.cpp pod:
[CPP]guildId = 0;[/CPP]
dodaj:
[CPP]#ifdef _NG_BBK_PVP__
atkMode = 0;
#endif //_NG_BBK_PVP__[/CPP]
w protocol76.cpp pod:
[CPP]void Protocol76:
arseModes(NetworkMessage &msg)[/CPP]
zamie?:
[CPP]#ifdef YUR_FIGHT_MODE
player->setFightMode(msg.GetByte());
#endif //YUR_FIGHT_MODE
//player->fightMode = msg.GetByte();
//player->followMode = msg.GetByte();
}[/CPP]
na:
[CPP]#ifdef YUR_FIGHT_MODE
player->setFightMode(msg.GetByte());
#endif //YUR_FIGHT_MODE
player->followMode = msg.GetByte();
#ifdef _NG_BBK_PVP__
player->atkMode = msg.GetByte();
#endif //_NG_BBK_PVP__
}[/CPP]
w player.h pod:
[CPP]class Player : public Creature
{
public:[/CPP]
dodaj:
[CPP]#ifdef _NG_BBK_PVP__
bool atkMode;
#endif //_NG_BBK_PVP__
char followMode;[/CPP]
nast?pnie zamie?:
[CPP]char fightMode, followMode;[/CPP]
na:
[CPP]char fightMode;[/CPP]
na koniec dodaj do projektu:
Kompilacja Ctrl+F11.
patrzenie:[ SKULL-KILL ]:
pod:
[CPP]if(attackPlayer->atkMode == 0 && attackPlayer->access <= g_config.ACCESS_PROTECT && !pvpArena)[/CPP]
zamie?:
[CPP]if(attackedCreature != targetPlayer)[/CPP]
na:
[CPP]if(attackedCreature != targetPlayer && targetPlayer->skullType == SKULL_NONE)[/CPP]
Testowane na zwyk?ym, czystym YurOTS, je?li posiadasz w?asn? edycje lub inny silnik, na wszelki wypadek stw?rz kopie zapasow? plik?w source.
2. Link do oryginalnego tematu: [7.6] Pvp System
3. Opis: Ode mnie info: Ostrzegam, ?e kod do ko?ca nie dzia?a dobrze tzn. niema w sieci nigdzie napisanego w 100% sprawnego PVP Systemu, ale niebawem si? taki pojawi pod t? wersje klienta, czyli 7.60
---------------------
Opis:
Bez r?czki(niezaci?ni?ta):
*Nie zabijesz nikogo z miecza ani z czaru.
*Gdy walniesz z czaru lub z runki i obok Ciebie stoi inny gracz to nie robi Ci si? skull,
Z zaci?ni?t? r?czka:
*Mo?esz bi? z czar?w, run lub z pi??ci tylko w zaznaczonego gracza.
(*Zabijesz wszystkich bez zaznaczania je?li maj? skull; patrz: skull-kill),
Fix:
*Po nieudanym atakowaniu nie pojawia si? pz,
*Na pvp arenie nie obowi?zuje nowy system pvp,
*Przy party r?wnie? nie obowi?zuje nowy system pvp,
*Access bez limit?w (config: accessprotect) mo?e atakowa? wszystkich po zaci?ni?ciu r?czki,
(je?i b?dzie mia? niezaci?ni?t? nie zaatakuje ?adnego gracza),
*Pvp arena: Brak skulli, po wyj?ciu nie mamy pz.
4. Kod:
Zaczynamy!
game.cpp pod:
[CPP]#ifdef YUR_RINGS_AMULETS
damage = applyAmulets(targetPlayer, damage, me->attackType);
#endif //YUR_RINGS_AMULETS[/CPP]
dodaj:
[CPP]#ifdef _NG_BBK_PVP__
pvpArena = isPvpArena(attackPlayer) && isPvpArena(targetPlayer);
Creature *monster = dynamic_cast<Monster*>(targetCreature);
if (damage > 0) {
Creature *targetMonster = dynamic_cast<Creature*>(targetCreature);
if(attackPlayer && attackPlayer->atkMode == 1 && !pvpArena)
{
if(targetPlayer == targetMonster)
{
if(targetPlayer->party == 0 || attackPlayer->party == 0 && attackPlayer->party != targetPlayer->party){
damage = 0;
}
}
}
}
if (attackPlayer && !monster && damage > 0) {
Creature *attackedCreature = game->getPlayerByID(attackPlayer->attackedCreature);
if(attackPlayer->atkMode == 0 && attackPlayer->access <= g_config.ACCESS_PROTECT && !pvpArena)
{
if(attackedCreature != targetPlayer)
{
if(targetPlayer->party == 0 || attackPlayer->party == 0 && attackPlayer->party != targetPlayer->party){
damage = 0;
}
}
}
}
#endif //_NG_BBK_PVP__[/CPP]
troszk? ni?ej pod:
[CPP]if (damage > 0) {
if(attackPlayer && attackPlayer->access < g_config.ACCESS_PROTECT) {[/CPP]
zamie?:
[CPP]if(targetPlayer && targetPlayer != attackPlayer && game->getWorldType() != WORLD_TYPE_NO_PVP)[/CPP]
na:
[CPP]#ifdef _NG_BBK_PVP__
if(targetPlayer && targetPlayer != attackPlayer && game->getWorldType() != WORLD_TYPE_NO_PVP && damage != 0 && !pvpArena)
#else
if(targetPlayer && targetPlayer != attackPlayer && game->getWorldType() != WORLD_TYPE_NO_PVP)
#endif //_NG_BBK_PVP__[/CPP]
zn?w troszke ni?ej pod:
[CPP]attackPlayer->pzLocked = true;
}[/CPP]
zamie?:
[CPP]if(targetCreature->access < g_config.ACCESS_PROTECT && targetPlayer && game->getWorldType() != WORLD_TYPE_NO_PVP)[/CPP]
na:
[CPP]#ifdef _NG_BBK_PVP__
if(targetCreature->access < g_config.ACCESS_PROTECT && targetPlayer && game->getWorldType() != WORLD_TYPE_NO_PVP && !pvpArena)
#else
if(targetCreature->access < g_config.ACCESS_PROTECT && targetPlayer && game->getWorldType() != WORLD_TYPE_NO_PVP)
#endif //_NG_BBK_PVP__[/CPP]
dalej w game.cpp, znajd?:
[CPP]case FIGHT_MAGICDIST:
if((std::abs(creature->pos.x-attackedCreature->pos.x) <= 8) &&
(std::abs(creature->pos.y-attackedCreature->pos.y) <= 5) &&
(creature->pos.z == attackedCreature->pos.z)) {
//if(map->canThrowItemTo(creature->pos, attackedCreature->pos, false, true))
if(map->canThrowObjectTo(creature->pos, attackedCreature->pos, BLOCK_PROJECTILE) == RET_NOERROR)
inReach = true;
}
break;
}[/CPP]
i pod tym, zmie? tak? linijk?:
[CPP]if (player && player->access < g_config.ACCESS_PROTECT)[/CPP]
na to:
[CPP]#ifdef _NG_BBK_PVP__
bool pvpArena = false;
pvpArena = isPvpArena(player) && isPvpArena(attackedPlayer);
if (player && player->access < g_config.ACCESS_PROTECT && !pvpArena)
#else
if (player && player->access < g_config.ACCESS_PROTECT)
#endif //_NG_BBK_PVP__[/CPP]
ni?ej pod:
[CPP]player->sendIcons();
if(attackedPlayer)
player->pzLocked = true;
}[/CPP]
zamie?:
[CPP]if(attackedPlayer && attackedPlayer->access < g_config.ACCESS_PROTECT)[/CPP]
na:
[CPP]#ifdef _NG_BBK_PVP__
if(attackedPlayer && attackedPlayer->access < g_config.ACCESS_PROTECT && !pvpArena)
#else
if(attackedPlayer && attackedPlayer->access < g_config.ACCESS_PROTECT)
#endif //_NG_BBK_PVP__[/CPP]
dalej game.cpp w funkcji:
[CPP]void Game::checkCreatureAttacking(unsigned long id)[/CPP]
znajd?:
[CPP]else {
if (creature->attackedCreature != 0)
{
Creature *attackedCreature = getCreatureByID(creature->attackedCreature);[/CPP]
i pod dodaj:
[CPP]#ifdef _NG_BBK_PVP__
Player *player = dynamic_cast<Player*>(creature);
Player *attackedPlayer = dynamic_cast<Player*>(attackedCreature);
bool pvpArena = false;
pvpArena = isPvpArena(player) && isPvpArena(attackedPlayer);
if(player && player->atkMode == 1 && attackedPlayer && !pvpArena) {
if(attackedPlayer->party == 0 || player->party == 0 && player->party != attackedPlayer->party){
player->sendCancelAttacking();
player->sendTextMessage(MSG_SMALLINFO, "Turn off secure mode if you really want to attack unmarked players.");
playerSetAttackedCreature(player, 0);
return;
}
}
#endif //_NG_BBK_PVP__[/CPP]
w funkcji:
[CPP]void Game:
nPvP(Creature* creature, Creature* attacked, bool murder)[/CPP]pod:
[CPP]if (player->party != 0 && attackedPlayer->party != 0 && player->party == attackedPlayer->party)
return;[/CPP]
dodaj:
[CPP]#ifdef _NG_BBK_PVP__
bool pvpArena = false;
pvpArena = isPvpArena(player) && isPvpArena(attackedPlayer);
if (pvpArena)
return;
Creature *attackedCreature = getCreatureByID(player->attackedCreature);
if(player->atkMode == 0)
{
if(attackedCreature != attackedPlayer)
{
return;
}
}
if (player->atkMode == 1)
return;
#endif //_NG_BBK_PVP__[/CPP]
Na samym dole game.cpp dodaj:
[CPP]#ifdef _NG_BBK_PVP__
bool Game::isPvpArena(Creature* c)
{
if (!c)
return false;
Tile *tile = map->getTile(c->pos);
return tile && tile->isPvpArena();
}
#endif //_NG_BBK_PVP__[/CPP]
w game.h pod:
[CPP]class Game {
public:
Game();
~Game();[/CPP]
dodaj:
[CPP]#ifdef _NG_BBK_PVP__
bool isPvpArena(Creature* c);
#endif //_NG_BBK_PVP__[/CPP]
player.cpp pod:
[CPP]guildId = 0;[/CPP]
dodaj:
[CPP]#ifdef _NG_BBK_PVP__
atkMode = 0;
#endif //_NG_BBK_PVP__[/CPP]
w protocol76.cpp pod:
[CPP]void Protocol76:
arseModes(NetworkMessage &msg)[/CPP]zamie?:
[CPP]#ifdef YUR_FIGHT_MODE
player->setFightMode(msg.GetByte());
#endif //YUR_FIGHT_MODE
//player->fightMode = msg.GetByte();
//player->followMode = msg.GetByte();
}[/CPP]
na:
[CPP]#ifdef YUR_FIGHT_MODE
player->setFightMode(msg.GetByte());
#endif //YUR_FIGHT_MODE
player->followMode = msg.GetByte();
#ifdef _NG_BBK_PVP__
player->atkMode = msg.GetByte();
#endif //_NG_BBK_PVP__
}[/CPP]
w player.h pod:
[CPP]class Player : public Creature
{
public:[/CPP]
dodaj:
[CPP]#ifdef _NG_BBK_PVP__
bool atkMode;
#endif //_NG_BBK_PVP__
char followMode;[/CPP]
nast?pnie zamie?:
[CPP]char fightMode, followMode;[/CPP]
na:
[CPP]char fightMode;[/CPP]
na koniec dodaj do projektu:
Kod:
-D_NG_BBK_PVP__
Kompilacja Ctrl+F11.
patrzenie:[ SKULL-KILL ]:
Kod:
Na wszelki wypadek, dla tych kt?rych opis pvp r??ni si? od opisu Conan'a przygotowa?em poprawke, kt?ra umo?liwia (przy zacisni?tej r?czce) zabijanie bez zaznaczania graczy kt?rzy posiadaj? skull..
pod:
[CPP]if(attackPlayer->atkMode == 0 && attackPlayer->access <= g_config.ACCESS_PROTECT && !pvpArena)[/CPP]
zamie?:
[CPP]if(attackedCreature != targetPlayer)[/CPP]
na:
[CPP]if(attackedCreature != targetPlayer && targetPlayer->skullType == SKULL_NONE)[/CPP]
Testowane na zwyk?ym, czystym YurOTS, je?li posiadasz w?asn? edycje lub inny silnik, na wszelki wypadek stw?rz kopie zapasow? plik?w source.