Normal + Derivado [VIDEO] Adicionando Sprite, editando itens e gerando otb.
-
Quem Está Navegando 0 membros estão online
Nenhum usuário registrado visualizando esta página.
-
Conteúdo Similar
-
Por Johncore
Otg Server Global
Somos o Otg Server, projeto baseado no TFS 1.3 e OTX3.2,
Se trata de um servidor baseado no GLOBAL MAP RL.
Aqui você encontrará baixo uso de recursos como CPU / memoria, prezamos muito por estabilidade e atualizações constantes.
Agradecemos primeiramente ao Tibiaking pela oportunidade nos concedida,
somos parceiros oficiais do Tibiaking.com melhor Forum Brasileiro!
Especificações :
- Global Map FULL RL
- Maioria das Quests com Quest Log 100%
- Anti Rollback + Auto Restart 100%
- Source Otimizada (baixo consumo de CPU e memoria)
- Sem Bug de Clonar dinheiro (Npcs Refeitos
- Exercise Training 100%
- Raids 100%
- Monstros 100%
Imagens :
THAIS TEMPLE
FALCONS
NEW ASURAS
WZ 4,5,6
Downloads :
PROJETO OFFICIAL GITHUB:
https://github.com/otg-br/global-11x
TUTORIAL PARA COMPILAÇÃO:
https://github.com/otg-br/global-11x/wiki
EXE compilado WIN11 64bits:
https://github.com/otg-br/global-11x/blob/main/Executavel compilado win11 64bits.rar
GRUPO WHATSAPP OTG SERVER:
https://chat.whatsapp.com/EWV3dVvS6nt1em7q23FGu7
Créditos :
The Forgotten Server
Otland
Mark Samman
Mattyx Otx
Erick Nunes
Johncore
Otg Server contribuidores
OTX contribuidores
Otservbr
Leu
Marcomoa
Marson Schneider
Leandro Baldissera
-
Por L3K0T
Bom, como todos sabem, existe o shop.lua em servidores 0.4 para receber itens. Muitos deles têm loops infinitos ou fazem uma varredura completa no banco de dados, o que pode deixá-los instáveis. Isso ocorre principalmente quando o script não verifica adequadamente se há itens para processar ou se o banco de dados está sobrecarregado com consultas desnecessárias.
No entanto, com algumas melhorias, podemos otimizar esse processo, garantindo que o servidor se mantenha estável e eficiente. No nosso exemplo, aplicamos algumas mudanças importantes:
Checagem eficiente de itens pendentes: A consulta ao banco de dados foi otimizada para verificar se existem realmente itens pendentes para o jogador. Se não houver itens, o script termina sua execução rapidamente, evitando sobrecarga.
Evitar loops infinitos: O loop foi ajustado para garantir que, se não houver mais itens para processar, o script saia sem continuar verificando o banco de dados, prevenindo loops desnecessários.
Logs: Foi adicionado um sistema de logs, onde cada transação bem sucedida do jogador é registrada com data e hora, além de informações sobre o jogador e os itens recebidos.
Execução controlada com intervalos: Ao invés de fazer consultas contínuas ao banco de dados, o script executa checagens de tempos em tempos, configuráveis pelo parâmetro SQL_interval. Isso distribui as verificações ao longo do tempo e evita que o servidor fique sobrecarregado com solicitações simultâneas.
Segue o scripts:
data/globalevents/scripts/shop.lua
function getCurrentDateTime() local currentDateTime = os.date("%Y-%m-%d %H:%M:%S") return currentDateTime end function createDirectoryIfNotExists(dir) local command = "mkdir -p " .. dir os.execute(command) end function saveLog(message) local logFilePath = "data/logs/shop/shop.txt" local logDir = "data/logs/shop/" createDirectoryIfNotExists(logDir) local currentDateTime = getCurrentDateTime() local logMessage = string.format("[%s] %s\n", currentDateTime, message) local file = io.open(logFilePath, "a") if file then file:write(logMessage) file:close() else print("Erro ao tentar escrever no arquivo de log.") end end SHOP_MSG_TYPE = 19 SQL_interval = 5 function onThink(interval, lastExecution) local result_plr = db.getResult("SELECT * FROM z_ots_comunication WHERE `type` = 'login';") if result_plr:getID() == -1 then return true end local hasMoreItems = false while true do local id = tonumber(result_plr:getDataInt("id")) local cid = getCreatureByName(tostring(result_plr:getDataString("name"))) if isPlayer(cid) then hasMoreItems = true local itemtogive_id = tonumber(result_plr:getDataInt("param1")) local itemtogive_count = tonumber(result_plr:getDataInt("param2")) local add_item_name = tostring(result_plr:getDataString("param6")) local received_item = 0 local full_weight = 0 if isItemRune(itemtogive_id) then full_weight = getItemWeightById(itemtogive_id, 1) else full_weight = getItemWeightById(itemtogive_id, itemtogive_count) end local free_cap = getPlayerFreeCap(cid) if full_weight <= free_cap then local new_item = doCreateItemEx(itemtogive_id, itemtogive_count) received_item = doPlayerAddItemEx(cid, new_item) if received_item == RETURNVALUE_NOERROR then doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, string.format("Você recebeu >> %s << da loja.", add_item_name)) doPlayerSave(cid) db.executeQuery("DELETE FROM `z_ots_comunication` WHERE `id` = " .. id .. ";") db.executeQuery("UPDATE `z_shop_history` SET `trans_state`='realized', `trans_real`=" .. os.time() .. " WHERE id = " .. id .. ";") saveLog(string.format("[%s] %s (ID: %d), Você recebeu >> %s << da loja.", getCurrentDateTime(), tostring(result_plr:getDataString("name")), id, add_item_name)) end else doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, string.format("Você não tem capacidade suficiente para >> %s <<. Necessário: %.2f oz. Disponível: %.2f oz.", add_item_name, full_weight, free_cap)) saveLog(string.format("[%s] %s (ID: %d), Tentou comprar >> %s <<, mas não tinha capacidade suficiente. Necessário: %.2f oz. Disponível: %.2f oz.", getCurrentDateTime(), tostring(result_plr:getDataString("name")), id, add_item_name, full_weight, free_cap)) end end if not result_plr:next() then break end end result_plr:free() if not hasMoreItems then return false end return true end
data/globalevents/globalevents.xml
<globalevent name="shop" interval="30000" script="shop.lua"/>
*Testado em Myaac
*Testado em OTX2 8.60
*Testado em Ubuntu 20.04
*Não precisa criar pasta, ele mesmo cria.
Com essas melhorias, a performance do servidor foi significativamente melhorada, garantindo que o sistema de loja funcione de forma mais estável e eficiente, sem sobrecarregar o banco de dados ou causar lags. Agora, a transação de itens na loja ocorre de forma mais controlada e com menos chance de erros ou travamentos. by @L3K0T
-
Por FeeTads
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**
-
-
Estatísticas dos Fóruns
96846
Tópicos519602
Posts
Posts Recomendados
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.