Ir para conteúdo
  • Cadastre-se

C++ não contar frag em determinada area (Source otx)


Posts Recomendados

SALVE rapaziada do TK, esses dias vim pensando em novos scripts pro meu OT, e em um deles eu precisava que determinada area não contasse frag pro player que matasse outros, PORÉM eu precisava que os players que morressem nessa area ainda assim tivessem as penalidades da sua morte, procurei por ai, achei alguns scripts que apenas tiravam o SKULL e não realmente o FRAG do player.

**script atualizado 22/10/2023** - melhorado e otimizado, levei o script pra puxar as infos por .lua / creatureScripts

vou disponibilizar o code aqui, e o que fazer pra determinada area não contar frag.

SOURCE OTX 2 / TFS 0.x, Funciona em TFS 1.x mudando as tags e ajeitando as sintaxes.

vá em creatureevent.cpp

procure por:

else if(type == "preparedeath")
		_type = CREATURE_EVENT_PREPAREDEATH;


Adiciona abaixo:

else if(type == "nocountfrag")
		_type = CREATURE_EVENT_NOCOUNTFRAG;



procure por:

case CREATURE_EVENT_PREPAREDEATH:
			return "onPrepareDeath";

 
Adicione abaixo

case CREATURE_EVENT_NOCOUNTFRAG:
			return "noCountFragArea";



procure por:

case CREATURE_EVENT_PREPAREDEATH:
			return "cid, deathList";


Adicione abaixo:

case CREATURE_EVENT_NOCOUNTFRAG:
	return "cid, target";



agora no mesmo arquivo, vá até o final do arquivo e adicione essa função:

uint32_t CreatureEvent::executeNoCountFragArea(Creature* creature, Creature* target)
{
	//noCountFragArea(cid, target)
	if(m_interface->reserveEnv())
	{
		ScriptEnviroment* env = m_interface->getEnv();
		if(m_scripted == EVENT_SCRIPT_BUFFER)
		{
			env->setRealPos(creature->getPosition());
			std::ostringstream scriptstream;
			scriptstream << "local cid = " << env->addThing(creature) << std::endl;
			scriptstream << "local target = " << env->addThing(target) << std::endl;

			if(m_scriptData)
				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__
			std::ostringstream desc;
			desc << creature->getName();
			env->setEvent(desc.str());
			#endif

			env->setScriptId(m_scriptId, m_interface);
			env->setRealPos(creature->getPosition());

			lua_State* L = m_interface->getState();
			m_interface->pushFunction(m_scriptId);

			lua_pushnumber(L, env->addThing(creature));
			lua_pushnumber(L, env->addThing(target));

			bool result = m_interface->callFunction(2);
			m_interface->releaseEnv();
			return result;
		}
	}
	else
	{
		std::clog << "[Error - CreatureEvent::noCountFragArea] Call stack overflow." << std::endl;
		return 0;
	}
}



agora vá em creatureevent.h

procure por:

CREATURE_EVENT_PREPAREDEATH


adicione abaixo:

CREATURE_EVENT_NOCOUNTFRAG



procure por:

uint32_t executePrepareDeath(Creature* creature, DeathList deathList);


Adicione abaixo:

uint32_t executeNoCountFragArea(Creature* creature, Creature* target);



agora vá em player.cpp

procure por:

bool Player::onKilledCreature(Creature* target, DeathEntry& entry)


abaixo de:

War_t enemy;
if(targetPlayer->getEnemy(this, enemy))
{
  if(entry.isLast())
    IOGuild::getInstance()->updateWar(enemy);

  entry.setWar(enemy);
}


Adicione o seguinte código:

if (targetPlayer){
  CreatureEventList killEvents = getCreatureEvents(CREATURE_EVENT_NOCOUNTFRAG);
  for (const auto &event : killEvents) {
    if (!event->executeNoCountFragArea(this, target)) {
      return true;
    }
  }
}



//

Feito isso, tudo completo na sua source, agora é necessário adicionar o creaturescript dentro do servidor

vá até creaturescripts/scripts
crie um arquivo chamado, "noCountFragInArea.lua"
e dentro dele cole o código:
 

