#include "stdafx.h"
#include "Util.h"
#include "Shield.h"
#include "Offset.h"
DWORD SecondWeaponFixVal = 0;
DWORD IsShield = 0;
DWORD s_eax, s_ecx, s_edx;
void cWeaponFloatLoad()
{
	SetJmp((LPVOID)WeaponViewCheck_Hook, (LPVOID)WeaponViewCheck);
	SetJmp((LPVOID)SecondWeaponViewFix_Hook, (LPVOID)SecondWeaponViewFix);
	SetJmp((LPVOID)SecondWeaponViewCheckReplacedCode_Hook, (LPVOID)SecondWeaponViewCheckReplacedCode);
	// ----
	//HookThis((DWORD)SecondWeaponViewCheck, SecondWeaponViewCheck_Hook1);
	//HookThis((DWORD)SecondWeaponViewCheck, SecondWeaponViewCheck_Hook2);
}
Naked(WeaponViewCheck)
{
	_asm
	{
		MOV BYTE PTR SS : [EBP + WeaponViewFlagFixup] , 0
		CMP DWORD PTR SS : [EBP + SafeZoneFlagFixup] , 0
		JE WEAPON_CHECK
		MOV BYTE PTR SS : [EBP + WeaponViewFlagFixup] , 1
		// ----
		WEAPON_CHECK :
					 MOV EAX, DWORD PTR SS : [EBP + 8]
					 CMP DWORD PTR SS : [EBP + HandFlagFixup] , 0
					 JNZ LEFT_HAND
					 // ----
					 MOVSX ECX, WORD PTR DS : [EAX + RightHandFixup]
					 CMP ECX, ITEMGET(7, 0) + OBJ_OFFS
					 JGE NO_DISPLAY
					 // ----
					 CMP ECX, ITEMGET(4, 15) + OBJ_OFFS
					 JE DISPLAY_WEAPON
					 JMP END_CHECK
					 // ----
					 LEFT_HAND :
		MOVSX ECX, WORD PTR DS : [EAX + LeftHandFixup]
			// ----
			CMP ECX, ITEMGET(7, 0) + OBJ_OFFS
			JGE NO_DISPLAY
			// ----
			CMP ECX, ITEMGET(4, 7) + OBJ_OFFS //4,7
			JE DISPLAY_WEAPON
			JMP END_CHECK
			// ----
			DISPLAY_WEAPON :
		MOV BYTE PTR SS : [EBP + WeaponViewFlagFixup] , 1
			JMP END_CHECK
			// ----
			NO_DISPLAY :
		MOV BYTE PTR SS : [EBP + WeaponViewFlagFixup] , 0
			// ----
			END_CHECK :
			jmp WeaponViewCheck_Ret
	}
}
Naked(SecondWeaponViewCheck)
{
	_asm
	{
		CMP DWORD PTR SS : [EBP + HandFlagFixup] , 0
		JNZ END_CHECK
		// ----
		MOV DWORD PTR SS : [EBP + HandFlagFixup] , 1
		MOV SecondWeaponFixVal, 1 // mudando de 1 para 0 SM, ELF, BK , DL e MG Usam 1 espada e 1 escudo perfeitos apenas nгo ficou com 2 espadas cruzadas
		// ----
		JMP WeaponViewCheck
		// ----
		END_CHECK :
		MOV SecondWeaponFixVal, 0
			jmp SecondWeaponViewCheck_Ret
	}
}
Naked(SecondWeaponViewCheckReplacedCode)
{
	_asm
	{
		MOV EDX, DWORD PTR SS : [EBP + SomeVal1Fixup]
		MOV EAX, DWORD PTR SS : [EBP + SomeVal2Fixup]
		MOV DWORD PTR DS : [EDX + SomeVal3Fixup] , EAX
		JMP SecondWeaponViewCheck
	}
}
Naked(SecondWeaponViewFix)
{
	_asm
	{
		MOV IsShield, 0 // Mudando aqui de 0 para 1 ficou 1 espada e escudo ok e arcos de elf ok , so nгo ficou 2 espadas cruzadas e outros char bugou
		// ----
		CMP WEAPON_ID_CONTAINER, ITEMGET(6, 0) + OBJ_OFFS
		JL FLIP_CHECK
		CMP WEAPON_ID_CONTAINER, ITEMGET(7, 0) + OBJ_OFFS
		JGE FLIP_CHECK
		// ----
		MOV IsShield, 1
		// ----
		CMP WEAPON_ID_CONTAINER, ITEMGET(6, 16) + OBJ_OFFS
		JNZ CHECK_SHIELD_14_15
		// ----
		MOV DWORD PTR SS : [STACK_PTR + RotFixup] , 0x41F00000
		MOV DWORD PTR SS : [STACK_PTR + RotFixup + 4] , 0
		MOV DWORD PTR SS : [STACK_PTR + RotFixup + 8] , 0x42B40000
		LEA EDX, DWORD PTR SS : [STACK_PTR + TransFixup]
		LEA EAX, DWORD PTR SS : [STACK_PTR + RotFixup]
		PUSH EDX
		PUSH EAX
		CALL RotateFunc
		ADD ESP, 8
		MOV DWORD PTR SS : [STACK_PTR + TransFixup + 0x0C] , 0xC1A00000
		MOV DWORD PTR SS : [STACK_PTR + TransFixup + 0x1C] , 0
		MOV DWORD PTR SS : [STACK_PTR + TransFixup + 0x2C] , 0xC1A00000
		// ----
		JMP FLIP_CHECK
		// ----
		CHECK_SHIELD_14_15 :
		CMP WEAPON_ID_CONTAINER, ITEMGET(6, 15) + OBJ_OFFS
			JE SHIELD_14_15
			CMP WEAPON_ID_CONTAINER, ITEMGET(6, 14) + OBJ_OFFS
			JNZ CHECK_SHIELD_6
			// ----
			SHIELD_14_15 :
		MOV DWORD PTR SS : [STACK_PTR + RotFixup] , 0x42480000
			MOV DWORD PTR SS : [STACK_PTR + RotFixup + 4] , 0
			MOV DWORD PTR SS : [STACK_PTR + RotFixup + 8] , 0x42B40000
			LEA EDX, DWORD PTR SS : [STACK_PTR + TransFixup]
			LEA EAX, DWORD PTR SS : [STACK_PTR + RotFixup]
			PUSH EDX
			PUSH EAX
			CALL RotateFunc
			ADD ESP, 8
			MOV DWORD PTR SS : [STACK_PTR + TransFixup + 0x0C] , 0xC1E00000
			MOV DWORD PTR SS : [STACK_PTR + TransFixup + 0x1C] , 0
			MOV DWORD PTR SS : [STACK_PTR + TransFixup + 0x2C] , 0xC1C80000
			// ----
			JMP FLIP_CHECK
			// ----
			CHECK_SHIELD_6 :
		// ----
		CMP WEAPON_ID_CONTAINER, ITEMGET(6, 6) + OBJ_OFFS
			JNZ SET_SHIELD
			// ----
			MOV DWORD PTR SS : [STACK_PTR + RotFixup] , 0x41F00000
			MOV DWORD PTR SS : [STACK_PTR + RotFixup + 4] , 0
			MOV DWORD PTR SS : [STACK_PTR + RotFixup + 8] , 0x42B40000
			LEA EDX, DWORD PTR SS : [STACK_PTR + TransFixup]
			LEA EAX, DWORD PTR SS : [STACK_PTR + RotFixup]
			PUSH EDX
			PUSH EAX
			CALL RotateFunc
			ADD ESP, 8
			MOV DWORD PTR SS : [STACK_PTR + TransFixup + 0x0C] , 0xC1700000
			MOV DWORD PTR SS : [STACK_PTR + TransFixup + 0x1C] , 0
			MOV DWORD PTR SS : [STACK_PTR + TransFixup + 0x2C] , 0xC1C80000
			// ----
			JMP FLIP_CHECK
			// ----
			SET_SHIELD :
		// ----
		MOV DWORD PTR SS : [STACK_PTR + TransFixup + 0x0C] , 0xC1200000
			MOV DWORD PTR SS : [STACK_PTR + TransFixup + 0x1C] , 0
			MOV DWORD PTR SS : [STACK_PTR + TransFixup + 0x2C] , 0
			// ----
			FLIP_CHECK :
			CMP IsShield, 1  // BUG ITENS padrгo 1
			JE EXIT
			CMP SecondWeaponFixVal, 0
			JE EXIT
			SUB ESP, 0x3C
			MOV DWORD PTR SS : [ESP + 0x30] , 0x43110000
			MOV DWORD PTR SS : [ESP + 0x34] , 0
			MOV DWORD PTR SS : [ESP + 0x38] , 0x43898000
			LEA EAX, DWORD PTR SS : [ESP]
			LEA ECX, DWORD PTR SS : [ESP + 0x30]
			PUSH EAX
			PUSH ECX
			CALL RotateFunc
			ADD ESP, 8
			// ----
			MOV DWORD PTR SS : [ESP + 0x0C] , 0
			MOV DWORD PTR SS : [ESP + 0x1C] , 0x41200000
			MOV DWORD PTR SS : [ESP + 0x2C] , 0xC1F00000
			LEA EDX, DWORD PTR SS : [STACK_PTR + TransFixup]
			LEA EAX, DWORD PTR SS : [ESP]
			LEA ECX, DWORD PTR SS : [STACK_PTR + TransFixup]
			PUSH EDX
			PUSH EAX
			PUSH ECX
			CALL TransFunc
			ADD ESP, 0x48
			// ----
			EXIT :
			PUSH SomeVal4
			JMP SecondWeaponViewFix_Ret
	}
}
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) // OK
{
	if(nCode == HC_ACTION)
	{
		if(((DWORD)lParam & (1 << 30)) != 0 && ((DWORD)lParam & (1 << 31)) != 0 && GetForegroundWindow() == *(HWND*)(MAIN_WINDOW))
		{
		else if (wParam == VK_F10)
			{
				if (AutoClick[1] == false) // Right
				{
					AutoClick[0] = !AutoClick[0];
					AutoClick[2] = false;
					if (AutoClick[0] == false)  // Left
					{
						KillTimer(Window, AUTOCLICK_LEFT);
						SendMessage(Window, WM_LBUTTONUP, NULL, NULL);
					}
					else
					{
						SetTimer(Window, AUTOCLICK_LEFT, 100, NULL);
					}
				}
			}
			else if (wParam == VK_F11)
			{
				if (AutoClick[0] == false) // Left
				{
					AutoClick[1] = !AutoClick[1];
					AutoClick[2] = false;
					if (AutoClick[1] == false)  // Right
					{
						KillTimer(Window, AUTOCLICK_RIGHT);
						SendMessage(Window, WM_RBUTTONUP, NULL, NULL);
					}
					else
					{
						SetTimer(Window, AUTOCLICK_RIGHT, 100, NULL);
					}
				}
			}