Jump to content

PACI

Members
  • Posts

    70
  • Joined

  • Last visited

Recent Profile Visitors

1,269 profile views

PACI's Achievements

Newbie

Newbie (1/14)

130

Reputation

  1. PACI

    Skill P

    when 1.use or 2.use or 3.use or 4.use or 5.use -- IDs de todos os restantes livros -- Segue o esquema begin -- Classe da personagem local class = pc.get_job() + 1 -- Grupo de habilidade local skill_group = pc.get_skill_group() -- A personagem não tem qualquer grupo de habilidade if skill_group < 1 then return end -- Tabela que determina quais livros podem ser lidos -- por uma determinada classe e grupo. Preencher com -- o vnum dos itens local available_skill_books = { -- Guerreiro { -- Corpo {1, 2, 3, 4, 5, 6}, -- Mental {16, 17, 18, 19, 20, 21}, }, -- Ninja { -- Adagas {1, 2, 3, 4, 5, 6}, -- Arco {16, 17, 18, 19, 20, 21}, }, -- Sura { -- Armas {1, 2, 3, 4, 5, 6}, -- Magias {16, 17, 18, 19, 20, 21}, }, -- Shaman { -- Dragão {1, 2, 3, 4, 5, 6}, -- Cura {16, 17, 18, 19, 20, 21}, }, } -- Obter os livros que esta personagem pode ler local my_skill_books = available_skill_books[class][skill_group] -- Comprovar que o livro usado pode ser lido -- por esta personagem for _, vnum in ipairs(my_skill_books) do if vnum ~= item.get_vnum() then syschat("Este livro não pode ser lido por ti.") return end end -- Obter o vnum da habilidade. Deve ser introduzida no value0 (item_proto.txt) local skill_vnum = item.get_value(0) -- Magia! syschat("Habilidade treinada com sucesso.") pc.set_skill_level(skill_vnum, 40) end É um método escrito bem rapido e que podes utilizar como base. Acho que é facil de compreender o que está escrito. Os valores utilizados são exemplificativos.
  2. Boas. Apesar de já quase ter passado 1 semana desde este tópico, queria salientar que na condição anteriormente postada é necessário verificar se pDungeon é um LPDUNGEON ou NULL pointer antes de chamar a função GetFlag(). Mesmo sendo algo que se subentenda, vale a pena relembrar.
  3. LPDUNGEON pDungeon = pAttacker->GetDungeon(); if (pDungeon->GetFlag("whatever") == X){ // do something }
  4. O loop irá correr todas as funções dentro dessa condição e só serão executadas de novo quando a execução anterior terminar. Pelo que: não, não irão haver janelas sobrepostas.
  5. Falta atualizares a variável haveItem quando removido 1 item do jogador, caso contrário o seu valor será constante (atribuido no inicio).
  6. PACI

    Admin Whisper

    Falta uma aspa para fechar o game.get_event_flag(). É interessante. Eu utilizaria um ficheiro externo, possibilitando, assim, o update e envio em tempo real das mensagens (evitando os reloads e restarts - aka casos urgentes).
  7. Default: Inglês. Selecionar no login (guardar no locale.cfg) - lembrar de dar reload aos modulos locale quando selecionado um novo idioma - e no handshake enviar o idioma escolhido para o servidor atualizar os dados do user (assim como o novo idioma). Podes adicionar também o item_names.txt do servidor no client, e fazer com que este o carregue no momento em que os outros locale/*.txt são carregados (deste modo podes continuar a utilizar a função item.GetItemName() sem grandes alterações no python). In-game podes optar por meter opção no Game Options, enviar um packet a pedir a mudança. Pela parte do servidor, ler vários locale_strings diferentes; e a parte quest, tbh não causa problemas nenhuns. Este foi o planeamento e métodos que utilizei para desenvolver este sistema.
  8. Coloca o seguinte na zona dos table.insert() e vê o que te dá. say("debug - pc cant enter: "..pc.get_name())
  9. ^this E deixa para aí a quest.
  10. Escrevi isto num instante. Se quiseres aprender a construir dungeons, esta é, a meu ver, uma base simples e facil de entender. quest my_simple_dungeon begin state start begin function setting() return { ["MAP_INDEX"] = 0, ["ENTRY_POS"] = {0, 0}, ["FLOORS"] = { {0, 0}, -- 1 {0, 0}, -- 2 -- etc }, ["TASKS"] = { {101, 20}, {102, 30}, -- etc }, -- etc } end function in_dungeon() local dunMapIdx = my_simple_dungeon.setting().MAP_INDEX return pc.get_map_index() >= dunMapIdx * 10000 and pc.get_map_index() < (dunMapIdx + 1) * 10000 end function join() local setting = my_simple_dungeon.setting() if party.is_party() then d.new_jump_party(setting.MAP_INDEX, setting.ENTRY_POS[1], setting.ENTRY_POS[2]) else d.join(setting.MAP_INDEX) end end when MY_DUNGEON_GUARDIAN.chat."Dungeon" begin say("Entrar?") if select("Y", "N") == 2 then return end my_simple_dungeon.join() end when login with my_simple_dungeon.in_dungeon() begin local setting = my_simple_dungeon.setting() if d.getf("level") == 0 then -- d.regen_file(".../regen_1.txt") -- d.spawn_mob(0, 0, 0) -- vnum, x, y d.notice("Mata "..setting.TASKS[1][2].." "..mob_name(setting.TASKS[1][1])) d.setf("level", 1) end end when kill with not npc.is_pc() and my_simple_dungeon.in_dungeon() begin local level = d.getf("level") local tasks = my_simple_dungeon.setting().TASKS if npc.get_race() ~= tasks[level][1] then return end local killCount = d.getf("kill_count") + 1 if killCount < tasks[level][2] then d.setf("kill_count", killCount) return end d.notice("Nivel "..level.." completo. 5 segundos para subir.") d.setf("kill_count", 0) server_timer("my_simple_dungeon_jump_timer", 5, d.get_map_index()) end when my_simple_dungeon_jump_timer.server_timer with d.select(get_server_timer_arg()) begin local setting = my_simple_dungeon.setting() local nextLevel = d.getf("level") + 1 local task = setting.TASKS[nextLevel] d.setf("level", nextLevel) d.notice("Mata "..task[2].." "..mob_name(task[1])) -- d.regen_file(".../regen_"..nextLevel..".txt") -- d.spawn_mob(0, 0, 0) -- vnum, x, y d.jump_all(setting.FLOORS[nextLevel][1], setting.FLOORS[nextLevel][2]) end end end
  11. verifica se o root do client desses jogadores está corrompido (falha no download, erro de extração?), oupede para removerem esse ficheiro e executarem o patcher. por outro lado, se usares cython não tem nada que andar à procura do system.py.
  12. PACI

    quest

    Aqui, count é uma tabela ou nil, nunca uma string ou número.
  13. -- Colocar no chat-trigger if not party.is_party() then say("sem grupo") return elseif not party.is_leader() then say("não és o líder") return end local canEnter = true local pids = {party.get_member_pids()} if table.getn(pids) < 4 then say("necessários 4 membros") return end for _, pid in ipairs(pids) do q.begin_other_pc_block(pid) if pc.get_level() < 40 then canEnter = false end q.end_other_pc_block() end if not canEnter then say("existem jogadores com nivel < 40") return end Entretanto, a função d.new_jump_party() cria uma nova dungeon instance do mapa escolhido (pelo index) e transporta todos os membros do grupo do jogador para as posições selecionadas. Dito isto, todas as funções dungeon colocadas depois desta, não irão funcionar. Isto porque nesse momento não existe nenhuma dungeon. Colocá-las num login-trigger (when login ... begin), faz com que corram perfeitamente.
×
×
  • Create New...