private void serializeCharacterStateEventPositonMap(Gson gson, String recordingPath) { try { JsonWriter writer = new JsonWriter(new FileWriter(recordingPath + STATE_EVENT_POSITION)); gson.toJson(characterStateEventPositionMap.getIdToData(), HashMap.class, writer); writer.close(); characterStateEventPositionMap.reset(); logger.info("CharacterStateEvent positions Serialization completed!"); } catch (Exception e) { logger.error("Error while serializing CharacterStateEvent positions:", e); } }
private void deserializeCharacterStateEventPositonMap(Gson gson, String recordingPath) { try (FileReader fileReader = new FileReader(recordingPath + STATE_EVENT_POSITION)) { JsonParser parser = new JsonParser(); JsonElement jsonElement = parser.parse(fileReader); Type typeOfHashMap = new TypeToken<HashMap<Integer, Vector3f[]>>() { }.getType(); Map<Integer, Vector3f[]> previousMap = gson.fromJson(jsonElement, typeOfHashMap); characterStateEventPositionMap.setIdToData(previousMap); logger.info("CharacterStateEvent positions Deserialization completed!"); } catch (Exception e) { logger.error("Error while deserializing CharacterStateEvent positions:", e); } }
RecordAndReplayUtils recordAndReplayUtils = new RecordAndReplayUtils(); rootContext.put(RecordAndReplayUtils.class, recordAndReplayUtils); CharacterStateEventPositionMap characterStateEventPositionMap = new CharacterStateEventPositionMap(); rootContext.put(CharacterStateEventPositionMap.class, characterStateEventPositionMap); DirectionAndOriginPosRecorderList directionAndOriginPosRecorderList = new DirectionAndOriginPosRecorderList();
@ReceiveEvent(components = {CharacterMovementComponent.class, LocationComponent.class, AliveCharacterComponent.class}) public void onPlayerInput(CharacterMoveInputEvent input, EntityRef entity) { CharacterCollider characterCollider = physics.getCharacterCollider(entity); if (characterCollider.isPending()) { logger.debug("Skipping input, collision not yet established"); return; } CircularBuffer<CharacterStateEvent> stateBuffer = characterStates.get(entity); CharacterStateEvent lastState = stateBuffer.getLast(); float delta = input.getDeltaMs() + lastState.getTime() - (time.getGameTimeInMs() + MAX_INPUT_OVERFLOW ); if (recordAndReplayCurrentStatus.getStatus() == RecordAndReplayStatus.REPLAYING) { delta -= MAX_INPUT_OVERFLOW_REPLAY_INCREASE; } if (delta < 0) { CharacterStateEvent newState = stepState(input, lastState, entity); stateBuffer.add(newState); if (recordAndReplayCurrentStatus.getStatus() == RecordAndReplayStatus.REPLAYING) { characterStateEventPositionMap.updateCharacterStateEvent(newState); } else if (recordAndReplayCurrentStatus.getStatus() == RecordAndReplayStatus.RECORDING) { characterStateEventPositionMap.add(newState.getSequenceNumber(), newState.getPosition(), newState.getVelocity()); } characterMovementSystemUtility.setToState(entity, newState); lastInputEvent.put(entity, input); } else { logger.warn("Received too much input from {}, dropping input. Delta difference: {}", entity, delta); } }
CharacterStateEventPositionMap characterStateEventPositionMap = new CharacterStateEventPositionMap(); DirectionAndOriginPosRecorderList directionAndOriginPosRecorderList = new DirectionAndOriginPosRecorderList(); recordAndReplaySerializer = new RecordAndReplaySerializer(entityManager, recordedEventStore, recordAndReplayUtils, characterStateEventPositionMap, directionAndOriginPosRecorderList, moduleEnvironment);
RecordedEventStore eventStore = new RecordedEventStore(); RecordAndReplayUtils recordAndReplayUtils = new RecordAndReplayUtils(); CharacterStateEventPositionMap characterStateEventPositionMap = new CharacterStateEventPositionMap(); DirectionAndOriginPosRecorderList directionAndOriginPosRecorderList = new DirectionAndOriginPosRecorderList(); RecordAndReplaySerializer recordAndReplaySerializer = new RecordAndReplaySerializer(entityManager, eventStore, recordAndReplayUtils, characterStateEventPositionMap, directionAndOriginPosRecorderList, null);
RecordAndReplayUtils recordAndReplayUtils = new RecordAndReplayUtils(); context.put(RecordAndReplayUtils.class, recordAndReplayUtils); CharacterStateEventPositionMap characterStateEventPositionMap = new CharacterStateEventPositionMap(); context.put(CharacterStateEventPositionMap.class, characterStateEventPositionMap); DirectionAndOriginPosRecorderList directionAndOriginPosRecorderList = new DirectionAndOriginPosRecorderList();