diff --git a/src/resources/objects/creature/CreatureMessageBuilder.java b/src/resources/objects/creature/CreatureMessageBuilder.java index d7608031..7b22fd0d 100644 --- a/src/resources/objects/creature/CreatureMessageBuilder.java +++ b/src/resources/objects/creature/CreatureMessageBuilder.java @@ -737,6 +737,22 @@ public class CreatureMessageBuilder extends ObjectMessageBuilder { return buffer; } + + public IoBuffer buildGroupInviteDelta(long inviteSenderId, long inviteCounter, String leaderName) { + + IoBuffer buffer = bufferPool.allocate(18 + leaderName.length(), false).order(ByteOrder.LITTLE_ENDIAN); + + buffer.putLong(inviteSenderId); + buffer.put(getAsciiString(leaderName)); + buffer.putLong(inviteCounter); + + int size = buffer.position(); + buffer.flip(); + buffer = createDelta("CREO", (byte) 6, (short) 1, (short) 0x0E, buffer, size + 4); + + return buffer; + + } diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 2768623f..01fe8e79 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -936,6 +936,15 @@ public class CreatureObject extends TangibleObject implements IPersistent { } return null; } + + public void updateGroupInviteInfo() { + + if(getClient() == null || getClient().getSession() == null) + return; + + getClient().getSession().write(messageBuilder.buildGroupInviteDelta(getInviteSenderId(), getInviteCounter(), getInviteSenderName())); + + } } diff --git a/src/resources/objects/group/GroupObject.java b/src/resources/objects/group/GroupObject.java index 017fc482..e689ddc0 100644 --- a/src/resources/objects/group/GroupObject.java +++ b/src/resources/objects/group/GroupObject.java @@ -117,12 +117,7 @@ public class GroupObject extends SWGObject { memberList.add(member); setMemberListUpdateCounter(getMemberListUpdateCounter() + 1); - IoBuffer packet = messageBuilder.buildAddMemberDelta(member); - synchronized(memberList.getMutex()) { - for(SWGObject obj : memberList.get()) { - obj.getClient().getSession().write(packet); - } - } + notifyObservers(messageBuilder.buildAddMemberDelta(member), false); } @@ -132,13 +127,8 @@ public class GroupObject extends SWGObject { return; setMemberListUpdateCounter(getMemberListUpdateCounter() + 1); - IoBuffer packet = messageBuilder.buildRemoveMemberDelta(member); - synchronized(memberList.getMutex()) { - for(SWGObject obj : memberList.get()) { - obj.getClient().getSession().write(packet); - } - } - + notifyObservers(messageBuilder.buildRemoveMemberDelta(member), false); + memberList.remove(member); } diff --git a/src/services/GroupService.java b/src/services/GroupService.java index 3a1ce2d6..f572a732 100644 --- a/src/services/GroupService.java +++ b/src/services/GroupService.java @@ -24,9 +24,11 @@ package services; import java.util.Map; import resources.objects.creature.CreatureObject; +import resources.objects.group.GroupObject; import main.NGECore; +import engine.clients.Client; import engine.resources.objects.SWGObject; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; @@ -40,6 +42,7 @@ public class GroupService implements INetworkDispatch { core.commandService.registerCommand("invite"); core.commandService.registerCommand("join"); core.commandService.registerCommand("disband"); + core.commandService.registerCommand("decline"); } @Override @@ -52,10 +55,79 @@ public class GroupService implements INetworkDispatch { } - public void handleGroupInvite(CreatureObject inviter, CreatureObject invited) { + public void handleGroupInvite(CreatureObject leader, CreatureObject member) { + + Client leaderClient = leader.getClient(); + Client memberClient = member.getClient(); + + if(leaderClient == null || memberClient == null) + return; + + long leaderGroupId = leader.getGroupId(); + long memberGroupId = member.getGroupId(); + + if(leader == member) { + leader.sendSystemMessage("@group:invite_no_target_self", (byte) 0); + return; + } + + if(memberGroupId != 0) { + leader.sendSystemMessage(member.getCustomName() + " is already in a group.", (byte) 0); + return; + } + + + if(leaderGroupId != 0) { + + GroupObject group = (GroupObject) core.objectService.getObject(leaderGroupId); + + if(group.getGroupLeader() != leader) { + leader.sendSystemMessage("@group:must_be_leader", (byte) 0); + return; + } + + if(group.getMemberList().size() >= 8) { + leader.sendSystemMessage("@group:full", (byte) 0); + return; + } + + } + + if(member.getInviteSenderId() != 0 && member.getInviteSenderId() != leader.getObjectID()) { + leader.sendSystemMessage(member.getCustomName() + " is considering joining another group.", (byte) 0); + return; + } + + if(member.getInviteSenderId() != 0 && member.getInviteSenderId() == leader.getObjectID()) { + leader.sendSystemMessage(member.getCustomName() + " has already been invited to join your group.", (byte) 0); + return; + } + + leader.sendSystemMessage("You invite " + member.getCustomName() + " to join the group.", (byte) 0); + member.setInviteCounter(member.getInviteCounter() + 1); + member.setInviteSenderId(member.getObjectId()); + member.setInviteSenderName(leader.getCustomName()); + + member.updateGroupInviteInfo(); } + public void handleGroupDecline(CreatureObject invited) { + + CreatureObject leader = (CreatureObject) core.objectService.getObject(invited.getInviteSenderId()); + + invited.setInviteCounter(invited.getInviteCounter() + 1); + invited.setInviteSenderId(0); + invited.setInviteSenderName(""); + + invited.sendSystemMessage("You decline to join " + leader.getCustomName() + "'s group.", (byte) 0); + invited.updateGroupInviteInfo(); + + leader.sendSystemMessage(invited.getCustomName() + " declines to join your group.", (byte) 0); + + } + + }