Ir para conteúdo

Pesquisar na Comunidade

Mostrando resultados para as tags ''tfs 0.4''.

  • Pesquisar por Tags

    Digite tags separadas por vírgulas
  • Pesquisar por Autor

Tipo de Conteúdo


Fóruns

  • xTibia - Notícias e Suporte
    • Regras
    • Noticias
    • Soluções
    • Projetos Patrocinados
    • Tutoriais para Iniciantes
    • Imprensa
  • OTServ
    • Notícias e Debates
    • OTServlist
    • Downloads
    • Recursos
    • Suporte
    • Pedidos
    • Show-Off
    • Tutoriais
  • OFF-Topic
    • Barzinho do Éks
    • Design
    • Informática

Encontrar resultados em...

Encontrar resultados que contenham...


Data de Criação

  • Início

    FIM


Data de Atualização

  • Início

    FIM


Filtrar pelo número de...

Data de Registro

  • Início

    FIM


Grupo


Sou

  1. Não consigo compilar, alguem compila para min? Abra o map.cpp da source do otclient Procure por: Altere para: Link: Scan:
  2. Gente muita gente tinha dificuldade em extender a tela do cliente do Tibia, então eu resolvi ajudar. Está aqui a distro TFS 0.4 rev 3777, com o OTCLIENT mais atualizado. Não coloquei datapack incluso, vocês podem baixar qualquer datapack 8.60 que vai ser compatível. Podem repostar suas modificações, mas coloquem meu crédito. Conteúdo: Distro, Otclient + SRC de ambos. Download Database MYSQL: https://www.mediafire.com/file/pa9xuav9kz4j2gg/tibia.sql/file Download: (39.88 MB, descompactado fica 106 MB) https://www.mediafire.com/file/6oo987114fvf8x7/TFS_860_com_tela_maior.rar/file Scan: https://www.virustotal.com/gui/file/a283cfbaadf383ad115e7452abd1c505ef4e404872595740cad5ce0f6867fc95/detection Imagens: https://i.postimg.cc/FHwhJp6T/Captura-de-Tela-117.png https://i.postimg.cc/Dzq34TLz/Captura-de-Tela-119.png https://i.postimg.cc/8c3tp7yn/scan.jpg
  3. Salve salve pessoal, no inicio desse ano estava dando uma estudada e mexendo com a TFS 0.4 rev3884, e vi que havia alguns bugs e que não tinha Cast incluso. Com base nisso decidi atualizar e otimizar a source, já que ainda ela é uma das mais utilizadas no mundo de Otserv. Decidi compartilhar esse meu trabalho com vocês! Acredito que possa ser uma das melhores REV atualmente. Conto com o seu feedback, caso haja algum bug, algo que tenha que mudar/optimizar, não exite em avisar aqui no tópico. Toda ajuda será bem vinda xD The Forgotten Server, Tibia Versão: 8.60 O que contém nela? Dentro da pasta contém o config.lua com todas as tag já adicionadas. Não esquecam de executar a Query do Cast na DB: Downloads uint8(Effects até 255) Distro: TheForgottenServer.exe Src + datapack: Source & Data Downloads uint8 sem o CAST incluso Distro: TheForgottenServer.exe Src + datapack: Source & Data ------------------------------------------------------- Downloads uint16(Effects até 65534) Distro: TheForgottenServer.exe Src + datapack: Source & Data É necessário fazer a modificação do Hexadecimal no cliente. Aqui tem um já pronto: Cliente.exe(com mc) ou Cliente.exe(sem mc) (só será necessario se utilizar a src com o uint 16.) Lembrado também que precisa utilizar a lib 000-constant.lua deste datapack. ------------------------------------------------------- Scans: Distro(uint8) & Distro(uint16) Source Cliente Obs: Os virus detectado é um falso positivo, então não se preocupem! A distro foi testada em Windows e em Linux Ubuntu 14.04, em ambos funcionaram muito bem! E para quem se interessa em saber onde se localiza os code do Cast, aqui está uma imagem. Você pode achar procurando por "//CAST" Façam um ótimo aproveito
  4. Olá galera, vocês conhecem as lendas dos Trolls que de baixo de uma ponte? Eles estão sempre na espreita, aguardando alguém para roubar, assassinar, estuprar e comer suas almas (as últimas partes são brincadeira). Me baseando nessa lenda eu fiz esse simples script, é um dos primeiros códigos que consigo desenvolver sozinho(tive ajuda), eu espero que ajude alguém em algum lugar do tempoespaço, é um script ótimo se você assim como eu gosta de pontes e também sempre teve a vontade de incrementar alguns de seus mapas com scripts. 1º. Acesse a pasta raiz do seu servidor, logo após siga o seguinte caminho: data/movements e abra o arquivo movements.xml. O código que você devera adicionar dentro deste arquivo está listado abaixo. <movevent type="StepIn" actionid="DigiteONumeroDeUmaActionAqui" event="script" value="ponte.lua"/> 2º. Dentro de data/movements abra a pasta 'scripts' e crie um arquivo .lua nomeado de 'ponte', dentro deste adicione o seguinte código. function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) local configuration = { monstrosTime = 1*5*1000, -- tempo até a criatura aparecer tempoDeStorage = 1*20*1000, -- em quanto tempo será removido a storage e se tornará possivel as criaturas resurgirem storage = 987459, -- numero da storage monsters = { [1] = {name = "Troll Champion", pos = {x = 1001, y = 1110, z = 9}}, -- Nome, quantidade e posição dos monstros, altere a vontade [2] = {name = "Troll", pos = {x = 1000, y = 1107, z = 9}}, [3] = {name = "Troll", pos = {x = 1007, y = 1109, z = 9}} } } if isPlayer(cid) == true then if getPlayerStorageValue(cid, configuration.storage) < 1 then doCreatureSay(cid, "A ponte não parece segura e quando você dá o primeiro passo ouve um grunhido e nota a presença de um ser estranho.", TALKTYPE_ORANGE_1) -- MSG que você quer exibir addEvent(function() for k, v in pairs(configuration.monsters) do doCreateMonster(v.name, v.pos) end end, configuration.monstrosTime) setPlayerStorageValue(cid, configuration.storage, 1) addEvent(function() setPlayerStorageValue(cid, configuration.storage, 0) end, configuration.tempoDeStorage) end end return true end 3º. Inicie o seu servidor e adicione o número da 'ActionID' que você inseriu em 'movements.xml' a algum piso de sua preferência, no caso eu adicionei no meio da ponte. Seja criativo.
  5. Bom, vou ser o mais direto possível: Estou tentando adicionar um novo slot no servidor, de versão 8.54 e TFS 0.4, mudei nas sources e já as compilei com sucesso, segue abaixo no spoiler as alterações feitas na mesma: items.h #define ITEMS 13000 #define SLOTP_WHEREEVER 0xFFFFFFFF #define SLOTP_HEAD 1 << 0 #define SLOTP_NECKLACE 1 << 1 #define SLOTP_BACKPACK 1 << 2 #define SLOTP_ARMOR 1 << 3 #define SLOTP_RIGHT 1 << 4 #define SLOTP_LEFT 1 << 5 #define SLOTP_LEGS 1 << 6 #define SLOTP_FEET 1 << 7 #define SLOTP_RING 1 << 8 #define SLOTP_AMMO 1 << 9 #define SLOTP_DEPOT 1 << 10 #define SLOTP_TWO_HAND 1 << 11 #define SLOTP_EYE 1 << 15 #define SLOTP_HAND SLOTP_LEFT | SLOTP_RIGHT items.cpp else if(tmpStrValue == "eye") { it.slotPosition |= SLOTP_EYE; it.wieldPosition = SLOT_EYE; } movement.cpp else if(tmpStrValue == "eye") slot = SLOTP_EYE; case SLOT_EYE: slotp = SLOTP_EYE; break; player.cpp if((item->getSlotPosition() & SLOTP_HEAD) || (item->getSlotPosition() & SLOTP_NECKLACE) || (item->getSlotPosition() & SLOTP_BACKPACK) || (item->getSlotPosition() & SLOTP_ARMOR) || (item->getSlotPosition() & SLOTP_LEGS) || (item->getSlotPosition() & SLOTP_FEET) || (item->getSlotPosition() & SLOTP_RING) || (item->getSlotPosition() & SLOTP_EYE)) ret = RET_CANNOTBEDRESSED; case SLOT_EYE: if(item->getSlotPosition() & SLOTP_EYE) ret = RET_NOERROR; break; creature.h enum slots_t { SLOT_PRE_FIRST = 0, SLOT_WHEREEVER = SLOT_PRE_FIRST, SLOT_FIRST = 1, SLOT_HEAD = SLOT_FIRST, SLOT_NECKLACE = 2, SLOT_BACKPACK = 3, SLOT_ARMOR = 4, SLOT_RIGHT = 5, SLOT_LEFT = 6, SLOT_LEGS = 7, SLOT_FEET = 8, SLOT_RING = 9, SLOT_AMMO = 10, SLOT_DEPOT = 11, SLOT_LAST = SLOT_DEPOT, SLOT_HAND = 12, SLOT_EYE = 15, SLOT_TWO_HAND = SLOT_HAND }; enums.h enum ConditionId_t { CONDITIONID_DEFAULT = -1, CONDITIONID_COMBAT = 0, CONDITIONID_HEAD, CONDITIONID_NECKLACE, CONDITIONID_BACKPACK, CONDITIONID_ARMOR, CONDITIONID_RIGHT, CONDITIONID_LEFT, CONDITIONID_LEGS, CONDITIONID_FEET, CONDITIONID_RING, CONDITIONID_EYE, CONDITIONID_AMMO, CONDITIONID_OUTFIT }; Após as sources, o único local em que encontrei nos scripts em lua, foi no 'data/lib/000-constant.lua' e deixei assim: CONST_SLOT_FIRST = 1 CONST_SLOT_HEAD = CONST_SLOT_FIRST CONST_SLOT_NECKLACE = 2 CONST_SLOT_BACKPACK = 3 CONST_SLOT_ARMOR = 4 CONST_SLOT_RIGHT = 5 CONST_SLOT_LEFT = 6 CONST_SLOT_LEGS = 7 CONST_SLOT_FEET = 8 CONST_SLOT_RING = 9 CONST_SLOT_AMMO = 10 CONST_SLOT_EYE = 15 CONST_SLOT_LAST = CONST_SLOT_AMMO Deixei um item no 'data/items/items.xml' com o slotType="eye" que foi criado, e fiz as seguintes alterações no OTClient: modules/game_inventory/inventory.lua InventorySlotStyles = { [InventorySlotHead] = "HeadSlot", [InventorySlotNeck] = "NeckSlot", [InventorySlotBack] = "BackSlot", [InventorySlotBody] = "BodySlot", [InventorySlotRight] = "RightSlot", [InventorySlotLeft] = "LeftSlot", [InventorySlotLeg] = "LegSlot", [InventorySlotFeet] = "FeetSlot", [InventorySlotFinger] = "FingerSlot", [InventorySlotAmmo] = "AmmoSlot", [InventorySlotEye] = "EyeSlot" } modules/game_inventory/inventory.otui EyeSlot < InventoryItem id: slot15 image-source: /images/game/slots/eye &position: {x=65535, y=14, z=0} e MiniWindow id: inventoryWindow !text: tr('Inventory') icon: /images/topbuttons/inventory height: 175 @onClose: modules.game_inventory.onMiniWindowClose() &save: true MiniWindowContents HeadSlot anchors.top: parent.top anchors.horizontalCenter: parent.horizontalCenter margin-top: 3 BodySlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 LegSlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 FeetSlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 NeckSlot anchors.top: slot1.top anchors.right: slot1.left margin-top: 10 margin-right: 5 LeftSlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 FingerSlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 BackSlot anchors.top: slot1.top anchors.left: slot1.right margin-top: 10 margin-left: 5 RightSlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 AmmoSlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 EyeSlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 PurseButton margin-top: 3 anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter modules/gamelib/player.lua InventorySlotOther = 0 InventorySlotHead = 1 InventorySlotNeck = 2 InventorySlotBack = 3 InventorySlotBody = 4 InventorySlotRight = 5 InventorySlotLeft = 6 InventorySlotLeg = 7 InventorySlotFeet = 8 InventorySlotFinger = 9 InventorySlotAmmo = 10 InventorySlotPurse = 11 InventorySlotEye = 15 InventorySlotFirst = 1 InventorySlotLast = 10 Com todas estas alterações, o que foi feito: O slot foi adicionado com sucesso no OTClient, aparecendo sem erros, com imagem e posicionado; O console não encontrou erro ao debugar o items.xml (testei um tipo aleatório, e dá erro o erro padrão das sources, então o tipo "eye" está correto nas sources); Dei /i em um item do tipo "eye" pra ver se o mesmo iria para o slot, mesmo caso não existisse graficamente, ele deveria ficar salvo nos dados do personagem no banco de dados, e isto não ocorreu, logo o problema está entre as sources e o client; Enfim, nas sources o tipo "eye" foi criado, mas ainda não é reconhecido verdadeiramente, espero que alguém possa me ajudar, segue em anexo as sources e todos os arquivos que citei ter editado: help.rar
  6. Tungs

    Pokémon HP

    As Principais funções são: -Level System Diferenciado - Profissões - Poke Balls que serão adicionadas: Poké Ball, Great Ball, Ultra Ball, Master Ball, Saffari Ball,Premier Ball, Net Ball, Cherish Ball, Dive Ball, Lure Ball, Moon Gall, Quick Ball, Love Ball, Golden Ball, Super Ball, Heavy Ball, Love Ball, Dusk Ball, Fast Ball, Treecko's Ball, Torchic's Ball, Pikachu's Ball, Mudkip's Ball - Races: Dark, Steel e Fairy - Addon System (100%) - Kanto, Jotho, Hoeen, Sinnoh (Pokémons) (100%) - Kanto, Jotho, Hoeen, Sinnoh (Mapa) (50%) - Quests juntando Anime e Games (Nintendo & Anime) (15%) - Egg system - Npcs de Animes/Games Legendas: Vermelho e Riscado: Removido Azul: De 30 a 50% Roxo: Menos de 30% Verde: 100% Vídeos: Por favor, caso seja: Mapper, Scripter, Spriter URGENTE Contate-nos FACEBOOK @Bennyyw Patrocina nós <3
  7. galera alguem me ajuda pfv eu to usando o cliente da DarkXpoke porem to tentando colocar o module Shop da Wone PIECE acho que e assim que se fala hehe mais o cliente nao reconhece ajuda ai pfv do rep a vida toda pra quem me ajuda to rancando os cabelos ja ;-;
  8. Bom galera, sou novato no Fórum, e estou iniciando um projeto de Poketibia do 0, consegui compilar com Sucesso o Server TFS 0.4 sem nenhum erro nem warning. \õ/ Porém, segui o tutorial do edubart no Github pra compilar o cliente, utilizando o Visual 2015, e tive vários problemas ao compilar... vou definir melhor, vou colocar o log da compilação abaixo. A compilação acontece com sucesso, porém com várias warnings e nenhum erro, o arquivo otclient.exe é criado, porém não consigo roda-lo! Me ajudem por favor, agradeço !
  9. O título já diz tudo haha... Creio que seja simples, quando utilizado o fire bug na caldeira apagada, ela acende E após 5 minutos a caldeira apaga automaticamente
  10. Bom, creio que o script seja um pouco complexo (ou não) O player utiliza o firebug na fornalha Nisto ela acende, então ele da use na "sanfona" da fornalha e aparece o magic effect de vapor em cima da bigorna, então o item esta pronto para a forja Nos 100 iron ires necessários pra forjar o Huge of Crude iron (matéria prima para forja) Utiliza-se então a "sanfona" novamente para aquecer o item sob a bigorna e é utilizado o 'Foge Hammer' Conforme é utilizado o Forge Hammer aquece, então é necessário dar user nele e depois no barril para resfriá-lo e assim utilizar novamente (Quando os itens são recém forjados, eles ainda estão quentes, então pode-se reforjá-los dando user na "sanfona" para "derretê-los" e voltarem a ser matéria pria) O Foge Hammer tem a mesma Sprite que o War Hammer, porém seu id tanto 'frio' quanto 'quente' são diferentes do War Hammer e do War Hammer Enchanted E por final os itens que podem ser forjados aleatoriamente Desde já agradeço
  11. Bem galera, é uma magia feita para o TFS 0.4, creio que não irá funcionar em versões anteriores. Ela é bem simples, segue: spell "nomedoplayer Ao usar a magia, você é teleportado para o target. Fiz para dá para um amigo, pro dbo dele. spell.lua local config = { storage = 6330, -- stg do teletransporte effect = 65, -- efeito cost = 1000 -- mana necessaria} function onCastSpell(cid, var) local target = variantToNumber(var) local mana = getPlayerMana(cid) if getPlayerStorageValue(cid, config.storage) <= 0 then doPlayerSendCancel(cid, "Você ainda não aprendeu o teletransporte.") return false if isPlayer(target) and mana < config.cost then doCreatureAddHealth(cid, -(config.cost-mana)) end if isCreature(cid) then doSendMagicEffect(getThingPos(cid), config.effect) doPlayerAddSpentMana(cid, -mana) doPlayerAddMana(cid, -mana) doTeleportThing(cid, getThingPos(target)) doSendMagicEffect(getThingPos(cid), config.effect) end return trueend O xml é só copiar a magia exura sio, e modificar apenas os nomes e value. (porque eu não tenho nenhum tfs com o xml p colocar bj)
  12. Auguem pode ajudar-me com este error q da no exe do serve preciso disso urgentemente [error -spell interface] in a timer event called from: data/spells/scripts/lvl100/bomb.lua:onCastSpell Description: <luaDoCombat> Creature not found
  13. Douglas Vitorio

    Critical

    ola amigos gostaria de um sistema de critical para todos itens sword's, club's, axe's, wand's, e distance's e gostaria de ajuda de voçes para saber se e possivel subistituir os itens de um mapa de versao 7.92 para versao 8.54 e tmb monster's!!! obrigado
  14. Fjinst

    Juntar dois Npcs

    Olá, gostaria de pedir um favor para vocês, tenho dois npcs aqui comigo, um que vende items só por moeda especifica e outro que vende magias abrindo o module trade Gostaria de pedir para juntar esses dois npcs no sentido que o npc que vende magia pelo trade, só venda por moeda especifica, só isso Resumindo: Npc de magia que vende a magia por moeda especifica. Segue abaixo os dois npcs que tenho Npc que vende por moeda especifica local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)local talkState = {}function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endfunction creatureSayCallback(cid, type, msg)if(not npcHandler:isFocused(cid)) thenreturn falseendlocal talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cidlocal itemid = 2137 -- Novos points ( default é scarab coin )local shopWindow = {}local t = { [8201] = {price = 2}, [8203] = {price = 3}, [8202] = {price = 4}, [8204] = {price = 5}, [8205] = {price = 10}, [2524] = {price = 10}, [9093] = {price = 10}, [9050] = {price = 10}, [9083] = {price = 10}, [9099] = {price = 5}, [9098] = {price = 20}, [9097] = {price = 3} }local onBuy = function(cid, item, subType, amount, ignoreCap, inBackpacks)if t[item] and getPlayerItemCount(cid, itemid) < t[item].price thenselfSay("you do not have "..t[item].price.." scarab coin.", cid)elsedoPlayerAddItem(cid, item)doPlayerRemoveItem(cid, itemid, (t[item].price))selfSay("Here you item", cid) endreturn trueendif (msgcontains(msg, 'trade') or msgcontains(msg, 'TRADE'))thenfor var, ret in pairs(t) dotable.insert(shopWindow, {id = var, subType = 0, buy = ret.price, sell = 0, name = getItemNameById(var)})endopenShopWindow(cid, shopWindow, onBuy, onSell)endreturn trueendnpcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)npcHandler:addModule(FocusModule:new()) Npc que vende magia por modulo trade local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)local talkState = {}function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endfunction creatureSayCallback(cid, type, msg)if(not npcHandler:isFocused(cid)) thenreturn falseendlocal talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cidlocal shopWindow = {}local spells = {{id=2260, buy = 100, name = "Exori Mas Light", spell_name = "Exori Mas Light", vocations = {1,2,3,4,5,6,7,8}, level = 125}}local onBuy = function(cid, item, subType, amount, ignoreCap, inBackpacks)if not getPlayerLearnedInstantSpell(cid, shopWindow[item].Words) thenif getPlayerLevel(cid) >= shopWindow[item].Level thenif isInArray(shopWindow[item].Vocs, getPlayerVocation(cid)) thendoPlayerRemoveMoney(cid, shopWindow[item].Price)doPlayerLearnInstantSpell(cid, shopWindow[item].Words)npcHandler:say("Voce aprendeu uma magia chamada "..shopWindow[item].Words, cid)elsenpcHandler:say("Voce nao possui classe suficiente para adquirir essa magia.", cid)endelsenpcHandler:say("Voce precisa ter nivel "..shopWindow[item].Level.." ou mais para comprar essa magia.", cid)endelsenpcHandler:say("Voce ja adquiriu essa magia.", cid)endreturn trueendif msgcontains(msg, 'trade') or msgcontains(msg, 'magias') thenfor var, item in pairs(spells) doshopWindow[item.id] = {Level = item.level, Vocs = item.vocations, item_id = item.id, Price = item.buy, subType = 0, Words = item.spell_name, SpellName = item.name}endopenShopWindow(cid, spells, onBuy, onSell)endreturn trueendnpcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)npcHandler:addModule(FocusModule:new()) Ambos npcs não são de minha autoria, se eu lembrasse de qual post eu tirei, eu colocaria os creditos respectivos, enfim, agradeço pela ajuda.
  15. Olá galera, eu preciso muito de ajuda nesse erro que ta acontecendo, já procurei em todo lugar e não achei solução, alguém que entende de webmaster pode porfavor mesmo me ajudar?
  16. Olá, gostaria de pedir ou até mesmo perguntar se é possível fazer uma magia que cheque se tiver tal item na área do player e trocasse o item que for checado por outro item ou até mesmo trocar por uma criatura ou efeito de dano, tive uma ideia de magia detonadora, onde o jogador joga o item no chão e fala "explodir" para fazer o item sumir e surgir uma explosão desse item, desde já, agradeço pela atenção.
  17. Sabem que quando nós jogamos um item sobre a bp ele entra? queria remover isso, queria que so entrasse ao jogar diretamente dentro creio que seja nesse arquivo container.cpp ////////////////////////////////////////////////////////////////////////// OpenTibia - an opensource roleplaying game////////////////////////////////////////////////////////////////////////// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.////////////////////////////////////////////////////////////////////////#include "otpch.h"#include "container.h"#include "game.h"#include "iomap.h"#include "player.h"extern Game g_game;ContainerContainer(uint16_t type) : Item(type){ maxSize = items[type].maxItems; serializationCount = 0; totalWeight = 0.0;}Container~Container(){ for(ItemListiterator cit = itemlist.begin(); cit != itemlist.end(); ++cit) { (*cit)->setParent(NULL); (*cit)->unRef(); } itemlist.clear();}Item* Containerclone() const{ Container* _item = static_cast<Container*>(Itemclone()); for(ItemListconst_iterator it = itemlist.begin(); it != itemlist.end(); ++it) _item->addItem((*it)->clone()); return _item;}Container* ContainergetParentContainer(){ if(Cylinder* cylinder = getParent()) { if(Item* item = cylinder->getItem()) return item->getContainer(); } return NULL;}void ContaineraddItem(Item* item){ itemlist.push_back(item); item->setParent(this);}Attr_ReadValue ContainerreadAttr(AttrTypes_t attr, PropStream& propStream){ switch(attr) { case ATTR_CONTAINER_ITEMS: { uint32_t count; if(!propStream.getLong(count)) return ATTR_READ_ERROR; serializationCount = count; return ATTR_READ_END; } default: break; } return ItemreadAttr(attr, propStream);}bool ContainerunserializeItemNode(FileLoader& f, NODE node, PropStream& propStream){ if(!ItemunserializeItemNode(f, node, propStream)) return false; uint32_t type; for(NODE nodeItem = f.getChildNode(node, type); nodeItem; nodeItem = f.getNextNode(nodeItem, type)) { //load container items if(type != OTBM_ITEM) return false; PropStream itemPropStream; f.getProps(nodeItem, itemPropStream); Item* item = ItemCreateItem(itemPropStream); if(!item) return false; if(!item->unserializeItemNode(f, nodeItem, itemPropStream)) return false; addItem(item); updateItemWeight(item->getWeight()); } return true;}void ContainerupdateItemWeight(double diff){ totalWeight += diff; if(Container* parent = getParentContainer()) parent->updateItemWeight(diff);}double ContainergetWeight() const{ return ItemgetWeight() + totalWeight;}stdstring ContainergetContentDescription() const{ stdstringstream s; return getContentDescription(s).str();}stdstringstream& ContainergetContentDescription(stdstringstream& s) const{ bool begin = true; Container* evil = const_cast<Container*>(this); for(ContainerIterator it = evil->begin(); it != evil->end(); ++it) { Container* tmp = (*it)->getContainer(); if(tmp && !tmp->empty()) continue; if(!begin) s << ", "; else begin = false; s << (*it)->getNameDescription(); } if(begin) s << "nothing"; return s;}Item* ContainergetItem(uint32_t index){ size_t n = 0; for(ItemListconst_iterator cit = getItems(); cit != getEnd(); ++cit) { if(n == index) return *cit; else ++n; } return NULL;}uint32_t ContainergetItemHoldingCount() const{ uint32_t counter = 0; for(ContainerIterator it = begin(); it != end(); ++it) ++counter; return counter;}bool ContainerisHoldingItem(const Item* item) const{ for(ContainerIterator it = begin(); it != end(); ++it) { if((*it) == item) return true; } return false;}void ContaineronAddContainerItem(Item* item){ const Position& cylinderMapPos = getPosition(); SpectatorVec list; SpectatorVeciterator it; g_game.getSpectators(list, cylinderMapPos, false, false, 2, 2, 2, 2); //send to client Player* player = NULL; for(it = list.begin(); it != list.end(); ++it) { if((player = (*it)->getPlayer())) player->sendAddContainerItem(this, item); } //event methods for(it = list.begin(); it != list.end(); ++it) { if((player = (*it)->getPlayer())) player->onAddContainerItem(this, item); }}void ContaineronUpdateContainerItem(uint32_t index, Item* oldItem, const ItemType& oldType, Item* newItem, const ItemType& newType){ const Position& cylinderMapPos = getPosition(); SpectatorVec list; SpectatorVeciterator it; g_game.getSpectators(list, cylinderMapPos, false, false, 2, 2, 2, 2); //send to client Player* player = NULL; for(it = list.begin(); it != list.end(); ++it) { if((player = (*it)->getPlayer())) player->sendUpdateContainerItem(this, index, oldItem, newItem); } //event methods for(it = list.begin(); it != list.end(); ++it) { if((player = (*it)->getPlayer())) player->onUpdateContainerItem(this, index, oldItem, oldType, newItem, newType); }}void ContaineronRemoveContainerItem(uint32_t index, Item* item){ const Position& cylinderMapPos = getPosition(); SpectatorVec list; SpectatorVeciterator it; g_game.getSpectators(list, cylinderMapPos, false, false, 2, 2, 2, 2); //send change to client Player* player = NULL; for(it = list.begin(); it != list.end(); ++it) { if((player = (*it)->getPlayer())) player->sendRemoveContainerItem(this, index, item); } //event methods for(it = list.begin(); it != list.end(); ++it) { if((player = (*it)->getPlayer())) player->onRemoveContainerItem(this, index, item); }}ReturnValue Container__queryAdd(int32_t index, const Thing* thing, uint32_t count, uint32_t flags) const{ if(((flags & FLAG_CHILDISOWNER) == FLAG_CHILDISOWNER)) { //a child container is querying, since we are the top container (not carried by a player) //just return with no error. return RET_NOERROR; } const Item* item = thing->getItem(); if(!item) return RET_NOTPOSSIBLE; if(!item->isPickupable()) return RET_CANNOTPICKUP; if(item == this) return RET_THISISIMPOSSIBLE; if(const Container* container = item->getContainer()) { for(const Cylinder* cylinder = getParent(); cylinder; cylinder = cylinder->getParent()) { if(cylinder == container) return RET_THISISIMPOSSIBLE; } } if(index == INDEX_WHEREEVER && !((flags & FLAG_NOLIMIT) == FLAG_NOLIMIT) && full()) return RET_CONTAINERNOTENOUGHROOM; const Cylinder* topParent = getTopParent(); if(topParent != this) return topParent->__queryAdd(INDEX_WHEREEVER, item, count, flags | FLAG_CHILDISOWNER); return RET_NOERROR;}ReturnValue Container__queryMaxCount(int32_t index, const Thing* thing, uint32_t count, uint32_t& maxQueryCount, uint32_t flags) const{ const Item* item = thing->getItem(); if(!item) { maxQueryCount = 0; return RET_NOTPOSSIBLE; } if(((flags & FLAG_NOLIMIT) == FLAG_NOLIMIT)) { maxQueryCount = stdmax((uint32_t)1, count); return RET_NOERROR; } int32_t freeSlots = stdmax((int32_t)(capacity() - size()), (int32_t)0); if(item->isStackable()) { uint32_t n = 0; if(index != INDEX_WHEREEVER) { const Thing* destThing = __getThing(index); const Item* destItem = NULL; if(destThing) destItem = destThing->getItem(); if(destItem && destItem->getID() == item->getID()) n = 100 - destItem->getItemCount(); } maxQueryCount = freeSlots * 100 + n; if(maxQueryCount < count) return RET_CONTAINERNOTENOUGHROOM; } else { maxQueryCount = freeSlots; if(maxQueryCount == 0) return RET_CONTAINERNOTENOUGHROOM; } return RET_NOERROR;}ReturnValue Container__queryRemove(const Thing* thing, uint32_t count, uint32_t flags) const{ int32_t index = __getIndexOfThing(thing); if(index == -1) return RET_NOTPOSSIBLE; const Item* item = thing->getItem(); if(item == NULL) return RET_NOTPOSSIBLE; if(count == 0 || (item->isStackable() && count > item->getItemCount())) return RET_NOTPOSSIBLE; if(!item->isMovable() && !hasBitSet(FLAG_IGNORENOTMOVABLE, flags)) return RET_NOTMOVABLE; return RET_NOERROR;}Cylinder* Container__queryDestination(int32_t& index, const Thing*, Item** destItem, uint32_t&){ if(index == 254 /*move up*/) { index = INDEX_WHEREEVER; *destItem = NULL; Container* parentContainer = dynamic_cast<Container*>(getParent()); if(parentContainer) return parentContainer; else return this; } else if(index == 255 /*add wherever*/) { index = INDEX_WHEREEVER; *destItem = NULL; return this; } else { if(index >= (int32_t)capacity()) { /* if you have a container, maximize it to show all 20 slots then you open a bag that is inside the container you will have a bag with 8 slots and a "grey" area where the other 12 slots where from the container if you drop the item on that grey area the client calculates the slot position as if the bag has 20 slots */ index = INDEX_WHEREEVER; } if(index != INDEX_WHEREEVER) { Thing* destThing = __getThing(index); if(destThing) *destItem = destThing->getItem(); if(Cylinder* subCylinder = dynamic_cast<Cylinder*>(*destItem)) { index = INDEX_WHEREEVER; *destItem = NULL; return subCylinder; } } } return this;}void Container__addThing(Creature* actor, Thing* thing){ return __addThing(actor, 0, thing);}void Container__addThing(Creature*, int32_t index, Thing* thing){ if(index >= (int32_t)capacity()) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__addThing], index:" << index << ", index >= capacity()" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } Item* item = thing->getItem(); if(!item) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__addThing] item == NULL" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; }#ifdef __DEBUG_MOVESYS__ if(index != INDEX_WHEREEVER && size() >= capacity()) { stdclog << "Failure: [Container::__addThing] size() >= capacity()" << stdendl; return /*RET_CONTAINERNOTENOUGHROOM*/; }#endif item->setParent(this); itemlist.push_front(item); totalWeight += item->getWeight(); if(Container* parentContainer = getParentContainer()) parentContainer->updateItemWeight(item->getWeight()); //send change to client if(getParent() && getParent() != VirtualCylindervirtualCylinder) onAddContainerItem(item);}void Container__updateThing(Thing* thing, uint16_t itemId, uint32_t count){ int32_t index = __getIndexOfThing(thing); if(index == -1) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__updateThing] index == -1" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } Item* item = thing->getItem(); if(!item) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__updateThing] item == NULL" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } const ItemType& oldType = Itemitems[item->getID()]; const ItemType& newType = Itemitems[itemId]; const double oldWeight = item->getWeight(); item->setID(itemId); item->setSubType(count); const double diffWeight = -oldWeight + item->getWeight(); totalWeight += diffWeight; if(Container* parentContainer = getParentContainer()) parentContainer->updateItemWeight(diffWeight); //send change to client if(getParent()) onUpdateContainerItem(index, item, oldType, item, newType);}void Container__replaceThing(uint32_t index, Thing* thing){ Item* item = thing->getItem(); if(!item) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__replaceThing] item == NULL" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } uint32_t count = 0; ItemListiterator cit = itemlist.end(); for(cit = itemlist.begin(); cit != itemlist.end(); ++cit) { if(count == index) break; ++count; } if(cit == itemlist.end()) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__updateThing] item not found" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } totalWeight -= (*cit)->getWeight(); totalWeight += item->getWeight(); if(Container* parentContainer = getParentContainer()) parentContainer->updateItemWeight(-(*cit)->getWeight() + item->getWeight()); itemlist.insert(cit, item); item->setParent(this); //send change to client if(getParent()) { const ItemType& oldType = Itemitems[(*cit)->getID()]; const ItemType& newType = Itemitems[item->getID()]; onUpdateContainerItem(index, *cit, oldType, item, newType); } (*cit)->setParent(NULL); itemlist.erase(cit);}void Container__removeThing(Thing* thing, uint32_t count){ Item* item = thing->getItem(); if(!item) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__removeThing] item == NULL" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } int32_t index = __getIndexOfThing(thing); if(index == -1) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__removeThing] index == -1" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } ItemListiterator cit = stdfind(itemlist.begin(), itemlist.end(), thing); if(cit == itemlist.end()) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__removeThing] item not found" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } if(item->isStackable() && count != item->getItemCount()) { const double oldWeight = -item->getWeight(); item->setItemCount(stdmax(0, (int32_t)(item->getItemCount() - count))); const double diffWeight = oldWeight + item->getWeight(); totalWeight += diffWeight; //send change to client if(getParent()) { if(Container* parentContainer = getParentContainer()) parentContainer->updateItemWeight(diffWeight); const ItemType& it = Itemitems[item->getID()]; onUpdateContainerItem(index, item, it, item, it); } } else { //send change to client if(getParent()) { if(Container* parentContainer = getParentContainer()) parentContainer->updateItemWeight(-item->getWeight()); onRemoveContainerItem(index, item); } totalWeight -= item->getWeight(); item->setParent(NULL); itemlist.erase(cit); }}Thing* Container__getThing(uint32_t index) const{ if(index > size()) return NULL; uint32_t count = 0; for(ItemListconst_iterator cit = itemlist.begin(); cit != itemlist.end(); ++cit) { if(count == index) return *cit; else ++count; } return NULL;}int32_t Container__getIndexOfThing(const Thing* thing) const{ uint32_t index = 0; for(ItemListconst_iterator cit = getItems(); cit != getEnd(); ++cit) { if(*cit == thing) return index; else ++index; } return -1;}int32_t Container__getFirstIndex() const{ return 0;}int32_t Container__getLastIndex() const{ return size();}uint32_t Container__getItemTypeCount(uint16_t itemId, int32_t subType /*= -1*/) const{ uint32_t count = 0; for(ItemListconst_iterator it = itemlist.begin(); it != itemlist.end(); ++it) { if((*it) && (*it)->getID() == itemId && (subType == -1 || subType == (*it)->getSubType())) count += (*it)->getItemCount(); } return count;}stdmap<uint32_t, uint32_t>& Container__getAllItemTypeCount(stdmap<uint32_t, uint32_t>& countMap) const{ for(ItemListconst_iterator it = itemlist.begin(); it != itemlist.end(); ++it) countMap[(*it)->getID()] += (*it)->getItemCount(); return countMap;}void ContainerpostAddNotification(Creature* actor, Thing* thing, const Cylinder* oldParent, int32_t index, CylinderLink_t/* link = LINK_OWNER*/){ Cylinder* topParent = getTopParent(); if(!topParent->getCreature()) { if(topParent == this) { //let the tile class notify surrounding players if(topParent->getParent()) topParent->getParent()->postAddNotification(actor, thing, oldParent, index, LINK_NEAR); } else topParent->postAddNotification(actor, thing, oldParent, index, LINK_PARENT); } else topParent->postAddNotification(actor, thing, oldParent, index, LINK_TOPPARENT);}void ContainerpostRemoveNotification(Creature* actor, Thing* thing, const Cylinder* newParent, int32_t index, bool isCompleteRemoval, CylinderLink_t/* link = LINK_OWNER*/){ Cylinder* topParent = getTopParent(); if(!topParent->getCreature()) { if(topParent == this) { //let the tile class notify surrounding players if(topParent->getParent()) topParent->getParent()->postRemoveNotification(actor, thing, newParent, index, isCompleteRemoval, LINK_NEAR); } else topParent->postRemoveNotification(actor, thing, newParent, index, isCompleteRemoval, LINK_PARENT); } else topParent->postRemoveNotification(actor, thing, newParent, index, isCompleteRemoval, LINK_TOPPARENT);}void Container__internalAddThing(Thing* thing){ __internalAddThing(0, thing);}void Container__internalAddThing(uint32_t#ifdef __DEBUG_MOVESYS__ index#endif , Thing* thing){#ifdef __DEBUG_MOVESYS__ stdclog << "[Container::__internalAddThing] index: " << index << stdendl;#endif if(!thing) return; Item* item = thing->getItem(); if(item == NULL) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__internalAddThing] item == NULL" << stdendl;#endif return; } itemlist.push_front(item); item->setParent(this); totalWeight += item->getWeight(); if(Container* parentContainer = getParentContainer()) parentContainer->updateItemWeight(item->getWeight());}void Container__startDecaying(){ for(ItemListconst_iterator it = itemlist.begin(); it != itemlist.end(); ++it) (*it)->__startDecaying();}ContainerIterator Containerbegin(){ ContainerIterator cit(this); if(!itemlist.empty()) { cit.over.push(this); cit.current = itemlist.begin(); } return cit;}ContainerIterator Containerend(){ ContainerIterator cit(this); return cit;}ContainerIterator Containerbegin() const{ Container* evil = const_cast<Container*>(this); return evil->begin();}ContainerIterator Containerend() const{ Container* evil = const_cast<Container*>(this); return evil->end();}ContainerIteratorContainerIterator():base(NULL) {}ContainerIteratorContainerIterator(Container* _base):base(_base) {}ContainerIteratorContainerIterator(const ContainerIterator& rhs):base(rhs.base), over(rhs.over), current(rhs.current) {}bool ContainerIteratoroperator==(const ContainerIterator& rhs){ return !(*this != rhs);}bool ContainerIteratoroperator!=(const ContainerIterator& rhs){ assert(base); if(base != rhs.base) return true; if(over.empty() && rhs.over.empty()) return false; if(over.empty()) return true; if(rhs.over.empty()) return true; if(over.front() != rhs.over.front()) return true; return current != rhs.current;}ContainerIterator& ContainerIteratoroperator=(const ContainerIterator& rhs){ this->base = rhs.base; this->current = rhs.current; this->over = rhs.over; return *this;}Item* ContainerIteratoroperator*(){ assert(base); return *current;}Item* ContainerIteratoroperator->(){ return *(*this);}ContainerIterator& ContainerIteratoroperator++(){ assert(base); if(Item* item = *current) { Container* container = item->getContainer(); if(container && !container->empty()) over.push(container); } ++current; if(current == over.front()->itemlist.end()) { over.pop(); if(over.empty()) return *this; current = over.front()->itemlist.begin(); } return *this;}ContainerIterator ContainerIteratoroperator++(int32_t){ ContainerIterator tmp(*this); ++*this; return tmp;}
  18. Olá, gostaria de saber como vocês aprenderam a programar? Pois gostaria de aprender *---* E queria algumas dicas sobre programação e Tutoriais, etc.... *-----*
  19. Preciso resolver um problema mas não sei o lugar correto. O heal e runas funciona perfeito sem o player sofre algum attack, mas quando outro player ou monstro ataca da exaust nas runa e magia, demora mais pra sair a runa e magia.. Aonde que resolvo esse problema?
  20. Olá a todos, eu gostaria de pedir ajuda com um script, esse script foi criado pelo Nightwolf, porém, possui uma falha que quando ao morrer, da um error no console, até ai tudo bem, porém essa skill funciona em area, e se todos forem levados para essa outra dimensão do kamui e morrerem, começa a dar uma lagada no distro, queria saber como faço para resolver ou até mesmo pedir ajuda de vocês para solucionar esse problema, já tentei colocar funções como isPlayer, iscreature, mas não tive sucesso, sempre o mesmo erro ou então o script parava de funcionar, segue abaixo o script original. local config = {pos = {x=608, y=1684, z=7}, -- posição que será teleportadotempo = 15, -- tempo pra voltareffect1 = 98, -- efeito ao ser teleportadoeffect2 = 52, -- efeito ao voltarstorage = 19329, -- storage que fica guardado o cooldownfrom = {x=651, y=1700, z=7}, --- quina do kamui (pra impedir players de usarem o kamui dentro do kamui)to = {x=558, y=1671, z=7}, --- quina do kamui (pra impedir players de usarem o kamui dentro do kamui)cooldown = 16, --- tempo entre um uso e outro (após usar a spell vc vai ficar X segundos sem poder usar ela novamente)msg = "KAMUI OUT!" -- mensagem ao sair do kamui}local exceptions = {'trainer', 'aegis', 'god anderson'} --- nome das criaturas que não poderão ser levadas pro kamui (sempre em minúsculo e entre aspas)function canEffect(pos, pz, proj) -- Night Wolf based on Nordif getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false endif getTilePzInfo(pos) and not pz then return false endlocal n = not proj and 3 or 2for i = 0, 255 dopos.stackpos = ilocal tile = getTileThingByPos(pos)if tile.itemid ~= 0 and not isCreature(tile.uid) thenif hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) thenreturn falseendendendreturn trueendfunction onCastSpell(cid, var)local pos = getPlayerPosition(cid)if isInRange(pos, config.from, config.to) thendoPlayerSendCancel(cid, "You cannot use Kamui spell inside the Kamui!")return falseendif os.time() - getPlayerStorageValue(cid, config.storage) >= config.cooldown thendoPlayerSetStorageValue(cid, config.storage, os.time())if isCreature(getCreatureTarget(cid)) thentarget = getCreatureTarget(cid)for i = 1, #exceptions doif getCreatureName(target):lower() == exceptions[i] thendoPlayerSendCancel(cid, "You can't take ".. getCreatureName(target) .." to Kamui.")return falseendend--------------- PLAYER-----------addEvent(doTeleportThing, 1000*config.tempo, cid, pos, true)addEvent(doCreatureSay, 1000*config.tempo, cid, config.msg, 20, false)addEvent(doSendMagicEffect, 1000*config.tempo, pos, config.effect2)doSendMagicEffect(pos, config.effect1)doTeleportThing(cid, config.pos)-------------------- OPONENTE ----------------addEvent(doTeleportThing, 1000*config.tempo, target, getThingPos(target), true)addEvent(doSendMagicEffect, 1000*config.tempo, getThingPos(target), config.effect2)doSendMagicEffect(getThingPos(target), config.effect1)doTeleportThing(target, config.pos)-------------------------------------if isPlayer(target) and isCreature(cid) thendoPlayerSendTextMessage(target, 27, "You were teleported by ".. getCreatureName(cid) ..".")endif isPlayer(cid) and isCreature(target) thendoPlayerSendTextMessage(cid, 27, "You teleported ".. getCreatureName(target) .."!")endfor i = 1,config.tempo doaddEvent(function()if isPlayer(target) thendoPlayerSendTextMessage(target,25,"You'll be back in " .. config.tempo -i +1 .. " second(s)")endif isPlayer(cid) thendoPlayerSendTextMessage(cid,25,"You'll be back in " .. config.tempo -i +1 .. " second(s)")endend, 1000*i)endelse---------- levar quem tá em volta do player ---------------local teleportPosition = {{x = pos.x, y = pos.y - 1, z = pos.z},{x = pos.x, y = pos.y + 1, z = pos.z},{x = pos.x - 1, y = pos.y, z = pos.z},{x = pos.x + 1, y = pos.y, z = pos.z},{x = pos.x - 1, y = pos.y + 1, z = pos.z},{x = pos.x - 1, y = pos.y - 1, z = pos.z},{x = pos.x + 1, y = pos.y - 1, z = pos.z},{x = pos.x + 1, y = pos.y + 1, z = pos.z}}local mobas = {}local checker = 0 for _, tPos in ipairs(teleportPosition) dodoSendMagicEffect(tPos, config.effect2)local mob = getTopCreature(tPos).uid if canEffect (tPos) and mob ~= 0 and (isMonster(mob) or isPlayer(mob)) thenfor i = 1, #exceptions doif getCreatureName(mob):lower() == exceptions[i] thenchecker = 1breakendendif checker ~= 1 thentable.insert(mobas, mob) endendendif #mobas > 0 thenfor _, pid in ipairs(mobas) doaddEvent(doTeleportThing, 1000*config.tempo, pid, getThingPos(pid), true)addEvent(doSendMagicEffect, 1000*config.tempo, getThingPos(pid), config.effect2)doSendMagicEffect(getThingPos(pid), config.effect1)doTeleportThing(pid, config.pos)if isPlayer(pid) and isCreature(cid) thendoPlayerSendTextMessage(pid, 27, "You were teleported by ".. getCreatureName(cid) ..".")endfor i = 1,config.tempo doaddEvent(function()if isPlayer(pid) thendoPlayerSendTextMessage(pid,25,"You'll be back in " .. config.tempo -i +1 .. " second(s)")endend, 1000*i)endendend----------------------------addEvent(doTeleportThing, 1000*config.tempo, cid, pos, true)addEvent(doCreatureSay, 1000*config.tempo, cid, config.msg, 20, false)addEvent(doSendMagicEffect, 1000*config.tempo, pos, config.effect2)doSendMagicEffect(pos, config.effect1)doTeleportThing(cid, config.pos)if isPlayer(cid) thendoPlayerSendTextMessage(cid, 27, "You teleported yourself.")endfor i = 1,config.tempo doaddEvent(function()if isPlayer(cid) thendoPlayerSendTextMessage(cid,25,"You'll be back in " .. config.tempo -i +1 .. " second(s)")endend, 1000*i)endendelsedoPlayerSendCancel(cid, "Your skill is in cooldown, you must wait "..(config.cooldown - (os.time() - getPlayerStorageValue(cid, config.storage))).." seconds.")endreturn trueend O problema é esse [15:57:08.435] [Error - Spell Interface] [15:57:08.438] In a timer event called from: [15:57:08.442] data/spells/scripts/kamui in.lua:onCastSpell [15:57:08.451] Description: [15:57:08.458] (luaDoTeleportThing) Thing not found Caso o jogador/monstro morra lá, da esse erro no distro, queria que não acontecesse isso, desde já agradeço pela atenção e ajuda.
  21. Preciso de ajuda esta aparecendo esse erro logo apos ligar o otserver mysql_real_query() select * from z_ots_comunication where type = 'login';- mysql error: table 'otserv.z_ots_comunication' doesn't exist (1146)
  22. Alguem poderia me ajudar nesse comando de !ranks.. queria que o gm, god etc, não aparecesse no rank. talkactions script.. local ranks = { ['fist'] = {0}, ['club'] = {1}, ['sword'] = {2}, ['axe'] = {3}, ['distance'] = {4}, ['shield'] = {5}, ['fish'] = {6}, ['magic'] = {7}, ['level'] = {8}, } function onSay(cid, words, param) local msg = string.lower(param) if ranks[msg] ~= nil then str = getHighscoreString((ranks[msg][1])) else str = getHighscoreString((8)) end doShowTextDialog(cid,6500, str) return TRUE end
  23. Estou com um problema no servidor, quando o player vai se healar não consegue usar as runa. Em que parte eu mexo para ajustar esse erro? é exhaust? mas aonde?
  24. Alguém poderia mim dizer oque a source faz no servidor ? porque eu não entendo ela, se eu for adicionar algo no servidor, eu adiciono na source ou oque ? e se for pra tirar alguma coisa também é como ? alguém mim explica por favor
  25. Olá, gostaria que alguém me passasse uma Database compatível com este sv. +Rep xD Sv: https://otland.net/threads/8-60-the-forgotten-server-0-4.240240/
×
×
  • Criar Novo...