33 Commits

Author SHA1 Message Date
26c08059be update splib version
Some checks failed
Linux arm64 / Build (push) Failing after 9s
2025-03-04 23:16:17 +01:00
87b4bf20b7 remove unused include 2025-03-04 12:29:58 +01:00
06c17abd40 complete splib migration
Some checks failed
Linux arm64 / Build (push) Failing after 58s
2025-03-03 11:27:42 +01:00
000970dcb9 fix colored text serialize issues
Some checks failed
Linux arm64 / Build (push) Failing after 9s
2025-02-23 22:43:48 +01:00
df15e5efd5 remove unused code 2025-02-23 22:36:42 +01:00
a34e217e98 migrate to splib 2025-02-23 22:33:50 +01:00
74aac7a03a begin splib migration
Some checks failed
Linux arm64 / Build (push) Failing after 1m58s
2025-02-23 13:26:33 +01:00
63536535f6 use splib VarInt 2025-02-23 11:19:04 +01:00
67cb368297 change libsdl to libsdl2 2025-02-23 11:13:52 +01:00
5fc9125c67 imgui include 2025-02-23 11:13:31 +01:00
e80c6a3c60 action: cache only packages
All checks were successful
Linux arm64 / Build (push) Successful in 3m15s
2024-06-03 22:25:23 +02:00
680c180b4b action: update xmake cache name
Some checks failed
Linux arm64 / Build (push) Has been cancelled
2024-06-03 20:03:29 +02:00
a4e90b455d updated runner
Some checks failed
Linux arm64 / Build (push) Has been cancelled
2024-06-03 20:02:19 +02:00
e2f1850987 move VarInt.cpp
All checks were successful
Linux arm64 / Build (push) Successful in 4m47s
2024-04-15 17:02:47 +02:00
95e6967d0d fart sound on death
All checks were successful
Linux arm64 / Build (push) Successful in 4m29s
2024-04-15 16:53:44 +02:00
b2323d2761 Update MainRenderer.cpp to load GLB model for the world with better map
All checks were successful
Linux arm64 / Build (push) Successful in 4m36s
2024-04-15 16:40:58 +02:00
84ae607cd1 footsteps velocity
All checks were successful
Linux arm64 / Build (push) Successful in 4m27s
2024-04-15 16:05:28 +02:00
e254d677d0 add foosteps
All checks were successful
Linux arm64 / Build (push) Successful in 4m32s
2024-04-15 15:58:45 +02:00
f0023c1b22 Update display name in ClientMain.cpp to Blitz
All checks were successful
Linux arm64 / Build (push) Successful in 4m20s
2024-04-14 22:14:06 +02:00
71600e7a8b Map with thick walls for collisions and update MainRenderer.cpp 2024-04-14 22:13:39 +02:00
b917a8d1fa fix endgame gui timers
All checks were successful
Linux arm64 / Build (push) Successful in 4m42s
2024-04-14 19:55:51 +02:00
8880056b1c move Client to client namespace
All checks were successful
Linux arm64 / Build (push) Successful in 5m17s
2024-04-14 19:27:42 +02:00
9bb5c85f41 refactor ColoredPart 2024-04-14 19:15:28 +02:00
c6c811ca17 refactor PlayerInfo 2024-04-14 19:11:08 +02:00
40c551a4dc move KeyAction to input 2024-04-14 19:06:29 +02:00
a5bb2f74dd move VarInt to protocol 2024-04-14 19:01:59 +02:00
d9cc43a7a1 rename display to input 2024-04-14 18:58:12 +02:00
9a297026cd move EMASmoother to maths 2024-04-14 18:53:22 +02:00
2f141698ad better ObjectNotifier doc 2024-04-14 18:41:56 +02:00
af5f084234 moved client listeners 2024-04-14 18:40:45 +02:00
fd61870ebe include wiki in readme
All checks were successful
Linux arm64 / Build (push) Successful in 4m28s
2024-04-14 18:13:31 +02:00
5595213f3d Add valgrind testing to readme
All checks were successful
Linux arm64 / Build (push) Successful in 4m21s
2024-04-14 13:09:59 +02:00
8158dda315 fix mainmenu client when server crashes
All checks were successful
Linux arm64 / Build (push) Successful in 4m17s
2024-04-13 19:12:34 +02:00
122 changed files with 1886 additions and 2512 deletions

View File

@@ -6,12 +6,7 @@ on: [push]
jobs:
Build:
runs-on: ubuntu-latest
steps:
- name: Install deps
run : |
apt update
apt install -y libsdl2-dev libassimp-dev libglew-dev
steps:
- name: Check out repository code
uses: actions/checkout@v3
@@ -20,7 +15,7 @@ jobs:
with:
xmake-version: latest
actions-cache-folder: '.xmake-cache'
actions-cache-key: 'ubuntu'
actions-cache-key: 'xmake-ubuntu'
- name: Calc deps hash
uses: seepine/hash-files@v1
@@ -33,14 +28,14 @@ jobs:
- name: Packages cache
uses: actions/cache@v4
with:
path: ~/.xmake
path: ~/.xmake/packages
key: ${{ runner.os }}-${{ steps.get-hash.outputs.hash }}
- name: XMake config
run: xmake f -p linux -y --root
run: xmake f -p linux -y
- name: Build
run: xmake --root
run: xmake
- name: Test
run: xmake test --root
run: xmake test

View File

