Unfinished source BMD (3dMesh) to SMD

Experienced Elementalist
Joined
Apr 8, 2008
Messages
218
Reaction score
141

Yes its true, already i have the skeleton from Lineage and i adjust this for Mu, this have more bones and its more complex, take me lot of time adjust this and animations looks amazing already, but the problem Gembrid its i cant made the .bmd of player.bmd animations if this cant be fixed in the BMD.EXE.
 
Hybrid
Loyal Member
Joined
Mar 15, 2006
Messages
451
Reaction score
285

and what's the problem?)
 
Junior Spellweaver
Joined
Sep 3, 2008
Messages
146
Reaction score
75
and what's the problem?)

Remember gembrid. If BMD have animations, BMD Comverter wont work 100% cuz have some errors on converted X/Y/Z structs. If Rimbros wants Add new bones inside Sets/Weapons, he need edit player.bmd to make it news animation works.
 
Experienced Elementalist
Joined
Apr 8, 2008
Messages
218
Reaction score
141
and what's the problem?)
The problem bro its:

1- Take any PLAYER.BMD from any client u have installed.
2- With pentium tools free version convert this to SMD.
3- With the BMD.EXE convert this SMD to .BMD back.
4- Run in game with any pj, now u get the error in animation.
 
Hybrid
Loyal Member
Joined
Mar 15, 2006
Messages
451
Reaction score
285
The problem bro its:

1- Take any PLAYER.BMD from any client u have installed.
2- With pentium tools free version convert this to SMD.
3- With the BMD.EXE convert this SMD to .BMD back.
4- Run in game with any pj, now u get the error in animation.

i've already tested) everything was ok =\

have you tried player.bmd i've uploaded?
 
Experienced Elementalist
Joined
Apr 8, 2008
Messages
218
Reaction score
141
i've already tested) everything was ok =\

have you tried player.bmd i've uploaded?

O sorry, yes this works fine.

Abouth animations in items, ok, let me explain, this weapon mace have animation rotation, but if u added a new weapon item with animations .bmd file the animation not run, and the object looks withouth animation, the only way its replace the item, but how its posible in main allow a item to run animations?... this question are here by years. I dont think only this man sobieh know the answer ot this.

 
Hybrid
Loyal Member
Joined
Mar 15, 2006
Messages
451
Reaction score
285

1. find the code in main for original item
2. analyze
3. change the code to support new items
4.

it was easy to find it for raven stick and stop the animation
 
Experienced Elementalist
Joined
Apr 8, 2008
Messages
218
Reaction score
141
1. find the code in main for original item
2. analyze
3. change the code to support new items
4.

it was easy to find it for raven stick and stop the animation

That its the point, nobody find the code, only sobieh but of course he never shared.:thumbdown:
I ask to you because i remember u are the only find how to changue the size in NPC.
U are good finding codes.
 
Joined
Oct 29, 2007
Messages
1,290
Reaction score
1,311
I can find assembly code for every item.. using: olly, but I don't know how extend limit.. to load me lacking struct for load effects in items, I don't know the way that: main.exe load effect in every item

for example:

Code:
 Loop for load Bows in: 1.03.52 (Eng)
CPU Disasm
Address   Hex dump          Command                                  Comments
00629EC1  |.  6A 14         PUSH 14                                  ; /Arg4 = 14
00629EC3  |.  68 78C09A00   PUSH OFFSET 009AC078                     ; |Arg3 = ASCII "Bow"
00629EC8  |.  68 7CC09A00   PUSH OFFSET 009AC07C                     ; |Arg2 = ASCII "Data\Item\"
00629ECD  |.  68 A70C0000   PUSH 0CA7                                ; |Arg1 = 0CA7  ---> [COLOR="Red"]Item offset in array for bows[/COLOR]
00629ED2  |.  E8 B1D2FFFF   CALL 00627188                            ; \Main-Funcional.00627188
00629ED7  |.  83C4 10       ADD ESP,10

