
gacjogos
Membro
-
Registro em
-
Última visita
Histórico de Curtidas
-
gacjogos deu reputação a Bruno Carvalho em [TalkAction] Rank SystemVersão: 3.1
Versão de tibia: 9.7+
Descrição: Como muitos sabem na versão 9.7 a tfs removeu o rank system, e o tibia também adicionou os novos estilos de diálogos. Então eu resolvi fazer um novo rank system com esse sistema.
Features:
- Rank system em tempo real.
- Janela personalisada.
- Frags rank (Mock)
TAG:
<talkaction words="!rank;/rank;!ranks;/ranks" event="script" value="rank.lua"/>
Script:
data/talkactions/rank.lua
modaldialog2 = { title = "Rank", message = "Escolha o rank que você quer visualizar:", buttons = { { id = 1, value = "Ver" }, { id = 2, value = "Cancelar" }, }, buttonEnter = 1, buttonEscape = 2, choices = { { id = 1, value = "Fist" }, { id = 2, value = "Club" }, { id = 3, value = "Sword" }, { id = 4, value = "Axe" }, { id = 5, value = "Distance" }, { id = 6, value = "Shield" }, { id = 7, value = "Fish" }, { id = 8, value = "Magic" }, { id = 9, value = "Level" }, { id = 10, value = "Frags" } }, popup = false } function callback2(cid, button, choice) if (button == 1) then local str = "" local name_now if (choice == 1) then str = "--[ Fist Rank ]--\n" query = db.getResult("SELECT `player_id`, `value` FROM `player_skills` WHERE `skillid` = 0 ORDER BY `value` DESC;") if (query:getID() ~= -1) then k = 1 repeat if k > 20 then break end str = str .. "\n " .. k .. ". "..(getPlayerNameByGUID(query:getDataInt("player_id"))).." - [" .. query:getDataInt("value") .. "]" k = k + 1 until not query:next() end elseif (choice == 2) then str = "--[ Club Rank ]--\n" query = db.getResult("SELECT `player_id`, `value` FROM `player_skills` WHERE `skillid` = 1 ORDER BY `value` DESC;") if (query:getID() ~= -1) then k = 1 repeat if k > 20 then break end str = str .. "\n " .. k .. ". "..(getPlayerNameByGUID(query:getDataInt("player_id"))).." - [" .. query:getDataInt("value") .. "]" k = k + 1 until not query:next() end elseif (choice == 3) then str = "--[ Sword Rank ]--\n" query = db.getResult("SELECT `player_id`, `value` FROM `player_skills` WHERE `skillid` = 2 ORDER BY `value` DESC;") if (query:getID() ~= -1) then k = 1 repeat if k > 20 then break end str = str .. "\n " .. k .. ". "..(getPlayerNameByGUID(query:getDataInt("player_id"))).." - [" .. query:getDataInt("value") .. "]" k = k + 1 until not query:next() end elseif (choice == 4) then str = "--[ Axe Rank ]--\n" query = db.getResult("SELECT `player_id`, `value` FROM `player_skills` WHERE `skillid` = 3 ORDER BY `value` DESC;") if (query:getID() ~= -1) then k = 1 repeat if k > 20 then break end str = str .. "\n " .. k .. ". "..(getPlayerNameByGUID(query:getDataInt("player_id"))).." - [" .. query:getDataInt("value") .. "]" k = k + 1 until not query:next() end elseif (choice == 5) then str = "--[ Distance Rank ]--\n" query = db.getResult("SELECT `player_id`, `value` FROM `player_skills` WHERE `skillid` = 4 ORDER BY `value` DESC;") if (query:getID() ~= -1) then k = 1 repeat if k > 20 then break end str = str .. "\n " .. k .. ". "..(getPlayerNameByGUID(query:getDataInt("player_id"))).." - [" .. query:getDataInt("value") .. "]" k = k + 1 until not query:next() end elseif (choice == 6) then str = "--[ Shield Rank ]--\n" query = db.getResult("SELECT `player_id`, `value` FROM `player_skills` WHERE `skillid` = 5 ORDER BY `value` DESC;") if (query:getID() ~= -1) then k = 1 repeat if k > 20 then break end str = str .. "\n " .. k .. ". "..(getPlayerNameByGUID(query:getDataInt("player_id"))).." - [" .. query:getDataInt("value") .. "]" k = k + 1 until not query:next() end elseif (choice == 7) then str = "--[ Fish Rank ]--\n" query = db.getResult("SELECT `player_id`, `value` FROM `player_skills` WHERE `skillid` = 6 ORDER BY `value` DESC LIMIT 20;") if (query:getID() ~= -1) then k = 1 repeat if k > 20 then break end str = str .. "\n " .. k .. ". "..(getPlayerNameByGUID(query:getDataInt("player_id"))).." - [" .. query:getDataInt("value") .. "]" k = k + 1 until not query:next() end elseif (choice == 8) then str = "--[ Magic Rank ]--\n" query = db.getResult("SELECT `maglevel`, `name` FROM `players` WHERE `group_id` < 3 ORDER BY `maglevel` DESC LIMIT 20;") if (query:getID() ~= -1) then k = 1 repeat if k > 20 then break end str = str .. "\n " .. k .. ". "..(query:getDataString("name")).." - [" .. query:getDataInt("maglevel") .. "]" k = k + 1 until not query:next() end elseif (choice == 9) then str = "--[ Level Rank ]--\n" query = db.getResult("SELECT `name`, `level`, `experience` FROM `players` WHERE `group_id` < 3 ORDER BY `experience` DESC LIMIT 20;") if (query:getID() ~= -1) then k = 1 repeat if k > 20 then break end str = str .. "\n " .. k .. ". "..(query:getDataString("name")).." - [" .. query:getDataInt("level") .. "]" k = k + 1 until not query:next() end elseif (choice == 10) then str = "--[ Kills Rank ]--\n" query = db.getResult("SELECT `p`.`name` AS `name`, COUNT(`p`.`name`) as `frags` FROM `killers` k LEFT JOIN `player_killers` pk ON `k`.`id` = `pk`.`kill_id` LEFT JOIN `players` p ON `pk`.`player_id` = `p`.`id` WHERE `k`.`unjustified` = 1 GROUP BY `name` ORDER BY `frags` DESC;") if query:getID() == -1 then str = str .. "\nNinguém matou ninguém." end if (query:getID() >= 0) then k = 1 repeat if k > 20 then break end name_now, l = query:getDataString("name"), string.len(query:getDataString("name")) str = str .. "\n " .. k ..". ".. name_now .." - [" .. query:getDataInt("frags") .. "]" k = k + 1 until not query:next() end end doShowTextDialog(cid, 2529, str) end end function onSay(cid, words, param) addDialog(modaldialog2, 1002, cid, callback2); return true end
Como usar:
No servidor digite /rank e selecione o tipo de rank ou skill que você deseja visualizar.
Video: (Antigo mais explicativo)
Creditos:
Comedinha (Bruno Carvalho)
Mock
Tutoriais de query em vários fórums.
Oneshot
-
gacjogos deu reputação a WarW0lf em [Funcional] Talkaction !rank [Personalizado]Creditos: Critico (vodkart)
Comando !rank atualizado com novo rank que é o !rank frags, onde mostra os maiores matadores do ot.
Ranks:
Skills
Level
Magic
Health
Mana
Frags
Exemplo:
!rank frags
!rank magic
Crie ranks.lua em data/talkactions/scripts.
Em data/lib/050-function.lua adicione:
Crie rankfrags.lua em data/creaturescripts/scripts
E em data/creaturescripts/login.lua adicione:
Simples e Útil
Se ajudei REP+
-
gacjogos deu reputação a Vodkart em Comando !frags errortroca essa parte: doPlayerPopupFYI(cid, result) por essa: doShowTextDialog(cid, 2160, result)
-
gacjogos deu reputação a Vodkart em [Talkaction] Comando !guildO comando checa:
- O total de membros que sua guild possui
- Quantos Players Tem online
- Mostra o nome e o Rank dos jogadores Online
Em lib/050-function adicione:
function CountGuildMembers(GuildName) -- function by vodkart local count = 0 local lista = db.getResult("SELECT `name`, `rank_id` FROM `players` WHERE `rank_id` IN (SELECT `id` FROM `guild_ranks` WHERE `guild_id` = " .. getGuildId(GuildName) .. ");") if(lista:getID() ~= -1) then repeat count = count + 1 until not lista:next() lista:free() return count end end Em talkactions/script guildinformation.lua function onSay(cid, words, param, channel) local players,str,GuildName = {},'',getPlayerGuildName(cid) if getPlayerGuildId(cid) <= 0 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"Você precisa estar em uma Guild.") return true end for _, cid in pairs(getPlayersOnline()) do if getPlayerGuildName(cid) == GuildName then table.insert(players, cid) end end str = str .. "Membros total da guild: "..CountGuildMembers(GuildName).." Players.\n\nExiste "..#players.." Players online na sua guild:\n\n" for i = 1, #players do str = str.."\n["..getPlayerName(players[i]).."]["..getPlayerGuildRank(players[i]).."]" end return doShowTextDialog(cid, 2533, str) end talkactions.xml <talkaction words="!guild" event="script" value="guildinformation.lua"/>
-
gacjogos deu reputação a xWhiteWolf em Callbacks de creaturescriptsFala galera do TK, hoje eu vim trazer pra vocês uma coisa que se perdeu em todos esses anos de OT e que é uma das coisas mais importantes prum scripter intermediário/avançado. São as explicações dos respectivos callbacks de creaturescripts. Espero que ajude bastante gente
Créditos: 90% Zonnebloem (um gringo ai que postou isso das sources) e 10% pra mim por completar oque ele não tinha escrito e arrumado umas coisas que ele escreveu errado.
____________________________ CREATURE EVENTS TIPOS: _________________
TFS 0.2
type="login" function onLogin(cid) type="logout" function onLogout(cid) type="advance" function onAdvance(cid, skill, oldLevel, newLevel) type="think" function onThink(cid, interval) type="kill" function onKill(cid, target) type="death" function onDeath(cid, corpse, lasthitkiller, mostdamagekiller, lasthitunjustified, mostdamageunjustified) type="preparedeath" function onPrepareDeath(cid, killer) TFS 0.3/0.4
type="login" function onLogin(cid) type="logout" function onLogout(cid) type="advance" function onAdvance(cid, skill, oldLevel, newLevel) type="think" function onThink(cid, interval) type="kill" function onKill(cid, target, lastHit) type="death" function onDeath(cid, corpse, deathList) type="preparedeath" function onPrepareDeath(cid, deathList) type="statschange" function onStatsChange(cid, attacker, type, combat, value) type="combat" function onCombat(cid, target) type="target" function onTarget(cid, target) type="look" function onLook(cid, thing, position, lookDistance) type="textedit" function onTextEdit(cid, item, newText) type="outfit" function onOutfit(cid, old, current) type="push" function onPush(cid, target) type="follow" function onFollow(cid, target) type="attack" function onAttack(cid, target) type="areacombat" function onAreaCombat(cid, tileItem, tilePosition, isAggressive) type="cast" function onCast(cid, target) type="direction" function onDirection(cid, old, current) type="reportbug" function onReportBug(cid, comment) type="sendmail" function onSendMail(cid, receiver, item, openBox) type="receivemail" function onReceiveMail(cid, sender, item, openBox) type="traderequest" function onTradeRequest(cid, target, item) type="tradeaccept" function onTradeAccept(cid, target, item, targetItem) type="joinchannel" function onJoinChannel(cid, channel, users) type="leavechannel" function onLeaveChannel(cid, channel, users) TFS 1.0
type="login" function onLogin(cid) type="logout" function onLogout(cid) type="think" function onThink(cid, interval) type="preparedeath" function onPrepareDeath(cid, killer) type="death" function onDeath(cid, corpse, lasthitkiller, mostdamagekiller, lasthitunjustified, mostdamageunjustified) type="kill" function onKill(cid, target) type="advance" function onAdvance(cid, skill, oldLevel, newLevel) type="modalwindow" function onModalWindow(cid, modalWindowId, buttonId, choiceId) type="textedit" function onTextEdit(cid, item, text) type="changehealth" function onChangeHealth(cid, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType) type="changemana" function onChangeMana(cid, attacker, manaChange) type="extendedopcode" function onExtendedOpcode(cid, opcode, buffer) ____________________________ INFORMAÇÃO SOBRE OS TIPOS: _________________
antes de tudo tenha em mente que os tipos só serão executados no player ou monstro em que eles forem registrados; Registrar no login.lua vai fazer com que ele seja executado em todos os players assim q eles logarem. Se deve ser executado somente por alguns monstros, registre no monstro em questão no xml dele.
login
Quando é executada:
- Quando um player loga
Parametros:
- cid = creatureid do player que logou
quando está return false:
- nada
registra creature event:
- não
~~~~
logout
Quando é executada:
- quando um player desloga pelo logout do próprio cliente. Não acontece se o player morrer, for disconectado ou xlogs
Parametros:
- cid = creatureid do player que deslogou
quando está return false:
- Player não vai conseguir deslogar
registra creature event:
- não
~~~~
advance
Quando é executado:
- Toda vez que um player avançar de level, magic level ou qualquer outra skill
Parametros:
- cid = creature id do player que avançou
- skill = tipo da skill que o player avançou vide tabela abaixo (note que vc pode utilizar tanto o nome SKILL_FIST quanto o numero 0)
SKILL_FIST = 0 SKILL_CLUB = 1 SKILL_SWORD = 2 SKILL_AXE = 3 SKILL_DISTANCE = 4 SKILL_SHIELD = 5 SKILL_FISHING = 6 SKILL__MAGLEVEL = 7 SKILL__LEVEL = 8 - oldlevel = level antes do player avançar
- newlevel = o novo level após avançar
quando está return false:
- ele não vai avançar o nível
Registra creature event:
- sim (isso significa que vc pode colocar pra ele registrar um outro creatureevent dentro desse script após alcançar X level)
~~~~
think
Quando é executada:
- Pelo tempo
Parametros:
- cid = creatureid do monstro ou player
- interval = intervalo entre cada checagem OU em que intervalo deve ser executada, 500 é 0.5 segundo.
quando está return false:
- nada
Registra creature event:
- sim
~~~~
kill
Quando é executada:
- Ao matar um player/monstro
Parametros:
- cid = creatureid do player ou do monstro que mata
- target = creatureid do player ou monstro que é morto
quando está return false:
- O target não morrerá, ele ficará com 0 de vida e a barra sumirá para os inimigos.Ele precisará se curar para que sua barra de vida volte
registra creature event:
-sim
~~~~
death
Quando é executada:
- Quando um player ou monstro morrem
Parametros:
- cid = creatureid do player monstro que morre
- corpse = corpo do monstro ou player que morre
exemplo de adicionando 3 crystal coins no corpo que morreu.
doAddContainerItem(corpse.uid, 2160, 3) - deathlist = uma table com o nome de todos que mataram, sendo na ordem o deathlist[1] oque deu o ultimo hit e o deathlist[2] sendo oque deu mais dano.
quando está return false:
- O corpo não será criado
Registra creature event:
- Sim
~~~~
preparedeath
Quando é executada:
- Quando um monstro ou player está prestes a morrer (pode ser usada em scripts que devem ser executados no segundo antes do player morrer)
Parameters:
- cid = creatureid do player ou monstro que está prestes a morrer
- deathlist = uma tabela com o nome dos atacantes
quando está return false:
- o player ou monstro não irá morrer (mesma história do kill)
Registra creature event:
- Sim
~~~~
statschange
quando é executada:
-Quando um player ou monstro ou ganha ou perde vida/mana de um combat ou uma função (combats não são só os das spells, mas também weapons/fist/melee... vale lembrar também que monstros não possuem mana)
Parametros:
- cid = creatureid do player ou monstro q ganha/perde vida/mana
- attacker = creatureid do player ou monstro que causou a mudança na health/mana
- type = tipo da mudança, sendo ela:Ganho de vida, perca de vida, ganho de mana e perca de mana vide tabela abaixo:
STATSCHANGE_HEALTHGAIN = 0 STATSCHANGE_HEALTHLOSS = 1 STATSCHANGE_MANAGAIN = 2 STATSCHANGE_MANALOSS = 3 - combat = o tipo de combat que causou a alteração, sendo esses tipos:
COMBAT_NONE = 0 COMBAT_PHYSICALDAMAGE = 1 COMBAT_ENERGYDAMAGE = 2 COMBAT_EARTHDAMAGE = 4 COMBAT_POISONDAMAGE = 4 COMBAT_FIREDAMAGE = 8 COMBAT_UNDEFINEDDAMAGE = 16 COMBAT_LIFEDRAIN = 32 COMBAT_MANADRAIN = 64 COMBAT_HEALING = 128 COMBAT_DROWNDAMAGE = 256 COMBAT_ICEDAMAGE = 512 COMBAT_HOLYDAMAGE = 1024 COMBAT_DEATHDAMAGE = 2048 - value = valor da mudança
quando está return false:
- O player ou o monstro não ganharão/perderão vida/mana no combat. Pode ser usado pra fazer ele ficar imortal por um certo período ou não ser capaz de tomar dano de certos players/creaturas
Registra creature event:
- Sim
~~~~
combat
Quando é executado:
- Quando um player ou monstro starta um combat (qualquer tipo de ataque)
Parametros:
- cid = creatureid do player ou monstro que usa o combat
- target = creatureid do player ou monstro que sofre o combat
quando está return false:
- O player ou monstro não será capaz de levar ataques, isso também inclui que ele não poderá dar target em alguém/algo . Isso pode ser usado para criar monstros que não possam levar ataques ou fazer players ficarem imunes a dano por um certo tempo.
Registra creature event:
- Sim
_______________________________________________________________________________________________
Agora começa a graça da coisa:
~~~~
target
Quando é executado:
- Quando um player ou monstro dá target em um player/mostro (follow/attack)
Parametros:
- cid = creatureid do player ou monstro que dá o target
- target = creatureid do player ou monstro que é targeted
quando está return false:
- O player/monstro não poderá dar target.. alguns testes com monstros revelaram que o monstro ainda consegue te atacar então acho que essa função só serve para player
Registra creature event:
- Sim
~~~~
look
Quando é executado:
- Quando um player dá look em algo
Parametros:
- cid = creatureid do player que dá o look
- thing = objeto/player/monstro que o player dá look
- position = não tenho certeza se é a posição do objeto que é dado look ou se é a minha posição.
- lookDistance = distancia entre esse objeto e eu.
quando está return false:
- Não aparece a mensagem de look na tela
Registra creature event:
- Sim
~~~~
textedit
Quando é executado:
- Quando um player edita um texto em algum item writeable (livros por exemplos)
Parametros:
- cid = creatureid do player
- item = item que está sendo modificiado
- newText = texto novo que foi escrito
quando está return false:
- O player não conseguirá editar o texto, quando ele tentar dar ok o item continuará com o mesmo texto.. Pode ser usado numa quest com muito RPG pra checar se a senha que o player escreveu no livro é a correta.
Registra creature event:
- sim
~~~~
outfit
Quando é executado:
- Quando um player ou monstro muda de outfit
Parametros:
- cid = creatureid do player ou monstro que muda de outfit
- old = outfit antiga
- current = outfit atual (após ter trocado)
quando está return false:
- a troca de outfit será cancelada e o player/monstro voltará para a antiga outfit
Registra creature event:
- sim
~~~~
push
Quando é executado:
- Quando um player tenta empurrar um monstro ou um player
Parametros:
- cid = creatureid do player que empurrar
- target = creatureid do player ou monstro que é empurrado
quando está return false:
- O player não conseguirá empurrar (arrastar o oponente com o mouse). É bastante util em eventos para que eles não possam ficar se empurrando
Registra creature event:
- sim
~~~~
follow
Quando é executado:
- Quando um player dá follow em algum monstro ou player ou até num NPC
Parametros:
- cid = creatureid do player que dá o follow
- target = creatureid da criatura (monstro/npc/player) que é seguida
quando está return false:
- O follow não irá ocorrer
Registra creature event:
- Sim
~~~~
attack
Quando é executado:
- Quando um player ou monstro ataca (melee, spells não contam)
Parametros:
- cid = creatureid do player ou monstro que ataca
- target = creatureid do player ou monstrp que sofre o ataque
quando está return false:
- O player/monstro não irá atacar, é bastante útil em sistemas que vc queira deixar uma certa criatura imune a ataques mas que ela ainda possa morrer pra spells
Registra creature event:
- Sim
~~~~
areacombat
Quando é executado:
- Quando um player ou monstro starta um combat em área (usa uma spell ou dano em área)
Parametros:
- cid = creatureid do player ou monstro que usa o combat
- tileItem = player que está dentro da area
- tilePosition = posição do player que está dentro da area
- isAggressive = se esse combat em área é agressivo ou não, lembre-se que magias como exura gran mas res fazem combat em área mas esse combat não é agressivo porque ela cura em área
quando está return false:
- o combat é cancelado
Registra creature event:
- Sim
~~~~
cast
Quando é executado:
- Quando um player ou monstro solta uma magia
Parametros:
- cid = creatureid do player ou monstro que usa a magia
- target = creatureid do player ou monstro que sofre o dano da magia
quando está return false:
- a magia não é lançada
Registra creature event:
- sim
~~~~
direction
Quando é executado:
- Quando uma criatura (NPC/Player/Monster) muda de direção
Parametros:
- cid = creatureid do player ou monstro que mudará de direção
- old = direção antiga
- current = direção atual, após ter mudado, vide tabela abaixo:
NORTH = 0EAST = 1 SOUTH = 2 WEST = 3 SOUTHWEST = 4 SOUTHEAST = 5 NORTHWEST = 6 NORTHEAST = 7 atente-se no fato de que não é possível virar pras direções 4,5,6 e 7 mas você utilizá-las num script que cheque a direção entre dois players, daí sim seria possível (como é no caso do exiva)
quando está return false:
- A criatura não será capaz de mudar de direção
Registra creature event:
- Sim
~~~~
reportbug
Quando é executado:
- Quando um player reporta um bug
Parametros:
- cid = creatureid do player que reportou o bug
- comment = comentário que ele adicionou ao reportar
quando está return false:
- O report será cancelado e não será enviado. Pode ser usado num script avançado de reports onde se o player não tiver escrito nenhum comentário ou tiver escrito determinadas palavras o envio será cancelado (pra evitar spams)
Registra creature event:
- Sim
~~~~
sendmail
Quando é executado:
- Quando um player manda uma carta/parcel para outro
Parametros:
- cid = creatureid do player que mandou a correspondencia
- receiver = creatureid do player que irá receber essa correspondencia
- item = item que foi enviado (id dele)
- openBox = conteúdo (no caso de parcel)
quando está return false:
- Correspondência não será enviada. É util pra registrar um log de todas as trocas entre players e pegar hackers.
Registra creature event:
- Sim
~~~~
receivemail
Quando é executado:
- Quando um player recebe uma carta/parcel de outro
Parametros:
- cid = creatureid do player que recebou a correspondência
- sender = creatureid do player que enviou a correspondência
- item = item recebido
- openBox = conteúdo da correspondencia (no caso de ser uma parcel)
quando está return false:
- Ele não receberá a correspondência.
Registra creature event:
- Sim
~~~~
traderequest
Quando é executado:
- Quando um player dá trade
Parametros:
- cid = creatureid do player que deu o trade
- target = creatureid do player que ele tentou iniciar uma troca
- item = item que foi iniciada a troca (se for uma backpack cheia de coisas dentro esse item será uma table com todos os itens)
quando está return false:
- A troca não será executada. É útil para scripts de itens vip onde o player não possa trocar determinados itens
Registra creature event:
- Sim
~~~~
tradeaccept
Quando é executado:
- Quando um player aceita a troca com outro)
Parametros:
- cid = creatureid do player que aceitou a troca (você)
- target = creatureid do player que aceitou a troca (cara com quem você trocou)
- item = items que você deu em troca, no caso de uma backpack cheia de itens esse parametro será uma table com todos os itens
- targetItem = items que você recebeu em troca, no caso de uma backpack cheia de itens esse parametro será uma table com todos os itens
quando está return false:
- a troca não será concluída.
Registra creature event:
- Sim
~~~~
joinchannel
Quando é executado:
- Quando um player entra num channel (aqueles canais tipo trade/ help chat/ info/ guild/ etc...)
Parametros:
- cid = creatureid do player que entrou no chat
- channel = canal que o player entrou.. vide lista abaixo:
CHANNEL_GUILD = 0 CHANNEL_PARTY = 1 CHANNEL_RVR = 3 CHANNEL_HELP = 9 CHANNEL_DEFAULT = 0xFFFE CHANNEL_PRIVATE = 0xFFFF - users = outros usuários do canal.
quando está return false:
- O player não conseguirá entrar no channel
Registra creature event:
- Sim
OBS: a mesma coisa vale pra função leavechannel, só que o return false o player não conseguirá sair do channel.
Espero que isso ajude bastante gente, eu não expliquei os types da versão 1.0 porque é basicamente a mesma coisa e pelos parametros dá pra você ter uma ideia doque é oque. :]
-
gacjogos deu reputação a Vodkart em [NPC] Montarias de AluguelVersão testada: 9.1
Descrição: É um npc simples que tem como função alugar determinadas montarias por certo tempo, dias para ser exato.
Em Mods:
AluguelMount.xml
<?xml version="1.0" encoding="UTF-8"?> <mod name="Aluguel Mounts" version="1.0" author="Vodkart" contact="tibiaking.com" enabled="yes"> <config name="aluguel_func"><![CDATA[ Aluguel_mounts = { ["war horse"] = {price = 10000, days = 2, mountid = 17, level = 10, premium = false, storage = 500561}, ["fire war horse"] = {price = 30000, days = 1, mountid = 23, level = 20, premium = false, storage = 500562}, ["sandstone scorpion"] = {price = 50000, days = 1, mountid = 21, level = 30, premium = true, storage = 500563} } function doRemovePlayerMount(cid, mountId) doPlayerRemoveMount(cid, mountId) return doCreatureChangeOutfit(cid,{lookType = getCreatureOutfit(cid).lookType, lookHead = getCreatureOutfit(cid).lookHead, lookBody = getCreatureOutfit(cid).lookBody, lookLegs = getCreatureOutfit(cid).lookLegs, lookFeet = getCreatureOutfit(cid).lookFeet, lookAddons = getCreatureOutfit(cid).lookAddons}) end function CheckRentMount(cid) for var, ret in pairs(Aluguel_mounts) do if canPlayerRideMount(cid, ret.mountid) and getPlayerStorageValue(cid, ret.storage) ~= -1 and getPlayerStorageValue(cid, ret.storage) <= os.time() then doRemovePlayerMount(cid, ret.mountid) doPlayerSendTextMessage(cid,18,"O tempo da sua montaria "..var.." acabou, para adquirir ela novamente volte ao npc.") end end end ]]></config> <globalevent name="CheckMount" interval="60000" event="script"><![CDATA[ domodlib('aluguel_func') function onThink(interval, lastExecution) local on = getPlayersOnline() if #on > 0 then for i = 1, #on do CheckRentMount(on[i]) end end return true end]]></globalevent> </mod> obs: Checar duas coisas em mods, primeira: Se a função que checa se tem a mount é 'canPlayerRideMount' ou 'getPlayerMount', caso for 'getPlayerMount' trocar: canPlayerRideMount(cid, ret.mountid) por: getPlayerMount(cid, ret.mountid) segunda: o intervalo de tempo na tag do globalevents, no meu server era em mile segundos: interval="60000" -- caso o seu não seja em mile segundos troque 60000 por 60. Data/Npc Peach.xml <?xml version="1.0"?> <npc name="Peach" script="data/npc/scripts/aluguelmounts.lua" walkinterval="50000" floorchange="0"> <health now="1000" max="1000"/> <look type="130" head="0" body="114" legs="114" feet="0" addons="0"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|. You want to {rent} a {mount}?"/> </parameters> </npc> Data/Npc/Script aluguelmounts.lua domodlib('aluguel_func') local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid local msg = string.lower(msg) if isInArray({'aluguel','alugar', 'rent', 'mounts', 'mount'}, msg) then npcHandler:say("Você pode comprar {war horse}, {fire war horse} e {sandstone scorpion}!", cid) talkState[talkUser] = 1 elseif talkState[talkUser] == 1 then if Aluguel_mounts[msg] then if Aluguel_mounts[msg].premium == true and not isPremium(cid) then npcHandler:say('Você precisa ser premium para alugar essa montaria.', cid) return true elseif getPlayerLevel(cid) < Aluguel_mounts[msg].level then npcHandler:say('você precisa ter level ' .. Aluguel_mounts[msg].level .. ' ou mais para alugar essa montaria.', cid) return true elseif getPlayerStorageValue(cid, Aluguel_mounts[msg].storage) >= os.time() then npcHandler:say('você já alugou essa montaria!', cid) return true end name,price,stor,days,mountid = msg,Aluguel_mounts[msg].price,Aluguel_mounts[msg].storage,Aluguel_mounts[msg].days,Aluguel_mounts[msg].mountid npcHandler:say('Você quer alugar a montaria '..name..' por '..days..' dia'..(days > 1 and 's' or '')..' no preço de '..price..' gps? {yes}', cid) talkState[talkUser] = 2 else npcHandler:say('Desculpe, eu não vendo essa montaria.', cid) end elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 2) then if doPlayerRemoveMoney(cid, price) then doPlayerAddMount(cid, mountid) setPlayerStorageValue(cid, stor, os.time()+days*86400) npcHandler:say('Aqui está sua montaria '..name..', ela irá durar até '..os.date("%d %B %Y %X", getPlayerStorageValue(cid,stor))..'.', cid) else npcHandler:say('você não tem dinheiro suficiente para alugar a montaria!', cid) talkState[talkUser] = 0 end elseif msg == "no" then selfSay("Then not", cid) talkState[talkUser] = 0 npcHandler:releaseFocus(cid) end return TRUE end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
Configuração:
Em mods tem uma tabela chamada 'Aluguel_mounts'
-
gacjogos deu reputação a Noob II em (Resolvido)script de livroCrie um arquivo chamado Livro.lua na pasta data/actions/scripts e coloca isso:
function onUse(cid, item, frompos, item2, topos) doPlayerPopupFYI(cid, 'Coloque aqui\nOs Horarios.') return TRUE end
no actions.xml adicione essa tag com o ID do livro:
<action itemid="1950" event="script" value="Livro.lua"/>
Use \n para pular uma linha
-
gacjogos deu reputação a Yurilols2 em (Resolvido)OTX Server compilandoProvavelmente tem algum MOD dando erro, vai na sua pasta mods e abre arquivo por arquivo vê os que estão -- enabled="yes"> -- e troca por enabled="no">.
ai vc vai ver qual vai estar dando erro.
-
gacjogos deu reputação a Natanael Beckman em DEV C++ Compilando TFS no WindowsDEV C++, aprenda a compila uma source TFS!
Downloads(Baixe de acordo as configurações do seu windows):
DEV C++ CONFIGURADO PARA 32BITS
DEV C++ CONFIGURADO PARA 64BITS
REV 3884 TFS 0.4
Certo, feitos os downloads, extrai DEV C++ no Disco C e REV 3884 em Documentos.
======================================
Abra o DEV C++:
======================================
======================================
Abra a Source:
======================================
======================================
Localize a pasta da Source e abra o arquivo TheForgottenServer.dev, Documentos> trunk.r3884> dev-cpp> TheForgottenServer.dev:
======================================
=============================================================
======================================
Aguarde carregar todos os arquivos:
======================================
======================================
Vamos adicionar o parâmetro -D__CONSOLE__ no teclado digita ALT + P, clique em parameters e adicione o parâmetro... Feito? clique em OK:
======================================
======================================
Vamos compilar Source, no teclado digite CTRL+F9 e aguarde finalizar o processo:
======================================
======================================
Se der tudo certo em Log vai estar como mostra a imagem abaixo:
======================================
======================================
Verifique na pasta Documentos> trunk.r3884> dev-cpp você vai encontrar o arquivo TheForgottenServer.exe e pronto meu parabéns você compilou!
======================================
===========================================
Só isso galera tutorial rápido resumido e útil!
Créditos Natanael Beckman!
===========================================
Caso você adquira uma source com apenas os arquivos .cpp e .h e não sabe como compilar o projeto, abaixo vamos explicar:
Na pasta onde está localizado os arquivos .cpp e .h crie uma pasta chamada dev-cpp, e dentro dela adicione uma imagem icone.
Abra o DEV-C++, clique em File> New> Project:
Logo em seguida selecione Empty Project, em name terá o nome Project1 altere utilize o nome quer quiser, após isso clique em OK e em seguida selecione a pasta dev-cpp que criamos:
Agora selecione a opção Win32GUI caso use source OTX ou TFS selecione Win32Console ao lado << Browse selecione a imagem do icone que está na pasta Dev-Cpp.
No mesmo menu na aba Parameters em C++ compiler adicione os seguintes parâmetros:
-D__ENABLE_SERVER_DIAGNOSTIC__ -D__ROOT_PERMISSION__ -D__GROUND_CACHE__ -D__USE_SQLITE__ -D__USE_MYSQL__ -D__CONSOLE__ -D__WAR_SYSTEM__ E em Linker adicione as seguintes libs:
-lboost_filesystem -lboost_thread -lboost_system -lboost_regex -lsqlite3 -lwsock32 -llua5.1 -lws2_32 -leay32 -lmysql -lxml2 -lgmp -lz -s No mesmo Menu na aba Build Option escreva na segunda coluna horizontal escreva Obj e dê OK. Na lateral terá o nome do seu projeto o meu no caso é The Forgotten Server, clique com o botão direito do mouse em cima do nome e clique na opção Add Project: Selecione na pasta da sua source todos os arquivos .cpp e .h após isso salva o projeto e já pode compilar CTRL+F9: OpenSSL 0.9.8 1º baixe http://devpaks.org/details.php?devpak=73 2° abra Dev-Cpp > Tools > Packager Manager > Install > Seleciona o arquivo baixado e instala, fecha abre e testa!
Clica aqui \/ -
gacjogos deu reputação a Cat em Resolvendo problema de logar com mountFala galera, um membro estava com um bug no servidor, que o player morria e logava montado. O problema não tinha sido resolvido mas logo após de mover o tópico o membro me enviou uma mensagem então postarei como resolver para vocês.
Créditos: Jamison
Vá em DATA/Creaturescripts/scripts/Crie um arquivo.xml ou copie outro e renomeie para unmount, adicione:
function onLogin(cid) doPlayerSetMounted(cid, mounting, 1) return true end Em DATA/Creaturescripts/Scripts/Login.lua adicione
registerCreatureEvent(cid, "unmount") Em DATA/Creaturescripts/Creaturescripts.xml Adicione:
<event type="login" name="unmount" event="script" value="unmount.lua"/> Abra DATA/XML/Mounts.xml e logo no início adicione:
<mount id="0" clientId="0" name="Unmount" premium="no" /> É isso galera, quem tiver algum problema é só falar que pode dar erro em alguns servidores. Até a próxima.
-
gacjogos deu reputação a Alienbear em (Resolvido)[Error] Doorskeys = {2086, 2087, 2088, 2089, 2090, 2091, 2092, 10032, 10091} closingDoors = {1224, 1226, 1228, 1230, 1242, 1244, 1246, 1248, 1256, 1258, 1260, 1262, 3541, 3543, 3550, 3552, 5104, 5106, 5113, 5115, 5122, 5124, 5131, 5133, 5289, 5291, 5293, 5295, 6203, 6205, 6207, 6209, 6260, 6262, 6264, 6266, 6897, 6899, 6906, 6908, 7039, 7041, 7048, 7050, 8552, 8554, 8556, 8558, 9176, 9178, 9180, 9182, 9278, 9280, 9282, 9284, 10279, 10281, 10283, 10285, 10474, 10476, 10483, 10485, 10780, 10782, 10789, 10791} verticalOpenDoors = {1211, 1220, 1224, 1228, 1233, 1238, 1242, 1246, 1251, 1256, 1260, 1540, 3546, 3548, 3550, 3552, 4915, 5083, 5109, 5111, 5113, 5115, 5127, 5129, 5131, 5133, 5142, 5145, 5283, 5285, 5289, 5293, 5516, 5737, 5749, 6194, 6199, 6203, 6207, 6251, 6256, 6260, 6264, 6798, 6802, 6902, 6904, 6906, 6908, 7044, 7046, 7048, 7050, 7055, 8543, 8548, 8552, 8556, 9167, 9172, 9269, 9274, 9278, 9282, 10270, 10275, 10279, 10283, 10479, 10481, 10483, 10485, 10789, 10791} horizontalOpenDoors = {1214, 1222, 1226, 1230, 1236, 1240, 1244, 1248, 1254, 1258, 1262, 1542, 3537, 3539, 3541, 3543, 4918, 5085, 5100, 5102, 5104, 5106, 5118, 5120, 5122, 5124, 5136, 5139, 5280, 5287, 5291, 5295, 5518, 5734, 5746, 6197, 6201, 6205, 6209, 6254, 6258, 6262, 6266, 6796, 6800, 6893, 6895, 6897, 6899, 7035, 7037, 7039, 7041, 7057, 8546, 8550, 8554, 8558, 9170, 9174, 9272, 9276, 9280, 9284, 10273, 10277, 10281, 10285, 10470, 10472, 10474, 10476, 10780, 10782} doors = {[1209] = 1211, [1210] = 1211, [1212] = 1214, [1213] = 1214, [1219] = 1220, [1221] = 1222, [1231] = 1233, [1232] = 1233, [1234] = 1236, [1235] = 1236, [1237] = 1238, [1239] = 1240, [1249] = 1251, [1250] = 1251, [1252] = 1254, [1253] = 1254, [1539] = 1540, [1541] = 1542, [3535] = 3537, [3536] = 3537, [3538] = 3539, [3544] = 3546, [3545] = 3546, [3547] = 3548, [4913] = 4915, [4914] = 4915, [4916] = 4918, [4917] = 4918, [5082] = 5083, [5084] = 5085, [5098] = 5100, [5099] = 5100, [5101] = 5102, [5107] = 5109, [5108] = 5109, [5110] = 5111, [5116] = 5118, [5117] = 5118, [5119] = 5120, [5125] = 5127, [5126] = 5127, [5128] = 5129, [5134] = 5136, [5135] = 5136, [5137] = 5139, [5138] = 5139, [5140] = 5142, [5141] = 5142, [5143] = 5145, [5144] = 5145, [5278] = 5280, [5279] = 5280, [5281] = 5283, [5282] = 5283, [5284] = 5285, [5286] = 5287, [5515] = 5516, [5517] = 5518, [5732] = 5734, [5733] = 5734, [5735] = 5737, [5736] = 5737, [6192] = 6194, [6193] = 6194, [6195] = 6197, [6196] = 6197, [6198] = 6199, [6200] = 6201, [6249] = 6251, [6250] = 6251, [6252] = 6254, [6253] = 6254, [6255] = 6256, [6257] = 6258, [6795] = 6796, [6797] = 6798, [6799] = 6800, [6801] = 6802, [6891] = 6893, [6892] = 6893, [6894] = 6895, [6900] = 6902, [6901] = 6902, [6903] = 6904, [7033] = 7035, [7034] = 7035, [7036] = 7037, [7042] = 7044, [7043] = 7044, [7045] = 7046, [7054] = 7055, [7056] = 7057, [8541] = 8543, [8542] = 8543, [8544] = 8546, [8545] = 8546, [8547] = 8548, [8549] = 8550, [9165] = 9167, [9166] = 9167, [9168] = 9170, [9169] = 9170, [9171] = 9172, [9173] = 9174, [9267] = 9269, [9268] = 9269, [9270] = 9272, [9271] = 9272, [9273] = 9274, [9275] = 9276, [10276] = 10277, [10274] = 10275, [10268] = 10270, [10269] = 10270, [10271] = 10273, [10272] = 10273, [10471] = 10472, [10480] = 10481, [10477] = 10479, [10478] = 10479, [10468] = 10470, [10469] = 10470, [10774] = 10776, [10775] = 10776, [10779] = 10780, [10781] = 10782, [10783] = 10785, [10784] = 10785, [10788] = 10789, [10790] = 10791} specialDoors = {1223, 1225, 1241, 1243, 1255, 1257, 3542, 3551, 5105, 5114, 5123, 5132, 5288, 5290, 5745, 5748, 6202, 6204, 6259, 6261, 6898, 6907, 7040, 7049, 8551, 8553, 9175, 9177, 9277, 9279, 10278, 10280, 10475, 10484, 10781, 10790} tenta adicionar isso em 000-constant
-
gacjogos deu reputação a Alienbear em (Resolvido)[Error] Doorslocal function checkStackpos(item, position) position.stackpos = STACKPOS_TOP_MOVEABLE_ITEM_OR_CREATURE local thing = getThingFromPos(position) position.stackpos = STACKPOS_TOP_FIELD local field = getThingFromPos(position) return (item.uid == thing.uid or thing.itemid < 100 or field.itemid == 0) end function onUse(cid, item, fromPosition, itemEx, toPosition) if(getItemLevelDoor(item.itemid) > 0) then if(item.actionid == 189) then if(isPremium(cid) ~= TRUE) then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Only the worthy may pass.") return TRUE end doTransformItem(item.uid, item.itemid + 1) doTeleportThing(cid, toPosition, TRUE) return TRUE end local gender = item.actionid - 186 if(isInArray({PLAYERSEX_FEMALE, PLAYERSEX_MALE, PLAYERSEX_GAMEMASTER}, gender) == TRUE) then local playerGender = getPlayerSex(cid) if(playerGender ~= gender) then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Only the worthy may pass.") return TRUE end doTransformItem(item.uid, item.itemid + 1) doTeleportThing(cid, toPosition, TRUE) return TRUE end local skull = item.actionid - 180 if(skull >= 0 and skull < 6) then local playerSkull = getCreatureSkullType(cid) if(playerSkull ~= skull) then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Only the worthy may pass.") return TRUE end doTransformItem(item.uid, item.itemid + 1) doTeleportThing(cid, toPosition, TRUE) return TRUE end local group = item.actionid - 150 if(group >= 0 and group < 30) then local playerGroup = getPlayerGroupId(cid) if(playerGroup < group) then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Only the worthy may pass.") return TRUE end doTransformItem(item.uid, item.itemid + 1) doTeleportThing(cid, toPosition, TRUE) return TRUE end local vocation = item.actionid - 100 if(vocation >= 0 and vocation < 50) then local playerVocationInfo = getVocationInfo(getPlayerVocation(cid)) if(playerVocationInfo.id ~= vocation and playerVocationInfo.fromVocation ~= vocation) then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Only the worthy may pass.") return TRUE end doTransformItem(item.uid, item.itemid + 1) doTeleportThing(cid, toPosition, TRUE) return TRUE end if(item.actionid == 190 or (item.actionid ~= 0 and getPlayerLevel(cid) >= (item.actionid - getItemLevelDoor(item.itemid)))) then doTransformItem(item.uid, item.itemid + 1) doTeleportThing(cid, toPosition, TRUE) else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Only the worthy may pass.") end return TRUE end if(isInArray(specialDoors, item.itemid) == TRUE) then if(item.actionid == 100 or (item.actionid ~= 0 and getPlayerStorageValue(cid, item.actionid) > 0)) then doTransformItem(item.uid, item.itemid + 1) doTeleportThing(cid, toPosition, TRUE) else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "The door seems to be sealed against unwanted intruders.") end return TRUE end if(isInArray(keys, item.itemid) == TRUE) then if(itemEx.actionid > 0) then if(item.actionid == itemEx.actionid and doors[itemEx.itemid] ~= nil) then doTransformItem(itemEx.uid, doors[itemEx.itemid]) return TRUE end doPlayerSendCancel(cid, "The key does not match.") return TRUE end return FALSE end if(isInArray(horizontalOpenDoors, item.itemid) == TRUE and checkStackpos(item, fromPosition)) then local newPosition = toPosition newPosition.y = newPosition.y + 1 local doorPosition = fromPosition doorPosition.stackpos = STACKPOS_TOP_MOVEABLE_ITEM_OR_CREATURE local doorCreature = getThingfromPos(doorPosition) if(doorCreature.itemid ~= 0) then if(getTileInfo(doorPosition).protection and not getTileInfo(newPosition).protection and doorCreature.uid ~= cid) then doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE) else doTeleportThing(doorCreature.uid, newPosition, TRUE) if(isInArray(closingDoors, item.itemid) ~= TRUE) then doTransformItem(item.uid, item.itemid - 1) end end return TRUE end doTransformItem(item.uid, item.itemid - 1) return TRUE end if(isInArray(verticalOpenDoors, item.itemid) == TRUE and checkStackpos(item, fromPosition)) then local newPosition = toPosition newPosition.x = newPosition.x + 1 local doorPosition = fromPosition doorPosition.stackpos = STACKPOS_TOP_MOVEABLE_ITEM_OR_CREATURE local doorCreature = getThingfromPos(doorPosition) if(doorCreature.itemid ~= 0) then if(getTileInfo(doorPosition).protection and not getTileInfo(newPosition).protection and doorCreature.uid ~= cid) then doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE) else doTeleportThing(doorCreature.uid, newPosition, TRUE) if(isInArray(closingDoors, item.itemid) ~= TRUE) then doTransformItem(item.uid, item.itemid - 1) end end return TRUE end doTransformItem(item.uid, item.itemid - 1) return TRUE end if(doors[item.itemid] ~= nil and checkStackpos(item, fromPosition)) then if(item.actionid == 0) then doTransformItem(item.uid, doors[item.itemid]) else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.") end return TRUE end return FALSE end
-
gacjogos deu reputação a luanluciano93 em [TFS 1.2] Bless free for low level - Bless de graça para level baixo@Larissa Azhaurn, dá para simplificar o script:
-- Free bless local freeBless = { level = 50, blessTotal = 5, } if player:getLevel() <= freeBless.level then for i = 1, freeBless.blessTotal do doPlayerAddBlessing(player, i) end end @chateadoagr, é só editar nesta linha, sendo que se o player level menor ou igual ao level indicado ele recebe o free_bless:
level = 50, -
gacjogos deu reputação a Cat em Problema com "You may not attack immediately after logging in"usa assim, se continuar avisa