Add Essence 520 minimal DB, configs, and login/game Docker profile.

This commit is contained in:
test
2026-05-18 12:54:47 +03:00
parent a4a3a2aa09
commit 6fdbc9b103
21 changed files with 438 additions and 172 deletions
+38
View File
@@ -0,0 +1,38 @@
-- Login DB: L2J Mobius / Essence (совместимость с клиентом protocol 520).
-- Пароль: Base64(SHA1(UTF-8 пароль)) — см. LoginController Mobius.
CREATE TABLE IF NOT EXISTS accounts (
login VARCHAR(45) NOT NULL PRIMARY KEY,
password VARCHAR(45),
lastactive BIGINT,
"accessLevel" INTEGER NOT NULL DEFAULT 0,
"lastIP" VARCHAR(20),
"lastServer" INTEGER DEFAULT 1,
"pcIp" VARCHAR(20),
hop1 VARCHAR(20),
hop2 VARCHAR(20),
hop3 VARCHAR(20),
hop4 VARCHAR(20)
);
CREATE TABLE IF NOT EXISTS account_data (
account_name VARCHAR(45) NOT NULL,
var VARCHAR(20) NOT NULL,
value VARCHAR(255),
PRIMARY KEY (account_name, var),
CONSTRAINT fk_account_data_login FOREIGN KEY (account_name)
REFERENCES accounts (login) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS accounts_ipauth (
login VARCHAR(45) NOT NULL,
ip VARCHAR(15) NOT NULL,
type VARCHAR(15) NOT NULL,
PRIMARY KEY (login, ip)
);
CREATE TABLE IF NOT EXISTS gameservers (
server_id INTEGER NOT NULL PRIMARY KEY,
hexid VARCHAR(50) NOT NULL,
host VARCHAR(50) NOT NULL
);
-49
View File
@@ -1,49 +0,0 @@
-- Минимальные таблицы под логин-сервер в стиле L2J (accounts / gameservers / account_data).
-- Подходит для многих форков; у Samurai Crow/Essence могут отличаться имена колонок или хеш пароля —
-- тогда сверьте с SQL из вашей сборки и поправьте этот файл.
--
-- Тестовый логин: admin / admin
-- Хеш: Base64(SHA1 от UTF-8 строки «admin») — типично для L2J/Mobius.
-- Альтернатива (если сборка ждёт hex SHA1): замените поле password на
-- d033e22ae348aeb5660fc2140aec35850c4da997
CREATE TABLE IF NOT EXISTS accounts (
login VARCHAR(45) NOT NULL PRIMARY KEY,
password VARCHAR(128),
lastactive BIGINT,
accesslevel INTEGER NOT NULL DEFAULT 0,
lastip VARCHAR(45),
lastserver SMALLINT DEFAULT 1
);
CREATE TABLE IF NOT EXISTS account_data (
account_name VARCHAR(45) NOT NULL,
var VARCHAR(50) NOT NULL,
value VARCHAR(255),
PRIMARY KEY (account_name, var),
CONSTRAINT fk_account_data_account FOREIGN KEY (account_name)
REFERENCES accounts (login) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS gameservers (
hexid VARCHAR(255) NOT NULL,
server_id INTEGER NOT NULL PRIMARY KEY,
host VARCHAR(255) NOT NULL
);
INSERT INTO accounts (login, password, lastactive, accesslevel, lastip, lastserver)
VALUES (
'admin',
'0DPiKuNIrrVmD8IUCuw1hQxNqZc=',
(EXTRACT(EPOCH FROM NOW()) * 1000)::bigint,
0,
'127.0.0.1',
1
)
ON CONFLICT (login) DO NOTHING;
-- Игровой сервер при первом подключении к логину часто сам делает INSERT в gameservers.
-- Если нужна явная запись (hexid должен совпасть с RequestServerID / hex в конфиге GS):
-- INSERT INTO gameservers (hexid, server_id, host)
-- VALUES ('ВАШ_32_СИМВОЛА_HEX', 1, '127.0.0.1')
-- ON CONFLICT (server_id) DO UPDATE SET hexid = EXCLUDED.hexid, host = EXCLUDED.host;
@@ -0,0 +1,139 @@
-- Game DB (та же БД): минимум для экрана выбора/создания персонажа и входа в мир.
-- Полный дамп datapack ставьте поверх, если сборка Samurai Crow требует больше таблиц.
CREATE TABLE IF NOT EXISTS global_data (
var VARCHAR(255) NOT NULL PRIMARY KEY,
value TEXT
);
CREATE TABLE IF NOT EXISTS characters (
account_name VARCHAR(45),
charId INTEGER NOT NULL PRIMARY KEY,
char_name VARCHAR(35) NOT NULL,
level SMALLINT DEFAULT 1,
maxHp INTEGER DEFAULT 100,
curHp INTEGER DEFAULT 100,
maxCp INTEGER DEFAULT 100,
curCp INTEGER DEFAULT 100,
maxMp INTEGER DEFAULT 100,
curMp INTEGER DEFAULT 100,
face SMALLINT DEFAULT 0,
hairStyle SMALLINT DEFAULT 0,
hairColor SMALLINT DEFAULT 0,
sex SMALLINT DEFAULT 0,
reputation INTEGER DEFAULT 0,
fame INTEGER DEFAULT 0,
raidbossPoints INTEGER DEFAULT 0,
pvpkills INTEGER DEFAULT 0,
pkkills INTEGER DEFAULT 0,
clanid INTEGER DEFAULT 0,
race SMALLINT DEFAULT 0,
classid INTEGER DEFAULT 0,
deletetime BIGINT DEFAULT 0,
title VARCHAR(21) DEFAULT '',
accesslevel INTEGER DEFAULT 0,
online SMALLINT DEFAULT 0,
onlinetime INTEGER DEFAULT 0,
char_slot SMALLINT DEFAULT 0,
lastAccess BIGINT DEFAULT 0,
clan_privs INTEGER DEFAULT 0,
wantspeace SMALLINT DEFAULT 0,
base_class INTEGER DEFAULT 0,
x INTEGER DEFAULT -114520,
y INTEGER DEFAULT -249704,
z INTEGER DEFAULT -2984,
heading INTEGER DEFAULT 0,
createDate DATE DEFAULT CURRENT_DATE,
isIn7sDungeon SMALLINT DEFAULT 0,
in_jail SMALLINT DEFAULT 0,
jail_timer INTEGER DEFAULT 0,
powerGrade SMALLINT DEFAULT 0,
apprentice INTEGER DEFAULT 0,
sponsor INTEGER DEFAULT 0,
clan_join_expiry_time TIMESTAMP NULL,
clan_create_expiry_time TIMESTAMP NULL,
bookmarkslot SMALLINT DEFAULT 0,
vitality_points INTEGER DEFAULT 35000,
language VARCHAR(5) DEFAULT 'en'
);
CREATE INDEX IF NOT EXISTS idx_characters_account ON characters (account_name);
CREATE UNIQUE INDEX IF NOT EXISTS idx_characters_name ON characters (char_name);
CREATE TABLE IF NOT EXISTS character_subclasses (
charId INTEGER NOT NULL,
class_id INTEGER NOT NULL DEFAULT 0,
exp BIGINT DEFAULT 0,
sp BIGINT DEFAULT 0,
level INTEGER DEFAULT 1,
class_index INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (charId, class_index),
CONSTRAINT fk_subclasses_char FOREIGN KEY (charId)
REFERENCES characters (charId) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS character_skills (
charId INTEGER NOT NULL,
skill_id INTEGER NOT NULL,
skill_level INTEGER NOT NULL DEFAULT 1,
class_index INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (charId, skill_id, class_index),
CONSTRAINT fk_skills_char FOREIGN KEY (charId)
REFERENCES characters (charId) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS character_shortcuts (
charId INTEGER NOT NULL,
slot INTEGER NOT NULL,
page INTEGER NOT NULL,
type INTEGER DEFAULT 0,
shortcut_id INTEGER DEFAULT 0,
level INTEGER DEFAULT 0,
class_index INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (charId, slot, page, class_index),
CONSTRAINT fk_shortcuts_char FOREIGN KEY (charId)
REFERENCES characters (charId) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS character_variables (
charId INTEGER NOT NULL,
var VARCHAR(255) NOT NULL,
val TEXT,
PRIMARY KEY (charId, var),
CONSTRAINT fk_variables_char FOREIGN KEY (charId)
REFERENCES characters (charId) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS items (
object_id INTEGER NOT NULL PRIMARY KEY,
owner_id INTEGER NOT NULL,
item_id INTEGER NOT NULL,
count BIGINT NOT NULL DEFAULT 1,
enchant_level INTEGER DEFAULT 0,
loc VARCHAR(10) NOT NULL DEFAULT 'INVENTORY',
loc_data INTEGER DEFAULT 0
);
CREATE INDEX IF NOT EXISTS idx_items_owner ON items (owner_id);
CREATE TABLE IF NOT EXISTS clan_data (
clan_id INTEGER NOT NULL PRIMARY KEY,
clan_name VARCHAR(45) NOT NULL,
clan_level INTEGER DEFAULT 0,
reputation_score INTEGER DEFAULT 0,
hasCastle INTEGER DEFAULT 0,
blood_alliance INTEGER DEFAULT 0,
blood_oath INTEGER DEFAULT 0,
ally_id INTEGER DEFAULT 0,
ally_name VARCHAR(45) DEFAULT '',
leader_id INTEGER DEFAULT 0,
crest_id INTEGER DEFAULT 0,
crest_large_id INTEGER DEFAULT 0,
ally_crest_id INTEGER DEFAULT 0,
auction_bid_at INTEGER DEFAULT 0,
ally_penalty_expiry_time BIGINT DEFAULT 0,
ally_penalty_type SMALLINT DEFAULT 0,
char_penalty_expiry_time BIGINT DEFAULT 0,
dissolving_expiry_time BIGINT DEFAULT 0,
new_leader_id INTEGER DEFAULT 0
);
-8
View File
@@ -1,8 +0,0 @@
#!/bin/sh
# Выдаёт владельца таблиц логина роли из POSTGRES_USER (см. docker-compose).
set -eu
psql -v ON_ERROR_STOP=1 --username "postgres" --dbname "$POSTGRES_DB" <<-EOSQL
ALTER TABLE IF EXISTS accounts OWNER TO "${POSTGRES_USER}";
ALTER TABLE IF EXISTS account_data OWNER TO "${POSTGRES_USER}";
ALTER TABLE IF EXISTS gameservers OWNER TO "${POSTGRES_USER}";
EOSQL
+33
View File
@@ -0,0 +1,33 @@
-- Тестовые данные: Essence protocol 520 (логин + регистрация GS).
-- Логины: admin/admin, test/test
-- Hexid совпадает с server/hexid/default.txt
INSERT INTO global_data (var, value)
VALUES ('essence_protocol', '520')
ON CONFLICT (var) DO UPDATE SET value = EXCLUDED.value;
INSERT INTO accounts (login, password, lastactive, "accessLevel", "lastIP", "lastServer")
VALUES
(
'admin',
'0DPiKuNIrrVmD8IUCuw1hQxNqZc=',
(EXTRACT(EPOCH FROM NOW()) * 1000)::bigint,
100,
'127.0.0.1',
1
),
(
'test',
'qUqP5cyxm6YcTAhz05Hph5gvu9M=',
(EXTRACT(EPOCH FROM NOW()) * 1000)::bigint,
0,
'127.0.0.1',
1
)
ON CONFLICT (login) DO NOTHING;
-- RequestServerID = 1, hex из server/hexid/default.txt
INSERT INTO gameservers (server_id, hexid, host)
VALUES (1, 'a1b2c3d4e5f6789012345678901234ef', '127.0.0.1')
ON CONFLICT (server_id) DO UPDATE
SET hexid = EXCLUDED.hexid, host = EXCLUDED.host;
+14
View File
@@ -0,0 +1,14 @@
#!/bin/sh
# Владелец всех таблиц public → POSTGRES_USER (после всех *.sql).
set -eu
psql -v ON_ERROR_STOP=1 --username "postgres" --dbname "$POSTGRES_DB" <<-EOSQL
DO \$\$
DECLARE
t text;
BEGIN
FOR t IN SELECT tablename FROM pg_tables WHERE schemaname = 'public'
LOOP
EXECUTE format('ALTER TABLE IF EXISTS %I OWNER TO %I', t, '${POSTGRES_USER}');
END LOOP;
END \$\$;
EOSQL