0CA7 = 3239 in dec with this and ItemGet, you can found: exactly ItemID, for Bows how: "Ari Lyn Bow" that have special effects (you can found calls in main for this effect and redirect to: New Added Bow).
 
Last edited:
Experienced Elementalist
Joined
Apr 8, 2008
Messages
218
Reaction score
141
I can find assembly code for every item.. using: olly, but I don't know how extend limit.. to load me lacking struct for load effects in items, I don't know the way that: main.exe load effect in every item

Yea this its the most hard think in Main.exe found a effects and animations control, to extend limit of items u can made a Dll. btw i found interesting thinks, like light spots in something bones names, but out of this i dont know, another think i see its the sobieh effects in items looks very rare, not look nice like the original effects, i think he made a Dll or something to put OpenGl effects or something to the items, and he not working with the original code. Its only a think i supposse.

I search control animation coz i search release armors in Mu like the Inmortals Online..

Of course do this i have my hown skeleton structure. Compatible with all the armors released and with extra bones.



 
Last edited:
Joined
Oct 29, 2007
Messages
1,290
Reaction score
1,311
Here decompiled to: 1.03h Jpn -> Season 4.5

Added Cross Shield to: Season II - with Glass Effect


Code:
Func2:

void gObjSetItemEffect2(UNK0 * arg1, UNK1 * lpMsg, int iID, float arg4, int arg5, float arg6, int arg7) //Completed
{
if(iID == ITEMID(0,26)) //Flameberge
{
func_51932D(arg1, arg5, arg4, (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), 5, -1);
}
else if(iID == ITEMID(0,27)) //Sword Breaker
{
func_5168A0(arg1, 0, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}
else if(iID == ITEMID(0,28)) //Rune Bastard Sword
{
func_5168A0(arg1, 2, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}
else if(iID == ITEMID(5,30)) //Deadly Staff
{
func_51932D(arg1, arg5, arg4, (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1, arg7);

lpMsg->ukn3[0x94] = 1;

*(float*)(&arg1->ukn[0x48]) = 1.0f;
*(float*)(&arg1->ukn[0x4C]) = 1.0f;
*(float*)(&arg1->ukn[0x50]) = 1.0f;

func_5168A0(arg1, 1, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}
else if(iID == ITEMID(5,32)) //Unknown (weird but Season4.5 have it)
{
func_5168A0(arg1, 1, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}
else if(iID == ITEMID(6,19)) //Frost Barrier
{
func_5168A0(arg1, 0, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}
else if(iID == ITEMID(6,20)) //Guardian Shield
{
func_5168A0(arg1, 0, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}
else if(iID == ITEMID(7,49)) //Seraphim Helm
{
func_5168A0(arg1, 0, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}
else if(iID == ITEMID(7,50)) //Divine Helm
{
func_5168A0(arg1, 1, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}
else if(iID == ITEMID(7,53)) //Unknown (weird but Season4.5 have it)
{
func_5168A0(arg1, 2, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}
else if(iID == ITEMID(6,21)) //Cross Shield
{
func_5168A0(arg1, 0, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}
else
{
OriginalEffectFunc2(arg1, lpMsg, iID, arg4, arg5, arg6, arg7);
}
}

void gObjSetItemEffect3(UNK0 * arg1, UNK1 * lpMsg, int iID, float arg4, int arg5, float arg6, int arg7) //Completed
{
if(iID == ITEMID(0,26)) //Flameberge
{
func_51932D(arg1, arg5, arg4, (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), 5, arg7);
}
else if(iID == ITEMID(6,19)) //Frost Barrier
{
func_5168A0(arg1, 0, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}
else if(iID == ITEMID(7,49)) //Seraphim Helm
{
func_5168A0(arg1, 0, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}
else if(iID == ITEMID(7,53)) //Unknown (weird but Season4.5 have it)
{
func_5168A0(arg1, 2, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}
else if(iID == ITEMID(7,50)) //Divine Helm
{
func_5168A0(arg1, 1, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}
else
{
OriginalEffectFunc3(arg1, lpMsg, iID, arg4, arg5, arg6, arg7);
} 
}


























//Função 1
else if(iID == ITEMID(6,21)) //Cross Shield
{
glColor3f(1.0f, 1.0f, 1.0f); //OpenGL Set Color

func_5168A0(arg1, 0, 2, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);

arg1->ukn[0x94] = 1; //Unknown value (need check)

func_5168A0(arg1, 1, 70, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), -((int)(*( float*)0x587C650))%2000, -1); //Shield Glass Effect Animation
func_5168A0(arg1, 2, 66, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}

//Função 2
else if(iID == ITEMID(6,21)) //Cross Shield
{
func_5168A0(arg1, 0, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}

















































Code :


//Função 1
else if(iID == ITEMID(6,21)) //Cross Shield
{
glColor3f(1.0f, 1.0f, 1.0f); //OpenGL Set Color

func_5168A0(arg1, 0, 2, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);

arg1->ukn[0x94] = 1; //Unknown value (need check)

func_5168A0(arg1, 1, 70, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), -((int)(*( float*)0x587C650))%2000, -1); //Shield Glass Effect Animation
func_5168A0(arg1, 2, 66, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}

//Função 2
else if(iID == ITEMID(6,21)) //Cross Shield
{
func_5168A0(arg1, 0, arg5, *(float*)(&lpMsg->ukn3[0x1A8]), (int)lpMsg->ukn3[0x94], *(float*)(&lpMsg->ukn3[0x98]), *(float*)(&lpMsg->ukn3[0x9C]), *(float*)(&lpMsg->ukn3[0x0A0]), -1);
}
 

Attachments

You must be registered for see attachments list
Experienced Elementalist
Joined
Apr 8, 2008
Messages
218
Reaction score
141
Amazing release, mmm btw maybe u can put Glass Effect with alpha channels modification too, and brightnes texture. But its good begining that u made.
 
Newbie Spellweaver
Joined
Jul 19, 2005
Messages
22
Reaction score
53
i found 3 functions related to effects.
webzen coded effects for each item like cross shield, flameberge i added in season2. For example cross shield uses this formula "-((int)(*( float*)0x587C650))%2000" to make the cool glass animation and flameberge this one:
PHP:
float Formula1 = (((int)(( *(float*)0x587C650) * 0.05f )) % 16) / 4;
float Formula2 = Formula1 * 0.25f;

also the rotate thing from the mace is from one of those 3 functions too and uses a similar formula

Preview:


btw i never tested different values to see what happens to it xD
 
Junior Spellweaver
Joined
Aug 5, 2008
Messages
149
Reaction score
38
Nice man with this we can add effects like glass and fire effect =) is good

This part of code is for main ... Seadon 2? What version Exactly ...?
 
Last edited:
Experienced Elementalist
Joined
Apr 8, 2008
Messages
218
Reaction score
141
Btw, the fire effect its only a illusion, already looks like fire because in
the .ozt the texture its fire frames, its like a .GIF image, u can changue this by lighting or changue the color to purple or green etc etc... mmm this u post its a source but how abouth the offset? search a float in ollyDBG its a kick in the as.
 
Joined
Oct 29, 2007
Messages
1,290
Reaction score
1,311

Hey hermex, is lacking this:

Code:
g_ItemEffect.func_5168A0(arg1, 5, 66, Value_5, 5, Value_2, Value_3, Formula2, -1 );

Here I leave the last version of: AriethMu_S6.dll, unpacked. ready for decompilation.

--> for main: 1.08C+ -> 1.08.29 (Kor) Season 6 Episode 2

PS: I think that, the hermex code it's based in: 1.03h (Jpn) Season 4.5
 
Last edited:
Junior Spellweaver
Joined
Jun 10, 2006
Messages
136
Reaction score
100

It's not easy to decompile, coz the important areas of code are virtualized...
 
Junior Spellweaver
Joined
Sep 22, 2008
Messages
126
Reaction score
37
Maybe u should create a new thread to discuss about this.... this thread start as a opensource bmd <> smd converter, and is becoming a main functions thread.
 
Last edited: