feat: Fixes in DB engines, SQL queries, added and improved Python management scripts, changed max level.

This commit is contained in:
Mind Rapist
2025-11-14 17:51:57 +02:00
parent 7a11534957
commit 3c8089c443
11 changed files with 293 additions and 72 deletions

View File

@@ -1 +1,30 @@
# m2dev-server
# Server Repository
This repository contains the core server files and configurations. It includes fixes for database performance, quest logic, and crucial setup scripts.
---
## ✨ Key Updates and Fixes
The following changes have been implemented to improve stability, performance, and development workflow:
### ⚙️ Initial Setup & Build Process
* **NEW Script: `clear.py`:** Added an up-to-date script for comprehensive cleanup of log, PID, and temporary files across channels and the database.
* **NEW Script: `perms.py`:** Added a script to automatically assign necessary permissions to all compiled binaries (`game`, `db` and `qc`).
* ⚠️ **Action Required:** The `perms.py` script uses `os.getcwd()` to determine the root path. **You must run this script from your game's root directory (e.g., `/usr/home/game`) for it to function correctly.**
* **Fix: `install.py`:** Corrected the script to properly create the `data/package` folder and ensure it is symbolically linked across all channels.
* **Configuration: `conf/game.txt`:** Changed the maximum character level supported in the server configuration to **120**.
### 🐍 Core Logic & Quest Engine
* **Fix: `make.py` (Quest Compilation):** Fixed a critical logic bug (missing `else` assignment) in `share/locale/[xxx]/quest/make.py` that was causing compiled quests and dialogs to be unresponsive in-game.
* **Fix: `pre_qc.py` (Quest Pre-processing):** Resolved a syntax error in `share/locale/[xxx]/quest/pre_qc.py` by specifying the correct encoding option when reading files.
### 💾 Database Performance & Integrity
* **Performance:** Replaced the default database engine on most tables with either **Aria** (for high-read tables like `item_proto`, `mob_proto`) or **InnoDB** (for high-write tables like `item`, `affect`).
* *Note: Most `log` tables retain the default **MyISAM** engine due to compatibility requirements.*
* **Integrity Fix:** Corrected a syntax error in the `item_proto` section of `sql/player.sql` where a single quote (`'`) was missing from the "Bambi Seal" item insert query.
* **Bug fix:** A fix was applied to the `MOV_SPEED` value for skill 19 in the `skill_proto` table to prevent characters from becoming immobile during the effect.
* **Updates:** All `.sql` files (`account.sql`, `common.sql`, `log.sql`, `player.sql`) are updated with the new engine and functioning query settings.

103
clear.py Normal file
View File

