You last visited: Today at 14:09
Advertisement
[Int] Dropsystem
Discussion on [Int] Dropsystem within the Kal Online forum part of the MMORPGs category.
02/20/2013, 13:09
#1
elite*gold: 0
Join Date: Oct 2009
Posts: 26
Received Thanks: 1
[Int] Dropsystem
wie der titel schon sagt, es geht um das dropsystem.
kann da jemand was zu sagen, also wie die drops im mainserver errechnet werden, bzw. wie das ganze funktioniert?
02/20/2013, 15:36
#2
elite*gold: 55
Join Date: Mar 2006
Posts: 4,582
Received Thanks: 1,539
hier der IDA Pseudo Code sieht total bekloppt halt aus aber was besseres wird da nicht ausgespuckt.
Code:
char __thiscall CInitMonster__DropItem(void *this, int a2, int a3, int a4, int a5, int a6)
{
__int64 v6; // qax@15
__int64 v7; // qax@24
__int64 v8; // qax@29
int v9; // eax@40
unsigned __int8 v10; // al@49
int v11; // eax@49
int v12; // eax@50
int v14; // [sp+18h] [bp-40h]@12
void *v15; // [sp+1Ch] [bp-3Ch]@1
char v16; // [sp+20h] [bp-38h]@49
char v17; // [sp+24h] [bp-34h]@52
int v18; // [sp+28h] [bp-30h]@50
int v19; // [sp+2Ch] [bp-2Ch]@50
int v20; // [sp+30h] [bp-28h]@50
char v21; // [sp+34h] [bp-24h]@48
int v22; // [sp+38h] [bp-20h]@36
int v23; // [sp+3Ch] [bp-1Ch]@16
int i; // [sp+40h] [bp-18h]@8
int v25; // [sp+44h] [bp-14h]@1
int v26; // [sp+48h] [bp-10h]@1
int v27; // [sp+4Ch] [bp-Ch]@1
int v28; // [sp+50h] [bp-8h]@1
int v29; // [sp+54h] [bp-4h]@1
v15 = this;
v26 = 0;
v29 = 0;
v27 = 0;
v28 = 0;
v25 = 0;
if ( a3 )
{
v29 = CParty__FindParty(a4);
if ( v29 )
v26 = CParty__GetRandomPlayer(v29);
}
else
{
v26 = CPlayer__FindPlayer_(a4);
}
if ( v26 )
{
for ( i = 0; i < *((_DWORD *)v15 + 29); ++i )
{
v27 = 0;
if ( dword_4E1178 & 1 || dword_4E1174 & 0x100 )
v14 = 2 * *((_DWORD *)v15 + i + 24);
else
v14 = *((_DWORD *)v15 + i + 24);
v28 = v14;
if ( *((_DWORD *)v15 + 16) == 4 )
{
if ( v29 )
{
v28 += CParty__GetLuckySize(0);
}
else
{
LODWORD(v8) = Unknowns__sub_409720(33554432, 0);
if ( v8 )
++v28;
}
}
else
{
LODWORD(v6) = Unknowns__sub_409720(201326592, 0);
if ( v6 )
{
v23 = Unknowns__sub_406E10(1, 10000);
if ( v23 <= 481 )
{
if ( v23 <= 81 )
{
if ( v23 <= 21 )
{
if ( v23 <= 1 )
{
LODWORD(v7) = Unknowns__sub_409720(134217728, 0);
if ( v7 )
v27 = 4;
}
else
{
v27 = 3;
}
}
else
{
v27 = 2;
}
}
else
{
v27 = 1;
}
}
}
}
v25 = v27;
CInitMonster__DropItemEx(a2, v28, *((_DWORD *)v15 + i + 19), a3, a4, &v27, 0);
if ( a6 )
{
if ( Unknowns__sub_406E10(1, 100) > 50 )
CInitMonster__DropItemEx(a2, v28, *((_DWORD *)v15 + i + 19), a3, a4, &v27, a6);
}
if ( v27 < 0 )
{
if ( v29 )
{
v22 = CIOObject__WriteExclusive(68, "bb");
CParty__Broadcast(v22, 0);
}
else
{
CChar__Write(v26, 68, "bb");
}
}
}
ObjectRelease((void *)v26, v26 + 352);
}
v9 = (unsigned __int8)Unknowns__sub_445B60((char *)v15 + 272);
if ( !(_BYTE)v9 )
{
v26 = 0;
if ( v29 )
{
v9 = CParty__GetRandomPlayer(v29);
v26 = v9;
}
else
{
a4 = a5;
v9 = CPlayer__FindPlayer_(a5);
v26 = v9;
}
if ( v26 )
{
if ( CSMap__IsValidTile(v26 + 332, 131072) )
{
Unknowns__sub_430C20(&v21);
while ( 1 )
{
v11 = Unknowns__sub_445B40(&v16);
v10 = Unknowns__sub_47D070(v11);
if ( !v10 )
break;
v12 = Unknowns__sub_420010(&v21, v10);
v18 = *(_DWORD *)v12;
v19 = *(_DWORD *)(v12 + 4);
v20 = *(_DWORD *)(v12 + 8);
if ( CPlayer__CheckQuestFlag(v18) )
{
v27 = 0;
CInitMonster__DropItemEx(a2, v20, v19, a3, a4, &v27, 0);
}
Unknowns__sub_446060(&v17, 0);
}
}
LOBYTE(v9) = ObjectRelease((void *)v26, v26 + 352);
}
}
if ( v29 )
LOBYTE(v9) = CIOObject__Release(v29);
return v9;
}
Code:
void __stdcall CInitMonster__DropItemEx(int a1, int a2, int a3, int a4, int a5, int a6, int a7)
{
int v7; // [sp+4h] [bp-28h]@7
int v8; // [sp+14h] [bp-18h]@10
int v9; // [sp+18h] [bp-14h]@10
int v10; // [sp+1Ch] [bp-10h]@10
int v11; // [sp+20h] [bp-Ch]@10
int v12; // [sp+24h] [bp-8h]@3
int i; // [sp+28h] [bp-4h]@1
for ( i = 0; i < a2; ++i )
{
v12 = CItem__CreateDropItem(a3, a7);
if ( v12 )
{
if ( (*(int (__thiscall **)(int))(*(_DWORD *)v12 + 164))(v12) )
{
if ( *(_DWORD *)a6 > 0 )
{
if ( *(_DWORD *)a6 < 5 )
v7 = dword_4D62D8[*(_DWORD *)a6];
else
v7 = 1;
*(_DWORD *)(v12 + 52) *= v7;
*(_DWORD *)a6 = -1;
}
}
CChar__GetDropPt(&v8);
v10 = v8 >> 5;
v11 = v9 >> 5;
if ( CSMap__GetCellMap(v12, &v10) )
{
*(_DWORD *)(v12 + 80) = 1;
(*(void (__thiscall **)(int))(*(_DWORD *)v12 + 124))(v12);
}
else
{
if ( v12 )
(**(void (__thiscall ***)(_DWORD))v12)(v12);
}
}
}
}
Code:
int __cdecl CItem__CreateDropItem(int a1, int a2)
{
int v2; // eax@1
char v4; // [sp+0h] [bp-1Ch]@1
int v5; // [sp+4h] [bp-18h]@5
int v6; // [sp+8h] [bp-14h]@3
int v7; // [sp+Ch] [bp-10h]@3
int v8; // [sp+10h] [bp-Ch]@5
int v9; // [sp+14h] [bp-8h]@3
char v10; // [sp+18h] [bp-4h]@1
Unknowns__sub_47DE70(&unk_4E10D8);
Unknowns__sub_44AE20(&v10, &a1);
v2 = Unknowns__sub_430C20(&v4);
if ( (unsigned __int8)unknown_libname_8(v2) )
{
Unknowns__sub_47E080(&unk_4E10D8);
return 0;
}
v6 = 0;
v9 = 0;
v7 = 0;
Unknowns__sub_420250(&v10);
CItemGroup__GetItemInfo(&v6, &v9, &v7);
Unknowns__sub_47E080(&unk_4E10D8);
if ( v7 <= 0 )
return 0;
v8 = 0;
v5 = CItem__FindInitItem(v6);
if ( v5 )
{
if ( (a2 & *(_DWORD *)(v5 + 76)) != a2 )
return 0;
v8 = CItem__NewItem(v5);
if ( v8 )
(*(void (__thiscall **)(int))(*(_DWORD *)v8 + 76))(v8);
}
return v8;
}
Code:
char __stdcall CItemGroup__GetItemInfo(int a1, int a2, int a3)
{
int v3; // eax@2
int v4; // eax@2
int v5; // eax@3
char v7; // [sp+4h] [bp-10h]@2
char v8; // [sp+8h] [bp-Ch]@5
char v9; // [sp+Ch] [bp-8h]@1
int v10; // [sp+10h] [bp-4h]@1
v10 = Unknowns__sub_406E10(1, 1000);
Unknowns__sub_430C20(&v9);
while ( 1 )
{
v4 = Unknowns__sub_445B40(&v7);
v3 = (unsigned __int8)Unknowns__sub_47D070(v4);
if ( !(_BYTE)v3 )
break;
v5 = Unknowns__sub_430DE0(&v9);
if ( v10 <= *(_DWORD *)v5 )
{
Unknowns__sub_430DE0(&v9);
LOBYTE(v3) = CGroup__GetItemInfo(a1, a2, a3);
return v3;
}
Unknowns__sub_430E30(&v8, 0);
}
return v3;
}
Code:
void __thiscall CGroup__GetItemInfo(void *this, int a2, int a3, int a4)
{
int v4; // eax@4
int v5; // eax@5
char v6; // [sp+4h] [bp-10h]@4
char v7; // [sp+8h] [bp-Ch]@7
char v8; // [sp+Ch] [bp-8h]@3
int v9; // [sp+10h] [bp-4h]@3
if ( this )
{
v9 = Unknowns__sub_406E10(1, 1000);
Unknowns__sub_430C20(&v8);
while ( 1 )
{
v4 = Unknowns__sub_445B40(&v6);
if ( !(unsigned __int8)Unknowns__sub_47D070(v4) )
break;
v5 = Unknowns__sub_430DE0(&v8);
if ( v9 <= *(_DWORD *)v5 )
{
*(_DWORD *)a2 = *(_DWORD *)(Unknowns__sub_430DE0(&v8) + 4);
*(_DWORD *)a3 = *(_DWORD *)(Unknowns__sub_430DE0(&v8) + 8);
*(_DWORD *)a4 = *(_DWORD *)(Unknowns__sub_430DE0(&v8) + 12);
return;
}
Unknowns__sub_430E00(&v7, 0);
}
}
}
02/20/2013, 19:36
#3
elite*gold: 0
Join Date: Oct 2011
Posts: 189
Received Thanks: 61
Beim 3, 4, 5 sind es Maps oder Vectoren... Einfach testen (std::map<int,int>*) oder (std::vector<int>*) und dann sehen was rauskommt...
wenns nen vector ist, dann ist es ein pointer auf ne class/struct und bei der map könnte der erste wert nen index und der zweite der pointer sein..
02/20/2013, 20:04
#4
elite*gold: 0
Join Date: Oct 2009
Posts: 26
Received Thanks: 1
erstmal danke für eure antworten!
jedoch bringt mich das leider bei meiner frage nicht unbedingt weiter.
gibts da auch eine vereinfachte version von?
edit: gerne auch per pm, falls ihr genauere infos braucht um was es geht..
02/20/2013, 20:11
#5
elite*gold: 55
Join Date: Mar 2006
Posts: 4,582
Received Thanks: 1,539
was willst du denn rausfinden? Oo
02/20/2013, 20:18
#6
elite*gold: 0
Join Date: Oct 2009
Posts: 26
Received Thanks: 1
hab dir ne pm geschrieben.
02/23/2013, 07:58
#7
elite*gold: 0
Join Date: Jan 2011
Posts: 14
Received Thanks: 0
das wüsste ich auch gerne mal
02/23/2013, 19:09
#8
elite*gold: 0
Join Date: Oct 2009
Posts: 26
Received Thanks: 1
es geht darum:
ich kille mob X.
mob X dropt item X.
meine frage dazu: wie bestimmt der server wann item X gedropt wird.
02/23/2013, 19:14
#9
elite*gold: 0
Join Date: Jan 2009
Posts: 224
Received Thanks: 66
ich glaube prozentual kille mob x 200000 mal und bekomme item x
02/23/2013, 19:42
#10
elite*gold: 0
Join Date: Nov 2012
Posts: 367
Received Thanks: 436
Quote:
Originally Posted by
maree
ich glaube prozentual kille mob x 200000 mal und bekomme item x
Ehhhhh....Ne
02/23/2013, 20:02
#11
elite*gold: 0
Join Date: Jan 2009
Posts: 224
Received Thanks: 66
dann ist alles zufall xD
Similar Threads
[DEV] neues Dropsystem
03/09/2012 - Flyff Private Server - 0 Replies
Hi Elitepvpers...
manchen dürfte aufgefallen sein, dass im Weatherordner des Koreanischen Flyff Clients eine merkwürdige .res Datei aufgetaucht ist: DropItem.res
In dieser Resdatei scheinen die neuen Dropdateien für die Monster drin zu sein, die Flyff anstatt der PropMoverEx.inc verwendet.
5 Dateien sind hier für die Drops verantwortlich:
propDropLevelPenalty.csv --> reduziert die Dropwahrscheinlichkeit aufgrund der Leveldifferenz zwischen Spieler und Monster
propDropMonsterLevel.csv...
All times are GMT +2. The time now is 14:10 .