Histórico de Curtidas
-
martimtiburcio deu reputação a Kitsukee em (Resolvido)auto restart linuxapt-get install screen
screen ./tfs.sh
CTRL + A + D
-
martimtiburcio deu reputação a quemtuacha em [GlobalEvents] ServeSave - Shutdown/Automáticotroque esse tfs.sh por esse outro
tfs.sh
-
martimtiburcio deu reputação a quemtuacha em [GlobalEvents] ServeSave - Shutdown/Automáticovc tem q dar permissão
cd /home/otserv/noobwar
chmod 777 -R tfs.sh
-
martimtiburcio deu reputação a Pedro. em Npc Guarda Da Cidadevamo lá.
npc.xml
<?xml version="1.0" encoding="UTF-8"?> <npc name="Guard" script="guard.lua" walkinterval="0" floorchange="0"> <health now="100" max="100" /> <look type="139" head="20" body="39" legs="45" feet="7" addons="0" /> </npc> guard.lua
local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end local config = { attackRadius = {x = 7, y = 5, targetDistance = 2, walkDistance = 7}, attackPK = {value = true, skulls = {SKULL_WHITE, SKULL_RED}}, attackMonster = {value = true, ignore = {"Rat", "Cave Rat"}, ignoreSummon = true}, damageValue = {min = 10, max = 20} } -- Do not touch local targetId = 0 local masterPosition function Creature.isAttackable(self) if not self:isNpc() then if self:isPlayer() and not self:getGroup():getAccess() then if config.attackPK.value and isInArray(config.attackPK.skulls, self:getSkull()) then return true end end if self:isMonster() and config.attackMonster.value then local master = self:getMaster() if (config.attackMonster.ignoreSummon and master and not master:isPlayer()) or not isInArray(config.attackMonster.ignore, self:getName()) then return true end end end return false end function Npc.searchTarget(self) local attackRadius = config.attackRadius for _, spectator in ipairs(Game.getSpectators(self:getPosition(), false, false, attackRadius.x, attackRadius.x, attackRadius.y, attackRadius.y)) do if spectator:isAttackable() then targetId = spectator:getId() end end end function onThink() local npc = Npc() local target = Creature(targetId) -- If we have not a target, then we shall search for one if not target then npc:searchTarget() return end -- Let's get target offset position local npcPosition = npc:getPosition() local targetPosition = target:getPosition() local offsetX = npcPosition.x - targetPosition.x local offsetY = npcPosition.y - targetPosition.y -- Target is out of reach, search for new one local radius = config.attackRadius if math.abs(offsetX) > radius.x or math.abs(offsetY) > radius.y then npc:searchTarget() return end -- Back to spawn position if npcPosition:getDistance(masterPosition) >= radius.walkDistance then npcPosition:sendMagicEffect(CONST_ME_TELEPORT) npc:teleportTo(masterPosition) return end -- If target is found local npcId = npc:getId() doTargetCombatHealth(npcId, targetId, COMBAT_FIREDAMAGE, -config.damageValue.min, -config.damageValue.max, CONST_ME_HITBYFIRE) npcPosition:sendDistanceEffect(targetPosition, CONST_ANI_FIRE) doNpcSetCreatureFocus(targetId) -- Follow Target local distance = radius.targetDistance local path = npc:getPathTo(targetPosition, 0, distance, true, true) if path and npcPosition:getDistance(targetPosition) > distance then doMoveCreature(npcId, path[1]) end npcHandler:onThink() end function onCreatureAppear(self) if self == Npc() and not masterPosition then masterPosition = self:getPosition() end npcHandler:onCreatureAppear(self) end
-
martimtiburcio deu reputação a xWhiteWolf em (Resolvido)[PEDIDO] Meteor spell tfs 1.0local config = { effectz = 6, --- efeito ao hitar o chao field = true, --- criar fields (true/false) fieldid = 1492, -- id do field que sera criado chancehit = 20, --- chance de acertar uma area chanceid = 10, --- chance de criar um field ao acertar a area effectx = 3, --- efeito de distancia waves = 7 -- quantidade de ondas de meteoros que irao cair } local water = {490, 491, 492, 493, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625} local combat = createCombatObject() local meteor = createCombatObject() setCombatParam(meteor, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(meteor, COMBAT_PARAM_USECHARGES, TRUE) setCombatParam(meteor, COMBAT_PARAM_EFFECT, config.effectz) setCombatFormula(meteor, COMBAT_FORMULA_LEVELMAGIC, -30, -50, -40, -55) local meteor_fire = createCombatObject() setCombatParam(meteor_fire, COMBAT_PARAM_CREATEITEM, config.fieldid) local meteor_water = createCombatObject() setCombatParam(meteor_water, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(meteor_water, COMBAT_PARAM_USECHARGES, TRUE) setCombatParam(meteor_water, COMBAT_PARAM_EFFECT, 1) setCombatFormula(meteor, COMBAT_FORMULA_LEVELMAGIC, -30, -50, -40, -55) combat_arr = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 3, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} } local combat_area = createCombatArea(combat_arr) setCombatArea(combat, combat_area) local function meteorCast(p) doCombat(p.cid, p.combat, positionToVariant(p.pos)) end function onTargetTile(cid, pos) if (math.random(100) <= config.chancehit) then local ground = getThingfromPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}) local newpos = {x = pos.x - 7, y = pos.y - 6, z = pos.z} if isInArray(water, ground.itemid) then doSendDistanceShoot(newpos, pos, config.effectx) addEvent(meteorCast, 200, {cid = cid, pos = pos, combat = meteor_water}) else doSendDistanceShoot(newpos, pos, config.effectx) if math.random(100) <= config.chanceid and isWalkable(pos, false, true, true) and config.field then addEvent(meteorCast, 200, {cid = cid,pos = pos, combat = meteor_fire}) end addEvent(meteorCast, 200, {cid = cid,pos = pos, combat = meteor}) end end end setCombatCallback(combat, CALLBACK_PARAM_TARGETTILE, "onTargetTile") function onCastSpell(cid, var) for i = 0, config.waves do addEvent(function() if isCreature(cid) then doCombat(cid, combat, var) end end, 220 * i) end return true end pra retirar o target é só tirar needtarget="1" do xml. Esse é o script da meteor perfeita, se funcionar tudo e não sair dano me passa uma spell qualquer que tenha formula de ataque em 1.0 que eu faço as modificações pra ti
-
martimtiburcio deu reputação a Bruno Minervino em Compilando TFS 1.3 com vídeo-aulaCompilando TFS 1.3 no Windows
1. Baixe os softwares requeridos
Para compilar o The Forgotten Server no Windows, você vai precisar:
Visual Studio 2015 (Compilador)
TFS SDK v3.2 (libs)
Libs do Boost C++ (32-bits, 64-bits)
2. Instale os softwares requeridos
Após ter baixado os softwares listados na etapa acima, comece instalando o Visual Studio e Boost C++. Extraia o TFS SDK v3.2 em qualquer pasta do seu computador e execute o arquivo "register_tfssdk_env.bat" para setar a variável de ambiente do local onde está o TFS SDK, assim nosso compilador irá encontrar as libs quando começar a compilar. Mova o arquivo "register_boost_env.bat" da pasta do TFS SDK para a pasta onde você instalou as libs do Boost C++ e execute-o (se você seguiu os passos do instalador, está esta na pasta chamada boost_1_62_0).
3. Baixe as sources
Se você possuir o Git Client instalado, você poderá clonar a última cópia com este comando:
> git clone https://github.com/otland/forgottenserver.git
Se você não possuir o Git Client instalado, você poderá baixar a última cópia do The Forgotten Server através do link: https://github.com/otland/forgottenserver/archive/master.zip
4. Compilando
Procure o diretório vc14 na pasta do The Forgotten Server que você baixou, e abra o arquivo "theforgottenserver.sln". Isso deverá iniciar o Visual Studio 2015 e você estará pronto para continuar.
Para configurar a compilação, navegue para Build -> Configuration Manager no menu superior. Um popup deverá aparecer onde você poderá escolher entre "Release" ou "Debug" para compilar, escolha também para qual Plataforma você irá compilar: 32-bits (Win32) ou 64-bits (x64).
Para iniciar a compilação, abra o menu Build novamente e clique em Build Solution (Ctrl + Shift + B).
5. Vídeo-aula
https://www.youtube.com/watch?v=Zfil84FMJsk
6. Créditos
Mark - Autor do tutorial e do projeto The Forgotten Server
Bruno Minervino - Tradução e gravação do vídeo
-
martimtiburcio deu reputação a xWhiteWolf em Magnus Task System 1.2Fala galera, pra quem não sabe eu fiz um novo task system pro meu servidor pessoal Empire e por isso decidi publicar a versão antiga dele já que não temos nenhuma intenção de usá-la mais.
ele é muito similar a um sistema que eu já havia compartilhado aqui, só que pras versões 0.X.
O que é: um npc que te dá pequenas missões de matar monstros, qnd você terminar ele te paga uma recompensa pré definida.
O que ele tem de melhor comparado com a versão 0.4: Basicamente ele permite vc definir qualquer hierarquia entre as tasks, permite que tasks deem diversas formas de recompensas (isso era bem engessado no modelo antigo) porém ele não aceita tasks de coletar itens, nem tem dificuldades diferentes com premiações multiplicadas (ao menos não explicitamente).
Aqui tá a hierarquia que ele segue atualmente. Ou seja, para fazer task de Tarantula você precisa fazer Rat, depois Spider e por fim Tarantula.
O sistema é muito completo e eu vou postá-lo da exata forma que usávamos então prestem bastante atenção nos detalhes. Já aviso de antemão que eu não darei muito suporte aqui e que não irei explicar muita coisa, o sistema funciona e foi usado por uns 2 anos sem nenhum problema com o tfs original.
crie um arquivo em data/lib chamado tasklib.lua e coloque isso dentro dele:
Aqui temos todas as tasks e storages. Se você quiser adicionar recompensas novas vc só precisa fazer um elseif na função de getRewards. Siga o exemplo dos comentários para as rewards e se quiser todas as tasks liberadas sem precisar seguir uma ordem é só colocar needed = 0 para todas.
Agora crie um arquivo em creaturescripts/scripts chamado killtasksystem.lua e coloque isso dentro dele:
Tirando as mensagens, não acho que tenha nada que você possa editar aqui. Essa tabela racetypes eu coloquei pq queria fazer task de criaturas de um mesmo tipo: fire, undead, poison. Ele puxa esse valor de dentro do race definido no xml do monstro. (Veja a undead monsters como exemplo.)
em creaturescripts.xml coloque:
<event type="kill" name="tasksystem" script="killtasksystem.lua"/> E em creaturescripts/scripts/login.lua antes do ultimo return true:
player:registerEvent("tasksystem") Agora criaremos o npc chamado tasksystem.xml na pasta data/npcs:
E o script dele em data/npcs/scripts chamado tasksystem.lua: (sim, eu não sou criativo com nomes)
Por fim insira essa talkaction aqui no seu server, ela serve para gerar um arquivo chamado orderedtask.html na pasta do seu servidor (a mesma do executavel) com o código html do sistema de task (sim, eu tenho preguiça de escrever as coisas no site)
Coloque o nome que vc quiser e depois coloque a tag em talkactions.xml:
<talkaction words="/generatehtml" script="nome que vc quiser.lua" />
Note que o arquivo pode levar um tempinho para aparecer, até pq ele tá percorrendo toda a tabela pegando todas as informações e criando um arquivo html disso, é um processo que pode levar alguns segundos.
Se você quiser ser hackudo e pegar o html direto do meu site, seja livre: https://www.empirebr.com/tasks
Bom uso, se tiver qualquer dúvida ou comentário ou sugestão diz aí.
-
martimtiburcio deu reputação a L3K0T em Monstro Focando 1° no Summon depois no Player.Fala galera, hoje estarei ensinando você como fazer os monstro (selvagens) focar primeiro no summons, depois no player, sem mexer na source, hoje estarei mostrando em scripts e é o mesmo que uso em meu servidor, então testado!
vai em data/creaturescripts/scripts copia uma arquivo .lua e renomeia pra ataque.lua e coloca isso lá dentro.
function onAttack(cid, target, attacker, type, combat, value) if isPlayer(target) and #getCreatureSummons(target) >= 1 then doMonsterSetTarget(cid, getCreatureSummons(target)[1]) end return true end agora no creaturescripts.xml coloca a tag
<event type="attack" name="BlockHit6" event="script" value="ataque.lua"/> como usar ? é muito simples agora você vai em todos monstros selvagens e vai add lá em baixo.
<script> <event name="BlockHit6"></event> </script> sempre antes do
</monster>
ADICIONA NO LOGIN.LUA
registerCreatureEvent(cid, "BlockHit6")
agora é só alegria parceiro espero ter ajudado! :*
-
martimtiburcio deu reputação a Vampira em [Tutorial] Criando quest log*Criando quest log por Action*
Como eu não achei nenhum tutorial desse por aqui resolvi criar um, neste tutorial ensinarei vocês a criar um quest log para suas quests
Oque é quest log: Quest Log tem a função de armazenar as quests que você fez ou está fazendo, mostrar em que parte da QUEST você está e como seguir adiante, etc...
Em data/XML abra o arquivo chamado quests.xml nele vai ter mais ou menos assim:
Entendendo:
Vermelho = Nome da sua Quest
Verde = Storage ID da Quest que vai aparecer no Quest Log
Azul = Numéro de Início da Quest
Negrito = Nome da Missão
Rosa = Storage da Missão
Laranja = Valor de Início da Missão
Marrom = Valor de Finalização
Preto = Descrição da Missão
Bom, agora que nós já entendemos o que cada coisa faz, podemos dar continuidade com o SCRIPT. aonde estáNome da Quest você deve colocar o Nome que vai aparecer no Quest Log, depois que você inseriu o nome da sua Quest você deve ir na pasta data/actions/scripts e achar o arquivo .lua da sua Quest, nele você apertaCTRL+F e depois digita isso aqui:
Depois que você encontrar este comando clique em Cancelar, depois vai ter mais ou menos isso:
Exemplo:
Relembrando que a cor Verde é o nosso Storage ID e o Azul é o nosso Comando de Início
Agora que nós achamos o nosso Storage ID e o nosso Comando de Início podemos preencher a primeira linha da nossa Quest assim:
Explicando um pouco para poder continuarmos com nosso Tutorial, uma quest é composta de Storages Values, cada movimento que você avança em sua Quest é dado um Storage Value novo.
EX: Você pega a Quest (Ganhou seu primeiro Storage Value), Você abriu o Baú (Ganhou seu Storage Value Final.). Isso quando você está fazendo a Quest por Action.
Então nós entendemos que na primeira linha da Quest nós precisamos por o Value de quando você pega a Quest. Agora continuando com o SCRIPT...
Nós vimos que o nosso Storage ID era 1 e o nosso Comando de Início era 1, então nós acabamos de preencher a primeira linha com os números que encontramos.
Agora nós vamos para a segunda linha, primeiramente você deve colocar o nome da sua missão, dai você me pergunta:
- Nós já não colocamos o nome da nossa Quest?
Resposta: Sim, nós colocamos o NOME DA QUEST agora vamos colocar o NOME DA MISSÃO, ou seja, aqueles nomes que fica no retângulo de cima quando você da SHOW na QUEST, aquilo é uma Missão.
Bom, depois que você colocou o Nome da sua Missão, como eu havia explicado antes sobre Storages Values, nós devemos pegar agora o nosso primeiro Storage Value novamente e o nosso primeiro Comando de início, ficando assim:
Pronto, nós preenchemos o nosso StorageValue e o nosso Comando de Início agora nós precisamos inserir o valor de término, depois que você pega o Baú (como expliquei ali em cima) você recebe o seu segundo Storage Value digamos que o meu seja assim:
Observe que o Storage Value de quando você pega o Baú tem 2 em vez de 1, isto porque o 2 é o número de encerramento da missão, então nós devemos colocar assim na segunda linha:
Resumindo, a nossa missão começa logo quando você recebe a missão do NPC e ela se completa quando você abre o Baú. Agora que a parte mais difícil já foi, vamos para a parte mais fácil do nosso SCRIPT, a Descrição da missão (a frase que aparece no quadro de baixo).
Esse
é o número da descrição, no caso nós colocamos apenas uma Missão então seria uma Descrição, se você colocar 2 Missão, você vai colocar e na outra você vai colocar depois da nossa missionstate tudo que devemos fazer é colocar nossa descrição onde está "Descrição da Missão.", ficando assim:
Lembrando que nunca se deve usar carácteres especiais, como:
Terminamos aqui nosso tutorial espero que tenham gostado
Creditos: meu
Inspiração: joaovbz
-
martimtiburcio deu reputação a
Golfem Tutorial Mod OtClientOlá, amigos esta muito tempo parado e sem tempo para meche no meu otserv por isso esto liberando um sistema meu de tutorial client.
Oque ele faz, ele abre uma janela com menus e seus texto para ajudar os player a ter uma boa jogabilidade ao o game.
-versão:todas
Opcodes: Nao precisa de opcodes, roda em qual quer versão otclient.
1- abra a pasta do otclient>mods>game_tutorial.zip
2- abra a pasta do otclient>mods>game_tutorial>configs.lua
2.1 em configs.lua voce vai configura todo os text que a no seu tutorial.
3- Menu texto
tutorialsIndex = { "1. Exp", "2. Exp", "3. Exp" } 4- oque a no menu texto
}, {name = "1.2 Exp", text = [[EXP: - EXP - HEXP - EXP - EXP Tibia King:100 ]] }, {name = "1.3 Exp", text = [[EXP: - EXP - HEXP - EXP - EXP Tibia King:100 ]] } } Se gosto mais rep.
-
martimtiburcio deu reputação a L3K0T em Removendo Block SpawnOlá pessoal hoje estava mexendo na minha source, muitos me falavam, "porque você não coloca pro player ficar no respawn do pokemon" então hoje estou para a ajudar vocês, como minha source não tem a opção de blockspawn na config.lua, achei outra forma, vamos lá!
Vá em spawn.cpp
Procure:
if(findPlayer(sb.pos)) { sb.lastSpawn = OTSYS_TIME(); continue; } Deixa assim abaixo:
/*if(findPlayer(sb.pos)) { sb.lastSpawn = OTSYS_TIME(); continue; }*/ Agora salva, e recompila sua source.
O que eu fiz fazendo isso ? removi definitivo o blockspawn se caso o player tiver no respawn do pokemon vai nascer do mesmo jeito. espero ter ajudado rep+ (acharam que era coisa difícil, sqn)
Créditos a mim.
-
martimtiburcio deu reputação a Noninhouh em [Tutorial] Ajustando andar diagonalBom, vou mostrar a vocês como editar o andar diagonal no otclient da maneira que vocês preferirem...
Atualmente, creio que quando você anda diagonalmente, tem um delay até que você possa andar novamente. Vou ensinar tirar esse delay, e deixar a velocidade ao gosto de vocês.
Em creature.cpp do server, procure pela linha:
if(std::abs(newPos.x - oldPos.x) >= 1 && std::abs(newPos.y - oldPos.y) >= 1) lastStepCost = 3;
Esse lastStepCost será a velocidade que o player terá ao andar diagonalmente, em relação a velocidade de quando ele anda em uma direção reta, por exemplo, um player que demora 1 segundo para andar 1 sqm, demoraria 3 segundos para andar diagonalmente. Edite esse valor ao seu gosto!
Em creature.cpp do client, procure as linhas que tem isso:
getStepDuration(true) E deixe assim:
getStepDuration()
Agora procure por:
float factor = 3; if(g_game.getClientVersion() <= 810) factor = 2; Apague essa parte
Logo mais abaixo tem:
if(!ignoreDiagonal && (m_lastStepDirection == Otc::NorthWest || m_lastStepDirection == Otc::NorthEast || m_lastStepDirection == Otc::SouthWest || m_lastStepDirection == Otc::SouthEast)) interval *= factor; Em factor, deixe o mesmo valor que você deixou em lastStepCost no servidor.
Agora em localplayer.cpp no client, novamente procure por:
getStepDuration(true) E troque por:
getStepDuration()
Pronto, seu personagem andará diagonalmente mais suave, e com a velocidade que você escolheu.
-
martimtiburcio deu reputação a Martim Tiburcio em [Pedido] Sprite de wolf@mdoera, mano eu fique sem net, mas está aqui. Espero que goste.
a versão do arquivo é 8.54.
lobo-sword of art online.zip
-
martimtiburcio deu reputação a ADMPianista em Colocando seu site onlineFala gente, vi que muitas pessoas estavam querendo fazer um site para seu servidor e não sabem como fazer... Então resolvi postar um tutorial Completíssimo aqui.
O que vamos precisar? -> Xampp ( 1.6.5 ) - Download - http://www.oldapps.com/xampp.php?old_xampp=38 -> Gesior Acc. Maker ( 0.3.8 ) - Download - http://www.mediafire.com/?u0bao9bcp9ua5vr -> Um servidor de sua escolha. Agora que já temos tudo, vamos começar !! 1°) Abra o instalador do XamPP, e instale-o. 2°) Selecione aonde a pasta do XamPP ficará salva. (de preferência algum lugar de fácil acesso) 3°) Deixe apenas a primeira e a segunda opções marcadas e clique em Next. 4°) Aguarde o fim da instação e provavelmente uma tela preta irá aparecer. 5°) Após o fim da instalação, clique em Yes para abrir o XamPP e dê Start em Apache e MySQL. 6°) Clique em Admin do Apache. Você será redirecionado para a sua localhost (endereço que apenas você entra). Clique em Português (Brasil). 7°) No canto esquerdo do site , clique na Aba Segurança. Vá descendo até achar " http://localhost/security/xamppsecurity.php " . Clique. OBS : Se você não conseguiu abrir a página de Segurança, vá na pasta do seu Xampp/security/htdocs/lang e renomeie o arquivo pt para pt_br . 8°) Após ter clicado, deverá ser redirecionado para uma página parecida com essa: OBS :Faça o numero 1 e depois clique em Alterar Senha. Depois Faça o numero 3 e clique em Tornar Seguro o Diretorio do XamPP. 9°) Após ter feito isso, dê Stop no MySql (no XamPP) e dê Start denovo. Agora vá em seu navegador e digite : localhost/phpmyadmin 10°) Digite a senha que foi criada há pouco tempo que eu disse que era para a criação do banco de dados. 11°) Minimize seu navegador e vá na pasta de seu servidor, e abra o arquivo config.lua. Tire todos os espaços iniciais e as "frases" iniciadas com o sinal de " - " . Veja : 12°) Não feche o config.lua ainda, vá descendo até achar informações sobre a database de seu servidor ... algo parecido com isto : [b][b][b]sqlType = "mysql" <- se estiver em sqlite, mude para mysql sqlHost = "localhost" sqlPort = 3306 sqlUser = "root" sqlPass = "123456" < - coloque a senha que foi criada para entrar no banco de dados. sqlDatabase = "otserv" < - coloque o nome de sua database , coloque " otserv " para facilitar. sqlFile = "otserv.s3db" < - de prefencia, coloque " otserv.s3db " ( o mesmo nome de sua database ) sqlKeepAlive = 0 mysqlReadTimeout = 10 mysqlWriteTimeout = 10 encryptionType = "sha1"[/b][/b][/b] 13°) Salve e feche o config.lua. Agora vamos voltar a pagina minimizada (localhost/phpmyadmin) : 14°) Clique na aba Importar na parte superior da tela. 15°) Agora Selecione o Arquivo para Importar. Selecione o arquivo terminado em .sql que fica na pasta de seu servidor e clique em Executar no canto inferior direito. 16°) Pronto !! A database de seu servidor foi criada. Agora vamos instalar os arquivos do site. 17°) Abra a pasta do XamPP/htdocs. Apague tudo que tem dentro de htdocs e cole tudo o que veio dentro da pasta do Gesior ACC. 18°) Abra o XamPP novamente e clique em Admin do Apache. 19°) Uma nova pagina foi aberta, agora você terá que fazer mais 5 passos rápidos. 19.1) Set Server Path Coloque o diretório da pasta de seu servidor. Ex : C:\Users\user\Desktop\Tibia Server Clique em Set Server Path. 19.2) Check database connection 19.3) Add tables and columns to DB 19.4) Agora desça e clique no botão. 19.5) Set Admin Account Coloque uma senha SEGURA pois esse será o password do administrador do site e servidor. 19.6) Load Monsters from OTS Carregue os monstros do servidor. 19.7) Load Spells from OTS Carregue as magias do servidor. 20°) Agora você deverá ser redirecionado para seu site, e você pode acessá-lo pelo localhost ou pelo ip do seu servidor. Para acessar sua database, digite em seu navegador : localhost/phpmyadmin Pronto !! Seu site foi criado :] Colocando seu site online pelo 8090 e Desbloqueando a porta 8090 : 1° - Acesse a pasta do XamPP/apache/conf e abra o arquivo httpd com o bloco de notas. Procure por : #Listen 12.34.56.78:80 Listen 80 E por : ServerName localhost:80 Substitua todos os 80 por 8090. 2° - Dentro da pasta conf, abra a pasta extra, e em seguida abra httpd-ssl e procure por : Listen directives: "Listen [::]:443" and "Listen 0.0.0.0:443" # Listen 443 E procure por : <VirtualHost _default_:443>
Substitua todos esses 443 por 4499.
Agora vá em seu firewall e Adicione a Porta 8090 e Porta 80 e marca a opção TCP.
Se usar Roteador, faça a mesma coisa .
Site por porta 80
localhost
Site por porta 8090
localhost:8090
Créditos : 100% por Mim :]
Não conseguiu criar ou está com dúvida? Poste aqui que ajudarei.
-
martimtiburcio deu reputação a vyctor17 em Advanced SoundEai galera, pra quem conhece meu tópico de showoff já sabe oque eu estou postando . mas pra quem não conhece oque é o Advanced Sound segue o ctrl+v.
é um MOD para o OTC, que permite ao OTC reproduzir diversas tipos de mídia como (.MP3, .WAV, .OGG, .MOD, .IT, .S3D, .XM).
Além disso esse MOD conta com uma biblioteca de áudio 3D, e a melhor parte é que não necessita de alteração na source por parte do OTC,só no serverside se o desenvolvedor quiser ativar alguns recursos como áudio nas falas das criaturas. a parte do áudio nas criaturas não esta inclusa no download. e também não conta com áudio 3d configurado em script mais as funções estão na biblioteca se quiser é só fazer .
Algumas aplicações por exemplo em servidores de pokemon ao jogar a pokebola mandar um som para o client ao capturar outro som ou falhar na captura, assim como som de batalhas, som ambiente, o limite é sua imaginação!
Lista de funções
pauseAll isPlaying isFinished getSoundPlayLen getSoundPlayPosition setSndPlayPos setSoundMinDistance setListenerPosition setSound3DPosition setVolume getVolume setPaused isPaused playMusic deleteSnd setReverbEnabled setEchoEnabled setDistortionEnabled Exemplo de uso em lua servidor:
local colors = { TEXTCOLOR_BLUE, TEXTCOLOR_LIGHTBLUE, TEXTCOLOR_LIGHTGREEN, TEXTCOLOR_TEAL, TEXTCOLOR_PURPLE, TEXTCOLOR_PLATINUMBLUE, TEXTCOLOR_LIGHTGREY, TEXTCOLOR_DARKRED, TEXTCOLOR_RED, TEXTCOLOR_ORANGE, TEXTCOLOR_YELLOW, TEXTCOLOR_WHITE_EXP } function onSay(cid, words, param) local playerpos = getPlayerPosition(cid) local random = math.random(1, #colors) if math.max(math.abs(playerpos.x-23), math.abs(playerpos.y-30)) < 9999 then doSendAnimatedText(playerpos, "GoGoGo!", colors[random]) sendScreanSound(cid, "com_go.wav") end return true end
Criaturas Falantes C++ ServerSide:
Em game.cpp, procure por:
bool Game::internalCreatureSay(Creature* creature, SpeakClasses type, const std::string& text, bool ghostMode, SpectatorVec* spectators/* = NULL*/, Position* pos/* = NULL*/) E abaixo de:
if(!ghostMode || tmpPlayer->canSeeCreature(creature)) tmpPlayer->sendCreatureSay(creature, type, text, &destPos); Adicione:
if(type == SPEAK_MONSTER_YELL or type == SPEAK_MONSTER_SAY){ tmpPlayer->sendExtendedOpcode(85, text + ".mp3|false"); } Dai é só adicionar os som a pasta e colocar o nome dele igual a fala nesse metodo só ta pra rodar mp3, tem jeito melhor de fazer isso adicionando um nova tag no .xml do monstro mais acabei ficando com preguiça e fiz assim kk'
Download
não autorizo o re-post em qualquer outro fórum sem minha autorização.
vyctor17 - Waki-V LTDA ©
-
martimtiburcio deu reputação a Rusherzin em Transformação por TempoBom, não sei quantas coordenadas x e/ou y. Se me disser para qual lado ela fica torta, posso te explicar como tu pode ir arrumando até achar a posição certa. Fora isso, as outras coisas que tu pediu, tenta com esse script:
local outfit = {lookType = 370} -- outfit local tempo = 60 -- tempo em segundos. local effect = {41} -- effect no player, caso queira apenas 1, basta remover os outros numeros. local ml = 50 -- quantos ira aumentar o skill de ML local skillfist = 50 -- quantos ira aumentar o skill de Fist local skillsword = 50 -- quantos ira aumentar o skill de Sword local skillaxe = 50 -- quantos ira aumentar o skill de Axe local skillclub = 50 -- quantos ira aumentar o skill de Club local skilldistance = 50 -- quantos ira aumentar o skill de Distance local skillshield = 50 -- quantos ira aumentar o skill de Shield local health = 100 -- A cada 1 segundo quantos aumentar de vida local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, 0) local condition = createConditionObject(CONDITION_ATTRIBUTES) setConditionParam(condition, CONDITION_PARAM_TICKS, tempo*1000) setConditionParam(condition, CONDITION_PARAM_STAT_MAGICLEVEL, ml) setConditionParam(condition, CONDITION_PARAM_SKILL_FIST, skillfist) setConditionParam(condition, CONDITION_PARAM_SKILL_SWORD, skillsword) setConditionParam(condition, CONDITION_PARAM_SKILL_AXE, skillaxe) setConditionParam(condition, CONDITION_PARAM_SKILL_CLUB, skillclub) setConditionParam(condition, CONDITION_PARAM_SKILL_DISTANCE, skilldistance) setConditionParam(condition, CONDITION_PARAM_SKILL_SHIELD, skillshield) setConditionParam(condition, CONDITION_PARAM_OUTFIT, outfit) setCombatCondition(combat, condition) local condition = createConditionObject(CONDITION_HASTE) setConditionParam(condition, CONDITION_PARAM_SPEED, 300) setConditionParam(condition, CONDITION_PARAM_TICKS, tempo*1000) setConditionParam(condition, CONDITION_PARAM_BUFF, TRUE) setCombatCondition(combat, condition) local condition = createConditionObject(CONDITION_REGENERATION) setConditionParam(condition, CONDITION_PARAM_SUBID, 1) setConditionParam(condition, CONDITION_PARAM_BUFF, TRUE) setConditionParam(condition, CONDITION_PARAM_TICKS, tempo*1000) setConditionParam(condition, CONDITION_PARAM_HEALTHGAIN, health) setConditionParam(condition, CONDITION_PARAM_HEALTHTICKS, 1000) setCombatCondition(combat, condition) local sys = createConditionObject(CONDITION_OUTFIT) setConditionParam(sys, CONDITION_PARAM_TICKS, tempo) addOutfitCondition(sys, outfit) setCombatCondition(combat, sys) function magicEffect3(tempo2,tempo3,cid) if (isCreature(cid)) then if getPlayerStorageValue(cid, 102053) > 0 and getCreatureCondition(cid, CONDITION_REGENERATION, 1) then local position = {x=getPlayerPosition(cid).x, y=getPlayerPosition(cid).y, z=getPlayerPosition(cid).z} for i=1, #effect do doSendMagicEffect(position, effect[i]) end end end end local sys = createConditionObject(CONDITION_OUTFIT) setConditionParam(sys, CONDITION_PARAM_TICKS, tempo*1000) addOutfitCondition(sys, outfit) setCombatCondition(combat, sys) function onCastSpell(cid, var) local position129 = {x=getPlayerPosition(cid).x+1, y=getPlayerPosition(cid).y, z=getPlayerPosition(cid).z} if getPlayerStorageValue(cid, 102053) ~= 1 or getCreatureCondition(cid, CONDITION_REGENERATION, 1) == false then doCombat(cid, combat, var) tempo2 = 0 while (tempo2 ~= (tempo*1000)) do addEvent(magicEffect3, tempo2, tempo2, tempo*1000, cid) tempo2 = tempo2 + 300 end setPlayerStorageValue(cid, 102053,1) -- storage verifica transformado, quando = 1 player esta transformado. doCreatureSay(cid, "Kyuubi Furie", TALKTYPE_MONSTER) doSendMagicEffect(position129, 130) else doPlayerSendCancel(cid, "Sorry, you are transformed.") end end
-
martimtiburcio deu reputação a tev em Player se auto paraliza mas tem vida healada a cada x segundosIntrodução: Player se auto paraliza, porém, tem sua vida healada a cada x segundos.
Créditos: Luck
Basta criar um arquivo .lua em \data\spells\scripts com o nome que preferir e acrescentar isso:
tempo = 10 -- Tempo de duração da spell em segundos hp = 10 -- Quanto HP vai healar a cada x segundos function heal(cid) if not isCreature(cid) then return true end if getPlayerStorageValue(cid, 13978) == 1 then doCreatureAddHealth(cid, hp) addEvent(heal, 3000, cid) return true end return true end function onCastSpell(cid, var) setPlayerStorageValue(cid, 13978, 1) doPlayerSetNoMove(cid, true) heal(cid) addEvent(setPlayerStorageValue, tempo*1000, cid, 13978, -1) addEvent(doPlayerSetNoMove, tempo*1000, cid, false) return true end Não se esqueça de depois acrescentar tag no spells.xml!
-
martimtiburcio deu reputação a xWhiteWolf em Sistema de Auto-Facing: Vire Automaticamente para o Target ao Atacar (TFS 0.3.6)Bom galera, tem uma coisa bem simples que nem o tibia global fez e que eu to trazendo aqui pra vocês. Trata-se de um pequeno sistema que fará você sempre virar pra direção do seu target ao atacar.
Testado em TFS 0.3.6 Cliente 8.54.
Imagem auto explicativa:
Chega de atacar de costas!
Agora pra instalar é bem tranquilo. Abra um arquivo .lua em data\creaturescripts\scripts chamado target e coloque o seguinte conteudo dentro dele:
Feito isso adicione essa linha no creaturescripts.xml:
<event type="attack" name="targetCreature" script="target.lua"/> E para finalizar adicione a seguinte tag em creaturescripts\scripts\login.lua:
registerCreatureEvent(cid, "targetCreature") Espero que vcs tenham curtido, é algo bem simples mas ninguém havia pensado nisso antes (nem o próprio Tibia), é uma coisa bem básica e que torna o jogo bem mais importante e sério.
EDIT:: Usem essa versão que está mais completa, na anterior se o target estivesse na diagonal ele não virava.
-
martimtiburcio deu reputação a Cat em [Resolvido] Encher life/mana ao uparComo faço para fazer o char se curar toda vez que upa lvl? '-' Os chars tão estão se curando quando upam quis dizer não estão se curando' certo?
vá em data/creaturescripts/scripts e crie um script com o nome hmup
function onAdvance(cid, skill, oldlevel, newlevel) if skill == SKILL__LEVEL then doCreatureAddHealth(cid, getCreatureMaxHealth(cid)) doCreatureAddMana(cid, getCreatureMaxMana(cid)) end return TRUE end ainda em data/creaturescripts/script abra o login.lua e adicione em baixo das linhas
registerCreatureEvent(cid, "hmup") em data/creaturescripts/creaturescripts.xml
<event type="advance" name="hmup" event="script" value="hmup.lua"/> -
martimtiburcio deu reputação a Ryzor em sistema de refinamento perfeito 2.0Autor : Mock
Servidor Testado : TFS 0.3.6
Vamos instalar.
Adcione essa tag no actions.xml:
<action itemid="8306" event="script" value="upgrade.lua"/>
<action itemid="8305" event="script" value="upgrade.lua"/>
Bom a segunda é um segundo item que tem 100% a mais de chance de acertou, ou seja esse nunca falha, e o normal com nem uma chance adcional é o itemid 8305.
Agora em upgrade.lua coloque isso:
Veja ele funcionando:
E agora com a possibilidade do slot ssystem conjunto com esse sistema vc pode fazer coisas assim:
Código:
12:02 You see a knife +1 [hp.+7%] (Atk:8, Def:6).
Creditos
Mock ( Por Fazer O Script )
GodMarini ( Por Trazer Ao TK )
-
martimtiburcio deu reputação a Godfather em Aura System[Criado em TFS 0.4 (tibia 8.6), talvez não funcione em outras versões - não darei suporte]
Eaí!
Este mod consiste em dizer !aura para ver uma lista de auras compráveis, que, após compradas, podem ser escolhidas por "!aura nomedaaura" para que saia um efeito no jogador a cada 1 segundo.
[mods/Aura.xml]:
http://pastebin.com/qVayLc3m
ss's e como usar:
Como adicionar outros efeitos? Na 4ª linha, nesta parte: auras = { ["fogo"] = {36,1500000,11350}, ["gelo"] = {41,1500000,11351}, ["pedras"] = {44,1250000,11352}, ["energia"] = {37,1250000,11353}, ["tornado"] = {42,15000000,11354}, } Continue seguindo o padrão, que é:
["Nome"] = {Efeito, Preço, Storage}, Sendo que Storage não pode repetir, então sempre ponha um número a mais que o anterior.
É isso
Vlw
-
martimtiburcio deu reputação a KekezitoLHP em [SISTEMA] Colisão de MagiasNome: Sistema de Colisão de Magias V. 1.0 Autor: Ramza (Ricardo Ianelli) Versão Testada: TFS 0.3.6PL1 (8.54) "PODERÁ FUNCIONA EM VERSÃO 8.54+ FAÇA O TESTE" Introdução
video:
Funcionamento
Do ponto de vista do jogador:
O jogador usa uma magia, digamos, exori frigo. No mesmo momento, o inimigo usa um exori vis por exemplo. As magias voam, e se colidem no ar. Do ponto de vista do scripter: Toda magia antes de ser lançada, salva um storage value, e checa se o inimigo tem o mesmo storage. Caso tenha, ao invés de mandar a magia, manda os efeitos pra uma posição calculada entre os dois pontos, e um efeito de colisão. Caso o criador queira melhorar ainda a função (pra ficar como na versão 2.0 do sistema), pode-se fazer uma checagem de força pra saber qual das duas 'vence', fazendo com que ela atinja o oponente. Para melhores resultados, magias usando addEvent são mais usadas, por isso usarei um exemplo dessa forma aqui no tutorial. Instalação
Na pasta Data, crie um arquivo chamado colisionLIB.lua. Dentro dele, cole isto:
function checkColision(cid) -- Function by Ramza (Ricardo Ianelli) if getCreatureTarget(cid) ~= 0 then setPlayerStorageValue(cid, 9001, 'casting') local ppos, enemy = getCreaturePosition(cid), getCreatureTarget(cid) local epos = getCreaturePosition(enemy) if getPlayerStorageValue(enemy, 9001) == 'casting' and getCreatureTarget(enemy) == cid then setPlayerStorageValue(enemy, 9001, 'colision') setPlayerStorageValue(cid, 9001, 'colision') if ppos.x > epos.x and ppos.y > epos.y then cpos = {x = ppos.x - ((ppos.x - epos.x) / 2), y = ppos.y - ((ppos.y - epos.y) / 2), z = ppos.z} elseif ppos.x > epos.x and ppos.y < epos.y then cpos = {x = ppos.x - ((ppos.x - epos.x) / 2), y = epos.y - ((epos.y - ppos.y) / 2), z = ppos.z} elseif ppos.x < epos.x and ppos.y < epos.y then cpos = {x = epos.x - ((epos.x - ppos.x) / 2), y = epos.y - ((epos.y - ppos.y) / 2), z = ppos.z} elseif ppos.x < epos.x and ppos.y > epos.y then cpos = {x = epos.x - ((epos.x - ppos.x) / 2), y = ppos.y - ((ppos.y - epos.y) / 2), z = ppos.z} end doSendDistanceShoot(ppos, cpos, CONST_ANI_ENERGY) doSendDistanceShoot(epos, cpos, CONST_ANI_ENERGYBALL) local value = math.random(1, 3) doSendMagicEffect(cpos, 27+value) return true else return false end end end
Agora vamos pegar uma magia bem básica como exemplo para teste. Vamos usar a magia energy strike. Abra o arquivo da magia, estará mais ou menos assim:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) function onCastSpell(cid, var) return doCombat(cid, combat, var) end Vamos modificar um pouco para o nosso sistema. Deixe-a assim:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) local function spell(cid, var) if getPlayerStorageValue(cid, 9001) ~= 'colision' then doCreatureSay(cid, 'Strike!', TALKTYPE_ORANGE_1) setPlayerStorageValue(cid, 9001, nil) return doCombat(cid, combat, var) end end function onCastSpell(cid, var) checkColision(cid) doCreatureSay(cid, 'Energy...', TALKTYPE_ORANGE_1) addEvent(spell, 2000, cid, var) end
Agora adiciona essa função em todas as magias que você deseja a colisão.
function onCastSpell(cid, var) checkColision(cid) doCreatureSay(cid, 'Energy...', TALKTYPE_ORANGE_1) addEvent(spell, 2000, cid, var) end Hora de testar, a hora mais difícil! Bem, pra testar esse sistema você precisa de um amigo pra te ajudar, ou de ferramentas ilegais e agilidade. Vamos tomar como exemplo caso você fosse com um amigo testar. Simplesmente usem exori vis um no outro, e vejam o que acontece
Comentários
Quem já é mais experiente já deve ter sacado o tanto de possibilidades que isso abre, como fazer com magias mais avançadas, comparar magic level, fazer com que caso o ML de um seja maior que o do outro, ela anule a do inimigo mas a sua ainda acerte, fazer sistemas no estilo 'disputa de kame-hame-has' usando spriters sem ser as do tibia, e muitas outras coisas, só vai depender de você usar a sua CRIATIVIDADE. Esse sistema, apesar de simples, é considerado pra mim um dos meus sistemas mais avançados, pois como dizia o sábio programador: "O verdadeiro gênio não é aquele que usa pilhas, ponteiros, matrizes ou funções complexas, e sim aquele que usa a criatividade." Muita gente ofereceu grana preta nesse sistema já, mas eu postei aqui pra lembrar à todos vocês que o que faz um grande programador não é o quão complexas são as funções que você usa e os codes que você faz, e sim, o quão criativas einovadoras são suas criações.
É isso ai galera, deixo meu abraço pra todos vocês, qualquer dúvida é só me perguntar, e eu quero que vocês lembrem que o melhor code é sempre, de longe, aquele mais criativo, não importa se tenha 3, 100 ou 10.000 linhas. Lembrem-se disso, sempre.
-
martimtiburcio deu reputação a xWhiteWolf em Magnus ChallengerFala galera, hoje vim trazer o projeto pronto do Magnus Challenger pra vocês instalarem no servidor de vocês!
Pra quem não conhece é um sistema de Tasks baseado no Zezenia onde você pode escolher entre tasks de matar monstros ou de coletar certos items para o npc Magnus, um guerreiro famoso da cidade que está atolado de tarefas e precisa da sua ajuda!
Peguei os aspectos que eu julguei serem os principais do modelo do Zezenia e editei com algumas coisas que eu achei que ficariam melhores.
Quem quiser pode ver um vídeo comentado de como o sistema funciona:
Dito isso vou ensinar vocês como instalar isso no server:
Pra começar vá em data\creaturescripts\scripts e procure login.lua, agora vá até o final do arquivo e antes do último return true coloque essas linhas abaixo
ainda em creaturescripts procure creaturescripts.xml e adicione essa linha junto com as outras que já estão lá (seguindo o padrão)
<!-- TASK SYSTEM --> <event type="kill" name="tasksystem" script="tasksystem.lua"/> Agora crie um arquivo em creaturescripts\scripts com o nome de tasksystem.lua e adicione o seguinte à ele:
Terminada a parte da contagem de kill vamos ao NPC em si.
Crie um arquivo chamado Magnus.xml em data\npc e coloque isso dentro dele:
Agora em data\npc\scripts crie um arquivo chamado zezeniaa.lua e adicione esse conteúdo dentro do arquivo:
~~~~~~~~~~~~~~~~ FEITO ISSO ESTÁ TERMINADO ~~~~~~~~~~~~~~~~~~
Agora aprendendo a configurar:
No tasksystem vc pode editar isso daqui:
Eu fiz um sistema onde se vc estiver em party com alguém e a pessoa matar os bixos conta como se você tivesse matado; Assim incentiva o pessoal a ir numa cave de Dragon e ao invés de matar quem está lá pra ficar sozinho na cave, eles vão chamar party pra fazerem a task juntos.. assim fazer amigos fica mais fácil e com maiores laços é maior a chance do povo não abandonar o seu server.
Apenas digite "true" ou "false" pra ativar/desativar esse sistema e em baixo temos a distancia máxima pro monstro estar do cara que está fazendo a task pra contar o kill. Se a distancia entre o monstro e a pessoa for maior que 7 não vai contar pra ele a kill.
No zezeniaa.lua as coisas que dão pra configurar são maiores mas são igualmente simples:
Toda vez que vc pedir uma task short (curta) vc vai ter de 100 a 400 monstros pra matar, ele gera um número de 0 a 6 e multiplica por 5 e soma com os 100 iniciais.. o mesmo vale pra todos os outros valores.
levelcollect é o level mínimo pra fazer tasks do tipo collect.
time é o tempo em segundos que você vai ficar sem poder falar com o npc caso desista de alguma task, o padrão é 8 * 60 * 60 (8 horas)
bonus é por quanto vai multiplicar caso vc permita que o npc escolha aleatoriamente entre todas as opções.. o padrão é 20% de bonus (1.2)
multiplicador é uma coisa que eu adicionei pra ficar mais fácil mexer na fórmula sem cometer cagadas, se vc tá ganhando 10% de exp e quer ganhar 80% é só colocar 8 no multiplicador.
Isso daqui é o banco de dados principal do sistema de kill, toda vez que vc escolher uma task do tipo fácil, médio, dificil ele vai acessar essas tabelas contendo o nome das criaturas.. vc pode facilmente adicionar novos nomes, o npc já está programado pra lidar com isso, apenas siga o padrão e mantenha sempre o último sem vírgula!
Ex: adicionando Morgaroth na tabela de hard
local hard = { [1] = "Giant Spider", [2] = "Dragon Lord", [3] = "Grim Reaper", [4] = "Demon", [5] = "Crystal Spider", [6] = "Demon Skeleton", [7] = "Juggernaut", [8] = "Destroyer", [9] = "Hand of Cursed Fate", [10] = "Morgaroth" } atente-se também pra não repetir o número no index.. se o anterior era [9] use [10].
O restante das tabelas são separadas para o banco de dados das tasks de collect:
segue a mesma lógica da de kill só que aqui você tem o id dos itens que serão usados... aquela count não tem nada a ver com o item pois ele vai gerar tanto o item aleatoriamente quanto à count;
Ex:
[1] = {id = 5880, count = 20}, -- iron ore isso não significa que se cair iron ore (id 5880) irá cair sempre 20.. até porque eu poderia escolher uma task long e easy e pegar a task de trazer até 50 iron ores, apenas tente manter os padrões que são os intervalos definidos.
No easy ele varia de 10 a 20, no medium ele varia de 20 a 35 e no hard de 40 a 50.
Espero que vocês tenham curtido, é um sistema grande mas bem simples de se mexer... se tiverem quaisquer problemas podem comentar aqui. Deu trabalho fazer isso então se você gostou deixe o seu comentário aí e o seu "Gostei" que vai me incentivar a trazer mais coisas desse tipo pra cá. Abraços do lobo.
PS: Pra sumonar o npc digite com o GOD: /n Magnus ou coloque ele pelo map editor.
-
martimtiburcio deu reputação a vyctor17 em Criaturas PassivasCriaturas Passivas. (tfs 0.3.6pl1)
hoje eu fiquei meio bolado mexendo em meu servidor com um cat me seguindo e pensei, mano que droga o sistema de hostilidade do tibia é uma porcaria.., então resolvi dar uma olhada em como ele funcionava nas source, e acabei vendo que modificando pouca coisa já se tem um sistema de hostilidade melhor não perfeito mas melhor . talvez daqui uns dias eu consiga fazer ele ser 100%, nesse método a criatura só ataca depois de perder vida e o ideal seria ela atacar ao tomar target mas isso tbm é facil de fazer dentro de alguns dias eu atualizo o tópico com isso.
Sem mais explicações vamos as ediçoes:
em monster.cpp: procure por,
bool Monster::selectTarget(Creature* creature) agora nesta função procure por:
if(it == targetList.end()) { //Target not found in our target list. #ifdef __DEBUG__ std::cout << "Target not found in targetList." << std::endl; #endif return false; } e logo a baixo adicione:
if(!isHostile() && getHealth() == getMaxHealth() && !isSummon()){ return false; } e na função a baixo deixa assim:
if((isHostile() || isSummon() || !isHostile() && getHealth() != getMaxHealth()) && setAttackedCreature(creature) && !isSummon()) Dispatcher::getInstance().addTask(createTask( boost::bind(&Game::checkCreatureAttack, &g_game, getID()))); Agora ainda no monster.cpp procure por:
bool Monster::canUseAttack(const Position& pos, const Creature* target) const e remova isso:
if(!isHostile()) return true; agora é só recompilar e esta pronto .
Gostou?, então se puder me ajude!
não autorizo o re-post em qualquer outro fórum sem minha autorização.
vyctor17 - Waki-V LTDA ©
-
martimtiburcio deu reputação a vyctor17 em Monstros Focando SummonsMonstros Focando Summons (tfs 0.3.6pl1)
Eai galera, to ativo essa semana rs, agora to trazendo pra vcs uma modificação que faz as criaturas sempre atacarem os summons antes dos players, tipo a do servidores de pokemon mas acho que pra fazer isso eles mudam o group do player pra um group que monstro não ataca, agora vou mostrar como fazer isso certo rs.
Lembrando que essa modificação da maneira que esta neste tópico só funciona com http://www.tibiaking.com/forum/topic/53480-criaturas-passivas/
já instalado nas source . da pra fazer funcionar sem isso sim e é ate bem simples só tirar algumas checagens mas dai isso fica com vcs :0.
Obs: Diferente do método em que se muda o group do player, se uma criatura usa um poder em área, e o player estiver perto tmb toma o dano. se vc não gostou desta informação digo que tem como "retirar o dano" com um statchange checando se o player tem um summon ativo.
Em Monster.cpp:
Procure por:
void Monster::doAttacking(uint32_t interval) E em baixo de:
if(!attackedCreature || (isSummon() && attackedCreature == this)) return; Adicione:
const std::list<Creature*>& summons = attackedCreature->getSummons(); CreatureList::const_iterator itt = summons.begin(); for(uint32_t i = 1; itt != summons.end(); ++itt, ++i) { if (i >= 1 && *itt){ searchTarget(); } } Ainda em Monster.cpp procure por:
bool Monster::selectTarget(Creature* creature) e em baixo de:
if(!isHostile() && getHealth() == getMaxHealth() && !isSummon()){ return false; } Adicione:
const std::list<Creature*>& summons = creature->getSummons(); CreatureList::const_iterator itt = summons.begin(); for(uint32_t i = 1; itt != summons.end(); ++itt, ++i) { if (i >= 1 && *itt){ if((isHostile() || isSummon() || !isHostile() && getHealth() != getMaxHealth()) && setAttackedCreature(*itt) && !isSummon()) Dispatcher::getInstance().addTask(createTask( boost::bind(&Game::checkCreatureAttack, &g_game, getID()))); return setFollowCreature(*itt, true); } } Gostou?, então se puder me ajude!
não autorizo o re-post em qualquer outro fórum sem minha autorização.
vyctor17 - Waki-V LTDA ©