Version 2.2 - retro layout + bug fixes
@ -29,9 +29,10 @@ It's based on https://github.com/edubart/otclient and it's not backward compatib
|
||||
- Crosshair, floor fading, extra health/mana bars and panels
|
||||
- Much more client options
|
||||
- Removed a lot of useless and outdated things
|
||||
- Advanced bot (https://github.com/OTCv8/otclientv8_bot)
|
||||
- Advanced bot
|
||||
- Linux version
|
||||
- Full tibia 11.00 support
|
||||
- Layouts
|
||||
- New login server (with ingame account and character creation)
|
||||
- Support for proxies to lower latency and protect against DDoS (extra paid option)
|
||||
- Bot protection (extra paid option)
|
||||
@ -57,6 +58,7 @@ Open `init.lua` and edit:
|
||||
-- CONFIG
|
||||
APP_NAME = "otclientv8" -- important, change it, it's name for config dir and files in appdata
|
||||
APP_VERSION = 1337 -- client version for updater and login to indentify outdated client
|
||||
DEFAULT_LAYOUT = "retro"
|
||||
|
||||
-- If you don't use updater or other service, set it to updater = ""
|
||||
Services = {
|
||||
|
BIN
api/image.png
Before Width: | Height: | Size: 106 KiB |
181
api/login.php
@ -1,181 +0,0 @@
|
||||
<?php
|
||||
// author otclient@otclient.ovh
|
||||
// config
|
||||
$dbserver = "127.0.0.1";
|
||||
$username = "otclient";
|
||||
$password = "otclient";
|
||||
$dbname = "otclient";
|
||||
|
||||
$serverName = "OTClientV8";
|
||||
$serverIp = "otclient.ovh";
|
||||
//$serverIp = "proxy"; // if serverIp set to 0.0.0.0 or proxy it will connect to server using proxies, set proxies bellow
|
||||
$serverPort = 7172; // GAME PORT (7172 usually)
|
||||
|
||||
$version = 1099;
|
||||
$otc_version = 1337; // APP_VERSION, from init.lua
|
||||
|
||||
$maxLogins = 10; // 0 or null to disable
|
||||
$blockTime = 60; // after too many logins, in seconds
|
||||
// CREATE TABLE `login_attmpts` ( `acc` varchar(50) NOT NULL, `ip` varchar(30) NOT NULL, `date` datetime NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
$encryption = "sha1"; // sha1 or md5, everything else == none
|
||||
|
||||
// required files in things, type => (filename, md5 checksum in hex)
|
||||
// $things = null; things can be null if you want to use default values, but then enable auto download of sprites and dat in updater
|
||||
|
||||
/* //for 860
|
||||
$things = array(
|
||||
"sprites" => array("$version/Tibia.spr", "3db8c0098d34ca3d9a8ec29d40ef1b7b"),
|
||||
"data" => array("$version/Tibia.dat", "85785b5d67b4c111f780a74895c85c75")
|
||||
);
|
||||
*/
|
||||
|
||||
// for 1099
|
||||
$things = array(
|
||||
"sprites" => array("$version/Tibia.spr", "63d38646597649a55a8be463d6c0fb49"),
|
||||
"data" => array("$version/Tibia.dat", "ae7157cfff42f14583d6363e77044df7")
|
||||
);
|
||||
|
||||
$customProtocol = nil; // if not nil it will replace client version in protocolgame, may be used to detect outdated client
|
||||
|
||||
// executes modules.client_options.setOption(option, value, true)
|
||||
$settings = array(
|
||||
|
||||
);
|
||||
|
||||
// it's from src/client/const.h, executes g_game.enableFeature/g_game.disableFeature
|
||||
$features = array(
|
||||
22 => true, // GameFormatCreatureName
|
||||
25 => true, // GameExtendedClientPing
|
||||
30 => true, // GameChangeMapAwareRange
|
||||
// 56 => true, // GameSpritesAlphaChannel
|
||||
80 => true,
|
||||
90 => true, // GameNewWalking
|
||||
// 91 => true, // GameSmootherWalking
|
||||
95 => true, // GameBot
|
||||
97 => true, // light
|
||||
);
|
||||
|
||||
$rsa = "1091201329673994292788609605089955415282375029027981291234687579" .
|
||||
"3726629149257644633073969600111060390723088861007265581882535850" .
|
||||
"3429057592827629436413108566029093628212635953836686562675849720" .
|
||||
"6207862794310902180176810615217550567108238764764442605581471797" .
|
||||
"07119674283982419152118103759076030616683978566631413";
|
||||
|
||||
// proxies (it's custom feature, not available for free)
|
||||
$proxies = array(
|
||||
array(
|
||||
"localPort" => 7172,
|
||||
"host" => "51.158.184.57",
|
||||
"port" => 7162,
|
||||
"priority" => 0
|
||||
),
|
||||
array(
|
||||
"localPort" => 7172,
|
||||
"host" => "54.39.190.20",
|
||||
"port" => 7162,
|
||||
"priority" => 0
|
||||
),
|
||||
array(
|
||||
"localPort" => 7172,
|
||||
"host" => "51.83.226.109",
|
||||
"port" => 7162,
|
||||
"priority" => 0,
|
||||
),
|
||||
array(
|
||||
"localPort" => 7172,
|
||||
"host" => "35.247.201.100",
|
||||
"port" => 443,
|
||||
"priority" => 0
|
||||
)
|
||||
);
|
||||
|
||||
// config end
|
||||
|
||||
$data = file_get_contents("php://input");
|
||||
|
||||
$data = json_decode($data);
|
||||
if(empty($data)) {
|
||||
http_response_code(400);
|
||||
}
|
||||
|
||||
if($data->version != $otc_version) {
|
||||
die(json_encode(array("error" => "Outdated client, please update!")));
|
||||
}
|
||||
|
||||
$conn = new mysqli($dbserver, $username, $password, $dbname);
|
||||
if ($conn->connect_error) {
|
||||
die("SQL connection failed: " . $conn->connect_error);
|
||||
}
|
||||
|
||||
$account = $data->account;
|
||||
if($encryption == "sha1")
|
||||
$password = sha1($data->password);
|
||||
else if($encryption == "md5")
|
||||
$password = md5($data->password);
|
||||
else
|
||||
$password = $data->password;
|
||||
|
||||
$token = $data->token;
|
||||
|
||||
$account = preg_replace("/[^A-Za-z0-9 ._-]/", '', $account);
|
||||
$password = preg_replace("/[^A-Za-z0-9 ._-]/", '', $password);
|
||||
$token = preg_replace("/[^A-Za-z0-9 ._-]/", '', $token);
|
||||
$ip = preg_replace("/[^A-Za-z0-9 ._-]/", '', $_SERVER['REMOTE_ADDR']);
|
||||
|
||||
if($maxLogins != null && $maxLogins > 0) {
|
||||
$result = $conn->query("select count(*) as `attempts` from `login_attmpts` where `ip` = '".$ip."' and `date` > NOW() - INTERVAL ".$blockTime." SECOND");
|
||||
$result = $result->fetch_assoc();
|
||||
if($result['attempts'] > $maxLogins) {
|
||||
die(json_encode(array("error" => "Too many login attempts, please wait ".$blockTime." seconds.")));
|
||||
}
|
||||
$conn->query("INSERT INTO `login_attmpts` (`acc`, `ip`, `date`) VALUES ('".$conn->real_escape_string($account)."', '".$ip."', NOW())");
|
||||
}
|
||||
|
||||
$result = $conn->query("select * from accounts where `name` = '".$conn->real_escape_string($account)."' and `password` = '".$conn->real_escape_string($password)."'");
|
||||
if ($result->num_rows != 1) {
|
||||
die(json_encode(array("error" => "Invalid account/password")));
|
||||
}
|
||||
$acc = $result->fetch_assoc();
|
||||
|
||||
$session = "".$data->account."\n".$data->password."\n$token\n".time();
|
||||
|
||||
if($serverIp != "proxy" && $serverIp != "0.0.0.0") {
|
||||
$proxies = null;
|
||||
}
|
||||
|
||||
$response = array(
|
||||
"error" => "",
|
||||
"rsa" => $rsa,
|
||||
"version" => $version,
|
||||
"things" => $things,
|
||||
"customProtocol" => $customProtocol,
|
||||
"session" => $session,
|
||||
"characters" => array(),
|
||||
"account" => array(),
|
||||
"settings" => $settings,
|
||||
"features" => $features,
|
||||
"proxies" => $proxies
|
||||
);
|
||||
|
||||
$response["account"]["status"] = 0; // 0=ok, 1=frozen, 2=supsended
|
||||
$response["account"]["subStatus"] = 1; // 0=free, 1=premium
|
||||
$response["account"]["premDays"] = 65535;
|
||||
|
||||
$characters = $conn->query("select * from `players` where `account_id` = '".$acc['id']."'");
|
||||
if ($characters->num_rows == 0) {
|
||||
die(json_encode(array("error" => "Account doesn't have any characters")));
|
||||
}
|
||||
|
||||
while($character = $characters->fetch_assoc()) {
|
||||
$response["characters"][] = array(
|
||||
"name" => $character['name'],
|
||||
"worldName" => $serverName,
|
||||
"worldIp" => $serverIp,
|
||||
"worldPort" => $serverPort
|
||||
// if you are good enough and can code it in lua, you can add outfit, level, vocation, whatever you want here
|
||||
);
|
||||
}
|
||||
|
||||
echo json_encode($response);
|
||||
?>
|
@ -1,28 +0,0 @@
|
||||
<?php
|
||||
function generateRandomString($length = 6) {
|
||||
$characters = '0123456789abcdefghijklmnopqrstuvwxyz';
|
||||
$charactersLength = strlen($characters);
|
||||
$randomString = '';
|
||||
for ($i = 0; $i < $length; $i++) {
|
||||
$randomString .= $characters[rand(0, $charactersLength - 1)];
|
||||
}
|
||||
return $randomString;
|
||||
}
|
||||
|
||||
$code = generateRandomString();
|
||||
|
||||
|
||||
require_once("phpqrcode.php");
|
||||
ob_start();
|
||||
QRCode::png($code, null, QR_ECLEVEL_H, 7, 1);
|
||||
$qrcode = base64_encode( ob_get_contents() );
|
||||
ob_end_clean();
|
||||
|
||||
$data = array(
|
||||
"qrcode" => $qrcode,
|
||||
"code" => $code,
|
||||
"status" => "waiting"
|
||||
);
|
||||
|
||||
echo json_encode($data);
|
||||
?>
|
35
api/news.php
@ -1,35 +0,0 @@
|
||||
<?php
|
||||
|
||||
$news = array();
|
||||
$lang = "en";
|
||||
if(isset($_GET['lang']))
|
||||
$lang = $_GET['lang'];
|
||||
|
||||
$jokes = array();
|
||||
$jokes[] = "How do you make a tissue dance? You put a little boogie in it.";
|
||||
$jokes[] = "Why did the policeman smell bad? He was on duty.";
|
||||
$jokes[] = "Why does Snoop Dogg carry an umbrella? FO DRIZZLE!";
|
||||
$jokes[] = "Why can't you hear a pterodactyl in the bathroom? Because it has a silent pee.";
|
||||
$jokes[] = "What did the Zen Buddist say to the hotdog vendor? Make me one with everything.";
|
||||
$jokes[] = "What kind of bees make milk instead of honey? Boobies.";
|
||||
$jokes[] = "Horse walks into a bar. Bartender says, 'Why the long face?'";
|
||||
$jokes[] = "A mushroom walks into a bar. The bartender says, 'Hey, get out of here! We don't serve mushrooms here'. Mushroom says, 'why not? I'm a fungai!'";
|
||||
$jokes[] = "I never make mistakes…I thought I did once; but I was wrong.";
|
||||
$jokes[] = "What's Beethoven's favorite fruit? Ba-na-na-naaa!";
|
||||
$jokes[] = "What did the little fish say when he swam into a wall? DAM!";
|
||||
$jokes[] = "Knock knock. Who's there? Smell mop. (finish this joke in your head)";
|
||||
$jokes[] = "Where does a sheep go for a haircut? To the baaaaa baaaaa shop!";
|
||||
$jokes[] = "What does a nosey pepper do? Gets jalapeno business!";
|
||||
$jokes[] = "Your mom is so poor, she even can't pay attention";
|
||||
|
||||
$news[] = array("title" => "TEST SERVERS", "text" => "OTCLIENTV8 Accs:\nacc1/acc\nacc2/acc\nacc3/acc");
|
||||
|
||||
$news[] = array("title" => "First title",
|
||||
"text" => "This is example of lua g_http api. Those news are from http://otclient.ovh/news.php
|
||||
\nRequest was for language '".$lang."', however, there's only english version of this, don't have time to create more versions");
|
||||
$news[] = array("title" => "Random joke", "text" => $jokes[array_rand($jokes)]);
|
||||
$news[] = array("title" => "Image test", "image" => base64_encode(file_get_contents("image.png")));
|
||||
|
||||
echo json_encode($news);
|
||||
|
||||
?>
|
3312
api/phpqrcode.php
26
api/status.php
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
$online_otservlist = 0;
|
||||
try {
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, "https://otservlist.org/");
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Return data inplace of echoing on screen
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Skip SSL Verification
|
||||
curl_setopt($ch, CURLOPT_ENCODING , "");
|
||||
$site = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
|
||||
preg_match('/There are <strong>([0-9]*)<\/strong>/', $site, $matches);
|
||||
$online_otservlist = $matches[1];
|
||||
} catch(Exception $e) {}
|
||||
$online_discord = 0;
|
||||
try {
|
||||
$online_discord = json_decode(file_get_contents("https://discordapp.com/api/guilds/628769144925585428/widget.json"))->presence_count;
|
||||
} catch(Exception $e) {}
|
||||
|
||||
$response = array(
|
||||
"online" => "$online_otservlist Players online",
|
||||
"discord_online" => $online_discord,
|
||||
"discord_link" => "https://discord.gg/t4ntS5p"
|
||||
);
|
||||
echo json_encode($response);
|
||||
?>
|
@ -22,7 +22,7 @@ $data_dir = "/var/www/otclient/files";
|
||||
$things_dir = "/data/things"; // files from that dir won't be downloaded automaticly, you can set it to null to download everything automaticly (useful if you have only 1 version of data/sprites)
|
||||
$files_url = "http://otclient.ovh/files";
|
||||
$update_checksum_interval = 60; // caling updater 100x/s would lag disc, we need to cache it
|
||||
$main_files_and_dirs = array("data", "modules", "init.lua"); // used to ignore other files/dirs in data_dir
|
||||
$main_files_and_dirs = array("data", "modules", "layouts", "init.lua"); // used to ignore other files/dirs in data_dir
|
||||
|
||||
// CONFIG END
|
||||
|
||||
|
BIN
data/images/game/actionbarslot.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
data/images/game/combatmodes/pvp.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.4 KiB |
BIN
data/images/topbuttons/buttons.png
Normal file
After Width: | Height: | Size: 331 B |
BIN
data/images/ui/discord.png
Normal file
After Width: | Height: | Size: 614 B |
BIN
data/minimap.otmm
Normal file
@ -2,7 +2,7 @@ Button < UIButton
|
||||
font: verdana-11px-antialised
|
||||
color: #dfdfdfff
|
||||
size: 106 23
|
||||
text-offset: 0 0
|
||||
text-offset: 0 1
|
||||
image-source: /images/ui/button
|
||||
image-color: #dfdfdf
|
||||
image-clip: 0 0 22 23
|
||||
@ -27,6 +27,7 @@ TabButton < UIButton
|
||||
image-color: #dfdfdf
|
||||
image-clip: 0 0 22 23
|
||||
image-border: 3
|
||||
text-offset: 0 1
|
||||
icon-color: #dfdfdf
|
||||
color: #dfdfdf
|
||||
|
||||
@ -47,6 +48,7 @@ NextButton < UIButton
|
||||
image-source: /images/ui/arrow_horizontal
|
||||
image-clip: 12 0 12 21
|
||||
image-color: #ffffff
|
||||
text-offset: 0 1
|
||||
|
||||
$hover !disabled:
|
||||
image-clip: 12 21 12 21
|
||||
@ -62,6 +64,7 @@ PreviousButton < UIButton
|
||||
image-source: /images/ui/arrow_horizontal
|
||||
image-clip: 0 0 12 21
|
||||
image-color: #ffffff
|
||||
text-offset: 0 1
|
||||
|
||||
$hover !disabled:
|
||||
image-clip: 0 21 12 21
|
||||
@ -76,6 +79,7 @@ AddButton < UIButton
|
||||
size: 20 20
|
||||
image-source: /images/ui/icon_add
|
||||
image-color: #dfdfdfff
|
||||
text-offset: 0 1
|
||||
|
||||
$hover !disabled:
|
||||
image-color: #dfdfdf99
|
||||
|
@ -26,3 +26,9 @@ ProgressRect < UIProgressRect
|
||||
color: white
|
||||
background-color: #00000088
|
||||
font: verdana-11px-rounded
|
||||
|
||||
HealthBar < ProgressBar
|
||||
background-color: #ff4444
|
||||
|
||||
ManaBar < ProgressBar
|
||||
background-color: #4444ff
|
||||
|
@ -92,6 +92,9 @@ TabBarVertical < UITabBar
|
||||
anchors.right: scrollBar.left
|
||||
anchors.bottom: parent.bottom
|
||||
vertical-scrollbar: scrollBar
|
||||
margin-right: 1
|
||||
padding-top: 10
|
||||
|
||||
VerticalScrollBar
|
||||
id: scrollBar
|
||||
anchors.top: parent.top
|
||||
|
@ -60,3 +60,56 @@ TopMenuFrameCounterLabel < Label
|
||||
|
||||
TopMenuPingLabel < Label
|
||||
font: verdana-11px-rounded
|
||||
|
||||
TopMenu < TopMenuPanel
|
||||
id: topMenu
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
TopMenuButtonsPanel
|
||||
id: leftButtonsPanel
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
|
||||
TopMenuButtonsPanel
|
||||
id: leftGameButtonsPanel
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: prev.right
|
||||
visible: false
|
||||
|
||||
TopMenuFrameCounterLabel
|
||||
id: fpsLabel
|
||||
text-auto-resize: true
|
||||
anchors.top: parent.top
|
||||
anchors.left: leftGameButtonsPanel.right
|
||||
|
||||
TopMenuPingLabel
|
||||
color: white
|
||||
id: pingLabel
|
||||
text-auto-resize: true
|
||||
anchors.top: fpsLabel.bottom
|
||||
anchors.left: fpsLabel.left
|
||||
|
||||
Label
|
||||
id: onlineLabel
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
text-align: center
|
||||
text-auto-resize: true
|
||||
|
||||
TopMenuButtonsPanel
|
||||
id: rightButtonsPanel
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
|
||||
TopMenuButtonsPanel
|
||||
id: rightGameButtonsPanel
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: prev.left
|
||||
visible: false
|
@ -125,6 +125,4 @@ MiniWindowContents < ScrollablePanel
|
||||
margin-right: 1
|
||||
vertical-scrollbar: miniwindowScrollBar
|
||||
|
||||
BorderlessGameWindow < UIWindow
|
||||
focusable: false
|
||||
margin: 2
|
||||
HeadlessMiniWindow < MiniWindow
|
||||
|
5
data/styles/40-background.otui
Normal file
@ -0,0 +1,5 @@
|
||||
Background < Panel
|
||||
image-source: /images/background
|
||||
image-smooth: true
|
||||
image-fixed-ratio: true
|
||||
margin-top: 1
|
185
data/styles/40-console.otui
Normal file
@ -0,0 +1,185 @@
|
||||
ConsoleLabel < UITextEdit
|
||||
font: verdana-11px-antialised
|
||||
height: 14
|
||||
color: yellow
|
||||
margin-left: 2
|
||||
text-wrap: true
|
||||
text-auto-resize: true
|
||||
selection-color: #111416
|
||||
selection-background-color: #999999
|
||||
change-cursor-image: false
|
||||
cursor-visible: false
|
||||
editable: false
|
||||
draggable: true
|
||||
selectable: false
|
||||
focusable: false
|
||||
|
||||
ConsolePhantomLabel < UILabel
|
||||
font: verdana-11px-antialised
|
||||
height: 14
|
||||
color: yellow
|
||||
text-wrap: true
|
||||
text-auto-resize: true
|
||||
selection-color: #111416
|
||||
selection-background-color: #999999
|
||||
|
||||
ConsoleTabBar < MoveableTabBar
|
||||
height: 28
|
||||
|
||||
ConsoleTabBarPanel < MoveableTabBarPanel
|
||||
id: consoleTab
|
||||
|
||||
ScrollablePanel
|
||||
id: consoleBuffer
|
||||
anchors.fill: parent
|
||||
margin-right: 12
|
||||
vertical-scrollbar: consoleScrollBar
|
||||
layout:
|
||||
type: verticalBox
|
||||
align-bottom: true
|
||||
border-width: 1
|
||||
border-color: #202327
|
||||
background: #00000066
|
||||
inverted-scroll: true
|
||||
padding: 1
|
||||
|
||||
VerticalScrollBar
|
||||
id: consoleScrollBar
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
step: 14
|
||||
pixels-scroll: true
|
||||
|
||||
ConsoleTabBarButton < MoveableTabBarButton
|
||||
height: 28
|
||||
padding: 15
|
||||
|
||||
ConsolePanel < Panel
|
||||
image-source: /images/ui/panel_bottom
|
||||
image-border: 4
|
||||
|
||||
$first:
|
||||
anchors.fill: parent
|
||||
|
||||
$!first:
|
||||
anchors.top: prev.bottom
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
CheckBox
|
||||
id: toggleChat
|
||||
!tooltip: tr('Disable chat mode, allow to walk using ASDW')
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
margin-left: 13
|
||||
margin-top: 8
|
||||
@onCheckChange: toggleChat()
|
||||
|
||||
TabButton
|
||||
id: prevChannelButton
|
||||
icon: /images/game/console/leftarrow
|
||||
anchors.left: toggleChat.right
|
||||
anchors.top: parent.top
|
||||
margin-left: 3
|
||||
margin-top: 6
|
||||
|
||||
ConsoleTabBar
|
||||
id: consoleTabBar
|
||||
anchors.left: prev.right
|
||||
anchors.top: parent.top
|
||||
anchors.right: next.left
|
||||
margin-left: 5
|
||||
margin-top: 3
|
||||
margin-right: 5
|
||||
tab-spacing: 2
|
||||
movable: true
|
||||
|
||||
TabButton
|
||||
id: nextChannelButton
|
||||
icon: /images/game/console/rightarrow
|
||||
anchors.right: next.left
|
||||
anchors.top: parent.top
|
||||
margin-right: 5
|
||||
margin-top: 6
|
||||
|
||||
TabButton
|
||||
id: closeChannelButton
|
||||
!tooltip: tr('Close this channel') .. ' (Ctrl+E)'
|
||||
icon: /images/game/console/closechannel
|
||||
anchors.right: next.left
|
||||
anchors.top: parent.top
|
||||
enabled: false
|
||||
margin-right: 5
|
||||
margin-top: 6
|
||||
@onClick: removeCurrentTab()
|
||||
|
||||
TabButton
|
||||
id: clearChannelButton
|
||||
!tooltip: tr('Clear current message window')
|
||||
icon: /images/game/console/clearchannel
|
||||
anchors.right: next.left
|
||||
anchors.top: parent.top
|
||||
margin-right: 5
|
||||
margin-top: 6
|
||||
@onClick: |
|
||||
local consoleTabBar = self:getParent():getChildById('consoleTabBar')
|
||||
clearChannel(consoleTabBar)
|
||||
|
||||
TabButton
|
||||
id: channelsButton
|
||||
!tooltip: tr('Open new channel') .. ' (Ctrl+O)'
|
||||
icon: /images/game/console/channels
|
||||
anchors.right: next.left
|
||||
anchors.top: parent.top
|
||||
margin-right: 5
|
||||
margin-top: 6
|
||||
@onClick: g_game.requestChannels()
|
||||
|
||||
TabButton
|
||||
id: ignoreButton
|
||||
!tooltip: tr('Ignore players')
|
||||
icon: /images/game/console/ignore
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
margin-right: 5
|
||||
margin-top: 6
|
||||
@onClick: onClickIgnoreButton()
|
||||
|
||||
Panel
|
||||
id: consoleContentPanel
|
||||
anchors.top: prev.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: consoleTextEdit.top
|
||||
margin-left: 6
|
||||
margin-right: 6
|
||||
margin-bottom: 4
|
||||
margin-top: 4
|
||||
padding: 1
|
||||
focusable: false
|
||||
phantom: true
|
||||
|
||||
TabButton
|
||||
id: sayModeButton
|
||||
icon: /images/game/console/say
|
||||
!tooltip: tr('Adjust volume')
|
||||
&sayMode: 2
|
||||
size: 20 20
|
||||
anchors.left: parent.left
|
||||
anchors.bottom: parent.bottom
|
||||
margin-left: 6
|
||||
margin-bottom: 6
|
||||
@onClick: sayModeChange()
|
||||
|
||||
TextEdit
|
||||
id: consoleTextEdit
|
||||
anchors.left: sayModeButton.right
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
margin-right: 6
|
||||
margin-left: 6
|
||||
margin-bottom: 6
|
||||
shift-navigation: true
|
||||
max-length: 255
|
@ -6,14 +6,15 @@ PageButton < Button
|
||||
ContainerWindow < MiniWindow
|
||||
height: 150
|
||||
|
||||
|
||||
UIItem
|
||||
id: containerItemWidget
|
||||
virtual: true
|
||||
size: 16 16
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
margin-top: 4
|
||||
margin-left: 4
|
||||
margin-top: 1
|
||||
margin-left: 3
|
||||
|
||||
UIButton
|
||||
id: upButton
|
||||
@ -35,9 +36,14 @@ ContainerWindow < MiniWindow
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: miniwindowTopBar.bottom
|
||||
height: 20
|
||||
margin: 2 3 0 3
|
||||
margin: 1 3 0 3
|
||||
background: #00000066
|
||||
height: 20
|
||||
|
||||
$on:
|
||||
visible: true
|
||||
|
||||
$!on:
|
||||
visible: false
|
||||
|
||||
Label
|
3
data/styles/40-entergame.otui
Normal file
@ -0,0 +1,3 @@
|
||||
EnterGameWindow < StaticMainWindow
|
||||
!text: tr('Enter Game')
|
||||
size: 260 354
|
2
data/styles/40-gamebuttons.otui
Normal file
@ -0,0 +1,2 @@
|
||||
GameButtonsWindow < MiniWindow
|
||||
height: 40
|
146
data/styles/40-healthinfo.otui
Normal file
@ -0,0 +1,146 @@
|
||||
ExperienceBar < ProgressBar
|
||||
id: experienceBar
|
||||
background-color: #B6E866
|
||||
anchors.top: prev.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
margin: 1
|
||||
margin-top: 3
|
||||
|
||||
SoulLabel < GameLabel
|
||||
id: soulLabel
|
||||
text-align: right
|
||||
color: white
|
||||
font: verdana-11px-rounded
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
anchors.left: parent.horizontalCenter
|
||||
margin-top: 5
|
||||
margin-right: 3
|
||||
on: true
|
||||
|
||||
$!on:
|
||||
visible: false
|
||||
margin-top: 0
|
||||
height: 0
|
||||
|
||||
CapLabel < GameLabel
|
||||
id: capLabel
|
||||
color: white
|
||||
font: verdana-11px-rounded
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.horizontalCenter
|
||||
margin-top: 5
|
||||
margin-left: 3
|
||||
on: true
|
||||
|
||||
$!on:
|
||||
visible: false
|
||||
margin-top: 0
|
||||
height: 0
|
||||
|
||||
ConditionWidget < UIWidget
|
||||
size: 18 18
|
||||
|
||||
$!first:
|
||||
margin-left: 2
|
||||
|
||||
HealthOverlay < UIWidget
|
||||
id: healthOverlay
|
||||
anchors.fill: parent
|
||||
phantom: true
|
||||
|
||||
HealthBar
|
||||
id: topHealthBar
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.horizontalCenter
|
||||
phantom: true
|
||||
|
||||
ManaBar
|
||||
id: topManaBar
|
||||
anchors.top: parent.top
|
||||
anchors.right: parent.right
|
||||
anchors.left: parent.horizontalCenter
|
||||
phantom: true
|
||||
|
||||
UIProgressBar
|
||||
id: healthCircle
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
image-source: /images/game/circle/left_empty
|
||||
margin-right: 169
|
||||
margin-bottom: 16
|
||||
opacity: 0.5
|
||||
phantom: true
|
||||
|
||||
UIProgressBar
|
||||
id: healthCircleFront
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
image-source: /images/game/circle/left_full
|
||||
margin-right: 169
|
||||
margin-bottom: 16
|
||||
opacity: 0.5
|
||||
phantom: true
|
||||
|
||||
UIProgressBar
|
||||
id: manaCircle
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
image-source: /images/game/circle/right_empty
|
||||
margin-left: 130
|
||||
margin-bottom: 16
|
||||
opacity: 0.5
|
||||
phantom: true
|
||||
|
||||
UIProgressBar
|
||||
id: manaCircleFront
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
image-source: /images/game/circle/right_full
|
||||
margin-left: 130
|
||||
margin-bottom: 16
|
||||
opacity: 0.4
|
||||
image-color: #0000FFFF
|
||||
phantom: true
|
||||
|
||||
HealthInfoWindow < MiniWindow
|
||||
icon: /images/topbuttons/healthinfo
|
||||
!text: tr('Health Info')
|
||||
height: 123
|
||||
|
||||
MiniWindowContents
|
||||
HealthBar
|
||||
id: healthBar
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
margin: 2
|
||||
margin-top: 1
|
||||
|
||||
ManaBar
|
||||
id: manaBar
|
||||
anchors.top: prev.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
margin: 2
|
||||
|
||||
ExperienceBar
|
||||
Panel
|
||||
id: conditionPanel
|
||||
layout:
|
||||
type: horizontalBox
|
||||
height: 22
|
||||
margin-top: 4
|
||||
padding: 2
|
||||
anchors.top: prev.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
border-width: 1
|
||||
border-color: #00000077
|
||||
background-color: #ffffff11
|
||||
SoulLabel
|
||||
CapLabel
|
||||
|
299
data/styles/40-inventory.otui
Normal file
@ -0,0 +1,299 @@
|
||||
InventoryItem < Item
|
||||
$on:
|
||||
image-source: /images/ui/item-blessed
|
||||
|
||||
HeadSlot < InventoryItem
|
||||
id: slot1
|
||||
image-source: /images/game/slots/head
|
||||
&position: {x=65535, y=1, z=0}
|
||||
$on:
|
||||
image-source: /images/game/slots/head-blessed
|
||||
|
||||
BodySlot < InventoryItem
|
||||
id: slot4
|
||||
image-source: /images/game/slots/body
|
||||
&position: {x=65535, y=4, z=0}
|
||||
$on:
|
||||
image-source: /images/game/slots/body-blessed
|
||||
|
||||
LegSlot < InventoryItem
|
||||
id: slot7
|
||||
image-source: /images/game/slots/legs
|
||||
&position: {x=65535, y=7, z=0}
|
||||
$on:
|
||||
image-source: /images/game/slots/legs-blessed
|
||||
|
||||
FeetSlot < InventoryItem
|
||||
id: slot8
|
||||
image-source: /images/game/slots/feet
|
||||
&position: {x=65535, y=8, z=0}
|
||||
$on:
|
||||
image-source: /images/game/slots/feet-blessed
|
||||
|
||||
NeckSlot < InventoryItem
|
||||
id: slot2
|
||||
image-source: /images/game/slots/neck
|
||||
&position: {x=65535, y=2, z=0}
|
||||
$on:
|
||||
image-source: /images/game/slots/neck-blessed
|
||||
|
||||
LeftSlot < InventoryItem
|
||||
id: slot6
|
||||
image-source: /images/game/slots/left-hand
|
||||
&position: {x=65535, y=6, z=0}
|
||||
$on:
|
||||
image-source: /images/game/slots/left-hand-blessed
|
||||
|
||||
FingerSlot < InventoryItem
|
||||
id: slot9
|
||||
image-source: /images/game/slots/finger
|
||||
&position: {x=65535, y=9, z=0}
|
||||
$on:
|
||||
image-source: /images/game/slots/finger-blessed
|
||||
|
||||
BackSlot < InventoryItem
|
||||
id: slot3
|
||||
image-source: /images/game/slots/back
|
||||
&position: {x=65535, y=3, z=0}
|
||||
$on:
|
||||
image-source: /images/game/slots/back-blessed
|
||||
|
||||
RightSlot < InventoryItem
|
||||
id: slot5
|
||||
image-source: /images/game/slots/right-hand
|
||||
&position: {x=65535, y=5, z=0}
|
||||
$on:
|
||||
image-source: /images/game/slots/right-hand-blessed
|
||||
|
||||
AmmoSlot < InventoryItem
|
||||
id: slot10
|
||||
image-source: /images/game/slots/ammo
|
||||
&position: {x=65535, y=10, z=0}
|
||||
$on:
|
||||
image-source: /images/game/slots/ammo-blessed
|
||||
|
||||
PurseButton < UIButton
|
||||
id: purseButton
|
||||
size: 34 12
|
||||
!tooltip: tr('Open purse')
|
||||
icon-source: /images/game/slots/purse
|
||||
icon-clip: 0 0 34 12
|
||||
|
||||
$on:
|
||||
icon-clip: 0 12 34 12
|
||||
|
||||
$pressed:
|
||||
icon-clip: 0 12 34 12
|
||||
|
||||
CombatBox < UICheckBox
|
||||
size: 20 20
|
||||
image-clip: 0 0 20 20
|
||||
margin-left: 4
|
||||
|
||||
$checked:
|
||||
image-clip: 0 20 20 20
|
||||
|
||||
|
||||
InventoryButton < Button
|
||||
font: verdana-11px-antialised
|
||||
height: 18
|
||||
margin-top: 2
|
||||
text-align: center
|
||||
|
||||
SoulCapLabel < GameLabel
|
||||
text-align: center
|
||||
color: #FFFFFF
|
||||
font: cipsoftFont
|
||||
margin-top: 4
|
||||
text-offset: 0 3
|
||||
width: 36
|
||||
height: 20
|
||||
icon-source: /images/game/slots/soulcap
|
||||
|
||||
FightOffensiveBox < CombatBox
|
||||
image-source: /images/game/combatmodes/fightoffensive
|
||||
FightBalancedBox < CombatBox
|
||||
image-source: /images/game/combatmodes/fightbalanced
|
||||
FightDefensiveBox < CombatBox
|
||||
image-source: /images/game/combatmodes/fightdefensive
|
||||
ChaseModeBox < CombatBox
|
||||
image-source: /images/game/combatmodes/chasemode
|
||||
SafeFightBox < CombatBox
|
||||
image-source: /images/game/combatmodes/safefight
|
||||
|
||||
MountButton < CombatBox
|
||||
image-source: /images/game/combatmodes/mount
|
||||
|
||||
InventoryWindow < MiniWindow
|
||||
icon: /images/topbuttons/inventory
|
||||
height: 200
|
||||
id: inventoryWindow
|
||||
@onClose: modules.game_inventory.onMiniWindowClose()
|
||||
&save: true
|
||||
&autoOpen: 3
|
||||
|
||||
MiniWindowContents
|
||||
anchors.left: parent.left
|
||||
|
||||
Panel
|
||||
id: inventoryPanel
|
||||
margin-right: 63
|
||||
margin-top: 2
|
||||
anchors.fill: parent
|
||||
|
||||
HeadSlot
|
||||
anchors.top: parent.top
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
margin-top: 3
|
||||
|
||||
BodySlot
|
||||
anchors.top: prev.bottom
|
||||
anchors.horizontalCenter: prev.horizontalCenter
|
||||
margin-top: 3
|
||||
|
||||
LegSlot
|
||||
anchors.top: prev.bottom
|
||||
anchors.horizontalCenter: prev.horizontalCenter
|
||||
margin-top: 3
|
||||
|
||||
FeetSlot
|
||||
anchors.top: prev.bottom
|
||||
anchors.horizontalCenter: prev.horizontalCenter
|
||||
margin-top: 3
|
||||
|
||||
NeckSlot
|
||||
anchors.top: slot1.top
|
||||
anchors.right: slot1.left
|
||||
margin-top: 13
|
||||
margin-right: 5
|
||||
|
||||
LeftSlot
|
||||
anchors.top: prev.bottom
|
||||
anchors.horizontalCenter: prev.horizontalCenter
|
||||
margin-top: 3
|
||||
|
||||
FingerSlot
|
||||
anchors.top: prev.bottom
|
||||
anchors.horizontalCenter: prev.horizontalCenter
|
||||
margin-top: 3
|
||||
|
||||
BackSlot
|
||||
anchors.top: slot1.top
|
||||
anchors.left: slot1.right
|
||||
margin-top: 13
|
||||
margin-left: 5
|
||||
|
||||
RightSlot
|
||||
anchors.top: prev.bottom
|
||||
anchors.horizontalCenter: prev.horizontalCenter
|
||||
margin-top: 3
|
||||
|
||||
AmmoSlot
|
||||
anchors.top: prev.bottom
|
||||
anchors.horizontalCenter: prev.horizontalCenter
|
||||
margin-top: 3
|
||||
|
||||
SoulCapLabel
|
||||
id: soulLabel
|
||||
anchors.top: slot10.bottom
|
||||
anchors.horizontalCenter: slot10.horizontalCenter
|
||||
|
||||
SoulCapLabel
|
||||
id: capLabel
|
||||
anchors.top: slot9.bottom
|
||||
anchors.horizontalCenter: slot9.horizontalCenter
|
||||
|
||||
PurseButton
|
||||
anchors.left: slot3.left
|
||||
anchors.bottom: slot3.top
|
||||
margin-bottom: 3
|
||||
|
||||
Panel
|
||||
id: conditionPanel
|
||||
layout:
|
||||
type: horizontalBox
|
||||
height: 22
|
||||
padding: 2
|
||||
anchors.top: slot8.bottom
|
||||
anchors.left: slot6.left
|
||||
anchors.right: slot5.right
|
||||
margin-top: 4
|
||||
border-width: 1
|
||||
border-color: #00000077
|
||||
background-color: #ffffff22
|
||||
|
||||
Panel
|
||||
margin-top: 5
|
||||
anchors.fill: parent
|
||||
anchors.left: prev.right
|
||||
|
||||
FightOffensiveBox
|
||||
id: fightOffensiveBox
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
margin-left: 8
|
||||
|
||||
ChaseModeBox
|
||||
id: chaseModeBox
|
||||
anchors.left: prev.right
|
||||
anchors.top: parent.top
|
||||
|
||||
FightBalancedBox
|
||||
id: fightBalancedBox
|
||||
margin-top: 22
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
margin-left: 8
|
||||
|
||||
SafeFightBox
|
||||
id: safeFightBox
|
||||
margin-top: 22
|
||||
anchors.left: prev.right
|
||||
anchors.top: parent.top
|
||||
|
||||
FightDefensiveBox
|
||||
id: fightDefensiveBox
|
||||
margin-top: 44
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
margin-left: 8
|
||||
|
||||
MountButton
|
||||
id: mountButton
|
||||
margin-top: 44
|
||||
anchors.left: prev.right
|
||||
anchors.top: parent.top
|
||||
|
||||
Panel
|
||||
id: buttonsPanel
|
||||
margin-top: 4
|
||||
margin-right: 5
|
||||
anchors.fill: parent
|
||||
anchors.top: prev.bottom
|
||||
layout:
|
||||
type: verticalBox
|
||||
|
||||
UIButton
|
||||
id: buttonPvp
|
||||
height: 20
|
||||
icon: /images/game/combatmodes/pvp
|
||||
icon-clip: 0 0 42 20
|
||||
|
||||
$on:
|
||||
icon-clip: 0 20 42 20
|
||||
|
||||
InventoryButton
|
||||
!text: tr('Stop')
|
||||
@onClick: g_game.stop(); g_game.cancelAttackAndFollow()
|
||||
|
||||
InventoryButton
|
||||
!text: tr('Options')
|
||||
@onClick: modules.client_options.toggle()
|
||||
|
||||
InventoryButton
|
||||
!text: tr('Hotkeys')
|
||||
@onClick: modules.game_hotkeys.toggle()
|
||||
|
||||
InventoryButton
|
||||
!text: tr('Logout')
|
||||
@onClick: modules.game_interface.tryLogout()
|
268
data/styles/40-minimap.otui
Normal file
@ -0,0 +1,268 @@
|
||||
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: floorUpWidget
|
||||
@onClick: self:getParent():floorUp(1)
|
||||
|
||||
MinimapFloorDownButton
|
||||
id: floorDownWidget
|
||||
@onClick: self:getParent():floorDown(1)
|
||||
|
||||
MinimapZoomInButton
|
||||
id: zoomInWidget
|
||||
@onClick: self:getParent():zoomIn()
|
||||
|
||||
MinimapZoomOutButton
|
||||
id: zoomOutWidget
|
||||
@onClick: self:getParent():zoomOut()
|
||||
|
||||
MinimapResetButton
|
||||
id: resetWidget
|
||||
@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
|
||||
|
||||
MinimapWindow < MiniWindow
|
||||
height: 150
|
||||
|
||||
Label
|
||||
text: ?
|
||||
text-align: center
|
||||
phantom: false
|
||||
!tooltip: tr('Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks\nPress Ctrl+Shift+M to view the entire game map')
|
||||
anchors.top: lockButton.top
|
||||
anchors.right: lockButton.left
|
||||
margin-right: 3
|
||||
size: 14 14
|
||||
|
||||
MiniWindowContents
|
||||
Minimap
|
||||
id: minimap
|
||||
anchors.fill: parent
|
||||
|
||||
ResizeBorder
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
enabled: true
|
2
data/things/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
*
|
||||
!.gitignore
|
20
init.lua
@ -1,6 +1,7 @@
|
||||
-- CONFIG
|
||||
APP_NAME = "otclientv8" -- important, change it, it's name for config dir and files in appdata
|
||||
APP_VERSION = 1337 -- client version for updater and login to identify outdated client
|
||||
DEFAULT_LAYOUT = "retro"
|
||||
|
||||
-- If you don't use updater or other service, set it to updater = ""
|
||||
Services = {
|
||||
@ -8,18 +9,19 @@ Services = {
|
||||
updater = "",
|
||||
stats = "",
|
||||
crash = "http://otclient.ovh/api/crash.php",
|
||||
feedback = "http://otclient.ovh/api/feedback.php"
|
||||
feedback = "",
|
||||
status = "http://otclient.ovh/api/status.php"
|
||||
}
|
||||
|
||||
-- Servers accept http login url, websocket login url or ip:port:version
|
||||
Servers = {
|
||||
-- OTClientV8c = "otclient.ovh:7171:1099:25:30:80:90",
|
||||
-- OTClientV8 = "http://otclient.ovh/api/login.php",
|
||||
-- OTClientV8Websocket = "wss://otclient.ovh:3000/",
|
||||
-- OTClientV8proxy = "http://otclient.ovh/api/login.php?proxy=1",
|
||||
-- OTClientV8ClassicWithFeatures = "otclient.ovh:7171:1099:25:30:80:90",
|
||||
-- OTClientV8Classic = "otclient.ovh:7171:1099"
|
||||
-- OTClientV8Test = "http://otclient.ovh/api/login2.php",
|
||||
}
|
||||
USE_NEW_ENERGAME = false -- uses entergamev2 based on websockets instead of entergame
|
||||
|
||||
USE_NEW_ENERGAME = false -- not done yet
|
||||
ALLOW_CUSTOM_SERVERS = true -- if true it shows option ANOTHER on server list
|
||||
-- CONFIG END
|
||||
|
||||
@ -58,6 +60,14 @@ end
|
||||
-- settings
|
||||
g_configs.loadSettings("/config.otml")
|
||||
|
||||
-- set layout
|
||||
local settings = g_configs.getSettings()
|
||||
local layout = DEFAULT_LAYOUT
|
||||
if settings:exists('layout') then
|
||||
layout = settings:getValue('layout')
|
||||
end
|
||||
g_resources.setLayout(layout)
|
||||
|
||||
-- load mods
|
||||
g_modules.discoverModules()
|
||||
|
||||
|
4
layouts/README.md
Normal file
@ -0,0 +1,4 @@
|
||||
## Layouts overwrite files from `/data`
|
||||
Foe example, if you have file `/data/images/background.png` and `/layouts/dragonball/images/background.png`, and dragonball layout is selected, then `/layouts/dragonball/images/background.png` will be loaded instead of `/data/images/background.png`.
|
||||
|
||||
## Dont make layout named `default`, this name is reserved
|
BIN
layouts/retro/images/background.png
Normal file
After Width: | Height: | Size: 656 KiB |
BIN
layouts/retro/images/game/console/channels.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
layouts/retro/images/game/console/clearchannel.png
Normal file
After Width: | Height: | Size: 669 B |
BIN
layouts/retro/images/game/console/closechannel.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
layouts/retro/images/game/console/ignore.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
layouts/retro/images/game/console/leftarrow.png
Normal file
After Width: | Height: | Size: 271 B |
BIN
layouts/retro/images/game/console/rightarrow.png
Normal file
After Width: | Height: | Size: 285 B |
BIN
layouts/retro/images/game/console/say.png
Normal file
After Width: | Height: | Size: 803 B |
BIN
layouts/retro/images/game/console/trademsg.png
Normal file
After Width: | Height: | Size: 695 B |
BIN
layouts/retro/images/game/console/whisper.png
Normal file
After Width: | Height: | Size: 776 B |
BIN
layouts/retro/images/game/console/yell.png
Normal file
After Width: | Height: | Size: 849 B |
BIN
layouts/retro/images/topbuttons/analyzers.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
layouts/retro/images/topbuttons/audio.png
Normal file
After Width: | Height: | Size: 814 B |
BIN
layouts/retro/images/topbuttons/audio_mute.png
Normal file
After Width: | Height: | Size: 822 B |
BIN
layouts/retro/images/topbuttons/battle.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
layouts/retro/images/topbuttons/bot.png
Normal file
After Width: | Height: | Size: 401 B |
BIN
layouts/retro/images/topbuttons/ciclopedia.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
layouts/retro/images/topbuttons/compedium.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
layouts/retro/images/topbuttons/cooldowns.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
layouts/retro/images/topbuttons/dailyreward.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
layouts/retro/images/topbuttons/debug.png
Normal file
After Width: | Height: | Size: 1009 B |
BIN
layouts/retro/images/topbuttons/exit.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
layouts/retro/images/topbuttons/healthinfo.png
Normal file
After Width: | Height: | Size: 966 B |
BIN
layouts/retro/images/topbuttons/hotkeys.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
layouts/retro/images/topbuttons/inventory.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
layouts/retro/images/topbuttons/login.png
Normal file
After Width: | Height: | Size: 962 B |
BIN
layouts/retro/images/topbuttons/logout.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
layouts/retro/images/topbuttons/minimap.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
layouts/retro/images/topbuttons/modulemanager.png
Normal file
After Width: | Height: | Size: 952 B |
BIN
layouts/retro/images/topbuttons/motd.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
layouts/retro/images/topbuttons/options.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
layouts/retro/images/topbuttons/particles.png
Normal file
After Width: | Height: | Size: 571 B |
BIN
layouts/retro/images/topbuttons/prey.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
layouts/retro/images/topbuttons/questlog.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
layouts/retro/images/topbuttons/shop.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
layouts/retro/images/topbuttons/skills.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
layouts/retro/images/topbuttons/spelllist.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
layouts/retro/images/topbuttons/terminal.png
Normal file
After Width: | Height: | Size: 871 B |
BIN
layouts/retro/images/topbuttons/unjustifiedpoints.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
layouts/retro/images/topbuttons/viplist.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
layouts/retro/images/ui/arrow_horizontal.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
layouts/retro/images/ui/arrow_vertical.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
layouts/retro/images/ui/broder_panel.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
layouts/retro/images/ui/button.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
layouts/retro/images/ui/checkbox.png
Normal file
After Width: | Height: | Size: 526 B |
BIN
layouts/retro/images/ui/colorbox.png
Normal file
After Width: | Height: | Size: 262 B |
BIN
layouts/retro/images/ui/combobox.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
layouts/retro/images/ui/combobox_rounded.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
layouts/retro/images/ui/combobox_square.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
layouts/retro/images/ui/icon_add.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
layouts/retro/images/ui/item.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
layouts/retro/images/ui/menubarleft.png
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
layouts/retro/images/ui/menubox.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
layouts/retro/images/ui/minibroder.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
layouts/retro/images/ui/miniwindow.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
layouts/retro/images/ui/miniwindow_buttons.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
layouts/retro/images/ui/noimage.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
layouts/retro/images/ui/option_button.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
layouts/retro/images/ui/options_broder.png
Normal file
After Width: | Height: | Size: 193 B |
BIN
layouts/retro/images/ui/panel_bottom.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
layouts/retro/images/ui/panel_flat.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
layouts/retro/images/ui/panel_map.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
layouts/retro/images/ui/panel_side.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
layouts/retro/images/ui/panel_top.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
layouts/retro/images/ui/progress_icons.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
layouts/retro/images/ui/progressbar.png
Normal file
After Width: | Height: | Size: 759 B |
BIN
layouts/retro/images/ui/progressbarhpmana.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
layouts/retro/images/ui/progressbarskills.png
Normal file
After Width: | Height: | Size: 400 B |
BIN
layouts/retro/images/ui/scrollbar.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
layouts/retro/images/ui/separator_horizontal.png
Normal file
After Width: | Height: | Size: 17 KiB |