Ir para conteúdo
  • Cadastre-se

C++ UPDATE 3: Moveitem + Antipush + Anti-Crash Elf Bot - Bug Fixes - TFS 0.4 11/04/2024


Posts Recomendados

  • Respostas 48
  • Created
  • Última resposta

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

TUTORIAL BY L3K0T PT~EN   Olá pessoal, trago a vocês uma atualização que fiz no sistema, contendo 3 novas funcionalidades de movimentação de itens e uma proteção contra Elf Bot. Estas adiçõe

Opa, já vou deixando meu rep porque parece bem interessante, hehe.

Muito bom! Tá inspirado em mano kkk 

Posted Images

26 minutos atrás, L3K0T disse:

EXPLICAÇÃO/RESUMO

Bom galera esse sistema foi fixado por mim e resolvi trazer pra vocês o UPDATE dele pra funcionar perfeitamente ao seu jogo, esse sistema tem a obrigação de parar players que jogam lixo na porta da sua casa. "somente dono, sub, e convidados podem jogar lixo ou mover items."

 

 

C++ SuperCoder 1.3 Baixar APK para Android - Aptoide

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";

 

 

ache:


case CREATURE_EVENT_PREPAREDEATH:
			return "onPrepareDeath";

em baixo coloca:


case CREATURE_EVENT_MOVEITEM:
           return "onMoveItem";

 

ache:


else if(tmpStr == "preparedeath")
		m_type = CREATURE_EVENT_PREPAREDEATH;

em baixo coloca:


else if(tmpStr == "moveitem")
		m_type = CREATURE_EVENT_MOVEITEM;

 

 

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 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 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);

			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;
	}
}

 

 

 agora em creatureevetns.h

 

Ache:


CREATURE_EVENT_PREPAREDEATH,

em baixo coloca:


CREATURE_EVENT_MOVEITEM,

 

ache:


uint32_t executePrepareDeath(Creature* creature, DeathList deathList);

em baixo coloca:


uint32_t executeMoveItem(Creature* actor, Item* item, const Position& frompos, const Position& pos);

 

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;
	}
  
	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")

em creaturescript .xml


<event type="moveitem" name="MoveItem" event="script" value="houseprotecao.lua"/>

script do houseprotecao.lua

 


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

CRÉDITOS:

@L3K0T

Fir3element

Summ

 

 

 

 

 

 

Muito bom! Tá inspirado em mano kkk 

                                                                             1535210279_tumblr_o9b6yoxM1Z1tco8kto1_500(3).gif.f527686e19da738322c39555244decac.gif

                                                             Meus tópicos         

                                                         Se ajudei você deixe seu Rep! para fortalecer a amizade ^^

                                                                              Vamos ajudar o fórum a crescer mais.

                                                                          1641206641_gif-escudo-fla-3d(1).gif.a5d3c0c24824d5272a181aa91c5eda0c.gif

                                                                                                Mengão porra! . .

                                                                     tumblr_oxm8eriUeU1sqwgnro2_400.gif.22e347b2fc58fdfd88dbf84f4bdaa1bc.gif

                                                                                ----- NPC que vende informação -----

                                                                           -----Baú Que dá Outfit se tiver Level -----

                                                                     ----- [Npc] Que vende Stones (itens) por diamonds -----

 

 

                                                                       

                       

Link para o post
Compartilhar em outros sites
  • Sub-Admin

Galera vo fazer o novo UPDATE moveitem2 - FEITO!

Editado por L3K0T (veja o histórico de edições)

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código.  #OpenSource #Programação #Contribuição

 

Link para o post
Compartilhar em outros sites

@L3K0T o do depot tava dando erro na distro e dava pra colocar os items em cima, ai retirei o "2" do onmoveitem mas ai não acontece nada porem não da o erro, sabe o que pode ser?

 

Spoiler

image.thumb.png.32594919cdeb4af8d4d9690f8111dba4.png

 

