lithium 3 Postado Fevereiro 13, 2007 Share Postado Fevereiro 13, 2007 (editado) 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 -D__PVP_ARENA__ 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 <pvparenas> <!-- pvp arena tag here --> </pvparenas> 4a)Para criar uma arena nova, crie uma Tag como esta: <pvparena exitx="x" exity="y" exitz="z" /> 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: allowsummons="no" antes do/> no Tag acima. 4c) para disabilitar os fields na arena adicione apenas: allowfields="no" antes do/> no Tag acima. 4d) Para permitir mais de dois combatentes nesta arena, adicionar apenas multi-combat="yes" antes do/> no Tag acima. 4e) Para ajustar os tiles da arena, crie uma Tag como está: <tiles fromx="x1" fromy="y1" fromz="z1" tox="x2" toy="y2" toz="z2" /> 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, 2007 por lithium Link para o comentário Compartilhar em outros sites More sharing options...
tibiaa4e 86 Postado Fevereiro 13, 2007 Share Postado Fevereiro 13, 2007 Mto bom esse code tem ate um tuto meu pena q o evo retiro ele :S flws :hi: Link para o comentário Compartilhar em outros sites More sharing options...
frerety 7 Postado Fevereiro 13, 2007 Share Postado Fevereiro 13, 2007 HiHo! obg por trazer o code para o xTibia :] irá ajudar muitas pessoas bom trabalho FlW CyA! Link para o comentário Compartilhar em outros sites More sharing options...
suboras 0 Postado Fevereiro 14, 2007 Share Postado Fevereiro 14, 2007 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 ^^ Link para o comentário Compartilhar em outros sites More sharing options...
Trepaa 0 Postado Maio 3, 2007 Share Postado Maio 3, 2007 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 Link para o comentário Compartilhar em outros sites More sharing options...
Dart25 0 Postado Junho 10, 2008 Share Postado Junho 10, 2008 Este codigo funciona na verção 8.1????? Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados