Ir para conteúdo

gacjogos

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Curtir
    gacjogos deu reputação a Bruno Carvalho em [TalkAction] Rank System   
    Versã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
  2. Curtir
    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+
  3. Curtir
    gacjogos deu reputação a Vodkart em Comando !frags error   
    troca essa parte:   doPlayerPopupFYI(cid, result)   por essa:   doShowTextDialog(cid, 2160, result)
  4. Curtir
    gacjogos deu reputação a Vodkart em [Talkaction] Comando !guild   
    O 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"/>
  5. Obrigado
    gacjogos deu reputação a xWhiteWolf em Callbacks de creaturescripts   
    Fala 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. :]
  6. Gostei
    gacjogos deu reputação a Vodkart em [NPC] Montarias de Aluguel   
    Versã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'


  7. Gostei
    gacjogos deu reputação a Noob II em (Resolvido)script de livro   
    Crie 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 
  8. Gostei
    gacjogos deu reputação a Yurilols2 em (Resolvido)OTX Server compilando   
    Provavelmente 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.
  9. Gostei
    gacjogos deu reputação a Natanael Beckman em DEV C++ Compilando TFS no Windows   
    DEV 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 \/
  10. Gostei
    gacjogos deu reputação a Cat em Resolvendo problema de logar com mount   
    Fala 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.
  11. Gostei
    gacjogos deu reputação a Alienbear em (Resolvido)[Error] Doors   
    keys = {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
  12. Gostei
    gacjogos deu reputação a Alienbear em (Resolvido)[Error] Doors   
    local 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
  13. Gostei
    @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,
  14. Gostei
    gacjogos deu reputação a Cat em Problema com "You may not attack immediately after logging in"   
    usa assim, se continuar avisa
     



Informação Importante

Confirmação de Termo