diff --git a/scripts/radial/object/guild_access_device.py b/scripts/radial/object/guild_access_device.py index 96be39bd..8ebb1dc2 100644 --- a/scripts/radial/object/guild_access_device.py +++ b/scripts/radial/object/guild_access_device.py @@ -9,28 +9,30 @@ def createRadial(core, owner, target, radials): #radials.clear() if owner.getGuildId() != 0: + guild = core.guildService.getGuildById(owner.getGuildId()) if guild is None: return - radials.add(RadialOptions(0, RadialOptions.serverGuildGuildManagement, 3, '@guild:menu_guild_management')) - radials.add(RadialOptions(0, RadialOptions.serverGuildMemberManagement, 3, '@guild:menu_member_management')) - - #Guild Management - radials.add(RadialOptions(0, RadialOptions.serverGuildInfo, 3, '@guild:menu_info')) - - #Member Management - - # Leader options - #if guild.getLeader() == owner.getObjectID(): - #Guild Management - #radials.add(RadialOptions(3, RadialOptions.serverGuildDisband, 3, '@guild:menu_disband')) - #radials.add(RadialOptions(3, 69, 3, '@guild:menu_leader_change')) - - # Sponsor options - #if guild.getSponsors().contains(owner.getObjectID()): + radials.add(RadialOptions(0, RadialOptions.serverGuildGuildManagement, 3, '@guild:menu_guild_management')) # Guild Management + radials.add(RadialOptions(0, RadialOptions.serverGuildMemberManagement, 3, '@guild:menu_member_management')) # Member Management + # Guild Management + radials.add(RadialOptions(0, RadialOptions.serverGuildInfo, 3, '@guild:menu_info')) # Guild Information + + # Member Management + + # - Sponsor options + if guild.getSponsers().contains(owner.getObjectID()): + radials.add(RadialOptions(4, RadialOptions.serverGuildSponsor, 3, '@guild:menu_sponsor')) # Sponsor for Membership + + if guild.getSponsoredPlayers().size() > 0: + radials.add(RadialOptions(4, RadialOptions.serverGuildSponsored, 3, '@guild:menu_sponsored')) # Sponsored for Membership + + + return + return def handleSelection(core, owner, target, option): @@ -47,4 +49,12 @@ def handleSelection(core, owner, target, option): wndGuildInfo = core.suiService.createMessageBox(core.suiService.MessageBoxType.MESSAGE_BOX_OK, '@guild:info_title', guildInfoPrompt, owner, target, 10) core.suiService.openSUIWindow(wndGuildInfo) return + + elif option == RadialOptions.serverGuildSponsor: + core.guildService.handleGuildSponsor(owner) + return + + elif option == RadialOptions.serverGuildSponsored: + core.guildService.handleManageSponsoredPlayers(owner) + return return \ No newline at end of file diff --git a/scripts/radial/object/guild_registry.py b/scripts/radial/object/guild_registry.py index fafb236b..fc0306bc 100644 --- a/scripts/radial/object/guild_registry.py +++ b/scripts/radial/object/guild_registry.py @@ -43,7 +43,7 @@ def doGuildCreate(owner, window, eventType, returnList): core = NGECore().getInstance() if eventType == 0: guild = core.guildService.createGuild(str(returnList.get(0)), str(owner.getAttachment('guildName')), owner) - core.guildService.joinGuild(guild, owner) + core.guildService.joinGuild(guild, owner, None) guild.getSponsers().add(owner.getObjectID()) return return \ No newline at end of file diff --git a/src/resources/guild/Guild.java b/src/resources/guild/Guild.java index eef50d38..718ec2e3 100644 --- a/src/resources/guild/Guild.java +++ b/src/resources/guild/Guild.java @@ -23,10 +23,16 @@ package resources.guild; import java.io.Serializable; import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; + +import main.NGECore; import org.apache.mina.core.buffer.IoBuffer; +import services.chat.Mail; import engine.resources.objects.Delta; import engine.resources.objects.SWGObject; @@ -41,7 +47,7 @@ public class Guild extends Delta implements Serializable, Comparable { private String leaderName; private List members = new ArrayList(); private List sponsors = new ArrayList(); - private List sponsoredPlayers = new ArrayList(); + private Map sponsoredPlayers = new HashMap(); public Guild(int id, String abbreviation, String name, SWGObject leader) { this.id = id; @@ -141,14 +147,33 @@ public class Guild extends Delta implements Serializable, Comparable { this.sponsors = sponsors; } - public List getSponsoredPlayers() { + public Map getSponsoredPlayers() { return sponsoredPlayers; } - public void setSponsoredPlayers(List sponsoredPlayers) { + public void setSponsoredPlayers(Map sponsoredPlayers) { this.sponsoredPlayers = sponsoredPlayers; } + public void sendGuildMail(String sender, String subject, String message) { + NGECore core = NGECore.getInstance(); + Date date = new Date(); + members.forEach(member -> { + Mail guildMail = new Mail(); + guildMail.setMailId(core.chatService.generateMailId()); + guildMail.setTimeStamp((int) date.getTime()); + guildMail.setRecieverId(member); + guildMail.setStatus(Mail.NEW); + guildMail.setMessage(message); + guildMail.setSubject(subject); + guildMail.setSenderName(sender); + core.chatService.storePersistentMessage(guildMail); + + if (core.objectService.getObject(member) != null) { + core.chatService.sendPersistentMessageHeader(core.objectService.getObject(member).getClient(), guildMail); + } + }); + } public byte[] getBytes() { synchronized(objectMutex) { IoBuffer buffer = createBuffer((getString().length() + 2)); diff --git a/src/services/GuildService.java b/src/services/GuildService.java index bce425d2..d3389368 100644 --- a/src/services/GuildService.java +++ b/src/services/GuildService.java @@ -21,18 +21,32 @@ ******************************************************************************/ package services; +import java.util.Date; +import java.util.HashMap; import java.util.Map; +import java.util.Vector; +import resources.common.OutOfBand; +import resources.datatables.DisplayType; import resources.guild.Guild; import resources.objects.SWGSet; import resources.objects.creature.CreatureObject; import resources.objects.guild.GuildObject; +import resources.objects.intangible.IntangibleObject; import resources.objects.player.PlayerObject; +import resources.objects.tangible.TangibleObject; import services.chat.ChatRoom; +import services.chat.Mail; +import services.sui.SUIService.InputBoxType; +import services.sui.SUIService.ListBoxType; +import services.sui.SUIService.MessageBoxType; +import services.sui.SUIWindow; +import services.sui.SUIWindow.Trigger; import main.NGECore; import engine.resources.objects.SWGObject; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; +import engine.resources.common.Stf; public class GuildService implements INetworkDispatch { @@ -70,7 +84,7 @@ public class GuildService implements INetworkDispatch { return guild; } - public void joinGuild(Guild guild, CreatureObject joinee) { + public void joinGuild(Guild guild, CreatureObject joinee, CreatureObject acceptor) { PlayerObject ghost = joinee.getPlayerObject(); if (ghost == null) return; @@ -78,8 +92,196 @@ public class GuildService implements INetworkDispatch { guild.getMembers().add(joinee.getObjectID()); joinee.setGuildId(guild.getId()); - core.chatService.joinChatRoom(joinee.getCustomName(), guild.getChatRoomId()); - // TODO: Send new member guild mail + guild.getSponsoredPlayers().remove(joinee.getObjectID()); + + if (joinee.isInQuadtree()) + core.chatService.joinChatRoom(joinee.getCustomName(), guild.getChatRoomId()); + else + ghost.addChannel(guild.getChatRoomId()); + + // Notify guild & player + if (acceptor != null) { + guild.sendGuildMail(guild.getName(), "@guildmail:accept_subject", new Stf("@guildmail:accept_text").getStfValue().replace("%TU", acceptor.getCustomName()).replace("%TT", joinee.getCustomName())); + + Mail acceptedMail = new Mail(); + acceptedMail.setMailId(core.chatService.generateMailId()); + acceptedMail.setTimeStamp((int) new Date().getTime()); + acceptedMail.setRecieverId(joinee.getObjectID()); + acceptedMail.setStatus(Mail.NEW); + acceptedMail.setMessage(new Stf("@guildmail:accept_target_text").getStfValue().replace("%TU", acceptor.getCustomName()).replace("%TT", joinee.getCustomName())); + acceptedMail.setSubject("@guildmail:accept_subject"); + acceptedMail.setSenderName(guild.getName()); + core.chatService.storePersistentMessage(acceptedMail); + + if (joinee.isInQuadtree()) + core.chatService.sendPersistentMessageHeader(joinee.getClient(), acceptedMail); + } + + // Update association device to guild stats + TangibleObject datapad = (TangibleObject) joinee.getSlottedObject("datapad"); + + if (datapad != null) { + datapad.viewChildren(joinee, true, false, (obj) -> { + if (obj instanceof IntangibleObject && obj.getTemplate().equals("object/intangible/data_item/shared_guild_stone.iff")) { // shared_guild_stone + obj.setStringAttribute("guild_name", guild.getName()); + obj.setStringAttribute("guild_abbrev", guild.getAbbreviation()); + obj.setStringAttribute("guild_leader", guild.getLeaderName()); + } + }); + } + } + + public void handleGuildSponsor(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) -> { + + if (eventType != 0) + return; + + String input = returnList.get(0); + + if (input.isEmpty()) + return; + + SWGObject pSponsored = core.objectService.getObjectByFirstName(input); + + if (pSponsored == null || !pSponsored.isInQuadtree()) { + actor.sendSystemMessage("@guild:sponsor_not_found", DisplayType.Broadcast); + return; + } + + if (((CreatureObject)pSponsored).getGuildId() != 0) { + actor.sendSystemMessage(OutOfBand.ProsePackage("@guild:sponsor_already_in_guild", "TU", pSponsored.getCustomName()), DisplayType.Broadcast); + return; + } + + Guild invitingGuild = core.guildService.getGuildById(actor.getGuildId()); + + SUIWindow wndSponsoredConfirm = core.suiService.createMessageBox(MessageBoxType.MESSAGE_BOX_YES_NO, "@guild:sponsor_verify_title", + new Stf("@guild:sponsor_verify_prompt").getStfValue().replace("%TU", actor.getCustomName()).replace("%TT", invitingGuild.getName()), pSponsored, null, (float) 10); + + wndSponsoredConfirm.addHandler(0, "", Trigger.TRIGGER_OK, new Vector(), (cOwner, cEventType, cReturnList) -> { + + if (cEventType != 0) + return; + + Guild guild = core.guildService.getGuildById(actor.getGuildId()); + + if (guild == null) + return; + + guild.getSponsoredPlayers().put(cOwner.getObjectID(), cOwner.getCustomName()); + + actor.sendSystemMessage(OutOfBand.ProsePackage("@guild:sponsor_self", "TU", cOwner.getCustomName(), "TT", guild.getName()), DisplayType.Broadcast); + ((CreatureObject)cOwner).sendSystemMessage(OutOfBand.ProsePackage("@guild:sponsor_target", "TT", guild.getName(), "TU", actor.getCustomName()), DisplayType.Broadcast); + + guild.sendGuildMail(guild.getName(), "@guildmail:sponsor_subject", new Stf("@guild:sponsor_text").getStfValue().replace("%TU", actor.getCustomName()).replace("%TT", cOwner.getCustomName())); + }); + core.suiService.openSUIWindow(wndSponsoredConfirm); + + }); + core.suiService.openSUIWindow(wndSponsorPlayer); + } + + public void handleManageSponsoredPlayers(CreatureObject actor) { + Guild guild = getGuildById(actor.getGuildId()); + + + if (guild == null) + return; + + Map sponsorships = guild.getSponsoredPlayers(); + + SUIWindow wndSponsoredPlayers = core.suiService.createListBox(ListBoxType.LIST_BOX_OK_CANCEL, "@guild:sponsored_title", "@guild:sponsored_prompt", sponsorships, actor, null, 0); + + Vector returnList = new Vector(); + returnList.add("List.lstList:SelectedRow"); + + wndSponsoredPlayers.addHandler(0, "", Trigger.TRIGGER_OK, returnList, (owner, eventType, resultList) -> { + int index = Integer.parseInt(resultList.get(0)); + long objectId = wndSponsoredPlayers.getObjectIdByIndex(index); + + if(objectId == 0) + return; + + SWGObject sponsoredPlayer = core.objectService.getObject(objectId); + + if (sponsoredPlayer == null) { + sponsoredPlayer = core.objectService.getCreatureFromDB(objectId); + + if (sponsoredPlayer == null) { + guild.getSponsoredPlayers().remove(objectId); + return; + } + } + final SWGObject finalSponseredPlayer = sponsoredPlayer; + + Map options = new HashMap(); + options.put((long) 0, "Accept"); + options.put((long) 1, "Decline"); + options.put((long) 2, "Cancel"); + SUIWindow sponsorOptions = core.suiService.createListBox(ListBoxType.LIST_BOX_OK_CANCEL, "@guild:sponsored_options_title", + new Stf("@guild:sponsored_options_prompt").getStfValue().replace("%TU", sponsoredPlayer.getCustomName()), options, owner, null, 0); + + Vector returnList2 = new Vector(); + returnList2.add("List.lstList:SelectedRow"); + + sponsorOptions.addHandler(0, "", Trigger.TRIGGER_OK, returnList2, (owner2, eventType2, resultList2) -> { + int selectedOption = Integer.parseInt(resultList2.get(0)); + + Guild gOwner = getGuildById(((CreatureObject)owner2).getGuildId()); + CreatureObject sponsoredCreo = (CreatureObject) finalSponseredPlayer; + + switch(selectedOption) { + case 0: // Accept + + if (sponsoredCreo.isInQuadtree()) + sponsoredCreo.sendSystemMessage(OutOfBand.ProsePackage("@guild:sponsor_accept", "TU", owner2.getCustomName()), DisplayType.Broadcast); + + joinGuild(gOwner, sponsoredCreo, (CreatureObject) owner2); + break; + case 1: // Decline + sponsoredCreo.sendSystemMessage(OutOfBand.ProsePackage("@guild:sponsor_decline", "TU", owner2.getCustomName()), DisplayType.Broadcast); + + handleGuildDeclineSponsorship(gOwner, (CreatureObject) owner2, sponsoredCreo); + break; + case 2: // Cancel + break; + default: + break; + } + }); + + core.suiService.openSUIWindow(sponsorOptions); + }); + core.suiService.openSUIWindow(wndSponsoredPlayers); + } + + public void handleGuildDeclineSponsorship(Guild guild, CreatureObject actor, CreatureObject sponsoree) { + guild.getSponsoredPlayers().remove(sponsoree.getObjectID()); + + guild.sendGuildMail(guild.getName(), "@guildmail:decline_subject", new Stf("@guildmail:decline_text").getStfValue().replace("%TU", actor.getCustomName()).replace("%TO", sponsoree.getCustomName())); + + Mail declinedMail = new Mail(); + declinedMail.setMailId(core.chatService.generateMailId()); + declinedMail.setTimeStamp((int) new Date().getTime()); + declinedMail.setRecieverId(sponsoree.getObjectID()); + declinedMail.setStatus(Mail.NEW); + declinedMail.setMessage(new Stf("@guildmail:decline_target_text").getStfValue().replace("%TU", actor.getCustomName()).replace("%TT", guild.getName())); + declinedMail.setSubject("@guildmail:decline_subject"); + declinedMail.setSenderName(guild.getName()); + core.chatService.storePersistentMessage(declinedMail); + + if (sponsoree.isInQuadtree()) + core.chatService.sendPersistentMessageHeader(sponsoree.getClient(), declinedMail); + } + + public void sendMailToGuild(String sender, String subject, String message, int guildId) { + Guild guild = getGuildById(guildId); + + if (guild == null) + return; + + guild.sendGuildMail(sender, subject, message); } public GuildObject getGuildObject() {