From 3cf181eaadcdef589b6e6cd0e0888c6412083f1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20Bora=20=C4=B0nevi?= Date: Fri, 20 Dec 2024 03:58:13 +0100 Subject: [PATCH 1/3] add orders --- .../java/brainwine/gameserver/GameServer.java | 2 + .../achievement/HuntingAchievement.java | 6 +- .../gameserver/command/OrderCommand.java | 53 +++++++++++ .../brainwine/gameserver/order/Order.java | 71 ++++++++++++++ .../gameserver/order/OrderManager.java | 92 +++++++++++++++++++ .../brainwine/gameserver/order/OrderTier.java | 60 ++++++++++++ .../brainwine/gameserver/player/Player.java | 34 ++++++- .../gameserver/player/PlayerConfigFile.java | 17 +++- .../gameserver/player/PlayerStatistics.java | 42 ++++++++- 9 files changed, 368 insertions(+), 9 deletions(-) create mode 100644 gameserver/src/main/java/brainwine/gameserver/command/OrderCommand.java create mode 100644 gameserver/src/main/java/brainwine/gameserver/order/Order.java create mode 100644 gameserver/src/main/java/brainwine/gameserver/order/OrderManager.java create mode 100644 gameserver/src/main/java/brainwine/gameserver/order/OrderTier.java diff --git a/gameserver/src/main/java/brainwine/gameserver/GameServer.java b/gameserver/src/main/java/brainwine/gameserver/GameServer.java index e29fdf38..25e88770 100644 --- a/gameserver/src/main/java/brainwine/gameserver/GameServer.java +++ b/gameserver/src/main/java/brainwine/gameserver/GameServer.java @@ -5,6 +5,7 @@ import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; +import brainwine.gameserver.order.OrderManager; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -47,6 +48,7 @@ public GameServer() { CommandManager.init(); GameConfiguration.init(); AchievementManager.loadAchievements(); + OrderManager.loadOrders(); EntityRegistry.init(); EntityManager.loadEntitySpawns(); GrowthManager.loadGrowthData(); diff --git a/gameserver/src/main/java/brainwine/gameserver/achievement/HuntingAchievement.java b/gameserver/src/main/java/brainwine/gameserver/achievement/HuntingAchievement.java index c2b0faeb..c2de4643 100644 --- a/gameserver/src/main/java/brainwine/gameserver/achievement/HuntingAchievement.java +++ b/gameserver/src/main/java/brainwine/gameserver/achievement/HuntingAchievement.java @@ -21,10 +21,6 @@ public HuntingAchievement(@JacksonInject("title") String title) { @Override public int getProgress(Player player) { - return player.getStatistics().getKills().entrySet().stream() - .filter(entry -> entry.getKey().getGroup() == group) - .map(Entry::getValue) - .reduce(Integer::sum) - .orElse(0); + return player.getStatistics().getKills(group); } } diff --git a/gameserver/src/main/java/brainwine/gameserver/command/OrderCommand.java b/gameserver/src/main/java/brainwine/gameserver/command/OrderCommand.java new file mode 100644 index 00000000..5ddb618a --- /dev/null +++ b/gameserver/src/main/java/brainwine/gameserver/command/OrderCommand.java @@ -0,0 +1,53 @@ +package brainwine.gameserver.command; + +import brainwine.gameserver.dialog.Dialog; +import brainwine.gameserver.dialog.DialogSection; +import brainwine.gameserver.dialog.input.DialogSelectInput; +import brainwine.gameserver.order.Order; +import brainwine.gameserver.order.OrderManager; +import brainwine.gameserver.player.NotificationType; +import brainwine.gameserver.player.Player; +import brainwine.gameserver.server.messages.EntityChangeMessage; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@CommandInfo(name = "order", description = "Shows a prompt where you can update your displayed order icon.") +public class OrderCommand extends Command { + @Override + public void execute(CommandExecutor executor, String[] args) { + if(!(executor instanceof Player)) { + executor.notify("Only players can update their order icon.", NotificationType.SYSTEM); + } + Player player = (Player)executor; + + List orderKeys = player.getOrders().entrySet().stream() + .filter(e -> e.getValue() > 0) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + + final Map orders = OrderManager.getOrders(player); + List options = orders.keySet().stream().map(Order::getTitle).collect(Collectors.toList()); + options.add("None"); + + Dialog dialog = new Dialog() + .setTitle("Change the Order displayed by your name") + .addSection(new DialogSection() + .setInput(new DialogSelectInput().setOptions(options).setKey("order")) + ); + + player.showDialog(dialog, ans -> { + if(ans.length == 0 || "cancel".equals(ans[0]) || !(ans[0] instanceof String)) return; + String newValue = "None".equals(ans[0]) ? null : (String)ans[0]; + player.setDisplayedOrder(OrderManager.getOrderKeyFromTitle(newValue)); + player.sendMessage(new EntityChangeMessage(player.getId(), player.getStatusConfig())); + player.sendMessageToPeers(new EntityChangeMessage(player.getId(), player.getStatusConfig())); + }); + } + + @Override + public String getUsage(CommandExecutor executor) { + return "/order"; + } +} diff --git a/gameserver/src/main/java/brainwine/gameserver/order/Order.java b/gameserver/src/main/java/brainwine/gameserver/order/Order.java new file mode 100644 index 00000000..0d2e7131 --- /dev/null +++ b/gameserver/src/main/java/brainwine/gameserver/order/Order.java @@ -0,0 +1,71 @@ +package brainwine.gameserver.order; + +import brainwine.gameserver.dialog.DialogHelper; +import brainwine.gameserver.player.NotificationType; +import brainwine.gameserver.player.Player; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class Order { + @JsonIgnore + private String title; + @JsonProperty("induction_message") + private String inductionMessage; + @JsonProperty("advancement_message") + private String advancementMessage; + @JsonProperty + private String key; + @JsonProperty + private boolean hidden; + @JsonProperty + private List tiers; + + public void advance(Player player) { + int currentLevel = player.getOrders().getOrDefault(key, 0); + boolean advanced = false; + + while(currentLevel < tiers.size()) { + int previousLevel = currentLevel; + currentLevel = advanceOnce(player, currentLevel); + if(previousLevel == currentLevel) break; + advanced = true; + } + + if(advanced && !hidden) { + String title, message, peerMessage; + if(currentLevel == 1) { + title = OrderManager.getInductionTitle(); + message = inductionMessage + " " + title; + peerMessage = OrderManager.getPeerInductionMessage() + " " + title; + } else { + title = OrderManager.getAdvancementTitle(); + message = advancementMessage + " " + title; + peerMessage = OrderManager.getPeerAdvancementMessage() + " " + title; + } + + player.showDialog(DialogHelper.messageDialog(title, message)); + player.notifyPeers(peerMessage, NotificationType.SYSTEM); + } + } + + public int advanceOnce(Player player, int currentLevel) { + if (currentLevel == tiers.size()) return currentLevel; + OrderTier nextTier = tiers.get(currentLevel); + player.getOrders().put(key, nextTier.satisfies(player) ? currentLevel + 1 : currentLevel); + return player.getOrders().get(key); + } + + public String getKey() { + return key; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/gameserver/src/main/java/brainwine/gameserver/order/OrderManager.java b/gameserver/src/main/java/brainwine/gameserver/order/OrderManager.java new file mode 100644 index 00000000..73851104 --- /dev/null +++ b/gameserver/src/main/java/brainwine/gameserver/order/OrderManager.java @@ -0,0 +1,92 @@ +package brainwine.gameserver.order; + +import brainwine.gameserver.GameConfiguration; +import brainwine.gameserver.player.Player; +import brainwine.gameserver.util.MapHelper; +import brainwine.shared.JsonHelper; +import com.fasterxml.jackson.core.type.TypeReference; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +import static brainwine.shared.LogMarkers.SERVER_MARKER; + +public class OrderManager { + private static Map orders = new HashMap<>(); + private static Map ordersByTitle = new HashMap<>(); + private static String inductionTitle = "You've been inducted into an Order!"; + private static String advancementTitle = "You've advanced in an Order!"; + private static String peerInductionMessage = "has been inducted into the"; + private static String peerAdvancementMessage = "has advanced within the"; + private static final Logger logger = LogManager.getLogger(); + + private OrderManager() {} + + public static void loadOrders() { + try { + Map ordersMap = new HashMap<>(MapHelper.getMap(GameConfiguration.getBaseConfig(), "orders")); + Map common = MapHelper.getMap(ordersMap, "all"); + + if (common != null) { + inductionTitle = MapHelper.getString(common, "induction_title", inductionTitle); + advancementTitle = MapHelper.getString(common, "advancement_title", advancementTitle); + peerInductionMessage = MapHelper.getString(common, "peer_induction_message", peerInductionMessage); + peerAdvancementMessage = MapHelper.getString(common, "peer_advancement_message", peerAdvancementMessage); + } + + ordersMap.remove("all"); + + ordersByTitle.putAll(JsonHelper.readValue(ordersMap, new TypeReference<>() {})); + + for(Map.Entry orderPair : ordersByTitle.entrySet()) { + orderPair.getValue().setTitle(orderPair.getKey()); + orders.put(orderPair.getValue().getKey(), orderPair.getValue()); + } + } catch (IOException e) { + logger.error(SERVER_MARKER, "Failed to load orders", e); + } + } + + public static void advance(Player player) { + for(Order order : orders.values()) { + order.advance(player); + } + } + + public static Map getOrders() { + return Collections.unmodifiableMap(orders); + } + + public static Map getOrders(Player player) { + return player.getOrders().entrySet().stream() + .filter(e -> e.getValue() > 0 && orders.containsKey(e.getKey())) + .collect(Collectors.toMap(e -> orders.get(e.getKey()), Map.Entry::getValue)); + } + + public static String getOrderKeyFromTitle(String title) { + Order order = ordersByTitle.get(title); + + return order == null ? null : order.getKey(); + } + + public static String getInductionTitle() { + return inductionTitle; + } + + public static String getAdvancementTitle() { + return advancementTitle; + } + + public static String getPeerInductionMessage() { + return peerInductionMessage; + } + + public static String getPeerAdvancementMessage() { + return peerAdvancementMessage; + } +} diff --git a/gameserver/src/main/java/brainwine/gameserver/order/OrderTier.java b/gameserver/src/main/java/brainwine/gameserver/order/OrderTier.java new file mode 100644 index 00000000..fc4c8775 --- /dev/null +++ b/gameserver/src/main/java/brainwine/gameserver/order/OrderTier.java @@ -0,0 +1,60 @@ +package brainwine.gameserver.order; + +import brainwine.gameserver.entity.EntityGroup; +import brainwine.gameserver.entity.EntityRegistry; +import brainwine.gameserver.player.Player; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Map; + +public class OrderTier { + @JsonProperty + private Map requirements; + + public boolean satisfies(Player player) { + for(String requirement : requirements.keySet()) { + int compare = Integer.MAX_VALUE; + switch(requirement) { + case "level": + compare = player.getLevel(); + break; + case "progress/chunks explored": + compare = player.getStatistics().getAreasExplored(); + break; + case "progress/teleporters discovered": + compare = player.getStatistics().getTeleporterDiscoveries(); + break; + case "progress/creatures killed": + compare = player.getStatistics().getTotalKills(); + break; + case "players_killed": + // TODO: related to KillerAchievement + break; + case "progress/dungeons raided": + compare = player.getStatistics().getDungeonsRaided(); + break; + case "progress/automata killed": + compare = player.getStatistics().getKills(EntityGroup.AUTOMATA); + break; + case "progress/supernatural killed": + compare = player.getStatistics().getKills(EntityGroup.SUPERNATURAL); + break; + case "progress/inhibitors activated": + // TODO: related to InsurrectionAchievement + break; + case "progress/brains killed": + compare = player.getStatistics().getKills(EntityGroup.BRAINS); + break; + case "brain_lords_killed": + compare = player.getStatistics().getKills(EntityRegistry.getEntityConfig("brains/large")); + break; + } + + if(compare < requirements.get(requirement)) { + return false; + } + } + + return true; + } +} diff --git a/gameserver/src/main/java/brainwine/gameserver/player/Player.java b/gameserver/src/main/java/brainwine/gameserver/player/Player.java index 3dac4df9..ec814892 100644 --- a/gameserver/src/main/java/brainwine/gameserver/player/Player.java +++ b/gameserver/src/main/java/brainwine/gameserver/player/Player.java @@ -14,6 +14,7 @@ import java.util.function.Consumer; import java.util.stream.Collectors; +import brainwine.gameserver.order.OrderManager; import com.fasterxml.jackson.annotation.JsonCreator; import brainwine.gameserver.GameConfiguration; @@ -104,6 +105,8 @@ public class Player extends Entity implements CommandExecutor { private List bans; private Set lootCodes; private Set achievements; + private Map orders = new HashMap<>(); + private String displayedOrder = null; private Map ignoredHints; private Map skills; private Map> bumpedSkills; @@ -148,6 +151,7 @@ protected Player(String documentId, PlayerConfigFile config) { this.skillPoints = config.getSkillPoints(); this.karma = config.getKarma(); this.crowns = config.getCrowns(); + this.displayedOrder = config.getDisplayedOrder(); this.inventory = config.getInventory(); this.statistics = config.getStatistics(); this.authTokens = config.getAuthTokens(); @@ -156,6 +160,7 @@ protected Player(String documentId, PlayerConfigFile config) { this.bans = config.getBans(); this.lootCodes = config.getLootCodes(); this.achievements = config.getAchievements(); + this.orders = config.getOrders(); this.ignoredHints = config.getIgnoredHints(); this.skills = config.getSkills(); this.bumpedSkills = config.getBumpedSkills(); @@ -210,6 +215,7 @@ public void tick(float deltaTime) { applyBreath(deltaTime); applyThirst(deltaTime); applyFreeze(deltaTime); + OrderManager.advance(this); } // Try to timeout trade @@ -392,6 +398,7 @@ public Map getStatusConfig() { config.put("id", documentId); config.putAll(appearance); config.put("u", inventory.findJetpack().getCode()); + config.put("ni", getIcon()); return config; } @@ -1220,7 +1227,31 @@ public boolean hasAchievement(Achievement achievement) { public Set getAchievements() { return Collections.unmodifiableSet(achievements); } - + + public Map getOrders() { + return orders; + } + + public String getDisplayedOrder() { + return displayedOrder; + } + + public String getIcon() { + if(getDisplayedOrder() == null + || !OrderManager.getOrders().containsKey(getDisplayedOrder()) + || orders.getOrDefault(getDisplayedOrder(), 0) == 0) { + return null; + } + return String.format("orders/%s-%d", + getDisplayedOrder(), + getOrders().getOrDefault(getDisplayedOrder(), 0) + ); + } + + public void setDisplayedOrder(String displayedOrder) { + this.displayedOrder = displayedOrder; + } + public void randomizeAppearance() { appearance.putAll(Appearance.getRandomAppearance(this)); zone.sendMessage(new EntityChangeMessage(id, appearance)); @@ -1491,6 +1522,7 @@ public Map getClientConfig() { config.put("deaths", statistics.getDeaths()); config.put("appearance", appearance); config.put("settings", settings); + config.put("ni", getIcon()); return config; } } diff --git a/gameserver/src/main/java/brainwine/gameserver/player/PlayerConfigFile.java b/gameserver/src/main/java/brainwine/gameserver/player/PlayerConfigFile.java index e91d43c1..df0794f6 100644 --- a/gameserver/src/main/java/brainwine/gameserver/player/PlayerConfigFile.java +++ b/gameserver/src/main/java/brainwine/gameserver/player/PlayerConfigFile.java @@ -28,6 +28,7 @@ public class PlayerConfigFile { private int skillPoints; private int karma; private int crowns; + private String displayedOrder = null; private Inventory inventory = new Inventory(); private PlayerStatistics statistics = new PlayerStatistics(); private List authTokens = new ArrayList<>(); @@ -36,6 +37,7 @@ public class PlayerConfigFile { private List bans = new ArrayList<>(); private Set lootCodes = new HashSet<>(); private Set achievements = new HashSet<>(); + private Map orders = new HashMap<>(); private Map ignoredHints = new HashMap<>(); private Map skills = new HashMap<>(); private Map> bumpedSkills = new HashMap<>(); @@ -59,6 +61,8 @@ public PlayerConfigFile(Player player) { this.bans = player.getBans(); this.lootCodes = player.getLootCodes(); this.achievements = player.getAchievements(); + this.orders = player.getOrders(); + this.displayedOrder = player.getDisplayedOrder(); this.ignoredHints = player.getIgnoredHints(); this.skills = player.getSkills(); this.bumpedSkills = player.getBumpedSkills(); @@ -124,7 +128,11 @@ public int getKarma() { public int getCrowns() { return crowns; } - + + public String getDisplayedOrder() { + return displayedOrder; + } + @JsonSetter(nulls = Nulls.SKIP) public Inventory getInventory() { return inventory; @@ -144,7 +152,12 @@ public Set getLootCodes() { public Set getAchievements() { return achievements; } - + + @JsonSetter(nulls = Nulls.SKIP, contentNulls = Nulls.SKIP) + public Map getOrders() { + return orders; + } + @JsonSetter(nulls = Nulls.SKIP, contentNulls = Nulls.SKIP) public Map getIgnoredHints() { return ignoredHints; diff --git a/gameserver/src/main/java/brainwine/gameserver/player/PlayerStatistics.java b/gameserver/src/main/java/brainwine/gameserver/player/PlayerStatistics.java index a667c3c5..9d370926 100644 --- a/gameserver/src/main/java/brainwine/gameserver/player/PlayerStatistics.java +++ b/gameserver/src/main/java/brainwine/gameserver/player/PlayerStatistics.java @@ -1,10 +1,15 @@ package brainwine.gameserver.player; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; +import java.util.stream.Collectors; +import brainwine.gameserver.entity.EntityGroup; +import brainwine.gameserver.item.ItemGroup; +import brainwine.gameserver.item.ItemRegistry; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonCreator; @@ -32,6 +37,8 @@ @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE) @JsonIgnoreProperties(ignoreUnknown = true) public class PlayerStatistics { + + private static Collection teleporters; private Map itemsMined = new HashMap<>(); private Map itemsScavenged = new HashMap<>(); @@ -51,7 +58,8 @@ public class PlayerStatistics { private int deaths; private int landmarksUpvoted; private int landmarkVotesReceived; - + private int crownsSpent; + @JsonIgnore private Player player; @@ -209,6 +217,22 @@ public int getDiscoveries(Item item) { public Map getDiscoveries() { return Collections.unmodifiableMap(discoveries); } + + public int getTeleporterDiscoveries() { + if(teleporters == null) { + teleporters = ItemRegistry.getItems().stream() + .filter(i -> i.getId().startsWith("mechanical") && i.getId().contains("teleporter")) + .collect(Collectors.toList()); + } + + int total = 0; + + for(Item item : teleporters) { + total += getDiscoveries(item); + } + + return total; + } public void trackKill(EntityConfig entity) { if(!kills.containsKey(entity)) { @@ -233,6 +257,14 @@ public int getTotalKills() { public int getKills(EntityConfig entity) { return kills.getOrDefault(entity, 0); } + + public int getKills(EntityGroup group) { + return player.getStatistics().getKills().entrySet().stream() + .filter(entry -> entry.getKey().getGroup() == group) + .map(Entry::getValue) + .reduce(Integer::sum) + .orElse(0); + } public Map getKills() { return Collections.unmodifiableMap(kills); @@ -433,4 +465,12 @@ public void setDeaths(int deaths) { public int getDeaths() { return deaths; } + + public int getCrownsSpent() { + return crownsSpent; + } + + public void trackCrownsSpent(int crowns) { + crownsSpent += crowns; + } } From 453546305d27fa11270cb324d7a2e3db9cabe15e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20Bora=20=C4=B0nevi?= Date: Fri, 20 Dec 2024 23:11:28 +0100 Subject: [PATCH 2/3] send EventMessage for player icon --- .../java/brainwine/gameserver/command/OrderCommand.java | 3 ++- .../main/java/brainwine/gameserver/order/OrderManager.java | 2 +- .../main/java/brainwine/gameserver/order/OrderTier.java | 3 +++ .../src/main/java/brainwine/gameserver/player/Player.java | 7 +++++++ .../main/java/brainwine/gameserver/zone/EntityManager.java | 2 ++ 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/gameserver/src/main/java/brainwine/gameserver/command/OrderCommand.java b/gameserver/src/main/java/brainwine/gameserver/command/OrderCommand.java index 5ddb618a..560102fe 100644 --- a/gameserver/src/main/java/brainwine/gameserver/command/OrderCommand.java +++ b/gameserver/src/main/java/brainwine/gameserver/command/OrderCommand.java @@ -8,6 +8,7 @@ import brainwine.gameserver.player.NotificationType; import brainwine.gameserver.player.Player; import brainwine.gameserver.server.messages.EntityChangeMessage; +import brainwine.gameserver.server.messages.EventMessage; import java.util.List; import java.util.Map; @@ -41,7 +42,7 @@ public void execute(CommandExecutor executor, String[] args) { if(ans.length == 0 || "cancel".equals(ans[0]) || !(ans[0] instanceof String)) return; String newValue = "None".equals(ans[0]) ? null : (String)ans[0]; player.setDisplayedOrder(OrderManager.getOrderKeyFromTitle(newValue)); - player.sendMessage(new EntityChangeMessage(player.getId(), player.getStatusConfig())); + player.sendMessage(new EventMessage("playerIconDidChange", player.getIconEmoji())); player.sendMessageToPeers(new EntityChangeMessage(player.getId(), player.getStatusConfig())); }); } diff --git a/gameserver/src/main/java/brainwine/gameserver/order/OrderManager.java b/gameserver/src/main/java/brainwine/gameserver/order/OrderManager.java index 73851104..27b57d1e 100644 --- a/gameserver/src/main/java/brainwine/gameserver/order/OrderManager.java +++ b/gameserver/src/main/java/brainwine/gameserver/order/OrderManager.java @@ -41,7 +41,7 @@ public static void loadOrders() { ordersMap.remove("all"); - ordersByTitle.putAll(JsonHelper.readValue(ordersMap, new TypeReference<>() {})); + ordersByTitle.putAll(JsonHelper.readValue(ordersMap, new TypeReference>() {})); for(Map.Entry orderPair : ordersByTitle.entrySet()) { orderPair.getValue().setTitle(orderPair.getKey()); diff --git a/gameserver/src/main/java/brainwine/gameserver/order/OrderTier.java b/gameserver/src/main/java/brainwine/gameserver/order/OrderTier.java index fc4c8775..cea0dc38 100644 --- a/gameserver/src/main/java/brainwine/gameserver/order/OrderTier.java +++ b/gameserver/src/main/java/brainwine/gameserver/order/OrderTier.java @@ -48,6 +48,9 @@ public boolean satisfies(Player player) { case "brain_lords_killed": compare = player.getStatistics().getKills(EntityRegistry.getEntityConfig("brains/large")); break; + case "crowns_spent": + compare = player.getStatistics().getCrownsSpent(); + break; } if(compare < requirements.get(requirement)) { diff --git a/gameserver/src/main/java/brainwine/gameserver/player/Player.java b/gameserver/src/main/java/brainwine/gameserver/player/Player.java index ec814892..ce3018ff 100644 --- a/gameserver/src/main/java/brainwine/gameserver/player/Player.java +++ b/gameserver/src/main/java/brainwine/gameserver/player/Player.java @@ -1236,6 +1236,7 @@ public String getDisplayedOrder() { return displayedOrder; } + /** Get value for the entity status "ni" field. Use {@code Player#getIconEmoji} when sending a playerIconDidChange EventMessage */ public String getIcon() { if(getDisplayedOrder() == null || !OrderManager.getOrders().containsKey(getDisplayedOrder()) @@ -1248,6 +1249,12 @@ public String getIcon() { ); } + /** Icon for sending a playerIconDidChange EventMessage. Use {@code Player#getIcon} for the entity status "ni" field. */ + public String getIconEmoji() { + String icon = getIcon(); + return icon == null ? null : "emoji/" + icon; + } + public void setDisplayedOrder(String displayedOrder) { this.displayedOrder = displayedOrder; } diff --git a/gameserver/src/main/java/brainwine/gameserver/zone/EntityManager.java b/gameserver/src/main/java/brainwine/gameserver/zone/EntityManager.java index 0c2ff5cf..8fc7d7e2 100644 --- a/gameserver/src/main/java/brainwine/gameserver/zone/EntityManager.java +++ b/gameserver/src/main/java/brainwine/gameserver/zone/EntityManager.java @@ -15,6 +15,7 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; +import brainwine.gameserver.server.messages.EventMessage; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -299,6 +300,7 @@ public void addEntity(Entity entity) { playersByName.put(player.getName().toLowerCase(), player); player.sendMessageToPeers(new EntityStatusMessage(player, EntityStatus.ENTERING)); player.sendMessageToPeers(new EntityPositionMessage(player)); + player.sendMessage(new EventMessage("playerIconDidChange", player.getIconEmoji())); } else if(entity instanceof Npc) { npcs.put(entityId, (Npc)entity); } From acfaa93481fe3257c7eaaad917836b9838d89c2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20Bora=20=C4=B0nevi?= Date: Fri, 20 Dec 2024 23:38:07 +0100 Subject: [PATCH 3/3] fix peer messages --- .../main/java/brainwine/gameserver/order/Order.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/gameserver/src/main/java/brainwine/gameserver/order/Order.java b/gameserver/src/main/java/brainwine/gameserver/order/Order.java index 0d2e7131..9d783f9e 100644 --- a/gameserver/src/main/java/brainwine/gameserver/order/Order.java +++ b/gameserver/src/main/java/brainwine/gameserver/order/Order.java @@ -23,26 +23,25 @@ public class Order { private List tiers; public void advance(Player player) { - int currentLevel = player.getOrders().getOrDefault(key, 0); - boolean advanced = false; + final int initialLevel = player.getOrders().getOrDefault(key, 0); + int currentLevel = initialLevel; while(currentLevel < tiers.size()) { int previousLevel = currentLevel; currentLevel = advanceOnce(player, currentLevel); if(previousLevel == currentLevel) break; - advanced = true; } - if(advanced && !hidden) { + if(currentLevel > initialLevel && !hidden) { String title, message, peerMessage; - if(currentLevel == 1) { + if(initialLevel == 0) { title = OrderManager.getInductionTitle(); message = inductionMessage + " " + title; - peerMessage = OrderManager.getPeerInductionMessage() + " " + title; + peerMessage = player.getName() + " " + OrderManager.getPeerInductionMessage() + " " + title; } else { title = OrderManager.getAdvancementTitle(); message = advancementMessage + " " + title; - peerMessage = OrderManager.getPeerAdvancementMessage() + " " + title; + peerMessage = player.getName() + " " + OrderManager.getPeerAdvancementMessage() + " " + title; } player.showDialog(DialogHelper.messageDialog(title, message));