Ir para conteúdo
  • Cadastre-se

Derivado Criar novas vocations no WOP server


Posts Recomendados

Estou tentando adicionar novas vocations no server World of Piece v2, porém nao estou coseguindo...
Estou adicionando a vocation no xml/vocations, e criando normalmente pelo account manager. 
Mas quando clico para mudar de outfit sempre está a outfit do "Sanji"... 
Ficarei mto grato por qualquer suporte!  Valeu!!

Link para o post
Compartilhar em outros sites
1 hora atrás, mezuf disse:

Estou tentando adicionar novas vocations no server World of Piece v2, porém nao estou coseguindo...
Estou adicionando a vocation no xml/vocations, e criando normalmente pelo account manager. 
Mas quando clico para mudar de outfit sempre está a outfit do "Sanji"... 
Ficarei mto grato por qualquer suporte!  Valeu!!

Man, quando você da look na vocation mostra o nome que você colocou ? ou mostra None ?

Link para o post
Compartilhar em outros sites

UP, o verdadeiro problema que descobri é que as vocations tem suas respectivas outfits normais, mas qndo a vocation é acima de 10 ela começa do 1...
Por exemplo: Vocation 1 = Sanji, sua outfit é 424

 

                           ... até vocation 10 normal ..

 

a partir da vocation 11 começa meu problema...
                     Vocation 11 = Buggy, sua outfit era pra ser a 9, porém copia a do sanji(424)

O que me parece é que ele usa o ultimo número para "ler" a outfit... se fosse vocation 12 ele copiaria o 2 no caso.

No script tem uma função index, tentei mecher mas não cheguei em nada pois não sei direito como funcina mesmo lendo varias vezes.

Segue o script e agradeço qualquer ajuda!

--------------------------------------------------------------------------------
-- Se falso, gm fica com outfit de player normal, incluindo as transformacoes. Costumo desativar so pra testar as magias
ATIVAR_GM_OUTFIT_ON_LOGIN = not getConfigValue('SERVER_MODO_DE_TESTES')
--------------------------------------------------------------------------------

