Compare commits
30 Commits
vcpkg-fix
...
mobile_por
Author | SHA1 | Date | |
---|---|---|---|
![]() |
50180b594d | ||
![]() |
2fbd29ff8b | ||
![]() |
7cb1c9fae8 | ||
![]() |
0deeabbfda | ||
![]() |
01992aae7e | ||
![]() |
90ff929291 | ||
![]() |
0e87c8355b | ||
![]() |
57b9ad88eb | ||
![]() |
2d65a0a3ed | ||
![]() |
b18c60eb77 | ||
![]() |
d0a365144e | ||
![]() |
d88505bf8d | ||
![]() |
789f86a778 | ||
![]() |
eecf8beb2f | ||
![]() |
121e6b29ef | ||
![]() |
c2b25abd37 | ||
![]() |
6016c87337 | ||
![]() |
11a81650e4 | ||
![]() |
44ddbc34e8 | ||
![]() |
4605c72546 | ||
![]() |
2b96ae7f09 | ||
![]() |
fcf545133b | ||
![]() |
fd97ccd402 | ||
![]() |
4807c4a19d | ||
![]() |
15b3d439d6 | ||
![]() |
389c7f2a60 | ||
![]() |
c28d2c1555 | ||
![]() |
7e34c452a1 | ||
![]() |
b3b314f01b | ||
![]() |
997daa2d49 |
@@ -1,2 +0,0 @@
|
|||||||
/build/
|
|
||||||
Dockerfile
|
|
128
.github/workflows/build-vcpkg.yml
vendored
@@ -1,128 +0,0 @@
|
|||||||
name: Build with vcpkg
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- v*
|
|
||||||
|
|
||||||
tags:
|
|
||||||
- v*
|
|
||||||
|
|
||||||
paths:
|
|
||||||
- cmake/**
|
|
||||||
- src/**
|
|
||||||
- CMakeLists.txt
|
|
||||||
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- cmake/**
|
|
||||||
- src/**
|
|
||||||
- CMakeLists.txt
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
job:
|
|
||||||
name: ${{ matrix.os }}-${{ matrix.cxx }}-${{ matrix.buildtype }}-luajit=${{ matrix.luajit }}
|
|
||||||
runs-on: ${{ matrix.os }}-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
max-parallel: 8
|
|
||||||
matrix:
|
|
||||||
name: [ubuntu-gcc, macos-clang, windows-msvc]
|
|
||||||
buildtype: [Debug, Release]
|
|
||||||
luajit: [on, off]
|
|
||||||
include:
|
|
||||||
- name: windows-msvc
|
|
||||||
os: windows
|
|
||||||
cxx: cl.exe
|
|
||||||
cc: cl.exe
|
|
||||||
triplet: x64-windows
|
|
||||||
packages: >
|
|
||||||
boost-iostreams boost-asio boost-system boost-variant boost-lockfree boost-filesystem boost-uuid
|
|
||||||
glew luajit libogg libvorbis openal-soft opengl openssl physfs zlib
|
|
||||||
- name: ubuntu-gcc
|
|
||||||
os: ubuntu
|
|
||||||
cxx: g++
|
|
||||||
cc: gcc
|
|
||||||
triplet: x64-linux
|
|
||||||
packages: >
|
|
||||||
boost-iostreams boost-asio boost-system boost-variant boost-lockfree glew
|
|
||||||
boost-filesystem boost-uuid physfs openal-soft libogg libvorbis zlib opengl
|
|
||||||
- name: macos-clang
|
|
||||||
os: macos
|
|
||||||
cxx: clang++
|
|
||||||
cc: clang
|
|
||||||
triplet: x64-osx
|
|
||||||
packages: >
|
|
||||||
boost-iostreams boost-asio boost-system boost-variant boost-lockfree glew
|
|
||||||
boost-filesystem boost-uuid libogg libvorbis zlib opengl
|
|
||||||
exclude:
|
|
||||||
- name: windows-msvc
|
|
||||||
luajit: off
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
|
|
||||||
- name: Unshallow
|
|
||||||
run: git fetch --prune --unshallow
|
|
||||||
|
|
||||||
- name: Get latest CMake
|
|
||||||
# Using 'latest' branch, the latest CMake is installed.
|
|
||||||
uses: lukka/get-cmake@latest
|
|
||||||
|
|
||||||
- name: Ubuntu - install opengl lua5.1 luajit
|
|
||||||
# vcpkg has lua 5.3+
|
|
||||||
run: sudo apt-get install libglew-dev liblua5.1-0-dev libluajit-5.1-dev
|
|
||||||
if: contains( matrix.os, 'ubuntu')
|
|
||||||
|
|
||||||
- name: MacOS - install physfs pkgconfig lua5.1 luajit xquartz
|
|
||||||
run: brew install physfs pkgconfig lua@5.1 luajit xquartz
|
|
||||||
if: contains( matrix.os, 'macos')
|
|
||||||
|
|
||||||
- name: Set Environment vars
|
|
||||||
run: |
|
|
||||||
echo "CXX=${{ matrix.cxx }}" >> $GITHUB_ENV
|
|
||||||
echo "CC=${{ matrix.cc }}" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Run vcpkg
|
|
||||||
uses: lukka/run-vcpkg@v7.1
|
|
||||||
with:
|
|
||||||
vcpkgArguments: ${{ matrix.packages }}
|
|
||||||
vcpkgDirectory: ${{ runner.workspace }}/vcpkg/
|
|
||||||
vcpkgTriplet: ${{ matrix.triplet }}
|
|
||||||
vcpkgGitCommitId: 9a49e3df7f729655318c59b9985c9c18ad0c99d6
|
|
||||||
|
|
||||||
- name: Build with CMake
|
|
||||||
uses: lukka/run-cmake@v3
|
|
||||||
with:
|
|
||||||
buildDirectory: ${{ runner.workspace }}/build
|
|
||||||
cmakeListsOrSettingsJson: CMakeListsTxtAdvanced
|
|
||||||
cmakeAppendedArgs: '-G Ninja -DCMAKE_BUILD_TYPE="${{ matrix.buildtype }}" -DLUAJIT="${{ matrix.luajit }}"'
|
|
||||||
useVcpkgToolchainFile: true
|
|
||||||
|
|
||||||
- name: dir
|
|
||||||
run: find $RUNNER_WORKSPACE
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
- name: Upload artifact binary
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: otclient-${{ matrix.name }}-${{ matrix.buildtype }}-luajit=${{ matrix.luajit }}-${{ github.sha }}
|
|
||||||
path: ${{ runner.workspace }}/build/otclient
|
|
||||||
if: "! contains( matrix.os, 'windows')"
|
|
||||||
|
|
||||||
- name: Upload artifact binary (exe)
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: otclient-${{ matrix.name }}-${{ matrix.buildtype }}-luajit=${{ matrix.luajit }}-${{ github.sha }}
|
|
||||||
path: ${{ runner.workspace }}/build/otclient.exe
|
|
||||||
if: contains( matrix.os, 'windows')
|
|
||||||
|
|
||||||
- name: Upload artifact binary (dlls)
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: otclient-${{ matrix.name }}-${{ matrix.buildtype }}-luajit=${{ matrix.luajit }}-${{ github.sha }}
|
|
||||||
path: ${{ runner.workspace }}/build/*.dll
|
|
||||||
if: contains( matrix.os, 'windows')
|
|
245
.gitignore
vendored
@@ -1,3 +1,59 @@
|
|||||||
|
build*
|
||||||
|
CMakeCache.txt
|
||||||
|
CMakeFiles
|
||||||
|
cmake_install.cmake
|
||||||
|
Makefile
|
||||||
|
/otclient
|
||||||
|
/android/project/build.xml
|
||||||
|
/android/project/proguard-project.txt
|
||||||
|
/android/project/gen
|
||||||
|
/android/project/bin
|
||||||
|
/android/project/libs
|
||||||
|
/android/project/.settings
|
||||||
|
/android/project/.classpath
|
||||||
|
/android/project/.project
|
||||||
|
/android/project/.cproject
|
||||||
|
/android/project/local.properties
|
||||||
|
/android/project/project.properties
|
||||||
|
libs*
|
||||||
|
.idea*
|
||||||
|
/*.h
|
||||||
|
/*.cxx
|
||||||
|
*.o
|
||||||
|
*.gch
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.so
|
||||||
|
*.spr
|
||||||
|
*.dat
|
||||||
|
*.kdev*
|
||||||
|
*.cbp
|
||||||
|
*~
|
||||||
|
*.kate-swap
|
||||||
|
*.autosave
|
||||||
|
CMakeLists.txt.user*
|
||||||
|
*.xml
|
||||||
|
*.otb
|
||||||
|
*.otbm
|
||||||
|
*.log
|
||||||
|
*.bak
|
||||||
|
*.swp
|
||||||
|
*.pic
|
||||||
|
.lvimrc
|
||||||
|
.clang_complete
|
||||||
|
config.otml
|
||||||
|
/modules/otclientrc.lua
|
||||||
|
/doc
|
||||||
|
!.gitignore
|
||||||
|
otclient.map
|
||||||
|
otclient.layout
|
||||||
|
LOCALTODO
|
||||||
|
tags
|
||||||
|
Thumbs.db
|
||||||
|
.directory
|
||||||
|
src/framework/graphics/dx/
|
||||||
|
modules/.project/modules.sublime-workspace
|
||||||
|
|
||||||
#################
|
#################
|
||||||
## Visual Studio
|
## Visual Studio
|
||||||
#################
|
#################
|
||||||
@@ -9,8 +65,6 @@
|
|||||||
*.suo
|
*.suo
|
||||||
*.user
|
*.user
|
||||||
*.sln.docstates
|
*.sln.docstates
|
||||||
.idea/
|
|
||||||
.vscode/
|
|
||||||
|
|
||||||
# Build results
|
# Build results
|
||||||
|
|
||||||
@@ -20,7 +74,6 @@ x64/
|
|||||||
build/
|
build/
|
||||||
[Bb]in/
|
[Bb]in/
|
||||||
[Oo]bj/
|
[Oo]bj/
|
||||||
cmake-build-*/
|
|
||||||
|
|
||||||
# MSTest test Results
|
# MSTest test Results
|
||||||
[Tt]est[Rr]esult*/
|
[Tt]est[Rr]esult*/
|
||||||
@@ -47,19 +100,16 @@ cmake-build-*/
|
|||||||
*.vssscc
|
*.vssscc
|
||||||
.builds
|
.builds
|
||||||
*.pidb
|
*.pidb
|
||||||
|
*.log
|
||||||
*.scc
|
*.scc
|
||||||
*.dll
|
|
||||||
*.exe
|
|
||||||
|
|
||||||
# Visual C++ cache files
|
# Visual C++ cache files
|
||||||
ipch/
|
ipch/
|
||||||
*.aps
|
*.aps
|
||||||
*.ncb
|
*.ncb
|
||||||
*.opensdf
|
*.opensdf
|
||||||
*.opendb
|
|
||||||
*.sdf
|
*.sdf
|
||||||
*.cachefile
|
*.cachefile
|
||||||
*.VC.db
|
|
||||||
|
|
||||||
# Visual Studio profiler
|
# Visual Studio profiler
|
||||||
*.psess
|
*.psess
|
||||||
@@ -72,184 +122,3 @@ ipch/
|
|||||||
# ReSharper is a .NET coding add-in
|
# ReSharper is a .NET coding add-in
|
||||||
_ReSharper*/
|
_ReSharper*/
|
||||||
*.[Rr]e[Ss]harper
|
*.[Rr]e[Ss]harper
|
||||||
|
|
||||||
# TeamCity is a build add-in
|
|
||||||
_TeamCity*
|
|
||||||
|
|
||||||
# DotCover is a Code Coverage Tool
|
|
||||||
*.dotCover
|
|
||||||
|
|
||||||
# NCrunch
|
|
||||||
*.ncrunch*
|
|
||||||
.*crunch*.local.xml
|
|
||||||
|
|
||||||
# Installshield output folder
|
|
||||||
[Ee]xpress/
|
|
||||||
|
|
||||||
# DocProject is a documentation generator add-in
|
|
||||||
DocProject/buildhelp/
|
|
||||||
DocProject/Help/*.HxT
|
|
||||||
DocProject/Help/*.HxC
|
|
||||||
DocProject/Help/*.hhc
|
|
||||||
DocProject/Help/*.hhk
|
|
||||||
DocProject/Help/*.hhp
|
|
||||||
DocProject/Help/Html2
|
|
||||||
DocProject/Help/html
|
|
||||||
|
|
||||||
# Click-Once directory
|
|
||||||
publish/
|
|
||||||
|
|
||||||
# Publish Web Output
|
|
||||||
*.Publish.xml
|
|
||||||
*.pubxml
|
|
||||||
|
|
||||||
# NuGet Packages Directory
|
|
||||||
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
|
|
||||||
#packages/
|
|
||||||
|
|
||||||
# Windows Azure Build Output
|
|
||||||
csx
|
|
||||||
*.build.csdef
|
|
||||||
|
|
||||||
# Windows Store app package directory
|
|
||||||
AppPackages/
|
|
||||||
|
|
||||||
# Others
|
|
||||||
sql/
|
|
||||||
*.Cache
|
|
||||||
ClientBin/
|
|
||||||
[Ss]tyle[Cc]op.*
|
|
||||||
~$*
|
|
||||||
*~
|
|
||||||
*.dbmdl
|
|
||||||
*.[Pp]ublish.xml
|
|
||||||
*.pfx
|
|
||||||
*.publishsettings
|
|
||||||
|
|
||||||
# RIA/Silverlight projects
|
|
||||||
Generated_Code/
|
|
||||||
|
|
||||||
# Backup & report files from converting an old project file to a newer
|
|
||||||
# Visual Studio version. Backup files are not needed, because we have git ;-)
|
|
||||||
_UpgradeReport_Files/
|
|
||||||
Backup*/
|
|
||||||
UpgradeLog*.XML
|
|
||||||
UpgradeLog*.htm
|
|
||||||
|
|
||||||
# SQL Server files
|
|
||||||
App_Data/*.mdf
|
|
||||||
App_Data/*.ldf
|
|
||||||
|
|
||||||
#############
|
|
||||||
## Windows detritus
|
|
||||||
#############
|
|
||||||
|
|
||||||
# Windows image file caches
|
|
||||||
Thumbs.db
|
|
||||||
ehthumbs.db
|
|
||||||
|
|
||||||
# Folder config file
|
|
||||||
Desktop.ini
|
|
||||||
|
|
||||||
# Recycle Bin used on file shares
|
|
||||||
$RECYCLE.BIN/
|
|
||||||
|
|
||||||
# Mac crap
|
|
||||||
.DS_Store
|
|
||||||
|
|
||||||
# Installer logs
|
|
||||||
pip-log.txt
|
|
||||||
|
|
||||||
# Unit test / coverage reports
|
|
||||||
.coverage
|
|
||||||
.tox
|
|
||||||
|
|
||||||
#Translations
|
|
||||||
*.mo
|
|
||||||
|
|
||||||
#Mr Developer
|
|
||||||
.mr.developer.cfg
|
|
||||||
|
|
||||||
# Vim files
|
|
||||||
*~
|
|
||||||
.*.swp
|
|
||||||
.*.swo
|
|
||||||
|
|
||||||
#################
|
|
||||||
## OTClient
|
|
||||||
#################
|
|
||||||
|
|
||||||
/otclient
|
|
||||||
/modules/otclientrc.lua
|
|
||||||
src/framework/graphics/dx/
|
|
||||||
|
|
||||||
*.o
|
|
||||||
*.gch
|
|
||||||
*.a
|
|
||||||
*.kdev*
|
|
||||||
*.cbp
|
|
||||||
*~
|
|
||||||
*.kate-swap
|
|
||||||
*.autosave
|
|
||||||
*.bak
|
|
||||||
*.swp
|
|
||||||
.lvimrc
|
|
||||||
.clang_complete
|
|
||||||
LOCALTODO
|
|
||||||
tags
|
|
||||||
|
|
||||||
# user-specific files
|
|
||||||
*.xml
|
|
||||||
*.otb
|
|
||||||
*.otbm
|
|
||||||
*.spr
|
|
||||||
*.dat
|
|
||||||
*.pic
|
|
||||||
config.otml
|
|
||||||
|
|
||||||
## Cmake cache
|
|
||||||
CMakeLists.txt.user
|
|
||||||
CMakeCache.txt
|
|
||||||
CMakeFiles
|
|
||||||
CMakeScripts
|
|
||||||
Testing
|
|
||||||
Makefile
|
|
||||||
cmake_install.cmake
|
|
||||||
install_manifest.txt
|
|
||||||
compile_commands.json
|
|
||||||
CTestTestfile.cmake
|
|
||||||
_deps
|
|
||||||
|
|
||||||
## Sublime
|
|
||||||
|
|
||||||
# Cache files for Sublime Text
|
|
||||||
*.tmlanguage.cache
|
|
||||||
*.tmPreferences.cache
|
|
||||||
*.stTheme.cache
|
|
||||||
|
|
||||||
# Workspace files are user-specific
|
|
||||||
*.sublime-workspace
|
|
||||||
|
|
||||||
# Project files should be checked into the repository, unless a significant
|
|
||||||
# proportion of contributors will probably not be using Sublime Text
|
|
||||||
# *.sublime-project
|
|
||||||
|
|
||||||
# SFTP configuration file
|
|
||||||
sftp-config.json
|
|
||||||
sftp-config-alt*.json
|
|
||||||
|
|
||||||
# Package control specific files
|
|
||||||
Package Control.last-run
|
|
||||||
Package Control.ca-list
|
|
||||||
Package Control.ca-bundle
|
|
||||||
Package Control.system-ca-bundle
|
|
||||||
Package Control.cache/
|
|
||||||
Package Control.ca-certs/
|
|
||||||
Package Control.merged-ca-bundle
|
|
||||||
Package Control.user-ca-bundle
|
|
||||||
oscrypto-ca-bundle.crt
|
|
||||||
bh_unicode_properties.cache
|
|
||||||
|
|
||||||
# Sublime-github package stores a github token in this file
|
|
||||||
# https://packagecontrol.io/packages/sublime-github
|
|
||||||
GitHub.sublime-settings
|
|
14
.travis.yml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
language: cpp
|
||||||
|
compiler:
|
||||||
|
- gcc
|
||||||
|
before_script:
|
||||||
|
- sudo apt-get install libboost1.48-all-dev libphysfs-dev libssl-dev liblua5.1-dev libglew1.6-dev libvorbis-dev libopenal-dev libz-dev -y
|
||||||
|
script: |
|
||||||
|
cmake . -DCMAKE_BUILD_TYPE=Release
|
||||||
|
make
|
||||||
|
notifications:
|
||||||
|
irc:
|
||||||
|
channels:
|
||||||
|
- "irc.freenode.org#otclient"
|
||||||
|
on_success: change
|
||||||
|
skip_join: true
|
@@ -1,7 +1,7 @@
|
|||||||
cmake_minimum_required(VERSION 3.1)
|
cmake_minimum_required(VERSION 2.6)
|
||||||
project(otclient)
|
project(otclient)
|
||||||
|
|
||||||
set(VERSION "1.0.0")
|
set(VERSION "0.6.6")
|
||||||
|
|
||||||
option(FRAMEWORK_SOUND "Use SOUND " ON)
|
option(FRAMEWORK_SOUND "Use SOUND " ON)
|
||||||
option(FRAMEWORK_GRAPHICS "Use GRAPHICS " ON)
|
option(FRAMEWORK_GRAPHICS "Use GRAPHICS " ON)
|
||||||
@@ -19,45 +19,32 @@ endif()
|
|||||||
|
|
||||||
option(USE_PCH "Use precompiled header (speed up compile)" OFF)
|
option(USE_PCH "Use precompiled header (speed up compile)" OFF)
|
||||||
|
|
||||||
set(executable_SOURCES
|
# add executable icon for win32 platforms
|
||||||
src/main.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
if(MSVC)
|
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/otcicon.o
|
||||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/otcicon.o
|
COMMAND ${CMAKE_RC_COMPILER}
|
||||||
COMMAND ${CMAKE_RC_COMPILER}
|
-I${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
-I${CMAKE_CURRENT_SOURCE_DIR}/src
|
-i${CMAKE_CURRENT_SOURCE_DIR}/src/otcicon.rc
|
||||||
-fo${CMAKE_CURRENT_BINARY_DIR}/otcicon.o
|
-o ${CMAKE_CURRENT_BINARY_DIR}/otcicon.o)
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/otcicon.rc
|
|
||||||
)
|
|
||||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
|
||||||
else()
|
|
||||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/otcicon.o
|
|
||||||
COMMAND ${CMAKE_RC_COMPILER}
|
|
||||||
-I${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
||||||
-i${CMAKE_CURRENT_SOURCE_DIR}/src/otcicon.rc
|
|
||||||
-o ${CMAKE_CURRENT_BINARY_DIR}/otcicon.o
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(executable_SOURCES ${executable_SOURCES} otcicon.o)
|
set(executable_SOURCES ${executable_SOURCES} otcicon.o)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_definitions(-D"VERSION=\\"${VERSION}\\"")
|
add_definitions(-D"VERSION=\\"${VERSION}\\"")
|
||||||
|
|
||||||
# add client executable
|
set(executable_SOURCES
|
||||||
add_executable(${PROJECT_NAME} ${framework_SOURCES} ${client_SOURCES} ${executable_SOURCES})
|
src/main.cpp
|
||||||
|
)
|
||||||
|
|
||||||
set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 14)
|
if(ANDROID)
|
||||||
set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD_REQUIRED ON)
|
# add shared library for android
|
||||||
|
add_library(${PROJECT_NAME} SHARED ${framework_SOURCES} ${client_SOURCES} ${executable_SOURCES})
|
||||||
|
else()
|
||||||
|
# add client executable
|
||||||
|
add_executable(${PROJECT_NAME} ${framework_SOURCES} ${client_SOURCES} ${executable_SOURCES})
|
||||||
|
endif()
|
||||||
|
|
||||||
target_link_libraries(${PROJECT_NAME} ${framework_LIBRARIES})
|
target_link_libraries(${PROJECT_NAME} ${framework_LIBRARIES})
|
||||||
|
|
||||||
if(APPLE AND USE_STATIC_LIBS)
|
|
||||||
target_link_libraries(${PROJECT_NAME} "-framework Foundation" "-framework IOKit")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(USE_PCH)
|
if(USE_PCH)
|
||||||
include(cotire)
|
include(cotire)
|
||||||
cotire(${PROJECT_NAME})
|
cotire(${PROJECT_NAME})
|
||||||
|
49
Dockerfile
@@ -1,49 +0,0 @@
|
|||||||
FROM ubuntu@sha256:b88f8848e9a1a4e4558ba7cfc4acc5879e1d0e7ac06401409062ad2627e6fb58 AS builder
|
|
||||||
|
|
||||||
RUN apt-get update; \
|
|
||||||
apt-get install -y \
|
|
||||||
build-essential \
|
|
||||||
cmake \
|
|
||||||
git-core \
|
|
||||||
libboost-atomic1.65-dev \
|
|
||||||
libboost-chrono1.65-dev \
|
|
||||||
libboost-date-time1.65-dev \
|
|
||||||
libboost-filesystem1.65-dev \
|
|
||||||
libboost-system1.65-dev \
|
|
||||||
libboost-thread1.65-dev \
|
|
||||||
libglew-dev \
|
|
||||||
liblua5.1-0-dev \
|
|
||||||
libncurses5-dev \
|
|
||||||
libopenal-dev \
|
|
||||||
libssl-dev \
|
|
||||||
libvorbis-dev \
|
|
||||||
mercurial \
|
|
||||||
zlib1g-dev; \
|
|
||||||
apt-get clean && apt-get autoclean
|
|
||||||
|
|
||||||
WORKDIR /
|
|
||||||
RUN hg clone -r stable-3.0 http://hg.icculus.org/icculus/physfs/
|
|
||||||
WORKDIR /physfs/build/
|
|
||||||
RUN cmake ..
|
|
||||||
RUN make -j$(nproc)
|
|
||||||
RUN make install
|
|
||||||
|
|
||||||
COPY ./src/ /otclient/src/.
|
|
||||||
COPY CMakeLists.txt /otclient/.
|
|
||||||
WORKDIR /otclient/build/
|
|
||||||
RUN cmake -DCMAKE_CXX_LINK_FLAGS=-no-pie -DCMAKE_BUILD_TYPE=Release ..
|
|
||||||
RUN make -j$(nproc)
|
|
||||||
|
|
||||||
FROM ubuntu@sha256:b88f8848e9a1a4e4558ba7cfc4acc5879e1d0e7ac06401409062ad2627e6fb58
|
|
||||||
RUN apt-get update; \
|
|
||||||
apt-get install -y \
|
|
||||||
libglew2.0 \
|
|
||||||
libopenal1; \
|
|
||||||
apt-get clean && apt-get autoclean
|
|
||||||
COPY --from=builder /otclient/build/otclient /otclient/bin/otclient
|
|
||||||
COPY ./data/ /otclient/data/.
|
|
||||||
COPY ./mods/ /otclient/mods/.
|
|
||||||
COPY ./modules/ /otclient/modules/.
|
|
||||||
COPY ./init.lua /otclient/.
|
|
||||||
WORKDIR /otclient
|
|
||||||
CMD ["./bin/otclient"]
|
|
@@ -1,22 +0,0 @@
|
|||||||
<!-- Welcome to the issues section if it's your first time! -->
|
|
||||||
|
|
||||||
### Before creating an issue, please ensure:
|
|
||||||
- [ ] This is a bug in the software that resides in this repository, and not a
|
|
||||||
support matter (use https://otland.net/forums/otclient.494/ for support)
|
|
||||||
- [ ] This issue is reproducible without changes to the code in this repository
|
|
||||||
|
|
||||||
### Steps to reproduce (include any configuration/script required to reproduce)
|
|
||||||
1.
|
|
||||||
2.
|
|
||||||
3.
|
|
||||||
|
|
||||||
### Expected behaviour
|
|
||||||
<!-- Tell us what should happen -->
|
|
||||||
|
|
||||||
### Actual behaviour
|
|
||||||
<!-- Tell us what happens instead -->
|
|
||||||
|
|
||||||
### Environment
|
|
||||||
<!-- Please tell which client version are you using (E.g 10.98 OTClient 0.6.6)
|
|
||||||
If the issue is environment specific (e.g. compiling errors), include
|
|
||||||
name and version of the operating system and compiler you are using. -->
|
|
2
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
OTClient is made available under the MIT License
|
OTClient is made available under the MIT License
|
||||||
|
|
||||||
Copyright (c) 2010-2020 OTClient <https://github.com/edubart/otclient>
|
Copyright (c) 2010-2015 OTClient <https://github.com/edubart/otclient>
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
60
README.md
@@ -1,5 +1,4 @@
|
|||||||
[](https://github.com/edubart/otclient/actions/workflows/build-vcpkg.yml) [](https://gitter.im/edubart/otclient?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [](https://www.codetriage.com/edubart/otclient)
|
[](http://travis-ci.org/edubart/otclient) [](https://gitter.im/edubart/otclient?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
|
|
||||||
### What is otclient?
|
### What is otclient?
|
||||||
|
|
||||||
Otclient is an alternative Tibia client for usage with otserv. It aims to be complete and flexible,
|
Otclient is an alternative Tibia client for usage with otserv. It aims to be complete and flexible,
|
||||||
@@ -7,17 +6,32 @@ for that it uses LUA scripting for all game interface functionality and configur
|
|||||||
similar to CSS for the client interface design. Otclient works with a modular system, this means
|
similar to CSS for the client interface design. Otclient works with a modular system, this means
|
||||||
that each functionality is a separated module, giving the possibility to users modify and customize
|
that each functionality is a separated module, giving the possibility to users modify and customize
|
||||||
anything easily. Users can also create new mods and extend game interface for their own purposes.
|
anything easily. Users can also create new mods and extend game interface for their own purposes.
|
||||||
Otclient is written in C++11 and heavily scripted in lua.
|
Otclient is written in C++2011, the upcoming C++ standard and heavily scripted in lua.
|
||||||
|
|
||||||
For a server to connect to, you can build your own with the [forgottenserver](https://github.com/otland/forgottenserver)
|
## The Mobile Project
|
||||||
or connect to one listed on [otservlist](https://otservlist.org/).
|
This is a fork of edubart's otclient. The objective of this fork it's to develop a runnable otclient on mobiles devices.
|
||||||
|
|
||||||
|
Tasks that need to do:
|
||||||
|
- [X] Compile on Android devices
|
||||||
|
- [ ] Compile on Apple devices
|
||||||
|
- [ ] Adapt the UI reusing the existing lua code
|
||||||
|
|
||||||
|
Current compiling tutorials:
|
||||||
|
* [Compiling for Android](https://github.com/edubart/otclient/wiki/Compiling-for-Android)
|
||||||
|
|
||||||
### Where do I download?
|
### Where do I download?
|
||||||
|
|
||||||
Compiled for Windows can be found here (but can be outdated):
|
The latest commits compiled for Windows can be found here.
|
||||||
* [Windows Builds](http://otland.net/threads/otclient-builds-windows.217977/)
|
* [Windows Builds](http://otland.net/threads/otclient-builds-windows.217977/)
|
||||||
|
|
||||||
**NOTE:** You will need to download spr/dat files on your own and place them in `data/things/VERSION/` (i.e: `data/things/1098/Tibia.spr`)
|
Here is the latest v0.6.5 release compiled for both i686(32 bit) and x86_64(64 bit) machines, with OpenGL renderer.
|
||||||
|
This release is compatible with protocols ranges from 7.60 up to 10.31.
|
||||||
|
* [For Windows](https://www.dropbox.com/sh/se1okacemoqzjve/XFqFoSKLCg/otclient-win-0.6.5.zip)
|
||||||
|
* [For Linux](https://www.dropbox.com/sh/se1okacemoqzjve/xKJL7j6vEo/otclient-linux-0.6.5.tar.gz)
|
||||||
|
|
||||||
|
**NOTE:** You will need to download spr/dat files on your own and place them in `data/things/VERSION/` (i.e: `data/things/1041/Tibia.spr`)
|
||||||
|
|
||||||
|
Older releases can be downloaded from [here](https://www.dropbox.com/sh/se1okacemoqzjve/-oWK4YFm03)
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
@@ -31,40 +45,20 @@ client, instead otclient was designed to be a combination of a framework and tib
|
|||||||
|
|
||||||
### Compiling
|
### Compiling
|
||||||
|
|
||||||
|
A package with all required libraries for compiling OTClient on Windows can be found here:
|
||||||
|
* [For MSVC 2013](https://www.dropbox.com/sh/se1okacemoqzjve/dI4ODbq7OT/otclient-msvc13-libs.zip)
|
||||||
|
* [For MingW32](https://www.dropbox.com/sh/se1okacemoqzjve/UAkRCiGXXR/otclient-libs_mingw32-dwarf2.zip)
|
||||||
|
|
||||||
In short, if you need to compile OTClient, follow these tutorials:
|
In short, if you need to compile OTClient, follow these tutorials:
|
||||||
* [Compiling on Windows](https://github.com/edubart/otclient/wiki/Compiling-on-Windows)
|
* [Compiling on Windows](https://github.com/edubart/otclient/wiki/Compiling-on-Windows)
|
||||||
* [Compiling on Linux](https://github.com/edubart/otclient/wiki/Compiling-on-Linux)
|
* [Compiling on Linux](https://github.com/edubart/otclient/wiki/Compiling-on-Linux)
|
||||||
* [Compiling on OS X](https://github.com/edubart/otclient/wiki/Compiling-on-Mac-OS-X)
|
* [Compiling on OS X](https://github.com/edubart/otclient/wiki/Compiling-on-Mac-OS-X)
|
||||||
|
|
||||||
### Build and run with Docker
|
|
||||||
|
|
||||||
To build the image:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
docker build -t edubart/otclient .
|
|
||||||
```
|
|
||||||
|
|
||||||
To run the built image:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# Disable access control for the X server.
|
|
||||||
xhost +
|
|
||||||
|
|
||||||
# Run the container image with the required bindings to the host devices and volumes.
|
|
||||||
docker run -it --rm \
|
|
||||||
--env DISPLAY \
|
|
||||||
--volume /tmp/.X11-unix:/tmp/.X11-unix \
|
|
||||||
--device /dev/dri \
|
|
||||||
--device /dev/snd edubart/otclient /bin/bash
|
|
||||||
|
|
||||||
# Enable access control for the X server.
|
|
||||||
xhost -
|
|
||||||
```
|
|
||||||
|
|
||||||
### Need help?
|
### Need help?
|
||||||
|
|
||||||
Try to ask questions in [otland](http://otland.net/f494/), now we have a board for the project there,
|
Try to ask questions in [otland](http://otland.net/f494/), now we have a board for the project there,
|
||||||
or talk with us at the gitter chat.
|
or talk with us at #otclient irc.freenode.net
|
||||||
|
|
||||||
### Bugs
|
### Bugs
|
||||||
|
|
||||||
@@ -76,7 +70,7 @@ We encourage you to contribute to otclient! You can make pull requests of any im
|
|||||||
|
|
||||||
### Contact
|
### Contact
|
||||||
|
|
||||||
Talk directly with us at the gitter chat [](https://gitter.im/edubart/otclient?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge).
|
Talk directly with us at #otclient irc.freenode.net or send an email directly to the project leader edub4rt@gmail.com
|
||||||
|
|
||||||
### License
|
### License
|
||||||
|
|
||||||
|
1767
android/android.toolchain.cmake
Normal file
18
android/compile_android_unix.sh
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
mkdir -p ../build_android && cd ../build
|
||||||
|
|
||||||
|
cmake -DCMAKE_TOOLCHAIN_FILE=../android/android.toolchain.cmake -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=android-16 -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.6 ..
|
||||||
|
make
|
||||||
|
|
||||||
|
cd ../
|
||||||
|
|
||||||
|
cp -r libs android/project/
|
||||||
|
cp $ANDROID_NDK/libraries/lib/libSDL2.so android/project/libs/armeabi-v7a
|
||||||
|
|
||||||
|
cd android/project
|
||||||
|
|
||||||
|
android update project -p . --name OTClientMob --target android-16
|
||||||
|
ant debug
|
||||||
|
|
||||||
|
cd bin
|
||||||
|
adb install -r OTClientMob-debug.apk
|
18
android/compile_android_windows.bat
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
cd ..
|
||||||
|
mkdir build_android
|
||||||
|
cd build_android
|
||||||
|
|
||||||
|
cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=../android/android.toolchain.cmake -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=android-16 -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.6 ..
|
||||||
|
make
|
||||||
|
|
||||||
|
cd ../
|
||||||
|
|
||||||
|
xcopy /E /Y libs android\project\libs
|
||||||
|
|
||||||
|
cd android\project
|
||||||
|
|
||||||
|
call android update project -p . --name OTClient --target android-16
|
||||||
|
call ant debug
|
||||||
|
|
||||||
|
cd bin
|
||||||
|
adb install -r OTClient-debug.apk
|
21
android/compile_android_windows_debug.bat
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
cd ..
|
||||||
|
mkdir build_android
|
||||||
|
cd build_android
|
||||||
|
|
||||||
|
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=../android/android.toolchain.cmake -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=android-16 -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.6 ..
|
||||||
|
make
|
||||||
|
|
||||||
|
cd ../
|
||||||
|
|
||||||
|
ECHO D|xcopy /E /Y android\project\jni\libSDL2.so android\project\libs\armeabi-v7a
|
||||||
|
xcopy /E /Y libs\armeabi-v7a\libotclient.so android\project\jni
|
||||||
|
|
||||||
|
cd android\project
|
||||||
|
|
||||||
|
call android update project -p . --name OTClient --target android-16
|
||||||
|
call ndk-build.cmd all NDK_DEBUG=1
|
||||||
|
call ant clean
|
||||||
|
call ant debug
|
||||||
|
|
||||||
|
cd bin
|
||||||
|
adb install -r OTClient-debug.apk
|
36
android/project/AndroidManifest.xml
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.otclient.mobile" android:versionCode="1" android:versionName="1.0">
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:debuggable="true"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:icon="@drawable/ic_launcher"
|
||||||
|
android:hardwareAccelerated="true" >
|
||||||
|
|
||||||
|
<activity android:name="MainActivity"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
|
||||||
|
android:configChanges="orientation|keyboardHidden"
|
||||||
|
android:screenOrientation="landscape">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<meta-data android:name="android.app.lib_name" android:value="otclient"/>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
<!-- Android 2.3.3 -->
|
||||||
|
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="16"/>
|
||||||
|
|
||||||
|
<!-- OpenGL ES 2.0 -->
|
||||||
|
<uses-feature android:glEsVersion="0x00020000"/>
|
||||||
|
|
||||||
|
<!-- Allow writing to external storage -->
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||||
|
|
||||||
|
<!-- Allow make internet connections -->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
</manifest>
|
6
android/project/jni/Android.mk
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := libotclient
|
||||||
|
LOCAL_SRC_FILES := libotclient.so
|
||||||
|
include $(PREBUILT_SHARED_LIBRARY)
|
2
android/project/jni/Application.mk
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
APP_PLATFORM := android-9
|
||||||
|
APP_ABI := armeabi-v7a
|
BIN
android/project/res/drawable-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 538 B |
BIN
android/project/res/drawable-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 429 B |
BIN
android/project/res/drawable-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 822 B |
BIN
android/project/res/drawable-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
android/project/res/drawable-xxxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
4
android/project/res/values/strings.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">OTClient</string>
|
||||||
|
</resources>
|
52
android/project/src/com/otclient/mobile/FakeEditText.java
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
package com.otclient.mobile;
|
||||||
|
|
||||||
|
import android.view.KeyEvent;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.inputmethod.EditorInfo;
|
||||||
|
import android.view.inputmethod.InputConnection;
|
||||||
|
|
||||||
|
public class FakeEditText extends View implements View.OnKeyListener {
|
||||||
|
InputConnection ic;
|
||||||
|
|
||||||
|
public FakeEditText() {
|
||||||
|
super(MainActivity.getInstance());
|
||||||
|
setFocusableInTouchMode(true);
|
||||||
|
setFocusable(true);
|
||||||
|
setOnKeyListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCheckIsTextEditor() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override // This handles the hardware keyboard input
|
||||||
|
public boolean onKey(View v, int keyCode, KeyEvent event) {
|
||||||
|
if (event.isPrintingKey()) {
|
||||||
|
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||||
|
ic.commitText(String.valueOf((char) event.getUnicodeChar()), 1);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||||
|
onNativeKeyDown(keyCode);
|
||||||
|
return true;
|
||||||
|
} else if (event.getAction() == KeyEvent.ACTION_UP) {
|
||||||
|
onNativeKeyUp(keyCode);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
|
||||||
|
ic = new InputConnectionForNative(this, true);
|
||||||
|
|
||||||
|
return ic;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static native void onNativeKeyDown(int keyCode);
|
||||||
|
public static native void onNativeKeyUp(int keyCode);
|
||||||
|
}
|
@@ -0,0 +1,47 @@
|
|||||||
|
package com.otclient.mobile;
|
||||||
|
|
||||||
|
import android.view.KeyEvent;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.inputmethod.BaseInputConnection;
|
||||||
|
|
||||||
|
public class InputConnectionForNative extends BaseInputConnection {
|
||||||
|
|
||||||
|
public InputConnectionForNative(View targetView, boolean fullEditor) {
|
||||||
|
super(targetView, fullEditor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override // This handles the keycodes from soft keyboard
|
||||||
|
public boolean sendKeyEvent(KeyEvent event) {
|
||||||
|
int keyCode = event.getKeyCode();
|
||||||
|
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||||
|
if (event.isPrintingKey()) {
|
||||||
|
commitText(String.valueOf((char) event.getUnicodeChar()), 1);
|
||||||
|
}
|
||||||
|
FakeEditText.onNativeKeyDown(keyCode);
|
||||||
|
return true;
|
||||||
|
} else if (event.getAction() == KeyEvent.ACTION_UP) {
|
||||||
|
FakeEditText.onNativeKeyUp(keyCode);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.sendKeyEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override // Typed text
|
||||||
|
public boolean commitText(CharSequence text, int newCursorPosition) {
|
||||||
|
nativeCommitText(text.toString(), newCursorPosition);
|
||||||
|
|
||||||
|
return super.commitText(text, newCursorPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override // Workaround to capture backspace key
|
||||||
|
public boolean deleteSurroundingText(int beforeLength, int afterLength) {
|
||||||
|
if (beforeLength == 1 && afterLength == 0) {
|
||||||
|
return super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))
|
||||||
|
&& super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.deleteSurroundingText(beforeLength, afterLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static native void nativeCommitText(String text, int newCursorPosition);
|
||||||
|
}
|
@@ -0,0 +1,33 @@
|
|||||||
|
package com.otclient.mobile;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.inputmethod.InputMethodManager;
|
||||||
|
|
||||||
|
public class KeyboardSoftHandler{
|
||||||
|
private View editText;
|
||||||
|
|
||||||
|
public KeyboardSoftHandler() {
|
||||||
|
editText = new FakeEditText();
|
||||||
|
MainActivity.getInstance()
|
||||||
|
.addViewToLayout(editText);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showKeyboardSoft() {
|
||||||
|
editText.setVisibility(View.VISIBLE);
|
||||||
|
editText.requestFocus();
|
||||||
|
|
||||||
|
InputMethodManager imm = (InputMethodManager) MainActivity
|
||||||
|
.getInstance().getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||||
|
imm.showSoftInput(editText, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void hideKeyboardSoft() {
|
||||||
|
editText.setVisibility(View.GONE);
|
||||||
|
|
||||||
|
InputMethodManager imm = (InputMethodManager) MainActivity
|
||||||
|
.getInstance().getSystemService(
|
||||||
|
Context.INPUT_METHOD_SERVICE);
|
||||||
|
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
|
||||||
|
}
|
||||||
|
}
|
110
android/project/src/com/otclient/mobile/MainActivity.java
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
package com.otclient.mobile;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.KeyEvent;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.RelativeLayout;
|
||||||
|
import android.widget.RelativeLayout.LayoutParams;
|
||||||
|
|
||||||
|
public class MainActivity extends Activity {
|
||||||
|
public static final String APP_TAG = "OTClientMob";
|
||||||
|
|
||||||
|
private static MainActivity instance;
|
||||||
|
private RelativeLayout layout;
|
||||||
|
|
||||||
|
private static boolean started;
|
||||||
|
|
||||||
|
static {
|
||||||
|
started = false;
|
||||||
|
//android.os.Debug.waitForDebugger();
|
||||||
|
System.loadLibrary("otclient");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
Log.v(APP_TAG, "onCreate()");
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initialize() {
|
||||||
|
instance = this;
|
||||||
|
|
||||||
|
layout = new RelativeLayout(this);
|
||||||
|
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
|
||||||
|
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
|
||||||
|
layout.setLayoutParams(params);
|
||||||
|
|
||||||
|
setContentView(layout);
|
||||||
|
|
||||||
|
if( !started ) {
|
||||||
|
nativeInit();
|
||||||
|
started = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
NativeFacadeCalls.initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPause() {
|
||||||
|
Log.v(APP_TAG, "onPause()");
|
||||||
|
super.onPause();
|
||||||
|
nativePause();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
Log.v(APP_TAG, "onResume()");
|
||||||
|
super.onResume();
|
||||||
|
|
||||||
|
if( NativeFacadeCalls.isSurfaceReady() )
|
||||||
|
nativeResume();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
Log.v(APP_TAG, "onDestroy()");
|
||||||
|
super.onDestroy();
|
||||||
|
|
||||||
|
if(isFinishing()) {
|
||||||
|
NativeFacadeCalls.destroy();
|
||||||
|
destroy();
|
||||||
|
nativeDestroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void destroy() {
|
||||||
|
instance = null;
|
||||||
|
layout = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override // Ignore certain special keys so they're handled by Android
|
||||||
|
public boolean dispatchKeyEvent(KeyEvent event) {
|
||||||
|
int keyCode = event.getKeyCode();
|
||||||
|
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||
|
||||||
|
keyCode == KeyEvent.KEYCODE_VOLUME_UP ||
|
||||||
|
keyCode == KeyEvent.KEYCODE_CAMERA ||
|
||||||
|
keyCode == 168 || /* API 11: KeyEvent.KEYCODE_ZOOM_IN */
|
||||||
|
keyCode == 169 /* API 11: KeyEvent.KEYCODE_ZOOM_OUT */
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return super.dispatchKeyEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MainActivity getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addViewToLayout(View view) {
|
||||||
|
layout.addView(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
public native void nativeInit();
|
||||||
|
public native void nativePause();
|
||||||
|
public native void nativeResume();
|
||||||
|
public native void nativeDestroy();
|
||||||
|
}
|
@@ -0,0 +1,45 @@
|
|||||||
|
package com.otclient.mobile;
|
||||||
|
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.view.Surface;
|
||||||
|
|
||||||
|
public class NativeFacadeCalls {
|
||||||
|
private static NativeSurfaceView nativeSurfaceView;
|
||||||
|
private static KeyboardSoftHandler keyboardSoftHandler;
|
||||||
|
private static Handler handler;
|
||||||
|
|
||||||
|
public static void initialize() {
|
||||||
|
handler = new Handler(Looper.getMainLooper());
|
||||||
|
keyboardSoftHandler = new KeyboardSoftHandler();
|
||||||
|
nativeSurfaceView = new NativeSurfaceView();
|
||||||
|
MainActivity.getInstance().addViewToLayout(nativeSurfaceView);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void destroy() {
|
||||||
|
handler = null;
|
||||||
|
nativeSurfaceView = null;
|
||||||
|
keyboardSoftHandler = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isSurfaceReady() {
|
||||||
|
return nativeSurfaceView.isSurfaceReady();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Static methods called from JNI
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static Surface getNativeSurface() {
|
||||||
|
return nativeSurfaceView.getSurface();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void showKeyboardSoft() {
|
||||||
|
handler.post(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
keyboardSoftHandler.showKeyboardSoft();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,38 @@
|
|||||||
|
package com.otclient.mobile;
|
||||||
|
|
||||||
|
public class NativeMainThread {
|
||||||
|
private static final NativeMainThread instance;
|
||||||
|
private Thread nativeThread;
|
||||||
|
|
||||||
|
static {
|
||||||
|
instance = new NativeMainThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
private NativeMainThread() {}
|
||||||
|
|
||||||
|
public void start() {
|
||||||
|
if( nativeThread == null ) {
|
||||||
|
nativeThread = new Thread(
|
||||||
|
new NativeThread(), "NativeThread" );
|
||||||
|
nativeThread.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NativeMainThread getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Native methods implemented on C++
|
||||||
|
*/
|
||||||
|
|
||||||
|
public native void nativeStartApp();
|
||||||
|
|
||||||
|
private class NativeThread implements Runnable {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
nativeStartApp();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
130
android/project/src/com/otclient/mobile/NativeSurfaceView.java
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
package com.otclient.mobile;
|
||||||
|
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.GestureDetector;
|
||||||
|
import android.view.KeyEvent;
|
||||||
|
import android.view.MotionEvent;
|
||||||
|
import android.view.Surface;
|
||||||
|
import android.view.SurfaceHolder;
|
||||||
|
import android.view.SurfaceView;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
public class NativeSurfaceView extends SurfaceView implements
|
||||||
|
SurfaceHolder.Callback, View.OnTouchListener {
|
||||||
|
|
||||||
|
private Surface surface;
|
||||||
|
private GestureDetector gestureDetector;
|
||||||
|
private int currentWidth;
|
||||||
|
private int currentHeight;
|
||||||
|
private boolean surfaceReady;
|
||||||
|
|
||||||
|
private final int LONGPRESS_EVENT = 3;
|
||||||
|
|
||||||
|
public NativeSurfaceView() {
|
||||||
|
super(MainActivity.getInstance());
|
||||||
|
getHolder().addCallback(this);
|
||||||
|
setFocusable(true);
|
||||||
|
setFocusableInTouchMode(true);
|
||||||
|
requestFocus();
|
||||||
|
setOnTouchListener(this);
|
||||||
|
|
||||||
|
currentWidth = 0;
|
||||||
|
currentHeight = 0;
|
||||||
|
surfaceReady = false;
|
||||||
|
|
||||||
|
gestureDetector = new GestureDetector(
|
||||||
|
new GestureDetector.SimpleOnGestureListener() {
|
||||||
|
public void onLongPress(MotionEvent event) {
|
||||||
|
onNativeTouch(LONGPRESS_EVENT, event.getX(), event.getY());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void surfaceCreated(SurfaceHolder holder) {
|
||||||
|
Log.d(MainActivity.APP_TAG, "surfaceCreated");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void surfaceChanged(SurfaceHolder holder, int format, int width,
|
||||||
|
int height) {
|
||||||
|
Log.d(MainActivity.APP_TAG, "surfaceChanged");
|
||||||
|
|
||||||
|
surface = holder.getSurface();
|
||||||
|
|
||||||
|
currentWidth = width;
|
||||||
|
currentHeight = height;
|
||||||
|
surfaceReady = true;
|
||||||
|
|
||||||
|
onNativeResize(width, height);
|
||||||
|
onNativeSurfaceChanged();
|
||||||
|
|
||||||
|
NativeMainThread.getInstance().start();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void surfaceDestroyed(SurfaceHolder holder) {
|
||||||
|
Log.d(MainActivity.APP_TAG, "surfaceDestroyed");
|
||||||
|
surface = null;
|
||||||
|
surfaceReady = false;
|
||||||
|
|
||||||
|
onNativeSurfaceDestroyed();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTouch(View view, MotionEvent event) {
|
||||||
|
gestureDetector.onTouchEvent(event);
|
||||||
|
/* Ref: http://developer.android.com/training/gestures/multi.html */
|
||||||
|
final int pointerCount = event.getPointerCount();
|
||||||
|
int action = event.getActionMasked();
|
||||||
|
int i = -1;
|
||||||
|
float x,y;
|
||||||
|
|
||||||
|
switch(action) {
|
||||||
|
case MotionEvent.ACTION_MOVE:
|
||||||
|
for (i = 0; i < pointerCount; i++) {
|
||||||
|
x = event.getX(i);
|
||||||
|
y = event.getY(i);
|
||||||
|
onNativeTouch(action, x, y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MotionEvent.ACTION_UP:
|
||||||
|
case MotionEvent.ACTION_DOWN:
|
||||||
|
// Primary pointer up/down, the index is always zero
|
||||||
|
i = 0;
|
||||||
|
case MotionEvent.ACTION_POINTER_UP:
|
||||||
|
case MotionEvent.ACTION_POINTER_DOWN:
|
||||||
|
// Non primary pointer up/down
|
||||||
|
if (i == -1) {
|
||||||
|
i = event.getActionIndex();
|
||||||
|
}
|
||||||
|
|
||||||
|
x = event.getX(i);
|
||||||
|
y = event.getY(i);
|
||||||
|
onNativeTouch(action, x, y);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Surface getSurface() {
|
||||||
|
return surface;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSurfaceReady() {
|
||||||
|
return surfaceReady;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Native methods implemented on C++
|
||||||
|
*/
|
||||||
|
public native void onNativeSurfaceChanged();
|
||||||
|
public native void onNativeSurfaceDestroyed();
|
||||||
|
public native void onNativeResize(int width, int height);
|
||||||
|
public native void onNativeTouch(int actionType, float x, float y);
|
||||||
|
}
|
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 243 B |
Before Width: | Height: | Size: 373 B After Width: | Height: | Size: 387 B |
Before Width: | Height: | Size: 397 B After Width: | Height: | Size: 444 B |
Before Width: | Height: | Size: 412 B After Width: | Height: | Size: 362 B |
Before Width: | Height: | Size: 418 B After Width: | Height: | Size: 373 B |
Before Width: | Height: | Size: 392 B After Width: | Height: | Size: 397 B |
Before Width: | Height: | Size: 399 B After Width: | Height: | Size: 412 B |
Before Width: | Height: | Size: 400 B After Width: | Height: | Size: 418 B |
Before Width: | Height: | Size: 402 B After Width: | Height: | Size: 399 B |
Before Width: | Height: | Size: 423 B After Width: | Height: | Size: 402 B |
Before Width: | Height: | Size: 387 B After Width: | Height: | Size: 392 B |
Before Width: | Height: | Size: 444 B After Width: | Height: | Size: 400 B |
Before Width: | Height: | Size: 283 B After Width: | Height: | Size: 283 B |
Before Width: | Height: | Size: 283 B After Width: | Height: | Size: 283 B |
@@ -30,7 +30,7 @@ locale = {
|
|||||||
["4c) False Report to Gamemaster"] = false,
|
["4c) False Report to Gamemaster"] = false,
|
||||||
["Accept"] = "Annehmen",
|
["Accept"] = "Annehmen",
|
||||||
["Account name"] = "Benutzername",
|
["Account name"] = "Benutzername",
|
||||||
["Account Status"] = false,
|
["Account Status:"] = false,
|
||||||
["Action:"] = false,
|
["Action:"] = false,
|
||||||
["Add"] = "Hinzuf<EFBFBD>gen",
|
["Add"] = "Hinzuf<EFBFBD>gen",
|
||||||
["Add new VIP"] = "Neuen Freund hinzuf<75>gen",
|
["Add new VIP"] = "Neuen Freund hinzuf<75>gen",
|
||||||
@@ -231,7 +231,7 @@ locale = {
|
|||||||
["Pass Leadership to %s"] = "%s zum Anf<6E>hrer ernennen",
|
["Pass Leadership to %s"] = "%s zum Anf<6E>hrer ernennen",
|
||||||
["Password"] = "Passwort",
|
["Password"] = "Passwort",
|
||||||
["Piece Price:"] = "St<EFBFBD>ckpreis",
|
["Piece Price:"] = "St<EFBFBD>ckpreis",
|
||||||
["Please enter a character name"] = "Bitte gib einen Charakternamen an",
|
["Please enter a character name:"] = "Bitte gib einen Charakternamen an:",
|
||||||
["Please, press the key you wish to add onto your hotkeys manager"] = "Bitte die gew<65>nschte Taste dr<64>cken",
|
["Please, press the key you wish to add onto your hotkeys manager"] = "Bitte die gew<65>nschte Taste dr<64>cken",
|
||||||
["Please Select"] = false,
|
["Please Select"] = false,
|
||||||
["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!"] = false,
|
||||||
|
@@ -13,14 +13,14 @@ locale = {
|
|||||||
|
|
||||||
translation = {
|
translation = {
|
||||||
["1a) Offensive Name"] = "1a) Nombre ofensivo",
|
["1a) Offensive Name"] = "1a) Nombre ofensivo",
|
||||||
["1b) Invalid Name Format"] = "1b) Formato inv<EFBFBD>lido para el nombre",
|
["1b) Invalid Name Format"] = "1b) Formato invalido para nombre",
|
||||||
["1c) Unsuitable Name"] = "1c) Nombre no adecuado",
|
["1c) Unsuitable Name"] = "1c) Nombre no adecuado",
|
||||||
["1d) Name Inciting Rule Violation"] = "1d) Nombre que incita una violaci<63>n al reglamento",
|
["1d) Name Inciting Rule Violation"] = "1d) Nombre que incita una violaci<63>n al reglamento",
|
||||||
["2a) Offensive Statement"] = "2a) Comentario ofensivo",
|
["2a) Offensive Statement"] = "2a) Comentario ofensivo",
|
||||||
["2b) Spamming"] = "2b) Spamming",
|
["2b) Spamming"] = "2b) Spamming",
|
||||||
["2c) Illegal Advertising"] = "2c) Publicidad il<69>cita",
|
["2c) Illegal Advertising"] = "2c) Publicidad il<69>cita",
|
||||||
["2d) Off-Topic Public Statement"] = "2d) Publicaci<63>n fuera de lugar",
|
["2d) Off-Topic Public Statement"] = "2d) Publicaci<63>n fuera de lugar",
|
||||||
["2e) Non-English Public Statement"] = "2e) Publicaci<63>n fuera del ingl<EFBFBD>s",
|
["2e) Non-English Public Statement"] = "2e) Publicaci<63>n fuera del ingles",
|
||||||
["2f) Inciting Rule Violation"] = "2f) Incitar a una violaci<63>n al reglamento",
|
["2f) Inciting Rule Violation"] = "2f) Incitar a una violaci<63>n al reglamento",
|
||||||
["3a) Bug Abuse"] = "3a) Abuso de error",
|
["3a) Bug Abuse"] = "3a) Abuso de error",
|
||||||
["3b) Game Weakness Abuse"] = "3b) Abuso de debilidad del juego",
|
["3b) Game Weakness Abuse"] = "3b) Abuso de debilidad del juego",
|
||||||
@@ -28,12 +28,12 @@ locale = {
|
|||||||
["3d) Hacking"] = "3d) Hackeo",
|
["3d) Hacking"] = "3d) Hackeo",
|
||||||
["3e) Multi-Clienting"] = "3e) Uso de m<>ltiples clientes",
|
["3e) Multi-Clienting"] = "3e) Uso de m<>ltiples clientes",
|
||||||
["3f) Account Trading or Sharing"] = "3f) Intercambio de cuenta",
|
["3f) Account Trading or Sharing"] = "3f) Intercambio de cuenta",
|
||||||
["4a) Threatening Gamemaster"] = "4a) Amenazar a un Gamemaster",
|
["4a) Threatening Gamemaster"] = "4a) Amenzar a un Gamemaster",
|
||||||
["4b) Pretending to Have Influence on Rule Enforcement"] = "4b) Pretender tener influencia en una parte del reglamento",
|
["4b) Pretending to Have Influence on Rule Enforcement"] = "4b) Pretender tener influencia en una parte del reglamento",
|
||||||
["4c) False Report to Gamemaster"] = "4c) Reporte falso a un Gamemaster",
|
["4c) False Report to Gamemaster"] = "4c) Reporte falso a un Gamemaster",
|
||||||
["Accept"] = "Aceptar",
|
["Accept"] = "Aceptar",
|
||||||
["Account name"] = "Nombre de la cuenta",
|
["Account name"] = "Nombre de cuenta",
|
||||||
["Account Status"] = "Estado de la cuenta",
|
["Account Status:"] = "Estado de cuenta:",
|
||||||
["Action:"] = "Acci<EFBFBD>n:",
|
["Action:"] = "Acci<EFBFBD>n:",
|
||||||
["Add"] = "A<EFBFBD>adir",
|
["Add"] = "A<EFBFBD>adir",
|
||||||
["Add new VIP"] = "A<EFBFBD>adir nuevo VIP",
|
["Add new VIP"] = "A<EFBFBD>adir nuevo VIP",
|
||||||
@@ -44,14 +44,14 @@ locale = {
|
|||||||
["Adjust volume"] = "Ajustar volumen",
|
["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!"] = "<EFBFBD>Ay! Aventurero valiente, has conocido un triste destino. \nPero no se desespere, porque los dioses te llevar<61>n de vuelta \na este mundo a cambio de un peque<75>o sacrificio \n\nSimplemente haga clic en Aceptar para continuar con sus viajes!",
|
["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, has conocido un triste destino. \nPero no se desespere, porque los dioses te llevar<61>n de vuelta \na este mundo a cambio de un peque<75>o sacrificio \n\nSimplemente haga clic en Aceptar para continuar con sus viajes!",
|
||||||
["All"] = "Todo",
|
["All"] = "Todo",
|
||||||
["All modules and scripts were reloaded."] = "Todos los m<>dulos y scripts se volvieron a cargar.",
|
["All modules and scripts were reloaded."] = "Todos los m<>dulos y scripts se vuelven a cargar.",
|
||||||
["Allow auto chase override"] = "Desactivar auto persecuci<63>n al andar",
|
["Allow auto chase override"] = "Permitur auto persecuci<63>n override",
|
||||||
["Also known as dash in tibia community, recommended\nfor playing characters with high speed"] = "Conocido por la comunidad de tibia como \"dash\".\nRecomenada para jugadores de alto nivel.",
|
["Also known as dash in tibia community, recommended\nfor playing characters with high speed"] = "Conocido por la comunidad de tibia como dash.\nRecomenada para jugadores de alto nivel.",
|
||||||
["Ambient light: %s%%"] = "Luz de ambiente: %s%%",
|
["Ambient light: %s%%"] = "Ambiente de luz: %s%%",
|
||||||
["Amount:"] = "Cantidad:",
|
["Amount:"] = "Cantidad:",
|
||||||
["Amount"] = "Cantidad",
|
["Amount"] = "Cantidad",
|
||||||
["Anonymous"] = "An<EFBFBD>nimo",
|
["Anonymous"] = "An<EFBFBD>nimo",
|
||||||
["Are you sure you want to logout?"] = "<EFBFBD>Est<EFBFBD>s seguro de que deseas salir?",
|
["Are you sure you want to logout?"] = "<EFBFBD>Estas seguro de que deseas salir?",
|
||||||
["Attack"] = "Atacar",
|
["Attack"] = "Atacar",
|
||||||
["Author"] = "Autor",
|
["Author"] = "Autor",
|
||||||
["Autoload"] = "Auto carga",
|
["Autoload"] = "Auto carga",
|
||||||
@@ -60,26 +60,26 @@ locale = {
|
|||||||
["Auto login selected character on next charlist load"] = "Ingresar la siguiente vez que aparece el charlist con el personaje seleccionado",
|
["Auto login selected character on next charlist load"] = "Ingresar la siguiente vez que aparece el charlist con el personaje seleccionado",
|
||||||
["Axe Fighting"] = "Combate con hacha",
|
["Axe Fighting"] = "Combate con hacha",
|
||||||
["Balance:"] = "Saldo:",
|
["Balance:"] = "Saldo:",
|
||||||
["Banishment"] = "Baneo",
|
["Banishment"] = "Banishment",
|
||||||
["Banishment + Final Warning"] = "Baneo + <20>ltimo Aviso",
|
["Banishment + Final Warning"] = "Banishment + Final Warning",
|
||||||
["Battle"] = "Batalla",
|
["Battle"] = "Batalla",
|
||||||
["Browse"] = "Navegar",
|
["Browse"] = "Navegar",
|
||||||
["Bug report sent."] = "Reporte de error enviado.",
|
["Bug report sent."] = "Reporte de error enviado.",
|
||||||
["Button Assign"] = "Asignar bot<6F>n",
|
["Button Assign"] = "Bot<EFBFBD>n asignado",
|
||||||
["Buy"] = "Compra",
|
["Buy"] = "Compra",
|
||||||
["Buy Now"] = "Compra ahora",
|
["Buy Now"] = "Compra ahora",
|
||||||
["Buy Offers"] = "Comprar ofertas",
|
["Buy Offers"] = "Comprar oferta",
|
||||||
["Buy with backpack"] = "Comprar con mochila",
|
["Buy with backpack"] = "Comprar con mochila",
|
||||||
["Cancel"] = "Cancelar",
|
["Cancel"] = "Cancelar",
|
||||||
["Cannot login while already in game."] = "No se puede iniciar sesi<73>n, mientras ya est<73>s en el juego.",
|
["Cannot login while already in game."] = "No se puede iniciar sesi<73>n, mientras que est<73>s en el juego.",
|
||||||
["Cap"] = "Cap",
|
["Cap"] = "Cap",
|
||||||
["Capacity"] = "Capacidad",
|
["Capacity"] = "Capacidad",
|
||||||
["Center"] = "Centrar",
|
["Center"] = "Centrar",
|
||||||
["Channels"] = "Canales",
|
["Channels"] = "Canales",
|
||||||
["Character List"] = "Lista de caracteres",
|
["Character List"] = "Lista de car<EFBFBD>cter",
|
||||||
["Classic control"] = "Controles cl<EFBFBD>sicos",
|
["Classic control"] = "Controles Cl<EFBFBD>sicos",
|
||||||
["Clear current message window"] = "Limpiar ventana de mensajes actual",
|
["Clear current message window"] = "Limpiar mensaje actual en ventana",
|
||||||
["Clear Messages"] = "Limpiar mensajes",
|
["Clear Messages"] = "Limpiar mensaje",
|
||||||
["Clear object"] = "Limpiar objeto",
|
["Clear object"] = "Limpiar objeto",
|
||||||
["Client needs update."] = "El cliente necesita una actualizaci<63>n.",
|
["Client needs update."] = "El cliente necesita una actualizaci<63>n.",
|
||||||
["Close"] = "Cerrar",
|
["Close"] = "Cerrar",
|
||||||
@@ -87,10 +87,10 @@ locale = {
|
|||||||
["Club Fighting"] = "Combate con mazo",
|
["Club Fighting"] = "Combate con mazo",
|
||||||
["Combat Controls"] = "Controles de combate",
|
["Combat Controls"] = "Controles de combate",
|
||||||
["Comment:"] = "Comentario:",
|
["Comment:"] = "Comentario:",
|
||||||
["Connecting to game server..."] = "Conectando a servidor de juego...",
|
["Connecting to game server..."] = "Conectando a servidor game...",
|
||||||
["Connecting to login server..."] = "Conectando a servidor de login...",
|
["Connecting to login server..."] = "Conectando a servidor login...",
|
||||||
["Console"] = "Consola",
|
["Console"] = "Consola",
|
||||||
["Cooldowns"] = "Enfriamientos",
|
["Cooldowns"] = "Descansos",
|
||||||
["Copy message"] = "Copiar mensaje",
|
["Copy message"] = "Copiar mensaje",
|
||||||
["Copy name"] = "Copiar nombre",
|
["Copy name"] = "Copiar nombre",
|
||||||
["Copy Name"] = "Copiar nombre",
|
["Copy Name"] = "Copiar nombre",
|
||||||
@@ -122,7 +122,7 @@ locale = {
|
|||||||
["Enable vertical synchronization"] = "Habilitar sincronizaci<63>n vertical",
|
["Enable vertical synchronization"] = "Habilitar sincronizaci<63>n vertical",
|
||||||
["Enable walk booster"] = "Habilitar caminado turbo",
|
["Enable walk booster"] = "Habilitar caminado turbo",
|
||||||
["Enter Game"] = "Entrar al juego",
|
["Enter Game"] = "Entrar al juego",
|
||||||
["Enter one name per line."] = "Introducir un nombre por l<EFBFBD>nea.",
|
["Enter one name per line."] = "Introducir un nombre por linea.",
|
||||||
["Enter with your account again to update your client."] = "Ingrese con su cuenta nuevamente para actualizar el cliente.",
|
["Enter with your account again to update your client."] = "Ingrese con su cuenta nuevamente para actualizar el cliente.",
|
||||||
["Error"] = "Error",
|
["Error"] = "Error",
|
||||||
["Error"] = "Error",
|
["Error"] = "Error",
|
||||||
@@ -130,18 +130,18 @@ locale = {
|
|||||||
["Exclude from private chat"] = "Ejecutar desde un canal privado",
|
["Exclude from private chat"] = "Ejecutar desde un canal privado",
|
||||||
["Exit"] = "Salir",
|
["Exit"] = "Salir",
|
||||||
["Experience"] = "Experiencia",
|
["Experience"] = "Experiencia",
|
||||||
["Filter list to match your level"] = "Filtrar lista para coincidir con el nivel",
|
["Filter list to match your level"] = "Lista de filtros que coincida con el nivel",
|
||||||
["Filter list to match your vocation"] = "Filtrar lsta para coincidir con la vocaci<63>n",
|
["Filter list to match your vocation"] = "Lista de filtros que coincida con el vocaci<63>n",
|
||||||
["Find:"] = "Encontrar:",
|
["Find:"] = "Encontrar:",
|
||||||
["Fishing"] = "Pesca",
|
["Fishing"] = "Pesca",
|
||||||
["Fist Fighting"] = "Combate a pu<70>os",
|
["Fist Fighting"] = "Combate con pu<70>os",
|
||||||
["Follow"] = "Seguir",
|
["Follow"] = "Seguir",
|
||||||
["Force Exit"] = "Forzar Salir", -- "Forzar Salida" is almost too big for a button
|
["Force Exit"] = "Forzar salida",
|
||||||
["For Your Information"] = "Para tu informaci<63>n",
|
["For Your Information"] = "Para tu informaci<63>n",
|
||||||
["Free Account"] = "Cuenta gratis",
|
["Free Account"] = "Cuenta gratis",
|
||||||
["Fullscreen"] = "Pantalla completa",
|
["Fullscreen"] = "Pantalla completa",
|
||||||
["Game"] = "Juego",
|
["Game"] = "Juego",
|
||||||
["Game framerate limit: %s"] = "L<EFBFBD>mite de cuadros por segundo en el juego: %s",
|
["Game framerate limit: %s"] = "Limite de cuadros por segundo en el juego: %s",
|
||||||
["Graphics"] = "Gr<EFBFBD>ficos",
|
["Graphics"] = "Gr<EFBFBD>ficos",
|
||||||
["Graphics card driver not detected"] = "Controlador de tarjeta gr<67>fica de video no detectado",
|
["Graphics card driver not detected"] = "Controlador de tarjeta gr<67>fica de video no detectado",
|
||||||
["Graphics Engine:"] = "Motor Gr<47>fico:",
|
["Graphics Engine:"] = "Motor Gr<47>fico:",
|
||||||
@@ -155,32 +155,32 @@ locale = {
|
|||||||
["Hide Offline"] = "Ocultar fuera de linea",
|
["Hide Offline"] = "Ocultar fuera de linea",
|
||||||
["Hide party members"] = "Ocultar miembros del party",
|
["Hide party members"] = "Ocultar miembros del party",
|
||||||
["Hide players"] = "Ocultar players",
|
["Hide players"] = "Ocultar players",
|
||||||
["Hide spells for higher exp. levels"] = "Ocultar hechizos para niveles m<EFBFBD>s altos que tu experiencia.",
|
["Hide spells for higher exp. levels"] = "Ocultar hechizos para niveles mas altos que tu experiencia.",
|
||||||
["Hide spells for other vocations"] = "Ocultar hechizos que sean para otra vocaci<63>n",
|
["Hide spells for other vocations"] = "Ocultar hechizos 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"] = "Mantenga presionado el bot<6F>n derecho del rat<61>n para navegar\nDesplace la rueda central del rat<61>n para ampliar\nbot<EFBFBD>n derecho del rat<EFBFBD>n para crear marcas del mapa",
|
["Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks"] = "Mantenga presionado el bot<6F>n derecho del rat<61>n para navegar\nDezplaze la rueda central del rat<61>n para ampliar\nbot<EFBFBD>n derecho del mouse para crear marcas del mapa",
|
||||||
["Hotkeys"] = "Hotkeys",
|
["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."] = "Si se cierra el programa, su personaje puede permanecer en el juego.\nHaga clic en 'Desconectar' para asegurarse de que el personaje deja el juego correctamente.\nHaga clic en 'Forzar Salir' si desea salir del programa igualmente, pudiendo mantener el personaje en el juego.",
|
["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.\nHaga click en 'Salir' si desea salir del programa sin tener que salir de tu personaje.",
|
||||||
["Ignore"] = "Ignorar",
|
["Ignore"] = "Ignorar",
|
||||||
["Ignore capacity"] = "Ignorar capacidad",
|
["Ignore capacity"] = "Ignorar Capacidad",
|
||||||
["Ignored players:"] = "Jugadores ignorados:",
|
["Ignored players:"] = "Jugadores ignorados:",
|
||||||
["Ignore equipped"] = "Ignorar lo equipado",
|
["Ignore equipped"] = "Ignorar lo equipado",
|
||||||
["Ignore List"] = "Ignorar lista",
|
["Ignore List"] = "Ignorar lista",
|
||||||
["Ignore players"] = "Ignorar jugadores",
|
["Ignore players"] = "Ignorar jugadores",
|
||||||
["Ignore Private Messages"] = "Ignorar mensajes privados",
|
["Ignore Private Messages"] = "Ignorar mensajes privados",
|
||||||
["Ignore Yelling"] = "Ignorar gritos",
|
["Ignore Yelling"] = "Ignorar gritos",
|
||||||
["Interface framerate limit: %s"] = "Interfaz de cuadros por segundo: %s",
|
["Interface framerate limit: %s"] = "Interface de cuadros por segundo: %s",
|
||||||
["Inventory"] = "Inventario",
|
["Inventory"] = "Inventario",
|
||||||
["Invite to Party"] = "Invitar a party",
|
["Invite to Party"] = "Ivitar al party",
|
||||||
["Invite to private chat"] = "Invitar a canal privado",
|
["Invite to private chat"] = "Invitar a canal privado",
|
||||||
["IP Address Banishment"] = "Direcci<EFBFBD>n IP Baneada",
|
["IP Address Banishment"] = "Banishment - Direcci<EFBFBD>n IP",
|
||||||
["Item Offers"] = "Ofertas de objetos",
|
["Item Offers"] = "Ofertas de objetos",
|
||||||
["It is empty."] = "Est<EFBFBD> vac<61>o.",
|
["It is empty."] = "Est<EFBFBD> vaci<EFBFBD>.",
|
||||||
["Join %s\'s Party"] = "Unirse al party de %s",
|
["Join %s\'s Party"] = "Unirse al party de %s ",
|
||||||
["Leave Party"] = "Dejar el party",
|
["Leave Party"] = "Dejar el party",
|
||||||
["Level"] = "Nivel",
|
["Level"] = "Nivel",
|
||||||
["Lifetime Premium Account"] = "Tiempo de Premium Account infinito",
|
["Lifetime Premium Account"] = "Tiempo de Premium Account infinito",
|
||||||
["Limits FPS to 60"] = "L<EFBFBD>mites FPS a 60",
|
["Limits FPS to 60"] = "Limites FPS a 60",
|
||||||
["List of items that you're able to buy"] = "Lista de objetos que puedes de 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 puedes de vender",
|
["List of items that you're able to sell"] = "Lista de objetos que puedes de vender",
|
||||||
["Load"] = "Cargar",
|
["Load"] = "Cargar",
|
||||||
@@ -188,44 +188,44 @@ locale = {
|
|||||||
["Login"] = "Ingresar",
|
["Login"] = "Ingresar",
|
||||||
["Login Error"] = "Error de ingreso",
|
["Login Error"] = "Error de ingreso",
|
||||||
["Login Error"] = "Error de ingreso",
|
["Login Error"] = "Error de ingreso",
|
||||||
["Logout"] = "Desconectar",
|
["Logout"] = "Salir",
|
||||||
["Look"] = "Mirar",
|
["Look"] = "Mirar",
|
||||||
["Magic Level"] = "Nivel m<>gico",
|
["Magic Level"] = "Nivel m<>gico",
|
||||||
["Make sure that your client uses\nthe correct game protocol version"] = "Aseg<EFBFBD>rese de que el cliente este utilizando\nla versi<73>n del protocolo correcta",
|
["Make sure that your client uses\nthe correct game protocol version"] = "Aseg<EFBFBD>rese de que el cliente este utilizando\nes el versi<73>n del protocolo adecuado",
|
||||||
["Mana"] = "Mana",
|
["Mana"] = "Mana",
|
||||||
["Manage hotkeys:"] = "Administrador de hotkeys:",
|
["Manage hotkeys:"] = "Administrador de hotkeys:",
|
||||||
["Market"] = "Mercado",
|
["Market"] = "Mercado",
|
||||||
["Market Offers"] = "Ofertas del mercado",
|
["Market Offers"] = "Ofertas en mercado",
|
||||||
["Message of the day"] = "Mensaje del d<>a",
|
["Message of the day"] = "Mensaje del d<>a",
|
||||||
["Message to "] = "Mensaje a ",
|
["Message to "] = "Mensaje a",
|
||||||
["Message to %s"] = "Mensaje a %s",
|
["Message to %s"] = "Mensaje a %s",
|
||||||
["Minimap"] = "Minimapa",
|
["Minimap"] = "Minimapa",
|
||||||
["Module Manager"] = "Administrador de m<>dulos",
|
["Module Manager"] = "Administrador de m<>dulos",
|
||||||
["Module name"] = "Nombre del m<EFBFBD>dulo",
|
["Module name"] = "Nombre del modulo",
|
||||||
["Mount"] = "Montar", --"Montura" if it doesn't refers to the verb
|
["Mount"] = "Montar", --Unique name?
|
||||||
["Move Stackable Item"] = "Mover objeto apilable",
|
["Move Stackable Item"] = "Mover objeto apilable",
|
||||||
["Move up"] = "Mover arriba",
|
["Move up"] = "Mover arriba",
|
||||||
["My Offers"] = "Mis ofertas",
|
["My Offers"] = "Mis ofertas",
|
||||||
["Name:"] = "Nombre:",
|
["Name:"] = "Nombre:",
|
||||||
["Name Report"] = "Reportar nombre",
|
["Name Report"] = "Name Report",
|
||||||
["Name Report + Banishment"] = "Reportar nombre + Baneo",
|
["Name Report + Banishment"] = "Name Report + Banishment",
|
||||||
["Name Report + Banishment + Final Warning"] = "Reportar nombre + Baneo + <20>ltimo Aviso",
|
["Name Report + Banishment + Final Warning"] = "Name Report + Banishment + Final Warning",
|
||||||
["No"] = "No",
|
["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."] = "No se ha detectado una tarjeta gr<67>fica y todo sera procesado por tu procesador,\npor lo tanto el rendimiento va a ser muy malo.\nPor favor, actualice su controlador de la gr<EFBFBD>fica para tener un rendimiento <EFBFBD>ptimo.",
|
["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 se ha detectado una tarjeta gr<67>fica y todo sera procesado por tu procesador,\npor lo tanto el rendimiento va a ser muy malo.\nPor favor, actualice su controlador de gr<67>ficos para tener un rendimiento optimo.",
|
||||||
["No item selected."] = "No hay elemento seleccionado.",
|
["No item selected."] = "No hay elemento seleccionado.",
|
||||||
["No Mount"] = "No montura", --probably "Sin" instead of "No" is more fitting?
|
["No Mount"] = "No montura",
|
||||||
["No Outfit"] = "No outfit",
|
["No Outfit"] = "No outfit",
|
||||||
["No statement has been selected."] = "No se ha seleccionado ning<6E>n comentario.",
|
["No statement has been selected."] = "No hay comentario seleccionado.",
|
||||||
["Notation"] = "Notaci<EFBFBD>n",
|
["Notation"] = "Notation",
|
||||||
["NPC Trade"] = "Intercambio con NPC",
|
["NPC Trade"] = "Intercambio con NPC",
|
||||||
["Offer History"] = "Historial de ofertas",
|
["Offer History"] = "Historial de oferta",
|
||||||
["Offers"] = "Ofertas",
|
["Offers"] = "Ofertas",
|
||||||
["Offer Type:"] = "Tipo de oferta:",
|
["Offer Type:"] = "Tipo de oferta:",
|
||||||
["Offline Training"] = "Entrenamiento offLine",
|
["Offline Training"] = "Entrenamiento offLine",
|
||||||
["Ok"] = "OK",
|
["Ok"] = "OK",
|
||||||
["on %s.\n"] = "en %s.\n",
|
["on %s.\n"] = "en %s.\n",
|
||||||
["Open"] = "Abrir",
|
["Open"] = "Abierto",
|
||||||
["Open a private message channel:"] = "Abrir canal privado:",
|
["Open a private message channel:"] = "Abrir mensaje en canal privado:",
|
||||||
["Open charlist automatically when starting client"] = "Abrir lista de jugadores autom<6F>ticamente al iniciar el cliente",
|
["Open charlist automatically when starting client"] = "Abrir lista de jugadores autom<6F>ticamente al iniciar el cliente",
|
||||||
["Open in new window"] = "Abrir en nueva ventana",
|
["Open in new window"] = "Abrir en nueva ventana",
|
||||||
["Open new channel"] = "Abrir nuevo canal",
|
["Open new channel"] = "Abrir nuevo canal",
|
||||||
@@ -234,21 +234,21 @@ locale = {
|
|||||||
["Pass Leadership to %s"] = "Pasar liderazgo a %s",
|
["Pass Leadership to %s"] = "Pasar liderazgo a %s",
|
||||||
["Password"] = "Contrase<EFBFBD>a",
|
["Password"] = "Contrase<EFBFBD>a",
|
||||||
["Piece Price:"] = "Precio por pieza:",
|
["Piece Price:"] = "Precio por pieza:",
|
||||||
["Please enter a character name"] = "Por favor ingresa nombre del jugador",
|
["Please enter a character name:"] = "Por favor ingresar nombre del jugador:",
|
||||||
["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, 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"] = "Por favor seleccione",
|
["Please Select"] = "Por favor seleccione",
|
||||||
["Please use this dialog to only report bugs. Do not report rule violations here!"] = "Por favor usa este di<64>logo s<EFBFBD>lo para reportar errores.\n<EFBFBD>No reportar violaciones del reglamento aqu<71>!",
|
["Please use this dialog to only report bugs. Do not report rule violations here!"] = "Por favor usa este di<64>logo solo para reportar errores.\n<EFBFBD>No reportar violaciones del reglamento aqu<71>!",
|
||||||
["Please wait"] = "Por favor espere",
|
["Please wait"] = "Por favor espere",
|
||||||
["Port"] = "Puerto",
|
["Port"] = "Puerto",
|
||||||
["Position:"] = "Posici<EFBFBD>n:",
|
["Position:"] = "Posici<EFBFBD>n:",
|
||||||
["Position: %i %i %i"] = "Posici<EFBFBD>n: %i %i %i",
|
["Position: %i %i %i"] = "Posici<EFBFBD>n: %i %i %i",
|
||||||
["Premium Account (%s) days left"] = "Quedan (%s) d<>as de Premium Account",
|
["Premium Account (%s) days left"] = "Tienes (%s) d<>as de Premium Account restantes",
|
||||||
["Price:"] = "Precio:",
|
["Price:"] = "Precio:",
|
||||||
["Primary"] = "Primario",
|
["Primary"] = "Primario",
|
||||||
["Protocol"] = "Protocolo",
|
["Protocol"] = "Protocolo",
|
||||||
["Quest Log"] = "Quest Log", --Unique name
|
["Quest Log"] = "Quest Log", --Unique name
|
||||||
["Randomize"] = "Aleatorio",
|
["Randomize"] = "Combinar",
|
||||||
["Randomize characters outfit"] = "Crear vestimenta del jugador aleatoriamente",
|
["Randomize characters outfit"] = "Combinar vestimenta del jugador",
|
||||||
["Reason:"] = "Raz<EFBFBD>n:",
|
["Reason:"] = "Raz<EFBFBD>n:",
|
||||||
["Refresh"] = "Refrescar",
|
["Refresh"] = "Refrescar",
|
||||||
["Refresh Offers"] = "Refrescar ofertas",
|
["Refresh Offers"] = "Refrescar ofertas",
|
||||||
@@ -257,10 +257,10 @@ locale = {
|
|||||||
["Reload All"] = "Cargar todo de nuevo",
|
["Reload All"] = "Cargar todo de nuevo",
|
||||||
["Remember account and password when starts client"] = "Recordar cuenta y contrase<73>a al iniciar el cliente",
|
["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"] = "Eliminar",
|
["Remove"] = "Remover",
|
||||||
["Remove %s"] = "Eliminar %s",
|
["Remove %s"] = "Remover %s",
|
||||||
["Report Bug"] = "Reportar error",
|
["Report Bug"] = "Reportar error",
|
||||||
["Reserved for more functionality later."] = "Reservado para una funcionalidad futura.",
|
["Reserved for more functionality later."] = "Reservado para una funci<EFBFBD>n futura.",
|
||||||
["Reset Market"] = "Reiniciar mercado",
|
["Reset Market"] = "Reiniciar mercado",
|
||||||
["Revoke %s\'s Invitation"] = "Anular %s\'s invitaci<63>n",
|
["Revoke %s\'s Invitation"] = "Anular %s\'s invitaci<63>n",
|
||||||
["Rotate"] = "Rotar",
|
["Rotate"] = "Rotar",
|
||||||
@@ -272,7 +272,7 @@ locale = {
|
|||||||
["Secondary"] = "Secundario",
|
["Secondary"] = "Secundario",
|
||||||
["Select object"] = "Seleccionar objeto",
|
["Select object"] = "Seleccionar objeto",
|
||||||
["Select Outfit"] = "Seleccionar outfit",
|
["Select Outfit"] = "Seleccionar outfit",
|
||||||
["Select your language"] = "Seleccionar tu idioma",
|
["Select your language"] = "Selectionar tu lenguaje",
|
||||||
["Sell"] = "Vender",
|
["Sell"] = "Vender",
|
||||||
["Sell Now"] = "Vender ahora",
|
["Sell Now"] = "Vender ahora",
|
||||||
["Sell Offers"] = "Ofertas de venta",
|
["Sell Offers"] = "Ofertas de venta",
|
||||||
@@ -300,85 +300,82 @@ locale = {
|
|||||||
["Show timestamps in console"] = "Mostrar marcas de tiempo en consola",
|
["Show timestamps in console"] = "Mostrar marcas de tiempo en consola",
|
||||||
["Show your depot items only"] = "Mostrar solo tus objetos en depot",
|
["Show your depot items only"] = "Mostrar solo tus objetos en depot",
|
||||||
["Skills"] = "Habilidades",
|
["Skills"] = "Habilidades",
|
||||||
["Sort by name"] = "Ordenar por nombre",
|
["Soul"] = "Soul",
|
||||||
["Sort by status"] = "Ordenar por estado",
|
["Soul Points"] = "Puntos de Soul", --I'm leaving these as is because its a unique name, if you want to change it it can be "Alma" or "Esp<73>ritu"
|
||||||
["Sort by type"] = "Ordernar por tipo",
|
|
||||||
["Soul"] = "Soul", --I'm leaving these as is because its a unique name, if you want to change it it can be "Alma" or "Esp<73>ritu"
|
|
||||||
["Soul Points"] = "Puntos de Soul",
|
|
||||||
["Special"] = "Especial",
|
["Special"] = "Especial",
|
||||||
["Speed"] = "Velocidad",
|
["Speed"] = "Velocidad",
|
||||||
["Spell Cooldowns"] = "Enfriamiento de hechizos", --Should 'spells'? be an unique name?
|
["Spell Cooldowns"] = "Spells Cooldowns", --Could be "Tiempo de recarga para los hechizos".
|
||||||
["Spell List"] = "Lista de hechizos",
|
["Spell List"] = "Lista de hechizos",
|
||||||
["Stamina"] = "Resistencia",
|
["Stamina"] = "Resistencia",
|
||||||
["Statement:"] = "Comentario:",
|
["Statement:"] = "Comentario:",
|
||||||
["Statement Report"] = "Statement Report", --Could be "reporte del comentario"/Not sure how to translate it correctly.. When is it used in the game?
|
["Statement Report"] = "Statement Report", --Could be "reporte del comentario"
|
||||||
["Statistics"] = "Estad<EFBFBD>sticas",
|
["Statistics"] = "Estad<EFBFBD>sticas",
|
||||||
["Stop Attack"] = "Detener ataque",
|
["Stop Attack"] = "Detener ataque",
|
||||||
["Stop Follow"] = "Detener persecuci<63>n",
|
["Stop Follow"] = "Detener persecuci<63>n",
|
||||||
["Support"] = "Soporte",
|
["Support"] = "Soporte",
|
||||||
["%s: (use object)"] = "%s: (usar objeto)",
|
["%s: (use object)"] = "%s: (usar objeto)",
|
||||||
["%s: (use object on target)"] = "%s: (usar objeto en un 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 punto de mira)",
|
["%s: (use object with crosshair)"] = "%s: (usar objeto con punto de mira)",
|
||||||
["Sword Fighting"] = "Combate con espada",
|
["Sword Fighting"] = "Combate de espada",
|
||||||
["Terminal"] = "Terminal",
|
["Terminal"] = "Terminal",
|
||||||
["There is no way."] = "No hay forma de llegar.",
|
["There is no way."] = "No hay ninguna manera.",
|
||||||
["Title"] = "T<EFBFBD>tulo",
|
["Title"] = "Titulo",
|
||||||
["Total Price:"] = "Precio total:",
|
["Total Price:"] = "Total total:",
|
||||||
["Trade"] = "Intercambio",
|
["Trade"] = "Intercambio",
|
||||||
["Trade with ..."] = "Intercambiar con ...",
|
["Trade with ..."] = "Intercambiar con ...",
|
||||||
["Trying to reconnect in %s seconds."] = "Intentando reconectar en %s segundos.",
|
["Trying to reconnect in %s seconds."] = "",
|
||||||
["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 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'"] = "No se puede cargar el archivo spr, por favor coloque un spr v<>lido en '%s'",
|
["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 se puede cerrar sesi<73>n.",
|
["Unable to logout."] = "No se puede cerrar sesi<73>n-",
|
||||||
["Unignore"] = "Dejar de ignorar",
|
["Unignore"] = "Dejar de ignorar",
|
||||||
["Unload"] = "Desactivar", -- Should be "Descargar", but not used to prevent misunderstandings with "Download".
|
["Unload"] = "No cargado",
|
||||||
["Update needed"] = "Es necesario actualizar",
|
["Update needed"] = "Es necesario actualizar",
|
||||||
["Use"] = "Usar",
|
["Use"] = "Uso",
|
||||||
["Use on target"] = "Usar en un objetivo",
|
["Use on target"] = "Usar en un objetivo",
|
||||||
["Use on yourself"] = "Usar en mi mismo",
|
["Use on yourself"] = "Usar en mi mismo",
|
||||||
["Use with ..."] = "Usar en ...",
|
["Use with ..."] = "Usar en ...",
|
||||||
["Version"] = "Versi<EFBFBD>n",
|
["Version"] = "Versi<EFBFBD>n",
|
||||||
["VIP List"] = "Lista VIP",
|
["VIP List"] = "Lista Vip",
|
||||||
["Voc."] = "Voc.",
|
["Voc."] = "Voc.",
|
||||||
["Vocation"] = "Vocaci<EFBFBD>n",
|
["Vocation"] = "Vocaci<EFBFBD>n",
|
||||||
["Waiting List"] = "Lista de espera",
|
["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"] = "Detectar<EFBFBD> cuando caminar en diagonal en base\n a las teclas pulsadas",
|
["Will detect when to use diagonal step based on the\nkeys you are pressing"] = "Detectara cuando se camina en diagonal usando las flechas",
|
||||||
["With crosshair"] = "Con punto de mira",
|
["With crosshair"] = "Con punto de mira",
|
||||||
["Yes"] = "S<EFBFBD>",
|
["Yes"] = "Si",
|
||||||
["You are bleeding"] = "Te est<EFBFBD>s desangrando",
|
["You are bleeding"] = "Te estas desangrando",
|
||||||
["You are burning"] = "Te est<EFBFBD>s quemando",
|
["You are burning"] = "Te estas quemando",
|
||||||
["You are cursed"] = "Est<EFBFBD>s maldecido",
|
["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"] = "Has muerto",
|
["You are dead"] = "Tu estas muerto",
|
||||||
["You are drowning"] = "Te est<EFBFBD>s ahogando",
|
["You are drowning"] = "Te estas ahogando",
|
||||||
["You are drunk"] = "Est<EFBFBD>s ebrio",
|
["You are drunk"] = "Tu estas ebrio",
|
||||||
["You are electrified"] = "Est<EFBFBD>s electrocutado",
|
["You are electrified"] = "Tu estas electrocutado",
|
||||||
["You are freezing"] = "Te est<EFBFBD>s congelando",
|
["You are freezing"] = "Te estas congelando",
|
||||||
["You are hasted"] = "Tienes la velocidad incrementada", --The best translation I could thing of ("You have increased speed")
|
["You are hasted"] = "Tu estas r<>pido", --I dont know what is the best way to translate this so I'm leaving it as I found it.
|
||||||
["You are hungry"] = "Tienes hambre",
|
["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 envenedado",
|
["You are poisoned"] = "Tu estas envenedado",
|
||||||
["You are protected by a magic shield"] = "Est<EFBFBD>s protegido por un escudo m<>gico",
|
["You are protected by a magic shield"] = "Tu estas protegido por un escudo m<>gico",
|
||||||
["You are strengthened"] = "Est<EFBFBD>s reforzado", --"fortificado" maybe?
|
["You are strengthened"] = "Tu estas reforzado",
|
||||||
["You are within a protection zone"] = "Est<EFBFBD>s dentro de una zona de protecci<63>n",
|
["You are within a protection zone"] = "Tu estas dentro de una zona de protecci<63>n",
|
||||||
["You can enter new text."] = "Puedes escribir texto nuevo.",
|
["You can enter new text."] = "Tu puedes ingresar un texto nuevo.",
|
||||||
["You have %s percent"] = "Tienes el %s por ciento",
|
["You have %s percent"] = "Tu tienes %s por ciento",
|
||||||
["You have %s percent to go"] = "Tienes el %s por ciento para avanzar",
|
["You have %s percent to go"] = "Tu tienes %s por ciento para ir",
|
||||||
["You may not logout during a fight"] = "No te puedes desconectar durante una pelea",
|
["You may not logout during a fight"] = "No puedes salir durante una pelea",
|
||||||
["You may not logout or enter a protection zone"] = "No te puedes desconectar 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."] = "Debes escribir un comentario.",
|
["You must enter a comment."] = "Debes ingresar un comentario.",
|
||||||
["You must enter a valid server address and port."] = "Debes ingresar una direcci<63>n v<>lida de servidor y el puerto.",
|
["You must enter a valid server address and port."] = "Debes ingresar una direcci<63>n v<>lida de servidor y el puerto.",
|
||||||
["You must select a character to login!"] = "<EFBFBD>Debes seleccionar un personaje para ingresar!", -- I would use "conectarte" but it's Ok
|
["You must select a character to login!"] = "<EFBFBD>Debes seleccionar un personaje para ingresar!",
|
||||||
["Your Capacity:"] = "Tu capacidad:",
|
["Your Capacity:"] = "Tu capacidad:",
|
||||||
["You read the following, written by \n%s\n"] = "Lees lo siguiente, escrito por \n%s\n",
|
["You read the following, written by \n%s\n"] = "Lees lo siguiente, escrito por \n%s\n",
|
||||||
["You read the following, written on \n%s.\n"] = "Lees lo siguiente, escrito en \n%s\n",
|
["You read the following, written on \n%s.\n"] = "Lees lo siguiente, escrito en \n%s\n",
|
||||||
["Your Money:"] = "Tu dinero:",
|
["Your Money:"] = "Tu dinero:",
|
||||||
["Change language"] = "Cambiar idioma",
|
["Change language"] = "Cambiar idioma",
|
||||||
["Don't stretch or shrink Game Window"] = "No estirar ni encoger la ventana de juego"
|
["Don't stretch or shrink Game Window"] = "No estirar o encoger Ventana de Juego"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -28,7 +28,7 @@ locale = {
|
|||||||
["4c) False Report to Gamemaster"] = "4c) Wyslanie Falszywego Raportu Mistrzowi Gry",
|
["4c) False Report to Gamemaster"] = "4c) Wyslanie Falszywego Raportu Mistrzowi Gry",
|
||||||
["Accept"] = "Akceptuj",
|
["Accept"] = "Akceptuj",
|
||||||
["Account name"] = "Numer konta",
|
["Account name"] = "Numer konta",
|
||||||
["Account Status"] = "Status Konta",
|
["Account Status:"] = "Status Konta:",
|
||||||
["Action:"] = "Akcja:",
|
["Action:"] = "Akcja:",
|
||||||
["Add"] = "Dodaj",
|
["Add"] = "Dodaj",
|
||||||
["Add new VIP"] = "Nowy VIP",
|
["Add new VIP"] = "Nowy VIP",
|
||||||
@@ -228,7 +228,7 @@ locale = {
|
|||||||
["Pass Leadership to %s"] = "Oddaj przywodztwo %s",
|
["Pass Leadership to %s"] = "Oddaj przywodztwo %s",
|
||||||
["Password"] = "Haslo",
|
["Password"] = "Haslo",
|
||||||
["Piece Price:"] = "Cena jednego przedmiotu",
|
["Piece Price:"] = "Cena jednego przedmiotu",
|
||||||
["Please enter a character name"] = "Podaj nazwe postaci",
|
["Please enter a character name:"] = "Podaj nazwe postaci:",
|
||||||
["Please, press the key you wish to add onto your hotkeys manager"] = "Nacisnij klawisz, ktory chcesz dodac do menedzera skrotow klawiszowych",
|
["Please, press the key you wish to add onto your hotkeys manager"] = "Nacisnij klawisz, ktory chcesz dodac do menedzera skrotow klawiszowych",
|
||||||
["Please Select"] = "Prosze wybrac",
|
["Please Select"] = "Prosze wybrac",
|
||||||
["Please use this dialog to only report bugs. Do not report rule violations here!"] = "Zglaszaj tylko bledy gry, nie lamanie zasad",
|
["Please use this dialog to only report bugs. Do not report rule violations here!"] = "Zglaszaj tylko bledy gry, nie lamanie zasad",
|
||||||
@@ -295,7 +295,7 @@ locale = {
|
|||||||
["Show your depot items only"] = "Pokaz tylko przedmioty z depozytu",
|
["Show your depot items only"] = "Pokaz tylko przedmioty z depozytu",
|
||||||
["Skills"] = "Umiejetnosci",
|
["Skills"] = "Umiejetnosci",
|
||||||
["Soul"] = "Dusze",
|
["Soul"] = "Dusze",
|
||||||
["Soul Points"] = "Punkty Duszy",
|
["Soul Points"] = "Punktey Duszy",
|
||||||
["Special"] = "Specialne",
|
["Special"] = "Specialne",
|
||||||
["Speed"] = "Predkosc",
|
["Speed"] = "Predkosc",
|
||||||
["Spell Cooldowns"] = "Czas odnowienia czaru",
|
["Spell Cooldowns"] = "Czas odnowienia czaru",
|
||||||
|
@@ -10,15 +10,11 @@ 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",
|
["%d of experience per hour"] = "%d de experi<72>ncia por hora",
|
||||||
["%s has finished the request"] = "%s finalizou o pedido",
|
|
||||||
["%s has logged in."] = "%s entrou.",
|
|
||||||
["%s has logged out."] = "%s saiu.",
|
|
||||||
["%s of experience left"] = "%s de experi<72>ncia faltando",
|
["%s of experience left"] = "%s de experi<72>ncia faltando",
|
||||||
["%s: (use object on target)"] = "%s: (usar objeto no alvo)",
|
["%s: (use object on target)"] = "%s: (usar objeto no alvo)",
|
||||||
["%s: (use object on yourself)"] = "%s: (usar objeto em si)",
|
["%s: (use object on yourself)"] = "%s: (usar objeto em si)",
|
||||||
["%s: (use object with crosshair)"] = "%s: (usar objeto com mira)",
|
["%s: (use object with crosshair)"] = "%s: (usar objeto com mira)",
|
||||||
["%s: (use object)"] = "%s: (usar objeto)",
|
["%s: (use object)"] = "%s: (usar objeto)",
|
||||||
["(ERROR %d)"] = "(ERRO %d)",
|
|
||||||
["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",
|
||||||
@@ -42,8 +38,6 @@ locale = {
|
|||||||
["Account name"] = "Nome da conta",
|
["Account name"] = "Nome da conta",
|
||||||
["Account Status"] = "Estado da Conta",
|
["Account Status"] = "Estado da Conta",
|
||||||
["Action"] = "A<EFBFBD><EFBFBD>o",
|
["Action"] = "A<EFBFBD><EFBFBD>o",
|
||||||
["Activate ignorelist"] = "Ativar lista ignorada",
|
|
||||||
["Activate whitelist"] = "Ativar lista branca",
|
|
||||||
["Add new server"] = "Adicionar novo servidor",
|
["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 to VIP list"] = "Adicionar a lista VIP",
|
||||||
@@ -52,18 +46,17 @@ locale = {
|
|||||||
["Addon 2"] = "Addon 2",
|
["Addon 2"] = "Addon 2",
|
||||||
["Addon 3"] = "Addon 3",
|
["Addon 3"] = "Addon 3",
|
||||||
["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,
|
||||||
["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",
|
["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",
|
||||||
["Allow VIPs to message you"] = "Permitir que VIPs te mandem mensagem",
|
|
||||||
["Allowed Players"] = "Jogadores com permiss<73>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",
|
||||||
["Anonymous"] = "An<EFBFBD>nimo",
|
["Anonymous"] = "An<EFBFBD>nimo",
|
||||||
["Any"] = "Qualquer",
|
["Any"] = "Qualquer",
|
||||||
|
["Are you sure you want to logout?"] = "Voc<EFBFBD> tem certeza que quer sair?",
|
||||||
["Attack"] = "Atacar",
|
["Attack"] = "Atacar",
|
||||||
["Auction End"] = "Fim do Leil<69>o",
|
|
||||||
["Audio"] = "<EFBFBD>udio",
|
["Audio"] = "<EFBFBD>udio",
|
||||||
["Author"] = "Autor",
|
["Author"] = "Autor",
|
||||||
["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",
|
||||||
@@ -75,7 +68,6 @@ locale = {
|
|||||||
["Banishment + Final Warning"] = "Banimento + Aviso final",
|
["Banishment + Final Warning"] = "Banimento + Aviso final",
|
||||||
["Banishment"] = "Banimento",
|
["Banishment"] = "Banimento",
|
||||||
["Battle"] = "Batalha",
|
["Battle"] = "Batalha",
|
||||||
["Browse Field"] = "Navegar Campo",
|
|
||||||
["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",
|
||||||
@@ -83,14 +75,12 @@ locale = {
|
|||||||
["Buy Offers"] = "Ofertas de compra",
|
["Buy Offers"] = "Ofertas de compra",
|
||||||
["Buy with backpack"] = "Comprar com mochila",
|
["Buy with backpack"] = "Comprar com mochila",
|
||||||
["Buy"] = "Comprar",
|
["Buy"] = "Comprar",
|
||||||
["Buyer Name"] = "Nome do Comprador",
|
|
||||||
["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",
|
["Change language"] = "Trocar l<>ngua",
|
||||||
["Channel appended to %s"] = "Canais acrescentados a %s",
|
|
||||||
["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",
|
||||||
@@ -98,7 +88,6 @@ 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",
|
||||||
["Client Version"] = "Vers<EFBFBD>o do Client",
|
|
||||||
["Close this channel"] = "Fechar esse canal",
|
["Close this channel"] = "Fechar esse canal",
|
||||||
["Close"] = "Fechar",
|
["Close"] = "Fechar",
|
||||||
["Club Fighting"] = "Combate com Porrete",
|
["Club Fighting"] = "Combate com Porrete",
|
||||||
@@ -107,44 +96,35 @@ locale = {
|
|||||||
["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",
|
["Connection Error"] = "Erro de Conex<65>o",
|
||||||
["Connection failed the server address does not exist."] = "Conex<EFBFBD>o falhou, servidor n<>o existe.",
|
|
||||||
["Connection failed."] = "Conex<EFBFBD>o falhou.",
|
|
||||||
["Connection refused the server might be offline or restarting.\nPlease try again later."] = "Conex<EFBFBD>o recusada, servidor pode estar offline ou reiniciando. Por favor, tente novamente mais tarde.",
|
|
||||||
["Connection timed out. Either your network is failing or the server is offline."] = "Conex<EFBFBD>o encerrada por tempo limite. Sua rede est<73> falhando, ou o servidor est<73> offline.",
|
|
||||||
["Console"] = "Console",
|
["Console"] = "Console",
|
||||||
["Cooldown"] = "Cooldown",
|
["Cooldown"] = "Cooldown",
|
||||||
["Cooldowns"] = "Cooldowns",
|
["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",
|
||||||
["Copy"] = "Copiar",
|
|
||||||
["Create Map Mark"] = "Criar marca no mapa",
|
["Create Map Mark"] = "Criar marca no mapa",
|
||||||
["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 hotkey to add: %s"] = "Atalho atual para adicionar: %s",
|
["Current hotkey to add: %s"] = "Atalho atual para adicionar: %s",
|
||||||
["Critical Hit Chance"] = "Chance de acerto cr<63>tico",
|
["Current hotkeys:"] = "Atalhos atuais",
|
||||||
["Critical Hit Damage"] = "Dano de acerto cr<63>tico",
|
|
||||||
["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",
|
||||||
["Destructive Behaviour"] = "Comportamento destrutivo",
|
["Destructive Behaviour"] = "Comportamento destrutivo",
|
||||||
["Detail"] = "Detalhe",
|
["Detail"] = "Detalhe",
|
||||||
["Details"] = "Detalhes",
|
["Details"] = "Detalhes",
|
||||||
["Disable chat mode allow to walk using ASDW"] = "Desativar modo de chat permite andar usando ASDW",
|
|
||||||
["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 health bars"] = "Exibir barras de vida das criaturas",
|
||||||
["Display creature names"] = "Exibir nomes das criaturas",
|
["Display creature names"] = "Exibir nomes das criaturas",
|
||||||
["Display player mana bar"] = "Exibir barra de mana",
|
|
||||||
["Display text messages"] = "Exibir mensagens de texto",
|
["Display text messages"] = "Exibir mensagens de texto",
|
||||||
["Distance Fighting"] = "Combate a Dist<73>ncia",
|
["Distance Fighting"] = "Combate a Dist<73>ncia",
|
||||||
["Don\'t stretch or shrink Game Window"] = "N<EFBFBD>o esticar ou contrair a janela do game",
|
["Don't stretch or shrink Game Window"] = "N<EFBFBD>o esticar ou contrair a janela do game",
|
||||||
["Druid"] = "Druid",
|
["Druid"] = "Druid",
|
||||||
["Edit %s"] = "Editar %s",
|
|
||||||
["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",
|
||||||
@@ -277,7 +257,7 @@ locale = {
|
|||||||
["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 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",
|
||||||
|
@@ -31,7 +31,7 @@ locale = {
|
|||||||
["4c) False Report to Gamemaster"] = "4c) Falsk rapport till gamemaster",
|
["4c) False Report to Gamemaster"] = "4c) Falsk rapport till gamemaster",
|
||||||
["Accept"] = "Acceptera",
|
["Accept"] = "Acceptera",
|
||||||
["Account name"] = "Konto namn",
|
["Account name"] = "Konto namn",
|
||||||
["Account Status"] = false,
|
["Account Status:"] = false,
|
||||||
["Action:"] = "Handling:",
|
["Action:"] = "Handling:",
|
||||||
["Add"] = "L<EFBFBD>gg till",
|
["Add"] = "L<EFBFBD>gg till",
|
||||||
["Add new VIP"] = "Ny VIP",
|
["Add new VIP"] = "Ny VIP",
|
||||||
@@ -232,7 +232,7 @@ locale = {
|
|||||||
["Pass Leadership to %s"] = "Ge ledarskap till %s",
|
["Pass Leadership to %s"] = "Ge ledarskap till %s",
|
||||||
["Password"] = "L<EFBFBD>senord",
|
["Password"] = "L<EFBFBD>senord",
|
||||||
["Piece Price:"] = "Per Styck:",
|
["Piece Price:"] = "Per Styck:",
|
||||||
["Please enter a character name"] = "Skriv in ett karakt<6B>rsnamn",
|
["Please enter a character name:"] = "Skriv in ett karakt<6B>rsnamn:",
|
||||||
["Please, press the key you wish to add onto your hotkeys manager"] = "Tryck p<> knappen som du\nvill l<>gga till som snabbtangent",
|
["Please, press the key you wish to add onto your hotkeys manager"] = "Tryck p<> knappen som du\nvill l<>gga till som snabbtangent",
|
||||||
["Please Select"] = "V<EFBFBD>lj",
|
["Please Select"] = "V<EFBFBD>lj",
|
||||||
["Please use this dialog to only report bugs. Do not report rule violations here!"] = "Anv<EFBFBD>nd den h<>r dialogrutan endast f<>r att rapportera buggar. Rapportera inte regelbrott h<>r!",
|
["Please use this dialog to only report bugs. Do not report rule violations here!"] = "Anv<EFBFBD>nd den h<>r dialogrutan endast f<>r att rapportera buggar. Rapportera inte regelbrott h<>r!",
|
||||||
|
4
init.lua
@@ -22,7 +22,7 @@ end
|
|||||||
g_resources.addSearchPath(g_resources.getWorkDir() .. "mods", true)
|
g_resources.addSearchPath(g_resources.getWorkDir() .. "mods", true)
|
||||||
|
|
||||||
-- setup directory for saving configurations
|
-- setup directory for saving configurations
|
||||||
g_resources.setupUserWriteDir(('%s/'):format(g_app.getCompactName()))
|
g_resources.setupUserWriteDir(g_app.getCompactName())
|
||||||
|
|
||||||
-- search all packages
|
-- search all packages
|
||||||
g_resources.searchAndAddPackages('/', '.otpkg', true)
|
g_resources.searchAndAddPackages('/', '.otpkg', true)
|
||||||
@@ -52,4 +52,4 @@ local script = '/' .. g_app.getCompactName() .. 'rc.lua'
|
|||||||
|
|
||||||
if g_resources.fileExists(script) then
|
if g_resources.fileExists(script) then
|
||||||
dofile(script)
|
dofile(script)
|
||||||
end
|
end
|
@@ -1,8 +1,5 @@
|
|||||||
local musicFilename = "/sounds/startup"
|
local musicFilename = "/sounds/startup"
|
||||||
local musicChannel = nil
|
local musicChannel = g_sounds.getChannel(1)
|
||||||
if g_sounds then
|
|
||||||
musicChannel = g_sounds.getChannel(SoundChannels.Music)
|
|
||||||
end
|
|
||||||
|
|
||||||
function setMusic(filename)
|
function setMusic(filename)
|
||||||
musicFilename = filename
|
musicFilename = filename
|
||||||
@@ -30,14 +27,12 @@ end
|
|||||||
|
|
||||||
function startup()
|
function startup()
|
||||||
-- Play startup music (The Silver Tree, by Mattias Westlund)
|
-- Play startup music (The Silver Tree, by Mattias Westlund)
|
||||||
if musicChannel then
|
musicChannel:enqueue(musicFilename, 3)
|
||||||
musicChannel:enqueue(musicFilename, 3)
|
connect(g_game, { onGameStart = function() musicChannel:stop(3) end })
|
||||||
connect(g_game, { onGameStart = function() musicChannel:stop(3) end })
|
connect(g_game, { onGameEnd = function()
|
||||||
connect(g_game, { onGameEnd = function()
|
g_sounds.stopAll()
|
||||||
g_sounds.stopAll()
|
musicChannel:enqueue(musicFilename, 3)
|
||||||
musicChannel:enqueue(musicFilename, 3)
|
end })
|
||||||
end })
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Check for startup errors
|
-- Check for startup errors
|
||||||
local errtitle = nil
|
local errtitle = nil
|
||||||
@@ -62,9 +57,7 @@ function init()
|
|||||||
onExit = exit })
|
onExit = exit })
|
||||||
|
|
||||||
g_window.setMinimumSize({ width = 600, height = 480 })
|
g_window.setMinimumSize({ width = 600, height = 480 })
|
||||||
if musicChannel then
|
g_sounds.preload(musicFilename)
|
||||||
g_sounds.preload(musicFilename)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- initialize in fullscreen mode on mobile devices
|
-- initialize in fullscreen mode on mobile devices
|
||||||
if g_window.getPlatformType() == "X11-EGL" then
|
if g_window.getPlatformType() == "X11-EGL" then
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: client
|
name: client
|
||||||
description: Initialize the client and setups its main window
|
description: Initialize the client and setups its main window
|
||||||
author: edubart
|
author: edubart
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
reloadable: false
|
reloadable: false
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [ client ]
|
scripts: [ client ]
|
||||||
|
@@ -10,7 +10,7 @@ function init()
|
|||||||
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() .. '\n' .. g_app.getBuildCompiler())
|
'Built on ' .. g_app.getBuildDate())
|
||||||
|
|
||||||
if not g_game.isOnline() then
|
if not g_game.isOnline() then
|
||||||
addEvent(function() g_effects.fadeIn(clientVersionLabel, 1500) end)
|
addEvent(function() g_effects.fadeIn(clientVersionLabel, 1500) end)
|
||||||
@@ -45,7 +45,3 @@ end
|
|||||||
function setVersionText(text)
|
function setVersionText(text)
|
||||||
clientVersionLabel:setText(text)
|
clientVersionLabel:setText(text)
|
||||||
end
|
end
|
||||||
|
|
||||||
function getBackground()
|
|
||||||
return background
|
|
||||||
end
|
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: client_background
|
name: client_background
|
||||||
description: Handles the background of the login screen
|
description: Handles the background of the login screen
|
||||||
author: edubart
|
author: edubart
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [ background ]
|
scripts: [ background ]
|
||||||
dependencies: [ client_topmenu ]
|
dependencies: [ client_topmenu ]
|
||||||
|
@@ -8,7 +8,6 @@ local errorBox
|
|||||||
local waitingWindow
|
local waitingWindow
|
||||||
local updateWaitEvent
|
local updateWaitEvent
|
||||||
local resendWaitEvent
|
local resendWaitEvent
|
||||||
local loginEvent
|
|
||||||
|
|
||||||
-- private functions
|
-- private functions
|
||||||
local function tryLogin(charInfo, tries)
|
local function tryLogin(charInfo, tries)
|
||||||
@@ -22,7 +21,7 @@ local function tryLogin(charInfo, tries)
|
|||||||
if tries == 1 then
|
if tries == 1 then
|
||||||
g_game.safeLogout()
|
g_game.safeLogout()
|
||||||
end
|
end
|
||||||
loginEvent = scheduleEvent(function() tryLogin(charInfo, tries+1) end, 100)
|
scheduleEvent(function() tryLogin(charInfo, tries+1) end, 100)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -181,20 +180,15 @@ function CharacterList.terminate()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if updateWaitEvent then
|
if updateWaitEvent then
|
||||||
removeEvent(updateWaitEvent)
|
updateWaitEvent:cancel()
|
||||||
updateWaitEvent = nil
|
updateWaitEvent = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
if resendWaitEvent then
|
if resendWaitEvent then
|
||||||
removeEvent(resendWaitEvent)
|
resendWaitEvent:cancel()
|
||||||
resendWaitEvent = nil
|
resendWaitEvent = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
if loginEvent then
|
|
||||||
removeEvent(loginEvent)
|
|
||||||
loginEvent = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
CharacterList = nil
|
CharacterList = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -254,21 +248,12 @@ function CharacterList.create(characters, account, otui)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- account
|
-- account
|
||||||
local status = ''
|
if account.premDays > 0 and account.premDays < 65535 then
|
||||||
if account.status == AccountStatus.Frozen then
|
accountStatusLabel:setText(tr("Premium Account (%s) days left", account.premDays))
|
||||||
status = tr(' (Frozen)')
|
elseif account.premDays >= 65535 then
|
||||||
elseif account.status == AccountStatus.Suspended then
|
accountStatusLabel:setText(tr("Lifetime Premium Account"))
|
||||||
status = tr(' (Suspended)')
|
else
|
||||||
end
|
accountStatusLabel:setText(tr('Free Account'))
|
||||||
|
|
||||||
if account.subStatus == SubscriptionStatus.Free then
|
|
||||||
accountStatusLabel:setText(('%s%s'):format(tr('Free Account'), status))
|
|
||||||
elseif account.subStatus == SubscriptionStatus.Premium then
|
|
||||||
if account.premDays == 0 or account.premDays == 65535 then
|
|
||||||
accountStatusLabel:setText(('%s%s'):format(tr('Gratis Premium Account'), status))
|
|
||||||
else
|
|
||||||
accountStatusLabel:setText(('%s%s'):format(tr('Premium Account (%s) days left', account.premDays), status))
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if account.premDays > 0 and account.premDays <= 7 then
|
if account.premDays > 0 and account.premDays <= 7 then
|
||||||
@@ -325,10 +310,6 @@ function CharacterList.doLogin()
|
|||||||
worldName = selected.worldName,
|
worldName = selected.worldName,
|
||||||
characterName = selected.characterName }
|
characterName = selected.characterName }
|
||||||
charactersWindow:hide()
|
charactersWindow:hide()
|
||||||
if loginEvent then
|
|
||||||
removeEvent(loginEvent)
|
|
||||||
loginEvent = nil
|
|
||||||
end
|
|
||||||
tryLogin(charInfo)
|
tryLogin(charInfo)
|
||||||
else
|
else
|
||||||
displayErrorBox(tr('Error'), tr('You must select a character to login!'))
|
displayErrorBox(tr('Error'), tr('You must select a character to login!'))
|
||||||
@@ -349,12 +330,12 @@ function CharacterList.cancelWait()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if updateWaitEvent then
|
if updateWaitEvent then
|
||||||
removeEvent(updateWaitEvent)
|
updateWaitEvent:cancel()
|
||||||
updateWaitEvent = nil
|
updateWaitEvent = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
if resendWaitEvent then
|
if resendWaitEvent then
|
||||||
removeEvent(resendWaitEvent)
|
resendWaitEvent:cancel()
|
||||||
resendWaitEvent = nil
|
resendWaitEvent = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: client_entergame
|
name: client_entergame
|
||||||
description: Manages enter game and character list windows
|
description: Manages enter game and character list windows
|
||||||
author: edubart
|
author: edubart
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- client_topmenu
|
- client_topmenu
|
||||||
|
@@ -113,18 +113,15 @@ function installLocale(locale)
|
|||||||
if _G.allowedLocales and not _G.allowedLocales[locale.name] then return end
|
if _G.allowedLocales and not _G.allowedLocales[locale.name] then return end
|
||||||
|
|
||||||
if locale.name ~= defaultLocaleName then
|
if locale.name ~= defaultLocaleName then
|
||||||
local updatesNamesMissing = {}
|
local updatesNeeded = 0
|
||||||
for _,k in pairs(neededTranslations) do
|
for _i,k in pairs(neededTranslations) do
|
||||||
if locale.translation[k] == nil then
|
if locale.translation[k] == nil then
|
||||||
updatesNamesMissing[#updatesNamesMissing + 1] = k
|
updatesNeeded = updatesNeeded + 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if #updatesNamesMissing > 0 then
|
if updatesNeeded > 0 then
|
||||||
pdebug('Locale \'' .. locale.name .. '\' is missing ' .. #updatesNamesMissing .. ' translations.')
|
pdebug('Locale \'' .. locale.name .. '\' is missing ' .. updatesNeeded .. ' translations.')
|
||||||
for _,name in pairs(updatesNamesMissing) do
|
|
||||||
pdebug('["' .. name ..'"] = \"\",')
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -144,10 +141,7 @@ end
|
|||||||
|
|
||||||
function setLocale(name)
|
function setLocale(name)
|
||||||
local locale = installedLocales[name]
|
local locale = installedLocales[name]
|
||||||
if locale == currentLocale then
|
if locale == currentLocale then return end
|
||||||
g_settings.set('locale', name)
|
|
||||||
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
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: client_locales
|
name: client_locales
|
||||||
description: Translates texts to selected language
|
description: Translates texts to selected language
|
||||||
author: baxnie, edubart
|
author: baxnie, edubart
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [ locales ]
|
scripts: [ locales ]
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
|
@@ -21,47 +21,40 @@ neededTranslations = {
|
|||||||
"4c) False Report to Gamemaster",
|
"4c) False Report to Gamemaster",
|
||||||
"Accept",
|
"Accept",
|
||||||
"Account name",
|
"Account name",
|
||||||
"Account Status",
|
"Account Status:",
|
||||||
"Action",
|
"Action:",
|
||||||
"Activate ignorelist",
|
|
||||||
"Activate whitelist",
|
|
||||||
"Add",
|
"Add",
|
||||||
"Add new server",
|
|
||||||
"Add new VIP",
|
"Add new VIP",
|
||||||
"Addon 1",
|
"Addon 1",
|
||||||
"Addon 2",
|
"Addon 2",
|
||||||
"Addon 3",
|
"Addon 3",
|
||||||
"Add to VIP list",
|
"Add to VIP list",
|
||||||
"Adjust volume",
|
"Adjust 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!",
|
||||||
"All",
|
"All",
|
||||||
"All modules and scripts were reloaded.",
|
"All modules and scripts were reloaded.",
|
||||||
"Allow auto chase override",
|
"Allow auto chase override",
|
||||||
"Allowed Players",
|
"Also known as dash in tibia community, recommended\nfor playing characters with high speed",
|
||||||
"Allow VIPs to message you",
|
|
||||||
"Ambient light: %s%%",
|
"Ambient light: %s%%",
|
||||||
|
"Amount:",
|
||||||
"Amount",
|
"Amount",
|
||||||
"Anonymous",
|
"Anonymous",
|
||||||
"Any",
|
"Are you sure you want to logout?",
|
||||||
"Attack",
|
"Attack",
|
||||||
"Auction End",
|
|
||||||
"Audio",
|
|
||||||
"Authenticator Token",
|
|
||||||
"Author",
|
"Author",
|
||||||
"Autoload",
|
"Autoload",
|
||||||
"Autoload priority",
|
"Autoload priority",
|
||||||
"Auto login",
|
"Auto login",
|
||||||
"Auto login selected character on next charlist load",
|
"Auto login selected character on next charlist load",
|
||||||
"Axe Fighting",
|
"Axe Fighting",
|
||||||
"Balance",
|
"Balance:",
|
||||||
"Banishment",
|
"Banishment",
|
||||||
"Banishment + Final Warning",
|
"Banishment + Final Warning",
|
||||||
"Battle",
|
"Battle",
|
||||||
"Browse",
|
"Browse",
|
||||||
"Browse Field",
|
|
||||||
"Bug report sent.",
|
"Bug report sent.",
|
||||||
"Button Assign",
|
"Button Assign",
|
||||||
"Buy",
|
"Buy",
|
||||||
"Buyer Name",
|
|
||||||
"Buy Now",
|
"Buy Now",
|
||||||
"Buy Offers",
|
"Buy Offers",
|
||||||
"Buy with backpack",
|
"Buy with backpack",
|
||||||
@@ -70,8 +63,6 @@ neededTranslations = {
|
|||||||
"Cap",
|
"Cap",
|
||||||
"Capacity",
|
"Capacity",
|
||||||
"Center",
|
"Center",
|
||||||
"Change language",
|
|
||||||
"Channel appended to %s",
|
|
||||||
"Channels",
|
"Channels",
|
||||||
"Character List",
|
"Character List",
|
||||||
"Classic control",
|
"Classic control",
|
||||||
@@ -79,23 +70,15 @@ neededTranslations = {
|
|||||||
"Clear Messages",
|
"Clear Messages",
|
||||||
"Clear object",
|
"Clear object",
|
||||||
"Client needs update.",
|
"Client needs update.",
|
||||||
"Client Version",
|
|
||||||
"Close",
|
"Close",
|
||||||
"Close this channel",
|
"Close this channel",
|
||||||
"Club Fighting",
|
"Club Fighting",
|
||||||
"Combat Controls",
|
"Combat Controls",
|
||||||
"Comment",
|
"Comment:",
|
||||||
"Connecting to game server...",
|
"Connecting to game server...",
|
||||||
"Connecting to login server...",
|
"Connecting to login server...",
|
||||||
"Connection Error",
|
|
||||||
"Connection failed.",
|
|
||||||
"Connection failed, the server address does not exist.",
|
|
||||||
"Connection refused, the server might be offline or restarting.\nPlease try again later.",
|
|
||||||
"Connection timed out. Either your network is failing or the server is offline.",
|
|
||||||
"Console",
|
"Console",
|
||||||
"Cooldown",
|
|
||||||
"Cooldowns",
|
"Cooldowns",
|
||||||
"Copy",
|
|
||||||
"Copy message",
|
"Copy message",
|
||||||
"Copy name",
|
"Copy name",
|
||||||
"Copy Name",
|
"Copy Name",
|
||||||
@@ -103,72 +86,53 @@ neededTranslations = {
|
|||||||
"Create mark",
|
"Create mark",
|
||||||
"Create New Offer",
|
"Create New Offer",
|
||||||
"Create Offer",
|
"Create Offer",
|
||||||
"Critical Hit Chance",
|
"Current hotkeys:",
|
||||||
"Critical Hit Damage",
|
|
||||||
"Current hotkeys",
|
|
||||||
"Current hotkey to add: %s",
|
"Current hotkey to add: %s",
|
||||||
"Current Offers",
|
"Current Offers",
|
||||||
"Default",
|
"Default",
|
||||||
"Delete mark",
|
"Delete mark",
|
||||||
|
"Description:",
|
||||||
"Description",
|
"Description",
|
||||||
"Destructive Behaviour",
|
"Destructive Behaviour",
|
||||||
"Detail",
|
"Detail",
|
||||||
"Details",
|
"Details",
|
||||||
"Disable chat mode, allow to walk using ASDW",
|
|
||||||
"Disable chat mode, allow to walk using ASDW",
|
|
||||||
"Disable Shared Experience",
|
"Disable Shared Experience",
|
||||||
"Dismount",
|
"Dismount",
|
||||||
"Display connection speed to the server (milliseconds)",
|
"Display connection speed to the server (milliseconds)",
|
||||||
"Display creature health bars",
|
|
||||||
"Display creature names",
|
|
||||||
"Display player mana bar",
|
|
||||||
"Display text messages",
|
|
||||||
"Distance Fighting",
|
"Distance Fighting",
|
||||||
"%d of experience per hour",
|
|
||||||
"Don\'t stretch/shrink Game Window",
|
"Don\'t stretch/shrink Game Window",
|
||||||
"Druid",
|
"Edit hotkey text:",
|
||||||
"Edit hotkey text",
|
|
||||||
"Edit List",
|
"Edit List",
|
||||||
"Edit %s",
|
|
||||||
"Edit Text",
|
"Edit Text",
|
||||||
"Edit VIP list entry",
|
"Enable music",
|
||||||
"Enable audio",
|
|
||||||
"Enable chat mode",
|
|
||||||
"Enable dash walking",
|
|
||||||
"Enable lights",
|
|
||||||
"Enable music sound",
|
|
||||||
"Enable Shared Experience",
|
"Enable Shared Experience",
|
||||||
"Enable smart walking",
|
"Enable smart walking",
|
||||||
"Enable vertical synchronization",
|
"Enable vertical synchronization",
|
||||||
|
"Enable walk booster",
|
||||||
"Enter Game",
|
"Enter Game",
|
||||||
"Enter one name per line.",
|
"Enter one name per line.",
|
||||||
"Enter with your account again to update your client.",
|
"Enter with your account again to update your client.",
|
||||||
"Error",
|
"Error",
|
||||||
"Error",
|
"Error",
|
||||||
"(ERROR %d)",
|
|
||||||
"Excessive Unjustified Player Killing",
|
"Excessive Unjustified Player Killing",
|
||||||
"Exclude from private chat",
|
"Exclude from private chat",
|
||||||
"Exit",
|
"Exit",
|
||||||
"Experience",
|
"Experience",
|
||||||
"Filter list to match your level",
|
"Filter list to match your level",
|
||||||
"Filter list to match your vocation",
|
"Filter list to match your vocation",
|
||||||
"Filters",
|
"Find:",
|
||||||
"Find",
|
|
||||||
"Fishing",
|
"Fishing",
|
||||||
"Fist Fighting",
|
"Fist Fighting",
|
||||||
"Follow",
|
"Follow",
|
||||||
"Force Exit",
|
"Force Exit",
|
||||||
"Formula",
|
|
||||||
"For Your Information",
|
"For Your Information",
|
||||||
"Free Account",
|
"Free Account",
|
||||||
"Fullscreen",
|
"Fullscreen",
|
||||||
"Game",
|
"Game",
|
||||||
"Game framerate limit: %s",
|
"Game framerate limit: %s",
|
||||||
"Global ignore settings",
|
|
||||||
"Global whitelist settings",
|
|
||||||
"Graphics",
|
"Graphics",
|
||||||
"Graphics card driver not detected",
|
"Graphics card driver not detected",
|
||||||
"Group",
|
"Graphics Engine:",
|
||||||
"Head",
|
"Head",
|
||||||
"Healing",
|
"Healing",
|
||||||
"Health Info",
|
"Health Info",
|
||||||
@@ -182,50 +146,43 @@ neededTranslations = {
|
|||||||
"Hide spells for higher exp. levels",
|
"Hide spells for higher exp. levels",
|
||||||
"Hide spells for other vocations",
|
"Hide spells for other vocations",
|
||||||
"Hit Points",
|
"Hit Points",
|
||||||
"Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks\nPress Ctrl+Shift+M to view the entire game map",
|
"Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks",
|
||||||
"Host",
|
|
||||||
"Hotkey delay: %dms",
|
|
||||||
"Hotkey delay: %sms",
|
|
||||||
"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.",
|
"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.",
|
||||||
"Ignore",
|
"Ignore",
|
||||||
"Ignore capacity",
|
"Ignore capacity",
|
||||||
"Ignored Players",
|
"Ignored players:",
|
||||||
"Ignore equipped",
|
"Ignore equipped",
|
||||||
"Ignore List",
|
"Ignore List",
|
||||||
"Ignore players",
|
"Ignore players",
|
||||||
"Ignore Private Messages",
|
"Ignore Private Messages",
|
||||||
"Ignore Yelling",
|
"Ignore Yelling",
|
||||||
"Interface framerate limit: %s",
|
"Interface framerate limit: %s",
|
||||||
"Invalid authentification token.",
|
|
||||||
"Inventory",
|
"Inventory",
|
||||||
"Invite to Party",
|
"Invite to Party",
|
||||||
"Invite to private chat",
|
"Invite to private chat",
|
||||||
"IP Address Banishment",
|
"IP Address Banishment",
|
||||||
"Item Name",
|
|
||||||
"Item Offers",
|
"Item Offers",
|
||||||
"It is empty.",
|
"It is empty.",
|
||||||
"Join %s\'s Party",
|
"Join %s\'s Party",
|
||||||
"Knight",
|
|
||||||
"Leave Party",
|
"Leave Party",
|
||||||
"Level",
|
"Level",
|
||||||
"Life Leech Amount",
|
|
||||||
"Life Leech Chance",
|
|
||||||
"Lifetime Premium Account",
|
"Lifetime Premium Account",
|
||||||
"Limits FPS to 60",
|
"Limits FPS to 60",
|
||||||
"List of items that you're able to buy",
|
"List of items that you're able to buy",
|
||||||
"List of items that you're able to sell",
|
"List of items that you're able to sell",
|
||||||
"Load",
|
"Load",
|
||||||
|
"Logging out...",
|
||||||
"Login",
|
"Login",
|
||||||
"Login Error",
|
"Login Error",
|
||||||
"Login Error",
|
"Login Error",
|
||||||
"Logout",
|
"Logout",
|
||||||
"Look",
|
"Look",
|
||||||
"Magic Level",
|
"Magic Level",
|
||||||
"Make sure that your client uses\nthe correct game client version",
|
"Make sure that your client uses\nthe correct game protocol version",
|
||||||
"Mana",
|
"Mana",
|
||||||
|
"Manage hotkeys:",
|
||||||
"Market",
|
"Market",
|
||||||
"Market Error",
|
|
||||||
"Market Offers",
|
"Market Offers",
|
||||||
"Message of the day",
|
"Message of the day",
|
||||||
"Message to ",
|
"Message to ",
|
||||||
@@ -236,14 +193,11 @@ neededTranslations = {
|
|||||||
"Mount",
|
"Mount",
|
||||||
"Move Stackable Item",
|
"Move Stackable Item",
|
||||||
"Move up",
|
"Move up",
|
||||||
"Music volume: %d",
|
|
||||||
"My Offers",
|
"My Offers",
|
||||||
"Name",
|
"Name:",
|
||||||
"Name Report",
|
"Name Report",
|
||||||
"Name Report + Banishment",
|
"Name Report + Banishment",
|
||||||
"Name Report + Banishment + Final Warning",
|
"Name Report + Banishment + Final Warning",
|
||||||
"New Server",
|
|
||||||
"Next level in %d hours and %d minutes",
|
|
||||||
"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.",
|
"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 item selected.",
|
"No item selected.",
|
||||||
@@ -251,47 +205,39 @@ neededTranslations = {
|
|||||||
"No Outfit",
|
"No Outfit",
|
||||||
"No statement has been selected.",
|
"No statement has been selected.",
|
||||||
"Notation",
|
"Notation",
|
||||||
"Notify-Login",
|
|
||||||
"NPC Trade",
|
"NPC Trade",
|
||||||
"Offer History",
|
"Offer History",
|
||||||
"Offers",
|
"Offers",
|
||||||
"Offer Type",
|
"Offer Type:",
|
||||||
"Offline Training",
|
"Offline Training",
|
||||||
"Ok",
|
"Ok",
|
||||||
"on %s.\n",
|
"on %s.\n",
|
||||||
"Open",
|
"Open",
|
||||||
"Open a private message channel",
|
"Open a private message channel:",
|
||||||
"Open charlist automatically when starting client",
|
"Open charlist automatically when starting client",
|
||||||
"Open in new window",
|
"Open in new window",
|
||||||
"Open new channel",
|
"Open new channel",
|
||||||
"Open purse",
|
|
||||||
"Open PvP",
|
|
||||||
"Open PvP Situations",
|
|
||||||
"Options",
|
"Options",
|
||||||
"Overview",
|
"Overview",
|
||||||
"Paladin",
|
|
||||||
"Pass Leadership to %s",
|
"Pass Leadership to %s",
|
||||||
"Password",
|
"Password",
|
||||||
"Piece Price",
|
"Piece Price:",
|
||||||
"Please enter a character name",
|
"Please enter a character name:",
|
||||||
"Please, press the key you wish to add onto your hotkeys manager",
|
"Please, press the key you wish to add onto your hotkeys manager",
|
||||||
"Please Select",
|
"Please Select",
|
||||||
"Please state the rule violation in one clear sentence and wait for a reply from a gamemaster. Please note that your message will disappear if you close the channel.",
|
|
||||||
"Please use this dialog to only report bugs. Do not report rule violations here!",
|
"Please use this dialog to only report bugs. Do not report rule violations here!",
|
||||||
"Please wait",
|
"Please wait",
|
||||||
"Please wait patiently for a gamemaster to reply",
|
|
||||||
"Port",
|
"Port",
|
||||||
"Position",
|
"Position:",
|
||||||
"Premium",
|
"Position: %i %i %i",
|
||||||
"Premium Account (%s) days left",
|
"Premium Account (%s) days left",
|
||||||
"Price",
|
"Price:",
|
||||||
"Primary",
|
"Primary",
|
||||||
"Process",
|
|
||||||
"Protocol",
|
"Protocol",
|
||||||
"Quest Log",
|
"Quest Log",
|
||||||
"Randomize",
|
"Randomize",
|
||||||
"Randomize characters outfit",
|
"Randomize characters outfit",
|
||||||
"Reason",
|
"Reason:",
|
||||||
"Refresh",
|
"Refresh",
|
||||||
"Refresh Offers",
|
"Refresh Offers",
|
||||||
"Regeneration Time",
|
"Regeneration Time",
|
||||||
@@ -299,46 +245,31 @@ neededTranslations = {
|
|||||||
"Reload All",
|
"Reload All",
|
||||||
"Remember account and password when starts client",
|
"Remember account and password when starts client",
|
||||||
"Remember password",
|
"Remember password",
|
||||||
"Remove ",
|
|
||||||
"Remove",
|
"Remove",
|
||||||
"Remove %s",
|
"Remove %s",
|
||||||
"Report Bug",
|
"Report Bug",
|
||||||
"Report Rule",
|
|
||||||
"Report Rule Violation",
|
|
||||||
"Reserved for more functionality later.",
|
"Reserved for more functionality later.",
|
||||||
"Reset All",
|
|
||||||
"Reset Market",
|
"Reset Market",
|
||||||
"Reset selection, filters & search",
|
|
||||||
"Revoke %s\'s Invitation",
|
"Revoke %s\'s Invitation",
|
||||||
"Rotate",
|
"Rotate",
|
||||||
"Rule Violation",
|
"Rule Violation",
|
||||||
"Rule Violations",
|
|
||||||
"Save",
|
"Save",
|
||||||
"Save Messages",
|
"Save Messages",
|
||||||
"Search",
|
"Search:",
|
||||||
"Search all items",
|
"Search all items",
|
||||||
"Secondary",
|
"Secondary",
|
||||||
"Select",
|
|
||||||
"Select all",
|
|
||||||
"Select object",
|
"Select object",
|
||||||
"Select Outfit",
|
"Select Outfit",
|
||||||
"Select your language",
|
"Select your language",
|
||||||
"Sell",
|
"Sell",
|
||||||
"Sell All",
|
|
||||||
"Seller Name",
|
|
||||||
"Sell Now",
|
"Sell Now",
|
||||||
"Sell Offers",
|
"Sell Offers",
|
||||||
"Send",
|
"Send",
|
||||||
"Send automatically",
|
"Send automatically",
|
||||||
"Send Message",
|
"Send Message",
|
||||||
"Server",
|
"Server",
|
||||||
"Server list",
|
|
||||||
"Server List",
|
|
||||||
"Server Log",
|
"Server Log",
|
||||||
"Set Outfit",
|
"Set Outfit",
|
||||||
"%s has finished the request",
|
|
||||||
"%s has logged in.",
|
|
||||||
"%s has logged out.",
|
|
||||||
"Shielding",
|
"Shielding",
|
||||||
"Show all items",
|
"Show all items",
|
||||||
"Show connection ping",
|
"Show connection ping",
|
||||||
@@ -355,15 +286,8 @@ neededTranslations = {
|
|||||||
"Show status messages in console",
|
"Show status messages in console",
|
||||||
"Show Text",
|
"Show Text",
|
||||||
"Show timestamps in console",
|
"Show timestamps in console",
|
||||||
"Show Top Menu",
|
|
||||||
"Show your depot items only",
|
"Show your depot items only",
|
||||||
"Skills",
|
"Skills",
|
||||||
"Skull Time",
|
|
||||||
"%s of experience left",
|
|
||||||
"Sorcerer",
|
|
||||||
"Sort by name",
|
|
||||||
"Sort by status",
|
|
||||||
"Sort by type",
|
|
||||||
"Soul",
|
"Soul",
|
||||||
"Soul Points",
|
"Soul Points",
|
||||||
"Special",
|
"Special",
|
||||||
@@ -371,10 +295,9 @@ neededTranslations = {
|
|||||||
"Spell Cooldowns",
|
"Spell Cooldowns",
|
||||||
"Spell List",
|
"Spell List",
|
||||||
"Stamina",
|
"Stamina",
|
||||||
"Statement",
|
"Statement:",
|
||||||
"Statement Report",
|
"Statement Report",
|
||||||
"Statistics",
|
"Statistics",
|
||||||
"Stay logged during session",
|
|
||||||
"Stop Attack",
|
"Stop Attack",
|
||||||
"Stop Follow",
|
"Stop Follow",
|
||||||
"Support",
|
"Support",
|
||||||
@@ -385,23 +308,17 @@ neededTranslations = {
|
|||||||
"Sword Fighting",
|
"Sword Fighting",
|
||||||
"Terminal",
|
"Terminal",
|
||||||
"There is no way.",
|
"There is no way.",
|
||||||
"This offer is 25%% above the average market price",
|
"Title",
|
||||||
"This offer is 25%% below the average market price",
|
"Total Price:",
|
||||||
"Total Price",
|
|
||||||
"Trade",
|
"Trade",
|
||||||
"Trade with ...",
|
"Trade with ...",
|
||||||
"Trying to reconnect in %s seconds.",
|
"Trying to reconnect in %s seconds.",
|
||||||
"Turn delay: %dms",
|
|
||||||
"Turn delay: %sms",
|
|
||||||
"Two-Factor Authentification",
|
|
||||||
"Type",
|
|
||||||
"Unable to load dat file, please place a valid dat in '%s'",
|
"Unable to load dat file, please place a valid dat in '%s'",
|
||||||
"Unable to load spr file, please place a valid spr in '%s'",
|
"Unable to load spr file, please place a valid spr in '%s'",
|
||||||
|
"Unable to logout.",
|
||||||
"Unignore",
|
"Unignore",
|
||||||
"Unjustified Points",
|
|
||||||
"Unload",
|
"Unload",
|
||||||
"Update needed",
|
"Update needed",
|
||||||
"Update needed",
|
|
||||||
"Use",
|
"Use",
|
||||||
"Use on target",
|
"Use on target",
|
||||||
"Use on yourself",
|
"Use on yourself",
|
||||||
@@ -412,8 +329,7 @@ neededTranslations = {
|
|||||||
"Vocation",
|
"Vocation",
|
||||||
"Waiting List",
|
"Waiting List",
|
||||||
"Website",
|
"Website",
|
||||||
"Weight",
|
"Weight:",
|
||||||
"Will boost your walk on high speed characters",
|
|
||||||
"Will detect when to use diagonal step based on the\nkeys you are pressing",
|
"Will detect when to use diagonal step based on the\nkeys you are pressing",
|
||||||
"With crosshair",
|
"With crosshair",
|
||||||
"Yes",
|
"Yes",
|
||||||
@@ -442,13 +358,8 @@ neededTranslations = {
|
|||||||
"You must enter a comment.",
|
"You must enter a comment.",
|
||||||
"You must enter a valid server address and port.",
|
"You must enter a valid server address and port.",
|
||||||
"You must select a character to login!",
|
"You must select a character to login!",
|
||||||
"You must select an action.",
|
"Your Capacity:",
|
||||||
"You must select a reason.",
|
|
||||||
"Your Capacity",
|
|
||||||
"Your client needs updating, try redownloading it.",
|
|
||||||
"Your connection has been lost.\nEither your network or the server went down.",
|
|
||||||
"You read the following, written by \n%s\n",
|
"You read the following, written by \n%s\n",
|
||||||
"You read the following, written on \n%s.\n",
|
"You read the following, written on \n%s.\n",
|
||||||
"Your Money",
|
"Your Money:",
|
||||||
"Your request has been closed",
|
|
||||||
}
|
}
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: client_modulemanager
|
name: client_modulemanager
|
||||||
description: Manage other modules
|
description: Manage other modules
|
||||||
author: edubart
|
author: edubart
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [ modulemanager ]
|
scripts: [ modulemanager ]
|
||||||
dependencies: [ client_topmenu ]
|
dependencies: [ client_topmenu ]
|
||||||
|
@@ -34,59 +34,15 @@ Panel
|
|||||||
id: displayHealth
|
id: displayHealth
|
||||||
!text: tr('Display creature health bars')
|
!text: tr('Display creature health bars')
|
||||||
|
|
||||||
OptionCheckBox
|
|
||||||
id: displayMana
|
|
||||||
!text: tr('Display player mana bar')
|
|
||||||
|
|
||||||
OptionCheckBox
|
OptionCheckBox
|
||||||
id: displayText
|
id: displayText
|
||||||
!text: tr('Display text messages')
|
!text: tr('Display text messages')
|
||||||
|
|
||||||
Label
|
|
||||||
id: turnDelayLabel
|
|
||||||
!text: tr('Turn delay: %sms', 30)
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 12
|
|
||||||
@onSetup: |
|
|
||||||
local value = modules.client_options.getOption('turnDelay')
|
|
||||||
self:setText(tr('Turn delay: %dms', value))
|
|
||||||
|
|
||||||
OptionScrollbar
|
|
||||||
id: turnDelay
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 3
|
|
||||||
minimum: 30
|
|
||||||
maximum: 250
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: hotkeyDelayLabel
|
|
||||||
!text: tr('Hotkey delay: %dms', 30)
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 12
|
|
||||||
@onSetup: |
|
|
||||||
local value = modules.client_options.getOption('hotkeyDelay')
|
|
||||||
self:setText(tr('Hotkey delay: %dms', value))
|
|
||||||
|
|
||||||
OptionScrollbar
|
|
||||||
id: hotkeyDelay
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 3
|
|
||||||
minimum: 30
|
|
||||||
maximum: 250
|
|
||||||
|
|
||||||
Button
|
Button
|
||||||
id: changeLocale
|
id: changeLocale
|
||||||
!text: tr('Change language')
|
!text: tr('Change language')
|
||||||
@onClick: modules.client_locales.createWindow()
|
@onClick: modules.client_locales.createWindow()
|
||||||
anchors.top: prev.bottom
|
anchors.top: prev.bottom
|
||||||
anchors.left: prev.left
|
anchors.left: prev.left
|
||||||
margin-top: 12
|
margin-top: 5
|
||||||
width: 120
|
width: 120
|
||||||
|
@@ -25,11 +25,8 @@ local defaultOptions = {
|
|||||||
ambientLight = 25,
|
ambientLight = 25,
|
||||||
displayNames = true,
|
displayNames = true,
|
||||||
displayHealth = true,
|
displayHealth = true,
|
||||||
displayMana = true,
|
|
||||||
displayText = true,
|
displayText = true,
|
||||||
dontStretchShrink = false,
|
dontStretchShrink = false
|
||||||
turnDelay = 50,
|
|
||||||
hotkeyDelay = 50,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
local optionsWindow
|
local optionsWindow
|
||||||
@@ -109,8 +106,8 @@ function init()
|
|||||||
graphicsPanel = g_ui.loadUI('graphics')
|
graphicsPanel = g_ui.loadUI('graphics')
|
||||||
optionsTabBar:addTab(tr('Graphics'), graphicsPanel, '/images/optionstab/graphics')
|
optionsTabBar:addTab(tr('Graphics'), graphicsPanel, '/images/optionstab/graphics')
|
||||||
|
|
||||||
soundPanel = g_ui.loadUI('audio')
|
audioPanel = g_ui.loadUI('audio')
|
||||||
optionsTabBar:addTab(tr('Audio'), soundPanel, '/images/optionstab/audio')
|
optionsTabBar:addTab(tr('Audio'), audioPanel, '/images/optionstab/audio')
|
||||||
|
|
||||||
optionsButton = modules.client_topmenu.addLeftButton('optionsButton', tr('Options'), '/images/topbuttons/options', toggle)
|
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)
|
audioButton = modules.client_topmenu.addLeftButton('audioButton', tr('Audio'), '/images/topbuttons/audio', function() toggleOption('enableAudio') end)
|
||||||
@@ -158,17 +155,15 @@ function hide()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function toggleDisplays()
|
function toggleDisplays()
|
||||||
if options['displayNames'] and options['displayHealth'] and options['displayMana'] then
|
if options['displayNames'] and options['displayHealth'] then
|
||||||
setOption('displayNames', false)
|
setOption('displayNames', false)
|
||||||
elseif options['displayHealth'] then
|
elseif options['displayHealth'] then
|
||||||
setOption('displayHealth', false)
|
setOption('displayHealth', false)
|
||||||
setOption('displayMana', false)
|
|
||||||
else
|
else
|
||||||
if not options['displayNames'] and not options['displayHealth'] then
|
if not options['displayNames'] and not options['displayHealth'] then
|
||||||
setOption('displayNames', true)
|
setOption('displayNames', true)
|
||||||
else
|
else
|
||||||
setOption('displayHealth', true)
|
setOption('displayHealth', true)
|
||||||
setOption('displayMana', true)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -190,23 +185,17 @@ function setOption(key, value, force)
|
|||||||
elseif key == 'fullscreen' then
|
elseif key == 'fullscreen' then
|
||||||
g_window.setFullscreen(value)
|
g_window.setFullscreen(value)
|
||||||
elseif key == 'enableAudio' then
|
elseif key == 'enableAudio' then
|
||||||
if g_sounds then
|
g_sounds.setAudioEnabled(value)
|
||||||
g_sounds.setAudioEnabled(value)
|
|
||||||
end
|
|
||||||
if value then
|
if value then
|
||||||
audioButton:setIcon('/images/topbuttons/audio')
|
audioButton:setIcon('/images/topbuttons/audio')
|
||||||
else
|
else
|
||||||
audioButton:setIcon('/images/topbuttons/audio_mute')
|
audioButton:setIcon('/images/topbuttons/audio_mute')
|
||||||
end
|
end
|
||||||
elseif key == 'enableMusicSound' then
|
elseif key == 'enableMusicSound' then
|
||||||
if g_sounds then
|
g_sounds.getChannel(SoundChannels.Music):setEnabled(value)
|
||||||
g_sounds.getChannel(SoundChannels.Music):setEnabled(value)
|
|
||||||
end
|
|
||||||
elseif key == 'musicSoundVolume' then
|
elseif key == 'musicSoundVolume' then
|
||||||
if g_sounds then
|
g_sounds.getChannel(SoundChannels.Music):setGain(value/100)
|
||||||
g_sounds.getChannel(SoundChannels.Music):setGain(value/100)
|
audioPanel:getChildById('musicSoundVolumeLabel'):setText(tr('Music volume: %d', value))
|
||||||
end
|
|
||||||
soundPanel:getChildById('musicSoundVolumeLabel'):setText(tr('Music volume: %d', value))
|
|
||||||
elseif key == 'showLeftPanel' then
|
elseif key == 'showLeftPanel' then
|
||||||
modules.game_interface.getLeftPanel():setOn(value)
|
modules.game_interface.getLeftPanel():setOn(value)
|
||||||
elseif key == 'backgroundFrameRate' then
|
elseif key == 'backgroundFrameRate' then
|
||||||
@@ -233,18 +222,12 @@ function setOption(key, value, force)
|
|||||||
gameMapPanel:setDrawNames(value)
|
gameMapPanel:setDrawNames(value)
|
||||||
elseif key == 'displayHealth' then
|
elseif key == 'displayHealth' then
|
||||||
gameMapPanel:setDrawHealthBars(value)
|
gameMapPanel:setDrawHealthBars(value)
|
||||||
elseif key == 'displayMana' then
|
|
||||||
gameMapPanel:setDrawManaBar(value)
|
|
||||||
elseif key == 'displayText' then
|
elseif key == 'displayText' then
|
||||||
gameMapPanel:setDrawTexts(value)
|
gameMapPanel:setDrawTexts(value)
|
||||||
elseif key == 'dontStretchShrink' then
|
elseif key == 'dontStretchShrink' then
|
||||||
addEvent(function()
|
addEvent(function()
|
||||||
modules.game_interface.updateStretchShrink()
|
modules.game_interface.updateStretchShrink()
|
||||||
end)
|
end)
|
||||||
elseif key == 'turnDelay' then
|
|
||||||
generalPanel:getChildById('turnDelayLabel'):setText(tr('Turn delay: %sms', value))
|
|
||||||
elseif key == 'hotkeyDelay' then
|
|
||||||
generalPanel:getChildById('hotkeyDelayLabel'):setText(tr('Hotkey delay: %sms', value))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- change value for keybind updates
|
-- change value for keybind updates
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: client_options
|
name: client_options
|
||||||
description: Create the options window
|
description: Create the options window
|
||||||
author: edubart, BeniS
|
author: edubart, BeniS
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [ options ]
|
scripts: [ options ]
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: client_serverlist
|
name: client_serverlist
|
||||||
description: Manages a server list of previously entered servers
|
description: Manages a server list of previously entered servers
|
||||||
author: BeniS
|
author: BeniS
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- client_entergame
|
- client_entergame
|
||||||
|
@@ -65,33 +65,33 @@ function onConnect(protocol)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local post = ''
|
local post = ''
|
||||||
post = post .. 'uid=' .. urlencode(UUID)
|
post = post .. 'uid=' .. UUID
|
||||||
post = post .. '&report_delay=' .. REPORT_DELAY
|
post = post .. '&report_delay=' .. REPORT_DELAY
|
||||||
post = post .. '&os=' .. urlencode(g_app.getOs())
|
post = post .. '&os=' .. g_app.getOs()
|
||||||
post = post .. '&graphics_vendor=' .. urlencode(g_graphics.getVendor())
|
post = post .. '&graphics_vendor=' .. g_graphics.getVendor()
|
||||||
post = post .. '&graphics_renderer=' .. urlencode(g_graphics.getRenderer())
|
post = post .. '&graphics_renderer=' .. g_graphics.getRenderer()
|
||||||
post = post .. '&graphics_version=' .. urlencode(g_graphics.getVersion())
|
post = post .. '&graphics_version=' .. g_graphics.getVersion()
|
||||||
post = post .. '&painter_engine=' .. urlencode(g_graphics.getPainterEngine())
|
post = post .. '&painter_engine=' .. g_graphics.getPainterEngine()
|
||||||
post = post .. '&fps=' .. urlencode(g_app.getBackgroundPaneFps())
|
post = post .. '&fps=' .. g_app.getBackgroundPaneFps()
|
||||||
post = post .. '&max_fps=' .. urlencode(g_app.getBackgroundPaneMaxFps())
|
post = post .. '&max_fps=' .. g_app.getBackgroundPaneMaxFps()
|
||||||
post = post .. '&fullscreen=' .. urlencode(tostring(g_window.isFullscreen()))
|
post = post .. '&fullscreen=' .. tostring(g_window.isFullscreen())
|
||||||
post = post .. '&window_width=' .. urlencode(g_window.getWidth())
|
post = post .. '&window_width=' .. g_window.getWidth()
|
||||||
post = post .. '&window_height=' .. urlencode(g_window.getHeight())
|
post = post .. '&window_height=' .. g_window.getHeight()
|
||||||
post = post .. '&player_name=' .. urlencode(g_game.getCharacterName())
|
post = post .. '&player_name=' .. g_game.getCharacterName()
|
||||||
post = post .. '&world_name=' .. urlencode(g_game.getWorldName())
|
post = post .. '&world_name=' .. g_game.getWorldName()
|
||||||
post = post .. '&otserv_host=' .. urlencode(G.host)
|
post = post .. '&otserv_host=' .. G.host
|
||||||
post = post .. '&otserv_port=' .. G.port
|
post = post .. '&otserv_port=' .. G.port
|
||||||
post = post .. '&otserv_protocol=' .. urlencode(g_game.getProtocolVersion())
|
post = post .. '&otserv_protocol=' .. g_game.getProtocolVersion()
|
||||||
post = post .. '&otserv_client=' .. urlencode(g_game.getClientVersion())
|
post = post .. '&otserv_client=' .. g_game.getClientVersion()
|
||||||
post = post .. '&build_version=' .. urlencode(g_app.getVersion())
|
post = post .. '&build_version=' .. g_app.getVersion()
|
||||||
post = post .. '&build_revision=' .. urlencode(g_app.getBuildRevision())
|
post = post .. '&build_revision=' .. g_app.getBuildRevision()
|
||||||
post = post .. '&build_commit=' .. urlencode(g_app.getBuildCommit())
|
post = post .. '&build_commit=' .. g_app.getBuildCommit()
|
||||||
post = post .. '&build_date=' .. urlencode(g_app.getBuildDate())
|
post = post .. '&build_date=' .. g_app.getBuildDate()
|
||||||
post = post .. '&display_width=' .. g_window.getDisplayWidth()
|
post = post .. '&display_width=' .. g_window.getDisplayWidth()
|
||||||
post = post .. '&display_height=' .. g_window.getDisplayHeight()
|
post = post .. '&display_height=' .. g_window.getDisplayHeight()
|
||||||
post = post .. '&cpu=' .. urlencode(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=' .. urlencode(g_platform.getOSName())
|
post = post .. '&os_name=' .. g_platform.getOSName()
|
||||||
post = post .. getAdditionalData()
|
post = post .. getAdditionalData()
|
||||||
|
|
||||||
local message = ''
|
local message = ''
|
||||||
@@ -121,11 +121,3 @@ end
|
|||||||
function onError(protocol, message, code)
|
function onError(protocol, message, code)
|
||||||
pdebug('Could not send statistics: ' .. message)
|
pdebug('Could not send statistics: ' .. message)
|
||||||
end
|
end
|
||||||
|
|
||||||
function urlencode(str)
|
|
||||||
local encodeChar=function(chr)
|
|
||||||
return string.format("%%%X",string.byte(chr))
|
|
||||||
end
|
|
||||||
local output, t = string.gsub(str,"[^%w]",encodeChar)
|
|
||||||
return output
|
|
||||||
end
|
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: client_stats
|
name: client_stats
|
||||||
description: Sends client statistics to a server
|
description: Sends client statistics to a server
|
||||||
author: baxnie
|
author: baxnie
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [ stats ]
|
scripts: [ stats ]
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: client_styles
|
name: client_styles
|
||||||
description: Load client fonts and styles
|
description: Load client fonts and styles
|
||||||
author: edubart
|
author: edubart
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
scripts: [ styles ]
|
scripts: [ styles ]
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: client_terminal
|
name: client_terminal
|
||||||
description: Terminal for executing lua functions
|
description: Terminal for executing lua functions
|
||||||
author: edubart
|
author: edubart
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
scripts: [ terminal ]
|
scripts: [ terminal ]
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
|
@@ -51,8 +51,6 @@ function init()
|
|||||||
pingLabel = topMenu:getChildById('pingLabel')
|
pingLabel = topMenu:getChildById('pingLabel')
|
||||||
fpsLabel = topMenu:getChildById('fpsLabel')
|
fpsLabel = topMenu:getChildById('fpsLabel')
|
||||||
|
|
||||||
g_keyboard.bindKeyDown('Ctrl+Shift+T', toggle)
|
|
||||||
|
|
||||||
if g_game.isOnline() then
|
if g_game.isOnline() then
|
||||||
online()
|
online()
|
||||||
end
|
end
|
||||||
@@ -166,22 +164,3 @@ end
|
|||||||
function getTopMenu()
|
function getTopMenu()
|
||||||
return topMenu
|
return topMenu
|
||||||
end
|
end
|
||||||
|
|
||||||
function toggle()
|
|
||||||
local menu = getTopMenu()
|
|
||||||
if not menu then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if menu:isVisible() then
|
|
||||||
menu:hide()
|
|
||||||
modules.client_background.getBackground():addAnchor(AnchorTop, 'parent', AnchorTop)
|
|
||||||
modules.game_interface.getRootPanel():addAnchor(AnchorTop, 'parent', AnchorTop)
|
|
||||||
modules.game_interface.getShowTopMenuButton():show()
|
|
||||||
else
|
|
||||||
menu:show()
|
|
||||||
modules.client_background.getBackground():addAnchor(AnchorTop, 'topMenu', AnchorBottom)
|
|
||||||
modules.game_interface.getRootPanel():addAnchor(AnchorTop, 'topMenu', AnchorBottom)
|
|
||||||
modules.game_interface.getShowTopMenuButton():hide()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: client_topmenu
|
name: client_topmenu
|
||||||
description: Create the top menu
|
description: Create the top menu
|
||||||
author: edubart
|
author: edubart
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
scripts: [ topmenu ]
|
scripts: [ topmenu ]
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: corelib
|
name: corelib
|
||||||
description: Contains core lua classes, functions and constants used by other modules
|
description: Contains core lua classes, functions and constants used by other modules
|
||||||
author: OTClient team
|
author: OTClient team
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
reloadable: false
|
reloadable: false
|
||||||
|
|
||||||
@onLoad: |
|
@onLoad: |
|
||||||
|
@@ -26,11 +26,6 @@ local function retranslateKeyComboDesc(keyComboDesc)
|
|||||||
if keyComboDesc == nil then
|
if keyComboDesc == nil then
|
||||||
error('Unable to translate key combo \'' .. keyComboDesc .. '\'')
|
error('Unable to translate key combo \'' .. keyComboDesc .. '\'')
|
||||||
end
|
end
|
||||||
|
|
||||||
if type(keyComboDesc) == 'number' then
|
|
||||||
keyComboDesc = tostring(keyComboDesc)
|
|
||||||
end
|
|
||||||
|
|
||||||
local keyCombo = {}
|
local keyCombo = {}
|
||||||
for i,currentKeyDesc in ipairs(keyComboDesc:split('+')) do
|
for i,currentKeyDesc in ipairs(keyComboDesc:split('+')) do
|
||||||
for keyCode, keyDesc in pairs(KeyCodeDescs) do
|
for keyCode, keyDesc in pairs(KeyCodeDescs) do
|
||||||
|
@@ -10,24 +10,13 @@ local function moveToolTip(first)
|
|||||||
if not first and (not toolTipLabel:isVisible() or toolTipLabel:getOpacity() < 0.1) then return end
|
if not first and (not toolTipLabel:isVisible() or toolTipLabel:getOpacity() < 0.1) then return end
|
||||||
|
|
||||||
local pos = g_window.getMousePosition()
|
local pos = g_window.getMousePosition()
|
||||||
local windowSize = g_window.getSize()
|
|
||||||
local labelSize = toolTipLabel:getSize()
|
|
||||||
|
|
||||||
pos.x = pos.x + 1
|
|
||||||
pos.y = pos.y + 1
|
pos.y = pos.y + 1
|
||||||
|
local xdif = g_window.getSize().width - (pos.x + toolTipLabel:getWidth())
|
||||||
if windowSize.width - (pos.x + labelSize.width) < 10 then
|
if xdif < 10 then
|
||||||
pos.x = pos.x - labelSize.width - 3
|
pos.x = pos.x - toolTipLabel:getWidth() - 3
|
||||||
else
|
else
|
||||||
pos.x = pos.x + 10
|
pos.x = pos.x + 10
|
||||||
end
|
end
|
||||||
|
|
||||||
if windowSize.height - (pos.y + labelSize.height) < 10 then
|
|
||||||
pos.y = pos.y - labelSize.height - 3
|
|
||||||
else
|
|
||||||
pos.y = pos.y + 10
|
|
||||||
end
|
|
||||||
|
|
||||||
toolTipLabel:setPosition(pos)
|
toolTipLabel:setPosition(pos)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -62,6 +51,7 @@ function g_tooltip.init()
|
|||||||
toolTipLabel:setBackgroundColor('#111111cc')
|
toolTipLabel:setBackgroundColor('#111111cc')
|
||||||
toolTipLabel:setTextAlign(AlignCenter)
|
toolTipLabel:setTextAlign(AlignCenter)
|
||||||
toolTipLabel:hide()
|
toolTipLabel:hide()
|
||||||
|
toolTipLabel.onMouseMove = function() moveToolTip() end
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -88,18 +78,10 @@ function g_tooltip.display(text)
|
|||||||
toolTipLabel:enable()
|
toolTipLabel:enable()
|
||||||
g_effects.fadeIn(toolTipLabel, 100)
|
g_effects.fadeIn(toolTipLabel, 100)
|
||||||
moveToolTip(true)
|
moveToolTip(true)
|
||||||
|
|
||||||
connect(rootWidget, {
|
|
||||||
onMouseMove = moveToolTip,
|
|
||||||
})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function g_tooltip.hide()
|
function g_tooltip.hide()
|
||||||
g_effects.fadeOut(toolTipLabel, 100)
|
g_effects.fadeOut(toolTipLabel, 100)
|
||||||
|
|
||||||
disconnect(rootWidget, {
|
|
||||||
onMouseMove = moveToolTip,
|
|
||||||
})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@@ -19,14 +19,13 @@ function UIComboBox:clearOptions()
|
|||||||
self:clearText()
|
self:clearText()
|
||||||
end
|
end
|
||||||
|
|
||||||
function UIComboBox:isOption(text)
|
function UIComboBox:getOption(text)
|
||||||
if not self.options then return false end
|
if not self.options then return nil end
|
||||||
for i,v in ipairs(self.options) do
|
for i,v in ipairs(self.options) do
|
||||||
if v.text == text then
|
if v.text == text then
|
||||||
return true
|
return nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function UIComboBox:setOption(text, dontSignal)
|
function UIComboBox:setOption(text, dontSignal)
|
||||||
|
@@ -3,7 +3,6 @@ UIMiniWindow = extends(UIWindow, "UIMiniWindow")
|
|||||||
|
|
||||||
function UIMiniWindow.create()
|
function UIMiniWindow.create()
|
||||||
local miniwindow = UIMiniWindow.internalCreate()
|
local miniwindow = UIMiniWindow.internalCreate()
|
||||||
miniwindow.UIMiniWindowContainer = true
|
|
||||||
return miniwindow
|
return miniwindow
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -69,7 +69,7 @@ function UIMiniWindowContainer:fitAll(noRemoveChild)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local child = children[i]
|
local child = children[i]
|
||||||
if child ~= noRemoveChild and child:isVisible() then
|
if child ~= noRemoveChild then
|
||||||
local childHeight = child:getHeight()
|
local childHeight = child:getHeight()
|
||||||
sumHeight = sumHeight - childHeight
|
sumHeight = sumHeight - childHeight
|
||||||
table.insert(removeChildren, child)
|
table.insert(removeChildren, child)
|
||||||
@@ -83,7 +83,7 @@ function UIMiniWindowContainer:fitAll(noRemoveChild)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function UIMiniWindowContainer:onDrop(widget, mousePos)
|
function UIMiniWindowContainer:onDrop(widget, mousePos)
|
||||||
if widget.UIMiniWindowContainer then
|
if widget:getClassName() == 'UIMiniWindow' then
|
||||||
local oldParent = widget:getParent()
|
local oldParent = widget:getParent()
|
||||||
if oldParent == self then
|
if oldParent == self then
|
||||||
return true
|
return true
|
||||||
|
@@ -334,12 +334,9 @@ function UIMoveableTabBar:removeTab(tab)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if self.currentTab == tab then
|
if self.currentTab == tab then
|
||||||
|
self:selectPrevTab()
|
||||||
if #self.tabs == 1 then
|
if #self.tabs == 1 then
|
||||||
self.currentTab = nil
|
self.currentTab = nil
|
||||||
elseif index == #self.tabs then
|
|
||||||
self:selectPrevTab()
|
|
||||||
else
|
|
||||||
self:selectNextTab()
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
table.remove(tabTable, index)
|
table.remove(tabTable, index)
|
||||||
@@ -388,11 +385,6 @@ function UIMoveableTabBar:selectTab(tab)
|
|||||||
tab:setOn(false)
|
tab:setOn(false)
|
||||||
tab.blinking = false
|
tab.blinking = false
|
||||||
|
|
||||||
if tab.blinkEvent then
|
|
||||||
removeEvent(tab.blinkEvent)
|
|
||||||
tab.blinkEvent = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
local parent = tab:getParent()
|
local parent = tab:getParent()
|
||||||
parent:focusChild(tab, MouseFocusReason)
|
parent:focusChild(tab, MouseFocusReason)
|
||||||
updateNavigation(self)
|
updateNavigation(self)
|
||||||
|
@@ -126,8 +126,8 @@ end
|
|||||||
function UIScrollBar:onSetup()
|
function UIScrollBar:onSetup()
|
||||||
self.setupDone = true
|
self.setupDone = true
|
||||||
local sliderButton = self:getChildById('sliderButton')
|
local sliderButton = self:getChildById('sliderButton')
|
||||||
g_mouse.bindAutoPress(self:getChildById('decrementButton'), function() self:onDecrement() end, 300)
|
g_mouse.bindAutoPress(self:getChildById('decrementButton'), function() self:decrement() end, 300)
|
||||||
g_mouse.bindAutoPress(self:getChildById('incrementButton'), function() self:onIncrement() end, 300)
|
g_mouse.bindAutoPress(self:getChildById('incrementButton'), function() self:increment() end, 300)
|
||||||
g_mouse.bindPressMove(sliderButton, function(mousePos, mouseMoved) parseSliderPos(self, sliderButton, mousePos, mouseMoved) end)
|
g_mouse.bindPressMove(sliderButton, function(mousePos, mouseMoved) parseSliderPos(self, sliderButton, mousePos, mouseMoved) end)
|
||||||
g_mouse.bindPress(sliderButton, function(mousePos, mouseButton) parseSliderPress(self, sliderButton, mousePos, mouseButton) end)
|
g_mouse.bindPress(sliderButton, function(mousePos, mouseButton) parseSliderPress(self, sliderButton, mousePos, mouseButton) end)
|
||||||
|
|
||||||
@@ -158,26 +158,6 @@ function UIScrollBar:onStyleApply(styleName, styleNode)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function UIScrollBar:onDecrement()
|
|
||||||
if g_keyboard.isCtrlPressed() then
|
|
||||||
self:decrement(self.value)
|
|
||||||
elseif g_keyboard.isShiftPressed() then
|
|
||||||
self:decrement(10)
|
|
||||||
else
|
|
||||||
self:decrement()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function UIScrollBar:onIncrement()
|
|
||||||
if g_keyboard.isCtrlPressed() then
|
|
||||||
self:increment(self.maximum)
|
|
||||||
elseif g_keyboard.isShiftPressed() then
|
|
||||||
self:increment(10)
|
|
||||||
else
|
|
||||||
self:increment()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function UIScrollBar:decrement(count)
|
function UIScrollBar:decrement(count)
|
||||||
count = count or self.step
|
count = count or self.step
|
||||||
self:setValue(self.value - count)
|
self:setValue(self.value - count)
|
||||||
@@ -284,4 +264,4 @@ function UIScrollBar:getStep() return self.step end
|
|||||||
function UIScrollBar:getOrientation() return self.orientation end
|
function UIScrollBar:getOrientation() return self.orientation end
|
||||||
function UIScrollBar:getShowValue() return self.showValue end
|
function UIScrollBar:getShowValue() return self.showValue end
|
||||||
function UIScrollBar:getSymbol() return self.symbol end
|
function UIScrollBar:getSymbol() return self.symbol end
|
||||||
function UIScrollBar:getMouseScroll() return self.mouseScroll end
|
function UIScrollBar:getMouseScroll() return self.mouseScroll end
|
@@ -77,13 +77,7 @@ function UITabBar:removeTab(tab)
|
|||||||
local index = table.find(self.tabs, tab)
|
local index = table.find(self.tabs, tab)
|
||||||
if index == nil then return end
|
if index == nil then return end
|
||||||
if self.currentTab == tab then
|
if self.currentTab == tab then
|
||||||
if #self.tabs == 1 then
|
self:selectPrevTab()
|
||||||
self.currentTab = nil
|
|
||||||
elseif index == #self.tabs then
|
|
||||||
self:selectPrevTab()
|
|
||||||
else
|
|
||||||
self:selectNextTab()
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
table.remove(self.tabs, index)
|
table.remove(self.tabs, index)
|
||||||
tab:destroy()
|
tab:destroy()
|
||||||
|
@@ -244,32 +244,26 @@ function doCreatureFitFilters(creature)
|
|||||||
|
|
||||||
local localPlayer = g_game.getLocalPlayer()
|
local localPlayer = g_game.getLocalPlayer()
|
||||||
if pos.z ~= localPlayer:getPosition().z or not creature:canBeSeen() then return false end
|
if pos.z ~= localPlayer:getPosition().z or not creature:canBeSeen() then return false end
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
function doShowCreatureAtBattle(creature)
|
local hidePlayers = hidePlayersButton:isChecked()
|
||||||
if doCreatureFitFilters(creature) then
|
local hideNPCs = hideNPCsButton:isChecked()
|
||||||
local hidePlayers = hidePlayersButton:isChecked()
|
local hideMonsters = hideMonstersButton:isChecked()
|
||||||
local hideNPCs = hideNPCsButton:isChecked()
|
local hideSkulls = hideSkullsButton:isChecked()
|
||||||
local hideMonsters = hideMonstersButton:isChecked()
|
local hideParty = hidePartyButton:isChecked()
|
||||||
local hideSkulls = hideSkullsButton:isChecked()
|
|
||||||
local hideParty = hidePartyButton:isChecked()
|
|
||||||
|
|
||||||
if hidePlayers and creature:isPlayer() then
|
if hidePlayers and creature:isPlayer() then
|
||||||
return false
|
return false
|
||||||
elseif hideNPCs and creature:isNpc() then
|
elseif hideNPCs and creature:isNpc() then
|
||||||
return false
|
return false
|
||||||
elseif hideMonsters and creature:isMonster() then
|
elseif hideMonsters and creature:isMonster() then
|
||||||
return false
|
return false
|
||||||
elseif hideSkulls and creature:isPlayer() and creature:getSkull() == SkullNone then
|
elseif hideSkulls and creature:isPlayer() and creature:getSkull() == SkullNone then
|
||||||
return false
|
return false
|
||||||
elseif hideParty and creature:getShield() > ShieldWhiteBlue then
|
elseif hideParty and creature:getShield() > ShieldWhiteBlue then
|
||||||
return false
|
return false
|
||||||
end
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
end
|
||||||
return false
|
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
function onCreatureHealthPercentChange(creature, health)
|
function onCreatureHealthPercentChange(creature, health)
|
||||||
@@ -458,7 +452,7 @@ function addCreature(creature)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local localPlayer = g_game.getLocalPlayer()
|
local localPlayer = g_game.getLocalPlayer()
|
||||||
battleButton:setVisible(localPlayer:hasSight(creature:getPosition()) and creature:canBeSeen() and doShowCreatureAtBattle(creature))
|
battleButton:setVisible(localPlayer:hasSight(creature:getPosition()) and creature:canBeSeen())
|
||||||
end
|
end
|
||||||
|
|
||||||
function removeAllCreatures()
|
function removeAllCreatures()
|
||||||
@@ -490,10 +484,10 @@ function onBattleButtonMouseRelease(self, mousePosition, mouseButton)
|
|||||||
if ((g_mouse.isPressed(MouseLeftButton) and mouseButton == MouseRightButton)
|
if ((g_mouse.isPressed(MouseLeftButton) and mouseButton == MouseRightButton)
|
||||||
or (g_mouse.isPressed(MouseRightButton) and mouseButton == MouseLeftButton)) then
|
or (g_mouse.isPressed(MouseRightButton) and mouseButton == MouseLeftButton)) then
|
||||||
mouseWidget.cancelNextRelease = true
|
mouseWidget.cancelNextRelease = true
|
||||||
g_game.look(self.creature, true)
|
g_game.look(self.creature)
|
||||||
return true
|
return true
|
||||||
elseif mouseButton == MouseLeftButton and g_keyboard.isShiftPressed() then
|
elseif mouseButton == MouseLeftButton and g_keyboard.isShiftPressed() then
|
||||||
g_game.look(self.creature, true)
|
g_game.look(self.creature)
|
||||||
return true
|
return true
|
||||||
elseif mouseButton == MouseRightButton and not g_mouse.isPressed(MouseLeftButton) then
|
elseif mouseButton == MouseRightButton and not g_mouse.isPressed(MouseLeftButton) then
|
||||||
modules.game_interface.createThingMenu(mousePosition, nil, nil, self.creature)
|
modules.game_interface.createThingMenu(mousePosition, nil, nil, self.creature)
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: game_battle
|
name: game_battle
|
||||||
description: Manage battle window
|
description: Manage battle window
|
||||||
author: andrefaramir, BeniS
|
author: andrefaramir, BeniS
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [ battle ]
|
scripts: [ battle ]
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: game_bugreport
|
name: game_bugreport
|
||||||
description: Bug report interface (Ctrl+Z)
|
description: Bug report interface (Ctrl+Z)
|
||||||
author: edubart
|
author: edubart
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
scripts: [ bugreport ]
|
scripts: [ bugreport ]
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: game_combatcontrols
|
name: game_combatcontrols
|
||||||
description: Combat controls window
|
description: Combat controls window
|
||||||
author: edubart, BeniS
|
author: edubart, BeniS
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [ combatcontrols ]
|
scripts: [ combatcontrols ]
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
|
@@ -25,7 +25,7 @@ MainWindow
|
|||||||
|
|
||||||
Label
|
Label
|
||||||
id: openPrivateChannelWithLabel
|
id: openPrivateChannelWithLabel
|
||||||
!text: tr('Open a private message channel') .. ':'
|
!text: tr('Open a private message channel:')
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.bottom: next.top
|
anchors.bottom: next.top
|
||||||
|
@@ -35,7 +35,7 @@ MainWindow
|
|||||||
width: 180
|
width: 180
|
||||||
|
|
||||||
Label
|
Label
|
||||||
!text: tr('Ignored Players') .. ':'
|
!text: tr('Ignored Players:')
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.top: prev.bottom
|
anchors.top: prev.bottom
|
||||||
margin-top: 10
|
margin-top: 10
|
||||||
@@ -108,7 +108,7 @@ MainWindow
|
|||||||
width: 180
|
width: 180
|
||||||
|
|
||||||
Label
|
Label
|
||||||
!text: tr('Allowed Players') .. ':'
|
!text: tr('Allowed Players:')
|
||||||
anchors.top: prev.bottom
|
anchors.top: prev.bottom
|
||||||
anchors.left: prev.left
|
anchors.left: prev.left
|
||||||
margin-top: 10
|
margin-top: 10
|
||||||
|
@@ -52,13 +52,6 @@ SayModes = {
|
|||||||
[3] = { speakTypeDesc = 'yell', icon = '/images/game/console/yell' }
|
[3] = { speakTypeDesc = 'yell', icon = '/images/game/console/yell' }
|
||||||
}
|
}
|
||||||
|
|
||||||
ChannelEventFormats = {
|
|
||||||
[ChannelEvent.Join] = '%s joined the channel.',
|
|
||||||
[ChannelEvent.Leave] = '%s left the channel.',
|
|
||||||
[ChannelEvent.Invite] = '%s has been invited to the channel.',
|
|
||||||
[ChannelEvent.Exclude] = '%s has been removed from the channel.',
|
|
||||||
}
|
|
||||||
|
|
||||||
MAX_HISTORY = 500
|
MAX_HISTORY = 500
|
||||||
MAX_LINES = 100
|
MAX_LINES = 100
|
||||||
HELP_CHANNEL = 9
|
HELP_CHANNEL = 9
|
||||||
@@ -105,8 +98,7 @@ function init()
|
|||||||
onRuleViolationCancel = onRuleViolationCancel,
|
onRuleViolationCancel = onRuleViolationCancel,
|
||||||
onRuleViolationLock = onRuleViolationLock,
|
onRuleViolationLock = onRuleViolationLock,
|
||||||
onGameStart = online,
|
onGameStart = online,
|
||||||
onGameEnd = offline,
|
onGameEnd = offline
|
||||||
onChannelEvent = onChannelEvent,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
consolePanel = g_ui.loadUI('console', modules.game_interface.getBottomPanel())
|
consolePanel = g_ui.loadUI('console', modules.game_interface.getBottomPanel())
|
||||||
@@ -248,8 +240,7 @@ function terminate()
|
|||||||
onRuleViolationCancel = onRuleViolationCancel,
|
onRuleViolationCancel = onRuleViolationCancel,
|
||||||
onRuleViolationLock = onRuleViolationLock,
|
onRuleViolationLock = onRuleViolationLock,
|
||||||
onGameStart = online,
|
onGameStart = online,
|
||||||
onGameEnd = offline,
|
onGameEnd = offline
|
||||||
onChannelEvent = onChannelEvent,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
if g_game.isOnline() then clear() end
|
if g_game.isOnline() then clear() end
|
||||||
@@ -553,8 +544,6 @@ function addTabText(text, speaktype, tab, creatureName)
|
|||||||
label:setColor(speaktype.color)
|
label:setColor(speaktype.color)
|
||||||
consoleTabBar:blinkTab(tab)
|
consoleTabBar:blinkTab(tab)
|
||||||
|
|
||||||
label.highlightInfo = {}
|
|
||||||
|
|
||||||
-- Overlay for consoleBuffer which shows highlighted words only
|
-- Overlay for consoleBuffer which shows highlighted words only
|
||||||
|
|
||||||
if speaktype.npcChat and (g_game.getCharacterName() ~= creatureName or g_game.getCharacterName() == 'Account Manager') then
|
if speaktype.npcChat and (g_game.getCharacterName() ~= creatureName or g_game.getCharacterName() == 'Account Manager') then
|
||||||
@@ -584,10 +573,6 @@ function addTabText(text, speaktype, tab, creatureName)
|
|||||||
local dataBlock = { _start = highlightData[(i-1)*3+1], _end = highlightData[(i-1)*3+2], words = highlightData[(i-1)*3+3] }
|
local dataBlock = { _start = highlightData[(i-1)*3+1], _end = highlightData[(i-1)*3+2], words = highlightData[(i-1)*3+3] }
|
||||||
local lastBlockEnd = (highlightData[(i-2)*3+2] or 1)
|
local lastBlockEnd = (highlightData[(i-2)*3+2] or 1)
|
||||||
|
|
||||||
for i = dataBlock._start, dataBlock._end do
|
|
||||||
label.highlightInfo[i] = dataBlock.words
|
|
||||||
end
|
|
||||||
|
|
||||||
for letter = lastBlockEnd, dataBlock._start-1 do
|
for letter = lastBlockEnd, dataBlock._start-1 do
|
||||||
local tmpChar = string.byte(drawText:sub(letter, letter))
|
local tmpChar = string.byte(drawText:sub(letter, letter))
|
||||||
local fillChar = (tmpChar == 10 or tmpChar == 32) and string.char(tmpChar) or string.char(127)
|
local fillChar = (tmpChar == 10 or tmpChar == 32) and string.char(tmpChar) or string.char(127)
|
||||||
@@ -615,14 +600,7 @@ function addTabText(text, speaktype, tab, creatureName)
|
|||||||
processMessageMenu(mousePos, mouseButton, nil, nil, nil, tab)
|
processMessageMenu(mousePos, mouseButton, nil, nil, nil, tab)
|
||||||
end
|
end
|
||||||
label.onMouseRelease = function(self, mousePos, mouseButton)
|
label.onMouseRelease = function(self, mousePos, mouseButton)
|
||||||
if mouseButton == MouseLeftButton then
|
processMessageMenu(mousePos, mouseButton, creatureName, text, self, tab)
|
||||||
local position = label:getTextPos(mousePos)
|
|
||||||
if position and label.highlightInfo[position] then
|
|
||||||
sendMessage(label.highlightInfo[position], npcTab)
|
|
||||||
end
|
|
||||||
elseif mouseButton == MouseRightButton then
|
|
||||||
processMessageMenu(mousePos, mouseButton, creatureName, text, self, tab)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
label.onMousePress = function(self, mousePos, button)
|
label.onMousePress = function(self, mousePos, button)
|
||||||
if button == MouseLeftButton then clearSelection(consoleBuffer) end
|
if button == MouseLeftButton then clearSelection(consoleBuffer) end
|
||||||
@@ -706,7 +684,7 @@ function addTabText(text, speaktype, tab, creatureName)
|
|||||||
child:setSelection(string.len(child:getText()), textPos)
|
child:setSelection(string.len(child:getText()), textPos)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -731,8 +709,6 @@ function processChannelTabMenu(tab, mousePos, mouseButton)
|
|||||||
local menu = g_ui.createWidget('PopupMenu')
|
local menu = g_ui.createWidget('PopupMenu')
|
||||||
menu:setGameMenu(true)
|
menu:setGameMenu(true)
|
||||||
|
|
||||||
local worldName = g_game.getWorldName()
|
|
||||||
local characterName = g_game.getCharacterName()
|
|
||||||
channelName = tab:getText()
|
channelName = tab:getText()
|
||||||
if tab ~= defaultTab and tab ~= serverTab then
|
if tab ~= defaultTab and tab ~= serverTab then
|
||||||
menu:addOption(tr('Close'), function() removeTab(channelName) end)
|
menu:addOption(tr('Close'), function() removeTab(channelName) end)
|
||||||
@@ -750,7 +726,7 @@ function processChannelTabMenu(tab, mousePos, mouseButton)
|
|||||||
table.insert(lines, label:getText())
|
table.insert(lines, label:getText())
|
||||||
end
|
end
|
||||||
|
|
||||||
local filename = worldName .. ' - ' .. characterName .. ' - ' .. channelName .. '.txt'
|
local filename = channelName .. '.txt'
|
||||||
local filepath = '/' .. filename
|
local filepath = '/' .. filename
|
||||||
|
|
||||||
-- extra information at the beginning
|
-- extra information at the beginning
|
||||||
@@ -879,14 +855,14 @@ function sendMessage(message, tab)
|
|||||||
message = chatCommandMessage
|
message = chatCommandMessage
|
||||||
channel = 0
|
channel = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
-- player red talk on channel
|
-- player red talk on channel
|
||||||
chatCommandMessage = message:match("^%#[c|C] (.*)")
|
chatCommandMessage = message:match("^%#[c|C] (.*)")
|
||||||
if chatCommandMessage ~= nil then
|
if chatCommandMessage ~= nil then
|
||||||
chatCommandSayMode = 'channelRed'
|
chatCommandSayMode = 'channelRed'
|
||||||
message = chatCommandMessage
|
message = chatCommandMessage
|
||||||
end
|
end
|
||||||
|
|
||||||
-- player broadcast
|
-- player broadcast
|
||||||
chatCommandMessage = message:match("^%#[b|B] (.*)")
|
chatCommandMessage = message:match("^%#[b|B] (.*)")
|
||||||
if chatCommandMessage ~= nil then
|
if chatCommandMessage ~= nil then
|
||||||
@@ -1000,7 +976,7 @@ function navigateMessageHistory(step)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function applyMessagePrefixies(name, level, message)
|
function applyMessagePrefixies(name, level, message)
|
||||||
if name and #name > 0 then
|
if name then
|
||||||
if modules.client_options.getOption('showLevelsInConsole') and level > 0 then
|
if modules.client_options.getOption('showLevelsInConsole') and level > 0 then
|
||||||
message = name .. ' [' .. level .. ']: ' .. message
|
message = name .. ' [' .. level .. ']: ' .. message
|
||||||
else
|
else
|
||||||
@@ -1016,9 +992,7 @@ function onTalk(name, level, mode, message, channelId, creaturePos)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local isNpcMode = (mode == MessageModes.NpcFromStartBlock or mode == MessageModes.NpcFrom)
|
if ignoreNpcMessages and mode == MessageModes.NpcFrom then return end
|
||||||
|
|
||||||
if ignoreNpcMessages and isNpcMode then return end
|
|
||||||
|
|
||||||
speaktype = SpeakTypes[mode]
|
speaktype = SpeakTypes[mode]
|
||||||
|
|
||||||
@@ -1034,7 +1008,7 @@ function onTalk(name, level, mode, message, channelId, creaturePos)
|
|||||||
|
|
||||||
if mode == MessageModes.Yell and isIgnoringYelling() then
|
if mode == MessageModes.Yell and isIgnoringYelling() then
|
||||||
return
|
return
|
||||||
elseif speaktype.private and isIgnoringPrivate() and not isNpcMode then
|
elseif speaktype.private and isIgnoringPrivate() and mode ~= MessageModes.NpcFrom then
|
||||||
return
|
return
|
||||||
elseif isIgnored(name) then
|
elseif isIgnored(name) then
|
||||||
return
|
return
|
||||||
@@ -1052,7 +1026,7 @@ function onTalk(name, level, mode, message, channelId, creaturePos)
|
|||||||
local staticText = StaticText.create()
|
local staticText = StaticText.create()
|
||||||
-- Remove curly braces from screen message
|
-- Remove curly braces from screen message
|
||||||
local staticMessage = message
|
local staticMessage = message
|
||||||
if isNpcMode then
|
if mode == MessageModes.NpcFrom or mode == MessageModes.NpcFromStartBlock then
|
||||||
local highlightData = getHighlightedText(staticMessage)
|
local highlightData = getHighlightedText(staticMessage)
|
||||||
if #highlightData > 0 then
|
if #highlightData > 0 then
|
||||||
for i = 1, #highlightData / 3 do
|
for i = 1, #highlightData / 3 do
|
||||||
@@ -1215,15 +1189,15 @@ function loadCommunicationSettings()
|
|||||||
|
|
||||||
local ignoreNode = g_settings.getNode('IgnorePlayers')
|
local ignoreNode = g_settings.getNode('IgnorePlayers')
|
||||||
if ignoreNode then
|
if ignoreNode then
|
||||||
for _, player in pairs(ignoreNode) do
|
for i = 1, #ignoreNode do
|
||||||
table.insert(communicationSettings.ignoredPlayers, player)
|
table.insert(communicationSettings.ignoredPlayers, ignoreNode[i])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local whitelistNode = g_settings.getNode('WhitelistedPlayers')
|
local whitelistNode = g_settings.getNode('WhitelistedPlayers')
|
||||||
if whitelistNode then
|
if whitelistNode then
|
||||||
for _, player in pairs(whitelistNode) do
|
for i = 1, #whitelistNode do
|
||||||
table.insert(communicationSettings.whitelistedPlayers, player)
|
table.insert(communicationSettings.whitelistedPlayers, whitelistNode[i])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1459,19 +1433,3 @@ function offline()
|
|||||||
end
|
end
|
||||||
clear()
|
clear()
|
||||||
end
|
end
|
||||||
|
|
||||||
function onChannelEvent(channelId, name, type)
|
|
||||||
local fmt = ChannelEventFormats[type]
|
|
||||||
if not fmt then
|
|
||||||
print(('Unknown channel event type (%d).'):format(type))
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local channel = channels[channelId]
|
|
||||||
if channel then
|
|
||||||
local tab = getTab(channel)
|
|
||||||
if tab then
|
|
||||||
addTabText(fmt:format(name), SpeakTypesSettings.channelOrange, tab)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: game_console
|
name: game_console
|
||||||
description: Manage chat window
|
description: Manage chat window
|
||||||
author: edubart, andrefaramir, baxnie, sn4ake, BeniS
|
author: edubart, andrefaramir, baxnie, sn4ake, BeniS
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [ console ]
|
scripts: [ console ]
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
|
@@ -110,7 +110,6 @@ function onContainerOpen(container, previousContainer)
|
|||||||
containerWindow:setText(name)
|
containerWindow:setText(name)
|
||||||
|
|
||||||
containerItemWidget:setItem(container:getContainerItem())
|
containerItemWidget:setItem(container:getContainerItem())
|
||||||
containerItemWidget:setPhantom(true)
|
|
||||||
|
|
||||||
containerPanel:destroyChildren()
|
containerPanel:destroyChildren()
|
||||||
for slot=0,container:getCapacity()-1 do
|
for slot=0,container:getCapacity()-1 do
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: game_containers
|
name: game_containers
|
||||||
description: Manage containers
|
description: Manage containers
|
||||||
author: edubart, baxnie
|
author: edubart, baxnie
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [containers]
|
scripts: [containers]
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: game_cooldown
|
name: game_cooldown
|
||||||
description: Spellcooldowns
|
description: Spellcooldowns
|
||||||
author: OTClient team
|
author: OTClient team
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [ cooldown ]
|
scripts: [ cooldown ]
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: game_healthinfo
|
name: game_healthinfo
|
||||||
description: Displays health, mana points, soul points, and conditions
|
description: Displays health, mana points, soul points, and conditions
|
||||||
author: edubart, BeniS
|
author: edubart, BeniS
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [ healthinfo ]
|
scripts: [ healthinfo ]
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
|
@@ -36,7 +36,6 @@ useRadioGroup = nil
|
|||||||
currentHotkeys = nil
|
currentHotkeys = nil
|
||||||
boundCombosCallback = {}
|
boundCombosCallback = {}
|
||||||
hotkeysList = {}
|
hotkeysList = {}
|
||||||
lastHotkeyTime = g_clock.millis()
|
|
||||||
|
|
||||||
-- public functions
|
-- public functions
|
||||||
function init()
|
function init()
|
||||||
@@ -375,12 +374,6 @@ function doKeyCombo(keyCombo)
|
|||||||
if not g_game.isOnline() then return end
|
if not g_game.isOnline() then return end
|
||||||
local hotKey = hotkeyList[keyCombo]
|
local hotKey = hotkeyList[keyCombo]
|
||||||
if not hotKey then return end
|
if not hotKey then return end
|
||||||
|
|
||||||
if g_clock.millis() - lastHotkeyTime < modules.client_options.getOption('hotkeyDelay') then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
lastHotkeyTime = g_clock.millis()
|
|
||||||
|
|
||||||
if hotKey.itemId == nil then
|
if hotKey.itemId == nil then
|
||||||
if not hotKey.value or #hotKey.value == 0 then return end
|
if not hotKey.value or #hotKey.value == 0 then return end
|
||||||
if hotKey.autoSend then
|
if hotKey.autoSend then
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: game_hotkeys
|
name: game_hotkeys
|
||||||
description: Manage client hotkeys
|
description: Manage client hotkeys
|
||||||
author: andrefaramir, BeniS
|
author: andrefaramir, BeniS
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [ hotkeys_manager ]
|
scripts: [ hotkeys_manager ]
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
|
@@ -18,7 +18,7 @@ MainWindow
|
|||||||
|
|
||||||
Label
|
Label
|
||||||
id: currentHotkeysLabel
|
id: currentHotkeysLabel
|
||||||
!text: tr('Current hotkeys') .. ':'
|
!text: tr('Current hotkeys:')
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
@@ -70,7 +70,7 @@ MainWindow
|
|||||||
|
|
||||||
Label
|
Label
|
||||||
id: hotKeyTextLabel
|
id: hotKeyTextLabel
|
||||||
!text: tr('Edit hotkey text') .. ':'
|
!text: tr('Edit hotkey text:')
|
||||||
enable: false
|
enable: false
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
|
@@ -5,7 +5,6 @@ gameMapPanel = nil
|
|||||||
gameRightPanel = nil
|
gameRightPanel = nil
|
||||||
gameLeftPanel = nil
|
gameLeftPanel = nil
|
||||||
gameBottomPanel = nil
|
gameBottomPanel = nil
|
||||||
showTopMenuButton = nil
|
|
||||||
logoutButton = nil
|
logoutButton = nil
|
||||||
mouseGrabberWidget = nil
|
mouseGrabberWidget = nil
|
||||||
countWindow = nil
|
countWindow = nil
|
||||||
@@ -18,7 +17,6 @@ smartWalkDirs = {}
|
|||||||
smartWalkDir = nil
|
smartWalkDir = nil
|
||||||
walkFunction = nil
|
walkFunction = nil
|
||||||
hookedMenuOptions = {}
|
hookedMenuOptions = {}
|
||||||
lastDirTime = g_clock.millis()
|
|
||||||
|
|
||||||
function init()
|
function init()
|
||||||
g_ui.importStyle('styles/countwindow')
|
g_ui.importStyle('styles/countwindow')
|
||||||
@@ -57,11 +55,6 @@ function init()
|
|||||||
logoutButton = modules.client_topmenu.addLeftButton('logoutButton', tr('Exit'),
|
logoutButton = modules.client_topmenu.addLeftButton('logoutButton', tr('Exit'),
|
||||||
'/images/topbuttons/logout', tryLogout, true)
|
'/images/topbuttons/logout', tryLogout, true)
|
||||||
|
|
||||||
showTopMenuButton = gameMapPanel:getChildById('showTopMenuButton')
|
|
||||||
showTopMenuButton.onClick = function()
|
|
||||||
modules.client_topmenu.toggle()
|
|
||||||
end
|
|
||||||
|
|
||||||
setupViewMode(0)
|
setupViewMode(0)
|
||||||
|
|
||||||
bindKeys()
|
bindKeys()
|
||||||
@@ -87,15 +80,14 @@ function bindKeys()
|
|||||||
bindWalkKey('Numpad4', West)
|
bindWalkKey('Numpad4', West)
|
||||||
bindWalkKey('Numpad7', NorthWest)
|
bindWalkKey('Numpad7', NorthWest)
|
||||||
|
|
||||||
bindTurnKey('Ctrl+Up', North)
|
g_keyboard.bindKeyPress('Ctrl+Up', function() g_game.turn(North) changeWalkDir(North) end, gameRootPanel)
|
||||||
bindTurnKey('Ctrl+Right', East)
|
g_keyboard.bindKeyPress('Ctrl+Right', function() g_game.turn(East) changeWalkDir(East) end, gameRootPanel)
|
||||||
bindTurnKey('Ctrl+Down', South)
|
g_keyboard.bindKeyPress('Ctrl+Down', function() g_game.turn(South) changeWalkDir(South) end, gameRootPanel)
|
||||||
bindTurnKey('Ctrl+Left', West)
|
g_keyboard.bindKeyPress('Ctrl+Left', function() g_game.turn(West) changeWalkDir(West) end, gameRootPanel)
|
||||||
bindTurnKey('Ctrl+Numpad8', North)
|
g_keyboard.bindKeyPress('Ctrl+Numpad8', function() g_game.turn(North) changeWalkDir(North) end, gameRootPanel)
|
||||||
bindTurnKey('Ctrl+Numpad6', East)
|
g_keyboard.bindKeyPress('Ctrl+Numpad6', function() g_game.turn(East) changeWalkDir(East) end, gameRootPanel)
|
||||||
bindTurnKey('Ctrl+Numpad2', South)
|
g_keyboard.bindKeyPress('Ctrl+Numpad2', function() g_game.turn(South) changeWalkDir(South) end, gameRootPanel)
|
||||||
bindTurnKey('Ctrl+Numpad4', West)
|
g_keyboard.bindKeyPress('Ctrl+Numpad4', function() g_game.turn(West) changeWalkDir(West) end, gameRootPanel)
|
||||||
|
|
||||||
g_keyboard.bindKeyPress('Escape', function() g_game.cancelAttackAndFollow() end, gameRootPanel)
|
g_keyboard.bindKeyPress('Escape', function() g_game.cancelAttackAndFollow() end, gameRootPanel)
|
||||||
g_keyboard.bindKeyPress('Ctrl+=', function() gameMapPanel:zoomIn() end, gameRootPanel)
|
g_keyboard.bindKeyPress('Ctrl+=', function() gameMapPanel:zoomIn() end, gameRootPanel)
|
||||||
g_keyboard.bindKeyPress('Ctrl+-', function() gameMapPanel:zoomOut() end, gameRootPanel)
|
g_keyboard.bindKeyPress('Ctrl+-', function() gameMapPanel:zoomOut() end, gameRootPanel)
|
||||||
@@ -117,19 +109,6 @@ function unbindWalkKey(key)
|
|||||||
g_keyboard.unbindKeyPress(key, gameRootPanel)
|
g_keyboard.unbindKeyPress(key, gameRootPanel)
|
||||||
end
|
end
|
||||||
|
|
||||||
function bindTurnKey(key, dir)
|
|
||||||
local function callback(widget, code, repeatTicks)
|
|
||||||
if g_clock.millis() - lastDirTime >= modules.client_options.getOption('turnDelay') then
|
|
||||||
g_game.turn(dir)
|
|
||||||
changeWalkDir(dir)
|
|
||||||
|
|
||||||
lastDirTime = g_clock.millis()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
g_keyboard.bindKeyPress(key, callback, gameRootPanel)
|
|
||||||
end
|
|
||||||
|
|
||||||
function terminate()
|
function terminate()
|
||||||
hide()
|
hide()
|
||||||
|
|
||||||
@@ -407,11 +386,6 @@ function onTradeWith(clickedWidget, mousePosition)
|
|||||||
if tile then
|
if tile then
|
||||||
g_game.requestTrade(selectedThing, tile:getTopCreature())
|
g_game.requestTrade(selectedThing, tile:getTopCreature())
|
||||||
end
|
end
|
||||||
elseif clickedWidget:getClassName() == 'UICreatureButton' then
|
|
||||||
local creature = clickedWidget:getCreature()
|
|
||||||
if creature then
|
|
||||||
g_game.requestTrade(selectedThing, creature)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -821,10 +795,6 @@ function getBottomPanel()
|
|||||||
return gameBottomPanel
|
return gameBottomPanel
|
||||||
end
|
end
|
||||||
|
|
||||||
function getShowTopMenuButton()
|
|
||||||
return showTopMenuButton
|
|
||||||
end
|
|
||||||
|
|
||||||
function onLeftPanelVisibilityChange(leftPanel, visible)
|
function onLeftPanelVisibilityChange(leftPanel, visible)
|
||||||
if not visible and g_game.isOnline() then
|
if not visible and g_game.isOnline() then
|
||||||
local children = leftPanel:getChildren()
|
local children = leftPanel:getChildren()
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
GameSidePanel < UIMiniWindowContainer
|
GameSidePanel < UIMiniWindowContainer
|
||||||
image-source: /images/ui/panel_side
|
image-source: /images/ui/panel_side
|
||||||
image-border: 4
|
image-border: 4
|
||||||
@@ -32,14 +33,6 @@ UIWidget
|
|||||||
anchors.bottom: gameBottomPanel.top
|
anchors.bottom: gameBottomPanel.top
|
||||||
focusable: false
|
focusable: false
|
||||||
|
|
||||||
Button
|
|
||||||
id: showTopMenuButton
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.left: parent.left
|
|
||||||
!text: tr('Show Top Menu')
|
|
||||||
height: 32
|
|
||||||
visible: false
|
|
||||||
|
|
||||||
GameBottomPanel
|
GameBottomPanel
|
||||||
id: gameBottomPanel
|
id: gameBottomPanel
|
||||||
anchors.left: gameLeftPanel.right
|
anchors.left: gameLeftPanel.right
|
||||||
@@ -80,4 +73,4 @@ UIWidget
|
|||||||
UIWidget
|
UIWidget
|
||||||
id: mouseGrabber
|
id: mouseGrabber
|
||||||
focusable: false
|
focusable: false
|
||||||
visible: false
|
visible: false
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: game_interface
|
name: game_interface
|
||||||
description: Create the game interface, where the ingame stuff starts
|
description: Create the game interface, where the ingame stuff starts
|
||||||
author: OTClient team
|
author: OTClient team
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [ widgets/uigamemap, widgets/uiitem, gameinterface ]
|
scripts: [ widgets/uigamemap, widgets/uiitem, gameinterface ]
|
||||||
load-later:
|
load-later:
|
||||||
|
@@ -30,30 +30,16 @@ function UIGameMap:onDragLeave(droppedWidget, mousePos)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function UIGameMap:onDrop(widget, mousePos)
|
function UIGameMap:onDrop(widget, mousePos)
|
||||||
if not self:canAcceptDrop(widget, mousePos) then
|
if not self:canAcceptDrop(widget, mousePos) then return false end
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
local tile = self:getTile(mousePos)
|
local tile = self:getTile(mousePos)
|
||||||
if not tile then
|
if not tile then return false end
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
local thing = widget.currentDragThing
|
local thing = widget.currentDragThing
|
||||||
local thingPos = thing:getPosition()
|
|
||||||
if not thingPos then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
local thingTile = thing:getTile()
|
|
||||||
if thingPos.x ~= 65535 and not thingTile then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
local toPos = tile:getPosition()
|
local toPos = tile:getPosition()
|
||||||
if thingPos.x == toPos.x and thingPos.y == toPos.y and thingPos.z == toPos.z then
|
|
||||||
return false
|
local thingPos = thing:getPosition()
|
||||||
end
|
if thingPos.x == toPos.x and thingPos.y == toPos.y and thingPos.z == toPos.z then return false end
|
||||||
|
|
||||||
if thing:isItem() and thing:getCount() > 1 then
|
if thing:isItem() and thing:getCount() > 1 then
|
||||||
modules.game_interface.moveStackableItem(thing, toPos)
|
modules.game_interface.moveStackableItem(thing, toPos)
|
||||||
|
@@ -20,26 +20,15 @@ function UIItem:onDragLeave(droppedWidget, mousePos)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function UIItem:onDrop(widget, mousePos)
|
function UIItem:onDrop(widget, mousePos)
|
||||||
|
if not self:canAcceptDrop(widget, mousePos) then return false end
|
||||||
if not self:canAcceptDrop(widget, mousePos) then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
local item = widget.currentDragThing
|
local item = widget.currentDragThing
|
||||||
if not item:isItem() then
|
if not item:isItem() then return false end
|
||||||
return false
|
|
||||||
end
|
local toPos = self.position
|
||||||
|
|
||||||
local itemPos = item:getPosition()
|
local itemPos = item:getPosition()
|
||||||
local itemTile = item:getTile()
|
if itemPos.x == toPos.x and itemPos.y == toPos.y and itemPos.z == toPos.z then return false end
|
||||||
if itemPos.x ~= 65535 and not itemTile then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
local toPos = self.position
|
|
||||||
if itemPos.x == toPos.x and itemPos.y == toPos.y and itemPos.z == toPos.z then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
if item:getCount() > 1 then
|
if item:getCount() > 1 then
|
||||||
modules.game_interface.moveStackableItem(item, toPos)
|
modules.game_interface.moveStackableItem(item, toPos)
|
||||||
|
@@ -2,7 +2,7 @@ Module
|
|||||||
name: game_inventory
|
name: game_inventory
|
||||||
description: View local player equipments window
|
description: View local player equipments window
|
||||||
author: baxnie, edubart, BeniS
|
author: baxnie, edubart, BeniS
|
||||||
website: https://github.com/edubart/otclient
|
website: www.otclient.info
|
||||||
sandboxed: true
|
sandboxed: true
|
||||||
scripts: [ inventory ]
|
scripts: [ inventory ]
|
||||||
@onLoad: init()
|
@onLoad: init()
|
||||||
|
@@ -990,7 +990,6 @@ function Market.close(notify)
|
|||||||
if not marketWindow:isHidden() then
|
if not marketWindow:isHidden() then
|
||||||
marketWindow:hide()
|
marketWindow:hide()
|
||||||
marketWindow:unlock()
|
marketWindow:unlock()
|
||||||
modules.game_interface.getRootPanel():focus()
|
|
||||||
Market.clearSelectedItem()
|
Market.clearSelectedItem()
|
||||||
Market.reset()
|
Market.reset()
|
||||||
if notify then
|
if notify then
|
||||||
|