Tudo que MatCollier postou
-
(Resolvido)Promotion com 2 opções
Boa mano! Fico feliz que conseguiu.
-
(Resolvido)Promotion com 2 opções
Cara, não achei de jeito nenhum onde dos scripts ele faz o update das vocations na database. Só pra confirmar, tu já criou a nova vocação no vocations.xml né? Precisa dela lá configurada certinho (com uma vocation id diferente das demais) pra dar certo. Caso tu não tenha certeza de como ficou a configuração lá, tem uns tutoriais na net, posso encontrar um e te mandar. Mas se tu ajeitou lá certinho, eu acho mesmo que deve estar faltando fazer o update na database da nova vocação (e não sei onde isso é feito, procurei muito aqui).
-
(Resolvido)Promotion com 2 opções
Das duas uma, ou tua vocations não tá sendo salva na database, ou tu tem um script onLogin que retorna a vocations do char pra a anterior. Eu acho que é a primeira opção, mas sou péssimo com essa história de dbQuery, update em database e tal. Posso tentar te ajudar quando eu chegar procurando onde fica o meu script que salva isso pra ver se conseguimos replicar ele pra vc, só que com tuas colunas e tabelas. Lembrando que tb n sou mt bom com isso, então posso estar errado. Mas n custa tentar acho, ja q n apareceu ngm mais experiente.
-
(Resolvido)Promotion com 2 opções
Posso passar o script, mas não sei como funciona a conversão infelizmente. No caso é só tu mudar o 5 pelo id da vocação que tu quer. Aí pode fazer um script de npc desses pra cada promoção diferente (que foi o que eu fiz) ou tentar juntar eles em um só, o que é possível, acho eu.
-
(Resolvido)Promotion com 2 opções
Qual o tfs que tu usa? Eu tenho um sistema parecido no meu ot, TFS 1.2, posso compartilhar, mas funciona da seguinte forma: O player é, digamos, "mage" (o sorcerer do meu ot). No level 35 ele pode promover pra "Master Sorcerer" ou pra "Wizard". Mas são 2 npcs diferentes. Se ele promover com um npc é pra master sorcerer, com o outro é pra wizard. Serve pra tu?
-
Top 5 Quests [GESIOR/TFS 1.2]
[Ja resolvi] Olá. Eu gostaria de fazer, na lateral do meu site, aparecer o top 5 do meu ranking de quests feitas. Pra facilitar, eu ja tenho um modelo do top 5 level (que aparece certinho), mas não sei que partes alterar pra ele pegar os dados da coluna de quests e ordenar certinho. Segue o top 5 level (cortei o que não tinha relação com o level pra ficar mais facil de encontrar o que eu preciso): <?php if(!defined('INITIALIZED')) exit; $cacheSec = 30; $cacheFile = 'cache/topplayers.tmp'; if (file_exists($cacheFile) && filemtime($cacheFile) > (time() - $cacheSec)) { $topData = file_get_contents($cacheFile); } else { $topData = ''; $i = 0; foreach($SQL->query("SELECT `name`, `level` FROM `players` WHERE `group_id` < 2 AND `account_id` != 3 ORDER BY `level` DESC LIMIT 5")->fetchAll() as $player) { $i++; $topData .= '<tr><td style="width: 80%"><strong>'.$i.'.</strong> <a href="?view=characters&name='.urlencode($player['name']).'">'.$player['name'].'</a></td><td><span class="label label-primary">Lvl. '.$player['level'].'</span></td></tr>'; } file_put_contents($cacheFile, $topData); } ?> <div class="panel panel-default"> <div class="panel-heading"> <span class="panel-title text-info fw700"><img src="https://www.tibiawiki.com.br/images/d/da/Badge_of_Glory.gif" alt="" style="width:32; height:32px;"/> Top 5 Level</h3></span> </div> <div class="panel-body"> <table class="table table-condensed table-content table-striped"> <tbody> <?php echo $topData; ?> </tbody> </table> </div> O número de quests feitas pelo player se encontra na coluna "quests_feitas" na tabela "players" da database teste. Podem fechar o tópico. Já consegui. Para quem quiser a solução, ficou assim: $cachequestSec = 30; $cachequestFile = 'cache/topquestplayers.tmp'; if (file_exists($cachequestFile) && filemtime($cachequestFile) > (time() - $cachequestSec)) { $topquestData = file_get_contents($cachequestFile); } else { $topquestData = ''; $i = 0; foreach($SQL->query("SELECT `name`, `quests_feitas` FROM `players` WHERE `group_id` < 4 AND `account_id` != 3 ORDER BY `quests_feitas` DESC LIMIT 5")->fetchAll() as $player) { $i++; $topquestData .= '<tr><td style="width: 80%"><strong>'.$i.'.</strong> <a href="?view=characters&name='.urlencode($player['name']).'">'.$player['name'].'</a></td><td><span class="label label-primary">Quests: '.$player['quests_feitas'].'</span></td></tr>'; } file_put_contents($cachequestFile, $topquestData); } <div class="panel panel-default"> <div class="panel-heading"> <span class="panel-title text-info fw700"><img src="https://www.tibiawiki.com.br/images/d/da/Badge_of_Glory.gif" alt="" style="width:32; height:32px;"/> Top 5 Quests</h3></span> </div> <div class="panel-body"> <table class="table table-condensed table-content table-striped"> <tbody> <?php echo $topquestData; ?> </tbody> </table> </div> </div> Basicamente adicionei essas 2 partes e criei um cache file "topquestplayers.tmp"
-
Adicionar valor da storage à tabela na database [TFS 1.2/GESIOR]
Cara, não sei nem como agradecer, tas resolvendo todos os meus problemas! Mas aparentemente não tá sendo atualizada a coluna "quests_feitas" na database. Não deu nenhum erro na distro, mas todos os valores continuam zero (coloquei pra aparecer o valor da storageSoma no !stats e lá está contanto a qntd de quests). Resolvido! O problema era aqui: local playerId = player:getId() Eu tinha que usar: local playerId = player:getGuid() Novamente muito obrigado Luan! Vc é foda cara.
-
Adicionar valor da storage à tabela na database [TFS 1.2/GESIOR]
Boa tarde. Eu venho tentando fazer no meu ot (e no site) um "ranking de quests feitas". Pra isso, primeiro fiz um script onLogin que verifica as storages de todas as quests do jogo e faz a contagem de quantas foram feitas numa storageSoma. Agora, eu criei uma coluna "quests_feitas" na tabela "players" da minha database "test" e quero fazer com que esse valor da storageSoma (que é o total de quests feitas pelo player) seja atualizado na coluna "quests_feitas" sempre que ele fizer login. Me parece bem simples, mas infelizmente não entendo de programação o suficiente para fazer isso. Agradeço se alguém puder ajudar. Segue o código (essa parte da dbQuery é a que está errada e preciso ajustar): -- ordered as in creaturescripts.xml local storagesQuests = { 5010, 5020, 5030, 5040, 5050, 5060, 5070, 5080, 1114, 87580, 587423, 1036, 1096, 1087, 1111, 1112, 1113, 1115, 1048, 1116, 1039, 1109, 1086, 1049, 1118, 1117, 1049, 1050, 1038, 1065, 1044, 1004, 1067, 1047, 1027, 1022, 1040, 1010, 1031, 1030, 1005, 1066, 1061, 1088, 1069, 1045, 1089, 1020, 1093, 1026, 1077, 1081, 1095, 1035, 1072, 1075, 1033, 1070, 1006, 1062, 1076, 1034, 1017, 1064, 1041, 1079, 1002, 1082, 1092, 1029, 1032, 1021, 1018, 1037, 1105, 1083, 1099, 1046, 1000, 1098, 1019, 1051, 1014, 1012, 1043, 1094, 1084, 1001, 1042, 1106, 1078, 1008, 1104, 1013, 1090, 1011, 1052, 1080, 1101, 1010, 1003, 1028, 1007, 1073, 1074, 1102, 1071, 1063, 1097, 1053, 1068, 1091, 1085, 1009, 1023, 1024, 1025, 1103, 50084, 58784 } local storageSoma = 100000 function onLogin(player, cid) for _, storage in ipairs(storagesQuests) do if player:getStorageValue(storage) == -1 then player:setStorageValue(storage, 0) end end player:setStorageValue(storageSoma, 0) for _, storage in ipairs(storagesQuests) do if player:getStorageValue(storage) == 1 then player:setStorageValue(storageSoma, player:getStorageValue(storageSoma) + 1) end end db.query('INSERT INTO `player` (`quests_feitas`) VALUES (' .. storageSoma .. ' )') return true end
-
Array de Storages [TFS 1.2]
Entendi! Valeu mesmo mano!!! Agora só preciso criar uma coluna na database pra guardar esse valor, e fazer um ranking de quests feitas né? Deu perfeitamente certo, muito obrigado mesmo!!! Uma dúvida: Tu acha que tem como fazer essa função dar certo como onThink? Porque eu reparei aqui que o "Quests Feitas", ou no caso a storageSoma, só atualiza quando reloga, mas queria q ele atualizasse assim que uma nova quest fosse feita.
-
Array de Storages [TFS 1.2]
Cara, muito obrigado mesmo! Tu tas salvando minha vida. Na verdade as mesmas storages que vai verificar se é -1, vai verificar se é 1 (se for -1, seta 0, se for 1, aumenta a storageSoma). Mas acho que consigo adaptar com isso aí que tu me deu. Só tem 1 porém: Eu não queria mudar as storages que forem =1. Queria adicionar +1 na storage soma e manter ela como 1, porque se a storage virar 2, vai bugar meu questlog. Tem como? Ou por ser uma função onLogin vai ficar somando sempre que eu logar e o número vai ficar errado?
-
Array de Storages [TFS 1.2]
Olá novamente. Estou tentando organizar meu questlog (pra que as missões apareçam, mas só fiquem com status de "completa" após terem sido feitas). Tudo funciona ok, mas o jeito que estou fazendo me parece mais trabalhoso, e "desorganizado". Gostaria de saber se tem como eu fazer um Array de Storages, e depois pegar todas as que estão -1 e setar como 0. Segue formato atual do código: function onLogin(player) -- Quest Logs if player:getStorageValue(5010) == -1 then player:setStorageValue(5010, 0) end if player:getStorageValue(5020) == -1 then player:setStorageValue(5020, 0) end if player:getStorageValue(5030) == -1 then player:setStorageValue(5030, 0) end if player:getStorageValue(5040) == -1 then player:setStorageValue(5040, 0) end if player:getStorageValue(5050) == -1 then player:setStorageValue(5050, 0) end if player:getStorageValue(5060) == -1 then player:setStorageValue(5060, 0) end if player:getStorageValue(5070) == -1 then player:setStorageValue(5070, 0) end if player:getStorageValue(5080) == -1 then player:setStorageValue(5080, 0) end if player:getStorageValue(1114) == -1 then player:setStorageValue(1114, 0) end if player:getStorageValue(87580) == -1 then player:setStorageValue(87580, 0) end if player:getStorageValue(587423) == -1 then player:setStorageValue(587423, 0) end return true end Quero fazer um "local quests" com todas elas, e aí um if só que pegue todas as storages no array "quests" e, caso a storage seja -1, sete ela como 0. Gostaria também de fazer com que caso a storage seja 1, ele "some" um valor a uma storage "quests feitas", por assim dizer. Pra fazer um ranking de quests feitas. Aproveitando o tópico, eu uso ambos clientes 10.00 (outdated) e 11.48 no meu ot, mas quando tento abrir esse questlog (a parte de missões especificamente) no cliente 11 ele crasha. No cliente 10 funciona normalmente. Alguém sabe se isso tem solução?
-
Todos os players ganham item ao matar o boss [TFS 1.x]
Acredito eu que seja TFS 1.2 Consegui ajeitar o script utilizando ele assim: local config = { monsterName = "smaug", -- nome em letras minúsculas. storageQueDeveter = 587426, storageQueVaiGanhar = 587427, itemId = 8931 } function onKill(creature, target) local player = creature:getPlayer() if not player then return true end if target:getMonster() and target:getName():lower() == config.monsterName then for uid in pairs(target:getDamageMap()) do local killer = Player(uid) if killer then if killer:getStorageValue(config.storageQueDeveter) > 0 then killer:addItem(config.itemId, 1) killer:setStorageValue(config.storageQueVaiGanhar, 1) end end end end return true end function onLogin(cid) registerCreatureEvent(cid, "bossKill") return true end Deu certo, mas não tem aquela checagem que tu fez antes. Mesmo assim agradeço muito pela ajuda!!! Todos os players que participaram receberam o item assim como eu queria. Não posso adicionar mais reações hoje, mas assim que puder dou o Positivo!
-
Todos os players ganham item ao matar o boss [TFS 1.x]
function onLogin(cid) registerCreatureEvent(cid, "testeKill") return true end <event type="login" name="testeLogin" script="ringofsauron/teste.lua"/> <event type="kill" name="testeKill" script="ringofsauron/teste.lua" /> O primeiro coloquei no teste.lua O segundo no creaturescripts.xml Fazendo assim deu certo, mas cada player recebeu 2 itens, não só 1 (o item repetiu). Como assim qual engine? Peço desculpas mas não sei exatamente o que significa a pergunta.
-
Todos os players ganham item ao matar o boss [TFS 1.x]
Acabei de testar, nenhum dos players que participou ganhou nem a storage, nem o item. EDIT: Também não apareceu nenhum erro na distro.
-
Todos os players ganham item ao matar o boss [TFS 1.x]
Olá! Primeiramente, obrigado pela ajuda! Eu não entendi muito bem esta parte: if not killer:addItem(config.itemId, 1) then print("[ERROR] CREATURESCRIPT, FUNCTION: addItem, PLAYER: ".. killer:getName()) else killer:setStorageValue(config.storageQueVaiGanhar, 1) end Poderia me explicar por favor? Por quê "if not killer:addItem(config.itemId, 1)" ? A ideia é que todos os jogadores sejam considerados killers e ganhem o item + a storage.
-
Variação do dano básico/critical
Boa noite. Atualmente tenho alguns jogadores reclamando no meu servidor da variação dos danos (as vezes muito baixo, as vezes muito alto), tanto pra melee (sword,club,axe) quanto pra distance (spears,bolts e arrows). Gostaria de saber onde fica a fórmula de dano, pois no weapons.xml está "value=default", e não consigo encontrar como ajustar isso. Não sei se o próximo problema, que é o dos critical hits, seria corrigido juntamente com o primeiro (se é decorrente dele). Mas o mesmo acontece com os criticos (só que aqui a variação é ainda maior).
-
Todos os players ganham item ao matar o boss [TFS 1.x]
Boa noite. Tentei reviver um tópico já respondido para tirar esta dúvida, mas não deu certo. Estou tentando já há algum tempo solucionar este problema: Eu quero que, ao matar um boss, todos os players que estavam batendo nele (e que tem uma certa storage de missão cumprida) recebam um item e uma outra storage de "recompensa recebida". Mas com o script que tenho atualmente, somente aquele que dá o last hit recebe o item. Segue script atual: function onKill(cid, target) if not (isPlayer(cid) and isMonster(target)) then return true end local storage = 587427 if getCreatureName(target) == "Smaug" and getPlayerStorageValue(cid, 587426) > 0 then setPlayerStorageValue(cid, storage, 1) doPlayerAddItem(cid,8931,1) end return true end function onLogin(cid) registerCreatureEvent(cid, "bossKill") return true end Já tentei utilizando onDeath em vez de onKill, mas não funcionou também, talvez porque eu tenha feito algo errado.
-
Last Deaths [MYSQL/GESIOR]
Muitíssimo obrigado! Funcionou perfeitamente.
-
(Resolvido)Talkaction Deathlist [TFS1.X]
Criei outro tópico já! Valeu!!!
-
(Resolvido)Todos ganham item ao matar boss
Peço desculpas por reviver o tópico também, mas seria possível fazer este código para TFS 1.2? Testei aqui e não funciona, creio que por causa do "deathList" na função onDeath. O primeiro código enviado pelo Bodak Reborn funciona, mas como o Vodkart disse, apenas o player que mata o monstro ganha o item.
-
Last Deaths [MYSQL/GESIOR]
Boa noite. Estou tentando há algum tempo criar uma página de "Últimas mortes" para o meu site, mas os que encontrei na internet não funcionam, acredito que pelo fato da minha database ser organizada de forma diferente. Não tenho conhecimento suficiente pra adaptar, mesmo tendo um "últimas mortes do char" na página de character, não consigo criar um "últimas mortes geral" numa página separada. O last deaths em character está assim: //deaths list $player_deaths = new DatabaseList('PlayerDeath'); $player_deaths->setFilter(new SQL_Filter(new SQL_Filter(new SQL_Field('player_id'), SQL_Filter::EQUAL, $player->getId()), SQL_Filter::CRITERIUM_AND,new SQL_Filter(new SQL_Field('id', 'players'), SQL_Filter::EQUAL, new SQL_Field('player_id', 'player_deaths')))); $player_deaths->addOrder(new SQL_Order(new SQL_Field('time'), SQL_Order::DESC)); $player_deaths->setLimit(5); foreach($player_deaths as $death) { $deads++; $dead_add_content .= "<tr><td width=\"20%\" align=\"center\">".date("j M Y, H:i", $death->getTime())."</td><td>Morto no level " . $death->getLevel() . " por " . $death->getKillerString(); if($death->getMostDamageString() != '' && $death->getKillerString() != $death->getMostDamageString()) $dead_add_content .= ' e ' . $death->getMostDamageString(); $dead_add_content .= "</td></tr>"; } if ($deads > 0) $main_content .= '<div class="panel panel-default"><div class="panel-heading"><h3 class="panel-title">Mortes</h3></div><div class="panel-body"><table class="table table-striped table-condensed table-content"><tbody>' . $dead_add_content . '</tbody></TABLE></div></div>'; E essas são as colunas que tenho na minha database (em player_death): Quero que apareça a mesma coisa que aparece no last deaths que mostrei acima, só que pra todas as mortes do servidor, não apenas de um player especifico, e utilizando o "player_killers". Agradeço se alguém puder ajudar.
-
(Resolvido)Talkaction Deathlist [TFS1.X]
Cara, não sei nem como agradecer! Deu super certo. Sobre a parte do site, eu ja vi vários sites de ot com uma página de "Últimas Mortes", mas não consegui fazer funcionar no meu porque a minha database é diferente, acho.
-
(Resolvido)Talkaction Deathlist [TFS1.X]
Cara, muito muito muito muito obrigado mesmo! Ajudou demais!!!! Dois pequenos detalhes, aproveitando: Seria possível colocar pra não repetir o nome? Exemplo: Pra aparecer Dragon 1x só. E por fim, vc saberia como fazer pra colocar um "últimas mortes" no site? Eu uso MySQL/Apache.
-
(Resolvido)Talkaction Deathlist [TFS1.X]
Deu certo! Só tem 2 pequenos poréns: 1: Ele está cortando as 2 últimas letras no final (exemplo: em vez de "Morto por Lista, Teste.", fica "Morto por Lista, Tes.") 2: Quando morre pra monstro não aparece o nome dos monstros, fica só o ponto (aquela última morte level 102 foi pra um Dragon e um Dragon Lord).
-
(Resolvido)Talkaction Deathlist [TFS1.X]
Primeiramente, agradeço MUITO pela disposição em ajudar, faz dias que tento resolver isso sem sucesso. Acabei de testar, algo não deu certo: Não entendo suficiente pra corrigir sozinho essa parte. EDIT: Fiz uma alteração na linha 60 do playerdeath.lua em creaturescripts, mudei v:getName para CreatureMT:getName. ficou assim: local deathListEnabled = true local maxDeathRecords = 5 function onDeath(player, corpse, killer, mostDamageKiller, unjustified, mostDamageUnjustified) local playerId = player:getId() if nextUseStaminaTime[playerId] ~= nil then nextUseStaminaTime[playerId] = nil end player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'Você morreu') player:removeBlessing(6) player:removeBlessing(7) if not deathListEnabled then return end local byPlayer = 0 local killerName local killerid if killer ~= nil then if killer:isPlayer() then killerid = killer:getGuid() byPlayer = 1 else local master = killer:getMaster() if master and master ~= killer and master:isPlayer() then killer = master killerid = killer:getGuid() byPlayer = 1 end end killerName = killer:isMonster() and killer:getType():getNameDescription() or killer:getName() else killerName = 'field item' end local byPlayerMostDamage = 0 local mostDamageKillerName if mostDamageKiller ~= nil then if mostDamageKiller:isPlayer() then byPlayerMostDamage = 1 else local master = mostDamageKiller:getMaster() if master and master ~= mostDamageKiller and master:isPlayer() then mostDamageKiller = master byPlayerMostDamage = 1 end end mostDamageName = mostDamageKiller:isMonster() and mostDamageKiller:getType():getNameDescription() or mostDamageKiller:getName() else mostDamageName = 'field item' end local KillersArray = {} for k, v in pairs(player:getDamageMap()) do local CreatureMT = Creature(k) if CreatureMT and CreatureMT:isPlayer() then table.insert(KillersArray, CreatureMT:getName()) end end local playerGuid = player:getGuid() db.query('INSERT INTO `player_deaths` (`player_id`, `time`, `level`, `killed_by`, `is_player`, `mostdamage_by`, `mostdamage_is_player`, `unjustified`, `mostdamage_unjustified`, `player_killers`) VALUES (' .. playerGuid .. ', ' .. os.time() .. ', ' .. player:getLevel() .. ', ' .. db.escapeString(killerName) .. ', ' .. byPlayer .. ', ' .. db.escapeString(mostDamageName) .. ', ' .. byPlayerMostDamage .. ', ' .. (unjustified and 1 or 0) .. ', ' .. (mostDamageUnjustified and 1 or 0) .. ', ' .. table.concat(KillersArray, ";") .. ')') local resultId = db.storeQuery('SELECT `player_id` FROM `player_deaths` WHERE `player_id` = ' .. playerGuid) local deathRecords = 0 local tmpResultId = resultId while tmpResultId ~= false do tmpResultId = result.next(resultId) deathRecords = deathRecords + 1 end if resultId ~= false then result.free(resultId) end local limit = deathRecords - maxDeathRecords if limit > 0 then db.asyncQuery("DELETE FROM `player_deaths` WHERE `player_id` = " .. playerGuid .. " ORDER BY `time` LIMIT " .. limit) end if byPlayer == 1 then local targetGuild = player:getGuild() targetGuild = targetGuild and targetGuild:getId() or 0 if targetGuild ~= 0 then local killerGuild = killer:getGuild() killerGuild = killerGuild and killerGuild:getId() or 0 if killerGuild ~= 0 and targetGuild ~= killerGuild and isInWar(playerId, killer.uid) then local warId = false resultId = db.storeQuery('SELECT `id` FROM `guild_wars` WHERE `status` = 1 AND ((`guild1` = ' .. killerGuild .. ' AND `guild2` = ' .. targetGuild .. ') OR (`guild1` = ' .. targetGuild .. ' AND `guild2` = ' .. killerGuild .. '))') if resultId ~= false then warId = result.getNumber(resultId, 'id') result.free(resultId) end if warId ~= false then db.asyncQuery('INSERT INTO `guildwar_kills` (`killer`, `target`, `killerguild`, `targetguild`, `time`, `warid`) VALUES (' .. db.escapeString(killerName) .. ', ' .. db.escapeString(player:getName()) .. ', ' .. killerGuild .. ', ' .. targetGuild .. ', ' .. os.time() .. ', ' .. warId .. ')') end end end end end Mas agora deu esse erro: