RType
AScene.cpp
Go to the documentation of this file.
1 /*
2 ** EPITECH PROJECT, 2023
3 ** R-type
4 ** File description:
5 ** R-type
6 */
7 
8 #include "AScene.hpp"
9 
10 #include <utility>
11 
12 /**
13  * @brief Construct a new AScene:: AScene object
14  * @param serverSocket
15  */
16 AScene::AScene(std::shared_ptr<ServerSocket> serverSocket)
17 {
18  _serverSocket = std::move(serverSocket);
19 }
20 
21 /**
22  * @brief addEntity, add an entity
23  * @param entity
24  */
25 void AScene::addEntity(std::shared_ptr<IEntity> entity)
26 {
27  _entities.push_back(std::move(entity));
28 }
29 
30 /**
31  * @brief getEntities, get the entities
32  * @return entities (std::vector<std::shared_ptr<IEntity>>)
33  */
35 {
36  return _entities;
37 }
38 
39 /**
40  * @brief addService, add a service
41  * @param service
42  */
43 void AScene::addService(std::shared_ptr<IService> service)
44 {
45  _services.push_back(std::move(service));
46 }
47 
48 /**
49  * @brief getServices, get the services
50  * @return services (std::vector<std::shared_ptr<IService>>)
51  */
53 {
54  return _services;
55 }
56 
57 void AScene::display()
58 {
59 }
60 
61 void AScene::pauseScene()
62 {
63 }
64 
65 void AScene::resumeScene()
66 {
67 }
68 
69 void AScene::stopScene()
70 {
71 }
72 
73 /**
74  * @brief restartScene, restart the scene
75  */
77 {
78  _entities.clear();
79  _services.clear();
80  initEntities();
81  initServices();
82 }
83 
84 /**
85  * @brief sedGameState, send the game state
86  * @param clientID
87  */
88 void AScene::sendGameState(int clientID)
89 {
90  std::cout << "Sending game state to client " << clientID << std::endl;
91  std::shared_ptr<Packet> packet = std::make_shared<Packet>();
92  NewComponent newComponent{};
93 
94  for (auto &entity : _entities) {
95  for (auto &component : entity->getComponents()) {
96  auto drawable = std::dynamic_pointer_cast<Drawable>(component);
97  if (drawable) {
98  newComponent.id = drawable->_textureId;
99  std::memset(&newComponent.attribute, 0, 16);
100  std::memcpy(&newComponent.attribute, entity->getAttribute().c_str(), 16);
101  std::memcpy(&newComponent.attribute2, entity->getAttribute().c_str() + 8, 8);
102  newComponent.type = ComponentTypeSocket ::SPRITESOCKET;
103  packet->code = NEW_COMPONENT;
104  packet->data_size = sizeof(NewComponent);
105  packet->data = malloc(packet->data_size);
106  std::memcpy(packet->data, &newComponent, packet->data_size);
107  // std::cout << "Sending component " << static_cast<char *>(packet->data) << " to client " << clientID
108  // << std::endl;
109  _serverSocket->send(packet.get(), _serverSocket->getClientAddress(clientID));
110  free(packet->data);
111  }
112  }
113  }
114 }
115 
116 /**
117  * @brief broadcastGameState, broadcast the game state
118  */
120 {
121  std::shared_ptr<Packet> packet = std::make_shared<Packet>();
122  NewComponent newComponent{};
123 
124  for (auto &entity : _entities) {
125  for (auto &component : entity->getComponents()) {
126  auto drawable = std::dynamic_pointer_cast<Drawable>(component);
127  if (drawable) {
128  newComponent.id = drawable->_textureId;
129  std::memset(&newComponent.attribute, 0, 16);
130  std::memcpy(&newComponent.attribute, drawable->getAttribute(), std::strlen(drawable->getAttribute()));
131  newComponent.type = ComponentTypeSocket ::SPRITESOCKET;
132  newComponent.x = std::get<0>(drawable->getPosition());
133  newComponent.y = std::get<1>(drawable->getPosition());
134  newComponent.sizeHorizontal = std::get<0>(drawable->getSize());
135  newComponent.sizeVertical = std::get<1>(drawable->getSize());
136  newComponent.rectLeft = std::get<0>(drawable->getRect());
137  newComponent.rectTop = std::get<1>(drawable->getRect());
138  newComponent.rectWidth = std::get<2>(drawable->getRect());
139  newComponent.rectHeight = std::get<3>(drawable->getRect());
140  packet->code = NEW_COMPONENT;
141  packet->data_size = sizeof(NewComponent);
142  packet->data = malloc(packet->data_size);
143  std::memcpy(packet->data, &newComponent, packet->data_size);
144  // std::cout << "Sending component " << static_cast<char *>(packet->data) << " to all clients" <<
145  // std::endl;
146  _serverSocket->broadcast(packet.get());
147  free(packet->data);
148  }
149  }
150  }
151 }