Ir para conteúdo

[Arquivado]X-Tibia Scripting Environment


joaohd

Posts Recomendados

Então... aqui estou novamente com mais um fruto de meus estudos em LUA.

 

Recentemente fui apresentado à um novo ambiente de programação em LUA, o wxLua. Bom, mas primeiro, devemos saber o que é o wxLua:

 

wxLua é um ambiente de programação LUA que tem como função principal a criação de uma interface gráfica para aplicação de scripts.

 

Abaixo segue um exemplo do que pode ser feito com o wxLua:

 

 

Obs: O script contém 352 linhas, podendo "bugar" o layout.

 

package.cpath = package.cpath..";./?.dll;./?.so;../lib/?.so;../lib/vc_dll/?.dll;../lib/bcc_dll/?.dll;../lib/mingw_dll/?.dll;" -- Socket
package.cpath = "?.dll" -- Socket
package.path = "?.lua" -- Socket
require "wx"


-----------------------------------------
-- Declaração dos ids usados no script --
-----------------------------------------

local ID_NEW    = wx.wxID_HIGHEST + 1
local ID_OPEN   = wx.wxID_HIGHEST + 2
local ID_SAVE   = wx.wxID_HIGHEST + 3
local ID_SAVEAS = wx.wxID_HIGHEST + 4
local ID_EXIT   = wx.wxID_HIGHEST + 5
local ID_CUT    = wx.wxID_CUT
local ID_COPY   = wx.wxID_COPY
local ID_PASTE  = wx.wxID_PASTE
local ID_UNDO   = wx.wxID_UNDO
local ID_REDO   = wx.wxID_REDO
local ID_FIND   = wx.wxID_FIND
local ID_SUBS   = wx.wxID_HIGHEST + 6
local ID_GOTO   = wx.wxID_HIGHEST + 7
local ID_FUNC   = wx.wxID_HIGHEST + 8
local ID_DEBUG  = wx.wxID_HIGHEST + 9
local ID_ABOUT  = wx.wxID_ABOUT

----------------------------------------------
-- Criação do espaço para escrita do código --
----------------------------------------------

local frame = wx.wxFrame(wx.NULL, wx.wxID_ANY, "X-Tibia Scripting environment", wx.wxDefaultPosition, wx.wxDefaultSize)
local panel = wx.wxPanel(frame, wx.wxID_ANY)
local mainSizer = wx.wxBoxSizer(wx.wxVERTICAL)
local script = wx.wxTextCtrl(panel, wx.wxID_ANY, "", wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxTE_MULTILINE)
local listSizer = wx.wxBoxSizer(wx.wxHORIZONTAL)
	listSizer:Add(script, 5, wx.wxALL+wx.wxEXPAND, 5)
	mainSizer:Add(listSizer, 5, wx.wxALL+wx.wxEXPAND, 5)
	panel:SetSizer(mainSizer)
	mainSizer:SetSizeHints(panel)


--------------------------------
-- Configurando a fonte usada --
--------------------------------
local font = wx.wxFont(10, wx.wxFONTFAMILY_MODERN, wx.wxFONTSTYLE_NORMAL, wx.wxFONTWEIGHT_NORMAL, false, "Andale Mono")
script:SetFont(font)


-----------------------------------
-- Adicionando os botões ao menu --
-----------------------------------

local menu = wx.wxMenuBar()
local arquivo = wx.wxMenu({
							{ID_NEW, "Novo\tCtrl+N", "Abre um novo arquivo"},
							{ID_OPEN, "Abrir\tCtrl+O", "Abre um script salvo"},
							{ },
							{ID_SAVE, "Salvar\tCtrl+S", "Salva o script ativo"},
							{ID_SAVEAS, "Salvar como...\tCtrl+Shift+S", "Salva o script como..."},
							{ },
							{ID_EXIT, "Sair\tCtrl+Q", "Encerra o programa"}
})

local editar = wx.wxMenu({
						{ID_CUT, "Recortar\tCtrl+X", "Recortar"},
						{ID_COPY, "Copiar\tCtrl+C", "Copiar"},
						{ID_PASTE, "Colar\tCtrl+V", "Colar"},
						{ },
						{ID_UNDO, "Desfazer\tCtrl+Z", "Desfaz a ação"},
						{ID_REDO, "Repetir\tCtrl+Y", "Refaz a ação"}
})

