Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,10 @@ java -jar filename-client.jar --server
- [X] (!) клиент НЕ должен самостоятельно вызывать что-либо в Game, он должен отправлять пакет и получать подтверждение
- [X] синхронизировать игровую карту (клиент отправляет параметры (GameData), сервер хавает)
- [X] если сервер НЕ должен возвращать карту, то пусть сервер передаст шанс рандома, чтобы клиент сам создал карту с таким рандомом.
- [ ] Перенести соло игру на интегрированный сервер.
- клиент инициализирует и запускает локальный сервер в GameScreen
- [ ] конфиг генерации мира с клиента должен
- [X] Перенести соло игру на интегрированный сервер.
- [X] клиент инициализирует и запускает локальный сервер в GameScreen
- [X] конфиг генерации мира с клиента должен применяться на сервере
- ? Оптимизации пакетов. ктож знает какие задержки могут быть вне локального сервера.
- [ ] НеЗабитьНеЗабитьНеЗабитьНеЗабитьНеЗабитьНеЗабитьНеЗабитьНеЗабитьНеЗабить
- [ ] Hello LibGDX!
- Javafx слишком много срёт на слабых устройствах и в целом не подходит для текущих целей. нужно переписать рендер:
Expand All @@ -48,11 +49,13 @@ java -jar filename-client.jar --server
- [X] `client.systems.<classname.toLowerCase().equals("render")>`
- [X] создать ветку и настроить `build.gradle.kts`.
- Баги/проблемы (исправить)
- [ ] Из-за написанного кода под javafx, на клиенте могут возникать проблемы с логикой из-за другой системы координат в libgdx, например, при просчёте логики полёта пуль, необходимо домножать скорость на размер тайлов.
- [ ] сервер не удаляет игрока, если он отключился
- [ ] клиент рендерит других игроков как врагов
- [ ] ui не масштабируется при изменении размера окна.

- ? Из-за написанного кода под javafx, на клиенте могут возникать проблемы с логикой из-за другой системы координат в libgdx, например, при просчёте логики полёта пуль, необходимо домножать скорость на размер тайлов.
- [X] сервер не удаляет игрока, если он отключился.
- [ ] клиент рендерит других игроков как врагов.
- [X] ui не масштабируется как надо при изменении размера окна.
- [ ] при очень высоких значениях fps плавное движение камеры менее заметно.
- [ ] Сделать возможность подключения к внешним серверам. Обезопасить интегрированный сервер от не локальных подключений.
- ! Вернуться к фазовым планам.
---

### Фаза 1: Фундамент и архитектура (done)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,24 @@ public static void main(String[] args) {
Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
try {
SettingsManager.loadSettings();
String[] parts = SettingsManager.getString(ClientSettings.RESOLUTION).split("x");

config.setWindowedMode(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]));
if (SettingsManager.getBoolean(ClientSettings.VSYNC)) {
config.useVsync(SettingsManager.getBoolean(ClientSettings.VSYNC));
} else {
}
if (SettingsManager.getBoolean(ClientSettings.FPS_LIMIT_ENABLED)) {
config.setForegroundFPS(SettingsManager.getInt(ClientSettings.FPS_LIMIT));
}

config.setIdleFPS(15);
config.setResizable(false);
config.setTitle("TheEndlessWeave");

new Lwjgl3Application(new Main(), config);
} catch (Throwable t) {
logError(t);
}
}
private static void logError(Throwable t) {
try (FileWriter fw = new FileWriter("CRASH_REPORT.txt", true)) {
try (FileWriter fw = new FileWriter("CRASH_REPORT.txt", false)) {
fw.write("\n=====================\n");
fw.write("Crash Date: " + LocalDateTime.now() + "\n");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.esotericsoftware.kryonet.Client;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener;
import xyz.samiker.theendlessweave.core.GameData;
import xyz.samiker.theendlessweave.core.network.NetworkRegister;
import xyz.samiker.theendlessweave.core.network.packets.PacketLoginRequest;
import xyz.samiker.theendlessweave.core.network.packets.PacketLoginResponse;
Expand Down Expand Up @@ -54,10 +55,16 @@ public void received(Connection connection, Object object) {
}
}
});
}

public void connect(String ip, GameData data, Consumer<PacketLoginResponse> onJoin) throws IOException {
connect(ip, onJoin);
PacketLoginRequest login = new PacketLoginRequest();
int m = 0;
login.mask = m |= PacketLoginRequest.HAS_GAMEDATA;
login.username = "Player";
client.sendTCP(login);
login.gameData = data;
sendTCP(login);
}

public void disconnect() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import xyz.samiker.theendlessweave.client.assets.ManifestAssetManager;
import xyz.samiker.theendlessweave.client.custom.InputManager;
import xyz.samiker.theendlessweave.client.network.GameClient;
import xyz.samiker.theendlessweave.client.settings.ClientSettings;
import xyz.samiker.theendlessweave.client.systems.*;
import xyz.samiker.theendlessweave.core.GameData;
import xyz.samiker.theendlessweave.core.entities.Entity;
Expand All @@ -26,7 +27,6 @@
import xyz.samiker.theendlessweave.core.logic.GameState;
import xyz.samiker.theendlessweave.core.logic.Loop;
import xyz.samiker.theendlessweave.core.network.packets.PacketLoginResponse;
import xyz.samiker.theendlessweave.client.settings.ClientSettings;
import xyz.samiker.theendlessweave.core.settings.SettingsManager;
import xyz.samiker.theendlessweave.server.ServerLauncher;