--[[ script feito por feetads / TibiaKing ]]--
	--[[ discord: feetads / FeeTads#0246 ]]--

-- Add positions here for which you do not want to count frags
local areas = {
    [1] = {from = {x = 91, y = 122, z = 7}, to = {x = 98, y = 127, z = 7}},		-- from = area superior esquerda / to = area inferior direita (formando um quadrado)
}

local onlyKillerInArea = false		-- only killer need to be in area?

function noCountFragArea(cid, target)
    if not isCreature(cid) or not isCreature(target) then return true end

    local posKiller = getPlayerPosition(cid)
    local posTarget = getPlayerPosition(target)

    for i = 1, #areas do
        local area = areas[i]
        if isInArea(posKiller, area.from, area.to) then
            if onlyKillerInArea then
                return false
			elseif isInArea(posTarget, area.from, area.to) then
				return false
            end
        end
    end

    return true
end


agora em creaturescripts.xml

<event type="nocountfrag" name="fragarea" event="script" value="noCountFragInArea.lua"/>


agora em creaturescripts/scripts/login.lua
 procure por OU semelhante a esse:

registerCreatureEvent(cid, "AdvanceSave")


e abaixo adicione:

registerCreatureEvent(cid, "fragarea")



//


Agora tudo certo, quando quiser adiciona uma area que não pega frag, vá até o script e apenas coloque a area, igual o demonstrado no script

Exemplo:

local areas = {
    [1] = {from = {x = 91, y = 122, z = 7}, to = {x = 98, y = 127, z = 7}},
    [2] = {from = {x = 1000, y = 1000, z = 7}, to = {x = 1100, y = 1100, z = 7}},
}


assim somente colocando a area no script e abrindo o server ou dando /reload, já funcionará a area como não pegar frag.
Esse sistema pode ser bom pra areas de pvp ativo, onde você ainda quer que o player que morrer perca os atributos, como se fosse uma morte normal, porém não conta frag pra quem matar.
Bom pra sistemas tipo castle 48h (guild war), onde há diversas mortes e risco de pegar red, atrapalhando a war.

Façam bom proveito dos scripts, e deixem os créditos no script rsrs

**Eu fiz as alterações e o simples código por isso vim disponibilizar, créditos meus**

Link para o post
Compartilhar em outros sites
  • FeeTads mudou o título para não contar frag em determinada area (Source otx)
  • 5 months later...
58 minutos atrás, ernaix69 disse:

desculpa, mas não entendi direito como adcionar novas areas, vc pode me explicar melhor?

precisa editar na parte com comentário:

 

	int x1 = //POSIÇÃO X SUPERIOR ESQUERDA
	int y1 = //POSIÇÃO Y SUPERIOR ESQUERDA 
	int x2 = //POSIÇÃO X INFERIOR DIREITA
	int y2 = //POSIÇÃO Y INFERIOR DIREITA //essas 4 posições formam o quadrado
	int z = //POS EM Z;

 

o ideal seria puxar isso pro ConfigManager e deixar dinâmico

Link para o post
Compartilhar em outros sites
12 minutos atrás, Fir3element disse:

precisa editar na parte com comentário:

 


	int x1 = //POSIÇÃO X SUPERIOR ESQUERDA
	int y1 = //POSIÇÃO Y SUPERIOR ESQUERDA 
	int x2 = //POSIÇÃO X INFERIOR DIREITA
	int y2 = //POSIÇÃO Y INFERIOR DIREITA //essas 4 posições formam o quadrado
	int z = //POS EM Z;

 

o ideal seria puxar isso pro ConfigManager e deixar dinâmico

mas pra adicionar novas posições em outros cantos do mapa, ele falou q era só  duplicar o for, mas não entendi direito

Link para o post
Compartilhar em outros sites
4 horas atrás, Fir3element disse:

o ideal seria puxar isso pro ConfigManager e deixar dinâmico

seria o ideal, fiz fixo, pq adicionar no configManager ou luaScript pra add por comando, ou ate no config.lua mesmo, MASSSSS como isso daria um trabalho mais chato, fiz fixo mesmo.

 

 

4 horas atrás, ernaix69 disse:

mas pra adicionar novas posições em outros cantos do mapa, ele falou q era só  duplicar o for, mas não entendi direito

então, basicamente duplicar a função tipo assim:

lugar 1:
 

    int x1 = //POSIÇÃO X SUPERIOR ESQUERDA
 	int y1 = 1000//POSIÇÃO Y SUPERIOR ESQUERDA 
	int x2 = 1000//POSIÇÃO X INFERIOR DIREITA
	int y2 = 1000//POSIÇÃO Y INFERIOR DIREITA //essas 4 posições formam o quadrado
	int z = 7//POS EM Z;

	for(int i = x1; i <= x2; i++){
		for(int j = y1; j <= y2; j++){
			if (posi.x == i && posi.y == j && posi.z == z){
				return true;
			}
		}
	}


ai pra nova area, add um lugar 2 assim:

 

    int novox1 = //POSIÇÃO X SUPERIOR ESQUERDA
 	int novoy1 = 3000//POSIÇÃO Y SUPERIOR ESQUERDA 
	int novox2 = 3000//POSIÇÃO X INFERIOR DIREITA
	int novoy2 = 3000//POSIÇÃO Y INFERIOR DIREITA //essas 4 posições formam o quadrado
	int novoz = 7//POS EM Z;

	for(int i = novox1; i <= novox2; i++){
		for(int j = novoy1; j <= novoy2; j++){
			if (posi.x == i && posi.y == j && posi.z == z){
				return true;
			}
		}
	}

 

 

 

você pode fazer o "int x1 = " ser um vetor tbm, ai da pra add varias posições em apenas uma variavel, massss ai precisa de outro for pra checar kkkkkkk

Link para o post
Compartilhar em outros sites
  • FeeTads featured this tópico
  • FeeTads pinned this tópico

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 Kuds
      Boas pessoal!
       
      Estou disponibilizando neste fórum a oportunidade para quem é fan de Lord Of the Rings e gostaria de participar na recriação de um mapa baseado no universo de Tolkien. Comecei a projetar o mapa pois sempre gostei do antigo servidor Bronson, então pensei em melhorar ele da melhor forma que posso, e mesmo não sendo Mapper de muito tempo as partes que fiz ja receberam aprovação de conhecidos que acharam interessante o meu estilo por mais simples que seja.
       
      Atualmente ja possuo a base do mapa inteiro de LOTR, recriei ele do 0 seguindo fielmente o formato do mapa, porém ele está com mais de 4x o tamanho do Bronson original. E conforme tenho tempo vou criando áreas do mapa, e no momento ja possuo Bree e Edoras prontas, e estou no processo para recriar Minas Tirith.
       
      Meu objetivo com este Post é achar pessoas que estariam dispostas á participar do grupo de WPP que criei para poder opinar nas votações que faço a respeito do mapa, e talvez achar alguem interessado em ajudar com este projeto. Então qualquer pessoa que tiver interesse fique a vontade para me mandar PM no site!
       
      PS: Não existe nenhuma obrigatoriedade de se manter no grupo, considerando que este é apenas um projeto de carinho ao Tibia e LOTR todos estão livres de sair do projeto a qualquer momento.
    • Por Asnan
      Fusion Games Studio, com orgulho, apresenta um servidor que o levará de volta aos dias de ouro dos jogos, onde a habilidade fazia a diferença, jogar sem bots era o padrão, cada derrota doía e cada vitória trazia uma satisfação genuína.
      Nosso servidor revive o espírito dos jogos clássicos — sem atalhos, sem trapaças, apenas pura estratégia e habilidade.
      Data de lançamento oficial: 18.10.24 15:00
      Junte-se ao Shinobi Legacy hoje!
      Site: https://www.shinobilegacy.pl
      Discord: https://discord.com/invite/ervPpDqjQt
       
      Vídeo promocional
      https://www.youtube.com/watch?v=3Z_HzIdfVjg
       
      Jogue como um dos 16 personagens do universo de Naruto.

       
      Um dos sistemas disponíveis no jogo

       
       
      Aproximamo-nos do Shinobi Legacy com total comprometimento e paixão, cuidando até dos menores detalhes. Nossos esforços e abordagem única nos diferenciam de outros servidores — isso é perceptível desde o primeiro momento em que você experimenta nosso jogo.
      Nosso mapa personalizado em Shinobi Legacy é cuidadosamente elaborado para imergir os jogadores no mundo de Naruto como nunca antes. Cada zona é projetada com detalhes, oferecendo tanto uma experiência nostálgica quanto novos desafios para jogadores de todos os níveis. Masmorras ocultas, caminhos secretos e zonas de guerra perigosas aguardam aqueles que ousam explorar!
      No Shinobi Legacy, o PvP está no coração da experiência. Nossos sistemas, como as habilidades baseadas em guildas, o sistema de adrenalina e a encantação, garantem que nenhuma batalha seja a mesma.
       
      Capturas de tela do jogo

       
       
       
    • Por BTitan
      Baiak Titan: Uma Experiência Incomparável no Universo Baiak
       
      O Baiak Titan combina a nostalgia dos antigos tempos de OTServ com a inovação e modernidade atuais. Oferecemos um mapa vasto, com mais de 100 áreas de caça para explorar, além de vocações equilibradas para um PvP justo e emocionante. Diversos eventos automáticos ocorrem diariamente, garantindo diversão constante para os jogadores. O servidor conta com vários sistemas, como por exemplo, montarias para quem utiliza o cliente exclusivo, monstros do Tibia 9.6+, sistema de mineração, entre outros!
       
      Por Que Escolher o Baiak Titan?
       
      PvP de Alta Qualidade: Embora seja um servidor Baiak, nosso mapa é cuidadosamente projetado para proporcionar ganho de experiência sem perder a seriedade do jogo, oferecendo desafios instigantes e um equilíbrio perfeito para combates épicos.
      Jogabilidade Customizada: O mapa Baiak foi exclusivamente adaptado para promover intensas batalhas de PvP, com recursos inovadores que mantêm a jogabilidade sempre fresca e emocionante.

      Detalhes do Servidor:
       
      IP: baiaktitan.com Website: https://baiaktitan.com Account Manager: 1/1
        Principais Características:
       
      Uptime 24/7, Sem Lag: Jogue a qualquer hora com a estabilidade de servidores dedicados e de alta performance. Velocidade de Ataque Equilibrada: Ajustada perfeitamente para garantir combates dinâmicos e justos. Sistema de Cast: Transmita suas jogadas ao vivo e assista aos seus amigos em ação. Cliente Exclusivo: Software personalizado com novos outfits, montarias e criaturas, enriquecendo ainda mais sua experiência no jogo. Runas, Poções e Flechas Não Infinitas: Valorizamos uma jogabilidade mais estratégica e desafiadora, onde os recursos precisam ser geridos com sabedoria.
      Eventos Automáticos:
       
      Zombie Team Battle Monster Hunter Castle (War of Emperium) Capture The Flag DOTA Corrida Arena War (O último sobrevivente ganha) Fire Storm
        Taxas do Servidor:
       
      EXP: 200x (com stages)
      Skill: 100x
      Magic: 30x
      Loot: 3x
       
      Junte-se à nossa comunidade e viva essa aventura única. O Baiak Titan espera por você!
    • Por HoSOnline
      [BETA][BETA][BETA][BETA][BETA][BETA][BETA][BETA][BETA][BETA][BETA][BETA][BETA][BETA][BETA][BETA][BETA]

      Hello, I would like to introduce you to a server that I have been working on for some time.
      ____________________________________
      Start HoSOnline - Beta 20.09.2024r 18:00 / BR 6:00 pm
      Discord: https://discord.gg/g7uzMzr3dg
      AccMaker: https://hosonline.eu/home.html
      FanPage FB: https://www.facebook.com/historyofshinobionline
      ________________________________


      ____________________________________

      SERVER INFORMATION
      ________________________________

      Exp Rate: MEDIUM

      On the server I currently have:
      (all systems are described on AccMaker)


      ○ 17 Professions
      ○ Shippuden (Reborn System with DB OTS)
      ○ Task System
      ○ Rider System
      ○ Fly System
      ○ Florist System (only Ino)
      ○ Upgrade System
      ○ Class System Broni/EQ
      ○ 'Combo' System
      ○ Specials Jutsu
      ○ Perks System
      ○ Cast System
      ○ Crafting System
      ○ Hiraishin Kunai
      ○ Boss System
      ○ Sag System..


      Sample Screens from the game:









       
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo