// Mirror Lake Protocol and The Mana World Vault utilities // TMWA is hopelessy broken, so most helpers simply don't exist. // // Author: jesusalva function|script|VaultLogin { if (##VAULT < 1) goto L_Return; // Imports & Vitals callsub S_Exp; callsub S_Gold; callsub S_Preset; // Quest Handlers callsub S_Quest_CR1; // Mirror lake callsub S_MirrorLake; // Clean up set @last_preset, 0; return; // go back to global handler S_Return: // this is to end execution of a sub return; L_Return: return; S_Exp: if (##ADD_LVL < 1) goto S_Return; set #EXP_CREDIT, #EXP_CREDIT + ##ADD_LVL; set ##ADD_LVL, 0; return; S_Gold: if (##ADD_GP < 1) goto S_Return; set Zeny, Zeny + ##ADD_GP; set ##ADD_GP, 0; return; S_Preset: if (##PRESET < 1) goto S_Return; set @last_preset, (#X21 & BYTE_3_MASK) >> BYTE_3_SHIFT; set #X21, (#X21 & ~(BYTE_3_MASK)) | (##PRESET << BYTE_3_SHIFT); // Each preset is 5 levels (Preset 1 = Lv 5, Preset 10 = Lv 50, Max Preset 20 - hard limit is 127) // TODO: Give more ammo, iron powder, sulphur powder, etc. instead of equips // Give also some bug legs and maggot slime if applicable? /* Handle weapons */ /* if (##PRESET >= 1 && @last_preset < 1) getitem "SharpKnife",1; if (##PRESET >= 2 && @last_preset < 2) getitem "SlingBullet",500; if (##PRESET >= 3 && @last_preset < 3) getitem "Bow",1; if (##PRESET >= 3 && @last_preset < 3) getitem "Arrow",500; if (##PRESET >= 4 && @last_preset < 4) getitem "Arrow",500; if (##PRESET >= 5 && @last_preset < 5) getitem "JeansShorts",1; if (##PRESET >= 6 && @last_preset < 6) getitem "IronArrow",500; if (##PRESET >= 7 && @last_preset < 7) getitem "IronArrow",500; if (##PRESET >= 8 && @last_preset < 8) getitem "IronPowder", 150; if (##PRESET >= 9 && @last_preset < 9) getitem "BoneArrows",150; if (##PRESET >= 10 && @last_preset < 10) getitem "BoneArrows",150; if (##PRESET >= 11 && @last_preset < 11) getitem "SilverArrow",200; if (##PRESET >= 12 && @last_preset < 12) getitem "ThornArrow",100; if (##PRESET >= 13 && @last_preset < 13) getitem "SilverArrow",200; if (##PRESET >= 14 && @last_preset < 14) getitem "TerraniteArrow",100; if (##PRESET >= 15 && @last_preset < 15) getitem "ArmorBreaker",100; if (##PRESET >= 16 && @last_preset < 16) getitem "ThornArrow",100; if (##PRESET >= 17 && @last_preset < 17) getitem "TerraniteArrow",100; if (##PRESET >= 18 && @last_preset < 18) getitem "IronPowder", 150; if (##PRESET >= 19 && @last_preset < 19) getitem "TerraniteArrow",250; */ set ##PRESET, 0; return; //////////////////////////////// S_Quest_CR1: if (!(##01_CRQUEST & 1)) goto S_Return; if (##03_TMWWORLD & MLP_CR_DEBUT) goto S_Return; // Check if you can receive the rewards getinventorylist; if (@inventorylist_count >= 96) goto S_Return; // Mark quest as done and issue rewards set BOSS_POINTS, BOSS_POINTS + 871; set ##03_TMWWORLD, ##03_TMWWORLD | MLP_CR_DEBUT; getitem WhiteCake, 1; getitem ChocolateCake, 1; getitem OrangeCake, 1; getitem AppleCake, 1; message strcharinfo(0), "Mirror Lake : You gained 871 boss points."; return; //////////////////////////////// S_MirrorLake: // Wipe any existing TMWA internal mirror lake information set ##VAULT_GOTO, 0; set ##VAULT_MLTO, 0; // TODO: Put the Mirror Lake Portal into the shipwreck? (see portal #2) set .@gto, call("get_byte", ##00_INFO, 3); set .@mlp, call("get_nibble", ##00_INFO, 5); // If we're moving from Mirror Lake to TMW if (.@gto != WORLD_ID) goto S_MirrorFix; debugmes "Vault User "+##VAULT+" moved to lake "+.@mlp; if (.@mlp == 1) warp "013-2", 37, 23; // Hurnscald Mirror Lake if (.@mlp == 2) warp "002-1", 30, 58; // Tulimshar Mirror Lake // Unset the target lake/world void call("set_byte", ##00_INFO, 3, 0); void call("set_nibble", ##00_INFO, 5, 0); return; // We've moved to the wrong world, so preserve it. S_MirrorFix: set ##VAULT_GOTO, call("get_byte", ##00_INFO, 3); set ##VAULT_MLTO, call("get_nibble", ##00_INFO, 5); return; } // Remember: ##VAULT_EXP, ##VAULT_GOTO, ##VAULT_MLTO for Mirror Lake Protocol // However, without kick(7), it is not really worth anything - so I presumed 7 // Remember: Quote symbols are illegal, simple or double, except for parameter // To reset the database: // cleararray $EXPORT_DATA$[0], "", 254; // set $EXPORT_MAX_ID, 0; // Schemas: //API_VAULT: "UID", ##VAULT, "GID", getcharid(3) //API_SENDMAIL: "UID": ##VAULT, "MSG": "message", "TITLE": "subject line" // // Using the API_EXPORT hack for TMWA: // // set $@API_PROTOCOL, API_SENDMAIL; // set $@API_DATA$, "'UID': 0, 'TITLE': 'About TMWA', 'MSG': 'I hate it!'"; // callfunc "FlushAPI"; // // (The curly brace is added to DATA on its own) function|script|FlushAPI { // Function called improperly // DATA cannot be null or the array order will crash if ($@API_PROTO <= 0) goto L_Dumb; if ($@API_DATA$ == "") goto L_Dumb; // Save it to mapreg // The script will strip "##" // and convert the part after to a JSON dict set $EXPORT_DATA$[$EXPORT_MAX_ID], $@API_PROTO + "##" + $@API_DATA$; set $@API_PROTO, ""; set $@API_DATA$, ""; // Update TMWA tracker set $EXPORT_MAX_ID, $EXPORT_MAX_ID + 1; // Keep in mind an array can only go up to 255 // Trying to go past that, causes a SIGSEGV and map server dies // So we periodically truncate the table when it's full if ($EXPORT_MAX_ID > 240) goto L_Flush; if ($EXPORT_MAX_ID == 120) goto L_Flush2; return; L_Dumb: debugmes "FlushAPI called without enough arguments"; debugmes " - $@API_PROTO, API_* constant"; debugmes " - $@API_DATA$, json dict without curly braces"; return; L_Flush: cleararray $EXPORT_DATA$[0], "", 220; set $EXPORT_MAX_ID, 0; return; L_Flush2: cleararray $EXPORT_DATA$[220], "", 25; return; } function|script|VaultLogout { if (##VAULT < 1) goto L_Return; // TODO: Or #VAULT ? Which of the two is set? set $@API_PROTOCOL, API_VAULT; set $@API_DATA$, "'UID': "+##VAULT+", 'GID': "+getcharid(3); callfunc "FlushAPI"; return; L_Return: return; } // MirrorLakeSendTo(World) function|script|MirrorLakeSendTo { if (##VAULT < 1) goto L_Return; set ##VAULT_GOTO, getarg(0); // This is TMWA - so it'll always use Lake #0 for performance reasons set $@API_PROTOCOL, API_VAULT; set $@API_DATA$, "'UID': "+##VAULT+", 'GID': "+getcharid(3); callfunc "FlushAPI"; message strcharinfo(0), "Darkness fills your vision..."; // TODO: Misc effects // TODO: Sleep for 10~15 seconds (for mapreg) // TODO: Disconnect user return; L_Return: return; }