local ferramentas = wx.wxMenu({
							{ID_FUNC, "Funções\tF1", "Abre uma lista das funções existentes"},
							{ },
							{ID_DEBUG, "Executar\tF5", "Executa o script"}
})

local acerca = wx.wxMenu({
						{ID_ABOUT, "Sobre...\tF11", "Informações do aplicativo"}
})

menu:Append(arquivo, "Arquivo")
menu:Append(editar, "Editar")
menu:Append(ferramentas, "Ferramentas")
menu:Append(acerca, "Info")


----------------------------------
-- Adicionando ações aos botões --
----------------------------------

-- Botões do Menu Editar --
function OnUpdateUIEditMenu(event) -- enable if there is a valid focused editor
   local editor = script
   event:Enable(editor ~= nil)
end


function OnEditMenu(event)
   local menu_id = event:GetId()
   local editor = script
   if editor == nil then return end
   if     menu_id == ID_CUT       then editor:Cut()
   elseif menu_id == ID_COPY      then editor:Copy()
   elseif menu_id == ID_PASTE     then editor:Paste()
    elseif menu_id == ID_UNDO      then editor:Undo()
   elseif menu_id == ID_REDO      then editor:Redo()
   end
end


frame:Connect(ID_CUT, wx.wxEVT_COMMAND_MENU_SELECTED, OnEditMenu) -- Cortar --
frame:Connect(ID_CUT, wx.wxEVT_UPDATE_UI, OnUpdateUIEditMenu) -- Cortar --

frame:Connect(ID_COPY, wx.wxEVT_COMMAND_MENU_SELECTED, OnEditMenu) -- Copiar --
frame:Connect(ID_COPY, wx.wxEVT_UPDATE_UI, OnUpdateUIEditMenu) -- Copiar --

frame:Connect(ID_PASTE, wx.wxEVT_COMMAND_MENU_SELECTED, OnEditMenu) -- Colar --
frame:Connect(ID_PASTE, wx.wxEVT_COMMAND_BUTTON_CLICKED,
       function (event)
           local editor = script
           event:Enable(editor and (wx.__WXGTK__ or editor:CanPaste()))
       end) -- Colar --

frame:Connect(ID_UNDO, wx.wxEVT_COMMAND_MENU_SELECTED, OnEditMenu) -- Desfazer --
frame:Connect(ID_UNDO, wx.wxEVT_UPDATE_UI,
       function (event)
           local editor = script
           event:Enable(editor and editor:CanUndo())
       end) -- Desfazer --

frame:Connect(ID_REDO, wx.wxEVT_COMMAND_MENU_SELECTED, OnEditMenu) -- Refazer --
frame:Connect(ID_REDO, wx.wxEVT_UPDATE_UI,
       function (event)
           local editor = script
           event:Enable(editor and editor:CanRedo())
       end) -- Refazer --


-- Botões do Menu Arquivo --

-- Botão "novo" --
function GetEditor(selection)
   local editor = nil
   if selection == nil then
       selection = script:GetSelection()
   end
   if (selection >= 0) and (selection < script:GetPageCount()) then
       editor = script:GetPage(selection):DynamicCast("wxTextCtrl")
   end
   return editor
end

frame:Connect(ID_NEW, wx.wxEVT_COMMAND_MENU_SELECTED,
		function()
	if script:GetValue() ~= "" then
local saveFile = wx.wxFileDialog(frame, "Save file as",
                                      '',
                                      '',
                                      "Lua files (*.lua)|*.lua|",
                                      wx.wxSAVE)
	saveFile:ShowModal()
local handle = io.open(saveFile:GetPath(), "w")

	if saveFile:GetPath() == '' then return true end
		handle:write(script:GetValue())
		handle:close()
		SCRIPT_DIR = saveFile:GetPath()
		script:SetValue("")
		frame:SetStatusText("Untitled")
	else
		script:SetValue("")
		SCRIPT_DIR = nil
		frame:SetStatusText("Untitled")
	end
	end
	)


-- Botão "Abrir" --

function open(event)
	local openFile = wx.wxFileDialog(panel, "Open script", "", "", "Lua files (*.lua)|*.lua|Luai files (*.luai)|*.luai|System files (*.luas)|*.luas|", wx.wxOPEN + wx.wxFILE_MUST_EXIST)
	openFile:ShowModal()
	if openFile:GetPath() == '' then return end
	local handle = io.open(openFile:GetPath())
	if not handle then
		return wx.wxMessageBox("Cannot open script " .. openFile:GetPath())
	end
	script:SetValue(handle:read('*a'))
	SCRIPT_DIR = openFile:GetPath()
