Jump to content
.HuRRiKaNe

C++ Monster Level TFS e OTX

Recommended Posts

Muito interessante esse sistema, torna o hunting mais desafiador e divertido, obrigado por compartilhar 

Share this post


Link to post
Share on other sites

@.HuRRiKaNe o bug do primeiro spawn dos monstros nascer tudo level 1 ta fixado?


🛠️ Projeto NTO NS 🛠️

📝 Detalhes 📝

🗺️ Mapa próprio em produção 🗺️

🖱️ Versão: 8.60 🖱️

🔥 War System 🔥

⚔️ Jutsus Próprios baseado no anime ⚔️

🔰 Itens com as características e efeitos do anime 🔰

💻 Para mais detalhes acesse as redes sociais do servidor abaixo 💻

💡 Usando como referencias Anime/Jogos/Wallpapers etc... para trazer algo mais próximo possível do universo de Naruto 💡

 

💎 Redes Sociais 💎

🌀 Facebook 🌀

🎒 Youtube 🎒
🌌 Discord 🌌

 

📚 Tutoriais / Conteúdos 📥

♨️ Clique Aqui ♨️

Share this post


Link to post
Share on other sites
58 minutos atrás, .HuRRiKaNe disse:

Testado em tfs 0.4!


Em monsters.h procure por:

  Mostrar conteúdo oculto

 

 



bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable,
   isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth;

 

E substitua por:



bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable,
   isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth, hideLevel;

 

Busque por:



int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction,
   maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities,
   lightLevel, lightColor, changeTargetSpeed, changeTargetChance;

 

Substitua por:



int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction,
   maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities,
   lightLevel, lightColor, changeTargetSpeed, changeTargetChance, levelMin, levelMax;

 

 


Em monsters.cpp procure por:

  Mostrar conteúdo oculto

 



canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = false;

 

Substitua por:



canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = hideLevel = false;

 

Busque por:



baseSpeed = 200;

 

Adicione abaixo:



levelMin = levelMax = 1;

 

Busque por:



bool Monsters::loadMonster

 

Você encontrara está função:



for(xmlNodePtr p = root->children; p; p = p->next)
   {
      if(p->type != XML_ELEMENT_NODE)
         continue;

      if(!xmlStrcmp(p->name, (const xmlChar*)"health"))
      {
         if(!readXMLInteger(p, "max", intValue))
         {
            SHOW_XML_ERROR("Missing health.max");
            monsterLoad = false;
            break;
         }

         mType->healthMax = intValue;
         if(!readXMLInteger(p, "now", intValue))
            mType->health = mType->healthMax;
         else
            mType->health = intValue;
      } 

 

Adicione abaixo:



else if(!xmlStrcmp(p->name, (const xmlChar*)"level"))
        {
            if(!readXMLInteger(p, "max", intValue))
                mType->levelMax = 1;
            else
                mType->levelMax = intValue;

            if(!readXMLInteger(p, "min", intValue))
                mType->levelMin = mType->levelMax;
            else
                mType->levelMin = intValue;
        }

 

Busque por:



if(readXMLString(tmpNode, "emblem", strValue))
   mType->guildEmblem = getEmblems(strValue);

 

Adicione abaixo:



if(readXMLString(tmpNode, "hidelevel", strValue))
        mType->hideLevel = booleanString(strValue);

 

 

 

 


Em monster.h procure por:

  Mostrar conteúdo oculto

 



class Monster : public Creature
{

 

E logo abaixo disto:



public:
#ifdef __ENABLE_SERVER_DIAGNOSTIC__
      static uint32_t monsterCount;
#endif
      virtual ~Monster();

 

Adicione:



std::string name, nameDescription;
int32_t level;
double bonusAttack, bonusDefense;

 

Busque por:



virtual const std::string& getName() const {return mType->name;}
virtual const std::string& getNameDescription() const {return mType->nameDescription;}
virtual std::string getDescription(int32_t) const {return mType->nameDescription + ".";}

 

Substitua por:



virtual const std::string& getName() const {return name;}
virtual const std::string& getNameDescription() const {return nameDescription;}
virtual std::string getDescription(int32_t) const {return nameDescription + ".";}

 

 

 

 

Em monster.cpp procure por:

  Mostrar conteúdo oculto

 



Monster::Monster(MonsterType* _mType):

 

E abaixo de:



isIdle = true;

 

Adicione:



name = _mType->name;
nameDescription = _mType->nameDescription;
level = (int32_t)random_range(_mType->levelMin, _mType->levelMax, DISTRO_NORMAL);
bonusAttack = 1.0;
bonusDefense = 1.0;

 

Busque por:



Monster::onCreatureAppear

 

Substitua toda a função por:



void Monster::onCreatureAppear(const Creature* creature)
{
   Creature::onCreatureAppear(creature);
   if(creature == this)
   {
      //We just spawned lets look around to see who is there.
      if(isSummon())
      {
            std::string value;
            this->master->getStorage((std::string)"monster_level", value);

            uint8_t intValue = atoi(value.c_str());
            if(intValue || value == "0")
                level = intValue;
            else
                level = 1;
         isMasterInRange = canSee(master->getPosition());
      }

        if(g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL))
        {
            this->healthMax = std::floor(this->getMaxHealth() * (1. + (0.1 * (level - 1))));
            this->health = this->healthMax;

            this->bonusAttack += (0.01 * (level - 1));
            this->bonusDefense += (0.005 * (level - 1));
        }



      updateTargetList();
      updateIdleStatus();
   }
   else
      onCreatureEnter(const_cast<Creature*>(creature));
}

 

Busque por:

 



g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE)

 

