400 Commits

Author SHA1 Message Date
Eduardo Bart
59c3e4467a Update v0.6.5 download link in README 2014-01-06 19:16:50 -02:00
Eduardo Bart
117833addc Update to version 0.6.5 2014-01-06 19:02:45 -02:00
Ahmed Samy
edf17a44ca Code cleanup 2014-01-06 14:35:57 +02:00
Sam
6db2458c1d Adding 10.31 to version list 2014-01-01 15:47:51 +01:00
Ahmed Samy
2556bfcbf2 Tab -> space 2013-12-30 18:13:49 +02:00
Ahmed Samy
9bdce800d8 Bind Container item code to lua 2013-12-30 18:10:45 +02:00
Ahmed Samy
9adab5f9bf Item serialization: Write description & text 2013-12-27 12:59:50 +02:00
Ahmed Samy
a6f998d406 Fix typo & bind ItemType::isWritable 2013-12-27 11:32:19 +02:00
Ahmed Samy
ab21558c47 Do not test for TILESTATE_NONE
This flag is ALWAYS set, cause it's always 0 i put there by mistake.
It causes an issue by simplying drawing everything dark, cause of
the opacity...
2013-12-27 05:10:00 +02:00
Sam
17c4d59b15 Enabling versions 7.8 to 8.0 2013-12-26 23:20:34 +01:00
Sam
d53f4dfa1e Merge pull request #419 from dominique120/master
Spanish translation improvement.
2013-12-26 13:46:08 -08:00
Sam
da959aca28 Support for protocol 7.7/7.72 / Tiny fix 2013-12-26 21:31:55 +01:00
Sam
91c182d93d Tiny typo fix :) 2013-12-26 19:39:40 +01:00
dominique120@live.com
6ecd49abe1 Fix recommended by @Bahamuntxd 2013-12-26 12:17:57 -05:00
Ahmed Samy
6745bff132 Introduce g_resources.getDirectoryFiles
This can recursively find files in a directory that's not in physfs search
path, this is needed for mapeditor needs, esp the file browser.

We do not want to limit users to the application run directory
so we have to use this.

This function uses boost filesystem.
Prototype:
	g_resources.getDirectoryFiles(directory STRING, filenameOnly BOOL,
	recursive BOOL)

filenameOnly is there if we want to just get the filenames in the
directory.
recursive if we want to loop directories in the directory.
2013-12-25 21:32:49 +02:00
Sam
27db78567b Fix writables in 7.6, fixes #416 2013-12-25 15:11:12 +01:00
Sam
83dd92cfec Merge pull request #417 from ronpetit/master
fixed outfit for 7.6 fix #415
2013-12-24 16:01:10 -08:00
dominique120@live.com
5605061435 fixed a little typo. 2013-12-24 17:47:08 -05:00
dominique120@live.com
241b178ebc Improved the Spanish translation by making some statements sound more formal and correcting a few other ones that where incorrect or that missed a few words. 2013-12-24 17:39:51 -05:00
Ron
d0288e23d8 Update outfit.lua
Fixed outfits for 7.6
2013-12-24 14:07:52 -04:30
Sam
9d8cf33acc Fix 7.60 login protocol 2013-12-23 23:45:49 +01:00
Sam
6a4868f2b5 Merge pull request #412 from LordHepipud/patch-1
Fix 7.70 RSA / XTEA encryption
2013-12-23 14:45:17 -08:00
LordHepipud
aa84ee4362 Fix 7.70 RSA / XTEA encryption
RSA / XTEA encryption was implemented with Client 7.70

~~~~Lord Hepipud~~~~
2013-12-23 23:31:59 +01:00
Henrique Santiago
1e17919a26 Use of createTable on containers 2013-12-22 17:36:43 -02:00
Ahmed Samy
df3546b073 lua: now we have a function to static allocate an array
lua_newtable() definition:
	#define lua_newtable(L) 	lua_createtable(L, 0, 0)

This simply allocates space for 0 fields, meaning, if we push any
values into this array, it will re-allocate the array, which is bad.

This function statically allocates an array, so it's ready to have
X fields into it.

Performance tests:

lua_newtable
1428161
1426992
1413513

lua_createtable
2004544
1974117
1957533

These tests were done on an AMD 8350fx CPU, single thread used.

narr: This is for fields that just have an index, e.g. arr[0] etc.
nrec: For fields which needs like arr.a, arr.b etc.

This is how many times each of the functions can run per second, as
you can see about 1.7x the calls to lua_newtable.

All credits goes to @dalkon, he was too lazy to do it by himself, and
asked me to do it for him.
2013-12-21 16:13:24 +02:00
Ahmed Samy
24e26e190b Also unbind g_minimap.updateTile 2013-12-18 04:40:53 +02:00
Ahmed Samy
ad7cda534d Fix minimap tile update for item removal 2013-12-18 04:40:52 +02:00
Sam
863bece70b VC12 fixes by @dalkon 2013-12-15 19:09:03 +01:00
Ahmed Samy
22f97aa00b More binds to lua 2013-12-15 04:59:45 +02:00
Ahmed Samy
e32607b05c Tiny fixes 2013-12-15 04:33:43 +02:00
Ahmed Samy
1790eee1c6 Add selection to tile 2013-12-14 23:06:52 +02:00
Ahmed Samy
ec2518525a Add more tile flags to be checked for 2013-12-14 19:44:54 +02:00
Ahmed Samy
eb4fb4ff41 Animations are now optional
The default behaviour is still there though.
2013-12-14 18:48:18 +02:00
Ahmed Samy
4f997a3826 Only request tile cache to be updated once for both x & y 2013-12-12 16:24:50 +02:00
Ahmed Samy
c54015a60d Fixup movePixels a little bit
Thanks to @dalkon for dis.
2013-12-12 16:21:22 +02:00
Ahmed Samy
57c432d3ea Increase maximum move offset to be 64 instead of 32 2013-12-12 03:23:13 +02:00
Ahmed Samy
bd8c883e13 Take out debug message 2013-12-12 02:53:57 +02:00
Ahmed Samy
b5c3b37b3c Tiny fix for movePixels 2013-12-12 02:46:20 +02:00
Ahmed Samy
ece6507df2 Bind g_minimap.updateTile to lua
This is needed to update tile removals from minimap widget.
2013-12-11 19:08:12 +02:00
Ahmed Samy
04515ffbb8 Fix map move pixels function
Thanks to @dalkon for this.
2013-12-11 18:36:31 +02:00
Ahmed Samy
ed24a0735a Bind {un,}lockVisibleFloor to lua 2013-12-09 20:15:39 +02:00
Ahmed Samy
2498129ff3 mapio: don't add saved with line in description 2013-12-07 02:52:51 +02:00
Ahmed Samy
066638e7c0 mapio: don't add description twice 2013-12-07 02:27:21 +02:00
Ahmed Samy
95610de5f3 bind set{Width,Height} of g_map to lua 2013-12-07 02:00:31 +02:00
Ahmed Samy
9154c0a678 mapio: fix load on new maps 2013-12-06 23:08:08 +02:00
Ahmed Samy
772ec208c0 don't throw error on fail 2013-12-05 22:23:46 +02:00
Eduardo Bart
7914832be9 Update readme 2013-12-04 14:00:09 -02:00
Sam
99500c9c91 Protocol 8.40-.42 fixes, closes #272 2013-12-04 16:02:51 +01:00
Ahmed Samy
b9b9a32b83 Spawns: add function to find a spawn to place a creature on 2013-12-04 14:30:26 +02:00
Sam
f615b80fbc Navigation for large tab amounts, closes #211 2013-12-03 20:25:56 +01:00
Henrique Santiago
319f32cdaa Merge pull request #387 from conde2/master
Fix compilation under MSVC
2013-11-30 19:52:57 -08:00
conde2
ba091c9f5b Indentation 2013-12-01 01:30:48 -02:00
conde2
3288711d16 Mistake 2013-12-01 01:25:34 -02:00
conde2
8b0509a5c3 Try to fix compilation 2013-12-01 01:19:29 -02:00
conde2
d7612e9304 Little mistake 2013-12-01 01:12:06 -02:00
conde2
4dcb30110f Use of clamp 2013-12-01 00:48:36 -02:00
conde2
7ff73d1064 Fix indentation 2013-11-30 23:34:21 -02:00
conde2
ca2fe9cf45 Fix compilation under MSVC
Use template for std::min and std::max
2013-11-30 23:08:43 -02:00
Sam
b61f509755 Checkboxes fix 2013-11-19 14:54:17 +01:00
Sam
ec012cb137 Fix 7.6 protocol issue / Typo 2013-11-19 01:09:31 +01:00
Sam
69ae324676 Tiny setPVPMode fix 2013-11-19 00:55:42 +01:00
Sam
4d656f8bd1 New pvp modes to combat controls 2013-11-19 00:50:00 +01:00
Sam
c98439ae65 onOutfitChange fix 2013-11-18 23:18:48 +01:00
Sam
4f9f04206d Added enter / escape button to minimap flag window 2013-11-18 20:57:50 +01:00
Sam
fc54a6e418 Full modal dialog functionality 2013-11-18 18:58:15 +01:00
Ahmed Samy
25d3019d1a force use of template version of std::min/max 2013-11-14 00:02:47 +02:00
Ahmed Samy
1711d8bdaf Revert "replace all std::min/std::max with just min/max"
This reverts commit 28d967ccce.
2013-11-13 23:53:54 +02:00
Ahmed Samy
28d967ccce replace all std::min/std::max with just min/max
This errors out in MSVC since the inclusion of winsock2.h, CL uses the
macro not the template version.
2013-11-13 23:48:10 +02:00
Ahmed Samy
f02d5e7975 Merge https://github.com/BrunoDCC/otclient
# By BrunoDCC
# Via BrunoDCC
* https://github.com/BrunoDCC/otclient:
  Fix houses and monsters
2013-11-13 22:51:00 +02:00
BrunoDCC
4bfe9b640e Fix houses and monsters 2013-11-13 18:48:37 -02:00
Eduardo Bart
ab1cc8c890 Update download links 2013-11-13 15:25:23 -02:00
Eduardo Bart
d657a0482a Add download links to README 2013-11-13 15:17:38 -02:00
Eduardo Bart
8562d38ca4 Update make_snapshop.sh [2] 2013-11-13 15:09:33 -02:00
Eduardo Bart
28786a3570 Update make_snapshop.sh 2013-11-13 14:33:29 -02:00
Eduardo Bart
b07a77f705 Changes to compile for Win64 2013-11-13 13:55:34 -02:00
Eduardo Bart
0d44942e8e Version 0.6.4 2013-11-13 13:07:37 -02:00
Eduardo Bart
dd829395e3 Merge pull request #376 from dalkon/master
Item phases & Fix party "bug" & Additions
2013-11-12 15:56:54 -08:00
dalkon
18fa54181a Format fix 2013-11-13 00:50:46 +01:00
dalkon
5b8ff29fa3 Fix party "bug" & Additions 2013-11-13 00:48:41 +01:00
dalkon
59e90e8f1e Item phases 2013-11-13 00:18:15 +01:00
Sam
5db37857bf Fix game zoom issue 2013-11-12 23:35:19 +01:00
Eduardo Bart
fc0297d6db Fix compile errors in ubuntu 2013-11-12 20:07:46 -02:00
Eduardo Bart
1060c6f78c Compilation for MSVC2013, thanks @dalkon
OTclient now compiles in "Microsoft Visual Studio 2013 Express for Windows Desktop"
All the needed libraries you can download at https://www.dropbox.com/s/2yfb1c763io8efy/otclient-msvc13-libs.zip
NOTE: You have to change VC++ Directories to the properly directories
NOTE: Latested MSVC 2013 or greated is required
2013-11-12 16:32:39 -02:00
dalkon
c9597d6682 Visual Studio 2013 Compatibility 2013-11-12 16:32:39 -02:00
dalkon
d3e97d33c7 Update .gitignore 2013-11-12 16:32:39 -02:00
Ahmed Samy
2b015d49d7 don't set bits twice 2013-11-12 20:06:59 +02:00
Ahmed Samy
f04b4a0b42 small fix 2013-11-12 20:02:24 +02:00
Ahmed Samy
ff5c22d4c0 Tiny fix
Saving newly made houses by the map editor is not even supported, so this
is not a bug
2013-11-12 17:15:09 +02:00
Sam
d6105a98d1 Fixed issue with deathwindow 2013-11-12 15:21:10 +01:00
Eduardo Bart
0938e22eb9 Fixes in stdext::format 2013-11-11 23:07:25 -02:00
Eduardo Bart
1868b235cb Implement creature marks 2013-11-11 01:45:18 -02:00
Eduardo Bart
9a30050340 Fix typo 2013-11-10 23:40:29 -02:00
Eduardo Bart
9d689f0c43 Add missing changes for protocol > 1000 2013-11-10 23:31:59 -02:00
Eduardo Bart
2b34c0ea0a Fix #337
The sound buffer was not being fully preloaded because it's size was incorrect
2013-11-10 20:35:00 -02:00
Eduardo Bart
d32f71c2b9 Partial support for protocol 1020 and minimize lag
I am able to login in global Tibia however there are game protocol errors
* there is a new opcode 167, which I dont know what it is
* there are changes in opcode 147 which handles text messages that I don't know too

Connection writing was optimized, playing "lag" should improve by 10ms,
and improve much more in systems with low fps
2013-11-10 20:10:04 -02:00
Eduardo Bart
3cff331723 Merge github.com:BrunoDCC/otclient 2013-11-10 19:36:06 -02:00
Eduardo Bart
9894f0c0b9 Merge github.com:conde2/otclient 2013-11-10 19:31:24 -02:00
conde2
e60372fdea A little fix! 2013-11-10 03:17:49 -02:00
conde2
d2473fd424 Login support for 10.21 ~ 10.22
Please someone test more it !
Not tested in real Tibia !
2013-11-10 03:13:51 -02:00
BrunoDCC
7d7bd00a63 minor fix :3 2013-11-09 22:48:29 -02:00
BrunoDCC
c81a623c43 Fixes for creatures name
fixes on save houses (Now open most generate some error)
First 10.22 commit (open dat to edit)
Add server id for new versions
2013-11-09 20:04:48 -02:00
Eduardo Bart
8b165b95fd non relevant change 2013-11-05 21:32:27 -02:00
Sam
6f9436dd60 UISprite widget added
Display single sprites
2013-10-30 21:35:29 +01:00
Henrique Santiago
ae95f51346 Merge pull request #367 from shdpl/patch-1
Polish locale update
2013-10-26 09:46:15 -07:00
shdpl
9b84570372 Polish locale update
UTF-8 or UTF-16 pls
2013-10-25 19:27:19 +02:00
Eduardo Bart
38dec168ee Fix boost::asio misuse that would cause lag
io_service::reset was not called before io_service::poll, meaning that new events would be really polled in the next Connection::poll call, this could lead to network lag in computers with low framerate (ie: a user with 10 fps would have 100ms lag just because of that)
2013-10-22 21:42:35 -02:00
Henrique Santiago
84b722f8c7 Merge pull request #365 from conde2/master
Fix - Writeable / Readable items Issues: #362 and #364
2013-10-21 17:29:13 -07:00
Joao Pasqualini Costa
b3717ceb93 Fix - Writeable / Readable items 2013-10-21 22:25:12 -02:00
Henrique Santiago
3340e06da6 Merge pull request #363 from conde2/master
Fix protocol error #362
2013-10-20 17:24:19 -07:00
Joao Pasqualini Costa
084ee45650 A little mistake 2013-10-20 20:33:44 -02:00
Joao Pasqualini Costa
7290ec3334 Some work on container pagination
Bind lua functions for containers
Update onAddItem now it have the pagination slot
Note: getSize as i see is equal to getItemsCount, but not sure thats why
I've added !
2013-10-20 20:21:20 -02:00
Joao Pasqualini Costa
971d90a596 Fix protocol error #362
TODO:
Handle the helpers in LUA, it could be added into Battle Window i think,
if someone know where should this be comment here !
2013-10-20 18:31:20 -02:00
Sam
8230bf2af4 Merge branch 'master' of https://github.com/edubart/otclient 2013-10-20 17:15:30 +02:00
Sam
241b54262a Updated lua consts 2013-10-20 17:15:24 +02:00
Ahmed Samy
63ce68b449 mapio: make sure we read the house tile flag 2013-10-12 11:38:30 +02:00
Ahmed Samy
f47ea05abc Merge https://github.com/BrunoDCC/otclient
# By BrunoDCC
# Via BrunoDCC
* https://github.com/BrunoDCC/otclient:
  Save houses and spawns fix
2013-10-11 11:38:03 +02:00
BrunoDCC
de3160c90d Save houses and spawns fix 2013-10-11 02:35:31 -03:00
Sam
67bd00556d Re-added "Don't stretch/shrink" option
Closes #345
2013-10-09 18:17:50 +02:00
Sam
778559c7b9 Protocol 10.10 fixed containers 2013-10-09 17:58:58 +02:00
Sam
3aac0ac0ec Reverting mapio.cpp change
Should not have been commited.
2013-10-07 21:38:55 +02:00
Sam
4adfafc67e Fix for Client 8.5 2013-10-07 21:32:13 +02:00
Sam
1b27a095a9 Hotkeys for Fluid Containers
Hotkeys now save subType for fluid containers instead of always trying
to use item with subType 0.
2013-10-05 18:08:49 +02:00
Sam
e6977b1b43 Improvement / Fix hotkeys
- Hotkeys now check items in inventory
- Fixed USEONETARGET hotkey bug
2013-10-05 02:31:44 +02:00
Sam
5843b78e87 Support for client version 7.6
Tell me if there are parts which I should change.

- Not everything is tested yet, feel free to report bugs in 7.6
- the data send in between login opcode and account data might not be
correct, but I could not find any documents showing the right protocol
yet
- Hotkeys working
2013-10-04 04:09:54 +02:00
Ahmed Samy
7cf645e715 Woops, fix operator less than 2013-09-02 19:12:12 +00:00
Ahmed Samy
537508021e Make g_map.findItemsById return a map instead of a vector 2013-09-02 17:53:32 +00:00
Ahmed Samy
e741a62ce9 g_map.findItemsByid 2013-08-31 01:18:17 +00:00
Ahmed Samy
56d6ef6642 Introduce 4 new functions:
- g_map.beginGhostMode(float opacity)
- g_map.endGhostMode()
- UIMap::movePixels(int x, int y)
- MapView::move(int x, int y)
2013-08-30 01:54:36 +00:00
Ahmed Samy
3db8f54aa9 Introduce 2 new functions to g_things
- g_things.findItemTypesByName
- g_things.findItemTypesByString
2013-08-29 17:53:21 +00:00
Ahmed Samy
9234030c1b Zone colors: add more tile flags to be checked for 2013-08-27 15:49:48 +00:00
Ahmed Samy
520baa28ea Move "getNPC" that was introduced in commit
00729bbc2e
from Spawn to CreatureType

I didn't have a closer look at how his code was structured, what he
basically did
is that he set all creatures in a spawn as NPC's even if it's a monster
which is
so erroneous.

Highlights:
- Add branch prediction macros
- Minor code style fixes & some others

Hopefully the branch prediction thing will speed up OTB since it's
awfully slow.
2013-08-27 03:40:18 +02:00
Ben Dol
bbdeac2e33 Merge pull request #353 from KnopersPL/master
Fix for protocol 850 errors, thanks @KnopersPL
2013-08-25 03:54:39 -07:00
KnopersPL
1f914351bb Update protocolcodes.cpp
Fix for server messages on 850
2013-08-25 12:24:18 +02:00
KnopersPL
eb68504dc1 Update protocolgameparse.cpp
Fix the slow animation move effect, some opcodes error and logging in as GM
2013-08-25 12:20:54 +02:00
Ahmed Samy
32647f11bf Introduce 2 new functions to Map
- g_map.colorizeThing
- g_map.removeThingColor
2013-08-24 00:09:56 +02:00
Ahmed Samy
644d4daeea More cleanups 2013-08-23 02:12:36 +02:00
Ahmed Samy
b27352c321 Merge branch 'master' of https://github.com/BrunoDCC/otclient
* 'master' of https://github.com/BrunoDCC/otclient:
  Add full npc read (it not cause bug)
  Fixed a npcs save Fixed a spawns and npcs load