end
frame:Connect(ID_OPEN, wx.wxEVT_COMMAND_MENU_SELECTED, open)


-- Botão "Salvar Como" --
frame:Connect(ID_SAVEAS, wx.wxEVT_COMMAND_MENU_SELECTED,
function()
local saveFile = wx.wxFileDialog(frame, "Save file as",
                                      '',
                                      '',
                                      "Lua files (*.lua)|*.lua|",
                                      wx.wxSAVE)
	saveFile:ShowModal()
local handle = io.open(saveFile:GetPath(), "w")

	if saveFile:GetPath() == '' then return true end
		handle:write(script:GetValue())
		handle:close()
		SCRIPT_DIR = saveFile:GetPath()
end)


-- Botão Salvar --
frame:Connect(ID_SAVE, wx.wxEVT_COMMAND_MENU_SELECTED, -- Socket
function()
	if SCRIPT_DIR then
		local handle = io.open(SCRIPT_DIR, 'w')
		handle:write(script:GetValue())
		handle:close()
		return true
	end
	local saveFile = wx.wxFileDialog(frame, "Save file as",
                                      '',
                                      '',
                                      "Lua files (*.lua)|*.lua|Luai files(*.luai)|*.luai|System files (*.luas)|*.luas|",
                                      wx.wxSAVE)
	saveFile:ShowModal()
	local handle = io.open(saveFile:GetPath(), "w")
	if saveFile:GetPath() == '' then return true end
	handle:write(script:GetValue())
	handle:close()
	SCRIPT_DIR = saveFile:GetPath()
	return true
end)


-- Botão encerra programa --
function close(event)
	os.exit()
	panel:Close()
end

panel:Connect(ID_EXIT, wx.wxEVT_COMMAND_BUTTON_CLICKED, close)
frame:Connect(ID_EXIT, wx.wxEVT_COMMAND_MENU_SELECTED, close)


-- Botões Menu Ferramentas

-- Botão "Funções"
function showFunc(event)
local dialog = wx.wxDialog(frame, wx.wxID_ANY, "OpenTibia Library")
local txt = wx.wxTextCtrl(dialog, wx.wxID_ANY, "",
						wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxTE_MULTILINE)

local func = io.open("DATA/functions.lua")
			txt:SetFont(font)
			txt:SetValue(func:read('*a'))

local mainSizer = wx.wxBoxSizer(wx.wxVERTICAL)
local listSizer = wx.wxBoxSizer(wx.wxHORIZONTAL)
listSizer:Add(txt, 5, wx.wxALL+wx.wxEXPAND, 5)
mainSizer:Add(listSizer, 5, wx.wxALL+wx.wxEXPAND, 5)
dialog:SetSizer(mainSizer)
			dialog:ShowModal()
end




frame:Connect(ID_FUNC, wx.wxEVT_COMMAND_MENU_SELECTED, showFunc)

-- Botão executar script --
frame:Connect(ID_DEBUG, wx.wxEVT_COMMAND_MENU_SELECTED,
	function()
		local s, y = pcall(loadstring(script:GetValue()))
		a, i = loadstring(script:GetValue())
		if not s then
			print(i)
	end
end
)



-- Botões Menu "Acerca"

-- Botao "sobre" --
function DisplayAbout(event)
   local page = [[
       <html>
       <body bgcolor = "#FFFFFF">
       <table cellspacing = 4 cellpadding = 4 width = "100%">
           <tr>
           <td bgcolor = "#DCDCDC">
		<img src="DATA/Logo.jpg"><b> Tibia scripting environment</b>
           <p>
           <font size = 2>
               Visite: Xtibia.com<br>
           </font><font size = 1>
			Versão 1.0
		</font>
           </td>
         </tr>
       </table>
       </body>
       </html>
   ]]

   local dlg = wx.wxDialog(frame, wx.wxID_ANY, "Acerca do X-Tibia Scripting Environment")

   local html = wx.wxLuaHtmlWindow(dlg, wx.wxID_ANY,
                                   wx.wxDefaultPosition, wx.wxSize(360, 150),
                                   wx.wxHW_SCROLLBAR_NEVER)
   local line = wx.wxStaticLine(dlg, wx.wxID_ANY)
   local button = wx.wxButton(dlg, wx.wxID_OK, "OK")

   button:SetDefault()

   html:SetBorders(0)
   html:SetPage(page)
   html:SetSize(html:GetInternalRepresentation():GetWidth(),
                html:GetInternalRepresentation():GetHeight())

   local topsizer = wx.wxBoxSizer(wx.wxVERTICAL)
   topsizer:Add(html, 1, wx.wxALL, 10)
   topsizer:Add(line, 0, wx.wxEXPAND + wx.wxLEFT + wx.wxRIGHT, 10)
   topsizer:Add(button, 0, wx.wxALL + wx.wxALIGN_RIGHT, 10)

   dlg:SetAutoLayout(true)
   dlg:SetSizer(topsizer)
   topsizer:Fit(dlg)

   dlg:ShowModal()
   dlg:Destroy()
