Skip to content

Commit

Permalink
More network refactoring!
Browse files Browse the repository at this point in the history
* Implemented packet appending and packet building from outside the packet broker.
* All trampolines now revertable (Fixed #18)
  • Loading branch information
michael-fadely committed Apr 25, 2016
1 parent f1b0771 commit f020dc0
Show file tree
Hide file tree
Showing 33 changed files with 638 additions and 371 deletions.
58 changes: 41 additions & 17 deletions SA2 Battle Network/AddHP.cpp
@@ -1,14 +1,34 @@
#include "stdafx.h"
#include <SA2ModLoader.h>
#include <Trampoline.h>
#include "Networking.h"
#include "Globals.h"
#include "AddHP.h"

using namespace nethax;

void __stdcall AddHP_cpp(int playerNum, float amount);
float events::DirtyHPHack = 0.0f;
static void __stdcall AddHP_cpp(int playerNum, float amount)
{
if (Globals::isConnected())
{
if (playerNum != 0)
return;

void __declspec(naked) AddHP_asm()
auto data2 = MainCharObj2[playerNum];
char charid = data2->CharID;
if (charid == Characters_MechTails || charid == Characters_MechEggman)
{
PrintDebug("<< HP SEND: %f, %f", data2->MechHP, amount);
sf::Packet packet;
packet << data2->MechHP << amount;
Globals::Broker->Append(MessageID::P_HP, Protocol::TCP, &packet, true);
}
}

events::AddHP_original(playerNum, amount);
}

static void __declspec(naked) AddHP_asm()
{
__asm
{
Expand All @@ -19,23 +39,27 @@ void __declspec(naked) AddHP_asm()
}
}

Trampoline events::AddHPHax((size_t)AddHPPtr, (size_t)0x0046F4C7, AddHP_asm);
static Trampoline* AddHPHax;

void events::AddHP_original(int playerNum, float amount)

void __stdcall AddHP_cpp(int playerNum, float amount)
{
if (Globals::isConnected())
void* target = AddHPHax->Target();
__asm
{
if (playerNum != 0)
return;

char charid = MainCharObj2[playerNum]->CharID;
if (charid == Characters_MechTails || charid == Characters_MechEggman)
{
// Should this be TCP?
events::DirtyHPHack = amount;
Globals::Broker->Request(MessageID::P_HP, Protocol::TCP);
}
mov eax, [playerNum]
push amount
call target
add esp, 4
}
}

void events::InitAddHP()
{
AddHPHax = new Trampoline((size_t)AddHPPtr, (size_t)0x0046F4C7, AddHP_asm);
}

events::AddHPOriginal(playerNum, amount);
void events::DeinitAddHP()
{
delete AddHPHax;
}
21 changes: 4 additions & 17 deletions SA2 Battle Network/AddHP.h
@@ -1,24 +1,11 @@
#pragma once

#include <Trampoline.h>

namespace nethax
{
namespace events
{
extern Trampoline AddHPHax;
extern float DirtyHPHack;

static inline void AddHPOriginal(int playerNum, float amount)
{
void* target = AddHPHax.Target();
__asm
{
mov eax, [playerNum]
push amount
call target
add esp, 4
}
}
void AddHP_original(int playerNum, float amount);
void InitAddHP();
void DeinitAddHP();
}
}
}
67 changes: 47 additions & 20 deletions SA2 Battle Network/AddRings.cpp
@@ -1,15 +1,30 @@
#include "stdafx.h"

#include "AddRings.h"
#include <SA2ModLoader.h>
#include <Trampoline.h>

#include "Globals.h"
#include <SA2ModLoader.h>
#include "Networking.h"

#include "AddRings.h"

using namespace nethax;

void AddRings_cpp(int8 playerNum, int32 numRings);
static void __cdecl AddRings_cpp(int8 playerNum, int32 numRings)
{
if (Globals::isConnected())
{
if (playerNum != 0)
return;

sf::Packet packet;
packet << RingCount[0] << numRings;
Globals::Broker->Append(MessageID::S_Rings, Protocol::TCP, &packet, true);
}

void __declspec(naked) AddRings_asm()
events::AddRings_original(playerNum, numRings);
}

static void __declspec(naked) AddRings_asm()
{
__asm
{
Expand All @@ -25,26 +40,38 @@ void __declspec(naked) AddRings_asm()
}
}

Trampoline events::AddRingsHax((size_t)AddRingsPtr, (size_t)0x0044CE16, AddRings_asm);
int events::DirtyRingHack = 0;
static Trampoline* AddRingsHax;

void AddRings_cpp(int8 playerNum, int32 numRings)
void events::AddRings_original(char playerNum, int numRings)
{
if (Globals::isConnected())
{
if (playerNum != 0)
return;

// Should this be TCP?
events::DirtyRingHack = numRings;
Globals::Broker->Request(MessageID::S_Rings, Protocol::TCP);
}

void* target = events::AddRingsHax.Target();
void* target = AddRingsHax->Target();
__asm
{
mov al, [playerNum]
mov edx, [numRings]
mov al, [playerNum]
call target
}
}

static bool MessageHandler(MessageID type, int pnum, sf::Packet& packet)
{
if (!roundStarted())
return false;

int diff;
packet >> RingCount[1] >> diff;
PrintDebug(">> RING CHANGE: %d + %d", RingCount[1], diff);
events::AddRings_original(1, diff);
return true;
}

void events::InitAddRings()
{
AddRingsHax = new Trampoline((size_t)AddRingsPtr, (size_t)0x0044CE16, AddRings_asm);
Globals::Broker->RegisterMessageHandler(MessageID::S_Rings, MessageHandler);
}

void events::DeinitAddRings()
{
delete AddRingsHax;
}
19 changes: 3 additions & 16 deletions SA2 Battle Network/AddRings.h
@@ -1,24 +1,11 @@
#pragma once

#include <Trampoline.h>

namespace nethax
{
namespace events
{
extern Trampoline AddRingsHax;
extern int DirtyRingHack;

static inline void AddRingsOriginal(char playerNum, int numRings)
{
void* target = AddRingsHax.Target();
__asm
{
mov edx, [numRings]
mov al, [playerNum]
call target
}
}

void AddRings_original(char playerNum, int numRings);
void InitAddRings();
void DeinitAddRings();
}
}
28 changes: 25 additions & 3 deletions SA2 Battle Network/CharacterSync.cpp
Expand Up @@ -2,6 +2,8 @@
#include <SA2ModLoader.h>
#include "CharacterSync.h"
#include "Globals.h"
#include "Networking.h"
#include "PacketOverloads.h"
#include "OnStageChange.h"

FunctionPointer(int, Menu_Battle, (void), 0x0066A1A0);
Expand All @@ -10,7 +12,7 @@ VoidFunc(RandomBattle_SetCharacters, 0x0066B730);
using namespace nethax;
using namespace Globals;

int __cdecl Menu_Battle_hook()
static int __cdecl Menu_Battle_hook()
{
int result = Menu_Battle();

Expand All @@ -21,7 +23,13 @@ int __cdecl Menu_Battle_hook()
if (Broker->WaitForPlayers(MessageID::P_Character))
{
PacketEx packet(Protocol::TCP);
Broker->Request(MessageID::P_Character, packet);

packet.AddType(MessageID::P_Character);
packet << CurrentCharacter << AltCostume[0] << AltCharacter[0]
<< CurrentCharacter2P << AltCostume[1] << AltCharacter[1];
Broker->AddTypeSent(MessageID::P_Character, packet.GetTypeSize(), packet.Protocol);
packet.Finalize();

Broker->AddReady(MessageID::P_Character, packet);
Broker->Send(packet);
}
Expand All @@ -36,14 +44,28 @@ int __cdecl Menu_Battle_hook()
return result;
}

void __cdecl RandomBattle_SetCharacters_hook()
static void __cdecl RandomBattle_SetCharacters_hook()
{
RandomBattle_SetCharacters();
events::SetCurrentLevel(CurrentLevel);
}

static bool MessageHandler(MessageID type, int pnum, sf::Packet& packet)
{
packet >> CurrentCharacter2P >> AltCostume[1] >> AltCharacter[1]
>> CurrentCharacter >> AltCostume[0] >> AltCharacter[0];
return true;
}

void events::InitCharacterSync()
{
WriteCall((void*)0x00666325, Menu_Battle_hook);
WriteCall((void*)0x0066AA76, RandomBattle_SetCharacters_hook);
Broker->RegisterMessageHandler(MessageID::P_Character, MessageHandler);
}