Substitua por:



g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE) * bonusDefense

 

Busque por:



g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK)

 

Substitua por:



g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK) * bonusAttack

 


Em map.cpp procure por:

  Mostrar conteúdo oculto

 



#include "game.h"

 

Adicione abaixo:



#include "configmanager.h" 

 

Busque por:



extern Game g_game;

 

Adicione abaixo:



extern ConfigManager g_config;

 

Busque por:



bool Map::placeCreature
{

 

Adicione abaixo:



Monster* monster = creature->getMonster();
    if(monster && g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL))
    {
        uint8_t level;
        if(!monster->getMonsterType()->hideLevel)
        {
            if(monster->isSummon())
            {
                std::string value;
                monster->getMaster()->getStorage((std::string)"monster_level", value);

                uint8_t intValue = atoi(value.c_str());
                if(intValue || value == "0")
                    level = intValue;
                else
                    level = 1;
            }
            else
                level = monster->level;

            char buffer [10];
            monster->name = monster->getName() + " [" + itoa(level, buffer, 10) + "]";
        }
    }

bool foundTile = false, placeInPz = false;
	Tile* tile = getTile(centerPos);
	if (tile && !extendedPos)
	{
		placeInPz = tile->hasFlag(TILESTATE_PROTECTIONZONE);
		uint32_t flags = FLAG_IGNOREBLOCKITEM;
		if (creature->isAccountManager())
			flags |= FLAG_IGNOREBLOCKCREATURE;

		ReturnValue ret = tile->__queryAdd(0, creature, 1, flags);
		if (forced || ret == RET_NOERROR || ret == RET_PLAYERISNOTINVITED)
			foundTile = true;
	}

	size_t shufflePos = 0;
	PairVector relList;
	if (extendedPos)
	{
		shufflePos = 8;
		relList.push_back(PositionPair(-2, 0));
		relList.push_back(PositionPair(0, -2));
		relList.push_back(PositionPair(0, 2));
		relList.push_back(PositionPair(2, 0));
		std::random_shuffle(relList.begin(), relList.end());
	}

	relList.push_back(PositionPair(-1, -1));
	relList.push_back(PositionPair(-1, 0));
	relList.push_back(PositionPair(-1, 1));
	relList.push_back(PositionPair(0, -1));
	relList.push_back(PositionPair(0, 1));
	relList.push_back(PositionPair(1, -1));
	relList.push_back(PositionPair(1, 0));
	relList.push_back(PositionPair(1, 1));
	std::random_shuffle(relList.begin() + shufflePos, relList.end());

	uint32_t radius = 1;
	Position tryPos;
	for (uint32_t n = 1; n <= radius && !foundTile; ++n)
	{
		for (PairVector::iterator it = relList.begin(); it != relList.end() && !foundTile; ++it)
		{
			int32_t dx = it->first * n, dy = it->second * n;
			tryPos = centerPos;

			tryPos.x = tryPos.x + dx;
			tryPos.y = tryPos.y + dy;
			if (!(tile = getTile(tryPos)) || (placeInPz && !tile->hasFlag(TILESTATE_PROTECTIONZONE)))
				continue;

			if (tile->__queryAdd(0, creature, 1, 0) == RET_NOERROR)
			{
				if (!extendedPos)
				{
					foundTile = true;
					break;
				}

				if (isSightClear(centerPos, tryPos, false))
				{
					foundTile = true;
					break;
				}
			}
		}
	}

	if (!foundTile)
		return false;

	int32_t index = 0;
	uint32_t flags = 0;

	Item* toItem = NULL;
	if (Cylinder* toCylinder = tile->__queryDestination(index, creature, &toItem, flags))
	{
		toCylinder->__internalAddThing(creature);
		if (Tile* toTile = toCylinder->getTile())
			toTile->qt_node->addCreature(creature);
	}

	return true;
}

 

 

 


Em configmanager.h busque por;

  Mostrar conteúdo oculto

 



MONSTER_SPAWN_WALKBACK,

 

Adicione abaixo:



MONSTER_HAS_LEVEL,

 

 


Em configmanager.cpp busque por:

  Mostrar conteúdo oculto

 



m_loaded = true;

 

Adicione abaixo:



m_confBool[MONSTER_HAS_LEVEL] = getGlobalBool("monsterHasLevel", true);

 

 

 

 

Agora no config.lua adicione:


monsterHasLevel = true

Como está programado, a cada nível, monstros ganham 10% de HP, 1% de dano e 0.5% de defesa.
Para configurar o level minimo e máximo do monstro basta adicionar no XML do monstro a tag:


<level min="1" max="10"/>


 

Oque esse sistema faz? não tem nada explicando sobre poderia dizer?

Share this post


Link to post
Share on other sites
1 hora atrás, luanluciano93 disse:

serve para todas a versões do TFS e OTX? Se você só testou em TFS 0.4 coloque no título TFS 0.4.

 

Pronto!

 

42 minutos atrás, LeoTK disse:

@.HuRRiKaNe o bug do primeiro spawn dos monstros nascer tudo level 1 ta fixado?

 

Para fixar isso basta ir em spawn.cpp e procurar pela função:

bool Spawn::spawnMonster(uint32_t spawnId, MonsterType* mType, const Position& pos, Direction dir, bool startup /*= false*/)

 

Acima de:

spawnedMap.insert(SpawnedPair(spawnId, monster));

 

