Ir para conteúdo

Wise

Membro
  • Registro em

  • Última visita

Tudo que Wise postou

  1. @SuggestName Não importa qual seja a checagem, se retornar false ao callback, sim. Ele não poderá mover o item.
  2. @danihcv Amigo, algumas observações: Tanto no primeiro script, quanto no segundo, você fechou o escopo antes e acabou deixando algumas funções e estruturas de controle de fora. E no segundo você declarou uma variável como sendo a storage, mas não fez uso dela (?). Seria: function onSay(cid) local itemid = 2160 if getPlayerItemCount(cid, itemid) > 0 then doPlayerRemoveItem(cid, itemid, 1) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "MENSAGEM QUANDO O PLAYER RECEBER O PREMIO!") doSendMagicEffect(getThingPos(cid), CONST_ME_GIFT_WRAPS) else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "MENSAGEM QUANDO O PLAYER NÃO TIVER O ITEM!") end return true end E: function onSay(cid) local itemid, stor = 2160, 69169 -- ID, storage if getPlayerItemCount(cid, itemid) > 0 then if getPlayerStorageValue(cid, stor) < 1 then setPlayerStorageValue(cid, stor, 1) doPlayerRemoveItem(cid, itemid, 1) doSendMagicEffect(getThingPos(cid), CONST_ME_GIFT_WRAPS) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "MENSAGEM QUANDO O PLAYER RECEBER O PREMIO!") else doPlayerSendCancel(cid, "Desculpe, voce ja usou isso uma vez.") end else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "MENSAGEM QUANDO O PLAYER NÃO TIVER O ITEM!") end return true end Mesmo assim, qual a função desses 2 scripts? Remove um item do cid (caso ele tenha), envia uma mensagem e um efeito mágico. É muito bom ver que você se dispõe a ajudar outros membros, só tenha cuidado com o uso das estruturas de controle. Dá uma lida nesse tutorial, pode te ajudar a aumentar seu conhecimento ;] @namerso18 Não entendi muito bem. Usar uma talkaction somente uma vez, que faz com que o player receba um item e uma quantidade de premium days? local t = { pd = 10, -- premium days stor = 54321, -- storage item = {1234, 5} -- {itemID, amount} } function onSay(cid) if getPlayerStorageValue(cid, t.stor) < 1 then setPlayerStorageValue(cid, t.stor, 1) doPlayerAddPremiumDays(cid, t.pd) doPlayerAddItem(cid, t.item[1], t.item[2]) doSendMagicEffect(getThingPos(cid), CONST_ME_GIFT_WRAPS) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'You received '..t.item[2]..' '..getItemNameById(t.item[1])..' and '..t.pd..' days of premium account.') else doPlayerSendCancel(cid, 'Sorry, you already have used this command.') end return true end
  3. Wise postou uma resposta no tópico em Suporte Tibia OTServer
    Vi que você e mais alguns membros precisavam desse creature event, então eu criei um tópico pra que todos possam ver sobre ele de forma simples. Aqui, amigo.
  4. Notei que alguns membros precisavam desse creature event pra desenvolver alguns sistemas, então eu resolvi compartilhá-lo com vocês. Na source, em creatureevent.cpp Abaixo de: else if(tmpStr == "preparedeath") m_type = CREATURE_EVENT_PREPAREDEATH; Adicione: else if(tmpStr == "moveitem") m_type = CREATURE_EVENT_MOVEITEM; Abaixo de: case CREATURE_EVENT_PREPAREDEATH: return "onPrepareDeath"; Adicione: case CREATURE_EVENT_MOVEITEM: return "onMoveItem"; Abaixo de: case CREATURE_EVENT_PREPAREDEATH: return "cid, deathList"; Adicione: case CREATURE_EVENT_MOVEITEM: return "cid, item, count, toContainer, fromContainer, fromPos, toPos"; Antes de: bool CreatureEvents::playerLogout(Player* player, bool forceLogout) Adicione: uint32_t CreatureEvent::executeMoveItem(Player* player, Item* item, uint8_t count, const Position& fromPos, const Position& toPos, Item* toContainer, Item* fromContainer, int16_t fstack) { //onMoveItem(cid, item, count, toContainer, fromContainer, fromPos, toPos) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(player->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; env->streamThing(scriptstream, "item", item, env->addThing(item)); scriptstream << "local count = " << count << std::endl; env->streamThing(scriptstream, "toContainer", toContainer, env->addThing(toContainer)); env->streamThing(scriptstream, "fromContainer", fromContainer, env->addThing(fromContainer)); env->streamPosition(scriptstream, "fromPos", fromPos, fstack); env->streamPosition(scriptstream, "toPos", toPos, 0); scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[30]; sprintf(desc, "%s", player->getName().c_str()); env->setEvent(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(player->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); LuaInterface::pushThing(L, item, env->addThing(item)); lua_pushnumber(L, count); LuaInterface::pushThing(L, toContainer, env->addThing(toContainer)); LuaInterface::pushThing(L, fromContainer, env->addThing(fromContainer)); LuaInterface::pushPosition(L, fromPos, fstack); LuaInterface::pushPosition(L, toPos, 0); bool result = m_interface->callFunction(7); m_interface->releaseEnv(); return result; } } else { std::clog << "[Error - CreatureEvent::executeMoveItem] Call stack overflow." << std::endl; return 0; } } Agora, em creatureevent.h Abaixo de: uint32_t executePrepareDeath(Creature* creature, DeathList deathList); Adicione: uint32_t executeMoveItem(Player* player, Item* item, uint8_t count, const Position& fromPos, const Position& toPos, Item* toContainer, Item* fromContainer, int16_t fstack); Procure por: CREATURE_EVENT_PREPAREDEATH Substitua por: CREATURE_EVENT_PREPAREDEATH, CREATURE_EVENT_MOVEITEM E em game.cpp Depois de: if(!canThrowObjectTo(mapFromPos, mapToPos) && !player->hasCustomFlag(PlayerCustomFlag_CanThrowAnywhere)) { player->sendCancelMessage(RET_CANNOTTHROW); return false; } Adicione: bool success = true; CreatureEventList moveitemEvents = player->getCreatureEvents(CREATURE_EVENT_MOVEITEM); for(CreatureEventList::iterator it = moveitemEvents.begin(); it != moveitemEvents.end(); ++it) { Item* toContainer = toCylinder->getItem(); Item* fromContainer = fromCylinder->getItem(); if(!(*it)->executeMoveItem(player, item, count, fromPos, toPos, (toContainer ? toContainer : 0), (fromContainer ? fromContainer : 0), fromStackpos) && success) success = false; } if(!success) return false; Um exemplo BEM simples do uso desse creature event: Tag: <event type="moveitem" name="MoveItem" event="script" value="moveitem.lua"/> moveitem.lua function onMoveItem(cid, item, count, toContainer, fromContainer, fromPos, toPos) local item = 12345 if item.itemid == item and getPlayerAccess(cid) < 4 then return doPlayerSendCancel(cid, 'You are not allowed to move this item.') and false end return true end Nessa estrutura de controle, se o item for o de ID 12345 e o cid tiver acesso menor do que 4, retornará false e ele não poderá mover o item. Se não for o caso, a checagem feita será false e retornará true, então o cid poderá mover o item. Esse callback registra creature event? Sim: registerCreatureEvent(cid, "MoveItem") Créditos: Summ.
  5. Ops, removi a variável por engano: local cargos = { ["tutor"] = {prefixNick = "[TUTOR]", group = 2}, ["gm"] = {prefixNick = "[GM]", group = 4}, ["cm"] = {prefixNick = "[GM]", group = 5}, ["adm"] = {prefixNick = "[ADM]", group = 6} } function onSay(cid, words, param, channel) local t = string.explode(param, ",") if param == "" or not tostring(t[1]) or not tostring(t[2]) then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Digite o nome do jogador e o nome do cargo que deseja atribuir à ele, separados por vírgula. Exemplo: /cargo Player, GM") end local p = getPlayerByNameWildcard(t[1]) if not p then return doPlayerSendCancel(cid, "Este player não está online, ou não existe.") end local c = cargos[t[2]:lower()] if not c then return doPlayerSendCancel(cid, "Cargo inexistente.") end db.executeQuery("UPDATE `players` SET `name` = '["..c.prefixNick.."] "..getCreatureName(p).."' WHERE `players`.`id`= "..getPlayerGUID(t[1]).."") doPlayerSetGroupId(p, c.group) addEvent(function() if isPlayer(p) then doRemoveCreature(p, true) end end, 5 * 1000) doPlayerSendTextMessage(p, MESSAGE_STATUS_CONSOLE_BLUE, "Voce sera kikado em 5 segundos.") return true end Hahah quando eu cliquei em responder, apareceu a notificação de nova resposta. Obrigado xWhiteWolf.
  6. @gil Se o seu pedido foi atendido, por favor clique no botão que está localizado abaixo do post de quem te ajudou. Automaticamente ele irá ficar destacado como a melhor resposta e o tópico ficará com o prefixo "Resolvido" no início do título.
  7. Vá ao diretório das actions scripts (data/actions), abra o arquivo actions.xml e procure pelos IDs das potions. Na tag delas, você vai poder ver o nome do arquivo e onde ele se localiza (estará em data/actions/scripts ou em pastas desse diretório), pegue os códigos do(s) arquivo(s) da(s) potion(s) e poste aqui.
  8. Eu não disse que você me ofendeu. Alias não tem motivo algum pra você me citar num comentário consideravelmente inútil para o tópico, amigo. Releia com mais atenção: Agora pessoal, por favor mantenham a ordem e só respondam no tópico caso vocês tenham alguma informação que seja relevante para o pedido do membro.
  9. No caso eu estava pelo celular via 4g no momento, e um texto iria garantir que pessoas na minha ocasião também possam ajudar. Além de que seria melhor para entender o pedido pelas palavras de quem o pediu, do que por um vídeo. @SiriusBlacks004 Não seja infantil, não precisa ofender ninguém pra expressar sua opinião.
  10. Relate especificamente o que você quer, senão fica difícil de entender e de poder te ajudar.
  11. @KekezitoLHP Já que o pedido foi atendido, clique no botão que está localizado abaixo do post de quem te ajudou. Automaticamente ele irá ficar destacado como a melhor resposta e o tópico ficará com o prefixo "Resolvido" no início do título. Disponha.
  12. Não é porque ele se nomeia um scripter que ele não pode fazer um pedido de um script. E se ele for um iniciante? function onStepIn(cid) if not isPlayer(cid) then return false end return true end
  13. Só fiz uma correção de uma função no escopo dentro do for: pokelogout.lua function onLogout(cid) local sto = {17000, 17001, 63215} for x = 1, #sto do if getPlayerStorageValue(cid, sto[x]) < 1 then return true end end doPlayerSendCancel(cid, 'You cannot logout when you are in special situations such as surf/ride/fly.') return false end Tag: <event type="logout" name="PokeLogout" event="script" value="pokelogout.lua"/>
  14. É, o erro da localização da variável foi meu mesmo, não observei bem. Agora o primeiro erro que acusou foi pra fechar o parâmetro da função doPlayerSetGroupId, e foi um erro seu que eu não tinha visto: Obrigado pela correção, mas eu não vejo motivos pra rir de mim. Teste: local cargos = { ["tutor"] = {prefixNick = "[TUTOR]", group = 2}, ["gm"] = {prefixNick = "[GM]", group = 4}, ["cm"] = {prefixNick = "[GM]", group = 5}, ["adm"] = {prefixNick = "[ADM]", group = 6} } function onSay(cid, words, param, channel) local t = string.explode(param, ",") if param == "" or not tostring(t[1]) or not tostring(t[2]) then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Digite o nome do jogador e o nome do cargo que deseja atribuir à ele, separados por vírgula. Exemplo: /cargo Player, GM") end local p = getPlayerByNameWildcard(t[1]) if not p then return doPlayerSendCancel(cid, "Este player não está online, ou não existe.") end local c = cargos[t[2]:lower()] if not c then return doPlayerSendCancel(cid, "Cargo inexistente.") end db.executeQuery("UPDATE `players` SET `name` = '"..c.prefixNick.." "..getCreatureName(p).."' WHERE `players`.`id`= "..getPlayerGUID(p).."") doPlayerSetGroupId(p, c.group) addEvent(function() if isPlayer(p) then doRemoveCreature(p, true) end end, 5 * 1000) doPlayerSendTextMessage(p, MESSAGE_STATUS_CONSOLE_BLUE, "Voce sera desconectado em 5 segundos.") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce deu acesso "..c.group.." para "..t[1]..", que agora é "..c.prefixNick) return true end
  15. Sim, na verdade não seria uma condição e sim uma estrutura de controle com tabela. Eu não havia pensado nisso já que fiz de imediato, obrigado.
  16. Então, o valor 1 e -1 foram exemplos, você pode atribuir o id do valor da storage como preferir (desde que coincida com a estrutura de controle). Não tem de quê, disponha ;]
  17. Não vejo erros no script. Você não fez alguma alteração incorreta? Poste os códigos do arquivo, se possível. E talvez assim você consiga configurar com mais facilidade (códigos do Nogard): local t = { outfit = 129, speed = 474, stor = 32001 } function onUse(cid, item) if getPlayerStorageValue(cid, t.stor) < 1 then setPlayerStorageValue(cid, t.stor, 1) doChangeSpeed(cid, t.speed) doSetCreatureOutfit(cid, {lookType = t.outfit}, -1) doCreatureSay(cid, 'BIKE ON!', TALKTYPE_ORANGE_1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, 'Você montou na bike.') else setPlayerStorageValue(cid, t.stor, -1) doChangeSpeed(cid, -t.speed) doRemoveCondition(cid, CONDITION_OUTFIT) doCreatureSay(cid, 'BIKE OFF!', TALKTYPE_ORANGE_1) doPlayerSendTextMessage(cid, MESSSAGE_STATUS_CONSOLE_BLUE, 'Voce desmontou da bike.') end return true end
  18. Provavelmente quem tiver um acesso considerável pra fazer esse tipo de ação. Mas de qualquer forma isso é apenas uma preferência de restrição, basta alterar o valor na tag. Você quer dizer, que tenha os privilégios de todas as flags / customflags? Basta calcular o valor delas pelo Flags Calculator e modificar em seu groups.xml (data/XML). Calculei uma de exemplo, que tem todos os privilégios (só selecionei algumas restrições comuns de não ter ganho de exp/hp/mana/skill): <group id="6" name="Owner" flags="513744660570104" customFlags="134217727" access="5" violationReasons="23" nameViolationFlags="170" statementViolationFlags="213" depotLimit="5000" maxVips="500" outfit="302"/>
  19. O seu pedido é de um comando, correto? Então sim, é uma talkaction. Códigos do Orochi Elf cargo.lua (data/talkactions/scripts): local cargos = { ["tutor"] = {prefixNick = "[TUTOR]", group = 2}, ["gm"] = {prefixNick = "[GM]", group = 4}, ["cm"] = {prefixNick = "[GM]", group = 5}, ["adm"] = {prefixNick = "[ADM]", group = 6} } function onSay(cid, words, param, channel) local t = string.explode(param, ",") if param == "" or not tostring(t[1]) or not tostring(t[2]) then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Digite o nome do jogador e o nome do cargo que deseja atribuir à ele, separados por vírgula. Exemplo: /cargo Player, GM") end local p = getPlayerByNameWildcard(t[1]) if not p then return doPlayerSendCancel(cid, "Este player não está online, ou não existe.") end local c = cargos[t[2]:lower()] if not c then return doPlayerSendCancel(cid, "Cargo inexistente.") end db.executeQuery("UPDATE `players` SET `name` = '"..c.prefixNick.." "..getCreatureName(p).."' WHERE `players`.`id`= "..getPlayerGUID(p).."") doPlayerSetGroupId(p, c.group) addEvent(function() if isPlayer(p) then doRemoveCreature(p, true) end end, 5 * 1000) doPlayerSendTextMessage(p, MESSAGE_STATUS_CONSOLE_BLUE, "Voce sera desconectado em 5 segundos.") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce deu acesso "..c.group.." para "..t[1]..", que agora é "..c.prefixNick) return true end Tag - talkactions.xml (data/talkactions): <talkaction log="yes" words="/cargo" access="5" event="script" value="cargo.lua"/>
  20. Você cria um movement script que atribui ao player determinado valor de uma storage ao equipar/remover o item de determinado slot. local stor = 12345 -- storage function onEquip(cid, item, slot) setPlayerStorageValue(cid, stor, 1) -- já que é no callback de equipar, ele recebe o valor de ID 1 (como sendo positivo para a checagem do uso da spell) return true end function onDeEquip(cid, item, slot) setPlayerStorageValue(cid, stor, -1) -- ao remover o item, ele recebe o valor de ID -1 (como sendo negativo para a checagem do uso da spell) return true end Configure as tags como movevents Equip / DeEquip. Ex: <movevent type="Equip" itemid="ITEMID" slot="ring" event="script" value="filename.lua"/> <movevent type="DeEquip" itemid="ITEMID" slot="ring" event="script" value="filename.lua"/> local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) setCombatParam(combat, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) setHealingFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 1.5, 2) function onCastSpell(cid, var) local stor = 12345 -- storage if getPlayerStorageValue(cid, stor) < 1 then -- checa se o valor da storage no player é menor que 1 (sendo que 1 seria o necessário) doPlayerSendCancel(cid, "You can't cast the spell without using the item that allows it.") -- a informação de que ele nao pode conjurar a spell é dada return false -- retorna false ao callback, resultando em não conjurar a spell end return doCombat(cid, combat, var) -- se a checagem acima for false, ou seja, maior ou igual a 1 (valor necessário), então significa que o player está com o item necessário equipado e a conjuração da spell é feita end Qualquer dúvida ou problema, é só relatar por aqui.
  21. function onThink(interval, lastExecution) local soul = 15 if getWorldCreatures(0) > 0 then for _, all in ipairs(getPlayersOnline()) do doPlayerAddSoul(all, soul) end end return true end
  22. Wise postou uma resposta no tópico em Suporte Tibia OTServer
    Já que é uma action, basta incluir ao escopo como preferir (de acordo com a ação que você fizer): local effect = 45 doSendDistanceShoot(getCreaturePosition(cid), toPos, effect) Ajuste o parâmetro toPos de acordo com o que você usou no callback, seja ele topos / toPos / toPosition, iguale o uso dele nas funções para que tudo coincida. Se não souber como aplicar, poste o script que deseja o distance effect e explique como você o quer. Eu não sei como o seu servidor é, então se essa ação for feita por algum script na lib (como o membro citou), poste os códigos do arquivo.
  23. Amigo, crie um tópico na área Suporte de Scripts e faça o seu pedido.
  24. prision.lua function onSay(cid, words, param, channel) local stor = 50505 -- storage local prisionpos = {x=123, y=456, z=7} -- pos local player = getPlayerByNameWildcard(param) if (words == '/imprison') then if (param == '') then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Enter the player name you want to imprison.') end if (not tostring(param)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Invalid param specified.') end if (not player) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Player '..param..' not found.') end if (getPlayerStorageValue(player, stor) > 0) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'The player '..param..' is already imprisoned.') end if (getPlayerAccess(player) > 3) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'You cannot imprison a player with access higher than 3.') end setPlayerStorageValue(player, stor, 1) doTeleportThing(player, prisionpos) doSendMagicEffect(getThingPos(player), CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, 'You have imprisoned the player '..param) elseif (words == '/release') then if (param == '') then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Enter the player name you want to imprison.') end if (not tostring(param)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Invalid param specified.') end if (not player) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Player '..param..' not found.') end if (getPlayerStorageValue(player, stor) < 1) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'The player '..param..' is not imprisoned.') end setPlayerStorageValue(player, stor, -1) doTeleportThing(player, getTownTemplePosition(getPlayerTown(player))) doSendMagicEffect(getThingPos(player), CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, 'You have released the player '..param) end return true end <talkaction log="yes" words="/imprison;/release" access="5" event="script" value="prision.lua"/> Prender: /imprison Player Libertar: /release Player
  25. Eu só disse pra você não levar a crítica para o lado pessoal. Obrigado pela contribuição. Abraços.

Informação Importante

Confirmação de Termo