Postado Maio 6, 2022 3 anos 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**
Postado Outubro 16, 2022 2 anos desculpa, mas não entendi direito como adcionar novas areas, vc pode me explicar melhor?
Postado Outubro 16, 2022 2 anos 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
Postado Outubro 16, 2022 2 anos 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
Postado Outubro 17, 2022 2 anos Autor 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
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.