Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

Damage Mob Calculation

Newbie Spellweaver
Joined
May 24, 2019
Messages
26
Reaction score
2
Goodnight. I am trying to build a v53 server based on bms v8 leaks. I've already been able to do the calculations for pad, pdd, mad, mdd....on the server side. However, when calculating the damage caused by monsters, the dice are very different. Follow the codes:


My CRand ->

Code:
public class InstanceCRand32 {

    long seed1;   long seed2;
   long seed3;
   long oldSeed1;
   long oldSeed2;
   long oldSeed3;

   public InstanceCRand32(int seed1, int seed2, int seed3) {

        this.seed1 = seed1;
       this.seed2 = seed2;
       this.seed3 = seed3;[INDENT]seed(seed1, seed2, seed3);
[/INDENT]
}

    public synchronized final long Random() {

        oldSeed1 = seed1;[INDENT]oldSeed2 = seed2;
oldSeed3 = seed1;

seed1 = ((seed1 & 0xFFFFFFFE) << 12) ^ ((seed1 & 0x7FFC0 ^ (seed1 >> 13)) >> 6);
seed2 = (16 * (seed2 & 0xFFFFFFF8)) ^ (((seed2 >> 2) ^ seed2 & 0x3F800000) >> 23);
seed3 = ((seed3 & 0xFFFFFFF0) << 17) ^ (((seed3 >> 3) ^ seed3 & 0x1FFFFF00) >> 8);

       return (seed1 ^ seed2 ^ seed3) & 0xffffffffL;

}[/INDENT]

    public void seed(int s1, int s2, int s3) {
        this.seed1 = s1 | 0x100000;
       this.oldSeed1 = s1 | 0x100000;

       this.seed2 = s2 | 0x1000;
       this.oldSeed2 = s2 | 0x1000;

       this.seed3 = s3 | 0x10;
       this.oldSeed3 = s3 | 0x10;
}

}

My calc ->

Code:
public boolean checkDamage(InstanceMob mob, int damageClient, long rndDamage) {
    EntityCharacters ec = instanceCharacter.getEntityCharacters();
InstanceCharacterStats ics = instanceCharacter.getIcs();
   int nJobCategory = ec.getJob().getJobid() / 100;

InstanceMobStats ims = mob.getIms();
   int pad = ims.getMaxPad();

   double v14 = pad * 0.85;
   double a = pad * 0.85;
   double damage = pad * 0.8;
   double v18 = 0;
   double v19 = 0;

   boolean ignoreCalc = false;

   if (a <= damage) {
        if (v14 == damage) {

            ignoreCalc = true;

}
    }

    if (!ignoreCalc) {
        v14 = a;
v14 = v14 + (damage - v14) * (rndDamage % 0x989680) * 0.000000100000010000001;
}

    int charPdd = ics.getMaxPdd();
damage = v14 * pad * 0.01;

   int pddBase = (804 * nJobCategory) + 196 + (4 * ec.getLevel());

   if (nJobCategory == 1) {
        v18 = ((double) ics.getTotLuk() + (double) ics.getTotDex()) * 0.25
+ (double) ics.getTotInt() * 0.1111111111111111;
v19 = (double) ics.getTotStr() * 0.2857142857142857;
} else {
        v18 = (double) ics.getTotInt() * 0.1111111111111111
+ (double) ics.getTotDex() * 0.2857142857142857
+ (double) ics.getTotStr() * 0.4;
v19 = (double) ics.getTotLuk() * 0.25;
}
    int nBase = (int) (v18 + v19);
   double v20 = 0;
   double v21 = 0;
   double v22 = 0;
   if (charPdd < pddBase) {
        double v24 = (double) nBase * 0.00125;
       double v25 = (double) ec.getLevel() * 0.001818181818181818 + v24 + 0.28;
       if (ec.getLevel() >= ims.getLevel())
            v21 = v25 * (double) (charPdd - pddBase) * 13.0 / ((double) (ec.getLevel() - ims.getLevel()) + 13.0);
       else
v21 = v25 * (double) (charPdd - pddBase) * 1.3;
v22 = v24;
} else {
        v20 = nBase;
v21 = (v20 * 0.001111111111111111 + (double) ec.getLevel() * 0.0007692307692307692 + 0.28)
                * (double) (charPdd - pddBase)
                * 0.7;
v22 = v20 * 0.00125;
}
     double v27 = damage
            - (v21
            + (v22 + 0.28) * (double) charPdd)
            - (double) 0/* nInvincible_ */ * (damage - (v21 + (v22 + 0.28) * (double) charPdd)) * 0.01;

   double v28 = v27;
// TODO check int __thiscall CalcDamage::GetMesoGuardReduce(CalcDamage *this, CharacterData *cd, long double damage)
// TODO CHECK msa = mobStats->nPowerUp_; v28 = (double)msa * v28 * 0.01;

if (v28 <= 1.0)
        v28 = 1.0;
   if (v28 >= 99999.0)
        v28 = 99999.0;

log.info("Dano cliente: " + damageClient);
log.info("Dano server: " + v28);

   return v28 == damageClient;
}