end

frame:Connect(ID_ABOUT, wx.wxEVT_COMMAND_MENU_SELECTED, DisplayAbout)



-- Criação do ambiente
frame:SetMenuBar(menu)
frame:CreateStatusBar(1)
frame:SetStatusText("Untitled",0)


frame:Show()
wx.wxGetApp():MainLoop()

 

 

E também algumas fotos do programa:

 

 

 

Menu do programa

menuphoto.jpg

 

Menu arquivo

menu01photo.jpg

 

Menu editar

menu02photo.jpg

 

Funções

functionsphoto.jpg

 

Info

aboutphoto.jpg

 

 

 

 

 

Como é a primeira versão e ainda não sei muito sobre o assunto, o programa ficou bem básico, contendo apenas as funções:

 

Arquivo

► Novo, Abrir, Salvar, Salvar como e exit

Editar

► Copiar, Colar, Recortar, Desfazer, Refazer

Ferramentas

► Funções, Executar

Info

► Sobre o programa

 

 

Link do Scan: Scan

 

Link para download: X-Tibia Scripting Environment.rar

 

Ps: Algumas pessoas podem obter um erro devido à falta de lua5.1.dll. Caso aconteça, basta copiar a dll de algum servidor para a pasta do programa.

 

Bom, é isso.

 

Aguardem novas versões...

 

Agradecimentos: MatheusMkalo, Socket

 

flw

Editado por apocarai
Link para o comentário
Compartilhar em outros sites

Muito bom!

aprovado :button_ok:

 

isso é um programa para fazer scripts?

extraindo já.

Sim é um programa para criar scripts, o executar é um debuger?

para ver se o script tem erros?

vou acompanhar novas versões...

Editado por felzan
Link para o comentário
Compartilhar em outros sites

Vou baixar novamente, talvez tenha corrompido no download, sei lá...

 

OBS: Já tentei executar em modo de compatibilidade...

 

EDITED:

 

Ah cara me desculpa, não vi isso:

 

Ps: Algumas pessoas podem obter um erro devido à falta de lua5.1.dll. Caso aconteça, basta copiar a dll de algum servidor para a pasta do programa.

 

Agora funcionou!

 

Muito bom o programa,

Aprovadíssimo!

Editado por Won Helder
Link para o comentário
Compartilhar em outros sites

Dicas para Próxima Edição:

 

- Distinção por cores (Assim como Tem no Notepad +++)

- Clicar na função e ela aparecer em vez de uma lista de funções

- Lista com todos os Item ID (Sempre que atualizar a versão do Tibia é só trocar o items.xml na pasta do programa)

- Pesquisa de Funções (Você digita doPlayerAdd, por exemplo, e aparece todas as funções que tenha isso)

- Ajuda com as terminações, tipo se você colocou if, então obrigatoriamente tem que ter then end etc etc.

- Lista de funções (onUse, onStepIn, onSay) etc etc

 

É isso cara, mas para a primeira edição es´ta muito bom, espero que dê uma olhada no que eu disse :smile_positivo:

 

Abraços!

Link para o comentário
Compartilhar em outros sites

Dicas anotadas!

 

Muitas das funções básicas não puderam ser implementadas porque usei um método que não dava suporte à elas (wx.wxTextCtrl), caso contrário teríamos já na versão 1.0 a distinção de cores e muitas outras features =x

 

 

 

flw

Link para o comentário
Compartilhar em outros sites

Já tinha visto o programa, o Matheus tinha me passado ahaha ;)

O programa ficou muito bom mesmo, com o tempo com certeza ele vai melhorando mais ainda... =)

 

Aah para quem quiser baixar já com a lua5.1.dll:

X-Tibia Scripting Environment.rar

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...