void events::DeinitCharacterSync()
{
WriteCall((void*)0x00666325, Menu_Battle);
WriteCall((void*)0x0066AA76, RandomBattle_SetCharacters);
}
1 change: 1 addition & 0 deletions SA2 Battle Network/CharacterSync.h
Expand Up @@ -5,5 +5,6 @@ namespace nethax
namespace events
{
void InitCharacterSync();
void DeinitCharacterSync();
}
}
40 changes: 28 additions & 12 deletions SA2 Battle Network/EmeraldSync.cpp
Expand Up @@ -7,12 +7,13 @@
#include "AddressList.h"
#include "typedefs.h"
#include "EmeraldSync.h"
#include "FunctionPointers.h"

using namespace nethax;

void __cdecl EmeraldLocations_1POr2PGroup3_hook(void* a1);
void __stdcall EmeraldLocations_2PGroup1_hook_c(void* a1);
void __stdcall EmeraldLocations_2PGroup2_hook_c(void* a1);
static void __cdecl EmeraldLocations_1POr2PGroup3_hook(void* a1);
static void __stdcall EmeraldLocations_2PGroup1_hook_c(void* a1);
static void __stdcall EmeraldLocations_2PGroup2_hook_c(void* a1);

static uint last_seed = 0;

Expand Down Expand Up @@ -67,25 +68,25 @@ static void __declspec(naked) EmeraldLocations_2PGroup2_hook_asm()
}
}

static Trampoline EmeraldLocations_2PGroup1(0x00739340, 0x0073934A, EmeraldLocations_2PGroup1_hook_asm);
static Trampoline EmeraldLocations_2PGroup2(0x007387D0, 0x007387D6, EmeraldLocations_2PGroup2_hook_asm);
static Trampoline EmeraldLocations_1POr2PGroup3(0x007380A0, 0x007380A6, EmeraldLocations_1POr2PGroup3_hook);
static Trampoline* EmeraldLocations_2PGroup1;
static Trampoline* EmeraldLocations_2PGroup2;
static Trampoline* EmeraldLocations_1POr2PGroup3;

void __stdcall EmeraldLocations_2PGroup1_hook_c(void* a1)
static void __stdcall EmeraldLocations_2PGroup1_hook_c(void* a1)
{
x_original(a1, &EmeraldLocations_2PGroup1);
x_original(a1, EmeraldLocations_2PGroup1);
}

void __stdcall EmeraldLocations_2PGroup2_hook_c(void* a1)
static void __stdcall EmeraldLocations_2PGroup2_hook_c(void* a1)
{
x_original(a1, &EmeraldLocations_2PGroup2);
x_original(a1, EmeraldLocations_2PGroup2);
}

void __cdecl EmeraldLocations_1POr2PGroup3_hook(void* a1)
static void __cdecl EmeraldLocations_1POr2PGroup3_hook(void* a1)
{
SetSeed();

FunctionPointer(void, EmeraldLocations_1POr2PGroup3_original, (void*), EmeraldLocations_1POr2PGroup3.Target());
_FunctionPointer(void, EmeraldLocations_1POr2PGroup3_original, (void*), EmeraldLocations_1POr2PGroup3->Target());
EmeraldLocations_1POr2PGroup3_original(a1);

RestoreSeed();
Expand All @@ -96,4 +97,19 @@ void events::InitEmeraldSync()
WriteData((Uint8*)0x0073934B, (Uint8)0xEBu);
WriteData((Uint8*)0x007387E5, (Uint8)0xEBu);
WriteData((Uint8*)0x007380BD, (Uint8)0xEBu);

EmeraldLocations_2PGroup1 = new Trampoline(0x00739340, 0x0073934A, EmeraldLocations_2PGroup1_hook_asm);
EmeraldLocations_2PGroup2 = new Trampoline(0x007387D0, 0x007387D6, EmeraldLocations_2PGroup2_hook_asm);
EmeraldLocations_1POr2PGroup3 = new Trampoline(0x007380A0, 0x007380A6, EmeraldLocations_1POr2PGroup3_hook);
}

void events::DeinitEmeraldSync()
{
WriteData((Uint8*)0x0073934B, (Uint8)0x75u);
WriteData((Uint8*)0x007387E5, (Uint8)0x75u);
WriteData((Uint8*)0x007380BD, (Uint8)0x75u);

delete EmeraldLocations_2PGroup1;
delete EmeraldLocations_2PGroup2;
delete EmeraldLocations_1POr2PGroup3;
}
1 change: 1 addition & 0 deletions SA2 Battle Network/EmeraldSync.h
Expand Up @@ -4,5 +4,6 @@ namespace nethax
namespace events
{
void InitEmeraldSync();
void DeinitEmeraldSync();
}
}

0 comments on commit f020dc0

Please sign in to comment.