2013-08-23 02:03:40 +02:00
BrunoDCC
a6be9ae525 Add full npc read (it not cause bug) 2013-08-22 21:00:48 -03:00
Ahmed Samy
5df3ec8cf2 More cleanups
Also, bind map descriptions auxiliar functions
2013-08-23 01:55:15 +02:00
BrunoDCC
00729bbc2e Fixed a npcs save
Fixed a spawns and npcs load
2013-08-22 20:54:09 -03:00
Ahmed Samy
3b2d8a2b5e Fix build 2013-08-22 23:20:44 +02:00
Ahmed Samy
d5298c1011 Cleanups 2013-08-22 21:15:17 +02:00
Allan Ference
aaad8ab8a0 Fix spawn loading and saving, thanks to @BrunoDCC 2013-08-20 12:14:52 +02:00
Allan Ference
efbd9ab693 Attempt to fix spawn loader 2013-08-19 18:57:25 +02:00
Allan Ference
092209c0bb Attempt to fix houses and spawns save 2013-08-19 10:38:22 +02:00
Allan Ference
05f7f6a4cf Introduce Item::getName() 2013-08-18 18:29:20 +02:00
Ben Dol
2c36ca7215 Merge pull request #350 from conde2/master
Fix Keyboard unbind, WASD walk, Mount Frames, Fix #349, #344, #304, #253 Thanks @conde2!
2013-08-17 19:23:06 -07:00
Joao Pasqualini Costa
926eb9f01e Fix #253
Message Mode 12
2013-08-17 22:57:38 -03:00
Joao Pasqualini Costa
96bb28e806 Fix Mount frame issue
This will fix mount for all protocols
2013-08-17 22:19:24 -03:00
Joao Pasqualini Costa
e15995e1eb Fix walk with WASD
This should be an alone bind, so any other control will not affect the
keys.
2013-08-17 21:56:37 -03:00
Joao Pasqualini Costa
719debfeae Fix keyboard unbind
Now this will unbind the right widget
2013-08-17 21:54:16 -03:00
Allan Ference
e7137c2535 Rework NPCs loader with g_resources (Untested) 2013-08-17 23:36:44 +02:00
Allan Ference
5eabf6f518 Optional and configurable zone colors 2013-08-17 23:06:58 +02:00
Allan Ference
5849136526 Introduce g_things.findItemTypeByName 2013-08-17 15:09:10 +02:00
Allan Ference
0451fd6b58 OTBM saver: don't escape version check for waypoints 2013-08-15 11:20:22 +02:00
Allan Ference
9cf878335a Minor changes
Mainly code style
2013-08-14 18:58:53 +02:00
BeniS
529b646316 Forgot to provide the widget for walk key bind, thanks conde2! 2013-08-13 10:22:34 +12:00
Allan Ference
1ea2b380ca Disregard progressbar 2013-08-09 17:35:56 +02:00
Allan Ference
914fe249ab Merge branch 'master' of https://github.com/BrunoDCC/otclient
* 'master' of https://github.com/BrunoDCC/otclient:
  Fix OTBM save Remove if(version > 1) { (it causes bug)
2013-08-09 14:54:09 +02:00
BrunoDCC
4d498ed0d8 Fix OTBM save
Remove if(version > 1) { (it causes bug)
2013-08-07 20:04:21 -03:00
Allan Ference
9aa667da26 MapEditor: more changes for ease of use 2013-08-04 14:21:12 +02:00
Allan Ference
e6db43ac3a MapEditor specific: Use colors for tile states 2013-08-04 14:19:10 +02:00
Eduardo Bart
b5911cf1de Use client version instead of entergame 2013-08-03 19:26:38 -03:00
BeniS
5fbb71157d Added enable/disable chat mode (allows for alphabetical key controls), battle window anchoring fixed (thank you River) & more:
* Added better walk key binding (for other uses, like the sample given WASD).
* Made string.ends part of the string meta table rather than parameter based.
2013-07-29 10:42:18 +12:00
Allan Ference
0ff36a1a0a Merge https://github.com/marksamman/otclient
* https://github.com/marksamman/otclient:
  Fix login with 9.83-10.10
2013-07-28 07:10:44 +02:00
Mark Samman
4a04a18835 Fix login with 9.83-10.10
This only adds protocol compatibility, the features aren't actually
implemented yet
2013-07-28 07:05:46 +02:00
Allan Ference
6fa9631d6a Merge https://github.com/marksamman/otclient
* https://github.com/marksamman/otclient:
  Fix compiling on OS X
2013-07-28 04:42:31 +02:00
Mark Samman
261642190b Fix compiling on OS X 2013-07-28 04:30:52 +02:00
BeniS
95abf2a1d2 Fix a bug with autowalking & add prompt param for tryLogout.
(We don't want to be prompted when pressing Ctrl + Q or  Ctrl + L).
2013-07-07 05:36:56 +12:00
Sam
c4adf2d817 Added whitelist
- Checkboxes to turn ignore/whitelist off
- Allow VIP messages
2013-07-04 18:03:21 +02:00
Sam
c7c259ef80 Game Menu / Attacking fixes
- No more "Attack" / "Follow" for creatures on different floor
- No rule violation for monsters, only players now
- Alt + Click to target works through roofs -> fixes #203
- Fixed battle list issue (check position when trying to attack)
2013-07-03 14:25:18 +02:00
Sam
987c6d6c91 Mount display issue
fixes #275
Not really needed but enables some cool stuff
2013-07-02 23:16:11 +02:00
Sam
c8185474de Implements battlelist sorting
Features:
Sort by age, name, health or distance
Sort ascending or descending
Button to toggle filters and sort options
http://i.imgur.com/cSCBwr4.png

closes 213
2013-07-02 22:43:52 +02:00
Sam
be071c7103 Fix deathwindow issue 2013-07-02 22:40:19 +02:00
Sam
2f9e2c3e33 Sorting VIP list by name
@ #209
What should sorting by type do?
2013-07-01 22:59:51 +02:00
Sam
b81590f297 Fixed Alt + F4 keycombo on Windows 2013-06-29 16:53:15 +02:00
BeniS
e062562888 Added sublime text 2 project file.
* Changed the order of the dofiles params.
2013-05-12 21:16:43 +12:00
BeniS
18d23653c4 Added some control params to dofiles lua method.
* File name contains string.
* Recursive file checking for deep searches.
2013-05-12 17:00:52 +12:00
Henrique Santiago
6c119627bb Merge pull request #330 from conde2/master
Improvement on styles
2013-04-30 13:26:56 -07:00
Joao Pasqualini Costa
d847a78a4d Improvement on styles
Added VerticalList
2013-04-30 17:21:04 -03:00
Eduardo Bart
0dccc870b5 Merge pull request #324 from TiagoTdA/master
Update/Refresh modules on unload
2013-04-13 18:11:47 -07:00
Tiago T. de Araujo
e4c7ca604b Fix update on unload module 2013-04-12 21:27:10 -03:00
Sam
d427560b98 Countwindow Fix [YAH]
Fixed typing amount in count window. Should be hidden again.
2013-04-12 19:15:28 +02:00
Sam
cc12db0d1f Reverted getTopMultiUseThing() change 2013-04-09 23:54:10 +02:00
Henrique Santiago
1ce6df99ac Merge pull request #318 from conde2/master
Fix #316
2013-04-09 14:21:15 -07:00
Joao Pasqualini Costa
57bb6ff974 Fix #315 by @pacmanis
Credits go to @pacmanis
2013-04-09 18:02:43 -03:00
Joao Pasqualini Costa
9bae1b9e25 Fix #316
It still have a bug when using string like this:

" teste {{}} teste"
2013-04-09 17:54:57 -03:00
Sam
1415de222c Merge pull request #313 from sn3ejk/sn3ejk
Fix extended opcodes for forgottenserver.
2013-04-05 18:50:02 -07:00
Kamil W
34ceb3c95e Fix extended opcodes for forgottenserver. 2013-04-05 22:03:17 +02:00
Eduardo Bart
b43a196eac Minor fixes and add auto resize for images 2013-03-15 21:59:22 -03:00
Eduardo Bart
a3a65d40ce Merge pull request #303 from conde2/master
Properly Fix #301
2013-03-15 08:35:04 -07:00
Joao Pasqualini Costa
6ef3508362 Properly Fix #301 2013-03-14 20:57:02 -03:00
Eduardo Bart
a71e07f063 Restore walk optimization 2013-03-14 00:16:57 -03:00
Eduardo Bart
4bdd1e79fd Fix compile error for win32 2013-03-13 21:18:17 -03:00
Eduardo Bart
e9e4dcd71b Improve walk when lagging 2013-03-13 20:55:20 -03:00
Eduardo Bart
0891e2b30a Add C++ traceback to errors 2013-03-12 01:36:36 -03:00
Eduardo Bart
24664714bd Fix rare but serious bug in Connection
* Implement output pooling for writing data in connection,
this should fix rare cases where sending would fail
2013-03-12 00:18:47 -03:00
Eduardo Bart
da51dd467e Minor fix 2013-03-11 15:00:31 -03:00
Eduardo Bart
64fc4570c9 Try to fix compilation for gcc 4.6 [3] 2013-03-06 15:47:38 -03:00
Eduardo Bart
392acc0b43 Try to fix compilation for gcc 4.6 [2] 2013-03-06 15:40:47 -03:00
Eduardo Bart
69f72b9c86 Try to fix compilation for gcc 4.6 2013-03-06 13:05:46 -03:00
Eduardo Bart
489688e9fb Merge branch 'sql' 2013-03-06 13:00:21 -03:00
Eduardo Bart
d911b38d68 defaults SQL to off 2013-03-06 12:59:59 -03:00
Eduardo Bart
61be2103ed Fix linkage 2013-03-06 12:54:27 -03:00
BeniS
a7b27ef8dd Forgot to add MySQLResult lua binding 2013-03-05 20:33:27 +13:00
Eduardo Bart
10a16169a4 Fix hotkeys reload and implement filters for console 2013-03-05 04:02:54 -03:00
Eduardo Bart
44bf4dcb6e Fix ubuntu compile errors 2013-03-05 02:54:08 -03:00
BeniS
9305053e34 Few issues with compilation and layout 2013-03-05 17:47:43 +13:00
Eduardo Bart
1dd558d57e Revert "Use boost::thread instead of std::thread"
This reverts commit 71b5c5f2e4.
2013-03-05 01:47:23 -03:00
BeniS
15ee7962f1 Some minor clean ups 2013-03-05 17:31:19 +13:00
Eduardo Bart
8c016b143a Fix #294 2013-03-04 23:59:37 -03:00
Henrique Santiago
a85ca0fb17 Merge pull request #296 from conde2/master
Fix spell cooldown
2013-03-04 18:58:47 -08:00
Joao Pasqualini Costa
115bf08364 Fix spell cooldown timer 2013-03-04 23:45:19 -03:00
Eduardo Bart
71b5c5f2e4 Use boost::thread instead of std::thread 2013-03-04 23:06:00 -03:00
Henrique Santiago
5396ea6231 Fix to last commit 2013-03-04 22:46:14 -03:00
Henrique Santiago
9955de573b Avoid infinite loop 2013-03-04 22:44:29 -03:00
Eduardo Bart
0be7bd5360 Implement async dispatcher #221 2013-03-04 18:56:22 -03:00
Eduardo Bart
c452e74e0c Implement stdext::shared_ptr
It's an alternative to stdext::shared_object_ptr
with weak pointers support and some other functionallity, however
it's heavier, uses more memory, more allocation and slower,
this class should be used when really needed, prefer
stdext::shared_object_ptr
2013-03-04 13:14:35 -03:00
Eduardo Bart
bdbe065c23 Add thread safety for std::shared_object_ptr 2013-03-04 10:47:07 -03:00
BeniS
f4263384bc Fix boost issue on Ubuntu and fix MySQL lib issue
* Add framework options for configuration
* libboost_chrono-mt.a dependency issue (with clock_gettime)
* MySQL lib must be added before zlib
2013-03-04 18:03:04 +13:00
BeniS
f50c63e9e5 Removed singleton instance & added more lua bindings
* Some tidying up
2013-03-04 04:11:29 +13:00
BeniS
48ac91d173 A few clean ups and also tested, its working fine 2013-03-04 01:27:07 +13:00
BeniS
8db85e4e3a Use stdext::millis not g_clock.millis 2013-03-03 19:43:25 +13:00
BeniS
02d32565e9 Work on sql framework classes 2013-03-03 19:19:22 +13:00
BeniS
3980f859b7 Forgot to remove header includes 2013-03-03 19:17:48 +13:00
Eduardo Bart
c392bcca90 Fix win32 alt bug 2013-03-03 00:00:13 -03:00
Eduardo Bart
62921dee9b Fixes in options, hotkeys and viplist 2013-03-02 17:01:52 -03:00
BeniS
3ca85cbe87 Removed Position dependencies inside the framework 2013-03-02 18:33:14 +13:00
Eduardo Bart
32df317163 Fix luajit on Mac OS X 2013-03-01 17:14:18 -03:00
Eduardo Bart
a145ad282b Add live_sprites_reload command 2013-03-01 17:14:18 -03:00
Samuel
884102833e OTB loading fix 2013-03-01 15:30:50 +01:00
Eduardo Bart
50b6cc69e1 Implement live_module_reload command 2013-03-01 06:38:05 -03:00
Eduardo Bart
8314b84f69 Add live_textures_reload command 2013-03-01 05:46:55 -03:00
Henrique Santiago
e85afd4b63 Platform modtime, little changes to entergame 2013-03-01 05:08:40 -03:00
Eduardo Bart
120c2b4231 Fixes in rule violations and private chat 2013-02-28 22:01:41 -03:00
Eduardo Bart
dad3026ba0 Optimize terminal buffering 2013-02-28 21:35:35 -03:00
Eduardo Bart
9312d20a0f More terminal improvements 2013-02-28 20:10:36 -03:00
Eduardo Bart
425bfd998b Add about_modules command 2013-02-28 19:05:53 -03:00
Eduardo Bart
b804dd6959 Fixes and new tuned terminal 2013-02-28 18:46:42 -03:00
Eduardo Bart
69e762385e Warn when shared_object_ptr misused 2013-02-28 12:19:42 -03:00
Eduardo Bart
e528fcc8f8 Minor fixes and improvements 2013-02-28 02:43:26 -03:00
Henrique Santiago
46aa0c005f Support to miniwindow margin, fix protocollogin connectCallback, pt translation 2013-02-27 23:45:03 -03:00
BeniS
eb46b96ffa Fix typo from last commit 2013-02-28 10:31:15 +13:00
BeniS
ccbe491e3c Should resolve #289 (please test and give feedback) 2013-02-28 10:23:22 +13:00
Henrique Santiago
864ac3fdd9 Pt translations, #286 2013-02-27 15:57:13 -03:00
BeniS
5f26303389 Added latest protocol/client support for cipservers 2013-02-28 04:38:48 +13:00
BeniS
0bf909d52f Fix #283 and more:
* Might have fixed death window issue but not confirmed
* Stop hotkey window from display while offline
* Moved some required features to >= 840 if statement
  (protocol 840/842 arent supported in otclient yet)
2013-02-28 01:01:51 +13:00
Eduardo Bart
ef20f59a98 Fix new line in utf8 conversion 2013-02-26 18:31:09 -03:00
Eduardo Bart
406c7bdae6 Fix #276 2013-02-26 18:13:50 -03:00
Eduardo Bart
41b81da76f Towards 0.6.2 2013-02-26 17:56:50 -03:00
Eduardo Bart
dc3559a5c0 Fix hotkey bug and compile error on Mac 2013-02-26 17:50:08 -03:00
Eduardo Bart
d0576da69d Implement dash walking and zoom out again 2013-02-26 16:37:02 -03:00
Eduardo Bart
2a225b99b7 Only show ping when available 2013-02-25 23:16:15 -03:00
Eduardo Bart
04f52d77d2 Walk ping is not supported anymore 2013-02-24 22:39:25 -03:00
Eduardo Bart
06e2b6eca2 Platform fixes and rework ping 2013-02-24 22:16:45 -03:00
Henrique Santiago
a8c175452b Pt translations 2013-02-23 20:15:12 -03:00
BeniS
92228e9553 Prompt user before removing server list entry 2013-02-24 01:26:49 +13:00
BeniS
67ed9e21ad Forget account/password when "Remember password" is unchecked 2013-02-24 01:14:30 +13:00
BeniS
01126eee62 Some fixes for the server list module
* Fixed an indexing issue in the settings
Note: Forgot to mention that it will store the last account/password used for that server
2013-02-24 01:02:24 +13:00
BeniS
8e9f65779c Implemented client_serverlist module! Close #200
* Will store servers that are not already in the list when logging in
* Can add servers manually if required too
* Fixed a bug in table.size
2013-02-24 00:41:21 +13:00
BeniS
2296e35174 Fix issue with closing containers
* Wasn't clearing references properly.
2013-02-23 19:38:52 +13:00
BeniS
28e70516a4 Use full path in SpelllistSettings
* Fix reload errors from previous commit
2013-02-23 19:23:18 +13:00
BeniS
039c3072dc Preload properly with g_textures.preload
* Thanks Baxnie for advising me of this method :)
2013-02-23 19:16:42 +13:00
BeniS
f4f9e319d8 Buffer condition/cooldown icons on module init
* This should hopefully avoid some lag with slow hdd computers
2013-02-23 18:53:27 +13:00
Eduardo Bart
035ce26728 Fix link error in Mac OS X 2013-02-22 19:42:28 -03:00
Eduardo Bart
04c4943fa8 Remove boost::filesystem dependency 2013-02-22 19:29:58 -03:00
Eduardo Bart
09c937998f Dont use boost locale anymore 2013-02-22 18:49:36 -03:00
Eduardo Bart
e4e3d7d053 New platform APIs and new OpenAL cmake 2013-02-22 16:53:49 -03:00
Eduardo Bart
5b573afdfc Change network errors message 2013-02-22 16:53:49 -03:00
Henrique Santiago
90d2032e9e More changes to painter 2013-02-22 03:31:13 -03:00
Henrique Santiago
3eeb5ae890 Painter became PainterOGL, new Painter generic class 2013-02-22 02:55:35 -03:00
Eduardo Bart
9a54bfcc90 Minimap, hotkeys and lot of other changes
* Begin working on a new layout system for UIMinimap and later UIMap,
this new layout system allows to add widgets to the minimap
* Add option to disable motd
* Rework hotkey binding
* Lots of fixes in hotkeys manager
* Add fullmap view using Ctrl+Shift+M
* Prevent some crashs in ThingType draw
* Add function to load minimap from PNG files
* Fixes in minimap saving
* Fixes in Tile::isClickable
* Add UIMapAnchorLayout, new layout for maps
* Fix freezes in win32 when pressing alt key
2013-02-21 17:03:05 -03:00
Henrique Santiago
f8b078ea91 Little fixes 2013-02-20 21:50:45 -03:00
Henrique
33ce0aa704 A few more changes to dx9 2013-02-20 19:12:52 -03:00
Henrique
bb304f9f4e Fixes to npc trade, begin native directx support 2013-02-20 15:41:28 -03:00
Ben Dol
a84d0bbf11 Update tools/tfs_extendedopcode.patch
Fixed issue with sending Player ptr in dispatcher (apparently causes issues in TFS)
2013-02-21 04:51:10 +13:00
BeniS
cb3f06358c Missed existing onInventoryChange hook 2013-02-21 04:34:06 +13:00
BeniS
3b91c4d509 Minor quantity fix from previous commit 2013-02-21 00:28:45 +13:00
BeniS
f4c7d98bd5 Fixes to trade npc module:
* Will now update player goods on inventory change
* Sell all no longer shows inventory items when ignore is checked
* Sell all tooltip now updates properly
* Will tell you the sell all total
2013-02-21 00:19:30 +13:00
BeniS
88c59afb8c Added 'sell all' tooltip to show items you can sell
* Now 'sell all' button with enable/disable
* Fixed display issue with 'sell all' button
* Also changed spinbox button click
2013-02-20 23:08:03 +13:00
BeniS
b61094c053 Minor fix to scroll bar 2013-02-20 15:03:45 +13:00
BeniS
3b9acab7a1 Fixed Market laoding and 'search all' issue. 2013-02-20 14:44:06 +13:00
Henrique Santiago
6d456994f4 Fix scrollbar 2013-02-19 21:34:50 -03:00
BeniS
e87e669c87 Few market UI fixes 2013-02-19 23:19:43 +13:00
Henrique Santiago
59a5b8115a Fix locale send, spelllist reload, few changes 2013-02-18 22:18:10 -03:00
Eduardo Bart
67fc77d507 Add sell all button to NPC trade 2013-02-15 16:38:57 -02:00
Eduardo Bart
28cdd6aa53 Fix minor walk delay 2013-02-15 16:38:29 -02:00
Henrique Santiago
4f423432fa Missing change for hotkeys 2013-02-14 18:29:35 -02:00
Eduardo Bart
62f38d678d Fix for chat commands #s #w #y
* Some progressbar changes
2013-02-14 16:34:55 -02:00
Henrique Santiago
07dd78002b Save console messages #263, change settings names 2013-02-14 15:30:45 -02:00
Henrique Santiago
5fc1ac8051 Save gamemap height #207. UISplitter needs a rework. 2013-02-14 13:54:51 -02:00
Eduardo Bart
d9ee4dccbe Version 0.6.1 2013-02-14 13:20:41 -02:00
Henrique Santiago
ffcb65f365 Draw minimap background without map 2013-02-13 18:40:15 -02:00
BeniS
adc01ab9e3 Proper fix for autowalk lag issue 2013-02-13 18:05:08 +13:00
BeniS
725a16e38e Fix a lag issue with auto walking
* Auto walking on unwalkable objects was still being processed
  by the findPath algorithm. Ed, if this algorithm shouldn't be causing
  lag spikes for the client, perhaps I should find the cause in findPath.
  For now this will fix the issue however.
2013-02-13 15:06:22 +13:00
BeniS
0b29a4b466 Fixed market selling 'amounts' 2013-02-13 05:30:00 +13:00
BeniS
cb42481edd Market fix, and a few other things:
* Added 'button' param to g_mouse.bindPress
* Added 'lower' param to table.contains
* UIComboBox:onOptionChange should signalcall?
* Changed the experience bar color
* Market buy/sell 'amount' window will now show the cost
  of the amount you are selecting
2013-02-13 05:14:16 +13:00
Henrique Santiago
8f9055f48b Fixed mouse bug, allow locales list 2013-02-10 03:24:51 -02:00
Henrique Santiago
b1bab32618 Fixes to lua 2013-02-10 02:05:02 -02:00
Henrique Santiago
dfb0150a7d Fix signalCall, healthinfo tooltips 2013-02-10 01:17:20 -02:00
Henrique Santiago
11cb287a21 Changes to UIProgressBar, simplified healthinfo module 2013-02-09 19:57:37 -02:00
Henrique Santiago
6f37361df0 Merge pull request #268 from ricardoianelli/master
Added experience bar to healthinfo
2013-02-09 11:36:39 -08:00
Ricardo Ianelli
9c0c19b5b2 Exp bar on healthinfo module 2013-02-10 03:31:12 -02:00
Ricardo Ianelli
b08d0ff157 One more small fix 2013-02-10 03:01:33 -02:00
Ricardo Ianelli
71c2ec5293 One more fix 2013-02-10 02:59:55 -02:00
Ricardo Ianelli
72d63673ca Identation Fixes 2013-02-10 02:54:20 -02:00
Ricardo Ianelli
cbeab6f9b0 Moving start messages to lua
Moved start log messages to lua, to make easier to enable/disable those
messages.
2013-02-10 02:28:47 -02:00
Henrique Santiago
25841e9c77 Merge pull request #267 from ricardoianelli/master
Rework on init/exit log messages.
2013-02-08 21:03:08 -08:00
Eduardo Bart
ea0d5f3d81 Fix compile error for OpenGL ES 2013-02-07 03:56:21 -02:00
Henrique Santiago
4f3be92208 Refix last commit 2013-02-07 03:37:57 -02:00
Henrique Santiago
3c3ba9ef4c Fix crash when clientid is invalid 2013-02-07 03:13:08 -02:00
Henrique Santiago
2f7a06e93e Full ground option in otml 2013-02-07 02:19:19 -02:00
Henrique Santiago
7f918a12a2 Old light method restored, it can be changed in lua now 2013-02-06 20:47:17 -02:00
Eduardo Bart
7f6a4bbbe5 Lightning is not additive anymore
Now otclient lightning may look like more tibia lights,
before this too many lights together would increase
brightness a lot, this won't happen anymore in cards
with OpenGL 1.4 or newer
2013-02-06 19:49:40 -02:00
Eduardo Bart
86c462eb4d Fix win32 compile errors 2013-02-06 18:48:23 -02:00
Eduardo Bart
7ece0ed8c7 Buttons for client options 2013-02-06 17:35:59 -02:00
Eduardo Bart
cf77df05ca Fix possible leaks in stdext::format 2013-02-05 20:00:28 -02:00
Eduardo Bart
dcd6249e8f Link ICU in Mac OS 2013-02-05 19:21:15 -02:00
Eduardo Bart
f0ac63eb5c Disable crash handler in Mac OS 2013-02-05 19:10:22 -02:00
Henrique Santiago
d4fb6127fc Add blink effect 2013-02-05 19:08:32 -02:00
Eduardo Bart
637b6ceca2 Trying to get it compiling on Mac OS X 2013-02-05 19:03:18 -02:00
Eduardo Bart
86d06057ca Fixes to compile with libc++ 2013-02-05 18:30:16 -02:00
Eduardo Bart
717832b791 Other minor fixes 2013-02-04 19:40:12 -02:00
Eduardo Bart
4c51009ed9 Minor fixes
* Fix focusing opened channel on login
* Add missing options to rule violation window
* Send rule violations messages in default channel
* Enable show private messages in console by default
* Fix battle issues with invisible creatures
* Allow to use hotkeys while trading
2013-02-04 17:38:36 -02:00
Eduardo Bart
0fc56c73cc Fix health colors 2013-02-04 15:50:15 -02:00
Henrique Santiago
db73bbdea2 Pt translations, uicombobox, options 2013-02-01 14:31:24 -02:00
BeniS
6cd71ea02e Closes #236 2013-02-02 03:38:17 +13:00
BeniS
7f5dda5c8f Re-add destroying for unloading, other clean up:
* Cleaned some module terminate code
* Fixed "reload all" issues
2013-02-01 17:32:15 +13:00
BeniS
35e5dd8af8 Topmenu fix
* Will no longer duplicate topmenu buttons (no need to destroy in the module now)
* Menu items will no longer change position when reloaded.
2013-02-01 14:47:15 +13:00
BeniS
b34cc18f98 Fix #259 2013-02-01 14:31:09 +13:00
BeniS
469df27d9b Implement #261 2013-02-01 14:21:20 +13:00
BeniS
e7012031eb Fix auto walking bug 2013-02-01 12:46:44 +13:00
Henrique Santiago
4c3c945bab Fix tooltip, minimap 2013-01-31 19:43:42 -02:00
Henrique Santiago
e370ffdb0f More changes to minimap 2013-01-31 18:34:27 -02:00
Eduardo Bart
36a60419ec Fix some issues when reloading entergame 2013-01-31 14:19:41 -02:00
Henrique Santiago
546007f1df UIImageView, fixes to minimap 2013-01-31 14:20:04 -02:00
Eduardo Bart
cb7f855fd8 Fix minimap crash 2013-01-31 13:39:56 -02:00
BeniS
859cb31f5d Fix #257 2013-02-01 01:30:36 +13:00
BeniS
de353e3b72 Should resolve #256 (please test, works for me) 2013-02-01 00:07:28 +13:00
BeniS
9e208fa792 Fix 255 also another cooldown bug:
* If you use the cooldown during the ping delay time it wouldn't init
  the cooldown again.
2013-01-31 20:31:21 +13:00
Eduardo Bart
a0b2504f11 More fixes in minimap 2013-01-31 04:15:10 -02:00
Eduardo Bart
89c012e81f Improvements in minimap drawing 2013-01-31 03:38:06 -02:00
Eduardo Bart
abcc95634e Redirect violations msgs to default channel 2013-01-31 01:11:36 -02:00
Henrique Santiago
8a2d2cd5ac Fixes to minimap 2013-01-31 01:09:56 -02:00
Eduardo Bart
654f71e75f Fix autowalk sometimes not being canceled 2013-01-31 00:50:20 -02:00
Eduardo Bart
1bf77c35c6 Fix some minor bugs in widgets events 2013-01-31 00:21:39 -02:00
Henrique Santiago
17d09f41be Rework UIMinimap 2013-01-30 23:44:57 -02:00
Henrique Santiago
ca9c33ff54 Fix getColor, add/get position 2013-01-30 19:08:53 -02:00
Eduardo Bart
da050a5630 Fix trade/use bug from previous commit 2013-01-30 18:57:37 -02:00
Eduardo Bart
5bf03c50d6 Rework hotkeys manager, fix many issues on it 2013-01-30 18:28:54 -02:00
BeniS
377c013dfe Cooldown particles! lol
* Changed some ui details in cooldown module.
2013-01-30 12:00:13 +13:00
Henrique Santiago
60986eb80f Minimap fix and remove option 2013-01-29 18:36:27 -02:00
Eduardo Bart
ff9f82d0c8 Fix other compile errors 2013-01-29 16:56:50 -02:00
Eduardo Bart
80a7ecb3a4 Speed up compilation time for luafunctions
* Other compile fixes for gcc
2013-01-29 15:27:59 -02:00
Eduardo Bart
8d6ccb8d83 Fixes to compile with clang 2013-01-29 14:35:20 -02:00
Eduardo Bart
4751941e4f Improve encrypt/decrypt algorithms 2013-01-29 11:51:15 -02:00
BeniS
f492d291eb More fixes to spell cooldown module:
* Fixed duration issues.
* Fixed referencing after destroyed issue.
* Using callbacks for progress rect now.
2013-01-30 02:01:52 +13:00
Eduardo Bart
26c6217bc3 Fix change of RSA keys 2013-01-29 10:37:15 -02:00
BeniS
ec30567d6b Some fixes to spells/cooldowns.
* Fixed 'progress' bug for spells in the cooldown module.
* Fixed a bug with GameForceFirstAutoWalkStep feature.
* Moved the spells ID to its SpellInfo row.
* Lower cased table functions (consistant).
2013-01-29 19:26:32 +13:00
Eduardo Bart
b7eef97239 Add flexibility in login packets
* It's now possible to add custom data in the login packet
* Add utility funciton to generate RSA keys
* Make the protocol able to use RSA keys with 2048 bits or more
2013-01-28 20:52:03 -02:00
Eduardo Bart
6c7a163197 Add missing file 2013-01-28 19:20:01 -02:00
Eduardo Bart
d6e8e92a45 Some fixes in hotkeys and other improvements
* Save last logged character and world instead of character name
* Make focused label always visible in character list and hotkeys
* Other fixes in hotkeys
2013-01-28 16:33:35 -02:00
BeniS
197a379933 Some minor things.
Just got back today, awesome progress ed :)
2013-01-29 00:02:44 +13:00
Eduardo Bart
773837da98 Minor changes in file type handling 2013-01-27 23:23:53 -02:00
Eduardo Bart
4536c68f00 Fix #249 2013-01-27 18:26:48 -02:00
Eduardo Bart
6966221e39 Fixes and improvements in find path 2013-01-27 16:58:44 -02:00
Henrique Santiago
2bd86d0695 Fix minimap zoom, blue name 2013-01-27 14:53:16 -02:00
Eduardo Bart
bcb3db4cdc Fix #250 2013-01-27 14:25:44 -02:00
Eduardo Bart
e81dd31ae3 New lightweight minimap format, finish #15 2013-01-27 14:06:47 -02:00
Henrique Santiago
cf0ecf418d Pt translations, small fix in console tabbar 2013-01-27 09:22:48 -02:00
Eduardo Bart
9aca1644e6 Implement rule violations, closes #218 2013-01-27 07:54:50 -02:00
Eduardo Bart
6c59124cb2 Reimplement smartwalk without events 2013-01-26 21:18:07 -02:00
Eduardo Bart
7c06a00f82 Improve logout speed via Ctrl+G 2013-01-26 20:52:37 -02:00
Eduardo Bart
9f69c71b6d Minimap navigation with Alt hotkeys 2013-01-26 20:20:26 -02:00
Eduardo Bart
4351f3c63f More improvements in walk 2013-01-26 20:12:00 -02:00
Eduardo Bart
4b1db2bcd6 Fix #235 and other changes 2013-01-26 18:40:03 -02:00
Eduardo Bart
2fd3c643c4 Rework smart walk, fix #247 2013-01-26 18:10:30 -02:00
Eduardo Bart
4f8f02acad Rework auto focus behavior, closes #222 2013-01-26 17:06:25 -02:00
Eduardo Bart
7e01306fc6 Improvements to popupmenus, fix #245 and #246 2013-01-26 16:05:34 -02:00
Eduardo Bart
835adfb4ce Fix a compile error 2013-01-26 15:17:32 -02:00
Eduardo Bart
6594b2d090 Fix #7 2013-01-26 14:54:19 -02:00
Eduardo Bart
4d0d62e364 Fix #244 2013-01-26 14:39:11 -02:00
Eduardo Bart
07959ddc04 Fix a vulnerability in password encryption
* There was an error in the encryption used to save passwords,
  now it's really harder to decrypt the password from the config file
* Other minor changes
2013-01-26 14:38:48 -02:00
Eduardo Bart
18af9a45ee Fix #166 2013-01-25 18:51:14 -02:00
Eduardo Bart
90f1244ab4 Fix #194 2013-01-25 18:28:44 -02:00
Eduardo Bart
9e4a9433ca Fix #243 2013-01-25 17:30:40 -02:00
Eduardo Bart
32c5f4285b Closes #210
* And minor adjustments
2013-01-25 17:26:51 -02:00
Henrique Santiago
c982ca81a5 Rework options visual 2013-01-25 13:33:51 -02:00
Eduardo Bart
a144174c41 Use push/pop mechanism for cursors 2013-01-25 11:47:51 -02:00
Eduardo Bart
3a47c4f2e1 Remake cursors, closes #219 and #237 2013-01-25 11:19:40 -02:00
Eduardo Bart
0a91fff82a Textedit improvements 2013-01-25 11:17:59 -02:00
Henrique Santiago
95f79b45dc Configure default hotkey, fix map release 2013-01-25 10:22:51 -02:00
Henrique Santiago
839495fa9b Another sort function for hotkeys 2013-01-25 09:36:57 -02:00
Henrique Santiago
42b05df717 Hotkeys order, minimap mark windw changes 2013-01-24 20:57:51 -02:00
Eduardo Bart
d5b4e0929f Improvements in textedit and hotkey manager
* Set textedit's cursor position to the end of text in some situations
* Send hotkey messages to the current channel instead of default channel
* Allow to overwrite sprites using otml and pngs
2013-01-24 18:36:04 -02:00
Eduardo Bart
a8fbd6cdfc Improve game map view modes 2013-01-24 17:15:07 -02:00
Eduardo Bart
5b65088426 Improve tab navigation and scrolling
* Fix with use with over creatures when you are over force use objects
* Fix textedit wrapping
2013-01-24 15:46:02 -02:00
Henrique Santiago
bc55cbbbd1 Pt translations, some helper functions 2013-01-24 14:01:28 -02:00
Henrique Santiago
c3eede9872 Changes to translations 2013-01-24 11:33:53 +00:00
Eduardo Bart
8d5cd95bc4 Update es translations, thanks @mattyx14 2013-01-24 11:11:30 -02:00
392 changed files with 15340 additions and 6178 deletions

73
.gitignore vendored
View File

@@ -1,4 +1,3 @@
/modules/.project
build* build*
CMakeCache.txt CMakeCache.txt
CMakeFiles CMakeFiles
@@ -37,3 +36,75 @@ otclient.layout
LOCALTODO LOCALTODO
tags tags
Thumbs.db Thumbs.db
.directory
src/framework/graphics/dx/
modules/.project/modules.sublime-workspace
#################
## Visual Studio
#################
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.sln.docstates
# Build results
[Dd]ebug/
[Rr]elease/
x64/
build/
[Bb]in/
[Oo]bj/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
*_i.c
*_p.c
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.log
*.scc
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf
*.cachefile
# Visual Studio profiler
*.psess
*.vsp
*.vspx
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper

View File

@@ -1,17 +1,21 @@
cmake_minimum_required(VERSION 2.6) cmake_minimum_required(VERSION 2.6)
project(otclient) project(otclient)
set(VERSION "0.6.0") set(VERSION "0.6.5")
option(FRAMEWORK_SOUND "Use SOUND " ON)
option(FRAMEWORK_GRAPHICS "Use GRAPHICS " ON)
option(FRAMEWORK_XML "Use XML " ON)
option(FRAMEWORK_NET "Use NET " ON)
option(FRAMEWORK_SQL "Use SQL" OFF)
set(FRAMEWORK_SOUND ON)
set(FRAMEWORK_GRAPHICS ON)
set(FRAMEWORK_XML ON)
set(FRAMEWORK_NET ON)
include(src/framework/CMakeLists.txt) include(src/framework/CMakeLists.txt)
include(src/client/CMakeLists.txt) include(src/client/CMakeLists.txt)
# functions map for reading backtraces # functions map for reading backtraces
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -Wl,-Map=${PROJECT_NAME}.map") if(NOT APPLE)
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -Wl,-Map=${PROJECT_NAME}.map")
endif()
option(USE_PCH "Use precompiled header (speed up compile)" OFF) option(USE_PCH "Use precompiled header (speed up compile)" OFF)

View File

@@ -8,6 +8,18 @@ that each functionality is a separated module, giving the possibility to users m
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++2011, the upcoming C++ standard and heavily scripted in lua. Otclient is written in C++2011, the upcoming C++ standard and heavily scripted in lua.
### Where do I download?
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/VER/` (i.e: `data/things/1031/Tibia.spr`)
Older releases can be downloaded from [here](https://www.dropbox.com/sh/se1okacemoqzjve/-oWK4YFm03)
### Features ### Features
Beyond of it's flexibility with scripts, otclient comes with tons of other features that make possible Beyond of it's flexibility with scripts, otclient comes with tons of other features that make possible
@@ -18,17 +30,18 @@ to port to mobile platforms. Otclient is also flexible enough to
create tibia tools like map editors just using scripts, because it wasn't designed to be just a create tibia tools like map editors just using scripts, because it wasn't designed to be just a
client, instead otclient was designed to be a combination of a framework and tibia APIs. client, instead otclient was designed to be a combination of a framework and tibia APIs.
### Download
Stable versions of otclient master branch compiled for Windows and Linux is available
in the [downloads section](https://github.com/edubart/otclient/downloads) of the project's github page.
### 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)
### 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,
@@ -50,4 +63,3 @@ Talk directly with us at #otclient irc.freenode.net or send an email directly to
Otclient is made available under the MIT License, thus this means that you are free Otclient is made available under the MIT License, thus this means that you are free
to do whatever you want, commercial, non-commercial, closed or open. to do whatever you want, commercial, non-commercial, closed or open.

13
data/cursors/cursors.otml Normal file
View File

@@ -0,0 +1,13 @@
Cursors
target:
image: targetcursor
hot-spot: 9 9
horizontal:
image: horizontalcursor
hot-spot: 9 4
vertical:
image: verticalcursor
hot-spot: 4 9
text:
image: textcursor
hot-spot: 4 9

View File

Before

Width:  |  Height:  |  Size: 230 B

After

Width:  |  Height:  |  Size: 230 B

View File

Before

Width:  |  Height:  |  Size: 266 B

After

Width:  |  Height:  |  Size: 266 B

View File

Before

Width:  |  Height:  |  Size: 198 B

After

Width:  |  Height:  |  Size: 198 B

View File

Before

Width:  |  Height:  |  Size: 238 B

After

Width:  |  Height:  |  Size: 238 B

View File

@@ -0,0 +1,8 @@
Font
name: terminus-10px
texture: terminus-10px
height: 12
y-offset: 0
glyph-size: 16 16
fixed-glyph-width: 6
space-width: 6

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 418 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 418 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 880 B

After

Width:  |  Height:  |  Size: 822 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 B

BIN
data/images/ui/icon_add.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 661 B

After

Width:  |  Height:  |  Size: 646 B

View File

@@ -344,7 +344,7 @@ locale = {
["You are dazzled"] = "Du bist geblendet", ["You are dazzled"] = "Du bist geblendet",
["You are dead."] = "Du bist tot.", ["You are dead."] = "Du bist tot.",
["You are dead"] = "Du bist tot", ["You are dead"] = "Du bist tot",
["You are drowing"] = "Du ertrinkst", ["You are drowning"] = "Du ertrinkst",
["You are drunk"] = "Du bist betrunken", ["You are drunk"] = "Du bist betrunken",
["You are electrified"] = "Du bist elektrifiziert", ["You are electrified"] = "Du bist elektrifiziert",
["You are freezing"] = "Du bist am Erfrieren", ["You are freezing"] = "Du bist am Erfrieren",

View File

@@ -1,374 +1,378 @@
-- special thanks for Shaday, who made these translations -- special thanks for Shaday, who made these translations
--Dominique120 edits: I made some statements to sound more formal and appropriate as well as correcting a few words that were not translated. I also added a few notes for future translators to keep in mind.
locale = { locale = {
name = "es", name = "es",
charset = "cp1252", charset = "cp1252",
languageName = "Espa<EFBFBD>ol", languageName = "Espa<EFBFBD>ol",
translation = { translation = {
["1a) Offensive Name"] = false, ["1a) Offensive Name"] = "1a) Nombre ofensivo",
["1b) Invalid Name Format"] = false, ["1b) Invalid Name Format"] = "1b) Formato invalido para nombre",
["1c) Unsuitable Name"] = false, ["1c) Unsuitable Name"] = "1c) Nombre no adecuado",
["1d) Name Inciting Rule Violation"] = false, ["1d) Name Inciting Rule Violation"] = "1d) Nombre que incita una violaci<63>n al reglamento",
["2a) Offensive Statement"] = false, ["2a) Offensive Statement"] = "2a) Comentario ofensivo",
["2b) Spamming"] = false, ["2b) Spamming"] = "2b) Spamming",
["2c) Illegal Advertising"] = false, ["2c) Illegal Advertising"] = "2c) Publicidad il<69>cita",
["2d) Off-Topic Public Statement"] = false, ["2d) Off-Topic Public Statement"] = "2d) Publicaci<63>n fuera de lugar",
["2e) Non-English Public Statement"] = false, ["2e) Non-English Public Statement"] = "2e) Publicaci<63>n fuera del ingles",
["2f) Inciting Rule Violation"] = false, ["2f) Inciting Rule Violation"] = "2f) Incitar a una violaci<63>n al reglamento",
["3a) Bug Abuse"] = false, ["3a) Bug Abuse"] = "3a) Abuso de error",
["3b) Game Weakness Abuse"] = false, ["3b) Game Weakness Abuse"] = "3b) Abuso de debilidad del juego",
["3c) Using Unofficial Software to Play"] = false, ["3c) Using Unofficial Software to Play"] = "3c) Usando software ilegal para jugar",
["3d) Hacking"] = false, ["3d) Hacking"] = "3d) Hackeo",
["3e) Multi-Clienting"] = false, ["3e) Multi-Clienting"] = "3e) Uso de m<>ltiples clientes",
["3f) Account Trading or Sharing"] = false, ["3f) Account Trading or Sharing"] = "3f) Intercambio de cuenta",
["4a) Threatening Gamemaster"] = false, ["4a) Threatening Gamemaster"] = "4a) Amenzar a un Gamemaster",
["4b) Pretending to Have Influence on Rule Enforcement"] = false, ["4b) Pretending to Have Influence on Rule Enforcement"] = "4b) Pretender tener influencia en una parte del reglamento",
["4c) False Report to Gamemaster"] = false, ["4c) False Report to Gamemaster"] = "4c) Reporte falso a un Gamemaster",
["Accept"] = false, ["Accept"] = "Aceptar",
["Account name"] = "Nombre de la cuenta", ["Account name"] = "Nombre de cuenta",
["Account Status:"] = false, ["Account Status:"] = "Estado de cuenta:",
["Action:"] = false, ["Action:"] = "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",
["Addon 1"] = "Addon 1", ["Addon 1"] = "Addon 1",
["Addon 2"] = "Addon 2", ["Addon 2"] = "Addon 1",
["Addon 3"] = "Addon 3", ["Addon 3"] = "Addon 1",
["Add to VIP list"] = "A<EFBFBD>adir a lista VIP", ["Add to VIP list"] = "A<EFBFBD>adir a lista VIP",
["Adjust volume"] = "Ajustar vol<EFBFBD>men", ["Adjust volume"] = "Ajustar volumen",
["Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back\ninto this world in exchange for a small sacrifice\n\nSimply click on Ok to resume your journeys!"] = false, ["Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back\ninto this world in exchange for a small sacrifice\n\nSimply click on Ok to resume your journeys!"] = "<EFBFBD>Ay! Aventurero valiente, 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"] = false, ["All"] = "Todo",
["All modules and scripts were reloaded."] = "Todos los m<>dulos y scripts han sido reiniciados", ["All modules and scripts were reloaded."] = "Todos los m<>dulos y scripts se vuelven a cargar.",
["Allow auto chase override"] = false, ["Allow auto chase override"] = "Permitur auto persecuci<63>n override",
["Also known as dash in tibia community, recommended\nfor playing characters with high speed"] = false, ["Also known as dash in tibia community, recommended\nfor playing characters with high speed"] = "Conocido por la comunidad de tibia como dash.\nRecomenada para jugadores de alto nivel.",
["Ambient light: %s%%"] = false, ["Ambient light: %s%%"] = "Ambiente de luz: %s%%",
["Amount:"] = "Cantidad:", ["Amount:"] = "Cantidad:",
["Amount"] = false, ["Amount"] = "Cantidad",
["Anonymous"] = false, ["Anonymous"] = "An<EFBFBD>nimo",
["Are you sure you want to logout?"] = false, ["Are you sure you want to logout?"] = "<EFBFBD>Estas seguro de que deseas salir?",
["Attack"] = "Atacar", ["Attack"] = "Atacar",
["Author"] = "Autor", ["Author"] = "Autor",
["Autoload"] = "Cargar autom<6F>ticamente", ["Autoload"] = "Auto carga",
["Autoload priority"] = "Prioridad de carga", ["Autoload priority"] = "Auto carga prioritaria",
["Auto login"] = "Entrar autom<6F>ticamente", ["Auto login"] = "Auto ingresar",
["Auto login selected character on next charlist load"] = "Entrar autom<6F>ticamente con un personage cuando se vuelva a abrir la lista de personajes", ["Auto login selected character on next charlist load"] = "Ingresar la siguiente vez que aparece el charlist con el personaje seleccionado",
["Axe Fighting"] = "Combate con Hacha", ["Axe Fighting"] = "Combate con hacha",
["Balance:"] = false, ["Balance:"] = "Saldo:",
["Banishment"] = false, ["Banishment"] = "Banishment",
["Banishment + Final Warning"] = false, ["Banishment + Final Warning"] = "Banishment + Final Warning",
["Battle"] = "Batalla", ["Battle"] = "Batalla",
["Browse"] = false, ["Browse"] = "Navegar",
["Bug report sent."] = false, ["Bug report sent."] = "Reporte de error enviado.",
["Button Assign"] = "Seleccionar Bot<EFBFBD>n", ["Button Assign"] = "Bot<EFBFBD>n asignado",
["Buy"] = "Comprar", ["Buy"] = "Compra",
["Buy Now"] = false, ["Buy Now"] = "Compra ahora",
["Buy Offers"] = false, ["Buy Offers"] = "Comprar oferta",
["Buy with backpack"] = "Comprar con mochila", ["Buy with backpack"] = "Comprar con mochila",
["Cancel"] = "Cancelar", ["Cancel"] = "Cancelar",
["Cannot login while already in game."] = false, ["Cannot login while already in game."] = "No se puede iniciar sesi<73>n, mientras que est<73>s en el juego.",
["Cap"] = false, ["Cap"] = "Cap",
["Capacity"] = "Capacidad", ["Capacity"] = "Capacidad",
["Center"] = false, ["Center"] = "Centrar",
["Channels"] = "Canales", ["Channels"] = "Canales",
["Character List"] = "Lista de personajes", ["Character List"] = "Lista de car<EFBFBD>cter",
["Classic control"] = "Control cl<EFBFBD>sico", ["Classic control"] = "Controles Cl<EFBFBD>sicos",
["Clear current message window"] = false, ["Clear current message window"] = "Limpiar mensaje actual en ventana",
["Clear Messages"] = false, ["Clear Messages"] = "Limpiar mensaje",
["Clear object"] = "Limpiar objeto", ["Clear object"] = "Limpiar objeto",
["Client needs update."] = false, ["Client needs update."] = "El cliente necesita una actualizaci<63>n.",
["Close"] = "Cerrar", ["Close"] = "Cerrar",
["Close this channel"] = "Cerrar este canal", ["Close this channel"] = "Cerrar este canal",
["Club Fighting"] = "Combate con Maza", ["Club Fighting"] = "Combate con mazo",
["Combat Controls"] = "Controles de combate", ["Combat Controls"] = "Controles de combate",
["Comment:"] = false, ["Comment:"] = "Comentario:",
["Connecting to game server..."] = "Conectando al servidor de juego...", ["Connecting to game server..."] = "Conectando a servidor game...",
["Connecting to login server..."] = "Conectando al servidor de autentificaci<63>n...", ["Connecting to login server..."] = "Conectando a servidor login...",
["Console"] = false, ["Console"] = "Consola",
["Cooldowns"] = false, ["Cooldowns"] = "Descansos",
["Copy message"] = false, ["Copy message"] = "Copiar mensaje",
["Copy name"] = false, ["Copy name"] = "Copiar nombre",
["Copy Name"] = "Copiar Nombre", ["Copy Name"] = "Copiar nombre",
["Create Map Mark"] = false, ["Create Map Mark"] = "Crear marca en mapa",
["Create mark"] = false, ["Create mark"] = "Crear marca",
["Create New Offer"] = false, ["Create New Offer"] = "Crear nueva oferta",
["Create Offer"] = false, ["Create Offer"] = "Crear oferta",
["Current hotkeys:"] = "Atajos actuales", ["Current hotkeys:"] = "Actuales hotkeys:",
["Current hotkey to add: %s"] = "Atajo actual para a<>adir: %s", ["Current hotkey to add: %s"] = "Actuales hotkeys a agregar: %s",
["Current Offers"] = false, ["Current Offers"] = "Oferta actual",
["Default"] = "Principal", ["Default"] = "Predeterminado",
["Delete mark"] = false, ["Delete mark"] = "Borrar Marca",
["Description:"] = false, ["Description:"] = "Descripci<EFBFBD>n:",
["Description"] = "Descripci<EFBFBD>n", ["Description"] = "Descripci<EFBFBD>n",
["Destructive Behaviour"] = false, ["Destructive Behaviour"] = "Comportamiento destructivo",
["Detail"] = "Detalle", ["Detail"] = "Detalle",
["Details"] = false, ["Details"] = "Detalles",
["Disable Shared Experience"] = "Desactivar experiencia compartida", ["Disable Shared Experience"] = "Desactivar experiencia compartida",
["Dismount"] = false, ["Dismount"] = "Desmontar",
["Display connection speed to the server (milliseconds)"] = false, ["Display connection speed to the server (milliseconds)"] = "Mostrar velocidad de conexi<78>n en el servidor (millisegundos)",
["Distance Fighting"] = "Combate a Distancia", ["Distance Fighting"] = "Combate a distancia",
["Don't stretch/shrink Game Window"] = false, ["Don\'t stretch/shrink Game Window"] = "No estirar ni reducir el tama<6D>o de ventana",
["Edit hotkey text:"] = "Editar texto del atajo", ["Edit hotkey text:"] = "Editar texto de hotkey:",
["Edit List"] = false, ["Edit List"] = "Editar lista",
["Edit Text"] = "Editar Texto", ["Edit Text"] = "Editar texto",
["Enable music"] = false, ["Enable music"] = "Habilitar m<>sica",
["Enable Shared Experience"] = "Activar experiencia compartida", ["Enable Shared Experience"] = "Habilitar experiencia compartida",
["Enable smart walking"] = false, ["Enable smart walking"] = "Habilitar caminado inteligente",
["Enable vertical synchronization"] = "Activar sincronizaci<63>n vertical", ["Enable vertical synchronization"] = "Habilitar sincronizaci<63>n vertical",
["Enable walk booster"] = false, ["Enable walk booster"] = "Habilitar caminado turbo",
["Enter Game"] = "Entrar al juego", ["Enter Game"] = "Entrar al juego",
["Enter one name per line."] = false, ["Enter one name per line."] = "Introducir un nombre por linea.",
["Enter with your account again to update your client."] = false, ["Enter with your account again to update your client."] = "Ingrese con su cuenta nuevamente para actualizar el cliente.",
["Error"] = "Error", ["Error"] = "Error",
["Error"] = "Error", ["Error"] = "Error",
["Excessive Unjustified Player Killing"] = false, ["Excessive Unjustified Player Killing"] = "Asesinato excesivo injustificado de jugadores",
["Exclude from private chat"] = "Excluir del canal privado", ["Exclude from private chat"] = "Ejecutar desde un canal privado",
["Exit"] = false, ["Exit"] = "Salir",
["Experience"] = "Experiencia", ["Experience"] = "Experiencia",
["Filter list to match your level"] = false, ["Filter list to match your level"] = "Lista de filtros que coincida con el nivel",
["Filter list to match your vocation"] = false, ["Filter list to match your vocation"] = "Lista de filtros que coincida con el vocaci<63>n",
["Find:"] = false, ["Find:"] = "Encontrar:",
["Fishing"] = "Pesca", ["Fishing"] = "Pesca",
["Fist Fighting"] = "Combate con Pu<EFBFBD>os", ["Fist Fighting"] = "Combate con pu<EFBFBD>os",
["Follow"] = "Seguir", ["Follow"] = "Seguir",
["Force Exit"] = false, ["Force Exit"] = "Forzar salida",
["For Your Information"] = false, ["For Your Information"] = "Para tu informaci<63>n",
["Free Account"] = false, ["Free Account"] = "Cuenta gratis",
["Fullscreen"] = "Pantalla Completa", ["Fullscreen"] = "Pantalla completa",
["Game"] = false, ["Game"] = "Juego",
["Game framerate limit: %s"] = false, ["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"] = false, ["Graphics card driver not detected"] = "Controlador de tarjeta gr<67>fica de video no detectado",
["Graphics Engine:"] = false, ["Graphics Engine:"] = "Motor Gr<47>fico:",
["Head"] = "Cabeza", ["Head"] = "Cabeza",
["Healing"] = false, ["Healing"] = "Curaci<EFBFBD>n",
["Health Info"] = false, ["Health Info"] = "HP Info",--This can be better
["Health Information"] = false, ["Health Information"] = "HP Informaci<63>n",--This can be better
["Hide monsters"] = "Esconder monstruos", ["Hide monsters"] = "Ocultar monstruos",
["Hide non-skull players"] = "Esconder jugadores sin calavera", ["Hide non-skull players"] = "Ocultar jugadores sin skull",
["Hide Npcs"] = "Esconder NPCs", ["Hide Npcs"] = "Ocultar NPCs",
["Hide Offline"] = false, ["Hide Offline"] = "Ocultar fuera de linea",
["Hide party members"] = "Esconder miembros del grupo", ["Hide party members"] = "Ocultar miembros del party",
["Hide players"] = "Esconder jugadores", ["Hide players"] = "Ocultar players",
["Hide spells for higher exp. levels"] = false, ["Hide spells for higher exp. levels"] = "Ocultar hechizos para niveles mas altos que tu experiencia.",
["Hide spells for other vocations"] = false, ["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"] = false, ["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"] = "Atajos", ["Hotkeys"] = "Hotkeys",
["If you shut down the program, your character might stay in the game.\nClick on 'Logout' to ensure that you character leaves the game properly.\nClick on 'Exit' if you want to exit the program without logging out your character."] = false, ["If you shut down the program, your character might stay in the game.\nClick on 'Logout' to ensure that you character leaves the game properly.\nClick on 'Exit' if you want to exit the program without logging out your character."] = "Si se cierra el programa, tu personaje puede permanecer en el juego.\nHaga clic en 'Salir' para asegurarse de que personaje deja el juego correctamente.\nHaga click en 'Salir' si desea salir del programa sin tener que salir de tu personaje.",
["Ignore"] = false, ["Ignore"] = "Ignorar",
["Ignore capacity"] = "Ignorar capacidad", ["Ignore capacity"] = "Ignorar Capacidad",
["Ignored players:"] = false, ["Ignored players:"] = "Jugadores ignorados:",
["Ignore equipped"] = "Ignorar equipado", ["Ignore equipped"] = "Ignorar lo equipado",
["Ignore List"] = false, ["Ignore List"] = "Ignorar lista",
["Ignore players"] = false, ["Ignore players"] = "Ignorar jugadores",
["Ignore Private Messages"] = false, ["Ignore Private Messages"] = "Ignorar mensajes privados",
["Ignore Yelling"] = false, ["Ignore Yelling"] = "Ignorar gritos",
["Interface framerate limit: %s"] = false, ["Interface framerate limit: %s"] = "Interface de cuadros por segundo: %s",
["Inventory"] = "Inventario", ["Inventory"] = "Inventario",
["Invite to Party"] = "Invitar al grupo", ["Invite to Party"] = "Ivitar al party",
["Invite to private chat"] = "Invitar al canal privado", ["Invite to private chat"] = "Invitar a canal privado",
["IP Address Banishment"] = false, ["IP Address Banishment"] = "Banishment - Direcci<63>n IP",
["Item Offers"] = false, ["Item Offers"] = "Ofertas de objetos",
["It is empty."] = false, ["It is empty."] = "Est<EFBFBD> vaci<63>.",
["Join %s's Party"] = false, ["Join %s\'s Party"] = "Unirse al party de %s ",
["Leave Party"] = "Salir del grupo", ["Leave Party"] = "Dejar el party",
["Level"] = "Nivel", ["Level"] = "Nivel",
["Lifetime Premium Account"] = false, ["Lifetime Premium Account"] = "Tiempo de Premium Account infinito",
["Limits FPS to 60"] = "Limita los FPS a 60", ["Limits FPS to 60"] = "Limites FPS a 60",
["List of items that you're able to buy"] = "Lista de objetos que usted puede comprar", ["List of items that you're able to buy"] = "Lista de objetos que puedes de comprar",
["List of items that you're able to sell"] = "Lista de objetos que usted puede vender", ["List of items that you're able to sell"] = "Lista de objetos que puedes de vender",
["Load"] = "Cargar", ["Load"] = "Cargar",
["Logging out..."] = false, ["Logging out..."] = "Cerrando sesi<73>n...",
["Login"] = "Entrar", ["Login"] = "Ingresar",
["Login Error"] = "Error de Autentificaci<EFBFBD>n", ["Login Error"] = "Error de ingreso",
["Login Error"] = "Error de Autentificaci<EFBFBD>n", ["Login Error"] = "Error de ingreso",
["Logout"] = false, ["Logout"] = "Salir",
["Look"] = "Ver", ["Look"] = "Mirar",
["Magic Level"] = "Nivel M<EFBFBD>gico", ["Magic Level"] = "Nivel m<EFBFBD>gico",
["Make sure that your client uses\nthe correct game protocol version"] = "Compruebe que tu cliente use\nuse el mismo protocolo que el servidor de juego", ["Make sure that your client uses\nthe correct game protocol version"] = "Aseg<EFBFBD>rese de que el cliente este utilizando\nes el versi<EFBFBD>n del protocolo adecuado",
["Mana"] = "Mana", ["Mana"] = "Mana",
["Manage hotkeys:"] = "Configurar atajos:", ["Manage hotkeys:"] = "Administrador de hotkeys:",
["Market"] = false, ["Market"] = "Mercado",
["Market Offers"] = false, ["Market Offers"] = "Ofertas en mercado",
["Message of the day"] = "Mensaje del d<>a", ["Message of the day"] = "Mensaje del d<>a",
["Message to "] = false, ["Message to "] = "Mensaje a",
["Message to %s"] = "Mandar mensaje a %s", ["Message to %s"] = "Mensaje a %s",
["Minimap"] = "Minimapa", ["Minimap"] = "Minimapa",
["Module Manager"] = "Administrador de M<EFBFBD>dulos", ["Module Manager"] = "Administrador de m<EFBFBD>dulos",
["Module name"] = "Nombre del m<EFBFBD>dulo", ["Module name"] = "Nombre del modulo",
["Mount"] = false, ["Mount"] = "Montar", --Unique name?
["Move Stackable Item"] = "Mover objeto contable", ["Move Stackable Item"] = "Mover objeto apilable",
["Move up"] = "Mover arriba", ["Move up"] = "Mover arriba",
["My Offers"] = false, ["My Offers"] = "Mis ofertas",
["Name:"] = "Nombre:", ["Name:"] = "Nombre:",
["Name Report"] = false, ["Name Report"] = "Name Report",
["Name Report + Banishment"] = false, ["Name Report + Banishment"] = "Name Report + Banishment",
["Name Report + Banishment + Final Warning"] = false, ["Name Report + Banishment + Final Warning"] = "Name Report + Banishment + Final Warning",
["No"] = false, ["No"] = "No",
["No graphics card detected, everything will be drawn using the CPU,\nthus the performance will be really bad.\nPlease update your graphics driver to have a better performance."] = false, ["No graphics card detected, everything will be drawn using the CPU,\nthus the performance will be really bad.\nPlease update your graphics driver to have a better performance."] = "No 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."] = false, ["No item selected."] = "No hay elemento seleccionado.",
["No Mount"] = false, ["No Mount"] = "No montura",
["No Outfit"] = false, ["No Outfit"] = "No outfit",
["No statement has been selected."] = false, ["No statement has been selected."] = "No hay comentario seleccionado.",
["Notation"] = false, ["Notation"] = "Notation",
["NPC Trade"] = "Comercia con NPC", ["NPC Trade"] = "Intercambio con NPC",
["Offer History"] = false, ["Offer History"] = "Historial de oferta",
["Offers"] = false, ["Offers"] = "Ofertas",
["Offer Type:"] = false, ["Offer Type:"] = "Tipo de oferta:",
["Offline Training"] = false, ["Offline Training"] = "Entrenamiento offLine",
["Ok"] = "Ok", ["Ok"] = "OK",
["on %s.\n"] = false, ["on %s.\n"] = "en %s.\n",
["Open"] = "Abrir", ["Open"] = "Abierto",
["Open a private message channel:"] = "Abrir un canal privado:", ["Open a private message channel:"] = "Abrir mensaje en canal privado:",
["Open charlist automatically when starting client"] = false, ["Open charlist automatically when starting client"] = "Abrir lista de jugadores autom<6F>ticamente al iniciar el cliente",
["Open in new window"] = "Abrir en una nueva ventana", ["Open in new window"] = "Abrir en nueva ventana",
["Open new channel"] = "Abrir novo canal", ["Open new channel"] = "Abrir nuevo canal",
["Options"] = "Opciones", ["Options"] = "Opciones",
["Overview"] = false, ["Overview"] = "Descripci<EFBFBD>n",
["Pass Leadership to %s"] = "Pasar el liderazgo a %s", ["Pass Leadership to %s"] = "Pasar liderazgo a %s",
["Password"] = "Contrase<EFBFBD>a", ["Password"] = "Contrase<EFBFBD>a",
["Piece Price:"] = false, ["Piece Price:"] = "Precio por pieza:",
["Please enter a character name:"] = "Por favor, introduce el nombre de un personaje:", ["Please enter a character name:"] = "Por favor ingresar nombre del jugador:",
["Please, press the key you wish to add onto your hotkeys manager"] = "Por favor, presione la tecla que desee para\na<EFBFBD>adir a tu administrador de atajos", ["Please, press the key you wish to add onto your hotkeys manager"] = "Por favor, presiona la tecla que desees para que sea registrada en\nel administrador de hotkeys",
["Please Select"] = false, ["Please Select"] = "Por favor seleccione",
["Please use this dialog to only report bugs. Do not report rule violations here!"] = false, ["Please use this dialog to only report bugs. Do not report rule violations here!"] = "Por favor usa 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:"] = false, ["Position:"] = "Posici<EFBFBD>n:",
["Position: %i %i %i"] = false, ["Position: %i %i %i"] = "Posici<EFBFBD>n: %i %i %i",
["Premium Account (%s) days left"] = false, ["Premium Account (%s) days left"] = "Tienes (%s) d<>as de Premium Account restantes",
["Price:"] = "Precio", ["Price:"] = "Precio:",
["Primary"] = "Primario", ["Primary"] = "Primario",
["Protocol"] = false, ["Protocol"] = "Protocolo",
["Quest Log"] = false, ["Quest Log"] = "Quest Log", --Unique name
["Randomize"] = false, ["Randomize"] = "Combinar",
["Randomize characters outfit"] = false, ["Randomize characters outfit"] = "Combinar vestimenta del jugador",
["Reason:"] = false, ["Reason:"] = "Raz<EFBFBD>n:",
["Refresh"] = "Actualizar", ["Refresh"] = "Refrescar",
["Refresh Offers"] = false, ["Refresh Offers"] = "Refrescar ofertas",
["Regeneration Time"] = false, ["Regeneration Time"] = "Tiempo de regeneraci<63>n",
["Reject"] = false, ["Reject"] = "Rechazar",
["Reload All"] = "Recargar Todos", ["Reload All"] = "Cargar todo de nuevo",
["Remember account and password when starts client"] = false, ["Remember account and password when starts client"] = "Recordar cuenta y contrase<73>a al iniciar el cliente",
["Remember password"] = "Recordar contrase<73>a", ["Remember password"] = "Recordar contrase<73>a",
["Remove"] = "Quitar", ["Remove"] = "Remover",
["Remove %s"] = "Quitar %s", ["Remove %s"] = "Remover %s",
["Report Bug"] = false, ["Report Bug"] = "Reportar error",
["Reserved for more functionality later."] = false, ["Reserved for more functionality later."] = "Reservado para una funci<63>n futura.",
["Reset Market"] = false, ["Reset Market"] = "Reiniciar mercado",
["Revoke %s's Invitation"] = false, ["Revoke %s\'s Invitation"] = "Anular %s\'s invitaci<63>n",
["Rotate"] = "Girar", ["Rotate"] = "Rotar",
["Rule Violation"] = false, ["Rule Violation"] = "Violaci<EFBFBD>n del reglamento",
["Save"] = false, ["Save"] = "Guardar",
["Save Messages"] = false, ["Save Messages"] = "Guardar mensaje",
["Search:"] = "Buscar:", ["Search:"] = "Buscar:",
["Search all items"] = false, ["Search all items"] = "Buscar todos los objetos",
["Secondary"] = "Secundario", ["Secondary"] = "Secundario",
["Select object"] = "Seleccionar objeto", ["Select object"] = "Seleccionar objeto",
["Select Outfit"] = "Selecionar Traje", ["Select Outfit"] = "Seleccionar outfit",
["Select your language"] = false, ["Select your language"] = "Selectionar tu lenguaje",
["Sell"] = "Vender", ["Sell"] = "Vender",
["Sell Now"] = false, ["Sell Now"] = "Vender ahora",
["Sell Offers"] = false, ["Sell Offers"] = "Ofertas de venta",
["Send"] = false, ["Send"] = "Enviar",
["Send automatically"] = "Enviar autom<6F>ticamente", ["Send automatically"] = "Enviar autom<6F>ticamente",
["Send Message"] = false, ["Send Message"] = "Enviar mensaje",
["Server"] = "Servidor", ["Server"] = "Server", --Unique name
["Server Log"] = "Registro del servidor", ["Server Log"] = "Server Log", --Unique name
["Set Outfit"] = "Escoger Traje", ["Set Outfit"] = "Escoger vestimenta",
["Shielding"] = "Defensa", ["Shielding"] = "Escudo",
["Show all items"] = "Mostrar todos los objetos", ["Show all items"] = "Mostrar todos los objetos",
["Show connection ping"] = false, ["Show connection ping"] = "Mostrar ping de conexi<78>n",
["Show Depot Only"] = false, ["Show Depot Only"] = "Mostrar solo el Depot",
["Show event messages in console"] = "Mostrar los mensajes de eventos en la consola", ["Show event messages in console"] = "Mostrar mensajes de evento en consola",
["Show frame rate"] = "Mostrar FPS", ["Show frame rate"] = "Mostrar informaci<EFBFBD>n de cuadros por secundo",
["Show info messages in console"] = "Mostrar los mensajes informativos en la consola", ["Show info messages in console"] = "Mostrar mensajes de informaci<EFBFBD>n en consola",
["Show left panel"] = false, ["Show left panel"] = "Mostrar panel izquierdo",
["Show levels in console"] = "Mostrar los niveles en la consola", ["Show levels in console"] = "Mostrar niveles en consola",
["Show Offline"] = false, ["Show Offline"] = "Mostrar Desconectados",
["Show private messages in console"] = "Mostrar los mensajes privados en la consola", ["Show private messages in console"] = "Mostrar mensajes privados en consola",
["Show private messages on screen"] = false, ["Show private messages on screen"] = "Mostrar mensajes privados en pantalla",
["Show Server Messages"] = false, ["Show Server Messages"] = "Mostrar mensajes del servidor",
["Show status messages in console"] = "Mostrar los mensajes de estado en la consola", ["Show status messages in console"] = "Mostrar mensajes de estado en consola",
["Show Text"] = false, ["Show Text"] = "Mostrar texto",
["Show timestamps in console"] = "Mostrar la hora en la consola", ["Show timestamps in console"] = "Mostrar marcas de tiempo en consola",
["Show your depot items only"] = false, ["Show your depot items only"] = "Mostrar solo tus objetos en depot",
["Skills"] = "Habilidades", ["Skills"] = "Habilidades",
["Soul"] = false, ["Soul"] = "Soul",
["Soul Points"] = "Puntos del Alma", ["Soul Points"] = "Puntos de Soul", --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"
["Special"] = false, ["Special"] = "Especial",
["Speed"] = false, ["Speed"] = "Velocidad",
["Spell Cooldowns"] = false, ["Spell Cooldowns"] = "Spells Cooldowns", --Could be "Tiempo de recarga para los hechizos".
["Spell List"] = false, ["Spell List"] = "Lista de hechizos",
["Stamina"] = "Vigor", ["Stamina"] = "Resistencia",
["Statement:"] = false, ["Statement:"] = "Comentario:",
["Statement Report"] = false, ["Statement Report"] = "Statement Report", --Could be "reporte del comentario"
["Statistics"] = false, ["Statistics"] = "Estad<EFBFBD>sticas",
["Stop Attack"] = "Detener el Ataque", ["Stop Attack"] = "Detener ataque",
["Stop Follow"] = "Detener el Seguimiento", ["Stop Follow"] = "Detener persecuci<EFBFBD>n",
["Support"] = false, ["Support"] = "Soporte",
["%s: (use object)"] = "%s: (usar objeto)", ["%s: (use object)"] = "%s: (usar objeto)",
["%s: (use object on target)"] = "%s: (usar objeto en objetivo)", ["%s: (use object on target)"] = "%s: (usar objeto en un objetivo)",
["%s: (use object on yourself)"] = "%s: (usar objeto en ti mismo)", ["%s: (use object on yourself)"] = "%s: (usar objeto en mi mismo)",
["%s: (use object with crosshair)"] = "%s: (usar objeto con mirilla)", ["%s: (use object with crosshair)"] = "%s: (usar objeto con punto de mira)",
["Sword Fighting"] = "Combate con Espada", ["Sword Fighting"] = "Combate de espada",
["Terminal"] = "Terminal", ["Terminal"] = "Terminal",
["There is no way."] = "No hay ruta.", ["There is no way."] = "No hay ninguna manera.",
["Title"] = false, ["Title"] = "Titulo",
["Total Price:"] = false, ["Total Price:"] = "Total total:",
["Trade"] = "Comercial", ["Trade"] = "Intercambio",
["Trade with ..."] = "Comercial con ...", ["Trade with ..."] = "Intercambiar con ...",
["Trying to reconnect in %s seconds."] = false, ["Trying to reconnect in %s seconds."] = "",
["Unable to load dat file, please place a valid dat in '%s'"] = false, ["Unable to load dat file, please place a valid dat in '%s'"] = "No se puede cargar el archivo dat, por favor coloque un dat v<>lido en '%s'",
["Unable to load spr file, please place a valid spr in '%s'"] = false, ["Unable to load spr file, please place a valid spr in '%s'"] = "No se puede cargar el archivo spr, por favor coloque un spr v<>lido en '%s'",
["Unable to logout."] = "No es posible salir.", ["Unable to logout."] = "No se puede cerrar sesi<73>n-",
["Unignore"] = false, ["Unignore"] = "Dejar de ignorar",
["Unload"] = "Descarga", ["Unload"] = "No cargado",
["Update needed"] = false, ["Update needed"] = "Es necesario actualizar",
["Use"] = "Usar", ["Use"] = "Uso",
["Use on target"] = "Usar en objetivo", ["Use on target"] = "Usar en un objetivo",
["Use on yourself"] = "Usar en ti mismo", ["Use on yourself"] = "Usar en mi mismo",
["Use with ..."] = "Usar en ...", ["Use with ..."] = "Usar en ...",
["Version"] = "Versi<EFBFBD>n", ["Version"] = "Versi<EFBFBD>n",
["VIP List"] = "Lista VIP", ["VIP List"] = "Lista Vip",
["Voc."] = false, ["Voc."] = "Voc.",
["Vocation"] = false, ["Vocation"] = "Vocaci<EFBFBD>n",
["Waiting List"] = false, ["Waiting List"] = "Lista de espera",
["Website"] = "Sitio Web", ["Website"] = "Sitio Web",
["Weight:"] = "Peso", ["Weight:"] = "Peso:",
["Will detect when to use diagonal step based on the\nkeys you are pressing"] = false, ["Will detect when to use diagonal step based on the\nkeys you are pressing"] = "Detectara cuando se camina en diagonal usando las flechas",
["With crosshair"] = "Con mirilla", ["With crosshair"] = "Con punto de mira",
["Yes"] = false, ["Yes"] = "Si",
["You are bleeding"] = false, ["You are bleeding"] = "Te estas desangrando",
["You are burning"] = "Est<EFBFBD>s quemando", ["You are burning"] = "Te estas quemando",
["You are cursed"] = "Est<EFBFBD>s maldito", ["You are cursed"] = "Tu estas maldecido",
["You are dazzled"] = "Est<EFBFBD>s deslumbrado", ["You are dazzled"] = "Tu estas deslumbrado",
["You are dead."] = "Has muerto.", ["You are dead."] = "Tu estas muerto.",
["You are dead"] = false, ["You are dead"] = "Tu estas muerto",
["You are drowing"] = "Te est<EFBFBD>s ahogando", ["You are drowning"] = "Te estas ahogando",
["You are drunk"] = false, ["You are drunk"] = "Tu estas ebrio",
["You are electrified"] = "Est<EFBFBD>s electrocutado", ["You are electrified"] = "Tu estas electrocutado",
["You are freezing"] = "Est<EFBFBD>s congelado", ["You are freezing"] = "Te estas congelando",
["You are hasted"] = "Vas con prisa", ["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"] = false, ["You are hungry"] = "Tu estas hambriento",
["You are paralysed"] = "Est<EFBFBD>s paralizado", ["You are paralysed"] = "Tu estas paralizado",
["You are poisoned"] = "Est<EFBFBD>s envenenado", ["You are poisoned"] = "Tu estas envenedado",
["You are protected by a magic shield"] = "Est<EFBFBD>s protegido por un escudo m<>gico", ["You are protected by a magic shield"] = "Tu estas protegido por un escudo m<>gico",
["You are strengthened"] = "Est<EFBFBD>s reforzado", ["You are strengthened"] = "Tu estas reforzado",
["You are within a protection zone"] = "Est<EFBFBD>s en una zona de protecci<63>n", ["You are within a protection zone"] = "Tu estas dentro de una zona de protecci<63>n",
["You can enter new text."] = false, ["You can enter new text."] = "Tu puedes ingresar un texto nuevo.",
["You have %s percent"] = "Tienes %s por ciento", ["You have %s percent"] = "Tu tienes %s por ciento",
["You have %s percent to go"] = "Te falta %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 puedes salir mientras est<73>s en un combate", ["You may not logout during a fight"] = "No puedes salir durante una pelea",
["You may not logout or enter a protection zone"] = "No puedes salir o entrar en una zona de protecci<63>n", ["You may not logout or enter a protection zone"] = "No puedes salir o entrar en una zona de protecci<63>n",
["You must enter a comment."] = false, ["You must enter a comment."] = "Debes ingresar un comentario.",
["You must enter a valid server address and port."] = false, ["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!"] = "Debes seleccionar un personaje para entrar!", ["You must select a character to login!"] = "<EFBFBD>Debes seleccionar un personaje para ingresar!",
["Your Capacity:"] = false, ["Your Capacity:"] = "Tu capacidad:",
["You read the following, written by \n%s\n"] = false, ["You read the following, written by \n%s\n"] = "Lees lo siguiente, escrito por \n%s\n",
["You read the following, written on \n%s.\n"] = false, ["You read the following, written on \n%s.\n"] = "Lees lo siguiente, escrito en \n%s\n",
["Your Money:"] = false, ["Your Money:"] = "Tu dinero:",
["Change language"] = "Cambiar idioma",
["Don't stretch or shrink Game Window"] = "No estirar o encoger Ventana de Juego"
} }
} }
modules.client_locales.installLocale(locale) modules.client_locales.installLocale(locale)

View File

@@ -1,36 +1,31 @@
-- by Don Daniello
-- 09 June 2012
-- http://DonDaniello.com
-- http://otland.net/members/Don+Daniello
locale = { locale = {
name = "pl", name = "pl",
languageName = "Polski", languageName = "Polski",
translation = { translation = {
["1a) Offensive Name"] = false, ["1a) Offensive Name"] = "1a) Obrazliwe Imie",
["1b) Invalid Name Format"] = false, ["1b) Invalid Name Format"] = "1b) Niepoprawny Format Imienia",
["1c) Unsuitable Name"] = false, ["1c) Unsuitable Name"] = "1c) Nieodpowiednie Imie",
["1d) Name Inciting Rule Violation"] = false, ["1d) Name Inciting Rule Violation"] = "1d) Imie Nawolujace Do Lamania Regulaminu",
["2a) Offensive Statement"] = false, ["2a) Offensive Statement"] = "2a) Obrazliwa wypowiedz",
["2b) Spamming"] = false, ["2b) Spamming"] = "2b) Spamowanie",
["2c) Illegal Advertising"] = false, ["2c) Illegal Advertising"] = "2c) Nielegalne Reklamy",
["2d) Off-Topic Public Statement"] = false, ["2d) Off-Topic Public Statement"] = "2d) Publiczne Wypowiadanie Sie Nie Na Temat",
["2e) Non-English Public Statement"] = false, ["2e) Non-English Public Statement"] = "2e) Publiczne wypowiadanie Sie W Jezyku Innym Niz Angielski",
["2f) Inciting Rule Violation"] = false, ["2f) Inciting Rule Violation"] = "2f) Nawolywanie Do Lamania Regulaminu ",
["3a) Bug Abuse"] = false, ["3a) Bug Abuse"] = "3a) Wykorzystywanie Bledow",
["3b) Game Weakness Abuse"] = false, ["3b) Game Weakness Abuse"] = "3b) Wykorzystanie Slabosci Gry",
["3c) Using Unofficial Software to Play"] = false, ["3c) Using Unofficial Software to Play"] = "3c) Gra Przy Uzyciu Nieoficjalnego Oprogramowania",
["3d) Hacking"] = false, ["3d) Hacking"] = "3d) Wlamywanie Sie",
["3e) Multi-Clienting"] = false, ["3e) Multi-Clienting"] = "3e) Uzycie Multi-Klienta",
["3f) Account Trading or Sharing"] = false, ["3f) Account Trading or Sharing"] = "3f) Handel Lub Udostepnianie Kont",
["4a) Threatening Gamemaster"] = false, ["4a) Threatening Gamemaster"] = "4a) Grozby Pod Adresem Mistrza Gry",
["4b) Pretending to Have Influence on Rule Enforcement"] = false, ["4b) Pretending to Have Influence on Rule Enforcement"] = "4b) Udawanie Wplywu na Ustanawianie Regul Gry",
["4c) False Report to Gamemaster"] = false, ["4c) False Report to Gamemaster"] = "4c) Wyslanie Falszywego Raportu Mistrzowi Gry",
["Accept"] = false, ["Accept"] = "Akceptuj",
["Account name"] = "Numer konta", ["Account name"] = "Numer konta",
["Account Status:"] = false, ["Account Status:"] = "Status Konta:",
["Action:"] = false, ["Action:"] = "Akcja:",
["Add"] = "Dodaj", ["Add"] = "Dodaj",
["Add new VIP"] = "Nowy VIP", ["Add new VIP"] = "Nowy VIP",
["Addon 1"] = "Addon 1", ["Addon 1"] = "Addon 1",
@@ -39,15 +34,15 @@ locale = {
["Add to VIP list"] = "Dodaj do VIPow", ["Add to VIP list"] = "Dodaj do VIPow",
["Adjust volume"] = "Zmien glosnosc", ["Adjust volume"] = "Zmien glosnosc",
["Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back\ninto this world in exchange for a small sacrifice\n\nSimply click on Ok to resume your journeys!"] = false, ["Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back\ninto this world in exchange for a small sacrifice\n\nSimply click on Ok to resume your journeys!"] = false,
["All"] = false, ["All"] = "Wszystkie",
["All modules and scripts were reloaded."] = "Wszystkie moduly ", ["All modules and scripts were reloaded."] = "Wszystkie moduly ",
["Allow auto chase override"] = false, ["Allow auto chase override"] = false,
["Also known as dash in tibia community, recommended\nfor playing characters with high speed"] = false, ["Also known as dash in tibia community, recommended\nfor playing characters with high speed"] = false,
["Ambient light: %s%%"] = false, ["Ambient light: %s%%"] = "Swiatlo tla: %s%%",
["Amount:"] = "Ilosc:", ["Amount:"] = "Ilosc:",
["Amount"] = false, ["Amount"] = "Ilosc",
["Anonymous"] = false, ["Anonymous"] = "Anonimowy",
["Are you sure you want to logout?"] = false, ["Are you sure you want to logout?"] = "Czy jestes pewien, ze sie chcesz wylogowac?",
["Attack"] = "Atak", ["Attack"] = "Atak",
["Author"] = "Autor", ["Author"] = "Autor",
["Autoload"] = "Autoladowanie", ["Autoload"] = "Autoladowanie",
@@ -59,17 +54,17 @@ locale = {
["Banishment"] = false, ["Banishment"] = false,
["Banishment + Final Warning"] = false, ["Banishment + Final Warning"] = false,
["Battle"] = "Bitwa", ["Battle"] = "Bitwa",
["Browse"] = false, ["Browse"] = "Przegladaj",
["Bug report sent."] = false, ["Bug report sent."] = "Raport o bledzie zostal wyslany.",
["Button Assign"] = "Przypisanie Klawisza", ["Button Assign"] = "Przypisanie Klawisza",
["Buy"] = "Kup", ["Buy"] = "Kup",
["Buy Now"] = false, ["Buy Now"] = "Kup Teraz",
["Buy Offers"] = false, ["Buy Offers"] = "Oferty Kupna",
["Buy with backpack"] = "Kupuj z plecakami", ["Buy with backpack"] = "Kupuj z plecakami",
["Cancel"] = "Anuluj", ["Cancel"] = "Anuluj",
["Cannot login while already in game."] = false, ["Cannot login while already in game."] = "Nie mozna zalogowac gdy juz w grze",
["Cap"] = false, ["Cap"] = false,
["Capacity"] = "Capacidad", ["Capacity"] = "Ladownosc",
["Center"] = false, ["Center"] = false,
["Channels"] = "Kanaly", ["Channels"] = "Kanaly",
["Character List"] = "Lista postaci", ["Character List"] = "Lista postaci",
@@ -82,65 +77,64 @@ locale = {
["Close this channel"] = "Zamknij kanal", ["Close this channel"] = "Zamknij kanal",
["Club Fighting"] = "Walka obuchem", ["Club Fighting"] = "Walka obuchem",
["Combat Controls"] = "Kontrola walki", ["Combat Controls"] = "Kontrola walki",
["Comment:"] = false, ["Comment:"] = "Komentarz:",
["Connecting to game server..."] = "Laczenie z serwerem gry...", ["Connecting to game server..."] = "Laczenie z serwerem gry...",
["Connecting to login server..."] = "Laczenie z serwerem logowania...", ["Connecting to login server..."] = "Laczenie z serwerem logowania...",
["Console"] = false, ["Console"] = "Konsola",
["Cooldowns"] = false, ["Cooldowns"] = false,
["Copy message"] = false, ["Copy message"] = "Kopiuj wiadomosc",
["Copy name"] = false, ["Copy name"] = "Kopiuj imie",
["Copy Name"] = "Kopiuj Nick", ["Copy Name"] = "Kopiuj Imie",
["Create Map Mark"] = false, ["Create Map Mark"] = "Utworz Znacznik na Mapie",
["Create mark"] = false, ["Create mark"] = "Utworz znacznik",
["Create New Offer"] = false, ["Create New Offer"] = "Utworz Nowa Oferte",
["Create Offer"] = false, ["Create Offer"] = "Utworz Oferte",
["Current hotkeys:"] = "Aktualny hotkey:", ["Current hotkeys:"] = "Aktualny hotkey:",
["Current hotkey to add: %s"] = "Aktualny hotkey do dodania: %s", ["Current hotkey to add: %s"] = "Aktualny hotkey do dodania: %s",
["Current Offers"] = false, ["Current Offers"] = "Obecne Oferty",
["Default"] = "Domyslny", ["Default"] = "Domyslny",
["Delete mark"] = false, ["Delete mark"] = "Usun znacznik",
["Description:"] = false, ["Description:"] = "Opis:",
["Description"] = "Opis", ["Description"] = "Opis",
["Destructive Behaviour"] = false, ["Destructive Behaviour"] = "Destrukcyjne Zachowanie",
["Detail"] = "Szczegoly", ["Detail"] = "Szczegoly",
["Details"] = false, ["Details"] = "Szczegoly",
["Disable Shared Experience"] = "Wylacz Dzielenie Doswiadczenia", ["Disable Shared Experience"] = "Wylacz Dzielenie Doswiadczenia",
["Dismount"] = false, ["Dismount"] = false,
["Display connection speed to the server (milliseconds)"] = false, ["Display connection speed to the server (milliseconds)"] = "Wyswietl ping do serwera (ms)",
["Distance Fighting"] = "Walka na odleglosc", ["Distance Fighting"] = "Walka na odleglosc",
["Don't stretch/shrink Game Window"] = false, ["Don't stretch/shrink Game Window"] = "Nie rozszerzaj/zwezaj Okna Gry",
["Edit hotkey text:"] = "Edytuj tresc hotkeya:", ["Edit hotkey text:"] = "Edytuj tresc hotkeya:",
["Edit List"] = false, ["Edit List"] = "Lista Edycji",
["Edit Text"] = "Edytuj tekst", ["Edit Text"] = "Edytuj tekst",
["Enable music"] = false, ["Enable music"] = "Odtwarzaj muzyke",
["Enable Shared Experience"] = "Wlacz dzielenie doswiadczenia", ["Enable Shared Experience"] = "Wlacz dzielenie doswiadczenia",
["Enable smart walking"] = false, ["Enable smart walking"] = false,
["Enable vertical synchronization"] = "Wlacz synchronizacje pionowa", ["Enable vertical synchronization"] = "Wlacz synchronizacje pionowa",
["Enable walk booster"] = false, ["Enable walk booster"] = false,
["Enter Game"] = "Wejdz do gry", ["Enter Game"] = "Wejdz do gry",
["Enter one name per line."] = false, ["Enter one name per line."] = "Wprowadz jedno imie na linie",
["Enter with your account again to update your client."] = false, ["Enter with your account again to update your client."] = "Zaloguj sie ponownie by zaktualizowac klienta",
["Error"] = "Blad", ["Error"] = "Blad",
["Error"] = "Blad", ["Excessive Unjustified Player Killing"] = "Nadmierne Nieusprawiedliwione Zabijanie Graczy",
["Excessive Unjustified Player Killing"] = false,
["Exclude from private chat"] = "Wyrzuc w prywatnej konwersacji", ["Exclude from private chat"] = "Wyrzuc w prywatnej konwersacji",
["Exit"] = false, ["Exit"] = false,
["Experience"] = "Doswiadczenie", ["Experience"] = "Doswiadczenie",
["Filter list to match your level"] = false, ["Filter list to match your level"] = "Wyswietl tylko odpowiednie dla mojego poziomu",
["Filter list to match your vocation"] = false, ["Filter list to match your vocation"] = "Wyswietl tylko odpowiednie dla mojej klasy",
["Find:"] = false, ["Find:"] = "Szukaj:",
["Fishing"] = "Wedkarstwo", ["Fishing"] = "Wedkarstwo",
["Fist Fighting"] = "Walka wrecz", ["Fist Fighting"] = "Walka wrecz",
["Follow"] = "Podazaj", ["Follow"] = "Podazaj",
["Force Exit"] = false, ["Force Exit"] = "Wymus Zamkniecie",
["For Your Information"] = false, ["For Your Information"] = false,
["Free Account"] = false, ["Free Account"] = "Darmowe Konto",
["Fullscreen"] = "Pelen ekran", ["Fullscreen"] = "Pelen ekran",
["Game"] = false, ["Game"] = "Gra",
["Game framerate limit: %s"] = false, ["Game framerate limit: %s"] = "Limit FPS: %s",
["Graphics"] = "Grafika", ["Graphics"] = "Grafika",
["Graphics card driver not detected"] = false, ["Graphics card driver not detected"] = "Nie wykryto karty graficznej",
["Graphics Engine:"] = false, ["Graphics Engine:"] = "Silnik graficzny:",
["Head"] = "Glowa", ["Head"] = "Glowa",
["Healing"] = false, ["Healing"] = false,
["Health Info"] = false, ["Health Info"] = false,
@@ -148,43 +142,43 @@ locale = {
["Hide monsters"] = "Ukryj potwory", ["Hide monsters"] = "Ukryj potwory",
["Hide non-skull players"] = "Ukryj graczy bez skulla", ["Hide non-skull players"] = "Ukryj graczy bez skulla",
["Hide Npcs"] = "Ukryj NPCe", ["Hide Npcs"] = "Ukryj NPCe",
["Hide Offline"] = false, ["Hide Offline"] = "Ukryj Niedostepnych",
["Hide party members"] = "Ukryj czlonkow zabawy", ["Hide party members"] = "Ukryj czlonkow druzyny",
["Hide players"] = "Ukryj graczy", ["Hide players"] = "Ukryj graczy",
["Hide spells for higher exp. levels"] = false, ["Hide spells for higher exp. levels"] = "Ukryj zaklecia wyzszych poziomow postaci",
["Hide spells for other vocations"] = false, ["Hide spells for other vocations"] = "Ukryj zaklecia innych klas",
["Hit Points"] = "Punkty uderzen", ["Hit Points"] = "Punkty uderzen",
["Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks"] = false, ["Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks"] = false,
["Hotkeys"] = "Hotkeye", ["Hotkeys"] = "Hotkeye",
["If you shut down the program, your character might stay in the game.\nClick on 'Logout' to ensure that you character leaves the game properly.\nClick on 'Exit' if you want to exit the program without logging out your character."] = false, ["If you shut down the program, your character might stay in the game.\nClick on 'Logout' to ensure that you character leaves the game properly.\nClick on 'Exit' if you want to exit the program without logging out your character."] = false,
["Ignore"] = false, ["Ignore"] = "Ignoruj",
["Ignore capacity"] = "Ignoruj pojemnosc", ["Ignore capacity"] = "Ignoruj pojemnosc",
["Ignored players:"] = false, ["Ignored players:"] = "Ignorowani gracze:",
["Ignore equipped"] = "Ignoruj ekwipunek", ["Ignore equipped"] = "Ignoruj ekwipunek",
["Ignore List"] = false, ["Ignore List"] = "Lista Ignorowanych",
["Ignore players"] = false, ["Ignore players"] = "Ignoruj graczy",
["Ignore Private Messages"] = false, ["Ignore Private Messages"] = "Ignoruj Prywatne Wiadomosci",
["Ignore Yelling"] = false, ["Ignore Yelling"] = "Ignoruj Krzyki",
["Interface framerate limit: %s"] = false, ["Interface framerate limit: %s"] = "Limit FPS interfejsu: %s",
["Inventory"] = "Inwentarz", ["Inventory"] = "Ekwipunek",
["Invite to Party"] = "Zapros do zabawy", ["Invite to Party"] = "Zapros do druzyny",
["Invite to private chat"] = "Zapros do prywatnej konwersacji", ["Invite to private chat"] = "Zapros do prywatnej konwersacji",
["IP Address Banishment"] = false, ["IP Address Banishment"] = "Blokada adresu IP",
["Item Offers"] = false, ["Item Offers"] = "Oferty Przedmiotow",
["It is empty."] = false, ["It is empty."] = "To jest puste.",
["Join %s's Party"] = false, ["Join %s's Party"] = "Dolacz do druzyny gracza %s",
["Leave Party"] = "Opusc zabawe", ["Leave Party"] = "Opusc druzyne",
["Level"] = "Poziom", ["Level"] = "Poziom",
["Lifetime Premium Account"] = false, ["Lifetime Premium Account"] = "Konto Premium na Stale",
["Limits FPS to 60"] = "Ogranicz FPS do 60", ["Limits FPS to 60"] = "Ogranicz FPS do 60",
["List of items that you're able to buy"] = "Lista przedmiotow, ktore mozesz kupic", ["List of items that you're able to buy"] = "Lista przedmiotow, ktore mozesz kupic",
["List of items that you're able to sell"] = "Lista przedmiotow, ktore mozesz sprzedac", ["List of items that you're able to sell"] = "Lista przedmiotow, ktore mozesz sprzedac",
["Load"] = "Wczytaj", ["Load"] = "Wczytaj",
["Logging out..."] = false, ["Logging out..."] = "Wylogowuje...",
["Login"] = "Zaloguj", ["Login"] = "Zaloguj",
["Login Error"] = "Blad Logowania", ["Login Error"] = "Blad Logowania",
["Login Error"] = "Blad Logowania", ["Login Error"] = "Blad Logowania",
["Logout"] = false, ["Logout"] = "Wyloguj",
["Look"] = "Spojrz", ["Look"] = "Spojrz",
["Magic Level"] = "Poziom Magiczny", ["Magic Level"] = "Poziom Magiczny",
["Make sure that your client uses\nthe correct game protocol version"] = "Upewnij sie, ze twoj klient\nuzywa wlasciwego protokolu gry.", ["Make sure that your client uses\nthe correct game protocol version"] = "Upewnij sie, ze twoj klient\nuzywa wlasciwego protokolu gry.",
@@ -193,7 +187,7 @@ locale = {
["Market"] = false, ["Market"] = false,
["Market Offers"] = false, ["Market Offers"] = false,
["Message of the day"] = "Wiadomosc dnia", ["Message of the day"] = "Wiadomosc dnia",
["Message to "] = false, ["Message to "] = "Wiadomosc do ",
["Message to %s"] = "Wiadomosc do %s", ["Message to %s"] = "Wiadomosc do %s",
["Minimap"] = "Minimapa", ["Minimap"] = "Minimapa",
["Module Manager"] = "Menedzer modulow", ["Module Manager"] = "Menedzer modulow",
@@ -201,32 +195,32 @@ locale = {
["Mount"] = false, ["Mount"] = false,
["Move Stackable Item"] = "Przenies przedmiot", ["Move Stackable Item"] = "Przenies przedmiot",
["Move up"] = "Przenies wyzej", ["Move up"] = "Przenies wyzej",
["My Offers"] = false, ["My Offers"] = "Moje Oferty",
["Name:"] = "Nazwa:", ["Name:"] = "Nazwa:",
["Name Report"] = false, ["Name Report"] = false,
["Name Report + Banishment"] = false, ["Name Report + Banishment"] = false,
["Name Report + Banishment + Final Warning"] = false, ["Name Report + Banishment + Final Warning"] = false,
["No"] = false, ["No"] = "Nie",
["No graphics card detected, everything will be drawn using the CPU,\nthus the performance will be really bad.\nPlease update your graphics driver to have a better performance."] = false, ["No graphics card detected, everything will be drawn using the CPU,\nthus the performance will be really bad.\nPlease update your graphics driver to have a better performance."] = false,
["No item selected."] = false, ["No item selected."] = "Nie wybrano przedmiotu.",
["No Mount"] = false, ["No Mount"] = "Brak wierzchowca",
["No Outfit"] = false, ["No Outfit"] = "Brak stroju",
["No statement has been selected."] = false, ["No statement has been selected."] = false,
["Notation"] = false, ["Notation"] = false,
["NPC Trade"] = "Handel NPC", ["NPC Trade"] = "Handel NPC",
["Offer History"] = false, ["Offer History"] = "Historia Ofert",
["Offers"] = false, ["Offers"] = "Oferty",
["Offer Type:"] = false, ["Offer Type:"] = "Typ Oferty:",
["Offline Training"] = false, ["Offline Training"] = "Trening Offline",
["Ok"] = "Ok", ["Ok"] = "Ok",
["on %s.\n"] = false, ["on %s.\n"] = false,
["Open"] = "Otworz", ["Open"] = "Otworz",
["Open a private message channel:"] = "Otworz prywatny kanal:", ["Open a private message channel:"] = "Otworz prywatny kanal:",
["Open charlist automatically when starting client"] = false, ["Open charlist automatically when starting client"] = "Automatycznie otworz liste postaci przy starcie gry",
["Open in new window"] = "Otworz w nowym oknie", ["Open in new window"] = "Otworz w nowym oknie",
["Open new channel"] = "Otworz nowy kanal", ["Open new channel"] = "Otworz nowy kanal",
["Options"] = "Opcje", ["Options"] = "Opcje",
["Overview"] = false, ["Overview"] = "Podsumowanie",
["Pass Leadership to %s"] = "Przekaz przywodztwo %s", ["Pass Leadership to %s"] = "Przekaz przywodztwo %s",
["Password"] = "Haslo", ["Password"] = "Haslo",
["Piece Price:"] = false, ["Piece Price:"] = false,
@@ -236,79 +230,79 @@ locale = {
["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,
["Please wait"] = "Prosze czekac", ["Please wait"] = "Prosze czekac",
["Port"] = "Port", ["Port"] = "Port",
["Position:"] = false, ["Position:"] = "Pozycja:",
["Position: %i %i %i"] = false, ["Position: %i %i %i"] = "Pozycja: %i %i %i",
["Premium Account (%s) days left"] = false, ["Premium Account (%s) days left"] = "Konto Premium (%s) dni",
["Price:"] = "Cena:", ["Price:"] = "Cena:",
["Primary"] = "Podstawowy", ["Primary"] = "Podstawowy",
["Protocol"] = false, ["Protocol"] = "Protokol",
["Quest Log"] = false, ["Quest Log"] = "Dziennik Misji",
["Randomize"] = false, ["Randomize"] = false,
["Randomize characters outfit"] = false, ["Randomize characters outfit"] = false,
["Reason:"] = false, ["Reason:"] = "Powod:",
["Refresh"] = "Odswiez", ["Refresh"] = "Odswiez",
["Refresh Offers"] = false, ["Refresh Offers"] = "Odswiez Oferty",
["Regeneration Time"] = false, ["Regeneration Time"] = "Czas Regeneracji",
["Reject"] = false, ["Reject"] = "Odrzuc",
["Reload All"] = "Przeladuj Wszystko", ["Reload All"] = "Przeladuj Wszystko",
["Remember account and password when starts client"] = false, ["Remember account and password when starts client"] = "Zapamietaj identyfikator konta oraz haslo",
["Remember password"] = "Zapamietaj haslo", ["Remember password"] = "Zapamietaj haslo",
["Remove"] = "Usun", ["Remove"] = "Usun",
["Remove %s"] = "Usun %s", ["Remove %s"] = "Usun %s",
["Report Bug"] = false, ["Report Bug"] = "Zglos Blad",
["Reserved for more functionality later."] = false, ["Reserved for more functionality later."] = "Zarezerowane dla przyszlych funkcjonalnosci.",
["Reset Market"] = false, ["Reset Market"] = false,
["Revoke %s's Invitation"] = false, ["Revoke %s's Invitation"] = "Odmow na zaproszenie gracza %s",
["Rotate"] = "Obroc", ["Rotate"] = "Obroc",
["Rule Violation"] = false, ["Rule Violation"] = "Zlamanie Regul",
["Save"] = false, ["Save"] = "Zapisz",
["Save Messages"] = false, ["Save Messages"] = "Zapisz Wiadomosci",
["Search:"] = "Szukaj:", ["Search:"] = "Szukaj:",
["Search all items"] = false, ["Search all items"] = "Znajdz wszystkie przedmioty",
["Secondary"] = "Drugorzedny", ["Secondary"] = "Drugorzedny",
["Select object"] = "Wybierz obiekt", ["Select object"] = "Wybierz obiekt",
["Select Outfit"] = "Wybierz outfit", ["Select Outfit"] = "Wybierz outfit",
["Select your language"] = false, ["Select your language"] = "Wybierz jezyk",
["Sell"] = "Sprzedaj", ["Sell"] = "Sprzedaj",
["Sell Now"] = false, ["Sell Now"] = "Sprzedaj Teraz",
["Sell Offers"] = false, ["Sell Offers"] = "Oferty Sprzedazy",
["Send"] = false, ["Send"] = "Wyslij",
["Send automatically"] = "Wyslij automatycznie", ["Send automatically"] = "Wyslij automatycznie",
["Send Message"] = false, ["Send Message"] = "Wyslij Wiadomosc",
["Server"] = "Serwer", ["Server"] = "Serwer",
["Server Log"] = "Log Serwera", ["Server Log"] = "Log Serwera",
["Set Outfit"] = "Ustaw outfit", ["Set Outfit"] = "Ustaw outfit",
["Shielding"] = "Obrona tarcza", ["Shielding"] = "Obrona tarcza",
["Show all items"] = "Pokaz wszystkie przedmioty", ["Show all items"] = "Pokaz wszystkie przedmioty",
["Show connection ping"] = false, ["Show connection ping"] = "Wyswietl ping",
["Show Depot Only"] = false, ["Show Depot Only"] = false,
["Show event messages in console"] = "Pokaz wydarzenia w konsoli", ["Show event messages in console"] = "Pokaz wydarzenia w konsoli",
["Show frame rate"] = "Pokaz ilosc FPS", ["Show frame rate"] = "Pokaz FPS",
["Show info messages in console"] = "Pokaz informacje w konsoli", ["Show info messages in console"] = "Pokaz informacje w konsoli",
["Show left panel"] = false, ["Show left panel"] = "Pokaz lewy panel",
["Show levels in console"] = "Pokaz poziomy w konsoli", ["Show levels in console"] = "Pokaz poziomy w konsoli",
["Show Offline"] = false, ["Show Offline"] = "Pokaz Niedostepnych",
["Show private messages in console"] = "Pokaz prywatne wiadomosci w konsoli", ["Show private messages in console"] = "Pokaz prywatne wiadomosci w konsoli",
["Show private messages on screen"] = false, ["Show private messages on screen"] = "Pokaz prywatne wiadomosci na ekranie",
["Show Server Messages"] = false, ["Show Server Messages"] = "Pokaz Wiadomosci Serwera",
["Show status messages in console"] = "Pokaz status w konsoli", ["Show status messages in console"] = "Pokaz status w konsoli",
["Show Text"] = false, ["Show Text"] = "Pokaz Tekst",
["Show timestamps in console"] = "Pokaz znaczniki czasu w konsoli", ["Show timestamps in console"] = "Pokaz znaczniki czasu w konsoli",
["Show your depot items only"] = false, ["Show your depot items only"] = false,
["Skills"] = "Umiejetnosci", ["Skills"] = "Umiejetnosci",
["Soul"] = false, ["Soul"] = "Dusze",
["Soul Points"] = "Punkty Duszy", ["Soul Points"] = "Punkty Duszy",
["Special"] = false, ["Special"] = false,
["Speed"] = false, ["Speed"] = "Predkosc",
["Spell Cooldowns"] = false, ["Spell Cooldowns"] = false,
["Spell List"] = false, ["Spell List"] = "Lista Zaklec",
["Stamina"] = "Wytrzymalosc", ["Stamina"] = "Wytrzymalosc",
["Statement:"] = false, ["Statement:"] = false,
["Statement Report"] = false, ["Statement Report"] = false,
["Statistics"] = false, ["Statistics"] = "Statystki",
["Stop Attack"] = "Zatrzymaj atak", ["Stop Attack"] = "Anuluj atak",
["Stop Follow"] = "Zatrzymaj podazanie", ["Stop Follow"] = "Przestan podazac",
["Support"] = false, ["Support"] = "Wsparcie",
["%s: (use object)"] = "%s: (uzyj obiekt)", ["%s: (use object)"] = "%s: (uzyj obiekt)",
["%s: (use object on target)"] = "%s: (uzyj obiektu na celu)", ["%s: (use object on target)"] = "%s: (uzyj obiektu na celu)",
["%s: (use object on yourself)"] = "%s: (uzyj obiektu na sobie)", ["%s: (use object on yourself)"] = "%s: (uzyj obiektu na sobie)",
@@ -316,15 +310,15 @@ locale = {
["Sword Fighting"] = "Atak mieczem", ["Sword Fighting"] = "Atak mieczem",
["Terminal"] = "Terminal", ["Terminal"] = "Terminal",
["There is no way."] = "Nie ma drogi.", ["There is no way."] = "Nie ma drogi.",
["Title"] = false, ["Title"] = "Tytul",
["Total Price:"] = false, ["Total Price"] = "Cena sumaryczna",
["Trade"] = "Handel", ["Trade"] = "Handel",
["Trade with ..."] = "Handluj z ...", ["Trade with ..."] = "Handluj z ...",
["Trying to reconnect in %s seconds."] = false, ["Trying to reconnect in %s seconds."] = "Ponowna proba laczenia za %s sekund.",
["Unable to load dat file, please place a valid dat in '%s'"] = false, ["Unable to load dat file, please place a valid dat in '%s'"] = "Nie mozna zaladowac pliku .dat z '%s'",
["Unable to load spr file, please place a valid spr in '%s'"] = false, ["Unable to load spr file, please place a valid spr in '%s'"] = "Nie mozna zaladowac pliku .spr z '%s'",
["Unable to logout."] = "Nie mozna sie wylogowac.", ["Unable to logout."] = "Nie mozna sie wylogowac.",
["Unignore"] = false, ["Unignore"] = "Anuluj Ignorowanie",
["Unload"] = "Wylacz", ["Unload"] = "Wylacz",
["Update needed"] = false, ["Update needed"] = false,
["Use"] = "Uzyj", ["Use"] = "Uzyj",
@@ -334,42 +328,87 @@ locale = {
["Version"] = "Wersja", ["Version"] = "Wersja",
["VIP List"] = "Lista VIP", ["VIP List"] = "Lista VIP",
["Voc."] = false, ["Voc."] = false,
["Vocation"] = false, ["Vocation"] = "Klasa",
["Waiting List"] = false, ["Waiting List"] = "Lista Oczekujacych",
["Website"] = "Strona:", ["Website"] = "Strona:",
["Weight:"] = "Waga:", ["Weight:"] = "Waga:",
["Will detect when to use diagonal step based on the\nkeys you are pressing"] = false, ["Will detect when to use diagonal step based on the\nkeys you are pressing"] = false,
["With crosshair"] = "Z celownikiem", ["With crosshair"] = "Z celownikiem",
["Yes"] = false, ["Yes"] = "Tak",
["You are bleeding"] = false, ["You are bleeding"] = "Krwawisz",
["You are burning"] = "Palisz sie", ["You are burning"] = "Palisz sie",
["You are cursed"] = "Jestes przeklety", ["You are cursed"] = "Jestes przeklety",
["You are dazzled"] = "Jestes oslepiony", ["You are dazzled"] = "Jestes oslepiony",
["You are dead."] = "Zginales marnie.", ["You are dead."] = "Zginales marnie.",
["You are dead"] = false, ["You are dead"] = "Jestes martwy",
["You are drowing"] = "Topisz sie", ["You are drowning"] = "Topisz sie",
["You are drunk"] = false, ["You are drunk"] = "Caly swiat wiruje",
["You are electrified"] = "Jestes porazony pradem", ["You are electrified"] = "Jestes porazony pradem",
["You are freezing"] = "Marzniesz", ["You are freezing"] = "Marzniesz",
["You are hasted"] = "Zapieprzasz", ["You are hasted"] = "Zapieprzasz",
["You are hungry"] = false, ["You are hungry"] = "Burczy ci w brzuchu",
["You are paralysed"] = "Jestes sparalizowany", ["You are paralysed"] = "Jestes sparalizowany",
["You are poisoned"] = "Jestes zatruty", ["You are poisoned"] = "Jestes zatruty",
["You are protected by a magic shield"] = "Jestes chroniony magiczna tarcza", ["You are protected by a magic shield"] = "Jestes chroniony magiczna tarcza",
["You are strengthened"] = "Jestes wzmocniony", ["You are strengthened"] = "Jestes wzmocniony",
["You are within a protection zone"] = "Jestes w strefie ochronnej", ["You are within a protection zone"] = "Jestes w strefie ochronnej",
["You can enter new text."] = false, ["You can enter new text."] = "Mozesz wprowadzic nowy tekst.",
["You have %s percent"] = "Masz %s procent", ["You have %s percent"] = "Masz %s procent",
["You have %s percent to go"] = "Brakuje Ci %s procent", ["You have %s percent to go"] = "Brakuje Ci %s procent",
["You may not logout during a fight"] = "Nie mozesz sie wylogowac w trakcie walki", ["You may not logout during a fight"] = "Nie mozesz sie wylogowac w trakcie walki",
["You may not logout or enter a protection zone"] = "Nie mozesz sie wylogowac ani wejsc do strefy ochronnej", ["You may not logout or enter a protection zone"] = "Nie mozesz sie wylogowac ani wejsc do strefy ochronnej",
["You must enter a comment."] = false, ["You must enter a comment."] = "Prosze wprowadzic komentarz",
["You must enter a valid server address and port."] = false, ["You must enter a valid server address and port."] = "Prosze wprowadzic poprawny adres i port.",
["You must select a character to login!"] = "Musisz wybrac postac aby sie zalogowac!", ["You must select a character to login!"] = "Musisz wybrac postac aby sie zalogowac!",
["Your Capacity:"] = false, ["Your Capacity:"] = "Twoja Ladownosc:",
["You read the following, written by \n%s\n"] = false, ["You read the following, written by \n%s\n"] = false,
["You read the following, written on \n%s.\n"] = false, ["You read the following, written on \n%s.\n"] = false,
["Your Money:"] = false, ["Your Money:"] = false,
["Enable dash walking"] = false,
["Will boost your walk on high speed characters"] = "Przyspieszy poruszanie sie postaci o wysokiej predkosci",
["Display creature names"] = "Wyswietlaj nazwy potworow",
["Display creature health bars"] = "Wyswietlaj paski zycia potworow",
["Display text messages"] = "Wyswietlaj wiadomosci tekstowe",
["Change language"] = "Zmien jezyk",
["Enable lights"] = "Odblokuj oswietlenie",
["Enable audio"] = "Odblokuj dzwiek",
["Enable music sound"] = "Odblokuj muzyke",
["Music volume: %d"] = "Glosnosc muzyki: %d",
["Audio"] = "Dzwiek",
["Server List"] = "Lista serwerow",
["Server list"] = "Lista serwerow",
["Client Version"] = "Wersja klienta",
["Add new server"] = "Dodaj nowy serwer",
["Select"] = "Wybierz",
["New Server"] = "Nowy serwer",
["Host"] = false,
["Reset All"] = "Ustaw domyslne",
["Disable chat mode, allow to walk using ASDW"] = "Zablokuj tryb rozmow, zezwol na poruszanie sie za pomoca klawiszy ADSW",
["Name"] = "Imie",
["Price"] = "Cena",
["Your Money"] = "Twoje fundusze",
["Weight"] = "Waga",
["Your Capacity"] = "Twoj udzwig",
["Search"] = "Szukaj",
["Sell All"] = "Sprzedaj wszystko",
["Statement"] = false,
["Reason"] = "Powod",
["Action"] = "Akcja",
["Comment"] = "Komentarz",
["Balance"] = false,
["Offer Type"] = "Typ oferty",
["Piece Price"] = false,
["Find"] = "Szukaj",
["Formula"] = "Formula",
["Group"] = "Groupa",
["Type"] = "Typ",
["Cooldown"] = false,
["Premium"] = false,
["Any"] = "Dowolny",
["Sorcerer"] = "Czarodziej",
["Druid"] = false,
["Paladin"] = "Paladyn",
["Knight"] = "Rycerz"
} }
} }

View File

@@ -5,6 +5,12 @@ locale = {
-- As tradu<64><75>es devem vir sempre em ordem alfab<61>tica. -- As tradu<64><75>es devem vir sempre em ordem alfab<61>tica.
translation = { translation = {
["%d of experience per hour"] = "%d de experi<72>ncia por hora",
["%s of experience left"] = "%s de experi<72>ncia faltando",
["%s: (use object on target)"] = "%s: (usar objeto no alvo)",
["%s: (use object on yourself)"] = "%s: (usar objeto em si)",
["%s: (use object with crosshair)"] = "%s: (usar objeto com mira)",
["%s: (use object)"] = "%s: (usar objeto)",
["1a) Offensive Name"] = "1a) Nome ofensivo", ["1a) Offensive Name"] = "1a) Nome ofensivo",
["1b) Invalid Name Format"] = "1b) Nome com formato inv<6E>lido", ["1b) Invalid Name Format"] = "1b) Nome com formato inv<6E>lido",
["1c) Unsuitable Name"] = "1c) Nome n<>o adequado", ["1c) Unsuitable Name"] = "1c) Nome n<>o adequado",
@@ -26,48 +32,51 @@ locale = {
["4c) False Report to Gamemaster"] = "4c) Relat<61>rio falso para Gamemaster", ["4c) False Report to Gamemaster"] = "4c) Relat<61>rio falso para Gamemaster",
["Accept"] = "Aceitar", ["Accept"] = "Aceitar",
["Account name"] = "Nome da conta", ["Account name"] = "Nome da conta",
["Account Status:"] = false, ["Account Status"] = "Estado da Conta",
["Action:"] = "A<EFBFBD><EFBFBD>o:", ["Action"] = "A<EFBFBD><EFBFBD>o",
["Add"] = "Adicionar", ["Add new server"] = "Adicionar novo servidor",
["Add new VIP"] = "Adicionar nova VIP", ["Add new VIP"] = "Adicionar nova VIP",
["Add to VIP list"] = "Adicionar a lista VIP",
["Add"] = "Adicionar",
["Addon 1"] = "Addon 1", ["Addon 1"] = "Addon 1",
["Addon 2"] = "Addon 2", ["Addon 2"] = "Addon 2",
["Addon 3"] = "Addon 3", ["Addon 3"] = "Addon 3",
["Add to VIP list"] = "Adicionar a lista VIP",
["Adjust volume"] = "Ajustar volume", ["Adjust volume"] = "Ajustar volume",
["Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back\ninto this world in exchange for a small sacrifice\n\nSimply click on Ok to resume your journeys!"] = false, ["Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back\ninto this world in exchange for a small sacrifice\n\nSimply click on Ok to resume your journeys!"] = false,
["All"] = "Todos",
["All modules and scripts were reloaded."] = "Todos m<>dulos e scripts foram recarregados.", ["All modules and scripts were reloaded."] = "Todos m<>dulos e scripts foram recarregados.",
["All"] = "Todos",
["Allow auto chase override"] = "Permitir sobrescrever o modo de persegui<75><69>o", ["Allow auto chase override"] = "Permitir sobrescrever o modo de persegui<75><69>o",
["Also known as dash in tibia community, recommended\nfor playing characters with high speed"] = "Tamb<EFBFBD>m conhecido como dash na comunidade tibiana, recomendado\npara jogar com personagem que possuam velocidade alta", ["Also known as dash in tibia community, recommended\nfor playing characters with high speed"] = "Tamb<EFBFBD>m conhecido como dash na comunidade tibiana, recomendado\npara jogar com personagem que possuam velocidade alta",
["Ambient light: %s%%"] = "Luz ambiente: %s%%", ["Ambient light: %s%%"] = "Luz ambiente: %s%%",
["Amount:"] = "Quantidade:",
["Amount"] = "Quantidade", ["Amount"] = "Quantidade",
["Anonymous"] = "An<EFBFBD>nimo", ["Anonymous"] = "An<EFBFBD>nimo",
["Any"] = "Qualquer",
["Are you sure you want to logout?"] = "Voc<EFBFBD> tem certeza que quer sair?", ["Are you sure you want to logout?"] = "Voc<EFBFBD> tem certeza que quer sair?",
["Attack"] = "Atacar", ["Attack"] = "Atacar",
["Audio"] = "<EFBFBD>udio",
["Author"] = "Autor", ["Author"] = "Autor",
["Autoload"] = "Carregar automaticamente",
["Autoload priority"] = "Prioridade de carregamento",
["Auto login"] = "Entrar automaticamente",
["Auto login selected character on next charlist load"] = "Entrar automaticamente com o personagem quando reabrir a lista de personagens", ["Auto login selected character on next charlist load"] = "Entrar automaticamente com o personagem quando reabrir a lista de personagens",
["Auto login"] = "Entrar automaticamente",
["Autoload priority"] = "Prioridade de carregamento",
["Autoload"] = "Carregar automaticamente",
["Axe Fighting"] = "Combate com Machado", ["Axe Fighting"] = "Combate com Machado",
["Balance:"] = "Saldo:", ["Balance"] = "Saldo",
["Banishment"] = "Banimento",
["Banishment + Final Warning"] = "Banimento + Aviso final", ["Banishment + Final Warning"] = "Banimento + Aviso final",
["Banishment"] = "Banimento",
["Battle"] = "Batalha", ["Battle"] = "Batalha",
["Browse"] = "Navegar", ["Browse"] = "Navegar",
["Bug report sent."] = "Reporte de bug enviado.", ["Bug report sent."] = "Reporte de bug enviado.",
["Button Assign"] = "Selecionar bot<6F>o", ["Button Assign"] = "Selecionar bot<6F>o",
["Buy"] = "Comprar",
["Buy Now"] = "Comparar agora", ["Buy Now"] = "Comparar agora",
["Buy Offers"] = "Ofertas de compra", ["Buy Offers"] = "Ofertas de compra",
["Buy with backpack"] = "Comprar com mochila", ["Buy with backpack"] = "Comprar com mochila",
["Buy"] = "Comprar",
["Cancel"] = "Cancelar", ["Cancel"] = "Cancelar",
["Cannot login while already in game."] = "N<EFBFBD>o <20> possivel logar enquanto j<> estiver jogando.", ["Cannot login while already in game."] = "N<EFBFBD>o <20> possivel logar enquanto j<> estiver jogando.",
["Cap"] = "Cap", ["Cap"] = "Cap",
["Capacity"] = "Capacidade", ["Capacity"] = "Capacidade",
["Center"] = "Centro", ["Center"] = "Centro",
["Change language"] = "Trocar l<>ngua",
["Channels"] = "Canais", ["Channels"] = "Canais",
["Character List"] = "Lista de personagens", ["Character List"] = "Lista de personagens",
["Classic control"] = "Controle cl<63>ssico", ["Classic control"] = "Controle cl<63>ssico",
@@ -75,15 +84,17 @@ locale = {
["Clear Messages"] = "Limpar mensagens", ["Clear Messages"] = "Limpar mensagens",
["Clear object"] = "Limpar objeto", ["Clear object"] = "Limpar objeto",
["Client needs update."] = "O client do jogo precisa ser atualizado", ["Client needs update."] = "O client do jogo precisa ser atualizado",
["Close"] = "Fechar",
["Close this channel"] = "Fechar esse canal", ["Close this channel"] = "Fechar esse canal",
["Close"] = "Fechar",
["Club Fighting"] = "Combate com Porrete", ["Club Fighting"] = "Combate com Porrete",
["Combat Controls"] = "Controles de combate", ["Combat Controls"] = "Controles de combate",
["Comment:"] = "Coment<EFBFBD>rio:", ["Comment"] = "Coment<EFBFBD>rio",
["Connecting to game server..."] = "Conectando no servidor do jogo...", ["Connecting to game server..."] = "Conectando no servidor do jogo...",
["Connecting to login server..."] = "Conectando no servidor de autentica<63><61>o...", ["Connecting to login server..."] = "Conectando no servidor de autentica<63><61>o...",
["Connection Error"] = "Erro de Conex<65>o",
["Console"] = "Console", ["Console"] = "Console",
["Cooldowns"] = false, ["Cooldown"] = "Cooldown",
["Cooldowns"] = "Cooldowns",
["Copy message"] = "Copiar mensagem", ["Copy message"] = "Copiar mensagem",
["Copy name"] = "Copiar nome", ["Copy name"] = "Copiar nome",
["Copy Name"] = "Copiar Nome", ["Copy Name"] = "Copiar Nome",
@@ -91,25 +102,34 @@ locale = {
["Create mark"] = "Criar marca", ["Create mark"] = "Criar marca",
["Create New Offer"] = "Criar nova oferta", ["Create New Offer"] = "Criar nova oferta",
["Create Offer"] = "Criar oferta", ["Create Offer"] = "Criar oferta",
["Current hotkeys:"] = "Atalhos atuais",
["Current hotkey to add: %s"] = "Atalho atual para adicionar: %s", ["Current hotkey to add: %s"] = "Atalho atual para adicionar: %s",
["Current hotkeys:"] = "Atalhos atuais",
["Current Offers"] = "Ofertas atuais", ["Current Offers"] = "Ofertas atuais",
["Default"] = "Padr<EFBFBD>o", ["Default"] = "Padr<EFBFBD>o",
["Delete mark"] = "Deletar marca", ["Delete mark"] = "Deletar marca",
["Description:"] = "Descri<EFBFBD><EFBFBD>o",
["Description"] = "Descri<EFBFBD><EFBFBD>o", ["Description"] = "Descri<EFBFBD><EFBFBD>o",
["Description:"] = "Descri<EFBFBD><EFBFBD>o",
["Destructive Behaviour"] = "Comportamento destrutivo", ["Destructive Behaviour"] = "Comportamento destrutivo",
["Detail"] = "Detalhe", ["Detail"] = "Detalhe",
["Details"] = "Detalhes", ["Details"] = "Detalhes",
["Disable Shared Experience"] = "Desativar experi<72>ncia compartilhada", ["Disable Shared Experience"] = "Desativar experi<72>ncia compartilhada",
["Dismount"] = "Desmontar", ["Dismount"] = "Desmontar",
["Display connection speed to the server (milliseconds)"] = "Exibir a velocidade de conex<65>o com o servidor (milisegundos)", ["Display connection speed to the server (milliseconds)"] = "Exibir a velocidade de conex<65>o com o servidor (milisegundos)",
["Display creature health bars"] = "Exibir barras de vida das criaturas",
["Display creature names"] = "Exibir nomes das criaturas",
["Display text messages"] = "Exibir mensagens de texto",
["Distance Fighting"] = "Combate a Dist<73>ncia", ["Distance Fighting"] = "Combate a Dist<73>ncia",
["Don't stretch/shrink Game Window"] = "N<EFBFBD>o esticar a janela do game", ["Don't stretch or shrink Game Window"] = "N<EFBFBD>o esticar ou contrair a janela do game",
["Druid"] = "Druid",
["Edit hotkey text:"] = "Editar texto do atalho", ["Edit hotkey text:"] = "Editar texto do atalho",
["Edit List"] = "Editar lista", ["Edit List"] = "Editar lista",
["Edit Text"] = "Editar Texto", ["Edit Text"] = "Editar Texto",
["Enable audio"] = "Ativar <20>udio",
["Enable dash walking"] = "Ativar andar r<>pido",
["Enable lights"] = "Ativar luzes",
["Enable music sound"] = "Ativar m<>sica",
["Enable music"] = "Ativar musica", ["Enable music"] = "Ativar musica",
["Enable shader effects"] = "Ativar efeitos shader",
["Enable Shared Experience"] = "Ativar experi<72>ncia compartilhada", ["Enable Shared Experience"] = "Ativar experi<72>ncia compartilhada",
["Enable smart walking"] = "Ativar andar inteligente", ["Enable smart walking"] = "Ativar andar inteligente",
["Enable vertical synchronization"] = "Ativar sincroniza<7A><61>o vertical", ["Enable vertical synchronization"] = "Ativar sincroniza<7A><61>o vertical",
@@ -118,162 +138,174 @@ locale = {
["Enter one name per line."] = "Entre somente um nome por linha.", ["Enter one name per line."] = "Entre somente um nome por linha.",
["Enter with your account again to update your client."] = "Entre com sua conta denovo para atualizar o client.", ["Enter with your account again to update your client."] = "Entre com sua conta denovo para atualizar o client.",
["Error"] = "Erro", ["Error"] = "Erro",
["Error"] = "Erro",
["Excessive Unjustified Player Killing"] = "Assassinato em excesso, sem justificativa, de jogadores", ["Excessive Unjustified Player Killing"] = "Assassinato em excesso, sem justificativa, de jogadores",
["Exclude from private chat"] = "Excluir do canal privado", ["Exclude from private chat"] = "Excluir do canal privado",
["Exit"] = "Sair", ["Exit"] = "Sair",
["Experience"] = "Experi<EFBFBD>ncia", ["Experience"] = "Experi<EFBFBD>ncia",
["Filter list to match your level"] = "Filtrar a lista para o seu level", ["Filter list to match your level"] = "Filtrar a lista para o seu level",
["Filter list to match your vocation"] = "Filtrar a lista para a sua voca<63><61>o", ["Filter list to match your vocation"] = "Filtrar a lista para a sua voca<63><61>o",
["Find:"] = "Procurar", ["Find"] = "Procurar",
["Fishing"] = "Pesca", ["Fishing"] = "Pesca",
["Fist Fighting"] = "Porrada", ["Fist Fighting"] = "Porrada",
["Follow"] = "Seguir", ["Follow"] = "Seguir",
["Force Exit"] = "For<EFBFBD>ar Saida",
["For Your Information"] = "Para sua informa<6D><61>o", ["For Your Information"] = "Para sua informa<6D><61>o",
["Free Account"] = false, ["Force Exit"] = "For<EFBFBD>ar Saida",
["Formula"] = "F<EFBFBD>rmula",
["Free Account"] = "Conta Gr<47>tis",
["Fullscreen"] = "Tela cheia", ["Fullscreen"] = "Tela cheia",
["Game"] = "Jogo",
["Game framerate limit: %s"] = "Limite da taxa de quadros do jogo: %s", ["Game framerate limit: %s"] = "Limite da taxa de quadros do jogo: %s",
["Graphics"] = "Gr<EFBFBD>ficos", ["Game"] = "Jogo",
["Graphics card driver not detected"] = false, ["Graphics card driver not detected"] = "Driver da placa de v<>deo n<>o detectado",
["Graphics Engine:"] = "Motor Gr<47>fico:", ["Graphics Engine:"] = "Motor Gr<47>fico:",
["Graphics"] = "Gr<EFBFBD>ficos",
["Group"] = "Grupo",
["Head"] = "Cabe<EFBFBD>a", ["Head"] = "Cabe<EFBFBD>a",
["Healing"] = false, ["Healing"] = "Curando",
["Health Info"] = "Barra de Vida", ["Health Info"] = "Barra de Vida",
["Health Information"] = "Informa<EFBFBD><EFBFBD>o de vida", ["Health Information"] = "Informa<EFBFBD><EFBFBD>o de vida",
["Hide monsters"] = "Esconder montros", ["Hide monsters"] = "Esconder montros",
["Hide non-skull players"] = "Esconder jogadores sem caveira", ["Hide non-skull players"] = "Esconder jogadores sem caveira",
["Hide Npcs"] = "Esconder NPCs", ["Hide Npcs"] = "Esconder NPCs",
["Hide Offline"] = false, ["Hide Offline"] = "Esconder Offline",
["Hide party members"] = "Esconder membros do grupo", ["Hide party members"] = "Esconder membros do grupo",
["Hide players"] = "Esconder jogadores", ["Hide players"] = "Esconder jogadores",
["Hide spells for higher exp. levels"] = false, ["Hide spells for higher exp. levels"] = "Esconder feiti<74>os de n<>vel maior",
["Hide spells for other vocations"] = false, ["Hide spells for other vocations"] = "Esconder feiti<74>os de outras voca<63><61>es",
["Hit Points"] = "Pontos de Vida", ["Hit Points"] = "Pontos de Vida",
["Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks"] = false, ["Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks"] = "Segure o bot<6F>o esquerdo para navegar\nGire o bot<6F>o do centro do mouse para ampliar\nClique com o bot<6F>o direito do mouse para criar marcas",
["Host"] = "Host",
["Hotkeys"] = "Atalhos", ["Hotkeys"] = "Atalhos",
["If you shut down the program, your character might stay in the game.\nClick on 'Logout' to ensure that you character leaves the game properly.\nClick on 'Exit' if you want to exit the program without logging out your character."] = "Se voc<6F> desligar o programa o seu personagem pode continuar no jogo.\nClique em 'Sair' para assegurar que seu personagem saia do jogo adequadamente.\nClique em 'For<6F>ar Saida' para fechar o programa sem desconectar seu personagem.", ["If you shut down the program, your character might stay in the game.\nClick on 'Logout' to ensure that you character leaves the game properly.\nClick on 'Exit' if you want to exit the program without logging out your character."] = "Se voc<6F> desligar o programa o seu personagem pode continuar no jogo.\nClique em 'Sair' para assegurar que seu personagem saia do jogo adequadamente.\nClique em 'For<6F>ar Saida' para fechar o programa sem desconectar seu personagem.",
["Ignore"] = false,
["Ignore capacity"] = "Ignorar capacidade", ["Ignore capacity"] = "Ignorar capacidade",
["Ignored players:"] = false,
["Ignore equipped"] = "Ignorar equipado", ["Ignore equipped"] = "Ignorar equipado",
["Ignore List"] = false, ["Ignore List"] = "Lista de Ignorados",
["Ignore players"] = false, ["Ignore players"] = "Jogadores ignorados",
["Ignore Private Messages"] = false, ["Ignore Private Messages"] = "Ignorar mensagens privadas",
["Ignore Yelling"] = false, ["Ignore Yelling"] = "Ignorar gritos",
["Ignore"] = "Ignorar",
["Ignored players:"] = "Joadores ignorados:",
["Interface framerate limit: %s"] = "Limite da taxa de quadros da interface: %s", ["Interface framerate limit: %s"] = "Limite da taxa de quadros da interface: %s",
["Inventory"] = "Invent<EFBFBD>rio", ["Inventory"] = "Invent<EFBFBD>rio",
["Invite to Party"] = "Convidar para o grupo", ["Invite to Party"] = "Convidar para o grupo",
["Invite to private chat"] = "Convidar para o canal privado", ["Invite to private chat"] = "Convidar para o canal privado",
["IP Address Banishment"] = "Banimento de endere<72>o IP", ["IP Address Banishment"] = "Banimento de endere<72>o IP",
["It is empty."] = "Est<EFBFBD> vazio.",
["Item Offers"] = "Ofertas de items", ["Item Offers"] = "Ofertas de items",
["It is empty."] = false,
["Join %s's Party"] = "Entrar na party do %s", ["Join %s's Party"] = "Entrar na party do %s",
["Knight"] = "Knight",
["Leave Party"] = "Sair do grupo", ["Leave Party"] = "Sair do grupo",
["Level"] = "N<EFBFBD>vel", ["Level"] = "N<EFBFBD>vel",
["Lifetime Premium Account"] = false, ["Lifetime Premium Account"] = "Conta Premium para a vida toda.",
["Limits FPS to 60"] = "Limita o FPS para 60", ["Limits FPS to 60"] = "Limita o FPS para 60",
["List of items that you're able to buy"] = "Lista de itens que voc<6F> pode comprar", ["List of items that you're able to buy"] = "Lista de itens que voc<6F> pode comprar",
["List of items that you're able to sell"] = "Lista de itens que voc<6F> pode vender", ["List of items that you're able to sell"] = "Lista de itens que voc<6F> pode vender",
["Load"] = "Carregar", ["Load"] = "Carregar",
["Logging out..."] = "Saindo...", ["Logging out..."] = "Saindo...",
["Login Error"] = "Erro de Autentica<63><61>o",
["Login"] = "Entrar", ["Login"] = "Entrar",
["Login Error"] = "Erro de Autentica<63><61>o",
["Login Error"] = "Erro de Autentica<63><61>o",
["Logout"] = "Sair", ["Logout"] = "Sair",
["Look"] = "Olhar", ["Look"] = "Olhar",
["Magic Level"] = "N<EFBFBD>vel M<>gico", ["Magic Level"] = "N<EFBFBD>vel M<>gico",
["Make sure that your client uses\nthe correct game protocol version"] = "Tenha certeza que o seu cliente use\no mesmo protocolo do servidor do jogo", ["Make sure that your client uses\nthe correct game protocol version"] = "Tenha certeza que o seu cliente use\no mesmo protocolo do servidor do jogo",
["Mana"] = "Mana", ["Mana"] = "Mana",
["Manage hotkeys:"] = "Configurar atalhos:", ["Manage hotkeys:"] = "Configurar atalhos:",
["Market"] = "Mercado",
["Market Offers"] = "Ofertas do mercado", ["Market Offers"] = "Ofertas do mercado",
["Market"] = "Mercado",
["Message of the day"] = "Mensagem do dia", ["Message of the day"] = "Mensagem do dia",
["Message to "] = "Mensagem para ", ["Message to "] = "Mensagem para ",
["Message to %s"] = "Mandar mensagem para %s", ["Message to %s"] = "Mandar mensagem para %s",
["Minimap"] = "Minimapa", ["Minimap"] = "Minimapa",
["Module Manager"] = "Gerenciador de M<>dulos", ["Module Manager"] = "Gerenciador de M<>dulos",
["Module name"] = "Nome do m<>dulo", ["Module name"] = "Nome do m<>dulo",
["Mount"] = false, ["Mount"] = "Montar",
["Move Stackable Item"] = "Mover item cont<6E>vel", ["Move Stackable Item"] = "Mover item cont<6E>vel",
["Move up"] = "Mover para cima", ["Move up"] = "Mover para cima",
["Music volume: %d"] = "Volume da m<>sica: %d",
["My Offers"] = "Minhas ofertas", ["My Offers"] = "Minhas ofertas",
["Name:"] = "Nome:",
["Name Report"] = "Reportar Nome",
["Name Report + Banishment"] = "Reportar Nome + Banimento",
["Name Report + Banishment + Final Warning"] = "Reportar Nome + Banimento + Aviso Final", ["Name Report + Banishment + Final Warning"] = "Reportar Nome + Banimento + Aviso Final",
["No"] = "N<EFBFBD>o", ["Name Report + Banishment"] = "Reportar Nome + Banimento",
["Name Report"] = "Reportar Nome",
["Name"] = "Nome",
["New Server"] = "Novo Servidor",
["Next level in %d hours and %d minutes"] = "Pr<EFBFBD>ximo n<>vel em %d horas e %d minutos",
["No graphics card detected, everything will be drawn using the CPU,\nthus the performance will be really bad.\nPlease update your graphics driver to have a better performance."] = false, ["No graphics card detected, everything will be drawn using the CPU,\nthus the performance will be really bad.\nPlease update your graphics driver to have a better performance."] = false,
["No item selected."] = "Nenhum item selecionado", ["No item selected."] = "Nenhum item selecionado",
["No Mount"] = "Sem montaria", ["No Mount"] = "Sem montaria",
["No Outfit"] = "Sem roupa", ["No Outfit"] = "Sem roupa",
["No statement has been selected."] = "Nenhuma afirma<6D><61>o foi selecionada.", ["No statement has been selected."] = "Nenhuma afirma<6D><61>o foi selecionada.",
["No"] = "N<EFBFBD>o",
["Notation"] = "Nota<EFBFBD><EFBFBD>o", ["Notation"] = "Nota<EFBFBD><EFBFBD>o",
["NPC Trade"] = "Troca com NPC", ["NPC Trade"] = "Troca com NPC",
["Offer History"] = "Hist<EFBFBD>rico de ofertas", ["Offer History"] = "Hist<EFBFBD>rico de ofertas",
["Offer Type"] = "Tipo de oferta",
["Offers"] = "Ofertas", ["Offers"] = "Ofertas",
["Offer Type:"] = "Tipo de oferta:",
["Offline Training"] = "Treino Offline", ["Offline Training"] = "Treino Offline",
["Ok"] = "Ok", ["Ok"] = "Ok",
["on %s.\n"] = "em %s.\n", ["on %s.\n"] = "em %s.\n",
["Open"] = "Abrir",
["Open a private message channel:"] = "Abrir um canal privado:", ["Open a private message channel:"] = "Abrir um canal privado:",
["Open charlist automatically when starting client"] = false, ["Open charlist automatically when starting client"] = "Abrir lista de personagens ao iniciar o cliente",
["Open in new window"] = "Abrir em nova janela", ["Open in new window"] = "Abrir em nova janela",
["Open new channel"] = "Abrir novo canal", ["Open new channel"] = "Abrir novo canal",
["Open"] = "Abrir",
["Options"] = "Op<EFBFBD><EFBFBD>es", ["Options"] = "Op<EFBFBD><EFBFBD>es",
["Overview"] = "Vis<EFBFBD>o geral", ["Overview"] = "Vis<EFBFBD>o geral",
["Paladin"] = "Paladin",
["Pass Leadership to %s"] = "Passar lideran<61>a para %s", ["Pass Leadership to %s"] = "Passar lideran<61>a para %s",
["Password"] = "Senha", ["Password"] = "Senha",
["Piece Price:"] = "Pre<EFBFBD>o por pe<70>a:", ["Piece Price"] = "Pre<EFBFBD>o por pe<70>a",
["Please enter a character name:"] = "Por favor, entre com o nome do personagem:", ["Please enter a character name:"] = "Por favor, entre com o nome do personagem:",
["Please, press the key you wish to add onto your hotkeys manager"] = "Por favor, pressione a tecla que voc<6F> deseja\nadicionar no gerenciador de atalhos",
["Please Select"] = "Por favor, selecione algo", ["Please Select"] = "Por favor, selecione algo",
["Please use this dialog to only report bugs. Do not report rule violations here!"] = "Por favor, use este campo apenas para reportar defeitos. N<>o reporte viola<6C><61>o de regras aqui!", ["Please use this dialog to only report bugs. Do not report rule violations here!"] = "Por favor, use este campo apenas para reportar defeitos. N<>o reporte viola<6C><61>o de regras aqui!",
["Please wait"] = "Por favor, espere", ["Please wait"] = "Por favor, espere",
["Please, press the key you wish to add onto your hotkeys manager"] = "Por favor, pressione a tecla que voc<6F> deseja\nadicionar no gerenciador de atalhos",
["Port"] = "Porta", ["Port"] = "Porta",
["Position:"] = false, ["Position"] = "Posi<EFBFBD><EFBFBD>o",
["Position: %i %i %i"] = false, ["Position: %i %i %i"] = "Posi<EFBFBD><EFBFBD>o: %i %i %i",
["Premium Account (%s) days left"] = false, ["Premium Account (%s) days left"] = "Conta Premium (%s) dias faltando",
["Price:"] = "Pre<EFBFBD>o", ["Premium"] = "Premium",
["Price"] = "Pre<EFBFBD>o",
["Primary"] = "Prim<EFBFBD>rio", ["Primary"] = "Prim<EFBFBD>rio",
["Protocol"] = "Protocolo", ["Protocol"] = "Protocolo",
["Quest Log"] = "Registro de Quest", ["Quest Log"] = "Registro de Quest",
["Randomize"] = "Embaralhar",
["Randomize characters outfit"] = "Gerar roupa aleat<61>ria", ["Randomize characters outfit"] = "Gerar roupa aleat<61>ria",
["Reason:"] = "Motivo:", ["Randomize"] = "Embaralhar",
["Refresh"] = "Atualizar", ["Reason"] = "Motivo",
["Refresh Offers"] = "Atualizar Ofertas", ["Refresh Offers"] = "Atualizar Ofertas",
["Refresh"] = "Atualizar",
["Regeneration Time"] = "Tempo de Regenera<72><61>o", ["Regeneration Time"] = "Tempo de Regenera<72><61>o",
["Reject"] = "Rejeitar", ["Reject"] = "Rejeitar",
["Reload All"] = "Recarregar Todos", ["Reload All"] = "Recarregar Todos",
["Remember account and password when starts client"] = false, ["Remember account and password when starts client"] = "Lembrar conta e senha quando iniciar o cliente",
["Remember password"] = "Lembrar senha", ["Remember password"] = "Lembrar senha",
["Remove"] = "Remover",
["Remove %s"] = "Remover %s", ["Remove %s"] = "Remover %s",
["Remove"] = "Remover",
["Report Bug"] = "Reportar defeito", ["Report Bug"] = "Reportar defeito",
["Reserved for more functionality later."] = "Reservado para futura maior funcionalidade.", ["Reserved for more functionality later."] = "Reservado para futura maior funcionalidade.",
["Reset All"] = "Resetar Todos",
["Reset Market"] = "Resetar Mercado", ["Reset Market"] = "Resetar Mercado",
["Revoke %s's Invitation"] = "N<EFBFBD>o aceitar o convite do %s", ["Revoke %s's Invitation"] = "N<EFBFBD>o aceitar o convite do %s",
["Rotate"] = "Girar", ["Rotate"] = "Girar",
["Rule Violation"] = "Viola<EFBFBD><EFBFBD>o de regra", ["Rule Violation"] = "Viola<EFBFBD><EFBFBD>o de regra",
["Save"] = false, ["Save Messages"] = "Salvar Mensagens",
["Save Messages"] = false, ["Save"] = "Salvar",
["Search:"] = "Procurar:",
["Search all items"] = "Procurar todos os items", ["Search all items"] = "Procurar todos os items",
["Search"] = "Procurar",
["Secondary"] = "Secund<EFBFBD>rio", ["Secondary"] = "Secund<EFBFBD>rio",
["Select object"] = "Selecionar objeto", ["Select object"] = "Selecionar objeto",
["Select Outfit"] = "Selecionar Roupa", ["Select Outfit"] = "Selecionar Roupa",
["Select your language"] = false, ["Select your language"] = "Selecione sua l<>ngua",
["Sell"] = "Vender", ["Select"] = "Selecionar",
["Sell All"] = "Vender Todos",
["Sell Now"] = "Vender agora", ["Sell Now"] = "Vender agora",
["Sell Offers"] = "Ofertas de venda", ["Sell Offers"] = "Ofertas de venda",
["Send"] = "Enviar", ["Sell"] = "Vender",
["Send automatically"] = "Enviar automaticamente", ["Send automatically"] = "Enviar automaticamente",
["Send Message"] = false, ["Send Message"] = "Enviar Mensagem",
["Server"] = "Servidor", ["Send"] = "Enviar",
["Server List"] = "Lista de Servidores",
["Server list"] = "Lista de servidores",
["Server Log"] = "Registro do servidor", ["Server Log"] = "Registro do servidor",
["Server"] = "Servidor",
["Set Outfit"] = "Escolher Roupa", ["Set Outfit"] = "Escolher Roupa",
["Shielding"] = "Defesa", ["Shielding"] = "Defesa",
["Show all items"] = "Exibir todos os itens", ["Show all items"] = "Exibir todos os itens",
@@ -284,57 +316,57 @@ locale = {
["Show info messages in console"] = "Exibir mensagens informativas no console", ["Show info messages in console"] = "Exibir mensagens informativas no console",
["Show left panel"] = "Mostrar barra lateral esquerda", ["Show left panel"] = "Mostrar barra lateral esquerda",
["Show levels in console"] = "Exibir n<>veis no console", ["Show levels in console"] = "Exibir n<>veis no console",
["Show Offline"] = false, ["Show Offline"] = "Mostrar Offline",
["Show private messages in console"] = "Exibir mensagens privadas no console", ["Show private messages in console"] = "Exibir mensagens privadas no console",
["Show private messages on screen"] = "Exibir mensagens na tela", ["Show private messages on screen"] = "Exibir mensagens na tela",
["Show Server Messages"] = false, ["Show Server Messages"] = "Mostrar Mensagens do Servidor",
["Show status messages in console"] = "Exibir mensagens de estado no console", ["Show status messages in console"] = "Exibir mensagens de estado no console",
["Show Text"] = "Mostrar texto", ["Show Text"] = "Mostrar texto",
["Show timestamps in console"] = "Exibir o hor<6F>rio no console", ["Show timestamps in console"] = "Exibir o hor<6F>rio no console",
["Show your depot items only"] = "Mostrar os itens somentedo dep<65>sito", ["Show your depot items only"] = "Mostrar os itens somentedo dep<65>sito",
["Skills"] = "Habilidades", ["Skills"] = "Habilidades",
["Soul"] = "Alma", ["Sorcerer"] = "Sorcerer",
["Soul Points"] = "Pontos de Alma", ["Soul Points"] = "Pontos de Alma",
["Special"] = false, ["Soul"] = "Alma",
["Special"] = "Especial",
["Speed"] = "Velocidade", ["Speed"] = "Velocidade",
["Spell Cooldowns"] = false, ["Spell Cooldowns"] = "",
["Spell List"] = false, ["Spell List"] = "Lista de Feiti<74>os",
["Stamina"] = "Vigor", ["Stamina"] = "Vigor",
["Statement:"] = "Afirma<EFBFBD><EFBFBD>o:",
["Statement Report"] = "Afirmar Relato", ["Statement Report"] = "Afirmar Relato",
["Statement"] = "Afirma<EFBFBD><EFBFBD>o",
["Statistics"] = "Estat<EFBFBD>sticas", ["Statistics"] = "Estat<EFBFBD>sticas",
["Stop Attack"] = "Parar de Atacar", ["Stop Attack"] = "Parar de Atacar",
["Stop Follow"] = "Parar de Seguir", ["Stop Follow"] = "Parar de Seguir",
["Support"] = false, ["Support"] = "Suporte",
["%s: (use object)"] = "%s: (usar objeto)",
["%s: (use object on target)"] = "%s: (usar objeto no alvo)",
["%s: (use object on yourself)"] = "%s: (usar objeto em si)",
["%s: (use object with crosshair)"] = "%s: (usar objeto com mira)",
["Sword Fighting"] = "Combate com Espada", ["Sword Fighting"] = "Combate com Espada",
["Terminal"] = "Terminal", ["Terminal"] = "Terminal",
["There is no way."] = "N<EFBFBD>o h<> rota", ["There is no way."] = "N<EFBFBD>o h<> rota",
["Title"] = false, ["Title"] = "T<EFBFBD>tulo",
["Total Price:"] = "Pre<EFBFBD>o total:", ["Total Price"] = "Pre<EFBFBD>o total",
["Trade"] = "Trocar",
["Trade with ..."] = "Trocar com ...", ["Trade with ..."] = "Trocar com ...",
["Trade"] = "Trocar",
["Trying to reconnect in %s seconds."] = "Tentando reconectar em %s segundos.", ["Trying to reconnect in %s seconds."] = "Tentando reconectar em %s segundos.",
["Unable to load dat file, please place a valid dat in '%s'"] = "N<EFBFBD>o foi poss<73>vel carregar o arquivo dat, por favor coloque um arquivo v<>lido em %s", ["Type"] = "Tipo",
["Unable to load spr file, please place a valid spr in '%s'"] = "N<EFBFBD>o foi poss<73>vel carregar o arquivo spr, por favor coloque um arquivo v<>lido em %s", ["Unable to establish a connection. (err: %d)"] = "N<EFBFBD>o foi poss<73>vel estabilizar a conex<65>. (err: %d)",
["Unable to load dat file, please place a valid dat in '%s'"] = "N<EFBFBD>o foi poss<73>vel carregar o arquivo DAT, por favor coloque um arquivo v<>lido em %s",
["Unable to load spr file, please place a valid spr in '%s'"] = "N<EFBFBD>o foi poss<73>vel carregar o arquivo SPR, por favor coloque um arquivo v<>lido em %s",
["Unable to logout."] = "N<EFBFBD>o <20> possivel sair", ["Unable to logout."] = "N<EFBFBD>o <20> possivel sair",
["Unignore"] = false, ["Unignore"] = "Designorar",
["Unload"] = "Descarregar", ["Unload"] = "Descarregar",
["Update needed"] = false, ["Update needed"] = "Atualiza<EFBFBD><EFBFBD>o necess<73>ria",
["Use"] = "Usar",
["Use on target"] = "Usar no alvo", ["Use on target"] = "Usar no alvo",
["Use on yourself"] = "Usar em si", ["Use on yourself"] = "Usar em si",
["Use with ..."] = "Usar com ...", ["Use with ..."] = "Usar com ...",
["Use"] = "Usar",
["Version"] = "Vers<EFBFBD>o", ["Version"] = "Vers<EFBFBD>o",
["VIP List"] = "Lista VIP", ["VIP List"] = "Lista VIP",
["Voc."] = "Voc.", ["Voc."] = "Voc.",
["Vocation"] = false, ["Vocation"] = "Voca<EFBFBD><EFBFBD>o",
["Waiting List"] = "Lista de espera", ["Waiting List"] = "Lista de espera",
["Website"] = "Website", ["Website"] = "Website",
["Weight:"] = "Peso", ["Weight"] = "Peso",
["Will boost your walk on high speed characters"] = "Ir<EFBFBD> melhorar o andar de persnagens r<>pidos",
["Will detect when to use diagonal step based on the\nkeys you are pressing"] = "Detectar quando usar o passo diagonal\nbaseado nas teclas pressionadas", ["Will detect when to use diagonal step based on the\nkeys you are pressing"] = "Detectar quando usar o passo diagonal\nbaseado nas teclas pressionadas",
["With crosshair"] = "Com mira", ["With crosshair"] = "Com mira",
["Yes"] = "Sim", ["Yes"] = "Sim",
@@ -342,9 +374,9 @@ locale = {
["You are burning"] = "Voc<EFBFBD> est<73> queimando", ["You are burning"] = "Voc<EFBFBD> est<73> queimando",
["You are cursed"] = "Voc<EFBFBD> est<73> amaldi<64>oado", ["You are cursed"] = "Voc<EFBFBD> est<73> amaldi<64>oado",
["You are dazzled"] = "Voc<EFBFBD> est<73> deslumbrado", ["You are dazzled"] = "Voc<EFBFBD> est<73> deslumbrado",
["You are dead."] = "Voc<EFBFBD> est<73> morto.",
["You are dead"] = "Voc<EFBFBD> est<73> morto", ["You are dead"] = "Voc<EFBFBD> est<73> morto",
["You are drowing"] = "Voc<EFBFBD> est<73> se afogando", ["You are dead."] = "Voc<EFBFBD> est<73> morto.",
["You are drowning"] = "Voc<EFBFBD> est<73> se afogando",
["You are drunk"] = "Voc<EFBFBD> est<73> b<>bado", ["You are drunk"] = "Voc<EFBFBD> est<73> b<>bado",
["You are electrified"] = "Voc<EFBFBD> est<73> eletrificado", ["You are electrified"] = "Voc<EFBFBD> est<73> eletrificado",
["You are freezing"] = "Voc<EFBFBD> est<73> congelando", ["You are freezing"] = "Voc<EFBFBD> est<73> congelando",
@@ -356,17 +388,21 @@ locale = {
["You are strengthened"] = "Voc<EFBFBD> est<73> refor<6F>ado", ["You are strengthened"] = "Voc<EFBFBD> est<73> refor<6F>ado",
["You are within a protection zone"] = "Voc<EFBFBD> est<73> dentro de uma zona de prote<74><65>o", ["You are within a protection zone"] = "Voc<EFBFBD> est<73> dentro de uma zona de prote<74><65>o",
["You can enter new text."] = "Voc<EFBFBD> pode entrar com um novo texto.", ["You can enter new text."] = "Voc<EFBFBD> pode entrar com um novo texto.",
["You have %s percent"] = "Voc<EFBFBD> tem %s porcento", ["You have %d%% to advance to level %d."] = "Voc<EFBFBD> tem %d%% para avan<61>ar para o n<>vel %d.",
["You have %s percent to go"] = "Voc<EFBFBD> tem %s porcento para avan<61>ar", ["You have %s percent to go"] = "Voc<EFBFBD> tem %s porcento para avan<61>ar",
["You have %s percent"] = "Voc<EFBFBD> tem %s porcento",
["You may not logout during a fight"] = "Voc<EFBFBD> n<>o pode sair durante um combate", ["You may not logout during a fight"] = "Voc<EFBFBD> n<>o pode sair durante um combate",
["You may not logout or enter a protection zone"] = "Voc<EFBFBD> n<>o pode sair ou entrar em uma zona de prote<74><65>o", ["You may not logout or enter a protection zone"] = "Voc<EFBFBD> n<>o pode sair ou entrar em uma zona de prote<74><65>o",
["You must enter a comment."] = "Voc<EFBFBD> precisa entrar com um coment<6E>rio", ["You must enter a comment."] = "Voc<EFBFBD> precisa entrar com um coment<6E>rio",
["You must enter a valid server address and port."] = "Voc<EFBFBD> precisa colocar um endere<72>o e uma porta do servidor v<>lidos.", ["You must enter a valid server address and port."] = "Voc<EFBFBD> precisa colocar um endere<72>o e uma porta do servidor v<>lidos.",
["You must select a character to login!"] = "Voc<EFBFBD> deve selecionar um personagem para entrar!", ["You must select a character to login!"] = "Voc<EFBFBD> deve selecionar um personagem para entrar!",
["Your Capacity:"] = "Sua capacidade:",
["You read the following, written by \n%s\n"] = "Voc<EFBFBD> l<> o seguinte, escrito por \n%s\n", ["You read the following, written by \n%s\n"] = "Voc<EFBFBD> l<> o seguinte, escrito por \n%s\n",
["You read the following, written on \n%s.\n"] = false, ["You read the following, written on \n%s.\n"] = "Voc<EFBFBD> l<> o seguinte, escrito em \n%s.\n",
["Your Money:"] = "Seu dinheiro:", ["Your Capacity"] = "Sua capacidade",
["Your character health is %d out of %d."] = "A vida do seu personagem <20> %d de %d.",
["Your character mana is %d out of %d."] = "A mana do seu personagem <20> %d de %d.",
["Your connection has been lost. (err: %d)"] = "A sua conex<65>o foi perdida. (err: %d)",
["Your Money"] = "Seu dinheiro",
} }
} }

View File

@@ -345,7 +345,7 @@ locale = {
["You are dazzled"] = "Du <20>r chockad", ["You are dazzled"] = "Du <20>r chockad",
["You are dead."] = "Du <20>r d<>d.", ["You are dead."] = "Du <20>r d<>d.",
["You are dead"] = "Du <20>r d<>d", ["You are dead"] = "Du <20>r d<>d",
["You are drowing"] = "Du drunknar", ["You are drowning"] = "Du drunknar",
["You are drunk"] = "Du <20>r full.", ["You are drunk"] = "Du <20>r full.",
["You are electrified"] = "Du <20>r elektrifierad", ["You are electrified"] = "Du <20>r elektrifierad",
["You are freezing"] = "Du Fryser", ["You are freezing"] = "Du Fryser",

View File

@@ -1,35 +1,36 @@
Particle Particle
name: default_particle name: groupcooldown_particle
duration: 10 duration: 0.4
min-position-radius: 0 min-position-radius: 0
max-position-radius: 256 max-position-radius: 32
min-position-angle: 0 min-position-angle: 0
max-position-angle: 360 max-position-angle: 360
velocity: 10 velocity: 10
min-velocity-angle: 0 min-velocity-angle: 0
max-velocity-angle: 360 max-velocity-angle: 360
colors: #ffffff00 #ffffffff #00000000 colors: #ffffff00 #ffffffff #fff13000
colors-stops: 0 0.1 1 colors-stops: 0 0.1 1
size: 24 24 size: 1 1
texture: /data/particles/particle texture: /particles/particle
composition-mode: normal composition-mode: normal
Effect Effect
name: background-effect name: groupcooldown-effect
description: Effect for the game background description: Effect for group cooldowns in the cooldown module
System System
position: 0 0 position: 0 0
Emitter Emitter
position: 0 0 position: 0 0
delay: 0 delay: 0.06
duration: 0 duration: 0.2
burst-rate: 50 burst-rate: 350
burst-count: 1 burst-count: 50
particle-type: default_particle particle-type: groupcooldown_particle
AttractionAffector AttractionAffector
position: 0 0 position: 0 0
acceleration: 1000 acceleration: 1000

View File

@@ -66,4 +66,18 @@ PreviousButton < UIButton
image-clip: 0 21 12 21 image-clip: 0 21 12 21
$disabled: $disabled:
image-color: #ffffff55 image-color: #ffffff55
AddButton < UIButton
size: 20 20
image-source: /images/ui/icon_add
image-color: #ffffffff
$hover !disabled:
image-color: #ffffff99
$pressed:
image-color: #ffffff44
$disabled:
image-color: #ffffff55

View File

@@ -1,7 +1,6 @@
CheckBox < UICheckBox CheckBox < UICheckBox
size: 16 16 size: 16 16
text-align: left text-align: left
text: aa
text-offset: 16 0 text-offset: 16 0
color: #aaaaaa color: #aaaaaa
image-color: #ffffffff image-color: #ffffffff

View File

@@ -38,7 +38,7 @@ CreatureButton < UICreatureButton
margin-left: 2 margin-left: 2
phantom: true phantom: true
ProgressBar LifeProgressBar
id: lifeBar id: lifeBar
height: 5 height: 5
anchors.left: spacer.right anchors.left: spacer.right

View File

@@ -4,3 +4,7 @@ Item < UIItem
image-source: /images/ui/item image-source: /images/ui/item
font: verdana-11px-rounded font: verdana-11px-rounded
border-color: white border-color: white
color: white
$disabled:
color: #646464

View File

@@ -21,45 +21,3 @@ MenuLabel < Label
GameLabel < UILabel GameLabel < UILabel
font: verdana-11px-antialised font: verdana-11px-antialised
color: #bbbbbb color: #bbbbbb
FrameCounterLabel < Label
font: verdana-11px-rounded
@onSetup: |
self.updateEvent = cycleEvent(function()
local text = 'FPS: ' .. g_app.getBackgroundPaneFps()
self:setText(text)
end, 1000)
@onDestroy: self.updateEvent:cancel()
PingLabel < Label
font: verdana-11px-rounded
@onSetup: |
self.updateEvent = cycleEvent(function()
if g_game.isOnline() and modules.client_options.getOption('showPing') then
local ping = -1
if g_game.getFeature(GameClientPing) or g_game.getFeature(GameExtendedClientPing) then
ping = g_game.getPing()
else
ping = g_game.getLocalPlayer():getWalkPing()
end
local text = 'Ping: '
if ping < 0 then
text = text .. "??"
self:setColor('yellow')
else
text = text .. ping .. ' ms'
if ping >= 500 then
self:setColor('red')
elseif ping >= 250 then
self:setColor('yellow')
else
self:setColor('green')
end
end
self:setText(text)
self:show()
else
self:hide()
end
end, 1000)
@onDestroy: self.updateEvent:cancel()

View File

@@ -4,9 +4,16 @@ TextList < UIScrollArea
border-color: #1d222b border-color: #1d222b
background-color: #222833 background-color: #222833
padding: 1 padding: 1
auto-focus: none
HorizontalList < UIScrollArea HorizontalList < UIScrollArea
layout: horizontalBox layout: horizontalBox
border-width: 1 border-width: 1
border-color: #1d222b border-color: #1d222b
background-color: #222833 background-color: #222833
VerticalList < UIScrollArea
layout: verticalBox
border-width: 1
border-color: #1d222b
background-color: #222833

View File

@@ -1,8 +1,10 @@
Panel < UIWidget Panel < UIWidget
phantom: true phantom: true
auto-focus: first
ScrollablePanel < UIScrollArea ScrollablePanel < UIScrollArea
phantom: true phantom: true
auto-focus: first
FlatPanel < Panel FlatPanel < Panel
image-source: /images/ui/panel_flat image-source: /images/ui/panel_flat

View File

@@ -1,9 +1,24 @@
ProgressBar < UIProgressBar ProgressBar < UIProgressBar
height: 16 height: 16
background-color: red background-color: red
border: 1 black
image-source: /images/ui/progressbar image-source: /images/ui/progressbar
image-border: 1 image-border: 1
font: verdana-11px-rounded
text-offset: 0 2
$!on:
visible: false
margin-top: 0
margin-bottom: 0
height: 0
LifeProgressBar < UIProgressBar
height: 16
background-color: green
border: 1 black
font: verdana-11px-rounded
text-offset: 0 2
margin: 2
ProgressRect < UIProgressRect ProgressRect < UIProgressRect
anchors.fill: parent anchors.fill: parent

View File

@@ -5,7 +5,7 @@ ScrollBarSlider < UIButton
image-source: /images/ui/scrollbar image-source: /images/ui/scrollbar
image-clip: 0 26 13 13 image-clip: 0 26 13 13
image-border: 2 image-border: 2
image-color: #ffffffbb image-color: #ffffffff
$hover: $hover:
image-clip: 13 26 13 13 image-clip: 13 26 13 13
$pressed: $pressed:
@@ -14,6 +14,12 @@ ScrollBarSlider < UIButton
$disabled: $disabled:
image-color: #ffffff66 image-color: #ffffff66
ScrollBarValueLabel < Label
id: valueLabel
anchors.fill: parent
color: white
text-align: center
VerticalScrollBar < UIScrollBar VerticalScrollBar < UIScrollBar
orientation: vertical orientation: vertical
width: 13 width: 13
@@ -55,6 +61,8 @@ VerticalScrollBar < UIScrollBar
ScrollBarSlider ScrollBarSlider
ScrollBarValueLabel
HorizontalScrollBar < UIScrollBar HorizontalScrollBar < UIScrollBar
orientation: horizontal orientation: horizontal
height: 13 height: 13
@@ -97,3 +105,5 @@ HorizontalScrollBar < UIScrollBar
image-color: #ffffff66 image-color: #ffffff66
ScrollBarSlider ScrollBarSlider
ScrollBarValueLabel

View File

@@ -0,0 +1,6 @@
ImageView < UIImageView
image-smooth: false
image-fixed-ratio: true
draggable: true
border-width: 2
border-color: #000000

View File

@@ -1,17 +1,9 @@
PopupMenuButton < UIButton PopupMenuButton < UIButton
height: 18 height: 18
margin-left: 5
margin-right: 5
margin-top: 1
margin-bottom: 1
size: 0 21 size: 0 21
text-offset: 0 0 text-offset: 4 0
text-align: left
font: verdana-11px-antialised font: verdana-11px-antialised
image-source: /images/ui/button_popupmenu
image-color: white
image-clip: 0 0 20 20
image-border: 2
color: #aaaaaa color: #aaaaaa
background-color: alpha background-color: alpha
@@ -24,6 +16,13 @@ PopupMenuButton < UIButton
$disabled: $disabled:
color: #555555 color: #555555
PopupMenuShortcutLabel < Label
font: verdana-11px-antialised
text-align: right
anchors.fill: parent
margin-right: 2
margin-left: 5
PopupMenuSeparator < UIWidget PopupMenuSeparator < UIWidget
margin-left: 2 margin-left: 2
margin-right: 2 margin-right: 2
@@ -39,5 +38,4 @@ PopupMenu < UIPopupMenu
width: 50 width: 50
image-source: /images/ui/menubox image-source: /images/ui/menubox
image-border: 3 image-border: 3
padding-top: 3 padding: 3
padding-bottom: 3

View File

@@ -1,7 +1,9 @@
SpinBox < TextEdit SpinBox < TextEdit
__class: UISpinBox __class: UISpinBox
text-align: left
size: 86 20 size: 86 20
padding: 0 padding: 0
padding-left: 2
Button Button
id: up id: up
@@ -11,7 +13,6 @@ SpinBox < TextEdit
image-clip: 0 0 10 10 image-clip: 0 0 10 10
anchors.top: parent.top anchors.top: parent.top
anchors.right: parent.right anchors.right: parent.right
@onClick: self:getParent():up()
$hover: $hover:
image-clip: 0 10 10 10 image-clip: 0 10 10 10
@@ -26,7 +27,6 @@ SpinBox < TextEdit
image-clip: 0 0 10 10 image-clip: 0 0 10 10
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.right: parent.right anchors.right: parent.right
@onClick: self:getParent():down()
$hover: $hover:
image-clip: 0 10 10 10 image-clip: 0 10 10 10

View File

@@ -104,7 +104,7 @@ TabBarVerticalButton < UIButton
anchors.top: parent.top anchors.top: parent.top
$!first: $!first:
anchors.top: prev.bottom anchors.top: prev.bottom
margin-top: 5 margin-top: 10
$hover !checked: $hover !checked:
color: white color: white
icon-color: #cccccc icon-color: #cccccc

View File

@@ -6,6 +6,9 @@ TopButton < UIButton
image-color: #ffffffff image-color: #ffffffff
icon-color: #ffffffff icon-color: #ffffffff
$on:
image-source: /images/ui/button_top_blink
$hover !disabled: $hover !disabled:
image-color: #ffffff99 image-color: #ffffff99
image-clip: 26 0 26 26 image-clip: 26 0 26 26
@@ -43,7 +46,11 @@ TopMenuPanel < Panel
image-repeated: true image-repeated: true
focusable: false focusable: false
TopMenuFrameCounterLabel < FrameCounterLabel TopMenuFrameCounterLabel < Label
font: verdana-11px-rounded
color: white color: white
margin-top: 4 margin-top: 4
margin-left: 5 margin-left: 5
TopMenuPingLabel < Label
font: verdana-11px-rounded

View File

@@ -1,8 +1,9 @@
MessageBoxLabel < Label MessageBoxLabel < Label
id: messageBoxLabel id: messageBoxLabel
text-auto-resize: true
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top anchors.top: parent.top
text-wrap: true
text-auto-resize: true
MessageBoxButtonHolder < UIWidget MessageBoxButtonHolder < UIWidget
id: buttonHolder id: buttonHolder

244
data/styles/30-minimap.otui Normal file
View File

@@ -0,0 +1,244 @@
MinimapFlag < UIWidget
size: 11 11
focusable: false
MinimapCross < UIWidget
focusable: false
phantom: true
image: /images/game/minimap/cross
size: 16 16
MinimapFloorUpButton < Button
size: 20 20
margin-right: 28
margin-bottom: 28
anchors.right: parent.right
anchors.bottom: parent.bottom
icon-source: /images/game/minimap/floor_up
icon-clip: 0 32 16 16
$pressed:
icon-clip: 0 0 16 16
$hover !pressed:
icon-clip: 0 16 16 16
MinimapFloorDownButton < Button
size: 20 20
margin-right: 28
margin-bottom: 4
anchors.right: parent.right
anchors.bottom: parent.bottom
icon-source: /images/game/minimap/floor_down
icon-clip: 0 32 16 16
$pressed:
icon-clip: 0 0 16 16
$hover !pressed:
icon-clip: 0 16 16 16
MinimapZoomInButton < Button
text: +
size: 20 20
margin-right: 4
margin-bottom: 28
anchors.right: parent.right
anchors.bottom: parent.bottom
//icon-source: /images/game/minimap/zoom_in
MinimapZoomOutButton < Button
text: -
size: 20 20
margin-right: 4
margin-bottom: 4
anchors.right: parent.right
anchors.bottom: parent.bottom
//icon-source: /images/game/minimap/zoom_out
MinimapResetButton < Button
!text: tr('Center')
size: 44 20
anchors.left: parent.left
anchors.top: parent.top
margin: 4
Minimap < UIMinimap
draggable: true
focusable: false
cross: true
color: black
MinimapFloorUpButton
id: floorUp
@onClick: self:getParent():floorUp(1)
MinimapFloorDownButton
id: floorDown
@onClick: self:getParent():floorDown(1)
MinimapZoomInButton
id: zoomIn
@onClick: self:getParent():zoomIn()
MinimapZoomOutButton
id: zoomOut
@onClick: self:getParent():zoomOut()
MinimapResetButton
id: reset
@onClick: self:getParent():reset()
// Minimap Flag Create Window
MinimapFlagCheckBox < CheckBox
size: 15 15
margin-left: 2
image-source: /images/game/minimap/flagcheckbox
image-size: 15 15
image-border: 3
icon-source: /images/game/minimap/mapflags
icon-size: 11 11
icon-offset: 2 4
anchors.left: prev.right
anchors.top: prev.top
$!checked:
image-clip: 26 0 26 26
$hover !checked:
image-clip: 78 0 26 26
$checked:
image-clip: 0 0 26 26
$hover checked:
image-clip: 52 0 26 26
MinimapFlagWindow < MainWindow
!text: tr('Create Map Mark')
size: 196 185
Label
!text: tr('Position') .. ':'
text-auto-resize: true
anchors.top: parent.top
anchors.left: parent.left
margin-top: 2
Label
id: position
text-auto-resize: true
anchors.top: parent.top
anchors.right: parent.right
margin-top: 2
Label
!text: tr('Description') .. ':'
anchors.left: parent.left
anchors.top: prev.bottom
margin-top: 7
TextEdit
id: description
margin-top: 3
anchors.left: parent.left
anchors.top: prev.bottom
anchors.right: parent.right
MinimapFlagCheckBox
id: flag0
icon-source: /images/game/minimap/flag0
anchors.left: parent.left
anchors.top: prev.bottom
margin-top: 6
margin-left: 0
MinimapFlagCheckBox
id: flag1
icon-source: /images/game/minimap/flag1
MinimapFlagCheckBox
id: flag2
icon-source: /images/game/minimap/flag2
MinimapFlagCheckBox
id: flag3
icon-source: /images/game/minimap/flag3
MinimapFlagCheckBox
id: flag4
icon-source: /images/game/minimap/flag4
MinimapFlagCheckBox
id: flag5
icon-source: /images/game/minimap/flag5
MinimapFlagCheckBox
id: flag6
icon-source: /images/game/minimap/flag6
MinimapFlagCheckBox
id: flag7
icon-source: /images/game/minimap/flag7
MinimapFlagCheckBox
id: flag8
icon-source: /images/game/minimap/flag8
MinimapFlagCheckBox
id: flag9
icon-source: /images/game/minimap/flag9
MinimapFlagCheckBox
id: flag10
icon-source: /images/game/minimap/flag10
anchors.left: parent.left
anchors.top: prev.bottom
margin-top: 6
margin-left: 0
MinimapFlagCheckBox
id: flag11
icon-source: /images/game/minimap/flag11
MinimapFlagCheckBox
id: flag12
icon-source: /images/game/minimap/flag12
MinimapFlagCheckBox
id: flag13
icon-source: /images/game/minimap/flag13
MinimapFlagCheckBox
id: flag14
icon-source: /images/game/minimap/flag14
MinimapFlagCheckBox
id: flag15
icon-source: /images/game/minimap/flag15
MinimapFlagCheckBox
id: flag16
icon-source: /images/game/minimap/flag16
MinimapFlagCheckBox
id: flag17
icon-source: /images/game/minimap/flag17
MinimapFlagCheckBox
id: flag18
icon-source: /images/game/minimap/flag18
MinimapFlagCheckBox
id: flag19
icon-source: /images/game/minimap/flag19
Button
id: okButton
!text: tr('Ok')
width: 64
anchors.right: next.left
anchors.bottom: parent.bottom
margin-right: 10
Button
id: cancelButton
!text: tr('Cancel')
width: 64
anchors.right: parent.right
anchors.bottom: parent.bottom

View File

@@ -3,6 +3,7 @@
-- setup logger -- setup logger
g_logger.setLogFile(g_resources.getWorkDir() .. g_app.getCompactName() .. ".log") g_logger.setLogFile(g_resources.getWorkDir() .. g_app.getCompactName() .. ".log")
g_logger.info(os.date("== application started at %b %d %Y %X"))
-- print first terminal message -- print first terminal message
g_logger.info(g_app.getName() .. ' ' .. g_app.getVersion() .. ' rev ' .. g_app.getBuildRevision() .. ' (' .. g_app.getBuildCommit() .. ') built on ' .. g_app.getBuildDate() .. ' for arch ' .. g_app.getBuildArch()) g_logger.info(g_app.getName() .. ' ' .. g_app.getVersion() .. ' rev ' .. g_app.getBuildRevision() .. ' (' .. g_app.getBuildCommit() .. ') built on ' .. g_app.getBuildDate() .. ' for arch ' .. g_app.getBuildArch())
@@ -47,7 +48,8 @@ g_modules.ensureModuleLoaded("game_interface")
-- mods 1000-9999 -- mods 1000-9999
g_modules.autoLoadModules(9999) g_modules.autoLoadModules(9999)
if g_resources.fileExists("/otclientrc") then local script = '/' .. g_app.getCompactName() .. 'rc.lua'
dofile("/otclientrc")
end
if g_resources.fileExists(script) then
dofile(script)
end

View File

@@ -0,0 +1,10 @@
{
"folders":
[
{
"path": "..",
"folder_exclude_patterns": [".*", "*.*~"],
"file_exclude_patterns": [".*", "*.*~"]
}
]
}

View File

@@ -11,9 +11,14 @@ function setMusic(filename)
end end
function reloadScripts() function reloadScripts()
g_textures.clearTexturesCache() g_textures.clearCache()
g_modules.reloadModules() g_modules.reloadModules()
dofile('/' .. g_app.getCompactName() .. 'rc')
local script = '/' .. g_app.getCompactName() .. 'rc.lua'
if g_resources.fileExists(script) then
dofile(script)
end
local message = tr('All modules and scripts were reloaded.') local message = tr('All modules and scripts were reloaded.')
modules.game_textmessage.displayGameMessage(message) modules.game_textmessage.displayGameMessage(message)
@@ -48,6 +53,9 @@ function startup()
end end
function init() function init()
connect(g_app, { onRun = startup,
onExit = exit })
g_window.setMinimumSize({ width = 600, height = 480 }) g_window.setMinimumSize({ width = 600, height = 480 })
g_sounds.preload(musicFilename) g_sounds.preload(musicFilename)
@@ -82,17 +90,22 @@ function init()
g_keyboard.bindKeyDown('Ctrl+Shift+R', reloadScripts) g_keyboard.bindKeyDown('Ctrl+Shift+R', reloadScripts)
connect(g_app, { onRun = startup }) -- generate machine uuid, this is a security measure for storing passwords
if not g_crypt.setMachineUUID(g_configs.get('uuid')) then
g_configs.set('uuid', g_crypt.getMachineUUID())
g_configs.save()
end
end end
function terminate() function terminate()
disconnect(g_app, { onRun = startup,
onExit = exit })
-- save window configs -- save window configs
g_settings.set('window-size', g_window.getUnmaximizedSize()) g_settings.set('window-size', g_window.getUnmaximizedSize())
g_settings.set('window-pos', g_window.getUnmaximizedPos()) g_settings.set('window-pos', g_window.getUnmaximizedPos())
g_settings.set('window-maximized', g_window.isMaximized()) g_settings.set('window-maximized', g_window.isMaximized())
end
local protocolVersion = g_game.getProtocolVersion()
if protocolVersion ~= 0 then function exit()
g_settings.set('protocol-version', protocolVersion) g_logger.info("Exiting application..")
end
end end

View File

@@ -12,11 +12,11 @@ Module
load-later: load-later:
- client_styles - client_styles
- client_locales - client_locales
//- client_particles
- client_topmenu - client_topmenu
- client_background - client_background
- client_entergame
- client_options - client_options
- client_entergame
- client_terminal - client_terminal
- client_modulemanager - client_modulemanager
//- client_stats - client_serverlist
- client_stats

View File

@@ -1,18 +1,19 @@
-- private variables -- private variables
local background local background
local clientVersionLabel
-- public functions -- public functions
function init() function init()
background = g_ui.displayUI('background') background = g_ui.displayUI('background')
background:lower() background:lower()
local clientVersionLabel = background:getChildById('clientVersionLabel') clientVersionLabel = background:getChildById('clientVersionLabel')
clientVersionLabel:setText(g_app.getName() .. ' ' .. g_app.getVersion() .. '\n' .. clientVersionLabel:setText(g_app.getName() .. ' ' .. g_app.getVersion() .. '\n' ..
'Rev ' .. g_app.getBuildRevision() .. ' ('.. g_app.getBuildCommit() .. ')\n' .. 'Rev ' .. g_app.getBuildRevision() .. ' ('.. g_app.getBuildCommit() .. ')\n' ..
'Built on ' .. g_app.getBuildDate()) 'Built on ' .. g_app.getBuildDate())
if not g_game.isOnline() then if not g_game.isOnline() then
g_effects.fadeIn(clientVersionLabel, 1500) addEvent(function() g_effects.fadeIn(clientVersionLabel, 1500) end)
end end
connect(g_game, { onGameStart = hide }) connect(g_game, { onGameStart = hide })
@@ -25,7 +26,6 @@ function terminate()
g_effects.cancelFade(background:getChildById('clientVersionLabel')) g_effects.cancelFade(background:getChildById('clientVersionLabel'))
background:destroy() background:destroy()
background = nil
Background = nil Background = nil
end end
@@ -41,3 +41,7 @@ end
function hideVersionLabel() function hideVersionLabel()
background:getChildById('clientVersionLabel'):hide() background:getChildById('clientVersionLabel'):hide()
end end
function setVersionText(text)
clientVersionLabel:setText(text)
end

View File

@@ -13,25 +13,21 @@ local resendWaitEvent
local function tryLogin(charInfo, tries) local function tryLogin(charInfo, tries)
tries = tries or 1 tries = tries or 1
if tries > 4 then if tries > 50 then
CharacterList.destroyLoadBox()
displayErrorBox(tr('Error'), tr('Unable to logout.'))
return return
end end
if g_game.isOnline() then if g_game.isOnline() then
if tries == 1 then if tries == 1 then
g_game.safeLogout() g_game.safeLogout()
loadBox = displayCancelBox(tr('Please wait'), tr('Logging out...'))
end end
scheduleEvent(function() tryLogin(charInfo, tries+1) end, 250) scheduleEvent(function() tryLogin(charInfo, tries+1) end, 100)
return return
end end
CharacterList.destroyLoadBox() CharacterList.hide()
local locale = modules.client_locales.getCurrentLocale().name g_game.loginWorld(G.account, G.password, charInfo.worldName, charInfo.worldHost, charInfo.worldPort, charInfo.characterName)
g_game.loginWorld(G.account, G.password, charInfo.worldName, charInfo.worldHost, charInfo.worldPort, charInfo.characterName, locale)
loadBox = displayCancelBox(tr('Please wait'), tr('Connecting to game server...')) loadBox = displayCancelBox(tr('Please wait'), tr('Connecting to game server...'))
connect(loadBox, { onCancel = function() connect(loadBox, { onCancel = function()
@@ -41,7 +37,8 @@ local function tryLogin(charInfo, tries)
end }) end })
-- save last used character -- save last used character
g_settings.set('lastUsedCharacter', charInfo.characterName) g_settings.set('last-used-character', charInfo.characterName)
g_settings.set('last-used-world', charInfo.worldName)
end end
local function updateWait(timeStart, timeEnd) local function updateWait(timeStart, timeEnd)
@@ -114,7 +111,8 @@ end
function onGameConnectionError(message, code) function onGameConnectionError(message, code)
CharacterList.destroyLoadBox() CharacterList.destroyLoadBox()
errorBox = displayErrorBox(tr("Login Error"), message) local text = translateNetworkError(code, g_game.getProtocolGame() and g_game.getProtocolGame():isConnecting(), message)
errorBox = displayErrorBox(tr("Connection Error"), text)
errorBox.onOk = function() errorBox.onOk = function()
errorBox = nil errorBox = nil
CharacterList.showAgain() CharacterList.showAgain()
@@ -227,12 +225,15 @@ function CharacterList.create(characters, account, otui)
connect(widget, { onDoubleClick = function () CharacterList.doLogin() return true end } ) connect(widget, { onDoubleClick = function () CharacterList.doLogin() return true end } )
if i == 1 or g_settings.get('lastUsedCharacter') == widget.characterName then if i == 1 or (g_settings.get('last-used-character') == widget.characterName and g_settings.get('last-used-world') == widget.worldName) then
focusLabel = widget focusLabel = widget
end end
end end
characterList:focusChild(focusLabel, ActiveFocusReason) if focusLabel then
characterList:focusChild(focusLabel, KeyboardFocusReason)
addEvent(function() characterList:ensureChildVisible(focusLabel) end)
end
-- account -- account
if account.premDays > 0 and account.premDays < 65535 then if account.premDays > 0 and account.premDays < 65535 then

View File

@@ -1,33 +1,36 @@
CharacterWidget < UIWidget CharacterWidget < UIWidget
height: 14 height: 14
focusable: true
background-color: alpha background-color: alpha
@onFocusChange: | &updateOnStates: |
local children = self:getChildren() function(self)
for i=1,#children do local children = self:getChildren()
children[i]:setOn(self:isFocused()) for i=1,#children do
children[i]:setOn(self:isFocused())
end
end end
@onFocusChange: self:updateOnStates()
@onSetup: self:updateOnStates()
$focus: $focus:
background-color: #ffffff22 background-color: #ffffff22
Label Label
id: name id: name
color: #ffffff color: #aaaaaa
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
font: verdana-11px-monochrome font: verdana-11px-monochrome
text-auto-resize: true text-auto-resize: true
background-color: alpha background-color: alpha
text-offset: 2 0 text-offset: 2 0
on: true
$!on: $on:
color: #aaaaaa color: #ffffff
Label Label
id: worldName id: worldName
color: #ffffff color: #ffffff
color: #aaaaaa
anchors.top: parent.top anchors.top: parent.top
anchors.right: parent.right anchors.right: parent.right
margin-right: 5 margin-right: 5
@@ -35,10 +38,9 @@ CharacterWidget < UIWidget
text-auto-resize: true text-auto-resize: true
background-color: alpha background-color: alpha
&baseText: '(%s)' &baseText: '(%s)'
on: true
$!on: $on:
color: #aaaaaa color: #ffffff
MainWindow MainWindow
id: charactersWindow id: charactersWindow
@@ -61,6 +63,7 @@ MainWindow
padding: 1 padding: 1
focusable: false focusable: false
vertical-scrollbar: characterListScrollBar vertical-scrollbar: characterListScrollBar
auto-focus: first
VerticalScrollBar VerticalScrollBar
id: characterListScrollBar id: characterListScrollBar
@@ -73,7 +76,7 @@ MainWindow
Label Label
id: accountStatusCaption id: accountStatusCaption
!text: tr('Account Status:') !text: tr('Account Status') .. ':'
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.bottom: next.top anchors.bottom: next.top

View File

@@ -6,7 +6,9 @@ local enterGame
local motdWindow local motdWindow
local motdButton local motdButton
local enterGameButton local enterGameButton
local protocolBox local clientBox
local protocolLogin
local motdEnabled = true
-- private functions -- private functions
local function onError(protocol, message, errorCode) local function onError(protocol, message, errorCode)
@@ -26,15 +28,31 @@ end
local function onMotd(protocol, motd) local function onMotd(protocol, motd)
G.motdNumber = tonumber(motd:sub(0, motd:find("\n"))) G.motdNumber = tonumber(motd:sub(0, motd:find("\n")))
G.motdMessage = motd:sub(motd:find("\n") + 1, #motd) G.motdMessage = motd:sub(motd:find("\n") + 1, #motd)
motdButton:show() if motdEnabled then
motdButton:show()
end
end end
local function onCharacterList(protocol, characters, account, otui) local function onCharacterList(protocol, characters, account, otui)
-- Try add server to the server list
ServerList.add(G.host, G.port, g_game.getProtocolVersion())
if enterGame:getChildById('rememberPasswordBox'):isChecked() then if enterGame:getChildById('rememberPasswordBox'):isChecked() then
g_settings.set('account', g_crypt.encrypt(G.account)) local account = g_crypt.encrypt(G.account)
g_settings.set('password', g_crypt.encrypt(G.password)) local password = g_crypt.encrypt(G.password)
g_settings.set('account', account)
g_settings.set('password', password)
ServerList.setServerAccount(G.host, account)
ServerList.setServerPassword(G.host, password)
g_settings.set('autologin', enterGame:getChildById('autoLoginBox'):isChecked()) g_settings.set('autologin', enterGame:getChildById('autoLoginBox'):isChecked())
else else
-- reset server list account/password
ServerList.setServerAccount(G.host, '')
ServerList.setServerPassword(G.host, '')
EnterGame.clearAccountFields() EnterGame.clearAccountFields()
end end
@@ -44,28 +62,28 @@ local function onCharacterList(protocol, characters, account, otui)
CharacterList.create(characters, account, otui) CharacterList.create(characters, account, otui)
CharacterList.show() CharacterList.show()
local lastMotdNumber = g_settings.getNumber("motd") if motdEnabled then
if G.motdNumber and G.motdNumber ~= lastMotdNumber then local lastMotdNumber = g_settings.getNumber("motd")
g_settings.set("motd", motdNumber) if G.motdNumber and G.motdNumber ~= lastMotdNumber then
local motdBox = displayInfoBox(tr('Message of the day'), G.motdMessage) g_settings.set("motd", motdNumber)
connect(motdBox, { onOk = CharacterList.show }) motdWindow = displayInfoBox(tr('Message of the day'), G.motdMessage)
CharacterList.hide() connect(motdWindow, { onOk = function() CharacterList.show() motdWindow = nil end })
CharacterList.hide()
end
end end
end end
local function onChangeProtocol(combobox, option)
local clients = g_game.getSupportedClients(option)
protocolBox:setTooltip("Supports Client" .. (#clients > 1 and "s" or "") .. ": " .. table.toString(clients))
end
local function onUpdateNeeded(protocol, signature) local function onUpdateNeeded(protocol, signature)
loadBox:destroy() loadBox:destroy()
loadBox = nil loadBox = nil
if updateFunc then if EnterGame.updateFunc then
local continueFunc = EnterGame.show local continueFunc = EnterGame.show
local cancelFunc = EnterGame.show local cancelFunc = EnterGame.show
updateFunc(signature, continueFunc, cancelFunc) EnterGame.updateFunc(signature, continueFunc, cancelFunc)
else
local errorBox = displayErrorBox(tr('Update needed'), tr('Your client needs update, try redownloading it.'))
connect(errorBox, { onOk = EnterGame.show })
end end
end end
@@ -77,36 +95,32 @@ function EnterGame.init()
motdButton:hide() motdButton:hide()
g_keyboard.bindKeyDown('Ctrl+G', EnterGame.openWindow) g_keyboard.bindKeyDown('Ctrl+G', EnterGame.openWindow)
if G.motdNumber then if motdEnabled and G.motdNumber then
motdButton:show() motdButton:show()
end end
local account = g_crypt.decrypt(g_settings.get('account')) local account = g_settings.get('account')
local password = g_crypt.decrypt(g_settings.get('password')) local password = g_settings.get('password')
local host = g_settings.get('host') local host = g_settings.get('host')
local port = g_settings.get('port') local port = g_settings.get('port')
local autologin = g_settings.getBoolean('autologin') local autologin = g_settings.getBoolean('autologin')
local protocolVersion = g_settings.getInteger('protocol-version') local clientVersion = g_settings.getInteger('client-version')
if clientVersion == 0 then clientVersion = 860 end
if port == nil or port == 0 then port = 7171 end if port == nil or port == 0 then port = 7171 end
enterGame:getChildById('accountNameTextEdit'):setText(account) EnterGame.setAccountName(account)
enterGame:getChildById('accountPasswordTextEdit'):setText(password) EnterGame.setPassword(password)
enterGame:getChildById('serverHostTextEdit'):setText(host) enterGame:getChildById('serverHostTextEdit'):setText(host)
enterGame:getChildById('serverPortTextEdit'):setText(port) enterGame:getChildById('serverPortTextEdit'):setText(port)
enterGame:getChildById('autoLoginBox'):setChecked(autologin) enterGame:getChildById('autoLoginBox'):setChecked(autologin)
enterGame:getChildById('rememberPasswordBox'):setChecked(#account > 0)
enterGame:getChildById('accountNameTextEdit'):focus()
protocolBox = enterGame:getChildById('protocolComboBox') clientBox = enterGame:getChildById('clientComboBox')
protocolBox.onOptionChange = onChangeProtocol for _, proto in pairs(g_game.getSupportedClients()) do
for _i, proto in pairs(g_game.getSupportedProtocols()) do clientBox:addOption(proto)
protocolBox:addOption(proto)
end
if protocolVersion then
protocolBox:setCurrentOption(protocolVersion)
end end
clientBox:setCurrentOption(clientVersion)
enterGame:hide() enterGame:hide()
@@ -123,17 +137,20 @@ function EnterGame.firstShow()
local host = g_settings.get('host') local host = g_settings.get('host')
local autologin = g_settings.getBoolean('autologin') local autologin = g_settings.getBoolean('autologin')
if #host > 0 and #password > 0 and #account > 0 and autologin then if #host > 0 and #password > 0 and #account > 0 and autologin then
autoLoginEvent = addEvent(EnterGame.doLogin) addEvent(function()
if not g_settings.getBoolean('autologin') then return end
EnterGame.doLogin()
end)
end end
end end
function EnterGame.terminate() function EnterGame.terminate()
g_keyboard.unbindKeyDown('Ctrl+G') g_keyboard.unbindKeyDown('Ctrl+G')
removeEvent(autoLoginEvent)
enterGame:destroy() enterGame:destroy()
enterGame = nil enterGame = nil
enterGameButton:destroy() enterGameButton:destroy()
enterGameButton = nil enterGameButton = nil
clientBox = nil
if motdWindow then if motdWindow then
motdWindow:destroy() motdWindow:destroy()
motdWindow = nil motdWindow = nil
@@ -142,7 +159,14 @@ function EnterGame.terminate()
motdButton:destroy() motdButton:destroy()
motdButton = nil motdButton = nil
end end
protocolBox = nil if loadBox then
loadBox:destroy()
loadBox = nil
end
if protocolLogin then
protocolLogin:cancelLogin()
protocolLogin = nil
end
EnterGame = nil EnterGame = nil
end end
@@ -165,6 +189,18 @@ function EnterGame.openWindow()
end end
end end
function EnterGame.setAccountName(account)
local account = g_crypt.decrypt(account)
enterGame:getChildById('accountNameTextEdit'):setText(account)
enterGame:getChildById('accountNameTextEdit'):setCursorPos(-1)
enterGame:getChildById('rememberPasswordBox'):setChecked(#account > 0)
end
function EnterGame.setPassword(password)
local password = g_crypt.decrypt(password)
enterGame:getChildById('accountPasswordTextEdit'):setText(password)
end
function EnterGame.clearAccountFields() function EnterGame.clearAccountFields()
enterGame:getChildById('accountNameTextEdit'):clearText() enterGame:getChildById('accountNameTextEdit'):clearText()
enterGame:getChildById('accountPasswordTextEdit'):clearText() enterGame:getChildById('accountPasswordTextEdit'):clearText()
@@ -174,13 +210,11 @@ function EnterGame.clearAccountFields()
end end
function EnterGame.doLogin() function EnterGame.doLogin()
autoLoginEvent = nil
G.account = enterGame:getChildById('accountNameTextEdit'):getText() G.account = enterGame:getChildById('accountNameTextEdit'):getText()
G.password = enterGame:getChildById('accountPasswordTextEdit'):getText() G.password = enterGame:getChildById('accountPasswordTextEdit'):getText()
G.host = enterGame:getChildById('serverHostTextEdit'):getText() G.host = enterGame:getChildById('serverHostTextEdit'):getText()
G.port = tonumber(enterGame:getChildById('serverPortTextEdit'):getText()) G.port = tonumber(enterGame:getChildById('serverPortTextEdit'):getText())
local protocolVersion = tonumber(protocolBox:getText()) local clientVersion = tonumber(clientBox:getText())
local clientVersions = g_game.getSupportedClients(protocolVersion)
EnterGame.hide() EnterGame.hide()
if g_game.isOnline() then if g_game.isOnline() then
@@ -191,9 +225,10 @@ function EnterGame.doLogin()
g_settings.set('host', G.host) g_settings.set('host', G.host)
g_settings.set('port', G.port) g_settings.set('port', G.port)
g_settings.set('client-version', clientVersion)
local protocolLogin = ProtocolLogin.create() protocolLogin = ProtocolLogin.create()
protocolLogin.onError = onError protocolLogin.onLoginError = onError
protocolLogin.onMotd = onMotd protocolLogin.onMotd = onMotd
protocolLogin.onCharacterList = onCharacterList protocolLogin.onCharacterList = onCharacterList
protocolLogin.onUpdateNeeded = onUpdateNeeded protocolLogin.onUpdateNeeded = onUpdateNeeded
@@ -206,14 +241,11 @@ function EnterGame.doLogin()
end }) end })
g_game.chooseRsa(G.host) g_game.chooseRsa(G.host)
g_game.setProtocolVersion(protocolVersion) g_game.setClientVersion(clientVersion)
if #clientVersions > 0 then g_game.setProtocolVersion(g_game.getProtocolVersionForClient(clientVersion))
g_game.setClientVersion(clientVersions[#clientVersions])
end
if modules.game_things.isLoaded() then if modules.game_things.isLoaded() then
local locale = modules.client_locales.getCurrentLocale().name protocolLogin:login(G.host, G.port, G.account, G.password)
protocolLogin:login(G.host, G.port, G.account, G.password, locale)
else else
loadBox:destroy() loadBox:destroy()
loadBox = nil loadBox = nil
@@ -222,7 +254,7 @@ function EnterGame.doLogin()
end end
function EnterGame.displayMotd() function EnterGame.displayMotd()
if not motdWindow or not motdWindow:isVisible() then if not motdWindow then
motdWindow = displayInfoBox(tr('Message of the day'), G.motdMessage) motdWindow = displayInfoBox(tr('Message of the day'), G.motdMessage)
motdWindow.onOk = function() motdWindow = nil end motdWindow.onOk = function() motdWindow = nil end
end end
@@ -231,20 +263,16 @@ end
function EnterGame.setDefaultServer(host, port, protocol) function EnterGame.setDefaultServer(host, port, protocol)
local hostTextEdit = enterGame:getChildById('serverHostTextEdit') local hostTextEdit = enterGame:getChildById('serverHostTextEdit')
local portTextEdit = enterGame:getChildById('serverPortTextEdit') local portTextEdit = enterGame:getChildById('serverPortTextEdit')
local protocolLabel = enterGame:getChildById('protocolLabel') local clientLabel = enterGame:getChildById('clientLabel')
local accountTextEdit = enterGame:getChildById('accountNameTextEdit') local accountTextEdit = enterGame:getChildById('accountNameTextEdit')
local passwordTextEdit = enterGame:getChildById('accountPasswordTextEdit') local passwordTextEdit = enterGame:getChildById('accountPasswordTextEdit')
if hostTextEdit:getText() ~= host then if hostTextEdit:getText() ~= host then
hostTextEdit:setText(host) hostTextEdit:setText(host)
portTextEdit:setText(port) portTextEdit:setText(port)
protocolBox:setCurrentOption(protocol) clientBox:setCurrentOption(protocol)
accountTextEdit:setText('') accountTextEdit:setText('')
passwordTextEdit:setText('') passwordTextEdit:setText('')
if autoLoginEvent then
autoLoginEvent:cancel()
end
end end
end end
@@ -258,9 +286,9 @@ function EnterGame.setUniqueServer(host, port, protocol, windowWidth, windowHeig
portTextEdit:setVisible(false) portTextEdit:setVisible(false)
portTextEdit:setHeight(0) portTextEdit:setHeight(0)
protocolBox:setCurrentOption(protocol) clientBox:setCurrentOption(protocol)
protocolBox:setVisible(false) clientBox:setVisible(false)
protocolBox:setHeight(0) clientBox:setHeight(0)
local serverLabel = enterGame:getChildById('serverLabel') local serverLabel = enterGame:getChildById('serverLabel')
serverLabel:setVisible(false) serverLabel:setVisible(false)
@@ -268,9 +296,14 @@ function EnterGame.setUniqueServer(host, port, protocol, windowWidth, windowHeig
local portLabel = enterGame:getChildById('portLabel') local portLabel = enterGame:getChildById('portLabel')
portLabel:setVisible(false) portLabel:setVisible(false)
portLabel:setHeight(0) portLabel:setHeight(0)
local protocolLabel = enterGame:getChildById('protocolLabel') local clientLabel = enterGame:getChildById('clientLabel')
protocolLabel:setVisible(false) clientLabel:setVisible(false)
protocolLabel:setHeight(0) clientLabel:setHeight(0)
local serverListButton = enterGame:getChildById('serverListButton')
serverListButton:setVisible(false)
serverListButton:setHeight(0)
serverListButton:setWidth(0)
local rememberPasswordBox = enterGame:getChildById('rememberPasswordBox') local rememberPasswordBox = enterGame:getChildById('rememberPasswordBox')
rememberPasswordBox:setMarginTop(-5) rememberPasswordBox:setMarginTop(-5)
@@ -286,3 +319,7 @@ function EnterGame.setServerInfo(message)
label:setText(message) label:setText(message)
end end
function EnterGame.disableMotd()
motdEnabled = false
motdButton:hide()
end

View File

@@ -1,9 +1,26 @@
EnterGameWindow < MainWindow EnterGameWindow < MainWindow
!text: tr('Enter Game')
size: 236 274
EnterGameButton < Button
width: 64
ServerListButton < UIButton
size: 17 17
image-source: /images/topbuttons/minimap
image-color: #ffffffff
$hover !disabled:
image-color: #ffffff99
$pressed:
image-color: #ffffff44
$disabled:
image-color: #ffffff55
EnterGameWindow EnterGameWindow
id: enterGame id: enterGame
!text: tr('Enter Game')
size: 236 274
@onEnter: EnterGame.doLogin() @onEnter: EnterGame.doLogin()
MenuLabel MenuLabel
@@ -41,17 +58,26 @@ EnterGameWindow
margin-top: 8 margin-top: 8
text-auto-resize: true text-auto-resize: true
TextEdit ServerListButton
id: serverHostTextEdit id: serverListButton
!tooltip: tr('Make sure that your client uses\nthe correct game protocol version') !tooltip: tr('Server list')
anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.top: serverLabel.bottom anchors.top: serverLabel.bottom
margin-top: 3
@onClick: ServerList.show()
TextEdit
id: serverHostTextEdit
!tooltip: tr('Make sure that your client uses\nthe correct game client version')
anchors.left: parent.left
anchors.right: serverListButton.left
anchors.top: serverLabel.bottom
margin-top: 2 margin-top: 2
margin-right: 4
MenuLabel MenuLabel
id: protocolLabel id: clientLabel
!text: tr('Protocol') !text: tr('Client Version')
anchors.left: parent.left anchors.left: parent.left
anchors.top: serverHostTextEdit.bottom anchors.top: serverHostTextEdit.bottom
text-auto-resize: true text-auto-resize: true
@@ -59,10 +85,10 @@ EnterGameWindow
margin-top: 8 margin-top: 8
ComboBox ComboBox
id: protocolComboBox id: clientComboBox
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.horizontalCenter anchors.right: parent.horizontalCenter
anchors.top: protocolLabel.bottom anchors.top: clientLabel.bottom
margin-top: 2 margin-top: 2
margin-right: 3 margin-right: 3
width: 90 width: 90
@@ -80,7 +106,7 @@ EnterGameWindow
text: 7171 text: 7171
anchors.right: parent.right anchors.right: parent.right
anchors.left: parent.horizontalCenter anchors.left: parent.horizontalCenter
anchors.top: protocolComboBox.top anchors.top: clientComboBox.top
margin-left: 3 margin-left: 3
CheckBox CheckBox
@@ -103,9 +129,8 @@ EnterGameWindow
anchors.top: prev.bottom anchors.top: prev.bottom
margin-top: 2 margin-top: 2
Button EnterGameButton
!text: tr('Ok') !text: tr('Ok')
width: 64
anchors.right: parent.right anchors.right: parent.right
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
@onClick: EnterGame.doLogin() @onClick: EnterGame.doLogin()
@@ -116,3 +141,4 @@ EnterGameWindow
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: parent.left anchors.left: parent.left
color: green color: green
text-auto-resize: true

View File

@@ -1,7 +1,7 @@
MainWindow MainWindow
id: waitingWindow id: waitingWindow
!text: tr('Waiting List') !text: tr('Waiting List')
size: 260 160 size: 260 180
@onEscape: CharacterList.cancelWait() @onEscape: CharacterList.cancelWait()
Label Label

View File

@@ -17,14 +17,22 @@ end
function createWindow() function createWindow()
localesWindow = g_ui.displayUI('locales') localesWindow = g_ui.displayUI('locales')
local localesPanel = localesWindow:getChildById('localesPanel') local localesPanel = localesWindow:getChildById('localesPanel')
local layout = localesPanel:getLayout()
local spacing = layout:getCellSpacing()
local size = layout:getCellSize()
local count = 0
for name,locale in pairs(installedLocales) do for name,locale in pairs(installedLocales) do
local widget = g_ui.createWidget('LocalesButton', localesPanel) local widget = g_ui.createWidget('LocalesButton', localesPanel)
widget:setImageSource('/images/flags/' .. name .. '') widget:setImageSource('/images/flags/' .. name .. '')
widget:setText(locale.languageName) widget:setText(locale.languageName)
widget.onClick = function() selectFirstLocale(name) end widget.onClick = function() selectFirstLocale(name) end
count = count + 1
end end
count = math.max(1, math.min(count, 3))
localesPanel:setWidth(size.width*count + spacing*(count-1))
addEvent(function() addEvent(function() localesWindow:raise() localesWindow:focus() end) end) addEvent(function() addEvent(function() localesWindow:raise() localesWindow:focus() end) end)
end end
@@ -61,7 +69,7 @@ function init()
pdebug('Using configured locale: ' .. userLocaleName) pdebug('Using configured locale: ' .. userLocaleName)
else else
setLocale(defaultLocaleName) setLocale(defaultLocaleName)
connect(g_app, {onRun = createWindow}) connect(g_app, { onRun = createWindow })
end end
ProtocolGame.registerExtendedOpcode(ExtendedIds.Locale, onExtendedLocales) ProtocolGame.registerExtendedOpcode(ExtendedIds.Locale, onExtendedLocales)
@@ -73,6 +81,7 @@ function terminate()
currentLocale = nil currentLocale = nil
ProtocolGame.unregisterExtendedOpcode(ExtendedIds.Locale) ProtocolGame.unregisterExtendedOpcode(ExtendedIds.Locale)
disconnect(g_app, { onRun = createWindow })
disconnect(g_game, { onGameStart = onGameStart }) disconnect(g_game, { onGameStart = onGameStart })
end end
@@ -101,6 +110,8 @@ function installLocale(locale)
error('Unable to install locale.') error('Unable to install locale.')
end end
if _G.allowedLocales and not _G.allowedLocales[locale.name] then return end
if locale.name ~= defaultLocaleName then if locale.name ~= defaultLocaleName then
local updatesNeeded = 0 local updatesNeeded = 0
for _i,k in pairs(neededTranslations) do for _i,k in pairs(neededTranslations) do
@@ -110,7 +121,7 @@ function installLocale(locale)
end end
if updatesNeeded > 0 then if updatesNeeded > 0 then
pwarning('Locale \'' .. locale.name .. '\' is missing ' .. updatesNeeded .. ' translations.') pdebug('Locale \'' .. locale.name .. '\' is missing ' .. updatesNeeded .. ' translations.')
end end
end end
@@ -130,10 +141,14 @@ end
function setLocale(name) function setLocale(name)
local locale = installedLocales[name] local locale = installedLocales[name]
if locale == currentLocale then return end
if not locale then if not locale then
pwarning("Locale " .. name .. ' does not exist.') pwarning("Locale " .. name .. ' does not exist.')
return false return false
end end
if currentLocale then
sendLocale(locale.name)
end
currentLocale = locale currentLocale = locale
g_settings.set('locale', name) g_settings.set('locale', name)
if onLocaleChanged then onLocaleChanged(name) end if onLocaleChanged then onLocaleChanged(name) end
@@ -167,7 +182,7 @@ function _G.tr(text, ...)
if not translation then if not translation then
if translation == nil then if translation == nil then
if currentLocale.name ~= defaultLocaleName then if currentLocale.name ~= defaultLocaleName then
pwarning('Unable to translate: \"' .. text .. '\"') pdebug('Unable to translate: \"' .. text .. '\"')
end end
end end
translation = text translation = text

View File

@@ -5,6 +5,5 @@ Module
website: www.otclient.info website: www.otclient.info
sandboxed: true sandboxed: true
scripts: [ locales ] scripts: [ locales ]
dependencies: [ client_topmenu ]
@onLoad: init() @onLoad: init()
@onUnload: terminate() @onUnload: terminate()

View File

@@ -24,8 +24,6 @@ UIWindow
Panel Panel
id: localesPanel id: localesPanel
!width: 96*3 + 32*3
margin-left: 16
margin-top: 50 margin-top: 50
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.top: prev.bottom anchors.top: prev.bottom

View File

@@ -339,7 +339,7 @@ neededTranslations = {
"You are dazzled", "You are dazzled",
"You are dead.", "You are dead.",
"You are dead", "You are dead",
"You are drowing", "You are drowning",
"You are drunk", "You are drunk",
"You are electrified", "You are electrified",
"You are freezing", "You are freezing",

View File

@@ -20,18 +20,16 @@ function init()
addEvent(listModules) addEvent(listModules)
end end
function hideButton()
moduleManagerButton:hide()
end
function terminate() function terminate()
moduleManagerWindow:destroy() moduleManagerWindow:destroy()
moduleManagerWindow = nil
moduleManagerButton:destroy() moduleManagerButton:destroy()
moduleManagerButton = nil
moduleList = nil moduleList = nil
end end
function disable()
moduleManagerButton:hide()
end
function hide() function hide()
moduleManagerWindow:hide() moduleManagerWindow:hide()
end end
@@ -139,7 +137,7 @@ function unloadCurrentModule()
local module = g_modules.getModule(focusedChild:getText()) local module = g_modules.getModule(focusedChild:getText())
if module then if module then
module:unload() module:unload()
if ModuleManager == nil then return end if modules.client_modulemanager == nil then return end
updateModuleInfo(module:getName()) updateModuleInfo(module:getName())
refreshLoadedModules() refreshLoadedModules()
end end

View File

@@ -0,0 +1,28 @@
Panel
OptionCheckBox
id: enableAudio
!text: tr('Enable audio')
OptionCheckBox
id: enableMusicSound
!text: tr('Enable music sound')
Label
id: musicSoundVolumeLabel
!text: tr('Music volume: %d', 100)
anchors.left: parent.left
anchors.right: parent.right
anchors.top: prev.bottom
margin-top: 6
@onSetup: |
local value = modules.client_options.getOption('musicSoundVolume')
self:setText(tr('Music volume: %d', value))
OptionScrollbar
id: musicSoundVolume
anchors.left: parent.left
anchors.right: parent.right
anchors.top: prev.bottom
margin-top: 3
minimum: 0
maximum: 100

View File

@@ -13,13 +13,9 @@ Panel
!tooltip: tr('Will detect when to use diagonal step based on the\nkeys you are pressing') !tooltip: tr('Will detect when to use diagonal step based on the\nkeys you are pressing')
OptionCheckBox OptionCheckBox
id: walkBooster id: dashWalk
!text: tr('Enable walk booster') !text: tr('Enable dash walking')
!tooltip: tr('Also known as dash in tibia community, recommended\nfor playing characters with high speed') !tooltip: tr('Will boost your walk on high speed characters')
OptionCheckBox
id: enableMusic
!text: tr('Enable music')
OptionCheckBox OptionCheckBox
id: showPing id: showPing
@@ -30,6 +26,18 @@ Panel
id: showLeftPanel id: showLeftPanel
!text: tr('Show left panel') !text: tr('Show left panel')
OptionCheckBox
id: displayNames
!text: tr('Display creature names')
OptionCheckBox
id: displayHealth
!text: tr('Display creature health bars')
OptionCheckBox
id: displayText
!text: tr('Display text messages')
Button Button
id: changeLocale id: changeLocale
!text: tr('Change language') !text: tr('Change language')
@@ -37,3 +45,4 @@ Panel
anchors.top: prev.bottom anchors.top: prev.bottom
anchors.left: prev.left anchors.left: prev.left
margin-top: 5 margin-top: 5
width: 120

View File

@@ -1,25 +1,10 @@
FrameRateScrollbar < HorizontalScrollBar
step: 1
@onValueChange: modules.client_options.setOption(self:getId(), self:getValue())
@onSetup: |
UIScrollBar.onSetup(self)
local value = modules.client_options.getOption(self:getId())
if value == 0 then value = self:getMaximum() end
self:setValue(value)
Panel Panel
Label
!text: tr('Graphics Engine:')
anchors.left: parent.left
anchors.top: parent.top
ButtonBox ButtonBox
id: opengl1 id: opengl1
anchors.left: prev.right anchors.left: parent.left
anchors.verticalCenter: prev.verticalCenter anchors.top: parent.top
text: OpenGL 1 text: OpenGL 1
size: 80 20 size: 80 20
margin-left: 6
ButtonBox ButtonBox
id: opengl2 id: opengl2
@@ -29,6 +14,14 @@ Panel
size: 80 20 size: 80 20
margin-left: 4 margin-left: 4
ButtonBox
id: directx9
anchors.left: prev.right
anchors.verticalCenter: prev.verticalCenter
text: DirectX 9
size: 80 20
margin-left: 4
OptionCheckBox OptionCheckBox
id: vsync id: vsync
!text: tr('Enable vertical synchronization') !text: tr('Enable vertical synchronization')
@@ -39,12 +32,17 @@ Panel
!text: tr('Show frame rate') !text: tr('Show frame rate')
OptionCheckBox OptionCheckBox
id: fullscreen id: enableLights
!text: tr('Fullscreen') !text: tr('Enable lights')
OptionCheckBox
id: fullscreen
!text: tr('Fullscreen')
tooltip: Ctrl+Shift+F
OptionCheckBox OptionCheckBox
id: dontStretchShrink id: dontStretchShrink
!text: tr("Don't stretch or shrink Game Window") !text: tr('Don\'t stretch/shrink Game Window')
Label Label
id: backgroundFrameRateLabel id: backgroundFrameRateLabel
@@ -52,7 +50,7 @@ Panel
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.top: prev.bottom anchors.top: prev.bottom
margin-top: 16 margin-top: 12
@onSetup: | @onSetup: |
local value = modules.client_options.getOption('backgroundFrameRate') local value = modules.client_options.getOption('backgroundFrameRate')
local text = value local text = value
@@ -62,7 +60,7 @@ Panel
self:setText(tr('Game framerate limit: %s', text)) self:setText(tr('Game framerate limit: %s', text))
FrameRateScrollbar OptionScrollbar
id: backgroundFrameRate id: backgroundFrameRate
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
@@ -86,7 +84,7 @@ Panel
self:setText(tr('Interface framerate limit: %s', text)) self:setText(tr('Interface framerate limit: %s', text))
FrameRateScrollbar OptionScrollbar
id: foregroundFrameRate id: foregroundFrameRate
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
@@ -105,7 +103,7 @@ Panel
local value = modules.client_options.getOption('ambientLight') local value = modules.client_options.getOption('ambientLight')
self:setText(tr('Ambient light: %s%%', value)) self:setText(tr('Ambient light: %s%%', value))
FrameRateScrollbar OptionScrollbar
id: ambientLight id: ambientLight
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right

View File

@@ -1,52 +1,72 @@
local defaultOptions = { local defaultOptions = {
vsync = false, vsync = false,
showFps = true, showFps = false,
showPing = true, showPing = false,
fullscreen = false, fullscreen = false,
dontStretchShrink = false,
classicControl = false, classicControl = false,
walkBooster = false,
smartWalk = false, smartWalk = false,
dashWalk = false,
autoChaseOverride = true, autoChaseOverride = true,
showStatusMessagesInConsole = true, showStatusMessagesInConsole = true,
showEventMessagesInConsole = true, showEventMessagesInConsole = true,
showInfoMessagesInConsole = true, showInfoMessagesInConsole = true,
showTimestampsInConsole = true, showTimestampsInConsole = true,
showLevelsInConsole = true, showLevelsInConsole = true,
showPrivateMessagesInConsole = false, showPrivateMessagesInConsole = true,
showPrivateMessagesOnScreen = true, showPrivateMessagesOnScreen = true,
enableMusic = true,
showLeftPanel = false, showLeftPanel = false,
foregroundFrameRate = 61, foregroundFrameRate = 61,
backgroundFrameRate = 201, backgroundFrameRate = 201,
ambientLight = 15, painterEngine = 0,
painterEngine = 0 enableAudio = true,
enableMusicSound = true,
musicSoundVolume = 100,
enableLights = true,
ambientLight = 25,
displayNames = true,
displayHealth = true,
displayText = true,
dontStretchShrink = false
} }
local warningWindow
local optionsWindow local optionsWindow
local optionsButton local optionsButton
local optionsTabBar local optionsTabBar
local options = {} local options = {}
local gamePanel local generalPanel
local consolePanel local consolePanel
local graphicsPanel local graphicsPanel
local soundPanel
local audioButton
local function setupGraphicsEngines() local function setupGraphicsEngines()
local enginesRadioGroup = UIRadioGroup.create() local enginesRadioGroup = UIRadioGroup.create()
local ogl1 = graphicsPanel:getChildById('opengl1') local ogl1 = graphicsPanel:getChildById('opengl1')
local ogl2 = graphicsPanel:getChildById('opengl2') local ogl2 = graphicsPanel:getChildById('opengl2')
local dx9 = graphicsPanel:getChildById('directx9')
enginesRadioGroup:addWidget(ogl1) enginesRadioGroup:addWidget(ogl1)
enginesRadioGroup:addWidget(ogl2) enginesRadioGroup:addWidget(ogl2)
enginesRadioGroup:addWidget(dx9)
if g_graphics.getPainterEngine() == 2 then if g_window.getPlatformType() == 'WIN32-EGL' then
enginesRadioGroup:selectWidget(ogl2) enginesRadioGroup:selectWidget(dx9)
ogl1:setEnabled(false)
ogl2:setEnabled(false)
dx9:setEnabled(true)
else else
enginesRadioGroup:selectWidget(ogl1) ogl1:setEnabled(g_graphics.isPainterEngineAvailable(1))
end ogl2:setEnabled(g_graphics.isPainterEngineAvailable(2))
dx9:setEnabled(false)
if g_graphics.getPainterEngine() == 2 then
enginesRadioGroup:selectWidget(ogl2)
else
enginesRadioGroup:selectWidget(ogl1)
end
ogl1:setEnabled(g_graphics.isPainterEngineAvailable(1)) if g_app.getOs() ~= 'windows' then
ogl2:setEnabled(g_graphics.isPainterEngineAvailable(2)) dx9:hide()
end
end
enginesRadioGroup.onSelectionChange = function(self, selected) enginesRadioGroup.onSelectionChange = function(self, selected)
if selected == ogl1 then if selected == ogl1 then
@@ -62,75 +82,58 @@ local function setupGraphicsEngines()
end end
end end
function displayWarning(widget, warning)
if warningWindow and warningWindow:isVisible() then
return
end
if widget:isChecked() then
local yesCallback = function() warningWindow:destroy() warningWindow=nil end
local noCallback = function() widget:setChecked(false) warningWindow:destroy() warningWindow=nil end
warningWindow = displayGeneralBox('Warning', tr(warning), {
{ text='Yes', callback=yesCallback },
{ text='No', callback=noCallback },
anchor=AnchorHorizontalCenter}, yesCallback, noCallback)
end
end
function init() function init()
-- load options
for k,v in pairs(defaultOptions) do for k,v in pairs(defaultOptions) do
g_settings.setDefault(k, v) g_settings.setDefault(k, v)
if type(v) == 'boolean' then options[k] = v
setOption(k, g_settings.getBoolean(k))
elseif type(v) == 'number' then
setOption(k, g_settings.getNumber(k))
end
end end
g_keyboard.bindKeyDown('Ctrl+D', function() toggle() end)
g_keyboard.bindKeyDown('Ctrl+F', function() toggleOption('fullscreen') end)
g_keyboard.bindKeyDown('Ctrl+Shift+D', function() toggleOption('walkBooster') end)
optionsWindow = g_ui.displayUI('options') optionsWindow = g_ui.displayUI('options')
optionsWindow:hide() optionsWindow:hide()
optionsButton = modules.client_topmenu.addLeftButton('optionsButton', tr('Options') .. ' (Ctrl+D)', '/images/topbuttons/options', toggle)
optionsTabBar = optionsWindow:getChildById('optionsTabBar') optionsTabBar = optionsWindow:getChildById('optionsTabBar')
optionsTabBar:setContentWidget(optionsWindow:getChildById('optionsTabContent')) optionsTabBar:setContentWidget(optionsWindow:getChildById('optionsTabContent'))
gamePanel = g_ui.loadUI('game') g_keyboard.bindKeyDown('Ctrl+Shift+F', function() toggleOption('fullscreen') end)
optionsTabBar:addTab(tr('Game'), gamePanel) g_keyboard.bindKeyDown('Ctrl+N', toggleDisplays)
generalPanel = g_ui.loadUI('game')
optionsTabBar:addTab(tr('Game'), generalPanel, '/images/optionstab/game')
consolePanel = g_ui.loadUI('console') consolePanel = g_ui.loadUI('console')
optionsTabBar:addTab(tr('Console'), consolePanel) optionsTabBar:addTab(tr('Console'), consolePanel, '/images/optionstab/console')
graphicsPanel = g_ui.loadUI('graphics') graphicsPanel = g_ui.loadUI('graphics')
optionsTabBar:addTab(tr('Graphics'), graphicsPanel) optionsTabBar:addTab(tr('Graphics'), graphicsPanel, '/images/optionstab/graphics')
if g_game.isOfficialTibia() then audioPanel = g_ui.loadUI('audio')
local optionWalkBooster = gamePanel:getChildById('walkBooster') optionsTabBar:addTab(tr('Audio'), audioPanel, '/images/optionstab/audio')
optionWalkBooster.onCheckChange = function(widget)
displayWarning(widget, "This feature could be detectable by official Tibia servers. Would like to continue?")
setOption(widget:getId(), widget:isChecked())
end
end
setupGraphicsEngines() optionsButton = modules.client_topmenu.addLeftButton('optionsButton', tr('Options'), '/images/topbuttons/options', toggle)
audioButton = modules.client_topmenu.addLeftButton('audioButton', tr('Audio'), '/images/topbuttons/audio', function() toggleOption('enableAudio') end)
addEvent(function() setup() end)
end end
function terminate() function terminate()
g_keyboard.unbindKeyDown('Ctrl+D') g_keyboard.unbindKeyDown('Ctrl+Shift+F')
g_keyboard.unbindKeyDown('Ctrl+F') g_keyboard.unbindKeyDown('Ctrl+N')
g_keyboard.unbindKeyDown('Ctrl+Shift+D')
optionsWindow:destroy() optionsWindow:destroy()
optionsWindow = nil
optionsButton:destroy() optionsButton:destroy()
optionsButton = nil audioButton:destroy()
optionsTabBar = nil end
gamePanel = nil
consolePanel = nil function setup()
graphicsPanel = nil setupGraphicsEngines()
-- load options
for k,v in pairs(defaultOptions) do
if type(v) == 'boolean' then
setOption(k, g_settings.getBoolean(k), true)
elseif type(v) == 'number' then
setOption(k, g_settings.getNumber(k), true)
end
end
end end
function toggle() function toggle()
@@ -151,77 +154,95 @@ function hide()
optionsWindow:hide() optionsWindow:hide()
end end
function toggleOption(key) function toggleDisplays()
local optionWidget = optionsWindow:recursiveGetChildById(key) if options['displayNames'] and options['displayHealth'] then
if optionWidget then setOption('displayNames', false)
optionWidget:setChecked(not getOption(key)) elseif options['displayHealth'] then
setOption('displayHealth', false)
else else
setOption(key, not getOption(key)) if not options['displayNames'] and not options['displayHealth'] then
setOption('displayNames', true)
else
setOption('displayHealth', true)
end
end end
end end
function setOption(key, value) function toggleOption(key)
if options[key] == value then return end setOption(key, not getOption(key))
end
function setOption(key, value, force)
if not force and options[key] == value then return end
local gameMapPanel = modules.game_interface.getMapPanel()
if key == 'vsync' then if key == 'vsync' then
g_window.setVerticalSync(value) g_window.setVerticalSync(value)
elseif key == 'showFps' then elseif key == 'showFps' then
addEvent(function() modules.client_topmenu.setFpsVisible(value)
local frameCounter = rootWidget:recursiveGetChildById('frameCounter')
if frameCounter then frameCounter:setVisible(value) end
end)
elseif key == 'showPing' then elseif key == 'showPing' then
addEvent(function() modules.client_topmenu.setPingVisible(value)
local ping = rootWidget:recursiveGetChildById('pingLabel')
if ping then ping:setVisible(value) end
end)
elseif key == 'fullscreen' then elseif key == 'fullscreen' then
g_window.setFullscreen(value) g_window.setFullscreen(value)
elseif key == 'enableAudio' then
g_sounds.setAudioEnabled(value)
if value then
audioButton:setIcon('/images/topbuttons/audio')
else
audioButton:setIcon('/images/topbuttons/audio_mute')
end
elseif key == 'enableMusicSound' then
g_sounds.getChannel(SoundChannels.Music):setEnabled(value)
elseif key == 'musicSoundVolume' then
g_sounds.getChannel(SoundChannels.Music):setGain(value/100)
audioPanel:getChildById('musicSoundVolumeLabel'):setText(tr('Music volume: %d', value))
elseif key == 'showLeftPanel' then
modules.game_interface.getLeftPanel():setOn(value)
elseif key == 'backgroundFrameRate' then
local text, v = value, value
if value <= 0 or value >= 201 then text = 'max' v = 0 end
graphicsPanel:getChildById('backgroundFrameRateLabel'):setText(tr('Game framerate limit: %s', text))
g_app.setBackgroundPaneMaxFps(v)
elseif key == 'foregroundFrameRate' then
local text, v = value, value
if value <= 0 or value >= 61 then text = 'max' v = 0 end
graphicsPanel:getChildById('foregroundFrameRateLabel'):setText(tr('Interface framerate limit: %s', text))
g_app.setForegroundPaneMaxFps(v)
elseif key == 'enableLights' then
gameMapPanel:setDrawLights(value and options['ambientLight'] < 100)
graphicsPanel:getChildById('ambientLight'):setEnabled(value)
graphicsPanel:getChildById('ambientLightLabel'):setEnabled(value)
elseif key == 'ambientLight' then
graphicsPanel:getChildById('ambientLightLabel'):setText(tr('Ambient light: %s%%', value))
gameMapPanel:setMinimumAmbientLight(value/100)
gameMapPanel:setDrawLights(options['enableLights'] and value < 100)
elseif key == 'painterEngine' then
g_graphics.selectPainterEngine(value)
elseif key == 'displayNames' then
gameMapPanel:setDrawNames(value)
elseif key == 'displayHealth' then
gameMapPanel:setDrawHealthBars(value)
elseif key == 'displayText' then
gameMapPanel:setDrawTexts(value)
elseif key == 'dontStretchShrink' then elseif key == 'dontStretchShrink' then
addEvent(function() addEvent(function()
modules.game_interface.updateStretchShrink() modules.game_interface.updateStretchShrink()
end) end)
elseif key == 'enableMusic' then
g_sounds.setAudioEnabled(value)
elseif key == 'showLeftPanel' then
addEvent(function()
modules.game_interface.getLeftPanel():setOn(value)
end)
elseif key == 'backgroundFrameRate' then
local text = value
if value <= 0 or value >= 201 then
text = 'max'
value = 0
end
if graphicsPanel then
graphicsPanel:getChildById('backgroundFrameRateLabel'):setText(tr('Game framerate limit: %s', text))
end
g_app.setBackgroundPaneMaxFps(value)
elseif key == 'foregroundFrameRate' then
local text = value
if value <= 0 or value >= 61 then
text = 'max'
value = 0
end
if graphicsPanel then
graphicsPanel:getChildById('foregroundFrameRateLabel'):setText(tr('Interface framerate limit: %s', text))
end
g_app.setForegroundPaneMaxFps(value)
elseif key == 'ambientLight' then
addEvent(function()
local map = rootWidget:recursiveGetChildById('gameMapPanel')
if graphicsPanel then
graphicsPanel:getChildById('ambientLightLabel'):setText(tr('Ambient light: %s%%', value))
end
if map then
map:setMinimumAmbientLight(value/100)
map:setDrawLights(value < 100)
end
end)
elseif key == 'painterEngine' then
g_graphics.selectPainterEngine(value)
end end
-- change value for keybind updates
for _,panel in pairs(optionsTabBar:getTabsPanel()) do
local widget = panel:recursiveGetChildById(key)
if widget then
if widget:getStyle().__class == 'UICheckBox' then
widget:setChecked(value)
elseif widget:getStyle().__class == 'UIScrollBar' then
widget:setValue(value)
end
break
end
end
g_settings.set(key, value) g_settings.set(key, value)
options[key] = value options[key] = value
end end
@@ -230,4 +251,10 @@ function getOption(key)
return options[key] return options[key]
end end
function addTab(name, panel, icon)
optionsTabBar:addTab(name, panel, icon)
end
function addButton(name, func, icon)
optionsTabBar:addButton(name, func, icon)
end

View File

@@ -4,7 +4,6 @@ Module
author: edubart, BeniS author: edubart, BeniS
website: www.otclient.info website: www.otclient.info
sandboxed: true sandboxed: true
dependencies: [ client_topmenu ]
scripts: [ options ] scripts: [ options ]
@onLoad: init() @onLoad: init()
@onUnload: terminate() @onUnload: terminate()

View File

@@ -1,6 +1,5 @@
OptionCheckBox < CheckBox OptionCheckBox < CheckBox
@onCheckChange: modules.client_options.setOption(self:getId(), self:isChecked()) @onCheckChange: modules.client_options.setOption(self:getId(), self:isChecked())
@onSetup: self:setChecked(modules.client_options.getOption(self:getId()))
height: 16 height: 16
$first: $first:
@@ -14,27 +13,31 @@ OptionCheckBox < CheckBox
anchors.top: prev.bottom anchors.top: prev.bottom
margin-top: 2 margin-top: 2
OptionScrollbar < HorizontalScrollBar
step: 1
@onValueChange: modules.client_options.setOption(self:getId(), self:getValue())
MainWindow MainWindow
id: optionsWindow id: optionsWindow
!text: tr('Options') !text: tr('Options')
size: 350 310 size: 480 340
@onEnter: modules.client_options.hide() @onEnter: modules.client_options.hide()
@onEscape: modules.client_options.hide() @onEscape: modules.client_options.hide()
TabBarRounded TabBarVertical
id: optionsTabBar id: optionsTabBar
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.bottom: parent.bottom
Panel Panel
id: optionsTabContent id: optionsTabContent
anchors.top: optionsTabBar.bottom anchors.top: optionsTabBar.top
anchors.left: parent.left anchors.left: optionsTabBar.right
anchors.right: parent.right anchors.right: parent.right
anchors.bottom: parent.bottom anchors.bottom: optionsTabBar.bottom
margin-top: 10 margin-left: 10
Button Button
!text: tr('Ok') !text: tr('Ok')

View File

@@ -0,0 +1,38 @@
AddServer = {}
-- private variables
local addServerWindow = nil
-- public functions
function AddServer.init()
addServerWindow = g_ui.displayUI('addserver')
end
function AddServer.terminate()
addServerWindow:destroy()
end
function AddServer.add()
local host = addServerWindow:getChildById('host'):getText()
local port = addServerWindow:getChildById('port'):getText()
local protocol = addServerWindow:getChildById('protocol'):getCurrentOption().text
local added, error = ServerList.add(host, port, protocol)
if not added then
displayErrorBox(tr('Add Error'), tr(error))
else
AddServer.hide()
end
end
function AddServer.show()
addServerWindow:show()
addServerWindow:raise()
addServerWindow:focus()
addServerWindow:lock()
end
function AddServer.hide()
addServerWindow:hide()
addServerWindow:unlock()
end

View File

@@ -0,0 +1,72 @@
MainWindow
id: addServerWindow
!text: tr('New Server')
size: 180 180
visible: false
@onEscape: AddServer.hide()
@onEnter: AddServer.add()
Label
id: hostLabel
!text: tr('Host') .. ':'
anchors.top: parent.top
anchors.left: parent.left
margin-bottom: 2
TextEdit
id: host
anchors.top: hostLabel.bottom
anchors.left: hostLabel.left
anchors.right: parent.right
auto-focus: first
Label
id: portLabel
!text: tr('Port') .. ':'
anchors.top: host.bottom
anchors.left: host.left
margin-top: 3
margin-bottom: 2
TextEdit
id: port
text: 7171
anchors.top: portLabel.bottom
anchors.left: portLabel.left
anchors.right: host.right
Label
id: protocolLabel
!text: tr('Protocol') .. ':'
anchors.top: port.bottom
anchors.left: port.left
margin-top: 3
margin-bottom: 2
ComboBox
id: protocol
anchors.top: protocolLabel.bottom
anchors.left: protocolLabel.left
anchors.right: port.right
@onSetup: |
for _, proto in pairs(g_game.getSupportedClients()) do
self:addOption(proto)
end
Button
id: buttonAdd
!text: tr('Add')
width: 64
anchors.right: parent.horizontalCenter
anchors.bottom: parent.bottom
margin-right: 2
@onClick: AddServer.add()
Button
id: buttonCancel
!text: tr('Cancel')
width: 64
anchors.left: parent.horizontalCenter
anchors.bottom: parent.bottom
margin-left: 2
@onClick: AddServer.hide()

View File

@@ -0,0 +1,128 @@
ServerList = {}
-- private variables
local serverListWindow = nil
local serverTextList = nil
local removeWindow = nil
local servers = {}
-- public functions
function ServerList.init()
serverListWindow = g_ui.displayUI('serverlist')
serverTextList = serverListWindow:getChildById('serverList')
servers = g_settings.getNode('ServerList') or {}
ServerList.load()
end
function ServerList.terminate()
ServerList.destroy()
g_settings.setNode('ServerList', servers)
ServerList = nil
end
function ServerList.load()
for k,server in pairs(servers) do
ServerList.add(k, server.port, server.protocol, true)
end
end
function ServerList.select()
local selected = serverTextList:getFocusedChild()
if selected then
local server = servers[selected:getId()]
if server then
EnterGame.setDefaultServer(selected:getId(), server.port, server.protocol)
EnterGame.setAccountName(server.account)
EnterGame.setPassword(server.password)
ServerList.hide()
end
end
end
function ServerList.add(host, port, protocol, load)
if not load and servers[host] then
return false, 'Server already exists'
elseif host == '' or port == '' then
return false, 'Required fields are missing'
end
local widget = g_ui.createWidget('ServerWidget', serverTextList)
widget:setId(host)
if not load then
servers[host] = {
port = port,
protocol = protocol,
account = '',
password = ''
}
end
local details = widget:getChildById('details')
details:setText(host..':'..port)
local proto = widget:getChildById('protocol')
proto:setText(protocol)
connect(widget, { onDoubleClick = function () ServerList.select() return true end } )
return true
end
function ServerList.remove(widget)
local host = widget:getId()
if removeWindow then
return
end
local yesCallback = function()
widget:destroy()
servers[host] = nil
removeWindow:destroy()
removeWindow=nil
end
local noCallback = function()
removeWindow:destroy()
removeWindow=nil
end
removeWindow = displayGeneralBox(tr('Remove'), tr('Remove '..host..'?'), {
{ text=tr('Yes'), callback=yesCallback },
{ text=tr('No'), callback=noCallback },
anchor=AnchorHorizontalCenter}, yesCallback, noCallback)
end
function ServerList.destroy()
if serverListWindow then
serverTextList = nil
serverListWindow:destroy()
serverListWindow = nil
end
end
function ServerList.show()
if g_game.isOnline() then
return
end
serverListWindow:show()
serverListWindow:raise()
serverListWindow:focus()
end
function ServerList.hide()
serverListWindow:hide()
end
function ServerList.setServerAccount(host, account)
if servers[host] then
servers[host].account = account
end
end
function ServerList.setServerPassword(host, password)
if servers[host] then
servers[host].password = password
end
end

View File

@@ -0,0 +1,18 @@
Module
name: client_serverlist
description: Manages a server list of previously entered servers
author: BeniS
website: www.otclient.info
dependencies:
- client_entergame
@onLoad: |
dofile 'serverlist'
dofile 'addserver'
ServerList.init()
AddServer.init()
@onUnload: |
ServerList.terminate()
AddServer.terminate()

View File

@@ -0,0 +1,110 @@
ServerWidget < UIWidget
height: 14
background-color: alpha
&updateOnStates: |
function(self)
local children = self:getChildren()
for i=1,#children do
children[i]:setOn(self:isFocused())
end
end
@onFocusChange: self:updateOnStates()
@onSetup: self:updateOnStates()
$focus:
background-color: #ffffff22
Label
id: details
color: #aaaaaa
anchors.top: parent.top
anchors.left: parent.left
font: verdana-11px-monochrome
text-auto-resize: true
background-color: alpha
text-offset: 2 0
$on:
color: #ffffff
Label
id: protocol
color: #ffffff
color: #aaaaaa
anchors.top: parent.top
anchors.right: next.left
margin-right: 5
font: verdana-11px-monochrome
text-auto-resize: true
background-color: alpha
&baseText: '(%s)'
$on:
color: #ffffff
Button
id: remove
text: x
width: 12
height: 12
anchors.top: parent.top
anchors.right: parent.right
margin-right: 4
margin-top: 1
@onClick: ServerList.remove(self:getParent())
MainWindow
id: serverListWindow
!text: tr('Server List')
size: 340 290
visible: false
@onEnter: ServerList.select()
@onEscape: ServerList.hide()
@onSetup: |
g_keyboard.bindKeyPress('Up', function() self:getChildById('serverList'):focusPreviousChild(KeyboardFocusReason) end, self)
g_keyboard.bindKeyPress('Down', function() self:getChildById('serverList'):focusNextChild(KeyboardFocusReason) end, self)
TextList
id: serverList
anchors.top: parent.top
anchors.left: parent.left
anchors.right: serverListScrollBar.left
anchors.bottom: buttonOk.top
margin-bottom: 5
padding: 1
focusable: false
vertical-scrollbar: serverListScrollBar
auto-focus: first
VerticalScrollBar
id: serverListScrollBar
anchors.top: parent.top
anchors.bottom: buttonOk.top
anchors.right: parent.right
margin-bottom: 5
step: 14
pixels-scroll: true
AddButton
id: buttonAdd
!tooltip: tr('Add new server')
anchors.left: parent.left
anchors.bottom: parent.bottom
@onClick: AddServer.show()
Button
id: buttonOk
!text: tr('Select')
width: 64
anchors.right: next.left
anchors.bottom: parent.bottom
margin-right: 10
@onClick: ServerList.select()
Button
id: buttonCancel
!text: tr('Cancel')
width: 64
anchors.right: parent.right
anchors.bottom: parent.bottom
@onClick: ServerList.hide()

View File

@@ -25,6 +25,8 @@ end
function terminate() function terminate()
disconnect(g_game, { onGameStart = onGameStart, disconnect(g_game, { onGameStart = onGameStart,
onGameEnd = onGameEnd }) onGameEnd = onGameEnd })
removeEvent(firstReportEvent)
removeEvent(sendReportEvent)
end end
function configure(host, port, delay) function configure(host, port, delay)
@@ -45,13 +47,15 @@ end
function onGameStart() function onGameStart()
if not HOST then return end if not HOST then return end
removeEvent(firstReportEvent)
removeEvent(sendReportEvent)
firstReportEvent = addEvent(sendReport, FIRST_REPORT_DELAY*1000) firstReportEvent = addEvent(sendReport, FIRST_REPORT_DELAY*1000)
sendReportEvent = cycleEvent(sendReport, REPORT_DELAY*1000) sendReportEvent = cycleEvent(sendReport, REPORT_DELAY*1000)
end end
function onGameEnd() function onGameEnd()
removeEvent(sendReportEvent)
removeEvent(firstReportEvent) removeEvent(firstReportEvent)
removeEvent(sendReportEvent)
end end
function onConnect(protocol) function onConnect(protocol)
@@ -75,6 +79,10 @@ function onConnect(protocol)
post = post .. '&window_height=' .. g_window.getHeight() post = post .. '&window_height=' .. g_window.getHeight()
post = post .. '&player_name=' .. g_game.getCharacterName() post = post .. '&player_name=' .. g_game.getCharacterName()
post = post .. '&world_name=' .. g_game.getWorldName() post = post .. '&world_name=' .. g_game.getWorldName()
post = post .. '&otserv_host=' .. G.host
post = post .. '&otserv_port=' .. G.port
post = post .. '&otserv_protocol=' .. g_game.getProtocolVersion()
post = post .. '&otserv_client=' .. g_game.getClientVersion()
post = post .. '&build_version=' .. g_app.getVersion() post = post .. '&build_version=' .. g_app.getVersion()
post = post .. '&build_revision=' .. g_app.getBuildRevision() post = post .. '&build_revision=' .. g_app.getBuildRevision()
post = post .. '&build_commit=' .. g_app.getBuildCommit() post = post .. '&build_commit=' .. g_app.getBuildCommit()
@@ -84,6 +92,7 @@ function onConnect(protocol)
post = post .. '&cpu=' .. g_platform.getCPUName() post = post .. '&cpu=' .. g_platform.getCPUName()
post = post .. '&mem=' .. g_platform.getTotalSystemMemory() post = post .. '&mem=' .. g_platform.getTotalSystemMemory()
post = post .. '&os_name=' .. g_platform.getOSName() post = post .. '&os_name=' .. g_platform.getOSName()
post = post .. getAdditionalData()
local message = '' local message = ''
message = message .. "POST /report HTTP/1.1\r\n" message = message .. "POST /report HTTP/1.1\r\n"
@@ -98,6 +107,10 @@ function onConnect(protocol)
protocol:recv() protocol:recv()
end end
function getAdditionalData()
return ''
end
function onRecv(protocol, message) function onRecv(protocol, message)
if string.find(message, 'HTTP/1.1 200 OK') then if string.find(message, 'HTTP/1.1 200 OK') then
--pinfo('Stats sent to server successfully!') --pinfo('Stats sent to server successfully!')
@@ -106,5 +119,5 @@ function onRecv(protocol, message)
end end
function onError(protocol, message, code) function onError(protocol, message, code)
perror('Could not send statistics: ' .. message) pdebug('Could not send statistics: ' .. message)
end end

View File

@@ -1,24 +1,27 @@
function init() function init()
local styles = g_resources.listDirectoryFiles('/styles') local files
for _i,style in pairs(styles) do files = g_resources.listDirectoryFiles('/styles')
if string.ends(style, '.otui') then for _,file in pairs(files) do
g_ui.importStyle('/styles/' .. style) if g_resources.isFileType(file, 'otui') then
g_ui.importStyle('/styles/' .. file)
end end
end end
local fonts = g_resources.listDirectoryFiles('/fonts') files = g_resources.listDirectoryFiles('/fonts')
for _i,font in pairs(fonts) do for _,file in pairs(files) do
if string.ends(font, '.otfont') then if g_resources.isFileType(file, 'otfont') then
g_fonts.importFont('/fonts/' .. font) g_fonts.importFont('/fonts/' .. file)
end end
end end
local particles = g_resources.listDirectoryFiles('/particles') files = g_resources.listDirectoryFiles('/particles')
for _i,particle in pairs(particles) do for _,file in pairs(files) do
if string.ends(particle, '.otps') then if g_resources.isFileType(file, 'otps')then
g_particles.importParticle('/particles/' .. particle) g_particles.importParticle('/particles/' .. file)
end end
end end
g_mouse.loadCursors('/cursors/cursors')
end end
function terminate() function terminate()

View File

@@ -1,94 +1,177 @@
function dumpWidgets(widget, level) local function pcolored(text, color)
widget = widget or rootWidget color = color or 'white'
level = level or 0 modules.client_terminal.addLine(tostring(text), color)
for i=1,widget:getChildCount() do end
local child = widget:getChildByIndex(i)
if child:isVisible() then function draw_debug_boxes()
local name = child:getId() g_ui.setDebugBoxesDrawing(not g_ui.isDrawingDebugBoxes())
if name:match('widget%d+') == nil then end
print(string.rep(' ', level) .. name)
end function hide_map()
if child:getId() ~= 'terminalBuffer' then modules.game_interface.getMapPanel():hide()
dumpWidgets(child, level+1) end
end
function show_map()
modules.game_interface.getMapPanel():show()
end
function live_textures_reload()
g_textures.liveReload()
end
function live_module_reload(name)
if not name then
pcolored('ERROR: missing module name', 'red')
return
end
local module = g_modules.getModule(name)
if not module then
pcolored('ERROR: unable to find module ' .. name, 'red')
return
end
if not module:isReloadble() then
pcolored('ERROR: that module is not reloadable', 'red')
return
end
if not module:canReload() then
pcolored('ERROR: some other modules requires this module, cannot reload now', 'red')
return
end
local files = {}
local hasFile = false
for _,file in pairs(g_resources.listDirectoryFiles('/' .. name)) do
local filepath = '/' .. name .. '/' .. file
local time = g_resources.getFileTime(filepath)
if time > 0 then
files[filepath] = time
hasFile = true
end end
end end
end
function drawDebugBoxes(enable) if not hasFile then
if enable == nil then enable = true end pcolored('ERROR: unable to find any file for module', 'red')
g_ui.setDebugBoxesDrawing(enable) return
end end
function hideMap() cycleEvent(function()
local map = rootWidget:recursiveGetChildById('gameMapPanel') for filepath,time in pairs(files) do
if map then map:hide() end local newtime = g_resources.getFileTime(filepath)
end if newtime > time then
pcolored('Reloading ' .. name, 'green')
modules.client_terminal.flushLines()
module:reload()
files[filepath] = newtime
function showMap() if name == 'client_terminal' then
local map = rootWidget:recursiveGetChildById('gameMapPanel') modules.client_terminal.show()
if map then map:show() end end
end break
function debugContainersItems()
function UIItem:onHoverChange(hovered)
if hovered then
local item = self:getItem()
if item then
local text = "id: " ..item:getId() ..
"\n stackable: " ..tostring(item:isStackable()) ..
"\n marketable: " ..tostring(item:isMarketable()) ..
"\n vocation: "..(item:getMarketData() and item:getMarketData().restrictVocation or 'none') ..
"\n cloth slot: " ..item:getClothSlot()
g_tooltip.display(text)
end end
else end
g_tooltip.hide() end, 1000)
end
function live_sprites_reload()
local files = {}
for _,file in pairs(g_resources.listDirectoryFiles('/things')) do
local filepath = '/things/' .. file
local time = g_resources.getFileTime(filepath)
if time > 0 then
files[filepath] = time
hasFile = true
end end
end end
if not hasFile then
pcolored('ERROR: unable to find things file for module', 'red')
return
end
cycleEvent(function()
for filepath,time in pairs(files) do
local newtime = g_resources.getFileTime(filepath)
if newtime > time then
pcolored('Reloading sprites...', 'green')
modules.client_terminal.flushLines()
modules.game_things.load()
files[filepath] = newtime
if name == 'client_terminal' then
modules.client_terminal.show()
end
break
end
end
end, 1000)
end end
function debugPosition(enable) local pinging = false
if enable == nil then enable = true end local function pingBack(ping)
local label = rootWidget:getChildById('debugPositionLabel') if ping < 300 then color = 'green'
if not label then elseif ping < 600 then color = 'yellow'
label = g_ui.createWidget('GameLabel', rootWidget) else color = 'red' end
label:setColor('pink') pcolored(g_game.getWorldName() .. ' => ' .. ping .. ' ms', color)
label:setFont('terminus-14px-bold') end
label:setId('debugPositionLabel') function ping()
label:setPosition({x= 10, y = 40 }) if pinging then
label:setPhantom(true) pcolored('Ping stopped.')
label:setTextAutoResize(true) g_game.setPingDelay(1000)
end disconnect(g_game, 'onPingBack', pingBack)
if enable then
label.event = cycleEvent(function()
local player = g_game.getLocalPlayer()
if player then
local pos = g_game.getLocalPlayer():getPosition()
label:show()
label:setText('x: ' .. pos.x .. '\ny: ' .. pos.y .. '\nz: ' .. pos.z)
else
label:hide()
end
end, 100)
else else
removeEvent(label.event) if not (g_game.getFeature(GameClientPing) or g_game.getFeature(GameExtendedClientPing)) then
label.event = nil pcolored('this server does not support ping', 'red')
label:hide() return
elseif not g_game.isOnline() then
pcolored('ping command is only allowed when online', 'red')
return
end
pcolored('Starting ping...')
g_game.setPingDelay(0)
connect(g_game, 'onPingBack', pingBack)
end
pinging = not pinging
end
function clear()
modules.client_terminal.clear()
end
function ls(path)
path = path or '/'
local files = g_resources.listDirectoryFiles(path)
for k,v in pairs(files) do
if g_resources.directoryExists(path .. v) then
pcolored(path .. v, 'blue')
else
pcolored(path .. v)
end
end end
end end
function autoReloadModule(name) function about_version()
local function reloadEvent() pcolored(g_app.getName() .. ' ' .. g_app.getVersion() .. '\n' ..
reloadModule(name) 'Rev ' .. g_app.getBuildRevision() .. ' ('.. g_app.getBuildCommit() .. ')\n' ..
scheduleEvent(reloadEvent, 1000) 'Built on ' .. g_app.getBuildDate())
end
reloadEvent()
end end
function createDebugUIItem(id) function about_graphics()
local uiitem = g_ui.createWidget('Item', rootWidget) pcolored('Vendor ' .. g_graphics.getVendor() )
uiitem:setPosition({x= 200, y = 200 }) pcolored('Renderer' .. g_graphics.getRenderer())
uiitem:setItemId(id) pcolored('Version' .. g_graphics.getVersion())
uiitem:show() end
function about_modules()
for k,m in pairs(g_modules.getModules()) do
local loadedtext
if m:isLoaded() then
pcolored(m:getName() .. ' => loaded', 'green')
else
pcolored(m:getName() .. ' => not loaded', 'red')
end
end
end end

View File

@@ -1,21 +1,32 @@
-- configs -- configs
local LogColors = { [LogInfo] = 'white', local LogColors = { [LogDebug] = 'pink',
[LogInfo] = 'white',
[LogWarning] = 'yellow', [LogWarning] = 'yellow',
[LogError] = 'red' } [LogError] = 'red' }
local MaxLogLines = 80 local MaxLogLines = 128
local LabelHeight = 16
local MaxHistory = 1000 local MaxHistory = 1000
local oldenv = getfenv(0)
setfenv(0, _G)
_G.commandEnv = runinsandbox('commands')
setfenv(0, oldenv)
-- private variables -- private variables
local terminalWindow local terminalWindow
local terminalButton local terminalButton
local logLocked = false local logLocked = false
local commandEnv = {}
setmetatable(commandEnv, { __index = getfenv() } )
local commandTextEdit local commandTextEdit
local terminalBuffer local terminalBuffer
local commandHistory = { } local commandHistory = { }
local currentHistoryIndex = 0 local currentHistoryIndex = 0
local poped = false
local oldPos
local oldSize
local firstShown = false
local flushEvent
local cachedLines = {}
local disabled = false
local allLines = {}
-- private functions -- private functions
local function navigateCommand(step) local function navigateCommand(step)
@@ -25,6 +36,7 @@ local function navigateCommand(step)
if currentHistoryIndex > 0 then if currentHistoryIndex > 0 then
local command = commandHistory[numCommands - currentHistoryIndex + 1] local command = commandHistory[numCommands - currentHistoryIndex + 1]
commandTextEdit:setText(command) commandTextEdit:setText(command)
commandTextEdit:setCursorPos(-1)
else else
commandTextEdit:clearText() commandTextEdit:clearText()
end end
@@ -52,6 +64,7 @@ local function completeCommand()
-- complete command with one match -- complete command with one match
if #possibleCommands == 1 then if #possibleCommands == 1 then
commandTextEdit:setText(possibleCommands[1]) commandTextEdit:setText(possibleCommands[1])
commandTextEdit:setCursorPos(-1)
-- show command matches -- show command matches
elseif #possibleCommands > 0 then elseif #possibleCommands > 0 then
print('>> ' .. commandBegin) print('>> ' .. commandBegin)
@@ -75,6 +88,7 @@ local function completeCommand()
end end
end end
commandTextEdit:setText(commandBegin) commandTextEdit:setText(commandBegin)
commandTextEdit:setCursorPos(-1)
for i,v in ipairs(possibleCommands) do for i,v in ipairs(possibleCommands) do
print(v) print(v)
@@ -93,9 +107,7 @@ local function doCommand()
end end
local function onLog(level, message, time) local function onLog(level, message, time)
-- debug messages are ignored if disabled then return end
if level == LogDebug then return end
-- avoid logging while reporting logs (would cause a infinite loop) -- avoid logging while reporting logs (would cause a infinite loop)
if logLocked then return end if logLocked then return end
@@ -109,22 +121,7 @@ function init()
terminalWindow = g_ui.displayUI('terminal') terminalWindow = g_ui.displayUI('terminal')
terminalWindow:setVisible(false) terminalWindow:setVisible(false)
local poped = false terminalWindow.onDoubleClick = popWindow
terminalWindow.onDoubleClick = function(self)
if poped then
self:fill('parent')
self:getChildById('bottomResizeBorder'):disable()
self:getChildById('rightResizeBorder'):disable()
poped = false
else
self:breakAnchors()
self:resize(g_window.getWidth()/2, g_window.getHeight()/2)
self:move(g_window.getWidth()/2, g_window.getHeight()/2)
self:getChildById('bottomResizeBorder'):enable()
self:getChildById('rightResizeBorder'):enable()
poped = true
end
end
terminalButton = modules.client_topmenu.addLeftButton('terminalButton', tr('Terminal') .. ' (Ctrl + T)', '/images/topbuttons/terminal', toggle) terminalButton = modules.client_topmenu.addLeftButton('terminalButton', tr('Terminal') .. ' (Ctrl + T)', '/images/topbuttons/terminal', toggle)
g_keyboard.bindKeyDown('Ctrl+T', toggle) g_keyboard.bindKeyDown('Ctrl+T', toggle)
@@ -134,36 +131,105 @@ function init()
commandTextEdit = terminalWindow:getChildById('commandTextEdit') commandTextEdit = terminalWindow:getChildById('commandTextEdit')
g_keyboard.bindKeyPress('Up', function() navigateCommand(1) end, commandTextEdit) g_keyboard.bindKeyPress('Up', function() navigateCommand(1) end, commandTextEdit)
g_keyboard.bindKeyPress('Down', function() navigateCommand(-1) end, commandTextEdit) g_keyboard.bindKeyPress('Down', function() navigateCommand(-1) end, commandTextEdit)
g_keyboard.bindKeyPress('Ctrl+C',
function()
if commandTextEdit:hasSelection() or not terminalSelectText:hasSelection() then return false end
g_window.setClipboardText(terminalSelectText:getSelection())
return true
end, commandTextEdit)
g_keyboard.bindKeyDown('Tab', completeCommand, commandTextEdit) g_keyboard.bindKeyDown('Tab', completeCommand, commandTextEdit)
g_keyboard.bindKeyDown('Enter', doCommand, commandTextEdit) g_keyboard.bindKeyDown('Enter', doCommand, commandTextEdit)
g_keyboard.bindKeyDown('Escape', hide, terminalWindow) g_keyboard.bindKeyDown('Escape', hide, terminalWindow)
terminalBuffer = terminalWindow:getChildById('terminalBuffer') terminalBuffer = terminalWindow:getChildById('terminalBuffer')
terminalSelectText = terminalWindow:getChildById('terminalSelectText')
terminalSelectText.onDoubleClick = popWindow
terminalSelectText.onMouseWheel = function(a,b,c) terminalBuffer:onMouseWheel(b,c) end
terminalBuffer.onScrollChange = function(self, value) terminalSelectText:setTextVirtualOffset(value) end
g_logger.setOnLog(onLog) g_logger.setOnLog(onLog)
g_logger.fireOldMessages()
if not g_app.isRunning() then
g_logger.fireOldMessages()
elseif _G.terminalLines then
for _,line in pairs(_G.terminalLines) do
addLine(line.text, line.color)
end
end
end end
function terminate() function terminate()
g_settings.setList('terminal-history', commandHistory) g_settings.setList('terminal-history', commandHistory)
removeEvent(flushEvent)
if poped then
oldPos = terminalWindow:getPosition()
oldSize = terminalWindow:getSize()
end
local settings = {
size = oldSize,
pos = oldPos,
poped = poped
}
g_settings.setNode('terminal-window', settings)
g_keyboard.unbindKeyDown('Ctrl+T') g_keyboard.unbindKeyDown('Ctrl+T')
g_logger.setOnLog(nil) g_logger.setOnLog(nil)
terminalButton:destroy()
terminalButton = nil
commandTextEdit = nil
terminalBuffer = nil
terminalWindow:destroy() terminalWindow:destroy()
terminalWindow = nil terminalButton:destroy()
commandEnv = nil commandEnv = nil
_G.terminalLines = allLines
end end
function hideButton() function hideButton()
terminalButton:hide() terminalButton:hide()
end end
function popWindow()
if poped then
oldPos = terminalWindow:getPosition()
oldSize = terminalWindow:getSize()
terminalWindow:fill('parent')
terminalWindow:setOn(false)
terminalWindow:getChildById('bottomResizeBorder'):disable()
terminalWindow:getChildById('rightResizeBorder'):disable()
terminalWindow:getChildById('titleBar'):hide()
terminalWindow:getChildById('terminalScroll'):setMarginTop(0)
terminalWindow:getChildById('terminalScroll'):setMarginBottom(0)
terminalWindow:getChildById('terminalScroll'):setMarginRight(0)
poped = false
else
terminalWindow:breakAnchors()
terminalWindow:setOn(true)
local size = oldSize or { width = g_window.getWidth()/2, height = g_window.getHeight()/2 }
terminalWindow:setSize(size)
local pos = oldPos or { x = (g_window.getWidth() - terminalWindow:getWidth())/2, y = (g_window.getHeight() - terminalWindow:getHeight())/2 }
terminalWindow:setPosition(pos)
terminalWindow:getChildById('bottomResizeBorder'):enable()
terminalWindow:getChildById('rightResizeBorder'):enable()
terminalWindow:getChildById('titleBar'):show()
terminalWindow:getChildById('terminalScroll'):setMarginTop(18)
terminalWindow:getChildById('terminalScroll'):setMarginBottom(1)
terminalWindow:getChildById('terminalScroll'):setMarginRight(1)
terminalWindow:bindRectToParent()
poped = true
end
end
function toggle() function toggle()
if terminalWindow:isVisible() then if terminalWindow:isVisible() then
hide() hide()
else else
if not firstShown then
local settings = g_settings.getNode('terminal-window')
if settings then
if settings.size then oldSize = size end
if settings.pos then oldPos = settings.pos end
if settings.poped then popWindow() end
end
firstShown = true
end
show() show()
end end
end end
@@ -178,34 +244,59 @@ function hide()
terminalWindow:hide() terminalWindow:hide()
end end
function addLine(text, color) function disable()
-- delete old lines if needed terminalButton:hide()
local numLines = terminalBuffer:getChildCount() + 1 g_keyboard.unbindKeyDown('Ctrl+T')
if numLines > MaxLogLines then disabled = true
terminalBuffer:getChildByIndex(1):destroy() end
function flushLines()
local numLines = terminalBuffer:getChildCount() + #cachedLines
local fulltext = terminalSelectText:getText()
for _,line in pairs(cachedLines) do
-- delete old lines if needed
if numLines > MaxLogLines then
local firstChild = terminalBuffer:getChildByIndex(1)
if firstChild then
local len = #firstChild:getText()
firstChild:destroy()
table.remove(allLines, 1)
fulltext = string.sub(fulltext, len)
end
end
local label = g_ui.createWidget('TerminalLabel', terminalBuffer)
label:setId('terminalLabel' .. numLines)
label:setText(line.text)
label:setColor(line.color)
table.insert(allLines, {text=line.text,color=line.color})
fulltext = fulltext .. '\n' .. line.text
end end
-- create new line label terminalSelectText:setText(fulltext)
local label = g_ui.createWidget('TerminalLabel', terminalBuffer)
label:setId('terminalLabel' .. numLines) cachedLines = {}
label:setText(text) removeEvent(flushEvent)
label:setColor(color) flushEvent = nil
end
function addLine(text, color)
if not flushEvent then
flushEvent = scheduleEvent(flushLines, 10)
end
text = string.gsub(text, '\t', ' ')
table.insert(cachedLines, {text=text, color=color})
end end
function executeCommand(command) function executeCommand(command)
if command == nil or #command == 0 then return end if command == nil or #command == 0 then return end
logLocked = true -- add command line
g_logger.log(LogInfo, '> ' .. command) addLine("> " .. command, "#ffffff")
logLocked = false
-- detect and convert commands with simple syntax
local realCommand
if string.sub(command, 1, 1) == '=' then
realCommand = 'print(' .. string.sub(command,2) .. ')'
else
realCommand = command
end
-- reset current history index -- reset current history index
currentHistoryIndex = 0 currentHistoryIndex = 0
@@ -218,15 +309,33 @@ function executeCommand(command)
end end
end end
-- add command line -- detect and convert commands with simple syntax
--addLine(">> " .. command, "#ffffff") local realCommand
if string.sub(command, 1, 1) == '=' then
realCommand = 'print(' .. string.sub(command,2) .. ')'
else
realCommand = command
end
-- load command buffer
local func, err = loadstring(realCommand, "@") local func, err = loadstring(realCommand, "@")
-- detect terminal commands
if not func then
local command_name = command:match('^([%w_]+)[%s]*.*')
if command_name then
local args = string.split(command:match('^[%w_]+[%s]*(.*)'), ' ')
if commandEnv[command_name] and type(commandEnv[command_name]) == 'function' then
func = function() modules.client_terminal.commandEnv[command_name](unpack(args)) end
elseif command_name == command then
addLine('ERROR: command not found', 'red')
return
end
end
end
-- check for syntax errors -- check for syntax errors
if not func then if not func then
g_logger.log(LogError, 'incorrect lua syntax: ' .. err:sub(5)) addLine('ERROR: incorrect lua syntax: ' .. err:sub(5), 'red')
return return
end end
@@ -237,8 +346,15 @@ function executeCommand(command)
local ok, ret = pcall(func) local ok, ret = pcall(func)
if ok then if ok then
-- if the command returned a value, print it -- if the command returned a value, print it
if ret then print(ret) end if ret then addLine(ret, 'white') end
else else
g_logger.log(LogError, 'command failed: ' .. ret) addLine('ERROR: command failed: ' .. ret, 'red')
end end
end end
function clear()
terminalBuffer:destroyChildren()
terminalSelectText:setText('')
cachedLines = {}
allLines = {}
end

Some files were not shown because too many files have changed in this diff Show More