diff --git a/flatbuffers-compiler/bin/flatc.exe b/flatbuffers-compiler/bin/flatc.exe
new file mode 100644
index 00000000..38563fd3
Binary files /dev/null and b/flatbuffers-compiler/bin/flatc.exe differ
diff --git a/flatbuffers-compiler/bin/linux/flatc.zip b/flatbuffers-compiler/bin/linux/flatc.zip
new file mode 100644
index 00000000..ef1b8cb3
Binary files /dev/null and b/flatbuffers-compiler/bin/linux/flatc.zip differ
diff --git a/flatbuffers-compiler/bin/osx/flatc.zip b/flatbuffers-compiler/bin/osx/flatc.zip
new file mode 100644
index 00000000..3e489556
Binary files /dev/null and b/flatbuffers-compiler/bin/osx/flatc.zip differ
diff --git a/flatbuffers-compiler/bin/windows/flatc.zip b/flatbuffers-compiler/bin/windows/flatc.zip
new file mode 100644
index 00000000..368e5d24
Binary files /dev/null and b/flatbuffers-compiler/bin/windows/flatc.zip differ
diff --git a/flatbuffers-compiler/example/src/main/java/example/Color.java b/flatbuffers-compiler/example/src/main/java/example/Color.java
new file mode 100644
index 00000000..fbe57998
--- /dev/null
+++ b/flatbuffers-compiler/example/src/main/java/example/Color.java
@@ -0,0 +1,16 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package example;
+
+@SuppressWarnings("unused")
+public final class Color {
+ private Color() { }
+ public static final byte Red = 0;
+ public static final byte Green = 1;
+ public static final byte Blue = 2;
+
+ public static final String[] names = { "Red", "Green", "Blue", };
+
+ public static String name(int e) { return names[e]; }
+}
+
diff --git a/flatbuffers-compiler/example/src/main/java/example/Equipment.java b/flatbuffers-compiler/example/src/main/java/example/Equipment.java
new file mode 100644
index 00000000..3a022d17
--- /dev/null
+++ b/flatbuffers-compiler/example/src/main/java/example/Equipment.java
@@ -0,0 +1,15 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package example;
+
+@SuppressWarnings("unused")
+public final class Equipment {
+ private Equipment() { }
+ public static final byte NONE = 0;
+ public static final byte Weapon = 1;
+
+ public static final String[] names = { "NONE", "Weapon", };
+
+ public static String name(int e) { return names[e]; }
+}
+
diff --git a/flatbuffers-compiler/example/src/main/java/example/Monster.java b/flatbuffers-compiler/example/src/main/java/example/Monster.java
new file mode 100644
index 00000000..46e6b7f0
--- /dev/null
+++ b/flatbuffers-compiler/example/src/main/java/example/Monster.java
@@ -0,0 +1,69 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package example;
+
+import java.nio.*;
+import java.lang.*;
+import java.util.*;
+import com.google.flatbuffers.*;
+
+@SuppressWarnings("unused")
+public final class Monster extends Table {
+ public static void ValidateVersion() { Constants.FLATBUFFERS_2_0_8(); }
+ public static Monster getRootAsMonster(ByteBuffer _bb) { return getRootAsMonster(_bb, new Monster()); }
+ public static Monster getRootAsMonster(ByteBuffer _bb, Monster obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
+ public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
+ public Monster __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
+
+ public example.Vec3 pos() { return pos(new example.Vec3()); }
+ public example.Vec3 pos(example.Vec3 obj) { int o = __offset(4); return o != 0 ? obj.__assign(o + bb_pos, bb) : null; }
+ public short mana() { int o = __offset(6); return o != 0 ? bb.getShort(o + bb_pos) : 150; }
+ public short hp() { int o = __offset(8); return o != 0 ? bb.getShort(o + bb_pos) : 100; }
+ public String name() { int o = __offset(10); return o != 0 ? __string(o + bb_pos) : null; }
+ public ByteBuffer nameAsByteBuffer() { return __vector_as_bytebuffer(10, 1); }
+ public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 10, 1); }
+ public int inventory(int j) { int o = __offset(14); return o != 0 ? bb.get(__vector(o) + j * 1) & 0xFF : 0; }
+ public int inventoryLength() { int o = __offset(14); return o != 0 ? __vector_len(o) : 0; }
+ public ByteVector inventoryVector() { return inventoryVector(new ByteVector()); }
+ public ByteVector inventoryVector(ByteVector obj) { int o = __offset(14); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
+ public ByteBuffer inventoryAsByteBuffer() { return __vector_as_bytebuffer(14, 1); }
+ public ByteBuffer inventoryInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 14, 1); }
+ public byte color() { int o = __offset(16); return o != 0 ? bb.get(o + bb_pos) : 2; }
+ public example.Weapon weapons(int j) { return weapons(new example.Weapon(), j); }
+ public example.Weapon weapons(example.Weapon obj, int j) { int o = __offset(18); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }
+ public int weaponsLength() { int o = __offset(18); return o != 0 ? __vector_len(o) : 0; }
+ public example.Weapon.Vector weaponsVector() { return weaponsVector(new example.Weapon.Vector()); }
+ public example.Weapon.Vector weaponsVector(example.Weapon.Vector obj) { int o = __offset(18); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }
+ public byte equippedType() { int o = __offset(20); return o != 0 ? bb.get(o + bb_pos) : 0; }
+ public Table equipped(Table obj) { int o = __offset(22); return o != 0 ? __union(obj, o + bb_pos) : null; }
+
+ public static void startMonster(FlatBufferBuilder builder) { builder.startTable(10); }
+ public static void addPos(FlatBufferBuilder builder, int posOffset) { builder.addStruct(0, posOffset, 0); }
+ public static void addMana(FlatBufferBuilder builder, short mana) { builder.addShort(1, mana, 150); }
+ public static void addHp(FlatBufferBuilder builder, short hp) { builder.addShort(2, hp, 100); }
+ public static void addName(FlatBufferBuilder builder, int nameOffset) { builder.addOffset(3, nameOffset, 0); }
+ public static void addInventory(FlatBufferBuilder builder, int inventoryOffset) { builder.addOffset(5, inventoryOffset, 0); }
+ public static int createInventoryVector(FlatBufferBuilder builder, byte[] data) { return builder.createByteVector(data); }
+ public static int createInventoryVector(FlatBufferBuilder builder, ByteBuffer data) { return builder.createByteVector(data); }
+ public static void startInventoryVector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); }
+ public static void addColor(FlatBufferBuilder builder, byte color) { builder.addByte(6, color, 2); }
+ public static void addWeapons(FlatBufferBuilder builder, int weaponsOffset) { builder.addOffset(7, weaponsOffset, 0); }
+ public static int createWeaponsVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }
+ public static void startWeaponsVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }
+ public static void addEquippedType(FlatBufferBuilder builder, byte equippedType) { builder.addByte(8, equippedType, 0); }
+ public static void addEquipped(FlatBufferBuilder builder, int equippedOffset) { builder.addOffset(9, equippedOffset, 0); }
+ public static int endMonster(FlatBufferBuilder builder) {
+ int o = builder.endTable();
+ return o;
+ }
+ public static void finishMonsterBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset); }
+ public static void finishSizePrefixedMonsterBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset); }
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public Monster get(int j) { return get(new Monster(), j); }
+ public Monster get(Monster obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
+}
+
diff --git a/flatbuffers-compiler/example/src/main/java/example/Vec3.java b/flatbuffers-compiler/example/src/main/java/example/Vec3.java
new file mode 100644
index 00000000..890bb2b2
--- /dev/null
+++ b/flatbuffers-compiler/example/src/main/java/example/Vec3.java
@@ -0,0 +1,34 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package example;
+
+import java.nio.*;
+import java.lang.*;
+import java.util.*;
+import com.google.flatbuffers.*;
+
+@SuppressWarnings("unused")
+public final class Vec3 extends Struct {
+ public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
+ public Vec3 __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
+
+ public float x() { return bb.getFloat(bb_pos + 0); }
+ public float y() { return bb.getFloat(bb_pos + 4); }
+ public float z() { return bb.getFloat(bb_pos + 8); }
+
+ public static int createVec3(FlatBufferBuilder builder, float x, float y, float z) {
+ builder.prep(4, 12);
+ builder.putFloat(z);
+ builder.putFloat(y);
+ builder.putFloat(x);
+ return builder.offset();
+ }
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public Vec3 get(int j) { return get(new Vec3(), j); }
+ public Vec3 get(Vec3 obj, int j) { return obj.__assign(__element(j), bb); }
+ }
+}
+
diff --git a/flatbuffers-compiler/example/src/main/java/example/Weapon.java b/flatbuffers-compiler/example/src/main/java/example/Weapon.java
new file mode 100644
index 00000000..4d22ba24
--- /dev/null
+++ b/flatbuffers-compiler/example/src/main/java/example/Weapon.java
@@ -0,0 +1,47 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package example;
+
+import java.nio.*;
+import java.lang.*;
+import java.util.*;
+import com.google.flatbuffers.*;
+
+@SuppressWarnings("unused")
+public final class Weapon extends Table {
+ public static void ValidateVersion() { Constants.FLATBUFFERS_2_0_8(); }
+ public static Weapon getRootAsWeapon(ByteBuffer _bb) { return getRootAsWeapon(_bb, new Weapon()); }
+ public static Weapon getRootAsWeapon(ByteBuffer _bb, Weapon obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
+ public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
+ public Weapon __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
+
+ public String name() { int o = __offset(4); return o != 0 ? __string(o + bb_pos) : null; }
+ public ByteBuffer nameAsByteBuffer() { return __vector_as_bytebuffer(4, 1); }
+ public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 4, 1); }
+ public short damage() { int o = __offset(6); return o != 0 ? bb.getShort(o + bb_pos) : 0; }
+
+ public static int createWeapon(FlatBufferBuilder builder,
+ int nameOffset,
+ short damage) {
+ builder.startTable(2);
+ Weapon.addName(builder, nameOffset);
+ Weapon.addDamage(builder, damage);
+ return Weapon.endWeapon(builder);
+ }
+
+ public static void startWeapon(FlatBufferBuilder builder) { builder.startTable(2); }
+ public static void addName(FlatBufferBuilder builder, int nameOffset) { builder.addOffset(0, nameOffset, 0); }
+ public static void addDamage(FlatBufferBuilder builder, short damage) { builder.addShort(1, damage, 0); }
+ public static int endWeapon(FlatBufferBuilder builder) {
+ int o = builder.endTable();
+ return o;
+ }
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public Weapon get(int j) { return get(new Weapon(), j); }
+ public Weapon get(Weapon obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
+}
+
diff --git a/flatbuffers-compiler/pom.xml b/flatbuffers-compiler/pom.xml
new file mode 100644
index 00000000..eb472547
--- /dev/null
+++ b/flatbuffers-compiler/pom.xml
@@ -0,0 +1,59 @@
+
+ 4.0.0
+
+ com.github.davidmoten
+ flatbuffers-parent
+ 2.0.9-SNAPSHOT
+
+ flatbuffers-compiler
+ pom
+ Compressed archive of binaries for flatbuffers particularly flatc for generating classes. Multiple platforms supported vi different classifications.
+
+
+
+
+ maven-antrun-plugin
+ 3.1.0
+
+
+ generate-resources
+
+
+
+
+
+
+
+
+
+
+
+ run
+
+
+
+
+
+ maven-assembly-plugin
+ 3.5.0
+
+
+ src/assembly/linux.xml
+ src/assembly/osx.xml
+ src/assembly/windows.xml
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
+
+
diff --git a/flatbuffers-compiler/src/assembly/linux.xml b/flatbuffers-compiler/src/assembly/linux.xml
new file mode 100644
index 00000000..6225dff5
--- /dev/null
+++ b/flatbuffers-compiler/src/assembly/linux.xml
@@ -0,0 +1,16 @@
+
+ distribution-linux
+ false
+
+ tar.gz
+
+
+
+ ${project.build.directory}/linux
+ /bin
+
+
+
diff --git a/flatbuffers-compiler/src/assembly/osx.xml b/flatbuffers-compiler/src/assembly/osx.xml
new file mode 100644
index 00000000..477c86e1
--- /dev/null
+++ b/flatbuffers-compiler/src/assembly/osx.xml
@@ -0,0 +1,16 @@
+
+ distribution-osx
+ false
+
+ tar.gz
+
+
+
+ ${project.build.directory}/osx
+ /bin
+
+
+
diff --git a/flatbuffers-compiler/src/assembly/windows.xml b/flatbuffers-compiler/src/assembly/windows.xml
new file mode 100644
index 00000000..13200375
--- /dev/null
+++ b/flatbuffers-compiler/src/assembly/windows.xml
@@ -0,0 +1,16 @@
+
+ distribution-windows
+ false
+
+ zip
+
+
+
+ ${project.build.directory}/windows
+ /bin
+
+
+
diff --git a/pom.xml b/pom.xml
index 8fd0476c..924c7f10 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,6 +14,9 @@
UTF-8
5.8.2
1.8.10
+
+ ${basedir}/src/main/fbs
+ ${project.build.directory}/generated-sources/java
@@ -48,6 +51,13 @@
+
+
+ com.google.flatbuffers
+ flatbuffers-java
+ 2.0.8
+
+
org.junit.jupiter
junit-jupiter-api
@@ -80,6 +90,13 @@
+
+
+ kr.motd.maven
+ os-maven-plugin
+ 1.7.1
+
+
org.openjfx
@@ -102,6 +119,77 @@
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+ 2.10
+
+
+ unpack
+ generate-sources
+
+ unpack
+
+
+
+
+ com.github.davidmoten
+ flatbuffers-compiler
+ 2.0.3.1
+ tar.gz
+ distribution-linux
+ true
+ ${project.build.directory}
+
+
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 1.6.0
+
+
+
+ exec
+
+ generate-sources
+
+
+
+ ${project.build.directory}/bin/flatc
+ ${fbs.sources}
+
+ --java
+ --gen-mutable
+ -o
+ ${fbs.generated.sources}
+ monster.fbs
+
+
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+ 3.1.0
+
+
+ add-source
+ generate-sources
+
+ add-source
+
+
+
+ ${fbs.generated.sources}
+
+
+
+
+
org.jacoco
diff --git a/src/main/fbs/spawn.fbs b/src/main/fbs/spawn.fbs
new file mode 100644
index 00000000..b1fd0864
--- /dev/null
+++ b/src/main/fbs/spawn.fbs
@@ -0,0 +1,19 @@
+include "update.fbs";
+//Данные для обновления состояния объектов
+namespace ru.nsu.fit.dib.projectdib.flatbuffersclasses.generated;
+
+enum ActionStatus:byte{ CREATED=0, // для клиента
+ APPROVED=1, // принят сервером или им создан
+ REFUSED=2 // отказано
+ }
+table NewEntityData{
+ type:string;//В будущем лучше раздать id всем Entity которые спавнятся на фабриках
+ seed:int;
+ state:EntityStateData;
+}
+
+table SpawnActionData {
+ data:NewEntityData;
+}
+
+root_type SpawnActionData;
\ No newline at end of file
diff --git a/src/main/fbs/update.fbs b/src/main/fbs/update.fbs
new file mode 100644
index 00000000..0f6e6788
--- /dev/null
+++ b/src/main/fbs/update.fbs
@@ -0,0 +1,21 @@
+//./flatc.exe -j -o <куда> <*.fbs>
+//Данные для обновления состояния объектов
+namespace ru.nsu.fit.dib.projectdib.flatbuffersclasses.generated;
+
+struct Point2D {
+ x:double;
+ y:double;
+}
+
+table EntityStateData {
+ id:int;
+ pos:Point2D;
+ rot:Point2D;
+ active_weapon:int;
+}
+
+table EntityStateDataList{
+ list:[EntityStateData];
+}
+
+root_type EntityStateDataList;
\ No newline at end of file
diff --git a/src/main/java/ru/nsu/fit/dib/projectdib/App.java b/src/main/java/ru/nsu/fit/dib/projectdib/App.java
index 15b88f0d..52c61c02 100644
--- a/src/main/java/ru/nsu/fit/dib/projectdib/App.java
+++ b/src/main/java/ru/nsu/fit/dib/projectdib/App.java
@@ -3,18 +3,11 @@
import com.almasb.fxgl.app.GameApplication;
import com.almasb.fxgl.app.GameSettings;
import com.almasb.fxgl.entity.Entity;
-import java.net.InetSocketAddress;
-import java.util.List;
import ru.nsu.fit.dib.projectdib.initapp.GameInitializer;
import ru.nsu.fit.dib.projectdib.initapp.InputListener;
import ru.nsu.fit.dib.projectdib.initapp.PhysicsLoader;
import ru.nsu.fit.dib.projectdib.initapp.SettingsLoader;
-import ru.nsu.fit.dib.projectdib.newMultiplayer.config.ClientConfig;
-import ru.nsu.fit.dib.projectdib.newMultiplayer.config.ServerConfig;
-import ru.nsu.fit.dib.projectdib.newMultiplayer.context.client.MCClient;
-import ru.nsu.fit.dib.projectdib.newMultiplayer.context.server.MCServer;
-import ru.nsu.fit.dib.projectdib.newMultiplayer.threads.ClientThread;
-import ru.nsu.fit.dib.projectdib.newMultiplayer.threads.ServerThread;
+
/**
* Основной класс игры.
@@ -69,29 +62,44 @@ protected void initPhysics() {
protected void onPreInit() {
}
+
/**
* Инициализация игры.
*/
@Override
protected void initGame() {
-
- ServerConfig.init();
- ClientConfig.init();
- ServerConfig.addClientAddresses(List.of(new InetSocketAddress("localhost", 9090)));
- ServerThread serverThread = new ServerThread(MCServer.getReceiver(), MCServer.getSender(), MCServer.getClientAddresses());
- ServerConfig.addServerThread(serverThread);
-
- ClientConfig.addServerAddress(new InetSocketAddress("localhost", 8080));
- ClientThread clientThread = new ClientThread(MCClient.getReceiver(), MCClient.getSender(), MCClient.getServerAddress());
- ClientConfig.addClientThread(clientThread);
-
- serverThread.start();
- clientThread.start();
-
-
+ /*
+ switch (gameMode){
+ case SERVER, SINGLE -> {
+ ServerSocket serverSocket;
+ Map clientSockets = new HashMap<>();
+ try {
+ serverSocket = new ServerSocket(8080);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ try {
+ System.out.println("Подключение");
+ new Thread(()->initClient("localhost")).start();
+ for (int i = 1; i < 3; i++) {
+ Socket client = serverSocket.accept();
+ //отправляем клиенту его id
+ client.getOutputStream().write(i);
+ clientSockets.put(i, client);
+ new ServerReceiverThread(client).start();
+ System.out.println("Подключено");
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ ServerConfig.addClientSockets(clientSockets);
+ ServerConfig.init();
+ }
+ case CLIENT -> initClient("192.168.43.8");
+ }*/
GameInitializer gameInitializer = new GameInitializer();
gameInitializer.run();
inputListener.initialize(gameInitializer.getPlayer());
- player=gameInitializer.getPlayer();
+ player = gameInitializer.getPlayer();
}
}
diff --git a/src/main/java/ru/nsu/fit/dib/projectdib/Factory.java b/src/main/java/ru/nsu/fit/dib/projectdib/Factory.java
index 47d6a6f6..cb09e382 100644
--- a/src/main/java/ru/nsu/fit/dib/projectdib/Factory.java
+++ b/src/main/java/ru/nsu/fit/dib/projectdib/Factory.java
@@ -26,6 +26,7 @@
import com.almasb.fxgl.texture.AnimatedTexture;
import com.almasb.fxgl.texture.AnimationChannel;
import com.almasb.fxgl.ui.ProgressBar;
+import com.fasterxml.jackson.databind.node.ObjectNode;
import javafx.geometry.Point2D;
import javafx.geometry.Rectangle2D;
import javafx.scene.image.Image;
@@ -37,6 +38,7 @@
import ru.nsu.fit.dib.projectdib.data.ProjectConfig;
import ru.nsu.fit.dib.projectdib.data.RandomCharacterSystem;
import ru.nsu.fit.dib.projectdib.entity.components.CreatureComponent;
+import ru.nsu.fit.dib.projectdib.entity.components.DataComponent;
import ru.nsu.fit.dib.projectdib.entity.components.HeroComponent;
import ru.nsu.fit.dib.projectdib.entity.creatures.Creature;
import ru.nsu.fit.dib.projectdib.entity.components.PlayerChaseComponent;
@@ -52,6 +54,7 @@
import ru.nsu.fit.dib.projectdib.entity.weapons.WeaponFactory.Weapons;
import ru.nsu.fit.dib.projectdib.entity.weapons.enums.modules.TextureModule;
import ru.nsu.fit.dib.projectdib.entity.weapons.enums.modules.WeaponModule;
+import ru.nsu.fit.dib.projectdib.newMultiplayer.context.client.MCClient;
/**
* Class Factory for making Entities.
@@ -61,37 +64,46 @@ public class Factory implements EntityFactory {
/**
* Creates Hero and heroes weapon.
*
- * @param heroType type of hero
- * @param position position
+ * @param heroType type of hero
+ * @param position position
* @param isClientHero true if client hero
- * @param seed hero seed
+ * @param seed hero seed
* @return pair of entity Hero and Weapon
*/
- public static Pair spawnHero(HeroType heroType,Point2D position, Boolean isClientHero,Integer seed){
+ public static Entity spawnHero(HeroType heroType, Point2D position, Boolean isClientHero,
+ Integer id, Integer seed) {
SpawnData sd = new SpawnData(position);
- sd.put("clientHero",isClientHero);
- sd.put("creature", HeroesFactory.newHero(heroType,seed));
+ sd.put("owner", id);
+ sd.put("creature", HeroesFactory.newHero(heroType, seed));
+ sd.put("id", id);
Entity hero = spawn("player", sd);
hero.setScaleUniform(0.75);
- SpawnData weaponSD = new SpawnData(position);
- weaponSD.put("weapon", hero.getComponent(HeroComponent.class).getCreature().getModule(
- CreatureWeaponModule.class).getActiveWeapon());
- Entity weapon = spawn("weapon",weaponSD);
- return new Pair<>(hero,weapon);
+ return hero;
+ }
+
+ public static Entity spawnStandardWeapon(Integer id, Integer ownerID, Entity bindedEntity) {
+ SpawnData sd = new SpawnData(bindedEntity.getPosition());
+ sd.put("id", id);
+ sd.put("owner", ownerID);
+ sd.put("weapon", bindedEntity.getComponent(HeroComponent.class).getCreature()
+ .getModule(CreatureWeaponModule.class).getActiveWeapon());
+ return spawn("weapon", sd);
}
/**
* Creates weapon.
*
* @param weaponType type of weapon
- * @param position position
+ * @param position position
* @return weapon entity
*/
- public static Entity spawnWeapon(Weapons weaponType,Point2D position){
+ public static Entity spawnWeapon(Weapons weaponType, Point2D position, Integer id) {
SpawnData sd = new SpawnData(position);
+ sd.put("id", id);
sd.put("weapon", WeaponFactory.getWeapon(weaponType));
return spawn("weapon", sd);
}
+
/**
* Entity Player.
*
@@ -101,15 +113,24 @@ public static Entity spawnWeapon(Weapons weaponType,Point2D position){
@Spawns("player")
public Entity newPlayer(SpawnData data) {
Creature creature = data.get("creature");
+
PhysicsComponent physics = new PhysicsComponent();
physics.setBodyType(BodyType.DYNAMIC);
physics.setFixtureDef(new FixtureDef().friction(0.3f));
- HeroComponent heroComponent = new HeroComponent(creature,new Point2D(50,180));
- if (data.get("clientHero")) heroComponent.bindDirectionView(entity -> getInput().getVectorToMouse(entity.getPosition().add(new Point2D(80, 160))));
- else heroComponent.bindDirectionView(entity ->new Point2D(0,0));
+
+ HeroComponent heroComponent = new HeroComponent(creature, new Point2D(50, 180));
+ if (data.get("owner") == MCClient.getClientId()) {
+ heroComponent.bindDirectionView(
+ entity -> getInput().getVectorToMouse(entity.getPosition().add(new Point2D(80, 160))));
+ } else {
+ heroComponent.bindDirectionView(entity -> new Point2D(0, 0));
+ }
creature.getModule(JFXModule.class).setComponent(heroComponent);
+
+ DataComponent dataComponent = new DataComponent(EntityType.PLAYER, data.get("owner"),
+ data.get("id"));
//HeroSpecs specs = new HeroSpecs("1", "bow", "ak", 450.0, "player.png");
- return entityBuilder()
+ Entity entity = entityBuilder()
.from(data)
.type(EntityType.PLAYER)
//.viewWithBBox(texture("weapon_" + playerMovingComponent.getCurrentWeapon() + ".png", 150,200))
@@ -117,13 +138,40 @@ public Entity newPlayer(SpawnData data) {
.anchorFromCenter()
.with(physics)
.with(heroComponent)
+ .with(dataComponent)
.with(new CellMoveComponent(30, 30, 85))
.with(new AStarMoveComponent(new LazyValue<>(() -> geto("grid"))))
//.with(new ChunkLoaderComponent(new ChunkLoader(wallMapper)))
.collidable()
.build();
+ while (!entity.hasComponent(DataComponent.class));
+ return entity;
}
+ @Spawns("weapon")
+ public Entity Weapon(SpawnData data) {
+ Weapon weapon = data.get("weapon");
+ ImageView iv = imageViewFromSpriteSheet(weapon.getModule(TextureModule.class).getTexturePath(),
+ weapon.getModule(TextureModule.class).getWeaponID(),
+ weapon.getModule(TextureModule.class).getImageWidht(),
+ weapon.getModule(TextureModule.class).getImageHeight(), ProjectConfig._WEAPON_COLUMNS);
+ WeaponComponent weaponComponent = new WeaponComponent(weapon);
+ weapon.getModule(TextureModule.class).setComponent(weaponComponent);
+
+ DataComponent dataComponent = new DataComponent(EntityType.WEAPON, data.get("owner"),
+ data.get("id"));
+ Entity entity = entityBuilder(data)
+ .from(data)
+ .type(EntityType.WEAPON)
+ .viewWithBBox(iv)
+ .bbox(new HitBox(BoundingShape.box(75, 20)))
+ .with(new CollidableComponent(true))
+ .with(weaponComponent)
+ .with(dataComponent)
+ .build();
+ while (!entity.hasComponent(DataComponent.class));
+ return entity;
+ }
@Spawns("platform")
public Entity platform(SpawnData data) {
@@ -252,72 +300,16 @@ public Entity newProjectile(SpawnData data) {
.collidable()
.build();
}
- /*
- @Spawns("bow")
- public Entity newBow(SpawnData data) {
- return entityBuilder(data)
- .from(data)
- .type(EntityType.BOW)
- .viewWithBBox(texture("red_bow.png", 15, 50))
- .bbox(new HitBox(BoundingShape.box(50, 15)))
- .with(new CollidableComponent(true))
- .build();
- }
-
- @Spawns("ak")
- public Entity newAK(SpawnData data) {
- return entityBuilder(data)
- .from(data)
- .type(EntityType.AK)
- .viewWithBBox(texture("weapon_ak.png", 75, 20))
- .bbox(new HitBox(BoundingShape.box(75, 20)))
- .with(new CollidableComponent(true))
- .build();
- }
- @Spawns("player")
- public Entity newPlayer(SpawnData data) {
- PhysicsComponent physics = new PhysicsComponent();
- physics.setBodyType(BodyType.DYNAMIC);
- physics.setFixtureDef(new FixtureDef().friction(0.3f));
- HeroSpecs specs = new HeroSpecs("1", "bow", "ak", 450.0, "player.png");
- return entityBuilder()
- .from(data)
- .type(EntityType.PLAYER)
- //.viewWithBBox(texture("weapon_" + playerMovingComponent.getCurrentWeapon() + ".png", 150,200))
- .bbox(new HitBox(new Point2D(30, 220), BoundingShape.box(100, 100)))
- .anchorFromCenter()
- .with(physics)
- .with(new PlayerMovingComponent(specs,new Point2D(50,180)))
- .with(new CellMoveComponent(30, 30, 85))
- .with(new AStarMoveComponent(new LazyValue<>(() -> geto("grid"))))
- //.with(new ChunkLoaderComponent(new ChunkLoader(wallMapper)))
- .collidable()
- .build();
- }
- */
- @Spawns("weapon")
- public Entity Weapon(SpawnData data) {
- Weapon weapon = data.get("weapon");
- ImageView iv = imageViewFromSpriteSheet(weapon.getModule(TextureModule.class).getTexturePath(),weapon.getModule(TextureModule.class).getWeaponID(),
- weapon.getModule(TextureModule.class).getImageWidht(),weapon.getModule(TextureModule.class).getImageHeight(), ProjectConfig._WEAPON_COLUMNS);
- //iv.setRotate(90);
- WeaponComponent weaponComponent = new WeaponComponent(weapon);
- weapon.getModule(TextureModule.class).setComponent(weaponComponent);
- return entityBuilder(data)
- .from(data)
- .type(EntityType.WEAPON)
- .viewWithBBox(iv)
- .bbox(new HitBox(BoundingShape.box(75, 20)))
- .with(new CollidableComponent(true))
- .with(weaponComponent)
- .build();
- }
- ImageView imageViewFromSpriteSheet(String path, int number, int spriteWidth, int spriteHeight,int columns){
- ImageView iv = new ImageView(new Image(path));
- iv.setViewport(new Rectangle2D(spriteWidth*(number%columns),spriteHeight*(number/columns),spriteWidth,spriteHeight));
+ ImageView imageViewFromSpriteSheet(Image img, int number, int spriteWidth, int spriteHeight,
+ int columns) {
+ ImageView iv = new ImageView(img);
+ iv.setViewport(
+ new Rectangle2D(spriteWidth * (number % columns), spriteHeight * (number / columns),
+ spriteWidth, spriteHeight));
return iv;
}
+
/**
* Entity Enemy.
*
diff --git a/src/main/java/ru/nsu/fit/dib/projectdib/connecting/ClientConnection.java b/src/main/java/ru/nsu/fit/dib/projectdib/connecting/ClientConnection.java
deleted file mode 100644
index 86617d5f..00000000
--- a/src/main/java/ru/nsu/fit/dib/projectdib/connecting/ClientConnection.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package ru.nsu.fit.dib.projectdib.connecting;
-
-
-import java.io.IOException;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.SocketTimeoutException;
-
-public class ClientConnection {
-
- private final InetAddress host;
-
- private final int port;
-
- private final DatagramSocket ds;
-
- public ClientConnection(InetAddress host, int port, DatagramSocket ds) {
- this.host = host;
- this.port = port;
- this.ds = ds;
- }
-
- /**
- * При вызове лучше ловить SocketTimeoutException
- *
- * @throws SocketTimeoutException ошибка
- */
- public void connect(int timeout) throws SocketTimeoutException {
- byte[] hello = "hello".getBytes();
- DatagramPacket outPack = new DatagramPacket(hello, hello.length, host, port);
- DatagramPacket inPack = new DatagramPacket(new byte[5], 5);
- try {
- ds.setSoTimeout(timeout);
- ds.send(outPack);
- ds.receive(inPack);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
-
- }
-}
diff --git a/src/main/java/ru/nsu/fit/dib/projectdib/connecting/ServerConnection.java b/src/main/java/ru/nsu/fit/dib/projectdib/connecting/ServerConnection.java
deleted file mode 100644
index 7b7363d3..00000000
--- a/src/main/java/ru/nsu/fit/dib/projectdib/connecting/ServerConnection.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package ru.nsu.fit.dib.projectdib.connecting;
-
-import java.io.IOException;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.net.SocketTimeoutException;
-
-public class ServerConnection {
-
- private final DatagramSocket ds;
-
- public ServerConnection(DatagramSocket ds) {
- this.ds = ds;
- }
-
- /**
- * Подключение.
- *
- * @return адрес подключенного.
- */
- public SocketAddress accept(int timeout) throws SocketTimeoutException {
- byte[] hello = "hello".getBytes();
- DatagramPacket inPack = new DatagramPacket(new byte[5], 5);
- try {
- ds.setSoTimeout(timeout);
- ds.receive(inPack);
- DatagramPacket outPack = new DatagramPacket(hello, hello.length, inPack.getAddress(),
- inPack.getPort());
- ds.send(outPack);
- return new InetSocketAddress(inPack.getAddress(), inPack.getPort());
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-}
diff --git a/src/main/java/ru/nsu/fit/dib/projectdib/connecting/tasks/ClientConnectionTask.java b/src/main/java/ru/nsu/fit/dib/projectdib/connecting/tasks/ClientConnectionTask.java
new file mode 100644
index 00000000..dc33cdfb
--- /dev/null
+++ b/src/main/java/ru/nsu/fit/dib/projectdib/connecting/tasks/ClientConnectionTask.java
@@ -0,0 +1,35 @@
+package ru.nsu.fit.dib.projectdib.connecting.tasks;
+
+import java.io.IOException;
+import java.net.Socket;
+import java.net.SocketAddress;
+import java.net.SocketTimeoutException;
+import java.util.function.Supplier;
+import ru.nsu.fit.dib.projectdib.newMultiplayer.config.ClientConfig;
+import ru.nsu.fit.dib.projectdib.newMultiplayer.context.client.MCClient;
+
+public class ClientConnectionTask implements Supplier {
+
+ private final SocketAddress serverAddress;
+
+ public ClientConnectionTask(SocketAddress serverAddress) {
+ this.serverAddress = serverAddress;
+ }
+
+ /**
+ * Выкидывает SocketTimeoutException при неправильном адресе
+ */
+ @Override
+ public Socket get() {
+ Socket socket = new Socket();
+ ClientConfig.addClientSocket(socket);
+ try {
+ socket.connect(serverAddress, 1000);
+ ClientConfig.addClientId(socket.getInputStream().read());
+ } catch (Exception e) {
+ return null;
+ }
+ ClientConfig.init();
+ return socket;
+ }
+}
diff --git a/src/main/java/ru/nsu/fit/dib/projectdib/connecting/tasks/ServerConnectionTask.java b/src/main/java/ru/nsu/fit/dib/projectdib/connecting/tasks/ServerConnectionTask.java
index c46e3bf4..564c59a6 100644
--- a/src/main/java/ru/nsu/fit/dib/projectdib/connecting/tasks/ServerConnectionTask.java
+++ b/src/main/java/ru/nsu/fit/dib/projectdib/connecting/tasks/ServerConnectionTask.java
@@ -1,27 +1,34 @@
package ru.nsu.fit.dib.projectdib.connecting.tasks;
-import java.net.DatagramSocket;
-import java.net.SocketAddress;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
import java.net.SocketTimeoutException;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
-import ru.nsu.fit.dib.projectdib.connecting.ServerConnection;
+import ru.nsu.fit.dib.projectdib.data.ProjectConfig;
+import ru.nsu.fit.dib.projectdib.newMultiplayer.config.ServerConfig;
+import ru.nsu.fit.dib.projectdib.newMultiplayer.context.client.MCClient;
+import ru.nsu.fit.dib.projectdib.newMultiplayer.context.server.MCServer;
+import ru.nsu.fit.dib.projectdib.newMultiplayer.threads.ServerReceiverThread;
/**
* Задание которое должно выполняться в CompletableFuture
* Используется собственный interrupt для завершения
*/
-public class ServerConnectionTask implements Supplier> {
-
- private final DatagramSocket ds;
+public class ServerConnectionTask implements Supplier