Ir para conteúdo
  • Cadastre-se

Posts Recomendados

 

PokeDash by Pota 
TFS 1.2

OTCV8

 

Dialogue Module

 

Hello everyone, would anyone be able to help me improve this dialogue system?

When I have a lot of text, it expands, and there's a write effect. I made this primarily for myself, but you can also benefit from it.

The problem is that if there's a lot of text, the window doesn't layout as I intended, specifically regarding the buttons. They get cut off, and I'd like the window to adjust its size based on the amount of text and buttons. For example, if there are 3 buttons, the window should not cut them off but should expand, adding a few pixels at the bottom to display the buttons correctly.

Additionally, I've implemented a feature in the code to display items in the center if they are required for quests or anything an NPC might ask from the player. I'd like to make sure this feature also adapts correctly to the window size.

Perhaps there is an expert in the OTC module who could guide me or correct and remove unnecessary code that I've written and is not needed. I must admit that I'm not a very skilled developer in OTC, but I managed to accomplish something. If someone can help me, I can share this dialogue system. (Modified version of Gengo)

Some screens:
https://imgur.com/4TJ5ZxE
https://imgur.com/Wryl5Rd
https://imgur.com/jTvI1Dj
https://imgur.com/7oIm9lM



LUA:

local npcWindowDialog 
local buttonHolder
local lblTitle
local outfitBox
local panelMsg
local scrollPanel
local lblMessage
local LabelText
local itemBox
local buttondialog
local fadeOutEvent = nil
local initialHeight = 200

function init()
  connect(g_game, { onGameEnd = offline })
  connect(LocalPlayer, { onPositionChange = onCreaturePositionChange })
	
  ProtocolGame.registerExtendedOpcode(80, function(protocol, opcode, buffer)
    print("Received extended opcode data: " .. buffer) 
    local data = json.decode(buffer)
    if (data.action == "close") then
      offline()
    elseif (data.action == "create") then
      NpcDialog(data.data)
    end
  end)
	
  npcWindowDialog = g_ui.displayUI('npcdialog')
	
  buttonHolder = npcWindowDialog:getChildById('buttonHolder')
  lblTitle     = npcWindowDialog:getChildById('lblTitle')
  scrollPanel  = npcWindowDialog:getChildById('scrollPanel')
  panelMsg     = npcWindowDialog:getChildById('panelMsg')
  outfitBox    = npcWindowDialog:getChildById('outfitBox')
  itemBox      = npcWindowDialog:getChildById('itemBox')
  buttondialog      = npcWindowDialog:getChildById('buttondialog')
  lblMessage   = g_ui.createWidget('LabelText', panelMsg)
end

function terminate()
  disconnect(g_game, { onGameEnd = offline })
  disconnect(Creature, {	onPositionChange = onCreaturePositionChange })
  ProtocolGame.unregisterExtendedOpcode(80)
  removeEvent(npcWindowDialog.fadeEvent)
  npcWindowDialog:destroy()
end


function clearItemBox()
  itemBox:destroyChildren()
end

function offline()
  clearItemBox()
  buttondialog:destroyChildren()
  npcWindowDialog:hide()
  npcWindowDialog:setHeight(initialHeight)
  if fadeOutEvent then
    removeEvent(fadeOutEvent)
  end
end

function onCreaturePositionChange(creature, newPos, oldPos)
  if creature:isLocalPlayer() then
    clearItemBox()
	npcWindowDialog:setHeight(initialHeight)
    npcWindowDialog:hide()

  end
end

function openDialog()
  npcWindowDialog:raise()
  npcWindowDialog:show()
  npcWindowDialog:setOpacity(0)
  npcWindowDialog:setHeight(initialHeight)
  g_effects.fadeIn(npcWindowDialog, 150)
  if fadeOutEvent then
    removeEvent(fadeOutEvent)
  end
  fadeOutEvent = scheduleEvent(function() g_effects.fadeOut(npcWindowDialog, 150) end, 30000)
end