Expand All @@ -35,6 +35,7 @@
public class GameScreen implements Screen {

private final Main mainApp;
private GameData data;

private SpriteBatch batch;
private OrthographicCamera gameCamera;
Expand Down Expand Up @@ -63,6 +64,12 @@ public class GameScreen implements Screen {

private InputMultiplexer inputMultiplexer;

public GameScreen(Main mainApp, GameData data) {
this.mainApp = mainApp;
this.data = data;
this.assets = mainApp.getAssetManager();
}

public GameScreen(Main mainApp) {
this.mainApp = mainApp;
this.assets = mainApp.getAssetManager();
Expand Down Expand Up @@ -113,11 +120,8 @@ private void setupUI() {

uiStage.addActor(hudTable);

isMobile = !SettingsManager.getString(ClientSettings.CONTROL).equals("touch");// || Main.isMobile();
if (isMobile) {
setupMobileControls();
}
setupPauseMenu();
setupMobileControls();

debugLabel = new Label("", skin);
debugLabel.setPosition(10, Gdx.graphics.getHeight() / 2f);
Expand All @@ -126,31 +130,44 @@ private void setupUI() {
}

private void setupMobileControls() {
String controlMode = SettingsManager.getString(ClientSettings.CONTROL);
if ("auto".equals(controlMode)) {
controlMode = (Gdx.app.getType() == Application.ApplicationType.Android ||
Gdx.app.getType() == Application.ApplicationType.iOS)
? "mobile_aim_joystick" : "pc";
}

if ("pc".equals(controlMode)) return;

Touchpad.TouchpadStyle touchpadStyle = skin.get(Touchpad.TouchpadStyle.class);

moveStick = new Touchpad(10, touchpadStyle);
moveStick.setBounds(50, 50, 200, 200);
uiStage.addActor(moveStick);

aimStick = new Touchpad(10, touchpadStyle);
aimStick.setBounds(Gdx.graphics.getWidth() - 250, 50, 200, 200);
attackBtn = new TextButton("ATK", skin);
attackBtn.setSize(100, 100);
attackBtn.setPosition(Gdx.graphics.getWidth() - 150, Gdx.graphics.getHeight() - 300);
attackBtn.addListener(new ClickListener() {
@Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
InputManager.simulateMousePress(0);
return true;
}
@Override
public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
InputManager.simulateMouseRelease(0);
}
});
if (controlMode.equals("mobile_aim_joystick") || controlMode.equals("mobile_aim_all")) {
aimStick = new Touchpad(10, touchpadStyle);
aimStick.setBounds(Gdx.graphics.getWidth() - 250, 50, 200, 200);
uiStage.addActor(aimStick);
}

uiStage.addActor(moveStick);
uiStage.addActor(aimStick);
uiStage.addActor(attackBtn);
if (controlMode.equals("mobile_aim_button") || controlMode.equals("mobile_aim_all")) {
attackBtn = new TextButton("ATK", skin);
attackBtn.setSize(100, 100);
attackBtn.setPosition(Gdx.graphics.getWidth() - 150, controlMode.equals("mobile_aim_all") ? Gdx.graphics.getHeight() - 250 : 250);
attackBtn.addListener(new ClickListener() {
@Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
InputManager.simulateMousePress(Input.Buttons.LEFT);
return true;
}
@Override
public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
InputManager.simulateMouseRelease(Input.Buttons.LEFT);
}
});
uiStage.addActor(attackBtn);
}
}

