Compare commits
215 Commits
v0.6.0
...
multi-grap
Author | SHA1 | Date | |
---|---|---|---|
![]() |
8f0ad27735 | ||
![]() |
d60413f7d6 | ||
![]() |
e6ee88af43 | ||
![]() |
b3b849000d | ||
![]() |
ab9351196c | ||
![]() |
96bbe20588 | ||
![]() |
77995a2e88 | ||
![]() |
adf51f1852 | ||
![]() |
45eda6c573 | ||
![]() |
c3c951ebbb | ||
![]() |
a989ceb10c | ||
![]() |
fb8552d142 | ||
![]() |
65b32d283b | ||
![]() |
64fc4570c9 | ||
![]() |
392acc0b43 | ||
![]() |
69f72b9c86 | ||
![]() |
489688e9fb | ||
![]() |
d911b38d68 | ||
![]() |
61be2103ed | ||
![]() |
a7b27ef8dd | ||
![]() |
10a16169a4 | ||
![]() |
44bf4dcb6e | ||
![]() |
9305053e34 | ||
![]() |
1dd558d57e | ||
![]() |
15ee7962f1 | ||
![]() |
8c016b143a | ||
![]() |
a85ca0fb17 | ||
![]() |
115bf08364 | ||
![]() |
71b5c5f2e4 | ||
![]() |
5396ea6231 | ||
![]() |
9955de573b | ||
![]() |
0be7bd5360 | ||
![]() |
c452e74e0c | ||
![]() |
bdbe065c23 | ||
![]() |
f4263384bc | ||
![]() |
f50c63e9e5 | ||
![]() |
48ac91d173 | ||
![]() |
8db85e4e3a | ||
![]() |
02d32565e9 | ||
![]() |
3980f859b7 | ||
![]() |
c392bcca90 | ||
![]() |
62921dee9b | ||
![]() |
3ca85cbe87 | ||
![]() |
32df317163 | ||
![]() |
a145ad282b | ||
![]() |
884102833e | ||
![]() |
50b6cc69e1 | ||
![]() |
8314b84f69 | ||
![]() |
e85afd4b63 | ||
![]() |
120c2b4231 | ||
![]() |
dad3026ba0 | ||
![]() |
9312d20a0f | ||
![]() |
425bfd998b | ||
![]() |
b804dd6959 | ||
![]() |
69e762385e | ||
![]() |
e528fcc8f8 | ||
![]() |
46aa0c005f | ||
![]() |
eb46b96ffa | ||
![]() |
ccbe491e3c | ||
![]() |
864ac3fdd9 | ||
![]() |
5f26303389 | ||
![]() |
0bf909d52f | ||
![]() |
ef20f59a98 | ||
![]() |
406c7bdae6 | ||
![]() |
41b81da76f | ||
![]() |
dc3559a5c0 | ||
![]() |
d0576da69d | ||
![]() |
2a225b99b7 | ||
![]() |
04f52d77d2 | ||
![]() |
06e2b6eca2 | ||
![]() |
a8c175452b | ||
![]() |
92228e9553 | ||
![]() |
67ed9e21ad | ||
![]() |
01126eee62 | ||
![]() |
8e9f65779c | ||
![]() |
2296e35174 | ||
![]() |
28e70516a4 | ||
![]() |
039c3072dc | ||
![]() |
f4f9e319d8 | ||
![]() |
035ce26728 | ||
![]() |
04c4943fa8 | ||
![]() |
09c937998f | ||
![]() |
e4e3d7d053 | ||
![]() |
5b573afdfc | ||
![]() |
90d2032e9e | ||
![]() |
3eeb5ae890 | ||
![]() |
9a54bfcc90 | ||
![]() |
f8b078ea91 | ||
![]() |
33ce0aa704 | ||
![]() |
bb304f9f4e | ||
![]() |
a84d0bbf11 | ||
![]() |
cb3f06358c | ||
![]() |
3b91c4d509 | ||
![]() |
f4c7d98bd5 | ||
![]() |
88c59afb8c | ||
![]() |
b61094c053 | ||
![]() |
3b9acab7a1 | ||
![]() |
6d456994f4 | ||
![]() |
e87e669c87 | ||
![]() |
59a5b8115a | ||
![]() |
67fc77d507 | ||
![]() |
28cdd6aa53 | ||
![]() |
4f423432fa | ||
![]() |
62f38d678d | ||
![]() |
07dd78002b | ||
![]() |
5fc1ac8051 | ||
![]() |
d9ee4dccbe | ||
![]() |
ffcb65f365 | ||
![]() |
adc01ab9e3 | ||
![]() |
725a16e38e | ||
![]() |
0b29a4b466 | ||
![]() |
cb42481edd | ||
![]() |
8f9055f48b | ||
![]() |
b1bab32618 | ||
![]() |
dfb0150a7d | ||
![]() |
11cb287a21 | ||
![]() |
6f37361df0 | ||
![]() |
9c0c19b5b2 | ||
![]() |
b08d0ff157 | ||
![]() |
71c2ec5293 | ||
![]() |
72d63673ca | ||
![]() |
cbeab6f9b0 | ||
![]() |
25841e9c77 | ||
![]() |
ea0d5f3d81 | ||
![]() |
4f3be92208 | ||
![]() |
3c3ba9ef4c | ||
![]() |
2f7a06e93e | ||
![]() |
7f918a12a2 | ||
![]() |
7f6a4bbbe5 | ||
![]() |
86c462eb4d | ||
![]() |
7ece0ed8c7 | ||
![]() |
cf77df05ca | ||
![]() |
dcd6249e8f | ||
![]() |
f0ac63eb5c | ||
![]() |
d4fb6127fc | ||
![]() |
637b6ceca2 | ||
![]() |
86d06057ca | ||
![]() |
717832b791 | ||
![]() |
4c51009ed9 | ||
![]() |
0fc56c73cc | ||
![]() |
db73bbdea2 | ||
![]() |
6cd71ea02e | ||
![]() |
7f5dda5c8f | ||
![]() |
35e5dd8af8 | ||
![]() |
b34cc18f98 | ||
![]() |
469df27d9b | ||
![]() |
e7012031eb | ||
![]() |
4c3c945bab | ||
![]() |
e370ffdb0f | ||
![]() |
36a60419ec | ||
![]() |
546007f1df | ||
![]() |
cb7f855fd8 | ||
![]() |
859cb31f5d | ||
![]() |
de353e3b72 | ||
![]() |
9e208fa792 | ||
![]() |
a0b2504f11 | ||
![]() |
89c012e81f | ||
![]() |
abcc95634e | ||
![]() |
8a2d2cd5ac | ||
![]() |
654f71e75f | ||
![]() |
1bf77c35c6 | ||
![]() |
17d09f41be | ||
![]() |
ca9c33ff54 | ||
![]() |
da050a5630 | ||
![]() |
5bf03c50d6 | ||
![]() |
377c013dfe | ||
![]() |
60986eb80f | ||
![]() |
ff9f82d0c8 | ||
![]() |
80a7ecb3a4 | ||
![]() |
8d6ccb8d83 | ||
![]() |
4751941e4f | ||
![]() |
f492d291eb | ||
![]() |
26c6217bc3 | ||
![]() |
ec30567d6b | ||
![]() |
b7eef97239 | ||
![]() |
6c7a163197 | ||
![]() |
d6e8e92a45 | ||
![]() |
197a379933 | ||
![]() |
773837da98 | ||
![]() |
4536c68f00 | ||
![]() |
6966221e39 | ||
![]() |
2bd86d0695 | ||
![]() |
bcb3db4cdc | ||
![]() |
e81dd31ae3 | ||
![]() |
cf0ecf418d | ||
![]() |
9aca1644e6 | ||
![]() |
6c59124cb2 | ||
![]() |
7c06a00f82 | ||
![]() |
9f69c71b6d | ||
![]() |
4351f3c63f | ||
![]() |
4b1db2bcd6 | ||
![]() |
2fd3c643c4 | ||
![]() |
4f8f02acad | ||
![]() |
7e01306fc6 | ||
![]() |
835adfb4ce | ||
![]() |
6594b2d090 | ||
![]() |
4d0d62e364 | ||
![]() |
07959ddc04 | ||
![]() |
18af9a45ee | ||
![]() |
90f1244ab4 | ||
![]() |
9e4a9433ca | ||
![]() |
32c5f4285b | ||
![]() |
c982ca81a5 | ||
![]() |
a144174c41 | ||
![]() |
3a47c4f2e1 | ||
![]() |
0a91fff82a | ||
![]() |
95f79b45dc | ||
![]() |
839495fa9b | ||
![]() |
42b05df717 | ||
![]() |
d5b4e0929f | ||
![]() |
a8fbd6cdfc | ||
![]() |
5b65088426 | ||
![]() |
bc55cbbbd1 | ||
![]() |
c3eede9872 | ||
![]() |
8d5cd95bc4 |
2
.gitignore
vendored
@@ -37,3 +37,5 @@ otclient.layout
|
|||||||
LOCALTODO
|
LOCALTODO
|
||||||
tags
|
tags
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
.directory
|
||||||
|
src/framework/graphics/dx/
|
||||||
|
@@ -1,17 +1,21 @@
|
|||||||
cmake_minimum_required(VERSION 2.6)
|
cmake_minimum_required(VERSION 2.6)
|
||||||
project(otclient)
|
project(otclient)
|
||||||
|
|
||||||
set(VERSION "0.6.0")
|
set(VERSION "0.6.2")
|
||||||
|
|
||||||
|
option(FRAMEWORK_SOUND "Use SOUND " ON)
|
||||||
|
option(FRAMEWORK_GRAPHICS "Use GRAPHICS " ON)
|
||||||
|
option(FRAMEWORK_XML "Use XML " ON)
|
||||||
|
option(FRAMEWORK_NET "Use NET " ON)
|
||||||
|
option(FRAMEWORK_SQL "Use SQL" OFF)
|
||||||
|
|
||||||
set(FRAMEWORK_SOUND ON)
|
|
||||||
set(FRAMEWORK_GRAPHICS ON)
|
|
||||||
set(FRAMEWORK_XML ON)
|
|
||||||
set(FRAMEWORK_NET ON)
|
|
||||||
include(src/framework/CMakeLists.txt)
|
include(src/framework/CMakeLists.txt)
|
||||||
include(src/client/CMakeLists.txt)
|
include(src/client/CMakeLists.txt)
|
||||||
|
|
||||||
# functions map for reading backtraces
|
# functions map for reading backtraces
|
||||||
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -Wl,-Map=${PROJECT_NAME}.map")
|
if(NOT APPLE)
|
||||||
|
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -Wl,-Map=${PROJECT_NAME}.map")
|
||||||
|
endif()
|
||||||
|
|
||||||
option(USE_PCH "Use precompiled header (speed up compile)" OFF)
|
option(USE_PCH "Use precompiled header (speed up compile)" OFF)
|
||||||
|
|
||||||
|
13
data/cursors/cursors.otml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
Cursors
|
||||||
|
target:
|
||||||
|
image: targetcursor
|
||||||
|
hot-spot: 9 9
|
||||||
|
horizontal:
|
||||||
|
image: horizontalcursor
|
||||||
|
hot-spot: 9 4
|
||||||
|
vertical:
|
||||||
|
image: verticalcursor
|
||||||
|
hot-spot: 4 9
|
||||||
|
text:
|
||||||
|
image: textcursor
|
||||||
|
hot-spot: 4 9
|
Before Width: | Height: | Size: 230 B After Width: | Height: | Size: 230 B |
Before Width: | Height: | Size: 266 B After Width: | Height: | Size: 266 B |
Before Width: | Height: | Size: 198 B After Width: | Height: | Size: 198 B |
Before Width: | Height: | Size: 238 B After Width: | Height: | Size: 238 B |
8
data/fonts/terminus-10px.otfont
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Font
|
||||||
|
name: terminus-10px
|
||||||
|
texture: terminus-10px
|
||||||
|
height: 12
|
||||||
|
y-offset: 0
|
||||||
|
glyph-size: 16 16
|
||||||
|
fixed-glyph-width: 6
|
||||||
|
space-width: 6
|
BIN
data/fonts/terminus-10px.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
BIN
data/images/game/minimap/cross.png
Normal file
After Width: | Height: | Size: 243 B |
BIN
data/images/game/minimap/flag0.png
Normal file
After Width: | Height: | Size: 335 B |
BIN
data/images/game/minimap/flag1.png
Normal file
After Width: | Height: | Size: 397 B |
BIN
data/images/game/minimap/flag10.png
Normal file
After Width: | Height: | Size: 387 B |
BIN
data/images/game/minimap/flag11.png
Normal file
After Width: | Height: | Size: 444 B |
BIN
data/images/game/minimap/flag12.png
Normal file
After Width: | Height: | Size: 362 B |
BIN
data/images/game/minimap/flag13.png
Normal file
After Width: | Height: | Size: 373 B |
BIN
data/images/game/minimap/flag14.png
Normal file
After Width: | Height: | Size: 397 B |
BIN
data/images/game/minimap/flag15.png
Normal file
After Width: | Height: | Size: 412 B |
BIN
data/images/game/minimap/flag16.png
Normal file
After Width: | Height: | Size: 418 B |
BIN
data/images/game/minimap/flag17.png
Normal file
After Width: | Height: | Size: 399 B |
BIN
data/images/game/minimap/flag18.png
Normal file
After Width: | Height: | Size: 402 B |
BIN
data/images/game/minimap/flag19.png
Normal file
After Width: | Height: | Size: 392 B |
BIN
data/images/game/minimap/flag2.png
Normal file
After Width: | Height: | Size: 418 B |
BIN
data/images/game/minimap/flag3.png
Normal file
After Width: | Height: | Size: 431 B |
BIN
data/images/game/minimap/flag4.png
Normal file
After Width: | Height: | Size: 321 B |
BIN
data/images/game/minimap/flag5.png
Normal file
After Width: | Height: | Size: 354 B |
BIN
data/images/game/minimap/flag6.png
Normal file
After Width: | Height: | Size: 427 B |
BIN
data/images/game/minimap/flag7.png
Normal file
After Width: | Height: | Size: 392 B |
BIN
data/images/game/minimap/flag8.png
Normal file
After Width: | Height: | Size: 400 B |
BIN
data/images/game/minimap/flag9.png
Normal file
After Width: | Height: | Size: 423 B |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 880 B After Width: | Height: | Size: 822 B |
BIN
data/images/ui/button_top_blink.png
Normal file
After Width: | Height: | Size: 462 B |
BIN
data/images/ui/icon_add.png
Normal file
After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 661 B After Width: | Height: | Size: 646 B |
@@ -344,7 +344,7 @@ locale = {
|
|||||||
["You are dazzled"] = "Du bist geblendet",
|
["You are dazzled"] = "Du bist geblendet",
|
||||||
["You are dead."] = "Du bist tot.",
|
["You are dead."] = "Du bist tot.",
|
||||||
["You are dead"] = "Du bist tot",
|
["You are dead"] = "Du bist tot",
|
||||||
["You are drowing"] = "Du ertrinkst",
|
["You are drowning"] = "Du ertrinkst",
|
||||||
["You are drunk"] = "Du bist betrunken",
|
["You are drunk"] = "Du bist betrunken",
|
||||||
["You are electrified"] = "Du bist elektrifiziert",
|
["You are electrified"] = "Du bist elektrifiziert",
|
||||||
["You are freezing"] = "Du bist am Erfrieren",
|
["You are freezing"] = "Du bist am Erfrieren",
|
||||||
|
@@ -6,368 +6,370 @@ locale = {
|
|||||||
languageName = "Espa<EFBFBD>ol",
|
languageName = "Espa<EFBFBD>ol",
|
||||||
|
|
||||||
translation = {
|
translation = {
|
||||||
["1a) Offensive Name"] = false,
|
["1a) Offensive Name"] = "1a) Nombre ofensivo",
|
||||||
["1b) Invalid Name Format"] = false,
|
["1b) Invalid Name Format"] = "1b) Formato invalido para nombre",
|
||||||
["1c) Unsuitable Name"] = false,
|
["1c) Unsuitable Name"] = "1c) Nombre no adecuado",
|
||||||
["1d) Name Inciting Rule Violation"] = false,
|
["1d) Name Inciting Rule Violation"] = "1d) Nombre que incita una violacion al reglamento",
|
||||||
["2a) Offensive Statement"] = false,
|
["2a) Offensive Statement"] = "2a) Comentario ofensivo",
|
||||||
["2b) Spamming"] = false,
|
["2b) Spamming"] = "2b) Spamming",
|
||||||
["2c) Illegal Advertising"] = false,
|
["2c) Illegal Advertising"] = "2c) Publicidad ilicita",
|
||||||
["2d) Off-Topic Public Statement"] = false,
|
["2d) Off-Topic Public Statement"] = "2d) Publicacion fuera de lugar",
|
||||||
["2e) Non-English Public Statement"] = false,
|
["2e) Non-English Public Statement"] = "2e) Publicacion fuera del ingles",
|
||||||
["2f) Inciting Rule Violation"] = false,
|
["2f) Inciting Rule Violation"] = "2f) Incitar a una violacion al reglamento",
|
||||||
["3a) Bug Abuse"] = false,
|
["3a) Bug Abuse"] = "3a) Abuso de error",
|
||||||
["3b) Game Weakness Abuse"] = false,
|
["3b) Game Weakness Abuse"] = "3b) Abuso de debilidad del juego",
|
||||||
["3c) Using Unofficial Software to Play"] = false,
|
["3c) Using Unofficial Software to Play"] = "3c) Usando software ilegal para jugar",
|
||||||
["3d) Hacking"] = false,
|
["3d) Hacking"] = "3d) Hackeo",
|
||||||
["3e) Multi-Clienting"] = false,
|
["3e) Multi-Clienting"] = "3e) Multiple Cliente",
|
||||||
["3f) Account Trading or Sharing"] = false,
|
["3f) Account Trading or Sharing"] = "3f) Intercambio de cuenta",
|
||||||
["4a) Threatening Gamemaster"] = false,
|
["4a) Threatening Gamemaster"] = "4a) Amenzar a un Gamemaster",
|
||||||
["4b) Pretending to Have Influence on Rule Enforcement"] = false,
|
["4b) Pretending to Have Influence on Rule Enforcement"] = "4b) Pretender tener influencia en una parte del reglamento",
|
||||||
["4c) False Report to Gamemaster"] = false,
|
["4c) False Report to Gamemaster"] = "4c) Reporte falso a un Gamemaster",
|
||||||
["Accept"] = false,
|
["Accept"] = "Aceptar",
|
||||||
["Account name"] = "Nombre de la cuenta",
|
["Account name"] = "Nombre de cuenta",
|
||||||
["Account Status:"] = false,
|
["Account Status:"] = "Estado de cuenta:",
|
||||||
["Action:"] = false,
|
["Action:"] = "Accion:",
|
||||||
["Add"] = "A<EFBFBD>adir",
|
["Add"] = "A<EFBFBD>adir",
|
||||||
["Add new VIP"] = "A<EFBFBD>adir nuevo VIP",
|
["Add new VIP"] = "A<EFBFBD>adir nuevo VIP",
|
||||||
["Addon 1"] = "Addon 1",
|
["Addon 1"] = "Addon 1",
|
||||||
["Addon 2"] = "Addon 2",
|
["Addon 2"] = "Addon 1",
|
||||||
["Addon 3"] = "Addon 3",
|
["Addon 3"] = "Addon 1",
|
||||||
["Add to VIP list"] = "A<EFBFBD>adir a lista VIP",
|
["Add to VIP list"] = "A<EFBFBD>adir a lista VIP",
|
||||||
["Adjust volume"] = "Ajustar vol<EFBFBD>men",
|
["Adjust volume"] = "Ajustar volumen",
|
||||||
["Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back\ninto this world in exchange for a small sacrifice\n\nSimply click on Ok to resume your journeys!"] = false,
|
["Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back\ninto this world in exchange for a small sacrifice\n\nSimply click on Ok to resume your journeys!"] = "<EFBFBD>Ay! Aventurero valiente, que ha conocido a un triste destino. \nPero no se desespere, porque los dioses le llevar<61> de vuelta \na este mundo a cambio de un peque<75>o sacrificio \n\nSimply haga clic en Aceptar para continuar con sus viajes!",
|
||||||
["All"] = false,
|
["All"] = "Todo",
|
||||||
["All modules and scripts were reloaded."] = "Todos los m<>dulos y scripts han sido reiniciados",
|
["All modules and scripts were reloaded."] = "Todos los m<>dulos y scripts se vuelven a cargar.",
|
||||||
["Allow auto chase override"] = false,
|
["Allow auto chase override"] = "Permitur auto persecuci<63>n override",
|
||||||
["Also known as dash in tibia community, recommended\nfor playing characters with high speed"] = false,
|
["Also known as dash in tibia community, recommended\nfor playing characters with high speed"] = "Conocido por la comunidad de tibia como dash.\nRecomenada para players de alto nivel.",
|
||||||
["Ambient light: %s%%"] = false,
|
["Ambient light: %s%%"] = "Ambiente de luz: %s%%",
|
||||||
["Amount:"] = "Cantidad:",
|
["Amount:"] = "Cantidad:",
|
||||||
["Amount"] = false,
|
["Amount"] = "Cantidad",
|
||||||
["Anonymous"] = false,
|
["Anonymous"] = "An<EFBFBD>nimo",
|
||||||
["Are you sure you want to logout?"] = false,
|
["Are you sure you want to logout?"] = "<EFBFBD>Estas seguro de que quieres salir?",
|
||||||
["Attack"] = "Atacar",
|
["Attack"] = "Atacar",
|
||||||
["Author"] = "Autor",
|
["Author"] = "Autor",
|
||||||
["Autoload"] = "Cargar autom<6F>ticamente",
|
["Autoload"] = "Auto carga",
|
||||||
["Autoload priority"] = "Prioridad de carga",
|
["Autoload priority"] = "Auto carga prioritaria",
|
||||||
["Auto login"] = "Entrar autom<6F>ticamente",
|
["Auto login"] = "Auto iniciar",
|
||||||
["Auto login selected character on next charlist load"] = "Entrar autom<6F>ticamente con un personage cuando se vuelva a abrir la lista de personajes",
|
["Auto login selected character on next charlist load"] = "Auto cargar car<61>cter seleccionado en la carga charlist siguiente",
|
||||||
["Axe Fighting"] = "Combate con Hacha",
|
["Axe Fighting"] = "Combate con acha",
|
||||||
["Balance:"] = false,
|
["Balance:"] = "Saldo:",
|
||||||
["Banishment"] = false,
|
["Banishment"] = "Banishment",
|
||||||
["Banishment + Final Warning"] = false,
|
["Banishment + Final Warning"] = "Banishment + Final Warning",
|
||||||
["Battle"] = "Batalla",
|
["Battle"] = "Batalla",
|
||||||
["Browse"] = false,
|
["Browse"] = "Navegar",
|
||||||
["Bug report sent."] = false,
|
["Bug report sent."] = "Reporte de error enviado.",
|
||||||
["Button Assign"] = "Seleccionar Bot<6F>n",
|
["Button Assign"] = "Boton asignado",
|
||||||
["Buy"] = "Comprar",
|
["Buy"] = "Compra",
|
||||||
["Buy Now"] = false,
|
["Buy Now"] = "Compra ahora",
|
||||||
["Buy Offers"] = false,
|
["Buy Offers"] = "Comprar oferta",
|
||||||
["Buy with backpack"] = "Comprar con mochila",
|
["Buy with backpack"] = "Comprar con backpack",
|
||||||
["Cancel"] = "Cancelar",
|
["Cancel"] = "Cancelar",
|
||||||
["Cannot login while already in game."] = false,
|
["Cannot login while already in game."] = "No se puede iniciar sesi<73>n, mientras que estes en el juego.",
|
||||||
["Cap"] = false,
|
["Cap"] = "Cap",
|
||||||
["Capacity"] = "Capacidad",
|
["Capacity"] = "Capacidad",
|
||||||
["Center"] = false,
|
["Center"] = "Centrar",
|
||||||
["Channels"] = "Canales",
|
["Channels"] = "Canales",
|
||||||
["Character List"] = "Lista de personajes",
|
["Character List"] = "Lista de car<EFBFBD>cter",
|
||||||
["Classic control"] = "Control cl<EFBFBD>sico",
|
["Classic control"] = "Control Clasico",
|
||||||
["Clear current message window"] = false,
|
["Clear current message window"] = "Limpiar mensaje actual en ventana",
|
||||||
["Clear Messages"] = false,
|
["Clear Messages"] = "Limpiar mensaje",
|
||||||
["Clear object"] = "Limpiar objeto",
|
["Clear object"] = "Limpiar objeto",
|
||||||
["Client needs update."] = false,
|
["Client needs update."] = "El cliente necesita actualizacion.",
|
||||||
["Close"] = "Cerrar",
|
["Close"] = "Cerrar",
|
||||||
["Close this channel"] = "Cerrar este canal",
|
["Close this channel"] = "Cerrar este canal",
|
||||||
["Club Fighting"] = "Combate con Maza",
|
["Club Fighting"] = "Combate con mazo",
|
||||||
["Combat Controls"] = "Controles de combate",
|
["Combat Controls"] = "Controles de combate",
|
||||||
["Comment:"] = false,
|
["Comment:"] = "Comentario:",
|
||||||
["Connecting to game server..."] = "Conectando al servidor de juego...",
|
["Connecting to game server..."] = "Conectando a servidor game...",
|
||||||
["Connecting to login server..."] = "Conectando al servidor de autentificaci<63>n...",
|
["Connecting to login server..."] = "Conectando a servidor login...",
|
||||||
["Console"] = false,
|
["Console"] = "Consola",
|
||||||
["Cooldowns"] = false,
|
["Cooldowns"] = "Descansos",
|
||||||
["Copy message"] = false,
|
["Copy message"] = "Copiar mensaje",
|
||||||
["Copy name"] = false,
|
["Copy name"] = "Copiar nombre",
|
||||||
["Copy Name"] = "Copiar Nombre",
|
["Copy Name"] = "Copiar nombre",
|
||||||
["Create Map Mark"] = false,
|
["Create Map Mark"] = "Crear marca en mapa",
|
||||||
["Create mark"] = false,
|
["Create mark"] = "Crear marca",
|
||||||
["Create New Offer"] = false,
|
["Create New Offer"] = "Crear nueva oferta",
|
||||||
["Create Offer"] = false,
|
["Create Offer"] = "Crear oferta",
|
||||||
["Current hotkeys:"] = "Atajos actuales",
|
["Current hotkeys:"] = "Actuales hotkeys:",
|
||||||
["Current hotkey to add: %s"] = "Atajo actual para a<>adir: %s",
|
["Current hotkey to add: %s"] = "Actuales hotkeys a agregar: %s",
|
||||||
["Current Offers"] = false,
|
["Current Offers"] = "Oferta actual",
|
||||||
["Default"] = "Principal",
|
["Default"] = "Predeterminado",
|
||||||
["Delete mark"] = false,
|
["Delete mark"] = "Borrar Marca",
|
||||||
["Description:"] = false,
|
["Description:"] = "Descripci<EFBFBD>n:",
|
||||||
["Description"] = "Descripci<EFBFBD>n",
|
["Description"] = "Descripci<EFBFBD>n",
|
||||||
["Destructive Behaviour"] = false,
|
["Destructive Behaviour"] = "Comportamiento agresivo",
|
||||||
["Detail"] = "Detalle",
|
["Detail"] = "Detalle",
|
||||||
["Details"] = false,
|
["Details"] = "Detalles",
|
||||||
["Disable Shared Experience"] = "Desactivar experiencia compartida",
|
["Disable Shared Experience"] = "Desactivar experiencia compartida",
|
||||||
["Dismount"] = false,
|
["Dismount"] = "Desmontar",
|
||||||
["Display connection speed to the server (milliseconds)"] = false,
|
["Display connection speed to the server (milliseconds)"] = "Mostrar velocidad de conexion en el servidor (millisegundos)",
|
||||||
["Distance Fighting"] = "Combate a Distancia",
|
["Distance Fighting"] = "Combate a distancia",
|
||||||
["Don't stretch/shrink Game Window"] = false,
|
["Don\'t stretch/shrink Game Window"] = "No estirar ni reducir el tama<6D>o de ventana",
|
||||||
["Edit hotkey text:"] = "Editar texto del atajo",
|
["Edit hotkey text:"] = "Editar texto de hotkey:",
|
||||||
["Edit List"] = false,
|
["Edit List"] = "Editar lista",
|
||||||
["Edit Text"] = "Editar Texto",
|
["Edit Text"] = "Editar texto",
|
||||||
["Enable music"] = false,
|
["Enable music"] = "Habilitar musica",
|
||||||
["Enable Shared Experience"] = "Activar experiencia compartida",
|
["Enable Shared Experience"] = "Habilitar experiencia compartida",
|
||||||
["Enable smart walking"] = false,
|
["Enable smart walking"] = "Habilitar caminado inteligente",
|
||||||
["Enable vertical synchronization"] = "Activar sincronizaci<63>n vertical",
|
["Enable vertical synchronization"] = "Habilitar sincronizaci<63>n vertical",
|
||||||
["Enable walk booster"] = false,
|
["Enable walk booster"] = "Habilitar caminado turbo",
|
||||||
["Enter Game"] = "Entrar al juego",
|
["Enter Game"] = "Entrar al juego",
|
||||||
["Enter one name per line."] = false,
|
["Enter one name per line."] = "Introducir un nombre por linea.",
|
||||||
["Enter with your account again to update your client."] = false,
|
["Enter with your account again to update your client."] = "",
|
||||||
["Error"] = "Error",
|
["Error"] = "Error",
|
||||||
["Error"] = "Error",
|
["Error"] = "Error",
|
||||||
["Excessive Unjustified Player Killing"] = false,
|
["Excessive Unjustified Player Killing"] = "Asesinato excesivo injustivicado de players",
|
||||||
["Exclude from private chat"] = "Excluir del canal privado",
|
["Exclude from private chat"] = "Ejecutar desde un canal privado",
|
||||||
["Exit"] = false,
|
["Exit"] = "Salir",
|
||||||
["Experience"] = "Experiencia",
|
["Experience"] = "Experiencia",
|
||||||
["Filter list to match your level"] = false,
|
["Filter list to match your level"] = "Lista de filtros que coincida con el nivel",
|
||||||
["Filter list to match your vocation"] = false,
|
["Filter list to match your vocation"] = "Lista de filtros que coincida con el vocaci<63>n",
|
||||||
["Find:"] = false,
|
["Find:"] = "Encontrar:",
|
||||||
["Fishing"] = "Pesca",
|
["Fishing"] = "Pesca",
|
||||||
["Fist Fighting"] = "Combate con Pu<EFBFBD>os",
|
["Fist Fighting"] = "Combate con pu<EFBFBD>os",
|
||||||
["Follow"] = "Seguir",
|
["Follow"] = "Seguir",
|
||||||
["Force Exit"] = false,
|
["Force Exit"] = "Forzar salida",
|
||||||
["For Your Information"] = false,
|
["For Your Information"] = "Para tu informaci<63>n",
|
||||||
["Free Account"] = false,
|
["Free Account"] = "Account gratis",
|
||||||
["Fullscreen"] = "Pantalla Completa",
|
["Fullscreen"] = "Pantalla completa",
|
||||||
["Game"] = false,
|
["Game"] = "Juego",
|
||||||
["Game framerate limit: %s"] = false,
|
["Game framerate limit: %s"] = "Imagenes por segundo en juego: %s",
|
||||||
["Graphics"] = "Gr<EFBFBD>ficos",
|
["Graphics"] = "Gr<EFBFBD>ficos",
|
||||||
["Graphics card driver not detected"] = false,
|
["Graphics card driver not detected"] = "Controlador de tarjeta gr<67>fica de video no detectado",
|
||||||
["Graphics Engine:"] = false,
|
["Graphics Engine:"] = "Motor Grafico:",
|
||||||
["Head"] = "Cabeza",
|
["Head"] = "Cabeza",
|
||||||
["Healing"] = false,
|
["Healing"] = "Curacion",
|
||||||
["Health Info"] = false,
|
["Health Info"] = "HP Info",
|
||||||
["Health Information"] = false,
|
["Health Information"] = "HP Informaci<63>n",
|
||||||
["Hide monsters"] = "Esconder monstruos",
|
["Hide monsters"] = "Ocultar monsters",
|
||||||
["Hide non-skull players"] = "Esconder jugadores sin calavera",
|
["Hide non-skull players"] = "Ocultar no-skull players",
|
||||||
["Hide Npcs"] = "Esconder NPCs",
|
["Hide Npcs"] = "Ocultar NPCs",
|
||||||
["Hide Offline"] = false,
|
["Hide Offline"] = "Ocultar fuera de linea",
|
||||||
["Hide party members"] = "Esconder miembros del grupo",
|
["Hide party members"] = "Ocultar miembros de party",
|
||||||
["Hide players"] = "Esconder jugadores",
|
["Hide players"] = "Ocultar players",
|
||||||
["Hide spells for higher exp. levels"] = false,
|
["Hide spells for higher exp. levels"] = "Ocultar spells para niveles mas altos que tu experiencia.",
|
||||||
["Hide spells for other vocations"] = false,
|
["Hide spells for other vocations"] = "Ocultar spells que sean para otra vocaci<63>n",
|
||||||
["Hit Points"] = "Puntos de Vida",
|
["Hit Points"] = "Puntos de vida",
|
||||||
["Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks"] = false,
|
["Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks"] = "Mantenga pulsado el bot<6F>n derecho del rat<61>n para navegar\nScroll bot<6F>n central del rat<61>n para ampliar\nbot<EFBFBD>n derecho del mouse para crear marcas del mapa",
|
||||||
["Hotkeys"] = "Atajos",
|
["Hotkeys"] = "Hotkeys",
|
||||||
["If you shut down the program, your character might stay in the game.\nClick on 'Logout' to ensure that you character leaves the game properly.\nClick on 'Exit' if you want to exit the program without logging out your character."] = false,
|
["If you shut down the program, your character might stay in the game.\nClick on 'Logout' to ensure that you character leaves the game properly.\nClick on 'Exit' if you want to exit the program without logging out your character."] = "Si se cierra el programa, tu personaje puede permanecer en el juego.\nHaga clic en 'Salir' para asegurarse de que personaje deja el juego correctamente.\nClick en 'Salir' si desea salir del programa sin tener que salir de tu personaje.",
|
||||||
["Ignore"] = false,
|
["Ignore"] = "Ignorar",
|
||||||
["Ignore capacity"] = "Ignorar capacidad",
|
["Ignore capacity"] = "Ignorar Capacidad",
|
||||||
["Ignored players:"] = false,
|
["Ignored players:"] = "Players ignorados:",
|
||||||
["Ignore equipped"] = "Ignorar equipado",
|
["Ignore equipped"] = "Ignorar lo equipodo",
|
||||||
["Ignore List"] = false,
|
["Ignore List"] = "Ignorar lista",
|
||||||
["Ignore players"] = false,
|
["Ignore players"] = "Ignorar players",
|
||||||
["Ignore Private Messages"] = false,
|
["Ignore Private Messages"] = "Ignorar mensajes privados",
|
||||||
["Ignore Yelling"] = false,
|
["Ignore Yelling"] = "Ignorar gritos",
|
||||||
["Interface framerate limit: %s"] = false,
|
["Interface framerate limit: %s"] = "Interface de imagenes por segundo: %s",
|
||||||
["Inventory"] = "Inventario",
|
["Inventory"] = "Inventario",
|
||||||
["Invite to Party"] = "Invitar al grupo",
|
["Invite to Party"] = "Ivitar a party",
|
||||||
["Invite to private chat"] = "Invitar al canal privado",
|
["Invite to private chat"] = "Invitar a canal privado",
|
||||||
["IP Address Banishment"] = false,
|
["IP Address Banishment"] = "Banishment - Direccion IP",
|
||||||
["Item Offers"] = false,
|
["Item Offers"] = "Ofertas de objetos",
|
||||||
["It is empty."] = false,
|
["It is empty."] = "Est<EFBFBD> vasio.",
|
||||||
["Join %s's Party"] = false,
|
["Join %s\'s Party"] = "Unir %s\'s party",
|
||||||
["Leave Party"] = "Salir del grupo",
|
["Leave Party"] = "Dejar party",
|
||||||
["Level"] = "Nivel",
|
["Level"] = "Nivel",
|
||||||
["Lifetime Premium Account"] = false,
|
["Lifetime Premium Account"] = "Tiempo de Premium Account",
|
||||||
["Limits FPS to 60"] = "Limita los FPS a 60",
|
["Limits FPS to 60"] = "Limites FPS a 60",
|
||||||
["List of items that you're able to buy"] = "Lista de objetos que usted puede comprar",
|
["List of items that you're able to buy"] = "Lista de objetos que puedes de comprar",
|
||||||
["List of items that you're able to sell"] = "Lista de objetos que usted puede vender",
|
["List of items that you're able to sell"] = "Lista de objetos que puedes de vender",
|
||||||
["Load"] = "Cargar",
|
["Load"] = "Cargar",
|
||||||
["Logging out..."] = false,
|
["Logging out..."] = "Cerrando sesion...",
|
||||||
["Login"] = "Entrar",
|
["Login"] = "Ingresar",
|
||||||
["Login Error"] = "Error de Autentificaci<EFBFBD>n",
|
["Login Error"] = "Error de ingreso",
|
||||||
["Login Error"] = "Error de Autentificaci<EFBFBD>n",
|
["Login Error"] = "Error de ingreso",
|
||||||
["Logout"] = false,
|
["Logout"] = "Salir",
|
||||||
["Look"] = "Ver",
|
["Look"] = "Mirar",
|
||||||
["Magic Level"] = "Nivel M<EFBFBD>gico",
|
["Magic Level"] = "Nivel m<EFBFBD>gico",
|
||||||
["Make sure that your client uses\nthe correct game protocol version"] = "Compruebe que tu cliente use\nuse el mismo protocolo que el servidor de juego",
|
["Make sure that your client uses\nthe correct game protocol version"] = "Aseg<EFBFBD>rese de que el cliente utiliza\nes el correcto de versi<73>n del protocolo",
|
||||||
["Mana"] = "Mana",
|
["Mana"] = "Mana",
|
||||||
["Manage hotkeys:"] = "Configurar atajos:",
|
["Manage hotkeys:"] = "Administrador de hotkeys:",
|
||||||
["Market"] = false,
|
["Market"] = "Mercado",
|
||||||
["Market Offers"] = false,
|
["Market Offers"] = "Ofertas en mercado",
|
||||||
["Message of the day"] = "Mensaje del d<EFBFBD>a",
|
["Message of the day"] = "Mensaje del dia",
|
||||||
["Message to "] = false,
|
["Message to "] = "Mensaje a",
|
||||||
["Message to %s"] = "Mandar mensaje a %s",
|
["Message to %s"] = "Mensaje a %s",
|
||||||
["Minimap"] = "Minimapa",
|
["Minimap"] = "Minimapa",
|
||||||
["Module Manager"] = "Administrador de M<EFBFBD>dulos",
|
["Module Manager"] = "Administrador de modulos",
|
||||||
["Module name"] = "Nombre del m<EFBFBD>dulo",
|
["Module name"] = "Nombre de modulo",
|
||||||
["Mount"] = false,
|
["Mount"] = "Montura",
|
||||||
["Move Stackable Item"] = "Mover objeto contable",
|
["Move Stackable Item"] = "Mover objeto apilable",
|
||||||
["Move up"] = "Mover arriba",
|
["Move up"] = "Mover arriba",
|
||||||
["My Offers"] = false,
|
["My Offers"] = "Mis ofertas",
|
||||||
["Name:"] = "Nombre:",
|
["Name:"] = "Nombre:",
|
||||||
["Name Report"] = false,
|
["Name Report"] = "Name Report",
|
||||||
["Name Report + Banishment"] = false,
|
["Name Report + Banishment"] = "Name Report + Banishment",
|
||||||
["Name Report + Banishment + Final Warning"] = false,
|
["Name Report + Banishment + Final Warning"] = "Name Report + Banishment + Final Warning",
|
||||||
["No"] = false,
|
["No"] = "No",
|
||||||
["No graphics card detected, everything will be drawn using the CPU,\nthus the performance will be really bad.\nPlease update your graphics driver to have a better performance."] = false,
|
["No graphics card detected, everything will be drawn using the CPU,\nthus the performance will be really bad.\nPlease update your graphics driver to have a better performance."] = "No graphics card detected, everything will be drawn using the CPU,\npor lo tanto el rendimiento va a ser muy malo.\nPor favor, actualice su controlador de gr<67>ficos para tener un mejor rendimiento.",
|
||||||
["No item selected."] = false,
|
["No item selected."] = "No hay elemento seleccionado.",
|
||||||
["No Mount"] = false,
|
["No Mount"] = "No montura",
|
||||||
["No Outfit"] = false,
|
["No Outfit"] = "No outfit",
|
||||||
["No statement has been selected."] = false,
|
["No statement has been selected."] = "No hay comentario seleccionado.",
|
||||||
["Notation"] = false,
|
["Notation"] = "Notation",
|
||||||
["NPC Trade"] = "Comercia con NPC",
|
["NPC Trade"] = "Intercambio con NPC",
|
||||||
["Offer History"] = false,
|
["Offer History"] = "Historial de oferta",
|
||||||
["Offers"] = false,
|
["Offers"] = "Ofertas",
|
||||||
["Offer Type:"] = false,
|
["Offer Type:"] = "Tipo de oferta:",
|
||||||
["Offline Training"] = false,
|
["Offline Training"] = "Entrenamiento offLine",
|
||||||
["Ok"] = "Ok",
|
["Ok"] = "OK",
|
||||||
["on %s.\n"] = false,
|
["on %s.\n"] = "en %s.\n",
|
||||||
["Open"] = "Abrir",
|
["Open"] = "Abierto",
|
||||||
["Open a private message channel:"] = "Abrir un canal privado:",
|
["Open a private message channel:"] = "Abrir mensaje en canal privado:",
|
||||||
["Open charlist automatically when starting client"] = false,
|
["Open charlist automatically when starting client"] = "Abrir lista de players automaticamente al iniciar el cliente",
|
||||||
["Open in new window"] = "Abrir en una nueva ventana",
|
["Open in new window"] = "Abrir en nueva ventana",
|
||||||
["Open new channel"] = "Abrir novo canal",
|
["Open new channel"] = "Abrir nuevo canal",
|
||||||
["Options"] = "Opciones",
|
["Options"] = "Opciones",
|
||||||
["Overview"] = false,
|
["Overview"] = "Descripcion",
|
||||||
["Pass Leadership to %s"] = "Pasar el liderazgo a %s",
|
["Pass Leadership to %s"] = "Pasar liderazgo a %s",
|
||||||
["Password"] = "Contrase<EFBFBD>a",
|
["Password"] = "Contrase<EFBFBD>a",
|
||||||
["Piece Price:"] = false,
|
["Piece Price:"] = "Precio por pieza:",
|
||||||
["Please enter a character name:"] = "Por favor, introduce el nombre de un personaje:",
|
["Please enter a character name:"] = "Por favor ingresar nombre del player:",
|
||||||
["Please, press the key you wish to add onto your hotkeys manager"] = "Por favor, presione la tecla que desee para\na<EFBFBD>adir a tu administrador de atajos",
|
["Please, press the key you wish to add onto your hotkeys manager"] = "Por favor, presiona la tecla que desees para que sea registrada en\nel administrador de hotkeys",
|
||||||
["Please Select"] = false,
|
["Please Select"] = "Por favor selecciona",
|
||||||
["Please use this dialog to only report bugs. Do not report rule violations here!"] = false,
|
["Please use this dialog to only report bugs. Do not report rule violations here!"] = "Por favor usa estos dialogos solo para reportar errores.\n<EFBFBD>No reportar violaciones al reglamento aqu<71>!",
|
||||||
["Please wait"] = "Por favor, espere",
|
["Please wait"] = "Por favor espera",
|
||||||
["Port"] = "Puerto",
|
["Port"] = "Puerto",
|
||||||
["Position:"] = false,
|
["Position:"] = "Posici<EFBFBD>n:",
|
||||||
["Position: %i %i %i"] = false,
|
["Position: %i %i %i"] = "Posici<EFBFBD>n: %i %i %i",
|
||||||
["Premium Account (%s) days left"] = false,
|
["Premium Account (%s) days left"] = "Premium Accoun restan dias (%s)",
|
||||||
["Price:"] = "Precio",
|
["Price:"] = "Precio:",
|
||||||
["Primary"] = "Primario",
|
["Primary"] = "Primario",
|
||||||
["Protocol"] = false,
|
["Protocol"] = "Protocolo",
|
||||||
["Quest Log"] = false,
|
["Quest Log"] = "Quest Log",
|
||||||
["Randomize"] = false,
|
["Randomize"] = "Combinar",
|
||||||
["Randomize characters outfit"] = false,
|
["Randomize characters outfit"] = "Combinar oufit del jugador",
|
||||||
["Reason:"] = false,
|
["Reason:"] = "Reason:",
|
||||||
["Refresh"] = "Actualizar",
|
["Refresh"] = "Refrescar",
|
||||||
["Refresh Offers"] = false,
|
["Refresh Offers"] = "Refrescar ofertas",
|
||||||
["Regeneration Time"] = false,
|
["Regeneration Time"] = "Tiempo de regeneraci<63>n",
|
||||||
["Reject"] = false,
|
["Reject"] = "Rechazar",
|
||||||
["Reload All"] = "Recargar Todos",
|
["Reload All"] = "Cargar todo de nuevo",
|
||||||
["Remember account and password when starts client"] = false,
|
["Remember account and password when starts client"] = "Recordar cuenta y contrase<73>a al iniciar el cliente",
|
||||||
["Remember password"] = "Recordar contrase<73>a",
|
["Remember password"] = "Recordar contrase<73>a",
|
||||||
["Remove"] = "Quitar",
|
["Remove"] = "Remover",
|
||||||
["Remove %s"] = "Quitar %s",
|
["Remove %s"] = "Remover %s",
|
||||||
["Report Bug"] = false,
|
["Report Bug"] = "Reportar error",
|
||||||
["Reserved for more functionality later."] = false,
|
["Reserved for more functionality later."] = "eservado para una funcion futura.",
|
||||||
["Reset Market"] = false,
|
["Reset Market"] = "Reiniciar mercado",
|
||||||
["Revoke %s's Invitation"] = false,
|
["Revoke %s\'s Invitation"] = "Anular %s\'s invitaci<63>n",
|
||||||
["Rotate"] = "Girar",
|
["Rotate"] = "Rotar",
|
||||||
["Rule Violation"] = false,
|
["Rule Violation"] = "Violacion de regla",
|
||||||
["Save"] = false,
|
["Save"] = "Salvar",
|
||||||
["Save Messages"] = false,
|
["Save Messages"] = "Salvar mensaje",
|
||||||
["Search:"] = "Buscar:",
|
["Search:"] = "Buscar:",
|
||||||
["Search all items"] = false,
|
["Search all items"] = "Buscar todos los objetos",
|
||||||
["Secondary"] = "Secundario",
|
["Secondary"] = "Secundario",
|
||||||
["Select object"] = "Seleccionar objeto",
|
["Select object"] = "Seleccionar objeto",
|
||||||
["Select Outfit"] = "Selecionar Traje",
|
["Select Outfit"] = "Seleccionar outfit",
|
||||||
["Select your language"] = false,
|
["Select your language"] = "Selectionar tu lenguaje",
|
||||||
["Sell"] = "Vender",
|
["Sell"] = "Vender",
|
||||||
["Sell Now"] = false,
|
["Sell Now"] = "Vender ya",
|
||||||
["Sell Offers"] = false,
|
["Sell Offers"] = "Ofertas de venta",
|
||||||
["Send"] = false,
|
["Send"] = "Enviar",
|
||||||
["Send automatically"] = "Enviar autom<EFBFBD>ticamente",
|
["Send automatically"] = "Enviar automaticamente",
|
||||||
["Send Message"] = false,
|
["Send Message"] = "Enviar mensaje",
|
||||||
["Server"] = "Servidor",
|
["Server"] = "Server",
|
||||||
["Server Log"] = "Registro del servidor",
|
["Server Log"] = "Server Log",
|
||||||
["Set Outfit"] = "Escoger Traje",
|
["Set Outfit"] = "Fijar outfit",
|
||||||
["Shielding"] = "Defensa",
|
["Shielding"] = "Escudo",
|
||||||
["Show all items"] = "Mostrar todos los objetos",
|
["Show all items"] = "Mostrar todos los objetos",
|
||||||
["Show connection ping"] = false,
|
["Show connection ping"] = "Mostrar ping de conexi<78>n",
|
||||||
["Show Depot Only"] = false,
|
["Show Depot Only"] = "Mostrar solo el Depot",
|
||||||
["Show event messages in console"] = "Mostrar los mensajes de eventos en la consola",
|
["Show event messages in console"] = "Mostrar mensajes de evento en consola",
|
||||||
["Show frame rate"] = "Mostrar FPS",
|
["Show frame rate"] = "Mostrar velocidad por cuadro",
|
||||||
["Show info messages in console"] = "Mostrar los mensajes informativos en la consola",
|
["Show info messages in console"] = "Mostrar mensajes de informaci<EFBFBD>n en consola",
|
||||||
["Show left panel"] = false,
|
["Show left panel"] = "Mostrar panel izquierdo",
|
||||||
["Show levels in console"] = "Mostrar los niveles en la consola",
|
["Show levels in console"] = "Mostrar niveles en consola",
|
||||||
["Show Offline"] = false,
|
["Show Offline"] = "Mostrar offLine",
|
||||||
["Show private messages in console"] = "Mostrar los mensajes privados en la consola",
|
["Show private messages in console"] = "Mostrar mensajes privados en consola",
|
||||||
["Show private messages on screen"] = false,
|
["Show private messages on screen"] = "Mostrar mensajes privados en pantalla",
|
||||||
["Show Server Messages"] = false,
|
["Show Server Messages"] = "Mostrar mensajes del servidor",
|
||||||
["Show status messages in console"] = "Mostrar los mensajes de estado en la consola",
|
["Show status messages in console"] = "Mostrar mensajes de estado en consola",
|
||||||
["Show Text"] = false,
|
["Show Text"] = "Mostrar texto",
|
||||||
["Show timestamps in console"] = "Mostrar la hora en la consola",
|
["Show timestamps in console"] = "Mostrar marcas de tiempo en consola",
|
||||||
["Show your depot items only"] = false,
|
["Show your depot items only"] = "Mostrar solo tus objetos en depot",
|
||||||
["Skills"] = "Habilidades",
|
["Skills"] = "Habilidades",
|
||||||
["Soul"] = false,
|
["Soul"] = "Soul",
|
||||||
["Soul Points"] = "Puntos del Alma",
|
["Soul Points"] = "Puntos de Soul",
|
||||||
["Special"] = false,
|
["Special"] = "Especial",
|
||||||
["Speed"] = false,
|
["Speed"] = "Velocidad",
|
||||||
["Spell Cooldowns"] = false,
|
["Spell Cooldowns"] = "Spells Cooldowns",
|
||||||
["Spell List"] = false,
|
["Spell List"] = "Lista de spells",
|
||||||
["Stamina"] = "Vigor",
|
["Stamina"] = "Stamina",
|
||||||
["Statement:"] = false,
|
["Statement:"] = "Comentario:",
|
||||||
["Statement Report"] = false,
|
["Statement Report"] = "Statement Report",
|
||||||
["Statistics"] = false,
|
["Statistics"] = "Estadisticas",
|
||||||
["Stop Attack"] = "Detener el Ataque",
|
["Stop Attack"] = "Detener ataque",
|
||||||
["Stop Follow"] = "Detener el Seguimiento",
|
["Stop Follow"] = "Detener persecucion",
|
||||||
["Support"] = false,
|
["Support"] = "Soporte",
|
||||||
["%s: (use object)"] = "%s: (usar objeto)",
|
["%s: (use object)"] = "%s: (usar objeto)",
|
||||||
["%s: (use object on target)"] = "%s: (usar objeto en objetivo)",
|
["%s: (use object on target)"] = "%s: (usar objeto en un objetivo)",
|
||||||
["%s: (use object on yourself)"] = "%s: (usar objeto en ti mismo)",
|
["%s: (use object on yourself)"] = "%s: (usar objeto en mi mismo)",
|
||||||
["%s: (use object with crosshair)"] = "%s: (usar objeto con mirilla)",
|
["%s: (use object with crosshair)"] = "%s: (usar objeto en aire)",
|
||||||
["Sword Fighting"] = "Combate con Espada",
|
["Sword Fighting"] = "Combate de espada",
|
||||||
["Terminal"] = "Terminal",
|
["Terminal"] = "Terminal",
|
||||||
["There is no way."] = "No hay ruta.",
|
["There is no way."] = "No hay ninguna manera.",
|
||||||
["Title"] = false,
|
["Title"] = "T<EFBFBD>tulo",
|
||||||
["Total Price:"] = false,
|
["Total Price:"] = "Total total:",
|
||||||
["Trade"] = "Comercial",
|
["Trade"] = "Intercambio",
|
||||||
["Trade with ..."] = "Comercial con ...",
|
["Trade with ..."] = "Intercambiar con ...",
|
||||||
["Trying to reconnect in %s seconds."] = false,
|
["Trying to reconnect in %s seconds."] = "",
|
||||||
["Unable to load dat file, please place a valid dat in '%s'"] = false,
|
["Unable to load dat file, please place a valid dat in '%s'"] = "No se puede cargar el archivo dat, por favor coloque un dat v<>lido en '%s'",
|
||||||
["Unable to load spr file, please place a valid spr in '%s'"] = false,
|
["Unable to load spr file, please place a valid spr in '%s'"] = "No se puede cargar el archivo spr, por favor coloque un spr v<>lido en '%s'",
|
||||||
["Unable to logout."] = "No es posible salir.",
|
["Unable to logout."] = "No se puede cerrar sesi<73>n-",
|
||||||
["Unignore"] = false,
|
["Unignore"] = "Desactivar ignorado",
|
||||||
["Unload"] = "Descarga",
|
["Unload"] = "No cargado",
|
||||||
["Update needed"] = false,
|
["Update needed"] = "Es necesario actualizar",
|
||||||
["Use"] = "Usar",
|
["Use"] = "Uso",
|
||||||
["Use on target"] = "Usar en objetivo",
|
["Use on target"] = "Usar en un objetivo",
|
||||||
["Use on yourself"] = "Usar en ti mismo",
|
["Use on yourself"] = "Usar en mi mismo",
|
||||||
["Use with ..."] = "Usar en ...",
|
["Use with ..."] = "Usar en ...",
|
||||||
["Version"] = "Versi<EFBFBD>n",
|
["Version"] = "Version",
|
||||||
["VIP List"] = "Lista VIP",
|
["VIP List"] = "Lista Vip",
|
||||||
["Voc."] = false,
|
["Voc."] = "Voc.",
|
||||||
["Vocation"] = false,
|
["Vocation"] = "Vocaci<EFBFBD>n",
|
||||||
["Waiting List"] = false,
|
["Waiting List"] = "Lista de espera",
|
||||||
["Website"] = "Sitio Web",
|
["Website"] = "Sitio WEB",
|
||||||
["Weight:"] = "Peso",
|
["Weight:"] = "Peso:",
|
||||||
["Will detect when to use diagonal step based on the\nkeys you are pressing"] = false,
|
["Will detect when to use diagonal step based on the\nkeys you are pressing"] = "Detectar cuando se camina en diagonal usando las flechas",
|
||||||
["With crosshair"] = "Con mirilla",
|
["With crosshair"] = "Con punto de mira",
|
||||||
["Yes"] = false,
|
["Yes"] = "Si",
|
||||||
["You are bleeding"] = false,
|
["You are bleeding"] = "Tu estas sangrado",
|
||||||
["You are burning"] = "Est<EFBFBD>s quemando",
|
["You are burning"] = "Tu estas quemado",
|
||||||
["You are cursed"] = "Est<EFBFBD>s maldito",
|
["You are cursed"] = "Tu estas maldecido",
|
||||||
["You are dazzled"] = "Est<EFBFBD>s deslumbrado",
|
["You are dazzled"] = "Tu estas deslumbrado",
|
||||||
["You are dead."] = "Has muerto.",
|
["You are dead."] = "Tu estas muerto.",
|
||||||
["You are dead"] = false,
|
["You are dead"] = "Tu estas muerto",
|
||||||
["You are drowing"] = "Te est<EFBFBD>s ahogando",
|
["You are drowning"] = "Tu estas ahotado",
|
||||||
["You are drunk"] = false,
|
["You are drunk"] = "Tu estas borracho",
|
||||||
["You are electrified"] = "Est<EFBFBD>s electrocutado",
|
["You are electrified"] = "Tu estas electrificado",
|
||||||
["You are freezing"] = "Est<EFBFBD>s congelado",
|
["You are freezing"] = "Tu estas congelado",
|
||||||
["You are hasted"] = "Vas con prisa",
|
["You are hasted"] = "Tu estas rapido",
|
||||||
["You are hungry"] = false,
|
["You are hungry"] = "Tu estas hambriento",
|
||||||
["You are paralysed"] = "Est<EFBFBD>s paralizado",
|
["You are paralysed"] = "Tu estas paralizado",
|
||||||
["You are poisoned"] = "Est<EFBFBD>s envenenado",
|
["You are poisoned"] = "Tu estas envenedado",
|
||||||
["You are protected by a magic shield"] = "Est<EFBFBD>s protegido por un escudo m<EFBFBD>gico",
|
["You are protected by a magic shield"] = "Tu estas protegido por un campo magico",
|
||||||
["You are strengthened"] = "Est<EFBFBD>s reforzado",
|
["You are strengthened"] = "Tu estas reforzado",
|
||||||
["You are within a protection zone"] = "Est<EFBFBD>s en una zona de protecci<63>n",
|
["You are within a protection zone"] = "Tu estas dentro de una zona segura",
|
||||||
["You can enter new text."] = false,
|
["You can enter new text."] = "Tu puedes introducir un texto nuevo.",
|
||||||
["You have %s percent"] = "Tienes %s por ciento",
|
["You have %s percent"] = "Tu tienes %s porciento",
|
||||||
["You have %s percent to go"] = "Te falta %s por ciento para avanzar",
|
["You have %s percent to go"] = "Tu tienes %s porciento para ir",
|
||||||
["You may not logout during a fight"] = "No puedes salir mientras est<73>s en un combate",
|
["You may not logout during a fight"] = "No puedes salir durante una pelea",
|
||||||
["You may not logout or enter a protection zone"] = "No puedes salir o entrar en una zona de protecci<63>n",
|
["You may not logout or enter a protection zone"] = "No puedes salir o entrar en una zona de protecci<63>n",
|
||||||
["You must enter a comment."] = false,
|
["You must enter a comment."] = "Debes introducir un comentario.",
|
||||||
["You must enter a valid server address and port."] = false,
|
["You must enter a valid server address and port."] = "Debes introducir una direcci<63>n v<>lida de servidor y el puerto.",
|
||||||
["You must select a character to login!"] = "Debes seleccionar un personaje para entrar!",
|
["You must select a character to login!"] = "<EFBFBD>Debes seleccionar un personaje para ingresar!",
|
||||||
["Your Capacity:"] = false,
|
["Your Capacity:"] = "Tu capacidad:",
|
||||||
["You read the following, written by \n%s\n"] = false,
|
["You read the following, written by \n%s\n"] = "Uno lee lo siguiente, escrito por \n%s\n",
|
||||||
["You read the following, written on \n%s.\n"] = false,
|
["You read the following, written on \n%s.\n"] = "Uno lee lo siguiente, escrito en \n%s\n",
|
||||||
["Your Money:"] = false,
|
["Your Money:"] = "Tu dinero:",
|
||||||
|
["Change language"] = "Cambiar idioma",
|
||||||
|
["Don't stretch or shrink Game Window"] = "No estirar o encoger Ventana de Juego"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -347,7 +347,7 @@ locale = {
|
|||||||
["You are dazzled"] = "Jestes oslepiony",
|
["You are dazzled"] = "Jestes oslepiony",
|
||||||
["You are dead."] = "Zginales marnie.",
|
["You are dead."] = "Zginales marnie.",
|
||||||
["You are dead"] = false,
|
["You are dead"] = false,
|
||||||
["You are drowing"] = "Topisz sie",
|
["You are drowning"] = "Topisz sie",
|
||||||
["You are drunk"] = false,
|
["You are drunk"] = false,
|
||||||
["You are electrified"] = "Jestes porazony pradem",
|
["You are electrified"] = "Jestes porazony pradem",
|
||||||
["You are freezing"] = "Marzniesz",
|
["You are freezing"] = "Marzniesz",
|
||||||
|
@@ -5,6 +5,12 @@ locale = {
|
|||||||
|
|
||||||
-- As tradu<64><75>es devem vir sempre em ordem alfab<61>tica.
|
-- As tradu<64><75>es devem vir sempre em ordem alfab<61>tica.
|
||||||
translation = {
|
translation = {
|
||||||
|
["%d of experience per hour"] = "%d de experi<72>ncia por hora",
|
||||||
|
["%s of experience left"] = "%s de experi<72>ncia faltando",
|
||||||
|
["%s: (use object on target)"] = "%s: (usar objeto no alvo)",
|
||||||
|
["%s: (use object on yourself)"] = "%s: (usar objeto em si)",
|
||||||
|
["%s: (use object with crosshair)"] = "%s: (usar objeto com mira)",
|
||||||
|
["%s: (use object)"] = "%s: (usar objeto)",
|
||||||
["1a) Offensive Name"] = "1a) Nome ofensivo",
|
["1a) Offensive Name"] = "1a) Nome ofensivo",
|
||||||
["1b) Invalid Name Format"] = "1b) Nome com formato inv<6E>lido",
|
["1b) Invalid Name Format"] = "1b) Nome com formato inv<6E>lido",
|
||||||
["1c) Unsuitable Name"] = "1c) Nome n<>o adequado",
|
["1c) Unsuitable Name"] = "1c) Nome n<>o adequado",
|
||||||
@@ -26,48 +32,51 @@ locale = {
|
|||||||
["4c) False Report to Gamemaster"] = "4c) Relat<61>rio falso para Gamemaster",
|
["4c) False Report to Gamemaster"] = "4c) Relat<61>rio falso para Gamemaster",
|
||||||
["Accept"] = "Aceitar",
|
["Accept"] = "Aceitar",
|
||||||
["Account name"] = "Nome da conta",
|
["Account name"] = "Nome da conta",
|
||||||
["Account Status:"] = false,
|
["Account Status"] = "Estado da Conta",
|
||||||
["Action:"] = "A<EFBFBD><EFBFBD>o:",
|
["Action"] = "A<EFBFBD><EFBFBD>o",
|
||||||
["Add"] = "Adicionar",
|
["Add new server"] = "Adicionar novo servidor",
|
||||||
["Add new VIP"] = "Adicionar nova VIP",
|
["Add new VIP"] = "Adicionar nova VIP",
|
||||||
|
["Add to VIP list"] = "Adicionar a lista VIP",
|
||||||
|
["Add"] = "Adicionar",
|
||||||
["Addon 1"] = "Addon 1",
|
["Addon 1"] = "Addon 1",
|
||||||
["Addon 2"] = "Addon 2",
|
["Addon 2"] = "Addon 2",
|
||||||
["Addon 3"] = "Addon 3",
|
["Addon 3"] = "Addon 3",
|
||||||
["Add to VIP list"] = "Adicionar a lista VIP",
|
|
||||||
["Adjust volume"] = "Ajustar volume",
|
["Adjust volume"] = "Ajustar volume",
|
||||||
["Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back\ninto this world in exchange for a small sacrifice\n\nSimply click on Ok to resume your journeys!"] = false,
|
["Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back\ninto this world in exchange for a small sacrifice\n\nSimply click on Ok to resume your journeys!"] = false,
|
||||||
["All"] = "Todos",
|
|
||||||
["All modules and scripts were reloaded."] = "Todos m<>dulos e scripts foram recarregados.",
|
["All modules and scripts were reloaded."] = "Todos m<>dulos e scripts foram recarregados.",
|
||||||
|
["All"] = "Todos",
|
||||||
["Allow auto chase override"] = "Permitir sobrescrever o modo de persegui<75><69>o",
|
["Allow auto chase override"] = "Permitir sobrescrever o modo de persegui<75><69>o",
|
||||||
["Also known as dash in tibia community, recommended\nfor playing characters with high speed"] = "Tamb<EFBFBD>m conhecido como dash na comunidade tibiana, recomendado\npara jogar com personagem que possuam velocidade alta",
|
["Also known as dash in tibia community, recommended\nfor playing characters with high speed"] = "Tamb<EFBFBD>m conhecido como dash na comunidade tibiana, recomendado\npara jogar com personagem que possuam velocidade alta",
|
||||||
["Ambient light: %s%%"] = "Luz ambiente: %s%%",
|
["Ambient light: %s%%"] = "Luz ambiente: %s%%",
|
||||||
["Amount:"] = "Quantidade:",
|
|
||||||
["Amount"] = "Quantidade",
|
["Amount"] = "Quantidade",
|
||||||
["Anonymous"] = "An<EFBFBD>nimo",
|
["Anonymous"] = "An<EFBFBD>nimo",
|
||||||
|
["Any"] = "Qualquer",
|
||||||
["Are you sure you want to logout?"] = "Voc<EFBFBD> tem certeza que quer sair?",
|
["Are you sure you want to logout?"] = "Voc<EFBFBD> tem certeza que quer sair?",
|
||||||
["Attack"] = "Atacar",
|
["Attack"] = "Atacar",
|
||||||
|
["Audio"] = "<EFBFBD>udio",
|
||||||
["Author"] = "Autor",
|
["Author"] = "Autor",
|
||||||
["Autoload"] = "Carregar automaticamente",
|
|
||||||
["Autoload priority"] = "Prioridade de carregamento",
|
|
||||||
["Auto login"] = "Entrar automaticamente",
|
|
||||||
["Auto login selected character on next charlist load"] = "Entrar automaticamente com o personagem quando reabrir a lista de personagens",
|
["Auto login selected character on next charlist load"] = "Entrar automaticamente com o personagem quando reabrir a lista de personagens",
|
||||||
|
["Auto login"] = "Entrar automaticamente",
|
||||||
|
["Autoload priority"] = "Prioridade de carregamento",
|
||||||
|
["Autoload"] = "Carregar automaticamente",
|
||||||
["Axe Fighting"] = "Combate com Machado",
|
["Axe Fighting"] = "Combate com Machado",
|
||||||
["Balance:"] = "Saldo:",
|
["Balance"] = "Saldo",
|
||||||
["Banishment"] = "Banimento",
|
|
||||||
["Banishment + Final Warning"] = "Banimento + Aviso final",
|
["Banishment + Final Warning"] = "Banimento + Aviso final",
|
||||||
|
["Banishment"] = "Banimento",
|
||||||
["Battle"] = "Batalha",
|
["Battle"] = "Batalha",
|
||||||
["Browse"] = "Navegar",
|
["Browse"] = "Navegar",
|
||||||
["Bug report sent."] = "Reporte de bug enviado.",
|
["Bug report sent."] = "Reporte de bug enviado.",
|
||||||
["Button Assign"] = "Selecionar bot<6F>o",
|
["Button Assign"] = "Selecionar bot<6F>o",
|
||||||
["Buy"] = "Comprar",
|
|
||||||
["Buy Now"] = "Comparar agora",
|
["Buy Now"] = "Comparar agora",
|
||||||
["Buy Offers"] = "Ofertas de compra",
|
["Buy Offers"] = "Ofertas de compra",
|
||||||
["Buy with backpack"] = "Comprar com mochila",
|
["Buy with backpack"] = "Comprar com mochila",
|
||||||
|
["Buy"] = "Comprar",
|
||||||
["Cancel"] = "Cancelar",
|
["Cancel"] = "Cancelar",
|
||||||
["Cannot login while already in game."] = "N<EFBFBD>o <20> possivel logar enquanto j<> estiver jogando.",
|
["Cannot login while already in game."] = "N<EFBFBD>o <20> possivel logar enquanto j<> estiver jogando.",
|
||||||
["Cap"] = "Cap",
|
["Cap"] = "Cap",
|
||||||
["Capacity"] = "Capacidade",
|
["Capacity"] = "Capacidade",
|
||||||
["Center"] = "Centro",
|
["Center"] = "Centro",
|
||||||
|
["Change language"] = "Trocar l<>ngua",
|
||||||
["Channels"] = "Canais",
|
["Channels"] = "Canais",
|
||||||
["Character List"] = "Lista de personagens",
|
["Character List"] = "Lista de personagens",
|
||||||
["Classic control"] = "Controle cl<63>ssico",
|
["Classic control"] = "Controle cl<63>ssico",
|
||||||
@@ -75,15 +84,17 @@ locale = {
|
|||||||
["Clear Messages"] = "Limpar mensagens",
|
["Clear Messages"] = "Limpar mensagens",
|
||||||
["Clear object"] = "Limpar objeto",
|
["Clear object"] = "Limpar objeto",
|
||||||
["Client needs update."] = "O client do jogo precisa ser atualizado",
|
["Client needs update."] = "O client do jogo precisa ser atualizado",
|
||||||
["Close"] = "Fechar",
|
|
||||||
["Close this channel"] = "Fechar esse canal",
|
["Close this channel"] = "Fechar esse canal",
|
||||||
|
["Close"] = "Fechar",
|
||||||
["Club Fighting"] = "Combate com Porrete",
|
["Club Fighting"] = "Combate com Porrete",
|
||||||
["Combat Controls"] = "Controles de combate",
|
["Combat Controls"] = "Controles de combate",
|
||||||
["Comment:"] = "Coment<EFBFBD>rio:",
|
["Comment"] = "Coment<EFBFBD>rio",
|
||||||
["Connecting to game server..."] = "Conectando no servidor do jogo...",
|
["Connecting to game server..."] = "Conectando no servidor do jogo...",
|
||||||
["Connecting to login server..."] = "Conectando no servidor de autentica<63><61>o...",
|
["Connecting to login server..."] = "Conectando no servidor de autentica<63><61>o...",
|
||||||
|
["Connection Error"] = "Erro de Conex<65>o",
|
||||||
["Console"] = "Console",
|
["Console"] = "Console",
|
||||||
["Cooldowns"] = false,
|
["Cooldown"] = "Cooldown",
|
||||||
|
["Cooldowns"] = "Cooldowns",
|
||||||
["Copy message"] = "Copiar mensagem",
|
["Copy message"] = "Copiar mensagem",
|
||||||
["Copy name"] = "Copiar nome",
|
["Copy name"] = "Copiar nome",
|
||||||
["Copy Name"] = "Copiar Nome",
|
["Copy Name"] = "Copiar Nome",
|
||||||
@@ -91,25 +102,34 @@ locale = {
|
|||||||
["Create mark"] = "Criar marca",
|
["Create mark"] = "Criar marca",
|
||||||
["Create New Offer"] = "Criar nova oferta",
|
["Create New Offer"] = "Criar nova oferta",
|
||||||
["Create Offer"] = "Criar oferta",
|
["Create Offer"] = "Criar oferta",
|
||||||
["Current hotkeys:"] = "Atalhos atuais",
|
|
||||||
["Current hotkey to add: %s"] = "Atalho atual para adicionar: %s",
|
["Current hotkey to add: %s"] = "Atalho atual para adicionar: %s",
|
||||||
|
["Current hotkeys:"] = "Atalhos atuais",
|
||||||
["Current Offers"] = "Ofertas atuais",
|
["Current Offers"] = "Ofertas atuais",
|
||||||
["Default"] = "Padr<EFBFBD>o",
|
["Default"] = "Padr<EFBFBD>o",
|
||||||
["Delete mark"] = "Deletar marca",
|
["Delete mark"] = "Deletar marca",
|
||||||
["Description:"] = "Descri<EFBFBD><EFBFBD>o",
|
|
||||||
["Description"] = "Descri<EFBFBD><EFBFBD>o",
|
["Description"] = "Descri<EFBFBD><EFBFBD>o",
|
||||||
|
["Description:"] = "Descri<EFBFBD><EFBFBD>o",
|
||||||
["Destructive Behaviour"] = "Comportamento destrutivo",
|
["Destructive Behaviour"] = "Comportamento destrutivo",
|
||||||
["Detail"] = "Detalhe",
|
["Detail"] = "Detalhe",
|
||||||
["Details"] = "Detalhes",
|
["Details"] = "Detalhes",
|
||||||
["Disable Shared Experience"] = "Desativar experi<72>ncia compartilhada",
|
["Disable Shared Experience"] = "Desativar experi<72>ncia compartilhada",
|
||||||
["Dismount"] = "Desmontar",
|
["Dismount"] = "Desmontar",
|
||||||
["Display connection speed to the server (milliseconds)"] = "Exibir a velocidade de conex<65>o com o servidor (milisegundos)",
|
["Display connection speed to the server (milliseconds)"] = "Exibir a velocidade de conex<65>o com o servidor (milisegundos)",
|
||||||
|
["Display creature health bars"] = "Exibir barras de vida das criaturas",
|
||||||
|
["Display creature names"] = "Exibir nomes das criaturas",
|
||||||
|
["Display text messages"] = "Exibir mensagens de texto",
|
||||||
["Distance Fighting"] = "Combate a Dist<73>ncia",
|
["Distance Fighting"] = "Combate a Dist<73>ncia",
|
||||||
["Don't stretch/shrink Game Window"] = "N<EFBFBD>o esticar a janela do game",
|
["Don't stretch or shrink Game Window"] = "N<EFBFBD>o esticar ou contrair a janela do game",
|
||||||
|
["Druid"] = "Druid",
|
||||||
["Edit hotkey text:"] = "Editar texto do atalho",
|
["Edit hotkey text:"] = "Editar texto do atalho",
|
||||||
["Edit List"] = "Editar lista",
|
["Edit List"] = "Editar lista",
|
||||||
["Edit Text"] = "Editar Texto",
|
["Edit Text"] = "Editar Texto",
|
||||||
|
["Enable audio"] = "Ativar <20>udio",
|
||||||
|
["Enable dash walking"] = "Ativar andar r<>pido",
|
||||||
|
["Enable lights"] = "Ativar luzes",
|
||||||
|
["Enable music sound"] = "Ativar m<>sica",
|
||||||
["Enable music"] = "Ativar musica",
|
["Enable music"] = "Ativar musica",
|
||||||
|
["Enable shader effects"] = "Ativar efeitos shader",
|
||||||
["Enable Shared Experience"] = "Ativar experi<72>ncia compartilhada",
|
["Enable Shared Experience"] = "Ativar experi<72>ncia compartilhada",
|
||||||
["Enable smart walking"] = "Ativar andar inteligente",
|
["Enable smart walking"] = "Ativar andar inteligente",
|
||||||
["Enable vertical synchronization"] = "Ativar sincroniza<7A><61>o vertical",
|
["Enable vertical synchronization"] = "Ativar sincroniza<7A><61>o vertical",
|
||||||
@@ -118,162 +138,174 @@ locale = {
|
|||||||
["Enter one name per line."] = "Entre somente um nome por linha.",
|
["Enter one name per line."] = "Entre somente um nome por linha.",
|
||||||
["Enter with your account again to update your client."] = "Entre com sua conta denovo para atualizar o client.",
|
["Enter with your account again to update your client."] = "Entre com sua conta denovo para atualizar o client.",
|
||||||
["Error"] = "Erro",
|
["Error"] = "Erro",
|
||||||
["Error"] = "Erro",
|
|
||||||
["Excessive Unjustified Player Killing"] = "Assassinato em excesso, sem justificativa, de jogadores",
|
["Excessive Unjustified Player Killing"] = "Assassinato em excesso, sem justificativa, de jogadores",
|
||||||
["Exclude from private chat"] = "Excluir do canal privado",
|
["Exclude from private chat"] = "Excluir do canal privado",
|
||||||
["Exit"] = "Sair",
|
["Exit"] = "Sair",
|
||||||
["Experience"] = "Experi<EFBFBD>ncia",
|
["Experience"] = "Experi<EFBFBD>ncia",
|
||||||
["Filter list to match your level"] = "Filtrar a lista para o seu level",
|
["Filter list to match your level"] = "Filtrar a lista para o seu level",
|
||||||
["Filter list to match your vocation"] = "Filtrar a lista para a sua voca<63><61>o",
|
["Filter list to match your vocation"] = "Filtrar a lista para a sua voca<63><61>o",
|
||||||
["Find:"] = "Procurar",
|
["Find"] = "Procurar",
|
||||||
["Fishing"] = "Pesca",
|
["Fishing"] = "Pesca",
|
||||||
["Fist Fighting"] = "Porrada",
|
["Fist Fighting"] = "Porrada",
|
||||||
["Follow"] = "Seguir",
|
["Follow"] = "Seguir",
|
||||||
["Force Exit"] = "For<EFBFBD>ar Saida",
|
|
||||||
["For Your Information"] = "Para sua informa<6D><61>o",
|
["For Your Information"] = "Para sua informa<6D><61>o",
|
||||||
["Free Account"] = false,
|
["Force Exit"] = "For<EFBFBD>ar Saida",
|
||||||
|
["Formula"] = "F<EFBFBD>rmula",
|
||||||
|
["Free Account"] = "Conta Gr<47>tis",
|
||||||
["Fullscreen"] = "Tela cheia",
|
["Fullscreen"] = "Tela cheia",
|
||||||
["Game"] = "Jogo",
|
|
||||||
["Game framerate limit: %s"] = "Limite da taxa de quadros do jogo: %s",
|
["Game framerate limit: %s"] = "Limite da taxa de quadros do jogo: %s",
|
||||||
["Graphics"] = "Gr<EFBFBD>ficos",
|
["Game"] = "Jogo",
|
||||||
["Graphics card driver not detected"] = false,
|
["Graphics card driver not detected"] = "Driver da placa de v<>deo n<>o detectado",
|
||||||
["Graphics Engine:"] = "Motor Gr<47>fico:",
|
["Graphics Engine:"] = "Motor Gr<47>fico:",
|
||||||
|
["Graphics"] = "Gr<EFBFBD>ficos",
|
||||||
|
["Group"] = "Grupo",
|
||||||
["Head"] = "Cabe<EFBFBD>a",
|
["Head"] = "Cabe<EFBFBD>a",
|
||||||
["Healing"] = false,
|
["Healing"] = "Curando",
|
||||||
["Health Info"] = "Barra de Vida",
|
["Health Info"] = "Barra de Vida",
|
||||||
["Health Information"] = "Informa<EFBFBD><EFBFBD>o de vida",
|
["Health Information"] = "Informa<EFBFBD><EFBFBD>o de vida",
|
||||||
["Hide monsters"] = "Esconder montros",
|
["Hide monsters"] = "Esconder montros",
|
||||||
["Hide non-skull players"] = "Esconder jogadores sem caveira",
|
["Hide non-skull players"] = "Esconder jogadores sem caveira",
|
||||||
["Hide Npcs"] = "Esconder NPCs",
|
["Hide Npcs"] = "Esconder NPCs",
|
||||||
["Hide Offline"] = false,
|
["Hide Offline"] = "Esconder Offline",
|
||||||
["Hide party members"] = "Esconder membros do grupo",
|
["Hide party members"] = "Esconder membros do grupo",
|
||||||
["Hide players"] = "Esconder jogadores",
|
["Hide players"] = "Esconder jogadores",
|
||||||
["Hide spells for higher exp. levels"] = false,
|
["Hide spells for higher exp. levels"] = "Esconder feiti<74>os de n<>vel maior",
|
||||||
["Hide spells for other vocations"] = false,
|
["Hide spells for other vocations"] = "Esconder feiti<74>os de outras voca<63><61>es",
|
||||||
["Hit Points"] = "Pontos de Vida",
|
["Hit Points"] = "Pontos de Vida",
|
||||||
["Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks"] = false,
|
["Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks"] = "Segure o bot<6F>o esquerdo para navegar\nGire o bot<6F>o do centro do mouse para ampliar\nClique com o bot<6F>o direito do mouse para criar marcas",
|
||||||
|
["Host"] = "Host",
|
||||||
["Hotkeys"] = "Atalhos",
|
["Hotkeys"] = "Atalhos",
|
||||||
["If you shut down the program, your character might stay in the game.\nClick on 'Logout' to ensure that you character leaves the game properly.\nClick on 'Exit' if you want to exit the program without logging out your character."] = "Se voc<6F> desligar o programa o seu personagem pode continuar no jogo.\nClique em 'Sair' para assegurar que seu personagem saia do jogo adequadamente.\nClique em 'For<6F>ar Saida' para fechar o programa sem desconectar seu personagem.",
|
["If you shut down the program, your character might stay in the game.\nClick on 'Logout' to ensure that you character leaves the game properly.\nClick on 'Exit' if you want to exit the program without logging out your character."] = "Se voc<6F> desligar o programa o seu personagem pode continuar no jogo.\nClique em 'Sair' para assegurar que seu personagem saia do jogo adequadamente.\nClique em 'For<6F>ar Saida' para fechar o programa sem desconectar seu personagem.",
|
||||||
["Ignore"] = false,
|
|
||||||
["Ignore capacity"] = "Ignorar capacidade",
|
["Ignore capacity"] = "Ignorar capacidade",
|
||||||
["Ignored players:"] = false,
|
|
||||||
["Ignore equipped"] = "Ignorar equipado",
|
["Ignore equipped"] = "Ignorar equipado",
|
||||||
["Ignore List"] = false,
|
["Ignore List"] = "Lista de Ignorados",
|
||||||
["Ignore players"] = false,
|
["Ignore players"] = "Jogadores ignorados",
|
||||||
["Ignore Private Messages"] = false,
|
["Ignore Private Messages"] = "Ignorar mensagens privadas",
|
||||||
["Ignore Yelling"] = false,
|
["Ignore Yelling"] = "Ignorar gritos",
|
||||||
|
["Ignore"] = "Ignorar",
|
||||||
|
["Ignored players:"] = "Joadores ignorados:",
|
||||||
["Interface framerate limit: %s"] = "Limite da taxa de quadros da interface: %s",
|
["Interface framerate limit: %s"] = "Limite da taxa de quadros da interface: %s",
|
||||||
["Inventory"] = "Invent<EFBFBD>rio",
|
["Inventory"] = "Invent<EFBFBD>rio",
|
||||||
["Invite to Party"] = "Convidar para o grupo",
|
["Invite to Party"] = "Convidar para o grupo",
|
||||||
["Invite to private chat"] = "Convidar para o canal privado",
|
["Invite to private chat"] = "Convidar para o canal privado",
|
||||||
["IP Address Banishment"] = "Banimento de endere<72>o IP",
|
["IP Address Banishment"] = "Banimento de endere<72>o IP",
|
||||||
|
["It is empty."] = "Est<EFBFBD> vazio.",
|
||||||
["Item Offers"] = "Ofertas de items",
|
["Item Offers"] = "Ofertas de items",
|
||||||
["It is empty."] = false,
|
|
||||||
["Join %s's Party"] = "Entrar na party do %s",
|
["Join %s's Party"] = "Entrar na party do %s",
|
||||||
|
["Knight"] = "Knight",
|
||||||
["Leave Party"] = "Sair do grupo",
|
["Leave Party"] = "Sair do grupo",
|
||||||
["Level"] = "N<EFBFBD>vel",
|
["Level"] = "N<EFBFBD>vel",
|
||||||
["Lifetime Premium Account"] = false,
|
["Lifetime Premium Account"] = "Conta Premium para a vida toda.",
|
||||||
["Limits FPS to 60"] = "Limita o FPS para 60",
|
["Limits FPS to 60"] = "Limita o FPS para 60",
|
||||||
["List of items that you're able to buy"] = "Lista de itens que voc<6F> pode comprar",
|
["List of items that you're able to buy"] = "Lista de itens que voc<6F> pode comprar",
|
||||||
["List of items that you're able to sell"] = "Lista de itens que voc<6F> pode vender",
|
["List of items that you're able to sell"] = "Lista de itens que voc<6F> pode vender",
|
||||||
["Load"] = "Carregar",
|
["Load"] = "Carregar",
|
||||||
["Logging out..."] = "Saindo...",
|
["Logging out..."] = "Saindo...",
|
||||||
|
["Login Error"] = "Erro de Autentica<63><61>o",
|
||||||
["Login"] = "Entrar",
|
["Login"] = "Entrar",
|
||||||
["Login Error"] = "Erro de Autentica<63><61>o",
|
|
||||||
["Login Error"] = "Erro de Autentica<63><61>o",
|
|
||||||
["Logout"] = "Sair",
|
["Logout"] = "Sair",
|
||||||
["Look"] = "Olhar",
|
["Look"] = "Olhar",
|
||||||
["Magic Level"] = "N<EFBFBD>vel M<>gico",
|
["Magic Level"] = "N<EFBFBD>vel M<>gico",
|
||||||
["Make sure that your client uses\nthe correct game protocol version"] = "Tenha certeza que o seu cliente use\no mesmo protocolo do servidor do jogo",
|
["Make sure that your client uses\nthe correct game protocol version"] = "Tenha certeza que o seu cliente use\no mesmo protocolo do servidor do jogo",
|
||||||
["Mana"] = "Mana",
|
["Mana"] = "Mana",
|
||||||
["Manage hotkeys:"] = "Configurar atalhos:",
|
["Manage hotkeys:"] = "Configurar atalhos:",
|
||||||
["Market"] = "Mercado",
|
|
||||||
["Market Offers"] = "Ofertas do mercado",
|
["Market Offers"] = "Ofertas do mercado",
|
||||||
|
["Market"] = "Mercado",
|
||||||
["Message of the day"] = "Mensagem do dia",
|
["Message of the day"] = "Mensagem do dia",
|
||||||
["Message to "] = "Mensagem para ",
|
["Message to "] = "Mensagem para ",
|
||||||
["Message to %s"] = "Mandar mensagem para %s",
|
["Message to %s"] = "Mandar mensagem para %s",
|
||||||
["Minimap"] = "Minimapa",
|
["Minimap"] = "Minimapa",
|
||||||
["Module Manager"] = "Gerenciador de M<>dulos",
|
["Module Manager"] = "Gerenciador de M<>dulos",
|
||||||
["Module name"] = "Nome do m<>dulo",
|
["Module name"] = "Nome do m<>dulo",
|
||||||
["Mount"] = false,
|
["Mount"] = "Montar",
|
||||||
["Move Stackable Item"] = "Mover item cont<6E>vel",
|
["Move Stackable Item"] = "Mover item cont<6E>vel",
|
||||||
["Move up"] = "Mover para cima",
|
["Move up"] = "Mover para cima",
|
||||||
|
["Music volume: %d"] = "Volume da m<>sica: %d",
|
||||||
["My Offers"] = "Minhas ofertas",
|
["My Offers"] = "Minhas ofertas",
|
||||||
["Name:"] = "Nome:",
|
|
||||||
["Name Report"] = "Reportar Nome",
|
|
||||||
["Name Report + Banishment"] = "Reportar Nome + Banimento",
|
|
||||||
["Name Report + Banishment + Final Warning"] = "Reportar Nome + Banimento + Aviso Final",
|
["Name Report + Banishment + Final Warning"] = "Reportar Nome + Banimento + Aviso Final",
|
||||||
["No"] = "N<EFBFBD>o",
|
["Name Report + Banishment"] = "Reportar Nome + Banimento",
|
||||||
|
["Name Report"] = "Reportar Nome",
|
||||||
|
["Name"] = "Nome",
|
||||||
|
["New Server"] = "Novo Servidor",
|
||||||
|
["Next level in %d hours and %d minutes"] = "Pr<EFBFBD>ximo n<>vel em %d horas e %d minutos",
|
||||||
["No graphics card detected, everything will be drawn using the CPU,\nthus the performance will be really bad.\nPlease update your graphics driver to have a better performance."] = false,
|
["No graphics card detected, everything will be drawn using the CPU,\nthus the performance will be really bad.\nPlease update your graphics driver to have a better performance."] = false,
|
||||||
["No item selected."] = "Nenhum item selecionado",
|
["No item selected."] = "Nenhum item selecionado",
|
||||||
["No Mount"] = "Sem montaria",
|
["No Mount"] = "Sem montaria",
|
||||||
["No Outfit"] = "Sem roupa",
|
["No Outfit"] = "Sem roupa",
|
||||||
["No statement has been selected."] = "Nenhuma afirma<6D><61>o foi selecionada.",
|
["No statement has been selected."] = "Nenhuma afirma<6D><61>o foi selecionada.",
|
||||||
|
["No"] = "N<EFBFBD>o",
|
||||||
["Notation"] = "Nota<EFBFBD><EFBFBD>o",
|
["Notation"] = "Nota<EFBFBD><EFBFBD>o",
|
||||||
["NPC Trade"] = "Troca com NPC",
|
["NPC Trade"] = "Troca com NPC",
|
||||||
["Offer History"] = "Hist<EFBFBD>rico de ofertas",
|
["Offer History"] = "Hist<EFBFBD>rico de ofertas",
|
||||||
|
["Offer Type"] = "Tipo de oferta",
|
||||||
["Offers"] = "Ofertas",
|
["Offers"] = "Ofertas",
|
||||||
["Offer Type:"] = "Tipo de oferta:",
|
|
||||||
["Offline Training"] = "Treino Offline",
|
["Offline Training"] = "Treino Offline",
|
||||||
["Ok"] = "Ok",
|
["Ok"] = "Ok",
|
||||||
["on %s.\n"] = "em %s.\n",
|
["on %s.\n"] = "em %s.\n",
|
||||||
["Open"] = "Abrir",
|
|
||||||
["Open a private message channel:"] = "Abrir um canal privado:",
|
["Open a private message channel:"] = "Abrir um canal privado:",
|
||||||
["Open charlist automatically when starting client"] = false,
|
["Open charlist automatically when starting client"] = "Abrir lista de personagens ao iniciar o cliente",
|
||||||
["Open in new window"] = "Abrir em nova janela",
|
["Open in new window"] = "Abrir em nova janela",
|
||||||
["Open new channel"] = "Abrir novo canal",
|
["Open new channel"] = "Abrir novo canal",
|
||||||
|
["Open"] = "Abrir",
|
||||||
["Options"] = "Op<EFBFBD><EFBFBD>es",
|
["Options"] = "Op<EFBFBD><EFBFBD>es",
|
||||||
["Overview"] = "Vis<EFBFBD>o geral",
|
["Overview"] = "Vis<EFBFBD>o geral",
|
||||||
|
["Paladin"] = "Paladin",
|
||||||
["Pass Leadership to %s"] = "Passar lideran<61>a para %s",
|
["Pass Leadership to %s"] = "Passar lideran<61>a para %s",
|
||||||
["Password"] = "Senha",
|
["Password"] = "Senha",
|
||||||
["Piece Price:"] = "Pre<EFBFBD>o por pe<70>a:",
|
["Piece Price"] = "Pre<EFBFBD>o por pe<70>a",
|
||||||
["Please enter a character name:"] = "Por favor, entre com o nome do personagem:",
|
["Please enter a character name:"] = "Por favor, entre com o nome do personagem:",
|
||||||
["Please, press the key you wish to add onto your hotkeys manager"] = "Por favor, pressione a tecla que voc<6F> deseja\nadicionar no gerenciador de atalhos",
|
|
||||||
["Please Select"] = "Por favor, selecione algo",
|
["Please Select"] = "Por favor, selecione algo",
|
||||||
["Please use this dialog to only report bugs. Do not report rule violations here!"] = "Por favor, use este campo apenas para reportar defeitos. N<>o reporte viola<6C><61>o de regras aqui!",
|
["Please use this dialog to only report bugs. Do not report rule violations here!"] = "Por favor, use este campo apenas para reportar defeitos. N<>o reporte viola<6C><61>o de regras aqui!",
|
||||||
["Please wait"] = "Por favor, espere",
|
["Please wait"] = "Por favor, espere",
|
||||||
|
["Please, press the key you wish to add onto your hotkeys manager"] = "Por favor, pressione a tecla que voc<6F> deseja\nadicionar no gerenciador de atalhos",
|
||||||
["Port"] = "Porta",
|
["Port"] = "Porta",
|
||||||
["Position:"] = false,
|
["Position"] = "Posi<EFBFBD><EFBFBD>o",
|
||||||
["Position: %i %i %i"] = false,
|
["Position: %i %i %i"] = "Posi<EFBFBD><EFBFBD>o: %i %i %i",
|
||||||
["Premium Account (%s) days left"] = false,
|
["Premium Account (%s) days left"] = "Conta Premium (%s) dias faltando",
|
||||||
["Price:"] = "Pre<EFBFBD>o",
|
["Premium"] = "Premium",
|
||||||
|
["Price"] = "Pre<EFBFBD>o",
|
||||||
["Primary"] = "Prim<EFBFBD>rio",
|
["Primary"] = "Prim<EFBFBD>rio",
|
||||||
["Protocol"] = "Protocolo",
|
["Protocol"] = "Protocolo",
|
||||||
["Quest Log"] = "Registro de Quest",
|
["Quest Log"] = "Registro de Quest",
|
||||||
["Randomize"] = "Embaralhar",
|
|
||||||
["Randomize characters outfit"] = "Gerar roupa aleat<61>ria",
|
["Randomize characters outfit"] = "Gerar roupa aleat<61>ria",
|
||||||
["Reason:"] = "Motivo:",
|
["Randomize"] = "Embaralhar",
|
||||||
["Refresh"] = "Atualizar",
|
["Reason"] = "Motivo",
|
||||||
["Refresh Offers"] = "Atualizar Ofertas",
|
["Refresh Offers"] = "Atualizar Ofertas",
|
||||||
|
["Refresh"] = "Atualizar",
|
||||||
["Regeneration Time"] = "Tempo de Regenera<72><61>o",
|
["Regeneration Time"] = "Tempo de Regenera<72><61>o",
|
||||||
["Reject"] = "Rejeitar",
|
["Reject"] = "Rejeitar",
|
||||||
["Reload All"] = "Recarregar Todos",
|
["Reload All"] = "Recarregar Todos",
|
||||||
["Remember account and password when starts client"] = false,
|
["Remember account and password when starts client"] = "Lembrar conta e senha quando iniciar o cliente",
|
||||||
["Remember password"] = "Lembrar senha",
|
["Remember password"] = "Lembrar senha",
|
||||||
["Remove"] = "Remover",
|
|
||||||
["Remove %s"] = "Remover %s",
|
["Remove %s"] = "Remover %s",
|
||||||
|
["Remove"] = "Remover",
|
||||||
["Report Bug"] = "Reportar defeito",
|
["Report Bug"] = "Reportar defeito",
|
||||||
["Reserved for more functionality later."] = "Reservado para futura maior funcionalidade.",
|
["Reserved for more functionality later."] = "Reservado para futura maior funcionalidade.",
|
||||||
|
["Reset All"] = "Resetar Todos",
|
||||||
["Reset Market"] = "Resetar Mercado",
|
["Reset Market"] = "Resetar Mercado",
|
||||||
["Revoke %s's Invitation"] = "N<EFBFBD>o aceitar o convite do %s",
|
["Revoke %s's Invitation"] = "N<EFBFBD>o aceitar o convite do %s",
|
||||||
["Rotate"] = "Girar",
|
["Rotate"] = "Girar",
|
||||||
["Rule Violation"] = "Viola<EFBFBD><EFBFBD>o de regra",
|
["Rule Violation"] = "Viola<EFBFBD><EFBFBD>o de regra",
|
||||||
["Save"] = false,
|
["Save Messages"] = "Salvar Mensagens",
|
||||||
["Save Messages"] = false,
|
["Save"] = "Salvar",
|
||||||
["Search:"] = "Procurar:",
|
|
||||||
["Search all items"] = "Procurar todos os items",
|
["Search all items"] = "Procurar todos os items",
|
||||||
|
["Search"] = "Procurar",
|
||||||
["Secondary"] = "Secund<EFBFBD>rio",
|
["Secondary"] = "Secund<EFBFBD>rio",
|
||||||
["Select object"] = "Selecionar objeto",
|
["Select object"] = "Selecionar objeto",
|
||||||
["Select Outfit"] = "Selecionar Roupa",
|
["Select Outfit"] = "Selecionar Roupa",
|
||||||
["Select your language"] = false,
|
["Select your language"] = "Selecione sua l<>ngua",
|
||||||
["Sell"] = "Vender",
|
["Select"] = "Selecionar",
|
||||||
|
["Sell All"] = "Vender Todos",
|
||||||
["Sell Now"] = "Vender agora",
|
["Sell Now"] = "Vender agora",
|
||||||
["Sell Offers"] = "Ofertas de venda",
|
["Sell Offers"] = "Ofertas de venda",
|
||||||
["Send"] = "Enviar",
|
["Sell"] = "Vender",
|
||||||
["Send automatically"] = "Enviar automaticamente",
|
["Send automatically"] = "Enviar automaticamente",
|
||||||
["Send Message"] = false,
|
["Send Message"] = "Enviar Mensagem",
|
||||||
["Server"] = "Servidor",
|
["Send"] = "Enviar",
|
||||||
|
["Server List"] = "Lista de Servidores",
|
||||||
|
["Server list"] = "Lista de servidores",
|
||||||
["Server Log"] = "Registro do servidor",
|
["Server Log"] = "Registro do servidor",
|
||||||
|
["Server"] = "Servidor",
|
||||||
["Set Outfit"] = "Escolher Roupa",
|
["Set Outfit"] = "Escolher Roupa",
|
||||||
["Shielding"] = "Defesa",
|
["Shielding"] = "Defesa",
|
||||||
["Show all items"] = "Exibir todos os itens",
|
["Show all items"] = "Exibir todos os itens",
|
||||||
@@ -284,57 +316,57 @@ locale = {
|
|||||||
["Show info messages in console"] = "Exibir mensagens informativas no console",
|
["Show info messages in console"] = "Exibir mensagens informativas no console",
|
||||||
["Show left panel"] = "Mostrar barra lateral esquerda",
|
["Show left panel"] = "Mostrar barra lateral esquerda",
|
||||||
["Show levels in console"] = "Exibir n<>veis no console",
|
["Show levels in console"] = "Exibir n<>veis no console",
|
||||||
["Show Offline"] = false,
|
["Show Offline"] = "Mostrar Offline",
|
||||||
["Show private messages in console"] = "Exibir mensagens privadas no console",
|
["Show private messages in console"] = "Exibir mensagens privadas no console",
|
||||||
["Show private messages on screen"] = "Exibir mensagens na tela",
|
["Show private messages on screen"] = "Exibir mensagens na tela",
|
||||||
["Show Server Messages"] = false,
|
["Show Server Messages"] = "Mostrar Mensagens do Servidor",
|
||||||
["Show status messages in console"] = "Exibir mensagens de estado no console",
|
["Show status messages in console"] = "Exibir mensagens de estado no console",
|
||||||
["Show Text"] = "Mostrar texto",
|
["Show Text"] = "Mostrar texto",
|
||||||
["Show timestamps in console"] = "Exibir o hor<6F>rio no console",
|
["Show timestamps in console"] = "Exibir o hor<6F>rio no console",
|
||||||
["Show your depot items only"] = "Mostrar os itens somentedo dep<65>sito",
|
["Show your depot items only"] = "Mostrar os itens somentedo dep<65>sito",
|
||||||
["Skills"] = "Habilidades",
|
["Skills"] = "Habilidades",
|
||||||
["Soul"] = "Alma",
|
["Sorcerer"] = "Sorcerer",
|
||||||
["Soul Points"] = "Pontos de Alma",
|
["Soul Points"] = "Pontos de Alma",
|
||||||
["Special"] = false,
|
["Soul"] = "Alma",
|
||||||
|
["Special"] = "Especial",
|
||||||
["Speed"] = "Velocidade",
|
["Speed"] = "Velocidade",
|
||||||
["Spell Cooldowns"] = false,
|
["Spell Cooldowns"] = "",
|
||||||
["Spell List"] = false,
|
["Spell List"] = "Lista de Feiti<74>os",
|
||||||
["Stamina"] = "Vigor",
|
["Stamina"] = "Vigor",
|
||||||
["Statement:"] = "Afirma<EFBFBD><EFBFBD>o:",
|
|
||||||
["Statement Report"] = "Afirmar Relato",
|
["Statement Report"] = "Afirmar Relato",
|
||||||
|
["Statement"] = "Afirma<EFBFBD><EFBFBD>o",
|
||||||
["Statistics"] = "Estat<EFBFBD>sticas",
|
["Statistics"] = "Estat<EFBFBD>sticas",
|
||||||
["Stop Attack"] = "Parar de Atacar",
|
["Stop Attack"] = "Parar de Atacar",
|
||||||
["Stop Follow"] = "Parar de Seguir",
|
["Stop Follow"] = "Parar de Seguir",
|
||||||
["Support"] = false,
|
["Support"] = "Suporte",
|
||||||
["%s: (use object)"] = "%s: (usar objeto)",
|
|
||||||
["%s: (use object on target)"] = "%s: (usar objeto no alvo)",
|
|
||||||
["%s: (use object on yourself)"] = "%s: (usar objeto em si)",
|
|
||||||
["%s: (use object with crosshair)"] = "%s: (usar objeto com mira)",
|
|
||||||
["Sword Fighting"] = "Combate com Espada",
|
["Sword Fighting"] = "Combate com Espada",
|
||||||
["Terminal"] = "Terminal",
|
["Terminal"] = "Terminal",
|
||||||
["There is no way."] = "N<EFBFBD>o h<> rota",
|
["There is no way."] = "N<EFBFBD>o h<> rota",
|
||||||
["Title"] = false,
|
["Title"] = "T<EFBFBD>tulo",
|
||||||
["Total Price:"] = "Pre<EFBFBD>o total:",
|
["Total Price"] = "Pre<EFBFBD>o total",
|
||||||
["Trade"] = "Trocar",
|
|
||||||
["Trade with ..."] = "Trocar com ...",
|
["Trade with ..."] = "Trocar com ...",
|
||||||
|
["Trade"] = "Trocar",
|
||||||
["Trying to reconnect in %s seconds."] = "Tentando reconectar em %s segundos.",
|
["Trying to reconnect in %s seconds."] = "Tentando reconectar em %s segundos.",
|
||||||
["Unable to load dat file, please place a valid dat in '%s'"] = "N<EFBFBD>o foi poss<73>vel carregar o arquivo dat, por favor coloque um arquivo v<>lido em %s",
|
["Type"] = "Tipo",
|
||||||
["Unable to load spr file, please place a valid spr in '%s'"] = "N<EFBFBD>o foi poss<73>vel carregar o arquivo spr, por favor coloque um arquivo v<>lido em %s",
|
["Unable to establish a connection. (err: %d)"] = "N<EFBFBD>o foi poss<73>vel estabilizar a conex<65>. (err: %d)",
|
||||||
|
["Unable to load dat file, please place a valid dat in '%s'"] = "N<EFBFBD>o foi poss<73>vel carregar o arquivo DAT, por favor coloque um arquivo v<>lido em %s",
|
||||||
|
["Unable to load spr file, please place a valid spr in '%s'"] = "N<EFBFBD>o foi poss<73>vel carregar o arquivo SPR, por favor coloque um arquivo v<>lido em %s",
|
||||||
["Unable to logout."] = "N<EFBFBD>o <20> possivel sair",
|
["Unable to logout."] = "N<EFBFBD>o <20> possivel sair",
|
||||||
["Unignore"] = false,
|
["Unignore"] = "Designorar",
|
||||||
["Unload"] = "Descarregar",
|
["Unload"] = "Descarregar",
|
||||||
["Update needed"] = false,
|
["Update needed"] = "Atualiza<EFBFBD><EFBFBD>o necess<73>ria",
|
||||||
["Use"] = "Usar",
|
|
||||||
["Use on target"] = "Usar no alvo",
|
["Use on target"] = "Usar no alvo",
|
||||||
["Use on yourself"] = "Usar em si",
|
["Use on yourself"] = "Usar em si",
|
||||||
["Use with ..."] = "Usar com ...",
|
["Use with ..."] = "Usar com ...",
|
||||||
|
["Use"] = "Usar",
|
||||||
["Version"] = "Vers<EFBFBD>o",
|
["Version"] = "Vers<EFBFBD>o",
|
||||||
["VIP List"] = "Lista VIP",
|
["VIP List"] = "Lista VIP",
|
||||||
["Voc."] = "Voc.",
|
["Voc."] = "Voc.",
|
||||||
["Vocation"] = false,
|
["Vocation"] = "Voca<EFBFBD><EFBFBD>o",
|
||||||
["Waiting List"] = "Lista de espera",
|
["Waiting List"] = "Lista de espera",
|
||||||
["Website"] = "Website",
|
["Website"] = "Website",
|
||||||
["Weight:"] = "Peso",
|
["Weight"] = "Peso",
|
||||||
|
["Will boost your walk on high speed characters"] = "Ir<EFBFBD> melhorar o andar de persnagens r<>pidos",
|
||||||
["Will detect when to use diagonal step based on the\nkeys you are pressing"] = "Detectar quando usar o passo diagonal\nbaseado nas teclas pressionadas",
|
["Will detect when to use diagonal step based on the\nkeys you are pressing"] = "Detectar quando usar o passo diagonal\nbaseado nas teclas pressionadas",
|
||||||
["With crosshair"] = "Com mira",
|
["With crosshair"] = "Com mira",
|
||||||
["Yes"] = "Sim",
|
["Yes"] = "Sim",
|
||||||
@@ -342,9 +374,9 @@ locale = {
|
|||||||
["You are burning"] = "Voc<EFBFBD> est<73> queimando",
|
["You are burning"] = "Voc<EFBFBD> est<73> queimando",
|
||||||
["You are cursed"] = "Voc<EFBFBD> est<73> amaldi<64>oado",
|
["You are cursed"] = "Voc<EFBFBD> est<73> amaldi<64>oado",
|
||||||
["You are dazzled"] = "Voc<EFBFBD> est<73> deslumbrado",
|
["You are dazzled"] = "Voc<EFBFBD> est<73> deslumbrado",
|
||||||
["You are dead."] = "Voc<EFBFBD> est<73> morto.",
|
|
||||||
["You are dead"] = "Voc<EFBFBD> est<73> morto",
|
["You are dead"] = "Voc<EFBFBD> est<73> morto",
|
||||||
["You are drowing"] = "Voc<EFBFBD> est<73> se afogando",
|
["You are dead."] = "Voc<EFBFBD> est<73> morto.",
|
||||||
|
["You are drowning"] = "Voc<EFBFBD> est<73> se afogando",
|
||||||
["You are drunk"] = "Voc<EFBFBD> est<73> b<>bado",
|
["You are drunk"] = "Voc<EFBFBD> est<73> b<>bado",
|
||||||
["You are electrified"] = "Voc<EFBFBD> est<73> eletrificado",
|
["You are electrified"] = "Voc<EFBFBD> est<73> eletrificado",
|
||||||
["You are freezing"] = "Voc<EFBFBD> est<73> congelando",
|
["You are freezing"] = "Voc<EFBFBD> est<73> congelando",
|
||||||
@@ -356,17 +388,21 @@ locale = {
|
|||||||
["You are strengthened"] = "Voc<EFBFBD> est<73> refor<6F>ado",
|
["You are strengthened"] = "Voc<EFBFBD> est<73> refor<6F>ado",
|
||||||
["You are within a protection zone"] = "Voc<EFBFBD> est<73> dentro de uma zona de prote<74><65>o",
|
["You are within a protection zone"] = "Voc<EFBFBD> est<73> dentro de uma zona de prote<74><65>o",
|
||||||
["You can enter new text."] = "Voc<EFBFBD> pode entrar com um novo texto.",
|
["You can enter new text."] = "Voc<EFBFBD> pode entrar com um novo texto.",
|
||||||
["You have %s percent"] = "Voc<EFBFBD> tem %s porcento",
|
["You have %d%% to advance to level %d."] = "Voc<EFBFBD> tem %d%% para avan<61>ar para o n<>vel %d.",
|
||||||
["You have %s percent to go"] = "Voc<EFBFBD> tem %s porcento para avan<61>ar",
|
["You have %s percent to go"] = "Voc<EFBFBD> tem %s porcento para avan<61>ar",
|
||||||
|
["You have %s percent"] = "Voc<EFBFBD> tem %s porcento",
|
||||||
["You may not logout during a fight"] = "Voc<EFBFBD> n<>o pode sair durante um combate",
|
["You may not logout during a fight"] = "Voc<EFBFBD> n<>o pode sair durante um combate",
|
||||||
["You may not logout or enter a protection zone"] = "Voc<EFBFBD> n<>o pode sair ou entrar em uma zona de prote<74><65>o",
|
["You may not logout or enter a protection zone"] = "Voc<EFBFBD> n<>o pode sair ou entrar em uma zona de prote<74><65>o",
|
||||||
["You must enter a comment."] = "Voc<EFBFBD> precisa entrar com um coment<6E>rio",
|
["You must enter a comment."] = "Voc<EFBFBD> precisa entrar com um coment<6E>rio",
|
||||||
["You must enter a valid server address and port."] = "Voc<EFBFBD> precisa colocar um endere<72>o e uma porta do servidor v<>lidos.",
|
["You must enter a valid server address and port."] = "Voc<EFBFBD> precisa colocar um endere<72>o e uma porta do servidor v<>lidos.",
|
||||||
["You must select a character to login!"] = "Voc<EFBFBD> deve selecionar um personagem para entrar!",
|
["You must select a character to login!"] = "Voc<EFBFBD> deve selecionar um personagem para entrar!",
|
||||||
["Your Capacity:"] = "Sua capacidade:",
|
|
||||||
["You read the following, written by \n%s\n"] = "Voc<EFBFBD> l<> o seguinte, escrito por \n%s\n",
|
["You read the following, written by \n%s\n"] = "Voc<EFBFBD> l<> o seguinte, escrito por \n%s\n",
|
||||||
["You read the following, written on \n%s.\n"] = false,
|
["You read the following, written on \n%s.\n"] = "Voc<EFBFBD> l<> o seguinte, escrito em \n%s.\n",
|
||||||
["Your Money:"] = "Seu dinheiro:",
|
["Your Capacity"] = "Sua capacidade",
|
||||||
|
["Your character health is %d out of %d."] = "A vida do seu personagem <20> %d de %d.",
|
||||||
|
["Your character mana is %d out of %d."] = "A mana do seu personagem <20> %d de %d.",
|
||||||
|
["Your connection has been lost. (err: %d)"] = "A sua conex<65>o foi perdida. (err: %d)",
|
||||||
|
["Your Money"] = "Seu dinheiro",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -345,7 +345,7 @@ locale = {
|
|||||||
["You are dazzled"] = "Du <20>r chockad",
|
["You are dazzled"] = "Du <20>r chockad",
|
||||||
["You are dead."] = "Du <20>r d<>d.",
|
["You are dead."] = "Du <20>r d<>d.",
|
||||||
["You are dead"] = "Du <20>r d<>d",
|
["You are dead"] = "Du <20>r d<>d",
|
||||||
["You are drowing"] = "Du drunknar",
|
["You are drowning"] = "Du drunknar",
|
||||||
["You are drunk"] = "Du <20>r full.",
|
["You are drunk"] = "Du <20>r full.",
|
||||||
["You are electrified"] = "Du <20>r elektrifierad",
|
["You are electrified"] = "Du <20>r elektrifierad",
|
||||||
["You are freezing"] = "Du Fryser",
|
["You are freezing"] = "Du Fryser",
|
||||||
|
@@ -1,35 +1,36 @@
|
|||||||
Particle
|
Particle
|
||||||
name: default_particle
|
name: groupcooldown_particle
|
||||||
|
|
||||||
duration: 10
|
duration: 0.4
|
||||||
min-position-radius: 0
|
min-position-radius: 0
|
||||||
max-position-radius: 256
|
max-position-radius: 32
|
||||||
min-position-angle: 0
|
min-position-angle: 0
|
||||||
max-position-angle: 360
|
max-position-angle: 360
|
||||||
velocity: 10
|
velocity: 10
|
||||||
min-velocity-angle: 0
|
min-velocity-angle: 0
|
||||||
max-velocity-angle: 360
|
max-velocity-angle: 360
|
||||||
colors: #ffffff00 #ffffffff #00000000
|
colors: #ffffff00 #ffffffff #fff13000
|
||||||
colors-stops: 0 0.1 1
|
colors-stops: 0 0.1 1
|
||||||
size: 24 24
|
size: 1 1
|
||||||
texture: /data/particles/particle
|
texture: /particles/particle
|
||||||
composition-mode: normal
|
composition-mode: normal
|
||||||
|
|
||||||
Effect
|
Effect
|
||||||
name: background-effect
|
name: groupcooldown-effect
|
||||||
description: Effect for the game background
|
description: Effect for group cooldowns in the cooldown module
|
||||||
|
|
||||||
System
|
System
|
||||||
position: 0 0
|
position: 0 0
|
||||||
|
|
||||||
Emitter
|
Emitter
|
||||||
position: 0 0
|
position: 0 0
|
||||||
delay: 0
|
delay: 0.06
|
||||||
duration: 0
|
duration: 0.2
|
||||||
burst-rate: 50
|
burst-rate: 350
|
||||||
burst-count: 1
|
burst-count: 50
|
||||||
particle-type: default_particle
|
particle-type: groupcooldown_particle
|
||||||
|
|
||||||
AttractionAffector
|
AttractionAffector
|
||||||
position: 0 0
|
position: 0 0
|
||||||
acceleration: 1000
|
acceleration: 1000
|
||||||
|
|
||||||
|
@@ -67,3 +67,17 @@ PreviousButton < UIButton
|
|||||||
|
|
||||||
$disabled:
|
$disabled:
|
||||||
image-color: #ffffff55
|
image-color: #ffffff55
|
||||||
|
|
||||||
|
AddButton < UIButton
|
||||||
|
size: 20 20
|
||||||
|
image-source: /images/ui/icon_add
|
||||||
|
image-color: #ffffffff
|
||||||
|
|
||||||
|
$hover !disabled:
|
||||||
|
image-color: #ffffff99
|
||||||
|
|
||||||
|
$pressed:
|
||||||
|
image-color: #ffffff44
|
||||||
|
|
||||||
|
$disabled:
|
||||||
|
image-color: #ffffff55
|
||||||
|
@@ -38,7 +38,7 @@ CreatureButton < UICreatureButton
|
|||||||
margin-left: 2
|
margin-left: 2
|
||||||
phantom: true
|
phantom: true
|
||||||
|
|
||||||
ProgressBar
|
LifeProgressBar
|
||||||
id: lifeBar
|
id: lifeBar
|
||||||
height: 5
|
height: 5
|
||||||
anchors.left: spacer.right
|
anchors.left: spacer.right
|
||||||
|
@@ -4,3 +4,7 @@ Item < UIItem
|
|||||||
image-source: /images/ui/item
|
image-source: /images/ui/item
|
||||||
font: verdana-11px-rounded
|
font: verdana-11px-rounded
|
||||||
border-color: white
|
border-color: white
|
||||||
|
color: white
|
||||||
|
|
||||||
|
$disabled:
|
||||||
|
color: #646464
|
||||||
|
@@ -21,45 +21,3 @@ MenuLabel < Label
|
|||||||
GameLabel < UILabel
|
GameLabel < UILabel
|
||||||
font: verdana-11px-antialised
|
font: verdana-11px-antialised
|
||||||
color: #bbbbbb
|
color: #bbbbbb
|
||||||
|
|
||||||
FrameCounterLabel < Label
|
|
||||||
font: verdana-11px-rounded
|
|
||||||
@onSetup: |
|
|
||||||
self.updateEvent = cycleEvent(function()
|
|
||||||
local text = 'FPS: ' .. g_app.getBackgroundPaneFps()
|
|
||||||
self:setText(text)
|
|
||||||
end, 1000)
|
|
||||||
@onDestroy: self.updateEvent:cancel()
|
|
||||||
|
|
||||||
PingLabel < Label
|
|
||||||
font: verdana-11px-rounded
|
|
||||||
@onSetup: |
|
|
||||||
self.updateEvent = cycleEvent(function()
|
|
||||||
if g_game.isOnline() and modules.client_options.getOption('showPing') then
|
|
||||||
local ping = -1
|
|
||||||
if g_game.getFeature(GameClientPing) or g_game.getFeature(GameExtendedClientPing) then
|
|
||||||
ping = g_game.getPing()
|
|
||||||
else
|
|
||||||
ping = g_game.getLocalPlayer():getWalkPing()
|
|
||||||
end
|
|
||||||
local text = 'Ping: '
|
|
||||||
if ping < 0 then
|
|
||||||
text = text .. "??"
|
|
||||||
self:setColor('yellow')
|
|
||||||
else
|
|
||||||
text = text .. ping .. ' ms'
|
|
||||||
if ping >= 500 then
|
|
||||||
self:setColor('red')
|
|
||||||
elseif ping >= 250 then
|
|
||||||
self:setColor('yellow')
|
|
||||||
else
|
|
||||||
self:setColor('green')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
self:setText(text)
|
|
||||||
self:show()
|
|
||||||
else
|
|
||||||
self:hide()
|
|
||||||
end
|
|
||||||
end, 1000)
|
|
||||||
@onDestroy: self.updateEvent:cancel()
|
|
||||||
|
@@ -4,6 +4,7 @@ TextList < UIScrollArea
|
|||||||
border-color: #1d222b
|
border-color: #1d222b
|
||||||
background-color: #222833
|
background-color: #222833
|
||||||
padding: 1
|
padding: 1
|
||||||
|
auto-focus: none
|
||||||
|
|
||||||
HorizontalList < UIScrollArea
|
HorizontalList < UIScrollArea
|
||||||
layout: horizontalBox
|
layout: horizontalBox
|
||||||
|
@@ -1,8 +1,10 @@
|
|||||||
Panel < UIWidget
|
Panel < UIWidget
|
||||||
phantom: true
|
phantom: true
|
||||||
|
auto-focus: first
|
||||||
|
|
||||||
ScrollablePanel < UIScrollArea
|
ScrollablePanel < UIScrollArea
|
||||||
phantom: true
|
phantom: true
|
||||||
|
auto-focus: first
|
||||||
|
|
||||||
FlatPanel < Panel
|
FlatPanel < Panel
|
||||||
image-source: /images/ui/panel_flat
|
image-source: /images/ui/panel_flat
|
||||||
|
@@ -1,9 +1,24 @@
|
|||||||
ProgressBar < UIProgressBar
|
ProgressBar < UIProgressBar
|
||||||
height: 16
|
height: 16
|
||||||
background-color: red
|
background-color: red
|
||||||
border: 1 black
|
|
||||||
image-source: /images/ui/progressbar
|
image-source: /images/ui/progressbar
|
||||||
image-border: 1
|
image-border: 1
|
||||||
|
font: verdana-11px-rounded
|
||||||
|
text-offset: 0 2
|
||||||
|
|
||||||
|
$!on:
|
||||||
|
visible: false
|
||||||
|
margin-top: 0
|
||||||
|
margin-bottom: 0
|
||||||
|
height: 0
|
||||||
|
|
||||||
|
LifeProgressBar < UIProgressBar
|
||||||
|
height: 16
|
||||||
|
background-color: green
|
||||||
|
border: 1 black
|
||||||
|
font: verdana-11px-rounded
|
||||||
|
text-offset: 0 2
|
||||||
|
margin: 2
|
||||||
|
|
||||||
ProgressRect < UIProgressRect
|
ProgressRect < UIProgressRect
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
@@ -5,7 +5,7 @@ ScrollBarSlider < UIButton
|
|||||||
image-source: /images/ui/scrollbar
|
image-source: /images/ui/scrollbar
|
||||||
image-clip: 0 26 13 13
|
image-clip: 0 26 13 13
|
||||||
image-border: 2
|
image-border: 2
|
||||||
image-color: #ffffffbb
|
image-color: #ffffffff
|
||||||
$hover:
|
$hover:
|
||||||
image-clip: 13 26 13 13
|
image-clip: 13 26 13 13
|
||||||
$pressed:
|
$pressed:
|
||||||
@@ -14,6 +14,12 @@ ScrollBarSlider < UIButton
|
|||||||
$disabled:
|
$disabled:
|
||||||
image-color: #ffffff66
|
image-color: #ffffff66
|
||||||
|
|
||||||
|
ScrollBarValueLabel < Label
|
||||||
|
id: valueLabel
|
||||||
|
anchors.fill: parent
|
||||||
|
color: white
|
||||||
|
text-align: center
|
||||||
|
|
||||||
VerticalScrollBar < UIScrollBar
|
VerticalScrollBar < UIScrollBar
|
||||||
orientation: vertical
|
orientation: vertical
|
||||||
width: 13
|
width: 13
|
||||||
@@ -55,6 +61,8 @@ VerticalScrollBar < UIScrollBar
|
|||||||
|
|
||||||
ScrollBarSlider
|
ScrollBarSlider
|
||||||
|
|
||||||
|
ScrollBarValueLabel
|
||||||
|
|
||||||
HorizontalScrollBar < UIScrollBar
|
HorizontalScrollBar < UIScrollBar
|
||||||
orientation: horizontal
|
orientation: horizontal
|
||||||
height: 13
|
height: 13
|
||||||
@@ -97,3 +105,5 @@ HorizontalScrollBar < UIScrollBar
|
|||||||
image-color: #ffffff66
|
image-color: #ffffff66
|
||||||
|
|
||||||
ScrollBarSlider
|
ScrollBarSlider
|
||||||
|
|
||||||
|
ScrollBarValueLabel
|
||||||
|
6
data/styles/20-imageview.otui
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
ImageView < UIImageView
|
||||||
|
image-smooth: false
|
||||||
|
image-fixed-ratio: true
|
||||||
|
draggable: true
|
||||||
|
border-width: 2
|
||||||
|
border-color: #000000
|
@@ -1,18 +1,10 @@
|
|||||||
PopupMenuButton < UIButton
|
PopupMenuButton < UIButton
|
||||||
height: 18
|
height: 18
|
||||||
margin-left: 5
|
|
||||||
margin-right: 5
|
|
||||||
margin-top: 1
|
|
||||||
margin-bottom: 1
|
|
||||||
size: 0 21
|
size: 0 21
|
||||||
text-offset: 0 0
|
text-offset: 4 0
|
||||||
|
text-align: left
|
||||||
font: verdana-11px-antialised
|
font: verdana-11px-antialised
|
||||||
|
|
||||||
image-source: /images/ui/button_popupmenu
|
|
||||||
image-color: white
|
|
||||||
image-clip: 0 0 20 20
|
|
||||||
image-border: 2
|
|
||||||
|
|
||||||
color: #aaaaaa
|
color: #aaaaaa
|
||||||
background-color: alpha
|
background-color: alpha
|
||||||
|
|
||||||
@@ -24,6 +16,13 @@ PopupMenuButton < UIButton
|
|||||||
$disabled:
|
$disabled:
|
||||||
color: #555555
|
color: #555555
|
||||||
|
|
||||||
|
PopupMenuShortcutLabel < Label
|
||||||
|
font: verdana-11px-antialised
|
||||||
|
text-align: right
|
||||||
|
anchors.fill: parent
|
||||||
|
margin-right: 2
|
||||||
|
margin-left: 5
|
||||||
|
|
||||||
PopupMenuSeparator < UIWidget
|
PopupMenuSeparator < UIWidget
|
||||||
margin-left: 2
|
margin-left: 2
|
||||||
margin-right: 2
|
margin-right: 2
|
||||||
@@ -39,5 +38,4 @@ PopupMenu < UIPopupMenu
|
|||||||
width: 50
|
width: 50
|
||||||
image-source: /images/ui/menubox
|
image-source: /images/ui/menubox
|
||||||
image-border: 3
|
image-border: 3
|
||||||
padding-top: 3
|
padding: 3
|
||||||
padding-bottom: 3
|
|
||||||
|
@@ -1,7 +1,9 @@
|
|||||||
SpinBox < TextEdit
|
SpinBox < TextEdit
|
||||||
__class: UISpinBox
|
__class: UISpinBox
|
||||||
|
text-align: left
|
||||||
size: 86 20
|
size: 86 20
|
||||||
padding: 0
|
padding: 0
|
||||||
|
padding-left: 2
|
||||||
|
|
||||||
Button
|
Button
|
||||||
id: up
|
id: up
|
||||||
@@ -11,7 +13,6 @@ SpinBox < TextEdit
|
|||||||
image-clip: 0 0 10 10
|
image-clip: 0 0 10 10
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
@onClick: self:getParent():up()
|
|
||||||
|
|
||||||
$hover:
|
$hover:
|
||||||
image-clip: 0 10 10 10
|
image-clip: 0 10 10 10
|
||||||
@@ -26,7 +27,6 @@ SpinBox < TextEdit
|
|||||||
image-clip: 0 0 10 10
|
image-clip: 0 0 10 10
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
@onClick: self:getParent():down()
|
|
||||||
|
|
||||||
$hover:
|
$hover:
|
||||||
image-clip: 0 10 10 10
|
image-clip: 0 10 10 10
|
||||||
|
@@ -104,7 +104,7 @@ TabBarVerticalButton < UIButton
|
|||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
$!first:
|
$!first:
|
||||||
anchors.top: prev.bottom
|
anchors.top: prev.bottom
|
||||||
margin-top: 5
|
margin-top: 10
|
||||||
$hover !checked:
|
$hover !checked:
|
||||||
color: white
|
color: white
|
||||||
icon-color: #cccccc
|
icon-color: #cccccc
|
||||||
|
@@ -6,6 +6,9 @@ TopButton < UIButton
|
|||||||
image-color: #ffffffff
|
image-color: #ffffffff
|
||||||
icon-color: #ffffffff
|
icon-color: #ffffffff
|
||||||
|
|
||||||
|
$on:
|
||||||
|
image-source: /images/ui/button_top_blink
|
||||||
|
|
||||||
$hover !disabled:
|
$hover !disabled:
|
||||||
image-color: #ffffff99
|
image-color: #ffffff99
|
||||||
image-clip: 26 0 26 26
|
image-clip: 26 0 26 26
|
||||||
@@ -43,7 +46,11 @@ TopMenuPanel < Panel
|
|||||||
image-repeated: true
|
image-repeated: true
|
||||||
focusable: false
|
focusable: false
|
||||||
|
|
||||||
TopMenuFrameCounterLabel < FrameCounterLabel
|
TopMenuFrameCounterLabel < Label
|
||||||
|
font: verdana-11px-rounded
|
||||||
color: white
|
color: white
|
||||||
margin-top: 4
|
margin-top: 4
|
||||||
margin-left: 5
|
margin-left: 5
|
||||||
|
|
||||||
|
TopMenuPingLabel < Label
|
||||||
|
font: verdana-11px-rounded
|
||||||
|
@@ -1,8 +1,9 @@
|
|||||||
MessageBoxLabel < Label
|
MessageBoxLabel < Label
|
||||||
id: messageBoxLabel
|
id: messageBoxLabel
|
||||||
text-auto-resize: true
|
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
|
text-wrap: true
|
||||||
|
text-auto-resize: true
|
||||||
|
|
||||||
MessageBoxButtonHolder < UIWidget
|
MessageBoxButtonHolder < UIWidget
|
||||||
id: buttonHolder
|
id: buttonHolder
|
||||||
|
244
data/styles/30-minimap.otui
Normal file
@@ -0,0 +1,244 @@
|
|||||||
|
MinimapFlag < UIWidget
|
||||||
|
size: 11 11
|
||||||
|
focusable: false
|
||||||
|
|
||||||
|
MinimapCross < UIWidget
|
||||||
|
focusable: false
|
||||||
|
phantom: true
|
||||||
|
image: /images/game/minimap/cross
|
||||||
|
size: 16 16
|
||||||
|
|
||||||
|
MinimapFloorUpButton < Button
|
||||||
|
size: 20 20
|
||||||
|
margin-right: 28
|
||||||
|
margin-bottom: 28
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
icon-source: /images/game/minimap/floor_up
|
||||||
|
icon-clip: 0 32 16 16
|
||||||
|
$pressed:
|
||||||
|
icon-clip: 0 0 16 16
|
||||||
|
$hover !pressed:
|
||||||
|
icon-clip: 0 16 16 16
|
||||||
|
|
||||||
|
MinimapFloorDownButton < Button
|
||||||
|
size: 20 20
|
||||||
|
margin-right: 28
|
||||||
|
margin-bottom: 4
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
icon-source: /images/game/minimap/floor_down
|
||||||
|
icon-clip: 0 32 16 16
|
||||||
|
$pressed:
|
||||||
|
icon-clip: 0 0 16 16
|
||||||
|
$hover !pressed:
|
||||||
|
icon-clip: 0 16 16 16
|
||||||
|
|
||||||
|
MinimapZoomInButton < Button
|
||||||
|
text: +
|
||||||
|
size: 20 20
|
||||||
|
margin-right: 4
|
||||||
|
margin-bottom: 28
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
//icon-source: /images/game/minimap/zoom_in
|
||||||
|
|
||||||
|
MinimapZoomOutButton < Button
|
||||||
|
text: -
|
||||||
|
size: 20 20
|
||||||
|
margin-right: 4
|
||||||
|
margin-bottom: 4
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
//icon-source: /images/game/minimap/zoom_out
|
||||||
|
|
||||||
|
MinimapResetButton < Button
|
||||||
|
!text: tr('Center')
|
||||||
|
size: 44 20
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.top: parent.top
|
||||||
|
margin: 4
|
||||||
|
|
||||||
|
Minimap < UIMinimap
|
||||||
|
draggable: true
|
||||||
|
focusable: false
|
||||||
|
cross: true
|
||||||
|
color: black
|
||||||
|
|
||||||
|
MinimapFloorUpButton
|
||||||
|
id: floorUp
|
||||||
|
@onClick: self:getParent():floorUp(1)
|
||||||
|
|
||||||
|
MinimapFloorDownButton
|
||||||
|
id: floorDown
|
||||||
|
@onClick: self:getParent():floorDown(1)
|
||||||
|
|
||||||
|
MinimapZoomInButton
|
||||||
|
id: zoomIn
|
||||||
|
@onClick: self:getParent():zoomIn()
|
||||||
|
|
||||||
|
MinimapZoomOutButton
|
||||||
|
id: zoomOut
|
||||||
|
@onClick: self:getParent():zoomOut()
|
||||||
|
|
||||||
|
MinimapResetButton
|
||||||
|
id: reset
|
||||||
|
@onClick: self:getParent():reset()
|
||||||
|
|
||||||
|
|
||||||
|
// Minimap Flag Create Window
|
||||||
|
|
||||||
|
|
||||||
|
MinimapFlagCheckBox < CheckBox
|
||||||
|
size: 15 15
|
||||||
|
margin-left: 2
|
||||||
|
image-source: /images/game/minimap/flagcheckbox
|
||||||
|
image-size: 15 15
|
||||||
|
image-border: 3
|
||||||
|
icon-source: /images/game/minimap/mapflags
|
||||||
|
icon-size: 11 11
|
||||||
|
icon-offset: 2 4
|
||||||
|
anchors.left: prev.right
|
||||||
|
anchors.top: prev.top
|
||||||
|
$!checked:
|
||||||
|
image-clip: 26 0 26 26
|
||||||
|
$hover !checked:
|
||||||
|
image-clip: 78 0 26 26
|
||||||
|
$checked:
|
||||||
|
image-clip: 0 0 26 26
|
||||||
|
$hover checked:
|
||||||
|
image-clip: 52 0 26 26
|
||||||
|
|
||||||
|
MinimapFlagWindow < MainWindow
|
||||||
|
!text: tr('Create Map Mark')
|
||||||
|
size: 196 185
|
||||||
|
|
||||||
|
Label
|
||||||
|
!text: tr('Position') .. ':'
|
||||||
|
text-auto-resize: true
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
margin-top: 2
|
||||||
|
|
||||||
|
Label
|
||||||
|
id: position
|
||||||
|
text-auto-resize: true
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.right: parent.right
|
||||||
|
margin-top: 2
|
||||||
|
|
||||||
|
Label
|
||||||
|
!text: tr('Description') .. ':'
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
margin-top: 7
|
||||||
|
|
||||||
|
TextEdit
|
||||||
|
id: description
|
||||||
|
margin-top: 3
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
anchors.right: parent.right
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag0
|
||||||
|
icon-source: /images/game/minimap/flag0
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
margin-top: 6
|
||||||
|
margin-left: 0
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag1
|
||||||
|
icon-source: /images/game/minimap/flag1
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag2
|
||||||
|
icon-source: /images/game/minimap/flag2
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag3
|
||||||
|
icon-source: /images/game/minimap/flag3
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag4
|
||||||
|
icon-source: /images/game/minimap/flag4
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag5
|
||||||
|
icon-source: /images/game/minimap/flag5
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag6
|
||||||
|
icon-source: /images/game/minimap/flag6
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag7
|
||||||
|
icon-source: /images/game/minimap/flag7
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag8
|
||||||
|
icon-source: /images/game/minimap/flag8
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag9
|
||||||
|
icon-source: /images/game/minimap/flag9
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag10
|
||||||
|
icon-source: /images/game/minimap/flag10
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
margin-top: 6
|
||||||
|
margin-left: 0
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag11
|
||||||
|
icon-source: /images/game/minimap/flag11
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag12
|
||||||
|
icon-source: /images/game/minimap/flag12
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag13
|
||||||
|
icon-source: /images/game/minimap/flag13
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag14
|
||||||
|
icon-source: /images/game/minimap/flag14
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag15
|
||||||
|
icon-source: /images/game/minimap/flag15
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag16
|
||||||
|
icon-source: /images/game/minimap/flag16
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag17
|
||||||
|
icon-source: /images/game/minimap/flag17
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag18
|
||||||
|
icon-source: /images/game/minimap/flag18
|
||||||
|
|
||||||
|
MinimapFlagCheckBox
|
||||||
|
id: flag19
|
||||||
|
icon-source: /images/game/minimap/flag19
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: okButton
|
||||||
|
!text: tr('Ok')
|
||||||
|
width: 64
|
||||||
|
anchors.right: next.left
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
margin-right: 10
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: cancelButton
|
||||||
|
!text: tr('Cancel')
|
||||||
|
width: 64
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
8
init.lua
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
-- setup logger
|
-- setup logger
|
||||||
g_logger.setLogFile(g_resources.getWorkDir() .. g_app.getCompactName() .. ".log")
|
g_logger.setLogFile(g_resources.getWorkDir() .. g_app.getCompactName() .. ".log")
|
||||||
|
g_logger.info(os.date("== application started at %b %d %Y %X"))
|
||||||
|
|
||||||
-- print first terminal message
|
-- print first terminal message
|
||||||
g_logger.info(g_app.getName() .. ' ' .. g_app.getVersion() .. ' rev ' .. g_app.getBuildRevision() .. ' (' .. g_app.getBuildCommit() .. ') built on ' .. g_app.getBuildDate() .. ' for arch ' .. g_app.getBuildArch())
|
g_logger.info(g_app.getName() .. ' ' .. g_app.getVersion() .. ' rev ' .. g_app.getBuildRevision() .. ' (' .. g_app.getBuildCommit() .. ') built on ' .. g_app.getBuildDate() .. ' for arch ' .. g_app.getBuildArch())
|
||||||
@@ -47,7 +48,8 @@ g_modules.ensureModuleLoaded("game_interface")
|
|||||||
-- mods 1000-9999
|
-- mods 1000-9999
|
||||||
g_modules.autoLoadModules(9999)
|
g_modules.autoLoadModules(9999)
|
||||||
|
|
||||||
if g_resources.fileExists("/otclientrc") then
|
local script = '/' .. g_app.getCompactName() .. 'rc.lua'
|
||||||
dofile("/otclientrc")
|
|
||||||
end
|
|
||||||
|
|
||||||
|
if g_resources.fileExists(script) then
|
||||||
|
dofile(script)
|
||||||
|
end
|
@@ -1,5 +1,5 @@
|
|||||||
local musicFilename = "/sounds/startup"
|
local musicFilename = "/sounds/startup"
|
||||||
local musicChannel = g_sounds.getChannel(1)
|
local musicChannel = nil
|
||||||
|
|
||||||
function setMusic(filename)
|
function setMusic(filename)
|
||||||
musicFilename = filename
|
musicFilename = filename
|
||||||
@@ -11,9 +11,14 @@ function setMusic(filename)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function reloadScripts()
|
function reloadScripts()
|
||||||
g_textures.clearTexturesCache()
|
g_textures.clearCache()
|
||||||
g_modules.reloadModules()
|
g_modules.reloadModules()
|
||||||
dofile('/' .. g_app.getCompactName() .. 'rc')
|
|
||||||
|
local script = '/' .. g_app.getCompactName() .. 'rc'
|
||||||
|
if g_resources.fileExists(script) then
|
||||||
|
dofile(script)
|
||||||
|
end
|
||||||
|
|
||||||
local message = tr('All modules and scripts were reloaded.')
|
local message = tr('All modules and scripts were reloaded.')
|
||||||
|
|
||||||
modules.game_textmessage.displayGameMessage(message)
|
modules.game_textmessage.displayGameMessage(message)
|
||||||
@@ -48,12 +53,18 @@ function startup()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function init()
|
function init()
|
||||||
|
connect(g_app, { onRun = startup,
|
||||||
|
onExit = exit })
|
||||||
|
|
||||||
g_window.setMinimumSize({ width = 600, height = 480 })
|
g_window.setMinimumSize({ width = 600, height = 480 })
|
||||||
|
|
||||||
|
musicChannel = g_sounds.getChannel(1)
|
||||||
g_sounds.preload(musicFilename)
|
g_sounds.preload(musicFilename)
|
||||||
|
|
||||||
-- initialize in fullscreen mode on mobile devices
|
-- initialize in fullscreen mode on mobile devices
|
||||||
if g_window.getPlatformType() == "X11-EGL" then
|
if g_app.getOs() == "android" then
|
||||||
g_window.setFullscreen(true)
|
g_window.maximize()
|
||||||
|
--g_window.setFullscreen(true)
|
||||||
else
|
else
|
||||||
-- window size
|
-- window size
|
||||||
local size = { width = 800, height = 600 }
|
local size = { width = 800, height = 600 }
|
||||||
@@ -82,10 +93,16 @@ function init()
|
|||||||
|
|
||||||
g_keyboard.bindKeyDown('Ctrl+Shift+R', reloadScripts)
|
g_keyboard.bindKeyDown('Ctrl+Shift+R', reloadScripts)
|
||||||
|
|
||||||
connect(g_app, { onRun = startup })
|
-- generate machine uuid, this is a security measure for storing passwords
|
||||||
|
if not g_crypt.setMachineUUID(g_configs.get('uuid')) then
|
||||||
|
g_configs.set('uuid', g_crypt.getMachineUUID())
|
||||||
|
g_configs.save()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function terminate()
|
function terminate()
|
||||||
|
disconnect(g_app, { onRun = startup,
|
||||||
|
onExit = exit })
|
||||||
-- save window configs
|
-- save window configs
|
||||||
g_settings.set('window-size', g_window.getUnmaximizedSize())
|
g_settings.set('window-size', g_window.getUnmaximizedSize())
|
||||||
g_settings.set('window-pos', g_window.getUnmaximizedPos())
|
g_settings.set('window-pos', g_window.getUnmaximizedPos())
|
||||||
@@ -96,3 +113,7 @@ function terminate()
|
|||||||
g_settings.set('protocol-version', protocolVersion)
|
g_settings.set('protocol-version', protocolVersion)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function exit()
|
||||||
|
g_logger.info("Exiting application..")
|
||||||
|
end
|
||||||
|
@@ -12,11 +12,11 @@ Module
|
|||||||
load-later:
|
load-later:
|
||||||
- client_styles
|
- client_styles
|
||||||
- client_locales
|
- client_locales
|
||||||
//- client_particles
|
|
||||||
- client_topmenu
|
- client_topmenu
|
||||||
- client_background
|
- client_background
|
||||||
- client_entergame
|
|
||||||
- client_options
|
- client_options
|
||||||
|
- client_entergame
|
||||||
- client_terminal
|
- client_terminal
|
||||||
- client_modulemanager
|
- client_modulemanager
|
||||||
|
- client_serverlist
|
||||||
//- client_stats
|
//- client_stats
|
||||||
|
@@ -1,18 +1,19 @@
|
|||||||
-- private variables
|
-- private variables
|
||||||
local background
|
local background
|
||||||
|
local clientVersionLabel
|
||||||
|
|
||||||
-- public functions
|
-- public functions
|
||||||
function init()
|
function init()
|
||||||
background = g_ui.displayUI('background')
|
background = g_ui.displayUI('background')
|
||||||
background:lower()
|
background:lower()
|
||||||
|
|
||||||
local clientVersionLabel = background:getChildById('clientVersionLabel')
|
clientVersionLabel = background:getChildById('clientVersionLabel')
|
||||||
clientVersionLabel:setText(g_app.getName() .. ' ' .. g_app.getVersion() .. '\n' ..
|
clientVersionLabel:setText(g_app.getName() .. ' ' .. g_app.getVersion() .. '\n' ..
|
||||||
'Rev ' .. g_app.getBuildRevision() .. ' ('.. g_app.getBuildCommit() .. ')\n' ..
|
'Rev ' .. g_app.getBuildRevision() .. ' ('.. g_app.getBuildCommit() .. ')\n' ..
|
||||||
'Built on ' .. g_app.getBuildDate())
|
'Built on ' .. g_app.getBuildDate())
|
||||||
|
|
||||||
if not g_game.isOnline() then
|
if not g_game.isOnline() then
|
||||||
g_effects.fadeIn(clientVersionLabel, 1500)
|
addEvent(function() g_effects.fadeIn(clientVersionLabel, 1500) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
connect(g_game, { onGameStart = hide })
|
connect(g_game, { onGameStart = hide })
|
||||||
@@ -25,7 +26,6 @@ function terminate()
|
|||||||
|
|
||||||
g_effects.cancelFade(background:getChildById('clientVersionLabel'))
|
g_effects.cancelFade(background:getChildById('clientVersionLabel'))
|
||||||
background:destroy()
|
background:destroy()
|
||||||
background = nil
|
|
||||||
|
|
||||||
Background = nil
|
Background = nil
|
||||||
end
|
end
|
||||||
@@ -41,3 +41,7 @@ end
|
|||||||
function hideVersionLabel()
|
function hideVersionLabel()
|
||||||
background:getChildById('clientVersionLabel'):hide()
|
background:getChildById('clientVersionLabel'):hide()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function setVersionText(text)
|
||||||
|
clientVersionLabel:setText(text)
|
||||||
|
end
|
||||||
|
@@ -13,25 +13,21 @@ local resendWaitEvent
|
|||||||
local function tryLogin(charInfo, tries)
|
local function tryLogin(charInfo, tries)
|
||||||
tries = tries or 1
|
tries = tries or 1
|
||||||
|
|
||||||
if tries > 4 then
|
if tries > 50 then
|
||||||
CharacterList.destroyLoadBox()
|
|
||||||
displayErrorBox(tr('Error'), tr('Unable to logout.'))
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if g_game.isOnline() then
|
if g_game.isOnline() then
|
||||||
if tries == 1 then
|
if tries == 1 then
|
||||||
g_game.safeLogout()
|
g_game.safeLogout()
|
||||||
loadBox = displayCancelBox(tr('Please wait'), tr('Logging out...'))
|
|
||||||
end
|
end
|
||||||
scheduleEvent(function() tryLogin(charInfo, tries+1) end, 250)
|
scheduleEvent(function() tryLogin(charInfo, tries+1) end, 100)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
CharacterList.destroyLoadBox()
|
CharacterList.hide()
|
||||||
|
|
||||||
local locale = modules.client_locales.getCurrentLocale().name
|
g_game.loginWorld(G.account, G.password, charInfo.worldName, charInfo.worldHost, charInfo.worldPort, charInfo.characterName)
|
||||||
g_game.loginWorld(G.account, G.password, charInfo.worldName, charInfo.worldHost, charInfo.worldPort, charInfo.characterName, locale)
|
|
||||||
|
|
||||||
loadBox = displayCancelBox(tr('Please wait'), tr('Connecting to game server...'))
|
loadBox = displayCancelBox(tr('Please wait'), tr('Connecting to game server...'))
|
||||||
connect(loadBox, { onCancel = function()
|
connect(loadBox, { onCancel = function()
|
||||||
@@ -41,7 +37,8 @@ local function tryLogin(charInfo, tries)
|
|||||||
end })
|
end })
|
||||||
|
|
||||||
-- save last used character
|
-- save last used character
|
||||||
g_settings.set('lastUsedCharacter', charInfo.characterName)
|
g_settings.set('last-used-character', charInfo.characterName)
|
||||||
|
g_settings.set('last-used-world', charInfo.worldName)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function updateWait(timeStart, timeEnd)
|
local function updateWait(timeStart, timeEnd)
|
||||||
@@ -114,7 +111,8 @@ end
|
|||||||
|
|
||||||
function onGameConnectionError(message, code)
|
function onGameConnectionError(message, code)
|
||||||
CharacterList.destroyLoadBox()
|
CharacterList.destroyLoadBox()
|
||||||
errorBox = displayErrorBox(tr("Login Error"), message)
|
local text = translateNetworkError(code, g_game.getProtocolGame() and g_game.getProtocolGame():isConnecting(), message)
|
||||||
|
errorBox = displayErrorBox(tr("Connection Error"), text)
|
||||||
errorBox.onOk = function()
|
errorBox.onOk = function()
|
||||||
errorBox = nil
|
errorBox = nil
|
||||||
CharacterList.showAgain()
|
CharacterList.showAgain()
|
||||||
@@ -227,12 +225,15 @@ function CharacterList.create(characters, account, otui)
|
|||||||
|
|
||||||
connect(widget, { onDoubleClick = function () CharacterList.doLogin() return true end } )
|
connect(widget, { onDoubleClick = function () CharacterList.doLogin() return true end } )
|
||||||
|
|
||||||
if i == 1 or g_settings.get('lastUsedCharacter') == widget.characterName then
|
if i == 1 or (g_settings.get('last-used-character') == widget.characterName and g_settings.get('last-used-world') == widget.worldName) then
|
||||||
focusLabel = widget
|
focusLabel = widget
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
characterList:focusChild(focusLabel, ActiveFocusReason)
|
if focusLabel then
|
||||||
|
characterList:focusChild(focusLabel, KeyboardFocusReason)
|
||||||
|
addEvent(function() characterList:ensureChildVisible(focusLabel) end)
|
||||||
|
end
|
||||||
|
|
||||||
-- account
|
-- account
|
||||||
if account.premDays > 0 and account.premDays < 65535 then
|
if account.premDays > 0 and account.premDays < 65535 then
|
||||||
|
@@ -1,33 +1,36 @@
|
|||||||
CharacterWidget < UIWidget
|
CharacterWidget < UIWidget
|
||||||
height: 14
|
height: 14
|
||||||
focusable: true
|
|
||||||
background-color: alpha
|
background-color: alpha
|
||||||
@onFocusChange: |
|
&updateOnStates: |
|
||||||
local children = self:getChildren()
|
function(self)
|
||||||
for i=1,#children do
|
local children = self:getChildren()
|
||||||
children[i]:setOn(self:isFocused())
|
for i=1,#children do
|
||||||
|
children[i]:setOn(self:isFocused())
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@onFocusChange: self:updateOnStates()
|
||||||
|
@onSetup: self:updateOnStates()
|
||||||
|
|
||||||
$focus:
|
$focus:
|
||||||
background-color: #ffffff22
|
background-color: #ffffff22
|
||||||
|
|
||||||
Label
|
Label
|
||||||
id: name
|
id: name
|
||||||
color: #ffffff
|
color: #aaaaaa
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
font: verdana-11px-monochrome
|
font: verdana-11px-monochrome
|
||||||
text-auto-resize: true
|
text-auto-resize: true
|
||||||
background-color: alpha
|
background-color: alpha
|
||||||
text-offset: 2 0
|
text-offset: 2 0
|
||||||
on: true
|
|
||||||
|
|
||||||
$!on:
|
$on:
|
||||||
color: #aaaaaa
|
color: #ffffff
|
||||||
|
|
||||||
Label
|
Label
|
||||||
id: worldName
|
id: worldName
|
||||||
color: #ffffff
|
color: #ffffff
|
||||||
|
color: #aaaaaa
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
margin-right: 5
|
margin-right: 5
|
||||||
@@ -35,10 +38,9 @@ CharacterWidget < UIWidget
|
|||||||
text-auto-resize: true
|
text-auto-resize: true
|
||||||
background-color: alpha
|
background-color: alpha
|
||||||
&baseText: '(%s)'
|
&baseText: '(%s)'
|
||||||
on: true
|
|
||||||
|
|
||||||
$!on:
|
$on:
|
||||||
color: #aaaaaa
|
color: #ffffff
|
||||||
|
|
||||||
MainWindow
|
MainWindow
|
||||||
id: charactersWindow
|
id: charactersWindow
|
||||||
@@ -61,6 +63,7 @@ MainWindow
|
|||||||
padding: 1
|
padding: 1
|
||||||
focusable: false
|
focusable: false
|
||||||
vertical-scrollbar: characterListScrollBar
|
vertical-scrollbar: characterListScrollBar
|
||||||
|
auto-focus: first
|
||||||
|
|
||||||
VerticalScrollBar
|
VerticalScrollBar
|
||||||
id: characterListScrollBar
|
id: characterListScrollBar
|
||||||
@@ -73,7 +76,7 @@ MainWindow
|
|||||||
|
|
||||||
Label
|
Label
|
||||||
id: accountStatusCaption
|
id: accountStatusCaption
|
||||||
!text: tr('Account Status:')
|
!text: tr('Account Status') .. ':'
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.bottom: next.top
|
anchors.bottom: next.top
|
||||||
|
@@ -7,6 +7,8 @@ local motdWindow
|
|||||||
local motdButton
|
local motdButton
|
||||||
local enterGameButton
|
local enterGameButton
|
||||||
local protocolBox
|
local protocolBox
|
||||||
|
local protocolLogin
|
||||||
|
local motdEnabled = true
|
||||||
|
|
||||||
-- private functions
|
-- private functions
|
||||||
local function onError(protocol, message, errorCode)
|
local function onError(protocol, message, errorCode)
|
||||||
@@ -26,15 +28,31 @@ end
|
|||||||
local function onMotd(protocol, motd)
|
local function onMotd(protocol, motd)
|
||||||
G.motdNumber = tonumber(motd:sub(0, motd:find("\n")))
|
G.motdNumber = tonumber(motd:sub(0, motd:find("\n")))
|
||||||
G.motdMessage = motd:sub(motd:find("\n") + 1, #motd)
|
G.motdMessage = motd:sub(motd:find("\n") + 1, #motd)
|
||||||
motdButton:show()
|
if motdEnabled then
|
||||||
|
motdButton:show()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function onCharacterList(protocol, characters, account, otui)
|
local function onCharacterList(protocol, characters, account, otui)
|
||||||
|
-- Try add server to the server list
|
||||||
|
ServerList.add(G.host, G.port, g_game.getProtocolVersion())
|
||||||
|
|
||||||
if enterGame:getChildById('rememberPasswordBox'):isChecked() then
|
if enterGame:getChildById('rememberPasswordBox'):isChecked() then
|
||||||
g_settings.set('account', g_crypt.encrypt(G.account))
|
local account = g_crypt.encrypt(G.account)
|
||||||
g_settings.set('password', g_crypt.encrypt(G.password))
|
local password = g_crypt.encrypt(G.password)
|
||||||
|
|
||||||
|
g_settings.set('account', account)
|
||||||
|
g_settings.set('password', password)
|
||||||
|
|
||||||
|
ServerList.setServerAccount(G.host, account)
|
||||||
|
ServerList.setServerPassword(G.host, password)
|
||||||
|
|
||||||
g_settings.set('autologin', enterGame:getChildById('autoLoginBox'):isChecked())
|
g_settings.set('autologin', enterGame:getChildById('autoLoginBox'):isChecked())
|
||||||
else
|
else
|
||||||
|
-- reset server list account/password
|
||||||
|
ServerList.setServerAccount(G.host, '')
|
||||||
|
ServerList.setServerPassword(G.host, '')
|
||||||
|
|
||||||
EnterGame.clearAccountFields()
|
EnterGame.clearAccountFields()
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -44,28 +62,33 @@ local function onCharacterList(protocol, characters, account, otui)
|
|||||||
CharacterList.create(characters, account, otui)
|
CharacterList.create(characters, account, otui)
|
||||||
CharacterList.show()
|
CharacterList.show()
|
||||||
|
|
||||||
local lastMotdNumber = g_settings.getNumber("motd")
|
if motdEnabled then
|
||||||
if G.motdNumber and G.motdNumber ~= lastMotdNumber then
|
local lastMotdNumber = g_settings.getNumber("motd")
|
||||||
g_settings.set("motd", motdNumber)
|
if G.motdNumber and G.motdNumber ~= lastMotdNumber then
|
||||||
local motdBox = displayInfoBox(tr('Message of the day'), G.motdMessage)
|
g_settings.set("motd", motdNumber)
|
||||||
connect(motdBox, { onOk = CharacterList.show })
|
motdWindow = displayInfoBox(tr('Message of the day'), G.motdMessage)
|
||||||
CharacterList.hide()
|
connect(motdWindow, { onOk = function() CharacterList.show() motdWindow = nil end })
|
||||||
|
CharacterList.hide()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function onChangeProtocol(combobox, option)
|
local function onChangeProtocol(combobox, option)
|
||||||
local clients = g_game.getSupportedClients(option)
|
local clients = g_game.getSupportedClients(option)
|
||||||
protocolBox:setTooltip("Supports Client" .. (#clients > 1 and "s" or "") .. ": " .. table.toString(clients))
|
protocolBox:setTooltip("Supports Client" .. (#clients > 1 and "s" or "") .. ": " .. table.tostring(clients))
|
||||||
end
|
end
|
||||||
|
|
||||||
local function onUpdateNeeded(protocol, signature)
|
local function onUpdateNeeded(protocol, signature)
|
||||||
loadBox:destroy()
|
loadBox:destroy()
|
||||||
loadBox = nil
|
loadBox = nil
|
||||||
|
|
||||||
if updateFunc then
|
if EnterGame.updateFunc then
|
||||||
local continueFunc = EnterGame.show
|
local continueFunc = EnterGame.show
|
||||||
local cancelFunc = EnterGame.show
|
local cancelFunc = EnterGame.show
|
||||||
updateFunc(signature, continueFunc, cancelFunc)
|
EnterGame.updateFunc(signature, continueFunc, cancelFunc)
|
||||||
|
else
|
||||||
|
local errorBox = displayErrorBox(tr('Update needed'), tr('Your client needs update, try redownloading it.'))
|
||||||
|
connect(errorBox, { onOk = EnterGame.show })
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -77,12 +100,12 @@ function EnterGame.init()
|
|||||||
motdButton:hide()
|
motdButton:hide()
|
||||||
g_keyboard.bindKeyDown('Ctrl+G', EnterGame.openWindow)
|
g_keyboard.bindKeyDown('Ctrl+G', EnterGame.openWindow)
|
||||||
|
|
||||||
if G.motdNumber then
|
if motdEnabled and G.motdNumber then
|
||||||
motdButton:show()
|
motdButton:show()
|
||||||
end
|
end
|
||||||
|
|
||||||
local account = g_crypt.decrypt(g_settings.get('account'))
|
local account = g_settings.get('account')
|
||||||
local password = g_crypt.decrypt(g_settings.get('password'))
|
local password = g_settings.get('password')
|
||||||
local host = g_settings.get('host')
|
local host = g_settings.get('host')
|
||||||
local port = g_settings.get('port')
|
local port = g_settings.get('port')
|
||||||
local autologin = g_settings.getBoolean('autologin')
|
local autologin = g_settings.getBoolean('autologin')
|
||||||
@@ -90,20 +113,15 @@ function EnterGame.init()
|
|||||||
|
|
||||||
if port == nil or port == 0 then port = 7171 end
|
if port == nil or port == 0 then port = 7171 end
|
||||||
|
|
||||||
enterGame:getChildById('accountNameTextEdit'):setText(account)
|
EnterGame.setAccountName(account)
|
||||||
enterGame:getChildById('accountPasswordTextEdit'):setText(password)
|
EnterGame.setPassword(password)
|
||||||
|
|
||||||
enterGame:getChildById('serverHostTextEdit'):setText(host)
|
enterGame:getChildById('serverHostTextEdit'):setText(host)
|
||||||
enterGame:getChildById('serverPortTextEdit'):setText(port)
|
enterGame:getChildById('serverPortTextEdit'):setText(port)
|
||||||
enterGame:getChildById('autoLoginBox'):setChecked(autologin)
|
enterGame:getChildById('autoLoginBox'):setChecked(autologin)
|
||||||
enterGame:getChildById('rememberPasswordBox'):setChecked(#account > 0)
|
|
||||||
enterGame:getChildById('accountNameTextEdit'):focus()
|
|
||||||
|
|
||||||
protocolBox = enterGame:getChildById('protocolComboBox')
|
protocolBox = enterGame:getChildById('protocolComboBox')
|
||||||
protocolBox.onOptionChange = onChangeProtocol
|
protocolBox.onOptionChange = onChangeProtocol
|
||||||
for _i, proto in pairs(g_game.getSupportedProtocols()) do
|
|
||||||
protocolBox:addOption(proto)
|
|
||||||
end
|
|
||||||
|
|
||||||
if protocolVersion then
|
if protocolVersion then
|
||||||
protocolBox:setCurrentOption(protocolVersion)
|
protocolBox:setCurrentOption(protocolVersion)
|
||||||
end
|
end
|
||||||
@@ -123,17 +141,20 @@ function EnterGame.firstShow()
|
|||||||
local host = g_settings.get('host')
|
local host = g_settings.get('host')
|
||||||
local autologin = g_settings.getBoolean('autologin')
|
local autologin = g_settings.getBoolean('autologin')
|
||||||
if #host > 0 and #password > 0 and #account > 0 and autologin then
|
if #host > 0 and #password > 0 and #account > 0 and autologin then
|
||||||
autoLoginEvent = addEvent(EnterGame.doLogin)
|
addEvent(function()
|
||||||
|
if not g_settings.getBoolean('autologin') then return end
|
||||||
|
EnterGame.doLogin()
|
||||||
|
end)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function EnterGame.terminate()
|
function EnterGame.terminate()
|
||||||
g_keyboard.unbindKeyDown('Ctrl+G')
|
g_keyboard.unbindKeyDown('Ctrl+G')
|
||||||
removeEvent(autoLoginEvent)
|
|
||||||
enterGame:destroy()
|
enterGame:destroy()
|
||||||
enterGame = nil
|
enterGame = nil
|
||||||
enterGameButton:destroy()
|
enterGameButton:destroy()
|
||||||
enterGameButton = nil
|
enterGameButton = nil
|
||||||
|
protocolBox = nil
|
||||||
if motdWindow then
|
if motdWindow then
|
||||||
motdWindow:destroy()
|
motdWindow:destroy()
|
||||||
motdWindow = nil
|
motdWindow = nil
|
||||||
@@ -142,7 +163,14 @@ function EnterGame.terminate()
|
|||||||
motdButton:destroy()
|
motdButton:destroy()
|
||||||
motdButton = nil
|
motdButton = nil
|
||||||
end
|
end
|
||||||
protocolBox = nil
|
if loadBox then
|
||||||
|
loadBox:destroy()
|
||||||
|
loadBox = nil
|
||||||
|
end
|
||||||
|
if protocolLogin then
|
||||||
|
protocolLogin:cancelLogin()
|
||||||
|
protocolLogin = nil
|
||||||
|
end
|
||||||
EnterGame = nil
|
EnterGame = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -165,6 +193,18 @@ function EnterGame.openWindow()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function EnterGame.setAccountName(account)
|
||||||
|
local account = g_crypt.decrypt(account)
|
||||||
|
enterGame:getChildById('accountNameTextEdit'):setText(account)
|
||||||
|
enterGame:getChildById('accountNameTextEdit'):setCursorPos(-1)
|
||||||
|
enterGame:getChildById('rememberPasswordBox'):setChecked(#account > 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
function EnterGame.setPassword(password)
|
||||||
|
local password = g_crypt.decrypt(password)
|
||||||
|
enterGame:getChildById('accountPasswordTextEdit'):setText(password)
|
||||||
|
end
|
||||||
|
|
||||||
function EnterGame.clearAccountFields()
|
function EnterGame.clearAccountFields()
|
||||||
enterGame:getChildById('accountNameTextEdit'):clearText()
|
enterGame:getChildById('accountNameTextEdit'):clearText()
|
||||||
enterGame:getChildById('accountPasswordTextEdit'):clearText()
|
enterGame:getChildById('accountPasswordTextEdit'):clearText()
|
||||||
@@ -174,7 +214,6 @@ function EnterGame.clearAccountFields()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function EnterGame.doLogin()
|
function EnterGame.doLogin()
|
||||||
autoLoginEvent = nil
|
|
||||||
G.account = enterGame:getChildById('accountNameTextEdit'):getText()
|
G.account = enterGame:getChildById('accountNameTextEdit'):getText()
|
||||||
G.password = enterGame:getChildById('accountPasswordTextEdit'):getText()
|
G.password = enterGame:getChildById('accountPasswordTextEdit'):getText()
|
||||||
G.host = enterGame:getChildById('serverHostTextEdit'):getText()
|
G.host = enterGame:getChildById('serverHostTextEdit'):getText()
|
||||||
@@ -192,8 +231,8 @@ function EnterGame.doLogin()
|
|||||||
g_settings.set('host', G.host)
|
g_settings.set('host', G.host)
|
||||||
g_settings.set('port', G.port)
|
g_settings.set('port', G.port)
|
||||||
|
|
||||||
local protocolLogin = ProtocolLogin.create()
|
protocolLogin = ProtocolLogin.create()
|
||||||
protocolLogin.onError = onError
|
protocolLogin.onLoginError = onError
|
||||||
protocolLogin.onMotd = onMotd
|
protocolLogin.onMotd = onMotd
|
||||||
protocolLogin.onCharacterList = onCharacterList
|
protocolLogin.onCharacterList = onCharacterList
|
||||||
protocolLogin.onUpdateNeeded = onUpdateNeeded
|
protocolLogin.onUpdateNeeded = onUpdateNeeded
|
||||||
@@ -212,8 +251,7 @@ function EnterGame.doLogin()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if modules.game_things.isLoaded() then
|
if modules.game_things.isLoaded() then
|
||||||
local locale = modules.client_locales.getCurrentLocale().name
|
protocolLogin:login(G.host, G.port, G.account, G.password)
|
||||||
protocolLogin:login(G.host, G.port, G.account, G.password, locale)
|
|
||||||
else
|
else
|
||||||
loadBox:destroy()
|
loadBox:destroy()
|
||||||
loadBox = nil
|
loadBox = nil
|
||||||
@@ -222,7 +260,7 @@ function EnterGame.doLogin()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function EnterGame.displayMotd()
|
function EnterGame.displayMotd()
|
||||||
if not motdWindow or not motdWindow:isVisible() then
|
if not motdWindow then
|
||||||
motdWindow = displayInfoBox(tr('Message of the day'), G.motdMessage)
|
motdWindow = displayInfoBox(tr('Message of the day'), G.motdMessage)
|
||||||
motdWindow.onOk = function() motdWindow = nil end
|
motdWindow.onOk = function() motdWindow = nil end
|
||||||
end
|
end
|
||||||
@@ -241,10 +279,6 @@ function EnterGame.setDefaultServer(host, port, protocol)
|
|||||||
protocolBox:setCurrentOption(protocol)
|
protocolBox:setCurrentOption(protocol)
|
||||||
accountTextEdit:setText('')
|
accountTextEdit:setText('')
|
||||||
passwordTextEdit:setText('')
|
passwordTextEdit:setText('')
|
||||||
|
|
||||||
if autoLoginEvent then
|
|
||||||
autoLoginEvent:cancel()
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -272,6 +306,11 @@ function EnterGame.setUniqueServer(host, port, protocol, windowWidth, windowHeig
|
|||||||
protocolLabel:setVisible(false)
|
protocolLabel:setVisible(false)
|
||||||
protocolLabel:setHeight(0)
|
protocolLabel:setHeight(0)
|
||||||
|
|
||||||
|
local serverListButton = enterGame:getChildById('serverListButton')
|
||||||
|
serverListButton:setVisible(false)
|
||||||
|
serverListButton:setHeight(0)
|
||||||
|
serverListButton:setWidth(0)
|
||||||
|
|
||||||
local rememberPasswordBox = enterGame:getChildById('rememberPasswordBox')
|
local rememberPasswordBox = enterGame:getChildById('rememberPasswordBox')
|
||||||
rememberPasswordBox:setMarginTop(-5)
|
rememberPasswordBox:setMarginTop(-5)
|
||||||
|
|
||||||
@@ -286,3 +325,7 @@ function EnterGame.setServerInfo(message)
|
|||||||
label:setText(message)
|
label:setText(message)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function EnterGame.disableMotd()
|
||||||
|
motdEnabled = false
|
||||||
|
motdButton:hide()
|
||||||
|
end
|
||||||
|
@@ -1,9 +1,26 @@
|
|||||||
EnterGameWindow < MainWindow
|
EnterGameWindow < MainWindow
|
||||||
|
!text: tr('Enter Game')
|
||||||
|
size: 236 274
|
||||||
|
|
||||||
|
EnterGameButton < Button
|
||||||
|
width: 64
|
||||||
|
|
||||||
|
ServerListButton < UIButton
|
||||||
|
size: 17 17
|
||||||
|
image-source: /images/topbuttons/minimap
|
||||||
|
image-color: #ffffffff
|
||||||
|
|
||||||
|
$hover !disabled:
|
||||||
|
image-color: #ffffff99
|
||||||
|
|
||||||
|
$pressed:
|
||||||
|
image-color: #ffffff44
|
||||||
|
|
||||||
|
$disabled:
|
||||||
|
image-color: #ffffff55
|
||||||
|
|
||||||
EnterGameWindow
|
EnterGameWindow
|
||||||
id: enterGame
|
id: enterGame
|
||||||
!text: tr('Enter Game')
|
|
||||||
size: 236 274
|
|
||||||
@onEnter: EnterGame.doLogin()
|
@onEnter: EnterGame.doLogin()
|
||||||
|
|
||||||
MenuLabel
|
MenuLabel
|
||||||
@@ -41,13 +58,22 @@ EnterGameWindow
|
|||||||
margin-top: 8
|
margin-top: 8
|
||||||
text-auto-resize: true
|
text-auto-resize: true
|
||||||
|
|
||||||
|
ServerListButton
|
||||||
|
id: serverListButton
|
||||||
|
!tooltip: tr('Server list')
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: serverLabel.bottom
|
||||||
|
margin-top: 3
|
||||||
|
@onClick: ServerList.show()
|
||||||
|
|
||||||
TextEdit
|
TextEdit
|
||||||
id: serverHostTextEdit
|
id: serverHostTextEdit
|
||||||
!tooltip: tr('Make sure that your client uses\nthe correct game protocol version')
|
!tooltip: tr('Make sure that your client uses\nthe correct game protocol version')
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: serverListButton.left
|
||||||
anchors.top: serverLabel.bottom
|
anchors.top: serverLabel.bottom
|
||||||
margin-top: 2
|
margin-top: 2
|
||||||
|
margin-right: 4
|
||||||
|
|
||||||
MenuLabel
|
MenuLabel
|
||||||
id: protocolLabel
|
id: protocolLabel
|
||||||
@@ -66,6 +92,10 @@ EnterGameWindow
|
|||||||
margin-top: 2
|
margin-top: 2
|
||||||
margin-right: 3
|
margin-right: 3
|
||||||
width: 90
|
width: 90
|
||||||
|
@onSetup: |
|
||||||
|
for _, proto in pairs(g_game.getSupportedProtocols()) do
|
||||||
|
self:addOption(proto)
|
||||||
|
end
|
||||||
|
|
||||||
MenuLabel
|
MenuLabel
|
||||||
id: portLabel
|
id: portLabel
|
||||||
@@ -103,9 +133,8 @@ EnterGameWindow
|
|||||||
anchors.top: prev.bottom
|
anchors.top: prev.bottom
|
||||||
margin-top: 2
|
margin-top: 2
|
||||||
|
|
||||||
Button
|
EnterGameButton
|
||||||
!text: tr('Ok')
|
!text: tr('Ok')
|
||||||
width: 64
|
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
@onClick: EnterGame.doLogin()
|
@onClick: EnterGame.doLogin()
|
||||||
@@ -116,3 +145,4 @@ EnterGameWindow
|
|||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
color: green
|
color: green
|
||||||
|
text-auto-resize: true
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
MainWindow
|
MainWindow
|
||||||
id: waitingWindow
|
id: waitingWindow
|
||||||
!text: tr('Waiting List')
|
!text: tr('Waiting List')
|
||||||
size: 260 160
|
size: 260 180
|
||||||
@onEscape: CharacterList.cancelWait()
|
@onEscape: CharacterList.cancelWait()
|
||||||
|
|
||||||
Label
|
Label
|
||||||
|
@@ -17,14 +17,22 @@ end
|
|||||||
function createWindow()
|
function createWindow()
|
||||||
localesWindow = g_ui.displayUI('locales')
|
localesWindow = g_ui.displayUI('locales')
|
||||||
local localesPanel = localesWindow:getChildById('localesPanel')
|
local localesPanel = localesWindow:getChildById('localesPanel')
|
||||||
|
local layout = localesPanel:getLayout()
|
||||||
|
local spacing = layout:getCellSpacing()
|
||||||
|
local size = layout:getCellSize()
|
||||||
|
|
||||||
|
local count = 0
|
||||||
for name,locale in pairs(installedLocales) do
|
for name,locale in pairs(installedLocales) do
|
||||||
local widget = g_ui.createWidget('LocalesButton', localesPanel)
|
local widget = g_ui.createWidget('LocalesButton', localesPanel)
|
||||||
widget:setImageSource('/images/flags/' .. name .. '')
|
widget:setImageSource('/images/flags/' .. name .. '')
|
||||||
widget:setText(locale.languageName)
|
widget:setText(locale.languageName)
|
||||||
widget.onClick = function() selectFirstLocale(name) end
|
widget.onClick = function() selectFirstLocale(name) end
|
||||||
|
count = count + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
count = math.max(1, math.min(count, 3))
|
||||||
|
localesPanel:setWidth(size.width*count + spacing*(count-1))
|
||||||
|
|
||||||
addEvent(function() addEvent(function() localesWindow:raise() localesWindow:focus() end) end)
|
addEvent(function() addEvent(function() localesWindow:raise() localesWindow:focus() end) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -61,7 +69,7 @@ function init()
|
|||||||
pdebug('Using configured locale: ' .. userLocaleName)
|
pdebug('Using configured locale: ' .. userLocaleName)
|
||||||
else
|
else
|
||||||
setLocale(defaultLocaleName)
|
setLocale(defaultLocaleName)
|
||||||
connect(g_app, {onRun = createWindow})
|
connect(g_app, { onRun = createWindow })
|
||||||
end
|
end
|
||||||
|
|
||||||
ProtocolGame.registerExtendedOpcode(ExtendedIds.Locale, onExtendedLocales)
|
ProtocolGame.registerExtendedOpcode(ExtendedIds.Locale, onExtendedLocales)
|
||||||
@@ -73,6 +81,7 @@ function terminate()
|
|||||||
currentLocale = nil
|
currentLocale = nil
|
||||||
|
|
||||||
ProtocolGame.unregisterExtendedOpcode(ExtendedIds.Locale)
|
ProtocolGame.unregisterExtendedOpcode(ExtendedIds.Locale)
|
||||||
|
disconnect(g_app, { onRun = createWindow })
|
||||||
disconnect(g_game, { onGameStart = onGameStart })
|
disconnect(g_game, { onGameStart = onGameStart })
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -101,6 +110,8 @@ function installLocale(locale)
|
|||||||
error('Unable to install locale.')
|
error('Unable to install locale.')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if _G.allowedLocales and not _G.allowedLocales[locale.name] then return end
|
||||||
|
|
||||||
if locale.name ~= defaultLocaleName then
|
if locale.name ~= defaultLocaleName then
|
||||||
local updatesNeeded = 0
|
local updatesNeeded = 0
|
||||||
for _i,k in pairs(neededTranslations) do
|
for _i,k in pairs(neededTranslations) do
|
||||||
@@ -110,7 +121,7 @@ function installLocale(locale)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if updatesNeeded > 0 then
|
if updatesNeeded > 0 then
|
||||||
pwarning('Locale \'' .. locale.name .. '\' is missing ' .. updatesNeeded .. ' translations.')
|
pdebug('Locale \'' .. locale.name .. '\' is missing ' .. updatesNeeded .. ' translations.')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -130,10 +141,14 @@ end
|
|||||||
|
|
||||||
function setLocale(name)
|
function setLocale(name)
|
||||||
local locale = installedLocales[name]
|
local locale = installedLocales[name]
|
||||||
|
if locale == currentLocale then return end
|
||||||
if not locale then
|
if not locale then
|
||||||
pwarning("Locale " .. name .. ' does not exist.')
|
pwarning("Locale " .. name .. ' does not exist.')
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
if currentLocale then
|
||||||
|
sendLocale(locale.name)
|
||||||
|
end
|
||||||
currentLocale = locale
|
currentLocale = locale
|
||||||
g_settings.set('locale', name)
|
g_settings.set('locale', name)
|
||||||
if onLocaleChanged then onLocaleChanged(name) end
|
if onLocaleChanged then onLocaleChanged(name) end
|
||||||
@@ -167,7 +182,7 @@ function _G.tr(text, ...)
|
|||||||
if not translation then
|
if not translation then
|
||||||
if translation == nil then
|
if translation == nil then
|
||||||
if currentLocale.name ~= defaultLocaleName then
|
if currentLocale.name ~= defaultLocaleName then
|
||||||
pwarning('Unable to translate: \"' .. text .. '\"')
|
pdebug('Unable to translate: \"' .. text .. '\"')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
translation = text
|
translation = text
|
||||||
|
@@ -5,6 +5,5 @@ Module
|
|||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [ locales ]
|
scripts: [ locales ]
|
||||||
dependencies: [ client_topmenu ]
|
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
@onUnload: terminate()
|
@onUnload: terminate()
|
||||||
|
@@ -24,8 +24,6 @@ UIWindow
|
|||||||
|
|
||||||
Panel
|
Panel
|
||||||
id: localesPanel
|
id: localesPanel
|
||||||
!width: 96*3 + 32*3
|
|
||||||
margin-left: 16
|
|
||||||
margin-top: 50
|
margin-top: 50
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
anchors.top: prev.bottom
|
anchors.top: prev.bottom
|
||||||
|
@@ -339,7 +339,7 @@ neededTranslations = {
|
|||||||
"You are dazzled",
|
"You are dazzled",
|
||||||
"You are dead.",
|
"You are dead.",
|
||||||
"You are dead",
|
"You are dead",
|
||||||
"You are drowing",
|
"You are drowning",
|
||||||
"You are drunk",
|
"You are drunk",
|
||||||
"You are electrified",
|
"You are electrified",
|
||||||
"You are freezing",
|
"You are freezing",
|
||||||
|
@@ -20,18 +20,16 @@ function init()
|
|||||||
addEvent(listModules)
|
addEvent(listModules)
|
||||||
end
|
end
|
||||||
|
|
||||||
function hideButton()
|
|
||||||
moduleManagerButton:hide()
|
|
||||||
end
|
|
||||||
|
|
||||||
function terminate()
|
function terminate()
|
||||||
moduleManagerWindow:destroy()
|
moduleManagerWindow:destroy()
|
||||||
moduleManagerWindow = nil
|
|
||||||
moduleManagerButton:destroy()
|
moduleManagerButton:destroy()
|
||||||
moduleManagerButton = nil
|
|
||||||
moduleList = nil
|
moduleList = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function disable()
|
||||||
|
moduleManagerButton:hide()
|
||||||
|
end
|
||||||
|
|
||||||
function hide()
|
function hide()
|
||||||
moduleManagerWindow:hide()
|
moduleManagerWindow:hide()
|
||||||
end
|
end
|
||||||
|
28
modules/client_options/audio.otui
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
Panel
|
||||||
|
OptionCheckBox
|
||||||
|
id: enableAudio
|
||||||
|
!text: tr('Enable audio')
|
||||||
|
|
||||||
|
OptionCheckBox
|
||||||
|
id: enableMusicSound
|
||||||
|
!text: tr('Enable music sound')
|
||||||
|
|
||||||
|
Label
|
||||||
|
id: musicSoundVolumeLabel
|
||||||
|
!text: tr('Music volume: %d', 100)
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
margin-top: 6
|
||||||
|
@onSetup: |
|
||||||
|
local value = modules.client_options.getOption('musicSoundVolume')
|
||||||
|
self:setText(tr('Music volume: %d', value))
|
||||||
|
|
||||||
|
OptionScrollbar
|
||||||
|
id: musicSoundVolume
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
margin-top: 3
|
||||||
|
minimum: 0
|
||||||
|
maximum: 100
|
@@ -13,13 +13,9 @@ Panel
|
|||||||
!tooltip: tr('Will detect when to use diagonal step based on the\nkeys you are pressing')
|
!tooltip: tr('Will detect when to use diagonal step based on the\nkeys you are pressing')
|
||||||
|
|
||||||
OptionCheckBox
|
OptionCheckBox
|
||||||
id: walkBooster
|
id: dashWalk
|
||||||
!text: tr('Enable walk booster')
|
!text: tr('Enable dash walking')
|
||||||
!tooltip: tr('Also known as dash in tibia community, recommended\nfor playing characters with high speed')
|
!tooltip: tr('Will boost your walk on high speed characters')
|
||||||
|
|
||||||
OptionCheckBox
|
|
||||||
id: enableMusic
|
|
||||||
!text: tr('Enable music')
|
|
||||||
|
|
||||||
OptionCheckBox
|
OptionCheckBox
|
||||||
id: showPing
|
id: showPing
|
||||||
@@ -30,6 +26,18 @@ Panel
|
|||||||
id: showLeftPanel
|
id: showLeftPanel
|
||||||
!text: tr('Show left panel')
|
!text: tr('Show left panel')
|
||||||
|
|
||||||
|
OptionCheckBox
|
||||||
|
id: displayNames
|
||||||
|
!text: tr('Display creature names')
|
||||||
|
|
||||||
|
OptionCheckBox
|
||||||
|
id: displayHealth
|
||||||
|
!text: tr('Display creature health bars')
|
||||||
|
|
||||||
|
OptionCheckBox
|
||||||
|
id: displayText
|
||||||
|
!text: tr('Display text messages')
|
||||||
|
|
||||||
Button
|
Button
|
||||||
id: changeLocale
|
id: changeLocale
|
||||||
!text: tr('Change language')
|
!text: tr('Change language')
|
||||||
@@ -37,3 +45,4 @@ Panel
|
|||||||
anchors.top: prev.bottom
|
anchors.top: prev.bottom
|
||||||
anchors.left: prev.left
|
anchors.left: prev.left
|
||||||
margin-top: 5
|
margin-top: 5
|
||||||
|
width: 120
|
||||||
|
@@ -1,25 +1,10 @@
|
|||||||
FrameRateScrollbar < HorizontalScrollBar
|
|
||||||
step: 1
|
|
||||||
@onValueChange: modules.client_options.setOption(self:getId(), self:getValue())
|
|
||||||
@onSetup: |
|
|
||||||
UIScrollBar.onSetup(self)
|
|
||||||
local value = modules.client_options.getOption(self:getId())
|
|
||||||
if value == 0 then value = self:getMaximum() end
|
|
||||||
self:setValue(value)
|
|
||||||
|
|
||||||
Panel
|
Panel
|
||||||
Label
|
|
||||||
!text: tr('Graphics Engine:')
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.top: parent.top
|
|
||||||
|
|
||||||
ButtonBox
|
ButtonBox
|
||||||
id: opengl1
|
id: opengl1
|
||||||
anchors.left: prev.right
|
anchors.left: parent.left
|
||||||
anchors.verticalCenter: prev.verticalCenter
|
anchors.top: parent.top
|
||||||
text: OpenGL 1
|
text: OpenGL 1
|
||||||
size: 80 20
|
size: 80 20
|
||||||
margin-left: 6
|
|
||||||
|
|
||||||
ButtonBox
|
ButtonBox
|
||||||
id: opengl2
|
id: opengl2
|
||||||
@@ -29,6 +14,14 @@ Panel
|
|||||||
size: 80 20
|
size: 80 20
|
||||||
margin-left: 4
|
margin-left: 4
|
||||||
|
|
||||||
|
ButtonBox
|
||||||
|
id: directx9
|
||||||
|
anchors.left: prev.right
|
||||||
|
anchors.verticalCenter: prev.verticalCenter
|
||||||
|
text: DirectX 9
|
||||||
|
size: 80 20
|
||||||
|
margin-left: 4
|
||||||
|
|
||||||
OptionCheckBox
|
OptionCheckBox
|
||||||
id: vsync
|
id: vsync
|
||||||
!text: tr('Enable vertical synchronization')
|
!text: tr('Enable vertical synchronization')
|
||||||
@@ -39,12 +32,13 @@ Panel
|
|||||||
!text: tr('Show frame rate')
|
!text: tr('Show frame rate')
|
||||||
|
|
||||||
OptionCheckBox
|
OptionCheckBox
|
||||||
id: fullscreen
|
id: enableLights
|
||||||
!text: tr('Fullscreen')
|
!text: tr('Enable lights')
|
||||||
|
|
||||||
OptionCheckBox
|
OptionCheckBox
|
||||||
id: dontStretchShrink
|
id: fullscreen
|
||||||
!text: tr("Don't stretch or shrink Game Window")
|
!text: tr('Fullscreen')
|
||||||
|
tooltip: Ctrl+Shift+F
|
||||||
|
|
||||||
Label
|
Label
|
||||||
id: backgroundFrameRateLabel
|
id: backgroundFrameRateLabel
|
||||||
@@ -52,7 +46,7 @@ Panel
|
|||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.top: prev.bottom
|
anchors.top: prev.bottom
|
||||||
margin-top: 16
|
margin-top: 6
|
||||||
@onSetup: |
|
@onSetup: |
|
||||||
local value = modules.client_options.getOption('backgroundFrameRate')
|
local value = modules.client_options.getOption('backgroundFrameRate')
|
||||||
local text = value
|
local text = value
|
||||||
@@ -62,7 +56,7 @@ Panel
|
|||||||
|
|
||||||
self:setText(tr('Game framerate limit: %s', text))
|
self:setText(tr('Game framerate limit: %s', text))
|
||||||
|
|
||||||
FrameRateScrollbar
|
OptionScrollbar
|
||||||
id: backgroundFrameRate
|
id: backgroundFrameRate
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
@@ -86,7 +80,7 @@ Panel
|
|||||||
|
|
||||||
self:setText(tr('Interface framerate limit: %s', text))
|
self:setText(tr('Interface framerate limit: %s', text))
|
||||||
|
|
||||||
FrameRateScrollbar
|
OptionScrollbar
|
||||||
id: foregroundFrameRate
|
id: foregroundFrameRate
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
@@ -105,7 +99,7 @@ Panel
|
|||||||
local value = modules.client_options.getOption('ambientLight')
|
local value = modules.client_options.getOption('ambientLight')
|
||||||
self:setText(tr('Ambient light: %s%%', value))
|
self:setText(tr('Ambient light: %s%%', value))
|
||||||
|
|
||||||
FrameRateScrollbar
|
OptionScrollbar
|
||||||
id: ambientLight
|
id: ambientLight
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
|
@@ -1,52 +1,71 @@
|
|||||||
local defaultOptions = {
|
local defaultOptions = {
|
||||||
vsync = false,
|
vsync = false,
|
||||||
showFps = true,
|
showFps = false,
|
||||||
showPing = true,
|
showPing = false,
|
||||||
fullscreen = false,
|
fullscreen = false,
|
||||||
dontStretchShrink = false,
|
|
||||||
classicControl = false,
|
classicControl = false,
|
||||||
walkBooster = false,
|
|
||||||
smartWalk = false,
|
smartWalk = false,
|
||||||
|
dashWalk = false,
|
||||||
autoChaseOverride = true,
|
autoChaseOverride = true,
|
||||||
showStatusMessagesInConsole = true,
|
showStatusMessagesInConsole = true,
|
||||||
showEventMessagesInConsole = true,
|
showEventMessagesInConsole = true,
|
||||||
showInfoMessagesInConsole = true,
|
showInfoMessagesInConsole = true,
|
||||||
showTimestampsInConsole = true,
|
showTimestampsInConsole = true,
|
||||||
showLevelsInConsole = true,
|
showLevelsInConsole = true,
|
||||||
showPrivateMessagesInConsole = false,
|
showPrivateMessagesInConsole = true,
|
||||||
showPrivateMessagesOnScreen = true,
|
showPrivateMessagesOnScreen = true,
|
||||||
enableMusic = true,
|
|
||||||
showLeftPanel = false,
|
showLeftPanel = false,
|
||||||
foregroundFrameRate = 61,
|
foregroundFrameRate = 61,
|
||||||
backgroundFrameRate = 201,
|
backgroundFrameRate = 201,
|
||||||
ambientLight = 15,
|
painterEngine = 0,
|
||||||
painterEngine = 0
|
enableAudio = true,
|
||||||
|
enableMusicSound = true,
|
||||||
|
musicSoundVolume = 100,
|
||||||
|
enableLights = true,
|
||||||
|
ambientLight = 25,
|
||||||
|
displayNames = true,
|
||||||
|
displayHealth = true,
|
||||||
|
displayText = true
|
||||||
}
|
}
|
||||||
|
|
||||||
local warningWindow
|
|
||||||
local optionsWindow
|
local optionsWindow
|
||||||
local optionsButton
|
local optionsButton
|
||||||
local optionsTabBar
|
local optionsTabBar
|
||||||
local options = {}
|
local options = {}
|
||||||
local gamePanel
|
local generalPanel
|
||||||
local consolePanel
|
local consolePanel
|
||||||
local graphicsPanel
|
local graphicsPanel
|
||||||
|
local soundPanel
|
||||||
|
local audioButton
|
||||||
|
|
||||||
local function setupGraphicsEngines()
|
local function setupGraphicsEngines()
|
||||||
local enginesRadioGroup = UIRadioGroup.create()
|
local enginesRadioGroup = UIRadioGroup.create()
|
||||||
local ogl1 = graphicsPanel:getChildById('opengl1')
|
local ogl1 = graphicsPanel:getChildById('opengl1')
|
||||||
local ogl2 = graphicsPanel:getChildById('opengl2')
|
local ogl2 = graphicsPanel:getChildById('opengl2')
|
||||||
|
local dx9 = graphicsPanel:getChildById('directx9')
|
||||||
enginesRadioGroup:addWidget(ogl1)
|
enginesRadioGroup:addWidget(ogl1)
|
||||||
enginesRadioGroup:addWidget(ogl2)
|
enginesRadioGroup:addWidget(ogl2)
|
||||||
|
enginesRadioGroup:addWidget(dx9)
|
||||||
|
|
||||||
if g_graphics.getPainterEngine() == 2 then
|
if g_window.getPlatformType() == 'WIN32-EGL' then
|
||||||
enginesRadioGroup:selectWidget(ogl2)
|
enginesRadioGroup:selectWidget(dx9)
|
||||||
|
ogl1:setEnabled(false)
|
||||||
|
ogl2:setEnabled(false)
|
||||||
|
dx9:setEnabled(true)
|
||||||
else
|
else
|
||||||
enginesRadioGroup:selectWidget(ogl1)
|
ogl1:setEnabled(g_graphics.isPainterEngineAvailable(1))
|
||||||
end
|
ogl2:setEnabled(g_graphics.isPainterEngineAvailable(2))
|
||||||
|
dx9:setEnabled(false)
|
||||||
|
if g_graphics.getPainterEngine() == 2 then
|
||||||
|
enginesRadioGroup:selectWidget(ogl2)
|
||||||
|
else
|
||||||
|
enginesRadioGroup:selectWidget(ogl1)
|
||||||
|
end
|
||||||
|
|
||||||
ogl1:setEnabled(g_graphics.isPainterEngineAvailable(1))
|
if g_app.getOs() ~= 'windows' then
|
||||||
ogl2:setEnabled(g_graphics.isPainterEngineAvailable(2))
|
dx9:hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
enginesRadioGroup.onSelectionChange = function(self, selected)
|
enginesRadioGroup.onSelectionChange = function(self, selected)
|
||||||
if selected == ogl1 then
|
if selected == ogl1 then
|
||||||
@@ -62,75 +81,58 @@ local function setupGraphicsEngines()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function displayWarning(widget, warning)
|
|
||||||
if warningWindow and warningWindow:isVisible() then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if widget:isChecked() then
|
|
||||||
local yesCallback = function() warningWindow:destroy() warningWindow=nil end
|
|
||||||
local noCallback = function() widget:setChecked(false) warningWindow:destroy() warningWindow=nil end
|
|
||||||
|
|
||||||
warningWindow = displayGeneralBox('Warning', tr(warning), {
|
|
||||||
{ text='Yes', callback=yesCallback },
|
|
||||||
{ text='No', callback=noCallback },
|
|
||||||
anchor=AnchorHorizontalCenter}, yesCallback, noCallback)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function init()
|
function init()
|
||||||
-- load options
|
|
||||||
for k,v in pairs(defaultOptions) do
|
for k,v in pairs(defaultOptions) do
|
||||||
g_settings.setDefault(k, v)
|
g_settings.setDefault(k, v)
|
||||||
if type(v) == 'boolean' then
|
options[k] = v
|
||||||
setOption(k, g_settings.getBoolean(k))
|
|
||||||
elseif type(v) == 'number' then
|
|
||||||
setOption(k, g_settings.getNumber(k))
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
g_keyboard.bindKeyDown('Ctrl+D', function() toggle() end)
|
|
||||||
g_keyboard.bindKeyDown('Ctrl+F', function() toggleOption('fullscreen') end)
|
|
||||||
g_keyboard.bindKeyDown('Ctrl+Shift+D', function() toggleOption('walkBooster') end)
|
|
||||||
|
|
||||||
optionsWindow = g_ui.displayUI('options')
|
optionsWindow = g_ui.displayUI('options')
|
||||||
optionsWindow:hide()
|
optionsWindow:hide()
|
||||||
optionsButton = modules.client_topmenu.addLeftButton('optionsButton', tr('Options') .. ' (Ctrl+D)', '/images/topbuttons/options', toggle)
|
|
||||||
|
|
||||||
optionsTabBar = optionsWindow:getChildById('optionsTabBar')
|
optionsTabBar = optionsWindow:getChildById('optionsTabBar')
|
||||||
optionsTabBar:setContentWidget(optionsWindow:getChildById('optionsTabContent'))
|
optionsTabBar:setContentWidget(optionsWindow:getChildById('optionsTabContent'))
|
||||||
|
|
||||||
gamePanel = g_ui.loadUI('game')
|
g_keyboard.bindKeyDown('Ctrl+Shift+F', function() toggleOption('fullscreen') end)
|
||||||
optionsTabBar:addTab(tr('Game'), gamePanel)
|
g_keyboard.bindKeyDown('Ctrl+N', toggleDisplays)
|
||||||
|
|
||||||
|
generalPanel = g_ui.loadUI('game')
|
||||||
|
optionsTabBar:addTab(tr('Game'), generalPanel, '/images/optionstab/game')
|
||||||
|
|
||||||
consolePanel = g_ui.loadUI('console')
|
consolePanel = g_ui.loadUI('console')
|
||||||
optionsTabBar:addTab(tr('Console'), consolePanel)
|
optionsTabBar:addTab(tr('Console'), consolePanel, '/images/optionstab/console')
|
||||||
|
|
||||||
graphicsPanel = g_ui.loadUI('graphics')
|
graphicsPanel = g_ui.loadUI('graphics')
|
||||||
optionsTabBar:addTab(tr('Graphics'), graphicsPanel)
|
optionsTabBar:addTab(tr('Graphics'), graphicsPanel, '/images/optionstab/graphics')
|
||||||
|
|
||||||
if g_game.isOfficialTibia() then
|
audioPanel = g_ui.loadUI('audio')
|
||||||
local optionWalkBooster = gamePanel:getChildById('walkBooster')
|
optionsTabBar:addTab(tr('Audio'), audioPanel, '/images/optionstab/audio')
|
||||||
optionWalkBooster.onCheckChange = function(widget)
|
|
||||||
displayWarning(widget, "This feature could be detectable by official Tibia servers. Would like to continue?")
|
|
||||||
setOption(widget:getId(), widget:isChecked())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
setupGraphicsEngines()
|
optionsButton = modules.client_topmenu.addLeftButton('optionsButton', tr('Options'), '/images/topbuttons/options', toggle)
|
||||||
|
audioButton = modules.client_topmenu.addLeftButton('audioButton', tr('Audio'), '/images/topbuttons/audio', function() toggleOption('enableAudio') end)
|
||||||
|
|
||||||
|
addEvent(function() setup() end)
|
||||||
end
|
end
|
||||||
|
|
||||||
function terminate()
|
function terminate()
|
||||||
g_keyboard.unbindKeyDown('Ctrl+D')
|
g_keyboard.unbindKeyDown('Ctrl+Shift+F')
|
||||||
g_keyboard.unbindKeyDown('Ctrl+F')
|
g_keyboard.unbindKeyDown('Ctrl+N')
|
||||||
g_keyboard.unbindKeyDown('Ctrl+Shift+D')
|
|
||||||
optionsWindow:destroy()
|
optionsWindow:destroy()
|
||||||
optionsWindow = nil
|
|
||||||
optionsButton:destroy()
|
optionsButton:destroy()
|
||||||
optionsButton = nil
|
audioButton:destroy()
|
||||||
optionsTabBar = nil
|
end
|
||||||
gamePanel = nil
|
|
||||||
consolePanel = nil
|
function setup()
|
||||||
graphicsPanel = nil
|
setupGraphicsEngines()
|
||||||
|
|
||||||
|
-- load options
|
||||||
|
for k,v in pairs(defaultOptions) do
|
||||||
|
if type(v) == 'boolean' then
|
||||||
|
setOption(k, g_settings.getBoolean(k), true)
|
||||||
|
elseif type(v) == 'number' then
|
||||||
|
setOption(k, g_settings.getNumber(k), true)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function toggle()
|
function toggle()
|
||||||
@@ -151,77 +153,91 @@ function hide()
|
|||||||
optionsWindow:hide()
|
optionsWindow:hide()
|
||||||
end
|
end
|
||||||
|
|
||||||
function toggleOption(key)
|
function toggleDisplays()
|
||||||
local optionWidget = optionsWindow:recursiveGetChildById(key)
|
if options['displayNames'] and options['displayHealth'] then
|
||||||
if optionWidget then
|
setOption('displayNames', false)
|
||||||
optionWidget:setChecked(not getOption(key))
|
elseif options['displayHealth'] then
|
||||||
|
setOption('displayHealth', false)
|
||||||
else
|
else
|
||||||
setOption(key, not getOption(key))
|
if not options['displayNames'] and not options['displayHealth'] then
|
||||||
|
setOption('displayNames', true)
|
||||||
|
else
|
||||||
|
setOption('displayHealth', true)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function setOption(key, value)
|
function toggleOption(key)
|
||||||
if options[key] == value then return end
|
setOption(key, not getOption(key))
|
||||||
|
end
|
||||||
|
|
||||||
|
function setOption(key, value, force)
|
||||||
|
if not force and options[key] == value then return end
|
||||||
|
local gameMapPanel = modules.game_interface.getMapPanel()
|
||||||
|
|
||||||
if key == 'vsync' then
|
if key == 'vsync' then
|
||||||
g_window.setVerticalSync(value)
|
g_window.setVerticalSync(value)
|
||||||
elseif key == 'showFps' then
|
elseif key == 'showFps' then
|
||||||
addEvent(function()
|
modules.client_topmenu.setFpsVisible(value)
|
||||||
local frameCounter = rootWidget:recursiveGetChildById('frameCounter')
|
|
||||||
if frameCounter then frameCounter:setVisible(value) end
|
|
||||||
end)
|
|
||||||
elseif key == 'showPing' then
|
elseif key == 'showPing' then
|
||||||
addEvent(function()
|
modules.client_topmenu.setPingVisible(value)
|
||||||
local ping = rootWidget:recursiveGetChildById('pingLabel')
|
|
||||||
if ping then ping:setVisible(value) end
|
|
||||||
end)
|
|
||||||
elseif key == 'fullscreen' then
|
elseif key == 'fullscreen' then
|
||||||
g_window.setFullscreen(value)
|
g_window.setFullscreen(value)
|
||||||
elseif key == 'dontStretchShrink' then
|
elseif key == 'enableAudio' then
|
||||||
addEvent(function()
|
|
||||||
modules.game_interface.updateStretchShrink()
|
|
||||||
end)
|
|
||||||
elseif key == 'enableMusic' then
|
|
||||||
g_sounds.setAudioEnabled(value)
|
g_sounds.setAudioEnabled(value)
|
||||||
|
if value then
|
||||||
|
audioButton:setIcon('/images/topbuttons/audio')
|
||||||
|
else
|
||||||
|
audioButton:setIcon('/images/topbuttons/audio_mute')
|
||||||
|
end
|
||||||
|
elseif key == 'enableMusicSound' then
|
||||||
|
g_sounds.getChannel(SoundChannels.Music):setEnabled(value)
|
||||||
|
elseif key == 'musicSoundVolume' then
|
||||||
|
g_sounds.getChannel(SoundChannels.Music):setGain(value/100)
|
||||||
|
audioPanel:getChildById('musicSoundVolumeLabel'):setText(tr('Music volume: %d', value))
|
||||||
elseif key == 'showLeftPanel' then
|
elseif key == 'showLeftPanel' then
|
||||||
addEvent(function()
|
modules.game_interface.getLeftPanel():setOn(value)
|
||||||
modules.game_interface.getLeftPanel():setOn(value)
|
|
||||||
end)
|
|
||||||
elseif key == 'backgroundFrameRate' then
|
elseif key == 'backgroundFrameRate' then
|
||||||
local text = value
|
local text, v = value, value
|
||||||
if value <= 0 or value >= 201 then
|
if value <= 0 or value >= 201 then text = 'max' v = 0 end
|
||||||
text = 'max'
|
graphicsPanel:getChildById('backgroundFrameRateLabel'):setText(tr('Game framerate limit: %s', text))
|
||||||
value = 0
|
g_app.setBackgroundPaneMaxFps(v)
|
||||||
end
|
|
||||||
|
|
||||||
if graphicsPanel then
|
|
||||||
graphicsPanel:getChildById('backgroundFrameRateLabel'):setText(tr('Game framerate limit: %s', text))
|
|
||||||
end
|
|
||||||
g_app.setBackgroundPaneMaxFps(value)
|
|
||||||
elseif key == 'foregroundFrameRate' then
|
elseif key == 'foregroundFrameRate' then
|
||||||
local text = value
|
local text, v = value, value
|
||||||
if value <= 0 or value >= 61 then
|
if value <= 0 or value >= 61 then text = 'max' v = 0 end
|
||||||
text = 'max'
|
graphicsPanel:getChildById('foregroundFrameRateLabel'):setText(tr('Interface framerate limit: %s', text))
|
||||||
value = 0
|
g_app.setForegroundPaneMaxFps(v)
|
||||||
end
|
elseif key == 'enableLights' then
|
||||||
|
gameMapPanel:setDrawLights(value and options['ambientLight'] < 100)
|
||||||
if graphicsPanel then
|
graphicsPanel:getChildById('ambientLight'):setEnabled(value)
|
||||||
graphicsPanel:getChildById('foregroundFrameRateLabel'):setText(tr('Interface framerate limit: %s', text))
|
graphicsPanel:getChildById('ambientLightLabel'):setEnabled(value)
|
||||||
end
|
|
||||||
g_app.setForegroundPaneMaxFps(value)
|
|
||||||
elseif key == 'ambientLight' then
|
elseif key == 'ambientLight' then
|
||||||
addEvent(function()
|
graphicsPanel:getChildById('ambientLightLabel'):setText(tr('Ambient light: %s%%', value))
|
||||||
local map = rootWidget:recursiveGetChildById('gameMapPanel')
|
gameMapPanel:setMinimumAmbientLight(value/100)
|
||||||
if graphicsPanel then
|
gameMapPanel:setDrawLights(options['enableLights'] and value < 100)
|
||||||
graphicsPanel:getChildById('ambientLightLabel'):setText(tr('Ambient light: %s%%', value))
|
|
||||||
end
|
|
||||||
if map then
|
|
||||||
map:setMinimumAmbientLight(value/100)
|
|
||||||
map:setDrawLights(value < 100)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
elseif key == 'painterEngine' then
|
elseif key == 'painterEngine' then
|
||||||
g_graphics.selectPainterEngine(value)
|
g_graphics.selectPainterEngine(value)
|
||||||
|
elseif key == 'displayNames' then
|
||||||
|
gameMapPanel:setDrawNames(value)
|
||||||
|
elseif key == 'displayHealth' then
|
||||||
|
gameMapPanel:setDrawHealthBars(value)
|
||||||
|
elseif key == 'displayText' then
|
||||||
|
gameMapPanel:setDrawTexts(value)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- change value for keybind updates
|
||||||
|
for _,panel in pairs(optionsTabBar:getTabsPanel()) do
|
||||||
|
local widget = panel:recursiveGetChildById(key)
|
||||||
|
if widget then
|
||||||
|
if widget:getStyle().__class == 'UICheckBox' then
|
||||||
|
widget:setChecked(value)
|
||||||
|
elseif widget:getStyle().__class == 'UIScrollBar' then
|
||||||
|
widget:setValue(value)
|
||||||
|
end
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
g_settings.set(key, value)
|
g_settings.set(key, value)
|
||||||
options[key] = value
|
options[key] = value
|
||||||
end
|
end
|
||||||
@@ -230,4 +246,10 @@ function getOption(key)
|
|||||||
return options[key]
|
return options[key]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function addTab(name, panel, icon)
|
||||||
|
optionsTabBar:addTab(name, panel, icon)
|
||||||
|
end
|
||||||
|
|
||||||
|
function addButton(name, func, icon)
|
||||||
|
optionsTabBar:addButton(name, func, icon)
|
||||||
|
end
|
||||||
|
@@ -4,7 +4,6 @@ Module
|
|||||||
author: edubart, BeniS
|
author: edubart, BeniS
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
dependencies: [ client_topmenu ]
|
|
||||||
scripts: [ options ]
|
scripts: [ options ]
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
@onUnload: terminate()
|
@onUnload: terminate()
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
OptionCheckBox < CheckBox
|
OptionCheckBox < CheckBox
|
||||||
@onCheckChange: modules.client_options.setOption(self:getId(), self:isChecked())
|
@onCheckChange: modules.client_options.setOption(self:getId(), self:isChecked())
|
||||||
@onSetup: self:setChecked(modules.client_options.getOption(self:getId()))
|
|
||||||
height: 16
|
height: 16
|
||||||
|
|
||||||
$first:
|
$first:
|
||||||
@@ -14,27 +13,31 @@ OptionCheckBox < CheckBox
|
|||||||
anchors.top: prev.bottom
|
anchors.top: prev.bottom
|
||||||
margin-top: 2
|
margin-top: 2
|
||||||
|
|
||||||
|
OptionScrollbar < HorizontalScrollBar
|
||||||
|
step: 1
|
||||||
|
@onValueChange: modules.client_options.setOption(self:getId(), self:getValue())
|
||||||
|
|
||||||
MainWindow
|
MainWindow
|
||||||
id: optionsWindow
|
id: optionsWindow
|
||||||
!text: tr('Options')
|
!text: tr('Options')
|
||||||
size: 350 310
|
size: 480 340
|
||||||
|
|
||||||
@onEnter: modules.client_options.hide()
|
@onEnter: modules.client_options.hide()
|
||||||
@onEscape: modules.client_options.hide()
|
@onEscape: modules.client_options.hide()
|
||||||
|
|
||||||
TabBarRounded
|
TabBarVertical
|
||||||
id: optionsTabBar
|
id: optionsTabBar
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.bottom: parent.bottom
|
||||||
|
|
||||||
Panel
|
Panel
|
||||||
id: optionsTabContent
|
id: optionsTabContent
|
||||||
anchors.top: optionsTabBar.bottom
|
anchors.top: optionsTabBar.top
|
||||||
anchors.left: parent.left
|
anchors.left: optionsTabBar.right
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: optionsTabBar.bottom
|
||||||
margin-top: 10
|
margin-left: 10
|
||||||
|
|
||||||
Button
|
Button
|
||||||
!text: tr('Ok')
|
!text: tr('Ok')
|
||||||
|
38
modules/client_serverlist/addserver.lua
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
AddServer = {}
|
||||||
|
|
||||||
|
-- private variables
|
||||||
|
local addServerWindow = nil
|
||||||
|
|
||||||
|
-- public functions
|
||||||
|
function AddServer.init()
|
||||||
|
addServerWindow = g_ui.displayUI('addserver')
|
||||||
|
end
|
||||||
|
|
||||||
|
function AddServer.terminate()
|
||||||
|
addServerWindow:destroy()
|
||||||
|
end
|
||||||
|
|
||||||
|
function AddServer.add()
|
||||||
|
local host = addServerWindow:getChildById('host'):getText()
|
||||||
|
local port = addServerWindow:getChildById('port'):getText()
|
||||||
|
local protocol = addServerWindow:getChildById('protocol'):getCurrentOption().text
|
||||||
|
|
||||||
|
local added, error = ServerList.add(host, port, protocol)
|
||||||
|
if not added then
|
||||||
|
displayErrorBox(tr('Add Error'), tr(error))
|
||||||
|
else
|
||||||
|
AddServer.hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function AddServer.show()
|
||||||
|
addServerWindow:show()
|
||||||
|
addServerWindow:raise()
|
||||||
|
addServerWindow:focus()
|
||||||
|
addServerWindow:lock()
|
||||||
|
end
|
||||||
|
|
||||||
|
function AddServer.hide()
|
||||||
|
addServerWindow:hide()
|
||||||
|
addServerWindow:unlock()
|
||||||
|
end
|
72
modules/client_serverlist/addserver.otui
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
MainWindow
|
||||||
|
id: addServerWindow
|
||||||
|
!text: tr('New Server')
|
||||||
|
size: 180 180
|
||||||
|
visible: false
|
||||||
|
@onEscape: AddServer.hide()
|
||||||
|
@onEnter: AddServer.add()
|
||||||
|
|
||||||
|
Label
|
||||||
|
id: hostLabel
|
||||||
|
!text: tr('Host') .. ':'
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
margin-bottom: 2
|
||||||
|
|
||||||
|
TextEdit
|
||||||
|
id: host
|
||||||
|
anchors.top: hostLabel.bottom
|
||||||
|
anchors.left: hostLabel.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
auto-focus: first
|
||||||
|
|
||||||
|
Label
|
||||||
|
id: portLabel
|
||||||
|
!text: tr('Port') .. ':'
|
||||||
|
anchors.top: host.bottom
|
||||||
|
anchors.left: host.left
|
||||||
|
margin-top: 3
|
||||||
|
margin-bottom: 2
|
||||||
|
|
||||||
|
TextEdit
|
||||||
|
id: port
|
||||||
|
text: 7171
|
||||||
|
anchors.top: portLabel.bottom
|
||||||
|
anchors.left: portLabel.left
|
||||||
|
anchors.right: host.right
|
||||||
|
|
||||||
|
Label
|
||||||
|
id: protocolLabel
|
||||||
|
!text: tr('Protocol') .. ':'
|
||||||
|
anchors.top: port.bottom
|
||||||
|
anchors.left: port.left
|
||||||
|
margin-top: 3
|
||||||
|
margin-bottom: 2
|
||||||
|
|
||||||
|
ComboBox
|
||||||
|
id: protocol
|
||||||
|
anchors.top: protocolLabel.bottom
|
||||||
|
anchors.left: protocolLabel.left
|
||||||
|
anchors.right: port.right
|
||||||
|
@onSetup: |
|
||||||
|
for _, proto in pairs(g_game.getSupportedProtocols()) do
|
||||||
|
self:addOption(proto)
|
||||||
|
end
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: buttonAdd
|
||||||
|
!text: tr('Add')
|
||||||
|
width: 64
|
||||||
|
anchors.right: parent.horizontalCenter
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
margin-right: 2
|
||||||
|
@onClick: AddServer.add()
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: buttonCancel
|
||||||
|
!text: tr('Cancel')
|
||||||
|
width: 64
|
||||||
|
anchors.left: parent.horizontalCenter
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
margin-left: 2
|
||||||
|
@onClick: AddServer.hide()
|
128
modules/client_serverlist/serverlist.lua
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
ServerList = {}
|
||||||
|
|
||||||
|
-- private variables
|
||||||
|
local serverListWindow = nil
|
||||||
|
local serverTextList = nil
|
||||||
|
local removeWindow = nil
|
||||||
|
local servers = {}
|
||||||
|
|
||||||
|
-- public functions
|
||||||
|
function ServerList.init()
|
||||||
|
serverListWindow = g_ui.displayUI('serverlist')
|
||||||
|
serverTextList = serverListWindow:getChildById('serverList')
|
||||||
|
|
||||||
|
servers = g_settings.getNode('ServerList') or {}
|
||||||
|
ServerList.load()
|
||||||
|
end
|
||||||
|
|
||||||
|
function ServerList.terminate()
|
||||||
|
ServerList.destroy()
|
||||||
|
|
||||||
|
g_settings.setNode('ServerList', servers)
|
||||||
|
|
||||||
|
ServerList = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
function ServerList.load()
|
||||||
|
for k,server in pairs(servers) do
|
||||||
|
ServerList.add(k, server.port, server.protocol, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ServerList.select()
|
||||||
|
local selected = serverTextList:getFocusedChild()
|
||||||
|
if selected then
|
||||||
|
local server = servers[selected:getId()]
|
||||||
|
if server then
|
||||||
|
EnterGame.setDefaultServer(selected:getId(), server.port, server.protocol)
|
||||||
|
EnterGame.setAccountName(server.account)
|
||||||
|
EnterGame.setPassword(server.password)
|
||||||
|
ServerList.hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ServerList.add(host, port, protocol, load)
|
||||||
|
if not load and servers[host] then
|
||||||
|
return false, 'Server already exists'
|
||||||
|
elseif host == '' or port == '' then
|
||||||
|
return false, 'Required fields are missing'
|
||||||
|
end
|
||||||
|
local widget = g_ui.createWidget('ServerWidget', serverTextList)
|
||||||
|
widget:setId(host)
|
||||||
|
|
||||||
|
if not load then
|
||||||
|
servers[host] = {
|
||||||
|
port = port,
|
||||||
|
protocol = protocol,
|
||||||
|
account = '',
|
||||||
|
password = ''
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local details = widget:getChildById('details')
|
||||||
|
details:setText(host..':'..port)
|
||||||
|
|
||||||
|
local proto = widget:getChildById('protocol')
|
||||||
|
proto:setText(protocol)
|
||||||
|
|
||||||
|
connect(widget, { onDoubleClick = function () ServerList.select() return true end } )
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
function ServerList.remove(widget)
|
||||||
|
local host = widget:getId()
|
||||||
|
|
||||||
|
if removeWindow then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local yesCallback = function()
|
||||||
|
widget:destroy()
|
||||||
|
servers[host] = nil
|
||||||
|
removeWindow:destroy()
|
||||||
|
removeWindow=nil
|
||||||
|
end
|
||||||
|
local noCallback = function()
|
||||||
|
removeWindow:destroy()
|
||||||
|
removeWindow=nil
|
||||||
|
end
|
||||||
|
|
||||||
|
removeWindow = displayGeneralBox(tr('Remove'), tr('Remove '..host..'?'), {
|
||||||
|
{ text=tr('Yes'), callback=yesCallback },
|
||||||
|
{ text=tr('No'), callback=noCallback },
|
||||||
|
anchor=AnchorHorizontalCenter}, yesCallback, noCallback)
|
||||||
|
end
|
||||||
|
|
||||||
|
function ServerList.destroy()
|
||||||
|
if serverListWindow then
|
||||||
|
serverTextList = nil
|
||||||
|
serverListWindow:destroy()
|
||||||
|
serverListWindow = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ServerList.show()
|
||||||
|
if g_game.isOnline() then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
serverListWindow:show()
|
||||||
|
serverListWindow:raise()
|
||||||
|
serverListWindow:focus()
|
||||||
|
end
|
||||||
|
|
||||||
|
function ServerList.hide()
|
||||||
|
serverListWindow:hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
function ServerList.setServerAccount(host, account)
|
||||||
|
if servers[host] then
|
||||||
|
servers[host].account = account
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ServerList.setServerPassword(host, password)
|
||||||
|
if servers[host] then
|
||||||
|
servers[host].password = password
|
||||||
|
end
|
||||||
|
end
|
18
modules/client_serverlist/serverlist.otmod
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
Module
|
||||||
|
name: client_serverlist
|
||||||
|
description: Manages a server list of previously entered servers
|
||||||
|
author: BeniS
|
||||||
|
website: www.otclient.info
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
- client_entergame
|
||||||
|
|
||||||
|
@onLoad: |
|
||||||
|
dofile 'serverlist'
|
||||||
|
dofile 'addserver'
|
||||||
|
ServerList.init()
|
||||||
|
AddServer.init()
|
||||||
|
|
||||||
|
@onUnload: |
|
||||||
|
ServerList.terminate()
|
||||||
|
AddServer.terminate()
|
110
modules/client_serverlist/serverlist.otui
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
ServerWidget < UIWidget
|
||||||
|
height: 14
|
||||||
|
background-color: alpha
|
||||||
|
&updateOnStates: |
|
||||||
|
function(self)
|
||||||
|
local children = self:getChildren()
|
||||||
|
for i=1,#children do
|
||||||
|
children[i]:setOn(self:isFocused())
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@onFocusChange: self:updateOnStates()
|
||||||
|
@onSetup: self:updateOnStates()
|
||||||
|
|
||||||
|
$focus:
|
||||||
|
background-color: #ffffff22
|
||||||
|
|
||||||
|
Label
|
||||||
|
id: details
|
||||||
|
color: #aaaaaa
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
font: verdana-11px-monochrome
|
||||||
|
text-auto-resize: true
|
||||||
|
background-color: alpha
|
||||||
|
text-offset: 2 0
|
||||||
|
|
||||||
|
$on:
|
||||||
|
color: #ffffff
|
||||||
|
|
||||||
|
Label
|
||||||
|
id: protocol
|
||||||
|
color: #ffffff
|
||||||
|
color: #aaaaaa
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.right: next.left
|
||||||
|
margin-right: 5
|
||||||
|
font: verdana-11px-monochrome
|
||||||
|
text-auto-resize: true
|
||||||
|
background-color: alpha
|
||||||
|
&baseText: '(%s)'
|
||||||
|
|
||||||
|
$on:
|
||||||
|
color: #ffffff
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: remove
|
||||||
|
text: x
|
||||||
|
width: 12
|
||||||
|
height: 12
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.right: parent.right
|
||||||
|
margin-right: 4
|
||||||
|
margin-top: 1
|
||||||
|
@onClick: ServerList.remove(self:getParent())
|
||||||
|
|
||||||
|
MainWindow
|
||||||
|
id: serverListWindow
|
||||||
|
!text: tr('Server List')
|
||||||
|
size: 340 290
|
||||||
|
visible: false
|
||||||
|
@onEnter: ServerList.select()
|
||||||
|
@onEscape: ServerList.hide()
|
||||||
|
@onSetup: |
|
||||||
|
g_keyboard.bindKeyPress('Up', function() self:getChildById('serverList'):focusPreviousChild(KeyboardFocusReason) end, self)
|
||||||
|
g_keyboard.bindKeyPress('Down', function() self:getChildById('serverList'):focusNextChild(KeyboardFocusReason) end, self)
|
||||||
|
|
||||||
|
TextList
|
||||||
|
id: serverList
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: serverListScrollBar.left
|
||||||
|
anchors.bottom: buttonOk.top
|
||||||
|
margin-bottom: 5
|
||||||
|
padding: 1
|
||||||
|
focusable: false
|
||||||
|
vertical-scrollbar: serverListScrollBar
|
||||||
|
auto-focus: first
|
||||||
|
|
||||||
|
VerticalScrollBar
|
||||||
|
id: serverListScrollBar
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.bottom: buttonOk.top
|
||||||
|
anchors.right: parent.right
|
||||||
|
margin-bottom: 5
|
||||||
|
step: 14
|
||||||
|
pixels-scroll: true
|
||||||
|
|
||||||
|
AddButton
|
||||||
|
id: buttonAdd
|
||||||
|
!tooltip: tr('Add new server')
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
@onClick: AddServer.show()
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: buttonOk
|
||||||
|
!text: tr('Select')
|
||||||
|
width: 64
|
||||||
|
anchors.right: next.left
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
margin-right: 10
|
||||||
|
@onClick: ServerList.select()
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: buttonCancel
|
||||||
|
!text: tr('Cancel')
|
||||||
|
width: 64
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
@onClick: ServerList.hide()
|
@@ -25,6 +25,8 @@ end
|
|||||||
function terminate()
|
function terminate()
|
||||||
disconnect(g_game, { onGameStart = onGameStart,
|
disconnect(g_game, { onGameStart = onGameStart,
|
||||||
onGameEnd = onGameEnd })
|
onGameEnd = onGameEnd })
|
||||||
|
removeEvent(firstReportEvent)
|
||||||
|
removeEvent(sendReportEvent)
|
||||||
end
|
end
|
||||||
|
|
||||||
function configure(host, port, delay)
|
function configure(host, port, delay)
|
||||||
@@ -45,13 +47,15 @@ end
|
|||||||
|
|
||||||
function onGameStart()
|
function onGameStart()
|
||||||
if not HOST then return end
|
if not HOST then return end
|
||||||
|
removeEvent(firstReportEvent)
|
||||||
|
removeEvent(sendReportEvent)
|
||||||
firstReportEvent = addEvent(sendReport, FIRST_REPORT_DELAY*1000)
|
firstReportEvent = addEvent(sendReport, FIRST_REPORT_DELAY*1000)
|
||||||
sendReportEvent = cycleEvent(sendReport, REPORT_DELAY*1000)
|
sendReportEvent = cycleEvent(sendReport, REPORT_DELAY*1000)
|
||||||
end
|
end
|
||||||
|
|
||||||
function onGameEnd()
|
function onGameEnd()
|
||||||
removeEvent(sendReportEvent)
|
|
||||||
removeEvent(firstReportEvent)
|
removeEvent(firstReportEvent)
|
||||||
|
removeEvent(sendReportEvent)
|
||||||
end
|
end
|
||||||
|
|
||||||
function onConnect(protocol)
|
function onConnect(protocol)
|
||||||
@@ -84,6 +88,7 @@ function onConnect(protocol)
|
|||||||
post = post .. '&cpu=' .. g_platform.getCPUName()
|
post = post .. '&cpu=' .. g_platform.getCPUName()
|
||||||
post = post .. '&mem=' .. g_platform.getTotalSystemMemory()
|
post = post .. '&mem=' .. g_platform.getTotalSystemMemory()
|
||||||
post = post .. '&os_name=' .. g_platform.getOSName()
|
post = post .. '&os_name=' .. g_platform.getOSName()
|
||||||
|
post = post .. getAdditionalData()
|
||||||
|
|
||||||
local message = ''
|
local message = ''
|
||||||
message = message .. "POST /report HTTP/1.1\r\n"
|
message = message .. "POST /report HTTP/1.1\r\n"
|
||||||
@@ -98,6 +103,10 @@ function onConnect(protocol)
|
|||||||
protocol:recv()
|
protocol:recv()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function getAdditionalData()
|
||||||
|
return ''
|
||||||
|
end
|
||||||
|
|
||||||
function onRecv(protocol, message)
|
function onRecv(protocol, message)
|
||||||
if string.find(message, 'HTTP/1.1 200 OK') then
|
if string.find(message, 'HTTP/1.1 200 OK') then
|
||||||
--pinfo('Stats sent to server successfully!')
|
--pinfo('Stats sent to server successfully!')
|
||||||
@@ -106,5 +115,5 @@ function onRecv(protocol, message)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function onError(protocol, message, code)
|
function onError(protocol, message, code)
|
||||||
perror('Could not send statistics: ' .. message)
|
pdebug('Could not send statistics: ' .. message)
|
||||||
end
|
end
|
||||||
|
@@ -1,24 +1,27 @@
|
|||||||
function init()
|
function init()
|
||||||
local styles = g_resources.listDirectoryFiles('/styles')
|
local files
|
||||||
for _i,style in pairs(styles) do
|
files = g_resources.listDirectoryFiles('/styles')
|
||||||
if string.ends(style, '.otui') then
|
for _,file in pairs(files) do
|
||||||
g_ui.importStyle('/styles/' .. style)
|
if g_resources.isFileType(file, 'otui') then
|
||||||
|
g_ui.importStyle('/styles/' .. file)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local fonts = g_resources.listDirectoryFiles('/fonts')
|
files = g_resources.listDirectoryFiles('/fonts')
|
||||||
for _i,font in pairs(fonts) do
|
for _,file in pairs(files) do
|
||||||
if string.ends(font, '.otfont') then
|
if g_resources.isFileType(file, 'otfont') then
|
||||||
g_fonts.importFont('/fonts/' .. font)
|
g_fonts.importFont('/fonts/' .. file)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local particles = g_resources.listDirectoryFiles('/particles')
|
files = g_resources.listDirectoryFiles('/particles')
|
||||||
for _i,particle in pairs(particles) do
|
for _,file in pairs(files) do
|
||||||
if string.ends(particle, '.otps') then
|
if g_resources.isFileType(file, 'otps')then
|
||||||
g_particles.importParticle('/particles/' .. particle)
|
g_particles.importParticle('/particles/' .. file)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
g_mouse.loadCursors('/cursors/cursors')
|
||||||
end
|
end
|
||||||
|
|
||||||
function terminate()
|
function terminate()
|
||||||
|
@@ -1,94 +1,177 @@
|
|||||||
function dumpWidgets(widget, level)
|
local function pcolored(text, color)
|
||||||
widget = widget or rootWidget
|
color = color or 'white'
|
||||||
level = level or 0
|
modules.client_terminal.addLine(tostring(text), color)
|
||||||
for i=1,widget:getChildCount() do
|
end
|
||||||
local child = widget:getChildByIndex(i)
|
|
||||||
if child:isVisible() then
|
function draw_debug_boxes()
|
||||||
local name = child:getId()
|
g_ui.setDebugBoxesDrawing(not g_ui.isDrawingDebugBoxes())
|
||||||
if name:match('widget%d+') == nil then
|
end
|
||||||
print(string.rep(' ', level) .. name)
|
|
||||||
end
|
function hide_map()
|
||||||
if child:getId() ~= 'terminalBuffer' then
|
modules.game_interface.getMapPanel():hide()
|
||||||
dumpWidgets(child, level+1)
|
end
|
||||||
end
|
|
||||||
|
function show_map()
|
||||||
|
modules.game_interface.getMapPanel():show()
|
||||||
|
end
|
||||||
|
|
||||||
|
function live_textures_reload()
|
||||||
|
g_textures.liveReload()
|
||||||
|
end
|
||||||
|
|
||||||
|
function live_module_reload(name)
|
||||||
|
if not name then
|
||||||
|
pcolored('ERROR: missing module name', 'red')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local module = g_modules.getModule(name)
|
||||||
|
if not module then
|
||||||
|
pcolored('ERROR: unable to find module ' .. name, 'red')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if not module:isReloadble() then
|
||||||
|
pcolored('ERROR: that module is not reloadable', 'red')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if not module:canReload() then
|
||||||
|
pcolored('ERROR: some other modules requires this module, cannot reload now', 'red')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local files = {}
|
||||||
|
local hasFile = false
|
||||||
|
for _,file in pairs(g_resources.listDirectoryFiles('/' .. name)) do
|
||||||
|
local filepath = '/' .. name .. '/' .. file
|
||||||
|
local time = g_resources.getFileTime(filepath)
|
||||||
|
if time > 0 then
|
||||||
|
files[filepath] = time
|
||||||
|
hasFile = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
function drawDebugBoxes(enable)
|
if not hasFile then
|
||||||
if enable == nil then enable = true end
|
pcolored('ERROR: unable to find any file for module', 'red')
|
||||||
g_ui.setDebugBoxesDrawing(enable)
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
function hideMap()
|
cycleEvent(function()
|
||||||
local map = rootWidget:recursiveGetChildById('gameMapPanel')
|
for filepath,time in pairs(files) do
|
||||||
if map then map:hide() end
|
local newtime = g_resources.getFileTime(filepath)
|
||||||
end
|
if newtime > time then
|
||||||
|
pcolored('Reloading ' .. name, 'green')
|
||||||
|
modules.client_terminal.flushLines()
|
||||||
|
module:reload()
|
||||||
|
files[filepath] = newtime
|
||||||
|
|
||||||
function showMap()
|
if name == 'client_terminal' then
|
||||||
local map = rootWidget:recursiveGetChildById('gameMapPanel')
|
modules.client_terminal.show()
|
||||||
if map then map:show() end
|
end
|
||||||
end
|
break
|
||||||
|
|
||||||
function debugContainersItems()
|
|
||||||
function UIItem:onHoverChange(hovered)
|
|
||||||
if hovered then
|
|
||||||
local item = self:getItem()
|
|
||||||
if item then
|
|
||||||
local text = "id: " ..item:getId() ..
|
|
||||||
"\n stackable: " ..tostring(item:isStackable()) ..
|
|
||||||
"\n marketable: " ..tostring(item:isMarketable()) ..
|
|
||||||
"\n vocation: "..(item:getMarketData() and item:getMarketData().restrictVocation or 'none') ..
|
|
||||||
"\n cloth slot: " ..item:getClothSlot()
|
|
||||||
g_tooltip.display(text)
|
|
||||||
end
|
end
|
||||||
else
|
end
|
||||||
g_tooltip.hide()
|
end, 1000)
|
||||||
|
end
|
||||||
|
|
||||||
|
function live_sprites_reload()
|
||||||
|
local files = {}
|
||||||
|
for _,file in pairs(g_resources.listDirectoryFiles('/things')) do
|
||||||
|
local filepath = '/things/' .. file
|
||||||
|
local time = g_resources.getFileTime(filepath)
|
||||||
|
if time > 0 then
|
||||||
|
files[filepath] = time
|
||||||
|
hasFile = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if not hasFile then
|
||||||
|
pcolored('ERROR: unable to find things file for module', 'red')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
cycleEvent(function()
|
||||||
|
for filepath,time in pairs(files) do
|
||||||
|
local newtime = g_resources.getFileTime(filepath)
|
||||||
|
if newtime > time then
|
||||||
|
pcolored('Reloading sprites...', 'green')
|
||||||
|
modules.client_terminal.flushLines()
|
||||||
|
modules.game_things.load()
|
||||||
|
files[filepath] = newtime
|
||||||
|
|
||||||
|
if name == 'client_terminal' then
|
||||||
|
modules.client_terminal.show()
|
||||||
|
end
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end, 1000)
|
||||||
end
|
end
|
||||||
|
|
||||||
function debugPosition(enable)
|
local pinging = false
|
||||||
if enable == nil then enable = true end
|
local function pingBack(ping)
|
||||||
local label = rootWidget:getChildById('debugPositionLabel')
|
if ping < 300 then color = 'green'
|
||||||
if not label then
|
elseif ping < 600 then color = 'yellow'
|
||||||
label = g_ui.createWidget('GameLabel', rootWidget)
|
else color = 'red' end
|
||||||
label:setColor('pink')
|
pcolored(g_game.getWorldName() .. ' => ' .. ping .. ' ms', color)
|
||||||
label:setFont('terminus-14px-bold')
|
end
|
||||||
label:setId('debugPositionLabel')
|
function ping()
|
||||||
label:setPosition({x= 10, y = 40 })
|
if pinging then
|
||||||
label:setPhantom(true)
|
pcolored('Ping stopped.')
|
||||||
label:setTextAutoResize(true)
|
g_game.setPingDelay(1000)
|
||||||
end
|
disconnect(g_game, 'onPingBack', pingBack)
|
||||||
if enable then
|
|
||||||
label.event = cycleEvent(function()
|
|
||||||
local player = g_game.getLocalPlayer()
|
|
||||||
if player then
|
|
||||||
local pos = g_game.getLocalPlayer():getPosition()
|
|
||||||
label:show()
|
|
||||||
label:setText('x: ' .. pos.x .. '\ny: ' .. pos.y .. '\nz: ' .. pos.z)
|
|
||||||
else
|
|
||||||
label:hide()
|
|
||||||
end
|
|
||||||
end, 100)
|
|
||||||
else
|
else
|
||||||
removeEvent(label.event)
|
if not (g_game.getFeature(GameClientPing) or g_game.getFeature(GameExtendedClientPing)) then
|
||||||
label.event = nil
|
pcolored('this server does not support ping', 'red')
|
||||||
label:hide()
|
return
|
||||||
|
elseif not g_game.isOnline() then
|
||||||
|
pcolored('ping command is only allowed when online', 'red')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
pcolored('Starting ping...')
|
||||||
|
g_game.setPingDelay(0)
|
||||||
|
connect(g_game, 'onPingBack', pingBack)
|
||||||
|
end
|
||||||
|
pinging = not pinging
|
||||||
|
end
|
||||||
|
|
||||||
|
function clear()
|
||||||
|
modules.client_terminal.clear()
|
||||||
|
end
|
||||||
|
|
||||||
|
function ls(path)
|
||||||
|
path = path or '/'
|
||||||
|
local files = g_resources.listDirectoryFiles(path)
|
||||||
|
for k,v in pairs(files) do
|
||||||
|
if g_resources.directoryExists(path .. v) then
|
||||||
|
pcolored(path .. v, 'blue')
|
||||||
|
else
|
||||||
|
pcolored(path .. v)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function autoReloadModule(name)
|
function about_version()
|
||||||
local function reloadEvent()
|
pcolored(g_app.getName() .. ' ' .. g_app.getVersion() .. '\n' ..
|
||||||
reloadModule(name)
|
'Rev ' .. g_app.getBuildRevision() .. ' ('.. g_app.getBuildCommit() .. ')\n' ..
|
||||||
scheduleEvent(reloadEvent, 1000)
|
'Built on ' .. g_app.getBuildDate())
|
||||||
end
|
|
||||||
reloadEvent()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function createDebugUIItem(id)
|
function about_graphics()
|
||||||
local uiitem = g_ui.createWidget('Item', rootWidget)
|
pcolored('Vendor ' .. g_graphics.getVendor() )
|
||||||
uiitem:setPosition({x= 200, y = 200 })
|
pcolored('Renderer' .. g_graphics.getRenderer())
|
||||||
uiitem:setItemId(id)
|
pcolored('Version' .. g_graphics.getVersion())
|
||||||
uiitem:show()
|
end
|
||||||
|
|
||||||
|
function about_modules()
|
||||||
|
for k,m in pairs(g_modules.getModules()) do
|
||||||
|
local loadedtext
|
||||||
|
if m:isLoaded() then
|
||||||
|
pcolored(m:getName() .. ' => loaded', 'green')
|
||||||
|
else
|
||||||
|
pcolored(m:getName() .. ' => not loaded', 'red')
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@@ -1,21 +1,32 @@
|
|||||||
-- configs
|
-- configs
|
||||||
local LogColors = { [LogInfo] = 'white',
|
local LogColors = { [LogDebug] = 'pink',
|
||||||
|
[LogInfo] = 'white',
|
||||||
[LogWarning] = 'yellow',
|
[LogWarning] = 'yellow',
|
||||||
[LogError] = 'red' }
|
[LogError] = 'red' }
|
||||||
local MaxLogLines = 80
|
local MaxLogLines = 128
|
||||||
local LabelHeight = 16
|
|
||||||
local MaxHistory = 1000
|
local MaxHistory = 1000
|
||||||
|
|
||||||
|
local oldenv = getfenv(0)
|
||||||
|
setfenv(0, _G)
|
||||||
|
_G.commandEnv = runinsandbox('commands')
|
||||||
|
setfenv(0, oldenv)
|
||||||
|
|
||||||
-- private variables
|
-- private variables
|
||||||
local terminalWindow
|
local terminalWindow
|
||||||
local terminalButton
|
local terminalButton
|
||||||
local logLocked = false
|
local logLocked = false
|
||||||
local commandEnv = {}
|
|
||||||
setmetatable(commandEnv, { __index = getfenv() } )
|
|
||||||
local commandTextEdit
|
local commandTextEdit
|
||||||
local terminalBuffer
|
local terminalBuffer
|
||||||
local commandHistory = { }
|
local commandHistory = { }
|
||||||
local currentHistoryIndex = 0
|
local currentHistoryIndex = 0
|
||||||
|
local poped = false
|
||||||
|
local oldPos
|
||||||
|
local oldSize
|
||||||
|
local firstShown = false
|
||||||
|
local flushEvent
|
||||||
|
local cachedLines = {}
|
||||||
|
local disabled = false
|
||||||
|
local allLines = {}
|
||||||
|
|
||||||
-- private functions
|
-- private functions
|
||||||
local function navigateCommand(step)
|
local function navigateCommand(step)
|
||||||
@@ -25,6 +36,7 @@ local function navigateCommand(step)
|
|||||||
if currentHistoryIndex > 0 then
|
if currentHistoryIndex > 0 then
|
||||||
local command = commandHistory[numCommands - currentHistoryIndex + 1]
|
local command = commandHistory[numCommands - currentHistoryIndex + 1]
|
||||||
commandTextEdit:setText(command)
|
commandTextEdit:setText(command)
|
||||||
|
commandTextEdit:setCursorPos(-1)
|
||||||
else
|
else
|
||||||
commandTextEdit:clearText()
|
commandTextEdit:clearText()
|
||||||
end
|
end
|
||||||
@@ -52,6 +64,7 @@ local function completeCommand()
|
|||||||
-- complete command with one match
|
-- complete command with one match
|
||||||
if #possibleCommands == 1 then
|
if #possibleCommands == 1 then
|
||||||
commandTextEdit:setText(possibleCommands[1])
|
commandTextEdit:setText(possibleCommands[1])
|
||||||
|
commandTextEdit:setCursorPos(-1)
|
||||||
-- show command matches
|
-- show command matches
|
||||||
elseif #possibleCommands > 0 then
|
elseif #possibleCommands > 0 then
|
||||||
print('>> ' .. commandBegin)
|
print('>> ' .. commandBegin)
|
||||||
@@ -75,6 +88,7 @@ local function completeCommand()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
commandTextEdit:setText(commandBegin)
|
commandTextEdit:setText(commandBegin)
|
||||||
|
commandTextEdit:setCursorPos(-1)
|
||||||
|
|
||||||
for i,v in ipairs(possibleCommands) do
|
for i,v in ipairs(possibleCommands) do
|
||||||
print(v)
|
print(v)
|
||||||
@@ -93,9 +107,7 @@ local function doCommand()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function onLog(level, message, time)
|
local function onLog(level, message, time)
|
||||||
-- debug messages are ignored
|
if disabled then return end
|
||||||
if level == LogDebug then return end
|
|
||||||
|
|
||||||
-- avoid logging while reporting logs (would cause a infinite loop)
|
-- avoid logging while reporting logs (would cause a infinite loop)
|
||||||
if logLocked then return end
|
if logLocked then return end
|
||||||
|
|
||||||
@@ -109,22 +121,7 @@ function init()
|
|||||||
terminalWindow = g_ui.displayUI('terminal')
|
terminalWindow = g_ui.displayUI('terminal')
|
||||||
terminalWindow:setVisible(false)
|
terminalWindow:setVisible(false)
|
||||||
|
|
||||||
local poped = false
|
terminalWindow.onDoubleClick = popWindow
|
||||||
terminalWindow.onDoubleClick = function(self)
|
|
||||||
if poped then
|
|
||||||
self:fill('parent')
|
|
||||||
self:getChildById('bottomResizeBorder'):disable()
|
|
||||||
self:getChildById('rightResizeBorder'):disable()
|
|
||||||
poped = false
|
|
||||||
else
|
|
||||||
self:breakAnchors()
|
|
||||||
self:resize(g_window.getWidth()/2, g_window.getHeight()/2)
|
|
||||||
self:move(g_window.getWidth()/2, g_window.getHeight()/2)
|
|
||||||
self:getChildById('bottomResizeBorder'):enable()
|
|
||||||
self:getChildById('rightResizeBorder'):enable()
|
|
||||||
poped = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
terminalButton = modules.client_topmenu.addLeftButton('terminalButton', tr('Terminal') .. ' (Ctrl + T)', '/images/topbuttons/terminal', toggle)
|
terminalButton = modules.client_topmenu.addLeftButton('terminalButton', tr('Terminal') .. ' (Ctrl + T)', '/images/topbuttons/terminal', toggle)
|
||||||
g_keyboard.bindKeyDown('Ctrl+T', toggle)
|
g_keyboard.bindKeyDown('Ctrl+T', toggle)
|
||||||
@@ -134,36 +131,105 @@ function init()
|
|||||||
commandTextEdit = terminalWindow:getChildById('commandTextEdit')
|
commandTextEdit = terminalWindow:getChildById('commandTextEdit')
|
||||||
g_keyboard.bindKeyPress('Up', function() navigateCommand(1) end, commandTextEdit)
|
g_keyboard.bindKeyPress('Up', function() navigateCommand(1) end, commandTextEdit)
|
||||||
g_keyboard.bindKeyPress('Down', function() navigateCommand(-1) end, commandTextEdit)
|
g_keyboard.bindKeyPress('Down', function() navigateCommand(-1) end, commandTextEdit)
|
||||||
|
g_keyboard.bindKeyPress('Ctrl+C',
|
||||||
|
function()
|
||||||
|
if commandTextEdit:hasSelection() or not terminalSelectText:hasSelection() then return false end
|
||||||
|
g_window.setClipboardText(terminalSelectText:getSelection())
|
||||||
|
return true
|
||||||
|
end, commandTextEdit)
|
||||||
g_keyboard.bindKeyDown('Tab', completeCommand, commandTextEdit)
|
g_keyboard.bindKeyDown('Tab', completeCommand, commandTextEdit)
|
||||||
g_keyboard.bindKeyDown('Enter', doCommand, commandTextEdit)
|
g_keyboard.bindKeyDown('Enter', doCommand, commandTextEdit)
|
||||||
g_keyboard.bindKeyDown('Escape', hide, terminalWindow)
|
g_keyboard.bindKeyDown('Escape', hide, terminalWindow)
|
||||||
|
|
||||||
terminalBuffer = terminalWindow:getChildById('terminalBuffer')
|
terminalBuffer = terminalWindow:getChildById('terminalBuffer')
|
||||||
|
terminalSelectText = terminalWindow:getChildById('terminalSelectText')
|
||||||
|
terminalSelectText.onDoubleClick = popWindow
|
||||||
|
terminalSelectText.onMouseWheel = function(a,b,c) terminalBuffer:onMouseWheel(b,c) end
|
||||||
|
terminalBuffer.onScrollChange = function(self, value) terminalSelectText:setTextVirtualOffset(value) end
|
||||||
|
|
||||||
g_logger.setOnLog(onLog)
|
g_logger.setOnLog(onLog)
|
||||||
g_logger.fireOldMessages()
|
|
||||||
|
if not g_app.isRunning() then
|
||||||
|
g_logger.fireOldMessages()
|
||||||
|
elseif _G.terminalLines then
|
||||||
|
for _,line in pairs(_G.terminalLines) do
|
||||||
|
addLine(line.text, line.color)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function terminate()
|
function terminate()
|
||||||
g_settings.setList('terminal-history', commandHistory)
|
g_settings.setList('terminal-history', commandHistory)
|
||||||
|
|
||||||
|
removeEvent(flushEvent)
|
||||||
|
|
||||||
|
if poped then
|
||||||
|
oldPos = terminalWindow:getPosition()
|
||||||
|
oldSize = terminalWindow:getSize()
|
||||||
|
end
|
||||||
|
local settings = {
|
||||||
|
size = oldSize,
|
||||||
|
pos = oldPos,
|
||||||
|
poped = poped
|
||||||
|
}
|
||||||
|
g_settings.setNode('terminal-window', settings)
|
||||||
|
|
||||||
g_keyboard.unbindKeyDown('Ctrl+T')
|
g_keyboard.unbindKeyDown('Ctrl+T')
|
||||||
g_logger.setOnLog(nil)
|
g_logger.setOnLog(nil)
|
||||||
terminalButton:destroy()
|
|
||||||
terminalButton = nil
|
|
||||||
commandTextEdit = nil
|
|
||||||
terminalBuffer = nil
|
|
||||||
terminalWindow:destroy()
|
terminalWindow:destroy()
|
||||||
terminalWindow = nil
|
terminalButton:destroy()
|
||||||
commandEnv = nil
|
commandEnv = nil
|
||||||
|
_G.terminalLines = allLines
|
||||||
end
|
end
|
||||||
|
|
||||||
function hideButton()
|
function hideButton()
|
||||||
terminalButton:hide()
|
terminalButton:hide()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function popWindow()
|
||||||
|
if poped then
|
||||||
|
oldPos = terminalWindow:getPosition()
|
||||||
|
oldSize = terminalWindow:getSize()
|
||||||
|
terminalWindow:fill('parent')
|
||||||
|
terminalWindow:setOn(false)
|
||||||
|
terminalWindow:getChildById('bottomResizeBorder'):disable()
|
||||||
|
terminalWindow:getChildById('rightResizeBorder'):disable()
|
||||||
|
terminalWindow:getChildById('titleBar'):hide()
|
||||||
|
terminalWindow:getChildById('terminalScroll'):setMarginTop(0)
|
||||||
|
terminalWindow:getChildById('terminalScroll'):setMarginBottom(0)
|
||||||
|
terminalWindow:getChildById('terminalScroll'):setMarginRight(0)
|
||||||
|
poped = false
|
||||||
|
else
|
||||||
|
terminalWindow:breakAnchors()
|
||||||
|
terminalWindow:setOn(true)
|
||||||
|
local size = oldSize or { width = g_window.getWidth()/2, height = g_window.getHeight()/2 }
|
||||||
|
terminalWindow:setSize(size)
|
||||||
|
local pos = oldPos or { x = (g_window.getWidth() - terminalWindow:getWidth())/2, y = (g_window.getHeight() - terminalWindow:getHeight())/2 }
|
||||||
|
terminalWindow:setPosition(pos)
|
||||||
|
terminalWindow:getChildById('bottomResizeBorder'):enable()
|
||||||
|
terminalWindow:getChildById('rightResizeBorder'):enable()
|
||||||
|
terminalWindow:getChildById('titleBar'):show()
|
||||||
|
terminalWindow:getChildById('terminalScroll'):setMarginTop(18)
|
||||||
|
terminalWindow:getChildById('terminalScroll'):setMarginBottom(1)
|
||||||
|
terminalWindow:getChildById('terminalScroll'):setMarginRight(1)
|
||||||
|
terminalWindow:bindRectToParent()
|
||||||
|
poped = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function toggle()
|
function toggle()
|
||||||
if terminalWindow:isVisible() then
|
if terminalWindow:isVisible() then
|
||||||
hide()
|
hide()
|
||||||
else
|
else
|
||||||
|
if not firstShow then
|
||||||
|
local settings = g_settings.getNode('terminal-window')
|
||||||
|
if settings then
|
||||||
|
if settings.size then oldSize = size end
|
||||||
|
if settings.pos then oldPos = settings.pos end
|
||||||
|
if settings.poped then popWindow() end
|
||||||
|
end
|
||||||
|
firstShown = true
|
||||||
|
end
|
||||||
show()
|
show()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -178,34 +244,55 @@ function hide()
|
|||||||
terminalWindow:hide()
|
terminalWindow:hide()
|
||||||
end
|
end
|
||||||
|
|
||||||
function addLine(text, color)
|
function disable()
|
||||||
-- delete old lines if needed
|
terminalButton:hide()
|
||||||
local numLines = terminalBuffer:getChildCount() + 1
|
g_keyboard.unbindKeyDown('Ctrl+T')
|
||||||
if numLines > MaxLogLines then
|
disabled = true
|
||||||
terminalBuffer:getChildByIndex(1):destroy()
|
end
|
||||||
|
|
||||||
|
function flushLines()
|
||||||
|
local numLines = terminalBuffer:getChildCount() + #cachedLines
|
||||||
|
local fulltext = terminalSelectText:getText()
|
||||||
|
|
||||||
|
for _,line in pairs(cachedLines) do
|
||||||
|
-- delete old lines if needed
|
||||||
|
if numLines > MaxLogLines then
|
||||||
|
local len = #terminalBuffer:getChildByIndex(1):getText()
|
||||||
|
terminalBuffer:getChildByIndex(1):destroy()
|
||||||
|
table.remove(allLines, 1)
|
||||||
|
fulltext = string.sub(fulltext, len)
|
||||||
|
end
|
||||||
|
|
||||||
|
local label = g_ui.createWidget('TerminalLabel', terminalBuffer)
|
||||||
|
label:setId('terminalLabel' .. numLines)
|
||||||
|
label:setText(line.text)
|
||||||
|
label:setColor(line.color)
|
||||||
|
|
||||||
|
table.insert(allLines, {text=line.text,color=line.color})
|
||||||
|
|
||||||
|
fulltext = fulltext .. '\n' .. line.text
|
||||||
end
|
end
|
||||||
|
|
||||||
-- create new line label
|
terminalSelectText:setText(fulltext)
|
||||||
local label = g_ui.createWidget('TerminalLabel', terminalBuffer)
|
|
||||||
label:setId('terminalLabel' .. numLines)
|
cachedLines = {}
|
||||||
label:setText(text)
|
removeEvent(flushEvent)
|
||||||
label:setColor(color)
|
flushEvent = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
function addLine(text, color)
|
||||||
|
if not flushEvent then
|
||||||
|
flushEvent = scheduleEvent(flushLines, 10)
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(cachedLines, {text=text, color=color})
|
||||||
end
|
end
|
||||||
|
|
||||||
function executeCommand(command)
|
function executeCommand(command)
|
||||||
if command == nil or #command == 0 then return end
|
if command == nil or #command == 0 then return end
|
||||||
|
|
||||||
logLocked = true
|
-- add command line
|
||||||
g_logger.log(LogInfo, '> ' .. command)
|
addLine("> " .. command, "#ffffff")
|
||||||
logLocked = false
|
|
||||||
|
|
||||||
-- detect and convert commands with simple syntax
|
|
||||||
local realCommand
|
|
||||||
if string.sub(command, 1, 1) == '=' then
|
|
||||||
realCommand = 'print(' .. string.sub(command,2) .. ')'
|
|
||||||
else
|
|
||||||
realCommand = command
|
|
||||||
end
|
|
||||||
|
|
||||||
-- reset current history index
|
-- reset current history index
|
||||||
currentHistoryIndex = 0
|
currentHistoryIndex = 0
|
||||||
@@ -218,15 +305,33 @@ function executeCommand(command)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- add command line
|
-- detect and convert commands with simple syntax
|
||||||
--addLine(">> " .. command, "#ffffff")
|
local realCommand
|
||||||
|
if string.sub(command, 1, 1) == '=' then
|
||||||
|
realCommand = 'print(' .. string.sub(command,2) .. ')'
|
||||||
|
else
|
||||||
|
realCommand = command
|
||||||
|
end
|
||||||
|
|
||||||
-- load command buffer
|
|
||||||
local func, err = loadstring(realCommand, "@")
|
local func, err = loadstring(realCommand, "@")
|
||||||
|
|
||||||
|
-- detect terminal commands
|
||||||
|
if not func then
|
||||||
|
local command_name = command:match('^([%w_]+)[%s]*.*')
|
||||||
|
if command_name then
|
||||||
|
local args = string.split(command:match('^[%w_]+[%s]*(.*)'), ' ')
|
||||||
|
if commandEnv[command_name] and type(commandEnv[command_name]) == 'function' then
|
||||||
|
func = function() modules.client_terminal.commandEnv[command_name](unpack(args)) end
|
||||||
|
elseif command_name == command then
|
||||||
|
addLine('ERROR: command not found', 'red')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- check for syntax errors
|
-- check for syntax errors
|
||||||
if not func then
|
if not func then
|
||||||
g_logger.log(LogError, 'incorrect lua syntax: ' .. err:sub(5))
|
addLine('ERROR: incorrect lua syntax: ' .. err:sub(5), 'red')
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -237,8 +342,15 @@ function executeCommand(command)
|
|||||||
local ok, ret = pcall(func)
|
local ok, ret = pcall(func)
|
||||||
if ok then
|
if ok then
|
||||||
-- if the command returned a value, print it
|
-- if the command returned a value, print it
|
||||||
if ret then print(ret) end
|
if ret then addLine(ret, 'white') end
|
||||||
else
|
else
|
||||||
g_logger.log(LogError, 'command failed: ' .. ret)
|
addLine('ERROR: command failed: ' .. ret, 'red')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function clear()
|
||||||
|
terminalBuffer:destroyChildren()
|
||||||
|
terminalSelectText:setText('')
|
||||||
|
cachedLines = {}
|
||||||
|
allLines = {}
|
||||||
|
end
|
||||||
|
@@ -3,7 +3,7 @@ Module
|
|||||||
description: Terminal for executing lua functions
|
description: Terminal for executing lua functions
|
||||||
author: edubart
|
author: edubart
|
||||||
website: www.otclient.info
|
website: www.otclient.info
|
||||||
scripts: [ terminal, commands ]
|
scripts: [ terminal ]
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
@onUnload: terminate()
|
@onUnload: terminate()
|
||||||
|
@@ -1,7 +1,21 @@
|
|||||||
TerminalLabel < UILabel
|
TerminalLabel < UILabel
|
||||||
font: terminus-14px-bold
|
font: terminus-10px
|
||||||
text-wrap: true
|
text-wrap: true
|
||||||
text-auto-resize: true
|
text-auto-resize: true
|
||||||
|
phantom: true
|
||||||
|
|
||||||
|
TerminalSelectText < UITextEdit
|
||||||
|
font: terminus-10px
|
||||||
|
text-wrap: true
|
||||||
|
text-align: bottomLeft
|
||||||
|
editable: false
|
||||||
|
change-cursor-image: false
|
||||||
|
cursor-visible: false
|
||||||
|
selection-color: black
|
||||||
|
selection-background-color: white
|
||||||
|
color: alpha
|
||||||
|
focusable: false
|
||||||
|
auto-scroll: false
|
||||||
|
|
||||||
UIWindow
|
UIWindow
|
||||||
id: terminalWindow
|
id: terminalWindow
|
||||||
@@ -9,36 +23,71 @@ UIWindow
|
|||||||
opacity: 0.85
|
opacity: 0.85
|
||||||
clipping: true
|
clipping: true
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
border: 0 white
|
||||||
|
$on:
|
||||||
|
border: 1 black
|
||||||
|
|
||||||
Panel
|
Label
|
||||||
id: terminalBuffer
|
id: titleBar
|
||||||
layout:
|
!text: tr('Terminal')
|
||||||
type: verticalBox
|
border: 1 black
|
||||||
fit-children: true
|
color: white
|
||||||
focusable: false
|
anchors.top: parent.top
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
|
background-color: #ffffff11
|
||||||
|
text-align: left
|
||||||
|
text-offset: 4 0
|
||||||
|
height: 18
|
||||||
|
visible: false
|
||||||
|
|
||||||
|
ScrollablePanel
|
||||||
|
id: terminalBuffer
|
||||||
|
focusable: false
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: terminalScroll.left
|
||||||
|
anchors.top: terminalScroll.top
|
||||||
anchors.bottom: commandSymbolLabel.top
|
anchors.bottom: commandSymbolLabel.top
|
||||||
|
layout:
|
||||||
|
type: verticalBox
|
||||||
|
align-bottom: true
|
||||||
|
vertical-scrollbar: terminalScroll
|
||||||
|
inverted-scroll: true
|
||||||
margin-left: 2
|
margin-left: 2
|
||||||
|
|
||||||
|
TerminalSelectText
|
||||||
|
id: terminalSelectText
|
||||||
|
anchors.fill: terminalBuffer
|
||||||
|
focusable: false
|
||||||
|
|
||||||
|
VerticalScrollBar
|
||||||
|
id: terminalScroll
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.right: parent.right
|
||||||
|
step: 48
|
||||||
|
pixels-scroll: true
|
||||||
|
|
||||||
UILabel
|
UILabel
|
||||||
id: commandSymbolLabel
|
id: commandSymbolLabel
|
||||||
size: 12 16
|
size: 12 12
|
||||||
fixed-size: true
|
fixed-size: true
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
margin-left: 2
|
margin-left: 2
|
||||||
font: terminus-14px-bold
|
font: terminus-10px
|
||||||
text: >
|
text: >
|
||||||
|
|
||||||
UITextEdit
|
UITextEdit
|
||||||
id: commandTextEdit
|
id: commandTextEdit
|
||||||
height: 16
|
height: 12
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
anchors.left: commandSymbolLabel.right
|
anchors.left: commandSymbolLabel.right
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
margin-left: 5
|
margin-left: 1
|
||||||
font: terminus-14px-bold
|
font: terminus-10px
|
||||||
|
selection-color: black
|
||||||
|
selection-background-color: white
|
||||||
|
|
||||||
ResizeBorder
|
ResizeBorder
|
||||||
id: bottomResizeBorder
|
id: bottomResizeBorder
|
||||||
|
@@ -14,11 +14,14 @@ local function addButton(id, description, icon, callback, panel, toggle, front)
|
|||||||
class = 'TopButton'
|
class = 'TopButton'
|
||||||
end
|
end
|
||||||
|
|
||||||
local button = g_ui.createWidget(class)
|
local button = panel:getChildById(id)
|
||||||
if front then
|
if not button then
|
||||||
panel:insertChild(1, button)
|
button = g_ui.createWidget(class)
|
||||||
else
|
if front then
|
||||||
panel:addChild(button)
|
panel:insertChild(1, button)
|
||||||
|
else
|
||||||
|
panel:addChild(button)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
button:setId(id)
|
button:setId(id)
|
||||||
button:setTooltip(description)
|
button:setTooltip(description)
|
||||||
@@ -34,8 +37,10 @@ end
|
|||||||
|
|
||||||
-- public functions
|
-- public functions
|
||||||
function init()
|
function init()
|
||||||
connect(g_game, { onGameStart = showGameButtons,
|
connect(g_game, { onGameStart = online,
|
||||||
onGameEnd = hideGameButtons })
|
onGameEnd = offline,
|
||||||
|
onPingBack = updatePing })
|
||||||
|
connect(g_app, { onFps = updateFps })
|
||||||
|
|
||||||
topMenu = g_ui.displayUI('topmenu')
|
topMenu = g_ui.displayUI('topmenu')
|
||||||
|
|
||||||
@@ -43,24 +48,71 @@ function init()
|
|||||||
rightButtonsPanel = topMenu:getChildById('rightButtonsPanel')
|
rightButtonsPanel = topMenu:getChildById('rightButtonsPanel')
|
||||||
leftGameButtonsPanel = topMenu:getChildById('leftGameButtonsPanel')
|
leftGameButtonsPanel = topMenu:getChildById('leftGameButtonsPanel')
|
||||||
rightGameButtonsPanel = topMenu:getChildById('rightGameButtonsPanel')
|
rightGameButtonsPanel = topMenu:getChildById('rightGameButtonsPanel')
|
||||||
|
pingLabel = topMenu:getChildById('pingLabel')
|
||||||
|
fpsLabel = topMenu:getChildById('fpsLabel')
|
||||||
|
|
||||||
if g_game.isOnline() then
|
if g_game.isOnline() then
|
||||||
leftGameButtonsPanel:show()
|
online()
|
||||||
rightGameButtonsPanel:show()
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function terminate()
|
function terminate()
|
||||||
disconnect(g_game, { onGameStart = showGameButtons,
|
disconnect(g_game, { onGameStart = online,
|
||||||
onGameEnd = hideGameButtons })
|
onGameEnd = offline,
|
||||||
|
onPingBack = updatePing })
|
||||||
leftButtonsPanel = nil
|
disconnect(g_app, { onFps = updateFps })
|
||||||
rightButtonsPanel = nil
|
|
||||||
leftGameButtonsPanel = nil
|
|
||||||
rightGameButtonsPanel = nil
|
|
||||||
|
|
||||||
topMenu:destroy()
|
topMenu:destroy()
|
||||||
topMenu = nil
|
end
|
||||||
|
|
||||||
|
function online()
|
||||||
|
showGameButtons()
|
||||||
|
|
||||||
|
addEvent(function()
|
||||||
|
if modules.client_options.getOption('showPing') and (g_game.getFeature(GameClientPing) or g_game.getFeature(GameExtendedClientPing)) then
|
||||||
|
pingLabel:show()
|
||||||
|
else
|
||||||
|
pingLabel:hide()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function offline()
|
||||||
|
hideGameButtons()
|
||||||
|
pingLabel:hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
function updateFps(fps)
|
||||||
|
text = 'FPS: ' .. fps
|
||||||
|
fpsLabel:setText(text)
|
||||||
|
end
|
||||||
|
|
||||||
|
function updatePing(ping)
|
||||||
|
local text = 'Ping: '
|
||||||
|
local color
|
||||||
|
if ping < 0 then
|
||||||
|
text = text .. "??"
|
||||||
|
color = 'yellow'
|
||||||
|
else
|
||||||
|
text = text .. ping .. ' ms'
|
||||||
|
if ping >= 500 then
|
||||||
|
color = 'red'
|
||||||
|
elseif ping >= 250 then
|
||||||
|
color = 'yellow'
|
||||||
|
else
|
||||||
|
color = 'green'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
pingLabel:setColor(color)
|
||||||
|
pingLabel:setText(text)
|
||||||
|
end
|
||||||
|
|
||||||
|
function setPingVisible(enable)
|
||||||
|
pingLabel:setVisible(enable)
|
||||||
|
end
|
||||||
|
|
||||||
|
function setFpsVisible(enable)
|
||||||
|
fpsLabel:setVisible(enable)
|
||||||
end
|
end
|
||||||
|
|
||||||
function addLeftButton(id, description, icon, callback, front)
|
function addLeftButton(id, description, icon, callback, front)
|
||||||
@@ -95,16 +147,16 @@ function addRightGameToggleButton(id, description, icon, callback, front)
|
|||||||
return addButton(id, description, icon, callback, rightGameButtonsPanel, true, front)
|
return addButton(id, description, icon, callback, rightGameButtonsPanel, true, front)
|
||||||
end
|
end
|
||||||
|
|
||||||
function hideGameButtons()
|
|
||||||
leftGameButtonsPanel:hide()
|
|
||||||
rightGameButtonsPanel:hide()
|
|
||||||
end
|
|
||||||
|
|
||||||
function showGameButtons()
|
function showGameButtons()
|
||||||
leftGameButtonsPanel:show()
|
leftGameButtonsPanel:show()
|
||||||
rightGameButtonsPanel:show()
|
rightGameButtonsPanel:show()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function hideGameButtons()
|
||||||
|
leftGameButtonsPanel:hide()
|
||||||
|
rightGameButtonsPanel:hide()
|
||||||
|
end
|
||||||
|
|
||||||
function getButton(id)
|
function getButton(id)
|
||||||
return topMenu:recursiveGetChildById(id)
|
return topMenu:recursiveGetChildById(id)
|
||||||
end
|
end
|
||||||
|
@@ -18,17 +18,17 @@ TopMenuPanel
|
|||||||
visible: false
|
visible: false
|
||||||
|
|
||||||
TopMenuFrameCounterLabel
|
TopMenuFrameCounterLabel
|
||||||
id: frameCounter
|
id: fpsLabel
|
||||||
text-auto-resize: true
|
text-auto-resize: true
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.left: leftGameButtonsPanel.right
|
anchors.left: leftGameButtonsPanel.right
|
||||||
|
|
||||||
PingLabel
|
TopMenuPingLabel
|
||||||
color: white
|
color: white
|
||||||
id: pingLabel
|
id: pingLabel
|
||||||
text-auto-resize: true
|
text-auto-resize: true
|
||||||
anchors.top: frameCounter.bottom
|
anchors.top: fpsLabel.bottom
|
||||||
anchors.left: frameCounter.left
|
anchors.left: fpsLabel.left
|
||||||
|
|
||||||
TopMenuButtonsPanel
|
TopMenuButtonsPanel
|
||||||
id: rightButtonsPanel
|
id: rightButtonsPanel
|
||||||
|
@@ -19,6 +19,10 @@ KeyboardFocusReason = 1
|
|||||||
ActiveFocusReason = 2
|
ActiveFocusReason = 2
|
||||||
OtherFocusReason = 3
|
OtherFocusReason = 3
|
||||||
|
|
||||||
|
AutoFocusNone = 0
|
||||||
|
AutoFocusFirst = 1
|
||||||
|
AutoFocusLast = 2
|
||||||
|
|
||||||
KeyboardNoModifier = 0
|
KeyboardNoModifier = 0
|
||||||
KeyboardCtrlModifier = 1
|
KeyboardCtrlModifier = 1
|
||||||
KeyboardAltModifier = 2
|
KeyboardAltModifier = 2
|
||||||
@@ -296,7 +300,7 @@ KeyCodeDescs = {
|
|||||||
[KeyNumpad6] = 'Numpad6',
|
[KeyNumpad6] = 'Numpad6',
|
||||||
[KeyNumpad7] = 'Numpad7',
|
[KeyNumpad7] = 'Numpad7',
|
||||||
[KeyNumpad8] = 'Numpad8',
|
[KeyNumpad8] = 'Numpad8',
|
||||||
[KeyNumpad9] = 'Numpad9'
|
[KeyNumpad9] = 'Numpad9',
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkMessageTypes = {
|
NetworkMessageTypes = {
|
||||||
@@ -307,5 +311,11 @@ NetworkMessageTypes = {
|
|||||||
U64 = 5,
|
U64 = 5,
|
||||||
NumberString = 6,
|
NumberString = 6,
|
||||||
String = 7,
|
String = 7,
|
||||||
Table = 8
|
Table = 8,
|
||||||
|
}
|
||||||
|
|
||||||
|
SoundChannels = {
|
||||||
|
Music = 1,
|
||||||
|
Ambient = 2,
|
||||||
|
Effect = 3,
|
||||||
}
|
}
|
||||||
|
@@ -17,6 +17,7 @@ Module
|
|||||||
dofile 'settings'
|
dofile 'settings'
|
||||||
dofile 'keyboard'
|
dofile 'keyboard'
|
||||||
dofile 'mouse'
|
dofile 'mouse'
|
||||||
|
dofile 'net'
|
||||||
|
|
||||||
dofiles 'ui'
|
dofiles 'ui'
|
||||||
|
|
||||||
|
@@ -25,8 +25,8 @@ function addEvent(callback, front)
|
|||||||
return event
|
return event
|
||||||
end
|
end
|
||||||
|
|
||||||
function cycleEvent(callback, front)
|
function cycleEvent(callback, interval)
|
||||||
local event = g_dispatcher.cycleEvent(callback, front)
|
local event = g_dispatcher.cycleEvent(callback, interval)
|
||||||
-- must hold a reference to the callback, otherwise it would be collected
|
-- must hold a reference to the callback, otherwise it would be collected
|
||||||
event._callback = callback
|
event._callback = callback
|
||||||
return event
|
return event
|
||||||
|
@@ -35,9 +35,17 @@ end
|
|||||||
|
|
||||||
function InputMessage:getColor()
|
function InputMessage:getColor()
|
||||||
local color = {}
|
local color = {}
|
||||||
color.r = msg:getU8()
|
color.r = self:getU8()
|
||||||
color.g = msg:getU8()
|
color.g = self:getU8()
|
||||||
color.b = msg:getU8()
|
color.b = self:getU8()
|
||||||
color.a = msg:getU8()
|
color.a = self:getU8()
|
||||||
return color
|
return color
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function InputMessage:getPosition()
|
||||||
|
local position = {}
|
||||||
|
position.x = self:getU16()
|
||||||
|
position.y = self:getU16()
|
||||||
|
position.z = self:getU8()
|
||||||
|
return position
|
||||||
|
end
|
||||||
|
@@ -4,7 +4,6 @@ g_keyboard = {}
|
|||||||
-- private functions
|
-- private functions
|
||||||
function translateKeyCombo(keyCombo)
|
function translateKeyCombo(keyCombo)
|
||||||
if not keyCombo or #keyCombo == 0 then return nil end
|
if not keyCombo or #keyCombo == 0 then return nil end
|
||||||
table.sort(keyCombo)
|
|
||||||
local keyComboDesc = ''
|
local keyComboDesc = ''
|
||||||
for k,v in pairs(keyCombo) do
|
for k,v in pairs(keyCombo) do
|
||||||
local keyDesc = KeyCodeDescs[v]
|
local keyDesc = KeyCodeDescs[v]
|
||||||
@@ -65,53 +64,43 @@ function determineKeyComboDesc(keyCode, keyboardModifiers)
|
|||||||
end
|
end
|
||||||
table.insert(keyCombo, keyCode)
|
table.insert(keyCombo, keyCode)
|
||||||
end
|
end
|
||||||
table.sort(keyCombo)
|
|
||||||
return translateKeyCombo(keyCombo)
|
return translateKeyCombo(keyCombo)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function onWidgetKeyDown(widget, keyCode, keyboardModifiers)
|
local function onWidgetKeyDown(widget, keyCode, keyboardModifiers)
|
||||||
if keyCode == KeyUnknown then return false end
|
if keyCode == KeyUnknown then return false end
|
||||||
local keyComboDesc = determineKeyComboDesc(keyCode, keyboardModifiers)
|
local callback = widget.boundAloneKeyDownCombos[determineKeyComboDesc(keyCode, KeyboardNoModifier)]
|
||||||
local callback = widget.boundKeyDownCombos[keyComboDesc]
|
signalcall(callback, widget, keyCode)
|
||||||
if callback then
|
callback = widget.boundKeyDownCombos[determineKeyComboDesc(keyCode, keyboardModifiers)]
|
||||||
callback()
|
return signalcall(callback, widget, keyCode)
|
||||||
return true
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function onWidgetKeyUp(widget, keyCode, keyboardModifiers)
|
local function onWidgetKeyUp(widget, keyCode, keyboardModifiers)
|
||||||
if keyCode == KeyUnknown then return false end
|
if keyCode == KeyUnknown then return false end
|
||||||
local keyComboDesc = determineKeyComboDesc(keyCode, keyboardModifiers)
|
local callback = widget.boundAloneKeyUpCombos[determineKeyComboDesc(keyCode, KeyboardNoModifier)]
|
||||||
local callback = widget.boundKeyUpCombos[keyComboDesc]
|
signalcall(callback, widget, keyCode)
|
||||||
if callback then
|
callback = widget.boundKeyUpCombos[determineKeyComboDesc(keyCode, keyboardModifiers)]
|
||||||
callback()
|
return signalcall(callback, widget, keyCode)
|
||||||
return true
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function onWidgetKeyPress(widget, keyCode, keyboardModifiers, autoRepeatTicks)
|
local function onWidgetKeyPress(widget, keyCode, keyboardModifiers, autoRepeatTicks)
|
||||||
if keyCode == KeyUnknown then return false end
|
if keyCode == KeyUnknown then return false end
|
||||||
local keyComboDesc = determineKeyComboDesc(keyCode, keyboardModifiers)
|
local callback = widget.boundKeyPressCombos[determineKeyComboDesc(keyCode, keyboardModifiers)]
|
||||||
local comboConf = widget.boundKeyPressCombos[keyComboDesc]
|
return signalcall(callback, widget, keyCode, autoRepeatTicks)
|
||||||
if comboConf and (autoRepeatTicks >= comboConf.autoRepeatDelay or autoRepeatTicks == 0) and comboConf.callback then
|
|
||||||
comboConf.callback()
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function connectKeyDownEvent(widget)
|
local function connectKeyDownEvent(widget)
|
||||||
if widget.boundKeyDownCombos then return end
|
if widget.boundKeyDownCombos then return end
|
||||||
connect(widget, { onKeyDown = onWidgetKeyDown })
|
connect(widget, { onKeyDown = onWidgetKeyDown })
|
||||||
widget.boundKeyDownCombos = {}
|
widget.boundKeyDownCombos = {}
|
||||||
|
widget.boundAloneKeyDownCombos = {}
|
||||||
end
|
end
|
||||||
|
|
||||||
local function connectKeyUpEvent(widget)
|
local function connectKeyUpEvent(widget)
|
||||||
if widget.boundKeyUpCombos then return end
|
if widget.boundKeyUpCombos then return end
|
||||||
connect(widget, { onKeyUp = onWidgetKeyUp })
|
connect(widget, { onKeyUp = onWidgetKeyUp })
|
||||||
widget.boundKeyUpCombos = {}
|
widget.boundKeyUpCombos = {}
|
||||||
|
widget.boundAloneKeyUpCombos = {}
|
||||||
end
|
end
|
||||||
|
|
||||||
local function connectKeyPressEvent(widget)
|
local function connectKeyPressEvent(widget)
|
||||||
@@ -121,63 +110,65 @@ local function connectKeyPressEvent(widget)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- public functions
|
-- public functions
|
||||||
function g_keyboard.bindKeyDown(keyComboDesc, callback, widget)
|
function g_keyboard.bindKeyDown(keyComboDesc, callback, widget, alone)
|
||||||
widget = widget or rootWidget
|
widget = widget or rootWidget
|
||||||
connectKeyDownEvent(widget)
|
connectKeyDownEvent(widget)
|
||||||
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
||||||
if widget.boundKeyDownCombos[keyComboDesc] then
|
if alone then
|
||||||
pwarning('KeyDown event \'' .. keyComboDesc .. '\' redefined on widget ' .. widget:getId())
|
connect(widget.boundAloneKeyDownCombos, keyComboDesc, callback)
|
||||||
|
else
|
||||||
|
connect(widget.boundKeyDownCombos, keyComboDesc, callback)
|
||||||
end
|
end
|
||||||
widget.boundKeyDownCombos[keyComboDesc] = callback
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function g_keyboard.bindKeyUp(keyComboDesc, callback, widget)
|
function g_keyboard.bindKeyUp(keyComboDesc, callback, widget, alone)
|
||||||
widget = widget or rootWidget
|
widget = widget or rootWidget
|
||||||
connectKeyUpEvent(widget)
|
connectKeyUpEvent(widget)
|
||||||
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
||||||
if widget.boundKeyUpCombos[keyComboDesc] then
|
if alone then
|
||||||
pwarning('KeyUp event \'' .. keyComboDesc .. '\' redefined on widget ' .. widget:getId())
|
connect(widget.boundAloneKeyUpCombos, keyComboDesc, callback)
|
||||||
|
else
|
||||||
|
connect(widget.boundKeyUpCombos, keyComboDesc, callback)
|
||||||
end
|
end
|
||||||
widget.boundKeyUpCombos[keyComboDesc] = callback
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function g_keyboard.bindKeyPress(keyComboDesc, callback, widget, autoRepeatDelay)
|
function g_keyboard.bindKeyPress(keyComboDesc, callback, widget)
|
||||||
autoRepeatDelay = autoRepeatDelay or 500
|
|
||||||
widget = widget or rootWidget
|
widget = widget or rootWidget
|
||||||
connectKeyPressEvent(widget)
|
connectKeyPressEvent(widget)
|
||||||
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
||||||
if widget.boundKeyPressCombos[keyComboDesc] then
|
connect(widget.boundKeyPressCombos, keyComboDesc, callback)
|
||||||
pwarning('KeyPress event \'' .. keyComboDesc .. '\' redefined on widget ' .. widget:getId())
|
|
||||||
end
|
|
||||||
widget.boundKeyPressCombos[keyComboDesc] = { callback = callback, autoRepeatDelay = autoRepeatDelay }
|
|
||||||
widget:setAutoRepeatDelay(math.min(autoRepeatDelay, widget:getAutoRepeatDelay()))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function g_keyboard.unbindKeyDown(keyComboDesc, widget)
|
local function getUnbindArgs(arg1, arg2)
|
||||||
|
local callback
|
||||||
|
local widget
|
||||||
|
if type(arg1) == 'function' then callback = arg1
|
||||||
|
elseif type(arg2) == 'function' then callback = arg2 end
|
||||||
|
if type(arg1) == 'userdata' then widget = arg1
|
||||||
|
elseif type(arg2) == 'userdata' then widget = arg2 end
|
||||||
widget = widget or rootWidget
|
widget = widget or rootWidget
|
||||||
|
return callback, widget
|
||||||
|
end
|
||||||
|
|
||||||
|
function g_keyboard.unbindKeyDown(keyComboDesc, arg1, arg2)
|
||||||
|
local callback, widget = getUnbindArgs(arg1, arg2)
|
||||||
if widget.boundKeyDownCombos == nil then return end
|
if widget.boundKeyDownCombos == nil then return end
|
||||||
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
||||||
if keyComboDesc then
|
disconnect(widget.boundKeyDownCombos, keyComboDesc, callback)
|
||||||
widget.boundKeyDownCombos[keyComboDesc] = nil
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function g_keyboard.unbindKeyUp(keyComboDesc, widget)
|
function g_keyboard.unbindKeyUp(keyComboDesc, widget)
|
||||||
widget = widget or rootWidget
|
local callback, widget = getUnbindArgs(arg1, arg2)
|
||||||
if widget.boundKeyUpCombos == nil then return end
|
if widget.boundKeyUpCombos == nil then return end
|
||||||
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
||||||
if keyComboDesc then
|
disconnect(widget.boundKeyUpCombos, keyComboDesc, callback)
|
||||||
widget.boundKeyUpCombos[keyComboDesc] = nil
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function g_keyboard.unbindKeyPress(keyComboDesc, widget)
|
function g_keyboard.unbindKeyPress(keyComboDesc, widget, callback)
|
||||||
widget = widget or rootWidget
|
local callback, widget = getUnbindArgs(arg1, arg2)
|
||||||
if widget.boundKeyPressCombos == nil then return end
|
if widget.boundKeyPressCombos == nil then return end
|
||||||
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
||||||
if keyComboDesc then
|
disconnect(widget.boundKeyPressCombos, keyComboDesc, callback)
|
||||||
widget.boundKeyPressCombos[keyComboDesc] = nil
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function g_keyboard.getModifiers()
|
function g_keyboard.getModifiers()
|
||||||
|
@@ -20,14 +20,17 @@ function g_mouse.bindPressMove(widget, callback)
|
|||||||
connect(widget, { onMouseMove = function(widget, mousePos, mouseMoved)
|
connect(widget, { onMouseMove = function(widget, mousePos, mouseMoved)
|
||||||
if widget:isPressed() then
|
if widget:isPressed() then
|
||||||
callback(mousePos, mouseMoved)
|
callback(mousePos, mouseMoved)
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
return true
|
|
||||||
end })
|
end })
|
||||||
end
|
end
|
||||||
|
|
||||||
function g_mouse.bindPress(widget, callback)
|
function g_mouse.bindPress(widget, callback, button)
|
||||||
connect(widget, { onMousePress = function(widget, mousePos, mouseButton)
|
connect(widget, { onMousePress = function(widget, mousePos, mouseButton)
|
||||||
callback(mousePos, mouseButton)
|
if not button or button == mouseButton then
|
||||||
return true
|
callback(mousePos, mouseButton)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
end })
|
end })
|
||||||
end
|
end
|
||||||
|
16
modules/corelib/net.lua
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
function translateNetworkError(errcode, connecting, errdesc)
|
||||||
|
local text
|
||||||
|
if errcode == 111 then
|
||||||
|
text = tr('Connection refused, the server might be offline or restarting.\nPlease try again later.')
|
||||||
|
elseif errcode == 110 then
|
||||||
|
text = tr('Connection timed out. Either your network is failing or the server is offline.')
|
||||||
|
elseif errcode == 1 then
|
||||||
|
text = tr('Connection failed, the server address does not exist.')
|
||||||
|
elseif connecting then
|
||||||
|
text = tr('Connection failed.')
|
||||||
|
else
|
||||||
|
text = tr('Your connection has been lost.\nEither your network or the server went down.')
|
||||||
|
end
|
||||||
|
text = text .. ' ' .. tr('(ERROR %d)', errcode)
|
||||||
|
return text
|
||||||
|
end
|
@@ -61,3 +61,9 @@ function OutputMessage:addColor(color)
|
|||||||
self:addU8(color.b)
|
self:addU8(color.b)
|
||||||
self:addU8(color.a)
|
self:addU8(color.a)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function OutputMessage:addPosition(position)
|
||||||
|
self:addU16(position.x)
|
||||||
|
self:addU16(position.y)
|
||||||
|
self:addU8(position.z)
|
||||||
|
end
|
||||||
|
@@ -8,6 +8,7 @@ g_settings.getNode = g_configs.getNode
|
|||||||
g_settings.remove = g_configs.remove
|
g_settings.remove = g_configs.remove
|
||||||
g_settings.setList = g_configs.setList
|
g_settings.setList = g_configs.setList
|
||||||
g_settings.getList = g_configs.getList
|
g_settings.getList = g_configs.getList
|
||||||
|
g_settings.save = g_configs.save
|
||||||
|
|
||||||
local function convertSettingValue(value)
|
local function convertSettingValue(value)
|
||||||
if type(value) == 'table' then
|
if type(value) == 'table' then
|
||||||
|
@@ -49,4 +49,3 @@ function string:explode(sep, limit)
|
|||||||
table.insert(t, tmp)
|
table.insert(t, tmp)
|
||||||
return t
|
return t
|
||||||
end
|
end
|
||||||
|
|
||||||
|