@@ -86,3 +86,25 @@ xmake project -k compile_commands
```
Alternatively, you can install the [XMake extension](https://marketplace.visualstudio.com/items?itemName=tboox.xmake-vscode) for VsCode.
# Valgrind 🔍
We can inspect the client binary to look for memory leak.
First, switch compilation mode to valgrind :
```
xmake f -m valgrind
```
Then build and run :
```
xmake
xmake run
```
# Wiki 📚
Available [here](https://git.ale-pri.com/Blitz/Blitz/wiki)

Binary file not shown.

View File

@@ -0,0 +1,797 @@
# Blender 4.0.2
# www.blender.org
mtllib base_deambu.mtl
o sol
v -50.000000 0.150000 18.150000
v 50.000000 0.150000 18.150000
v -50.000000 0.150000 -18.150000
v 50.000000 0.150000 -18.150000
v -50.000000 0.000000 18.150000
v 50.000000 0.000000 18.150000
v -50.000000 0.000000 -18.150000
v 50.000000 0.000000 -18.150000
vn -0.0000 1.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
s 0
f 1/1/1 2/2/1 4/3/1 3/4/1
f 5/1/2 7/4/2 8/3/2 6/2/2
f 1/1/3 3/4/3 7/4/3 5/1/3
f 2/2/4 1/1/4 5/1/4 6/2/4
f 4/3/5 2/2/5 6/2/5 8/3/5
f 3/4/6 4/3/6 8/3/6 7/4/6
o mur_dc_partie_basse
v 40.400005 0.000003 -9.649998
v -32.133335 -0.000002 -9.650001
v 40.400005 2.500000 -9.649998
v -32.133335 2.500000 -9.650001
v 40.400005 2.500000 -9.079998
v -32.133335 2.500000 -9.080001
v 40.400005 2.650000 -9.079998
v -32.133335 2.650000 -9.080001
v 40.400005 2.650000 -7.729998
v -32.133335 2.650000 -7.730001
v 40.400005 2.750000 -7.729998
v -32.133335 2.750000 -7.730001
v 40.400005 2.750000 -7.669998
v -32.133335 2.750000 -7.670001
v 40.400005 4.250000 -7.669998
v -32.133335 4.250000 -7.670001
v 40.400005 4.250000 -7.669998
v -32.133335 4.250000 -7.670001
v 40.400005 4.250000 -7.969998
v -32.133335 4.250000 -7.970001
v 40.400005 6.000000 -7.969998
v -32.133335 6.000000 -7.970001
v 40.400005 2.500000 -9.649998
v -32.133335 2.500000 -9.650001
v 40.400005 6.000000 -9.649998
v 40.400005 6.000000 -9.079998
v 40.400005 4.250000 -9.079998
v 40.400005 4.250000 -7.729998
v 40.400005 4.250000 -7.729998
v 40.400005 4.250000 -7.669998
v 40.400005 4.250000 -9.085698
v 40.400005 6.000000 -9.085698
v -32.133335 6.000000 -9.650001
v -32.133335 6.000000 -9.080001
v -32.133335 4.250000 -9.080001
v -32.133335 4.250000 -7.730001
v -32.133335 4.250000 -7.730001
v -32.133335 4.250000 -7.670001
v -32.133335 4.250000 -9.085701
v -32.133335 6.000000 -9.085701
v -50.000000 5.999996 -9.650001
v -50.000000 -0.000004 -9.650001
v 40.400005 6.000003 -9.649997
v -40.666664 5.999997 -9.650001
v -40.666668 -0.000003 -9.650001
v -32.133335 -0.000002 -9.650000
v -32.133339 5.999998 -9.650000
v -40.666664 11.999997 -9.650001
v -40.666668 -0.000003 -9.650001
v -32.133335 -0.000002 -9.650000
v -32.133339 11.999998 -9.650000
v -40.666664 5.999997 -18.150002
v -40.666668 -0.000003 -18.150002
v -32.133335 -0.000002 -18.150000
v -32.133339 5.999998 -18.150000
v 40.400005 2.500000 -9.649997
v -32.133335 2.500000 -9.650000
v -50.000000 5.999996 -18.150002
v -50.000000 -0.000004 -18.150002
v 50.000000 6.000004 -18.149998
v 50.000000 0.000004 -18.149998
v 50.000000 5.761985 18.149998
v 50.000000 0.000004 18.149998
v -50.000000 5.761978 18.150002
v -50.000000 -0.000004 18.150002
v -50.000000 6.000000 18.150002
v -50.000000 0.000000 18.150002
v -50.000000 6.000000 -18.149998
v -50.000000 0.000000 -18.149998
v 50.000000 0.000000 18.150002
v 50.000000 6.000000 18.150002
v 50.000000 0.000000 -18.149998
v 50.000000 6.000000 -18.149998
v 47.300003 6.000003 1.649999
v 47.299999 0.000003 1.649999
v 32.900002 0.000002 1.650000
v 32.900005 6.000002 1.650000
v 29.699999 0.000002 1.649999
v 29.699999 6.000002 1.649999
v 32.900002 0.000002 1.650000
v 32.900005 12.000002 1.650000
v 29.699999 0.000002 1.649999
v 29.699999 12.000002 1.649999
v 15.300000 0.000001 1.650001
v 15.299998 6.000001 1.650001
v 12.099999 0.000001 1.650001
v 12.100004 6.000001 1.650001
v 15.300000 0.000001 1.650001
v 15.299998 12.000001 1.650001
v 12.099999 0.000001 1.650001
v 12.100005 12.000001 1.650001
v -2.300000 0.000000 1.650001
v -2.300000 6.000000 1.650001
v -5.500000 -0.000000 1.650002
v -5.500001 6.000000 1.650002
v -2.300000 0.000000 1.650001
v -2.300001 12.000000 1.650001
v -5.500000 -0.000000 1.650002
v -5.500001 12.000000 1.650002
v -19.899998 -0.000001 1.650002
v -19.900000 5.999999 1.650002
v -19.899998 -0.000001 1.650002
v -19.900000 11.999998 1.650002
v -22.600000 -0.000002 1.650002
v -22.600000 11.999998 1.650002
v 32.900002 0.000002 12.316666
v 32.900005 6.000002 12.316666
v 29.699997 0.000002 12.316666
v 29.699997 6.000002 12.316666
v 15.300002 0.000001 12.316668
v 15.300000 6.000001 12.316668
v 12.099999 0.000001 12.316668
v 12.100004 6.000001 12.316668
v -2.300000 0.000000 12.316668
v -2.300001 6.000000 12.316668
v -5.500000 -0.000000 12.316668
v -5.500001 6.000000 12.316668
v 15.300000 0.000002 12.316666
v 15.300000 6.000002 12.316666
v -2.300000 0.000001 12.316668
v -2.299995 6.000001 12.316668
v -19.900000 -0.000000 12.316668
v -19.900000 6.000000 12.316668
v 45.200001 6.000003 -9.649997
v 45.199997 0.000003 -9.649997
v 45.200001 6.000003 -18.183331
v 45.199997 0.000003 -18.183331
v 45.200001 6.000003 -8.633330
v 45.199997 0.000003 -8.633330
v 40.400002 6.000003 -9.649997
v 40.399994 0.000003 -9.649997
v 40.400002 6.000003 -18.183331
v 40.399994 0.000003 -18.183331
v 47.300003 6.000003 1.649999
v 47.299999 0.000003 1.649999
v 47.300003 6.000003 12.316666
v 47.299999 0.000003 12.316666
v 32.900005 6.000004 12.316666
v 32.900002 0.000003 12.316666
v -19.899998 -0.000001 1.650002
v -19.900000 5.999999 1.650002
v -19.900000 -0.000001 12.316669
v -19.900000 5.999999 12.316669
v -23.099998 -0.000001 1.650002
v -23.100000 5.999998 1.650002
v -23.100000 -0.000001 12.316668
v -23.100000 5.999998 12.316668
v -37.500000 -0.000001 12.316668
v -37.500000 5.999999 12.316668
v -37.500000 -0.000001 1.650001
v -37.500000 5.999999 1.650001
v -23.100000 -0.000001 1.650002
v -23.100000 5.999998 1.650002
v -19.899998 -0.000001 1.650002
v -19.900000 11.999998 1.650002
v -23.099998 -0.000001 1.650002
v -23.100000 11.999998 1.650002
v -37.500000 -0.000001 1.650001
v -37.500000 11.999998 1.650001
v -40.700001 -0.000001 1.650002
v -40.700001 11.999998 1.650002
v -40.700001 -0.000001 1.650002
v -40.700001 5.999999 1.650002
v -40.700001 -0.000001 18.150002
v -40.700001 5.999999 18.150002
v -40.700001 -0.000001 1.650002
v -40.700001 5.999999 1.650002
v -40.700001 -0.000001 0.050001
v -40.700001 5.999999 0.050001
v -40.700001 -0.000001 0.050001
v -40.700001 11.999998 0.050001
v -48.166668 -0.000001 0.050001
v -48.166668 11.999998 0.050001
v -48.166668 -0.000001 6.450001
v -48.166668 11.999998 6.450001
v -40.699997 -0.000001 6.450001
v -40.699997 11.999998 6.450001
v -40.700001 -0.000001 -6.349998
v -40.700001 5.999999 -6.349998
v -48.166668 -0.000001 -6.349998
v -48.166668 5.999999 -6.349998
v -48.166668 -0.000001 0.050002
v -48.166668 5.999999 0.050002
v -40.700001 -0.000001 0.050002
v -40.700001 5.999999 0.050002
v 50.000000 5.761985 18.149998
v -50.000000 5.761978 18.150002
v 50.000000 5.761985 18.149998
v -50.000000 5.761978 18.150002
v 50.000000 5.761985 18.149998
v -50.000000 5.761978 18.150002
v 50.000000 5.761985 18.149998
v -50.000000 5.761978 18.150002
v 49.999996 5.761985 -18.157017
v -50.000000 5.761978 -18.157013
v 40.400005 0.000003 -9.659998
v -32.133335 -0.000002 -9.660001
v 40.195881 2.524495 -9.658163
v -31.929211 2.524495 -9.658166
v 40.111332 2.534641 -9.085772
v -31.844660 2.534641 -9.085774
v 40.111332 2.684641 -9.085772
v -31.844660 2.684641 -9.085774
v 40.111332 2.684641 -7.735771
v -31.844660 2.684641 -7.735775
v 40.111332 2.784641 -7.735771
v -31.844660 2.784641 -7.735775
v 40.111332 2.784641 -7.675771
v -31.844660 2.784641 -7.675775
v 40.400005 4.250000 -7.679998
v -32.133335 4.250000 -7.680001
v 40.400005 4.207573 -7.677069
v -32.133335 4.207573 -7.677072
v 40.111332 4.215359 -7.975771
v -31.844660 4.215359 -7.975775
v 40.046452 6.000000 -7.977069
v -31.779781 6.000000 -7.977072
v 40.400005 2.500000 -9.659998
v -32.133335 2.500000 -9.660001
v 39.900005 6.000000 -9.649998
v 39.900005 6.000000 -9.079998
v 39.900005 4.250000 -9.079998
v 39.900005 4.250000 -7.729998
v 39.900005 4.250000 -7.729998
v 39.900005 4.250000 -7.669998
v 39.900005 4.250000 -9.085698
v 39.900005 6.000000 -9.085698
v -31.633335 6.000000 -9.650001
v -31.633335 6.000000 -9.080001
v -31.633335 4.250000 -9.080001
v -31.633335 4.250000 -7.730001
v -31.633335 4.250000 -7.730001
v -31.633335 4.250000 -7.670001
v -31.633335 4.250000 -9.085701
v -31.633335 6.000000 -9.085701
v -50.000000 5.999996 -9.660001
v -50.000000 -0.000004 -9.660001
v 40.400005 6.000003 -9.659997
v -41.020218 5.999997 -9.657071
v -41.020222 -0.000003 -9.657071
v -31.633335 -0.000002 -9.650000
v -31.779787 5.999998 -9.657071
v -40.351173 11.953449 -9.650001
v -40.351181 0.046545 -9.650001
v -31.863012 0.050473 -9.650000
v -31.863018 11.949522 -9.650000
v -41.166664 5.999997 -18.150002
v -41.166668 -0.000003 -18.150002
v -31.633335 -0.000002 -18.150000
v -31.633341 5.999998 -18.150000
v 40.400005 2.500000 -9.659997
v -31.686121 2.500000 -9.654472
v -50.000000 5.999996 -18.160000
v -50.000000 -0.000004 -18.160000
v 50.000000 6.000004 -18.159996
v 50.000000 0.000004 -18.159996
v 50.499897 5.761985 18.149799
v 50.000000 0.000004 18.159998
v -49.500099 5.761978 18.149803
v -49.999996 -0.000004 18.160002
v -50.500000 6.000000 18.150002
v -50.500000 0.000000 18.150002
v -50.500000 6.000000 -18.149998
v -50.500000 0.000000 -18.149998
v 50.500000 0.000000 18.150002
v 50.500000 6.000000 18.150002
v 50.500000 0.000000 -18.149998
v 50.500000 6.000000 -18.149998
v 47.300007 6.000004 1.659999
v 47.300003 0.000003 1.659999
v 33.253555 0.000002 1.657071
v 33.253559 6.000002 1.657071
v 29.346449 0.000002 1.657070
v 29.346449 6.000002 1.657070
v 32.871048 0.005282 1.640056
v 32.871052 11.994722 1.640056
v 29.673853 0.005284 1.640051
v 29.673853 11.994720 1.640051
v 15.653554 0.000001 1.657072
v 15.653553 6.000001 1.657072
v 11.746446 0.000001 1.657072
v 11.746451 6.000001 1.657072
v 15.286518 0.005288 1.640043
v 15.286516 11.994714 1.640043
v 12.089335 0.005289 1.640041
v 12.089341 11.994713 1.640041
v -1.946446 0.000000 1.657072
v -1.946447 6.000000 1.657072
v -5.853553 -0.000000 1.657073
v -5.853554 6.000000 1.657073
v -2.297972 0.005289 1.640039
v -2.297973 11.994711 1.640039
v -5.495152 0.005289 1.640041
v -5.495153 11.994711 1.640041
v -19.899998 -0.000001 1.660002
v -19.899998 5.999999 1.660002
v -19.882467 0.005284 1.640046
v -19.882469 11.994713 1.640046
v -22.580095 0.005283 1.640048
v -22.580095 11.994713 1.640048
v 33.400002 0.000002 12.316666
v 33.400005 6.000002 12.316666
v 29.346443 0.000002 12.309595
v 29.346443 6.000002 12.309595
v 15.800001 0.000001 12.316668
v 15.800000 6.000001 12.316668
v 11.746446 0.000001 12.309597
v 11.746451 6.000001 12.309597
v -1.800000 0.000000 12.316668
v -1.800001 6.000000 12.316668
v -5.853553 -0.000000 12.309597
v -5.853554 6.000000 12.309597
v 15.299997 0.000002 12.306665
v 15.299997 6.000002 12.306665
v -2.300000 0.000001 12.306667
v -2.299995 6.000001 12.306667
v -19.900000 -0.000000 12.306667
v -19.900000 6.000000 12.306667
v 44.700005 6.000003 -9.649997
v 44.699997 0.000003 -9.649997
v 44.700005 6.000003 -18.183331
v 44.699997 0.000003 -18.183331
v 44.700005 6.000003 -8.633330
v 44.699997 0.000003 -8.633330
v 39.900002 6.000003 -9.649997
v 39.899998 0.000003 -9.649997
v 39.900002 6.000003 -18.183331
v 39.899998 0.000003 -18.183331
v 46.800007 6.000003 1.649999
v 46.799999 0.000003 1.649999
v 46.946449 6.000004 12.309595
v 46.946445 0.000003 12.309595
v 32.900005 6.000004 12.306665
v 32.900002 0.000003 12.306665
v -19.400000 -0.000001 1.650002
v -19.400002 5.999999 1.650002
v -19.400000 -0.000001 12.316669
v -19.400002 5.999999 12.316669
v -23.599998 -0.000001 1.650002
v -23.600000 5.999998 1.650002
v -23.453554 -0.000001 12.309597
v -23.453554 5.999998 12.309597
v -37.146446 -0.000001 12.309597
v -37.146446 5.999999 12.309597
v -37.146446 -0.000001 1.657072
v -37.146446 5.999999 1.657072
v -23.100000 -0.000001 1.660002
v -23.100000 5.999998 1.660002
v -19.882467 0.005284 1.640046
v -19.882469 11.994713 1.640046
v -23.079653 0.005283 1.640049
v -23.079655 11.994713 1.640049
v -37.467014 0.005276 1.640061
v -37.467014 11.994720 1.640061
v -40.664215 0.005274 1.640066
v -40.664215 11.994723 1.640066
v -41.200001 -0.000001 1.650002
v -41.200001 5.999998 1.650002
v -41.200001 -0.000001 18.150002
v -41.200001 5.999998 18.150002
v -41.200001 -0.000001 1.650002
v -41.200001 5.999998 1.650002
v -41.200001 -0.000001 0.050001
v -41.200001 5.999998 0.050001
v -40.658409 0.006130 0.040089
v -40.658409 11.993867 0.040089
v -48.117512 0.006122 0.040102
v -48.117512 11.993876 0.040102
v -48.136864 0.003712 6.440039
v -48.136864 11.996285 6.440039
v -40.674801 0.003714 6.440033
v -40.674801 11.996284 6.440033
v -41.053551 -0.000001 -6.342928
v -41.053551 5.999998 -6.342928
v -47.813114 -0.000001 -6.342927
v -47.813114 5.999999 -6.342927
v -47.813114 -0.000001 0.042931
v -47.813114 5.999999 0.042931
v -40.700001 -0.000001 0.040002
v -40.700001 5.999999 0.040002
v 50.000000 5.761985 18.139997
v -50.000000 5.761978 18.140001
v 50.000000 5.761985 18.139997
v -50.000000 5.761978 18.140001
v 50.000000 5.761985 18.139997
v -50.000000 5.761978 18.140001
v 50.000000 5.804412 18.142927
v -50.000000 5.804404 18.142931
v 49.999996 5.821985 -18.157017
v -50.000000 5.821978 -18.157013
vn -0.0000 -0.0000 1.0000
vn -0.0000 -1.0000 -0.0000
vn -0.0000 1.0000 -0.0000
vn 1.0000 -0.0000 -0.0000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vn -0.0000 0.0007 -1.0000
vn -0.0000 0.9998 -0.0177
vn -0.0000 -0.0029 -1.0000
vn -0.0000 0.0689 0.9976
vn -0.0000 -0.9997 -0.0261
vn -0.0000 -0.0007 -1.0000
vn -0.0000 0.0747 -0.9972
vn -0.9947 -0.0725 -0.0730
vn -0.9910 -0.1338 -0.0000
vn -0.9898 -0.1427 -0.0000
vn -0.9871 -0.0181 0.1589
vn 0.9947 -0.0725 -0.0730
vn 0.9910 -0.1338 -0.0000
vn 0.9898 -0.1427 -0.0000
vn 0.9871 -0.0181 0.1589
vn 0.0003 -0.0000 -1.0000
vn 0.9999 0.0122 0.0081
vn -0.9999 -0.0000 0.0172
vn -0.0001 -0.0004 -1.0000
vn -0.0000 0.0018 1.0000
vn -0.0002 -0.0000 1.0000
vn 0.0002 -0.0000 1.0000
vn 0.9999 -0.0000 -0.0137
vn 0.0002 -0.0000 -1.0000
vn -0.9999 -0.0000 0.0137
vn -0.9997 -0.0000 -0.0229
vn -0.0004 -0.0000 -1.0000
vn -0.0000 -0.0689 0.9976
vn -0.0000 1.0000 0.0005
vn 0.0891 0.0040 -0.9960
vn -0.0891 0.0040 -0.9960
vn -0.0200 -0.0000 -0.9998
vn 0.0200 -0.0000 -0.9998
vn -0.0538 -0.0067 -0.9985
vn 0.0538 -0.0067 -0.9985
vn -0.2612 -0.9553 -0.1384
vn 0.2612 -0.9553 -0.1384
vn 0.1191 0.9929 -0.0000
vn -0.1191 0.9929 -0.0000
vn -0.0074 -0.0011 1.0000
vn 0.0117 0.0017 -0.9999
vn -0.0074 -0.0023 1.0000
vn 0.0074 0.0023 -1.0000
vn -0.0074 -0.0025 1.0000
vn 0.0074 0.0025 -1.0000
vn 0.0440 -0.9988 -0.0197
vn -0.0117 0.0017 -0.9999
vn 0.0074 -0.0011 1.0000
vn -0.0074 0.0023 -1.0000
vn 0.0074 -0.0023 1.0000
vn -0.0074 0.0025 -1.0000
vn 0.0074 -0.0025 1.0000
vn -0.0440 -0.9988 -0.0197
vn 0.0047 0.0009 1.0000
vn 0.0196 -0.0017 -0.9998
vn -0.0196 0.0017 0.9998
vn 1.0000 -0.0000 -0.0003
vn -1.0000 -0.0000 0.0003
vt 0.791666 0.178667
vt 1.000000 0.178667
vt 1.000000 0.904000
vt 0.791667 0.904000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 0.093333
vt 0.000000 0.093333
vt 0.000000 0.178667
vt 0.000000 0.904000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.027000
vt 1.000000 0.027000
vt 1.000000 0.171000
vt 0.000000 0.171000
vt 0.000000 0.203000
vt 1.000000 0.203000
vt 1.000000 0.347000
vt 0.000000 0.347000
vt 0.000000 0.379000
vt 1.000000 0.379000
vt 1.000000 0.523000
vt 0.000000 0.523000
vt 0.000000 0.555000
vt 1.000000 0.555000
vt 1.000000 0.699000
vt 0.000000 0.699000
vt 0.000000 0.952000
vt 1.000000 0.952000
s 0
f 12/5/7 10/6/7 9/7/7 11/8/7
f 12/5/8 11/8/8 13/8/8 14/5/8
f 14/5/7 13/8/7 15/8/7 16/5/7
f 16/5/8 15/8/8 17/8/8 18/5/8
f 18/5/7 17/8/7 19/8/7 20/5/7
f 20/5/8 19/8/8 21/8/8 22/5/8
f 22/5/7 21/8/7 23/8/7 24/5/7
f 24/5/7 23/8/7 25/8/7 26/5/7
f 26/5/9 25/8/9 27/8/9 28/5/9
f 28/5/7 27/8/7 29/8/7 30/5/7
f 11/8/7 12/5/7 32/5/7 31/8/7
f 13/8/10 11/8/10 33/8/10 34/8/10
f 17/8/10 15/8/10 35/8/10 36/8/10
f 21/8/10 19/8/10 37/8/10 38/8/10
f 29/8/10 27/8/10 39/8/10 40/8/10
f 12/5/11 14/5/11 42/5/11 41/5/11
f 16/5/11 18/5/11 44/5/11 43/5/11
f 20/5/11 22/5/11 46/5/11 45/5/11
f 28/5/11 30/5/11 48/5/11 47/5/11
f 49/9/7 50/10/7 53/11/7 52/12/7
f 54/6/11 65/5/11 55/13/11 63/13/11 62/6/11
f 52/12/10 53/11/10 61/11/10 60/12/10
f 55/13/7 65/5/7 64/8/7 51/14/7
f 66/9/7 67/10/7 69/15/7 68/16/7
f 70/9/12 71/10/12 73/15/12 72/16/12
f 74/9/10 75/10/10 77/15/10 76/16/10
f 78/9/11 79/10/11 81/15/11 80/16/11
f 82/17/12 83/18/12 84/19/12 85/20/12
f 87/21/12 86/22/12 92/23/12 93/24/12
f 95/25/12 94/26/12 100/27/12 101/28/12
f 103/29/12 102/30/12 108/31/12 109/32/12
f 102/30/10 103/29/10 125/29/10 124/30/10
f 101/28/11 100/27/11 122/27/11 123/28/11
f 94/26/10 95/25/10 121/25/10 120/26/10
f 93/24/11 92/23/11 118/23/11 119/24/11
f 86/22/10 87/21/10 117/21/10 116/22/10
f 85/20/11 84/19/11 114/19/11 115/20/11
f 124/30/7 125/29/7 131/29/7 130/30/7
f 120/26/7 121/25/7 129/25/7 128/26/7
f 116/22/7 117/21/7 127/21/7 126/22/7
f 132/33/10 133/34/10 135/34/10 134/33/10
f 133/34/10 132/33/10 136/33/10 137/34/10
f 138/33/10 139/34/10 141/34/10 140/33/10
f 143/18/10 142/17/10 144/17/10 145/18/10
f 145/18/7 144/17/7 146/17/7 147/18/7
f 149/32/11 148/31/11 150/31/11 151/32/11
f 152/31/10 153/32/10 155/32/10 154/31/10
f 154/31/7 155/32/7 157/32/7 156/31/7
f 156/31/11 157/32/11 159/32/11 158/31/11
f 158/31/12 159/32/12 161/32/12 160/31/12
f 171/32/10 173/32/10 172/31/10 170/31/10
f 174/31/10 176/31/10 177/32/10 175/32/10
f 177/32/10 176/31/10 186/31/10 187/32/10
f 187/32/12 186/31/12 188/31/12 189/32/12
f 189/32/11 188/31/11 190/31/11 191/32/11
f 191/32/7 190/31/7 192/31/7 193/32/7
f 70/9/7 72/16/7 195/16/7 194/9/7
f 194/9/7 195/16/7 197/16/7 196/9/7
f 196/9/7 197/16/7 199/16/7 198/9/7
f 198/9/7 199/16/7 201/16/7 200/9/7
f 200/9/8 201/16/8 203/16/8 202/9/8
f 207/5/13 206/8/13 204/7/13 205/6/13
f 207/5/14 209/5/14 208/8/14 206/8/14
f 209/5/12 211/5/12 210/8/12 208/8/12
f 211/5/9 213/5/9 212/8/9 210/8/9
f 213/5/12 215/5/12 214/8/12 212/8/12
f 215/5/9 217/5/9 216/8/9 214/8/9
f 217/5/15 219/5/15 218/8/15 216/8/15
f 219/5/16 221/5/16 220/8/16 218/8/16
f 221/5/17 223/5/17 222/8/17 220/8/17
f 223/5/18 225/5/18 224/8/18 222/8/18
f 206/8/19 226/8/19 227/5/19 207/5/19
f 208/8/20 229/8/20 228/8/20 206/8/20
f 212/8/21 231/8/21 230/8/21 210/8/21
f 216/8/22 233/8/22 232/8/22 214/8/22
f 224/8/23 235/8/23 234/8/23 222/8/23
f 207/5/24 236/5/24 237/5/24 209/5/24
f 211/5/25 238/5/25 239/5/25 213/5/25
f 215/5/26 240/5/26 241/5/26 217/5/26
f 223/5/27 242/5/27 243/5/27 225/5/27
f 244/9/28 247/12/28 248/11/28 245/10/28
f 249/6/29 257/6/29 258/13/29 250/13/29 260/5/29
f 247/12/30 255/12/30 256/11/30 248/11/30
f 250/13/31 246/14/31 259/8/31 260/5/31
f 261/9/12 263/16/12 264/15/12 262/10/12
f 265/9/32 267/16/32 268/15/32 266/10/32
f 269/9/11 271/16/11 272/15/11 270/10/11
f 273/9/10 275/16/10 276/15/10 274/10/10
f 277/17/33 280/20/33 279/19/33 278/18/33
f 282/21/7 288/24/7 287/23/7 281/22/7
f 290/25/7 296/28/7 295/27/7 289/26/7
f 298/29/34 304/32/34 303/31/34 297/30/34
f 297/30/11 319/30/11 320/29/11 298/29/11
f 296/28/35 318/28/35 317/27/35 295/27/35
f 289/26/11 315/26/11 316/25/11 290/25/11
f 288/24/35 314/24/35 313/23/35 287/23/35
f 281/22/11 311/22/11 312/21/11 282/21/11
f 280/20/35 310/20/35 309/19/35 279/19/35
f 319/30/36 325/30/36 326/29/36 320/29/36
f 315/26/36 323/26/36 324/25/36 316/25/36
f 311/22/36 321/22/36 322/21/36 312/21/36
f 327/33/11 329/33/11 330/34/11 328/34/11
f 328/34/11 332/34/11 331/33/11 327/33/11
f 333/33/11 335/33/11 336/34/11 334/34/11
f 338/18/37 340/18/37 339/17/37 337/17/37
f 340/18/36 342/18/36 341/17/36 339/17/36
f 344/32/10 346/32/10 345/31/10 343/31/10
f 347/31/37 349/31/37 350/32/37 348/32/37
f 349/31/12 351/31/12 352/32/12 350/32/12
f 351/31/10 353/31/10 354/32/10 352/32/10
f 353/31/33 355/31/33 356/32/33 354/32/33
f 366/32/11 365/31/11 367/31/11 368/32/11
f 369/31/11 370/32/11 372/32/11 371/31/11
f 372/32/38 382/32/38 381/31/38 371/31/38
f 382/32/7 384/32/7 383/31/7 381/31/7
f 384/32/10 386/32/10 385/31/10 383/31/10
f 386/32/39 388/32/39 387/31/39 385/31/39
f 265/9/9 389/9/9 390/16/9 267/16/9
f 389/9/7 391/9/7 392/16/7 390/16/7
f 391/9/7 393/9/7 394/16/7 392/16/7
f 393/9/40 395/9/40 396/16/40 394/16/40
f 395/9/41 397/9/41 398/16/41 396/16/41
f 9/7/8 10/6/8 205/6/8 204/7/8
f 11/8/42 9/7/42 204/7/42 206/8/42
f 10/6/43 12/5/43 207/5/43 205/6/43
f 14/5/44 16/5/44 211/5/44 209/5/44
f 15/8/45 13/8/45 208/8/45 210/8/45
f 18/5/44 20/5/44 215/5/44 213/5/44
f 19/8/45 17/8/45 212/8/45 214/8/45
f 22/5/46 24/5/46 219/5/46 217/5/46
f 23/8/47 21/8/47 216/8/47 218/8/47
f 24/5/10 26/5/10 221/5/10 219/5/10
f 25/8/11 23/8/11 218/8/11 220/8/11
f 26/5/48 28/5/48 223/5/48 221/5/48
f 27/8/49 25/8/49 220/8/49 222/8/49
f 30/5/9 29/8/9 224/8/9 225/5/9
f 31/8/8 32/5/8 227/5/8 226/8/8
f 11/8/50 31/8/50 226/8/50 206/8/50
f 32/5/51 12/5/51 207/5/51 227/5/51
f 34/8/9 33/8/9 228/8/9 229/8/9
f 13/8/52 34/8/52 229/8/52 208/8/52
f 33/8/53 11/8/53 206/8/53 228/8/53
f 36/8/9 35/8/9 230/8/9 231/8/9
f 17/8/54 36/8/54 231/8/54 212/8/54
f 35/8/55 15/8/55 210/8/55 230/8/55
f 38/8/9 37/8/9 232/8/9 233/8/9
f 21/8/56 38/8/56 233/8/56 216/8/56
f 37/8/57 19/8/57 214/8/57 232/8/57
f 40/8/12 39/8/12 234/8/12 235/8/12
f 29/8/9 40/8/9 235/8/9 224/8/9
f 39/8/58 27/8/58 222/8/58 234/8/58
f 41/5/9 42/5/9 237/5/9 236/5/9
f 12/5/59 41/5/59 236/5/59 207/5/59
f 42/5/60 14/5/60 209/5/60 237/5/60
f 43/5/9 44/5/9 239/5/9 238/5/9
f 16/5/61 43/5/61 238/5/61 211/5/61
f 44/5/62 18/5/62 213/5/62 239/5/62
f 45/5/9 46/5/9 241/5/9 240/5/9
f 20/5/63 45/5/63 240/5/63 215/5/63
f 46/5/64 22/5/64 217/5/64 241/5/64
f 47/5/12 48/5/12 243/5/12 242/5/12
f 28/5/65 47/5/65 242/5/65 223/5/65
f 48/5/9 30/5/9 225/5/9 243/5/9
f 49/9/9 52/12/9 247/12/9 244/9/9
f 50/10/11 49/9/11 244/9/11 245/10/11
f 51/14/10 64/8/10 259/8/10 246/14/10
f 53/11/8 50/10/8 245/10/8 248/11/8
f 55/13/9 51/14/9 246/14/9 250/13/9
f 60/12/12 61/11/12 256/11/12 255/12/12
f 62/6/12 63/13/12 258/13/12 257/6/12
f 54/6/8 62/6/8 257/6/8 249/6/8
f 63/13/9 55/13/9 250/13/9 258/13/9
f 52/12/9 60/12/9 255/12/9 247/12/9
f 61/11/8 53/11/8 248/11/8 256/11/8
f 65/5/66 54/6/66 249/6/66 260/5/66
f 64/8/8 65/5/8 260/5/8 259/8/8
f 66/9/9 68/16/9 263/16/9 261/9/9
f 67/10/11 66/9/11 261/9/11 262/10/11
f 69/15/8 67/10/8 262/10/8 264/15/8
f 68/16/10 69/15/10 264/15/10 263/16/10
f 71/10/67 70/9/67 265/9/67 266/10/67
f 73/15/8 71/10/8 266/10/8 268/15/8
f 72/16/68 73/15/68 268/15/68 267/16/68
f 74/9/9 76/16/9 271/16/9 269/9/9
f 75/10/7 74/9/7 269/9/7 270/10/7
f 77/15/8 75/10/8 270/10/8 272/15/8
f 76/16/12 77/15/12 272/15/12 271/16/12
f 78/9/8 80/16/8 275/16/8 273/9/8
f 79/10/7 78/9/7 273/9/7 274/10/7
f 81/15/9 79/10/9 274/10/9 276/15/9
f 80/16/12 81/15/12 276/15/12 275/16/12
f 82/17/9 85/20/9 280/20/9 277/17/9
f 83/18/69 82/17/69 277/17/69 278/18/69
f 84/19/8 83/18/8 278/18/8 279/19/8
f 87/21/9 93/24/9 288/24/9 282/21/9
f 92/23/8 86/22/8 281/22/8 287/23/8
f 95/25/9 101/28/9 296/28/9 290/25/9
f 100/27/8 94/26/8 289/26/8 295/27/8
f 103/29/9 109/32/9 304/32/9 298/29/9
f 108/31/8 102/30/8 297/30/8 303/31/8
f 109/32/70 108/31/70 303/31/70 304/32/70
f 115/20/7 114/19/7 309/19/7 310/20/7
f 119/24/7 118/23/7 313/23/7 314/24/7
f 123/28/7 122/27/7 317/27/7 318/28/7
f 102/30/8 124/30/8 319/30/8 297/30/8
f 125/29/9 103/29/9 298/29/9 320/29/9
f 101/28/9 123/28/9 318/28/9 296/28/9
f 122/27/8 100/27/8 295/27/8 317/27/8
f 94/26/8 120/26/8 315/26/8 289/26/8
f 121/25/9 95/25/9 290/25/9 316/25/9
f 93/24/9 119/24/9 314/24/9 288/24/9
f 118/23/8 92/23/8 287/23/8 313/23/8
f 86/22/8 116/22/8 311/22/8 281/22/8
f 117/21/9 87/21/9 282/21/9 312/21/9
f 85/20/9 115/20/9 310/20/9 280/20/9
f 114/19/8 84/19/8 279/19/8 309/19/8
f 126/22/70 127/21/70 322/21/70 321/22/70
f 128/26/11 129/25/11 324/25/11 323/26/11
f 130/30/70 131/29/70 326/29/70 325/30/70
f 124/30/8 130/30/8 325/30/8 319/30/8
f 131/29/9 125/29/9 320/29/9 326/29/9
f 120/26/8 128/26/8 323/26/8 315/26/8
f 129/25/9 121/25/9 316/25/9 324/25/9
f 116/22/8 126/22/8 321/22/8 311/22/8
f 127/21/9 117/21/9 312/21/9 322/21/9
f 134/33/12 135/34/12 330/34/12 329/33/12
f 132/33/9 134/33/9 329/33/9 327/33/9
f 135/34/8 133/34/8 328/34/8 330/34/8
f 137/34/7 136/33/7 331/33/7 332/34/7
f 133/34/8 137/34/8 332/34/8 328/34/8
f 136/33/9 132/33/9 327/33/9 331/33/9
f 139/34/7 138/33/7 333/33/7 334/34/7
f 140/33/12 141/34/12 336/34/12 335/33/12
f 138/33/9 140/33/9 335/33/9 333/33/9
f 141/34/8 139/34/8 334/34/8 336/34/8
f 142/17/12 143/18/12 338/18/12 337/17/12
f 143/18/8 145/18/8 340/18/8 338/18/8
f 144/17/9 142/17/9 337/17/9 339/17/9
f 147/18/11 146/17/11 341/17/11 342/18/11
f 145/18/8 147/18/8 342/18/8 340/18/8
f 146/17/9 144/17/9 339/17/9 341/17/9
f 148/31/12 149/32/12 344/32/12 343/31/12
f 151/32/7 150/31/7 345/31/7 346/32/7
f 149/32/9 151/32/9 346/32/9 344/32/9
f 150/31/8 148/31/8 343/31/8 345/31/8
f 153/32/12 152/31/12 347/31/12 348/32/12
f 152/31/8 154/31/8 349/31/8 347/31/8
f 155/32/9 153/32/9 348/32/9 350/32/9
f 154/31/8 156/31/8 351/31/8 349/31/8
f 157/32/9 155/32/9 350/32/9 352/32/9
f 156/31/8 158/31/8 353/31/8 351/31/8
f 159/32/9 157/32/9 352/32/9 354/32/9
f 160/31/10 161/32/10 356/32/10 355/31/10
f 158/31/8 160/31/8 355/31/8 353/31/8
f 161/32/9 159/32/9 354/32/9 356/32/9
f 171/32/12 170/31/12 365/31/12 366/32/12
f 172/31/7 173/32/7 368/32/7 367/31/7
f 173/32/9 171/32/9 366/32/9 368/32/9
f 170/31/8 172/31/8 367/31/8 365/31/8
f 174/31/7 175/32/7 370/32/7 369/31/7
f 176/31/8 174/31/8 369/31/8 371/31/8
f 175/32/9 177/32/9 372/32/9 370/32/9
f 177/32/9 187/32/9 382/32/9 372/32/9
f 186/31/8 176/31/8 371/31/8 381/31/8
f 187/32/9 189/32/9 384/32/9 382/32/9
f 188/31/8 186/31/8 381/31/8 383/31/8
f 189/32/9 191/32/9 386/32/9 384/32/9
f 190/31/8 188/31/8 383/31/8 385/31/8
f 193/32/10 192/31/10 387/31/10 388/32/10
f 191/32/9 193/32/9 388/32/9 386/32/9
f 192/31/8 190/31/8 385/31/8 387/31/8
f 70/9/8 194/9/8 389/9/8 265/9/8
f 195/16/9 72/16/9 267/16/9 390/16/9
f 194/9/7 196/9/7 391/9/7 389/9/7
f 197/16/7 195/16/7 390/16/7 392/16/7
f 196/9/7 198/9/7 393/9/7 391/9/7
f 199/16/7 197/16/7 392/16/7 394/16/7
f 198/9/11 200/9/11 395/9/11 393/9/11
f 201/16/10 199/16/10 394/16/10 396/16/10
f 202/9/12 203/16/12 398/16/12 397/9/12
f 200/9/10 202/9/10 397/9/10 395/9/10
f 203/16/11 201/16/11 396/16/11 398/16/11

BIN
assets/sounds/fart.wav Normal file

Binary file not shown.

BIN
assets/sounds/step.wav Normal file

Binary file not shown.

View File

@@ -1,286 +1,9 @@
#pragma once
/**
* \file DataBuffer.h
* \brief File containing the blitz::DataBuffer class
*/
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <cstring>
#include <string>
#include <vector>
#include <sp/common/DataBuffer.h>
namespace blitz {
/**
* \class DataBuffer
* \brief Class used to manipulate memory
*/
class DataBuffer {
private:
typedef std::vector<std::uint8_t> Data;
Data m_Buffer;
std::size_t m_ReadOffset;
public:
typedef Data::iterator iterator;
typedef Data::const_iterator const_iterator;
typedef Data::reference reference;
typedef Data::const_reference const_reference;
typedef Data::difference_type difference_type;
DataBuffer();
DataBuffer(const DataBuffer& other);
DataBuffer(const DataBuffer& other, difference_type offset);
DataBuffer(DataBuffer&& other);
DataBuffer(const std::string& str);
DataBuffer& operator=(const DataBuffer& other);
DataBuffer& operator=(DataBuffer&& other);
/**
* \brief Append data to the buffer
*/
template <typename T>
void Append(const T& data) {
std::size_t size = sizeof(data);
std::size_t end_pos = m_Buffer.size();
m_Buffer.resize(m_Buffer.size() + size);
std::memcpy(&m_Buffer[end_pos], &data, size);
}
/**
* \brief Append data to the buffer
*/
template <typename T>
DataBuffer& operator<<(const T& data) {
Append(data);
return *this;
}
/**
* \brief Append a string to the buffer
* \warning Don't use it for binary data !
* \param str The string to append
*/
DataBuffer& operator<<(const std::string& str) {
std::size_t strlen = str.length() + 1; // including null character
Resize(GetSize() + strlen);
std::memcpy(m_Buffer.data() + GetSize() - strlen, str.data(), strlen);
return *this;
}
/**
* \brief Append data to the buffer from another const buffer
* \param data The buffer to append
*/
DataBuffer& operator<<(const DataBuffer& data) {
m_Buffer.insert(m_Buffer.end(), data.begin(), data.end());
return *this;
}
/**
* \brief Read some data from the buffer and assign to desired variable
*/
template <typename T>
DataBuffer& operator>>(T& data) {
assert(m_ReadOffset + sizeof(T) <= GetSize());
data = *(reinterpret_cast<T*>(&m_Buffer[m_ReadOffset]));
m_ReadOffset += sizeof(T);
return *this;
}
/**
* \brief Read some data from the buffer and assign to the new buffer
* \param data The buffer to assign
*/
DataBuffer& operator>>(DataBuffer& data) {
data.Resize(GetSize() - m_ReadOffset);
std::copy(m_Buffer.begin() + static_cast<difference_type>(m_ReadOffset), m_Buffer.end(), data.begin());
m_ReadOffset = m_Buffer.size();
return *this;
}
/**
* \brief Read a string from the buffer
* \param str The string to assign in the new buffer
* \warning Don't use it for binary data !
*/
DataBuffer& operator>>(std::string& str) {
std::size_t stringSize =
strlen(reinterpret_cast<const char*>(m_Buffer.data()) + m_ReadOffset) + 1; // including null character
str.resize(stringSize);
std::copy(m_Buffer.begin() + static_cast<difference_type>(m_ReadOffset),
m_Buffer.begin() + static_cast<difference_type>(m_ReadOffset + stringSize), str.begin());
m_ReadOffset += stringSize;
return *this;
}
/**
* \brief Write some data to the buffer
* \param buffer The buffer to write
* \param amount The amount of data to write
*/
void WriteSome(const char* buffer, std::size_t amount) {
std::size_t end_pos = m_Buffer.size();
m_Buffer.resize(m_Buffer.size() + amount);
std::memcpy(m_Buffer.data() + end_pos, buffer, amount);
}
/**
* \brief Write some data to the buffer
* \param buffer The buffer to write
* \param amount The amount of data to write
*/
void WriteSome(const std::uint8_t* buffer, std::size_t amount) {
std::size_t end_pos = m_Buffer.size();
m_Buffer.resize(m_Buffer.size() + amount);
std::memcpy(m_Buffer.data() + end_pos, buffer, amount);
}
/**
* \brief Read some data from the buffer
* \param buffer The buffer to Read
* \param amount The amount of data from the buffer
*/
void ReadSome(char* buffer, std::size_t amount) {
assert(m_ReadOffset + amount <= GetSize());
std::copy_n(m_Buffer.begin() + static_cast<difference_type>(m_ReadOffset), amount, buffer);
m_ReadOffset += amount;
}
/**
* \brief Read some data from the buffer
* \param buffer The buffer to Read
* \param amount The amount of data from the buffer
*/
void ReadSome(std::uint8_t* buffer, std::size_t amount) {
assert(m_ReadOffset + amount <= GetSize());
std::copy_n(m_Buffer.begin() + static_cast<difference_type>(m_ReadOffset), amount, buffer);
m_ReadOffset += amount;
}
/**
* \brief Read some data from the buffer
* \param buffer The buffer to Read
* \param amount The amount of data from the buffer
*/
void ReadSome(DataBuffer& buffer, std::size_t amount) {
assert(m_ReadOffset + amount <= GetSize());
buffer.Resize(amount);
std::copy_n(m_Buffer.begin() + static_cast<difference_type>(m_ReadOffset), amount, buffer.begin());
m_ReadOffset += amount;
}
/**
* \brief Resize the buffer
* \param size The new size of the buffer
*/
void Resize(std::size_t size) {
m_Buffer.resize(size);
}
/**
* \brief Reserve some space in the buffer
* \param amount The amount of space to reserve
*/
void Reserve(std::size_t amount) {
m_Buffer.reserve(amount);
}
/**
* \brief Clear the buffer
*/
void Clear() {
m_Buffer.clear();
m_ReadOffset = 0;
}
/**
* \brief When the buffer has been read entirely
*/
bool IsFinished() const {
return m_ReadOffset >= m_Buffer.size();
}
/**
* \brief Get the buffer data
*/
std::uint8_t* data() {
return m_Buffer.data();
}
/**
* \brief Get the buffer data
*/
const std::uint8_t* data() const {
return m_Buffer.data();
}
/**
* \brief Get the read offset
*/
std::size_t GetReadOffset() const {
return m_ReadOffset;
}
/**
* \brief Set the read offset
* \param pos The new read offset
*/
void SetReadOffset(std::size_t pos);
/**
* \brief Get the size of the buffer
*/
std::size_t GetSize() const;
/**
* \brief Get the remaining size of the buffer
*/
std::size_t GetRemaining() const;
/**
* \brief Read a file into the buffer
* \param fileName The name of the file to read
*/
bool ReadFile(const std::string& fileName);
/**
* \brief Write a file into the buffer
* \param fileName The name of the file to write to
*/
bool WriteFile(const std::string& fileName) const;
/**
* \brief Allocate the buffer on the heap
* \warning Don't forget to free the data !
*/
std::uint8_t* HeapAllocatedData() const {
std::uint8_t* newBuffer = new std::uint8_t[GetSize()];
std::memcpy(newBuffer, data(), GetSize());
return newBuffer;
}
/**
* \brief Operator == to compare two DataBuffer
*/
bool operator==(const DataBuffer& other) const {
return m_Buffer == other.m_Buffer;
}
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
};
/**
* \brief Operator << to write a DataBuffer to an ostream
*/
std::ostream& operator<<(std::ostream& os, const DataBuffer& buffer);
using DataBuffer = sp::DataBuffer;
} // namespace blitz

View File

@@ -6,6 +6,7 @@
*/
#include <cstdint>
#include <sp/protocol/MessagePrinter.h>
namespace blitz {
namespace game {
@@ -30,3 +31,10 @@ enum GameState : std::uint8_t {
} // namespace game
} // namespace blitz
namespace sp {
template <>
inline std::string PrintData(const blitz::game::GameState& a_State) {
return PrintData(static_cast<unsigned>(a_State));
}
} // namespace sp

View File

@@ -1,25 +0,0 @@
#pragma once
/**
* \file NonCopyable.h
* \brief File containing the blitz::NonCopyable class
*/
namespace blitz {
/**
* \class NonCopyable
* \brief Class used to make a class non copyable
* \note Inherit from this class privately to make a class non copyable
*/
class NonCopyable {
public:
NonCopyable(const NonCopyable&) = delete;
NonCopyable& operator=(const NonCopyable&) = delete;
protected:
NonCopyable() {}
~NonCopyable() {}
};
} // namespace blitz

View File

@@ -1,58 +0,0 @@
#pragma once
/**
* \file VarInt.h
* \brief File containing the blitz::VarInt class
*/
#include <cstddef>
#include <cstdint>
namespace blitz {
class DataBuffer;
/**
* \class VarInt
* \brief Variable-length format such that smaller numbers use fewer bytes.
*/
class VarInt {
private:
std::uint64_t m_Value;
public:
VarInt() : m_Value(0) {}
/**
* \brief Construct a variable integer from a value
* \param value The value of the variable integer
*/
VarInt(std::uint64_t value) : m_Value(value) {}
/**
* \brief Get the value of the variable integer
*/
std::uint64_t GetValue() const {
return m_Value;
}
/**
* \brief Get the length of the serialized variable integer
*/
std::size_t GetSerializedLength() const;
/**
* \brief Serialize the variable integer
* \param out The buffer to write the serialized variable integer to
* \param var The variable integer to serialize
*/
friend DataBuffer& operator<<(DataBuffer& out, const VarInt& var);
/**
* \brief Deserialize the variable integer
* \param in The buffer to read the serialized variable integer from
* \param var The variable integer to deserialize
*/
friend DataBuffer& operator>>(DataBuffer& in, VarInt& var);
};
} // namespace blitz

View File

@@ -10,6 +10,7 @@
#include "blitz/misc/ObjectNotifier.h"
#include "blitz/misc/Time.h"
#include <map>
#include <sp/protocol/MessagePrinter.h>
namespace blitz {
namespace game {
@@ -140,3 +141,10 @@ class Game : public utils::ObjectNotifier<GameListener> {
} // namespace game
} // namespace blitz
namespace sp {
template <>
inline std::string PrintData(const blitz::game::GameConfig& a_Config) {
return "{Gravity=" + PrintData(a_Config.Gravity) + ", FiringRate=" + PrintData(a_Config.FiringRate) + "}";
}
} // namespace sp

View File

@@ -9,6 +9,7 @@ class GameListener {
public:
virtual void OnPlayerJoin(game::PlayerID player) {}
virtual void OnPlayerLeave(game::PlayerID player) {}
virtual void OnPlayerDeath(game::PlayerID player) {}
virtual void OnGameStateUpdate(game::GameState newState) {}
};

View File

@@ -8,6 +8,7 @@
#include "blitz/common/Defines.h"
#include "blitz/maths/Vector.h"
#include <cstdint>
#include <sp/protocol/MessagePrinter.h>
#include <string>
namespace blitz {
@@ -222,3 +223,12 @@ class Player {
} // namespace game
} // namespace blitz
namespace sp {
template <>
inline std::string PrintData(const blitz::game::PlayerStats& a_Stats) {
return "{m_Deaths=" + PrintData(a_Stats.m_Deaths) + ", m_Kills=" + PrintData(a_Stats.m_Kills) +
", m_ShootCount=" + PrintData(a_Stats.m_ShootCount) + ", m_ShootSuccessCount=" + PrintData(a_Stats.m_ShootSuccessCount) +
"}";
}
} // namespace sp

View File

@@ -1,6 +1,7 @@
#pragma once
namespace blitz {
namespace maths {
class EMASmoother {
private:
@@ -16,4 +17,5 @@ class EMASmoother {
void SetSmoothingTime(float t);
};
} // namespace maths
} // namespace blitz

View File

@@ -8,6 +8,7 @@
#include <algorithm>
#include <cmath>
#include <cstddef>
#include <sp/protocol/MessagePrinter.h>
namespace blitz {
@@ -325,3 +326,14 @@ bool operator==(const Mat4<T>& mat, const Mat4<T>& other) {
mat.w3 == other.w3;
}
} // namespace blitz
namespace sp {
template <>
inline std::string PrintData(const blitz::Vec3f& a_Vec) {
return "{" + PrintData(a_Vec.x) + ", " + PrintData(a_Vec.y) + ", " + PrintData(a_Vec.z) + "}";
}
template <>
inline std::string PrintData(const blitz::Vec4f& a_Vec) {
return "{" + PrintData(a_Vec.x) + ", " + PrintData(a_Vec.y) + ", " + PrintData(a_Vec.z) + ", " + PrintData(a_Vec.w) + "}";
}
} // namespace sp

View File

@@ -43,6 +43,8 @@ class ObjectNotifier {
/**
* \brief Notify listeners that were bound
* \param function the function to call
* \param args the parameters of the function to call
*/
template <typename Func, typename... Args>
void NotifyListeners(Func function, Args... args) const {

View File

@@ -8,70 +8,59 @@
#include "TCPSocket.h"
#include "blitz/protocol/PacketDispatcher.h"
#include "blitz/protocol/PacketHandler.h"
#include "blitz/protocol/PacketFactory.h"
namespace blitz {
namespace network {
using TCPStream = sp::io::Stream<sp::io::TcpTag, protocol::PacketDispatcher, protocol::PacketFactory, sp::option::ZlibCompress>;
/**
* \class Connexion
* \brief Represents a network connexion
*/
class Connexion : public protocol::PacketHandler, private NonCopyable {
protected:
protocol::PacketDispatcher m_Dispatcher;
private:
TCPSocket m_Socket;
class Connexion : public protocol::PacketHandler, public TCPStream {
public:
/**
/**
* \brief Constructs with an empty socket
*/
Connexion(protocol::PacketDispatcher* dispatcher);
Connexion() {}
/**
* \brief Constructs with an already connected socket
*/
Connexion(protocol::PacketDispatcher* dispatcher, TCPSocket& socket);
Connexion(TCPSocket&& socket);
/**
* \brief Move constructor
*/
Connexion(Connexion&& move);
/**
* \brief Default destructor
*/
virtual ~Connexion();
/**
* \brief Reads socket and process a Packet, if any
*/
virtual bool UpdateSocket();
/**
* \brief Closes the connexion
*/
void CloseConnection();
/**
* \brief Returns the TCPSocket::Status of the internal socket
*/
TCPSocket::Status GetSocketStatus() const {
return m_Interface.GetStatus();
}
virtual bool UpdateSocket();
/**
* \brief Tries to connect the socket at the specified address and port
* \return Whether this action was succesfull
*/
bool Connect(const std::string& address, std::uint16_t port);
/**
* \brief Returns the TCPSocket::Status of the internal socket
*/
TCPSocket::Status GetSocketStatus() const {
return m_Socket.GetStatus();
}
/**
* \brief Sends the protocol::Packet over the network to the remote
* \param packet The protocol::Packet to send
*/
void SendPacket(const protocol::Packet* packet);
void SendPacket(const protocol::Packet& packet);
};
} // namespace network

View File

@@ -21,7 +21,7 @@ namespace network {
* \note This class is meant to be created only once in your program. \n
* The easiest thing to do is to create an instance of this class at the top of your **main.cpp**.
*/
class NetworkInitializer : private NonCopyable {
class NetworkInitializer : private sp::NonCopyable {
public:
/**
* \brief Creates the networking context

View File

@@ -10,76 +10,7 @@
namespace blitz {
namespace network {
/**
* \class TCPListener
* \brief Cross platform abstraction of a TCP socket server
*/
class TCPListener : private NonCopyable {
private:
SocketHandle m_Handle;
std::uint16_t m_Port;
int m_MaxConnections;
public:
/**
* \brief Default constructor
*/
TCPListener();
/**
* \brief Default destructor
*/
~TCPListener();
/**
* \brief Starts listening for guests to connect
* \param port The port to listen to
* \param maxConnexions The maximum amount of connexion that can happen at the same time. \n
* Every other guests will be kicked if this amount is reached.
* \return Whether this action was succesfull
*/
bool Listen(std::uint16_t port, int maxConnexions);
/**
* \brief Tries to accept an incoming request to connect
* \param newSocket the empty socket to put the result to
* \return true if a new connexion was accepted
*/
bool Accept(TCPSocket& newSocket);
/**
* \brief Destroys the socket
*/
void Destroy();
/**
* \brief Closes transmissions
* \return true if this action was succesfull
*/
bool Close();
/**
* \brief Allows to set the socket in non blocking/blocking mode
* \param block If set to true, every call to Read will wait until the socket receives something
* \return true if the operation was successful
*/
bool SetBlocking(bool blocking);
/**
* \brief Getter of the m_Port member
* \return The port which the socket listen to
*/
std::uint16_t GetListeningPort() const {
return m_Port;
}
/**
* \brief Getter of the m_MaxConnections member
* \return The maximum amount of connexions that can happen at the same time.
*/
int GetMaximumConnections() const {
return m_MaxConnections;
}
};
using TCPListener = sp::io::TcpListener;
} // namespace network
} // namespace blitz

View File

@@ -1,26 +1,6 @@
#pragma once
#include "blitz/common/DataBuffer.h"
#include "blitz/common/NonCopyable.h"
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#else
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#define closesocket close
#endif
#ifndef INVALID_SOCKET
#define INVALID_SOCKET -1
#endif
#include <sp/extensions/Tcp.h>
/**
* \file TCPSocket.h
@@ -30,138 +10,7 @@
namespace blitz {
namespace network {
/**
* \typedef SocketHandle
* \brief Represents a native socket
*/
typedef int SocketHandle;
/**
* \class TCPSocket
* \brief Cross platform abstraction of a TCP socket
*/
class TCPSocket : private NonCopyable {
public:
/**
* \enum Status
* \brief Describes the state of a socket
*/
enum class Status {
/** The socket is connected */
Connected,
/** The socket is not connected */
Disconnected,
/** Something bad happened */
Error,
};
private:
bool m_Blocking;
Status m_Status;
SocketHandle m_Handle;
std::uint16_t m_Port;
sockaddr m_RemoteAddr;
public:
/**
* \brief Default constructor
*/
TCPSocket();
/**
* \brief Default destructor
*/
virtual ~TCPSocket();
/**
* \brief Move constructor
*/
TCPSocket(TCPSocket&&);
/**
* \brief Sets the TCPSocket::Status of the socket
* \param status The TCPSocket::Status to apply
*/
void SetStatus(Status status);
/**
* \brief Allows to set the socket in non blocking/blocking mode
* \param block If set to true, every call to Read will wait until the socket receives something
* \return true if the operation was successful
*/
bool SetBlocking(bool block);
/**
* \brief Checks if the socket is in blocking mode
* \return Whether the socket is in blocking mode
*/
bool IsBlocking() const;
/**
* \brief Getter of the m_Status member
* \return The TCPSocket::Status of this socket
*/
Status GetStatus() const;
/**
* \brief Tries to connect to the host at the given port
* \param host The host to connect to. Can be a hostname or an ip address.
* \param port The port to connect to.
* \return Whether this action was successfull
*/
bool Connect(const std::string& host, std::uint16_t port);
/**
* \brief Disconnects the socket from the remote
* \note Does nothing if the socket is not connected. \n
* This function is also called by the destructor.
*/
void Disconnect();
/**
* \brief Sends some data
* \param buffer The data to send
* \note Simply returns 0 if the socket is not connected
* \return The amount of data sent. It should be the size of the buffer in theory.
*/
std::size_t Send(DataBuffer& buffer);
/**
* \brief Sends some data
* \param data The data to send
* \param size The amount of data to send
* \note Simply returns 0 if the socket is not connected
* \return The amount of data sent. It should be equal to the size param in theory
*/
std::size_t Send(const std::uint8_t* data, std::size_t size);
/**
* \brief Reads some data
* \param amount The amount of data to read
* \return The buffer containing the data that have been received
* \note If no data is available, an empty DataBuffer is returned
*/
DataBuffer Receive(std::size_t amount);
/**
* \brief Reads some data
* \param buffer The buffer to write into
* \param amount The amount of data to read
* \return The amount of data read
* \note If no data is available, 0 is returned
*/
std::size_t Receive(DataBuffer& buffer, std::size_t amount);
friend class TCPListener;
};
/**
* \brief Compress the data and send it to the socket
* \param data The data to send
* \param socket The socket to send to
*/
void SendPacket(const DataBuffer& data, network::TCPSocket& socket);
using TCPSocket = sp::io::TcpSocket;
} // namespace network
} // namespace blitz

View File

@@ -0,0 +1,74 @@
#pragma once
#include "blitz/common/DataBuffer.h"
#include "blitz/maths/Vector.h"
#include <string>
#include <vector>
namespace blitz {
namespace protocol {
/**
* \struct ColoredPart
* \brief Represents a part of a chat message with a specific color.
*/
struct ColoredPart {
/**
* \brief The color of the part.
*/
Vec4f m_Color;
/**
* \brief The text of the part.
*/
std::string m_Text;
};
using ColoredText = std::vector<ColoredPart>;
const static Vec3uc AQUA = {0, 255, 255};
const static Vec3uc BLUE = {0, 0, 255};
const static Vec3uc GREEN = {0, 255, 0};
const static Vec3uc PURPLE = {255, 0, 255};
const static Vec3uc RED = {255, 0, 0};
const static Vec3uc WHITE = {255, 255, 255};
const static Vec3uc YELLOW = {255, 255, 0};
/**
* \brief Get the text color.
*/
std::string GetTextColor(Vec3uc color);
/**
* \brief Colorize a text.
*/
ColoredText ColorizeText(const std::string& text);
/**
* \brief Get the colored text string.
*/
std::string GetColoredTextString(const ColoredText& text);
/**
* \brief Serialize the colored part
* \param out The buffer to write the serialized colored part to
* \param var The colored part to serialize
*/
DataBuffer& operator<<(DataBuffer& out, const ColoredPart& var);
/**
* \brief Deserialize the colored part
* \param in The buffer to read the serialized colored part from
* \param var The colored part to deserialize
*/
DataBuffer& operator>>(DataBuffer& in, ColoredPart& var);
} // namespace protocol
} // namespace blitz
namespace sp {
template <>
inline std::string PrintData(const blitz::protocol::ColoredPart& a_Part) {
return "{m_Color=" + PrintData(a_Part.m_Color) + ", m_Text=" + PrintData(a_Part.m_Text) + "}";
}
} // namespace sp

View File

@@ -5,54 +5,17 @@
* \brief File containing the blitz::protocol::PacketDispatcher class
*/
#include "blitz/common/NonCopyable.h"
#include "blitz/protocol/Protocol.h"
#include <map>
#include "blitz/protocol/Packets.h"
#include <sp/default/DefaultPacketDispatcher.h>
namespace blitz {
namespace protocol {
class PacketHandler;
/**
* \class PacketDispatcher
* \brief Class used to dispatch packets
*/
class PacketDispatcher : private NonCopyable {
private:
std::map<PacketType, std::vector<PacketHandler*>> m_Handlers;
public:
/**
* \brief Constructor
*/
PacketDispatcher() {}
/**
* \brief Dispatch a packet
* \param packet The packet to dispatch
*/
void Dispatch(const Packet* packet);
/**
* \brief Register a packet handler
* \param type The packet type
* \param handler The packet handler
*/
void RegisterHandler(PacketType type, PacketHandler* handler);
/**
* \brief Unregister a packet handler
* \param type The packet type
* \param handler The packet handler
*/
void UnregisterHandler(PacketType type, PacketHandler* handler);
/**
* \brief Unregister a packet handler
* \param handler The packet handler
*/
void UnregisterHandler(PacketHandler* handler);
};
using PacketDispatcher = sp::PacketDispatcher;
} // namespace protocol
} // namespace blitz

View File

@@ -4,23 +4,13 @@
* \file PacketFactory.h
*/
#include "blitz/protocol/Protocol.h"
#include <memory>
#include "blitz/protocol/Packets.h"
namespace blitz {
namespace protocol {
typedef std::unique_ptr<Packet> PacketPtr;
using PacketPtr = std::unique_ptr<Packet>;
using PacketFactory = sp::PacketFactory;
namespace PacketFactory {
/**
* \brief Creates a packet from a buffer.
* \param buffer The buffer containing the packet data.
* \return The created packet.
*/
const PacketPtr CreatePacket(PacketType type, DataBuffer& buffer);
} // namespace PacketFactory
} // namespace protocol
} // namespace blitz

View File

@@ -5,54 +5,12 @@
* \brief File containing the blitz::protocol::PacketHandler class
*/
#include "blitz/protocol/PacketsForward.h"
#include "blitz/protocol/Protocol.h"
#include "blitz/protocol/Packets.h"
namespace blitz {
namespace protocol {
class PacketDispatcher;
/**
* \class PacketHandler
* \brief Class used to handle packets
*/
class PacketHandler {
private:
PacketDispatcher* m_Dispatcher;
public:
/**
* \brief Constructor
* \param dispatcher The packet dispatcher
*/
PacketHandler(PacketDispatcher* dispatcher) : m_Dispatcher(dispatcher) {}
virtual ~PacketHandler() {}
/**
* \brief Get the packet dispatcher
* \return The packet dispatcher
*/
PacketDispatcher* GetDispatcher() {
return m_Dispatcher;
}
virtual void HandlePacket(const ChatPacket* packet) {}
virtual void HandlePacket(const ConnexionInfoPacket* packet) {}
virtual void HandlePacket(const DisconnectPacket* packet) {}
virtual void HandlePacket(const KeepAlivePacket* packet) {}
virtual void HandlePacket(const PlayerJoinPacket* packet) {}
virtual void HandlePacket(const PlayerLeavePacket* packet) {}
virtual void HandlePacket(const PlayerListPacket* packet) {}
virtual void HandlePacket(const PlayerLoginPacket* packet) {}
virtual void HandlePacket(const PlayerPositionAndRotationPacket* packet) {}
virtual void HandlePacket(const PlayerShootPacket* packet) {}
virtual void HandlePacket(const PlayerStatsPacket* packet) {}
virtual void HandlePacket(const ServerConfigPacket* packet) {}
virtual void HandlePacket(const ServerTpsPacket* packet) {}
virtual void HandlePacket(const UpdateGameStatePacket* packet) {}
virtual void HandlePacket(const UpdateHealthPacket* packet) {}
};
using PacketHandler = sp::PacketHandler;
} // namespace protocol
} // namespace blitz

View File

@@ -1,7 +1,39 @@
#pragma once
namespace blitz {
namespace protocol {
/**
* \enum PacketType
* \brief Map the packets name to their ID
*/
enum PacketType {
Chat = 0, /**< Corresponds to ChatPacket */
ConnexionInfo, /**< Corresponds to ConnexionInfoPacket */
Disconnect, /**< Corresponds to DisconnectPacket */
KeepAlive, /**< Corresponds to KeepAlivePacket */
PlayerDeath, /**< Corresponds to PlayerDeathPacket */
PlayerJoin, /**< Corresponds to PlayerJoinPacket */
PlayerLeave, /**< Corresponds to PlayerLeavePacket */
PlayerList, /**< Corresponds to PlayerListPacket */
PlayerLogin, /**< Corresponds to PlayerLoginPacket */
PlayerPositionAndRotation, /**< Corresponds to PlayerPositionAndRotationPacket */
PlayerShoot, /**< Corresponds to PlayerShootPacket */
PlayerStats, /**< Corresponds to PlayerStatsPacket */
ServerConfig, /**< Corresponds to ServerConfigPacket*/
ServerTps, /**< Corresponds to ServerTpsPacket */
UpdateGameState, /**< Corresponds to UpdateGameStatePacket */
UpdateHealth, /**< Corresponds to UpdateHealthPacket */
};
} // namespace protocol
} // namespace blitz
#include "packets/ChatPacket.h"
#include "packets/ConnexionInfoPacket.h"
#include "packets/DisconnectPacket.h"
#include "packets/KeepAlivePacket.h"
#include "packets/PlayerDeathPacket.h"
#include "packets/PlayerJoinPacket.h"
#include "packets/PlayerLeavePacket.h"
#include "packets/PlayerListPacket.h"
@@ -13,3 +45,34 @@
#include "packets/ServerTpsPacket.h"
#include "packets/UpdateGameStatePacket.h"
#include "packets/UpdateHealthPacket.h"
// they must be in the same order as in the enum !
using AllPackets = std::tuple<
blitz::protocol::ChatPacket,
blitz::protocol::ConnexionInfoPacket,
blitz::protocol::DisconnectPacket,
blitz::protocol::KeepAlivePacket,
blitz::protocol::PlayerDeathPacket,
blitz::protocol::PlayerJoinPacket,
blitz::protocol::PlayerLeavePacket,
blitz::protocol::PlayerListPacket,
blitz::protocol::PlayerLoginPacket,
blitz::protocol::PlayerPositionAndRotationPacket,
blitz::protocol::PlayerShootPacket,
blitz::protocol::PlayerStatsPacket,
blitz::protocol::ServerConfigPacket,
blitz::protocol::ServerTpsPacket,
blitz::protocol::UpdateGameStatePacket,
blitz::protocol::UpdateHealthPacket
>;
#include <sp/default/DefaultPacketFactory.h>
#include <sp/default/DefaultPacketHandler.h>
namespace blitz {
namespace protocol {
using Packet = sp::PacketMessage;
} // namespace protocol
} // namespace blitz

View File

@@ -7,6 +7,7 @@ class ChatPacket;
class ConnexionInfoPacket;
class DisconnectPacket;
class KeepAlivePacket;
class PlayerDeathPacket;
class PlayerJoinPacket;
class PlayerLeavePacket;
class PlayerListPacket;

View File

@@ -1,103 +0,0 @@
#pragma once
/**
* \file Protocol.h
* \brief File containing the blitz::protocol::Protocol class
*/
#include "blitz/common/DataBuffer.h"
namespace blitz {
namespace protocol {
class PacketHandler;
/**
* \enum PacketType
* \brief Map the packets name to their ID
*/
enum class PacketType : std::uint8_t {
// client --> server
PlayerLogin = 0, /**< Corresponds to PlayerLoginPacket */
UpdateHealth, /**< Corresponds to UpdateHealthPacket */
// client <-- server
ConnexionInfo, /**< Corresponds to ConnexionInfoPacket */
PlayerJoin, /**< Corresponds to PlayerJoinPacket */
PlayerLeave, /**< Corresponds to PlayerLeavePacket */
PlayerList, /**< Corresponds to PlayerListPacket */
PlayerStats, /**< Corresponds to PlayerStatsPacket */
ServerConfig, /**< Corresponds to ServerConfigPacket*/
ServerTps, /**< Corresponds to ServerTpsPacket */
UpdateGameState, /**< Corresponds to UpdateGameStatePacket */
// client <--> server
KeepAlive, /**< Corresponds to KeepAlivePacket */
Disconnect, /**< Corresponds to DisconnectPacket */
Chat, /**< Corresponds to ChatPacket */
PlayerPositionAndRotation, /**< Corresponds to PlayerPositionAndRotationPacket */
PlayerShoot, /**< Corresponds to PlayerShootPacket */
PACKET_COUNT
};
/**
* \class Packet
* \brief Represents a network packet <br/>
* %Packet data structure :
*| Field Name | Field Type | Notes |
*|---------------------|---------------|-------------------------------|
*| Length | Long | Length of whole Packet |
*| Uncompressed Length | VarInt | Length of Packet ID + Data |
*| Packet ID | Byte | Represents the #PacketType |
*| Data | Byte Array | Depends on the packet ID |
*/
class Packet {
public:
Packet() {}
virtual ~Packet() {}
/**
* \brief Serialize the Packet into a DataBuffer to be sent over the network
* \param packetID Set to false if you don't want to write the Packet ID for some reason
* \returns A DataBuffer filled with the serialized Packet
*/
virtual DataBuffer Serialize(bool packetID = true) const = 0;
/**
* \brief Deserialize the DataBuffer into a Packet to be read by the client/server
* \param data The DataBuffer containing the data from the network
*/
virtual void Deserialize(DataBuffer& data) = 0;
/**
* \brief Dispatches the Packet
* \param handler The class to dispatch the Packet to
*/
virtual void Dispatch(PacketHandler* handler) const = 0;
/**
* \brief Writes the Packet ID into a buffer
* \param data The DataBuffer to write to
* \param packetID If set to false, this function does nothing
*/
void WritePacketID(DataBuffer& data, bool packetID) const;
/**
* \returns The type of the Packet
*/
virtual PacketType GetType() const = 0;
/**
* \returns The Packet ID corresponding to the PacketType of this Packet
*/
std::uint8_t GetID() const {
return static_cast<std::uint8_t>(GetType());
}
};
} // namespace protocol
} // namespace blitz

View File

@@ -5,29 +5,22 @@
* \brief File containing the blitz::protocol::ChatPacket class
*/
#include "blitz/maths/Vector.h"
#include "blitz/protocol/Protocol.h"
#include <vector>
#include "blitz/protocol/Color.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
namespace blitz {
namespace protocol {
/**
* \struct ColoredPart
* \brief Represents a part of a chat message with a specific color.
*/
struct ColoredPart {
/**
* \brief The color of the part.
*/
Vec4f color;
/**
* \brief The text of the part.
*/
std::string text;
enum class ChatFieldsE {
m_Message = 0,
};
typedef std::vector<ColoredPart> ColoredText;
using ChatFields = std::tuple<
ColoredText //<- m_Message
>;
/**
* \class ChatPacket
@@ -41,64 +34,21 @@ typedef std::vector<ColoredPart> ColoredText;
* |--------------------|-------------------|-------------------------------|
* | m_Message | ColoredText | The message sent in the chat |
*/
class ChatPacket : public Packet {
private:
ColoredText m_Message;
DeclarePacket(Chat){
public:
PacketConstructor(Chat)
public:
/**
* \brief Default constructor.
*/
ChatPacket() {}
/**
* \brief Constructor.
* \param msg The message to send.
*/
ChatPacket(const std::string& msg) : m_Message(ColorizeText(msg)) {}
/**
* \brief Constructor.
* \param msg The message to send.
*/
ChatPacket(const ColoredText& msg) : m_Message(msg) {}
virtual ~ChatPacket() {}
virtual DataBuffer Serialize(bool packetID = true) const;
virtual void Deserialize(DataBuffer& data);
virtual void Dispatch(PacketHandler* handler) const;
ChatPacket(const std::string& msg) : ChatPacket(ColorizeText(msg)) {}
/**
* \brief Get the message.
* \return The message.
*/
const ColoredText& GetMessage() const {
return m_Message;
return GetField<ChatFieldsE, ChatFieldsE::m_Message>();
}
virtual PacketType GetType() const {
return PacketType::Chat;
}
/**
* \brief Get the text color.
*/
static std::string GetTextColor(Vec3uc color);
/**
* \brief Colorize a text.
*/
static ColoredText ColorizeText(const std::string& text);
/**
* \brief Get the colored text string.
*/
static std::string GetColoredTextString(const ColoredText& text);
};
const static Vec3uc AQUA = {0, 255, 255};
const static Vec3uc BLUE = {0, 0, 255};
const static Vec3uc GREEN = {0, 255, 0};
const static Vec3uc PURPLE = {255, 0, 255};
const static Vec3uc RED = {255, 0, 0};
const static Vec3uc WHITE = {255, 255, 255};
const static Vec3uc YELLOW = {255, 255, 0};
} // namespace protocol
} // namespace blitz

View File

@@ -5,11 +5,21 @@
* \brief File containing the blitz::protocol::ConnexionInfoPacket class
*/
#include "blitz/protocol/Protocol.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
namespace blitz {
namespace protocol {
enum class ConnexionInfoFieldsE {
m_ConnectionID = 0,
};
using ConnexionInfoFields = std::tuple<
std::uint8_t //<- m_ConnectionID
>;
/**
* \class ConnexionInfoPacket
* \brief Packet for sending connection information.
@@ -22,36 +32,16 @@ namespace protocol {
* |--------------------|-------------------|-------------------------------|
* | m_ConnectionID | std::uint8_t | The connection ID |
*/
class ConnexionInfoPacket : public Packet {
private:
std::uint8_t m_ConnectionID;
public:
/**
* \brief Default constructor.
*/
ConnexionInfoPacket() {}
/**
* \brief Constructor.
* \param connectionID The ID of the connection.
*/
ConnexionInfoPacket(std::uint8_t connectionID) : m_ConnectionID(connectionID) {}
virtual ~ConnexionInfoPacket() {}
virtual DataBuffer Serialize(bool packetID = true) const;
virtual void Deserialize(DataBuffer& data);
virtual void Dispatch(PacketHandler* handler) const;
DeclarePacket(ConnexionInfo){
public:
PacketConstructor(ConnexionInfo)
/**
* \brief Get the connection ID.
* \return The connection ID.
*/
std::uint8_t GetConnectionID() const {
return m_ConnectionID;
}
virtual PacketType GetType() const {
return PacketType::ConnexionInfo;
return GetField<ConnexionInfoFieldsE, ConnexionInfoFieldsE::m_ConnectionID>();
}
};

View File

@@ -5,11 +5,21 @@
* \brief File containing the blitz::protocol::DisconnectPacket class
*/
#include "blitz/protocol/Protocol.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
namespace blitz {
namespace protocol {
enum class DisconnectFieldsE {
m_Reason = 0,
};
using DisconnectFields = std::tuple<
std::string //<- m_Reason
>;
/**
* \class DisconnectPacket
* \brief Packet for disconnecting from the server.
@@ -22,35 +32,16 @@ namespace protocol {
* |--------------------|-------------------|-------------------------------|
* | m_Reason | std::string | The reason for disconnection |
*/
class DisconnectPacket : public Packet {
private:
std::string m_Reason; // only when sent from server
public:
/**
* \brief Default constructor.
*/
DisconnectPacket() {}
/**
* \brief Constructor.
* \param reason The reason for disconnection.
*/
DisconnectPacket(std::string reason) : m_Reason(reason) {}
virtual ~DisconnectPacket() {}
virtual DataBuffer Serialize(bool packetID = true) const;
virtual void Deserialize(DataBuffer& data);
virtual void Dispatch(PacketHandler* handler) const;
DeclarePacket(Disconnect){
public:
PacketConstructor(Disconnect)
/**
* \brief Get the reason for disconnection.
* \return The reason for disconnection.
*/
const std::string& GetReason() const {
return m_Reason;
}
virtual PacketType GetType() const {
return PacketType::Disconnect;
return GetField<DisconnectFieldsE, DisconnectFieldsE::m_Reason>();
}
};

View File

@@ -5,12 +5,21 @@
* \brief File containing the blitz::protocol::KeepAlivePacket class
*/
#include "blitz/common/VarInt.h"
#include "blitz/protocol/Protocol.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
namespace blitz {
namespace protocol {
enum class KeepAliveFieldsE {
KeepAliveId = 0,
};
using KeepAliveFields = std::tuple<
sp::VarInt //<- KeepAliveId
>;
/**
* \class KeepAlivePacket
* \brief Packet sent to measure the health of a connexion. \n
@@ -25,31 +34,18 @@ namespace protocol {
* | Keep Alive ID | VarInt | The server generates a random ID, the client must respond with the same |
*
*/
class KeepAlivePacket : public Packet {
private:
VarInt m_AliveID;
public:
KeepAlivePacket() {}
KeepAlivePacket(std::uint64_t aliveID) : m_AliveID(aliveID) {}
virtual ~KeepAlivePacket() {}
virtual DataBuffer Serialize(bool packetID = true) const;
virtual void Deserialize(DataBuffer& data);
virtual void Dispatch(PacketHandler* handler) const;
DeclarePacket(KeepAlive){
public:
PacketConstructor(KeepAlive)
/**
* \brief Getter of the alive ID
* \return The alive ID
*/
std::uint64_t GetAliveID() const {
return m_AliveID.GetValue();
}
virtual PacketType GetType() const {
return PacketType::KeepAlive;
std::uint64_t GetAliveId() const {
return GetField<KeepAliveFieldsE, KeepAliveFieldsE::KeepAliveId>().GetValue();
}
};
} // namespace protocol
} // namespace blitz
} // namespace protocol
} // namespace blitz

View File

@@ -0,0 +1,50 @@
#pragma once
/**
* \file PlayerDeathPacket.h
* \brief File containing the blitz::protocol::PlayerDeathPacket class
*/
#include "blitz/common/Defines.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
namespace blitz {
namespace protocol {
enum class PlayerDeathFieldsE {
m_PlayerID = 0,
};
using PlayerDeathFields = std::tuple<
game::PlayerID //<- m_PlayerID
>;
/**
* \class PlayerDeathPacket
* \brief Packet for when a player leaves the game.
* %Packet structure :
* | PacketType |
* |------------------------|
* | PacketType::PlayerDeath|
*
* | Field Name | Field Type | Notes |
* |--------------------|-------------------|-------------------------------|
* | m_PlayerID | PlayerID |The ID of the player that died |
*/
DeclarePacket(PlayerDeath){
public:
PacketConstructor(PlayerDeath)
/**
* \brief Get the ID of the player that died.
* \return The ID of the player that died.
*/
game::PlayerID GetPlayerID() const {
return GetField<PlayerDeathFieldsE, PlayerDeathFieldsE::m_PlayerID>();
}
};
} // namespace protocol
} // namespace blitz

View File

@@ -6,11 +6,23 @@
*/
#include "blitz/common/Defines.h"
#include "blitz/protocol/Protocol.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
namespace blitz {
namespace protocol {
enum class PlayerJoinFieldsE {
m_PlayerID = 0,
m_PlayerName,
};
using PlayerJoinFields = std::tuple<
game::PlayerID, //<- m_PlayerID
std::string //<- m_PlayerName
>;
/**
* \class PlayerJoinPacket
* \brief Packet sent when a new player joins the game
@@ -25,26 +37,16 @@ namespace protocol {
* | Player Name | std::string | Name of the player who joined |
*
*/
class PlayerJoinPacket : public Packet {
private:
game::PlayerID m_PlayerID;
std::string m_PlayerName;
public:
PlayerJoinPacket() {}
PlayerJoinPacket(game::PlayerID playerID, const std::string& playerName) : m_PlayerID(playerID), m_PlayerName(playerName) {}
virtual ~PlayerJoinPacket() {}
virtual DataBuffer Serialize(bool packetID = true) const;
virtual void Deserialize(DataBuffer& data);
virtual void Dispatch(PacketHandler* handler) const;
DeclarePacket(PlayerJoin){
public:
PacketConstructor(PlayerJoin)
/**
* \brief Getter of the player id
* \return The ID of the player
*/
* \brief Get the ID of the player that died.
* \return The ID of the player that died.
*/
game::PlayerID GetPlayerID() const {
return m_PlayerID;
return GetField<PlayerJoinFieldsE, PlayerJoinFieldsE::m_PlayerID>();
}
/**
@@ -52,11 +54,7 @@ class PlayerJoinPacket : public Packet {
* \return The name of the player
*/
const std::string& GetPlayerName() const {
return m_PlayerName;
}
virtual PacketType GetType() const {
return PacketType::PlayerJoin;
return GetField<PlayerJoinFieldsE, PlayerJoinFieldsE::m_PlayerName>();
}
};

View File

@@ -6,11 +6,22 @@
*/
#include "blitz/common/Defines.h"
#include "blitz/protocol/Protocol.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
namespace blitz {
namespace protocol {
enum class PlayerLeaveFieldsE {
m_PlayerID = 0,
};
using PlayerLeaveFields = std::tuple<
game::PlayerID //<- m_PlayerID
>;
/**
* \class PlayerLeavePacket
* \brief Packet for when a player leaves the game.
@@ -23,36 +34,16 @@ namespace protocol {
* |--------------------|-------------------|-------------------------------|
* | m_PlayerID | PlayerID |The ID of the player that left |
*/
class PlayerLeavePacket : public Packet {
private:
game::PlayerID m_PlayerID;
public:
DeclarePacket(PlayerLeave){
public:
PacketConstructor(PlayerLeave)
/**
* \brief Default constructor.
*/
PlayerLeavePacket() {}
/**
* \brief Constructor.
* \param playerID The ID of the player that left.
*/
PlayerLeavePacket(game::PlayerID playerID) : m_PlayerID(playerID) {}
virtual ~PlayerLeavePacket() {}
virtual DataBuffer Serialize(bool packetID = true) const;
virtual void Deserialize(DataBuffer& data);
virtual void Dispatch(PacketHandler* handler) const;
/**
* \brief Get the ID of the player that left.
* \return The ID of the player that left.
*/
* \brief Get the ID of the player that left.
* \return The ID of the player that left.
*/
game::PlayerID GetPlayerID() const {
return m_PlayerID;
}
virtual PacketType GetType() const {
return PacketType::PlayerLeave;
return GetField<PlayerLeaveFieldsE, PlayerLeaveFieldsE::m_PlayerID>();
}
};

View File

@@ -7,7 +7,10 @@
#include <map>
#include "blitz/protocol/Protocol.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
#include <sp/protocol/MessagePrinter.h>
namespace blitz {
namespace protocol {
@@ -17,49 +20,38 @@ namespace protocol {
* \brief Represents information about a player.
*/
struct PlayerInfo {
std::string name;
std::string m_Name;
};
typedef std::map<std::uint8_t, PlayerInfo> PlayerList;
/**
* \class PlayerListPacket
* \brief Packet for sending the list of players.
* \todo PACKET STRUCTURE
*/
class PlayerListPacket : public Packet {
private:
PlayerList m_Players;
public:
/**
* \brief Default constructor.
*/
PlayerListPacket() {}
/**
* \brief Constructor.
* \param players The list of players.
*/
PlayerListPacket(const PlayerList& players) : m_Players(players) {}
virtual ~PlayerListPacket() {}
virtual DataBuffer Serialize(bool packetID = true) const;
virtual void Deserialize(DataBuffer& data);
virtual void Dispatch(PacketHandler* handler) const;
using PlayerMap = std::map<std::uint8_t, PlayerInfo>;
enum class PlayerListFieldsE {
m_PlayerList = 0,
};
using PlayerListFields = std::tuple<
PlayerMap //<- m_PlayerList
>;
DeclarePacket(PlayerList){
public:
PacketConstructor(PlayerList)
/**
* \brief Get the list of players.
* \return The list of players.
*/
const PlayerList& GetPlayers() const {
return m_Players;
}
virtual PacketType GetType() const {
return PacketType::PlayerList;
const PlayerMap& GetPlayers() const {
return GetField<PlayerListFieldsE, PlayerListFieldsE::m_PlayerList>();
}
};
} // namespace protocol
} // namespace blitz
namespace sp {
template <>
inline std::string PrintData(const blitz::protocol::PlayerInfo& a_Config) {
return "{m_Name=" + PrintData(a_Config.m_Name) + "}";
}
} // namespace sp

View File

@@ -5,11 +5,21 @@
* \brief File containing the blitz::protocol::PlayerLoginPacket class
*/
#include "blitz/protocol/Protocol.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
namespace blitz {
namespace protocol {
enum class PlayerLoginFieldsE {
m_PlayerName = 0,
};
using PlayerLoginFields = std::tuple<
std::string //<- m_PlayerName
>;
/**
* \class PlayerLoginPacket
* \brief Packet for when a player logs in.
@@ -22,36 +32,16 @@ namespace protocol {
* |--------------------|-------------------|----------------------------------|
* | Player Name | std::string | Name of the player that logged in|
*/
class PlayerLoginPacket : public Packet {
private:
std::string m_PlayerName;
public:
/**
* \brief Default constructor.
*/
PlayerLoginPacket() {}
/**
* \brief Constructor.
* \param playerName The name of the player that logged in.
*/
PlayerLoginPacket(std::string playerName) : m_PlayerName(playerName) {}
virtual ~PlayerLoginPacket() {}
virtual DataBuffer Serialize(bool packetID = true) const;
virtual void Deserialize(DataBuffer& data);
virtual void Dispatch(PacketHandler* handler) const;
DeclarePacket(PlayerLogin){
public:
PacketConstructor(PlayerLogin)
/**
* \brief Get the name of the player that logged in.
* \return The name of the player that logged in.
*/
const std::string& GetPlayerName() const {
return m_PlayerName;
}
virtual PacketType GetType() const {
return PacketType::PlayerLogin;
return GetField<PlayerLoginFieldsE, PlayerLoginFieldsE::m_PlayerName>();
}
};

View File

@@ -7,11 +7,27 @@
#include "blitz/common/Defines.h"
#include "blitz/maths/Vector.h"
#include "blitz/protocol/Protocol.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
namespace blitz {
namespace protocol {
enum class PlayerPositionAndRotationFieldsE {
m_PlayerID = 0,
m_Position,
m_Yaw,
m_Pitch,
};
using PlayerPositionAndRotationFields = std::tuple<
game::PlayerID, //<- m_PlayerID
Vec3f, //<- m_Position
float, //<- m_Yaw
float //<- m_Pitch
>;
/**
* \class PlayerPositionAndRotationPacket
* \brief Packet for sending a player's position and rotation.
@@ -27,38 +43,16 @@ namespace protocol {
* | Yaw | float | Yaw of the player |
* | Pitch | float | Pitch of the player |
*/
class PlayerPositionAndRotationPacket : public Packet {
private:
game::PlayerID m_Player; // only used when sent to client
Vec3f m_Position;
float m_Yaw, m_Pitch;
public:
/**
* \brief Default constructor.
*/
PlayerPositionAndRotationPacket() {}
/**
* \brief Constructor.
* \param position The position of the player.
* \param yaw The yaw of the player.
* \param pitch The pitch of the player.
* \param player The ID of the player.
*/
PlayerPositionAndRotationPacket(const Vec3f& position, float yaw, float pitch, game::PlayerID player = 0) :
m_Player(player), m_Position(position), m_Yaw(yaw), m_Pitch(pitch) {}
virtual ~PlayerPositionAndRotationPacket() {}
virtual DataBuffer Serialize(bool packetID = true) const;
virtual void Deserialize(DataBuffer& data);
virtual void Dispatch(PacketHandler* handler) const;
DeclarePacket(PlayerPositionAndRotation){
public:
PacketConstructor(PlayerPositionAndRotation)
/**
* \brief Get the position of the player.
* \return The position of the player.
*/
const Vec3f& GetPosition() const {
return m_Position;
return GetField<PlayerPositionAndRotationFieldsE, PlayerPositionAndRotationFieldsE::m_Position>();
}
/**
@@ -66,7 +60,7 @@ class PlayerPositionAndRotationPacket : public Packet {
* \return The yaw of the player.
*/
float GetYaw() const {
return m_Yaw;
return GetField<PlayerPositionAndRotationFieldsE, PlayerPositionAndRotationFieldsE::m_Yaw>();
}
/**
@@ -74,7 +68,7 @@ class PlayerPositionAndRotationPacket : public Packet {
* \return The pitch of the player.
*/
float GetPitch() const {
return m_Pitch;
return GetField<PlayerPositionAndRotationFieldsE, PlayerPositionAndRotationFieldsE::m_Pitch>();
}
/**
@@ -82,11 +76,7 @@ class PlayerPositionAndRotationPacket : public Packet {
* \return The ID of the player.
*/
game::PlayerID GetPlayer() const {
return m_Player;
}
virtual PacketType GetType() const {
return PacketType::PlayerPositionAndRotation;
return GetField<PlayerPositionAndRotationFieldsE, PlayerPositionAndRotationFieldsE::m_PlayerID>();
}
};

View File

@@ -6,11 +6,27 @@
*/
#include "blitz/game/Player.h"
#include "blitz/protocol/Protocol.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
namespace blitz {
namespace protocol {
enum class PlayerShootFieldsE {
m_PlayerID = 0,
m_Position,
m_Yaw,
m_Pitch,
};
using PlayerShootFields = std::tuple<
game::PlayerID, //<- m_PlayerID
Vec3f, //<- m_Position
float, //<- m_Yaw
float //<- m_Pitch
>;
/**
* \class PlayerShootPacket
* \brief Packet for when a player shoots.
@@ -26,38 +42,16 @@ namespace protocol {
* | Yaw | float | Yaw of the player |
* | Pitch | float | Pitch of the player |
*/
class PlayerShootPacket : public Packet {
private:
game::PlayerID m_Player; // only used when sent to client
Vec3f m_Position;
float m_Yaw, m_Pitch;
public:
/**
* \brief Default constructor.
*/
PlayerShootPacket() {}
/**
* \brief Constructor.
* \param position The position of the player.
* \param yaw The yaw of the player.
* \param pitch The pitch of the player.
* \param player The ID of the player.
*/
PlayerShootPacket(Vec3f position, float yaw, float pitch, game::PlayerID player = 0) :
m_Player(player), m_Position(position), m_Yaw(yaw), m_Pitch(pitch) {}
virtual ~PlayerShootPacket() {}
virtual DataBuffer Serialize(bool packetID = true) const;
virtual void Deserialize(DataBuffer& data);
virtual void Dispatch(PacketHandler* handler) const;
DeclarePacket(PlayerShoot){
public:
PacketConstructor(PlayerShoot)
/**
* \brief Get the position of the player.
* \return The position of the player.
*/
const Vec3f& GetPosition() const {
return m_Position;
return GetField<PlayerShootFieldsE, PlayerShootFieldsE::m_Position>();
}
/**
@@ -65,7 +59,7 @@ class PlayerShootPacket : public Packet {
* \return The yaw of the player.
*/
float GetYaw() const {
return m_Yaw;
return GetField<PlayerShootFieldsE, PlayerShootFieldsE::m_Yaw>();
}
/**
@@ -73,7 +67,7 @@ class PlayerShootPacket : public Packet {
* \return The pitch of the player.
*/
float GetPitch() const {
return m_Pitch;
return GetField<PlayerShootFieldsE, PlayerShootFieldsE::m_Pitch>();
}
/**
@@ -81,11 +75,7 @@ class PlayerShootPacket : public Packet {
* \return The ID of the player.
*/
game::PlayerID GetPlayer() const {
return m_Player;
}
virtual PacketType GetType() const {
return PacketType::PlayerShoot;
return GetField<PlayerShootFieldsE, PlayerShootFieldsE::m_PlayerID>();
}
};

View File

@@ -7,11 +7,23 @@
#include "blitz/common/Defines.h"
#include "blitz/game/Player.h"
#include "blitz/protocol/Protocol.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
namespace blitz {
namespace protocol {
enum class PlayerStatsFieldsE {
m_PlayerID = 0,
m_PlayerStats,
};
using PlayerStatsFields = std::tuple<
game::PlayerID, //<- m_PlayerID
game::PlayerStats //<- m_PlayerStats
>;
/**
* \class PlayerStatsPacket
* \brief Packet for sending player stats.
@@ -25,34 +37,16 @@ namespace protocol {
* | Player ID | PlayerID | Id of the player |
* | Player Stats | PlayerStats | Stats of the player |
*/
class PlayerStatsPacket : public Packet {
private:
game::PlayerID m_PlayerID;
game::PlayerStats m_PlayerStats;
public:
/**
* \brief Default constructor.
*/
PlayerStatsPacket() {}
/**
* \brief Constructor.
* \param playerID The ID of the player.
* \param stats The stats of the player.
*/
PlayerStatsPacket(game::PlayerID playerID, const game::PlayerStats& stats) : m_PlayerID(playerID), m_PlayerStats(stats) {}
virtual ~PlayerStatsPacket() {}
virtual DataBuffer Serialize(bool packetID = true) const;
virtual void Deserialize(DataBuffer& data);
virtual void Dispatch(PacketHandler* handler) const;
DeclarePacket(PlayerStats){
public:
PacketConstructor(PlayerStats)
/**
* \brief Getter of the player id
* \return The ID of the player
*/
game::PlayerID GetPlayerID() const {
return m_PlayerID;
return GetField<PlayerStatsFieldsE, PlayerStatsFieldsE::m_PlayerID>();
}
/**
@@ -60,11 +54,7 @@ class PlayerStatsPacket : public Packet {
* \return The stats of the player
*/
const game::PlayerStats& GetPlayerStats() const {
return m_PlayerStats;
}
virtual PacketType GetType() const {
return PacketType::PlayerStats;
return GetField<PlayerStatsFieldsE, PlayerStatsFieldsE::m_PlayerStats>();
}
};

View File

@@ -6,11 +6,21 @@
*/
#include "blitz/game/Game.h"
#include "blitz/protocol/Protocol.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
namespace blitz {
namespace protocol {
enum class ServerConfigFieldsE {
m_GameConfig = 0,
};
using ServerConfigFields = std::tuple<
game::GameConfig //<- m_GameConfig
>;
/**
* \class ServerConfigPacket
* \brief Packet for sending the server configuration.
@@ -23,36 +33,16 @@ namespace protocol {
* |--------------------|-------------------|-------------------------------|
* | Game Config | GameConfig | The game configuration |
*/
class ServerConfigPacket : public Packet {
private:
game::GameConfig m_GameConfig;
public:
/**
* \brief Default constructor.
*/
ServerConfigPacket() {}
/**
* \brief Constructor.
* \param GameConfig The game configuration.
*/
ServerConfigPacket(const game::GameConfig& GameConfig) : m_GameConfig(GameConfig) {}
virtual ~ServerConfigPacket() {}
virtual DataBuffer Serialize(bool packetID = true) const;
virtual void Deserialize(DataBuffer& data);
virtual void Dispatch(PacketHandler* handler) const;
DeclarePacket(ServerConfig){
public:
PacketConstructor(ServerConfig)
/**
* \brief Getter of the game configuration
* \return The game configuration
*/
game::GameConfig GetGameConfig() const {
return m_GameConfig;
}
virtual PacketType GetType() const {
return PacketType::ServerConfig;
return GetField<ServerConfigFieldsE, ServerConfigFieldsE::m_GameConfig>();
}
};

View File

@@ -5,11 +5,25 @@
* \brief File containing the blitz::protocol::ServerTpsPacket class
*/
#include "blitz/protocol/Protocol.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
namespace blitz {
namespace protocol {
enum class ServerTpsFieldsE {
m_TPS = 0,
m_MSPT,
m_PacketSendTime,
};
using ServerTpsFields = std::tuple<
float, //<- m_TPS
float, //<- m_MSPT
std::uint64_t //<- m_PacketSendTime
>;
/**
* \class ServerTpsPacket
* \brief Packet for sending server TPS (Tick per second) and MSPT (Milliseconds per tick).
@@ -24,35 +38,16 @@ namespace protocol {
* | Mspt | float | Server MSPT |
* | PacketSendTime | uint64_t | Time the packet was sent |
*/
class ServerTpsPacket : public Packet {
private:
float m_TPS;
float m_MSPT;
std::uint64_t m_PacketSendTime; // used to calculate ping
public:
/**
* \brief Default constructor.
*/
ServerTpsPacket() {}
/**
* \brief Constructor.
* \param tps The server TPS.
* \param mspt The server MSPT.
* \param sendTime The time the packet was sent.
*/
ServerTpsPacket(float tps, float mspt, std::uint64_t sendTime) : m_TPS(tps), m_MSPT(mspt), m_PacketSendTime(sendTime) {}
virtual ~ServerTpsPacket() {}
virtual DataBuffer Serialize(bool packetID = true) const;
virtual void Deserialize(DataBuffer& data);
virtual void Dispatch(PacketHandler* handler) const;
DeclarePacket(ServerTps){
public:
PacketConstructor(ServerTps)
/**
* \brief Get the server TPS.
* \return The server TPS.
*/
float GetTPS() const {
return m_TPS;
return GetField<ServerTpsFieldsE, ServerTpsFieldsE::m_TPS>();
}
/**
@@ -60,7 +55,7 @@ class ServerTpsPacket : public Packet {
* \return The server MSPT.
*/
float GetMSPT() const {
return m_MSPT;
return GetField<ServerTpsFieldsE, ServerTpsFieldsE::m_MSPT>();
}
/**
@@ -69,11 +64,7 @@ class ServerTpsPacket : public Packet {
* \todo Calculate ping.
*/
std::uint64_t GetPacketSendTime() const {
return m_PacketSendTime;
}
virtual PacketType GetType() const {
return PacketType::ServerTps;
return GetField<ServerTpsFieldsE, ServerTpsFieldsE::m_PacketSendTime>();
}
};

View File

@@ -6,11 +6,23 @@
*/
#include "blitz/game/Game.h"
#include "blitz/protocol/Protocol.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
namespace blitz {
namespace protocol {
enum class UpdateGameStateFieldsE {
m_GameState = 0,
m_TimeRemaining,
};
using UpdateGameStateFields = std::tuple<
game::GameState, //<- m_GameState
std::uint64_t //<- m_TimeRemaining
>;
/**
* \class UpdateGameStatePacket
* \brief Packet for updating the game state.
@@ -24,35 +36,16 @@ namespace protocol {
* | Game State | GameState | The new game state |
* | Time Remaining | std::uint64_t | The time remaining in the current game state |
*/
class UpdateGameStatePacket : public Packet {
private:
game::GameState m_GameState;
std::uint64_t m_TimeRemaining;
public:
/**
* \brief Default constructor.
*/
UpdateGameStatePacket() {}
/**
* \brief Constructor.
* \param a_GameState The new game state.
* \param a_TimeRemaining The time remaining in the current game state.
*/
UpdateGameStatePacket(game::GameState a_GameState, std::uint64_t a_TimeRemaining = 0) :
m_GameState(a_GameState), m_TimeRemaining(a_TimeRemaining) {}
virtual ~UpdateGameStatePacket() {}
virtual DataBuffer Serialize(bool packetID = true) const;
virtual void Deserialize(DataBuffer& data);
virtual void Dispatch(PacketHandler* handler) const;
DeclarePacket(UpdateGameState){
public:
PacketConstructor(UpdateGameState)
/**
* \brief Get the new game state.
* \return The new game state.
*/
game::GameState GetGameState() const {
return m_GameState;
return GetField<UpdateGameStateFieldsE, UpdateGameStateFieldsE::m_GameState>();
}
/**
@@ -60,11 +53,7 @@ class UpdateGameStatePacket : public Packet {
* \return The time remaining in the current game state.
*/
std::uint64_t GetTimeRemaining() const {
return m_TimeRemaining;
}
virtual PacketType GetType() const {
return PacketType::UpdateGameState;
return GetField<UpdateGameStateFieldsE, UpdateGameStateFieldsE::m_TimeRemaining>();
}
};

View File

@@ -5,11 +5,21 @@
* \brief File containing the blitz::protocol::UpdateHealthPacket class
*/
#include "blitz/protocol/Protocol.h"
#include <sp/default/DefaultPacket.h>
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
namespace blitz {
namespace protocol {
enum class UpdateHealthFieldsE {
m_NewHealth = 0,
};
using UpdateHealthFields = std::tuple<
float //<- m_NewHealth
>;
/**
* \class UpdateHealthPacket
* \brief Packet for updating the health of a player.
@@ -22,36 +32,16 @@ namespace protocol {
* |--------------------|-------------------|-------------------------------|
* | m_NewHealth | float | The new health value |
*/
class UpdateHealthPacket : public Packet {
private:
float m_NewHealth;
public:
DeclarePacket(UpdateHealth){
public:
PacketConstructor(UpdateHealth)
/**
* \brief Default constructor.
* \brief Get the ID of the player that left.
* \return The ID of the player that left.
*/
UpdateHealthPacket() {}
/**
* \brief Constructor.
* \param newHealth The new health value.
*/
UpdateHealthPacket(float newHealth) : m_NewHealth(newHealth) {}
virtual ~UpdateHealthPacket() {}
virtual DataBuffer Serialize(bool packetID = true) const;
virtual void Deserialize(DataBuffer& data);
virtual void Dispatch(PacketHandler* handler) const;
/**
* \brief Get the new health value.
* \return The new health value.
*/
float GetNewHealth() const {
return m_NewHealth;
}
virtual PacketType GetType() const {
return PacketType::UpdateHealth;
game::PlayerID GetNewHealth() const {
return GetField<UpdateHealthFieldsE, UpdateHealthFieldsE::m_NewHealth>();
}
};

View File

@@ -3,9 +3,8 @@
#include "blitz/common/Defines.h"
#include "blitz/misc/ObjectNotifier.h"
#include "blitz/misc/Time.h"
#include "blitz/protocol/packets/ChatPacket.h"
#include "client/Listeners.h"
#include "client/config/BlitzConfig.h"
#include "client/game/Listeners.h"
#include <cstdint>
#include <memory>
#include <string>
@@ -14,19 +13,17 @@ namespace blitz {
static const int PlayerUpdatePosRate = 50;
namespace client {
class ClientConnexion;
class ClientGame;
} // namespace client
namespace server {
class Server;
} // namespace server
namespace client {
class ClientConnexion;
class ClientGame;
// Singleton
class Client : public utils::ObjectNotifier<game::ClientListener>, public game::PlayerInputListener {
class Client : public utils::ObjectNotifier<client::ClientListener>, public client::PlayerInputListener {
private:
std::unique_ptr<server::Server> m_Server;
std::unique_ptr<client::ClientConnexion> m_Connexion;
@@ -78,4 +75,5 @@ class Client : public utils::ObjectNotifier<game::ClientListener>, public game::
void UpdatePosition(std::uint64_t delta);
};
} // namespace client
} // namespace blitz

View File

@@ -4,11 +4,10 @@
#include "blitz/network/Connexion.h"
namespace blitz {
namespace client {
class Client;
namespace client {
class ClientConnexion : public network::Connexion {
private:
Client* m_Client;
@@ -19,10 +18,10 @@ class ClientConnexion : public network::Connexion {
ClientConnexion(Client* client);
virtual ~ClientConnexion();
virtual void HandlePacket(const protocol::DisconnectPacket* packet) override;
virtual void HandlePacket(const protocol::KeepAlivePacket* packet) override;
virtual void HandlePacket(const protocol::ChatPacket* packet) override;
virtual void HandlePacket(const protocol::ConnexionInfoPacket* packet) override;
virtual void Handle(const protocol::DisconnectPacket& packet) override;
virtual void Handle(const protocol::KeepAlivePacket& packet) override;
virtual void Handle(const protocol::ChatPacket& packet) override;
virtual void Handle(const protocol::ConnexionInfoPacket& packet) override;
bool Connect(const std::string& pseudo, const std::string& address, std::uint16_t port);

View File

@@ -13,7 +13,7 @@ typedef std::vector<ColoredPart> ColoredText;
} // namespace protocol
namespace game {
namespace client {
class PlayerInputListener {
public:
@@ -25,7 +25,7 @@ class ClientListener {
public:
virtual void OnTextChatReceived(const protocol::ColoredText& text) {}
virtual void OnSpectatorChange(game::PlayerID player) {}
virtual void OnPlayerShoot(PlayerID player, const Vec3f& position, float yaw, float pitch) {}
virtual void OnPlayerShoot(game::PlayerID player, const Vec3f& position, float yaw, float pitch) {}
virtual void OnClientPlayerJoin() {}
virtual void OnGameConfigUpdate() {}
virtual void OnGameJoin() {}

View File

@@ -1,14 +1,14 @@
#pragma once
#include "blitz/common/DataBuffer.h"
#include "blitz/common/NonCopyable.h"
#include <sp/common/NonCopyable.h>
#include "blitz/maths/Vector.h"
#include "client/audio/AudioLoader.h"
namespace blitz {
namespace audio {
class AudioBuffer : private NonCopyable {
class AudioBuffer : private sp::NonCopyable {
private:
unsigned int m_ID;

View File

@@ -1,12 +1,12 @@
#pragma once
#include "blitz/common/NonCopyable.h"
#include <sp/common/NonCopyable.h>
#include "blitz/maths/Vector.h"
namespace blitz {
namespace audio {
class AudioListener : private NonCopyable {
class AudioListener : private sp::NonCopyable {
public:
AudioListener();
~AudioListener();

View File

@@ -1,14 +1,16 @@
#pragma once
#include "blitz/game/Listeners.h"
#include "client/Listeners.h"
#include "client/audio/AudioListener.h"
#include "client/audio/AudioSource.h"
#include "client/game/Listeners.h"
#include <map>
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace game {
class Player;
@@ -19,26 +21,31 @@ namespace audio {
struct PlayerSound {
AudioSourcePtr m_Laser;
AudioSourcePtr m_FootStep;
AudioSourcePtr m_Death;
};
class AudioManager : public game::ClientListener, public game::GameListener {
class AudioManager : public client::ClientListener, public game::GameListener {
private:
Client* m_Client;
client::Client* m_Client;
game::Player* m_Player;
AudioListener m_Listener;
AudioSourcePtr m_MenuMusic;
AudioSourcePtr m_EndMusic;
AudioBufferPtr m_DeathSound;
AudioBufferPtr m_LaserSound;
AudioBufferPtr m_FootStepSound;
std::map<game::PlayerID, PlayerSound> m_PlayerSources;
public:
AudioManager(Client* client);
AudioManager(client::Client* client);
~AudioManager();
virtual void OnGameJoin() override;
virtual void OnGameLeave() override;
virtual void OnGameStateUpdate(game::GameState gameState) override;
virtual void OnClientPlayerJoin() override;
virtual void OnPlayerDeath(game::PlayerID player) override;
virtual void OnPlayerShoot(game::PlayerID player, const Vec3f& position, float yaw, float pitch) override;
virtual void OnPlayerJoin(game::PlayerID player) override;
virtual void OnPlayerLeave(game::PlayerID player) override;

View File

@@ -1,6 +1,6 @@
#pragma once
#include "blitz/common/NonCopyable.h"
#include <sp/common/NonCopyable.h>
#include "blitz/maths/Vector.h"
#include "client/audio/AudioBuffer.h"
#include <memory>
@@ -10,7 +10,7 @@ namespace audio {
typedef std::shared_ptr<AudioBuffer> AudioBufferPtr;
class AudioSource : NonCopyable {
class AudioSource : sp::NonCopyable {
private:
unsigned int m_ID;
AudioBufferPtr m_Buffer;

View File

@@ -11,6 +11,8 @@
namespace blitz {
namespace input {
/**
* \enum KeyAction
* \brief Enum containing the key actions
@@ -24,7 +26,9 @@ enum KeyAction {
kaMax,
};
typedef std::array<int, kaMax> Keybinds;
} // namespace input
typedef std::array<int, input::kaMax> Keybinds;
/**
* \class BlitzConfig

View File

@@ -3,34 +3,36 @@
#include "blitz/game/Game.h"
#include "blitz/game/LeaderBoard.h"
#include "blitz/protocol/PacketHandler.h"
#include "blitz/protocol/PacketDispatcher.h"
#include <vector>
namespace blitz {
namespace client {
class Client;
namespace client {
class ClientGame : public game::Game, public protocol::PacketHandler {
private:
Client* m_Client;
game::LeaderBoard m_LeaderBoard;
protocol::PacketDispatcher& m_Dispatcher;
public:
ClientGame(Client* client, protocol::PacketDispatcher* dispatcher);
ClientGame(Client* client, protocol::PacketDispatcher& dispatcher);
virtual ~ClientGame();
void Tick(std::uint64_t delta) override;
virtual void HandlePacket(const protocol::PlayerJoinPacket* packet) override;
virtual void HandlePacket(const protocol::PlayerLeavePacket* packet) override;
virtual void HandlePacket(const protocol::PlayerListPacket* packet) override;
virtual void HandlePacket(const protocol::PlayerPositionAndRotationPacket* packet) override;
virtual void HandlePacket(const protocol::PlayerShootPacket* packet) override;
virtual void HandlePacket(const protocol::UpdateHealthPacket* packet) override;
virtual void HandlePacket(const protocol::PlayerStatsPacket* packet) override;
virtual void HandlePacket(const protocol::UpdateGameStatePacket* packet) override;
virtual void HandlePacket(const protocol::ServerConfigPacket* packet) override;
virtual void Handle(const protocol::PlayerDeathPacket& packet) override;
virtual void Handle(const protocol::PlayerJoinPacket& packet) override;
virtual void Handle(const protocol::PlayerLeavePacket& packet) override;
virtual void Handle(const protocol::PlayerListPacket& packet) override;
virtual void Handle(const protocol::PlayerPositionAndRotationPacket& packet) override;
virtual void Handle(const protocol::PlayerShootPacket& packet) override;
virtual void Handle(const protocol::UpdateHealthPacket& packet) override;
virtual void Handle(const protocol::PlayerStatsPacket& packet) override;
virtual void Handle(const protocol::UpdateGameStatePacket& packet) override;
virtual void Handle(const protocol::ServerConfigPacket& packet) override;
virtual void AddPlayer(game::PlayerID player, const std::string& name) override;
virtual void RemovePlayer(game::PlayerID player) override;
@@ -41,6 +43,10 @@ class ClientGame : public game::Game, public protocol::PacketHandler {
private:
void RegisterHandlers();
protocol::PacketDispatcher& GetDispatcher() {
return m_Dispatcher;
}
};
} // namespace client

View File

@@ -1,11 +1,13 @@
#pragma once
#include "GuiWidget.h"
#include "client/display/InputManager.h"
#include "client/input/InputManager.h"
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace gui {
@@ -14,7 +16,7 @@ class BlitzGui : public GuiWidget {
enum SubMenu { Main = 0 };
public:
BlitzGui(Client* client, input::InputManager& inputManager);
BlitzGui(client::Client* client, input::InputManager& inputManager);
virtual void Render() override;

View File

@@ -1,6 +1,6 @@
#pragma once
#include "blitz/protocol/packets/ChatPacket.h"
#include "blitz/protocol/Color.h"
#include <string>
namespace blitz {

View File

@@ -1,11 +1,13 @@
#pragma once
#include "GuiWidget.h"
#include "client/display/InputManager.h"
#include "client/input/InputManager.h"
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace gui {
@@ -14,7 +16,7 @@ class CreateGameMenu : public GuiWidget {
input::InputManager& m_InputManager;
public:
CreateGameMenu(GuiWidget* parent, Client* client, input::InputManager& inputManager);
CreateGameMenu(GuiWidget* parent, client::Client* client, input::InputManager& inputManager);
virtual void Render() override;
};

View File

@@ -3,6 +3,11 @@
#include "GuiWidget.h"
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace gui {
class CrossHair : public GuiWidget {
@@ -10,7 +15,7 @@ class CrossHair : public GuiWidget {
std::uint64_t m_CrossHairTexture;
public:
CrossHair(Client* client);
CrossHair(client::Client* client);
virtual void Render() override;
};

View File

@@ -4,13 +4,15 @@
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace gui {
class FPSMenu : public GuiWidget {
public:
FPSMenu(GuiWidget* parent, Client* client) : GuiWidget(parent, client) {}
FPSMenu(GuiWidget* parent, client::Client* client) : GuiWidget(parent, client) {}
virtual void Render() override;
};

View File

@@ -2,15 +2,19 @@
#include "GuiWidget.h"
#include "client/Client.h"
#include "client/display/InputManager.h"
#include "client/input/InputManager.h"
#include <string>
#include <vector>
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace gui {
class GameChatGui : public GuiWidget, game::ClientListener {
class GameChatGui : public GuiWidget, client::ClientListener {
private:
char InputBuf[256];
std::vector<protocol::ColoredText> m_Lines;
@@ -27,7 +31,7 @@ class GameChatGui : public GuiWidget, game::ClientListener {
void DrawMini(const char* title, bool* p_open);
public:
GameChatGui(GuiWidget* parent, Client* client, input::InputManager& inputManager);
GameChatGui(GuiWidget* parent, client::Client* client, input::InputManager& inputManager);
virtual ~GameChatGui();
virtual void OnTextChatReceived(const protocol::ColoredText& text) override;

View File

@@ -7,19 +7,21 @@
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace gui {
class GuiWidget {
protected:
bool m_Enabled;
Client* m_Client;
client::Client* m_Client;
GuiWidget* m_Parent;
std::vector<std::unique_ptr<GuiWidget>> m_SubWidgets;
public:
GuiWidget(GuiWidget* parent, Client* client) : m_Enabled(false), m_Client(client), m_Parent(parent) {}
GuiWidget(GuiWidget* parent, client::Client* client) : m_Enabled(false), m_Client(client), m_Parent(parent) {}
virtual ~GuiWidget() {}
void Enable() {

View File

@@ -5,23 +5,30 @@
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace game {
class Player;
} // namespace game
namespace gui {
class Hud : public GuiWidget {
class Hud : public GuiWidget, public game::GameListener, public client::ClientListener {
private:
std::uint64_t m_GunTexture;
std::uint64_t m_JPTexture;
utils::DelayTimer<float> m_Timer{5.0f};
public:
Hud(GuiWidget* parent, Client* client);
Hud(GuiWidget* parent, client::Client* client);
virtual ~Hud();
virtual void Render() override;
virtual void OnGameStateUpdate(game::GameState gameState) override;
virtual void OnGameJoin() override;
virtual void OnGameLeave() override;
private:
std::string FormatString();
void Draw(const char* title, bool* p_open);

View File

@@ -1,11 +1,13 @@
#pragma once
#include "GuiWidget.h"
#include "client/display/InputManager.h"
#include "client/input/InputManager.h"
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace gui {
@@ -14,7 +16,7 @@ class JoinGameMenu : public GuiWidget {
input::InputManager& m_InputManager;
public:
JoinGameMenu(GuiWidget* parent, Client* client, input::InputManager& inputManager);
JoinGameMenu(GuiWidget* parent, client::Client* client, input::InputManager& inputManager);
virtual void Render() override;
};

View File

@@ -5,16 +5,24 @@
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace gui {
class LeaderBoardGui : public GuiWidget {
class LeaderBoardGui : public GuiWidget, public game::GameListener, public client::ClientListener {
private:
void Draw(const char* title, bool* p_open);
utils::DelayTimer<float> m_Timer{5.0f};
public:
LeaderBoardGui(GuiWidget* parent, Client* client);
LeaderBoardGui(GuiWidget* parent, client::Client* client);
~LeaderBoardGui();
virtual void OnGameStateUpdate(game::GameState gameState) override;
virtual void OnGameJoin() override;
virtual void OnGameLeave() override;
virtual void Render() override;
};

View File

@@ -1,11 +1,13 @@
#pragma once
#include "GuiWidget.h"
#include "client/game/Listeners.h"
#include "client/Listeners.h"
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace input {
class InputManager;
@@ -13,14 +15,14 @@ class InputManager;
namespace gui {
class MainMenu : public GuiWidget, public game::ClientListener {
class MainMenu : public GuiWidget, public client::ClientListener {
private:
enum SubMenu { CREATE_MENU = 0, JOIN_MENU, OPTION_MENU };
input::InputManager& m_InputManager;
public:
MainMenu(Client* client, input::InputManager& inputManager);
MainMenu(client::Client* client, input::InputManager& inputManager);
virtual ~MainMenu();
virtual void OnGameLeave() override;

View File

@@ -3,13 +3,15 @@
#include "GuiWidget.h"
#include "blitz/misc/Time.h"
#include "client/config/BlitzConfig.h"
#include "client/display/InputManager.h"
#include "client/input/InputManager.h"
#include <array>
#include <string>
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace gui {
@@ -20,11 +22,11 @@ class OptionsMenu : public GuiWidget, public input::InputListener {
bool m_IsKeyPopupOpen;
bool m_KeyPopupShouldClose;
utils::Timer m_Timer{100};
KeyAction m_CurrentAction;
input::KeyAction m_CurrentAction;
input::InputManager& m_InputManager;
public:
OptionsMenu(GuiWidget* parent, Client* client, input::InputManager& inputManager);
OptionsMenu(GuiWidget* parent, client::Client* client, input::InputManager& inputManager);
virtual ~OptionsMenu();
virtual void Render() override;
@@ -32,7 +34,7 @@ class OptionsMenu : public GuiWidget, public input::InputListener {
virtual void OnKeyDown(int key) override;
private:
std::string GetKeyActionCodeName(KeyAction);
std::string GetKeyActionCodeName(input::KeyAction);
void HotkeyBindingButton();
void HotkeyBindingPopUp();
};

View File

@@ -1,9 +1,14 @@
#pragma once
#include "GuiWidget.h"
#include "client/display/InputManager.h"
#include "client/input/InputManager.h"
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace gui {
class ServerGui : public GuiWidget {
@@ -11,7 +16,7 @@ class ServerGui : public GuiWidget {
input::InputManager& m_InputManager;
public:
ServerGui(GuiWidget* parent, Client* client, input::InputManager& inputManager);
ServerGui(GuiWidget* parent, client::Client* client, input::InputManager& inputManager);
virtual void Render() override;
};

View File

@@ -5,8 +5,8 @@
* \brief File containing the blitz::Display class
*/
#include "client/display/InputManager.h"
#include "client/display/PlayerController.h"
#include "client/input/InputManager.h"
#include "client/input/PlayerController.h"
#include <memory>
#include <string>
@@ -14,12 +14,16 @@ class SDL_Window;
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace gui {
class BlitzGui;
} // namespace gui
namespace input {
/**
* \class Display
* \brief Class used to manage the display
@@ -37,7 +41,7 @@ class Display {
bool m_ShouldClose;
bool m_FullScreen;
Client* m_Client;
client::Client* m_Client;
input::InputManager& m_InputManager;
std::unique_ptr<gui::BlitzGui> m_BlitzGui;
input::PlayerController m_PlayerController;
@@ -51,7 +55,7 @@ class Display {
* \param client The client
* \param inputManager The InputManager
*/
Display(int width, int height, const std::string& windowName, Client* client, input::InputManager& inputManager);
Display(int width, int height, const std::string& windowName, client::Client* client, input::InputManager& inputManager);
~Display();
/**
@@ -112,4 +116,5 @@ class Display {
void InitImGui();
};
} // namespace input
} // namespace blitz

View File

@@ -5,15 +5,17 @@
* \brief File containing the blitz::input::PlayerController class.
*/
#include "blitz/common/Smoothing.h"
#include "blitz/maths/Smoothing.h"
#include "blitz/misc/ObjectNotifier.h"
#include "blitz/misc/Time.h"
#include "client/display/InputManager.h"
#include "client/game/Listeners.h"
#include "client/input/InputManager.h"
#include "client/Listeners.h"
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace game {
@@ -28,14 +30,14 @@ namespace input {
* \details This class is responsible for handling player input and sending it to the server.
* It also handles the player's velocity and position.
*/
class PlayerController : public utils::ObjectNotifier<game::PlayerInputListener>, game::ClientListener, InputListener {
class PlayerController : public utils::ObjectNotifier<client::PlayerInputListener>, client::ClientListener, InputListener {
private:
game::Player* m_Player;
Client* m_Client;
client::Client* m_Client;
input::InputManager& m_InputManager;
utils::CooldownTimer<float> m_ShootTimer{1.0f};
EMASmoother m_DxSmoother;
EMASmoother m_DySmoother;
maths::EMASmoother m_DxSmoother;
maths::EMASmoother m_DySmoother;
// current (target) velocity
Vec3f m_Velocity;
/// maximum x-axis velocity
@@ -47,7 +49,7 @@ class PlayerController : public utils::ObjectNotifier<game::PlayerInputListener>
/**
* \brief Default constructor
*/
PlayerController(Client* client, input::InputManager& inputManager);
PlayerController(client::Client* client, input::InputManager& inputManager);
virtual ~PlayerController();
/**

View File

@@ -1,7 +1,6 @@
#pragma once
#include "client/Client.h"
#include "client/display/PlayerController.h"
#include "client/input/PlayerController.h"
#include "client/render/BulletRenderer.h"
#include "client/render/Camera.h"
#include "client/render/loader/GLLoader.h"
@@ -9,6 +8,10 @@
namespace blitz {
namespace client {
class Client;
} // namespace client
namespace shader {
class EntityShader;
@@ -20,9 +23,9 @@ class GunShader;
namespace render {
class MainRenderer : public game::ClientListener, public game::PlayerInputListener {
class MainRenderer : public client::ClientListener, public client::PlayerInputListener {
private:
Client* m_Client;
client::Client* m_Client;
ModelLoader::Model m_PlayerModel;
ModelLoader::Model m_WorldModel;
ModelLoader::Model m_GunModel;
@@ -36,7 +39,7 @@ class MainRenderer : public game::ClientListener, public game::PlayerInputListen
input::PlayerController& m_PlayerController;
public:
MainRenderer(Client* client, input::PlayerController& playerController);
MainRenderer(client::Client* client, input::PlayerController& playerController);
~MainRenderer();
virtual void OnSpectatorChange(game::PlayerID player) override;

View File

@@ -1,6 +1,6 @@
#pragma once
#include "blitz/common/NonCopyable.h"
#include <sp/common/NonCopyable.h>
#include <vector>
@@ -13,7 +13,7 @@ struct VertexAttribPointer {
unsigned int m_Offset;
};
class ElementBuffer : private NonCopyable {
class ElementBuffer : private sp::NonCopyable {
private:
unsigned int m_ID = 0;
std::size_t m_TriangleCount;
@@ -35,7 +35,7 @@ class ElementBuffer : private NonCopyable {
}
};
class VertexBuffer : private NonCopyable {
class VertexBuffer : private sp::NonCopyable {
private:
unsigned int m_ID = 0, m_DataStride;
std::vector<VertexAttribPointer> m_VertexAttribs;
@@ -56,7 +56,7 @@ class VertexBuffer : private NonCopyable {
void BindVertexAttribs() const;
};
class VertexArray : private NonCopyable {
class VertexArray : private sp::NonCopyable {
private:
unsigned int m_ID = 0;
ElementBuffer m_ElementBuffer;

View File

@@ -35,7 +35,7 @@ typedef std::map<std::uint8_t, std::unique_ptr<ServerConnexion>> ConnexionMap;
*/
class Server {
private:
network::TCPListener m_Listener;
std::unique_ptr<network::TCPListener> m_Listener;
ConnexionMap m_Connections;
utils::TickCounter m_TickCounter;
@@ -91,7 +91,7 @@ class Server {
* \brief Broadcast a packet to all connexions
* \param packet The packet
*/
void BroadcastPacket(const protocol::Packet* packet);
void BroadcastPacket(const protocol::Packet& packet);
/**
* \brief Broadcast a chat message
* \param msg The message

View File

@@ -52,7 +52,7 @@ class ServerConnexion : public network::Connexion {
* \param socket The socket
* \param id The ID of the connexion
*/
ServerConnexion(Server* server, network::TCPSocket& socket, std::uint8_t id);
ServerConnexion(Server* server, std::unique_ptr<network::TCPSocket>&& socket, std::uint8_t id);
/**
* \brief Move constructor
*/
@@ -72,14 +72,14 @@ class ServerConnexion : public network::Connexion {
return m_ID;
}
virtual void HandlePacket(const protocol::PlayerLoginPacket* packet) override;
virtual void HandlePacket(const protocol::KeepAlivePacket* packet) override;
virtual void HandlePacket(const protocol::DisconnectPacket* packet) override;
virtual void HandlePacket(const protocol::ChatPacket* packet) override;
virtual void HandlePacket(const protocol::PlayerPositionAndRotationPacket* packet) override;
virtual void HandlePacket(const protocol::PlayerShootPacket* packet) override;
virtual void Handle(const protocol::PlayerLoginPacket& packet) override;
virtual void Handle(const protocol::KeepAlivePacket& packet) override;
virtual void Handle(const protocol::DisconnectPacket& packet) override;
virtual void Handle(const protocol::ChatPacket& packet) override;
virtual void Handle(const protocol::PlayerPositionAndRotationPacket& packet) override;
virtual void Handle(const protocol::PlayerShootPacket& packet) override;
virtual bool UpdateSocket() override;
virtual bool UpdateSocket() override;
private:
void RegisterHandlers();

View File

@@ -1,15 +1,15 @@
#include "blitz/network/Network.h"
#include "client/Client.h"
#include "client/audio/AudioManager.h"
#include "client/display/Display.h"
#include "client/display/InputManager.h"
#include "client/input/Display.h"
#include "client/input/InputManager.h"
#include "client/render/MainRenderer.h"
int main(int argc, char** argv) {
blitz::Client client;
blitz::client::Client client;
blitz::input::InputManager inputManager;
blitz::Display display(1920, 1080, "BlitzKrieg", &client, inputManager);
blitz::input::Display display(1920, 1080, "Blitz", &client, inputManager);
if (!display.Create())
return EXIT_FAILURE;

View File

@@ -1,100 +0,0 @@
#include "blitz/common/DataBuffer.h"
#include <fstream>
#include <iomanip>
#include <sstream>
#include "blitz/misc/Format.h"
#include "blitz/misc/Log.h"
namespace blitz {
DataBuffer::DataBuffer() : m_ReadOffset(0) {}
DataBuffer::DataBuffer(const DataBuffer& other) : m_Buffer(other.m_Buffer), m_ReadOffset(other.m_ReadOffset) {}
DataBuffer::DataBuffer(DataBuffer&& other) : m_Buffer(std::move(other.m_Buffer)), m_ReadOffset(std::move(other.m_ReadOffset)) {}
DataBuffer::DataBuffer(const std::string& str) : m_Buffer(str.begin(), str.end()), m_ReadOffset(0) {}
DataBuffer::DataBuffer(const DataBuffer& other, Data::difference_type offset) : m_ReadOffset(0) {
m_Buffer.reserve(other.GetSize() - static_cast<std::size_t>(offset));
std::copy(other.m_Buffer.begin() + offset, other.m_Buffer.end(), std::back_inserter(m_Buffer));
}
DataBuffer& DataBuffer::operator=(const DataBuffer& other) {
m_Buffer = other.m_Buffer;
m_ReadOffset = other.m_ReadOffset;
return *this;
}
DataBuffer& DataBuffer::operator=(DataBuffer&& other) {
m_Buffer = std::move(other.m_Buffer);
m_ReadOffset = std::move(other.m_ReadOffset);
return *this;
}
void DataBuffer::SetReadOffset(std::size_t pos) {
assert(pos <= GetSize());
m_ReadOffset = pos;
}
std::size_t DataBuffer::GetSize() const {
return m_Buffer.size();
}
std::size_t DataBuffer::GetRemaining() const {
return m_Buffer.size() - m_ReadOffset;
}
DataBuffer::iterator DataBuffer::begin() {
return m_Buffer.begin();
}
DataBuffer::iterator DataBuffer::end() {
return m_Buffer.end();
}
DataBuffer::const_iterator DataBuffer::begin() const {
return m_Buffer.begin();
}
DataBuffer::const_iterator DataBuffer::end() const {
return m_Buffer.end();
}
std::ostream& operator<<(std::ostream& os, const DataBuffer& buffer) {
for (unsigned char u : buffer)
os << std::hex << std::setfill('0') << std::setw(2) << static_cast<int>(u) << " ";
os << std::dec;
return os;
}
bool DataBuffer::ReadFile(const std::string& fileName) {
try {
std::ifstream file(fileName, std::istream::binary);
std::ostringstream ss;
ss << file.rdbuf();
const std::string& s = ss.str();
m_Buffer = DataBuffer::Data(s.begin(), s.end());
m_ReadOffset = 0;
} catch (std::exception& e) {
utils::LOGE(utils::Format("[IO] Failed to read file %s ! reason : %s", fileName.c_str(), e.what()));
return false;
}
return m_Buffer.size() > 0;
}
bool DataBuffer::WriteFile(const std::string& fileName) const {
try {
std::ofstream file(fileName, std::ostream::binary);
file.write(reinterpret_cast<const char*>(m_Buffer.data()), static_cast<std::streamsize>(m_Buffer.size()));
file.flush();
} catch (std::exception& e) {
utils::LOGE(utils::Format("[IO] Failed to read file %s ! reason : %s", fileName.c_str(), e.what()));
return false;
}
return true;
}
} // namespace blitz

View File

@@ -1,52 +0,0 @@
#include "blitz/common/VarInt.h"
#include "blitz/common/DataBuffer.h"
#include <stdexcept>
namespace blitz {
static constexpr int SEGMENT_BITS = 0x7F;
static constexpr int CONTINUE_BIT = 0x80;
std::size_t VarInt::GetSerializedLength() const {
DataBuffer buffer;
buffer << *this;
return buffer.GetSize();
}
DataBuffer& operator<<(DataBuffer& out, const VarInt& var) {
std::uint64_t value = var.m_Value;
while (true) {
if ((value & ~static_cast<std::uint64_t>(SEGMENT_BITS)) == 0) {
out << static_cast<std::uint8_t>(value);
return out;
}
out << static_cast<std::uint8_t>((value & SEGMENT_BITS) | CONTINUE_BIT);
value >>= 7;
}
}
DataBuffer& operator>>(DataBuffer& in, VarInt& var) {
var.m_Value = 0;
unsigned int position = 0;
std::uint8_t currentByte;
while (true) {
in.ReadSome(&currentByte, 1);
var.m_Value |= static_cast<std::uint64_t>(currentByte & SEGMENT_BITS) << position;
if ((currentByte & CONTINUE_BIT) == 0)
break;
position += 7;
if (position >= 8 * sizeof(var.m_Value))
throw std::runtime_error("VarInt is too big");
}
return in;
}
} // namespace blitz

View File

@@ -1,8 +1,9 @@
#include "blitz/common/Smoothing.h"
#include "blitz/maths/Smoothing.h"
#include <cassert>
#include <cmath>
namespace blitz {
namespace maths {
EMASmoother::EMASmoother() : Alpha(1.0f), Current(0.0f) {}
@@ -27,4 +28,5 @@ void EMASmoother::SetSmoothingTime(float t) {
SetAlpha(std::pow(1.0f - 0.999f, 1.0f / t));
};
} // namespace maths
} // namespace blitz

View File

@@ -1,6 +1,6 @@
#include "blitz/misc/Compression.h"
#include "blitz/common/VarInt.h"
#include <sp/common/VarInt.h>
#include <cassert>
#include <zlib.h>
@@ -37,7 +37,7 @@ DataBuffer Compress(const DataBuffer& buffer) {
if (buffer.GetSize() < COMPRESSION_THRESHOLD) {
// Don't compress since it's a small packet
VarInt compressedDataLength = 0;
sp::VarInt compressedDataLength = 0;
std::uint64_t packetLength = compressedDataLength.GetSerializedLength() + buffer.GetSize();
packet << packetLength;
@@ -48,7 +48,7 @@ DataBuffer Compress(const DataBuffer& buffer) {
DataBuffer compressedData = Deflate(buffer.data(), buffer.GetSize());
VarInt uncompressedDataLength = buffer.GetSize();
sp::VarInt uncompressedDataLength = buffer.GetSize();
std::uint64_t packetLength = uncompressedDataLength.GetSerializedLength() + compressedData.GetSize();
packet << packetLength;
@@ -58,7 +58,7 @@ DataBuffer Compress(const DataBuffer& buffer) {
}
DataBuffer Decompress(DataBuffer& buffer, std::uint64_t packetLength) {
VarInt uncompressedLength;
sp::VarInt uncompressedLength;
buffer >> uncompressedLength;
std::uint64_t compressedLength = packetLength - uncompressedLength.GetSerializedLength();

View File

@@ -1,67 +1,48 @@
#include "blitz/misc/Compression.h"
#include "blitz/misc/Format.h"
#include "blitz/misc/Log.h"
#include "blitz/misc/Time.h"
#include "blitz/network/Connexion.h"
#include "blitz/protocol/PacketDispatcher.h"
#include "blitz/protocol/PacketFactory.h"
#include "blitz/misc/Log.h"
namespace blitz {
namespace network {
Connexion::Connexion(Connexion&& move) : protocol::PacketHandler(&m_Dispatcher), m_Socket(std::move(move.m_Socket)) {}
Connexion::Connexion(TCPSocket&& socket) : TCPStream(std::move(socket), {}) {}
Connexion::Connexion(protocol::PacketDispatcher* dispatcher) : protocol::PacketHandler(dispatcher) {}
Connexion::Connexion(protocol::PacketDispatcher* dispatcher, TCPSocket& socket) :
protocol::PacketHandler(dispatcher), m_Socket(std::move(socket)) {}
bool Connexion::UpdateSocket() {
if (m_Socket.GetStatus() != TCPSocket::Status::Connected)
return false;
while (true) {
DataBuffer buffer;
m_Socket.Receive(buffer, sizeof(std::uint64_t));
if (buffer.GetSize() == 0)
break;
std::uint64_t packetBufferLenght;
buffer >> packetBufferLenght;
m_Socket.Receive(buffer, packetBufferLenght);
DataBuffer decompressed = utils::Decompress(buffer, packetBufferLenght);
protocol::PacketType packetType;
decompressed >> packetType;
const protocol::PacketPtr packet = protocol::PacketFactory::CreatePacket(packetType, decompressed);
GetDispatcher()->Dispatch(packet.get());
}
return true;
}
bool Connexion::Connect(const std::string& address, std::uint16_t port) {
if (!m_Socket.Connect(address, port)) {
return false;
}
m_Socket.SetBlocking(false);
return true;
}
void Connexion::SendPacket(const protocol::Packet* packet) {
network::SendPacket(packet->Serialize(), m_Socket);
// utils::LOGD(utils::Format("Sent packet id %i", packet->GetID()));
}
Connexion::Connexion(Connexion&& move) : TCPStream(std::move(move)) {}
void Connexion::CloseConnection() {
m_Socket.Disconnect();
m_Interface.Disconnect();
}
Connexion::~Connexion() {}
void Connexion::SendPacket(const protocol::Packet& packet) {
SendMessage(packet);
}
bool Connexion::UpdateSocket() {
if (GetSocketStatus() != sp::io::TcpSocket::Status::Connected)
return false;
try {
RecieveMessages();
} catch (sp::io::SocketError& e) {
utils::LOGE(e.what());
return false;
}
return true;
}
/**
* \brief Tries to connect the socket at the specified address and port
* \return Whether this action was succesfull
*/
bool Connexion::Connect(const std::string& address, std::uint16_t port) {
try {
TCPSocket socket(address, port);
m_Interface = std::move(socket);
m_Interface.SetBlocking(false);
} catch(sp::io::SocketError& e) {
return false;
}
return true;
}
} // namespace network
} // namespace blitz

View File

@@ -1,81 +0,0 @@
#include "blitz/network/TCPListener.h"
#include "blitz/misc/Log.h"
#ifndef _WIN32
#define closesocket close
#define SD_BOTH SHUT_RDWR
#define ioctlsocket ioctl
#endif
namespace blitz {
namespace network {
TCPListener::TCPListener() : m_Handle(static_cast<blitz::network::SocketHandle>(INVALID_SOCKET)), m_Port(0), m_MaxConnections(0) {}
TCPListener::~TCPListener() {
Destroy();
}
bool TCPListener::Listen(std::uint16_t port, int maxConnections) {
if ((m_Handle = static_cast<SocketHandle>(socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))) < 0) {
utils::LOGE("[TCPListener] Failed to create server socket !");
return false;
}
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(port);
if (bind(m_Handle, reinterpret_cast<sockaddr*>(&address), sizeof(address)) < 0)
return false;
if (listen(m_Handle, maxConnections) < 0)
return false;
socklen_t len = sizeof(address);
if (getsockname(m_Handle, reinterpret_cast<sockaddr*>(&address), &len) < 0)
return false;
m_Port = ntohs(address.sin_port);
m_MaxConnections = maxConnections;
return true;
}
bool TCPListener::Accept(TCPSocket& newSocket) {
int addrlen = sizeof(newSocket.m_RemoteAddr);
newSocket.m_Handle = static_cast<SocketHandle>(
accept(m_Handle, reinterpret_cast<sockaddr*>(&newSocket.m_RemoteAddr), reinterpret_cast<socklen_t*>(&addrlen)));
if (newSocket.m_Handle < 0)
return false;
newSocket.SetStatus(TCPSocket::Status::Connected);
newSocket.SetBlocking(false);
return true;
}
void TCPListener::Destroy() {
if (m_Handle > 0)
closesocket(m_Handle);
}
bool TCPListener::Close() {
if (shutdown(m_Handle, SD_BOTH) == 0)
return true;
return false;
}
bool TCPListener::SetBlocking(bool blocking) {
unsigned long mode = !blocking;
if (ioctlsocket(m_Handle, FIONBIO, &mode) < 0)
return false;
return true;
}
} // namespace network
} // namespace blitz

View File

@@ -1,174 +0,0 @@
#include "blitz/network/TCPSocket.h"
#include "blitz/misc/Compression.h"
#include "blitz/misc/Log.h"
#include "blitz/network/Network.h"
#ifdef _WIN32
#define ioctl ioctlsocket
#define WOULDBLOCK WSAEWOULDBLOCK
#define MSG_DONTWAIT 0
#else
#define WOULDBLOCK EWOULDBLOCK
#endif
namespace blitz {
namespace network {
TCPSocket::TCPSocket() :
m_Blocking(false), m_Status(Status::Disconnected), m_Handle(static_cast<SocketHandle>(INVALID_SOCKET)), m_Port(0) {}
TCPSocket::TCPSocket(TCPSocket&& other) {
m_Handle = other.m_Handle;
m_Port = other.m_Port;
m_RemoteAddr = other.m_RemoteAddr;
SetStatus(other.GetStatus());
SetBlocking(other.IsBlocking());
other.m_Handle = static_cast<SocketHandle>(INVALID_SOCKET);
}
TCPSocket::~TCPSocket() {
Disconnect();
}
bool TCPSocket::SetBlocking(bool block) {
unsigned long mode = !block;
if (ioctl(m_Handle, FIONBIO, &mode) < 0) {
return false;
}
m_Blocking = block;
return true;
}
bool TCPSocket::IsBlocking() const {
return m_Blocking;
}
void TCPSocket::SetStatus(TCPSocket::Status status) {
m_Status = status;
}
TCPSocket::Status TCPSocket::GetStatus() const {
return m_Status;
}
std::size_t TCPSocket::Send(DataBuffer& buffer) {
return Send(buffer.data(), buffer.GetSize());
}
void TCPSocket::Disconnect() {
if (m_Handle > 0)
closesocket(m_Handle);
m_Status = Status::Disconnected;
}
bool TCPSocket::Connect(const std::string& host, unsigned short port) {
if (GetStatus() == Status::Connected)
return true;
struct addrinfo hints {};
struct addrinfo* result = nullptr;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
if (getaddrinfo(host.c_str(), std::to_string(static_cast<int>(port)).c_str(), &hints, &result) != 0) {
utils::LOGE("[TCPSocket] Failed to get address info !");
return false;
}
m_Handle = static_cast<SocketHandle>(socket(AF_INET, SOCK_STREAM, IPPROTO_TCP));
if (m_Handle < 0) {
utils::LOGE("[TCPSocket] Failed to create socket !");
return false;
}
struct addrinfo* ptr = nullptr;
for (ptr = result; ptr != nullptr; ptr = ptr->ai_next) {
struct sockaddr* sockaddr = ptr->ai_addr;
if (connect(m_Handle, sockaddr, sizeof(sockaddr_in)) != 0) {
utils::LOGE("[TCPSocket] Failed to connect with this address !");
continue;
}
m_RemoteAddr = *sockaddr;
break;
}
freeaddrinfo(result);
if (!ptr) {
utils::LOGE("[TCPSocket] Could not find a suitable interface for connecting !");
return false;
}
SetStatus(Status::Connected);
m_Port = port;
return true;
}
size_t TCPSocket::Send(const unsigned char* data, size_t size) {
if (GetStatus() != Status::Connected)
return 0;
std::size_t sent = 0;
while (sent < size) {
int cur = send(m_Handle, reinterpret_cast<const char*>(data + sent), static_cast<int>(size - sent), 0);
if (cur <= 0) {
Disconnect();
SetStatus(Status::Error);
return 0;
}
sent += static_cast<std::size_t>(cur);
}
return sent;
}
std::size_t TCPSocket::Receive(DataBuffer& buffer, std::size_t amount) {
buffer.Resize(amount);
buffer.SetReadOffset(0);
int recvAmount = recv(m_Handle, reinterpret_cast<char*>(buffer.data()), static_cast<int>(amount), 0);
if (recvAmount <= 0) {
#if defined(_WIN32) || defined(WIN32)
int err = WSAGetLastError();
#else
int err = errno;
#endif
if (err == WOULDBLOCK) {
buffer.Clear();
return 0;
}
Disconnect();
buffer.Clear();
m_Status = Status::Error;
return 0;
}
buffer.Resize(static_cast<std::size_t>(recvAmount));
return static_cast<std::size_t>(recvAmount);
}
DataBuffer TCPSocket::Receive(std::size_t amount) {
DataBuffer buffer;
Receive(buffer, amount);
return buffer;
}
void SendPacket(const DataBuffer& data, network::TCPSocket& socket) {
DataBuffer compressed = utils::Compress(data);
socket.Send(compressed.data(), compressed.GetSize());
}
} // namespace network
} // namespace blitz

View File

@@ -1,6 +1,6 @@
#include "blitz/protocol/packets/ChatPacket.h"
#include "blitz/protocol/Color.h"
#include "blitz/common/VarInt.h"
#include <sp/common/VarInt.h>
#include "blitz/maths/Vector.h"
#include "blitz/misc/Log.h"
#include <map>
@@ -19,30 +19,7 @@ const static std::map<std::string, Vec4f> COLORS = {
{"yellow", {1, 1, 0, 1}},
};
DataBuffer ChatPacket::Serialize(bool packetID) const {
DataBuffer data;
WritePacketID(data, packetID);
data << VarInt{m_Message.size()};
for (const auto& part : m_Message) {
data << part.color << part.text;
}
return data;
}
void ChatPacket::Deserialize(DataBuffer& data) {
VarInt partsNumber;
data >> partsNumber;
m_Message.resize(partsNumber.GetValue());
for (std::size_t i = 0; i < partsNumber.GetValue(); ++i) {
data >> m_Message[i].color >> m_Message[i].text;
}
}
std::string ChatPacket::GetTextColor(Vec3uc color) {
std::string GetTextColor(Vec3uc color) {
std::stringstream ss;
ss << std::hex << "\\u";
if (color.r <= 0xF)
@@ -57,7 +34,7 @@ std::string ChatPacket::GetTextColor(Vec3uc color) {
return ss.str();
}
ColoredText ChatPacket::ColorizeText(const std::string& text) {
ColoredText ColorizeText(const std::string& text) {
ColoredText parts;
Vec4f currentColor{1, 1, 1, 1};
@@ -135,18 +112,28 @@ ColoredText ChatPacket::ColorizeText(const std::string& text) {
return parts;
}
std::string ChatPacket::GetColoredTextString(const ColoredText& text) {
std::string GetColoredTextString(const ColoredText& text) {
std::string result;
for (auto& part : text) {
result += GetTextColor({static_cast<std::uint8_t>(part.color.x * 255), static_cast<std::uint8_t>(part.color.y * 255),
static_cast<std::uint8_t>(part.color.z * 255)})
result += GetTextColor({static_cast<std::uint8_t>(part.m_Color.x * 255), static_cast<std::uint8_t>(part.m_Color.y * 255),
static_cast<std::uint8_t>(part.m_Color.z * 255)})
.c_str();
result += part.text.c_str();
result += part.m_Text.c_str();
}
return result;
}
DataBuffer& operator<<(DataBuffer& out, const ColoredPart& var) {
out << var.m_Color << var.m_Text;
return out;
}
DataBuffer& operator>>(DataBuffer& in, ColoredPart& var) {
in >> var.m_Color >> var.m_Text;
return in;
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,39 +0,0 @@
#include "blitz/protocol/PacketDispatcher.h"
namespace blitz {
namespace protocol {
void PacketDispatcher::RegisterHandler(PacketType type, PacketHandler* handler) {
auto found = std::find(m_Handlers[type].begin(), m_Handlers[type].end(), handler);
if (found == m_Handlers[type].end())
m_Handlers[type].push_back(handler);
}
void PacketDispatcher::UnregisterHandler(PacketType type, PacketHandler* handler) {
auto found = std::find(m_Handlers[type].begin(), m_Handlers[type].end(), handler);
if (found != m_Handlers[type].end())
m_Handlers[type].erase(found);
}
void PacketDispatcher::UnregisterHandler(PacketHandler* handler) {
for (auto& pair : m_Handlers) {
if (pair.second.empty())
continue;
PacketType type = pair.first;
m_Handlers[type].erase(std::remove(m_Handlers[type].begin(), m_Handlers[type].end(), handler), m_Handlers[type].end());
}
}
void PacketDispatcher::Dispatch(const Packet* packet) {
if (!packet)
return;
PacketType type = packet->GetType();
for (PacketHandler* handler : m_Handlers[type])
packet->Dispatch(handler);
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,40 +0,0 @@
#include "blitz/protocol/PacketFactory.h"
#include "blitz/protocol/Packets.h"
#include <array>
#include <functional>
#include <memory>
namespace blitz {
namespace protocol {
namespace PacketFactory {
typedef std::function<PacketPtr()> PacketCreator;
static std::array<PacketCreator, static_cast<std::size_t>(PacketType::PACKET_COUNT)> Packets = {
[]() -> PacketPtr { return std::make_unique<PlayerLoginPacket>(); },
[]() -> PacketPtr { return std::make_unique<UpdateHealthPacket>(); },
[]() -> PacketPtr { return std::make_unique<ConnexionInfoPacket>(); },
[]() -> PacketPtr { return std::make_unique<PlayerJoinPacket>(); },
[]() -> PacketPtr { return std::make_unique<PlayerLeavePacket>(); },
[]() -> PacketPtr { return std::make_unique<PlayerListPacket>(); },
[]() -> PacketPtr { return std::make_unique<PlayerStatsPacket>(); },
[]() -> PacketPtr { return std::make_unique<ServerConfigPacket>(); },
[]() -> PacketPtr { return std::make_unique<ServerTpsPacket>(); },
[]() -> PacketPtr { return std::make_unique<UpdateGameStatePacket>(); },
[]() -> PacketPtr { return std::make_unique<KeepAlivePacket>(); },
[]() -> PacketPtr { return std::make_unique<DisconnectPacket>(); },
[]() -> PacketPtr { return std::make_unique<ChatPacket>(); },
[]() -> PacketPtr { return std::make_unique<PlayerPositionAndRotationPacket>(); },
[]() -> PacketPtr { return std::make_unique<PlayerShootPacket>(); },
};
const PacketPtr CreatePacket(PacketType type, DataBuffer& buffer) {
PacketPtr packet = Packets[static_cast<std::size_t>(type)]();
packet->Deserialize(buffer);
return packet;
}
} // namespace PacketFactory
} // namespace protocol
} // namespace blitz

View File

@@ -1,34 +0,0 @@
#include "blitz/protocol/PacketHandler.h"
#include "blitz/protocol/Packets.h"
#define REGISTER_DISPATCH_CLASS(className) \
void className::Dispatch(PacketHandler* handler) const { \
handler->HandlePacket(this); \
}
namespace blitz {
namespace protocol {
void Packet::WritePacketID(DataBuffer& data, bool packetID) const {
if (packetID)
data << GetID();
}
REGISTER_DISPATCH_CLASS(PlayerLoginPacket)
REGISTER_DISPATCH_CLASS(KeepAlivePacket)
REGISTER_DISPATCH_CLASS(PlayerListPacket)
REGISTER_DISPATCH_CLASS(PlayerJoinPacket)
REGISTER_DISPATCH_CLASS(PlayerLeavePacket)
REGISTER_DISPATCH_CLASS(ConnexionInfoPacket)
REGISTER_DISPATCH_CLASS(DisconnectPacket)
REGISTER_DISPATCH_CLASS(ServerTpsPacket)
REGISTER_DISPATCH_CLASS(ChatPacket)
REGISTER_DISPATCH_CLASS(PlayerPositionAndRotationPacket)
REGISTER_DISPATCH_CLASS(PlayerShootPacket);
REGISTER_DISPATCH_CLASS(UpdateHealthPacket);
REGISTER_DISPATCH_CLASS(PlayerStatsPacket);
REGISTER_DISPATCH_CLASS(UpdateGameStatePacket);
REGISTER_DISPATCH_CLASS(ServerConfigPacket);
} // namespace protocol
} // namespace blitz

View File

@@ -1,19 +0,0 @@
#include "blitz/protocol/packets/ConnexionInfoPacket.h"
namespace blitz {
namespace protocol {
DataBuffer ConnexionInfoPacket::Serialize(bool packetID) const {
DataBuffer data;
WritePacketID(data, packetID);
data << m_ConnectionID;
return data;
}
void ConnexionInfoPacket::Deserialize(DataBuffer& data) {
data >> m_ConnectionID;
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,19 +0,0 @@
#include "blitz/protocol/packets/DisconnectPacket.h"
namespace blitz {
namespace protocol {
DataBuffer DisconnectPacket::Serialize(bool packetID) const {
DataBuffer data;
WritePacketID(data, packetID);
data << m_Reason;
return data;
}
void DisconnectPacket::Deserialize(DataBuffer& data) {
data >> m_Reason;
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,21 +0,0 @@
#include "blitz/protocol/packets/KeepAlivePacket.h"
#include "blitz/common/VarInt.h"
namespace blitz {
namespace protocol {
DataBuffer KeepAlivePacket::Serialize(bool packetID) const {
DataBuffer data;
WritePacketID(data, packetID);
data << m_AliveID;
return data;
}
void KeepAlivePacket::Deserialize(DataBuffer& data) {
data >> m_AliveID;
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,19 +0,0 @@
#include "blitz/protocol/packets/PlayerJoinPacket.h"
namespace blitz {
namespace protocol {
DataBuffer PlayerJoinPacket::Serialize(bool packetID) const {
DataBuffer data;
WritePacketID(data, packetID);
data << m_PlayerID << m_PlayerName;
return data;
}
void PlayerJoinPacket::Deserialize(DataBuffer& data) {
data >> m_PlayerID >> m_PlayerName;
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,20 +0,0 @@
#include "blitz/protocol/packets/PlayerLeavePacket.h"
namespace blitz {
namespace protocol {
DataBuffer PlayerLeavePacket::Serialize(bool packetID) const {
DataBuffer data;
WritePacketID(data, packetID);
data << m_PlayerID;
return data;
}
void PlayerLeavePacket::Deserialize(DataBuffer& data) {
data >> m_PlayerID;
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,32 +0,0 @@
#include "blitz/protocol/packets/PlayerListPacket.h"
#include "blitz/common/VarInt.h"
namespace blitz {
namespace protocol {
DataBuffer PlayerListPacket::Serialize(bool packetID) const {
DataBuffer data;
WritePacketID(data, packetID);
data << VarInt(m_Players.size());
for (auto [playerID, playerInfo] : m_Players) {
data << playerID << playerInfo.name;
}
return data;
}
void PlayerListPacket::Deserialize(DataBuffer& data) {
VarInt playerCount;
data >> playerCount;
for (std::size_t i = 0; i < playerCount.GetValue(); i++) {
std::uint8_t playerID;
PlayerInfo playerInfo;
data >> playerID >> playerInfo.name;
m_Players.insert({playerID, playerInfo});
}
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,19 +0,0 @@
#include "blitz/protocol/packets/PlayerLoginPacket.h"
namespace blitz {
namespace protocol {
DataBuffer PlayerLoginPacket::Serialize(bool packetID) const {
DataBuffer data;
WritePacketID(data, packetID);
data << m_PlayerName;
return data;
}
void PlayerLoginPacket::Deserialize(DataBuffer& data) {
data >> m_PlayerName;
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,21 +0,0 @@
#include "blitz/protocol/packets/PlayerPositionAndRotationPacket.h"
namespace blitz {
namespace protocol {
DataBuffer PlayerPositionAndRotationPacket::Serialize(bool packetID) const {
DataBuffer data;
WritePacketID(data, packetID);
data << m_Player << m_Position << m_Yaw << m_Pitch;
return data;
}
void PlayerPositionAndRotationPacket::Deserialize(DataBuffer& data) {
data >> m_Player >> m_Position >> m_Yaw >> m_Pitch;
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,19 +0,0 @@
#include "blitz/protocol/packets/PlayerShootPacket.h"
namespace blitz {
namespace protocol {
DataBuffer PlayerShootPacket::Serialize(bool packetID) const {
DataBuffer data;
WritePacketID(data, packetID);
data << m_Player << m_Position << m_Yaw << m_Pitch;
return data;
}
void PlayerShootPacket::Deserialize(DataBuffer& data) {
data >> m_Player >> m_Position >> m_Yaw >> m_Pitch;
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,19 +0,0 @@
#include "blitz/protocol/packets/PlayerStatsPacket.h"
namespace blitz {
namespace protocol {
DataBuffer PlayerStatsPacket::Serialize(bool packetID) const {
DataBuffer data;
WritePacketID(data, packetID);
data << m_PlayerID << m_PlayerStats;
return data;
}
void PlayerStatsPacket::Deserialize(DataBuffer& data) {
data >> m_PlayerID >> m_PlayerStats;
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,21 +0,0 @@
#include "blitz/protocol/packets/ServerConfigPacket.h"
namespace blitz {
namespace protocol {
DataBuffer ServerConfigPacket::Serialize(bool packetID) const {
DataBuffer data;
WritePacketID(data, packetID);
data << static_cast<std::uint16_t>(m_GameConfig.FiringRate) << m_GameConfig.Gravity;
return data;
}
void ServerConfigPacket::Deserialize(DataBuffer& data) {
std::uint16_t firingRate;
data >> firingRate >> m_GameConfig.Gravity;
m_GameConfig.FiringRate = firingRate;
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,19 +0,0 @@
#include "blitz/protocol/packets/ServerTpsPacket.h"
namespace blitz {
namespace protocol {
DataBuffer ServerTpsPacket::Serialize(bool packetID) const {
DataBuffer data;
WritePacketID(data, packetID);
data << m_TPS << m_MSPT << m_PacketSendTime;
return data;
}
void ServerTpsPacket::Deserialize(DataBuffer& data) {
data >> m_TPS >> m_MSPT >> m_PacketSendTime;
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,19 +0,0 @@
#include "blitz/protocol/packets/UpdateGameStatePacket.h"
namespace blitz {
namespace protocol {
DataBuffer UpdateGameStatePacket::Serialize(bool packetID) const {
DataBuffer data;
WritePacketID(data, packetID);
data << m_GameState << m_TimeRemaining;
return data;
}
void UpdateGameStatePacket::Deserialize(DataBuffer& data) {
data >> m_GameState >> m_TimeRemaining;
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,19 +0,0 @@
#include "blitz/protocol/packets/UpdateHealthPacket.h"
namespace blitz {
namespace protocol {
DataBuffer UpdateHealthPacket::Serialize(bool packetID) const {
DataBuffer data;
WritePacketID(data, packetID);
data << m_NewHealth;
return data;
}
void UpdateHealthPacket::Deserialize(DataBuffer& data) {
data >> m_NewHealth;
}
} // namespace protocol
} // namespace blitz

View File

@@ -1,21 +1,19 @@
#include "client/Client.h"
#include "blitz/misc/Log.h"
#include "blitz/protocol/packets/ChatPacket.h"
#include "blitz/protocol/packets/DisconnectPacket.h"
#include "blitz/protocol/packets/PlayerPositionAndRotationPacket.h"
#include "blitz/protocol/packets/PlayerShootPacket.h"
#include "blitz/protocol/Packets.h"
#include "client/ClientConnexion.h"
#include "client/game/ClientGame.h"
#include "server/Server.h"
#include <cassert>
namespace blitz {
namespace client {
Client::Client() :
m_Server(std::make_unique<server::Server>()),
m_Connexion(std::make_unique<client::ClientConnexion>(this)),
m_Game(std::make_unique<client::ClientGame>(this, m_Connexion->GetDispatcher())) {}
m_Connexion(std::make_unique<ClientConnexion>(this)),
m_Game(std::make_unique<ClientGame>(this, m_Connexion->GetDispatcher())) {}
Client::~Client() {
Disconnect();
@@ -62,11 +60,11 @@ bool Client::CreateGame(std::uint16_t port, const std::string& pseudo) {
}
void Client::Disconnect() {
if (m_Connexion->GetSocketStatus() != network::TCPSocket::Status::Connected)
if (m_Connexion->GetSocketStatus() == network::TCPSocket::Status::Disconnected)
return;
protocol::DisconnectPacket packet("Client wants to leave !");
m_Connexion->SendPacket(&packet);
m_Connexion->SendPacket(packet);
utils::LOGD("[Client] Disconnected !");
@@ -75,7 +73,7 @@ void Client::Disconnect() {
}
m_Connexion->CloseConnection();
NotifyListeners(&game::ClientListener::OnGameLeave);
NotifyListeners(&client::ClientListener::OnGameLeave);
Reset();
}
@@ -92,22 +90,22 @@ void Client::Reset() {
void Client::SendChatText(const std::string& text) {
protocol::ChatPacket packet(text);
m_Connexion->SendPacket(&packet);
m_Connexion->SendPacket(packet);
}
void Client::ChatTextReceived(const protocol::ColoredText& text) {
NotifyListeners(&game::ClientListener::OnTextChatReceived, text);
NotifyListeners(&client::ClientListener::OnTextChatReceived, text);
}
void Client::SendPlayerPosAndLook(const Vec3f& position, float yaw, float pitch) {
protocol::PlayerPositionAndRotationPacket packet(position, yaw, pitch);
m_Connexion->SendPacket(&packet);
protocol::PlayerPositionAndRotationPacket packet(0, position, yaw, pitch);
m_Connexion->SendPacket(packet);
}
void Client::OnLocalPlayerShoot(const Vec3f& position, float yaw, float pitch) {
protocol::PlayerShootPacket packet(position, yaw, pitch);
m_Connexion->SendPacket(&packet);
protocol::PlayerShootPacket packet(0, position, yaw, pitch);
m_Connexion->SendPacket(packet);
}
@@ -134,4 +132,5 @@ void Client::UpdatePosition(std::uint64_t delta) {
}
}
} // namespace client
} // namespace blitz

View File

@@ -3,11 +3,7 @@
#include "blitz/misc/Format.h"
#include "blitz/misc/Log.h"
#include "blitz/misc/PrettyLog.h"
#include "blitz/protocol/packets/ChatPacket.h"
#include "blitz/protocol/packets/ConnexionInfoPacket.h"
#include "blitz/protocol/packets/DisconnectPacket.h"
#include "blitz/protocol/packets/KeepAlivePacket.h"
#include "blitz/protocol/packets/PlayerLoginPacket.h"
#include "blitz/protocol/Packets.h"
#include "client/Client.h"
namespace blitz {
@@ -16,27 +12,27 @@ namespace client {
static std::string PrintColoredText(const protocol::ColoredText& coloredText) {
std::string text;
for (const auto& part : coloredText) {
text += utils::GetTextColor({static_cast<std::uint8_t>(part.color.r * 255), static_cast<std::uint8_t>(part.color.g * 255),
static_cast<std::uint8_t>(part.color.b * 255)}) +
part.text;
text += utils::GetTextColor({static_cast<std::uint8_t>(part.m_Color.r * 255), static_cast<std::uint8_t>(part.m_Color.g * 255),
static_cast<std::uint8_t>(part.m_Color.b * 255)}) +
part.m_Text;
}
text += utils::GetTextColorReset();
return text;
}
ClientConnexion::ClientConnexion(Client* client) : network::Connexion(&m_Dispatcher), m_Client(client) {
ClientConnexion::ClientConnexion(Client* client) : m_Client(client) {
RegisterHandlers();
}
ClientConnexion::~ClientConnexion() {
GetDispatcher()->UnregisterHandler(this);
GetDispatcher().UnregisterHandler(this);
}
void ClientConnexion::RegisterHandlers() {
GetDispatcher()->RegisterHandler(protocol::PacketType::KeepAlive, this);
GetDispatcher()->RegisterHandler(protocol::PacketType::Disconnect, this);
GetDispatcher()->RegisterHandler(protocol::PacketType::Chat, this);
GetDispatcher()->RegisterHandler(protocol::PacketType::ConnexionInfo, this);
GetDispatcher().RegisterHandler(protocol::PacketType::KeepAlive, this);
GetDispatcher().RegisterHandler(protocol::PacketType::Disconnect, this);
GetDispatcher().RegisterHandler(protocol::PacketType::Chat, this);
GetDispatcher().RegisterHandler(protocol::PacketType::ConnexionInfo, this);
}
bool ClientConnexion::Connect(const std::string& pseudo, const std::string& address, std::uint16_t port) {
@@ -47,31 +43,31 @@ bool ClientConnexion::Connect(const std::string& pseudo, const std::string& addr
return true;
}
void ClientConnexion::HandlePacket(const protocol::ChatPacket* packet) {
utils::LOG("[Chat] " + PrintColoredText(packet->GetMessage()));
m_Client->ChatTextReceived(packet->GetMessage());
void ClientConnexion::Handle(const protocol::ChatPacket& packet) {
utils::LOG("[Chat] " + PrintColoredText(packet.GetMessage()));
m_Client->ChatTextReceived(packet.GetMessage());
}
void ClientConnexion::HandlePacket(const protocol::DisconnectPacket* packet) {
utils::LOG("[ClientConnexion] Disconnected ! Reason : " + packet->GetReason());
m_Client->NotifyListeners(&game::ClientListener::OnGameLeave);
void ClientConnexion::Handle(const protocol::DisconnectPacket& packet) {
utils::LOG("[ClientConnexion] Disconnected ! Reason : " + packet.GetReason());
m_Client->NotifyListeners(&client::ClientListener::OnGameLeave);
m_Client->Disconnect();
}
void ClientConnexion::HandlePacket(const protocol::KeepAlivePacket* packet) {
protocol::KeepAlivePacket response(packet->GetAliveID());
SendPacket(&response);
void ClientConnexion::Handle(const protocol::KeepAlivePacket& packet) {
protocol::KeepAlivePacket response(packet.GetAliveId());
SendPacket(response);
}
void ClientConnexion::HandlePacket(const protocol::ConnexionInfoPacket* packet) {
m_PlayerID = packet->GetConnectionID();
void ClientConnexion::Handle(const protocol::ConnexionInfoPacket& packet) {
m_PlayerID = packet.GetConnectionID();
utils::LOGD("[ClientConnexion] Logging in with pseudo " + m_PlayerName + " ...");
Login(m_PlayerName);
}
void ClientConnexion::Login(const std::string& pseudo) {
protocol::PlayerLoginPacket packet(pseudo);
SendPacket(&packet);
SendPacket(packet);
}
} // namespace client

Some files were not shown because too many files have changed in this diff Show More