Adicionar:

monster->onCreatureAppear(monster);

 

41 minutos atrás, OinomedRellik disse:

Oque esse sistema faz? não tem nada explicando sobre poderia dizer?

É um sistema de level para os monstros que a cada nível, ps monstros ganham 10% de HP, 1% de dano e 0.5% de defesa.


x1fCxnI.png

Share this post


Link to post
Share on other sites
1 hora atrás, .HuRRiKaNe disse:

Pronto!

 

 

Para fixar isso basta ir em spawn.cpp e procurar pela função:


bool Spawn::spawnMonster(uint32_t spawnId, MonsterType* mType, const Position& pos, Direction dir, bool startup /*= false*/)

 

Acima de:


spawnedMap.insert(SpawnedPair(spawnId, monster));

 

Adicionar:


monster->onCreatureAppear(monster);

 

É um sistema de level para os monstros que a cada nível, ps monstros ganham 10% de HP, 1% de dano e 0.5% de defesa.

então os monstros que nasce vão ter niveis e quanto maior o nivel do monstro que deu spawn mais forte ele será?

Share this post


Link to post
Share on other sites
3 minutos atrás, OinomedRellik disse:

então os monstros que nasce vão ter niveis e quanto maior o nivel do monstro que deu spawn mais forte ele será?

Isso!


x1fCxnI.png

Share this post


Link to post
Share on other sites

Boa noite, na hora de compilar deu esse erro.

 

map.cpp: In member function bool Map::placeCreature(const Position&, Creature*, bool, bool)’:
map.cpp:210:79: error: itoa was not declared in this scope
      monster->name = monster->getName() + " [" + itoa(level, buffer, 10) + "]";
                                                                        ^
Makefile:40: recipe for target 'obj/map.o' failed
make: *** [obj/map.o] Error 1


Acabei de perceber que esta escrito errado em vez de "itoa" é "atoi"
vou apagar a pasta obj, e recompilar 😃
Obrigado pelo sistema!

Edited by Ackerzin (see edit history)

       112674.gif

 

 

 

Share this post


Link to post
Share on other sites

@.HuRRiKaNe pra uma atualização boa ou mais futura seria legal trazer também quanto maior o nivel da criatura mais exp em porcentagem daria exemplo 10% ou 20% a mais de exp por level, assim valeria a pena caçar criaturas de nível mais forte porém da mesma raça saca


🛠️ Projeto NTO NS 🛠️

📝 Detalhes 📝

🗺️ Mapa próprio em produção 🗺️

🖱️ Versão: 8.60 🖱️

🔥 War System 🔥

⚔️ Jutsus Próprios baseado no anime ⚔️

🔰 Itens com as características e efeitos do anime 🔰

💻 Para mais detalhes acesse as redes sociais do servidor abaixo 💻

💡 Usando como referencias Anime/Jogos/Wallpapers etc... para trazer algo mais próximo possível do universo de Naruto 💡

 

💎 Redes Sociais 💎

🌀 Facebook 🌀

🎒 Youtube 🎒
🌌 Discord 🌌

 

📚 Tutoriais / Conteúdos 📥

♨️ Clique Aqui ♨️

Share this post


Link to post
Share on other sites
Spoiler

map.cpp:210:79: note:   mismatched types ‘const __gnu_cxx::__normal_iterator<_Iterator, _Container>’ and ‘int’
             monster->name = monster->getName() + " [" + atoi(level, buffer, 10) + "]";
                                                                               ^
cc1plus: all warnings being treated as errors
make: *** [obj/map.o] Error 1


 

meu dá esse error

Share this post


Link to post
Share on other sites
9 minutos atrás, OinomedRellik disse:
  Mostrar conteúdo oculto

map.cpp:210:79: note:   mismatched types ‘const __gnu_cxx::__normal_iterator<_Iterator, _Container>’ and ‘int’
             monster->name = monster->getName() + " [" + atoi(level, buffer, 10) + "]";
                                                                               ^
cc1plus: all warnings being treated as errors
make: *** [obj/map.o] Error 1


 

meu dá esse error

Arrumado no tópico, tinha uma linha errada.


x1fCxnI.png

Share this post


Link to post
Share on other sites
12 minutos atrás, .HuRRiKaNe disse:

Arrumado no tópico, tinha uma linha errada.

eu tenho uma duvida, essa parte do map.cpp é pra substituir né? porque se por abaixo de todo o codigo citado ele não vai funcionar eu acho

 

 

mesmo error 

Spoiler

map.cpp:210:79: note:   mismatched types ‘const __gnu_cxx::__normal_iterator<_Iterator, _Container>’ and ‘int’
             monster->name = monster->getName() + " [" + atoi(level, buffer, 10) + "]";
                                                                               ^
cc1plus: all warnings being treated as errors
make: *** [obj/map.o] Error 1
 

 

Edited by OinomedRellik (see edit history)

Share this post


Link to post
Share on other sites
2 horas atrás, OinomedRellik disse:

eu tenho uma duvida, essa parte do map.cpp é pra substituir né? porque se por abaixo de todo o codigo citado ele não vai funcionar eu acho

 

 

mesmo error 

  Ocultar conteúdo

map.cpp:210:79: note:   mismatched types ‘const __gnu_cxx::__normal_iterator<_Iterator, _Container>’ and ‘int’
             monster->name = monster->getName() + " [" + atoi(level, buffer, 10) + "]";
                                                                               ^
cc1plus: all warnings being treated as errors
make: *** [obj/map.o] Error 1
 

 

