Tudo que FeeTads postou
-
Teleport de boss com tempo.
Este tópico foi movido para a seção de Suporte Otserv. vc ja tem? no caso não seria apenas duplicar? se não seja um pouco mais especifico quanto ao script, é só passar no portal e depois não conseguir passar mais durante 2h?
-
[AJUDA] Systema Vip
Este tópico foi movido para a seção de Suporte Otserv. ele setou certo, os.time() = tempo da maquina + (30*24*60*60) = 30 dias esse numero indica tempo da maquina + 30 dias está tudo correto, provavelmente vc não tratou a informação corretamente para mostrar certinho dia horas etc..
-
[AJUDA] Auto-Updater OTC
as pastas, modules, mods, data e o init.lua estão zipados dentro da pasta junto com o client do otc? aqui tem um tutorial sobre o otcv8
-
Quest system 0.1
boa, indico vc fazer o item, ser "reward" e fazer se uma table, pq futuramente vc pode querer entregar mais de 1 item na mesma quest. reward = {{item, qtd}, {item, qtd}}, ai vc indexa com for i=1, #quest.reward do doPlayerAddItem(cid, questId.reward[i][1], questId.reward[i][2]) -- [i][1] = index i, valor 1 (item), [i][2] = index i, valor 2 (qtd) end ja seria um upgrade a mais no script, seria bom sempre fazer a checagem se o item é stackavel ou não tbm, caso n seja stackavel e a QTD seja maior que 1, do "doPlayerAddItem" não adiciona mais que 1 item não stackavel, da pra fazer um função pra isso, ou fazer assim: for i=1, #quest.reward do if not isItemStackable(questId.reward[i][1]) and questId.reward[i][2] > 1 then -- caso o item não seja stackavel e a QTD > 1 for j=1, questId.reward[i][2] do -- vai de 1 a QTD doPlayerAddItem(cid, questId.reward[i][1], 1) -- adicionando o item pro player end else doPlayerAddItem(cid, questId.reward[i][1], questId.reward[i][2]) -- [i][1] = index i, valor 1 (item), [i][2] = index i, valor 2 (qtd) end end da pra fazer disso uma função pra no futuro chamar de qualquer script ao inves de sempre faze-la.
-
Debug no cliente 8.60 custom BufferSize>0 Network.cpp
Isso é um problema do próprio client 8.6, não tem nada que vc possa fazer na source, é uma limitação do client, até hoje nunca vi nada que arrume isso, apenas o OTCv8 corrigiu isso fazendo um novo client (não ironicamente unico modo de resolver isso é trocando de versão)
-
Quest system 0.1
Ótimo conteúdo, obrigado pela contribuição, apenas alguns adendos que podem melhorar o seu código. vc fez um for k, v in pairs(config) do esse for não tem nenhuma condição de parada, porém com 10-15 quests ele executará bem rapido, correto? mas imaginemos um cenário de 100 players clicando no mesmo bau ou outros ao mesmo tempo, ainda assim mesmo não lagando, ele irá fazer checagens desnecessárias. vc pode trocar o for por local questId = config[item.actionid] if questId then --código aqui else -- foi clicado no bau chamado um aid que não existe na config end apartir dai o resto do código já trabalha normal, mas ao invés de usar o K e V do for como params, vc já pode usar o questId. questId.monster / questId.storage .... seria menos checagems, e o questId ja retornaria exatamente o ID da config pra otimizar mais o processo
-
Gold Pouch em Loot Pouch
muda na source o ID da gold punch (pq scripts usam "ITEM_GOLD_PUNCH"), vai no items.xml e muda o nome, e pronto, da uma olhada no player.onMoveItem pra ver se não ta o Id fixo da gold punch. ps: creio que o Id da gold punch na source está no enums.h ou const.h, mudando la o ID pra 0, ja funfa como bag normal. você pode tambem criar uma bp com slot igual a gold punch
-
ajuda em colocar block spawn player
config.lua > procure por monsterSpawnWalkback = true allowBlockSpawn = false troque por monsterSpawnWalkback = false allowBlockSpawn = true
-
(Resolvido)Como eu Deixo a Bless Infinita no Config,lua
Não existe maneira de deixar infinita pelo config.lua, o unico modo é vc fazer um script onLogin que adicione bless sempre que o player logar, ai ao morrer/logar ele recebe bless. Ou criar um script que adicione bless atraves de storage
-
addon doll
troca function onSay(player, words, param) por function addondoll.onSay(player, words, param) ai no final fora da function após o end, adiciona addondoll:itemid(9693) addondoll:register()
-
Erro ao compilar no Ubuntu 20.04 LTS / otx2
esse comando é o comando para compilar usando todos os núcleos da maquina, basicamente o make -j 4, faz compilar usando 4 núcleos da maquina, quando acontece isso, só basta esperar, e depois ir na pasta da source e mover o arquivo "theotxserver" para a pasta raiz do server
-
Erro ao compilar no Ubuntu 20.04 LTS / otx2
isso ai não eh erro, é apenas a criação do executavel. quando da erro aparece "failed" isso ai ta normal, entre na pasta da source > de F5 > procure por Theotxserver > mova pra pasta raiz do servidor (junto com o config.lua) e pronto
-
[AJUDA] MOVER ITENS DENTRO DE BP'S NAS HOUSES
sim procura por ReturnValue Actions::canUse(const Player* player, const Position& pos) { const Position& playerPos = player->getPosition(); if(pos.x == 0xFFFF) return RET_NOERROR; if(playerPos.z > pos.z) return RET_FIRSTGOUPSTAIRS; if(playerPos.z < pos.z) return RET_FIRSTGODOWNSTAIRS; if(!Position::areInRange<1,1,0>(playerPos, pos)) return RET_TOOFARAWAY; return RET_NOERROR; } troca por: ReturnValue Actions::canUse(const Player* player, const Position& pos) { const Position& playerPos = player->getPosition(); if(pos.x == 0xFFFF) return RET_NOERROR; if(playerPos.z > pos.z) return RET_FIRSTGOUPSTAIRS; if(playerPos.z < pos.z) return RET_FIRSTGODOWNSTAIRS; if(!Position::areInRange<1,1,0>(playerPos, pos)) return RET_TOOFARAWAY; Tile* tile = g_game.getTile(pos); if(tile) { HouseTile* houseTile = tile->getHouseTile(); if(houseTile && houseTile->getHouse() && !houseTile->getHouse()->isInvited(player)) return RET_PLAYERISNOTINVITED; } return RET_NOERROR; } isso vai checar se o piso que ele ta tentando dar use é de house e se ele ta invitado *NECESSÁRIO* compilar novamente a source, pode dar somente make mesmo. caso não saiba fazer isso responda aqui me marcando que dou uma instruida.
-
SOCORRO! HACKER INVADINDO MEU SERVIDOR.
passa as espcificações do seu server, e qual ubuntu e usa, fica mais fácil pra ajudar
-
Spell Fast Attack (Efeito no Target)
quando der esse pensa, como vou acertar algo que ja está morto / não existe mais? como checar isso? local target = getCreatureTarget(cid) if target > 0 then if isCreature(target) then ... função ... end end checando se ainda existe aquele creature com "isCreature", pq se não tiver mais la, não fará nada no script pode ser basicamente assim: local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_HITCOLOR, COLOR_LIGHTGREEN) setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, 70) setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -35.0, 0, -40.5, 0) local function onCastSpell1(cid, target, parameters) local position1 = {x=getThingPosition(target).x+0, y=getThingPosition(target).y+0, z=getThingPosition(target).z} doSendMagicEffect(position1, 31) if isCreature(parameters.cid) and isCreature(target) and getCreatureTarget(parameters.cid) > 0 then return isCreature(parameters.cid) and doCombat(parameters.cid, parameters.combat1, parameters.var) end end function onCastSpell(cid, var) local parameters = {cid = cid, var = var, combat1 = combat1} local target = getCreatureTarget(cid) if target <= 0 then return false -- se não tiver target retorna false end for k = 1, 7 do addEvent(function() if isCreature(cid) and isCreature(target) then --checa tanto o cid quanto o target addEvent(onCastSpell1, 1, cid, target, parameters) --passa o parametro do creature target pra função end end, 1 + ((k-1) * 225)) end return true end nessa linha ele passa cid, target, parameters o que pode ser desnecessário, pq o parameters, ja possui na table o cid parameters.cid é a mesma coisa que cid
-
Estatua que nasce Monstro
qq tem na sua linha 115? manda print dessa parte depois de vc ter mexido já
-
Estatua que nasce Monstro
Não deu certo pq vc botou nome errado ou o arquivo no lugar errado, o próprio erro te falou isso. "no such file or directory" vc colocou no XML que o arquivo ta na raiz do actions data/actions/scripts/desafio2.lua < ele ta exatamente nesse diretório? pq a distro falou que não, se tiver dentro de pasta coloque o diretório correto <action actionid="5001;5002" script="PASTA/desafio2.lua" /> << caso esteja dentro de alguma pasta se atente a arrumar os action ID dentro do arquivo pois vai dar erro caso você n arrume. como esta no script -- actions ID da estatua da entrada [25486] = {...}, [25487] = {...}, mude esse action pro action da primeira estatua SE ATENTE BEM AOS ACTIONS
-
AJUDA ONLINE HIGHSCORE
não sei oq tu mexeu pq o layout.php eh gigantesco, mas isso ai é basicamente CSS, só mudar a classe quando checkar se ta online ou não.
-
Char não desloga
se vc usa o sistema de CAST da OTX, é necessário kickar o char (a criatura) pela source, se não não irá deslogar e sumir o personagem
-
Estatua que nasce Monstro
fiz um script que da pra colocar mais de um monstro e recompensas pra cada um no mesmo script vá em: data/actions/actions.xml <action actionid="ACTIOND-ID-DA-ESTATUA;ACTIONID;ACTIONID" script="questVertical.lua" /> INSIRA TODOS os actions ID das estatus, tanto das de entrada (clica pra entrar na sala), como as de recompensa ps: se for em sequencia, tipo 5001,5002,5003... só é necessário colocar o primeiro e o ultimo, ex: 5001-5003, porém PRESTE BASTANTE ATENÇÃO! Agora vá em: data/actions/scripts/questVertical.lua (caso não exista pode criar e excluir os scripts antigos dessa quest) e copie esse código dentro: --[[ SCRIPT FEITO POR FEETADS - TIBIAKING ]]-- --[[straikar - 15/02/23]]-- / discord: FeeTads#0246 local config = { -- actions ID da estatua da entrada [25486] = {storage_timer = 5341352, posPlayer = {x = 1000, y = 1000, z = 7}, monster_name = "Papao", posMonstro = {x = 1000, y = 1000, z = 7}, posSaida = {x = 1000, y = 1000, z = 7}, fromP={x = 931, y = 1270, z = 9}, toP={x = 936, y = 1276, z = 9}}, [25487] = {storage_timer = 5341353, posPlayer = {x = 1001, y = 1001, z = 7}, monster_name = "Papao2", posMonstro = {x = 1001, y = 1001, z = 7}, posSaida = {x = 1001, y = 1001, z = 7}, fromP={x = 931, y = 1270, z = 9}, toP={x = 936, y = 1276, z = 9}}, -- caso queira colocar outros, só repetir ^ e mudar a storage, o action id e as posições etc.. use_cooldown_global = false, -- se vc colocar true aqui, TODAS as salas de quest onde o player tentar entrar, vão ter o mesmo cooldown ou seja 1 sala a cada 5 mins, se for false, pode entrar em outra sala logo em seguida storage_timer_global = 5341350, -- storage de exaust pra entrar de novo exaust_entrar_denovo = 5 * 60, -- 5*60 = 5 minutos need_level = 100, -- level necessário para entrar / caso não precise coloque 1 ou 8 remover_player_tempo = true, -- remover o player depois de tanto tempo la dentro? / evita o player ficar la trapando o dia todo remover_timer = 10*60, -- quando tempo la dentro pra remover? / 10*60 = 10 minutos } local REWARD = { --[action id] = {rewards = {{item, quantidade}, {item, quantidade}}}, -- pode colocar quantas rewards quiser [5032] = {storage_reward = 5441400, rewards = {{2160, 1}, {2148, 100}, {2152, 50}}}, [5033] = {storage_reward = 5441401, rewards = {{2160, 1}}}, -- quando diminuir a quantidadede recompensa, ceritifique que deixou certo a quantidade de {} pra n bugar o script repetir_reward = false, -- ganhar a recompensa sempre que fizer a quest? teleportar_final = {x=1000,y=1000,z=7}, -- pra onde teleportar quando ele clicar na estatua de recompensa? (normalmente eh o templo) } -- função de tempo local function getTimeString(self) local format = { {'dia', self / 60 / 60 / 24}, {'hora', self / 60 / 60 % 24}, {'minuto', self / 60 % 60}, {'segundo', self % 60} } local out = {} for k, t in ipairs(format) do local v = math.floor(t[2]) if(v > 0) then table.insert(out, (k < #format and (#out > 0 and ', ' or '') or ' e ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or '')) end end local ret = table.concat(out) if ret:len() < 16 and ret:find('segundo') then local a, b = ret:find(' e ') ret = ret:sub(b+1) end return ret end -- FUNÇÃO PARA KICKAR O PLAYER DA SALA APÓS TANTO TEMPO local function removePlayersTime(frompos, topos) for x = frompos.x, topos.x do for y = frompos.y, topos.y do local remove, clean = true, true local pos = {x = x, y = y, z = frompos.z} local m = getTopCreature(pos).uid if m ~= 0 and isPlayer(m) then doTeleportThing(m, getTownTemplePosition(1)) end end end return true end -- FUNÇÃO PARA REMOVER O BOSS AO KICKAR O PLAYER DA SALA local function verificaBoss(frompos, topos) for x = frompos.x, topos.x do for y = frompos.y, topos.y do if isMonster(getThingFromPos({x = x, y = y, z = frompos.z, stackpos = 253}).uid) then doRemoveCreature(getThingFromPos({x = x, y = y, z = frompos.z, stackpos = 253}).uid) end end end end local function give_reward(cid, entregar) local text = 'você recebeu ' -- string que salvará o nome das recompensas if entregar then -- existe as rewards? for i=1, #entregar do doPlayerAddItem(cid, entregar[i][1], entregar[i][2]) -- adiciona os item ao player text = text..entregar[i][2]..getItemNameById(entregar[i][1])..entregar[i][1] > 1 and "s" or "" if i == #entregar then text = text.."." -- caso seja o ultimo coloca ponto final else text = text..", " -- se não, bota virgula end end doPlayerSendTextMessage(cid, 22, text) end return true end local saveEvent = {} -- evento pra checkar o player na sala de espera function onUse(cid, item, frompos, itemEx, topos) local check = {} local actionID = item.actionid if config[actionID] then -- checa o cooldown e se pode entrar na sala if config.use_cooldown_global then if getPlayerStorageValue(cid, config.storage_timer_global) - os.time() > 0 then doPlayerSendCancel(cid, 'Aguarde, você ainda não pode entrar, está com cooldown de'..getTimeString(getPlayerStorageValue(cid, config.storage_timer_global) - os.time())..'.') return true end else if getPlayerStorageValue(cid, config[actionID].storage_timer) > 0 then doPlayerSendCancel(cid, 'Aguarde, você ainda não pode entrar, está com cooldown de'..getTimeString(getPlayerStorageValue(cid, config[actionID].storage_timer) - os.time())..'.') return true end end if #getPlayersInArea(config.[actionID].fromP, config.[actionID].toP) > 0 then doPlayerSendCancel(cid, 'Aguarde, tem jogadores la dentro.') return true end if getPlayerLevel(cid) < config.need_level then doPlayerSendCancel(cid, 'Você não tem o level necessário.') return true end -- caso tenha o level, e não tenha player la dentro, então faz a quest acontecer verificaBoss(config.[actionID].fromP, config.[actionID].to) -- remove o boss do antigo player caso haja doTeleportThing(cid, config[actionID].posPlayer) -- teleporta o player pra posição doCreateMonster(config[actionID].monster_name, config[actionID].posMonstro, false, true) -- cria o monstro na posição if config.remover_player_tempo then -- se remover o player depois de tanto tempo for true saveEvent[getPlayerGUID(cid)] = addEvent(function() removePlayersTime(config.[actionID].fromP, config.[actionID].toP) end, config.remover_timer * 1000) -- remover o player depois do tempo end if config.use_cooldown_global then setPlayerStorageValue(cid, config.storage_timer_global, os.time() + config.exaust_entrar_denovo) -- cooldown caso seja de todas as salas / n mexer else setPlayerStorageValue(cid, config[actionID].storage_timer, os.time() + config.exaust_entrar_denovo) -- cooldown pra entrar de novo / n mexer end return true end -- ESTATUA DE RECOMPENSA if REWARD[actionID] then -- caso tenha clicado na estatua de recompensa local entregar = REWARD[actionID].rewards if getPlayerStorageValue(cid, REWARD[actionID].storage_reward) == -1 then -- caso nunca tenha recebido a recompensa give_reward(cid, entregar) else -- caso ja tenha recebido if REWARD.repetir_reward then -- checa se pode repetir a recompensa give_reward(cid, entregar) else -- se não só da a mensagem q ja recebeu doPlayerSendTextMessage(cid, 22, "Você já recebeu sua recompensa.") end end doTeleportThing(cid, REWARD.teleportar_final) -- teleporta o player pra posição quando clicar na estatua de recompensa stopEvent(saveEvent[getPlayerGUID(cid)]) -- para o evento de jogar ele pro templo saveEvent[getPlayerGUID(cid)] = nil end return true end
-
[AJUDA] Bomberman
Este tópico foi movido para a seção de Suporte Otserv.
-
NPC TELEPORT POR X ITEM [ tfs 0.3.6 ]
pelo que entendi, vc quer um script que teleporte o personagem, basicamente um barco? é necessário ser um NPC? se sim, esse script ta bem desatualizado. tem como fazer ele por movements mais simples e mais facil.
-
Script Varinha treino novos players
tenta assim então local dailyWand = TalkAction("!wand") local vocs = {[1] = "D", [2] = "S", [5] = "ED", [6] = "MS"} --1 druid / 2 sorc / 5 ED / 6 MS function dailyWand.onSay(player, words, param) if not vocs[player:getVocation()] then player:sendCancel("somente Sorcerers e Druid podem receber está recompensa") return true end local storage = 556655001 local getStor = player:getStorageValue(storage) if getStor == -1 then --se a storage for -1, significa que nunca deu o comando player:addItem(28557, 500) player:setStorageValue(storage, 1) -- seta a storage pra 1 = ja pegou else player:sendCancel("você já pegou sua recompensa.") end return false end dailyWand:register() já aqui não entendi, pq ta tudo certo, tenta reabrir o OT ao inves de dar reload
-
Script Varinha treino novos players
local dailyWand = TalkAction("!wand") local vocs = {1,2,5,6} --1 druid / 2 sorc / 5 ED / 6 MS function dailyWand.onSay(player, words, param) if not vocs[player:getVocation()] then player:sendCancel("somente Sorcerers e Druid podem receber está recompensa") return true end local storage = 556655001 local getStor = player:getStorageValue(storage) if getStor == -1 then --se a storage for -1, significa que nunca deu o comando player:addItem(28557, 500) player:setStorageValue(storage, 1) -- seta a storage pra 1 = ja pegou else player:sendCancel("você já pegou sua recompensa.") end return false end dailyWand:register() checando as vocs assim, da pra deixar, ps: NÃO sei se vai funcionar do jeito que coloquei ali, creio que vá, caso outras vocs consigam me avisa
-
Script Varinha treino novos players
pelo que entendi a cada 24h o player digita e ganha a varinha né? só mudar onde ele checa por tempo local dailyWand = TalkAction("!wand") function dailyWand.onSay(player, words, param) local storage = 556655001 local getStor = player:getStorageValue(storage) if getStor == -1 then --se a storage for -1, significa que nunca deu o comando player:addItem(28557, 500) player:setStorageValue(storage, 1) -- seta a storage pra 1 = ja pegou else player:sendCancel("você já pegou sua recompensa.") end return false end dailyWand:register() caso você queira que todas as vocações receberam a sua respectiva varinha, tem que replicar o scrit mudando o item, da pra fazer tudo em um só, mas ai vai mais verificações