Jump to content
DoSS

[Done!] Animated 3D Monsters in RO

Recommended Posts

Okay, does ragnarok need external textures, or do they work if they're included in the file itself? I exported the same model, but with textures included in the gr2 files. If needed, I can change the texture path and provide the file as well.

pyramid_converted.rar

  • Upvote 1
Link to comment
Share on other sites

I guess it's because of the Bink1 image compression format, I think granny 2.1.0.5 supports only Bink0 compression. I'll have to work on a conversion process for that as well. In the meanwhile, I've tried exporting with that texture format directly, but it would be really annoying to set it manually everytime.

pyramid_converted.rar

  • Upvote 1
Link to comment
Share on other sites

OMG I tested the new one in game, but seems that lemara allready posted a screen.

And yeah it show perfectly in game..... Ricky92 thanks a lot man. This couldn't be possible without your help.

Link to comment
Share on other sites

Okay, I can try exporting the dragon again, but I want to test animations now. Could someone explain to me how animations work in RO? I mean, what animations are used for mobs, like "walk", "attack", etc. Also, if this last test works I will release the converter soon, I just need to write the Bink1 conversion routine and maybe a GUI, so that it will be more intuitive.

  • Upvote 2
Link to comment
Share on other sites

Seems like the animation indexes(?) are static and uses the following IDs:

void __thiscall C3dGrannyGameActor::SetAction(C3dGrannyGameActor *this, int action, int speed, int type)
{
 C3dGrannyGameActor *v4; // [email protected]
 struct granny_control **v5; // [email protected]
 signed int v6; // [email protected]
 int v7; // [email protected]

 v4 = this;
 this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 0;
 switch ( action )
 {
case 48:
  this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 4;
  break;
case 80:
case 88:
  this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 2;
  break;
case 64:
  this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 3;
  break;
case 0:
  this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 0;
  break;
case 8:
  this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 1;
  break;
case 24:
  this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 5;
  break;
case 32:
  this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 11;
  break;
case 40:
  this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 12;
  break;
default:
  break;
 }
 this->m_nLastActAnimation = this->baseclass_0.baseclass_0.baseclass_0.m_stateId;
 v5 = this->m_Control;
 v6 = 20;
 do
 {
C3dGrannyModelRes::DeActAnimation(v4->m_GrannyActorRes, *v5);
*v5 = 0;
++v5;
--v6;
 }
 while ( v6 );
 v7 = v4->m_nLastActAnimation;
 LODWORD(v4->m_GameClock) = 0;
 if ( type == 1 )
v4->m_Control[v4->m_nLastActAnimation] = C3dGrannyModelRes::ActAnimation(
										   v4->m_GrannyActorRes,
										   v7,
										   v4->m_Instance,
										   v4->m_Control[v7],
										   1);
 else
v4->m_Control[v4->m_nLastActAnimation] = C3dGrannyModelRes::ActAnimation(
										   v4->m_GrannyActorRes,
										   v7,
										   v4->m_Instance,
										   v4->m_Control[v7],
										   0);
}

void __thiscall CGrannyPc::SetAction(CGrannyPc *this, int action, int speed, int type)
{
 if ( this->m_GrannyActorRes )
 {
this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 0;
switch ( action )
{
  case 48:
	this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 4;
	CGrannyPc::SetGrannyAction(this, type);
	break;
  case 80:
  case 88:
	this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 2;
	CGrannyPc::SetGrannyAction(this, type);
	break;
  case 64:
	this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 3;
	CGrannyPc::SetGrannyAction(this, type);
	break;
  case 0:
	this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 0;
	CGrannyPc::SetGrannyAction(this, type);
	break;
  case 8:
	this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 1;
	CGrannyPc::SetGrannyAction(this, type);
	break;
  case 24:
	this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 5;
	CGrannyPc::SetGrannyAction(this, type);
	break;
  case 32:
	this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 11;
	CGrannyPc::SetGrannyAction(this, type);
	break;
  case 40:
	this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 12;
	CGrannyPc::SetGrannyAction(this, type);
	break;
  case 16:
	this->baseclass_0.baseclass_0.baseclass_0.m_stateId = 6;
	goto LABEL_12;
  default:
LABEL_12:
	CGrannyPc::SetGrannyAction(this, type);
	break;
}
 }
}

I'll try to discover what are each ActionID, maybe they are indexed like ACTs files are.

Link to comment
Share on other sites

example ragnarok model animation

MODEL

name(rotate degree)_(id animation) model can rotate 0 or 90 and model can have animation stand

ANIMATION *Bone only

(id animation)_(animation) "walk,damage,attack,dead" but animation id works only 1-9 for show animation in game

text_animation(name_abc..) = animation for empelium stand

1_animation(name_1) = animation for guildflag

2_animation(name_2) = animation for treasurebox

7_animation(name_7) = animation for king guardian

9_animation(name_9) = animation for sword guardian

8_animation(name_8) = animation for bow guardian

animation id 7,9,8 work stand animation other id not work stand animation

unoccupied animation id = 3,4,5,6 other id not work but ragnarok can add custom static model mob no limit same sprite

example

name(rotate degree)_.gr2

/whisp i think you understand

3dmob.rar

Link to comment
Share on other sites

Hi there.

Ricky Has been like away for 2 weeks. Maybe due to personal reasons that we don't know at the moment.

I tried to contact him on skype but he has not replied yet. Hope he will back soon since the project was like... almost on its final steps. It would be a shame.

Link to comment
Share on other sites

Epic, great, and revolutionary work guys. We would all want to see this be a (complete) reality. This is an amazing breakthrough in RO gaming. More power to you. Good luck.

Link to comment
Share on other sites

I don't think it is dead.

I'm sure he will be in contact very soon. The tool was really on a high state of development; It doesn't makes a sense to stop now when a big part is allready done.

Let's wait.

Link to comment
Share on other sites

The project is not dead, I'm sorry. I haven't been able to work on it much, and, quite honestly, I had almost forgot about it.

The converter is working (at least I hope), but it can just convert one file at a time, and it is still full of memory leaks. I will need just a week or so to tweak it and maybe make a graphical interface for it.

In the meantime, if anyone wants to donate for my work:

btn_donateCC_LG.gif

I've put a lot of effort into this converter, and I will offer it free of charge. Any donation is greatly appreciated.

  • Upvote 6
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use and Privacy Policy.