µ±Ç°Î»Öà : 145zÓÎÏ·Õ¾¡¡|¡¡ÖïÏÉ¡¡|¡¡¼¼Êõ½Ì³Ì¡¡|¡¡

ÖïÏÉ°æ±¾Ç¨ÒÆÈ«¹¥ÂÔ£ºV155ÎÞ·ìÉý¼¶V176 + ¿ç¶Ë¼æÈÝ·½°¸

Èȶȣº
µ±ÀÏ·þÎñ¶ËÓöµ½Ð¿ͻ§¶Ë£¬Èý²½½â¾öµØÍ¼²»Æ¥Åä/×°±¸Ïûʧ/¼¼ÄÜ´íÂÒ£¡

🔄 Ò»¡¢°æ±¾²îÒìºËÐĶÔÕÕ±í
¹¦ÄÜÄ£¿é 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Ó³Éä¿â