WhatsApp Discord
Source of fix for Fire SLash skill being affected by Twisting SLash (Main 1.04E) - Source Mu - Mu Server Files
 

Source of fix for Fire SLash skill being affected by Twisting SLash (Main 1.04E)

Publicado por Dakosmu, Mayo 20, 2024, 06:21 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Dakosmu

Source of fix for Fire SLash skill being affected by Twisting SLash (Main 1.04E)

Most current Main mu from 0.97 to S6 have this bug. This is source to fix this bug on main 1.04e. To fix on other mains you need to change the corresponding offsets of that main. Hopefully someone can supplement other mains.




IncreaseEffects.cpp:

#include "stdafx.h"
#include "IncreaseEffects.h"
#include "Util.h"

cIncreaseEffects IncreaseEffects;

cIncreaseEffects::cIncreaseEffects()
{
for (int i = 0; i < MAX_JOINTS; i++)
{
this->Joints[i].Live = 0;
}

this->Hook();
}

cIncreaseEffects::~cIncreaseEffects()
{

}

DWORD cIncreaseEffects::GetAddressJoints()
{
return (DWORD)&IncreaseEffects.Joints;
}

void cIncreaseEffects::Hook()
{
DWORD AddressJoints = this->GetAddressJoints();

SetDword(0x005F308B + 2, AddressJoints);
SetDword(0x006F80FF + 2, AddressJoints);
SetDword(0x0072D1E2 + 2, AddressJoints);
SetDword(0x00735E8E + 2, AddressJoints);
SetDword(0x00735F3A + 2, AddressJoints);
SetDword(0x00735F9A + 2, AddressJoints);
SetDword(0x00747D2A + 2, AddressJoints);
SetDword(0x00747D91 + 2, AddressJoints);

SetDword(0x00747D18 + 3, MAX_JOINTS);
SetDword(0x0072D1CC + 3, MAX_JOINTS);
SetDword(0x00735F88 + 3, MAX_JOINTS);
SetDword(0x00735F28 + 3, MAX_JOINTS);
SetDword(0x00735E78 + 3, MAX_JOINTS);
SetDword(0x005F3079 + 3, MAX_JOINTS);
}

IncreaseEffects.h:

#pragma once
#include "Object.h"

#define MAX_JOINTS 5000

struct JOINT
{
bool Live;
};

enum
{
RENDER_TYPE_NONE = 0,
RENDER_TYPE_ALPHA_BLEND,
RENDER_TYPE_ALPHA_TEST,
RENDER_TYPE_ALPHA_BLEND_MINUS,
RENDER_TYPE_ALPHA_BLEND_OTHER,
};

class cIncreaseEffects
{
public:
cIncreaseEffects();
~cIncreaseEffects();

void Hook();
DWORD GetAddressJoints();
JOINT Joints[MAX_JOINTS];

private:

};

extern cIncreaseEffects IncreaseEffects;


Creditos
NghienMU
Bon Dia

Dakosmu

That fix don't work, don't use it  ( to Viet Nam cái mã nguồn trên up là bị thiếu và lỗi tùm lum anh em sài cách fix sau đây dễ và ngon hơn )
in source main of EMU

