re: [Development] Trying Add Custom Monsters Or NPC
Quote:
Originally Posted by
-=DarkSim=-
Everything is much simpler:
1. Object attr (like NPC / Mob / None) stored in one struct in main, like OBJECTSTRUCT from server
2. Everything that is necessary - load model for monster id, other changes can make in struct
About you problem with talk:
- You need change attr for you new Object in struct, set param +722 (BYTE) == 4
(1 = Player, 2 = Monster, 4 = NPC)
Example with Elf Soldier:
Code:
// -> 515596 -> 1 Call
int gMakePreviewSoldierElf(int StructAddr)
{
Preview * gPreview = &*(Preview*)StructAddr;
// ----
gPreview->WingsSlot= ITEM2(12, 3);
// ----
gPreview->HelmSlot= ITEM2(7, 24);
gPreview->HelmLevel= 13;
// ----
gPreview->ArmorSlot= ITEM2(8, 24);
gPreview->ArmorLevel= 13;
// ----
gPreview->PantsSlot= ITEM2(9, 24);
gPreview->PantsLevel= 13;
// ----
gPreview->GlovesSlot= ITEM2(10, 24);
gPreview->GlovesLevel= 13;
// ----
gPreview->BootsSlot= ITEM2(11, 24);
gPreview->BootsLevel= 13;
// ----
gPreview->Action= 11;
gPreview->ModelScale= 0x3F800000;
gPreview->SelectZone+= 70.0;
// ----
return gPreview->Unknown700;
}
In this function main set special attr for this NPC, like items, model scale, action, pk status and etc.
530802 ( int gObjSetAttr(Preview * gPreview, int ObjectID) )
- this function set Object attr from ID, you can use it, example:
Code:
if( ObjectID == 368 || ObjectID == 369 || ObjectID == 370 )
{
*(BYTE *)(gPreview + 722) = 4; //-> Set NPC status to Object
}
if( ObjectID == 367
|| ObjectID == 371
|| ObjectID == 375
|| ObjectID == 376
|| ObjectID == 377
|| ObjectID == 379
|| ObjectID == 380
|| ObjectID == 381
|| ObjectID == 382
|| ObjectID == 383
|| ObjectID == 384
|| ObjectID == 385
|| ObjectID == 406
|| ObjectID == 407
|| ObjectID == 408
|| ObjectID == 414
|| ObjectID == 415
|| ObjectID == 416
|| ObjectID == 417
|| ObjectID == 450
|| ObjectID == 452
|| ObjectID == 453
|| ObjectID == 464
|| ObjectID == 465
|| ObjectID == 467
|| ObjectID == 468
|| ObjectID == 469
|| ObjectID == 470
|| ObjectID == 471
|| ObjectID == 472
|| ObjectID == 473
|| ObjectID == 474
|| ObjectID == 475
|| ObjectID == 478
|| ObjectID == 479
|| ObjectID == 492
|| ObjectID == 540
|| ObjectID == 541
|| ObjectID == 542
|| ObjectID == 522
|| ObjectID == 543
|| ObjectID == 544
|| ObjectID == 545
|| ObjectID == 546
|| ObjectID == 547 )
{
*(BYTE *)(gPreview + 722) = 4; //-> Set NPC status to Object
}
Full function:
Code:
//530802->
int gObjSetAttr(Preview * gPreview, int ObjectID)
{
int Result = *(DWORD*)oMapNumber - 9;//-> int 92114C
int MapNumber = Result;
// ----
if( MapNumber - 9 > 0 && MapNumber <= 8 && ObjectID >= 84 && ObjectID <= 143 )
{
gPreview->Unknown98 = 0;//-> WORD +98
Result = (int)gPreview;//-> Return struct addr
// ----
gPreview->ModelScale += (double)(MapNumber / 3) * 0.050000001; //-> float +796
}
// ----
if( gPreview )
{
for( i = 0; i < 1024; i++ ) //-> Max monster space
{
if( ObjectID == word_7B522E8[27 * i] )//-> Filled monster table, maybe store names
{
gSetDisplayMonsterTarget(gPreview + 56);//-> 8AAC00
break;
}
}
// ----
gPreview->Unknown100 = ObjectID;//-> WORD +100
Result = (int)gPreview; //-> Return struct addr
// ----
gPreview->Unknown720= 0;//-> BYTE +720
gPreview->Unknown96= dword_81A01CC;//-> WORD +96
// ----
if( ObjectID == 200 )//Soccerball
{
Result = gPreview->Unknown700;//-> Some result value for many functions
gPreview->ObjectType = 2;//-> BYTE +722, set monster type for Soccerball
}
else
{
if( ObjectID < 260 )
{
if( ObjectID <= 200 )
{
if( ObjectID < 150 )
{
if( ObjectID <= 110 )
{
if( ObjectID < 100 )
{
Result = gPreview->Unknown700;
gPreview->ObjectType = 2; //-> Set Monster object type
}
else
{
gPreview->ObjectType = 8;//-> Set NONE object type
}
}
else
{
gPreview->ObjectType = 2; //-> Set Monster object type
}
}
else
{
Result = gPreview->Unknown700;
gPreview->ObjectType = 2; //-> Set Monster object type
}
}
else
{
gPreview->ObjectType = 4; //-> Set NPC object type
}
}
else
{
gPreview->ObjectType = 2; //-> Set Monster object type
}
}
// ----
if( ObjectID == 368 || ObjectID == 369 || ObjectID == 370 )
{
gPreview->ObjectType = 4; //-> Set NPC object type
}
if( ObjectID == 367
|| ObjectID == 371
|| ObjectID == 375
|| ObjectID == 376
|| ObjectID == 377
|| ObjectID == 379
|| ObjectID == 380
|| ObjectID == 381
|| ObjectID == 382
|| ObjectID == 383
|| ObjectID == 384
|| ObjectID == 385
|| ObjectID == 406
|| ObjectID == 407
|| ObjectID == 408
|| ObjectID == 414
|| ObjectID == 415
|| ObjectID == 416
|| ObjectID == 417
|| ObjectID == 450
|| ObjectID == 452
|| ObjectID == 453
|| ObjectID == 464
|| ObjectID == 465
|| ObjectID == 467
|| ObjectID == 468
|| ObjectID == 469
|| ObjectID == 470
|| ObjectID == 471
|| ObjectID == 472
|| ObjectID == 473
|| ObjectID == 474
|| ObjectID == 475
|| ObjectID == 478
|| ObjectID == 479
|| ObjectID == 492
|| ObjectID == 540
|| ObjectID == 541
|| ObjectID == 542
|| ObjectID == 522
|| ObjectID == 543
|| ObjectID == 544
|| ObjectID == 545
|| ObjectID == 546
|| ObjectID == 547 )
{
gPreview->ObjectType = 4; //-> Set NPC object type
}
// ----
if( ObjectID >= 480 && ObjectID <= 491 )
{
Result = gPreview->Unknown700;
gPreview->ObjectType = 2; //-> Set Monster object type
}
// ----
if( ObjectID == 451 )
{
gPreview->ObjectType = 0x80u;//-> Cherry Blossom Tree, set NONE Object type
}
}
// ----
return Result;
}
My offsets from 1.03.28 GMO, good luck)
P.S.: Screen =D
http://img442.imageshack.us/img442/1043/mobxj.jpg
Hi @-=DarkSim=- you now the way to add elf soldier npc to 99b main? 0.99.28 chs
You can teach me or give me some guide to do it?
Thanks
Enviado desde mi POT-LX3 mediante Tapatalk