@@ -0,0 +1,103 @@
#!/usr/bin/env python3
import os
import sys
import shutil # Import shutil for recursive directory deletion
def print_green(text):
print("\033[1;32m" + text + "\033[0m")
def print_magenta_prompt():
print("\033[0;35m> ", end="", flush=True)
def main():
"""
Cleans up specified files from the game server's channels directory.
"""
# List of files to remove, including file extensions.
FILES_TO_CLEAN = ['.core', 'syserr.log', 'syslog.log', '.txt', 'pid', 'stdout']
# 🌟 NEW: File in the current directory to remove
ROOT_FILES_TO_CLEAN = ['pids.json']
# The base directory to start the cleanup from.
# This assumes the script is run from the root of the game installation.
root_dir = os.getcwd() # The script's execution directory
base_dir = os.path.join(root_dir, 'channels')
print_green("Starting cleanup...")
# --- 1. Clean up files in the root directory (where 'channels' is) ---
print(f"Scanning '{root_dir}' for root files...")
for filename in ROOT_FILES_TO_CLEAN:
file_path = os.path.join(root_dir, filename)
if os.path.exists(file_path):
try:
os.remove(file_path)
print(f" - Removed '{filename}' from root.")
except OSError as e:
print(f" - Error removing '{filename}': {e}")
# --- 2. Clean up 'channels' directory and its subdirectories ---
print_green("Starting cleanup in '" + base_dir + "'...")
if not os.path.exists(base_dir):
print(f"Error: Directory '{base_dir}' not found.")
sys.exit(1)
# Use os.walk to recursively search for files.
for root, dirs, files in os.walk(base_dir, topdown=False):
# Determine if the current directory is a target for cleanup.
is_target_dir = False
if os.path.basename(root) in ['auth', 'db']:
is_target_dir = True
elif os.path.basename(os.path.dirname(root)).startswith('channel') and os.path.basename(root).startswith('core'):
is_target_dir = True
if is_target_dir:
print(f"\nScanning '{os.path.relpath(root, base_dir)}'...")
# 🌟 NEW: Empty the 'log' subdirectory if it exists
log_dir_path = os.path.join(root, 'log')
if os.path.exists(log_dir_path) and os.path.isdir(log_dir_path):
print(f"\nScanning '{os.path.relpath(root, base_dir)}'...")
print(f" - Cleaning 'log' directory in '{os.path.relpath(root, base_dir)}'")
try:
# Iterate over all files and directories inside the 'log' folder
for item in os.listdir(log_dir_path):
item_path = os.path.join(log_dir_path, item)
if os.path.isdir(item_path):
# If it's a directory, recursively delete it
shutil.rmtree(item_path)
print(f" - Removed directory: '{item}'")
else:
# If it's a file, delete the file
os.remove(item_path)
print(f" - Removed file: '{item}'")
except OSError as e:
print(f" - Error cleaning 'log' directory at '{os.path.relpath(log_dir_path, base_dir)}': {e}")
for filename in files:
for file_to_clean in FILES_TO_CLEAN:
if filename.endswith(file_to_clean):
file_path = os.path.join(root, filename)
try:
os.remove(file_path)
print(f" - Removed '{os.path.relpath(file_path, base_dir)}'")
except OSError as e:
print(f" - Error removing '{file_path}': {e}")
print_green("\nCleanup complete.")
if __name__ == "__main__":
try:
main()
finally:
print("\033[0m", end="", flush=True)

View File

@@ -57,6 +57,7 @@ def setup_links_game(target_dir, name):
try_symlink(os.path.join(GAMEDIR, "share", "data"), "data", is_dir=True)
try_symlink(os.path.join(GAMEDIR, "share", "locale"), "locale", is_dir=True)
try_symlink(os.path.join(GAMEDIR, "share", "mark"), "mark", is_dir=True)
try_symlink(os.path.join(GAMEDIR, "share", "package"), "package", is_dir=True)
try_symlink(os.path.join(GAMEDIR, "share", "bin", "game"), name, is_dir=False)
# Helper function to create symlinks cross-platform
@@ -86,6 +87,9 @@ if os.path.exists(channels_dir):
print_green("> Clearing up channels...")
shutil.rmtree(channels_dir)
package_dir = os.path.join(GAMEDIR, "share", "package")
if not os.path.exists(package_dir):
os.makedirs(package_dir)
## DB Setup
print_green("> Setting up environment for the DB Cache...")
db_dir = os.path.join(GAMEDIR, "channels", "db")

66
perms.py Normal file
View File