BMS calculation:

Code:
[COLOR=#CC7832]int [/COLOR][COLOR=#A9B7C6]__thiscall CalcDamage::PDamage[/COLOR]      (CalcDamage * [COLOR=#cc7832]this, [/COLOR]MobStat * mobStats[COLOR=#cc7832], [/COLOR]CharacterData * cd[COLOR=#cc7832], [/COLOR]BasicStat * characterStats[COLOR=#cc7832], [/COLOR]SecondaryStat * characterSs[COLOR=#cc7832], [/COLOR]MobAttackInfo * pInfo[COLOR=#cc7832], [/COLOR]unsigned
      [COLOR=#cc7832]int [/COLOR]nRandForMissCheck[COLOR=#cc7832], int [/COLOR]*pnReduce[COLOR=#cc7832], [/COLOR]unsigned [COLOR=#cc7832]int [/COLOR]*pnRand)
      {
          [COLOR=#cc7832]int [/COLOR]v10[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// eax
[/COLOR][COLOR=#cc7832]int [/COLOR]v11[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// eax
[/COLOR][COLOR=#cc7832]int [/COLOR]charPdd1[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// esi
[/COLOR]unsigned [COLOR=#cc7832]int [/COLOR]v13[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// ebx
[/COLOR][COLOR=#cc7832]long double [/COLOR]v14[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// st7
[/COLOR][COLOR=#cc7832]int [/COLOR]charPdd[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// eax
[/COLOR][COLOR=#cc7832]int [/COLOR]pddBase[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// eax
[/COLOR][COLOR=#cc7832]int [/COLOR]pddBase1[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// ebx
[/COLOR][COLOR=#cc7832]double [/COLOR]v18[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// st7
[/COLOR][COLOR=#cc7832]double [/COLOR]v19[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// st6
[/COLOR][COLOR=#cc7832]double [/COLOR]v20[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// st7
[/COLOR][COLOR=#cc7832]double [/COLOR]v21[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// st6
[/COLOR][COLOR=#cc7832]double [/COLOR]v22[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// st5
[/COLOR][COLOR=#cc7832]int [/COLOR]v23[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// eax
[/COLOR][COLOR=#cc7832]double [/COLOR]v24[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// st7
[/COLOR][COLOR=#cc7832]double [/COLOR]v25[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// st6
[/COLOR]bool v26[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// zf
[/COLOR][COLOR=#cc7832]long double [/COLOR]v27[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// st6
[/COLOR][COLOR=#cc7832]long double [/COLOR]v28[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// st7
[/COLOR][COLOR=#cc7832]int [/COLOR]v29[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// eax
[/COLOR][COLOR=#cc7832]long double [/COLOR]a[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// [esp+14h] [ebp-20h] BYREF
[/COLOR][COLOR=#cc7832]double [/COLOR]characterPdd[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// [esp+1Ch] [ebp-18h]
[/COLOR][COLOR=#cc7832]double [/COLOR]damage[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// [esp+24h] [ebp-10h] BYREF
[/COLOR]CalcDamage * thisa[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// [esp+2Ch] [ebp-8h]
[/COLOR][COLOR=#cc7832]int [/COLOR]nJobCategory[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// [esp+30h] [ebp-4h]
[/COLOR][COLOR=#cc7832]int [/COLOR]msa[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// [esp+3Ch] [ebp+8h]
[/COLOR][COLOR=#cc7832]int [/COLOR]nPDD[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// [esp+44h] [ebp+10h]
[/COLOR][COLOR=#cc7832]int [/COLOR]nBase[COLOR=#cc7832]; [/COLOR][COLOR=#808080]// [esp+4Ch] [ebp+18h]
[/COLOR][COLOR=#808080]
[/COLOR]v10 = characterStats -> nJob / [COLOR=#6897bb]100[/COLOR][COLOR=#cc7832];
[/COLOR]thisa = [COLOR=#cc7832]this;
[/COLOR]nJobCategory = v10[COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]          if [/COLOR](pInfo)
              v11 = pInfo -> nPAD + mobStats -> nPAD_[COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]          else
[/COLOR]v11 = mobStats -> nPAD + mobStats -> nPAD_[COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]          if [/COLOR](v11 <= [COLOR=#6897bb]0[/COLOR])
              v11 = [COLOR=#6897bb]0[/COLOR][COLOR=#cc7832];
[/COLOR]charPdd1 = [COLOR=#6897bb]1999[/COLOR][COLOR=#cc7832];
[/COLOR]nPDD = v11[COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]          if [/COLOR](v11 >= [COLOR=#6897bb]1999[/COLOR])
              nPDD = [COLOR=#6897bb]1999[/COLOR][COLOR=#cc7832];
[/COLOR]v13 = CRand32::Random ( & [COLOR=#cc7832]this[/COLOR]->m_RndGenForMob)[COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]          if [/COLOR](pnRand)
  *pnRand = v13[COLOR=#cc7832];
[/COLOR]characterPdd = ([COLOR=#cc7832]double[/COLOR]) nPDD[COLOR=#cc7832];
[/COLOR]v14 = characterPdd * [COLOR=#6897bb]0.85[/COLOR][COLOR=#cc7832];
[/COLOR]a = characterPdd * [COLOR=#6897bb]0.85[/COLOR][COLOR=#cc7832];
[/COLOR]damage = characterPdd * [COLOR=#6897bb]0.8[/COLOR][COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]          if [/COLOR](a <= damage) {
              [COLOR=#cc7832]if [/COLOR](v14 == damage)
    [COLOR=#cc7832]goto [/COLOR]LABEL_14[COLOR=#cc7832];
[/COLOR]} [COLOR=#cc7832]else [/COLOR]{
              zswap( & a[COLOR=#cc7832], [/COLOR]&damage)[COLOR=#cc7832];
[/COLOR]v14 = a[COLOR=#cc7832];
[/COLOR]}
*(_QWORD *) & a = v13 % [COLOR=#6897bb]0x989680[/COLOR][COLOR=#cc7832];
[/COLOR]v14 = v14 + (damage - v14) * ( [COLOR=#cc7832]double[/COLOR])*(__int64 *) & a * [COLOR=#6897bb]0.000000100000010000001[/COLOR][COLOR=#cc7832];
[/COLOR]LABEL_14:
          charPdd = characterSs -> [COLOR=#b389c5]nPDD [/COLOR]+ characterSs -> nPDD_[COLOR=#cc7832];
[/COLOR]damage = v14 * characterPdd * [COLOR=#6897bb]0.01[/COLOR][COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]          if [/COLOR](charPdd <= [COLOR=#6897bb]0[/COLOR])
              charPdd = [COLOR=#6897bb]0[/COLOR][COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]          if [/COLOR](charPdd < [COLOR=#6897bb]1999[/COLOR])
              charPdd1 = charPdd[COLOR=#cc7832];
[/COLOR]pddBase = CalcDamage::GetStandardPDD (nJobCategory[COLOR=#cc7832], [/COLOR]characterStats -> nLevel)[COLOR=#cc7832];
[/COLOR]pddBase1 = pddBase[COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]          if [/COLOR](nJobCategory == [COLOR=#6897bb]1[/COLOR]) {
              v18 = (([COLOR=#cc7832]double[/COLOR]) characterStats -> nLUK + ([COLOR=#cc7832]double[/COLOR]) characterStats -> nDEX) * [COLOR=#6897bb]0.25
[/COLOR]+ ([COLOR=#cc7832]double[/COLOR]) characterStats -> nINT * [COLOR=#6897bb]0.1111111111111111[/COLOR][COLOR=#cc7832];
[/COLOR]v19 = ([COLOR=#cc7832]double[/COLOR]) characterStats -> nSTR * [COLOR=#6897bb]0.2857142857142857[/COLOR][COLOR=#cc7832];
[/COLOR]} [COLOR=#cc7832]else [/COLOR]{
              v18 = ([COLOR=#cc7832]double[/COLOR]) characterStats -> nINT * [COLOR=#6897bb]0.1111111111111111
[/COLOR]+ ([COLOR=#cc7832]double[/COLOR]) characterStats -> nDEX * [COLOR=#6897bb]0.2857142857142857
[/COLOR]+ ([COLOR=#cc7832]double[/COLOR]) characterStats -> nSTR * [COLOR=#6897bb]0.4[/COLOR][COLOR=#cc7832];
[/COLOR]v19 = ([COLOR=#cc7832]double[/COLOR]) characterStats -> nLUK * [COLOR=#6897bb]0.25[/COLOR][COLOR=#cc7832];
[/COLOR]}
          nBase = (__int64) (v18 + v19)[COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]          if [/COLOR](charPdd1 < pddBase) {
              v23 = characterStats -> nLevel[COLOR=#cc7832];
[/COLOR]v24 = ([COLOR=#cc7832]double[/COLOR]) nBase * [COLOR=#6897bb]0.00125[/COLOR][COLOR=#cc7832];
[/COLOR]v25 = ([COLOR=#cc7832]double[/COLOR]) v23 * [COLOR=#6897bb]0.001818181818181818 [/COLOR]+ v24 + [COLOR=#6897bb]0.28[/COLOR][COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]              if [/COLOR](v23 >= mobStats -> nLevel)
                  v21 = v25 * ([COLOR=#cc7832]double[/COLOR]) (charPdd1 - pddBase1) * [COLOR=#6897bb]13.0 [/COLOR]/ (([COLOR=#cc7832]double[/COLOR]) (v23 - mobStats -> nLevel) + [COLOR=#6897bb]13.0[/COLOR])[COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]              else
[/COLOR]v21 = v25 * ([COLOR=#cc7832]double[/COLOR]) (charPdd1 - pddBase1) * [COLOR=#6897bb]1.3[/COLOR][COLOR=#cc7832];
[/COLOR]v22 = v24[COLOR=#cc7832];
[/COLOR]} [COLOR=#cc7832]else [/COLOR]{
              v20 = ([COLOR=#cc7832]double[/COLOR]) nBase[COLOR=#cc7832];
[/COLOR]v21 = (v20 * [COLOR=#6897bb]0.001111111111111111 [/COLOR]+ ([COLOR=#cc7832]double[/COLOR]) characterStats -> nLevel * [COLOR=#6897bb]0.0007692307692307692 [/COLOR]+ [COLOR=#6897bb]0.28[/COLOR])
                      * ([COLOR=#cc7832]double[/COLOR]) (charPdd1 - pddBase)
                      * [COLOR=#6897bb]0.7[/COLOR][COLOR=#cc7832];
[/COLOR]v22 = v20 * [COLOR=#6897bb]0.00125[/COLOR][COLOR=#cc7832];
[/COLOR]}
          v26 = characterSs -> nMesoGuard_ == [COLOR=#6897bb]0[/COLOR][COLOR=#cc7832];
[/COLOR]v27 = damage
                  - (v21
                  + (v22 + [COLOR=#6897bb]0.28[/COLOR]) * ([COLOR=#cc7832]double[/COLOR]) charPdd1)
                  - ([COLOR=#cc7832]double[/COLOR]) characterSs -> nInvincible_ * ([COLOR=#b389c5]damage [/COLOR]- ([COLOR=#b389c5]v21 [/COLOR]+ ([COLOR=#b389c5]v22 [/COLOR]+ [COLOR=#6897bb]0.28[/COLOR]) * ([COLOR=#cc7832]double[/COLOR]) [COLOR=#b389c5]charPdd1[/COLOR])) * [COLOR=#6897bb]0.01[/COLOR][COLOR=#cc7832];
[/COLOR]damage = v27[COLOR=#cc7832];
[/COLOR]v28 = v27[COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]          if [/COLOR](!v26 && pnReduce) {
              v29 = CalcDamage::GetMesoGuardReduce (thisa[COLOR=#cc7832], [/COLOR]cd[COLOR=#cc7832], [/COLOR]v27)[COLOR=#cc7832];
[/COLOR]v28 = damage[COLOR=#cc7832];
[/COLOR]*pnReduce = v29[COLOR=#cc7832];
[/COLOR]}
          msa = mobStats -> nPowerUp_[COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]          if [/COLOR](msa)
              v28 = ([COLOR=#cc7832]double[/COLOR]) msa * v28 * [COLOR=#6897bb]0.01[/COLOR][COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]          if [/COLOR](v28 <= [COLOR=#6897bb]1.0[/COLOR])
              v28 = [COLOR=#6897bb]1.0[/COLOR][COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]          if [/COLOR](v28 >= [COLOR=#6897bb]99999.0[/COLOR])
              v28 = [COLOR=#6897bb]99999.0[/COLOR][COLOR=#cc7832];
[/COLOR][COLOR=#cc7832]          return [/COLOR](__int64) v28[COLOR=#cc7832];
[/COLOR][COLOR=#A9B7C6]}[/COLOR]

Result my calculation in player stats is firs image attachment

and result is wrong

Client damage 64
Server damage 123.98971414186232
:*:

detail this is the first attack, so it couldn't go wrong unless the seed is wrong when calculating the seed in the enterfield
Thanks for help
 

Attachments

You must be registered for see attachments list
Back
Top