Ir para conteúdo

[7.92]pvp Arena


lithium

Posts Recomendados

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 por lithium
Link para o comentário
Compartilhar em outros sites

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

  • 2 months later...

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

  • 1 year later...
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...