Ir para conteúdo

Oneshot

Marquês
  • Total de itens

    1347
  • Registro em

  • Última visita

  • Dias Ganhos

    36

Tudo que Oneshot postou

  1. Façamos assim. function onWriteToChannel(cid, channelId, text) local file = io.open("data/logs/channels/".. getCreatureName(cid) .." [".. channelId .."].txt", "a+") file:write(os.date("%d/%m/%Y %X") .." ".. text) file:close() return true end O do Colandus só roda em canais configurados no channels.xml, se os jogadores estiverem conversando uns com os outros pelo Default ou privado, o script não irá retornar nada nesse caso.
  2. No channels.xml, procure por: <channel id="65535" name="Private Chat Channel"/> Troque por: <channel id="65535" name="Private Chat Channel" logged="yes"/> Não tenho muita certeza se irá funcionar. Caso não funcione, você poderá compilar um servidor com esse creaturescript onWriteToChannel e então é só fazer um script.
  3. Acredito que seguindo os passos passados pelo DrakyLucas no tópico, você consiga instalar o sistema. Não há nenhum requerimento de TFS 0.4 ou servidor MySQL para usar o sistema.
  4. No caso, você teria que passar o script do moveevent do chão que apenas VIPs podem passar.
  5. Oneshot

    Storage

    Está certo. O_õ if getPlayerStorageValue(cid, 103) == 1 then selfSay("Você não pode mais falar comigo!", cid) end Por exemplo.
  6. Oneshot

    Pedido Talkaction

    http://www.xtibia.com/forum/topic/190135-item-serial-system/ Espero que isso te ajude mais ou menos. Você precisará fazer uma modificação no script de compra ou entrega de itens do seu servidor.
  7. Dá sim para fazer sem ser por edição C++ com o creatureevent onStatsChange, o problema é que ficaria um script muito ruim e pouco preciso. Qualquer coisa, só falar que função que você precisa e que versão do TFS você quer que compilo para você.
  8. Você pode fazer isso no combat.cpp dentro do seu servidor. Precisamente nessas funções abaixo: bool Combat::CombatHealthFunc(Creature* caster, Creature* target, const CombatParams& params, void* data) { int32_t change = 0; if(Combat2Var* var = (Combat2Var*)data) { change = var->change; if(!change) change = random_range(var->minChange, var->maxChange, DISTRO_NORMAL); } if(g_game.combatBlockHit(params.combatType, caster, target, change, params.blockedByShield, params.blockedByArmor)) return false; if(change < 0 && caster && caster->getPlayer() && target->getPlayer() && target->getPlayer()->getSkull() != SKULL_BLACK) change = change / 2; if(!g_game.combatChangeHealth(params.combatType, caster, target, change, params.effects.hit, params.effects.color)) return false; CombatConditionFunc(caster, target, params, NULL); CombatDispelFunc(caster, target, params, NULL); return true; } bool Combat::CombatManaFunc(Creature* caster, Creature* target, const CombatParams& params, void* data) { int32_t change = 0; if(Combat2Var* var = (Combat2Var*)data) { change = var->change; if(!change) change = random_range(var->minChange, var->maxChange, DISTRO_NORMAL); } if(change < 0 && caster && caster->getPlayer() && target->getPlayer() && target->getPlayer()->getSkull() != SKULL_BLACK) change = change / 2; if(!g_game.combatChangeMana(caster, target, change)) return false; CombatConditionFunc(caster, target, params, NULL); CombatDispelFunc(caster, target, params, NULL); return true; } Está vendo essa linha em comum nas duas funções? change = change / 2; Mude para: change = change / 4; E é só compilar novamente.
  9. Oneshot

    [Spell] Bold Fluor

    local _combat = createCombatObject() local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_NONE) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_BOLT) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 0, 10, 2.8, 32) local area = createCombatArea(AREA_CROSS5X5) setCombatArea(_combat, area) function onTargetTile(cid, position) doCombat(cid, combat, positionToVariant(position)) end setCombatCallback(_combat, CALLBACK_PARAM_TARGETTILE, "onTargetTile") function onCastSpell(cid, var) return doCombat(cid, _combat, var) end A parte do exhaustion é provavelmente no spells.xml. O script retorna o valor de doCombat, ou seja, true. Então se puder, dê uma olhada na tag XML da magia em questão e aumente o intervalo de exhaustion lá. A tag XML passada pelo membro Tchubaka tem exhaustion de 1 milissegundo, se estiver usando ela, está aí o problema.
  10. Oneshot

    [Spell] Bold Fluor

    local _combat = createCombatObject() local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_NONE) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_BOLT) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 0, 10, 2.8, 32) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(_combat, area) function onTargetTile(cid, position) doCombat(cid, combat, positionToVariant(position)) end setCombatCallback(_combat, CALLBACK_PARAM_TARGETTILE, "onTargetTile") function onCastSpell(cid, var) return doCombat(cid, _combat, var) end
  11. Oneshot

    War System

    [Gesior Acc] Guild War System Com Escudos
  12. function onSay(cid, words, param, channel) if channel == x then ... end return true end
  13. Não sei muito bem o quê a exana kor faz, mas se você fizer uma pequena modificação no script acima: local damage = COMBAT_PHYSICALDAMAGE local effect = CONST_ME_DRAWBLOOD local animation = CONST_ANI_REDSTAR local rounds = 15 local delay = 3 * 1000 local condition = createConditionObject(CONDITION_BLEEDING) local function doCombatCondition(cid, target, type, area, min, max, effect, rounds) if isCreature(target) then if getCreatureCondition(target, CONDITION_BLEEDING) then doAreaCombatHealth((isCreature(cid) and cid or 0), type, getThingPosition(target), area, min, max, effect) if rounds > 0 then addEvent(doCombatCondition, delay, cid, target, type, area, min, max, effect, (rounds - 1)) end end end return true end function onCastSpell(cid, var) local formula_min = getPlayerLevel(cid) local formula_max = getPlayerLevel(cid) * 2.5 + 32 local target = variantToNumber(var) if getDistanceBetween(getThingPosition(target), getThingPosition(cid)) < 4 then doSendDistanceShoot(getThingPosition(cid), getThingPosition(target), animation) end doAddCondition(target, condition) addEvent(doCombatCondition, delay, cid, target, damage, 0, -formula_min, -formula_max, CONST_ME_DRAWBLOOD, rounds) return true end Esse script acima só dá o dano periódico se o alvo tem a condição Bleeding, caso contrário nada acontece. Caso a tal exana kor seja uma magia de dispel para a condição Bleeding então se encaixa perfeitamente.
  14. local damage = COMBAT_PHYSICALDAMAGE local effect = CONST_ME_DRAWBLOOD local animation = CONST_ANI_REDSTAR local rounds = 15 local delay = 3 * 1000 local function doCombatCondition(cid, target, type, area, min, max, effect, rounds) if isCreature(target) then doAreaCombatHealth((isCreature(cid) and cid or 0), type, getThingPosition(target), area, min, max, effect) if rounds > 0 then addEvent(doCombatCondition, delay, cid, target, type, area, min, max, effect, (rounds - 1)) end end return true end function onCastSpell(cid, var) local formula_min = getPlayerLevel(cid) local formula_max = getPlayerLevel(cid) * 2.5 + 32 local target = variantToNumber(var) if getDistanceBetween(getThingPosition(target), getThingPosition(cid)) < 4 then doSendDistanceShoot(getThingPosition(cid), getThingPosition(target), animation) end addEvent(doCombatCondition, delay, cid, target, damage, 0, -formula_min, -formula_max, CONST_ME_DRAWBLOOD, rounds) return true end
  15. tfs_libraries.7z Mova o conteúdo do arquivo para o diretório MingGW dentro do diretório onde você instalou o Code::Blocks.
  16. Oneshot

    Vender Level

    function onSay(cid, words, param, channel) if getPlayerLevel(cid) < 3500 then return doPlayerSendCancel(cid, "Você precisa de level 3500 para poder usar o comando.") end addEvent(function() if isCreature(cid) then local playerID = getPlayerGUID(cid) doPlayerAddItem(cid, 11192, 1) doRemoveCreature(cid) db.executeQuery("UPDATE `players` SET `level` = 8, `experience` = ".. getExperienceForLevel(8) .." ` WHERE `id` = ".. playerID ..";") db.executeQuery("UPDATE `players` SET `health` = 185, `healthmax` = 185, `mana` = 35, `manamax` = 35 WHERE `id` = ".. playerID ..";") end end, 3 * 1000) return true end
  17. Isso sim dá para fazer. local damage = COMBAT_LIFEDRAIN local rounds = 15 local delay = 3 * 1000 local function doCombatCondition(cid, target, type, area, min, max, effect, rounds) if isCreature(target) then doAreaCombatHealth(cid, type, getThingPosition(target), area, min, max, effect) if rounds > 0 then addEvent(doCombatCondition, delay, cid, target, type, area, min, max, effect, (rounds - 1)) end end return true end function onCastSpell(cid, var) local formula_min = getPlayerLevel(cid) local formula_max = getPlayerLevel(cid) * 2.5 + 32 local target = variantToNumber(var) addEvent(doCombatCondition, delay, cid, target, damage, 0, -formula_min, -formula_max, CONST_ME_DRAWBLOOD, rounds) return true end Tá aí algo que simula mais ou menos uma condição de dano com atraso em segundos e que você pode manipular o dano mínimo e máximo com fórmulas.
  18. Oneshot

    Guard

    Nome: Guard Tipo: NPC Autor: Oneshot Muitos devem conhecer o NPC Guard, que possui inteligência artificial e ataca jogadores que possuem skulls de servidores que baixam. Acontece que o script desse NPC foi programado apenas para um NPC só, então quando você tenta, por exemplo, ter dois Guards no servidor, se um está na cidade A e outro na cidade B e, por exemplo, o NPC da cidade A começa atacar um jogador, o NPC da cidade B se teleporta "magicamente" para a cidade A. Pensando nisso, resolvi otimizar todo o código, orientando ele a objetos. Isso faz com que cada NPC (objeto) tenha suas próprias variáveis e não compartilhem mais elas entre si. Em data/npc/lib, crie um arquivo chamado guard.lua e adicione o conteúdo abaixo: Guard = { config = { attackspeed = 1000, }, combat = {type = COMBAT_PHYSICALDAMAGE, min = 100, max = 200} } function Guard:new() local ret = {} setmetatable({}, {__index = self.combat}) setmetatable(ret, {__index = self}) return ret end function Guard:reset() self.config = Guard.config self.target = 0 selfFollow(0) doTeleportThing(self.id, self.position) end function Guard:updateTarget() if self.target ~= 0 then return end local creatures = getSpectators(getThingPosition(self.id), self.range, self.range, false) for i = 1, #creatures do local target = creatures[i] if isCreature(target) and not isNpc(target) and getCreatureSkull(target) >= 3 then if not getTilePzInfo(getThingPosition(target)) then if selfFollow(target) then selfSay("I don't tolerate people like you, ".. getCreatureName(target)) self.target = target self:attack() break end end else self:reset() end end end function Guard:attack() if self.target == 0 then self:reset() return end self.time = self.time or os.clock() if self.time < os.clock() then if getDistanceBetween(getThingPosition(self.id), getThingPosition(self.target)) == 1 then doTargetCombatHealth(self.id, self.target, self.combat.type, -self.combat.min, -self.combat.max, CONST_ME_DRAWBLOOD) end self.time = self.time + (self.config.attackspeed/1000) end end Agora em data/npc/scripts, crie um arquivo chamado guard.lua e adicione o conteúdo abaixo: local guard = Guard:new() function onCreatureAppear(cid) if cid == getNpcId() then guard.id = getNpcId() guard.target = 0 guard.position = getNpcPos() end end function onCreatureDisappear(cid) if cid == guard.target then guard:reset() end end function onCreatureSay(cid, type, msg) return false end function onThink() guard:updateTarget() if guard.target ~= 0 then if isCreature(guard.target) then guard:attack() else guard:reset() end else guard:reset() end end E em data/npc/ crie um arquivo chamado guard.xml e adicione o conteúdo abaixo: <?xml version="1.0" encoding="UTF-8"?> <npc name="Guard" script="guard.lua" walkinterval="0" speed="200" floorchange="0"> <health now="100" max="100"/> <look type="134" head="57" body="59" legs="40" feet="76" addons="0"/> <parameters/> </npc> Abraços \o
  19. Ótimo tutorial, embora eu não seja um adepto do Mapping. Obrigado por contribuir com este ótimo conteúdo. REP+
  20. local position = {x = 180, y = 90, z = 7} local stone = 1285 function onSay(cid, words, param, channel) local item = getTileItemById(position, stone) if(words == "/openmewtwo") then if(item.uid == 0) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "The Mewtwo's cave is already opened.") return true end doRemoveItem(item.uid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You have opened the Mewtwo's cave.") elseif(words == "/closemewtwo") then if(item.uid > 0) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "The Mewtwo's cave is already closed.") return true end doCreateItem(stone, position) doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You have closed the Mewtwo's cave.") end return true end
  21. Vou falar uma coisa que até foge um pouco do tema da discussão, acho que a maioria dos servidores cobra VIP mais pelo lucro sim. Mas notei que tem crescido uma massa de donos de servidores que só pensam nisso e não procuram nem saber como fazer o sistema VIP pro servidor deles, além de querer lucrar, querem tudo de mão beijada e se possível de graça. Sério, eu me recuso a programar scripts na seção de Pedidos e Dúvidas quando vejo coisas parecidas com: "é pra colocar no shop do meu servidor", "é um item que dá 30 dias vip pra colocar no shop". E tem muitos que ainda, na cara-de-pau, pedem: "Se possível manda por PM". Além de querer um script de graça, quer exclusividade? É por isso que acho que essa geração do Open Tibia brasileiro só pensa em lucro, é gananciosa, vegetativa e acomodada
  22. Não há como amigo, a função addDamageCondition é meio limitada e não existem callbacks para usar com conditions. Abraços.
  23. Oneshot

    Npc Complexo!

    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 function onCreatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end if(msgcontains(msg, "skulls") or msgcontains(msg, "yes")) then if(doPlayerRemoveItem(cid, 2320, 2)) then npcHandler:say("Now that I have my precious skulls, I can tell you... The last time I heard of Kenam, he was living as a hidden fortress' emperor in Thais.", cid) doCreatureSetStorage(cid, 2304, 1) else npcHandler:say("You do not have any skulls! I need two of them.", cid) npcHandler:releaseFocus(cid) end end return true end npcHandler:setMessage(MESSAGE_GREET, "Hello |PLAYERNAME|, I liked your head's format. I really like {skulls}, if you bring me some of them, I can help you. Do you have any with you?") npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, onCreatureSayCallback) npcHandler:addModule(FocusModule:new()) local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function onGreetCallback(cid) if getPlayerStorageValue(cid, 2304) == 1 then npcHandler:setMessage(MESSAGE_GREET, "Hello, |PLAYERNAME|. I can {remove} your skull or battle.") talkState[cid] = 1 else npcHandler:setMessage(MESSAGE_GREET, "You do not have permission to talk with me.") npcHandler:releaseFocus(cid) end return true end function onCreatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end if(msgcontains(msg, "remove") and talkState[cid] == 1) then (...) -- INSERIR CÓDIGO MACARRÔNICO AQUI end return true end npcHandler:setCallback(CALLBACK_GREET, onGreetCallback) npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, onCreatureSayCallback) npcHandler:addModule(FocusModule:new()) Esta não é a seção de Pedidos e Dúvidas. Abraços.
  24. O atributo charges é bem diferente do atributo duration. Aconselho usar o segundo para o que você está tentando fazer, sendo o valor em segundos.
  25. Não, você é que está errado em não saber o que está falando. Os servidores giram em três tipos de banco de dados: SQLite, MySQL e PgSQL, embora eu nunca tenha visto o terceiro sendo usado. Não existe um que seja só SQL, então o criador do tópico ao pedir algo SQL provavelmente está pedindo um SQLite (aquele do arquivo .s3db) que é mais fácil de usar.
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...