Editado por Spooky Ghost (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Sub-Admin
1 hora atrás, Spooky Ghost disse:

@L3K0T o do depot tava dando erro na distro e dava pra colocar os items em cima, ai retirei o "2" do onmoveitem mas ai não acontece nada porem não da o erro, sabe o que pode ser?

 

  Ocultar conteúdo

image.thumb.png.32594919cdeb4af8d4d9690f8111dba4.png

 

pra por em cima é o itemmove2

 

local depottiles = {} --piso pra n jogar
local depots = {2589} --id dos dps
local group = 6 --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 isInteste(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 lixo no depot!!")
            doSendMagicEffect(getThingPos(cid),CONST_ME_POFF)
            return false
        end
    end
  
  return true
end

  
  
  
  

<event type="moveitem2" name="MoveItem2" event="script" value="moveitem2.lua"/>

 

registerCreatureEvent(cid, "MoveItem2")

 

se vc tá em adm no moveitem2 ele passa então esse bloqueia até adm

 

 

Editado por L3K0T (veja o histórico de edições)

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código.  #OpenSource #Programação #Contribuição

 

Link para o post
Compartilhar em outros sites

@L3K0T Então, o erro que da quando eu coloco "moveitem2" no xml:

 

[Error - CreatureEvent::configureEvent] No valid type for creature event.moveitem2
[Warning - BaseEvents::loadFromXml] Cannot configure an event

Eu tinha testado em um player normal por causa da verificação dos groups e jogou kk

Link para o post
Compartilhar em outros sites
  • Sub-Admin
3 minutos atrás, Spooky Ghost disse:

@L3K0T Então, o erro que da quando eu coloco "moveitem2" no xml:

 


[Error - CreatureEvent::configureEvent] No valid type for creature event.moveitem2
[Warning - BaseEvents::loadFromXml] Cannot configure an event

Eu tinha testado em um player normal por causa da verificação dos groups e jogou kk

isso quer dizer que imoveitem2 não foi colocado na source direito, esqueceu algo :(  sequiser posso fazer pra vc só manda o arquivos

Editado por L3K0T (veja o histórico de edições)

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código.  #OpenSource #Programação #Contribuição

 

Link para o post
Compartilhar em outros sites

 @L3K0T A base do meu servidor é um pouco antiga, e quando eu tava vasculhando as coisas lá eu via que tinha muita coisa incompleta, que suspeito que o dono da base devia ter removido, então você sabe se eu posso achar um tutorial aqui no TK ou me falar como posso fazer o procedimento? xD

Editado por Spooky Ghost (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Sub-Admin
1 minuto atrás, Spooky Ghost disse:

 @L3K0T A base do meu servidor é um pouco antiga, e quando eu tava vasculhando as coisas lá eu via que tinha muita coisa incompleta, que suspeito que o dono da base devia ter removido, então você sabe se eu posso achar um tutorial aqui no TK ou me falar como posso fazer o procedimento? xD

manda o creatureevet.cpp e .h e game.cpp eu posso colocar pra vc, agora n estou tão ocupada

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código.  #OpenSource #Programação #Contribuição

 

Link para o post
Compartilhar em outros sites
  • Sub-Admin

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código.  #OpenSource #Programação #Contribuição

 

Link para o post
Compartilhar em outros sites
  • Sub-Admin
9 minutos atrás, Spooky Ghost disse:

 @L3K0T Ajudaria muito kkk, não tenho conhecimento em C++

baixa ai e testa da rebuild na source se der eerro na compilação posta o erro

creatureevent.cpp game.cpp creatureevent.h @Spooky Ghost

Editado por L3K0T
compila ai (veja o histórico de edições)

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código.  #OpenSource #Programação #Contribuição

 

Link para o post
Compartilhar em outros sites
  • Sub-Admin
Agora, Jeanfersonsp disse:

Sé faltou deixar os créditos do resto porque estas scripts/funções já existe a muito tempo e tem em todos os forums creio eu

os créditos já está no tópico e outra fiz correções :)  obg!!!

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código.  #OpenSource #Programação #Contribuição

 

Link para o post
Compartilhar em outros sites
  • Sub-Admin
21 minutos atrás, Spooky Ghost disse:

 @L3K0T Ajudaria muito kkk, não tenho conhecimento em C++

postei ali em cima só baixa

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código.  #OpenSource #Programação #Contribuição

 

Link para o post
Compartilhar em outros sites
Spoiler

/creatureevent.cpp: In member function `uint32_t CreatureEvent::executeMoveItem2(Player*, Item*, uint8_t, const Position&, const Position&, Item*, Item*, int16_t)':
../creatureevent.cpp:174: error: `LuaInterface' has not been declared

../creatureevent.cpp:174: error: `pushThing' was not declared in this scope

../creatureevent.cpp: In member function `uint32_t CreatureEvents::executeMoveItems(Creature*, Item*, const Position&, const Position&)':
../creatureevent.cpp:198: error: base operand of `->' has non-pointer type `std::pair<const std::string, CreatureEvent*>'

../creatureevent.cpp:200: error: base operand of `->' has non-pointer type `std::pair<const std::string, CreatureEvent*>'

../creatureevent.cpp: In member function `virtual bool CreatureEvent::configureEvent(xmlNode*)':
../creatureevent.cpp:347: error: expected primary-expression before "else"

../creatureevent.cpp:347: error: expected `;' before "else"

../creatureevent.cpp:354: error: expected primary-expression before "else"
../creatureevent.cpp:354: error: expected `;' before "else"

../creatureevent.cpp:356: error: expected primary-expression before "else"

../creatureevent.cpp:356: error: expected `;' before "else"

make.exe: *** [obj//creatureevent.o] Error 1

 

deu esses erros

Editado por Spooky Ghost (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Sub-Admin
12 minutos atrás, Spooky Ghost disse:
  Ocultar conteúdo


/creatureevent.cpp: In member function `uint32_t CreatureEvent::executeMoveItem2(Player*, Item*, uint8_t, const Position&, const Position&, Item*, Item*, int16_t)':
../creatureevent.cpp:174: error: `LuaInterface' has not been declared

../creatureevent.cpp:174: error: `pushThing' was not declared in this scope

../creatureevent.cpp: In member function `uint32_t CreatureEvents::executeMoveItems(Creature*, Item*, const Position&, const Position&)':
../creatureevent.cpp:198: error: base operand of `->' has non-pointer type `std::pair<const std::string, CreatureEvent*>'

../creatureevent.cpp:200: error: base operand of `->' has non-pointer type `std::pair<const std::string, CreatureEvent*>'

../creatureevent.cpp: In member function `virtual bool CreatureEvent::configureEvent(xmlNode*)':
../creatureevent.cpp:347: error: expected primary-expression before "else"

../creatureevent.cpp:347: error: expected `;' before "else"

../creatureevent.cpp:354: error: expected primary-expression before "else"
../creatureevent.cpp:354: error: expected `;' before "else"

../creatureevent.cpp:356: error: expected primary-expression before "else"

../creatureevent.cpp:356: error: expected `;' before "else"

make.exe: *** [obj//creatureevent.o] Error 1

 

deu esses erros

ai 

creatureevent.cpp

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código.  #OpenSource #Programação #Contribuição

 

Link para o post
Compartilhar em outros sites
  • L3K0T mudou o título para UPDATE 3: Moveitem + Antipush + Anti-Crash Elf Bot - Bug Fixes - TFS 0.4 11/04/2024

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Conteúdo Similar

    • Por L3K0T
      Se você está enfrentando o problema de jogadores ganhando experiência ao matar outros jogadores em um servidor PVP, e já tentou várias soluções sem sucesso, este tutorial vai te ajudar a resolver isso. A modificação que vou mostrar foi eficaz para mim e pode ser a solução para o seu servidor também.
       
      Passo 1: Acesse o arquivo creature.cpp
      Primeiro, abra o arquivo creature.cpp, que está localizado na pasta src ou sources do seu servidor. Esse arquivo contém a lógica das criaturas, incluindo a parte de quando um jogador mata outra criatura.
       
      Passo 2: Localize o  onAttackedCreatureKilled
      Dentro do arquivo, procure pela função onAttackedCreatureKilled:
       
      void Creature::onAttackedCreatureKilled(Creature* target) { if(target == this) return; double gainExp = target->getGainedExperience(this); onGainExperience(gainExp, !target->getPlayer(), false); }  
      Altere para
       
      void Creature::onAttackedCreatureKilled(Creature* target) { if (target == this) return; // Verifica se o atacante e o alvo são jogadores Player* attackerPlayer = this->getPlayer(); Player* targetPlayer = target->getPlayer(); if (attackerPlayer && targetPlayer) return; if (!attackerPlayer && targetPlayer) { double gainExp = target->getGainedExperience(this); onGainExperience(gainExp, !target->getPlayer(), false); } else if (attackerPlayer) { double gainExp = target->getGainedExperience(this); onGainExperience(gainExp, true, false); } }  
      Agora Recompile modo Rebuilder (LIMPA) e pronto!!!
       
      Aqui está o que mudou:
      *A primeira modificação verifica se o atacante e o alvo são jogadores. Se ambos forem jogadores, não será concedida experiência.
      *Se o atacante for um monstro, a experiência será concedida normalmente ao jogador.
      *Se o atacante for um jogador, ele ganhará a experiência normalmente.
       
      Créditos @L3K0T
    • Por L3K0T
      Sistema de Drop Personalizado
       
      Esse sistema de loot foi projetado para adicionar um elemento de sorte e surpresa ao derrotar monstros. Sempre que um jogador derrota um monstro, há uma chance configurada para que ele solte entre 1 a 3 itens especiais, garantindo recompensas valiosas ao jogador.
       
      O sistema realiza as seguintes ações:
      Chance de Drop: A cada morte de um monstro, há uma chance configurada para dropar itens específicos. O sistema permite que sejam dropados entre 1 a 3 unidades do item, tornando o sistema mais dinâmico.
       
      Efeito Visual: Quando o loot é bem-sucedido, um efeito visual especial (ID 231) é exibido na posição exata onde o monstro foi derrotado, criando uma animação visual que destaca a recompensa.
       
      Notificação ao Jogador: Após o drop, o jogador recebe uma mensagem personalizada informando a quantidade de itens obtidos. Essa notificação aparece após 3 segundos, adicionando uma camada de imersão e evitando sobrecarregar o chat imediatamente após a morte do monstro.
       
      *Ótimo para fazer eventos de dropar certo itens para alguma missão ou resgates.
      *Uso no meu TIBIA HARRY POTTER ORIGIN
       
      VAi em creaturescripts/scripts.lua
      local function findCorpse(position) for i = 1, 255 do position.stackpos = i local corpse = getThingfromPos(position) if isCorpse(corpse.uid) then return corpse.uid end end return false end local function dropLoot(position, killer) local corpse = findCorpse(position) if not corpse then return false end local itemId = 2160 local chance = 23 if math.random(100) <= chance then local amountToDrop = math.random(1, 3) doAddContainerItem(corpse, itemId, amountToDrop) local corpsePosition = getThingPos(corpse) doSendMagicEffect(corpsePosition, 7) local function sendMessage() if isPlayer(killer) then local message = string.format("Você dropou %d Crystal Coin(s).", amountToDrop) doPlayerSendTextMessage(killer, MESSAGE_INFO_DESCR, message) end end addEvent(sendMessage, 2500) end return true end function onKill(cid, target) local position = getCreaturePosition(target) addEvent(dropLoot, 100, position, cid) return true end  
      creaturescripts.xml
      <event type="kill" name="GlobalDrops" registerTo ="GlobalDrops" event="script" value="globalDrops.lua"/> ou depende do tfs
      <event type="kill" name="GlobalDrops" event="script" value="globalDrops.lua"/>  
      Para ambos TFS registra o evento no login.lua
      registerTo ="GlobalDrops"
      feito isso.. agora todos os monstros do mapa vai cair os crystal coins de 1 há 3.
    • Por L3K0T
      Não jogar itens pelo teleportes C++
       

       

       
       
      Bom.. o nome já diz, qualquer um que jogar itens nos teleportes do seu otserv, o mesmo será removido, como aquelas lixeiras, porem esse sistema é pela source, descartando scripts .LUA.
       
       
      Em teleporte.cpp ache:
       
      void Teleport::__addThing(Creature* actor, int32_t, Thing* thing) { if(!thing || thing->isRemoved()) return; Tile* destTile = g_game.getTile(destination); if(!destTile) return; if(Creature* creature = thing->getCreature()) { g_game.addMagicEffect(creature->getPosition(), MAGIC_EFFECT_TELEPORT, creature->isGhost()); creature->getTile()->moveCreature(actor, creature, destTile); g_game.addMagicEffect(destTile->getPosition(), MAGIC_EFFECT_TELEPORT, creature->isGhost()); } else if(Item* item = thing->getItem()) { g_game.addMagicEffect(item->getPosition(), MAGIC_EFFECT_TELEPORT); g_game.internalMoveItem(actor, item->getTile(), destTile, INDEX_WHEREEVER, item, item->getItemCount(), NULL); g_game.addMagicEffect(destTile->getPosition(), MAGIC_EFFECT_TELEPORT); } }  
      Altere ele todo para:
       
      void Teleport::__addThing(Creature* actor, int32_t, Thing* thing) { if (!thing || thing->isRemoved()) return; Tile* destTile = g_game.getTile(destination); if (!destTile) return; if (Creature* creature = thing->getCreature()) { g_game.addMagicEffect(creature->getPosition(), MAGIC_EFFECT_TELEPORT, creature->isGhost()); creature->getTile()->moveCreature(actor, creature, destTile); g_game.addMagicEffect(destTile->getPosition(), MAGIC_EFFECT_TELEPORT, creature->isGhost()); } else { Player* player = dynamic_cast<Player*>(actor); if (player) { player->sendTextMessage(MSG_STATUS_SMALL, "You cannot teleport items."); // Remover o item Item* item = dynamic_cast<Item*>(thing); if (item) { g_game.internalRemoveItem(actor, item); } } return; } } agora é só compilar no modo Rebuilder e ligar o servidor, créditos a mim L3K0T pela alterações.
    • Por Doria Louro
      Olá senhores.
       
      Gostaria de uma ajuda com um script de summon que venho trabalhando no momento, gostaria que o summon andasse do lado do jogador, entretanto o mesmo sempre fica para trás ou a frente do jogador.
      Efetuei a alteração na source creature.cpp:
       
      void Creature::getPathSearchParams(const Creature* creature, FindPathParams& fpp) const { fpp.fullPathSearch = !hasFollowPath; fpp.clearSight = true; if(creature->isPlayerSummon()) { if(creature->getName() == "Summon Name") fpp.clearSight = false; } fpp.maxSearchDist = 12; fpp.minTargetDist = fpp.maxTargetDist = 1; }  
      fpp.maxTargetDist = 1;
      Porém ele sempre mantem 1 de distancia do jogador, alterando para zero o "Zero" summon nem segue o jogador.
      Resultado:

       
      Agradeço desde já.
    • Por Imperius
      O propósito é criar uma nova função em creaturescripts que será acionada toda vez que um novo report (CTRL + R) for aberto.
       
      Eu implementei para enviar uma notificação no grupo do Telegram, contendo os dados do report.
       
      Isso garantirá que os GMs tenham acesso aos reports dos jogadores mesmo quando não estiverem logados, e também evitará que algum report seja perdido caso o jogador saia do servidor.
      A parte do Telegram é apenas um exemplo. Você pode ajustar o script para executar outras ações desejadas.
       
      creatureevent.cpp:
      Dentro deste arquivo, localize a função:
       
      uint32_t CreatureEvent::executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap)  
      abaixo dela, adicione:
       
      uint32_t CreatureEvent::executeOpenRuleViolation(Player* player, std::string message) { if (!m_interface->reserveEnv()) { std::clog << "[Error - CreatureEvent::executeOpenRuleViolation] Call stack overflow." << std::endl; return 0; } ScriptEnviroment* env = m_interface->getEnv(); env->setScriptId(m_scriptId, m_interface); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushstring(L, message.c_str()); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; }  
      Após, procure por:
       
      std::string CreatureEvent::getScriptEventName() const  
      abaixo de:
       
      case CREATURE_EVENT_CHANNEL_LEAVE: return "onLeaveChannel";  
      adicione:
       
      case CREATURE_EVENT_OPEN_RULE_VIOLATION: return "onOpenRuleViolation";  
      Agora, procure por:
       
      std::string CreatureEvent::getScriptEventParams() const  
      abaixo de:
       
      case CREATURE_EVENT_CHANNEL_LEAVE: return "cid, channel, users";  
      adicione:
       
      case CREATURE_EVENT_OPEN_RULE_VIOLATION: return "cid, message";  
      Procure por:
       
      bool CreatureEvent::configureEvent(xmlNodePtr p)  
      abaixo de:
       
      else if(tmpStr == "leavechannel") m_type = CREATURE_EVENT_CHANNEL_LEAVE;  
      adicione:
       
      else if(tmpStr == "openruleviolation") m_type = CREATURE_EVENT_OPEN_RULE_VIOLATION;  
       
      creatureevent.h:
      Dentro deste arquivo, localize:
       
      enum CreatureEventType_t  
      adicione "CREATURE_EVENT_OPEN_RULE_VIOLATION" como o último item de enum CreatureEventType_t
       
      Exemplo:
       
      enum CreatureEventType_t { // ... CREATURE_EVENT_OPEN_RULE_VIOLATION };  
      Agora, procure por:
       
      uint32_t executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap);  
      abaixo dela, adicione:
       
      uint32_t executeOpenRuleViolation(Player* player, std::string message);  
      game.cpp:
      Dentro deste arquivo, localize:
       
      bool Game::playerReportRuleViolation(Player* player, const std::string& text)  
      e substitua por:
       
      bool Game::playerReportRuleViolation(Player* player, const std::string& text) { //Do not allow reports on multiclones worlds since reports are name-based if(g_config.getNumber(ConfigManager::ALLOW_CLONES)) { player->sendTextMessage(MSG_INFO_DESCR, "Rule violation reports are disabled."); return false; } cancelRuleViolation(player); boost::shared_ptr<RuleViolation> rvr(new RuleViolation(player, text, time(NULL))); ruleViolations[player->getID()] = rvr; ChatChannel* channel = g_chat.getChannelById(CHANNEL_RVR); if(!channel) return false; for(UsersMap::const_iterator it = channel->getUsers().begin(); it != channel->getUsers().end(); ++it) it->second->sendToChannel(player, SPEAK_RVR_CHANNEL, text, CHANNEL_RVR, rvr->time); CreatureEventList joinEvents = player->getCreatureEvents(CREATURE_EVENT_OPEN_RULE_VIOLATION); for(CreatureEventList::iterator it = joinEvents.begin(); it != joinEvents.end(); ++it) (*it)->executeOpenRuleViolation(player, text); return true; }  
      Agora é só compilar a source.
       
      depois em "data > creaturescripts > creaturescripts.xml", adicione:
       
      <event type="login" name="loginNotifyRuleViolation" script="notifyRuleViolation.lua"/> <event type="openruleviolation" name="openNotifyRuleViolation" script="notifyRuleViolation.lua"/>  
      em "data > creaturescripts > scripts", crie um arquivo notifyRuleViolation.lua e adicione:
       
      function onOpenRuleViolation(cid, message) local config = { token = "", -- Token do seu BOT no Telegram chatId = "" -- ID do chat do Telegram que será enviado a notificação. } local message = "Player: "..getCreatureName(cid).."\n\nReport:\n"..message.."" message = string.gsub(message, "\n", "%%0A") local url = "https://api.telegram.org/bot"..config.token.."/sendMessage" local data = "chat_id="..config.chatId.."&text="..message.."" local curl = io.popen('curl -d "'..data..'" "'..url..'"'):read("*a") return true end function onLogin(cid) registerCreatureEvent(cid, "openNotifyRuleViolation") return true end  
       
      Demonstração:
      1. Jogador abre um novo report (CTRL + R)

      2. notifyRuleViolation.lua, definido em creaturescripts.xml, é acionado para enviar uma notificação ao grupo do Telegram.
       

       



×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo