Ir para conteúdo
Entre para seguir isso  
Zirun

[Função] doAbsorbCombatPercentage

Recommended Posts

Zirun    11
Zirun

doAbsorbCombatPercentage e getCombatPercentageAbsorbed

 

Funciona com: TFS 0.4

 

Créditos: darkhaos

 

Introdução:

Função para ser utilizada em Lua, a utilidade dela é basicamente de absorver uma porcentagem de dano de um ou mais elemento(s) pre-determinado(s).

 

Mão a obra

 

Arquivo player.cpp, depois de:

editListId = maxWriteLen = windowTextId = rankId = 0;

Coloque:

firePercent = energyPercent = earthPercent = icePercent = holyPercent = eathPercent = physicalPercent = lifeDrainPercent = manaDrainPercent = drownPercent = 0;

 

No final do arquivo player.cpp, coloque:

void Player::setAbsorbedPercent(const CombatType_t combatType, int32_t percent)
{
if(percent < 0)
	percent = 0;

if(percent > 100)
	percent = 100;

switch((CombatType_t)combatType)
{
	case COMBAT_FIREDAMAGE:
		firePercent = percent;
		break;
	case COMBAT_ENERGYDAMAGE:
		energyPercent = percent;
		break;
	case COMBAT_EARTHDAMAGE:
		earthPercent = percent;
		break;
	case COMBAT_ICEDAMAGE:
		icePercent = percent;
		break;
	case COMBAT_HOLYDAMAGE:
		holyPercent = percent;
		break;
	case COMBAT_DEATHDAMAGE:
		deathPercent = percent;
		break;
	case COMBAT_PHYSICALDAMAGE:
		physicalPercent = percent;
		break;
	case COMBAT_LIFEDRAIN:
		lifeDrainPercent = percent;
		break;
	case COMBAT_MANADRAIN:
		manaDrainPercent = percent;
		break;
	case COMBAT_DROWNDAMAGE:
		drownPercent = percent;
		break;
	default:
		break;
       }
}

 

Arquivo player.h, depois de:

 void setSex(uint16_t);

Coloque:

int32_t getAbsorbedPercent(CombatType_t combatType) const
	{
            	switch(combatType)
            	{
               	case COMBAT_FIREDAMAGE:
			return firePercent;

               	case COMBAT_ENERGYDAMAGE:
			return energyPercent;

               	case COMBAT_EARTHDAMAGE:
			return earthPercent;

               	case COMBAT_ICEDAMAGE:
			return icePercent;

               	case COMBAT_HOLYDAMAGE:
			return holyPercent;

               	case COMBAT_DEATHDAMAGE:
			return deathPercent;

		case COMBAT_PHYSICALDAMAGE:
			return physicalPercent;

		case COMBAT_LIFEDRAIN:
			return lifeDrainPercent;

		case COMBAT_MANADRAIN:
			return manaDrainPercent;

		case COMBAT_DROWNDAMAGE:
			return drownPercent;

		default:
			break;
       		}
       		return 0;
	}
	void setAbsorbedPercent(const CombatType_t combatType, int32_t percent);

Depois de:

 int32_t shootRange;

Coloque:

int32_t firePercent;
	int32_t energyPercent;
	int32_t earthPercent;
	int32_t icePercent;
	int32_t holyPercent;
	int32_t deathPercent;
	int32_t physicalPercent;
	int32_t lifeDrainPercent;
	int32_t manaDrainPercent;
	int32_t drownPercent;

 

Arquivo game.cpp, depois de:

damage = std::min(target->getHealth(), damage);

Coloque:

Player* player = target->getPlayer();
		int32_t percent, total;
		if(player)
		{
			percent = player->getAbsorbedPercent(combatType);
			total = damage * percent / (int32_t)100;
		}

		if(total > 0)
			damage -= total;

 

Arquivo luascripts.cpp, depois de:

lua_register(m_luaState, "doPlayerRemoveMoney", LuaScriptInterface::luaDoPlayerRemoveMoney);

Coloque:

//doAbsorbCombatPercentage(cid, combat, percent)
lua_register(m_luaState, "doAbsorbCombatPercentage", LuaScriptInterface::luaDoAbsorbCombatPercentage);

//getCombatPercentageAbsorbed(cid, combat)
lua_register(m_luaState, "getCombatPercentageAbsorbed", LuaScriptInterface::luaGetCombatPercentageAbsorbed);

 

Depois de:

int32_t LuaScriptInterface::luaDoPlayerRemoveMoney(lua_State* L)

Coloque:

int32_t LuaScriptInterface::luaDoAbsorbCombatPercentage(lua_State *L)
{           	
   ScriptEnviroment* env = getEnv();
   int32_t percent = popNumber(L);
   CombatType_t combat = (CombatType_t)popNumber(L);
      if(!combat)
      {
		errorEx(getError(LUA_ERROR_COMBAT_NOT_FOUND));
		lua_pushboolean(L, false);
		return 1;
      } 

      Player* player = env->getPlayerByUID(popNumber(L));
      if(player)
      {    
		player->setAbsorbedPercent(combat, percent);
           lua_pushnumber(L, true);
      }
      else
      {       
          errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
          lua_pushnumber(L, false);
      }       
   return 1;
}

int32_t LuaScriptInterface::luaGetCombatPercentageAbsorbed(lua_State *L)
{             	
   ScriptEnviroment* env = getEnv();
   CombatType_t combat = (CombatType_t)popNumber(L); 
      if(!combat)
      {
		errorEx(getError(LUA_ERROR_COMBAT_NOT_FOUND));
		lua_pushboolean(L, false);
		return 1;
      } 
      if(Player* player = env->getPlayerByUID(popNumber(L)))
      {    
           lua_pushnumber(L, player->getAbsorbedPercent(combat));
      }    
      else
      {       
          errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
          lua_pushnumber(L, false);
      }       
   return 1;
}

 

Arquivo luascript.h, depois de:

static int32_t luaDoPlayerRemoveMoney(lua_State* L);

Coloque:

static int32_t luaDoCombatAbsorbPercentage(lua_State* L);
	static int32_t luaGetCombatPercentageAbsorbed(lua_State* L);

 

Pronto função adicionada, agora vamos a utilização.

 

Como usar:

doAbsorbCombatPercentage(cid, COMBAT_FIREDAMAGE, 50)
getCombatPercentageAbsorbed(cid, COMBAT_FIREDAMAGE)

 

Importante:

Quando o player sair do servidor a função é desabilitada e ele precisa habilitar ela novamente ao entrar, isso pode ser resolvido com um arquivo que verifica os itens equipados no caso de equipamentos, ou que verifica as magias ativas no caso de magia, lembrem-se que para que ela se torne "permanente" é necessário que a mesma faça consultar no banco de dados, o que também pode ser feito por lua.

 

Qualquer duvida utilize este tópico.

Editado por Zirun

Compartilhar este post


Link para o post
Undead Dragon~    3
Undead Dragon~

porra vlw msm, vai me ajudar mto msm

Compartilhar este post


Link para o post
tunirp    0
tunirp

da para usar em item usando movements ?!....

Compartilhar este post


Link para o post
luishtfs    1
luishtfs

Não entendi a função disso u_u

Compartilhar este post


Link para o post
newotserv    0
newotserv

Eu também não entendi a para que serve isso. Isso é para o player? Para um item, tipo Zaoan Legs do Tibia Oficial que tem proteção de 2% para ataques físicos? Ou não é para isso e sim para outra coisa? Pode explicar melhor?

 

Depois de explicar melhor para que ser, me responda a ultima coisa: tem como usar em ot 9.6?

Compartilhar este post


Link para o post
newotserv    0
newotserv

Eu também não entendi a para que serve isso. Isso é para o player? Para um item, tipo Zaoan Legs do Tibia Oficial que tem proteção de 2% para ataques físicos? Ou não é para isso e sim para outra coisa? Pode explicar melhor?

 

Depois de explicar melhor para que ser, me responda a ultima coisa: tem como usar em ot 9.6?

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×