Botcraft 1.21.4
Loading...
Searching...
No Matches
PhysicsManager.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <atomic>
4#include <memory>
5#include <optional>
6#include <thread>
7
9
12
13namespace Botcraft
14{
15 class EntityManager;
16 class InventoryManager;
17 class LocalPlayer;
18 class NetworkManager;
19 class World;
20
21 class Item;
22
23#if USE_GUI
24 namespace Renderer
25 {
26 class RenderingManager;
27 }
28#endif
29
31 {
32 public:
33 PhysicsManager() = delete;
35#if USE_GUI
36 const std::shared_ptr<Renderer::RenderingManager>& rendering_manager_,
37#endif
38 const std::shared_ptr<InventoryManager>& inventory_manager_,
39 const std::shared_ptr<EntityManager>& entity_manager_,
40 const std::shared_ptr<NetworkManager>& network_manager_,
41 const std::shared_ptr<World>& world_
42 );
44
45 void StartPhysics();
46 void StopPhysics();
47
48 /// @brief Enable/disable auto triggering of sprint when press/unpress/press forward key
49 /// in less than 7 ticks (enabled by default)
50 /// @param b Double tap will start sprinting if b is true
51 void SetDoubleTapCauseSprint(const bool b);
52
53 double GetMsPerTick() const;
54
55 protected:
56 virtual void Handle(ProtocolCraft::ClientboundLoginPacket& msg) override;
58#if PROTOCOL_VERSION > 764 /* > 1.20.2 */
59 virtual void Handle(ProtocolCraft::ClientboundTickingStatePacket& msg) override;
60#endif
61#if PROTOCOL_VERSION > 767 /* > 1.21.1 */
63#endif
64
65 private:
66 void Physics();
67
68 /// @brief Follow minecraft physics related flow in LocalPlayer tick function
69 void PhysicsTick();
70 void UpdateSwimming() const;
71 /// @brief Perform fluid physics on the player, and set in_water/lava boolean accordingly
72 /// @param water If true, will push with water, lava otherwise
73 void FluidPhysics(const bool water);
74 void InputsToCrouch() const;
75 void InputsToSprint() const;
76 void SetSprinting(const bool b) const;
77 void InputsToFly() const;
78 void InputsToJump() const;
79 void ApplyInputs(const float strength) const;
80 /// @brief Send position/rotation/on_ground to server
81 void SendPosition();
82
83 /// @brief Check collisions of an AABB with a given movement
84 /// @param aabb AABB to move
85 /// @param movement Movement vector to apply to AABB
86 /// @return New movement vector after collisions
87 Vector3<double> CollideBoundingBox(const AABB& aabb, const Vector3<double>& movement) const;
88
89 void CollideOneAxis(AABB& aabb, Vector3<double>& movement, const unsigned int axis, const std::vector<AABB>& colliders) const;
90
91 bool IsSwimmingAndNotFlying() const;
92 bool IsInClimbable() const;
93 void MovePlayer() const;
94 void ApplyMovement() const;
95
96 void OnUpdateAbilities() const;
97 void CheckInsideBlocks() const;
99
100 private:
101#if USE_GUI
102 std::shared_ptr<Renderer::RenderingManager> rendering_manager;
103#endif
104 std::shared_ptr<EntityManager> entity_manager;
105 std::shared_ptr<InventoryManager> inventory_manager;
106 std::shared_ptr<LocalPlayer> player;
107 std::shared_ptr<NetworkManager> network_manager;
108 std::shared_ptr<World> world;
109
110 std::atomic<bool> should_run;
111 std::optional<int> teleport_id;
112
114
115 std::thread thread_physics; // Thread running to compute position and send it to the server every tick
116
118
119#if PROTOCOL_VERSION > 764 /* > 1.20.2 */
120 std::atomic<double> ms_per_tick = 50.0;
121#else
122 static constexpr double ms_per_tick = 50.0;
123#endif
124
125 std::atomic<bool> double_tap_cause_sprint;
126
127 };
128} // Botcraft
Vector3< double > CollideBoundingBox(const AABB &aabb, const Vector3< double > &movement) const
Check collisions of an AABB with a given movement.
std::shared_ptr< InventoryManager > inventory_manager
std::shared_ptr< Renderer::RenderingManager > rendering_manager
void PhysicsTick()
Follow minecraft physics related flow in LocalPlayer tick function.
std::shared_ptr< NetworkManager > network_manager
std::shared_ptr< EntityManager > entity_manager
std::optional< int > teleport_id
void FluidPhysics(const bool water)
Perform fluid physics on the player, and set in_water/lava boolean accordingly.
void CollideOneAxis(AABB &aabb, Vector3< double > &movement, const unsigned int axis, const std::vector< AABB > &colliders) const
std::shared_ptr< World > world
void SetDoubleTapCauseSprint(const bool b)
Enable/disable auto triggering of sprint when press/unpress/press forward key in less than 7 ticks (e...
void SendPosition()
Send position/rotation/on_ground to server.
std::atomic< bool > double_tap_cause_sprint
virtual void Handle(ProtocolCraft::ClientboundLoginPacket &msg) override
std::atomic< double > ms_per_tick
std::atomic< bool > should_run
Position GetBlockBelowAffectingMovement() const
std::shared_ptr< LocalPlayer > player
void SetSprinting(const bool b) const
void ApplyInputs(const float strength) const