Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/zhuagenborn/plants-vs.-zombies-online-battle
🧟 Plants vs. Zombies multiplayer battle, developed via reverse engineering, inline hook and dynamic-link library injection. Two online players defend and attack as the plant and zombie respectively.
https://github.com/zhuagenborn/plants-vs.-zombies-online-battle
cpp20 dll-injection game game-cheating hook inline-hook network reverse-engineering socket
Last synced: 4 days ago
JSON representation
🧟 Plants vs. Zombies multiplayer battle, developed via reverse engineering, inline hook and dynamic-link library injection. Two online players defend and attack as the plant and zombie respectively.
- Host: GitHub
- URL: https://github.com/zhuagenborn/plants-vs.-zombies-online-battle
- Owner: Zhuagenborn
- License: mit
- Created: 2020-09-12T03:43:13.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2024-10-22T15:09:04.000Z (3 months ago)
- Last Synced: 2025-01-04T13:23:32.961Z (18 days ago)
- Topics: cpp20, dll-injection, game, game-cheating, hook, inline-hook, network, reverse-engineering, socket
- Language: C++
- Homepage:
- Size: 66.4 MB
- Stars: 585
- Watchers: 12
- Forks: 53
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Citation: CITATION.cff
Awesome Lists containing this project
README
# *Plants vs. Zombies* Online Battle
![C++](docs/badges/C++.svg)
![MASM](docs/badges/MASM.svg)
[![CMake](docs/badges/Made-with-CMake.svg)](https://cmake.org)
[![Visual-Studio](docs/badges/Made-with-Visual-Studio.svg)](https://visualstudio.microsoft.com/)
[![Windows](docs/badges/Microsoft-Windows.svg)](https://www.microsoft.com/en-ie/windows)
![License](docs/badges/License-MIT.svg)## Introduction
![Cover](Cover.jpg)
This project adds the multiplayer battle to ***Plants vs. Zombies*** via reverse engineering, inline hook and dynamic-link library injection. Two online players can defend and attack as *Plant* and *Zombie* respectively.
## Getting Started
### Prerequisites
- Install [*Visual Studio 2022*](https://visualstudio.microsoft.com).
- Install [*CMake*](https://cmake.org).
- Set the `PATH` environment variables.### Building
Set the location to the project folder and run:
```bash
mkdir -p build
cd build
cmake .. -G "Visual Studio 17 2022" -A Win32
cmake --build .
```Two dynamic-link libraries `plant.dll` and `zombie.dll` will be generated in `build/bin` folder. Copy them to the game root folder.
#### IPv6
The default *IP* version is *IPv4*. Enable the following statement in `libs/game/CMakeLists.txt` if you want to build *IPv6* libraries.
```cmake
target_compile_definitions(game PRIVATE INET6=1)
```## Usage
> The project only works with *Plants vs. Zombies **1.0.0.1051 CHINESE*** version, provided in `game` folder.
>
> The *MD5* of `PlantsVsZombies.exe` is `37B729B4056131722A556E646AC915E9`.In order to activate online functions, `plant.dll` and `zombie.dll` must be injected into the game when it starts. You can directly use this simple injection tool: [*Dll-Injector*](https://github.com/Zhuagenborn/Windows-DLL-Injector).
![online-battle](docs/images/online-battle.gif)
### Playing as *Plant*
If a player plays as the plant, the game will launch as a server.
```bash
Dll-Injector -f PlantsVsZombies.exe plant.dll
```Or use `Start-OnlineGame.ps1` directly. It needs to be copied to the game root folder.
```powershell
Start-OnlineGame.ps1 -Role Plant
```Start *I, Zombie Endless* level, the game will pause and wait for a client to connect.
### Playing as *Zombie*
If a player plays as the zombie, the game will launch as a client.
```bash
Dll-Injector -f PlantsVsZombies.exe zombie.dll
```Or use `Start-OnlineGame.ps1`.
```powershell
Start-OnlineGame.ps1 -Role Zombie
```Start *I, Zombie Endless* level, the game will try to connect to the server.
### *I, Zombie Endless*
If the modification has been loaded successfully, ***I, Zombie Endless*** level will be converted into an online level. If your current progress does not have this level, you can copy `game/userdata` to `C:\ProgramData\PopCap Games\PlantsVsZombies\userdata`. Remember to back up your own save-files before copying.
In the Chinese version of the game, you can start this level as follows:
1. Select "*解谜模式*", which means "*Puzzle*" in English.
![puzzle-mode](docs/images/puzzle-mode.png)
2. Select "*我是僵尸无尽版*", the final level. It is "*I, Zombie Endless*" in English.
![i-zombie-endless](docs/images/i-zombie-endless.png)
3. The game will display a dialog box shown as below. Select "*继续*", the left button, meaning "*Continue*" in English.
![continue-or-new-game](docs/images/continue-or-new-game.png)
Before starting an online battle, the progress of this level must be empty. Otherwise the battlefields of two online players will be different. If that happens, you need to restart the game without the modification, enter this level again but select "*新游戏*", the right button, to reset the progress. It means "*New Game*".
### Configurations
Copy `online_config.ini` to the game root folder. You can set the server's IP address and port number in it.
```ini
[Network]
ServerIP=127.0.0.1
Port=10000
```## Documents
The code comment style follows the [*Doxygen*](http://www.doxygen.nl) specification.
`docs/Key Data and Functions.md` describes key data and functions obtained by reverse engineering.
### Class Diagram
```mermaid
classDiagramnamespace state {
class Role {
<>
Plante
Zombie
}class Config {
vector~int~ zombies
vector~int~ plants
string server_ip
int port
}class State
}State --> Role
State --> Config
State --> TcpSocketnamespace network {
class IpAddr {
<>
Version() int
}class Ipv4Addr
class Ipv6Addrclass Socket {
SetAddr(IpAddr)
Bind()
Close()
}class TcpSocket {
<<>>
Connect(IpAddr)
Send(data) size
Recv(buffer) size
}class Listener {
Bind(IpAddr)
Listen()
Accept() TcpSocket
Close()
}class Packet {
Recv(TcpSocket)$ Packet
Send(TcpSocket)
Write(data) size
Read() data
}
}IpAddr <|.. Ipv4Addr
IpAddr <|.. Ipv6Addr
Socket --> IpAddr
Socket <|-- TcpSocket
Listener --> TcpSocket
Packet ..> TcpSocketclass Mod {
<>
Enable()
Disable()
}class ModLoader {
Add(Mod)
Load()
}ModLoader o-- Mod
class RemoveDefaultPlants
Mod <|.. RemoveDefaultPlantsclass SetSunAmount
Mod <|.. SetSunAmountclass Hook {
<>
#From() address
#To() address
#JumpRet() optional~address~
}Mod <|-- Hook
class BeforeLoadLevel
Hook <|.. BeforeLoadLevel
BeforeLoadLevel ..> CreateZombie
BeforeLoadLevel ..> CreatePlant
BeforeLoadLevel ..> LevelEnd
BeforeLoadLevel ..> Listener
BeforeLoadLevel ..> Stateclass AfterLoadLevel
Hook <|.. AfterLoadLevel
AfterLoadLevel ..> RemoveDefaultPlants
AfterLoadLevel ..> InitSlotsclass InitSlots
Hook <|.. InitSlots
InitSlots ..> Stateclass LevelEnd
Hook <|.. LevelEnd
LevelEnd ..> State
LevelEnd ..> Packetclass CreateZombie
Hook <|.. CreateZombie
CreateZombie ..> State
CreateZombie ..> Packetclass CreatePlant
Hook <|.. CreatePlant
CreatePlant ..> State
CreatePlant ..> Packetclass Startup {
Run()
Stop()
}Startup --> ModLoader
Startup --> State
```## Issues & Bugs
- The game sometimes crashes when creating zombies.
- If the progress of *I, Zombie Endless* level is not empty, two players will have different battlefields.
- In order to simplify the code, the running menu and automatic pause are disabled.## License
Distributed under the *MIT License*. See `LICENSE` for more information.