Ir para conteúdo

[7.92]combat/pvp Zoning


lithium

Posts Recomendados

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

Editado por lithium
Link para o comentário
Compartilhar em outros sites

HEUhuehueuhue

Cara Topico MT BOM x)

 

Eu passei a tarde td tentando faze pvp arena po meu ot 7.9.. nm consegui x(~

 

Mais esse code, vai ajuda pakas, MT BM ^^

 

EDITED------

Tipow cara, nao tem como vc hospedar os codes em um arquivo.text no rapidshare e colar o link no tuto ?!?! eh q aki em casa, a maioria das vezes que eu copio algum code do X-tibia, ele vem sem a formatação (enter e tals) =/

 

@topic

em otserv.cpp, depois de:

if(!g_game.loadMap(g_config.getString(ConfigManage r::MAP_FILE), g_config.getString(ConfigManager::MAP_KIND))){

return -1;

}

 

Aki esta errado, nao seria:

 

em otserv.cpp, depois de:

if(!g_game.loadMap(g_config.getString ConfigManager::MAP_FILE), g_config.getString(ConfigManager::MAP_KIND))){
return -1;
}

 

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

 

aki:

 

em "zone pvp=" você pode usar "normal" = pvp "non"=non "pvp enforced"=pvp enforced

 

esta errado nao eh non, e sim nopvp...

edita o seu topico ai.. :wink:

 

Aki nao funfou... =/

Xike-Ots...

 

Vlws~

 

OBS: Te Mandei uma MP

//Suboras

Editado por suboras
Link para o comentário
Compartilhar em outros sites

  • 1 year later...
  • 7 months later...
×
×
  • Criar Novo...