µ±ÀÏ·þÎñ¶ËÓöµ½Ð¿ͻ§¶Ë£¬Èý²½½â¾öµØÍ¼²»Æ¥Åä/×°±¸Ïûʧ/¼¼ÄÜ´íÂÒ£¡
🔄 Ò»¡¢°æ±¾²îÒìºËÐĶÔÕÕ±í
¹¦ÄÜÄ£¿é V155£¨¾µä¶Ë£© V176£¨Ð·ÉÌì¶Ë£© ¼æÈÝ´¦Àí·½°¸
µØÍ¼Îļþ .map£¨¶ÀÁ¢Îļþ£© .scene£¨³¡¾°°ü¸ñʽ£© ʹÓÃת»»¹¤¾ß MapConverter
×°±¸ÏµÍ³ Ç¿»¯+10·â¶¥ Æ÷ÆÇ+ÉñÒþÉý¼¶ Êý¾Ý¿â×Ö¶ÎÓ³É䣨¼ûµÚÈýÕ£©
ÇṦ»úÖÆ Èý¶ÎÌøÔ¾ ×ÔÓÉ·ÉÐÐϵͳ ¹Ø±Õж˷ÉÐй¦ÄÜ
Êý¾Ý´æ´¢ MySQLµ¥¿â MongoDB·ÖƬ Öмä¼þͬ²½Ð´È루µÚËÄÕ£©
⚙️ ¶þ¡¢·þÎñ¶ËÉý¼¶¹Ø¼ü²Ù×÷
▶️ Step 1£ººËÐÄÎļþÇ¨ÒÆ£¨±£Êý¾Ý²»¶ª£©
Êý¾Ý¿âת»»½Å±¾£¨MySQL → MongoDB£©£º
# mysql2mongo.py ºËÐÄÆ¬¶Î
for row in mysql_cursor.execute("SELECT * FROM equipment"):
mongo_db.equip.insert_one({
"old_id": row["id"],
"new_id": get_mapped_id(row["type"]), # ת»»×°±¸ID
"stats": convert_stats(row["attrs"]) # ÊôÐÔÖØÓ³Éä
})
https://github.com/zx-migrate/tools
µØÍ¼¸ñʽÅúÁ¿×ª»»£º
./MapConverter -i /old/maps -o /new/scenes \
-t v155_to_v176 --force # Ç¿ÖÆ¸²¸Ç¾ÉÎļþ
▶️ Step 2£º°æ±¾ÌØÐÔ¿ª¹ØÅäÖÃ
·þÎñ¶Ë global.conf ¹Ø¼üÉèÖÃ
[Compatibility]
enable_new_flight = 0 ; ¹Ø±Õ×ÔÓÉ·ÉÐУ¨0=¾µäÈý¶ÎÌø£©
equip_system_mode = 1 ; 1=ÀÏÇ¿»¯ÏµÍ³ 2=ÐÂÆ÷ÆÇϵͳ
allow_unreleased_maps = 0 ; ½ûÖ¹½øÈëδת»»µÄµØÍ¼
📦 Èý¡¢¿ç°æ±¾ÎïÆ·¼æÈÝ·½°¸
🔧 1. ×°±¸ÊôÐÔת»»ÔÀí
graph LR
A[V155Ѫ¼ÀÎäÆ÷] -->ת»»¹æÔò
B{ÊÇ·ñж˴æÔÚ}
-->ÊÇ
C[Ó³ÉäΪV176“ÁúÆÇ×°±¸”]
-->·ñ
D[ÉèΪ“ÌØÊ⻳¾É×°±¸”]
--> E[ÊôÐÔ±ÈÀýËõ·Å *0.8]
--> F[±£ÁôÔÊôÐÔ+ÌØÊâͼ±ê]
⚠️ 2. ¸ßΣÎïÆ·´¦ÀíÇåµ¥
ÎïÆ·ÀàÐÍ ½â¾ö·½°¸ Êý¾Ý¿â²Ù×÷ʾÀý
ÒѾø°æ×øÆï Ìæ»»ÎªÍ¨ÓÃÄ£ÐÍ UPDATE items SET model_id=5000 WHERE type=3;
Ç¿»¯+15×°±¸ ½µ¼¶Îª+10+ÌØÊâ¹âЧ SET enhance=10, effect=102
¾É°æÈÎÎñµÀ¾ß ²¹·¢¶ÔÓ¦ÐÂÈÎÎñÁ´ÎïÆ· Ö´ÐÐ item_mapping.json
🌐 ËÄ¡¢Ë«¶Ë»ìºÏ¼Ü¹¹²¿Êð£¨Ê¡Ç®·½°¸£©
¼Ü¹¹Í¼£º
¿Í»§¶ËV176 ——→ Íø¹Ø·þÎñÆ÷£¨ÐÒéת»»£©
↓
V155ÓÎÏ··þÎñÆ÷£¨¾µäÇø£©←©¤→ MongoDB
V176ÓÎÏ··þÎñÆ÷£¨ÐÂÇø£©←©¤©¤©¤©¤©¤©¼
Íø¹ØÐÒéת»»ºËÐÄÂß¼£º
// ´¦ÀíV176¿Í»§¶ËµÄÒÆ¶¯·â°ü
void HandleMovePacket(Packet* pkt) {
if (player.zone_id == CLASSIC_ZONE) { // ¾µäÇøÍæ¼Ò
ConvertPos(&pkt->pos); // ×ø±êת»»
SendToV155Server(pkt); // ת·¢¾É·þÎñ¶Ë
else {
SendToV176Server(pkt); // ÐÂÇøÖ±½Óת·¢
}
💥 Îå¡¢¸ßƵ±¨´í½â¾ö·½°¸
´íÎóÏÖÏó ¸ù±¾ÔÒò ÐÞ¸´·½°¸
½øÈëеØÍ¼ºÚÆÁ ³¡¾°ÎļþδÉú³É Ö´ÐÐ SceneBuilder -f missing_list.txt
¼¼ÄÜÌØÐ§´íÂÒ ÌØÐ§ID³åÍ» ÐÞ¸Ä effect.conf ÖØÅÅIDÇø¼ä
»³¾É×°±¸ÊôÐÔÒì³£ Êý¾Ý¿âδÉèÖÃת»»±êʶ ALTER TABLE equip ADD is_legacy TINYINT(1) DEFAULT 0;
Ë«¶ËÍæ¼ÒÎÞ·¨×é¶Ó ¶ÓÎéÐÒé°æ±¾²»¼æÈÝ Íø¹ØÇ¿ÖÆÍ³Ò»ÐÒé°æ±¾Îª v155
⚠️ Áù¡¢·¨Âɹæ±ÜÖØµãÌáÐÑ
°æ±¾¼æÈÝ ≠ ºÏ·¨»¯£º
½öת»»×ÔÓзþÎñ¶Ë£¨ÑϽû·Ö·¢×ª»»¹¤¾ß°üº¬¹Ù·½×ÊÔ´£©
Íæ¼ÒÊý¾ÝÍÑÃô£º
-- Ç¨ÒÆºóÁ¢¼´Ö´ÐÐ
DELETE FROM users WHERE last_login < '2020-01-01';
UPDATE accounts SET phone=NULL;
ÃüÃû¹æ·¶£º
ÓÎÏ·Æô¶¯½çÃæÈ¥³ý “ÖïÏÉ” ×ÖÑù
NPC¶Ô»°Îı¾Ìæ»» “ÇàÔÆÃÅ” → “ÔÆ½£×Ú”
🔧 ¸½£º±Ø±¸×ÊÔ´°ü
×Ô¶¯»¯Ç¨Òƹ¤¾ß°ü£º
MapConverter : µØÍ¼¸ñʽת»»Æ÷
ProtocolAdapter : Ë«¶ËÐÒéÍø¹Ø
IDMapper : ×°±¸/¼¼ÄÜIDÓ³Éä¿â
🔄 Ò»¡¢°æ±¾²îÒìºËÐĶÔÕÕ±í
¹¦ÄÜÄ£¿é V155£¨¾µä¶Ë£© V176£¨Ð·ÉÌì¶Ë£© ¼æÈÝ´¦Àí·½°¸
µØÍ¼Îļþ .map£¨¶ÀÁ¢Îļþ£© .scene£¨³¡¾°°ü¸ñʽ£© ʹÓÃת»»¹¤¾ß MapConverter
×°±¸ÏµÍ³ Ç¿»¯+10·â¶¥ Æ÷ÆÇ+ÉñÒþÉý¼¶ Êý¾Ý¿â×Ö¶ÎÓ³É䣨¼ûµÚÈýÕ£©
ÇṦ»úÖÆ Èý¶ÎÌøÔ¾ ×ÔÓÉ·ÉÐÐϵͳ ¹Ø±Õж˷ÉÐй¦ÄÜ
Êý¾Ý´æ´¢ MySQLµ¥¿â MongoDB·ÖƬ Öмä¼þͬ²½Ð´È루µÚËÄÕ£©
⚙️ ¶þ¡¢·þÎñ¶ËÉý¼¶¹Ø¼ü²Ù×÷
▶️ Step 1£ººËÐÄÎļþÇ¨ÒÆ£¨±£Êý¾Ý²»¶ª£©
Êý¾Ý¿âת»»½Å±¾£¨MySQL → MongoDB£©£º
# mysql2mongo.py ºËÐÄÆ¬¶Î
for row in mysql_cursor.execute("SELECT * FROM equipment"):
mongo_db.equip.insert_one({
"old_id": row["id"],
"new_id": get_mapped_id(row["type"]), # ת»»×°±¸ID
"stats": convert_stats(row["attrs"]) # ÊôÐÔÖØÓ³Éä
})
https://github.com/zx-migrate/tools
µØÍ¼¸ñʽÅúÁ¿×ª»»£º
./MapConverter -i /old/maps -o /new/scenes \
-t v155_to_v176 --force # Ç¿ÖÆ¸²¸Ç¾ÉÎļþ
▶️ Step 2£º°æ±¾ÌØÐÔ¿ª¹ØÅäÖÃ
·þÎñ¶Ë global.conf ¹Ø¼üÉèÖÃ
[Compatibility]
enable_new_flight = 0 ; ¹Ø±Õ×ÔÓÉ·ÉÐУ¨0=¾µäÈý¶ÎÌø£©
equip_system_mode = 1 ; 1=ÀÏÇ¿»¯ÏµÍ³ 2=ÐÂÆ÷ÆÇϵͳ
allow_unreleased_maps = 0 ; ½ûÖ¹½øÈëδת»»µÄµØÍ¼
📦 Èý¡¢¿ç°æ±¾ÎïÆ·¼æÈÝ·½°¸
🔧 1. ×°±¸ÊôÐÔת»»ÔÀí
graph LR
A[V155Ѫ¼ÀÎäÆ÷] -->ת»»¹æÔò
B{ÊÇ·ñж˴æÔÚ}
-->ÊÇ
C[Ó³ÉäΪV176“ÁúÆÇ×°±¸”]
-->·ñ
D[ÉèΪ“ÌØÊ⻳¾É×°±¸”]
--> E[ÊôÐÔ±ÈÀýËõ·Å *0.8]
--> F[±£ÁôÔÊôÐÔ+ÌØÊâͼ±ê]
⚠️ 2. ¸ßΣÎïÆ·´¦ÀíÇåµ¥
ÎïÆ·ÀàÐÍ ½â¾ö·½°¸ Êý¾Ý¿â²Ù×÷ʾÀý
ÒѾø°æ×øÆï Ìæ»»ÎªÍ¨ÓÃÄ£ÐÍ UPDATE items SET model_id=5000 WHERE type=3;
Ç¿»¯+15×°±¸ ½µ¼¶Îª+10+ÌØÊâ¹âЧ SET enhance=10, effect=102
¾É°æÈÎÎñµÀ¾ß ²¹·¢¶ÔÓ¦ÐÂÈÎÎñÁ´ÎïÆ· Ö´ÐÐ item_mapping.json
🌐 ËÄ¡¢Ë«¶Ë»ìºÏ¼Ü¹¹²¿Êð£¨Ê¡Ç®·½°¸£©
¼Ü¹¹Í¼£º
¿Í»§¶ËV176 ——→ Íø¹Ø·þÎñÆ÷£¨ÐÒéת»»£©
↓
V155ÓÎÏ··þÎñÆ÷£¨¾µäÇø£©←©¤→ MongoDB
V176ÓÎÏ··þÎñÆ÷£¨ÐÂÇø£©←©¤©¤©¤©¤©¤©¼
Íø¹ØÐÒéת»»ºËÐÄÂß¼£º
// ´¦ÀíV176¿Í»§¶ËµÄÒÆ¶¯·â°ü
void HandleMovePacket(Packet* pkt) {
if (player.zone_id == CLASSIC_ZONE) { // ¾µäÇøÍæ¼Ò
ConvertPos(&pkt->pos); // ×ø±êת»»
SendToV155Server(pkt); // ת·¢¾É·þÎñ¶Ë
else {
SendToV176Server(pkt); // ÐÂÇøÖ±½Óת·¢
}
💥 Îå¡¢¸ßƵ±¨´í½â¾ö·½°¸
´íÎóÏÖÏó ¸ù±¾ÔÒò ÐÞ¸´·½°¸
½øÈëеØÍ¼ºÚÆÁ ³¡¾°ÎļþδÉú³É Ö´ÐÐ SceneBuilder -f missing_list.txt
¼¼ÄÜÌØÐ§´íÂÒ ÌØÐ§ID³åÍ» ÐÞ¸Ä effect.conf ÖØÅÅIDÇø¼ä
»³¾É×°±¸ÊôÐÔÒì³£ Êý¾Ý¿âδÉèÖÃת»»±êʶ ALTER TABLE equip ADD is_legacy TINYINT(1) DEFAULT 0;
Ë«¶ËÍæ¼ÒÎÞ·¨×é¶Ó ¶ÓÎéÐÒé°æ±¾²»¼æÈÝ Íø¹ØÇ¿ÖÆÍ³Ò»ÐÒé°æ±¾Îª v155
⚠️ Áù¡¢·¨Âɹæ±ÜÖØµãÌáÐÑ
°æ±¾¼æÈÝ ≠ ºÏ·¨»¯£º
½öת»»×ÔÓзþÎñ¶Ë£¨ÑϽû·Ö·¢×ª»»¹¤¾ß°üº¬¹Ù·½×ÊÔ´£©
Íæ¼ÒÊý¾ÝÍÑÃô£º
-- Ç¨ÒÆºóÁ¢¼´Ö´ÐÐ
DELETE FROM users WHERE last_login < '2020-01-01';
UPDATE accounts SET phone=NULL;
ÃüÃû¹æ·¶£º
ÓÎÏ·Æô¶¯½çÃæÈ¥³ý “ÖïÏÉ” ×ÖÑù
NPC¶Ô»°Îı¾Ìæ»» “ÇàÔÆÃÅ” → “ÔÆ½£×Ú”
🔧 ¸½£º±Ø±¸×ÊÔ´°ü
×Ô¶¯»¯Ç¨Òƹ¤¾ß°ü£º
MapConverter : µØÍ¼¸ñʽת»»Æ÷
ProtocolAdapter : Ë«¶ËÐÒéÍø¹Ø
IDMapper : ×°±¸/¼¼ÄÜIDÓ³Éä¿â

