Version 2.2 - retro layout + bug fixes

This commit is contained in:
OTCv8 2020-03-31 21:34:09 +02:00
parent 1df9b82846
commit 6b39f061ae
189 changed files with 3384 additions and 4603 deletions

View File

@ -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 = {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

View File

@ -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);
?>

View File

@ -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);
?>

View File

@ -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);
?>

File diff suppressed because it is too large Load Diff

26
api/status.php Normal file
View 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);
?>

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 614 B

BIN
data/minimap.otmm Normal file

Binary file not shown.

View 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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -125,6 +125,4 @@ MiniWindowContents < ScrollablePanel
margin-right: 1
vertical-scrollbar: miniwindowScrollBar
BorderlessGameWindow < UIWindow
focusable: false
margin: 2
HeadlessMiniWindow < MiniWindow

View 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
View 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

View File

@ -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

View File

@ -0,0 +1,3 @@
EnterGameWindow < StaticMainWindow
!text: tr('Enter Game')
size: 260 354

View File

@ -0,0 +1,2 @@
GameButtonsWindow < MiniWindow
height: 40

View 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

View 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
View 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

View File

@ -1,2 +0,0 @@
*
!.gitignore

View File

@ -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
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 656 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 669 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 803 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 695 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 776 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 849 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 822 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1009 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 966 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 962 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 952 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 871 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

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