- // do normal attack->Pepu
- void CCharacter::NormalAttack( CCharacter* Enemy )
- {
- Enemy->OnBeAttacked( this );
- Position->destiny = Position->current;
- //iSuc
- float iSuc = rand() % 180;
- iSuc += ((float(Enemy->Stats->Dodge) * 0.7f) - float(Stats->Accury)) + 1.0f;
- iSuc += 10.0f;
- iSuc *= 0.2f;
- iSuc -= ((Stats->Level - Enemy->Stats->Level)*0.5);
- //CRITICAL RATE->Pepu
- int critRate = 10 * (rand() % 100 + 1);
- critRate = 16 * (critRate + Stats->Level + 30);
- critRate = critRate / (Stats->Critical + 70);
- //hitpower formula ->Pepu
- long int curDamage = 0;
- long int hitpower = 0;
- bool critical = false;
- if (critRate < 20) critical = true;
- if(IsPlayer( ))
- {
- if (Stats->magicattack == 1)
- {
- float tempFloat = ((iSuc * 0.06f) + 29) * (int)Enemy->Stats->Attack_Power;
- tempFloat *= (int)Enemy->Stats->Attack_Power - ((int)Enemy->Stats->Defense * 0.8f) + 350;
- curDamage = (int)(tempFloat / ((((int)Enemy->Stats->Dodge * 0.3f) + (int)Enemy->Stats->Magic_Defense + 5) * 640.0f) + 20);
- curDamage -= 15;
- }
- else
- {
- float tempFloat = ((iSuc * 0.05f) + 25) * (int)Enemy->Stats->Attack_Power;
- tempFloat *= (int)Enemy->Stats->Attack_Power - (int)Enemy->Stats->Defense + 400;
- curDamage = (int)(tempFloat / ((((int)Enemy->Stats->Dodge * 0.4f) + (int)Enemy->Stats->Defense + 5.0f) * 420.0f) + 20);
- curDamage -= 15;
- }
- if(critRate < 20) curDamage+= Stats->Critical;
- }
- if(IsMonster( ))
- {
- if (Stats->magicattack == 1)
- {
- float tempFloat = ((iSuc * 0.03f) + 30) * (int)Enemy->Stats->Attack_Power;
- tempFloat *= (int)Enemy->Stats->Attack_Power - ((int)Enemy->Stats->Defense * 0.8f) + 280;
- curDamage = (int)(tempFloat / ((((int)Enemy->Stats->Dodge * 0.3f) + (int)Enemy->Stats->Magic_Defense + 5) * 280.0f));
- curDamage -= 10;
- }
- else
- {
- float tempFloat = ((iSuc * 0.03f) + 26) * (int)Enemy->Stats->Attack_Power;
- tempFloat *= (int)Enemy->Stats->Attack_Power - (int)Enemy->Stats->Defense + 250;
- curDamage = (int)(tempFloat / ((((int)Enemy->Stats->Dodge * 0.4f) + (int)Enemy->Stats->Defense + 5.0f) * 145.0f));
- curDamage -= 10;
- }
- if(critRate < 20) curDamage+= Enemy->Stats->Critical;
- }
- hitpower = (long int)curDamage;
- if(hitpower<=5)
- {
- hitpower = 5;
- }
- hitpower = (long int)hitpower + GServer->RandNumber(0,10);
- // dodge->Pepu
- float hitvalue = rand() % 180;
- hitvalue += ((float(Enemy->Stats->Dodge) * 0.7f) - float(Stats->Accury)) + 1.0f;
- hitvalue += 10.0f;
- hitvalue *= 0.2f;
- hitvalue -= ((Stats->Level - Enemy->Stats->Level)*0.5);
- int hitvalue2 = (int)hitvalue;
- //unsigned int hitvalue = (unsigned int)floor((double)(Stats->Accury * 100 / Enemy->Stats->Dodge));
- if(hitvalue2>=20)
- hitpower = 0; // dodged
- if (hitpower > 0x7ff)//2047 packet size limit.
- {
- hitpower=0x7ff;
- }
- if(!Enemy->IsSummon( ) && Enemy->IsMonster( ))
- {
- Enemy->AddDamage( this, hitpower );
- Enemy->damagecounter += hitpower;// is for AI
- }
- Enemy->Stats->HP -= hitpower;
- BEGINPACKET( pak, 0x799 );
- ADDWORD ( pak, clientid );
- ADDWORD ( pak, Battle->atktarget );
- #ifdef USE124
- ADDDWORD ( pak, hitpower );
- #endif
- if(Enemy->IsDead())
- {
- CDrop* thisdrop = NULL;
- #ifndef USE124
- ADDWORD ( pak, hitpower | KILLBIT | (critical ? CRITBIT: 0));
- #else
- ADDDWORD ( pak, critical?28:16 );
- #endif
- if(!Enemy->IsSummon( ) && !Enemy->IsPlayer( ))
- {
- thisdrop = Enemy->GetDrop( );
- if(thisdrop!=NULL)
- {
- ADDFLOAT ( pak, thisdrop->pos.x*100 );
- ADDFLOAT ( pak, thisdrop->pos.y*100 );
- if(thisdrop->type==1)
- {
- ADDWORD( pak, 0xccdf );
- ADDDWORD( pak, thisdrop->amount );
- }
- else
- {
- ADDWORD ( pak, GServer->BuildItemHead( thisdrop->item ) );
- ADDDWORD ( pak, GServer->BuildItemData( thisdrop->item ) );
- }
- ADDWORD ( pak, thisdrop->clientid );
- ADDWORD ( pak, thisdrop->owner );
- CMap* map = GServer->MapList.Index[thisdrop->posMap];
- map->AddDrop( thisdrop );
- }
- }
- GServer->SendToVisible( &pak, Enemy, thisdrop );
- OnEnemyDie( Enemy );
- }
- else
- {
- #ifndef USE124
- ADDWORD ( pak, hitpower | (hitpower > 0 ? ( critical ? CRITBIT : 0) : 0));
- #else
- ADDDWORD ( pak, (hitpower>0?(critical?12:0):0) );
- #endif
- GServer->SendToVisible( &pak, Enemy );
- }
- ReduceABC( );
- Battle->lastAtkTime = clock( );
- }
- Poison debuff "SHOWS" the damage, and it shouldn´t
- AOEs debuffs are not working.(tested with hawker skill)
- Drill always success and the "Success" or "Fail" Animation doesn´t appear.
- Fairy doesn't appear.
- Repairing from NPC Doesn´t work
- HP is completely bugged
- We should make a drop system based in stb (original system)*
- Normal Attack formula isn´t working well, in a normal combat the mob will hit you once 100hp for example, and then u will die (losing 800hp), i think I'll rewrite it again*
Done
- New NormalAttackFormula.
- New drop system isn´t neccesary, we need a new drop table.