Пример #1
0
BufferView::BufferView(const BufferPointer& buffer, const Element& element) :
    BufferView(buffer, DEFAULT_OFFSET, buffer ? buffer->getSize() : 0, element.getSize(), element) {}
Пример #2
0
	void Client::send(BufferPointer buffer, bool reliable)
	{
		ENetPacket *packet = enet_packet_create(buffer->getData(),
			buffer->getSize(), reliable?ENET_PACKET_FLAG_RELIABLE:0);
		enet_peer_send(peer, 0, packet);
	}
		void ClientWorldComponent::onPreUpdate()
		{
			client->update();
			// Receive data
			while (connection->hasData())
			{
				BufferPointer data = connection->receive();
				PacketType type = (PacketType)data->read8();
				switch (type)
				{
					case EPT_EntityCreated:
					{
						unsigned int id = data->read16() + 1;
						std::string type = data->readString();
						bool local = data->readUnsignedInt(1);
						// Create entity
						Game *game = getWorld()->getEngine()->getGame();
						EntityFactory *factory = game->getEntityFactory(type);
						if (!factory)
						{
							std::cout << "Could not get entity factory " << type << std::endl;
							continue;
						}
						Entity *entity = factory->createEntity(getWorld());
						ClientEntityComponent *component = (ClientEntityComponent*)entity->getComponent(EECT_Client);
						component->setID(id);
						component->setState(data.get());
						addEntity(entity);
						getWorld()->addEntity(entity);
						break;
					}
					case EPT_EntityDeleted:
					{
						unsigned int id = data->read16() + 1;
						Entity *entity = getEntity(id);
						removeEntity(entity);
						delete entity;
						break;
					}
					case EPT_Update:
					{
						bool updatevalid = true;
						unsigned int updatetime = data->read32();
						unsigned int updateclienttime = data->read32();
						lastacked = data->read32();
						// Adjust time if the latency has decreased
						// TODO: This might affect client prediction
						if (updatetime > getWorld()->getTime())
							getWorld()->setTime(updatetime);
						// Apply the updates
						while (data->getPosition() + 16 <= data->getSize() * 8)
						{
							unsigned int id = data->read16() + 1;
							ClientEntityComponent *entity = getComponent(id);
							// Ignore invalid updates
							if (!entity)
							{
								updatevalid = false;
								break;
							}
							// Apply backup to remove any user changes
							if (entity->hasBackup())
								entity->applyBackup();
							// Apply update
							entity->applyUpdate(data.get(), updatetime);
							entity->onUpdate().trigger(updateclienttime);
						}
						// Only send the server that we have received this
						// update if it was valid
						if (updatevalid)
							lastupdate = updatetime;
						break;
					}
					case EPT_EntityMessage:
					{
						unsigned int id = data->read16() + 1;
						ClientEntityComponent *entity = getComponent(id);
						entity->onMessage().trigger(data.get());
						break;
					}
					default:
						// TODO: Warn
						break;
				}
			}
		}