@@ -0,0 +1,66 @@
#!/usr/bin/env python3
import os
import sys
# Define the root directory of your game.
# Change this line to your desired path.
GAME_ROOT_DIR = os.getcwd()
# --- Derived Paths (Do not change below this line) ---
DB_ROOT_DIR = '/var/db/mysql'
GAME_BIN_DIR = os.path.join(GAME_ROOT_DIR, 'share', 'bin')
def set_permissions(path: str, permission_code: int) -> None:
"""
Sets the specified permission code on a given file.
"""
if os.name == "nt":
pass
else:
try:
os.chmod(path, permission_code)
print(f" - Changed permissions on: {path}")
except OSError as e:
print(f" - ERROR: Failed to change permissions on {path}: {e}")
def main():
"""
Main function to set permissions on specified files and directories.
"""# Only attempt to set permissions on Unix-like systems, not Windows (os.name == "nt")
if os.name == "nt":
print(f"Skipped setting Unix permissions on Windows for: {os.path.basename(path)}.")
else:
# 777 in octal
permission_code = 0o777
# --- Section 1: Set permissions for files inside /var/db/mysql subdirectories ---
print(f"Setting permissions on files within subdirectories of '{DB_ROOT_DIR}'...")
if not os.path.isdir(DB_ROOT_DIR):
print(f"ERROR: '{DB_ROOT_DIR}' not found. Skipping.")
else:
# Use os.walk to go through all directories and files.
for root, dirs, files in os.walk(DB_ROOT_DIR):
# Check if the current directory is not the root itself
if root != DB_ROOT_DIR:
for file in files:
file_path = os.path.join(root, file)
set_permissions(file_path, permission_code)
# --- Section 2: Set permissions for game and db binaries ---
print(f"\nSetting permissions on 'game' and 'db' binaries in '{GAME_BIN_DIR}'...")
binaries_to_set = ['game', 'db']
if not os.path.isdir(GAME_BIN_DIR):
print(f"ERROR: '{GAME_BIN_DIR}' not found. Skipping.")
else:
for binary in binaries_to_set:
binary_path = os.path.join(GAME_BIN_DIR, binary)
if os.path.isfile(binary_path):
set_permissions(binary_path, permission_code)
else:
print(f" - Skipping: '{binary}' not found at '{binary_path}'")
print("\nPermission changes complete.")
if __name__ == "__main__":
main()

View File

@@ -16,4 +16,4 @@ SPEEDHACK_LIMIT_COUNT: 300
SPEEDHACK_LIMIT_BONUS: 80
PK_PROTECT_LEVEL: 15
MALL_URL: example.com
MAX_LEVEL: 105
MAX_LEVEL: 120

View File

@@ -29,6 +29,18 @@ def main() -> None:
else:
pre_qc_dir.mkdir(parents=True, exist_ok=True)
# --- ADDED FIXES BELOW ---
import grp # Need to import grp for proper chown/chgrp logic
# 1. Set Group Ownership (equivalent to chgrp quest object)
# NOTE: You must know the numerical GID of the 'quest' group.
# A simpler shell-based approach is often safer in Python:
os.system('chgrp quest ' + str(object_dir))
# 2. Set Permissions (equivalent to chmod -R 770 object)
os.system('chmod -R 770 ' + str(object_dir))
# --- END ADDED FIXES ---
qc_exe = script_dir / ("qc.exe" if sys.platform.startswith("win") else "qc")
with open("locale_list") as file:
@@ -37,6 +49,8 @@ def main() -> None:
r = pre_qc.run(line)
if r:
filename = os.path.join("pre_qc", line)
else:
filename = line
subprocess.run([str(qc_exe), str(filename.strip())], check=True)

View File

@@ -166,8 +166,13 @@ def run(filename):
filename = filename.strip("\n")
if filename == "":
return
with open(filename, "r") as fh:
try:
with open(filename, "r", encoding='utf-8') as fh:
lines = fh.readlines()
except UnicodeDecodeError:
with open(filename, "r", encoding='latin1') as fh:
lines = fh.readlines()
start = MakeParameterTable(lines, parameter_table, keys)
if len(keys) == 0:

View File