CONST_GAMEMASTER_OUTFIT       = 57     -- 220 (antigo

CONST_OUTFIT_SANJI            = 424
CONST_OUTFIT_SANJI_ADDON      = 425
CONST_OUTFIT_SANJI_FIRE       = 485
CONST_OUTFIT_SANJI_FIRE_ADDON = 486

CONST_OUTFIT_LUFFY_KID        = 65
CONST_OUTFIT_LUFFY_KID_ROSA   = 65
CONST_OUTFIT_LUFFY            = 350
CONST_OUTFIT_LUFFY_ROSA       = 372
CONST_OUTFIT_LUFFY_GORDO      = 270
CONST_OUTFIT_LUFFY_GORDO_ROSA = 271 

CONST_OUTFIT_LUFFY_2            = 420
CONST_OUTFIT_LUFFY_2_ROSA       = 60
CONST_OUTFIT_LUFFY_2_GORDO      = 61
CONST_OUTFIT_LUFFY_2_GORDO_ROSA = 62

CONST_OUTFIT_SMOKER         = 8
CONST_OUTFIT_SMOKER_SMOKE   = 92
CONST_OUTFIT_SMOKER_2       = 96
CONST_OUTFIT_SMOKER_2_SMOKE = 94 

OUTFIT_LIST = {
  [1]  = {424, 425}, -- sanji 
  [2]  = {350, 420}, -- luffy 
  [3]  = {422, 423}, -- zoro
  [4]  = {362, 428}, -- ace
  [5]  = {339, 427}, -- usopp
  [6]  = {341, 421}, -- nami
  [7]  = {323, 473, 474}, -- chopper
  [8]  = {8, 96}, -- smoker
  [11]  = {400}, --buggy
}

OUTFIT_PRICE = {
  [1] = {15},
  [2] = {15},
  [3] = {15},
  [4] = {15},
  [5] = {15},
  [6] = {15},
  [7] = {5},
  [8] = {15},
  [11] = {15},
}

--------------------- Gerar automatico tabela do que voc é determinado outfit
OUTFIT_IS_ALLOWED = {} -- [outfit_id] = voc_base, 
for voc, outfits in pairs(OUTFIT_LIST) do
  for _, outfit_id in pairs(outfits) do
    OUTFIT_IS_ALLOWED[outfit_id] = voc
  end
end
---------------------
OUTFIT_PURCHASE_MANAGER = {
  LIST = function (cid)
    local base_voc = getPlayerBaseVocation(cid)
    --if base_voc == 7 then -- chopper
    --  local transf = getPlayerStorageValue(cid, STORAGE_CHOPPER_TRANSFORMATION) 
    --  return (OUTFIT_LIST[base_voc] or {})[transf] or {}
    --end
    return OUTFIT_LIST[base_voc] or {}
  end,
  GET_PRICE = function (cid, index)
    return OUTFIT_PRICE[getPlayerBaseVocation(cid)][index - 1]
  end,
  PURCHASE = function (cid, index)
    local price = OUTFIT_PRICE[getPlayerBaseVocation(cid)][index - 1]
    if not price then
      doPlayerSendCancel(cid, "[ERROR] INVALID OUTFIT")
      return false
    end
    return doPlayerRemoveItem(cid, ITEM_VIP_COIN, price)
  end,
  ADD = function (cid, index) -- index da outfit_list
    if index == 1 then
      return true
    end
    if index < 1 or index > 10 then
      return false
    end
    setPlayerStorageValue(cid, STORAGE_PURCHASE_OUTFIT_BASE + index, 1)
  end,
  HAS = function (cid, index)
    if index < 1 or index > 10 then
      return false
    end
    return index == 1 and true or getPlayerStorageValue(cid, STORAGE_PURCHASE_OUTFIT_BASE + index) == 1 
  end,
  HAS_OUTFIT = function (cid, id_outfit)
    local outfits = OUTFIT_LIST[getPlayerBaseVocation(cid)] or {}
    for index, outfit in pairs(outfits) do
      if id_outfit == outfit and OUTFIT_PURCHASE_MANAGER.HAS(cid, index) then
        return true
      end
    end
    return false
  end,
}

TABLE_VOCATION_OUTFIT = {
  [1]  = 424, -- sanji 
  [2]  = 350, -- luffy 
  [3]  = 422, -- zoro
  [4]  = 362, -- ace
  [5]  = 339, -- usopp
  [6]  = 341, -- nami
  [7]  = 323, -- chopper
  [8]  = 8,   -- smoker
  [11] = 400  -- buggy
}
local TABLE_LUFFY_NORMAL_OUTFIT = -- convert normal to pink
{
  [CONST_OUTFIT_LUFFY]       = CONST_OUTFIT_LUFFY_ROSA, 
  [CONST_OUTFIT_LUFFY_KID]   = CONST_OUTFIT_LUFFY_KID_ROSA,  
  [CONST_OUTFIT_LUFFY_GORDO] = CONST_OUTFIT_LUFFY_GORDO_ROSA,
}
local TABLE_LUFFY_PINK_OUTFIT =  -- convert pink to normal 
{
  [CONST_OUTFIT_LUFFY_ROSA]       = CONST_OUTFIT_LUFFY,
  [CONST_OUTFIT_LUFFY_KID_ROSA]   = CONST_OUTFIT_LUFFY_KID,
  [CONST_OUTFIT_LUFFY_GORDO_ROSA] = CONST_OUTFIT_LUFFY_GORDO,
}
--------------------------------------------------------------------------------
local TABLE_TRANSFORMATION_OUTFITS = {
  [CONST_OUTFIT_LUFFY_ROSA] = {
    [CONST_OUTFIT_LUFFY]         = CONST_OUTFIT_LUFFY_ROSA,   
    [CONST_OUTFIT_LUFFY_GORDO]   = CONST_OUTFIT_LUFFY_GORDO_ROSA,
    [CONST_OUTFIT_LUFFY_2]       = CONST_OUTFIT_LUFFY_2_ROSA,
    [CONST_OUTFIT_LUFFY_2_GORDO] = CONST_OUTFIT_LUFFY_2_GORDO_ROSA,
  },
  [CONST_OUTFIT_LUFFY] = {
    [CONST_OUTFIT_LUFFY_ROSA]         = CONST_OUTFIT_LUFFY,
    [CONST_OUTFIT_LUFFY_GORDO_ROSA]   = CONST_OUTFIT_LUFFY_GORDO,
    [CONST_OUTFIT_LUFFY_2_ROSA]       = CONST_OUTFIT_LUFFY_2,
    [CONST_OUTFIT_LUFFY_2_GORDO_ROSA] = CONST_OUTFIT_LUFFY_2_GORDO,
  },
  [CONST_OUTFIT_LUFFY_GORDO] = {
    [CONST_OUTFIT_LUFFY]        = CONST_OUTFIT_LUFFY_GORDO, 
    [CONST_OUTFIT_LUFFY_ROSA]   = CONST_OUTFIT_LUFFY_GORDO_ROSA,
    [CONST_OUTFIT_LUFFY_2]      = CONST_OUTFIT_LUFFY_2_GORDO, 
    [CONST_OUTFIT_LUFFY_2_ROSA] = CONST_OUTFIT_LUFFY_2_GORDO_ROSA,
  },
  [CONST_OUTFIT_LUFFY_2] = {
    [CONST_OUTFIT_LUFFY]            = CONST_OUTFIT_LUFFY_2,
    [CONST_OUTFIT_LUFFY_ROSA]       = CONST_OUTFIT_LUFFY_2_ROSA,
    [CONST_OUTFIT_LUFFY_GORDO]      = CONST_OUTFIT_LUFFY_2_GORDO,
    [CONST_OUTFIT_LUFFY_GORDO_ROSA] = CONST_OUTFIT_LUFFY_2_GORDO_ROSA,
  },
  [CONST_OUTFIT_SMOKER_SMOKE] = {
    [CONST_OUTFIT_SMOKER]   = CONST_OUTFIT_SMOKER_SMOKE,
    [CONST_OUTFIT_SMOKER_2] = CONST_OUTFIT_SMOKER_2_SMOKE,
  },
  [CONST_OUTFIT_SANJI_FIRE] = {
    [CONST_OUTFIT_SANJI]       = CONST_OUTFIT_SANJI_FIRE,
    [CONST_OUTFIT_SANJI_ADDON] = CONST_OUTFIT_SANJI_FIRE_ADDON,
  },
}

local OUTFIT_MANAGER_UIDS   = {} -- [ [{id :: Int, time :: Int}] ]
local OUTFIT_MANAGER_EVENTS = {} -- [Int] -- salva os addevent

-- luffy
--     luffy rosa 30.000 
--         luffy gordo 5.000

local function __private__update_outfit_manager(cid, remove)
    if not isPlayer(cid) then
      --print("NOT PLAYER KRA K K K")
      return false
    end
    local outfits = OUTFIT_MANAGER_UIDS[cid] or {}
    if #outfits == 0 and not remove then
      --print("JA TA OK rsrsrsrs")
      return true
    end
    
    -- Procurar o outfit temporario que acaba primeiro, e sera esse o tempo de addEvent
    local time = nil
    for index, outfit in pairs(outfits) do
      if os.time() > outfit.time then
        table.remove(OUTFIT_MANAGER_UIDS[cid], index)
        --print("AGORA COM: " .. #OUTFIT_MANAGER_UIDS[cid])
        if outfit.reset_on_end then
          OUTFIT_MANAGER_UIDS[cid] = {}
          doRemoveCondition(cid, CONDITION_OUTFIT)
          setPlayerStorageValue(cid, STORAGE_IS_IN_TRANSFORMATION, -1)
          if isChopper(cid) then
            setPlayerStorageValue(cid, STORAGE_CHOPPER_TRANSFORMATION, 1)
            local DLL = DLLClass:new(cid)
            :addTransformation(1)
            :send()
          end
          --print(">>REMOVI K K K K K END")
          return true
        end
      else
        if not time or outfit.time - os.time() < time then
          time = outfit.time - os.time()
        end 
      end
    end
    
    -- Reatualiza o outfit
    local last_outfit = getCreatureDefaultOutfit(cid).lookType
    for index, outfit in pairs(outfits) do
      last_outfit = (TABLE_TRANSFORMATION_OUTFITS[outfit.id] or {})[last_outfit] or outfit.id
    end
    doSetCreatureOutfit(cid, {lookType = last_outfit}, -1)
    if time then    
      --print("DAKI A " .. time)
      addEvent(__private__update_outfit_manager, time, cid)
    else
      --print("FLW OTARIOS")
      doRemoveCondition(cid, CONDITION_OUTFIT)
      setPlayerStorageValue(cid, STORAGE_IS_IN_TRANSFORMATION, -1)
      OUTFIT_MANAGER_EVENTS[cid] = nil
    end
  end

OUTFIT_MANAGER = {
  get_last_outfit = function (cid)
    local outfits = (OUTFIT_MANAGER_UIDS[cid] or {})
    if #outfits > 0 then
      return outfits[#outfits].id
    else
      return getCreatureOutfit(cid).lookType
    end
  end,
  remove = function (cid, removed_looktype)
    -- Remove 
    OUTFIT_MANAGER_UIDS[cid] = table.filter(OUTFIT_MANAGER_UIDS[cid] or {}, function (_, looktype) return looktype.id ~= removed_looktype end)
    -- Parar algum evento caso exista e adicionar novamente
    if OUTFIT_MANAGER_EVENTS[cid] then
      stopEvent(OUTFIT_MANAGER_EVENTS[cid])
    end
    OUTFIT_MANAGER_EVENTS[cid] = addEvent(__private__update_outfit_manager, 0, cid, true)
  end,
  change = function (cid, id_outfit, time, is_real, is_chopper_transformation) -- is_real somente para os outfits que trocam pelo `Set Outfit`
    if not id_outfit then             
      return print('[ERROR] OUTFIT_MANAGER.change ~ Invalid id_outfit') and false
    elseif not time then
      return print('[ERROR] OUTFIT_MANAGER.change ~ time must be a non nil value') and false 
    end
    if is_real then
      doCreatureChangeOutfit(cid, {lookType = id_outfit})
    else
      setPlayerStorageValue(cid, STORAGE_IS_IN_TRANSFORMATION, 1)
      if is_chopper_transformation then
        OUTFIT_MANAGER_UIDS[cid] = {}
      else
        OUTFIT_MANAGER_UIDS[cid] = OUTFIT_MANAGER_UIDS[cid] or {}
      end         
      --print("AGORA: " .. os.time())
      local transformation_table = {id = id_outfit, time = os.time() + time - 1, reset_on_end = is_chopper_transformation}
      local found = table.filterFind(OUTFIT_MANAGER_UIDS[cid], function (_, value) return value.id == id_outfit end)
      if found then
        OUTFIT_MANAGER_UIDS[cid][found.index] = transformation_table
      else
         table.insert(OUTFIT_MANAGER_UIDS[cid], transformation_table)
      end
    end
    -- Parar algum evento caso exista e adicionar novamente
    if OUTFIT_MANAGER_EVENTS[cid] then
      stopEvent(OUTFIT_MANAGER_EVENTS[cid])        
    end
    OUTFIT_MANAGER_EVENTS[cid] = addEvent(__private__update_outfit_manager, 0, cid)
  end,
}
 

 

Editado por mezuf (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Conteúdo Similar

    • Por LeoTK
      Salve galera neste tópico irei postar algumas prints do mapa do servidor para quem queira acompanhar e quem sabe até utilizar de inspiração para mapear o seu NTO.
       
      #Att 11/08/2022

       
       
       
       
      Konoha (Em Desenvolvimento)
       
       
       
       
    • Por DiigooMix
      Como o título já diz, será que alguém possui sprite do hitto e se possível as transformações dele?
    • Por OmegaZero
      Olá gostaria que alguém me ajudasse com uma "scripting" não sei se é pela mesma, seria o seguinte uma determinada arma teria a chance de dar double hit e não sei oque fazer alguem poderia ajudar?

      OBS:não sei se é o local correto se não for mova, desculpe
    • Por Madarasenju
      Olá galera do Tibia King, queria por uns npc's no meu server que não tem função de trade nem nada do tipo, queria que eles só andassem como enfeite, Rep+ Pra quem me ajudar... grato desde já.
    • Por SilenceRoot
      A magia é assim o você usa a a magia e ela ficará ativado por 10 segundos, até que o inimigo lance a primeira magia ou todos de uma vez, quando ele lançar a primeira magia, ele não lhe acertará ou seja esquivando dela, e logo em seguida será teletransportado aleatoriamente ao redor do inimigo que usou.
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo