Ir para conteúdo

Oneshot

Marquês
  • Total de itens

    1347
  • Registro em

  • Última visita

  • Dias Ganhos

    36

Tudo que Oneshot postou

  1. Já disse que não é possível. int32_t LuaInterface::luaDoSaveServer(lua_State* L) { //doSaveServer([shallow = false]) bool shallow = false; if(lua_gettop(L) > 0) shallow = popBoolean(L); Dispatcher::getInstance().addTask(createTask(boost::bind(&Game::saveGameState, &g_game, shallow))); lua_pushnil(L); return 1; } Agora uma olha no Game:saveGameState void Game::saveGameState(bool shallow) { std::clog << "> Saving server..." << std::endl; uint64_t start = OTSYS_TIME(); if(gameState == GAMESTATE_NORMAL) setGameState(GAMESTATE_MAINTAIN); IOLoginData* io = IOLoginData::getInstance(); for(AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it) { it->second->loginPosition = it->second->getPosition(); io->savePlayer(it->second, false, shallow); } map->saveMap(); ScriptEnviroment::saveGameState(); if(gameState == GAMESTATE_MAINTAIN) setGameState(GAMESTATE_NORMAL); std::clog << "> SAVE: Complete in " << (OTSYS_TIME() - start) / (1000.) << " seconds using " << asLowerCaseString(g_config.getString(ConfigManager::HOUSE_STORAGE)) << " house storage." << std::endl; } Mas se você acredita em milagres, só dividir esse for em vários. for(AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it) { it->second->loginPosition = it->second->getPosition(); io->savePlayer(it->second, false, shallow); } Mas dando uma olhada melhor, dá para separar em save de jogadores e save de mapa, que acho que já ajuda um pouco. Abraços.
  2. onTextEdit é uma função que é executada toda vez que você escreve algo em algum item. O que você está fazendo aí, de chamar um diálogo de texto quando editar o livro, é simples inútil, pois é só tornar o item ID 1979 possível de escrever algo. <item id="1979" article="a" name="big blue demona book"> <attribute key="weight" value="1300" /> </item> <item id="1979" article="a" name="big blue demona book"> <attribute key="weight" value="1300" /> <attribute key="writeable" value="1" /> <attribute key="maxTextLen" value="512" /> <attribute key="writeOnceItemId" value="1964" /> </item> Abraços.
  3. Bom, se você planeja criar uma skill nova, você teria que criar todos os métodos relacionados a ela no player.cpp. E já disse que Hex Editor só serve mesmo para editar os nomes de skills que já existam no cliente, de Fist Fighting a Fishing.
  4. Se o atributo Agilidade foi programado em C++, você pode fazer algo desse tipo no player.cpp uint32_t Player::getAttackSpeed() const { return vocation->getAttackSpeed(); } uint32_t Player::getAttackSpeed() const { return vocation->getAttackSpeed() - (getPlayer()->getAgility() * 10); } Aí por exemplo se o atributo Agilidade for manipulável e tal, cada ponto vai diminuir 10ms no intervalo entre os ataques. Como disse por PM, fazer algo com uma função secundária daria trabalho demais. Porque você teria que estar atualizando o attackspeed do jogador, ou quando ele distribuir um ponto em um atributo ou quando ele entrar no jogo. Você teria que mexer nos arquivos do projeto player.cpp e iologindata.cpp e no header player.h, pra criar um sistema de atributos. Abraços.
  5. Troque essa linha: doItemSetAttribute(uid, "serial", generateSerial()) Por essa: doItemSetAttribute(new_item, "serial", generateSerial())
  6. function onKill(cid, target, lastHit) return (isPlayer(target) and getCreatureStorage(target, 23239) == 1 and doPlayerAddMoney(cid, 1000000)) end
  7. Se eu, que resolvi a dúvida do garoto, não postei porcaria nenhuma falando que reportei porque diabos você tem que vir aqui fazer um post pra isso? Esse tipo de coisa, devia ser considerada flood. Basta apenas reportar, não precisa postar não. Abraços.
  8. Para de viajar, colaborador! /addpoints [nome do jogador], [quantidade]
  9. ta mais precisa fazer mais q um script daqueles ? Tô vendo como a dúvida está sanada, PiabetaMan01. Vá moderar a área a qual você coordena, colega.
  10. Fico no aguardo, obrigado! No momento da postagem, eu já havia consertado rsrs. Abraços.
  11. local spell = {} spell.config = { [1] = { type = COMBAT_FIREDAMAGE, areaEffect = CONST_ME_FIREAREA, area = { {1, 1, 1}, {0, 2, 0}, {0, 0, 0} }, formula = {5, 5, 1.2, 2} }, [2] = { type = COMBAT_FIREDAMAGE, areaEffect = CONST_ME_FIREAREA, area = { {0, 0, 1}, {0, 2, 1}, {0, 0, 1} }, formula = {5, 5, 1.2, 2} }, [3] = { type = COMBAT_FIREDAMAGE, areaEffect = CONST_ME_FIREAREA, area = { {0, 0, 0}, {0, 2, 0}, {1, 1, 1} }, formula = {5, 5, 1.2, 2} }, [4] = { type = COMBAT_FIREDAMAGE, areaEffect = CONST_ME_FIREAREA, area = { {1, 0, 0}, {1, 2, 0}, {1, 0, 0} }, formula = {5, 5, 1.2, 2} } } spell.combats = {} for _, config in ipairs(spell.config) do local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, (config.type or COMBAT_NONE)) setCombatParam(combat, COMBAT_PARAM_EFFECT, (config.areaEffect or CONST_ME_NONE)) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, (config.shootEffect or CONST_ANI_NONE)) local area = createCombatArea(config.area) setCombatArea(combat, area) setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, unpack(config.formula)) table.insert(spell.combats, combat) end function onCastSpell(cid, var) local k, v = getCreatureStorage(cid, 70001), getCreatureStorage(cid, 70002) if os.clock() > getCreatureStorage(cid, 70001) then doCombat(cid, spell.combats[1], var) doCreatureSetStorage(cid, 70001, os.clock() + 2) doCreatureSetStorage(cid, 70002, 2) return true end doCombat(cid, spell.combats[getCreatureStorage(cid, 70002)], var) doCreatureSetStorage(cid, 70001, os.clock() + 2) doCreatureSetStorage(cid, 70002, (getCreatureStorage(cid, 70002) == #spell.combats and 1 or (getCreatureStorage(cid, 70002) + 1))) return true end Toma. Eu fiz de uma forma que se o jogador use a magia em até dois segundos depois do último uso, crie o tal combo. Abraços.
  12. Eu cometi um erro extremamente grotesco quanto a query de busca no banco de dados. Agora está consertado. Abraços.
  13. http://www.xtibia.com/forum/topic/202336-search-item/
  14. Nome: Search Item Tipo: Talkaction Autor: Oneshot Essa é uma talkaction que percorre todo o banco de dados a procura de um certo item X e retorna uma lista dos jogadores, tanto online como offline que possuam esse item. data/talkactions/scripts/searchitem.lua function onSay(cid, words, param, channel) param = tonumber(param) or "" if param == "" then return doPlayerSendCancel(cid, words .." [itemid]") end local result = db.getResult("SELECT name, online FROM players WHERE id IN (SELECT player_id FROM player_items WHERE itemtype = ".. param ..");") local msg = "Resultados da busca pelo item ".. param .." em seu banco de dados:\n\n" if result:getID() ~= -1 then while true do local name = result:getDataString("name") local online = result:getDataInt("online") msg = msg .. name .." [".. (online == 1 and "Online" or "Offline") .."]\n" if not result:next() then break end end else msg = msg .. "O item não foi encontrado em nenhum jogador." end doShowTextDialog(cid, param, msg) return true end data/talkactions/talkactions.xml <talkaction words="/searchitem" access="5" event="script" value="searchitem.lua"/> Abraços
  15. Oneshot

    skill nova

    Hexadecimal só se você for editar o nome de uma skill no cliente, sources para criar uma nova junto com OTClient.
  16. No caso, não entendi o que diabos você quer. Uma função que manipule o attackspeed do jogador?
  17. Não. Não é possível. O máximo que você pode fazer é otimizar seu banco de dados para uma execução mais rápida, como este tutorial feito pelo Gustavo ensina: Otimizando Server Save - Limites Do Otserv (100% Linux)
  18. Seguinte, meu velho, você pode executar umas querys no seu banco de dados que apague casas de jogadores que já não entram mais. E também pode automatizar isso através de um globalevent. Vou deixar aqui as querys que você precisa executar, dependendo do seu tipo de banco de dados. SQLite UPDATE houses SET owner = 0 WHERE (strftime("%s") - (SELECT lastlogin FROM players WHERE id = houses.owner)) > (30 * 24 * 60 * 60) MySQL UPDATE houses SET owner = 0 WHERE (UNIX_TIMESTAMP() - (SELECT lastlogin FROM players WHERE id = houses.owner)) > (30 * 24 * 60 * 60) Abraços.
  19. toma ai kra, esperu q funcione aeol local positions = { {x = 100, y = 100, z = 7}, {x = 101, y = 100, z = 7}, {x = 102, y = 100, z = 7} } local stone = 1250 function onUse(cid, item, fromPosition, itemEx, toPosition) for _, position in ipairs(positions) do local tmp = getTileItemById(position, stone) if tmp.uid > 0 then doRemoveItem(tmp.uid, 1) else doCreateItem(stone, position) end end doTransformItem(item.uid, (item.itemid == 1945 and 1945 or 1945)) return true end so colokar aew eça linhas no seu actions.xml <action uniqueid="4444" event="script" value="arquivo.lua"/> e coloka ai a uniqueid no seu map editor na alavaanca
  20. Para efeito de aprendizado, até que o tutorial está muito interessante. Mas vale lembrar que qualquer tutorial completo que ensine a programar uma magia, ensinará também como funciona o sistema de áreas delas. Ou seja, seu tutorial acaba perdendo pontos por estar muito limitado a um sub-tema de um tema que podia ser melhor trabalhado. Abraços.
  21. local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat1, COMBAT_PARAM_BLOCKARMOR, TRUE) setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WEAPONTYPE) setCombatParam(combat1, COMBAT_PARAM_USECHARGES, TRUE) setCombatParam(combat1, COMBAT_PARAM_HITCOLOR, 215) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA) setCombatParam(combat1, COMBAT_PARAM_HITCOLOR, 215) setCombatFormula(combat1, COMBAT_FORMULA_SKILL, 2, 3, 0.5, 10) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat2, COMBAT_PARAM_BLOCKARMOR, TRUE) setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WEAPONTYPE) setCombatParam(combat2, COMBAT_PARAM_USECHARGES, TRUE) setCombatParam(combat2, COMBAT_PARAM_HITCOLOR, 215) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatParam(combat2, COMBAT_PARAM_HITCOLOR, 215) setCombatFormula(combat2, COMBAT_FORMULA_SKILL, 2, 3, 0.5, 13) local arr1 = { {0, 0, 0,}, {0, 2, 0,}, {0, 0, 0,}, {1, 0, 0,}, } local arr2 = { {0, 0, 0,}, {0, 2, 0,}, {1, 0, 0,}, {0, 0, 0,}, } local area1 = createCombatArea(arr1) local area2 = createCombatArea(arr2) setCombatArea(combat1, area1) setCombatArea(combat2, area2) local function onCastSpell1(parameters) doCombat(parameters.cid, parameters.combat1, parameters.var) end local function onCastSpell2(parameters) doCombat(parameters.cid, parameters.combat2, parameters.var) end local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, TRUE) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WEAPONTYPE) setCombatParam(combat, COMBAT_PARAM_USECHARGES, TRUE) setCombatParam(combat, COMBAT_PARAM_HITCOLOR, 215) setCombatParam(combat, COMBAT_PARAM_HITCOLOR, 215) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 2, 3, 0.5, 10) function onCastSpell(cid, var) return doCombat(cid, combat, var) end
  22. No weapons.xml do seu servidor. Troque essa parte: <!-- Ammunition --> <distance id="2545" event="script" value="poison_arrow.lua"/> <distance id="2546" event="script" value="burst_arrow.lua"/> <distance id="7366" event="script" value="viper_star.lua"/> <distance id="7838" type="energy" event="function" value="default"/> <distance id="7839" type="ice" event="function" value="default"/> <distance id="7840" type="fire" event="function" value="default"/> <distance id="7850" type="earth" event="function" value="default"/> <distance id="3965" level="20" event="function" value="default"/> <!-- Hunting Spear --> <distance id="7378" level="25" event="function" value="default"/> <!-- Royal Spear --> <distance id="7367" level="42" event="function" value="default"/> <!-- Enchanted Spear --> <distance id="7368" level="80" event="function" value="default"/> <!-- Assassin Star --> <distance id="7364" level="20" event="function" value="default"/> <!-- Sniper Arrow --> <distance id="7365" level="40" event="function" value="default"/> <!-- Onyx Arrow --> <distance id="7363" level="30" event="function" value="default"/> <!-- Piercing Bolt --> <distance id="2547" level="55" event="function" value="default"/> <!-- Power Bolt --> <distance id="6529" level="70" event="function" value="default"/> <!-- Infernal Bolt --> Por essa: <!-- Ammunition --> <distance id="2545" event="script" swing="true" value="poison_arrow.lua"/> <distance id="2546" event="script" swing="true" value="burst_arrow.lua"/> <distance id="7366" event="script" swing="true" value="viper_star.lua"/> <distance id="7838" type="energy" swing="true" event="function" value="default"/> <distance id="7839" type="ice" swing="true" event="function" value="default"/> <distance id="7840" type="fire" swing="true" event="function" value="default"/> <distance id="7850" type="earth" swing="true" event="function" value="default"/> <distance id="3965" level="20" swing="true" event="function" value="default"/> <!-- Hunting Spear --> <distance id="7378" level="25" swing="true" event="function" value="default"/> <!-- Royal Spear --> <distance id="7367" level="42" swing="true" event="function" value="default"/> <!-- Enchanted Spear --> <distance id="7368" level="80" swing="true" event="function" value="default"/> <!-- Assassin Star --> <distance id="7364" level="20" swing="true" event="function" value="default"/> <!-- Sniper Arrow --> <distance id="7365" level="40" swing="true" event="function" value="default"/> <!-- Onyx Arrow --> <distance id="7363" level="30" swing="true" event="function" value="default"/> <!-- Piercing Bolt --> <distance id="2547" level="55" swing="true" event="function" value="default"/> <!-- Power Bolt --> <distance id="6529" level="70" swing="true" event="function" value="default"/> <!-- Infernal Bolt -->
  23. Vocês que estão errados. Uma postagem em tópicos inativos a 30 dias que não acrescente nada ao tópico que é considerada flood. O usuário acima comentou, deu a opinião dele e reputou o criador do tópico, não vejo isso como flood. Vamos rever os conceitos, cambada. A propósito, hehe: local msg = "O nível %s precisa de %s pontos de experiência. Você ainda precisa de %s pontos de experiência." function onSay(cid, words, param, channel) local lv = getPlayerLevel(cid) + 1 local exp1, exp2 = getPlayerExperience(cid), getExperienceForLevel(lv) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, msg:format(lv, exp2, (exp2 - exp1))) return true end
  24. While é um loop, Repeat também é. Se um faz uma coisa, o outro também faz. local tabela = {1, 2, 3, 4} local n = 1 while n <= #tabela do print(tabela[n]) n = n + 1 end local n = 1 repeat print(tabela[n]) n = n + 1 until n > #tabela
  25. Então, cara, quando clonam itens todos os atributos são clonados. Execute a seguinte query: DELETE FROM player_items, player_depotitems, tile_items WHERE itemtype = 2400 OBS: Sem dar quebra-de-linha como a última query que você tentou executar Mudando o 2400 para o número do ID que você quer deletar. Essa query irá apagar TODOS os itens dos jogadores de um certo ID, mas depois você teria que devolver os itens para os jogadores legítimos que não clonaram. Abraços.
  • Quem Está Navegando   0 membros estão online

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