-
Total de itens
1347 -
Registro em
-
Última visita
-
Dias Ganhos
36
Tudo que Oneshot postou
-
Não basta baixar o IDE Dev-C++ e tentar a compilação. Você precisa baixar vários pacotes usados no código Open Tibia. Deixo abaixo o Dev-C++ já com todos os pacotes e com suporte a compilação para sistemas 64-bits: SpeedyShare Caso ainda dê algum erro, baixe o pacote OpenSSL no menu de Atualizações do programa.
-
Provavelmente sim. Mas acho que um aumento de 100% no intervalo de ataques iria cortar a vantagem de usar duas armas. Acho que um aumento de 40% a 50% já basta. Se o normal é 1000 ms, coloque 1400 ms a 1500 ms, Por exemplo.
-
Só com uma "profunda" edição nas sources. Pois não é bem o delay entre ataques que é diminuído, é o sistema que simula dois ataques por intervalo. Por exemplo, vamos dizer que configuramos a vocação Knight com intervalo de ataque 2000 ms. Normalmente, ela iria fazer um ataque a cada 2 (dois) segundos, mas equipando uma arma com dualwield, ela fará 2 ataques a cada 2 segundos, ou seja, 1 ataque por segundo. Simplificando tudo, usando um armamento com dualwield, o delay entre ataques é reduzido pela metade, ou ainda, a velocidade de ataque é dobrada.
-
Infelizmente não é minha culpa essa falta de tags fechadas, parece que o desse fórum insiste em sumir com elas Mas obrigado pelo aviso.[/font][/color][/size]
-
Tendo visto a crescente quantidade de pedidos por armas que possam ser usadas simultaneamente nas duas mãos, resolvi criar um tutorial apenas para esclarecer que esse código já existe compilado nas mais recentes revisões do The Forgotten Server. Você pode escolher quais itens poderão ser equipamentos nas duas mãos e claro restringir esses itens depois para apenas uma vocação. 1. Para criar seu item que pode ser equipado nas duas mãos, abra o items.xml e navegue até o ID do item desejado. Por exemplo, mostrarei abaixo o ID da Magic Sword: <item id="2400" article="a" name="magic sword"> <attribute key="description" value="It is the Sword of Valor." /> <attribute key="weight" value="4200" /> <attribute key="defense" value="35" /> <attribute key="attack" value="48" /> <attribute key="weaponType" value="sword" /> <attribute key="extradef" value="3" /> </item> 2. Adicione o atributo dualwield com valor 1 no código XML do item. <item id="2400" article="a" name="magic sword"> <attribute key="description" value="It is the Sword of Valor." /> <attribute key="weight" value="4200" /> <attribute key="defense" value="35" /> <attribute key="attack" value="48" /> <attribute key="weaponType" value="sword" /> <attribute key="extradef" value="3" /> <attribute key="dualwield" value="1" /> </item> Pelo que pude testar os danos não se somam, mas sim são causados dois ataques ao invés de um, ou seja a velocidade de ataque do jogador aumenta. Funciona com qualquer tipo de arma, desde swords até rods e wands. Funcional em: The Forgotten Server 0.4 rev3777 em diante
-
Talvez fazendo como um moveevent. function onDeEquip(cid, item, slot) return false end Ou então fazendo isso function onDeEquip(cid, item, slot) local temp = doCreateItemEx(item.itemid) doRemoveItem(item.uid, 1) doPlayerAddItemEx(cid, temp, false, slot) return true end
-
Eu não sei porque vocês, scripters, teimam tanto em usar doPlayerSetVocation(cid, voc) ou manipular o campo 'vocation' no banco de dados através de querys. Esse método só funcionará permanente se as vocações são "primárias" e não agem como promotions. Já cansei de dizer que muitos dos servidores atuais possuem as função getPlayerPromotionLevel(cid) e setPlayerPromotionLevel(cid), estas são responsáveis por atribuir uma nova vocação ao jogador sem que ela seja retirada logo depois. Vou pedir gentilmente que você anexe ao tópico seu arquivo vocations.xml usando [/font][/size]
-
Então, colega. Vá nessa linha da spell anterior: doCreateMonster("headcaptor", position) E digite o nome correto do monstro, que eu posso ter errado ou ele não existe no servidor. Depois verei sua segunda magia.
-
Acho que era minha vó que usava duas definições para inveja: - A inveja boa onde você pega as pessoas como bons exemplos e se espelha nelas para melhorar. - A inveja ruim onde ninguém pode ser melhor que você, você não se contenta em acreditar que aquela pessoa está tão bem com a vida. Até hoje não sei se ela estava certa sobre isso.
-
A energia da luz solar não é a absorvida, ela reage através da clorofila das plantas para produção de glicose. E, creio eu, a clorofila apenas reage com a luz. Vide exemplo real, quando está escuro, a planta deixa de fazer fotossíntese e apenas respira. Se a clorofila fosse capaz de reagir com outra coisa, não existiriam as fases de claro e escuro das plantas. Mas acho que nada que uma intervenção genética ou processo evolutivo possa fazer com que as plantas possam reagir com energia nuclear. Já são conhecidos fungos que se alimentam dos resquícios radioativos aos arredores de Chernobyl.
-
Seria conveniente se um desses três elementos resolvesse te banir mesmo.
-
Desculpe mesmo, digitei errado o nome da variável local function isWalkable(position, cid) position.stackpos = 0 if getTileThingByPos(position).uid ~= 0 then local tile = getTileInfo(position) if tile.protection == false and tile.house == false and getTopCreature(position).uid == 0 and doTileQueryAdd(cid, position) == RETURNVALUE_NOERROR then return true end end return false end local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) local area = createCombatArea({ {1, 0, 1}, {0, 3, 0}, {1, 0, 1} }) setCombatArea(combat, area) function onTargetTile(cid, position) if isWalkable(position, cid) then local creature = doCreateMonster("headcaptor", position) doConvinceCreature(cid, creature) addEvent(function() if isCreature(creature) then doRemoveCreature(creature) end end, 1 * 1000) end return true end setCombatCallback(combat, CALLBACK_PARAM_TARGETTILE, "onTargetTile") function onCastSpell(cid, var) return doCombat(cid, combat, var) end
-
local function isWalkable(position, cid) position.stackpos = 0 if getTileThingByPos(position).uid ~= 0 then local tile = getTileInfo(position) if tile.protection == false and tile.house == false and getTopCreature(position).uid == 0 and doTileQueryAdd(cid, position) == RETURNVALUE_NOERROR then return true end end return false end local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) local area = createCombatArea({ {1, 0, 1}, {0, 3, 0}, {1, 0, 1} }) setCombatArea(combat, area) function onTargetTile(cid, position) if isWalkable(position) then local creature = doCreateMonster("headcaptor", position) doConvinceCreature(cid, creature) addEvent(function() if isCreature(creature) then doRemoveCreature(creature) end end, 1 * 1000) end return true end setCombatCallback(combat, CALLBACK_PARAM_TARGETTILE, "onTargetTile") function onCastSpell(cid, var) return doCombat(cid, combar, var) end
-
Não adianta nada usar doConvinceCreature e outras funções se o monstro que será sumonado não possui a flag convinceable igual a 1.
-
Colega, De vez em quando é interessante você mesmo usar o recurso Pesquisar para encontrar o que você quer nos fóruns, antes de criar um tópico de pedido. Autoloot System por MatheusMkalo
-
Olá Fiz uma fórmula definida por uma função f(x) com os dados que você definiu. local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, 61) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 61) function getCombatValues(cid, level, maglevel) local min, max = (maglevel * 30/9), (maglevel * 55/9) return -min, -max end setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatValues") function onUseWeapon(cid, var) return doCombat(cid, combat, var) end Creio que, assim, os jogadores de maglevel 10 irão tirar danos flutuando entre 100 e 150 e jogadores de maglevel 100 irão causar danos flutuando de 400 a 700.
-
-
Ou veja se os jogadores começam com capacidade suficiente para todos os itens
-
local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end local talkState = {} local config = { itemid = 2157, price = {[2] = 5, [3] = 10, [4] = 20}, promotions = {[2] = "second", [3] = "third", [4] = "fourth"} } function onCreatureSayCallback(cid, type, msg) if not npcHandler:isFocused(cid) then return false end local talkUser = (NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid) local promotionLevel = getPlayerPromotionLevel(cid) if msgcontains(msg, "promotion") then if config.promotions[promotionLevel + 1] then selfSay("Do you want to buy the ".. config.promotions[promotionLevel + 1] .." promotion for ".. config.price[promotionLevel + 1] .." ".. getItemInfo(config.itemid).plural .."?", cid) talkState[talkUser] = 1 else selfSay("Sorry, but I can't promote you.", cid) end elseif msgcontains(msg, "yes") and talkState[talkUser] == 1 then if doPlayerRemoveItem(cid, config.itemid, config.price[promotionLevel + 1]) then selfSay("Congratulations! You are now promoted.", cid) setPlayerPromotionLevel(cid, promotionLevel + 1) else selfSay("Sorry, but you don't have enough ".. getItemInfo(config.itemid).plural ..".", cid) end elseif msgcontains(msg, "no") and isInArray({1}, talkState[talkUser]) then selfSay("Alright then, come back when you are ready.") talkState[talkUser] = 0 end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, onCreatureSayCallback) npcHandler:setMessage(MESSAGE_GREET, "Hello. I can promote you for ".. getItemInfo(config.itemid).plural ..".") npcHandler:addModule(FocusModule:new()) Creio que você sabe criar novos NPCs, então deixei apenas o script dele. Ele apenas promove jogadores com a primeira promotion em diante. O preço de cada promotion você pode configurar aqui: price = {[2] = 5, [3] = 10, [4] = 20} No caso, a segunda promotion custa 5 gold nuggets, a terceira 10 gold nuggets e quarta 20 gold nuggets.
-
std::string Player::getDescription(int32_t lookDistance) const { std::stringstream s; if(lookDistance == -1) { s << "yourself."; if(hasFlag(PlayerFlag_ShowGroupNameInsteadOfVocation)) s << " You are " << group->getName(); else if(vocationId != 0) s << " You are " << vocation->getDescription(); else s << " You have no vocation"; } else { s << nameDescription; if(!hasCustomFlag(PlayerCustomFlag_HideLevel)) s << " (Level " << level << ")"; s << ". " << (sex % 2 ? "He" : "She"); if(hasFlag(PlayerFlag_ShowGroupNameInsteadOfVocation)) s << " is " << group->getName(); else if(vocationId != 0) s << " is " << vocation->getDescription(); else s << " has no vocation"; s << getSpecialDescription(); } std::string tmp; if(marriage && IOLoginData::getInstance()->getNameByGuid(marriage, tmp)) { s << ", "; if(vocationId == 0) { if(lookDistance == -1) s << "and you are"; else s << "and is"; s << " "; } s << (sex % 2 ? "husband" : "wife") << " of " << tmp; } s << "."; if(guildId) { if(lookDistance == -1) s << " You are "; else s << " " << (sex % 2 ? "He" : "She") << " is "; s << (rankName.empty() ? "a member" : rankName)<< " of the " << guildName; if(!guildNick.empty()) s << " (" << guildNick << ")"; s << "."; } return s.str(); } Você precisa editar várias funções nas sources. Creio que você teria que editar a função que passei acima e editar estes em vocation.h const std::string& getDescription() const {return description;} void setDescription(const std::string& v) {description = v;} Aconselho criar dois const, um para cada sexo. E então editar essa parte da Player::getDescription { s << nameDescription; if(!hasCustomFlag(PlayerCustomFlag_HideLevel)) s << " (Level " << level << ")"; s << ". " << (sex % 2 ? "He" : "She"); if(hasFlag(PlayerFlag_ShowGroupNameInsteadOfVocation)) s << " is " << group->getName(); else if(vocationId != 0) s << " is " << vocation->getDescription(); else s << " has no vocation"; s << getSpecialDescription(); } Por exemplo: { s << nameDescription; if(!hasCustomFlag(PlayerCustomFlag_HideLevel)) s << " (Level " << level << ")"; s << ". " << (sex % 2 ? "He" : "She"); if(hasFlag(PlayerFlag_ShowGroupNameInsteadOfVocation)) s << " is " << group->getName(); else if(vocationId != 0) s << " is " << (sex % 2 ? vocation->getMaleDescription() : vocation->getFemaleDescription); else s << " has no vocation"; s << getSpecialDescription(); } Enfim isso é só um rascunho. Um grande abraço.
-
Tem como sim. Você vai precisar de uma ferramenta conhecida pelo nome OTItemEditor e com ela, você abrirá seu arquivo items.otb, criando um ID novo mas usando uma sprite id existente. Deixo para você o endereço de download hospedado no Sourceforge. http://sourceforge.net/projects/opentibia/files/opentibia%20tools/otitemeditor-0.3.9/
-
Boas dicas, mas um pouco superficiais. Existem várias outras funções na biblioteca math e string. Existem também outros símbolos matemáticos como ^ e %. E um erro: Storages são armazenados no banco de dados como VARCHAR. ou seja, não podem armazenar tabelas.
-
Compreendo. Você usa uma versão "antiga" adaptada. Se não me engano, de fato, a pasta lib não existe no seu caso. E sim existe um arquivo só chamado global.lua. Então façamos assim: 1 - Crie um arquivo chamado forgesystem.lua na pasta raiz do seu servidor, ou seja, onde ficam o executável e as DLLs. 2 - Adicione a seguinte linha no fim do arquivo global.lua: dofile("forgesystem.lua")
-
getThingPosition(getCreatureTarget(cid)) ??
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.