Usa essa e delete a pasta obj:

Spoiler

 


bool Map::placeCreature(const Position& centerPos, Creature* creature, bool extendedPos /*= false*/, bool forced /*= false*/)
{

 Monster* monster = creature->getMonster();    
   if(monster && g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL))    {        
   uint8_t level;       
    if(!monster->getMonsterType()->hideLevel)        {            
    if(monster->isSummon())            {                
    std::string value;//                
    monster->getMaster()->getStorage((uint32_t)"1996", value);                  
    monster->getMaster()->getStorage((uint32_t)"1996", value);                
    uint8_t intValue = atoi(value.c_str());                
    if(intValue || value == "0")                    
    level = intValue;                
    else                    
    level = 1;            }            
    else                
    level = monster->level;            
    char buffer [10];            
    monster->name = monster->getName() + " [" + atoi(level, buffer, 10) + "]";        }    }



	bool foundTile = false, placeInPz = false;
	Tile* tile = getTile(centerPos);
	if(tile)
	{
		placeInPz = tile->hasFlag(TILESTATE_PROTECTIONZONE);
		uint32_t flags = FLAG_IGNOREBLOCKITEM;
		if(creature->isAccountManager())
			flags |= FLAG_IGNOREBLOCKCREATURE;

		ReturnValue ret = tile->__queryAdd(0, creature, 1, flags);
		if(forced || ret == RET_NOERROR || ret == RET_PLAYERISNOTINVITED)
			foundTile = true;
	}

	size_t shufflePos = 0;
	PairVector relList;
	if(extendedPos)
	{
		shufflePos = 8;
		relList.push_back(PositionPair(-2, 0));
		relList.push_back(PositionPair(0, -2));
		relList.push_back(PositionPair(0, 2));
		relList.push_back(PositionPair(2, 0));
		std::random_shuffle(relList.begin(), relList.end());
	}

	relList.push_back(PositionPair(-1, -1));
	relList.push_back(PositionPair(-1, 0));
	relList.push_back(PositionPair(-1, 1));
	relList.push_back(PositionPair(0, -1));
	relList.push_back(PositionPair(0, 1));
	relList.push_back(PositionPair(1, -1));
	relList.push_back(PositionPair(1, 0));
	relList.push_back(PositionPair(1, 1));
	std::random_shuffle(relList.begin() + shufflePos, relList.end());

	uint32_t radius = 1;
	Position tryPos;
	for(uint32_t n = 1; n <= radius && !foundTile; ++n)
	{
		for(PairVector::iterator it = relList.begin(); it != relList.end() && !foundTile; ++it)
		{
			int32_t dx = it->first * n, dy = it->second * n;
			tryPos = centerPos;

			tryPos.x = tryPos.x + dx;
			tryPos.y = tryPos.y + dy;
			if(!(tile = getTile(tryPos)) || (placeInPz && !tile->hasFlag(TILESTATE_PROTECTIONZONE)))
				continue;

			if(tile->__queryAdd(0, creature, 1, 0) == RET_NOERROR)
			{
				if(!extendedPos)
				{
					foundTile = true;
					break;
				}

				if(isSightClear(centerPos, tryPos, false))
				{
					foundTile = true;
					break;
				}
			}
		}
	}

 

 

 

 


x1fCxnI.png

Share this post


Link to post
Share on other sites
1 hora atrás, .HuRRiKaNe disse:

Usa essa e delete a pasta obj:

  Mostrar conteúdo oculto

 



bool Map::placeCreature(const Position& centerPos, Creature* creature, bool extendedPos /*= false*/, bool forced /*= false*/)
{

 Monster* monster = creature->getMonster();    
   if(monster && g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL))    {        
   uint8_t level;       
    if(!monster->getMonsterType()->hideLevel)        {            
    if(monster->isSummon())            {                
    std::string value;//                
    monster->getMaster()->getStorage((uint32_t)"1996", value);                  
    monster->getMaster()->getStorage((uint32_t)"1996", value);                
    uint8_t intValue = atoi(value.c_str());                
    if(intValue || value == "0")                    
    level = intValue;                
    else                    
    level = 1;            }            
    else                
    level = monster->level;            
    char buffer [10];            
    monster->name = monster->getName() + " [" + atoi(level, buffer, 10) + "]";        }    }



	bool foundTile = false, placeInPz = false;
	Tile* tile = getTile(centerPos);
	if(tile)
	{
		placeInPz = tile->hasFlag(TILESTATE_PROTECTIONZONE);
		uint32_t flags = FLAG_IGNOREBLOCKITEM;
		if(creature->isAccountManager())
			flags |= FLAG_IGNOREBLOCKCREATURE;

		ReturnValue ret = tile->__queryAdd(0, creature, 1, flags);
		if(forced || ret == RET_NOERROR || ret == RET_PLAYERISNOTINVITED)
			foundTile = true;
	}

	size_t shufflePos = 0;
	PairVector relList;
	if(extendedPos)
	{
		shufflePos = 8;
		relList.push_back(PositionPair(-2, 0));
		relList.push_back(PositionPair(0, -2));
		relList.push_back(PositionPair(0, 2));
		relList.push_back(PositionPair(2, 0));
		std::random_shuffle(relList.begin(), relList.end());
	}

	relList.push_back(PositionPair(-1, -1));
	relList.push_back(PositionPair(-1, 0));
	relList.push_back(PositionPair(-1, 1));
	relList.push_back(PositionPair(0, -1));
	relList.push_back(PositionPair(0, 1));
	relList.push_back(PositionPair(1, -1));
	relList.push_back(PositionPair(1, 0));
	relList.push_back(PositionPair(1, 1));
	std::random_shuffle(relList.begin() + shufflePos, relList.end());

	uint32_t radius = 1;
	Position tryPos;
	for(uint32_t n = 1; n <= radius && !foundTile; ++n)
	{
		for(PairVector::iterator it = relList.begin(); it != relList.end() && !foundTile; ++it)
		{
			int32_t dx = it->first * n, dy = it->second * n;
			tryPos = centerPos;

			tryPos.x = tryPos.x + dx;
			tryPos.y = tryPos.y + dy;
			if(!(tile = getTile(tryPos)) || (placeInPz && !tile->hasFlag(TILESTATE_PROTECTIONZONE)))
				continue;

			if(tile->__queryAdd(0, creature, 1, 0) == RET_NOERROR)
			{
				if(!extendedPos)
				{
					foundTile = true;
					break;
				}

				if(isSightClear(centerPos, tryPos, false))
				{
					foundTile = true;
					break;
				}
			}
		}
	}

 

 

 

 

