-
Total de itens
1347 -
Registro em
-
Última visita
-
Dias Ganhos
36
Tudo que Oneshot postou
-
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.
-
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.
-
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.
-
No caso, você teria que passar o script do moveevent do chão que apenas VIPs podem passar.
-
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.
-
dúvida [Encerrado] Duvidir Dano Em Player
tópico respondeu ao coyotestark de Oneshot em Tópicos Sem Resposta
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ê. -
dúvida [Encerrado] Duvidir Dano Em Player
tópico respondeu ao coyotestark de Oneshot em Tópicos Sem Resposta
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. -
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.
-
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
-
[Gesior Acc] Guild War System Com Escudos
-
function onSay(cid, words, param, channel) if channel == x then ... end return true end
-
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.
-
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
-
dúvida Erro Ao Copilar Tfs 0.2 No Codeblocks
pergunta respondeu ao MatheusEnjoy de Oneshot em Resolvidos
tfs_libraries.7z Mova o conteúdo do arquivo para o diretório MingGW dentro do diretório onde você instalou o Code::Blocks. -
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
-
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.
-
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
-
Ótimo tutorial, embora eu não seja um adepto do Mapping. Obrigado por contribuir com este ótimo conteúdo. REP+
-
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
-
[Arquivado]VIP Em OTServers: Necessidade ou Lucro?
tópico respondeu ao dwhfms de Oneshot em Noticias - Arquivo
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 -
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.
-
action Wand Que Pode Ser Encantada !
tópico respondeu ao lukas13on de Oneshot em Actions e Talkactions
O atributo charges é bem diferente do atributo duration. Aconselho usar o segundo para o que você está tentando fazer, sendo o valor em segundos. -
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.