function writeTextEffect(lblMessage, text, delay, callback)
  lblMessage:clearText() 
  local textSize = #text 
  local initialHeight = npcWindowDialog:getHeight()
  
  for i = 1, textSize do
    scheduleEvent(function() 
      lblMessage:setText(lblMessage:getText() .. text:sub(i, i))

      local newHeight = initialHeight + lblMessage:getTextSize().height 

      npcWindowDialog:setHeight(newHeight)
    end, delay * i)
  end
end

function NpcDialog(value)
  clearItemBox()
  local Npc = g_map.getCreatureById(value.npcId)
  
  lblTitle:setText(Npc:getName())
  outfitBox:setOutfit(Npc:getOutfit())
  
  lblMessage:clearText()
  writeTextEffect(lblMessage, tr(value.message), 15)
  scrollPanel:setVisible(lblMessage:getTextSize().height > panelMsg.limitText)
  
  local textLength = string.len(value.message)
  local windowHeight = textLength * 10 

  if value.items ~= nil then
    local itemHeight = 10 
    windowHeight = windowHeight + (#value.items * itemHeight)
  end

  local maxHeight = 800 
  if windowHeight > maxHeight then
    windowHeight = maxHeight
  end
  npcWindowDialog:setHeight(windowHeight) 

  if value.items ~= nil then
    for _, itemId in ipairs(value.items) do
      local item = g_ui.createWidget('Item', itemBox)
      item:setItemId(itemId)
    end
  end
  buttondialog:destroyChildren()  
  if value.options ~= '' then
    local option = value.options:split('&')

    for i = 1, #option do
      local button = g_ui.createWidget('OptionButton', buttondialog)
      button:setText(tr(option[i]))
      button:setWidth(500) 
      button:setHeight(150)
      button:setVisible(false)
      button.onClick = function() 
        g_game.talkChannel(MessageModes.NpcTo, 0, option[i]) 
        npcWindowDialog:setHeight(initialHeight)
        button:setVisible(false)
      end
    end
    buttondialog:setHeight(#option > 25 and 88 or 25)
    scheduleEvent(function() 
      for i, child in ipairs(buttondialog:getChildren()) do
        child:setVisible(true)
        g_effects.fadeIn(child, 500) 
      end
    end, (#value.message * 8) + 500)
  end
  
  openDialog()
end



OTUI:
 

LabelText < Label
  padding-bottom: 5
  font: sans-bold-16px
  color: #e8c05e
  text-wrap: true
  text-auto-resize: true

OptionButton < UIButton
  image-source: /images/ui/buttondialog
  image-repeated: true
  text-offset: 0 1
  change-cursor-image: true
  cursor: pointer

  $pressed:
    image-color: #dfdfdf44

  $disabled:
    image-color: #dfdfdf55
    change-cursor-image: false

UIWindow
  id: npcWindowDialog
  size: 690 381
  visible: false
  focusable: false
  image-source: window

  image-repeated: false
  anchors.centerIn: parent
  @onEscape: modules.game_npcdialog.offline()

  Label
    id: lblTitle
    font: sans-bold-16px
    anchors.top: parent.top
    anchors.left: parent.left
    !text: tr('Title')
    margin: 18 0 5 25
    color: #e8c05e
    text-auto-resize: true

  UICreature
    id: outfitBox
    size: 58 58
    anchors.top: prev.bottom
    anchors.left: parent.left
    margin: 20 0 5 34

  VerticalScrollBar
    id: scrollPanel
    height: 65
    anchors.top: panelMsg.top
    anchors.left: panelMsg.right
    anchors.bottom: panelMsg.bottom
    pixels-scroll: true
    step: 14
    margin-left: 5
    visible: false

  ScrollablePanel
    id: panelMsg
    size: 0 60
    anchors.top: lblTitle.bottom
    anchors.left: outfitBox.right
    anchors.right: parent.right
    margin: 8 30 10 25
    vertical-scrollbar: scrollPanel
    layout: verticalBox
    &limitText: 80

  UIItem
    id: itemBox
    size: 50 50
    anchors.horizontalCenter: parent.horizontalCenter
    anchors.top: panelMsg.bottom
    layout:
      type: horizontalBox
      cell-size: 50 50
      cell-spacing: 12
      num-columns: 10
      fit-children: true

  UIScrollArea
    id: buttondialog
    anchors.top: itemBox.bottom
    anchors.left: parent.left
    anchors.right: parent.right
    margin: 15 10 25 10

    layout:
      type: grid
      cell-size: 500 42
      flow: true
      fit-children: true


 

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 braianlomas
      Como faço para corrigir esse problema para meu cliente, eu uso o tfs 0.3.6  
      Quero resolver esse problema que tenho no meu cliente, como e onde posso resolver?  
      Eu uso o tfs 0.3.6, não tenho as fontes do cliente, se você puder me dar eu vou amá-las para sempre  
       

       
    • Por A.Mokk
      Ola pessoal, estou tentando compilar o TFS 1.5 Downgrade para 8.60 atraves do MSVC 2022, ao tentar compilar da o seguinte erro:
       
       
      Fiz o download do MSVC, GitDash, TFS-SDK-3.2, e de varios boosts que tentei, ao fazer o seguinte procedimento no GitDash:
       
      Ao chegar em ./bootstrap-vcpkg.bat o GitDash nao consegue realizar o procedimento corretamente, alguem poderia me ajudar ?

      Tentei de diversas formas mas o mesmo erro sempre persiste, atualmente meu servidor utiliza TFS 0.4, consigo compilar sem nenhum problema no MSVC 2010, porem, as limitações do TFS 0.4 estão me fazendo precisar atualizar, se alguem souber como corrigir esses erros eu agradeço !

      Tutoriais utilizados :
      Compiling on Windows (vcpkg) · otland/forgottenserver Wiki · GitHub
      Compiling on Windows · otland/forgottenserver Wiki · GitHub
      Compilando TFS 1.3 com vídeo-aula - Tutoriais Infraestrutura & Proteção - Tibia King - Tudo sobre Tibia, OTServ e Bots!
      Compilar TFS 1.3 Vcpkg - Tutoriais Infraestrutura & Proteção - Tibia King - Tudo sobre Tibia, OTServ e Bots!
       
      O que acontece no Powershell:
       
    • Por thunmin
      .Qual servidor ou website você utiliza como base? 
      Canary 2.3.6
      Qual o motivo deste tópico? 
      Queria fazer com que os players não pudessem mexer no aleta sio, pois, agora os mesmos estão conseguindo mexer nos itens
      Está surgindo algum erro? Se sim coloque-o aqui. 
       
      Você tem o código disponível? Se tiver publique-o aqui: 
         
      Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui. 
       
    • Por thunmin
      .Qual servidor ou website você utiliza como base? 
      canary para o cliente 13.16
      Qual o motivo deste tópico? 
      Não consigo encontrar onde ajusta
      to com o problema no 13.16  o exausted, por exemplo os kinas era pra combar exori, erori gran e exori min, porém não ta indo ta dando exausted o char ta soltando magia ou runa e não consegue usar as potions
      Está surgindo algum erro? Se sim coloque-o aqui. 
       
      Você tem o código disponível? Se tiver publique-o aqui: 
         
      Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui. 
       
    • Por Andersontatuador
      Olá galera da TK, me chamo Anderson estou procurando alguém profissional em otservs e site.
      Já tenho um servidor o site e o cliente preciso só de uma pessoal competente, que esteja empenhado a trabalhar,
      não quero nada de graça, pois nessa onda fui mais roubado do quer eu pagar um profissional.
      caso alguém se interesse entrar em contato comigo através do whatsapp
      82 9 9304-9462
       
      Está surgindo algum erro? Se sim coloque-o aqui. 
       
      Você tem o código disponível? Se tiver publique-o aqui: 
         
      Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui. 
       
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo