Mto bom
esse code
tem ate um tuto meu
pena q o evo retiro ele :S
flws :hi:
info
Grupo: Conde
Registrado: 18/12/05
Posts: 912
Reputação: +86
Gênero: Masculino
Char no Tibia: Kohzete

Mto bom
esse code
tem ate um tuto meu
pena q o evo retiro ele :S
flws :hi:
HiHo!
obg por trazer o code para o xTibia :]
irá ajudar muitas pessoas ![]()
bom trabalho ![]()
FlW
CyA!
Uffaa.. aleluia... axei x]
Manow, eu vo faze um baguiu moh rox,
vo usa o seu code de por uma parte pvp otra non.. e vo poder fazer uma ilha tpw do ragnarok.. "pvp island" xD
e tpw, vo poder dexar ot non e a arena funfando xD~
MT ROX ^^
por favor
fiz tudo certo
nem deu nada
player continua morrendo na arena
pega skull
se eu mandasse a pasta source do meu ot pra vc
vc configura pra mim?
msg ae aki ou pm
eu to sempre olhando ![]()
vlws
info
Grupo: Cavaleiro
Registrado: 04/09/06
Posts: 190
Reputação: +3
gogogo ao code
primeiramente, em tile.h, antes de:
#ifdef __PVP_ARENA__ #ifndef __PVP_ARENA_H__ #define __PVP_ARENA_H__ #include "tile.h" #include "position.h" #include <list> enum PvPArenaFlags_t { ARENA_FLAG_NONE = 0, ARENA_FLAG_NOSUMMONS = 2, ARENA_FLAG_MULTICOMBAT = 4, ARENA_FLAG_NO_FIELDS = 8, }; class PvPArena { public: PvPArena(); ~PvPArena(); int flags; Position exitPos; virtual bool canAdd(const Thing*); std::list<Creature*> arenaMembers; static bool loadArenas(); void removeCreature(Creature* cr, bool death = false); void addCreature(Creature* cr, bool isLogin = false); }; #endif //__PVP_ARENA_H__ #endif //__PVP_ARENA__cole o seguinte em pvparena.cpp:
#ifdef __PVP_ARENA__ #include "pvparena.h" #include "player.h" #include "configmanager.h" extern ConfigManager g_config; #include "game.h" extern Game g_game; #include "tools.h" #include <libxml/xmlmemory.h> #include <libxml/parser.h> PvPArena::PvPArena() { exitPos = Position(0, 0, 7); flags = 0; arenaMembers.clear(); } PvPArena::~PvPArena() { arenaMembers.clear(); } bool PvPArena::canAdd(const Thing* thing) { if(!thing) return false; if(const Creature* creature = thing->getCreature()) { if(!creature->isAttackable()) return true; if(flags & ARENA_FLAG_NOSUMMONS && creature->getMonster() != NULL) return false; else if(!(flags & ARENA_FLAG_MULTICOMBAT) && arenaMembers.size() > 2 && creature->getPlayer()) { std::list<Creature*>::iterator cit = std::find(arenaMembers.begin(), arenaMembers.end(), creature); if(cit == arenaMembers.end()) return false; } } else if(const Item* item = thing->getItem()) { if(!(flags & ARENA_FLAG_NO_FIELDS) && item->isMagicField()) return false; } return true; } bool PvPArena::loadArenas() { //system("PAUSE"); std::string filename = g_config.getString(ConfigManager::DATA_DIRECTORY) + "pvparenas.xml"; xmlDocPtr doc = xmlParseFile(filename.c_str()); if(!doc) return false; xmlNodePtr root, arenanode, tilenode; root = xmlDocGetRootElement(doc); if(xmlStrcmp(root->name,(const xmlChar*)"pvparenas") != 0){ xmlFreeDoc(doc); return false; } arenanode = root->children; while (arenanode){ if(xmlStrcmp(arenanode->name,(const xmlChar*)"pvparena") == 0) { PvPArena* newArena = new PvPArena(); int x, y, z; if(readXMLInteger(arenanode,"exitx",x) && readXMLInteger(arenanode,"exity",y) && readXMLInteger(arenanode,"exitz",z)) { newArena->exitPos = Position(x, y, z); } else { puts("ERROR: Missing/incomplete exit pos for pvparena! Skipping..."); delete newArena; arenanode = arenanode->next; continue; } std::string strValue; int intValue; if(readXMLString(arenanode,"allowsummons",strValue) && strValue == "no") newArena->flags |= ARENA_FLAG_NOSUMMONS; if(readXMLString(arenanode,"multi-combat",strValue) && strValue == "yes") newArena->flags |= ARENA_FLAG_MULTICOMBAT; if(readXMLString(arenanode,"allowfields",strValue) && strValue == "no") newArena->flags |= ARENA_FLAG_NO_FIELDS; tilenode = arenanode->children; while(tilenode) { if(xmlStrcmp(tilenode->name,(const xmlChar*)"tiles") == 0) { int tox, toy, toz; int fromx, fromy, fromz; if(readXMLInteger(tilenode,"tox",tox) && readXMLInteger(tilenode,"toy",toy) && readXMLInteger(tilenode,"toz",toz) && readXMLInteger(tilenode,"fromx",fromx) && readXMLInteger(tilenode,"fromy",fromy) && readXMLInteger(tilenode,"fromz",fromz)) { if(tox < fromx) std::swap(tox, fromx); if(toy < fromy) std::swap(toy, fromy); if(toz < fromz) std::swap(toz, fromz); for(int dx = fromx; dx <= tox; dx++) { for(int dy = fromy; dy <= toy; dy++) { for(int dz = fromz; dz <= toz; dz++) { if(Tile* t = g_game.getTile(dx, dy, dz)) { t->pvparena = newArena; t->setFlag(TILESTATE_PVP); t->setFlag(TILESTATE_NOSKULLS); } } } } } else puts("ERROR: incomplete tile range! Skipping..."); } tilenode = tilenode->next; } } arenanode = arenanode->next; } xmlFreeDoc(doc); return true; } void PvPArena::removeCreature(Creature* cr, bool death) { if(!cr) return; if(!cr->isAttackable()) return; std::list<Creature*>::iterator cit = std::find(arenaMembers.begin(), arenaMembers.end(), cr); if(cit != arenaMembers.end()) arenaMembers.erase(cit); if(death) { if(Player* pr = cr->getPlayer()) { if(g_game.internalTeleport(cr, exitPos) == RET_NOERROR) g_game.addMagicEffect(exitPos, NM_ME_ENERGY_AREA); pr->changeHealth(pr->getMaxHealth()); } else { g_game.removeCreature(cr); } } } void PvPArena::addCreature(Creature* cr, bool isLogin) { if(!cr) return; if(!cr->isAttackable()) return; // cant login on a pvp arena if(isLogin && cr->getPlayer()) { if(g_game.internalTeleport(cr, cr->getMasterPos()) == RET_NOERROR) { g_game.addMagicEffect(cr->getMasterPos(), NM_ME_ENERGY_AREA); return; } } arenaMembers.push_back(cr); } #endif //__PVP_ARENA__adicione aos parametros ALT+P
agora é so dar rebuild all CTRL+F11
Créditos: Nfries88
Como usar este código
1) Primeiramente, crie um novo arquivo na sua pasta DATA nomeado pvparenas.xml. (copiei qualquer arquivo xml apague tudo e renomei ele para pvparena.xml)
2) abra esse arquivo apague tudo se tiver algo.
3) cole isso
4a)Para criar uma arena nova, crie uma Tag como esta:
Substitua x, y, e z para as cordenadas para onde os players são teleportados quando perdem.
4b) para disabilitar o summon na arena adicione apenas:
antes do/> no Tag acima.
4c) para disabilitar os fields na arena adicione apenas:
antes do/> no Tag acima.
4d) Para permitir mais de dois combatentes nesta arena, adicionar apenas
antes do/> no Tag acima.
4e) Para ajustar os tiles da arena, crie uma Tag como está:
Substituir x1, y1, e z1 com as coordenadas do noroeste mais o andar mais baixo.
Substituir x2, y2, e z2 com as coordenadas do do sudeste mais o andar mais alto.
Créditos: Nfries88
Comentários Please
Editado Fevereiro 13 por lithium