From 1a2332bc32aa74def106950bf8b4dd3cb74444a0 Mon Sep 17 00:00:00 2001 From: Wiewiogr Date: Sat, 27 Oct 2018 15:49:39 +0200 Subject: [PATCH 1/6] Create ItemsContainer.java --- .../server/game/objects/ItemsContainer.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java diff --git a/Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java b/Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java new file mode 100644 index 0000000..d70505f --- /dev/null +++ b/Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java @@ -0,0 +1,72 @@ +package net.simon987.server.game.objects; + +import net.simon987.server.game.item.Item; +import org.bson.Document; +import org.json.simple.JSONObject; + +import java.util.HashMap; +import java.util.Map; + +public class ItemsContainer extends GameObject implements InventoryHolder { + + private static final char MAP_INFO = 0x0240; + + private final Map itemsTypeCount; + private int containerCapacity; + private int size = 0; + + public ItemsContainer(int containerCapacity) { + this.containerCapacity = containerCapacity; + this.itemsTypeCount = new HashMap<>(); + } + + public ItemsContainer(Document document) { + super(document); + itemsTypeCount = (Map) document.get("itemsCount"); + } + + @Override + public char getMapInfo() { + return MAP_INFO; + } + + @Override + public boolean placeItem(Item item) { + if (size < containerCapacity) { + int itemId = item.getId(); + itemsTypeCount.putIfAbsent(itemId, 0); + Integer oldCount = itemsTypeCount.get(itemId); + itemsTypeCount.replace(itemId, ++oldCount); + size++; + return true; + } + return false; + } + + @Override + public void takeItem(int itemId) { + Integer oldCount = itemsTypeCount.get(itemId); + itemsTypeCount.replace(itemId, --oldCount); + size--; + } + + @Override + public boolean canTakeItem(int itemId) { + Integer integer = itemsTypeCount.get(itemId); + return integer != null && integer > 0; + } + + @Override + public JSONObject jsonSerialise() { + JSONObject json = super.jsonSerialise(); + json.put("itemsCount", itemsTypeCount); + return json; + } + + @Override + public Document mongoSerialise() { + Document dbObject = super.mongoSerialise(); + dbObject.put("itemsCount", itemsTypeCount); + return dbObject; + } +} From 548d756e904784cc79c549e17587225530518189 Mon Sep 17 00:00:00 2001 From: Wiewiogr Date: Sat, 27 Oct 2018 15:51:21 +0200 Subject: [PATCH 2/6] Added tests for ItemsContainer --- .../game/objects/ItemsContainerTest.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 Server/src/test/java/net/simon987/server/assembly/game/objects/ItemsContainerTest.java diff --git a/Server/src/test/java/net/simon987/server/assembly/game/objects/ItemsContainerTest.java b/Server/src/test/java/net/simon987/server/assembly/game/objects/ItemsContainerTest.java new file mode 100644 index 0000000..b77b7e3 --- /dev/null +++ b/Server/src/test/java/net/simon987/server/assembly/game/objects/ItemsContainerTest.java @@ -0,0 +1,72 @@ +package net.simon987.server.game.objects; + +import net.simon987.server.game.item.ItemCopper; +import org.bson.Document; +import org.junit.Assert; +import org.junit.Test; + +public class ItemsContainerTest { + + @Test + public void shouldBeSerializableToMongoFormat() { + ItemsContainer itemsContainer = new ItemsContainer(2); + ItemCopper item = new ItemCopper(); + itemsContainer.placeItem(item); + + Document document = itemsContainer.mongoSerialise(); + + ItemsContainer deserialized = new ItemsContainer(document); + Assert.assertTrue(deserialized.canTakeItem(item.getId())); + } + + @Test + public void shouldPlaceItemWhenCapacityAllowsIt() { + ItemsContainer itemsContainer = new ItemsContainer(1); + + boolean result = itemsContainer.placeItem(new ItemCopper()); + + Assert.assertEquals(true, result); + } + + @Test + public void shouldNotPlaceItemWhenThereIsNoCapacityLeft() { + ItemsContainer itemsContainer = new ItemsContainer(1); + + itemsContainer.placeItem(new ItemCopper()); + boolean result = itemsContainer.placeItem(new ItemCopper()); + + Assert.assertEquals(false, result); + } + + @Test + public void shouldNotBeAbleToTakeItemWhenItWasNotPlacedBefore() { + ItemsContainer itemsContainer = new ItemsContainer(1); + + boolean result = itemsContainer.canTakeItem(1); + + Assert.assertEquals(false, result); + } + + @Test + public void shouldBeAbleToTakeItemIfItWasPlacedBefore() { + ItemsContainer itemsContainer = new ItemsContainer(1); + ItemCopper item = new ItemCopper(); + + itemsContainer.placeItem(item); + boolean result = itemsContainer.canTakeItem(item.getId()); + + Assert.assertEquals(true, result); + } + + @Test + public void shouldNotBeAbleToTakeItemAfterItWasTaken() { + ItemsContainer itemsContainer = new ItemsContainer(1); + ItemCopper item = new ItemCopper(); + + itemsContainer.placeItem(item); + itemsContainer.takeItem(item.getId()); + boolean result = itemsContainer.canTakeItem(item.getId()); + + Assert.assertEquals(false, result); + } +} From a6f0ce1dfbebbb05ee31a3256815aaac69f43a35 Mon Sep 17 00:00:00 2001 From: Wiewiogr Date: Sat, 27 Oct 2018 18:11:56 +0200 Subject: [PATCH 3/6] moved test to correct folder --- .../server/{assembly => }/game/objects/ItemsContainerTest.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Server/src/test/java/net/simon987/server/{assembly => }/game/objects/ItemsContainerTest.java (100%) diff --git a/Server/src/test/java/net/simon987/server/assembly/game/objects/ItemsContainerTest.java b/Server/src/test/java/net/simon987/server/game/objects/ItemsContainerTest.java similarity index 100% rename from Server/src/test/java/net/simon987/server/assembly/game/objects/ItemsContainerTest.java rename to Server/src/test/java/net/simon987/server/game/objects/ItemsContainerTest.java From f89c39c7561f248abf53723134e2a91411844724 Mon Sep 17 00:00:00 2001 From: Wiewiogr Date: Sat, 27 Oct 2018 18:13:43 +0200 Subject: [PATCH 4/6] changed implementation to list --- .../server/game/objects/ItemsContainer.java | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java b/Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java index d70505f..e5de2cc 100644 --- a/Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java +++ b/Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java @@ -4,25 +4,23 @@ import net.simon987.server.game.item.Item; import org.bson.Document; import org.json.simple.JSONObject; -import java.util.HashMap; -import java.util.Map; +import java.util.*; public class ItemsContainer extends GameObject implements InventoryHolder { private static final char MAP_INFO = 0x0240; - private final Map itemsTypeCount; + private final List items; private int containerCapacity; - private int size = 0; public ItemsContainer(int containerCapacity) { this.containerCapacity = containerCapacity; - this.itemsTypeCount = new HashMap<>(); + this.items = new ArrayList<>(); } public ItemsContainer(Document document) { super(document); - itemsTypeCount = (Map) document.get("itemsCount"); + this.items = (List) document.get("itemsCount"); } @Override @@ -32,41 +30,40 @@ public class ItemsContainer extends GameObject implements InventoryHolder { @Override public boolean placeItem(Item item) { - if (size < containerCapacity) { - int itemId = item.getId(); - itemsTypeCount.putIfAbsent(itemId, 0); - Integer oldCount = itemsTypeCount.get(itemId); - itemsTypeCount.replace(itemId, ++oldCount); - size++; + if (items.size() < containerCapacity) { + items.add(item); return true; + } else { + return false; } - return false; } @Override public void takeItem(int itemId) { - Integer oldCount = itemsTypeCount.get(itemId); - itemsTypeCount.replace(itemId, --oldCount); - size--; + Optional first = items.stream() + .filter(item -> item.getId() == itemId) + .findFirst(); + + items.remove(first.get()); } @Override public boolean canTakeItem(int itemId) { - Integer integer = itemsTypeCount.get(itemId); - return integer != null && integer > 0; + return items.stream() + .anyMatch(item -> item.getId() == itemId); } @Override public JSONObject jsonSerialise() { JSONObject json = super.jsonSerialise(); - json.put("itemsCount", itemsTypeCount); + json.put("itemsCount", items); return json; } @Override public Document mongoSerialise() { Document dbObject = super.mongoSerialise(); - dbObject.put("itemsCount", itemsTypeCount); + dbObject.put("itemsCount", items); return dbObject; } } From a40a0712f02e5d2434428a575a92660deeaad9aa Mon Sep 17 00:00:00 2001 From: Wiewiogr Date: Sat, 27 Oct 2018 18:26:24 +0200 Subject: [PATCH 5/6] changed fields names --- .../net/simon987/server/game/objects/ItemsContainer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java b/Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java index e5de2cc..042d85c 100644 --- a/Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java +++ b/Server/src/main/java/net/simon987/server/game/objects/ItemsContainer.java @@ -20,7 +20,7 @@ public class ItemsContainer extends GameObject implements InventoryHolder { public ItemsContainer(Document document) { super(document); - this.items = (List) document.get("itemsCount"); + this.items = (List) document.get("items"); } @Override @@ -56,14 +56,14 @@ public class ItemsContainer extends GameObject implements InventoryHolder { @Override public JSONObject jsonSerialise() { JSONObject json = super.jsonSerialise(); - json.put("itemsCount", items); + json.put("items", items); return json; } @Override public Document mongoSerialise() { Document dbObject = super.mongoSerialise(); - dbObject.put("itemsCount", items); + dbObject.put("items", items); return dbObject; } } From 0845438297d742379f5054daf9d5e6dc8f1ce2e2 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 28 Oct 2018 09:45:36 -0400 Subject: [PATCH 6/6] Fixed potential error in ServerConfiguration and added ability to programmatically modify server configuration --- .../simon987/server/ServerConfiguration.java | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/Server/src/main/java/net/simon987/server/ServerConfiguration.java b/Server/src/main/java/net/simon987/server/ServerConfiguration.java index 8cff8b6..bb8966d 100644 --- a/Server/src/main/java/net/simon987/server/ServerConfiguration.java +++ b/Server/src/main/java/net/simon987/server/ServerConfiguration.java @@ -3,25 +3,24 @@ package net.simon987.server; import net.simon987.server.logging.LogManager; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.util.Properties; /** - * Wrapper for Java Property + * Wrapper for Java Properties class */ public class ServerConfiguration { - /** - * Properties - */ private Properties properties; + private String fileName; + + public ServerConfiguration(String fileName) { + + this.fileName = fileName; - public ServerConfiguration(String file) { try { properties = new Properties(); - InputStream is = new FileInputStream("config.properties"); + InputStream is = new FileInputStream(this.fileName); properties.load(is); } catch (IOException e) { @@ -29,6 +28,17 @@ public class ServerConfiguration { } } + private void saveConfig() { + + try { + OutputStream os = new FileOutputStream(this.fileName); + properties.store(os, ""); + + } catch (IOException e) { + LogManager.LOGGER.severe("Problem saving server configuration: " + e.getMessage()); + } + } + public int getInt(String key) { return Integer.valueOf((String) properties.get(key)); @@ -39,4 +49,14 @@ public class ServerConfiguration { return (String) properties.get(key); } + public void setInt(String key, int value) { + properties.setProperty(key, String.valueOf(value)); + saveConfig(); + } + + public void setString(String key, String value) { + properties.setProperty(key, value); + saveConfig(); + } + }