Com esse code você pode fazer areas de pvp tipo uma parte do map pvp e outra non-pvp ^^
Vamos ao code gogogo =]
no final de game.cpp adicione
#ifdef __COMBAT_ZONES__ bool Game::loadCombatZones() { xmlDocPtr doc = xmlParseFile(std::string(g_config.getString(ConfigManager::DATA_DIRECTORY) + "pvpzones.xml").c_str()); if(!doc) return false; xmlNodePtr root, zone, tiles; root = xmlDocGetRootElement(doc); if(xmlStrcmp(root->name,(const xmlChar*)"zones")) { puts("MALFORMED PVP ZONES XML FILE!"); return false; } zone = root->children; while(zone) { if(!xmlStrcmp(zone->name,(const xmlChar*)"zone")) { tileflags_t pvplvl = TILESTATE_NONE; std::string strlvl; if(!readXMLString(zone, "pvp", strlvl)) { puts("ERROR: pvp zone missing pvp level!"); continue; } toLowerCaseString(strlvl); if(strlvl == "none" || strlvl == "no" || strlvl == "nopvp" || strlvl == "0") pvplvl = TILESTATE_NOPVP; else if(strlvl == "yes" || strlvl == "normal" || strlvl == "pvp" || strlvl == "1") pvplvl = TILESTATE_PVP; else if(strlvl == "enforced" || strlvl == "e" || strlvl == "pvp-enforced" || strlvl == "2") pvplvl = TILESTATE_PVP_ENFORCED; else { printf("ERROR: invalid pvp level: %s\n", strlvl.c_str()); continue; } tiles = zone->children; while(tiles) { if(!xmlStrcmp(tiles->name,(const xmlChar*)"tile")) { int x, y, z; if(readXMLInteger(tiles,"x",x) && readXMLInteger(tiles,"y",y) && readXMLInteger(tiles,"z",z)) { Tile* t = map->getTile(x, y, z); if(t) t->setFlag(pvplvl); } } else if(!xmlStrcmp(tiles->name,(const xmlChar*)"tiles")) { int tox, toy, toz, fromx, fromy, fromz; if(readXMLInteger(tiles,"tox",tox) && readXMLInteger(tiles,"toy",toy) && readXMLInteger(tiles,"toz",toz) && readXMLInteger(tiles,"fromx",fromx) && readXMLInteger(tiles,"fromy",fromy) && readXMLInteger(tiles,"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 x = fromx; x <= tox; x++) { for(int y = fromy; y <= toy; y++) { for(int z = fromz; z <= toz; z++) { Tile* t = map->getTile(x, y, z); if(t) t->setFlag(pvplvl); } } } } } tiles = tiles->next; } } zone = zone->next; } return true; } #endif //__COMBAT_ZONES__
em game.h, substitua:
#ifndef __COMBAT_ZONES__ WorldType_t getWorldType() const {return worldType;} #else WorldType_t getWorldType(const Creature* attacker = NULL, const Creature* target = NULL) const { if(!attacker || !target) return worldType; if(attacker->getPlayer() && target->getPlayer()) { if(worldType == WORLD_TYPE_NO_PVP) { if(attacker->getTile()->hasFlag(TILESTATE_PVP_ENFORCED) && target->getTile()->hasFlag(TILESTATE_PVP_ENFORCED)) return WORLD_TYPE_PVP_ENFORCED; else if(attacker->getTile()->hasFlag(TILESTATE_PVP) && target->getTile()->hasFlag(TILESTATE_PVP)) return WORLD_TYPE_PVP; } else { if(attacker->getTile()->hasFlag(TILESTATE_NOPVP) || target->getTile()->hasFlag(TILESTATE_NOPVP)) return WORLD_TYPE_NO_PVP; } } return worldType; } bool loadCombatZones(); #endif //__COMBAT_ZONES__
em tile.h depois de:
TILESTATE_HOUSE = 2
adcione:
#ifdef __COMBAT_ZONES__ , TILESTATE_NOPVP = 4, TILESTATE_PVP = 8, TILESTATE_PVP_ENFORCED = 16, #endif //__COMBAT_ZONES__
em combat.cpp, substituir:
if(g_game.getWorldType() == WORLD_TYPE_NO_PVP){
por:
if(g_game.getWorldType( #ifdef __COMBAT_ZONES__ attacker, target #endif //__COMBAT_ZONES__ ) == WORLD_TYPE_NO_PVP){
em player.cpp, na função Player::getGainedExperience, substituir:
if(g_game.getWorldType() == WORLD_TYPE_PVP_ENFORCED){
por:
if(g_game.getWorldType( #ifdef __COMBAT_ZONES__ attacker, this #endif //__COMBAT_ZONES__ ) == WORLD_TYPE_PVP_ENFORCED){
em otserv.cpp, depois de:
if(!g_game.loadMap(g_config.getString(ConfigManage r::MAP_FILE), g_config.getString(ConfigManager::MAP_KIND))){ return -1; }
adicione:
#ifdef __COMBAT_ZONES__ if(g_game.loadCombatZones()) puts(":: Loaded Combat Zones!"); #endif //__COMBAT_ZONES__
adicione aos parametros ALT+P
-D__COMBAT_ZONES__
agora é so dar rebuild all CTRL+F11
Créditos: Nfries88
copie qualquer arquivo .XML renomei para pvpzones, apague tudo que estiver escrito nele e cole isso, e coloque o dentro da pasta data.
<?xml version="1.0" encoding="UTF-8"?> <zones> <!--zone pvp="normal"> <tiles fromx="" fromy="" fromz="" tox="" toy="" toz="" /> </zone--> </zones>
em "zone pvp=" você pode usar "normal" = pvp "non"=non "pvp enforced"=pvp enforced