From 1b50a63d224c9daa09bdfa6e93db1448e292a528 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Tue, 18 Aug 2015 08:19:32 -0400 Subject: [PATCH 1/5] Fixed CORE-247 'First entry for an SDF beyond header and types is no longer ignored' CORE-241 'Mos Eisley will now show up on planetary map' is also fixed since it's a result of CORE-247 --- src/resources/client_info/ServerFactory.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/resources/client_info/ServerFactory.java b/src/resources/client_info/ServerFactory.java index f899c1c1f..69770dce6 100644 --- a/src/resources/client_info/ServerFactory.java +++ b/src/resources/client_info/ServerFactory.java @@ -72,13 +72,13 @@ public final class ServerFactory extends DataFactory { File iff = new File(name); if (!iff.exists()) { - convertSif(path, name); + convertSdf(path, name); System.out.println("Created Server Datatable: " + name); Log.i("ServerFactory", "Created Server Datatable: %s", name); } else { File sif = path.toFile(); if (sif.lastModified() > iff.lastModified()) { - convertSif(path, name); + convertSdf(path, name); System.out.println("Updated Server Datatable: " + name); Log.i("ServerFactory", "Updated Server Datatable: %s", name); } @@ -99,7 +99,7 @@ public final class ServerFactory extends DataFactory { }); } - private void convertSif(Path sif, String newPath) { + private void convertSdf(Path sif, String newPath) { SWGFile swgFile = new SWGFile(newPath, "DTII"); DatatableData data = (DatatableData) createDataObject(swgFile); @@ -142,11 +142,10 @@ public final class ServerFactory extends DataFactory { } } } - itr.remove(); } if (columnNames == null || columnTypes == null) { - System.err.println("Failed to convert sif " + sif.getFileName()); + System.err.println("Failed to convert sdf " + sif.getFileName()); return; } From 831764c116e225a86aeddfc865cf9ef876d171d3 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Tue, 18 Aug 2015 08:26:15 -0400 Subject: [PATCH 2/5] Merge conflict fix from prior commit --- cfg/features.cfg | 6 +----- cfg/network.cfg | 6 +----- cfg/nge.cfg | 6 +----- 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/cfg/features.cfg b/cfg/features.cfg index 66db0f670..539418e7c 100644 --- a/cfg/features.cfg +++ b/cfg/features.cfg @@ -1,5 +1 @@ -<<<<<<< Updated upstream -# 12/08/2015 21:56:03 CDT -======= -# 15/08/2015 18:18:06 CDT ->>>>>>> Stashed changes +# 18/08/2015 08:24:35 EDT diff --git a/cfg/network.cfg b/cfg/network.cfg index c46191f87..34a2bfd64 100644 --- a/cfg/network.cfg +++ b/cfg/network.cfg @@ -1,8 +1,4 @@ -<<<<<<< Updated upstream -# 12/08/2015 21:56:03 CDT -======= -# 15/08/2015 18:18:06 CDT ->>>>>>> Stashed changes +# 18/08/2015 08:24:35 EDT AUTO-LOGIN=0 LOGIN-PORT=44453 LOGIN-SERVER-ID=1 diff --git a/cfg/nge.cfg b/cfg/nge.cfg index 898db3f41..069b17340 100644 --- a/cfg/nge.cfg +++ b/cfg/nge.cfg @@ -1,8 +1,4 @@ -<<<<<<< Updated upstream -# 12/08/2015 21:56:03 CDT -======= -# 15/08/2015 18:18:06 CDT ->>>>>>> Stashed changes +# 18/08/2015 08:24:35 EDT CLEAN-CHARACTER-DATA=0 ENABLE-LOGGING=true GALAXY-MAX-CHARACTERS=1000000 From b5d695fafdd3bf4144facfb604671209f301e749 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Tue, 18 Aug 2015 09:05:38 -0400 Subject: [PATCH 3/5] Fixed friends list system messages not displaying properly --- .../swg/zone/chat/ChatFriendsListUpdate.java | 27 +++---- .../swg/zone/chat/ChatOnAddFriend.java | 50 ------------- .../swg/zone/chat/ChatOnGetFriendsList.java | 73 ------------------- src/services/chat/ChatManager.java | 60 ++++++--------- 4 files changed, 34 insertions(+), 176 deletions(-) delete mode 100644 src/network/packets/swg/zone/chat/ChatOnAddFriend.java delete mode 100644 src/network/packets/swg/zone/chat/ChatOnGetFriendsList.java diff --git a/src/network/packets/swg/zone/chat/ChatFriendsListUpdate.java b/src/network/packets/swg/zone/chat/ChatFriendsListUpdate.java index 7451f2e4f..77fa0851e 100644 --- a/src/network/packets/swg/zone/chat/ChatFriendsListUpdate.java +++ b/src/network/packets/swg/zone/chat/ChatFriendsListUpdate.java @@ -28,21 +28,20 @@ package network.packets.swg.zone.chat; import network.packets.swg.SWGPacket; +import resources.chat.ChatAvatar; import java.nio.ByteBuffer; public class ChatFriendsListUpdate extends SWGPacket { public static final int CRC = getCrc("ChatFriendsListUpdate"); - - private String galaxy; - private String friendName; + + private ChatAvatar friend; private boolean online; public ChatFriendsListUpdate() {} - public ChatFriendsListUpdate(String galaxy, String friendName, boolean online) { - this.galaxy = galaxy; - this.friendName = friendName; + public ChatFriendsListUpdate(ChatAvatar friend, boolean online) { + this.friend = friend; this.online = online; } @@ -53,26 +52,20 @@ public class ChatFriendsListUpdate extends SWGPacket { public void decode(ByteBuffer data) { if (!super.decode(data, CRC)) return; - // TODO: Use ChatAvatar - getAscii(data); // SWG - galaxy = getAscii(data); - friendName = getAscii(data); + friend = getEncodable(data, ChatAvatar.class); online = getBoolean(data); } public ByteBuffer encode() { - int stringLength = 9 + galaxy.length() + friendName.length(); - ByteBuffer data = ByteBuffer.allocate(stringLength + 7); + ByteBuffer data = ByteBuffer.allocate(7 + friend.encode().length); addShort (data, 3); addInt (data, CRC); - addAscii (data, "SWG"); - addAscii (data, galaxy); - addAscii (data, friendName); + addEncodable(data, friend); addBoolean(data, online); return data; } - public String getFriendName() { - return friendName; + public ChatAvatar getFriend() { + return friend; } } diff --git a/src/network/packets/swg/zone/chat/ChatOnAddFriend.java b/src/network/packets/swg/zone/chat/ChatOnAddFriend.java deleted file mode 100644 index f3dbf6020..000000000 --- a/src/network/packets/swg/zone/chat/ChatOnAddFriend.java +++ /dev/null @@ -1,50 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 /// Project SWG /// www.projectswg.com - * - * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on - * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. - * Our goal is to create an emulator which will provide a server for players to - * continue playing a game similar to the one they used to play. We are basing - * it on the final publish of the game prior to end-game events. - * - * This file is part of Holocore. - * - * -------------------------------------------------------------------------------- - * - * Holocore is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * Holocore is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Holocore. If not, see - ******************************************************************************/ - -package network.packets.swg.zone.chat; - -import network.packets.swg.SWGPacket; - -import java.nio.ByteBuffer; - -/** - * @author Waverunner - */ -public class ChatOnAddFriend extends SWGPacket { - public static final int CRC = 0x2B2A0D94; - - public ChatOnAddFriend() {} - - @Override - public ByteBuffer encode() { - ByteBuffer bb = ByteBuffer.allocate(14); - addShort(bb, 3); - addInt(bb, CRC); - addLong(bb, 0); - return bb; - } -} diff --git a/src/network/packets/swg/zone/chat/ChatOnGetFriendsList.java b/src/network/packets/swg/zone/chat/ChatOnGetFriendsList.java deleted file mode 100644 index 7460eb40f..000000000 --- a/src/network/packets/swg/zone/chat/ChatOnGetFriendsList.java +++ /dev/null @@ -1,73 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 /// Project SWG /// www.projectswg.com - * - * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on - * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. - * Our goal is to create an emulator which will provide a server for players to - * continue playing a game similar to the one they used to play. We are basing - * it on the final publish of the game prior to end-game events. - * - * This file is part of Holocore. - * - * -------------------------------------------------------------------------------- - * - * Holocore is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * Holocore is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Holocore. If not, see - ******************************************************************************/ - -package network.packets.swg.zone.chat; - -import network.packets.swg.SWGPacket; - -import java.nio.ByteBuffer; -import java.util.List; - -/** - * @author Waverunner - */ -public class ChatOnGetFriendsList extends SWGPacket { - public static final int CRC = 0xE97AB594; - - private List friends; - private String galaxy; - private long objectId; - - public ChatOnGetFriendsList(long objectId, String galaxy, List friends) { - this.objectId = objectId; - this.galaxy = galaxy; - this.friends = friends; - } - - @Override - public ByteBuffer encode() { - int additional = galaxy.length() + 9; - int length = 0; - for (String friend : friends) { - length += friend.length() + additional; - } - - ByteBuffer bb = ByteBuffer.allocate(18 + length); - addShort(bb, 3); - addInt(bb, CRC); - addLong(bb, objectId); - - addInt(bb, friends.size()); - for (String friend : friends) { - addAscii(bb, "SWG"); - addAscii(bb, galaxy); - addAscii(bb, friend); - } - - return bb; - } -} diff --git a/src/services/chat/ChatManager.java b/src/services/chat/ChatManager.java index 672c2644d..1262ed557 100644 --- a/src/services/chat/ChatManager.java +++ b/src/services/chat/ChatManager.java @@ -43,6 +43,7 @@ import network.packets.swg.zone.chat.ChatSystemMessage.SystemChatType; import network.packets.swg.zone.object_controller.SpatialChat; import resources.Galaxy; import resources.Terrain; +import resources.chat.ChatAvatar; import resources.chat.ChatResult; import resources.collections.SWGList; import resources.control.Intent; @@ -176,14 +177,14 @@ public class ChatManager extends Manager { break; case PE_FIRST_ZONE: sendPersistentMessageHeaders(player, intent.getGalaxy()); - updateChatAvatarStatus(player, intent.getGalaxy(), true); + updateChatAvatarStatus(player, true); if (player.getPlayerObject() != null) roomService.enterChatChannels(player, player.getPlayerObject().getJoinedChannels()); break; case PE_LOGGED_OUT: if (player.getCreatureObject() == null) break; - updateChatAvatarStatus(player, intent.getGalaxy(), false); + updateChatAvatarStatus(player, false); break; default: break; } @@ -208,9 +209,11 @@ public class ChatManager extends Manager { private void handleChatAvatarStatusRequestIntent(ChatAvatarRequestIntent i) { switch (i.getRequestType()) { - case TARGET_STATUS: - sendTargetAvatarStatus(i.getPlayer(), i.getTarget()); + case TARGET_STATUS: { + Player player = i.getPlayer(); + sendTargetAvatarStatus(player, new ChatAvatar(0, i.getTarget(), player.getGalaxyName())); break; + } case IGNORE_REMOVE_TARGET: break; case IGNORE_ADD_TARGET: @@ -235,7 +238,6 @@ public class ChatManager extends Manager { return; SWGList friends = (SWGList) ghost.getFriendsList(); - player.sendPacket(new ChatOnGetFriendsList(player.getCreatureObject().getObjectId(), player.getGalaxyName(), friends)); friends.sendRefreshedListData(ghost); } @@ -245,14 +247,9 @@ public class ChatManager extends Manager { if (ghost == null) return; - ChatOnChangeFriendStatus friendStatus = new ChatOnChangeFriendStatus( - player.getCreatureObject().getObjectId(), player.getGalaxyName(), target, true); - - player.sendPacket(friendStatus); - ghost.removeFriend(target); - new ChatBroadcastIntent(player, new ProsePackage("@cmnty:friend_removed", "TT", target)).broadcast(); + new ChatBroadcastIntent(player, new ProsePackage("StringId", "@cmnty:friend_removed", "TT", target)).broadcast(); } private void handleAddFriend(Player player, String target) { @@ -264,27 +261,22 @@ public class ChatManager extends Manager { return; if (ghost.getFriendsList().contains(target)) { - new ChatBroadcastIntent(player, new ProsePackage("@cmnty:friend_duplicate", "TT", target)).broadcast(); + new ChatBroadcastIntent(player, new ProsePackage("StringId", "@cmnty:friend_duplicate", "TT", target)).broadcast(); return; } if (!player.getPlayerManager().playerExists(target)) { - new ChatBroadcastIntent(player, new ProsePackage("@cmnty:friend_not_found", "TT", target)).broadcast(); + new ChatBroadcastIntent(player, new ProsePackage("StringId", "@cmnty:friend_not_found", "TT", target)).broadcast(); return; } - ChatOnChangeFriendStatus friendStatus = new ChatOnChangeFriendStatus( - player.getCreatureObject().getObjectId(), player.getGalaxyName(), target, false); - - player.sendPacket(new ChatOnAddFriend(), friendStatus); + ghost.addFriend(target); + new ChatBroadcastIntent(player, new ProsePackage("StringId", "@cmnty:friend_added", "TT", target)).broadcast(); Player targetPlayer = player.getPlayerManager().getPlayerByCreatureFirstName(target); + if (targetPlayer != null && targetPlayer.getPlayerState() == PlayerState.ZONED_IN) - player.sendPacket(new ChatFriendsListUpdate(player.getGalaxyName(), target, true)); - - ghost.addFriend(target); - - new ChatBroadcastIntent(player, new ProsePackage("@cmnty:friend_added", "TT", target)).broadcast(); + player.sendPacket(new ChatFriendsListUpdate(new ChatAvatar(0, target, targetPlayer.getGalaxyName()), true)); } private void handleSpatialChat(SpatialChatIntent i) { @@ -387,48 +379,44 @@ public class ChatManager extends Manager { /* Friends */ - private void updateChatAvatarStatus(Player player, String galaxy, boolean online) { + private void updateChatAvatarStatus(Player player, boolean online) { PlayerManager playerManager = player.getPlayerManager(); - String firstName = player.getCharacterName().toLowerCase(); - if (firstName.contains(" ")) - firstName = firstName.substring(0, firstName.indexOf(' ')); + ChatAvatar avatar = ChatAvatar.getFromPlayer(player); + String galaxy = player.getGalaxyName(); if (online) { PlayerObject playerObject = player.getPlayerObject(); if (playerObject != null && playerObject.getFriendsList().size() <= 0) { for (String friend : playerObject.getFriendsList()) { - sendTargetAvatarStatus(player, friend); + sendTargetAvatarStatus(player, new ChatAvatar(0, friend, galaxy)); } } } - final ChatFriendsListUpdate update = new ChatFriendsListUpdate(galaxy, firstName, online); + final ChatFriendsListUpdate update = new ChatFriendsListUpdate(avatar, online); + playerManager.notifyPlayers(playerNotified -> { if (playerNotified.getPlayerState() != PlayerState.ZONED_IN) return false; PlayerObject playerObject = playerNotified.getPlayerObject(); - if (playerObject == null || playerObject.getFriendsList().size() <= 0) - return false; + return playerObject != null && playerObject.getFriendsList().contains(update.getFriend().getName()); - List friends = playerObject.getFriendsList(); - return friends.contains(update.getFriendName()); }, update); } - private void sendTargetAvatarStatus(Player player, String target) { + private void sendTargetAvatarStatus(Player player, ChatAvatar target) { PlayerObject object = player.getPlayerObject(); if (object == null) return; - Player targetPlayer = player.getPlayerManager().getPlayerByCreatureFirstName(target); + Player targetPlayer = player.getPlayerManager().getPlayerByCreatureFirstName(target.getName()); boolean online = true; if (targetPlayer == null || targetPlayer.getPlayerState() != PlayerState.ZONED_IN) online = false; - ChatFriendsListUpdate update = new ChatFriendsListUpdate(player.getGalaxyName(), target, online); - player.sendPacket(update); + player.sendPacket(new ChatFriendsListUpdate(target, online)); } private void broadcastAreaMessage(String message, Player broadcaster) { From ba3ef391e10f56fe04ec90cec76e3c4eec1fce6f Mon Sep 17 00:00:00 2001 From: Waverunner Date: Tue, 18 Aug 2015 09:31:35 -0400 Subject: [PATCH 4/5] Added/removed empty lines on all sdf's so they will force re-create the corresponding iff's for prior commit to go into effect --- serverdata/chat/default_rooms.sdf | 2 +- serverdata/chat/planets.sdf | 2 +- serverdata/map/map_locations.sdf | 2 +- serverdata/map/static_city_points.sdf | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/serverdata/chat/default_rooms.sdf b/serverdata/chat/default_rooms.sdf index a64a55bf0..0dc0aae16 100644 --- a/serverdata/chat/default_rooms.sdf +++ b/serverdata/chat/default_rooms.sdf @@ -22,4 +22,4 @@ BeastMastery Beast Mastery chat for this galaxy Auction Auction chat for this galaxy GuildLeader Guild leader chat for this galaxy Mayor Mayor chat for this galaxy -Trader Trader chat for this galaxy +Trader Trader chat for this galaxy \ No newline at end of file diff --git a/serverdata/chat/planets.sdf b/serverdata/chat/planets.sdf index 6a7c19935..e0881eea1 100644 --- a/serverdata/chat/planets.sdf +++ b/serverdata/chat/planets.sdf @@ -11,4 +11,4 @@ naboo rori tatooine talus -yavin4 \ No newline at end of file +yavin4 diff --git a/serverdata/map/map_locations.sdf b/serverdata/map/map_locations.sdf index 385836514..4f06e1576 100644 --- a/serverdata/map/map_locations.sdf +++ b/serverdata/map/map_locations.sdf @@ -104,4 +104,4 @@ object/building/mustafar/structures/must_mining_clone_marker.iff cloningfacilit object/building/naboo/rori_restuss_starport.iff starport object/building/naboo/rori_restuss_shuttleport.iff shuttleport object/building/dathomir/dathomir_quarantine_zone_starport.iff starport -object/building/dathomir/dathomir_quarantine_zone_cantina.iff cantina +object/building/dathomir/dathomir_quarantine_zone_cantina.iff cantina \ No newline at end of file diff --git a/serverdata/map/static_city_points.sdf b/serverdata/map/static_city_points.sdf index f80d06a2d..463eee351 100644 --- a/serverdata/map/static_city_points.sdf +++ b/serverdata/map/static_city_points.sdf @@ -34,4 +34,4 @@ dathomir Trade Outpost 599 3071 dathomir Quarentine Zone -5780 -6550 dathomir Science Outpost -85 -1600 lok Nym's Stronghold 440 5029 -lok Imperial Outpost -1920 -3084 +lok Imperial Outpost -1920 -3084 \ No newline at end of file From 7ade47c37551529e6dc9cfe0458ec6459e1ab42c Mon Sep 17 00:00:00 2001 From: Waverunner Date: Tue, 18 Aug 2015 09:55:31 -0400 Subject: [PATCH 5/5] Fixed value parsing error for SDF's and added catch clause for future failures --- src/resources/client_info/ServerFactory.java | 23 ++++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/resources/client_info/ServerFactory.java b/src/resources/client_info/ServerFactory.java index 69770dce6..5cb6a44dc 100644 --- a/src/resources/client_info/ServerFactory.java +++ b/src/resources/client_info/ServerFactory.java @@ -128,6 +128,7 @@ public final class ServerFactory extends DataFactory { lineNum++; if (lineNum == 0) { columnNames = row.split("\t"); + itr.remove(); } else if (lineNum == 1) { columnTypes = row.split("\t"); for (int i = 0; i < columnTypes.length; i++) { @@ -141,6 +142,7 @@ public final class ServerFactory extends DataFactory { defaultValues.add(""); } } + itr.remove(); } } @@ -152,6 +154,7 @@ public final class ServerFactory extends DataFactory { table = new Object[rows.size()][columnTypes.length]; for (int i = 0; i < rows.size(); i++) { + System.out.println(rows.get(i)); createDatatableRow(i, rows.get(i), columnTypes, table, defaultValues); } @@ -176,14 +179,20 @@ public final class ServerFactory extends DataFactory { if (val.isEmpty() && !defValues.get(t).isEmpty()) val = defValues.get(t); - switch(type) { - case "b": table[rowNum][t] = Boolean.valueOf(val); break; - case "h": - case "i": table[rowNum][t] = Integer.valueOf(val); break; - case "f": table[rowNum][t] = Float.valueOf(val); break; - case "s": table[rowNum][t] = val; break; - default: System.err.println("Don't know how to parse type " + type); break; + try { + switch(type) { + case "b": table[rowNum][t] = Boolean.valueOf(val); break; + case "h": + case "i": table[rowNum][t] = Integer.valueOf(val); break; + case "f": table[rowNum][t] = Float.valueOf(val); break; + case "s": table[rowNum][t] = val; break; + default: System.err.println("Don't know how to parse type " + type); break; + } + } catch (NumberFormatException e) { + Log.e("ServerFactory:createDatableRow", "Cannot format string %s to a number", val); + e.printStackTrace(); } + } }