deu mais um error, percebi que faltava >>>   }   <<< e ocorreu esse error depois de compilar novamente.

Spoiler


map.cpp:206:71: note:   mismatched types ‘const __gnu_cxx::__normal_iterator<_Iterator, _Container>’ and ‘int’
     monster->name = monster->getName() + " [" + atoi(level, buffer, 10) + "]";        }    }
                                                                       ^
map.cpp:276:1: error: no return statement in function returning non-void [-Werror=return-type]
 }
 ^
cc1plus: all warnings being treated as errors
make: *** [obj/map.o] Error 1
 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Similar Content

    • By mjokreaxasa
      https://gyazo.com/9339df0b4b4b2fe412b09a049dc1c42e
       
       
                                          /\
                                       GIFT
       
      Como posso solucionar?
    • By Yan Liima
      Salve meus queridos, tudo bom? Hoje decidi trazer uma pequena alteração na source. Vi que muita galera tem problemas com o limite do caracter da função doShowTextDialog, pois se excender o limite maximo de caractere da debug no client.
      Isso ocorre principalmente pra galera do derivado que costuma utilizar !spells/!tecnicas/!jutsu para checar os ataques disponiveis que existe pra tal personagem. 
      Se você é GOD, você consegue visualizar todas as spells do servidor , e se no servidor existir muitas, irá causar debug.
      Diferente do doPlayerPopupFYI, não há uma proteção de limite para TextDialog...
       
      Primeiramente, como que eu descobri?
      Seguinte, eu coloquei o máximo de spells possiveis, ou seja, o máximo de caracteres possiveis na caixinha de texto.
      Quando eu vi que começou dar debug no cliente, eu retirei alguns caracteres e fui testando.

      Até que consigui achar o valor máximo!
      Eu copiei tudo que estava na janela, e em um site online colei todo o conteúdo de lá para saber quantos caracteres existiam ali.
      E esse foi o resultado:

       
      8192, descobrimos o máximo de caracteres no doShowTextDialog.
      Após descobrir este valor, eu procurei nas sources e achei!
       
      ENTÃO VAMOOOS LÁ!
      TFS
       
      OTX
       
      Prontinho! Simples, não? haha
    • By L3K0T
      L3K0Ttfs 0.4
       
      Bom galera hoje vim trazer para aqueles que não tem em seu tfs a função DoSetCreatureLight, é uma função de LUZ, alguns tfs tem e outros não tem então resolvi compartilhar.
       
      abra seu luascript.cpp e procure por:
       
      lua_register(m_luaState, "getCreatureHealth", LuaInterface::luaGetCreatureHealth); em baixo add
      //doSetCreatureLight(cid, lightLevel, lightColor, time) lua_register(m_luaState, "doSetCreatureLight", LuaInterface::luaDoSetCreatureLight); Procure;;
      int32_t LuaInterface::luaGetThingFromPos(lua_State* L) { //getThingFromPos(pos[, displayError = true]) //Note: // stackpos = 255- top thing (movable item or creature) // stackpos = 254- magic field // stackpos = 253- top creature bool displayError = true; if(lua_gettop(L) > 1) displayError = popNumber(L); PositionEx pos; popPosition(L, pos); ScriptEnviroment* env = getEnv(); Thing* thing = NULL; if(Tile* tile = g_game.getMap()->getTile(pos)) { if(pos.stackpos == 255) { if(!(thing = tile->getTopCreature())) { Item* item = tile->getTopDownItem(); if(item && item->isMovable()) thing = item; } } else if(pos.stackpos == 254) thing = tile->getFieldItem(); else if(pos.stackpos == 253) thing = tile->getTopCreature(); else thing = tile->__getThing(pos.stackpos); if(thing) pushThing(L, thing, env->addThing(thing)); else pushThing(L, NULL, 0); return 1; } if(displayError) errorEx(getError(LUA_ERROR_TILE_NOT_FOUND)); pushThing(L, NULL, 0); return 1; } em baixo add;;
       
      int32_t LuaInterface::luaDoSetCreatureLight(lua_State* L) { //doSetCreatureLight(cid, lightLevel, lightColor, time) uint32_t time = popNumber(L); uint8_t color = (uint8_t)popNumber(L); uint8_t level = (uint8_t)popNumber(L); uint32_t cid = popNumber(L); ScriptEnviroment* env = getEnv(); Creature* creature = env->getCreatureByUID(cid); if(creature) { Condition* condition = Condition::createCondition(CONDITIONID_COMBAT, CONDITION_LIGHT, time, level | (color << 8)); creature->addCondition(condition); lua_pushboolean(L, true); } else { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } return 1; }  
      Agora em Luascript.h procure por:;;
      static int32_t luaCanPlayerWearOutfit(lua_State* L); em baixo add;;
      static int32_t luaDoSetCreatureLight(lua_State *L);  
      salva tudo em compila no modo rebuild.
       
       
      Usando em Summons;;
      doSetCreatureLight(getCreatureSummons(cid)[1], 10, 215, 60*1000) Usando em players;;
      doSetCreatureLight(cid, 9, 65, 10*60*1000) usando em Equipe;;
      function onEquip(cid, item, slot) doSetCreatureLight(cid, 9, 65, 10*60*1000) end function onDeEquip(cid, item, slot) doSetCreatureLight(cid, 7, 215, 1*1000) end Espero que gostem  
    • By Yan Liima
      #Introdução
      Bom hoje estarei trazendo aqui o sistema de Ping feito pelo Mock, com uma pequena adaptação feita por mim para funcionar em TFS 0.4(talvez podendo funcionar em outras)
      Pois o que ele disponibilizou foi apenas para TFS 0.3.6 e nem foi muito utilizado pela comunidade. Muitos servidores daqui para download tem script no talk mas a lib está totalmente errada e não tem o code nas sources.
      Esse sistema tem varias utilizades, podendo usar o comando !ping para verificar seu ms ou até mesmo por para kikar jogadores com ms muito alto...
      Se você não sabe o cliente já tem um sistema de ping, e getOtsystime é como os.time () + os.clock (), você tem ano, mês, dia, hora, minutos, segundos, milisegundos...
      Enfim chega de enrolação e vamos lá!
       
      Code para TFS 0.4 e OTX:
       
      Code para TFS 0.3.6
       
      LIB:
       
       
      Prontinho, agora seu servidor está pronto para utilizar as funções de Ping. Seja criativo!
      Ahh você é daqueles que quer tudo na mão né? Aqui vai um talkactions para ver o ping.
       
      Em talkactions/scripts crie um arquivo chamado playerping.lua, cole isto dentro:
      -- Script by Yan Liima(Night for tibiaking.com) function onSay(cid, words, param, channel) local ms = ping.CheckPing(cid) doPlayerSendTextMessage(cid,22,"Ping aproximado --> ["..ms.."].") return true end Em talkactions.xml
      <talkaction words="!ping" event="script" value="playerping.lua"/>  
    • By L3K0T
      EXPLICAÇÃO/RESUMO
       
      Bom galera esse sistema foi fixado por mim e resolvi trazer pra vocês o UPDATE contendo 2 moveitem pra funcionar perfeitamente ao seu jogo, esses sistemas tem a obrigação de parar players que jogam lixo na porta da sua casa, em cima do seu depot, em teleportes, e aonde você não queira. "somente dono, sub, e convidados podem jogar lixo ou mover items da sua casa" é um pacotão completo e revisado que vai evitar engraçadinhos bugar seu server.
       
      lixo no dp
       

      2020-05-21 23-20-34.mp4  
      lixo house
       
       

      2020-05-21 23-22-35.mp4  
       
       

      TUTORIAL BY L3K0T
      1° abra seu creatureevents.cpp com o editor de sua preferencia. "eu uso notepad++"
       
      ache:
      case CREATURE_EVENT_PREPAREDEATH: return "cid, deathList"; em baixo coloca:
      case CREATURE_EVENT_MOVEITEM: return "moveItem, frompos, topos, cid"; case CREATURE_EVENT_MOVEITEM2: return "cid, item, count, toContainer, fromContainer, fromPos, toPos";  
       
      ache:
      case CREATURE_EVENT_PREPAREDEATH: return "onPrepareDeath"; em baixo coloca:
      case CREATURE_EVENT_MOVEITEM: return "onMoveItem"; case CREATURE_EVENT_MOVEITEM2: return "onMoveItem2";  
      ache:
      else if(tmpStr == "preparedeath") m_type = CREATURE_EVENT_PREPAREDEATH; em baixo coloca:
      else if(tmpStr == "moveitem") m_type = CREATURE_EVENT_MOVEITEM; else if(tmpStr == "moveitem2") m_type = CREATURE_EVENT_MOVEITEM2;  
       
      ache:
       
      bool CreatureEvents::playerLogout(Player* player, bool forceLogout) { //fire global event if is registered bool result = true; for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) { if((*it)->getEventType() == CREATURE_EVENT_LOGOUT && (*it)->isLoaded() && !(*it)->executeLogout(player, forceLogout) && result) result = false; } return result; } em baixo coloca: ATENÇÃO PRA TFS 0.4 USE ESSE ABAIXO
      uint32_t CreatureEvent::executeMoveItem2(Player* player, Item* item, uint8_t count, const Position& fromPos, const Position& toPos, Item* toContainer, Item* fromContainer, int16_t fstack) { //onMoveItem(cid, item, count, toContainer, fromContainer, fromPos, toPos) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(player->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; env->streamThing(scriptstream, "item", item, env->addThing(item)); scriptstream << "local count = " << count << std::endl; env->streamThing(scriptstream, "toContainer", toContainer, env->addThing(toContainer)); env->streamThing(scriptstream, "fromContainer", fromContainer, env->addThing(fromContainer)); env->streamPosition(scriptstream, "fromPos", fromPos, fstack); env->streamPosition(scriptstream, "toPos", toPos, 0); scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[30]; sprintf(desc, "%s", player->getName().c_str()); env->setEvent(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(player->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); LuaInterface::pushThing(L, item, env->addThing(item)); lua_pushnumber(L, count); LuaInterface::pushThing(L, toContainer, env->addThing(toContainer)); LuaInterface::pushThing(L, fromContainer, env->addThing(fromContainer)); LuaInterface::pushPosition(L, fromPos, fstack); LuaInterface::pushPosition(L, toPos, 0); bool result = m_interface->callFunction(7); m_interface->releaseEnv(); return result; } } else { std::clog << "[Error - CreatureEvent::executeMoveItem] Call stack overflow." << std::endl; return 0; } } uint32_t CreatureEvents::executeMoveItems(Creature* actor, Item* item, const Position& frompos, const Position& pos) { for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) { if((*it)->getEventType() == CREATURE_EVENT_MOVEITEM) { if(!(*it)->executeMoveItem(actor, item, frompos, pos)) return 0; } } return 1; } uint32_t CreatureEvent::executeMoveItem(Creature* actor, Item* item, const Position& frompos, const Position& pos) { if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(pos); std::stringstream scriptstream; env->streamThing(scriptstream, "moveItem", item, env->addThing(item)); env->streamPosition(scriptstream, "position", frompos, 0); env->streamPosition(scriptstream, "position", pos, 0); scriptstream << "local cid = " << env->addThing(actor) << std::endl; scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(pos); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); LuaInterface::pushThing(L, item, env->addThing(item)); LuaInterface::pushPosition(L, frompos, 0); LuaInterface::pushPosition(L, pos, 0); lua_pushnumber(L, env->addThing(actor)); bool result = m_interface->callFunction(4); m_interface->releaseEnv(); return result; } } else { std::clog << "[Error - CreatureEvent::executeMoveItem] Call stack overflow." << std::endl; return 0; } }  
      ATENÇÃO PRA TFS 0.3.6 USE ESSE ABAIXO
      uint32_t CreatureEvent::executeMoveItem2(Player* player, Item* item, uint8_t count, const Position& fromPos, const Position& toPos, Item* toContainer, Item* fromContainer, int16_t fstack) { //onMoveItem(cid, item, count, toContainer, fromContainer, fromPos, toPos) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(player->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; env->streamThing(scriptstream, "item", item, env->addThing(item)); scriptstream << "local count = " << count << std::endl; env->streamThing(scriptstream, "toContainer", toContainer, env->addThing(toContainer)); env->streamThing(scriptstream, "fromContainer", fromContainer, env->addThing(fromContainer)); env->streamPosition(scriptstream, "fromPos", fromPos, fstack); env->streamPosition(scriptstream, "toPos", toPos, 0); scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[30]; sprintf(desc, "%s", player->getName().c_str()); env->setEvent(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(player->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); LuaScriptInterface::pushThing(L, item, env->addThing(item)); lua_pushnumber(L, count); LuaScriptInterface::pushThing(L, toContainer, env->addThing(toContainer)); LuaScriptInterface::pushThing(L, fromContainer, env->addThing(fromContainer)); LuaScriptInterface::pushPosition(L, fromPos, fstack); LuaScriptInterface::pushPosition(L, toPos, 0); bool result = m_interface->callFunction(7); m_interface->releaseEnv(); return result; } } else { std::clog << "[Error - CreatureEvent::executeMoveItem] Call stack overflow." << std::endl; return 0; } } uint32_t CreatureEvents::executeMoveItems(Creature* actor, Item* item, const Position& frompos, const Position& pos) { // fire global event if is registered for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) { if(it->second->getEventType() == CREATURE_EVENT_MOVEITEM){ if(!it->second->executeMoveItem(actor,item,frompos,pos)) return 0; } } return 1; } uint32_t CreatureEvent::executeMoveItem(Creature* actor, Item* item, const Position& frompos, const Position& pos) { if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(pos); std::stringstream scriptstream; env->streamThing(scriptstream, "moveItem", item, env->addThing(item)); env->streamPosition(scriptstream, "position", frompos, 0); env->streamPosition(scriptstream, "position", pos, 0); scriptstream << "local cid = " << env->addThing(actor) << std::endl; scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(pos); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); LuaScriptInterface::pushThing(L, item, env->addThing(item)); LuaScriptInterface::pushPosition(L, frompos, 0); LuaScriptInterface::pushPosition(L, pos, 0); lua_pushnumber(L, env->addThing(actor)); bool result = m_interface->callFunction(4); m_interface->releaseEnv(); return result; } } else { std::clog << "[Error - CreatureEvent::executeMoveItem] Call stack overflow." << std::endl; return 0; } }  
       
      2°  agora em creatureevetns.h
       
      Ache:
      CREATURE_EVENT_PREPAREDEATH, em baixo coloca:
      CREATURE_EVENT_MOVEITEM, CREATURE_EVENT_MOVEITEM2,  
      ache:
      uint32_t executePrepareDeath(Creature* creature, DeathList deathList); em baixo coloca:
      uint32_t executeMoveItem(Creature* actor, Item* item, const Position& frompos, const Position& pos); uint32_t executeMoveItem2(Player* player, Item* item, uint8_t count, const Position& fromPos, const Position& toPos, Item* toContainer, Item* fromContainer, int16_t fstack);  
      ache:
      bool playerLogout(Player* player, bool forceLogout); em baixo coloca:
       
      uint32_t executeMoveItems(Creature* actor, Item* item, const Position& frompos, const Position& pos);  
      3° agora em game.cpp
       
      ache:
       
      if(!canThrowObjectTo(mapFromPos, mapToPos) && !player->hasCustomFlag(PlayerCustomFlag_CanThrowAnywhere)) { player->sendCancelMessage(RET_CANNOTTHROW); return false; } ReturnValue ret = internalMoveItem(player, fromCylinder, toCylinder, toIndex, item, count, NULL); if(ret == RET_NOERROR) return true; player->sendCancelMessage(ret); return false; } troque por:
       
      if(!canThrowObjectTo(mapFromPos, mapToPos) && !player->hasCustomFlag(PlayerCustomFlag_CanThrowAnywhere)) { player->sendCancelMessage(RET_CANNOTTHROW); return false; } bool success = true; CreatureEventList moveitemEvents = player->getCreatureEvents(CREATURE_EVENT_MOVEITEM2); for(CreatureEventList::iterator it = moveitemEvents.begin(); it != moveitemEvents.end(); ++it) { Item* toContainer = toCylinder->getItem(); Item* fromContainer = fromCylinder->getItem(); if(!(*it)->executeMoveItem2(player, item, count, fromPos, toPos, (toContainer ? toContainer : 0), (fromContainer ? fromContainer : 0), fromStackpos) && success) success = false; } if(!success) return false; if(!g_creatureEvents->executeMoveItems(player, item, mapFromPos, mapToPos)) return false; ReturnValue ret = internalMoveItem(player, fromCylinder, toCylinder, toIndex, item, count, NULL); if(ret == RET_NOERROR) return true; player->sendCancelMessage(ret); return false; } feito isso é só compilar sua source no modo REDUILD pra que as funções funcione.
       
      Agora no seu otserv vai em creturescripts, vai no arquivo login.lua e registra e event:
      registerCreatureEvent(cid, "MoveItem") registerCreatureEvent(cid, "MoveItem2") em creaturescript .xml
      <event type="moveitem" name="MoveItem" event="script" value="houseprotecao.lua"/> <event type="moveitem2" name="MoveItem2" event="script" value="moveitem2.lua"/> script do houseprotecao.lua "move item1
       
      function onMoveItem(moveItem, frompos, position, cid) if position.x == CONTAINER_POSITION then return true end local house = getHouseFromPos(position) if type(house) == 'number' then local owner = getHouseOwner(house) if owner == 0 then return false, doPlayerSendCancel(cid, 'Desculpe, isso não é possivel.') end if owner ~= getPlayerGUID(cid) then local sub = getHouseAccessList(house, 0x101):explode('\n') local guest = getHouseAccessList(house, 0x100):explode('\n') local isInvited = false if (#sub > 0) and isInArray(sub, getCreatureName(cid)) then isInvited = true end if (#guest > 0) and isInArray(guest, getCreatureName(cid)) then isInvited = true end if not isInvited then return false, doPlayerSendCancel(cid, 'Desculpe, isso não é possivel, pois você não está convidado') end end end return true end  
      script do moveitem2.lua "moveitem2
       
      local depottiles = {} --piso pra n jogar local depots = {2589} --id dos dps local group = 3 --id dos group 6 é todos. local function checkIfThrow(pos,topos) if topos.x == 0xffff then return false end local thing = getThingFromPos(pos) if isInArray(depottiles,thing.itemid) then if not isInArea(topos,{x=pos.x-1,y=pos.y-1,z=pos.z},{x=pos.x+1,y=pos.y+1, z=pos.z}) then return true end else for i = 1, #depots do if depots[i] == getTileItemById(topos,depots[i]).itemid or getTileInfo(topos).actionid == 7483 then return true end end end return false end function onMoveItem2(cid, item, count, toContainer, fromContainer, fromPos, toPos) if isPlayer(cid) then local pos = getThingPos(cid) if getPlayerGroupId(cid) > group then return true end if checkIfThrow({x=pos.x,y=pos.y,z=pos.z,stackpos=0},toPos) then doPlayerSendCancel(cid,"Não jogue item ai!!") doSendMagicEffect(getThingPos(cid),CONST_ME_POFF) return false end end return true end  
       
       
      CRÉDITOS:
      @L3K0T
      Fir3element
      Summ
      Wise
       
       
       
      GOD Wille
       
       
       
      OUTROS:
       
      Funções que foram adicionada:
      onMoveItem2(cid, item, count, toContainer, fromContainer, fromPos, toPos)
      onMoveItem(moveItem, frompos, position, cid)
       
      bloquear Item para não mover certo item no seu servidor, adicione sempre antes do return true end moveitem1
       
      if moveItem.itemid == IDDOITEM then doPlayerSendTextMessage(cid,25,'você bloqueou um item para não move no jogo!') return false end  
       
  • Recently Browsing   0 members

    No registered users viewing this page.


Open Tibia Server

Quer aprender a criar seu próprio servidor de Tibia? Então está no lugar certo, aqui você encontrará milhares de tutorias, scripts, códigos, mapas e utilitários para que você possa fazer o seu próprio servidor de Tibia começando do zero.

Redes Sociais

Anuncie no Tibia King

Precisa de mais visibilidade em seus projetos? Quer fazer um plano publicitário para o seu servidor? Anuncie no Tibia King e faça sua divulgação, possuímos centenas de acessos simultâneos e milhares diários, com certeza será a sua solução!

×
×
  • Create New...