diff --git a/ngengine_public.jar b/ngengine_public.jar index 97f05a6f..201501ca 100644 Binary files a/ngengine_public.jar and b/ngengine_public.jar differ diff --git a/scripts/commands/decline.py b/scripts/commands/decline.py new file mode 100644 index 00000000..08d0930c --- /dev/null +++ b/scripts/commands/decline.py @@ -0,0 +1,10 @@ +import sys + +def setup(): + return + +def run(core, actor, target, commandString): + if actor: + core.groupService.handleGroupDecline(actor) + return + \ No newline at end of file diff --git a/scripts/commands/disband.py b/scripts/commands/disband.py new file mode 100644 index 00000000..49cd24b0 --- /dev/null +++ b/scripts/commands/disband.py @@ -0,0 +1,10 @@ +import sys + +def setup(): + return + +def run(core, actor, target, commandString): + if actor: + core.groupService.handleGroupDisband(actor) + return + \ No newline at end of file diff --git a/scripts/commands/join.py b/scripts/commands/join.py new file mode 100644 index 00000000..9a383d5c --- /dev/null +++ b/scripts/commands/join.py @@ -0,0 +1,10 @@ +import sys + +def setup(): + return + +def run(core, actor, target, commandString): + if actor: + core.groupService.handleGroupJoin(actor) + return + \ No newline at end of file diff --git a/src/main/NGECore.java b/src/main/NGECore.java index f43d636a..3c22a351 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -37,6 +37,7 @@ import services.AttributeService; import services.BuffService; import services.CharacterService; import services.ConnectionService; +import services.GroupService; import services.LoginService; import services.PlayerService; import services.ScriptService; @@ -64,6 +65,7 @@ import engine.clientdata.visitors.TerrainVisitor; import engine.clientdata.visitors.WorldSnapshotVisitor; import engine.clientdata.visitors.WorldSnapshotVisitor.SnapshotChunk; import engine.clients.Client; +import engine.resources.common.CRC; import engine.resources.common.PHPBB3Auth; import engine.resources.config.Config; import engine.resources.config.DefaultConfig; @@ -113,6 +115,7 @@ public class NGECore { public PlayerService playerService; public BuffService buffService; public StaticService staticService; + public GroupService groupService; // Login Server public NetworkDispatch loginDispatch; @@ -162,6 +165,7 @@ public class NGECore { combatService = new CombatService(this); playerService = new PlayerService(this); buffService = new BuffService(this); + groupService = new GroupService(this); // Ping Server try { PingServer pingServer = new PingServer(config.getInt("PING.PORT")); diff --git a/src/protocol/swg/ChatPersistentMessageToServer.java b/src/protocol/swg/ChatPersistentMessageToServer.java index 23be8a29..a8602f83 100644 --- a/src/protocol/swg/ChatPersistentMessageToServer.java +++ b/src/protocol/swg/ChatPersistentMessageToServer.java @@ -89,7 +89,7 @@ public class ChatPersistentMessageToServer extends SWGMessage { waypoint.active = false; waypointAttachments.add(waypoint); - + System.out.println(waypoint.name); if(appendByte > 0) buffer.get(); diff --git a/src/resources/objects/group/GroupMessageBuilder.java b/src/resources/objects/group/GroupMessageBuilder.java index 0d2ec6be..a036ab85 100644 --- a/src/resources/objects/group/GroupMessageBuilder.java +++ b/src/resources/objects/group/GroupMessageBuilder.java @@ -93,8 +93,8 @@ public class GroupMessageBuilder extends ObjectMessageBuilder { buffer.putInt(group.getMemberList().size()); buffer.putInt(group.getMemberListUpdateCounter()); - synchronized(group.getMemberList().getMutex()) { - for(SWGObject obj : group.getMemberList().get()) { + synchronized(group.getMemberList()) { + for(SWGObject obj : group.getMemberList()) { buffer.putLong(obj.getObjectID()); buffer.put(getAsciiString(obj.getCustomName())); } diff --git a/src/resources/objects/group/GroupObject.java b/src/resources/objects/group/GroupObject.java index e689ddc0..168897bd 100644 --- a/src/resources/objects/group/GroupObject.java +++ b/src/resources/objects/group/GroupObject.java @@ -21,6 +21,8 @@ ******************************************************************************/ package resources.objects.group; +import java.util.Vector; + import org.apache.mina.core.buffer.IoBuffer; import resources.objects.SWGList; @@ -32,7 +34,7 @@ import engine.resources.scene.Quaternion; public class GroupObject extends SWGObject { - private SWGList memberList = new SWGList(); + private Vector memberList = new Vector(); private int memberListUpdateCounter; private SWGObject groupLeader; private SWGObject lootMaster; @@ -45,7 +47,7 @@ public class GroupObject extends SWGObject { messageBuilder = new GroupMessageBuilder(this); } - public SWGList getMemberList() { + public Vector getMemberList() { return memberList; } @@ -126,9 +128,10 @@ public class GroupObject extends SWGObject { if(memberList.size() <= 0 || member.getClient() == null) return; + setMemberListUpdateCounter(getMemberListUpdateCounter() + 1); notifyObservers(messageBuilder.buildRemoveMemberDelta(member), false); - + memberList.remove(member); } diff --git a/src/services/CharacterService.java b/src/services/CharacterService.java index 945d15c6..97f16a06 100644 --- a/src/services/CharacterService.java +++ b/src/services/CharacterService.java @@ -207,13 +207,13 @@ public class CharacterService implements INetworkDispatch { // should set to some planet and starting location String sharedRaceTemplate = raceTemplate.replace("player/", "player/shared_"); - CreatureObject object = (CreatureObject) core.objectService.createObject(sharedRaceTemplate, core.terrainService.getPlanetList().get(0)); + CreatureObject object = (CreatureObject) core.objectService.createObject(sharedRaceTemplate, core.terrainService.getPlanetByName("naboo")); object.setContainerPermissions(CreaturePermissions.CREATURE_PERMISSIONS); object.setCustomization(clientCreateCharacter.getCustomizationData()); object.setCustomName(clientCreateCharacter.getName()); object.setHeight(clientCreateCharacter.getScale()); object.setPersistent(true); - object.setPosition(new Point3D(-1294, 12, -3590)); + object.setPosition(new Point3D(-5567, 0, -32)); object.setCashCredits(100); object.setBankCredits(1000); //object.setPosition(new Point3D(0, 0, 0)); diff --git a/src/services/GroupService.java b/src/services/GroupService.java index f572a732..b3c1832f 100644 --- a/src/services/GroupService.java +++ b/src/services/GroupService.java @@ -21,6 +21,8 @@ ******************************************************************************/ package services; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import resources.objects.creature.CreatureObject; @@ -105,7 +107,7 @@ public class GroupService implements INetworkDispatch { leader.sendSystemMessage("You invite " + member.getCustomName() + " to join the group.", (byte) 0); member.setInviteCounter(member.getInviteCounter() + 1); - member.setInviteSenderId(member.getObjectId()); + member.setInviteSenderId(leader.getObjectId()); member.setInviteSenderName(leader.getCustomName()); member.updateGroupInviteInfo(); @@ -127,7 +129,111 @@ public class GroupService implements INetworkDispatch { } + public void handleGroupJoin(CreatureObject invited) { + + + if(invited.getInviteSenderId() == 0 || invited.getGroupId() != 0) + return; + + CreatureObject leader = (CreatureObject) core.objectService.getObject(invited.getInviteSenderId()); + + if(leader == null) + return; + + if(leader.getGroupId() == 0) { + + GroupObject group = (GroupObject) core.objectService.createObject("object/group/shared_group_object.iff", leader.getPlanet()); + group.setGroupLeader(leader); + group.getMemberList().add(leader); + group.getMemberList().add(invited); + leader.makeAware(group); + leader.setGroupId(group.getObjectID()); + invited.makeAware(group); + invited.setGroupId(group.getObjectID()); + return; + + } + + GroupObject group = (GroupObject) core.objectService.getObject(leader.getGroupId()); + + if(group != null && group.getMemberList().size() < 8) { + + group.addMember(invited); + invited.makeAware(group); + invited.setGroupId(group.getObjectID()); + invited.sendSystemMessage("@group:joined_self", (byte) 0); + + } else if(group.getMemberList().size() >= 8) { + + invited.sendSystemMessage("@group:full", (byte) 0); + invited.setInviteCounter(invited.getInviteCounter() + 1); + invited.setInviteSenderId(0); + invited.setInviteSenderName(""); + invited.updateGroupInviteInfo(); + + return; + + } + + + + } + public void handleGroupDisband(CreatureObject creature) { + + if(creature.getGroupId() == 0) + return; + + GroupObject group = (GroupObject) core.objectService.getObject(creature.getGroupId()); + + if(group == null) + return; + + List memberList = new ArrayList(group.getMemberList()); + + if(group.getGroupLeader() != creature && group.getMemberList().size() > 2) { + + group.removeMember(creature); + creature.setInviteCounter(creature.getInviteCounter() + 1); + creature.setInviteSenderId(0); + creature.setInviteSenderName(""); + creature.updateGroupInviteInfo(); + creature.setGroupId(0); + creature.makeUnaware(group); + creature.sendSystemMessage("You have left the group.", (byte) 0); + + for(SWGObject member : memberList) { + + CreatureObject creature2 = (CreatureObject) member; + creature2.sendSystemMessage(creature.getCustomName() + " has left the group.", (byte) 0); + + } + + } else { + + for(SWGObject member : memberList) { + + CreatureObject creature2 = (CreatureObject) member; + + creature2.setInviteCounter(creature2.getInviteCounter() + 1); + creature2.setInviteSenderId(0); + creature2.setInviteSenderName(""); + creature2.updateGroupInviteInfo(); + creature2.setGroupId(0); + + creature2.makeUnaware(group); + + creature2.sendSystemMessage("The group has been disbanded.", (byte) 0); + + } + + core.objectService.destroyObject(group.getObjectID()); + + } + + } + + } diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index eaccd7c6..06d4751c 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -448,6 +448,10 @@ public class SimulationService implements INetworkDispatch { CreatureObject object = (CreatureObject) client.getParent(); PlayerObject ghost = (PlayerObject) object.getSlottedObject("ghost"); + if(object.getGroupId() != 0) + core.groupService.handleGroupDisband(object); + + if (ghost != null) { String objectShortName = object.getCustomName(); diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index f8f7123c..db8426c2 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -358,7 +358,7 @@ public class ChatService implements INetworkDispatch { if(friendList.contains(friendName)) { actor.friendRemove(friendName); - //friendList.remove(friendName); + friendList.remove(friendName); } } } diff --git a/src/services/command/CommandService.java b/src/services/command/CommandService.java index 4c613808..3b8d7463 100644 --- a/src/services/command/CommandService.java +++ b/src/services/command/CommandService.java @@ -79,6 +79,7 @@ public class CommandService implements INetworkDispatch { BaseSWGCommand command = getCommandByCRC(commandEnqueue.getCommandCRC()); if(command == null) { + //System.out.println("Unknown Command CRC: " + commandEnqueue.getCommandCRC()); return; } diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 0810e682..0ac051ca 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -70,6 +70,7 @@ import main.NGECore; import resources.objects.building.BuildingObject; import resources.objects.cell.CellObject; import resources.objects.creature.CreatureObject; +import resources.objects.group.GroupObject; import resources.objects.guild.GuildObject; import resources.objects.player.PlayerObject; import resources.objects.staticobject.StaticObject; @@ -173,8 +174,14 @@ public class ObjectService implements INetworkDispatch { object = new GuildObject(core, objectID, planet, position, orientation, Template); + } else if(Template.startsWith("object/group")) { + + object = new GroupObject(objectID); + } else if(Template.startsWith("object/waypoint")) { + object = new WaypointObject(objectID, planet, position); + } else { return null;