@@ -48,11 +48,11 @@ CREATE TABLE `account` (
`total_mileage` int(11) NOT NULL DEFAULT 0,
`channel_company` varchar(30) NOT NULL DEFAULT '',
`ip` varchar(255) DEFAULT NULL,
`last_play` datetime NOT NULL,
`last_play` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `login` (`login`) USING BTREE,
KEY `social_id` (`social_id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=ascii COLLATE=ascii_general_ci ROW_FORMAT=DYNAMIC;
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=ascii COLLATE=ascii_general_ci ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -61,7 +61,7 @@ CREATE TABLE `account` (
LOCK TABLES `account` WRITE;
/*!40000 ALTER TABLE `account` DISABLE KEYS */;
INSERT INTO `account` VALUES (1,'admin','*CC67043C7BCFF5EEA5566BD9B1F3C74FD9A5CF5D','1234567','','0000-00-00 00:00:00',0,'OK','',0,0,0,'0000-00-00 00:00:00',0,1650,'0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00',0,0,'',NULL,'2021-11-21 20:10:46'),(2,'test','*CC67043C7BCFF5EEA5566BD9B1F3C74FD9A5CF5D','1234567','','0000-00-00 00:00:00',0,'OK','',0,0,0,'0000-00-00 00:00:00',0,0,'0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00',0,0,'',NULL,'2021-08-06 11:42:12');
INSERT INTO `account` VALUES (1,'admin','*CC67043C7BCFF5EEA5566BD9B1F3C74FD9A5CF5D','1234567','','0000-00-00 00:00:00',0,'OK',0,0,0,'0000-00-00 00:00:00',0,1650,'0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00',0,0,'',NULL,'2021-11-21 20:10:46'),(2,'test','*CC67043C7BCFF5EEA5566BD9B1F3C74FD9A5CF5D','1234567','','0000-00-00 00:00:00',0,'OK','',0,0,0,'0000-00-00 00:00:00',0,0,'0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00',0,0,'',NULL,'2021-08-06 11:42:12');
/*!40000 ALTER TABLE `account` ENABLE KEYS */;
UNLOCK TABLES;
@@ -79,7 +79,7 @@ CREATE TABLE `gametime` (
`LimitDt` datetime DEFAULT '1990-01-01 00:00:00',
`Scores` int(11) DEFAULT 0,
PRIMARY KEY (`UserID`)
) ENGINE=MyISAM DEFAULT CHARSET=euckr COLLATE=euckr_korean_ci;
) ENGINE=InnoDB DEFAULT CHARSET=euckr COLLATE=euckr_korean_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -111,7 +111,7 @@ CREATE TABLE `gametimeip` (
PRIMARY KEY (`ipid`),
UNIQUE KEY `ip_uniq` (`ip`,`startIP`,`endIP`),
KEY `ip_idx` (`ip`)
) ENGINE=MyISAM DEFAULT CHARSET=euckr COLLATE=euckr_korean_ci;
) ENGINE=InnoDB DEFAULT CHARSET=euckr COLLATE=euckr_korean_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -139,7 +139,7 @@ CREATE TABLE `gametimelog` (
`ip` varchar(15) NOT NULL DEFAULT '000.000.000.000',
`server` varchar(32) NOT NULL DEFAULT '',
KEY `login_key` (`login`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 COLLATE=gb2312_chinese_ci;
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 COLLATE=gb2312_chinese_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -162,7 +162,7 @@ CREATE TABLE `string` (
`name` varchar(64) NOT NULL DEFAULT '',
`text` text DEFAULT NULL,
PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--

View File

@@ -24,7 +24,7 @@ DROP TABLE IF EXISTS `gmhost`;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `gmhost` (
`mIP` varchar(16) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -52,7 +52,7 @@ CREATE TABLE `gmlist` (
`mServerIP` varchar(16) NOT NULL DEFAULT 'ALL',
`mAuthority` enum('IMPLEMENTOR','HIGH_WIZARD','GOD','LOW_WIZARD','PLAYER') DEFAULT 'PLAYER',
PRIMARY KEY (`mID`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
) ENGINE=Aria AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -76,7 +76,7 @@ CREATE TABLE `locale` (
`mKey` varchar(255) NOT NULL DEFAULT '',
`mValue` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`mKey`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -101,7 +101,7 @@ CREATE TABLE `spam_db` (
`word` varchar(256) NOT NULL,
`score` int(11) NOT NULL DEFAULT 10,
PRIMARY KEY (`word`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--

View File

@@ -26,7 +26,7 @@ CREATE TABLE `bootlog` (
`time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`hostname` char(128) NOT NULL DEFAULT 'UNKNOWN',
`channel` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=MyISAM DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=FIXED;
) ENGINE=Aria DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=FIXED;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -137,7 +137,7 @@ CREATE TABLE `dragon_slay_log` (
`vnum` int(11) unsigned NOT NULL,
`start_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`end_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=FIXED;
) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=FIXED;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -165,7 +165,7 @@ CREATE TABLE `fish_log` (
`waiting_time` int(11) NOT NULL DEFAULT 0,
`success` tinyint(4) NOT NULL DEFAULT 0,
`size` smallint(6) NOT NULL DEFAULT 0
) ENGINE=MyISAM DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=FIXED;
) ENGINE=Aria DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=FIXED;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -222,7 +222,7 @@ CREATE TABLE `hack_crc_log` (
`server` char(100) NOT NULL DEFAULT '',
`why` char(255) NOT NULL DEFAULT '',
`crc` int(11) NOT NULL DEFAULT 0
) ENGINE=MyISAM DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=FIXED;
) ENGINE=Aria DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=FIXED;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -248,7 +248,7 @@ CREATE TABLE `hack_log` (
`ip` char(15) NOT NULL DEFAULT '',
`server` char(100) NOT NULL DEFAULT '',
`why` char(255) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=FIXED;
) ENGINE=Aria DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=FIXED;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -274,7 +274,7 @@ CREATE TABLE `hackshield_log` (
`name` varchar(25) DEFAULT NULL,
`time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`reason` varchar(25) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC;
) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -301,7 +301,7 @@ CREATE TABLE `levellog` (
`account_id` int(11) NOT NULL,
`pid` int(11) NOT NULL,
PRIMARY KEY (`name`,`level`)
) ENGINE=MyISAM DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=FIXED;
) ENGINE=Aria DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=FIXED;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -395,7 +395,7 @@ CREATE TABLE `loginlog2` (
`logout_time` datetime DEFAULT NULL,
`playtime` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -449,7 +449,7 @@ CREATE TABLE `pcbang_loginlog` (
PRIMARY KEY (`id`),
KEY `pid` (`pid`) USING BTREE,
KEY `pcbang_id` (`pcbang_id`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=DYNAMIC;
) ENGINE=InnoDB DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -474,7 +474,7 @@ CREATE TABLE `playercount` (
`count_yellow` int(11) DEFAULT NULL,
`count_blue` int(11) DEFAULT NULL,
`count_total` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=FIXED;
) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=FIXED;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -502,7 +502,7 @@ CREATE TABLE `quest_reward_log` (
`reward_value2` int(11) DEFAULT NULL,
`time` datetime DEFAULT NULL,
KEY `player_id` (`player_id`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=DYNAMIC;
) ENGINE=InnoDB DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -529,7 +529,7 @@ CREATE TABLE `refinelog` (
`time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`is_success` tinyint(1) NOT NULL DEFAULT 0,
`setType` set('SOCKET','POWER','ROD','GUILD','SCROLL','HYUNIRON','GOD_SCROLL','MUSIN_SCROLL') DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=DYNAMIC;
) ENGINE=InnoDB DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -554,7 +554,7 @@ CREATE TABLE `shout_log` (
`empire` tinyint(4) DEFAULT NULL,
`shout` varchar(350) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
KEY `time_idx` (`time`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=DYNAMIC;
) ENGINE=InnoDB DEFAULT CHARSET=big5 COLLATE=big5_chinese_ci ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -579,7 +579,7 @@ CREATE TABLE `speed_hack` (
`x` int(11) DEFAULT NULL,
`y` int(11) DEFAULT NULL,
`hack_count` varchar(20) CHARACTER SET big5 COLLATE big5_bin DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC;
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;
--

File diff suppressed because one or more lines are too long