Ir para conteúdo

Gantz

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Gostei
    Gantz recebeu reputação de Ghaz em (Resolvido)[Pedido] Exiva Normal & Exiva Aguçado   
    testa ae amigo:
    bool InstantSpell::SearchPlayer(const InstantSpell* spell, Creature* creature, const std::string& param) { Player* player = creature->getPlayer(); if(!player || player->isRemoved()) return false; Player* targetPlayer = NULL; ReturnValue ret = g_game.getPlayerByNameWildcard(param, targetPlayer); if(ret != RET_NOERROR || !targetPlayer || targetPlayer->isRemoved()) { player->sendCancelMessage(ret); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(targetPlayer->hasCustomFlag(PlayerCustomFlag_NotSearchable) && !player->hasCustomFlag(PlayerCustomFlag_GamemasterPrivileges)) { player->sendCancelMessage(RET_PLAYERWITHTHISNAMEISNOTONLINE); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } std::stringstream ss; const Position& pos = player->getPosition(); const Position& targetPos = targetPlayer->getPosition(); uint32_t distance = std::max(std::abs(pos.x - targetPos.x), std::abs(pos.y - targetPos.y)); if(pos.z != targetPos.z) distance = distance + 9 + 6; ss << targetPlayer->getName() << " " << g_game.getSearchString(player->getPosition(), targetPlayer->getPosition(), true, true) << " [" << distance << " sqm]"; player->sendTextMessage(MSG_INFO_DESCR, ss.str().c_str()); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_WRAPS_BLUE); return true; }
  2. Gostei
    Gantz recebeu reputação de Gaant em (Resolvido)[Ajuda] Velocidade da bike   
    local condition = createConditionObject(CONDITION_HASTE) setConditionParam(condition, CONDITION_PARAM_TICKS, 20000) setConditionFormula(condition, 1.7, -36, 1.7, -36) function onSay(cid, words, param) doRemoveCondition(cid, CONDITION_HASTE) local pos = getThingPos(cid) if(param == '') then doSendMagicEffect(pos, 12) doAddCondition(cid, condition) return true end local t = string.explode(param, '"') if(t[2]) then doCreatureSay(cid, "Correr: ".. t[2], 20, false, 0, pos) doSendMagicEffect(pos, 12) doAddCondition(cid, condition) end return true end
  3. Gostei
    Gantz recebeu reputação de Wlucas em (Resolvido)[Ajuda] Velocidade da bike   
    local condition = createConditionObject(CONDITION_HASTE) setConditionParam(condition, CONDITION_PARAM_TICKS, 20000) setConditionFormula(condition, 1.7, -36, 1.7, -36) function onSay(cid, words, param) doRemoveCondition(cid, CONDITION_HASTE) local pos = getThingPos(cid) if(param == '') then doSendMagicEffect(pos, 12) doAddCondition(cid, condition) return true end local t = string.explode(param, '"') if(t[2]) then doCreatureSay(cid, "Correr: ".. t[2], 20, false, 0, pos) doSendMagicEffect(pos, 12) doAddCondition(cid, condition) end return true end
  4. Gostei
    Gantz recebeu reputação de Reds em [ATS] Spirit Hunter   
    Eae pessoal do Tibiaking, venho hoje através deste tópico apresentar meu projeto para vocês, em torno de 2 anos atrás, na epoca do tibiaking em que eu usava o nick xotservx, eu tinha iniciado um projeto, o projeto se chamava Spirit Hunter, e tinha como foco a idéia de que você poderia jogar um servidor baseado em pokemon, porém, com os monstros do tibia, eu acabei abandonando o projeto, e estou retornando nele agora do zero, pois não havia salvo nada. No Spirit Hunter os monstros depois de mortos podem ter seu espirito selado em uma pedra de captura. Após este selamento ele pode ser invocado quando quiser para auxiliar em sua jornada, capturando outros monstros, encontrando as relíquias perdidas, e se tornando um mestre dos espiritos. Segue abaixo mais algumas informações do projeto:     Sources Versão: The Forgotten Server 1.0 Protocolo: 10.41     Interface     1. Rod - Vara para pescar monstros aquáticos. 2. Rope - Corda e Pá. 3. Bag - Bolsa para guardar itens. 4. Book - Livro que contém informações sobre os montros. 5. Order - Usado para ordenar o espirito. (Andar, montar, ...) 6. Relics - Reliquias já encontradas (Sistema de quests.) 7. Anel - Anéis que podem ser usado para suporte a você ou ao espirito. 8. Potrait - Imagem do monstros que contém na pedra. 9. Potions - Slot reservado para os potions. 10. Espirito - Pedra que contém algum espirito.     Lista de Monstros Para ver os monstros selecionados e suas respectivas evoluções: Clique Aqui     Monstros já configurados (Portrait, Spells, Evolutions, Loots)   Todos monstros já configurados.   Lista de vantagens de tipo Clique Aqui   Progresso   Go/Back (script) - 100% Catch (script) - 100% Moves (script and source) - 100% Passive/Agressive (source) - 100% Portrait (script) - 100% Evolve (script) - 100% Npc Heal (script, modalwindow and source) - 100% Order (script and source) - 100% Mount (script and source) - 100% Book (script and modalwindow) - 100% Gender (source) - 100% Vantagens e Desvantagens (source and script) - 100% Npc Buy Monsters (script and modalwindow) - 100% Cut (script) - 100% Rock Smash (script) - 100% Dig (script) - 100%   Monstros já configurados (gif demonstração go/back)   (algumas stones de evolução)   (vídeo demonstração sistema de montaria)     (imagens demonstração sistema de book)   (gender system)   (imagens demonstração sistema de vender monstros)     Vagas 1 Spriter 1 Designer 1 Mapper   * Caso tenha interesse em alguma vaga, pode responder este tópico.
  5. Gostei
    Gantz recebeu reputação de Fakeownerz em (Resolvido)[Duvida] Script de recompensa pro server   
    function onSay(cid, words, param, channel) local t = string.explode(param, ",") local gm = getCreatureName(cid) local ips = {} for _, pid in ipairs(getPlayersOnline()) do if not isInArray(ips, getPlayerIp(pid)) then local accId = getPlayerAccount(pid) if(getNotationsCount(accId) < 1) then doPlayerAddItem(pid, t[1], 1) doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "Everyone have been rewarded a "..getItemNameById(t[1]).." by "..gm.." for the reason: "..tostring(t[2])..".") doSendMagicEffect(getCreaturePosition(pid), CONST_ME_GIFT_WRAPS) table.insert(ips, getPlayerIp(pid)) end end end return true end
  6. Gostei
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_EFFECT, 31) setCombatParam(combat, COMBAT_PARAM_USECHARGES, 1) function onGetPlayerMinMaxValues(cid, skill, attack, factor) local min = skill * attack / 17 + getPlayerLevel(cid) / 5 + 1 local max = skill * attack / 9 + getPlayerLevel(cid) / 5 + 6 return -min, -max end setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetPlayerMinMaxValues") function onCastSpell(cid, var) if getCreatureHealth(cid) > (0.3 * getCreatureMaxHealth(cid)) then doCombat(cid, combat, var) doCreatureAddHealth(cid, -(0.3 * getCreatureMaxHealth(cid))) else doPlayerSendCancel(cid, "Not enough health to perform this spell.") end return true end
  7. Gostei
    Gantz recebeu reputação de Loldinis em (Resolvido)[DUVIDA] Como fazer spell que gasta % de vida ao invés de mana   
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_EFFECT, 31) setCombatParam(combat, COMBAT_PARAM_USECHARGES, 1) function onGetPlayerMinMaxValues(cid, skill, attack, factor) local min = skill * attack / 17 + getPlayerLevel(cid) / 5 + 1 local max = skill * attack / 9 + getPlayerLevel(cid) / 5 + 6 return -min, -max end setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetPlayerMinMaxValues") function onCastSpell(cid, var) if getCreatureHealth(cid) > (0.3 * getCreatureMaxHealth(cid)) then doCombat(cid, combat, var) doCreatureAddHealth(cid, -(0.3 * getCreatureMaxHealth(cid))) else doPlayerSendCancel(cid, "Not enough health to perform this spell.") end return true end
  8. Gostei
    Gantz recebeu reputação de Desnecessario em (Resolvido)Sistema de shiny no tibia normal   
    http://otland.net/threads/creatureevent-onspawn-cid.134039/
  9. Gostei
    Infelizmente não tem como bloquear o ataque por runas, pois a função não retornar com o que o player esta atacando, o q teria como fazer é bloquear o double hit quando o player ataca-se com o tipo DEATHDAMAGE, mais também pararia de funcionar o double caso usasse um "exori mort", ou uma simples wand que ataca com o este tipo.
     
    Enquanto o dano não esta sendo igual é estranho, pois o script pega o mesmo tipo q ele esta sendo atacado para duplicar.
     
    Desculpa encontrei o problema segue abaixo o script com a solução:
     
    Também coloquei no script duas tabelas aonde você pode colocar quais tipos de ataque e quais vocações NÃO vão fazer parte do sistema, lembrando oq vc por la NÃO fara parte do script, as demais vocações e tipos de ataque funcionara normal
    local config = { itemid = 2142, -- id do item slot = CONST_SLOT_HEAD, -- slot q precisa estar equipado chance = 10, -- chance de acontecer effect = 11, -- efeito ao acontecer message = "DOUBLE", -- e mensagem color = 120, -- cor da mensagem seconds = 1000, -- após quanto tempo acontecera o double hit ignoredElements = {COMBAT_DEATHDAMAGE}, -- tipos não aceito ignoredVocations = {}, -- vocações não aceitas } function onCombat(cid, target) registerCreatureEvent(target, "DoubleAttack") return true end function onStatsChange(cid, attacker, type, combat, value) if type == STATSCHANGE_HEALTHLOSS and isPlayer(attacker) then if getPlayerSlotItem(attacker, config.slot) then if getPlayerSlotItem(attacker, config.slot).itemid == config.itemid then if isInArray(config.ignoredElements, combat) or isInArray(config.ignoredVocations, getPlayerVocation(attacker)) then return true end if math.random(100) <= config.chance then addEvent(function() if isCreature(attacker) and isCreature(cid) then doTargetCombatHealth(attacker, cid, combat, -value, -value, config.effect) doSendAnimatedText(getThingPos(cid), config.message, config.color) end end, config.seconds) end end end end return true end no script esta configurado para todas vocações funcionar e somente não funcionar se o ataque for do tipo DEATHDAMAGE.
  10. Gostei
    Infelizmente não tem como bloquear o ataque por runas, pois a função não retornar com o que o player esta atacando, o q teria como fazer é bloquear o double hit quando o player ataca-se com o tipo DEATHDAMAGE, mais também pararia de funcionar o double caso usasse um "exori mort", ou uma simples wand que ataca com o este tipo.
     
    Enquanto o dano não esta sendo igual é estranho, pois o script pega o mesmo tipo q ele esta sendo atacado para duplicar.
     
    Desculpa encontrei o problema segue abaixo o script com a solução:
     
    Também coloquei no script duas tabelas aonde você pode colocar quais tipos de ataque e quais vocações NÃO vão fazer parte do sistema, lembrando oq vc por la NÃO fara parte do script, as demais vocações e tipos de ataque funcionara normal
    local config = { itemid = 2142, -- id do item slot = CONST_SLOT_HEAD, -- slot q precisa estar equipado chance = 10, -- chance de acontecer effect = 11, -- efeito ao acontecer message = "DOUBLE", -- e mensagem color = 120, -- cor da mensagem seconds = 1000, -- após quanto tempo acontecera o double hit ignoredElements = {COMBAT_DEATHDAMAGE}, -- tipos não aceito ignoredVocations = {}, -- vocações não aceitas } function onCombat(cid, target) registerCreatureEvent(target, "DoubleAttack") return true end function onStatsChange(cid, attacker, type, combat, value) if type == STATSCHANGE_HEALTHLOSS and isPlayer(attacker) then if getPlayerSlotItem(attacker, config.slot) then if getPlayerSlotItem(attacker, config.slot).itemid == config.itemid then if isInArray(config.ignoredElements, combat) or isInArray(config.ignoredVocations, getPlayerVocation(attacker)) then return true end if math.random(100) <= config.chance then addEvent(function() if isCreature(attacker) and isCreature(cid) then doTargetCombatHealth(attacker, cid, combat, -value, -value, config.effect) doSendAnimatedText(getThingPos(cid), config.message, config.color) end end, config.seconds) end end end end return true end no script esta configurado para todas vocações funcionar e somente não funcionar se o ataque for do tipo DEATHDAMAGE.
  11. Gostei
    Infelizmente não tem como bloquear o ataque por runas, pois a função não retornar com o que o player esta atacando, o q teria como fazer é bloquear o double hit quando o player ataca-se com o tipo DEATHDAMAGE, mais também pararia de funcionar o double caso usasse um "exori mort", ou uma simples wand que ataca com o este tipo.
     
    Enquanto o dano não esta sendo igual é estranho, pois o script pega o mesmo tipo q ele esta sendo atacado para duplicar.
     
    Desculpa encontrei o problema segue abaixo o script com a solução:
     
    Também coloquei no script duas tabelas aonde você pode colocar quais tipos de ataque e quais vocações NÃO vão fazer parte do sistema, lembrando oq vc por la NÃO fara parte do script, as demais vocações e tipos de ataque funcionara normal
    local config = { itemid = 2142, -- id do item slot = CONST_SLOT_HEAD, -- slot q precisa estar equipado chance = 10, -- chance de acontecer effect = 11, -- efeito ao acontecer message = "DOUBLE", -- e mensagem color = 120, -- cor da mensagem seconds = 1000, -- após quanto tempo acontecera o double hit ignoredElements = {COMBAT_DEATHDAMAGE}, -- tipos não aceito ignoredVocations = {}, -- vocações não aceitas } function onCombat(cid, target) registerCreatureEvent(target, "DoubleAttack") return true end function onStatsChange(cid, attacker, type, combat, value) if type == STATSCHANGE_HEALTHLOSS and isPlayer(attacker) then if getPlayerSlotItem(attacker, config.slot) then if getPlayerSlotItem(attacker, config.slot).itemid == config.itemid then if isInArray(config.ignoredElements, combat) or isInArray(config.ignoredVocations, getPlayerVocation(attacker)) then return true end if math.random(100) <= config.chance then addEvent(function() if isCreature(attacker) and isCreature(cid) then doTargetCombatHealth(attacker, cid, combat, -value, -value, config.effect) doSendAnimatedText(getThingPos(cid), config.message, config.color) end end, config.seconds) end end end end return true end no script esta configurado para todas vocações funcionar e somente não funcionar se o ataque for do tipo DEATHDAMAGE.
  12. Gostei
    tags no creaturescripts.xml:
    <event type="combat" name="DoubleAttackRegister" event="script" value="doubleattack.lua"/> <event type="statschange" name="DoubleAttack" event="script" value="doubleattack.lua"/> crie um arquivo .lua na pasta creaturescripts/scripts com nome de doubleattack.lua e cole o código:
    local config = { itemid = 2142, -- id do item slot = CONST_SLOT_HEAD, -- slot q precisa estar equipado chance = 10, -- chance de acontecer effect = 11, -- efeito ao acontecer message = "DOUBLE", -- e mensagem color = 120, -- cor da mensagem } function onCombat(cid, target) registerCreatureEvent(target, "DoubleAttack") return true end function onStatsChange(cid, attacker, type, combat, value) if type == STATSCHANGE_HEALTHLOSS and isPlayer(attacker) then if getPlayerSlotItem(attacker, config.slot) then if getPlayerSlotItem(attacker, config.slot).itemid == config.itemid then if math.random(100) <= config.chance then addEvent(doTargetCombatHealth, 100, attacker, cid, type, -value, -value, config.effect) addEvent(doSendAnimatedText, 100, getThingPos(cid), config.message, config.color) end end end end return true end depois abra o arquivo creaturescripts/scripts/login.lua e antes do return true adicione a seguinte linha:
    registerCreatureEvent(cid, "DoubleAttackRegister") as configurações esta no inicio do código
  13. Gostei
    Gantz recebeu reputação de Danves em [TFS 1.0] addCooldown(spellid, time) - getCooldown(spellid)   
    Bom eu criei essas duas funções para usar no meu OT, elas forçam o uso do cooldown do sistema do tibia, você pode usa lo mesmo que não tenha executado nenhuma spell.
     
    por exemplo:
    player:addCooldown(87, 10000) sendo 87 o código da spell, ou seja a imagem que ira aparecer no cooldown, lembrando que estas imagens podem ser editadas no tibia.pic.
     
    E 10000 o tempo do cooldown, lembrando a cada 1000 equivale a 1 segundo.
     
    resultado:

     
    e a função get ele retorna true ou false, para caso o cooldown estiver sendo executado:
    player:getCooldown(87) Vamos la.
     
    em luascript.cpp procure por:
    registerMethod("Player", "getMoney", LuaScriptInterface::luaPlayerGetMoney); registerMethod("Player", "addMoney", LuaScriptInterface::luaPlayerAddMoney); registerMethod("Player", "removeMoney", LuaScriptInterface::luaPlayerRemoveMoney); e logo depois dessas linhas de códigos adicione: 
    registerMethod("Player", "addCooldown", LuaScriptInterface::luaPlayerAddCooldown); registerMethod("Player", "getCooldown", LuaScriptInterface::luaPlayerGetCooldown); ainda em luascript.cpp procure por:
    int32_t LuaScriptInterface::luaPlayerRemoveMoney(lua_State* L) e após a ultima linha desta função adicione:
    int32_t LuaScriptInterface::luaPlayerAddCooldown(lua_State* L) { // player:addCooldown(spellid, cooldown) Player* player = getUserdata<Player>(L, 1); if (player) { uint8_t spellId = getNumber<uint8_t>(L, 2); uint32_t cooldown = getNumber<uint32_t>(L, 3); Condition* condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_SPELLCOOLDOWN, cooldown, 0, false, spellId); player->addCondition(condition); pushBoolean(L, true); } else { lua_pushnil(L); } return 1; } int32_t LuaScriptInterface::luaPlayerGetCooldown(lua_State* L) { // player:getCooldown(spellid) Player* player = getUserdata<Player>(L, 1); if (!player) { lua_pushnil(L); return 1; } uint32_t spellid = getNumber<uint32_t>(L, 2); if (player->hasCondition(CONDITION_SPELLCOOLDOWN, spellid)) { pushBoolean(L, true); } else { pushBoolean(L, false); } return 1; } agora em luascript.h procure por:
    static int32_t luaPlayerGetMoney(lua_State* L); static int32_t luaPlayerAddMoney(lua_State* L); static int32_t luaPlayerRemoveMoney(lua_State* L); e logo após estes código adicione:
    static int32_t luaPlayerAddCooldown(lua_State* L); static int32_t luaPlayerGetCooldown(lua_State* L); depois é só compilar e usar !
  14. Gostei
  15. Gostei
    tags no creaturescripts.xml:
    <event type="combat" name="DoubleAttackRegister" event="script" value="doubleattack.lua"/> <event type="statschange" name="DoubleAttack" event="script" value="doubleattack.lua"/> crie um arquivo .lua na pasta creaturescripts/scripts com nome de doubleattack.lua e cole o código:
    local config = { itemid = 2142, -- id do item slot = CONST_SLOT_HEAD, -- slot q precisa estar equipado chance = 10, -- chance de acontecer effect = 11, -- efeito ao acontecer message = "DOUBLE", -- e mensagem color = 120, -- cor da mensagem } function onCombat(cid, target) registerCreatureEvent(target, "DoubleAttack") return true end function onStatsChange(cid, attacker, type, combat, value) if type == STATSCHANGE_HEALTHLOSS and isPlayer(attacker) then if getPlayerSlotItem(attacker, config.slot) then if getPlayerSlotItem(attacker, config.slot).itemid == config.itemid then if math.random(100) <= config.chance then addEvent(doTargetCombatHealth, 100, attacker, cid, type, -value, -value, config.effect) addEvent(doSendAnimatedText, 100, getThingPos(cid), config.message, config.color) end end end end return true end depois abra o arquivo creaturescripts/scripts/login.lua e antes do return true adicione a seguinte linha:
    registerCreatureEvent(cid, "DoubleAttackRegister") as configurações esta no inicio do código
  16. Gostei
    Gantz recebeu reputação de Eremin em [Weapon] Wand Fail   
    a partir de uma distancia do alvo os tiro da wand pode errar.
     
    Vá até data/weapons/scripts e crie um arquivo chamando waindfail.lua e coloque o seguinte conteúdo:   local config = { damageMin = 100, damageMax = 200, combat = COMBAT_FIREDAMAGE, distanceEffect = 3, impactEffect = 36, range = 3, } function onUseWeapon(cid, var) if getCreatureTarget(cid) then local playerPos, targetPos = getThingPos(cid), getThingPos(getCreatureTarget(cid)) if getDistanceBetween(playerPos, targetPos) >= config.range then targetPos.x = targetPos.x + math.random(-1, 1) targetPos.y = targetPos.y + math.random(-1, 1) end doSendDistanceShoot(playerPos, targetPos, config.distanceEffect) addEvent(doAreaCombatHealth, getDistanceBetween(playerPos, targetPos)*80, cid, config.combat, targetPos, 0, -config.damageMin, -config.damageMax, config.impactEffect) end return true end tag:
    <wand id="id da wand" level="100" mana="30" event="script" value="wandfail.lua"> <vocation id="1"/> <vocation id="2"/> <vocation id="5" showInDescription="0"/> <vocation id="6" showInDescription="0"/> </wand>  
  17. Gostei
    Gantz recebeu reputação de luanluciano93 em [Weapon] Wand Fail   
    a partir de uma distancia do alvo os tiro da wand pode errar.
     
    Vá até data/weapons/scripts e crie um arquivo chamando waindfail.lua e coloque o seguinte conteúdo:   local config = { damageMin = 100, damageMax = 200, combat = COMBAT_FIREDAMAGE, distanceEffect = 3, impactEffect = 36, range = 3, } function onUseWeapon(cid, var) if getCreatureTarget(cid) then local playerPos, targetPos = getThingPos(cid), getThingPos(getCreatureTarget(cid)) if getDistanceBetween(playerPos, targetPos) >= config.range then targetPos.x = targetPos.x + math.random(-1, 1) targetPos.y = targetPos.y + math.random(-1, 1) end doSendDistanceShoot(playerPos, targetPos, config.distanceEffect) addEvent(doAreaCombatHealth, getDistanceBetween(playerPos, targetPos)*80, cid, config.combat, targetPos, 0, -config.damageMin, -config.damageMax, config.impactEffect) end return true end tag:
    <wand id="id da wand" level="100" mana="30" event="script" value="wandfail.lua"> <vocation id="1"/> <vocation id="2"/> <vocation id="5" showInDescription="0"/> <vocation id="6" showInDescription="0"/> </wand>  
  18. Gostei
    fiz uma modificação, funcionara assim agora, ele vai continuar executando normal nas horas q tem no script, porém se tiver mais de uma invasão com o mesmo horario ele escolhe uma aleátória
    local i = { ["12:00"] = {nome = "Invasion of King of Rotworm", pos = {x=4997, y=4996, z=8}, monster = {"1 King of Rotworm"}}, ["12:00"] = {nome = "Shukaku Invasion", pos = {x=1033, y=923, z=7}, monster = {"1 Shukaku"}}, ["14:00"] = {nome = "Kyuubi Invasion", pos = {x=1033, y=923, z=7}, monster = {"1 Kyuubi"}}, } function onThink(interval, lastExecution) local hours = tostring(os.date("%X")):sub(1, 5) local invasions = {} for hour, invasion in pairs(i) do if hour == hours then table.insert(invasions, invasion) end end local tb = #invasions > 0 and invasions[math.random(1, #invasions)] or false if tb then doBroadcastMessage(hours .. "\n" .. tb.nome .. " has just been started.") for _,x in pairs(tb.monster) do for s = 1, tonumber(x:match("%d+")) do doSummonCreature(x:match("%s(.+)"), tb.pos) end end end return true end por exemplo:
    local i = { ["12:00"] = {nome = "Invasion of King of Rotworm", pos = {x=4997, y=4996, z=8}, monster = {"1 King of Rotworm"}}, ["12:00"] = {nome = "Shukaku Invasion", pos = {x=1033, y=923, z=7}, monster = {"1 Shukaku"}}, ["14:00"] = {nome = "Kyuubi Invasion", pos = {x=1033, y=923, z=7}, monster = {"1 Kyuubi"}}, } as invasão q são ao 12h sera aleátório pode vir uma ou a outra, enquanto a das 14h vai executar normal.
  19. Gostei
    Gantz deu reputação a Thayam em [TUTORIAL] Rochas e Pedras - Spriting   
    Fala nação TK!
     
    Faz tempo que não trago nada, estava traduzindo algumas coisas para poder ir trazendo para cá, porém agora estou aqui de novo desta vez para trazer um tutorial bem simples sobre Pedras e Rochas.
    Vale lembrar que este é um tutorial universal, então não estará categoricamente feito para nossos 45 graus, mas a noção que se ganha é ótima, e após isso é simples utilizar os conceitos para nossos requisitos.
     
    Bom, sem mais delongas, vamos lá!:
     
    Rochas e Pedras
     
    Introdução
    Rochas e texturas de pedra são uma das coisas mais difíceis de se desenhar, mas a existência de rochas em jogos são praticamente inevitáveis. Rochas estarão em todo lugar, no passado, no presente, no futuro - mesmo no espaço temos meteoros e asteroides. Tenho notado que um monte de jogos tendem a tomar o caminho mais fácil e simplesmente usar o airbrush para uma textura rochosa, ou desenhar um círculo com um preenchimento em gradiente para uma rocha. Claro, eles são práticos, mas eles não estão nem perto de estarem esteticamente atraente. Mas, com um pouco mais de trabalho, e (espero) que com este tutorial, você vai ser capaz de ter uma melhor capacidade de desenhar pedras e tal, e, finalmente, parar de usar aqueles gradientes horríveis haha.
     
    Relevo (Embossing)
    Bom, o primeiro passo é sabermos olhar como a iluminação afetará nosso relevo e curvas, veja esta imagem:

    Esta primeira imagem mostra como trabalha com iluminação em uma colisão com uma superfície. Na parte superior esquerda é a fonte de luz (Noroeste, assim como no Tibia), e na parte superior direita é a visão do jogador. Podemos ver que os destaques na colisão estão mais próximos da fonte de luz, e a área sombreada, onde a fonte de luz não atinge fica mais próxima de onde os jogadores veem. Isto significa basicamente que se você fosse desenhar isso, a luz seria mais perto do topo da tela e o sombreamento seria mais perto do fundo, que ficaria assim:



    Simples não?
     
    Agora imagine que temos uma cavidade dentro deste terreno:
    A iluminação de uma superfície recortada seria diferente. Seria algo parecido com isto:

    A partir disto, podemos ver que a área realçada é agora mais próximo do jogador, e a área sombra está mais perto da fonte de luz. E, se isso vier a ser tirado, a área sombreada seria mais perto da parte superior da tela, e a área iluminada seria mais perto do fundo. Isso se parece com isso:



     
    Praticamente tudo o que eu fiz para este piso foi inverter a área com sombra e luz, o que o torna mais parecido com um buraco no chão.
     
    Pensando em Rochas
     
    Ok, mas como isso se relaciona com texturas de rochas e pedras? Bem, uma textura rochosa é constituída por milhares de recuos e solavancos sobre uma superfície. É por isso que o airbrush funciona bem com este tipo de textura - com isso você pode colocar aleatoriamente em pontos escuros e claros e fazer a ilusão de minúsculas saliências e reentrâncias.
    Mas por estes recuos e colisões serem tão pequeno, não haverá um monte de contrastes com destaques e áreas sombreadas, esta é razão pela qual o número de cores deve definitivamente ser limitada quando o airbrush é usado. Eu vi as pessoas usarem 5 ou mais cores quando usam o airbrush em um solo rochoso. Este é um grande erro, porque muitas cores e contrastes fazem o ladrilho parecer extremamente brega e falso. Eu tenho uma tendência a usar apenas 2 cores e talvez às vezes três, mas não mais! A textura da rocha simples para mim ficaria assim:
      
    É simples, e ele cumpre seu papel. Além disso, ele se parece muito mais do que usar um monte de diferentes tonalidades.
     
    Rachando a superfície
    Texturas de pedra não são apenas travessões e solavancos, também são compostas de rachaduras. Mas não seria suficiente desenhar somente uma linha preta na textura e assim chamá-la de rachadura certo? Uma vez que uma rachadura é feita sobre uma superfície, as mudanças no efeito de iluminação na superfície também mudam! Desenhar uma linha preta mais parece uma mancha, mas se você adicionar a iluminação ao racho, se parecerá muito mais com uma rachadura.

    Começando com essa textura de pedra original, eu simplesmente desenhei uma linha preta que indica onde eu quero que a rachadura seja.
     

    Em seguida, eu usei uma sombra e a destaquei logo abaixo da linha preta. Eu fiz isso porque, essencialmente, uma rachadura é um longo travessão em uma superfície, desse modo a iluminação iria aparecer embaixo da área sombreada.
     

    Então, usei um tom mais escuro e protegido em uma pequena área acima da linha preta
     

    Por fim, acrescentei algumas máscaras extras de cor nas áreas destacadas e sombreadas para parecer um pouco menos suave e mais rígida. No total, eu só usei 5 cores.
     
    Pisos, tijolos e paralelepípedos
    O método acima é a base de todo o resto do tutorial. Você pode usar o mesmo método para fazer pedras, paredes de tijolos, e qualquer superfície que tenha uma estrutura semelhante.
    Assim, o próximo exemplo será uma parede de tijolos.

    Em vez de começar com a textura de pedra real, eu gosto de traçar exatamente o que o meu padrão será. Como mencionei antes, esta é uma parede de tijolos. E eu também quero ter certeza de que se eu coloque várias paredes de tijolos juntas no meu mapa, pareça coeso e que não fiquem fora do lugar.

     
     

    Em seguida,Escolho a direção que estará a sombra e destaco-a abaixo as linhas escuras e também alguns ao longo do do tijolo.
     

    Em seguida, eu aleatoriamente clareio a área sombreada, acrescentando tons extras de cores, de novo, para tornar essas áreas menos suaves e mais rígida.
     

    Por último, eu faço o mesmo com as superfícies maiores. Claro, você pode pular esta etapa caso você queria seus tijolos de aparência perfeitamente lisa.
    E, como sempre, quando você terminar de desenhar, una os desenhos para ter certeza de que eles se conectem bem, não ficando desproporcional no jogo.

     
    Tijolos são fáceis de fazer. Você pode combiná-los um pouco e fazer as pedras irregulares e torná-las um pouco mais interessantes.







     
    Bem legal né?
     
    Rochas e uma parede de rocha
    Texturas de rochas são grandes e tudo mais, mas são as rochas que são vistas com mais frequência em ambientes naturais no jogo. Por mais que seu jogo seja futurista, e que utilize metal como seu principal material, ainda com certeza veremos rochas espalhadas pelo mundo, então seu mapa não pode ser diferente não é mesmo?.
    Então, o que vamos fazer a seguir é uma rocha:

    Eu começo com a cor principal da rocha. É um meio-tom, por isso vou acrescentar tons mais brilhantes e tons mais escuros à ela. Com isso, eu somente desenhei a rocha de uma forma simples. Ela pode ser de qualquer formato, sendo que os detalhes a farão agradáveis aos nossos olhos.
     

    Eu, então, usei um tom mais escuro e sombreei a parte inferior da pedra. Para essa parte, não darei nenhum conselhos, basta seguir as técnicas básicas de sombreamento.
     

    Agora usei outra tonalidade mais escura e apenas sombreei a parte inferior da rocha. Isto a faz destacar-se e criar um contraste legal ali.
     

    Aqui eu adicionei alguns detalhes no meio da rocha. Veja que não adicionei nenhuma cor de destaque no topo, pois a rocha é curva no topo, então deve ser mais escura.

    E depois de adicionar as cores do seu gosto, você pode deixá-la assim mesmo. Do jeito que está desenhada já faz com que a pedra esteja mais suave, deixando as áreas de sombras mais limpas para dar este efeito de suavidade.
     

    Mas se você quiser fazer a rocha parecer um pouco mais áspera, simplesmente posicione aleatoriamente um tom um pouco mais escuro em sua imagem.
     
    Claro, é uma rocha bem simples, mais com isso teremos uma boa noção de como faze-las e consequentemente como aperfeiçoa-las.
     
    Ok, agora que já sabemos como fazer uma rocha, vamos empilhá-las e formar uma parede de rochas.
    Do jeito que olhamos a parede, as paredes em uma caverna são simplesmente um monte de pedras empilhadas uma sobre a outra, ou mesmo apenas uma grande rocha. Mas, no entanto, se você olhar para algumas das minhas mais recentes cavernas,elas são rochas essencialmente em cima de rochas em cima de mais rochas:

    Para fazer com que minhas paredes pareçam um pouco menos monótonas, eu tenho mais de um peça para a parede. Este em particular são de duas peças. Fazendo paredes das cavernas maiores fará sua caverna parecer mais maciça. Mas é claro que, em termos de um equilíbrio da função e estética, duas peças serão suficientes.

    Então, eu começo com a minha cor de base. E com outra cor que se destaca completamente, eu basicamente tracei onde meus detalhes estarão. Você poderia ter as mesmas rochas empilhadas uma em cima da outra, mas neste exemplo, eu tinha os feito menor em sua parte inferior e fazer uma leve mistura com a parede em sua parte superior. E, mais uma vez, eu apenas os juntei para ver se se encaixam como uma peça de quebra-cabeça.

     

    Eu percebi que a sombra que eu comecei é muito brilhante, e como tenho a intenção de fazer uma caverna escura,obviamente, usarei tons mais escuros. Se você está apontando para o realismo, use tons mais escuros a menos que haja uma boa fonte de iluminação.
    Então, eu irei trabalhar de baixo para cima, dando inicio pelo meu tom mais escuro -o preto -. Eu só tracei minha linha na parte inferior, pois será onde ficará mais escuro. Você não tem que abusar muito, fará com que pareça pegajoso. Você pode ajustá-lo mais tarde, se você sentir que você exagerou. Mas basta colocar o suficiente para que ele se destaque do solo.
    Eu também joguei um pouco de preto na metade superior da peça. Isso faz  parecer que o muro está rachado e desgastado, semelhante ao de rachaduras no chão que eu fiz no início deste artigo.
     

    Usando a próxima sombra, eu continuo trabalhando em refazer o contorno azul que eu tinha feito antes. Aproveito também esta oportunidade para usar a mesma cor para as sombras das rochas na parte inferior da parede.
     

    A próxima sombra acima é basicamente a cor que utilizei como base, então eu eu vou para o próximo tom após ela.
    A partir da metade inferior da parede, eu apenas destaquei as rochas, certificando-se que eu tenho somente uma tonalidade mais escura ao redor e nada mais escura. Não há qualquer técnica real para isso, eu fiz desse jeito sem nem pensar nisso.
    E caso você não tenha notado, eu estou tentando torná-lo mais escuro na parte inferior e ir tornando-se gradualmente mais brilhante no topo. Não há qualquer razão por trás disso, nem faz qualquer sentido lógico. Mas o fato de que na maioria das cavernas em jogos, você pode ver a parede apesar de não ter qualquer fonte de luz, então eu não acho que realmente importa. É apenas para olhares.
    OBS: Se a parede de rochas for do lado externo de cavernas, então devemos nos atentar muito ao posicionamento de cores e sentido da iluminação.
    Então, por causa disso, eu percebi que a metade superior da parede ficou muito escura, então basta eu alterar a cor que eu utilizei de base para uma cor mais brilhante.
     

    E com a sombra que acabei de alterar na metade superior, eu termino de fazer o contorno, me certificando de adicionar o excesso em torno das cores mais escuras para realizar o sombreamento.
     

    E, finalmente, eu vou para a próxima sombra acima (o que seria agora a sombra mais brilhante) e basta destacar a metade de cima das rochas. Mais uma vez, não há realmente qualquer processo de pensamento por trás disso.

    Com essa última sombra adicionada, nossa parede de pedras está terminada. Então agora eu vou juntar mais de uma dela para me certificar de que elas se encaixam perfeitamente, isso é muito importante, pois elas podem não se encaixar, o que vai causar um efeito visual muito feio no jogo. E sem contar a cor rosa, eu utilizei apenas 5 cores e criei uma parede simples, porém bonita.

     
     
    Bom meus amigos do TK, este foi o tutorial, e eu espero que vocês tenham gostado, e que com isso vocês possam estar criando texturas novas, pedras e montanhas para seus opens
     
    Se você realmente leu tudo até aqui, tome cuidado com o sombreamento, como eu falei, não está categoricamente configurado para os 45 graus, não há muitas técnicas aplicadas também, a intenção era algo simples, para clarear a mente.
     
    Com certeza a partir de agora você fará paredes muito melhores do que antes haha!
     
    Até o próximo tutorial galera!
     
    superwalrusland (Tutorial)
    Thayam (Tradução e compartilhamento no fórum)
     
  20. Gostei
    Gantz recebeu reputação de Bruno Minervino em TopLevel Effect   
    amigo, caso alguém upasse o top level mudasse o antigo continuaria com o efeito enquanto não deslogase.
     
    o melhor seria armazenar em uma global storage quem é o top level e verificar sempre q alguém upar se não sera o mais novo top level.
    --[[ Script by Bruno Minervino Caso for postar, colocar os créditos ]] local config = { tempo = 10, --tempo em segundos mensagem = { texto = "[TOP]", --não use mais de 9 caracteres efeito = TEXTCOLOR_LIGHTBLUE --efeito para a função doSendAnimatedText }, efeito = 30, --efeito da função doSendMagicEffect globalst = 5687 -- uma global storage qualquer q esteje vazia } --[[ Não mexa em nada abaixo ]] function onLogin(cid) local query = db.getResult("SELECT `name`, `level` FROM `players` WHERE `group_id` < 2 ORDER BY `level` DESC LIMIT 1") if query:getID() == getPlayerGUIDByName(getCreatureName(cid)) then setGlobalStorageValue(config.globalst, query:getID()) TopEffect(cid) end registerCreatureEvent(cid, "TopEffect") end function onAdvance(cid, skill, oldlevel, newlevel) if skill == 8 then local query = db.getResult("SELECT `name`, `level` FROM `players` WHERE `group_id` < 2 ORDER BY `level` DESC LIMIT 1") if query:getID() == getPlayerGUIDByName(getCreatureName(cid)) then setGlobalStorageValue(config.globalst, query:getID()) TopEffect(cid) end end return true end function TopEffect(cid) if not isPlayer(cid) or getGlobalStorageValue(config.globalst) ~= getPlayerGUIDByName(getCreatureName(cid)) then return true end doSendAnimatedText(getCreaturePosition(cid), config.mensagem.texto, config.mensagem.efeito) doSendMagicEffect(getCreaturePosition(cid), config.efeito) addEvent(TopEffect, config.tempo*1000, cid) end outra coisa funções do tipo onLogin não precisa registrar no login, elas já são executas, porem como eu criei uma advance precisa colocar, mas não precisa editar o login.lua pois ja mandei registrar no proprio onLogin q criou
    <event type="advance" name="TopEffect" event="script" value="topeffect.lua"/>
  21. Gostei
    Gantz deu reputação a Bruno Minervino em TopLevel Effect   
    Fala galera,
     
    Um membro fez um pedido, e achei que deveria compartilhar com vocês, algo simples porém útil. Principalmente em OT's do estilo Baiak.
     
    O que o script faz ?
    Ele simplesmente manda um efeito para o Top Level caso ele estiver online.
     
    Instalação:

    Em data/creaturescripts/creaturescripts.xml adicione:
    <event type="login" name="TopEffect" event="script" value="topeffect.lua"/> <event type="advance" name="CheckTop" event="script" value="topeffect.lua"/> Agora crie um arquivo em data/creaturescripts/scripts com o nome topeffect.lua e adicione:
    --[[ Script by Bruno Minervino para o Tibia King Caso for postar, colocar os créditos ]] local config = { tempo = 10, --tempo em segundos mensagem = { texto = "[TOP]", --não use mais de 9 caracteres efeito = TEXTCOLOR_LIGHTBLUE --efeito para a função doSendAnimatedText }, efeito = 30, --efeito da função doSendMagicEffect globalstr = 5687 -- uma global storage qualquer q esteje vazia } --[[ Não mexa em nada abaixo ]] local topPlayer = getGlobalStorageValue(config.globalstr) > 0 and getGlobalStorageValue(config.globalstr) or 0 function onLogin(cid) local query = db.getResult("SELECT `id`, `name`, `level` FROM `players` WHERE `group_id` < 2 ORDER BY `level` DESC LIMIT 1") if (query:getID() ~= -1) then local pid = query:getDataString("id") local name = query:getDataString("name") if getPlayerName(cid) == name then if topPlayer ~= getPlayerID(cid) then topPlayer = getPlayerID(cid) end setGlobalStorageValue(config.globalstr, pid) TopEffect(cid) end end registerCreatureEvent(cid, "CheckTop") return true end function onAdvance(cid, skill, oldlevel, newlevel) if skill == 8 then local query = db.getResult("SELECT `id`, `name`, `level` FROM `players` WHERE `group_id` < 2 ORDER BY `level` DESC LIMIT 1") if (query:getID() ~= -1) then local level = tonumber(query:getDataString("level")) if level < newlevel and topPlayer ~= getPlayerID(cid) then doBroadcastMessage("O jogador " .. getPlayerName(cid) .. " tornou-se o novo Top Level. Parabens!", 22) topPlayer = getPlayerID(cid) doSaveServer() setGlobalStorageValue(config.globalstr, getPlayerID(cid)) TopEffect(cid) end end end return true end function TopEffect(cid) if not isPlayer(cid) then return true end if topPlayer == getPlayerID(cid) then doSendAnimatedText(getCreaturePosition(cid), config.mensagem.texto, config.mensagem.efeito) doSendMagicEffect(getCreaturePosition(cid), config.efeito) addEvent(TopEffect, config.tempo * 1000, cid) end end function getPlayerNameById(id) local query = db.getResult("SELECT `name` FROM `players` WHERE `id` = " .. db.escapeString(id)) if query:getID() ~= -1 then return query:getDataString("name") end return 0 end function getPlayerIdByName(name) local query = db.getResult("SELECT `id` FROM `players` WHERE `name` = " .. db.escapeString(name)) if query:getID() ~= -1 then return tonumber(query:getDataString("id")) end return 0 end function getPlayerID(cid) return getPlayerIdByName(getPlayerName(cid)) end  
    Espero ajudar!
  22. Gostei
    Gantz recebeu reputação de Weekend em [ATS] Spirit Hunter   
    Eae pessoal do Tibiaking, venho hoje através deste tópico apresentar meu projeto para vocês, em torno de 2 anos atrás, na epoca do tibiaking em que eu usava o nick xotservx, eu tinha iniciado um projeto, o projeto se chamava Spirit Hunter, e tinha como foco a idéia de que você poderia jogar um servidor baseado em pokemon, porém, com os monstros do tibia, eu acabei abandonando o projeto, e estou retornando nele agora do zero, pois não havia salvo nada. No Spirit Hunter os monstros depois de mortos podem ter seu espirito selado em uma pedra de captura. Após este selamento ele pode ser invocado quando quiser para auxiliar em sua jornada, capturando outros monstros, encontrando as relíquias perdidas, e se tornando um mestre dos espiritos. Segue abaixo mais algumas informações do projeto:     Sources Versão: The Forgotten Server 1.0 Protocolo: 10.41     Interface     1. Rod - Vara para pescar monstros aquáticos. 2. Rope - Corda e Pá. 3. Bag - Bolsa para guardar itens. 4. Book - Livro que contém informações sobre os montros. 5. Order - Usado para ordenar o espirito. (Andar, montar, ...) 6. Relics - Reliquias já encontradas (Sistema de quests.) 7. Anel - Anéis que podem ser usado para suporte a você ou ao espirito. 8. Potrait - Imagem do monstros que contém na pedra. 9. Potions - Slot reservado para os potions. 10. Espirito - Pedra que contém algum espirito.     Lista de Monstros Para ver os monstros selecionados e suas respectivas evoluções: Clique Aqui     Monstros já configurados (Portrait, Spells, Evolutions, Loots)   Todos monstros já configurados.   Lista de vantagens de tipo Clique Aqui   Progresso   Go/Back (script) - 100% Catch (script) - 100% Moves (script and source) - 100% Passive/Agressive (source) - 100% Portrait (script) - 100% Evolve (script) - 100% Npc Heal (script, modalwindow and source) - 100% Order (script and source) - 100% Mount (script and source) - 100% Book (script and modalwindow) - 100% Gender (source) - 100% Vantagens e Desvantagens (source and script) - 100% Npc Buy Monsters (script and modalwindow) - 100% Cut (script) - 100% Rock Smash (script) - 100% Dig (script) - 100%   Monstros já configurados (gif demonstração go/back)   (algumas stones de evolução)   (vídeo demonstração sistema de montaria)     (imagens demonstração sistema de book)   (gender system)   (imagens demonstração sistema de vender monstros)     Vagas 1 Spriter 1 Designer 1 Mapper   * Caso tenha interesse em alguma vaga, pode responder este tópico.
  23. Gostei
    Gantz deu reputação a Cat em [ATS] Spirit Hunter   
    Amigão, muito interessante, tanto o projeto quanto o tópico (bem formulado... etc).
    Uma dica: Não faça sprites fora da perspectiva, uma sprite assim, como o efeito dessa imagem:
     

     
    Estraga o servidor. Outra coisa, também sobre esse efeito: Não sei qual é o seu objetivo, mas eu faria o efeito um pouco mais rápido, é uma questão de RPG mesmo. São detalhes que eu observo, estarei acompanhando o desenvolvimento. Boa sorte
  24. Gostei
    Gantz deu reputação a Adriano SwaTT em [ATS] Spirit Hunter   
    Gostei bastante, sou bem crítico quanto à projetos e tals...
    Mas sinceramente, este tem futuro, gostei muito do projeto e das sprites.
     
    Só acho que o efeito do Go Back está fora da perspectiva, mas considerando o trabalho para desenhá-lo e o efeito que dá ao ser executado, ficou muito bom mesmo.
    Caso tenha algum problema e não consiga solucionar (script, design, web, etc), contate-me, pois se souber como fazê-lo, terei o maior prazer em ajudar.
     
    Abraços e boa sorte.
  25. Gostei
    Gantz recebeu reputação de Adriano SwaTT em [ATS] Spirit Hunter   
    Eae pessoal do Tibiaking, venho hoje através deste tópico apresentar meu projeto para vocês, em torno de 2 anos atrás, na epoca do tibiaking em que eu usava o nick xotservx, eu tinha iniciado um projeto, o projeto se chamava Spirit Hunter, e tinha como foco a idéia de que você poderia jogar um servidor baseado em pokemon, porém, com os monstros do tibia, eu acabei abandonando o projeto, e estou retornando nele agora do zero, pois não havia salvo nada. No Spirit Hunter os monstros depois de mortos podem ter seu espirito selado em uma pedra de captura. Após este selamento ele pode ser invocado quando quiser para auxiliar em sua jornada, capturando outros monstros, encontrando as relíquias perdidas, e se tornando um mestre dos espiritos. Segue abaixo mais algumas informações do projeto:     Sources Versão: The Forgotten Server 1.0 Protocolo: 10.41     Interface     1. Rod - Vara para pescar monstros aquáticos. 2. Rope - Corda e Pá. 3. Bag - Bolsa para guardar itens. 4. Book - Livro que contém informações sobre os montros. 5. Order - Usado para ordenar o espirito. (Andar, montar, ...) 6. Relics - Reliquias já encontradas (Sistema de quests.) 7. Anel - Anéis que podem ser usado para suporte a você ou ao espirito. 8. Potrait - Imagem do monstros que contém na pedra. 9. Potions - Slot reservado para os potions. 10. Espirito - Pedra que contém algum espirito.     Lista de Monstros Para ver os monstros selecionados e suas respectivas evoluções: Clique Aqui     Monstros já configurados (Portrait, Spells, Evolutions, Loots)   Todos monstros já configurados.   Lista de vantagens de tipo Clique Aqui   Progresso   Go/Back (script) - 100% Catch (script) - 100% Moves (script and source) - 100% Passive/Agressive (source) - 100% Portrait (script) - 100% Evolve (script) - 100% Npc Heal (script, modalwindow and source) - 100% Order (script and source) - 100% Mount (script and source) - 100% Book (script and modalwindow) - 100% Gender (source) - 100% Vantagens e Desvantagens (source and script) - 100% Npc Buy Monsters (script and modalwindow) - 100% Cut (script) - 100% Rock Smash (script) - 100% Dig (script) - 100%   Monstros já configurados (gif demonstração go/back)   (algumas stones de evolução)   (vídeo demonstração sistema de montaria)     (imagens demonstração sistema de book)   (gender system)   (imagens demonstração sistema de vender monstros)     Vagas 1 Spriter 1 Designer 1 Mapper   * Caso tenha interesse em alguma vaga, pode responder este tópico.

Informação Importante

Confirmação de Termo