This is an archive of the mabination.com forums which were active from 2010 to 2018. You can not register, post or otherwise interact with the site other than browsing the content for historical purposes. The content is provided as-is, from the moment of the last backup taken of the database in 2019. Image and video embeds are disabled on purpose and represented textually since most of those links are dead.

To view other archive projects go to https://archives.mabination.com

Mabinogi Technical Info (Updated 4/27/2015)




TL;DR: The basic problem with aiming is that there's a lot of stuff going on before you start aiming and the server aims after you do, but the "fire my shot" command is a lot smaller and happens faster, so not only is the server's aim behind yours, they actually have slightly less time spent aiming then you do so the chances are further reduced from what you see on-screen.
  • M wrote on 2013-11-17 05:10
    Before anyone reports this for double posting or whatever, Rydian and I discussed the creation of this thread well in advance. Rydian wants to compile some collective mabinogi information and his collection exceeds post limits and whatnot, I'll probably move this to the guides section when completed but I think the idea right now is to get input from other nationers and discuss findings

    Good luck!
  • Kenero wrote on 2013-11-17 14:06
    Speaking of which.

    All Moongates are just keywords. When you use a moongate or mana tunnel, a keyword list is actually pulled up.

    Also, things like fireball etc. are just props. Which is why we get the firebolt glitch in our screen because the client never "erased" the prop.

    The monster server is separated from the game server as separated from the login server.

    Which is why when the monster server is borked, you can still move and chat. And also why some people can't login but those already logged in are not affected.

    While npc Dialogue, Quest Dialog, etc. are sent via server... did you know Cutscene dialog is client-sided? So you can technically read the dialog of all Saga cutscenes in your client.

    Every single action in Mabinogi is a skill. Yes, a skill. From firing balista, to holy water, to even dye-ing, and continental warp, those are all skills. However, most of these are "hidden" but are there from character creation.

    In Mabinogi's case, even if you were to make the dye-ing skill not hidden, you will still need a "dye" in your inventory to use, in the same way that bandages are required for first aid.

    Continental Warp is a skill, like mentioned... however there are two ranks. Rank Novice and Rank F. Rank Novice is the one with time restriction, while Rank F is the one without. When you get VIP, you just "rank up" your continental warp temporarily.

    Theoretically, it is possible to have all npc have all the DIALOGUE options in-game. Each npc conversation doesn't really have a set dialogue, but rather sends out a request to show which dialogue it will pull from. From that, it is possible for an npc dialogue, like Spirit Weapon, to have the repair rate of Edern, Simon, Berched, etc. in its conversation and they will "repair" it, however the dialogue will be treated as if you're talking to the respective npc.

    In the same coin, it's possible for a single npc, even your spirit weapon, to open up different shops. To make it simple: When you talk to an npc, you send a request packet for that "npc" conversation and get a return. The npc themselves have no real baring. So yes, it is possible for you to talk to Edern, and the server messes up and you end up getting a Simon conversation, though that has yet to happen.

    Want to know how badly optimize Mabinogi is? The same code to handle the graphics is in the area for handling networking.

    What?

    Mabinogi doesn't allow for multi-thread or use more than one core. So even if you have 20 cores, it will only allow for one and only one thread.

    Also, when playing Mabinogi, when you exit a Shadow Mission or a cutscene, not all of it removes itself from memory, causing the memory eaten to rise, but most importantly... the more you do and the longer you play, textures will come out weird, which is a sign of imminent crashing.

    Mabinogi, ever since the g17 update, has a problem with CC++. That means that a messed up patch or installation of Mabinogi can cause some serious error due to the recent update with CC++ that was done for Windows.

    One of these problems is: Crashing when trying to skip cutscenes, major lag when talking to npc, or major lag when talking to a mailbox. It will also cause things when you try to skip cutscenes, or etc. to just "promptly" close your client because when you skip a cutscene, Mabinogi sends out the same command as exiting the client.

    Some of these CC++ error is actually embedded in the text themselves taking too much memory to render.

    The only way to resolve it is actually to re-install Mabinogi until it properly configures itself to your system... which is a long shot since I've seen it messed up 4-5 installs in a row or modification but that's a different story.
  • Rydian wrote on 2013-11-17 18:03
    Quote from Kenero;1170690:
    Mabinogi, ever since the g17 update, has a problem with CC++.
    Are you sure you're not thinking of something else? Mabinogi isn't using JIT as far as I'm aware, and C++ isn't natively JIT so the libraries installed wouldn't matter.
  • Kenero wrote on 2013-11-17 18:08
    Quote from Rydian;1170733:
    Are you sure you're not thinking of something else? Mabinogi isn't using JIT as far as I'm aware, and C++ isn't natively JIT so the libraries installed wouldn't matter.


    Well, to sum it up simply is the whole reason for crashing is memory and rendering.

    When the memory Mabinogi uses spikes either due to memory or CPU usage or rendering, it will cause the client to close automatically or lose out.

    Which is why when you skip cutscenes, or other triggers that causes a sudden spike, the client usually stops responding before closing itself if it doesn't close itself immediately.

    Which is why a lot of mods that reduce lag is actually beneficial.

    Ever did something that causes the client to stop responding before it closes itself out? However in the end, it's just bad optimization.

    The reason I use CC++ as an example is because whenever Mabinogi crashes, the debug I get from my Microsoft Visual Basic usually acts up asking me to debug the Mabinogi Client interestingly enough.

    To be fair, Pleione is terrible engine. I won't even go how much it seems that it was written by a bunch of college freshman.

    Just by looking how it was coded, it seemed like originally they only planned Mabinogi to be short termed. The system itself seemed like it was made with the intention of lasting a few years... and for it to last nearly a decade was probably overshooting it.

    That is to say, the people who originally made Pleione probably didn't intend too look far in the future, which is why there's a lot of bad optimization and problems in Pleione.

    It's like when you build a mini home that is supposed to only last 3 years, but somehow it survives a decade. Yes, it has lasted a decade, but it's old, decrypted, and is riddled with problems stacked over the years.
  • Aubog007 wrote on 2013-11-17 20:01
    As far as i know about mabi, it was built during the era of single cored computers, and that's the way they thought it was going to be, not multicored.

    Really shot themselves in the foot with that one.
  • Splatulated wrote on 2013-11-17 22:38
    this is neat :3

    what else can be dug up i like the one with the pallette swathes
  • X wrote on 2013-11-18 01:27
    Where to begin... Okay, let's start with

    == IDs ==

    Everything in Mabinogi has an ID. Every creature, prop, item, quest, ect. They serve an essential purpose: without IDs, the sever would have no way to identify the various entities when tell the client of some action involving them. However, devCAT has twisted and abused IDs to levels I would not believe...

    - There are ranges of IDs. For example, character IDs start at 0x10000000000001 and go up. If you create a character outside of this range somehow, the client won't let you log in to it.

    - ID ranges further dictate information about props. A prop is "hittable" if and only if its ID is in a certain rage - and that range changes per map, and even in subsections of a map.

    - Quest ID ranges determine which tab and background color a quest should have.

    - AoE skills like Windmill, Fireball, Spear of Light, etc, do not send a creature's ID for their target. Rather, they send a really funky ID that contains the coordinates of the area clicked, divided by 20.

    [spoiler=Known ID Ranges]
    // Id range starts
    public const ulong Cards = 0x0001000000000000;
    public const ulong Characters = 0x0010000000000001;
    public const ulong Pets = 0x0010010000000001;
    public const ulong Partners = 0x0010030000000001;
    public const ulong Npcs = 0x0010F00000000001;

    public const ulong Guilds = 0x0300000000500000;

    public const ulong Items = 0x0050000000000001;
    public const ulong TmpItems = 0x0050F00000000001;

    // 00XX<word:region><word:area><word:id>
    public const ulong Props = 0x00A1000000000000;
    public const ulong AreaEvents = 0x00B0000000000000;

    public const ulong Parties = 0x0040000000000001;

    // Quests is probably 0x0060000000000001, but we'll leave some space
    // between quests and items (quest items), just in case.
    public const ulong Quests = 0x006000F000000001;
    public const ulong QuestsTmp = 0x0060F00000000001;
    public const ulong QuestItemOffset = 0x0010000000000000;
    [/spoiler]

    == Stats ==
    DevCAT gave the client no shortage of stats:

    [spoiler=Open at your own risk]
    public enum Stat : byte
    {
    Name,
    Title,
    EngTitle,
    Type,
    SkinColor,
    EyeType,
    EyeColor,
    MouthType,
    State,
    StateEx,
    StateEx2, // [180300, NA166 (18.09.2013)]
    Height,
    Weight,
    Upper,
    Lower,
    RegionId,
    PositionX,
    PositionY,
    Direction,
    BattleState,
    WeaponSet,
    Extra1,
    Extra2,
    Extra3,
    CombatPower,
    MotionType,
    Life,
    LifeInjured,
    LifeMax,
    LifeMaxMod,
    Mana,
    ManaMax,
    ManaMaxMod,
    Stamina,
    StaminaMax,
    StaminaMaxMod,
    Food,
    FoodMinRatio,
    Level,
    LevelTotal,
    LevelMax,
    RebirthCount,
    LifeTimeSkill,
    Experience,
    Age,
    Str,
    StrMod,
    Dex,
    DexMod,
    Int,
    IntMod,
    Will,
    WillMod,
    Luck,
    LuckMod,
    LifeMaxByFood,
    ManaMaxByFood,
    StaminaMaxByFood,
    StrengthByFood,
    DexterityByFood,
    IntelligenceByFood,
    WillByFood,
    LuckByFood,
    AbilityPoints,
    AttackMinBase,
    AttackMinMod,
    AttackMaxBase,
    AttackMaxMod,
    WattackMinBase,
    WattackMinMod,
    WattackMaxBase,
    WattackMaxMod,
    LeftAttackMinMod,
    LeftAttackMaxMod,
    RightAttackMinMod,
    RightAttackMaxMod,
    LeftWattackMinMod,
    LeftWattackMaxMod,
    RightWattackMinMod,
    RightWattackMaxMod,
    LeftCriticalMod,
    RightCriticalMod,
    LeftRateMod,
    RightRateMod,
    MagicDefenseMod,
    MagicProtectMod, // [180300, NA166 (18.09.2013)]
    MagicAttackMod,
    MeleeAttackRateMod,
    RangeAttackRateMod,
    CriticalBase,
    CriticalMod,
    ProtectBase,
    ProtectMod,
    DefenseBase,
    DefenseMod,
    RateBase,
    RateMod,
    Rank1,
    Rank2,
    ArmorPierceMod, // [180300, NA166 (18.09.2013)]
    Score,
    AttackMinBaseMod,
    AttackMaxBaseMod,
    WattackMinBaseMod,
    WattackMaxBaseMod,
    CriticalBaseMod,
    ProtectBaseMod,
    DefenseBaseMod,
    RateBaseMod,
    MeleeAttackMinBaseMod,
    MeleeAttackMaxBaseMod,
    MeleeWattackMinBaseMod,
    MeleeWattackMaxBaseMod,
    RangeAttackMinBaseMod,
    RangeAttackMaxBaseMod,
    RangeWattackMinBaseMod,
    RangeWattackMaxBaseMod,
    DualgunAttackMinBaseMod, // [180300, NA166 (18.09.2013)]
    DualgunAttackMaxBaseMod, // [180300, NA166 (18.09.2013)]
    DualgunWAttackMinBaseMod, // [180300, NA166 (18.09.2013)]
    DualgunWAttackMaxBaseMod, // [180300, NA166 (18.09.2013)]
    PoisonBase,
    PoisonMod,
    PoisonImmuneBase,
    PoisonImmuneMod,
    PoisonDamageRatio1,
    PoisonDamageRatio2,
    EnchantCombatPowerMod,
    CumulateStr,
    CumulateDex,
    CumulateInt,
    CumulateWill,
    CumulateLuck,
    CumulateHeight,
    CumulateFatness,
    CumulateUpper,
    CumulateLower,
    CumulateLife,
    CumulateMana,
    CumulateStamina,
    Toxic,
    ToxicDrunkenTime,
    ToxicStr,
    ToxicInt,
    ToxicDex,
    ToxicWill,
    ToxicLuck,
    LastTown,
    LastDungeon,
    ExploLevel,
    ExploMaxKeyLevel,
    ExploCumLevel,
    ExploExp,
    DiscoverCount,
    ConditionStr,
    ConditionInt,
    ConditionDex,
    ConditionWill,
    ConditionLuck,
    ElementPhysical,
    ElementLightning,
    ElementFire,
    ElementIce,
    BareAttackMin,
    BareAttackMax,
    BareWattackMin,
    BareWattackMax,
    BareCritical,
    BareRate,
    }
    [/spoiler]

    - Many if not most of these stats seem unused or redundant, which begs the question: why do they exist?

    - The server sends "StatUpdate" packets to the client whenever something changes: loss of HP, increase in stamina rengeneration, etc. THIS PACKET IS SUPPOSED TO CONTAIN ONLY THE STAT(S) THAT WERE AFFECTED, THUS SAVING TIME AND BANDWIDTH. However, for reasons we can only guess at, each StatUpdate packet contains nearly every stat - updated or not.

    - This packet is sent many times when it isn't needed. It's as if the server is littered with code "just in case". This has an impact on the overall speed of the server and the client.

    - The introduction of stats from Skills and Talents (ie, 128 bonus hp) is totally not accounted for. I can best describe it like this: When you log in, the bonus is reapplied. This has led to an interesting phenomenon of having more than 100% of a stat, as evidenced by the character on the left's HP (shown in white over her head)

    [Image: http://img818.imageshack.us/img818/2277/7dgy.png]


    It also means that you can full heal yourself just by relogging several times, as seen here: http://youtu.be/94lg2q7jHTs

    For details on the (simple) solution, you're welcome to read this thread: http://dev.mabinoger.com/forum/index.php/topic/537-171-life-to-lifedelta/

    == NPCs ==
    - NPC dialog is handled in a terribly awkward way. First, the text is XML-encoded (replacing < to &lt; for example). Then the content is inserted into an XML template. This template contains details of a function prototype in the client to call, as well as arguments to pass it. What?!

    Finally the template is bundled into a packet and sent to the client. This is how Duncan's "intro" appears when sent to the client:
    [spoiler=Example]
    [CODE]<call convention="thiscall" syncmode="non-sync">
    <this type="character">45035996285xxxxx</this>
    <function>
    <prototype>void character::ShowTalkMessage(character, string)</prototype>
    <arguments>
    <argument type="character">4767482418037552</argument>
    <argument type="string">&lt;npcportrait name='NONE'/&gt;&lt;title name='NONE'/&gt;An elderly man gazes softly at the world around him with a calm air of confidence. &lt;br/&gt;Although his face appears weather-beaten, and his hair and beard are gray, his large beaming eyes make him look youthful somehow. &lt;br/&gt;As he speaks, his low voice resonates with a kind of gentle authority.&lt;br/&gt;&lt;button title='Continue' keyword='@continue' /&gt;</argument>
    </arguments>
    </function>
    </call>[/CODE][/spoiler]

    - Buttons are little more than temporary keywords

    - As time went on, devCAT has gotten lazier and lazier. Button keywords (the text returned to the server, indicating what you clicked) went from "continue", "agree", "shop" to, I kid you not: "asdf" and "xxxx"
  • X wrote on 2013-11-18 01:27
    == MabiTags ==
    Given devCAT's fondness for XML, it is surprising that they created (yet another) format to do basically the same things.

    - MabiTags format is: NAME:FORMAT:VALUE;
    where
    *name is the parameter name
    * format is either the length in bytes of the value OR a character such as f or s, which denote "float" and "string" respectively
    * value is... the value.

    - MML is encoded into MabiTags:

    [CODE]TITLE:s:Foo;AUTHOR:s:X;SCORE:s:28%S789c4b66486148654846222138998181010051540515;HIDDEN:1:0;LEVEL:2:10;[/CODE]

    == Quests ==
    - Quests have their own hidden items, one per quest. Without this item, you can't access the quest or complete it.

    - Quest information is sent in no less than four formats: plaintext, xml, mabitags, and raw packet values:

    - Strings meant for display are sent as is, eg: "You may be a Milletian, but you still need to learn how to defend yourself against the Fomors. - Duncan"

    - Arbitrary snippets of xml seem to control aspecs of a quests presentation: <xml soundset="4" npc=""/>

    - Quest objective information is encoded into "MabiTags" format, but is exceptionally cryptic. Examples:

    [CODE]QMBEXP:f:1.000000;QMBGLD:f:1.000000;QMSMEXP:f:1.000000;QMSMGLD:f:1.000000;QMAMEXP:f:1.000000;QMAMGLD:f:1.000000;QMBHDCTADD:4:0;QMGNRB:f:1.000000;

    TGTCLS:2:3655;TARGETCOUNT:4:1;[/CODE]

    - Additional information, such as the location of the quest marker, is simply added as raw values to the packets.

    == Monsters ==
    As Kene already alluded to, monsters are funny. However let me elaborate...

    - There is no "monster server." Instead, devcat has 3 clients per channel. These are special clients, as they run without GUIs. These clients control the actions of everything with an AI, using the same XML-based language as pets.

    - Mob lag is caused by one of the clients lagging or crashing

    - The "characters" of these clients sit in Area 15 - a small sqaure of grass normally inaccessible.

    == Server checks ==
    Oh, man.

    This should really be titled "no server checks". The server well let you do just about anything you please, unless someone else has tried it and gotten it blocked. Security and hack-prevention seems somewhat low priority, when you consider things like this are possible:

    - Force any creature to mount your pet: http://www.youtube.com/watch?v=G746nkoIftY&nxid=10
    [7:53:10 AM] Marck: I used to ride around with the mailbox and pretend to the mailman

    - Remove your face (For hair, face, etc are just items): http://www.youtube.com/watch?v=erBIq8-QMsI

    - SO MANY DUPE METHODS: http://www.youtube.com/watch?v=JNZQTzC63cQ

    - Dragons errywhere: http://www.youtube.com/watch?v=uixQxu0mJkM

    - GM hide for those who are not GMs: http://www.youtube.com/watch?v=44U1BsNwB44


    There are many, MANY more things to share, but I'm starting to feel hopelessly disgusted again, so...
  • Kaeporo wrote on 2013-11-18 02:23
    Could you guys possibly do some research on ranged variables?

    I would like to confirm some of my observations.