package org.openbakery.racecontrol.control; import org.openbakery.jinsim.response.InSimResponse; import org.openbakery.jinsim.response.PitLaneResponse; import org.openbakery.jinsim.response.PitStopFinishedResponse; import org.openbakery.jinsim.response.PitStopResponse; import org.openbakery.jinsim.response.PlayerPitsResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openbakery.racecontrol.DriverNotFoundException; import org.openbakery.racecontrol.Race; import org.openbakery.racecontrol.RaceControl; import org.openbakery.racecontrol.data.Driver; import org.openbakery.racecontrol.data.Lap; import org.openbakery.racecontrol.data.Tyres; import org.openbakery.racecontrol.persistence.Persistence; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Track if a player pits or leaves the pits * @author rene * */ public class PitControl extends AbstractControl { private static Logger log = LoggerFactory.getLogger(PitControl.class); public PitControl(RaceControl raceControl, Persistence persistence) { super(raceControl, persistence); } public void packetReceived(InSimResponse response) { if (response instanceof PlayerPitsResponse) { processPlayerPitResponse((PlayerPitsResponse)response); } else if (response instanceof PitLaneResponse) { processPitLaneResponse((PitLaneResponse)response); } else if (response instanceof PitStopResponse) { processPitStopResponse((PitStopResponse)response); } else if (response instanceof PitStopFinishedResponse) { processPitStopFinishedResponse((PitStopFinishedResponse)response); } } private void processPlayerPitResponse(PlayerPitsResponse response) { Race race = raceControl.getRace(); if (race.hasRaceEntry()) { Driver driver; try { driver = race.getRaceDriver(response); if (!race.hasFinished(driver)) { driver.addJoin(); } } catch (DriverNotFoundException e) { log.warn("driver not found: " + response.getPlayerId(), e); } } } private void processPitLaneResponse(PitLaneResponse response) { } private void processPitStopFinishedResponse(PitStopFinishedResponse response) { Race race = raceControl.getRace(); Driver driver; try { driver = race.getRaceDriver(response); if (!race.hasFinished(driver)) { Lap lap = driver.getCurrentLap(); lap.setPitStopTime(response.getStopTime().getTime()); } } catch (DriverNotFoundException e) { log.warn(e.getMessage()); } } private void processPitStopResponse(PitStopResponse response) { Race race = raceControl.getRace(); Driver driver; try { driver = race.getRaceDriver(response); if (!race.hasFinished(driver)) { Lap lap = driver.getCurrentLap(); lap.setPenalty(response.getPenalty()); lap.setNumberStops(response.getNumberOfPitstops()); org.openbakery.jinsim.types.Tyres insimTyres = response.getTyres(); lap.setTyres(new Tyres(insimTyres.getRearLeft(), insimTyres.getRearRight(), insimTyres.getFrontLeft(), insimTyres.getFrontRight())); lap.setWork(response.getWork()); lap.setPit(true); } } catch (DriverNotFoundException e) { log.warn(e.getMessage()); } } @Override public void destroy() { } }