private void updateUI() {
Expand Down Expand Up @@ -181,7 +198,8 @@ public void changed(ChangeEvent event, Actor actor) {
@Override
public void changed(ChangeEvent event, Actor actor) {
try {
if (client != null) client.disconnect();
dispose();
if (ServerLauncher.isIntegrated) ServerLauncher.shutdown();
mainApp.setScreen(new MainMenuScreen(mainApp));
} catch (Exception e) {
e.printStackTrace();
Expand All @@ -200,19 +218,27 @@ private void connectToServer() {
client = new GameClient();
new Thread(() -> {
try {
String[] args = new String[]{"--integrated"}; //TODO: я что-то хотел сделать с этим. ладно
String[] args = new String[]{"--integrated"};
ServerLauncher.main(args);
while (true) {
if (ServerLauncher.isStarted) break;

long startTime = System.currentTimeMillis();
while (!ServerLauncher.isStarted) {
Thread.sleep(100);
if (System.currentTimeMillis() - startTime > 10000) {
throw new IOException("Server start timeout");
}
}
client.connect("127.0.0.1", (response) -> {
client.connect("127.0.0.1", data, (response) -> {
Gdx.app.postRunnable(() -> initializeGameSession(response));
});
} catch (IOException e) {
ServerLauncher.shutdown();
Gdx.app.postRunnable(() -> {
loadingLabel.setText("Connection failed: " + e.getMessage());
});
e.printStackTrace();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}).start();
}
Expand Down Expand Up @@ -274,19 +300,21 @@ public void render(float delta) {
gameCamera.update();
batch.setProjectionMatrix(gameCamera.combined);

if (isMobile && moveStick != null && aimStick != null) {
if (isMobile) {
double deadzone = 0.3;
InputManager.handleAxis(moveStick.getKnobPercentX(), deadzone, Input.Keys.D, Input.Keys.A);
InputManager.handleAxis(moveStick.getKnobPercentY(), deadzone, Input.Keys.W, Input.Keys.S);

float aimX = aimStick.getKnobPercentX();
float aimY = aimStick.getKnobPercentY();

if (Math.abs(aimX) > deadzone || Math.abs(aimY) > deadzone) {
InputManager.setInputVector(aimX, aimY);
InputManager.simulateMousePress(Input.Buttons.LEFT);
} else {
InputManager.simulateMouseRelease(Input.Buttons.LEFT);
if (moveStick != null) {
InputManager.handleAxis(moveStick.getKnobPercentX(), deadzone, Input.Keys.D, Input.Keys.A);
InputManager.handleAxis(moveStick.getKnobPercentY(), deadzone, Input.Keys.W, Input.Keys.S);
}
if (aimStick != null) {
float aimX = aimStick.getKnobPercentX();
float aimY = aimStick.getKnobPercentY();
if (Math.abs(aimX) > deadzone || Math.abs(aimY) > deadzone) {
InputManager.setInputVector(aimX, aimY);
InputManager.simulateMousePress(Input.Buttons.LEFT);
} else {
InputManager.simulateMouseRelease(Input.Buttons.LEFT);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.badlogic.gdx.utils.ScreenUtils;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
import xyz.samiker.theendlessweave.Main;
import xyz.samiker.theendlessweave.core.GameData;
import xyz.samiker.theendlessweave.core.gamemap.MapGeneratorSettings;

import java.util.Random;
Expand Down Expand Up @@ -111,7 +112,7 @@ public void clicked(InputEvent event, float x, float y) {

content.add(new Label("Preset:", skin)).right();
presetComboBox = new SelectBox<>(skin);
presetComboBox.setItems("Default", "Diverse", "Hardcore", "Custom");
presetComboBox.setItems("Default", "Diverse", "Open", "Hardcore", "Custom");
presetComboBox.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
Expand Down Expand Up @@ -142,7 +143,7 @@ public void changed(ChangeEvent event, Actor actor) {
diffHard.addListener(diffListener);

content.add(new Label("Map Size:", skin)).right();
mapSizeSlider = new Slider(50, 500, 10, false, skin);
mapSizeSlider = new Slider(50, 2000, 10, false, skin);
mapSizeLabel = new Label("100x100", skin);
mapSizeSlider.addListener(new ChangeListener() {
@Override
Expand Down Expand Up @@ -264,6 +265,7 @@ private void loadPreset(String presetName) {
MapGeneratorSettings settings = switch (presetName) {
case "Diverse" -> MapGeneratorSettings.diverse();
case "Hardcore" -> MapGeneratorSettings.hardcore();
case "Open" -> MapGeneratorSettings.openMap();
case "Custom" -> null;
default -> MapGeneratorSettings.defaults();
};
Expand Down Expand Up @@ -339,14 +341,14 @@ private long getSeed() {
}

private void onStartGame() {
// MapGeneratorSettings settings = createSettingsFromUI();
// int width = parseInt(widthField.getText(), 100);
// int height = parseInt(heightField.getText(), 100);
// long seed = getSeed();
MapGeneratorSettings settings = createSettingsFromUI();
int width = parseInt(widthField.getText(), 100);
int height = parseInt(heightField.getText(), 100);
long seed = getSeed();

//GameData gameData = new GameData(settings, width, height, seed); //TODO: должен отправляться запрос на сервер с данным конфигом
GameData gameData = new GameData(settings, width <= 0 ? 100 : width, height <= 0 ? 100 : height, seed); //TODO: должен отправляться запрос на сервер с данным конфигом

game.setScreen(new GameScreen(game));
game.setScreen(new GameScreen(game, gameData));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ public void show() {

TextButton playBtn = new TextButton("Play", skin);
TextButton settingsBtn = new TextButton("Settings", skin);
TextButton devBtn = new TextButton("Dev Stage", skin);
TextButton exitBtn = new TextButton("Exit", skin);

playBtn.addListener(new ClickListener() {
Expand All @@ -52,13 +51,6 @@ public void clicked(InputEvent event, float x, float y) {
}
});

devBtn.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
game.setScreen(new GameScreen(game));
}
});

exitBtn.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
Expand All @@ -70,8 +62,6 @@ public void clicked(InputEvent event, float x, float y) {
table.row();
table.add(settingsBtn).fillX().uniformX().pad(10);
table.row();
table.add(devBtn).fillX().uniformX().pad(10);
table.row();
table.add(exitBtn).fillX().uniformX().pad(10);
}

Expand Down
Loading