diff --git a/gameserver/src/main/java/brainwine/gameserver/achievements/Achievement.java b/gameserver/src/main/java/brainwine/gameserver/achievements/Achievement.java index 3713ee5..c74fb03 100644 --- a/gameserver/src/main/java/brainwine/gameserver/achievements/Achievement.java +++ b/gameserver/src/main/java/brainwine/gameserver/achievements/Achievement.java @@ -27,6 +27,7 @@ import brainwine.gameserver.util.MathUtils; @Type(name = "SidekickAchievement", value = SidekickAchievement.class), @Type(name = "ScavengingAchievement", value = ScavengingAchievement.class), @Type(name = "DiscoveryAchievement", value = DiscoveryAchievement.class), + @Type(name = "SpawnerStoppageAchievement", value = SpawnerStoppageAchievement.class), @Type(name = "Journeyman", value = JourneymanAchievement.class) }) @JsonSerialize(using = AchievementSerializer.class) diff --git a/gameserver/src/main/java/brainwine/gameserver/achievements/SpawnerStoppageAchievement.java b/gameserver/src/main/java/brainwine/gameserver/achievements/SpawnerStoppageAchievement.java new file mode 100644 index 0000000..ac3b3b0 --- /dev/null +++ b/gameserver/src/main/java/brainwine/gameserver/achievements/SpawnerStoppageAchievement.java @@ -0,0 +1,19 @@ +package brainwine.gameserver.achievements; + +import com.fasterxml.jackson.annotation.JacksonInject; +import com.fasterxml.jackson.annotation.JsonCreator; + +import brainwine.gameserver.entity.player.Player; + +public class SpawnerStoppageAchievement extends Achievement { + + @JsonCreator + public SpawnerStoppageAchievement(@JacksonInject("title") String title) { + super(title); + } + + @Override + public int getProgress(Player player) { + return player.getStatistics().getMawsPlugged(); + } +} diff --git a/gameserver/src/main/java/brainwine/gameserver/entity/player/PlayerStatistics.java b/gameserver/src/main/java/brainwine/gameserver/entity/player/PlayerStatistics.java index 65746dd..f028ad8 100644 --- a/gameserver/src/main/java/brainwine/gameserver/entity/player/PlayerStatistics.java +++ b/gameserver/src/main/java/brainwine/gameserver/entity/player/PlayerStatistics.java @@ -20,6 +20,7 @@ import brainwine.gameserver.achievements.MiningAchievement; import brainwine.gameserver.achievements.RaiderAchievement; import brainwine.gameserver.achievements.ScavengingAchievement; import brainwine.gameserver.achievements.SidekickAchievement; +import brainwine.gameserver.achievements.SpawnerStoppageAchievement; import brainwine.gameserver.entity.EntityConfig; import brainwine.gameserver.item.Item; @@ -37,6 +38,7 @@ public class PlayerStatistics { private int areasExplored; private int containersLooted; private int dungeonsRaided; + private int mawsPlugged; private int deaths; @JsonIgnore @@ -293,6 +295,20 @@ public class PlayerStatistics { return dungeonsRaided; } + public void trackMawPlugged() { + mawsPlugged++; + player.addExperience(5); + player.updateAchievementProgress(SpawnerStoppageAchievement.class); + } + + public void setMawsPlugged(int mawsPlugged) { + this.mawsPlugged = mawsPlugged; + } + + public int getMawsPlugged() { + return mawsPlugged; + } + public void trackDeath() { deaths++; } diff --git a/gameserver/src/main/java/brainwine/gameserver/item/Item.java b/gameserver/src/main/java/brainwine/gameserver/item/Item.java index 7b10527..d19d3ae 100644 --- a/gameserver/src/main/java/brainwine/gameserver/item/Item.java +++ b/gameserver/src/main/java/brainwine/gameserver/item/Item.java @@ -87,6 +87,9 @@ public class Item { @JsonProperty("placeover") private boolean placeover; + @JsonProperty("custom_place") + private boolean customPlace; + @JsonProperty("base") private boolean base; @@ -311,6 +314,10 @@ public class Item { return placeover; } + public boolean hasCustomPlace() { + return customPlace; + } + public boolean isWhole() { return whole; } diff --git a/gameserver/src/main/java/brainwine/gameserver/server/requests/BlockPlaceRequest.java b/gameserver/src/main/java/brainwine/gameserver/server/requests/BlockPlaceRequest.java index c823791..98500ac 100644 --- a/gameserver/src/main/java/brainwine/gameserver/server/requests/BlockPlaceRequest.java +++ b/gameserver/src/main/java/brainwine/gameserver/server/requests/BlockPlaceRequest.java @@ -87,6 +87,33 @@ public class BlockPlaceRequest extends PlayerRequest { player.getInventory().removeItem(item); player.getStatistics().trackItemPlaced(); player.trackPlacement(x, y, item); + + // Process custom place if applicable + if(item.hasCustomPlace()) { + processCustomPlace(player); + } + } + + private void processCustomPlace(Player player) { + Zone zone = player.getZone(); + + switch(item.getId()) { + // See if we can plug a maw or pipe + case "building/plug": + Item baseItem = zone.getBlock(x, y).getBaseItem(); + String plugged = baseItem.hasId("base/maw") ? "base/maw-plugged" + : baseItem.hasId("base/pipe") ? "base/pipe-plugged" : null; + + if(plugged != null) { + zone.updateBlock(x, y, Layer.FRONT, 0); // Remove the plug front block + zone.updateBlock(x, y, Layer.BASE, plugged); + player.getStatistics().trackMawPlugged(); + } + + break; + // No valid item; do nothing + default: break; + } } private void fail(Player player, String reason) {