STEP 1: in file Protocol.cpp  go to void GCCharacterInfoRecv(PMSG_CHARACTER_INFO_RECV* lpMsg) // OK
we see
   switch(((*(BYTE*)(*(DWORD*)(MAIN_CHARACTER_STRUCT)+0x0B)) & 7))
   {
      case 0:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DWMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 1:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DKMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
         break;
      case 2:
         SetByte(0x00556C38,((gProtect.m_MainInfo.FEMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 3:// Neu day la MG da duoc Fix lai trong ham void User::Refresh()   User.cpp
         break;
      case 4:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DLMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 5:
         SetByte(0x00556C38,((gProtect.m_MainInfo.SUMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 6:
         SetByte(0x00556C38,((gProtect.m_MainInfo.RFMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
         break;
   }
we delete it or change to
   /*switch(((*(BYTE*)(*(DWORD*)(MAIN_CHARACTER_STRUCT)+0x0B)) & 7))
   {
      case 0:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DWMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 1:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DKMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
         break;
      case 2:
         SetByte(0x00556C38,((gProtect.m_MainInfo.FEMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 3:// Neu day la MG da duoc Fix lai trong ham void User::Refresh()   User.cpp
         break;
      case 4:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DLMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 5:
         SetByte(0x00556C38,((gProtect.m_MainInfo.SUMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 6:
         SetByte(0x00556C38,((gProtect.m_MainInfo.RFMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
         break;
   }*/

STEP 2: go to User.cpp we see void User::Refresh()
we see
   if (gObjUser.GetActiveSkill() == 261 || gObjUser.GetActiveSkill() == 552 || gObjUser.GetActiveSkill() == 555)
   {
         //lpPlayer->AttackSpeed = (WORD)10;
         //lpPlayer->MagicSpeed = (WORD)10;
      //SetOp((LPVOID)0x007801AC, (LPVOID)lpPlayer->AttackSpeed, ASM::CALL);
      SetDouble(&pFrameSpeed1, 0.0004000);
      SetDouble(&pFrameSpeed2, 0.0002000);
   }
   else
   {
      SetDouble(&pFrameSpeed1, 0.0040000);
      SetDouble(&pFrameSpeed2, 0.0020000);
           
   }
/////////  we add code herre ////////////

and we add
   switch(((*(BYTE*)(*(DWORD*)(MAIN_CHARACTER_STRUCT)+0x0B)) & 7))
   {
      case 0:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DWMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 1:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DKMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
         break;
      case 2:
         SetByte(0x00556C38,((gProtect.m_MainInfo.FEMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 3:
         if (gObjUser.GetActiveSkill() == 55)// 55 chem lua 56 la vay kiem run
         {
            SetByte(0x00556C38,((gProtect.m_MainInfo.MGMaxAttackSpeed>=0xFFFF)?0x11:0x0F));
         }
         else
         {
            SetByte(0x00556C38,((gProtect.m_MainInfo.MGMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         }
         break;
      case 4:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DLMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 5:
         SetByte(0x00556C38,((gProtect.m_MainInfo.SUMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 6:
         SetByte(0x00556C38,((gProtect.m_MainInfo.RFMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
         break;
   }
Bon Dia

Dakosmu

STEP 1: in file Protocol.cpp  go to void GCCharacterInfoRecv(PMSG_CHARACTER_INFO_RECV* lpMsg) // OK
we see
   switch(((*(BYTE*)(*(DWORD*)(MAIN_CHARACTER_STRUCT)+0x0B)) & 7))
   {
      case 0:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DWMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 1:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DKMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
         break;
      case 2:
         SetByte(0x00556C38,((gProtect.m_MainInfo.FEMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 3:// Neu day la MG da duoc Fix lai trong ham void User::Refresh()   User.cpp
         break;
      case 4:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DLMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 5:
         SetByte(0x00556C38,((gProtect.m_MainInfo.SUMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 6:
         SetByte(0x00556C38,((gProtect.m_MainInfo.RFMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
         break;
   }
we delete it or change to
   /*switch(((*(BYTE*)(*(DWORD*)(MAIN_CHARACTER_STRUCT)+0x0B)) & 7))
   {
      case 0:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DWMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 1:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DKMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
         break;
      case 2:
         SetByte(0x00556C38,((gProtect.m_MainInfo.FEMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 3:// Neu day la MG da duoc Fix lai trong ham void User::Refresh()   User.cpp
         break;
      case 4:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DLMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 5:
         SetByte(0x00556C38,((gProtect.m_MainInfo.SUMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 6:
         SetByte(0x00556C38,((gProtect.m_MainInfo.RFMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
         break;
   }*/

STEP 2: go to User.cpp we see void User::Refresh()
we see
   if (gObjUser.GetActiveSkill() == 261 || gObjUser.GetActiveSkill() == 552 || gObjUser.GetActiveSkill() == 555)
   {
         //lpPlayer->AttackSpeed = (WORD)10;
         //lpPlayer->MagicSpeed = (WORD)10;
      //SetOp((LPVOID)0x007801AC, (LPVOID)lpPlayer->AttackSpeed, ASM::CALL);
      SetDouble(&pFrameSpeed1, 0.0004000);
      SetDouble(&pFrameSpeed2, 0.0002000);
   }
   else
   {
      SetDouble(&pFrameSpeed1, 0.0040000);
      SetDouble(&pFrameSpeed2, 0.0020000);
           
   }
/////////  we add code herre ////////////

and we add
   switch(((*(BYTE*)(*(DWORD*)(MAIN_CHARACTER_STRUCT)+0x0B)) & 7))
   {
      case 0:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DWMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 1:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DKMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
         break;
      case 2:
         SetByte(0x00556C38,((gProtect.m_MainInfo.FEMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 3:
         if (gObjUser.GetActiveSkill() == 55)// 55 chem lua 56 la vay kiem run
         {
            SetByte(0x00556C38,((gProtect.m_MainInfo.MGMaxAttackSpeed>=0xFFFF)?0x11:0x0F));
         }
         else
         {
            SetByte(0x00556C38,((gProtect.m_MainInfo.MGMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         }
         break;
      case 4:
         SetByte(0x00556C38,((gProtect.m_MainInfo.DLMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 5:
         SetByte(0x00556C38,((gProtect.m_MainInfo.SUMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
         break;
      case 6:
         SetByte(0x00556C38,((gProtect.m_MainInfo.RFMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
         break;
   }

you can test with Louis EMU SS6 Update 15
Bon Dia

Dakosmu

First thanks for the fix, you increased the max effects to 5000, maybe can cause lags, but i will try.

another way to fix:
         BYTE Joints[12920000]; // struct size to 5000 joints.

   //fix fireslash + twist slash
   ChangeAddress(0x005F308B + 2, (int)&Joints);
   ChangeAddress(0x006F80FF + 2, (int)&Joints);
   ChangeAddress(0x0072D1E2 + 2, (int)&Joints);
   ChangeAddress(0x00735E8E + 2, (int)&Joints);
   ChangeAddress(0x00735F3A + 2, (int)&Joints);
   ChangeAddress(0x00735F9A + 2, (int)&Joints);
   ChangeAddress(0x00747D2A + 2, (int)&Joints);
   ChangeAddress(0x00747D91 + 2, (int)&Joints);

   SetDword(0x00747D18 + 3, 5000);
   SetDword(0x0072D1CC + 3, 5000);
   SetDword(0x00735F88 + 3, 5000);
   SetDword(0x00735F28 + 3, 5000);
   SetDword(0x00735E78 + 3, 5000);
   SetDword(0x005F3079 + 3, 5000);

Creditos
Louis
Bon Dia

Dakosmu

No util.cpp

void ChangeAddress(DWORD Addr, DWORD AddrNew)
{
   DWORD OldProtect;
   VirtualProtect((LPVOID)Addr, 4, PAGE_EXECUTE_READWRITE, &OldProtect);

   __asm {
      MOV EAX, Addr;
      MOV EDX, AddrNew;
      MOV DWORD PTR DS:[EAX], EDX;
   }
   VirtualProtect((LPVOID)Addr, 4, OldProtect, &OldProtect);
}

Creditos
Louis
Bon Dia

Dakosmu

Bon Dia

🡱 🡳
Real Time Web Analytics