
Arthasz Walker
Membro
-
Registro em
-
Última visita
Histórico de Curtidas
-
Arthasz Walker recebeu reputação de Orionx em Novo LauncherMe desculpem por reviver o tópico, mas o download está com o link quebrado, poderiam arrumar?
-
Arthasz Walker deu reputação a marcot em (Resolvido)pedido script held fusion@Arthasz Walker,
Desculpa, fiz um erro besta, nem lembrei que prices era um array kkk. Acho que dessa vez vai, desculpa mesmo não estar podendo testar no momento estou sem meu desktop com os arquivos de otserver
Tenta essa versão:
-- Configuracoes necessarias para o script local config = { quest = { -- Precisa fazer quest? (Nao mexa caso negativo) necessaria = false, -- Eh necessario fazer uma quest para liberar o sistema? storageID = 10001, -- Qual o storageID dessa quest? (caso true, anteriormente) }, chestPos = {x = 92, y = 114, z = 7, stackpos = 1}, -- Posicao do Bau (certifique-se que nao tenha nada encima dele) -- Tenha atencao para que a soma das chances dos helds em cada tier seja igual a 100 prices = { ["tier_1"] = 60000, ["tier_2"] = 150000, ["tier_3"] = 300000, ["tier_4"] = 700000, ["tier_5"] = 1000000, ["tier_6"] = 1500000, }, helds = { -- Item IDs e chance de vir o held [1] = { -- Array Tier 1 {ID = 2159, chance = 10}, {ID = 2160, chance = 80}, {ID = 2158, chance = 10}, }, [2] = { -- Array Tier 2 {ID = 2000, chance = 20}, {ID = 2001, chance = 20}, {ID = 2002, chance = 20}, {ID = 2003, chance = 20}, {ID = 2004, chance = 20}, }, [3] = { -- Array Tier 3 }, [4] = { -- Array Tier 4 }, [5] = { -- Array Tier 5 }, [6] = { -- Array Tier 6 }, [7] = { -- Array Tier 7 }, }, } function onUse(cid, item, fromPosition, itemEx, toPosition) if config.quest.necessaria and getPlayerStorageValue (cid, config.quest.storageID) == 0 then -- Erro caso a pessoa use a maquina sem ter feito a quest -- Valido apenas quando a opcao esta ativada doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You don\'t have permission to use this machine.") return false end items = {nil, nil, nil} container = getThingFromPos(config.chestPos) for i = 0, 2 do items[i + 1] = getContainerItem (container.uid, i) if items [i + 1].itemid == 0 or items [i + 1].itemid == nil then -- Erro quando tem menos de 3 itens no bau doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need 3 held items to fuse.") return false end end heldType = {nil, nil, nil} for j=1, 3 do for i=1, 7 do for k = 1, #config.helds[i] do if config.helds[i][k].ID == items[j].itemid then heldType[j] = i end end end if heldType [j] == nil then -- Erro a ser exibido caso o jogador coloque algum item que nao seja um held na maquina doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "This machine works only to held items.") return false end end if heldType[1] ~= heldType[2] or heldType[2] ~= heldType[3] then -- Erro a ser exibido caso o jogador coloque helds de tiers diferentes doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need helds with the same tier.") return false elseif heldType[1] == 7 or heldType[2] == 7 or heldType[3] == 7 then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You cannot fuse tier 7 held items.") return false end if not doPlayerRemoveMoney(cid, config.prices["tier_"..heldType[1]]) then -- Se nao for possivel retirar a quantia de dinheiro do jogador, finalizar script doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need " .. config.prices.tier_..heldType[1] .. " gold to fuse tier ".. heldType[1].. " held items.") return false end -- Sortear qual held vira for i = 1, 3 do doRemoveItem(items[i].uid, 1) end tierSorteado = heldType[1] + 1 numeroSorte = math.random(1, 100) itemIDSorteado = sorteiaValor (tierSorteado, numeroSorte) doPlayerAddItem(cid, itemIDSorteado, 1) -- Mensagem exibida ao fundir com sucesso doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You received your new held item.") return true end -- Função retirada de https://pt.stackoverflow.com/questions/147884/sorteio-aleat%C3%B3rio-mas-com-diferentes-probabilidades function sorteiaValor (tierSorteado, numeroSorte) x = numeroSorte for i = 1, #config.helds[tierSorteado] do x = x - config.helds[tierSorteado][i].chance if x <= 0 then return config.helds[tierSorteado][i].ID end end end
-
Arthasz Walker deu reputação a xWhiteWolf em OTserver da lucro?Sim e não,
Otserver dá muito dinheiro, mas o tempo que demora pra você ter lucro simplesmente não compensa, a menos que você ame o que você tá fazendo.
Um host é relativamente barato e é o único gasto que você vai ter quando tudo estiver pronto (e propagandas), o que ninguém te conta é o caminho até isso acontecer.
1- Se você tiver uma equipe, você vai ter que dividir grande parte dos ganhos
2- Se vc não tiver, bem, vai acabar saindo mais caro pq cada probleminha que você tiver vai ter que pagar alguem pra resolver, sem falar que se você não manjar, vc não vai ter nenhuma segurança sobre a qualidade do serviço que cada um está fazendo (principalmente pra scripting)
3- Se você realmente for querer inovar e fazer bem feito, vai levar uns bons anos pro seu projeto sair, todo esse tempo você vai ter que arcar com os gastos sem receber nada por isso e a equipe pode mudar muitas vezes, vc vai correr risco de alguém vender partes (ou todo seu projeto) ou até você mesmo acabar desistindo pela demora e pelo trabalho.
4- Após tudo isso, você vai ter um jogo 'relativamente pronto' é hora de começar os testes e descobrir se vai agradar o publico ou não.
4.1 - Se agradar, colete os feedbacks do que poderia melhorar, faça um panorama do que é critica válida e do que é choro e arrume as coisas, serão mais algumas semanas ou meses pra finalizar.
4.2 se não agradar vc tem um grande problema nas mãos, pq vc vai estar de volta no passo 2.
5- Considerando tudo isso, agora você precisa investir MUITO HARD em marketing. O grande pico da maioria dos otservers é no inicio, se seu servidor não bater 300 na primeira semana, tenho uma má notícia pra você... a chance de você conseguir conquistar mais público depois é MUITO pequena.
6- Chegou a data do lançamento, você precisa coordenar e coletar feedbacks, precisa ter muita gente para auxiliar os jogadores e resolver imediatamente quaisquer problemas. Vai ter muitas reclamações e muita gente falando ao mesmo tempo, essa é a parte em que geralmente as pessoas começam a surtar e pensar em abandonar o projeto. Tenha canais e pessoal suficiente para atender todos os jogadores, do contrário as pessoas vão desistir muito rápido.
6.5- Esteja preparado para inveja, ataques e bugs: isso é uma certeza absoluta no mundo de otserver. As pessoas vão achar bugs, explorar eles seja para lucro pessoal ou para acabar com seu jogo, você precisa ter maturidade suficiente para saber lidar com isso da melhor maneira possível. Ter uma boa equipe de prontidão é essencial aqui, principalmente se for um erro desconhecido. No meu servidor eu tive 4 problemas que foram 'críticos', o primeiro foi um GM que editou o mapa para colocar vários bags espalhados e escondidos no mapa com dinheiro e itens para ajudar os amigos dele (e a si próprio); O segundo foi um baú de potions que havia na cidade onde as pessoas ficavam criando infinitas contas para acumular e vender potions; o terceiro foi um crash na source que até hoje a gente não sabe porque ocorre (fizemos trace com o gdb e achamos a linha que ele ocorre, tentamos resolver e nada); um bug nas houses que fez muita gente perder a house (as vezes com todos os itens dentro). O tfs oficial tem muitos issues conhecidos que as pessoas corrigem e não contam pra ngm como, também tem muitos issues desconhecidos que ninguém reportou pra poder ficar derrubando o jogo alheio. Se previna e se prepare pro pior, talvez tenha até que desembolsar dinheiro para pagar alguém pra resolver.
7- Depois da primeiras semana, você precisa usar todo o dinheiro que você conseguir para dar a tacada final e investir pesado em marketing. Essa provavelmente vai ser a hora de você desembolsar alguns mils e pegar propaganda em youtube, facebook, otlists, foruns. O céu é o limite.
8- Quando finalmente você tiver feito tudo isso, tem duas possibilidades: seu servidor pode dar certo ou fracassar.
Por mais que você tenha se esforçado ou esteja disposto a melhorar, fracassar é sempre uma possibilidade. Tente estar aberto pra essa opção e saiba a hora de admitir que fracassou mas sem desistir. Se der certo continue mantendo uma média de investimento em propagandas razoável mas não precisa ser nada muito absurdo. Grande parte da sua divulgação agora vai ser o boca-a-boca e sua própria posição na otservlist.
Caso tudo falhe, não tenha medo de fechar o servidor e começar a corrigir tudo. Não tenha medo de atrasar mais alguns anos para garantir que tudo está perfeito e testar com diferentes públicos para ver se eles aprovam seu jogo. Lembre-se, um atraso é temporário, um jogo ruim é ruim para sempre.
Essa é a sabedoria que eu deixo aqui, e que eu aprendi na marra com o Empire.
-
Arthasz Walker recebeu reputação de Nyksad em [SHOW OFF] Boss DetectorMuito legal, tem chances de disponibilizar? haha ajudaria e muito
-
Arthasz Walker deu reputação a Pedriinz em [TFS 1.x] Anti BotComo o nome do tópico diz, eu trouxe para vocês um sistema de anti bot.
Minha intenção é atualizar este código ao máximo, deixando o mesmo bastante customizável.
Quaisquer erros ou problemas por favor me deixe saber.
Como ele funciona?
Após um jogador matar uma quantidade x de monstros, o sistema irá realizar uma verificação com ele para saber se o mesmo está ou não 100% afk.
Essa verificação é feita através de um channel que se abre após o jogador matar a quantidade de monstros, realizando uma pergunta para o jogador.
O que é possível configurar?
Praticamente tudo! Você também pode adicionar quantas perguntas desejar! Organizei o script para que qualquer um possa realizar as configurações que desejar. Confira:
ANTI_BOT_SYSTEM = { config = { minMonstersToCheck = 2, -- O sistema irá escolher aleatoriamente um número de monstros entre esses dois valores para verificar. maxMonstersToCheck = 4, channelId = 10, -- Id do channel que será aberto para realizar a verificação. timeToAnswer = 10, -- Quanto tempo em segundos o jogador tem para responder a verificação. monstersForNotCheck = {'rat', 'bug', 'tiger'}, -- Monstros que não serão verificados pelo sistema. notations = 3, -- Quantas notificações o jogador pode receber antes de ser banido. banDays = 1, -- Quantidade de dias o personagem vai ficar banido por utilizar bot. storageForNotations = 1222, -- Storage onde ficará salvo as notations. storageForOpenChat = 10383, -- Storage que permitira o chat ser aberto. (Aconselho não mudar). }, questions = { [1] = {question = 'Digite quantas letras possui a palavra: Carro', answer = '5'}, [2] = {question = 'O que significa Ying e Yang?', answer = 'bem e o mal'}, [3] = {question = 'Qual é a cor do sol?', answer = 'amarelo'}, --[numero seguinte] = {question = 'pergunta', answer = 'resposta'}, }, cache = { players = { --[player:getId()] = {count = 1} }, question = 0, }, messages = { reason = {msg = 'Você foi banido por utilizar bot 100% AFK.'}, notation = {msg = 'Você foi penalizado e recebeu um notificação. Lembre-se que após receber 3 notificações você será banido. Você possui %d notificações no momento.', type = MESSAGE_EVENT_ADVANCE}, attention = {msg = '[Anti-Bot] Atenção! Você só possui %d segundos para responder a verificação.', type = TALKTYPE_CHANNEL_O}, channel_enter = {msg = '[Anti-Bot] Você está sobre suspeitas de uso aplicativos não autorizados.\nPor favor, confirme a verificação a seguir, você possui %d segundos para isso.', type = TALKTYPE_CHANNEL_O}, channel_close = {msg = '[Anti-Bot] Para sua segurança, não é possivel fechar este channel antes da verificação. Por favor responda o que lhe foi perguntado para que não seja penalizado.', type = TALKTYPE_CHANNEL_O}, wrong_answer = {msg = '[Anti-Bot] Resposta errada, por favor tente novamente.', type = TALKTYPE_CHANNEL_O}, correct_answer = {msg = '[Anti-Bot] Você respondeu corretamente, obrigado e bom jogo! Você já pode fechar este channel.', type = TALKTYPE_CHANNEL_O}, unconfirmed = {msg = 'Você não realizou a verificação corretamente, por isso você foi penalizado. Este channel já pode ser fechado.', type = TALKTYPE_CHANNEL_O}, } }
Tudo dentro desses espaços pode ser configurado sem nenhuma complicação!
Instalação:
Vá na pasta creaturescript/scripts do seu servidor e crie um arquivo com o nome de antibot.lua e adicione o seguinte conteúdo:
--[[ ## SCRIPT BY: Pedriinz ## ## CONTACT SKYPE: pedrosz4 ## ]] ANTI_BOT_SYSTEM = { config = { minMonstersToCheck = 2, -- O sistema irá escolher aleatoriamente um número de monstros entre esses dois valores para verificar. maxMonstersToCheck = 4, channelId = 10, -- Id do channel que será aberto para realizar a verificação. timeToAnswer = 10, -- Quanto tempo em segundos o jogador tem para responder a verificação. monstersForNotCheck = {'rat', 'bug', 'tiger'}, -- Monstros que não serão verificados pelo sistema. notations = 3, -- Quantas notificações o jogador pode receber antes de ser banido. banDays = 1, -- Quantidade de dias o personagem vai ficar banido por utilizar bot. storageForNotations = 1222, -- Storage onde ficará salvo as notations. storageForOpenChat = 10383, -- Storage que permitira o chat ser aberto. (Aconselho não mudar). }, questions = { [1] = {question = 'Digite quantas letras possui a palavra: Carro', answer = '5'}, [2] = {question = 'O que significa Ying e Yang?', answer = 'bem e o mal'}, [3] = {question = 'Qual é a cor do sol?', answer = 'amarelo'}, --[numero seguinte] = {question = 'pergunta', answer = 'resposta'}, }, cache = { players = { --[player:getId()] = {count = 1} }, question = 0, }, messages = { reason = {msg = 'Você foi banido por utilizar bot 100% AFK.'}, notation = {msg = 'Você foi penalizado e recebeu um notificação. Lembre-se que após receber 3 notificações você será banido. Você possui %d notificações no momento.', type = MESSAGE_EVENT_ADVANCE}, attention = {msg = '[Anti-Bot] Atenção! Você só possui %d segundos para responder a verificação.', type = TALKTYPE_CHANNEL_O}, channel_enter = {msg = '[Anti-Bot] Você está sobre suspeitas de uso aplicativos não autorizados.\nPor favor, confirme a verificação a seguir, você possui %d segundos para isso.', type = TALKTYPE_CHANNEL_O}, channel_close = {msg = '[Anti-Bot] Para sua segurança, não é possivel fechar este channel antes da verificação. Por favor responda o que lhe foi perguntado para que não seja penalizado.', type = TALKTYPE_CHANNEL_O}, wrong_answer = {msg = '[Anti-Bot] Resposta errada, por favor tente novamente.', type = TALKTYPE_CHANNEL_O}, correct_answer = {msg = '[Anti-Bot] Você respondeu corretamente, obrigado e bom jogo! Você já pode fechar este channel.', type = TALKTYPE_CHANNEL_O}, unconfirmed = {msg = 'Você não realizou a verificação corretamente, por isso você foi penalizado. Este channel já pode ser fechado.', type = TALKTYPE_CHANNEL_O}, } } function vericationBot(cid) local player = Player(cid) local timeNow = os.time() if not player then return true end if not ANTI_BOT_SYSTEM.cache.players[player:getId()] or ANTI_BOT_SYSTEM.cache.players[player:getId()].verified == false then return true else player:sendChannelMessage("", ANTI_BOT_SYSTEM.messages.unconfirmed.msg, ANTI_BOT_SYSTEM.messages.unconfirmed.type, ANTI_BOT_SYSTEM.config.channelId) ANTI_BOT_SYSTEM.cache.players[player:getId()] = nil if player:getStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations) < ANTI_BOT_SYSTEM.config.notations then if player:getStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations) ~= -1 then player:setStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations, math.max(player:getStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations) + 1)) else player:setStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations, 1) end player:teleportTo(player:getTown():getTemplePosition()) player:sendTextMessage(ANTI_BOT_SYSTEM.messages.notation.type, string.format(ANTI_BOT_SYSTEM.messages.notation.msg, math.max(player:getStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations)))) else player:teleportTo(player:getTown():getTemplePosition()) db.query("INSERT INTO `account_bans` (`account_id`, `reason`, `banned_at`, `expires_at`, `banned_by`) VALUES (" ..getAccountNumberByPlayerName(player:getName())..", "..db.escapeString(ANTI_BOT_SYSTEM.messages.reason.msg)..", "..timeNow..", "..timeNow + (ANTI_BOT_SYSTEM.config.banDays * 86400) ..", 1)") player:remove() end end return true end function onKill(creature, target) local targetMonster = target:getMonster() local player = creature:getPlayer() local random = math.random(ANTI_BOT_SYSTEM.config.minMonstersToCheck, ANTI_BOT_SYSTEM.config.maxMonstersToCheck) if not targetMonster then return true end if isInArray(ANTI_BOT_SYSTEM.config.monstersForNotCheck, targetMonster:getName():lower()) then return true end if not ANTI_BOT_SYSTEM.cache.players[player:getId()] then ANTI_BOT_SYSTEM.cache.players[player:getId()] = {count = 1, verified = false} else if ANTI_BOT_SYSTEM.cache.players[player:getId()].count >= random then ANTI_BOT_SYSTEM.cache.players[player:getId()] = {count = math.max(ANTI_BOT_SYSTEM.cache.players[player:getId()].count), verified = true} player:openChannel(ANTI_BOT_SYSTEM.config.channelId) player:getPosition():sendMagicEffect(CONST_ME_TUTORIALSQUARE) else ANTI_BOT_SYSTEM.cache.players[player:getId()] = {count = math.max(ANTI_BOT_SYSTEM.cache.players[player:getId()].count) + 1, verified = false} end end return true end Após feito isso, abre o arquivo creaturescript/creaturescript.xml e adicione esta linha:
<!-- Anti Bot by Pedriinz --> <event type="kill" name="AntiBot" script="antibot.lua" /> Feito isso, abra o arquivo: creaturescript/scripts/others/login.lua e registre o script com a tag:
'AntiBot', Exemplo:
local events = { 'ElementalSpheresOverlords', 'BigfootBurdenVersperoth', 'Razzagorn', 'Shatterer', 'Zamulosh', 'The Hunger', 'AntiBot', } Agora, abre o arquivo chatchannels/chatchannels.xml e adicione a seguinte tag:
<channel id="10" name="Anti Bot" public="1" script="antibot.lua" /> Lembre-se que o ID deve ser o mesmo que você configurou no script principal lá em cima.
Agora abra a pasta chatchannels/scripts/ crie um script chamado antibot.lua e adicione:
function onJoin(player) if not player then return true end if not ANTI_BOT_SYSTEM.cache.players[player:getId()] or ANTI_BOT_SYSTEM.cache.players[player:getId()].verified == false then player:popupFYI('You can\'t open this channel.') return false end addEvent(function() player:sendChannelMessage("", string.format(ANTI_BOT_SYSTEM.messages.channel_enter.msg, ANTI_BOT_SYSTEM.config.timeToAnswer), ANTI_BOT_SYSTEM.messages.channel_enter.type, ANTI_BOT_SYSTEM.config.channelId) end, 300) addEvent(function() local random = math.random(#ANTI_BOT_SYSTEM.questions) player:sendChannelMessage("", ANTI_BOT_SYSTEM.questions[random].question, TALKTYPE_CHANNEL_R1, ANTI_BOT_SYSTEM.config.channelId) ANTI_BOT_SYSTEM.cache.question = random end, 2000) addEvent(vericationBot, ANTI_BOT_SYSTEM.config.timeToAnswer * 1000, player:getId()) return true end function onLeave(player) if not player then return true end if ANTI_BOT_SYSTEM.cache.players[player:getId()] then player:openChannel(ANTI_BOT_SYSTEM.config.channelId) addEvent(function() player:sendChannelMessage("", ANTI_BOT_SYSTEM.messages.channel_close.msg, ANTI_BOT_SYSTEM.messages.channel_close.type, ANTI_BOT_SYSTEM.config.channelId) end, 300) end end function onSpeak(player, type, message) player:sendChannelMessage(player:getName(), message, TALKTYPE_CHANNEL_Y, ANTI_BOT_SYSTEM.config.channelId) if message ~= ANTI_BOT_SYSTEM.questions[ANTI_BOT_SYSTEM.cache.question].answer then addEvent(function() player:sendChannelMessage("", ANTI_BOT_SYSTEM.messages.wrong_answer.msg, ANTI_BOT_SYSTEM.messages.wrong_answer.type, ANTI_BOT_SYSTEM.config.channelId) end, 300) else addEvent(function() player:sendChannelMessage("", ANTI_BOT_SYSTEM.messages.correct_answer.msg, ANTI_BOT_SYSTEM.messages.correct_answer.type, ANTI_BOT_SYSTEM.config.channelId) end, 300) ANTI_BOT_SYSTEM.cache.players[player:getId()] = nil end return false end Pronto! O seu antibot foi instalado com sucesso!
O código foi totalmente feito por mim, então os créditos são meus.
Qualquer sugestão para melhorias, por favor poste para que eu possa fazer
Abraços!
-
Arthasz Walker deu reputação a skulls em [Show off] Galeria de SpellsTítulo auto explicativo.
-
Arthasz Walker deu reputação a victor0707 em [Link Quebrado] Pokemon Evolution [DxP]Irei postar cliente Descriptografado. Que funciona no rme extendido.
ot so funciona via site , use o site origina da dxp
-
Arthasz Walker deu reputação a Vodkart em Scripttroca essa primeira linha:
<?xml version="1.0" encoding="UTF-8"?>
por
<?xml version="1.0" encoding="ISO-8859-1"?>
-
Arthasz Walker recebeu reputação de 9k22 em [AJUDA]desculpa, deu certo muito obrigado por avisar @login12
o script pra quem precisar como eu :D (créditos @Subyth)
-
Arthasz Walker deu reputação a Pedriinz em [AJUDA]Vai no meu topico de pedidos lá, que um membro aqui do tk tinha feito pra versão que você usa. Vê lá.
-
Arthasz Walker deu reputação a GOD Vitor em [Exclusivo] - (PDA) Profession SystemEae galera, faz tempo que não contribuo com o fórum, eu estava com um sistema de profissão aqui então decidi disponibilizá-lo.
Vídeo - Apresentação básica do sistema.
Informações Básicas.
Download:
Clique aqui
Scan:
Clique aqui
Créditos