diff --git a/scripts/radial/object/guild_access_device.py b/scripts/radial/object/guild_access_device.py index 48784bda..4c92fbe7 100644 --- a/scripts/radial/object/guild_access_device.py +++ b/scripts/radial/object/guild_access_device.py @@ -45,7 +45,7 @@ def createRadial(core, owner, target, radials): radials.add(RadialOptions(4, RadialOptions.serverGuildSponsored, 3, '@guild:menu_sponsored')) # Sponsored for Membership if owner.getObjectID() == guild.getLeader(): radials.add(RadialOptions(4, 218, 3, '@guild:menu_member_motd')) # Create a Guild Message - #radials.add(RadialOptions(4, 69, 3, '@guild:menu_leader_change')) # Transfer PA Leadership + radials.add(RadialOptions(4, 69, 3, '@guild:menu_leader_change')) # Transfer PA Leadership return return @@ -77,6 +77,7 @@ def handleSelection(core, owner, target, option): core.guildService.showDisbandConfirmWindow(owner, guild) return + # - Change Guild Name elif option == RadialOptions.serverGuildNameChange: core.guildService.handleChangeGuildName(owner, guild) return @@ -100,8 +101,10 @@ def handleSelection(core, owner, target, option): # - Transfer PA Leadership elif option == 69: + core.guildService.handleTransferLeadership(owner, guild) return + # - Change Message of the Day elif option == 218: core.guildService.handleChangeGuildMotd(owner, guild) return diff --git a/src/resources/guild/Guild.java b/src/resources/guild/Guild.java index d152ad8d..76d0ac30 100644 --- a/src/resources/guild/Guild.java +++ b/src/resources/guild/Guild.java @@ -41,6 +41,7 @@ public class Guild { private Map members = new HashMap(); private Map sponsoredPlayers = new HashMap(); private String motd = ""; + private boolean electionsEnabled = false; public Guild(int id, String abbreviation, String name, SWGObject leader) { this.id = id; @@ -162,4 +163,12 @@ public class Guild { public GuildMember getMember(long objectID) { return members.get(objectID); } + + public boolean isElectionsEnabled() { + return electionsEnabled; + } + + public void setElectionsEnabled(boolean electionsEnabled) { + this.electionsEnabled = electionsEnabled; + } } diff --git a/src/resources/guild/GuildMember.java b/src/resources/guild/GuildMember.java index c8188cd1..e60573de 100644 --- a/src/resources/guild/GuildMember.java +++ b/src/resources/guild/GuildMember.java @@ -33,9 +33,7 @@ public class GuildMember { private String rank = ""; private String name = ""; private String title = ""; - // TODO: These might have to be moved to a new GuildRank class depending on how permissions worked for NGE - //this works for now... Lack of NGE Guild Rank guides makes re-creation difficult (Ranks introduced Game Update 8: http://swg.wikia.com/wiki/Game_Update_8) - + private Vector permissions = new Vector(); private boolean mailPermission = false; private boolean sponsorPermission = false; diff --git a/src/services/GuildService.java b/src/services/GuildService.java index 41418f30..5c36eec2 100644 --- a/src/services/GuildService.java +++ b/src/services/GuildService.java @@ -169,6 +169,71 @@ public class GuildService implements INetworkDispatch { return member; } + public void changeGuildLeader(Guild guild, CreatureObject formerLeaderCreo, CreatureObject newLeaderCreo, boolean elected) { + GuildMember formerLeader = guild.getMember(formerLeaderCreo.getObjectID()); + + if (formerLeader == null) + return; + + GuildMember newLeader = guild.getMember(newLeaderCreo.getObjectID()); + + if (newLeader == null) + return; + + formerLeader.removeAllPermissions(); + newLeader.giveAllPermissions(); + + // TODO: Handling of guild PA Halls + + guild.setLeader(newLeaderCreo.getObjectID()); + guild.setLeaderName(newLeaderCreo.getCustomName()); + + if (elected) { + // TODO: Guild leader elections + } else { + formerLeaderCreo.sendSystemMessage("@guild:ml_success", DisplayType.Broadcast); + newLeaderCreo.sendSystemMessage("@guild:ml_you_are_leader", DisplayType.Broadcast); + guild.sendGuildMail(guild.getName(), "@guildmail:leaderchange_subject", new ProsePackage("@guildmail:leaderchange_text", "TU", newLeaderCreo.getCustomName())); + } + + } + + public void handleTransferLeadership(CreatureObject actor, Guild guild) { + + SUIWindow transferWindow = core.suiService.createInputBox(InputBoxType.INPUT_BOX_OK_CANCEL, "@guild:make_leader_t", "@guild:make_leader_d", actor, null, 0, + (owner, eventType, returnList) -> { + String name = returnList.get(0); + + if (name == "" || name == " ") + return; + + SWGObject transferTarget = core.chatService.getObjectByFirstName(name); + + if (transferTarget == null) { + actor.sendSystemMessage("@guild:ml_not_loaded", DisplayType.Broadcast); + return; + } + + if (!guild.getMembers().containsKey(transferTarget.getObjectID())) { + actor.sendSystemMessage("@guild:ml_fail", DisplayType.Broadcast); + return; + } + + if (actor.getPlanetId() != transferTarget.getPlanetId() || actor.getWorldPosition().getDistance2D(transferTarget.getWorldPosition()) > (float) 10) { + actor.sendSystemMessage("@guild:ml_not_loaded", DisplayType.Broadcast); + return; + } + + SUIWindow confirmTransferWindow = core.suiService.createMessageBox(MessageBoxType.MESSAGE_BOX_YES_NO, "@guild:make_leader_t", "@guild:make_leader_p", transferTarget, null, 0, (owner2, eventType2, returnList2) -> { + changeGuildLeader(guild, actor, (CreatureObject) transferTarget, false); + }); + core.suiService.openSUIWindow(confirmTransferWindow); + + }); + + core.suiService.openSUIWindow(transferWindow); + } + public void handleCreateGuildName(CreatureObject actor, SWGObject creationSource) { if (actor.getGuildId() != 0) { actor.sendSystemMessage("@guild:create_fail_in_guild", DisplayType.Broadcast); return; } @@ -606,8 +671,6 @@ public class GuildService implements INetworkDispatch { core.suiService.openSUIWindow(window); } - - public void handleGuildSponsorWindow(CreatureObject actor) { SUIWindow wndSponsorPlayer = core.suiService.createInputBox(InputBoxType.INPUT_BOX_OK_CANCEL, "@guild:sponsor_title", "@guild:sponsor_prompt", actor, null, (float) 10, (sponsor, eventType, returnList) -> { @@ -660,7 +723,6 @@ public class GuildService implements INetworkDispatch { core.suiService.openSUIWindow(wndSponsorPlayer); } - public void handleGuildDisband(CreatureObject actor, Guild guild) { Map members = guild.getMembers(); @@ -700,7 +762,6 @@ public class GuildService implements INetworkDispatch { removeGuild(guild.getId()); } - public void handleManageSponsoredPlayers(CreatureObject actor) { Guild guild = getGuildById(actor.getGuildId()); @@ -794,7 +855,6 @@ public class GuildService implements INetworkDispatch { core.chatService.sendPersistentMessageHeader(sponsoree.getClient(), declinedMail); } - public void showKickConfirmWindow(CreatureObject actor, CreatureObject target, Guild guild) { if (target.getObjectID() == guild.getLeader() && target.getObjectID() == actor.getObjectID()) { @@ -889,7 +949,6 @@ public class GuildService implements INetworkDispatch { } } - public void sendMailToGuild(String sender, String subject, String message, int guildId) { Guild guild = getGuildById(guildId); @@ -917,12 +976,10 @@ public class GuildService implements INetworkDispatch { target.getClient().getSession().write(roomMessage.serialize()); } - public GuildObject getGuildObject() { return object; } - public SWGSet getGuildList() { return object.getGuildList(); } diff --git a/src/services/sui/SUIService.java b/src/services/sui/SUIService.java index ab354051..8c4e6fc2 100644 --- a/src/services/sui/SUIService.java +++ b/src/services/sui/SUIService.java @@ -384,6 +384,12 @@ public class SUIService implements INetworkDispatch { } + public SUIWindow createMessageBox(int type, String title, String promptText, SWGObject owner, SWGObject rangeObject, float maxDistance, SUICallback handleFunc) { + SUIWindow window = createMessageBox(type, title, promptText, owner, rangeObject, maxDistance); + window.addHandler(0, "", Trigger.TRIGGER_OK, new Vector(), handleFunc); + return window; + } + public SUIWindow createInputBox(int type, String title, String promptText, SWGObject owner, SWGObject rangeObject, float maxDistance) { SUIWindow window = createSUIWindow("Script.inputBox", owner, rangeObject, maxDistance);