Botcraft 1.21.5
Loading...
Searching...
No Matches
EntityManager.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4#include <shared_mutex>
5#include <unordered_map>
6
8
10
11namespace Botcraft
12{
13 class Entity;
14 class LocalPlayer;
15 class NetworkManager;
16
18 {
19 public:
20 EntityManager(const std::shared_ptr<NetworkManager>& network_manager);
21
22 std::shared_ptr<LocalPlayer> GetLocalPlayer();
23
24 std::shared_ptr<Entity> GetEntity(const int id) const;
25 void AddEntity(const std::shared_ptr<Entity>& entity);
26
27 /// @brief Get a read-only locked version of all the loaded entities (including local player)
28 /// @return Basically an object you can use as a std::unordered_map<int, std::shared_ptr<Entity>>*.
29 /// **ALL ENTITIES UPDATE WILL BE BLOCKED WHILE THIS OBJECT IS ALIVE**, make sure it goes out of scope
30 /// as soon as you don't need it.
32
33 protected:
34 virtual void Handle(ProtocolCraft::ClientboundLoginPacket& packet) override;
35 virtual void Handle(ProtocolCraft::ClientboundAddEntityPacket& packet) override;
36#if PROTOCOL_VERSION < 759 /* < 1.19 */
37 virtual void Handle(ProtocolCraft::ClientboundAddMobPacket& packet) override;
38#endif
39#if PROTOCOL_VERSION < 770 /* < 1.21.5 */
40 virtual void Handle(ProtocolCraft::ClientboundAddExperienceOrbPacket& packet) override;
41#endif
42#if PROTOCOL_VERSION < 721 /* < 1.16 */
43 virtual void Handle(ProtocolCraft::ClientboundAddGlobalEntityPacket& packet) override;
44#endif
45#if PROTOCOL_VERSION < 764 /* < 1.20.2 */
46 virtual void Handle(ProtocolCraft::ClientboundAddPlayerPacket& packet) override;
47#endif
48 virtual void Handle(ProtocolCraft::ClientboundSetHealthPacket& packet) override;
49 virtual void Handle(ProtocolCraft::ClientboundTeleportEntityPacket& packet) override;
50 virtual void Handle(ProtocolCraft::ClientboundPlayerAbilitiesPacket& packet) override;
51#if PROTOCOL_VERSION < 755 /* < 1.17 */
52 virtual void Handle(ProtocolCraft::ClientboundMoveEntityPacket& packet) override;
53#endif
54 virtual void Handle(ProtocolCraft::ClientboundMoveEntityPacketPos& packet) override;
55 virtual void Handle(ProtocolCraft::ClientboundMoveEntityPacketPosRot& packet) override;
56 virtual void Handle(ProtocolCraft::ClientboundMoveEntityPacketRot& packet) override;
57#if PROTOCOL_VERSION == 755 /* 1.17 */
58 virtual void Handle(ProtocolCraft::ClientboundRemoveEntityPacket& packet) override;
59#else
60 virtual void Handle(ProtocolCraft::ClientboundRemoveEntitiesPacket& packet) override;
61#endif
62 virtual void Handle(ProtocolCraft::ClientboundRespawnPacket& packet) override;
63 virtual void Handle(ProtocolCraft::ClientboundGameEventPacket& packet) override;
64 virtual void Handle(ProtocolCraft::ClientboundSetEntityDataPacket& packet) override;
65 virtual void Handle(ProtocolCraft::ClientboundSetEntityMotionPacket& packet) override;
66 virtual void Handle(ProtocolCraft::ClientboundSetEquipmentPacket& packet) override;
67 virtual void Handle(ProtocolCraft::ClientboundUpdateAttributesPacket& packet) override;
68 virtual void Handle(ProtocolCraft::ClientboundUpdateMobEffectPacket& packet) override;
69 virtual void Handle(ProtocolCraft::ClientboundRemoveMobEffectPacket& packet) override;
70#if PROTOCOL_VERSION > 767 /* > 1.21.1 */
72 virtual void Handle(ProtocolCraft::ClientboundMoveMinecartPacket& packet) override;
73#endif
74
75
76 private:
77 std::unordered_map<int, std::shared_ptr<Entity> > entities;
78 // The current player is stored independently
79 std::shared_ptr<LocalPlayer> local_player;
80
81 mutable std::shared_mutex entity_manager_mutex;
82
83 std::shared_ptr<NetworkManager> network_manager;
84 };
85} // Botcraft
virtual void Handle(ProtocolCraft::ClientboundLoginPacket &packet) override
std::shared_ptr< LocalPlayer > GetLocalPlayer()
std::shared_ptr< NetworkManager > network_manager
std::shared_ptr< LocalPlayer > local_player
std::shared_mutex entity_manager_mutex
Utilities::ScopeLockedWrapper< const std::unordered_map< int, std::shared_ptr< Entity > >, std::shared_mutex, std::shared_lock > GetEntities() const
Get a read-only locked version of all the loaded entities (including local player)
std::unordered_map< int, std::shared_ptr< Entity > > entities
void AddEntity(const std::shared_ptr< Entity > &entity)
std::shared_ptr< Entity > GetEntity(const int id) const
Mutex protected reference, will be locked until destroyed.