diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java index 2dcc3d160c889bd6bcd90ee40bd22ff27210dd72..179b77c8c9530722dec84f08a00a2e170fe85dd9 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java @@ -10,15 +10,21 @@ import lombok.*; @Setter @Getter -@RequiredArgsConstructor(access = AccessLevel.PUBLIC) +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) public class ClientControllerCommunicator { + /** Singleton */ + private static ClientControllerCommunicator singleton = null; + /** * Client ship */ private Ship clientShip; + + /** + * OverWorld + */ private Overworld map; - private Planet currentPlanet; /** * Client class @@ -50,4 +56,14 @@ public class ClientControllerCommunicator { } return permittedLogin; } + + /** Constructor + * @param client - the client object, used to connect to server */ + public static ClientControllerCommunicator getInstance(Client client){ + if (singleton == null){ + singleton = new ClientControllerCommunicator(client); + } + // TODO CREATE ALL CONTROLLERS HERE + return singleton; + } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TravelController.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TravelController.java index 513a152f3b0c7144bf995fa293f65a33d124c773..85f240aeb289d96841e8567de587ac287e7baec3 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TravelController.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TravelController.java @@ -1,23 +1,55 @@ package com.galaxytrucker.galaxytruckerreloaded.Controller; +import com.galaxytrucker.galaxytruckerreloaded.Communication.ClientControllerCommunicator; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; +import com.galaxytrucker.galaxytruckerreloaded.Server.RequestObject; +import com.galaxytrucker.galaxytruckerreloaded.Server.RequestType; +import com.galaxytrucker.galaxytruckerreloaded.Server.ResponseObject; import lombok.*; +import java.util.List; + @Getter @Setter @RequiredArgsConstructor(access = AccessLevel.PUBLIC) public class TravelController extends Controller{ - /** - * My own ship - */ + + /** ClientControllerCommunicator */ @NonNull - private Ship myself; + private ClientControllerCommunicator clientControllerCommunicator; /** * travels from one location to another * @param destination - the destination */ - public void travel(Planet destination){ + public boolean travel(Planet destination){ + try { + RequestObject requestObject = new RequestObject(); + requestObject.setRequestType(RequestType.HYPERJUMP); + requestObject.setShip(clientControllerCommunicator.getClientShip()); + requestObject.setPlanet(destination); + ResponseObject object = clientControllerCommunicator.sendRequest(requestObject); + if (object.isValidRequest()){ + Ship s = clientControllerCommunicator.getClientShip(); + // Remove ship from planet + List<Ship> currentShips = s.getPlanet().getShips(); + currentShips.remove(s); + s.getPlanet().setShips(currentShips); + // Set ship to target planet + s.setPlanet(destination); + // Set planet ship list + currentShips = destination.getShips(); + currentShips.add(s); + destination.setShips(currentShips); + clientControllerCommunicator.setClientShip(s); + return true; + } + return false; + } + catch (Exception e){ + e.printStackTrace(); + return false; + } } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java index 9ce1b5b0712c2b7bc62d1d90ad920ea73eb7bfcd..f9913f0b72cfbf4b4e85040f9163a39d37fd65a3 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java @@ -8,8 +8,9 @@ import lombok.Setter; import java.io.*; import java.net.Socket; -import java.util.UUID; +import java.util.*; +/** Handle each client in a separate thread */ public class ClientHandler implements Runnable { /** @@ -59,7 +60,9 @@ public class ClientHandler implements Runnable { @Setter private boolean gameActive = true; - /** Map seed */ + /** + * Map seed + */ private int seed; /** @@ -67,6 +70,23 @@ public class ClientHandler implements Runnable { */ private User user; + /** + * Planet name array + */ + private String[] names = {"MERCURY", "VENUS", "EARTH", "MARS", "JUPITER", "SATURN", "URANUS", "NEPTUN", "PLUTO", "AUGUSTUS", + "SIRIUS", "HOMESTREAD", "ALPHA CENTAURI", "GLIESE", "404 NOT FOUND", "KEPLER", "TOI", "USCO1621b","OGLE","WASP","WENDELSTEIN" + ,"EPIC","ARION","DIMIDIUM","GALILEO","DAGON","SMETRIOS","THESTIAS","SAMH","SAFFAR","ARBER","MADRIU","AWASIS","DITSO"}; + + /** + * Planet name list + */ + private List<String> planetNames; + + /** + * Used planet names list + */ + private List<String> usedPlanetNames = new ArrayList<>(); + /** * Constructor * @@ -94,6 +114,7 @@ public class ClientHandler implements Runnable { @Override public void run() { System.out.println("\n========== HANDLER RUNNING ==========\n"); + planetNames.addAll(Arrays.asList(names)); // ==================== LOGIN ==================== try { this.username = receive.readLine().replace("[LOGIN]:", ""); @@ -106,6 +127,7 @@ public class ClientHandler implements Runnable { this.user = serverServiceCommunicator.getUserService().getUser(username); if (user.isFirstGame()) { send.println("[NEW-GAME]"); + // ==================== Overworld Creation ==================== Overworld overworld = new Overworld(UUID.randomUUID().hashCode(), UUID.randomUUID().hashCode(), username); this.seed = overworld.getSeed(); //TODO PLANET CREATION, ADD TO OVERWORLD @@ -145,7 +167,6 @@ public class ClientHandler implements Runnable { e.printStackTrace(); send.println("[EXCEPTION]:[NEW-GAME]:[USERNAME]:" + username); } - // ==================== RUNNING ==================== while (gameActive) { sendObject.writeObject(this.serverServiceCommunicator.getResponse((RequestObject) receiveObject.readObject())); @@ -153,7 +174,31 @@ public class ClientHandler implements Runnable { } } catch (Exception e) { e.printStackTrace(); - send.println("[EXCEPTION]:[LOGIN]:[USERNAME]:" + username); + // Socket will be closed thanks to exception, therefor cannot send more data + // Thread will terminate with socket exception + try { + send.println("[EXCEPTION]:[LOGIN]:[USERNAME]:" + username); + } + catch (Exception f){ + f.printStackTrace(); + } + } + } + + /** + * Get a new planet name + * + * @param names - planet names + * @param usedNames - the already used planet names + * @param seed - the world seed + * @return an unused planet name + */ + private String getPlanetName(List<String> names, List<String> usedNames, int seed) { + Random random = new Random(seed); + String newName = names.get(random.nextInt(names.size())); + if (usedNames.contains(newName)) { + getPlanetName(names, usedNames, seed); } + return newName; } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java index 4f9b348ec85a45810b2e0cab210c63358d0550d1..d1f2aa3687296a06be7a8aa7b9003011b19af71f 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java @@ -5,6 +5,7 @@ import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Trader; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import lombok.Getter; +import lombok.NonNull; import lombok.Setter; import java.util.List; diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java index 95278256c1b1cd77126b47b1156cde45e4673874..035f8288b10e8dec3ce57e1092e22f53e737a66d 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java @@ -2,5 +2,5 @@ package com.galaxytrucker.galaxytruckerreloaded.Server; /** Type of request sent to the server */ public enum RequestType { - LOGOUT + LOGOUT, HYPERJUMP } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java index 04fddf52a552de0ac212c72fb98284b1f5b88433..c3c01d46db3cac1db6d5c43411d700f6a73be623 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java @@ -1,9 +1,11 @@ package com.galaxytrucker.galaxytruckerreloaded.Server; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import com.galaxytrucker.galaxytruckerreloaded.Model.User; import com.galaxytrucker.galaxytruckerreloaded.Server.Exception.UserNotFoundException; +import com.galaxytrucker.galaxytruckerreloaded.Server.Services.TravelService; import com.galaxytrucker.galaxytruckerreloaded.Server.Services.UserService; import lombok.AccessLevel; import lombok.Getter; @@ -20,13 +22,25 @@ public class ServerServiceCommunicator { /** User service */ private UserService userService = new UserService(); + /** TravelService */ + private TravelService travelService = new TravelService(); + /** Take a request from the client side, pass it through the services * and return a response * @return the server's response to the client's request */ - public String getResponse(RequestObject request){ + public ResponseObject getResponse(RequestObject request){ + switch (request.getRequestType()){ + case LOGOUT: + return logout(request.getShip().getAssociatedUser()); + case HYPERJUMP: + return jump(request.getShip(),request.getPlanet()); + //TODO OTHERS + } return null; } + // ==================================== USER SERVICE ==================================== + /** Send the client his ship * @param username - the client's username * @return the client's ship */ @@ -52,6 +66,9 @@ public class ServerServiceCommunicator { catch (Exception e){ System.out.println("[NEW-USER]:[USERNAME]:"+username); try { + if (username.isEmpty() || username.equals("[ENEMY]")){ + return true; + } userService.addUser(username); return false; } @@ -62,6 +79,52 @@ public class ServerServiceCommunicator { } } + /** Logout + * @param username - the client's username + * @return ResponseObject with either an accepted or aborted logout */ + private ResponseObject logout(String username){ + ResponseObject responseObject = new ResponseObject(); + try { + User u = userService.getUser(username); + if (u.isLoggedIn()) { + if (!u.getUserShip().isInCombat()) { + u.setLoggedIn(false); + userService.updateUser(u); + responseObject.setValidRequest(true); + } + } + } + catch (Exception e){ + e.printStackTrace(); + responseObject.setValidRequest(false); + } + return responseObject; + } + + // ==================================== TRAVEL SERVICE ==================================== + + /** Make a jump to a target planet + * @param s - the client ship + * @param p - the target planet + * @return a ResponseObject */ + private ResponseObject jump(Ship s, Planet p){ + ResponseObject responseObject = new ResponseObject(); + try { + if (travelService.validateJump(s, p,userService.getUser(s.getAssociatedUser()))) { + boolean successfulJump = travelService.jump(s, p); + if (successfulJump) { + responseObject.setValidRequest(true); + } + } + } + catch (Exception e){ + e.printStackTrace(); + } + return responseObject; + } + + // ======================================================================================== + /** Get instance */ public static ServerServiceCommunicator getInstance(){ if (serverServiceCommunicator == null){ diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TravelService.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TravelService.java index a6ee545a97007700e3e686b52f99be1a6960392a..b6d496d9b255ff104c2030cb130a4c5ab0f03dd6 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TravelService.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TravelService.java @@ -2,33 +2,100 @@ package com.galaxytrucker.galaxytruckerreloaded.Server.Services; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; +import com.galaxytrucker.galaxytruckerreloaded.Model.User; import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.PlanetDAO; import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.ShipDAO; import lombok.*; -/** Used to move user from one star to another */ -@RequiredArgsConstructor(access = AccessLevel.PUBLIC) +import java.util.List; + +/** + * Used to move user from one star to another + */ +@NoArgsConstructor(access = AccessLevel.PUBLIC) @Getter @Setter public class TravelService { - /** ShipDAO */ - @NonNull - private ShipDAO shipDAO; + /** + * ShipDAO + */ + private ShipDAO shipDAO = new ShipDAO(); - /** PlanetDAO */ - @NonNull - private PlanetDAO planetDAO; + /** + * PlanetDAO + */ + private PlanetDAO planetDAO = new PlanetDAO(); - /** Validate the travel request - * @param s - the ship that wisches to travel - * @return true if the travel request is valid */ - public boolean validateJump(Ship s){ - return false; + /** + * Validate the travel request + * + * @param s - the ship that wishes to travel + * @param p - the destination planet + * @return true if the travel request is valid + */ + public boolean validateJump(Ship s, Planet p, User u) { + try { + if (u.getOverworld().getPlanetMap().containsValue(p)) { + return !s.getPlanet().equals(p) && s.getFTLCharge() == 100; + } + return false; + } catch (Exception e) { + e.printStackTrace(); + return false; + } } - /** Jump ship from one star to another - * @param s - the ship to jump - * @param dest - the destination star */ - public void jump(Ship s, Planet dest){} + /** + * Jump ship from one star to another + * + * @param s - the ship to jump + * @param dest - the destination star + */ + public boolean jump(Ship s, Planet dest) { + try { + Planet current = s.getPlanet(); + try { + // Remove ship from current planet + List<Ship> ships = current.getShips(); + ships.remove(s); + current.setShips(ships); + planetDAO.update(current); + // Set ship to target planet + s.setPlanet(dest); + shipDAO.update(s); + // Update target planet + ships = dest.getShips(); + ships.add(s); + dest.setShips(ships); + planetDAO.update(dest); + return true; + } catch (Exception e) { + e.printStackTrace(); + // Revert charnges + try { + // Revert current planet + List<Ship> ships = current.getShips(); + ships.add(s); + current.setShips(ships); + planetDAO.update(current); + // Revert ship + s.setPlanet(current); + shipDAO.update(s); + // Revert target planet + ships = dest.getShips(); + ships.remove(s); + dest.setShips(ships); + planetDAO.update(dest); + } catch (Exception f) { + f.printStackTrace(); + } + return false; + } + } + catch (Exception g){ + g.printStackTrace(); + return false; + } + } }