@Override public <T extends Event> void registerEventReceiver(EventReceiver<T> eventReceiver, Class<T> eventClass, int priority, Class<? extends Component>... componentTypes) { EventSystemReplayImpl.EventHandlerInfo info = new EventSystemReplayImpl.ReceiverEventHandlerInfo<>(eventReceiver, priority, componentTypes); addEventHandler(eventClass, info, Arrays.asList(componentTypes)); }
private void addEventHandler(Class<? extends Event> type, EventSystemReplayImpl.EventHandlerInfo handler, Collection<Class<? extends Component>> components) { if (components.isEmpty()) { generalHandlers.put(type, handler); for (Class<? extends Event> childType : childEvents.get(type)) { generalHandlers.put(childType, handler); } } else { for (Class<? extends Component> c : components) { addToComponentSpecificHandlers(type, handler, c); for (Class<? extends Event> childType : childEvents.get(type)) { addToComponentSpecificHandlers(childType, handler, c); } } } }
private void networkReplicate(EntityRef entity, Event event) { EventMetadata metadata = eventLibrary.getMetadata(event); if (metadata != null && metadata.isNetworkEvent()) { logger.debug("Replicating event: {}", event); switch (metadata.getNetworkEventType()) { case BROADCAST: broadcastEvent(entity, event, metadata); break; case OWNER: sendEventToOwner(entity, event); break; case SERVER: sendEventToServer(entity, event); break; default: break; } } }
/** * Calls the 'process' method if the replay is activated and the event is of a type selected to be replayed. * This way, events of the types that are recorded and replayed are ignored during a replay. This is what makes * the player have no control over the character during a replay. * @param entity the entity which the event was sent against. * @param event the event being sent. */ @Override public void send(EntityRef entity, Event event) { if (recordAndReplayCurrentStatus.getStatus() != RecordAndReplayStatus.REPLAYING || !isSelectedToReplayEvent(event)) { originalSend(entity, event); } }
/** * Processes recorded events for a certain amount of time and only if the timestamp is right. */ private void processRecordedEvents() { if (recordAndReplayCurrentStatus.getStatus() == RecordAndReplayStatus.REPLAYING && !this.areRecordedEventsLoaded) { initialiseReplayData(); } //If replay is ready, process some recorded events if the time is right. if (recordAndReplayCurrentStatus.getStatus() == RecordAndReplayStatus.REPLAYING) { processRecordedEventsBatch(1); if (this.recordedEvents.isEmpty()) { if (recordAndReplayUtils.getFileCount() <= recordAndReplayUtils.getFileAmount()) { //Get next recorded events file loadNextRecordedEventFile(); } else { finishReplay(); } } } }
private static EventSystem createEventSystem(NetworkSystem networkSystem, PojoEntityManager entityManager, EntitySystemLibrary library, RecordedEventStore recordedEventStore, RecordAndReplaySerializer recordAndReplaySerializer, RecordAndReplayUtils recordAndReplayUtils, RecordAndReplayCurrentStatus recordAndReplayCurrentStatus) { EventSystem eventSystem; List<Class<?>> selectedClassesToRecord = createSelectedClassesToRecordList(); if (recordAndReplayCurrentStatus.getStatus() == RecordAndReplayStatus.PREPARING_REPLAY) { eventSystem = new EventSystemReplayImpl(library.getEventLibrary(), networkSystem, entityManager, recordedEventStore, recordAndReplaySerializer, recordAndReplayUtils, selectedClassesToRecord, recordAndReplayCurrentStatus); } else { EventCatcher eventCatcher = new EventCatcher(selectedClassesToRecord, recordedEventStore); eventSystem = new EventSystemImpl(library.getEventLibrary(), networkSystem, eventCatcher, recordAndReplayCurrentStatus); } return eventSystem; }
/** * Try to process recorded events for 'maxDuration' miliseconds. Events are only processed if the time is right. * @param maxDuration the amount of time in which this method will try to process recorded events in one go. */ private void processRecordedEventsBatch(long maxDuration) { long beginTime = System.currentTimeMillis(); for (RecordedEvent re = recordedEvents.peek(); re != null; re = recordedEvents.peek()) { long passedTime = System.currentTimeMillis() - this.replayEventsLoadTime; //Waits until the time of reproduction is right or until 'maxDuration' miliseconds have already passed since this method was called while (passedTime < re.getTimestamp()) { passedTime = System.currentTimeMillis() - this.replayEventsLoadTime; if ((System.currentTimeMillis() - beginTime) >= maxDuration) { return; } } recordedEvents.poll(); EntityRef entity = getEntityRef(re); // Sends recorded event to be processed if (re.getComponent() != null) { originalSend(entity, re.getEvent(), re.getComponent()); } else { originalSend(entity, re.getEvent()); } this.lastRecordedEventIndex = re.getIndex(); // Check if time is up. if ((System.currentTimeMillis() - beginTime) >= maxDuration) { return; } } }
private void initialiseReplayData() { fillRecordedEvents(); this.areRecordedEventsLoaded = true; logger.info("Loaded Recorded Events!"); replayEventsLoadTime = System.currentTimeMillis(); }
selectedClassesToReplay.add(InputEvent.class); eventSystem = new EventSystemReplayImpl(entitySystemLibrary.getEventLibrary(), networkSystem, entityManager, eventStore, recordAndReplaySerializer, recordAndReplayUtils, selectedClassesToReplay, recordAndReplayCurrentStatus);
/** * Calls the 'process' method if the replay is activated and the event is of a type selected to be replayed. * This way, events of the types that are recorded and replayed are ignored during a replay. This is what makes * the player have no control over the character during a replay. * @param entity the entity which the event was sent against. * @param event the event being sent. * @param component the component sent along with the event. */ @Override public void send(EntityRef entity, Event event, Component component) { if (recordAndReplayCurrentStatus.getStatus() != RecordAndReplayStatus.REPLAYING || !isSelectedToReplayEvent(event)) { originalSend(entity, event, component); } }
private void loadNextRecordedEventFile() { String recordingPath = PathManager.getInstance().getRecordingPath(recordAndReplayUtils.getGameTitle()).toString(); recordAndReplaySerializer.deserializeRecordedEvents(recordingPath); fillRecordedEvents(); }
addEventHandler((Class<? extends Event>) types[0], handlerInfo, requiredComponents);