diff --git a/scripts/commands/generic/addFriend.py b/scripts/commands/generic/addFriend.py index 485e1ee0a..18bc2fce8 100644 --- a/scripts/commands/generic/addFriend.py +++ b/scripts/commands/generic/addFriend.py @@ -1,8 +1,7 @@ from intents.chat import ChatAvatarRequestIntent from intents.chat import ChatBroadcastIntent from resources.encodables import ProsePackage -from intents.chat.ChatAvatarRequestIntent.RequestType import TARGET_STATUS -import sys +from intents.chat.ChatAvatarRequestIntent.RequestType import FRIEND_ADD_TARGET def execute(galacticManager, player, target, args): ghost = player.getPlayerObject() @@ -19,11 +18,8 @@ def execute(galacticManager, player, target, args): return if galacticManager.getPlayerManager().playerExists(name) is False: - ChatBroadcastIntent(player, ProsePackage("@cmnty:friend_duplicate", "TT", name)).broadcast() + ChatBroadcastIntent(player, ProsePackage("@cmnty:friend_not_found", "TT", name)).broadcast() return - ghost.addFriend(name) - ChatBroadcastIntent(player, ProsePackage("@cmnty:friend_added", "TT", name)).broadcast() - - ChatAvatarRequestIntent(player, name, TARGET_STATUS).broadcast() + ChatAvatarRequestIntent(player, name, FRIEND_ADD_TARGET).broadcast() return diff --git a/src/intents/chat/ChatAvatarRequestIntent.java b/src/intents/chat/ChatAvatarRequestIntent.java index 8243cbb2a..9a8fcef56 100644 --- a/src/intents/chat/ChatAvatarRequestIntent.java +++ b/src/intents/chat/ChatAvatarRequestIntent.java @@ -61,6 +61,8 @@ public class ChatAvatarRequestIntent extends Intent{ public enum RequestType { TARGET_STATUS, + FRIEND_ADD_TARGET, + FRIEND_REMOVE_TARGET, IGNORE_ADD_TARGET, IGNORE_REMOVE_TARGET } diff --git a/src/network/packets/swg/zone/chat/ChatOnAddFriend.java b/src/network/packets/swg/zone/chat/ChatOnAddFriend.java new file mode 100644 index 000000000..389268479 --- /dev/null +++ b/src/network/packets/swg/zone/chat/ChatOnAddFriend.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * 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 { + private 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/ChatOnChangeFriendStatus.java b/src/network/packets/swg/zone/chat/ChatOnChangeFriendStatus.java new file mode 100644 index 000000000..148618bca --- /dev/null +++ b/src/network/packets/swg/zone/chat/ChatOnChangeFriendStatus.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * 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 ChatOnChangeFriendStatus extends SWGPacket { + public static final int CRC = 0x54336726; + + private String galaxy; + private String friendName; + private boolean remove; + private long playerID; + + public ChatOnChangeFriendStatus(long playerID, String galaxy, String friendName, boolean remove) { + this.playerID = playerID; + this.galaxy = galaxy; + this.friendName = friendName; + this.remove = remove; + } + + @Override + public ByteBuffer encode() { + ByteBuffer bb = ByteBuffer.allocate(32 + galaxy.length() + friendName.length()); + addShort(bb, ((short) 0x06)); + addInt(bb, CRC); + addLong(bb, playerID); + addAscii(bb, "SWG"); + addAscii(bb, galaxy); + addAscii(bb, friendName); + addInt(bb, 0); + addInt(bb, (remove ? 1 : 0)); + addByte(bb, 0); + return bb; + } +} diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index 3b3264146..ddbae3bab 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -34,6 +34,7 @@ import intents.chat.ChatBroadcastIntent; import intents.chat.PersistentMessageIntent; import intents.chat.SpatialChatIntent; import intents.network.GalacticPacketIntent; +import intents.player.ZonePlayerSwapIntent; import intents.server.ServerStatusIntent; import network.packets.Packet; import network.packets.swg.SWGPacket; @@ -42,6 +43,8 @@ import network.packets.swg.zone.chat.ChatDeletePersistentMessage; import network.packets.swg.zone.chat.ChatFriendsListUpdate; import network.packets.swg.zone.chat.ChatInstantMessageToCharacter; import network.packets.swg.zone.chat.ChatInstantMessageToClient; +import network.packets.swg.zone.chat.ChatOnAddFriend; +import network.packets.swg.zone.chat.ChatOnChangeFriendStatus; import network.packets.swg.zone.chat.ChatOnSendInstantMessage; import network.packets.swg.zone.chat.ChatOnSendPersistentMessage; import network.packets.swg.zone.chat.ChatPersistentMessageToClient; @@ -89,6 +92,7 @@ public class ChatService extends Service { registerForIntent(ChatBroadcastIntent.TYPE); registerForIntent(ServerStatusIntent.TYPE); registerForIntent(ChatAvatarRequestIntent.TYPE); + registerForIntent(ZonePlayerSwapIntent.TYPE); mails.load(); mails.traverse(new Traverser() { @Override @@ -197,7 +201,7 @@ public class ChatService extends Service { broadcastGalaxyMessage(i.getMessage()); break; case PERSONAL: - broadcastPersonalMessage(i.getProse(), i.getBroadcaster()); + broadcastPersonalMessage(i.getProse(), i.getBroadcaster(), i.getMessage()); break; } } @@ -211,9 +215,29 @@ public class ChatService extends Service { break; case IGNORE_ADD_TARGET: break; + case FRIEND_ADD_TARGET: + handleAddFriend(i.getPlayer(), i.getTarget()); + break; } } + private void handleAddFriend(Player player, String target) { + PlayerObject ghost = player.getPlayerObject(); + if (ghost == null) + 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("@cmnty:friend_added", "TT", target)).broadcast(); + + sendTargetAvatarStatus(player, target); + } + private void handleChatRoomListRequest(Player player, ChatRequestRoomList request) { } @@ -378,9 +402,11 @@ public class ChatService extends Service { new NotifyPlayersPacketIntent(packet).broadcast(); } - private void broadcastPersonalMessage(ProsePackage prose, Player player) { - OutOfBand pckg = new OutOfBand(prose); - player.sendPacket(new ChatSystemMessage(SystemChatType.SCREEN_AND_CHAT, pckg)); + private void broadcastPersonalMessage(ProsePackage prose, Player player, String message) { + if (prose != null) + player.sendPacket(new ChatSystemMessage(SystemChatType.SCREEN_AND_CHAT, new OutOfBand(prose))); + else + player.sendPacket(new ChatSystemMessage(SystemChatType.SCREEN_AND_CHAT, message)); } private void sendPersistentMessageHeaders(Player player, String galaxy) {