Refactored guild creation, enabled access to guild creation device, guild disband, guild kick, guild members, moved server motd to motd.txt

This commit is contained in:
Waverunner
2014-05-26 12:43:06 -04:00
parent c85eb36eec
commit 38441e069e
19 changed files with 506 additions and 98 deletions

1
motd.txt Normal file
View File

@@ -0,0 +1 @@
Welcome to the ProjectSWG TestCenter!

View File

@@ -13,4 +13,3 @@ GALAXY_ID=2
GALAXY_NAME=Local Connection
XPMULTIPLIER=1.0
MAXNUMBEROFCHARACTERS=2
MOTD=Welcome to PSWG Test Center!

View File

@@ -7,9 +7,7 @@ def run(core, actor, target, commandString):
guild = core.guildService.getGuildById(actor.getGuildId())
if guild is None:
print ('none.')
return
core.chatService.sendChatRoomMessage(actor, guild.getChatRoomId(), 0, commandString)
print ('sent message')
return

View File

@@ -0,0 +1,26 @@
import sys
def setup():
return
def run(core, actor, target, commandString):
if actor.getGuildId() == 0:
return
guildSvc = core.guildService
guild = guildSvc.getGuildById(actor.getGuildId())
if guild is None:
return
member = guild.getMember(actor.getObjectID())
if actor.getObjectID() != guild.getLeader() and member.hasDisbandPermission() is False:
actor.sendSystemMessage('@guild:guild_no_permission_operation', 0)
return
else:
guildSvc.showDisbandConfirmWindow(actor, target, guild)
return
return

View File

@@ -0,0 +1,36 @@
import sys
def setup():
return
def run(core, actor, target, commandString):
if commandString != " " and commandString != "":
target = core.objectService.getObjectByFirstName(commandString.split(" ")[0])
if target is None:
actor.sendSystemMessage('Could not find member ' + commandString + ' (CASE SENSITIVE!)', 0)
return
if actor.getGuildId() == 0:
return
if actor.getGuildId() != target.getGuildId():
actor.sendSystemMessage('@guild:guild_no_permission_operation', 0)
return
guildSvc = core.guildService
guild = guildSvc.getGuildById(actor.getGuildId())
if guild is None:
return
if actor.getObjectID() == target.getObjectID():
guildSvc.leaveGuild(actor, target, guild)
return
else:
guildSvc.showKickConfirmWindow(actor, target, guild)
return
return

View File

@@ -0,0 +1,28 @@
import sys
def setup():
return
def run(core, actor, target, commandString):
if actor.getGuildId() == 0:
return
guildSvc = core.guildService
guild = guildSvc.getGuildById(actor.getGuildId())
if guild is None:
return
member = guild.getMember(actor.getObjectID())
if member is None:
return
if not member.hasSponsorPermission():
actor.sendSystemMessage('@guild:guild_no_permission_operation', 0)
return
guildSvc.handleGuildSponsorWindow(actor)
return

View File

@@ -25,27 +25,26 @@ def createRadial(core, owner, target, radials):
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
#### Guild Management ####
radials.add(RadialOptions(3, RadialOptions.serverGuildInfo, 3, '@guild:menu_info')) # Guild Information
#radials.add(RadialOptions(3, RadialOptions.serverGuildEnemies, 3, '@guild:menu_enemies')) # Guild Enemies
#radials.add(RadialOptions(3, 215, 3, '@guild:menu_rank_list')) # Rank List
# TODO: Add Rank Summary
radials.add(RadialOptions(3, 217, 3, '@guild:menu_permission_list')) # Permissions List
#if member.hasDisbandPermission():
#radials.add(RadialOptions(3, RadialOptions.serverGuildDisband, 3, '@guild:menu_disband')) # Disband Guild
if member.hasDisbandPermission():
radials.add(RadialOptions(3, RadialOptions.serverGuildDisband, 3, '@guild:menu_disband')) # Disband Guild
#if member.hasChangeNamePermission():
#radials.add(RadialOptions(3, RadialOptions.serverGuildNameChange, 3, '@guild:menu_namechange'))
#if owner.getObjectID() == guild.getLeader():
#radials.add(RadialOptions(4, RadialOptions.serverTerminalPermissions, 3, '@guild:menu_permission_list')) # Permission List
# Member Management
#radials.add(RadialOptions(4, RadialOptions.serverGuildMembers, 3, '@guild:menu_members')) # Guild Members
#### Member Management ####
radials.add(RadialOptions(4, RadialOptions.serverGuildMembers, 3, '@guild:menu_members')) # Guild Members
if member.hasSponsorPermission():
radials.add(RadialOptions(4, RadialOptions.serverGuildSponsor, 3, '@guild:menu_sponsor')) # Sponsor for Membership
if member.hasAcceptPermission() and guild.getSponsoredPlayers().size() > 0:
radials.add(RadialOptions(4, RadialOptions.serverGuildSponsored, 3, '@guild:menu_sponsored')) # Sponsored for Membership
#if owner.getObjectID() == guild.getLeader():
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
return
@@ -57,7 +56,7 @@ def handleSelection(core, owner, target, option):
if guild is None:
return
# Guild Management
#### Guild Management ####
# - Guild Info
if option == RadialOptions.serverGuildInfo:
@@ -81,15 +80,20 @@ def handleSelection(core, owner, target, option):
core.guildService.handleViewPermissionsList(owner, guild)
return
# Member Management
elif option == RadialOptions.serverGuildDisband:
core.guildService.showDisbandConfirmWindow(owner, guild)
return
#### Member Management ####
# - Guild Members
elif option == RadialOptions.serverGuildMembers:
core.guildService.handleViewGuildMembers(owner, guild)
return
# - Sponsor for Membership
elif option == RadialOptions.serverGuildSponsor:
core.guildService.handleGuildSponsor(owner)
core.guildService.handleGuildSponsorWindow(owner)
return
# - Sponsored for Membership
@@ -101,4 +105,7 @@ def handleSelection(core, owner, target, option):
elif option == 69:
return
elif option == 218:
core.guildService.handleChangeGuildMotd(owner, guild)
return
return

View File

@@ -5,46 +5,16 @@ from main import NGECore
import sys
def createRadial(core, owner, target, radials):
#radials.clear()
if owner.getGuildId() == 0:
radials.add(RadialOptions(0, RadialOptions.serverGuildCreate, 3, '@guild:menu_create'))
return
return
def handleSelection(core, owner, target, option):
suiSvc = NGECore().getInstance().suiService
# Create Guild
if option == 185 and target:
wndGuildCreate = core.suiService.createInputBox(InputBoxType.INPUT_BOX_OK_CANCEL, '@guild:create_name_title', '@guild:create_name_prompt', owner, owner, 0, handleGuildCreateName)
wndGuildCreate.setProperty("txtInput:MaxLength", "24");
wndGuildCreate.setProperty("txtInput:NumericInteger", "false")
suiSvc.openSUIWindow(wndGuildCreate)
return
return
def handleGuildCreateName(owner, window, eventType, returnList):
suiSvc = NGECore().getInstance().suiService
if eventType == 0:
guildName = str(returnList.get(0))
if guildName is not None:
owner.setAttachment('guildName', guildName)
wndGuildInitials = NGECore().getInstance().suiService.createInputBox(InputBoxType.INPUT_BOX_OK, '@guild:create_abbrev_title', '@guild:create_abbrev_prompt', owner, owner, 0, doGuildCreate)
wndGuildInitials.setProperty("txtInput:MaxLength", "4");
wndGuildInitials.setProperty("txtInput:NumericInteger", "false")
suiSvc.openSUIWindow(wndGuildInitials)
core.guildService.handleCreateGuildName(owner, target)
return
return
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)
member = core.guildService.joinGuild(guild, owner, None)
if member is not None:
member.giveAllPermissions()
return
return

View File

@@ -21,7 +21,10 @@
******************************************************************************/
package main;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.SQLException;
@@ -140,7 +143,7 @@ public class NGECore {
private static NGECore instance;
private Config config = null;
private String motd = "";
private volatile boolean isShuttingDown = false;
private long galacticTime = System.currentTimeMillis();
@@ -272,6 +275,12 @@ public class NGECore {
System.out.println("Cleaned ODB Folders.");
}
try(BufferedReader br = new BufferedReader(new FileReader("./motd.txt"))) {
for(String line; (line = br.readLine()) != null;) {
motd += line;
}
} catch (IOException e1) { e1.printStackTrace(); }
// Database
databaseConnection = new DatabaseConnection();
databaseConnection.connect(config.getString("DB.URL"), config.getString("DB.NAME"), config.getString("DB.USER"), config.getString("DB.PASS"), "postgresql");
@@ -774,6 +783,12 @@ public class NGECore {
auctionODB.close();
}
public String getMotd() {
return motd;
}
public void setMotd(String motd) {
this.motd = motd;
}
}

View File

@@ -22,10 +22,8 @@
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;
@@ -47,14 +45,14 @@ public class Guild extends Delta implements Serializable, Comparable<Guild> {
private String leaderName;
private Map<Long, GuildMember> members = new HashMap<Long, GuildMember>();
private Map<Long, String> sponsoredPlayers = new HashMap<Long, String>();
private String motd;
public Guild(int id, String abbreviation, String name, SWGObject leader) {
this.id = id;
this.abbreviation = abbreviation;
this.name = name;
this.leader = leader.getObjectID();
this.leaderName = leader.getCustomName();
//this.members.add(leader.getObjectID());
//this.sponsors.add(leader.getObjectID());
}
public Guild() { }
@@ -145,6 +143,14 @@ public class Guild extends Delta implements Serializable, Comparable<Guild> {
}
}
public String getMotd() {
return motd;
}
public void setMotd(String motd) {
this.motd = motd;
}
public Map<Long, GuildMember> getMembers() {
return members;
}

View File

@@ -28,10 +28,10 @@ import java.util.Vector;
public class GuildMember {
private long objectId;
private long joinTime;
private String profession;
private String profession = "";
private short level;
private String rank;
private String name;
private String rank = "";
private String name = "";
// 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)

View File

@@ -893,10 +893,10 @@ public class PlayerObject extends IntangibleObject implements Serializable {
}
public void addChannel(int roomId) {
getJoinedChatChannels().add(roomId);
getJoinedChatChannels().add((Integer) roomId);
}
public void removeChannel(int roomId) {
public void removeChannel(Integer roomId) {
if (getJoinedChatChannels().contains(roomId)) {
getJoinedChatChannels().remove(roomId);
}

View File

@@ -241,13 +241,6 @@ public class ConnectionService implements INetworkDispatch {
core.chatService.playerStatusChange(objectShortName, (byte) 0);
for (Integer roomId : ghost.getJoinedChatChannels()) {
ChatRoom room = core.chatService.getChatRoom(roomId.intValue());
if (room != null) { core.chatService.leaveChatRoom(object, roomId.intValue()); }
// work-around for any channels that may have been deleted, or only spawn on server startup, that were added to the joined channels
else { ghost.removeChannel(roomId); }
}
}
long parentId = object.getParentId();

View File

@@ -92,8 +92,7 @@ public class DevService implements INetworkDispatch {
suiOptions.put((long) 120, "House Deeds");
suiOptions.put((long) 125, "Crafting Tools");
suiOptions.put((long) 130, "Vehicle Deeds");
suiOptions.put((long) 121, "Sandbox City");
suiOptions.put((long) 140, "Guild Registry Device (PDA)");
suiOptions.put((long) 121, "Sandbox City");
}
break;
@@ -108,6 +107,7 @@ public class DevService implements INetworkDispatch {
suiOptions.put((long) 41, "Tusken Rucksack");
suiOptions.put((long) 42, "Heroism Jewlery Set");
suiOptions.put((long) 43, "Breath of Heaven");
suiOptions.put((long) 140, "Guild Registry Device (PDA)");
break;
case 5: // [Items] Armor
suiOptions.put((long) 50, "Assault Armor");

View File

@@ -26,6 +26,8 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
import protocol.swg.chat.ChatOnSendRoomMessage;
import protocol.swg.chat.ChatRoomMessage;
import resources.common.OutOfBand;
import resources.datatables.DisplayType;
import resources.guild.Guild;
@@ -70,7 +72,7 @@ public class GuildService implements INetworkDispatch {
}
public Guild createGuild(String abbreviation, String name, SWGObject leader) {
public Guild createGuild(String abbreviation, String name, CreatureObject leader) {
if (leader == null)
return null;
@@ -83,6 +85,9 @@ public class GuildService implements INetworkDispatch {
guild.setChatRoomId(guildChat.getRoomId());
object.getGuildList().add(guild);
GuildMember member = joinGuild(guild, leader, null);
member.giveAllPermissions();
return guild;
}
@@ -142,6 +147,44 @@ public class GuildService implements INetworkDispatch {
return member;
}
public void handleCreateGuildName(CreatureObject actor, SWGObject creationSource) {
if (actor.getGuildId() != 0) { actor.sendSystemMessage("@guild:create_fail_in_guild", DisplayType.Broadcast); return; }
SUIWindow window = core.suiService.createInputBox(InputBoxType.INPUT_BOX_OK_CANCEL, "@guild:create_name_title", "@guild:create_name_prompt", actor, null, 0,
(owner, eventType, returnList) -> {
String guildName = returnList.get(0); // TODO: Character checks
if (guildName.length() > 24) { actor.sendSystemMessage("@guild:create_fail_name_bad_length", DisplayType.Broadcast); handleCreateGuildName(actor, creationSource); return;}
if (getGuildByName(guildName) != null) { actor.sendSystemMessage("@guild:create_fail_name_in_use", DisplayType.Broadcast); handleCreateGuildName(actor, creationSource); return;}
handleCreateGuildAbbrev(actor, guildName, creationSource);
});
window.setProperty("txtInput:MaxLength", "24");
window.setProperty("txtInput:NumericInteger", "False");
core.suiService.openSUIWindow(window);
}
public void handleCreateGuildAbbrev(CreatureObject actor, String guildName, SWGObject creationSource) {
SUIWindow window = core.suiService.createInputBox(InputBoxType.INPUT_BOX_OK_CANCEL, "@guild:create_abbrev_title", "@guild:create_abbrev_prompt", actor, null, 0,
(owner, eventType, returnList) -> {
String abbrev = returnList.get(0); // TODO: Character checks
if (abbrev.length() > 5) { actor.sendSystemMessage("@guild:create_fail_abbrev_bad_length", DisplayType.Broadcast); handleCreateGuildAbbrev(actor, guildName, creationSource); return;}
if (getGuildByAbbreviation(abbrev) != null) { actor.sendSystemMessage("@guild:create_fail_abbrev_in_use", DisplayType.Broadcast); handleCreateGuildAbbrev(actor, guildName, creationSource); return;}
Guild guild = createGuild(abbrev, guildName, actor);
if (guild != null && creationSource != null && creationSource.getTemplate().equals("object/tangible/furniture/technical/shared_guild_registry_initial.iff")) {
core.objectService.destroyObject(creationSource);
}
});
window.setProperty("txtInput:MaxLength", "4");
window.setProperty("txtInput:NumericInteger", "False");
core.suiService.openSUIWindow(window);
}
public void handleViewPermissionsList(CreatureObject actor, Guild guild) {
final SUIWindow window = core.suiService.createSUIWindow("Script.tablePage", actor, null, (float) 0);
window.setProperty("bg.caption.lblTitle:Text", "Permissions List");
@@ -194,8 +237,9 @@ public class GuildService implements INetworkDispatch {
});
core.suiService.openSUIWindow(window);
}
public void handleChangeMemberPermissions(CreatureObject actor, Guild guild, GuildMember target) { handleChangeMemberPermissions(actor, guild, target, "");
}
public void handleChangeMemberPermissions(CreatureObject actor, Guild guild, GuildMember target) { handleChangeMemberPermissions(actor, guild, target, ""); }
public void handleChangeMemberPermissions(CreatureObject actor, Guild guild, GuildMember target, String source) {
GuildMember requester = guild.getMember(actor.getObjectID());
@@ -210,17 +254,17 @@ public class GuildService implements INetworkDispatch {
Vector<String> returnList = new Vector<String>();
returnList.add("List.lstList:SelectedRow");
if (!source.isEmpty() || !source.equals("")) {
/*if (!source.isEmpty() || !source.equals("")) {
window.setProperty("btnOther:Visible", "True");
window.setProperty("btnOther:Text", "Back");
window.addHandler(1, "", Trigger.TRIGGER_UPDATE, returnList, (owner, eventType, resultList) -> {
window.addHandler(1, "btnOther", Trigger.TRIGGER_OK, returnList, (owner, eventType, resultList) -> {
switch(source) {
case "PermissionsList":
handleViewPermissionsList(actor, guild);
break;
}
});
}
}*/
window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, (owner, eventType, resultList) -> {
if (resultList.size() == 0)
return;
@@ -282,7 +326,92 @@ public class GuildService implements INetworkDispatch {
core.suiService.openSUIWindow(window);
}
public void handleGuildSponsor(CreatureObject actor) {
public void handleChangeGuildMotd(CreatureObject actor, Guild guild) {
SUIWindow window = core.suiService.createInputBox(InputBoxType.INPUT_BOX_OK_CANCEL, "@guild:menu_member_motd", "@guild:prompt_member_motd_message", actor, null, 0,
(owner, eventType, resultList) -> {
String newMotd = resultList.get(0);
guild.setMotd(newMotd);
actor.sendSystemMessage("Guild Message of the Day set to \"" + newMotd + "\".", DisplayType.Broadcast);
});
window.setProperty("inputBox:Size", "506,430");
core.suiService.openSUIWindow(window);
}
public void handleViewGuildMembers(CreatureObject actor, Guild guild) {
final SUIWindow window = core.suiService.createSUIWindow("Script.tablePage", actor, null, (float) 0);
window.setProperty("bg.caption.lblTitle:Text", "@guild:members_title");
window.setProperty("comp.Prompt.lblPrompt:Text", "@guild:members_prompt");
//if (actingMember.getAllPermissions(actingMember).size() > 2) window.setProperty("comp.Prompt.lblPrompt:Text", "@guild:members_show_prompt");
window.setProperty("tablePage:Size", "785,634");
// window.setProperty("comp.TablePage.table:columsizedatasource", "dsColSizes");
window.setProperty("comp.TablePage.header:ScrollExtent", "444,30");
window.addTableColumn("@guild:table_title_level", "text");
window.addTableColumn("@guild:table_title_name", "text");
window.addTableColumn("@guild:table_title_profession", "text");
window.addTableColumn("@guild:table_title_rank", "text");
window.addTableColumn("@guild:table_title_status", "text");
window.addTableColumn("@guild:table_title_title", "text");
window.addTableColumn("@guild:table_title_war_excluded", "text");
window.addTableColumn("@guild:table_title_war_included", "text");
Map<Long, GuildMember> members = guild.getMembers();
members.entrySet().forEach(e -> {
GuildMember member = e.getValue();
for (SUITableItem column : window.getTableItems()) {
switch(column.getItemName()) {
case "@guild:table_title_level":
window.addTableCell(String.valueOf(member.getLevel()), e.getKey(), column.getIndex());
continue;
case "@guild:table_title_name":
window.addTableCell(member.getName(), e.getKey(), column.getIndex());
continue;
case "@guild:table_title_profession":
window.addTableCell(member.getProfession(), e.getKey(), column.getIndex());
continue;
case "@guild:table_title_rank":
window.addTableCell(member.getRank(), e.getKey(), column.getIndex());
continue;
case "@guild:table_title_status":
//window.addTableCell(member.getStatus(), e.getKey(), column.getIndex());
continue;
case "@guild:table_title_war_excluded":
if (member.isWarExcluded()) window.addTableCell("X", e.getKey(), column.getIndex());
else window.addTableCell("", e.getKey(), column.getIndex());
continue;
case "@guild:table_title_war_included":
if (member.isWarExclusive()) window.addTableCell("X", e.getKey(), column.getIndex());
else window.addTableCell("", e.getKey(), column.getIndex());
continue;
}
}
});
Vector<String> returnList = new Vector<String>();
returnList.add("comp.TablePage.table:SelectedRow");
window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, (owner, eventType, resultList) -> {
long objectId = window.getTableObjIdByRow(Integer.parseInt(resultList.get(0)));
if (objectId == 0)
return;
GuildMember selectedMember = guild.getMember(objectId);
if (selectedMember == null)
return;
//handleMemberOptions((CreatureObject) owner, guild, selectedMember);
});
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) -> {
if (eventType != 0)
@@ -322,17 +451,51 @@ public class GuildService implements INetworkDispatch {
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("@guildmail:sponsor_text").getStfValue().replace("%TU", actor.getCustomName()).replace("%TT", cOwner.getCustomName()));
});
core.suiService.openSUIWindow(wndSponsoredConfirm);
actor.sendSystemMessage(OutOfBand.ProsePackage("@guild:sponsor_self", "TU", pSponsored.getCustomName(), "TT", invitingGuild.getName()), DisplayType.Broadcast);
});
core.suiService.openSUIWindow(wndSponsorPlayer);
}
public void handleGuildDisband(CreatureObject actor, Guild guild) {
Map<Long, GuildMember> members = guild.getMembers();
members.entrySet().forEach(e -> {
CreatureObject target = core.objectService.getCreatureFromDB(e.getKey());
if (target != null) {
target.setGuildId(0);
// Update association device
TangibleObject datapad = (TangibleObject) target.getSlottedObject("datapad");
if (datapad != null) {
datapad.viewChildren(target, true, false, (obj) -> {
if (obj instanceof IntangibleObject && obj.getTemplate().equals("object/intangible/data_item/shared_guild_stone.iff")) {
obj.setStringAttribute("guild_name", null);
obj.setStringAttribute("guild_abbrev", null);
obj.setStringAttribute("guild_leader", null);
}
});
}
}
});
guild.sendGuildMail(guild.getName(), "@guildmail:disband_subject", new Stf("@guildmail:disband_text").getStfValue().replace("%TU", actor.getCustomName()));
removeGuild(guild.getId());
}
public void handleManageSponsoredPlayers(CreatureObject actor) {
Guild guild = getGuildById(actor.getGuildId());
@@ -426,6 +589,89 @@ 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()) {
actor.sendSystemMessage("@guild:leave_fail_leader_tried_to_leave", DisplayType.Broadcast);
return;
} else if (target.getObjectID() == guild.getLeader()) {
actor.sendSystemMessage("@guild:guild_no_permission_operation", DisplayType.Broadcast);
return;
}
SUIWindow kickPrompt = core.suiService.createMessageBox(MessageBoxType.MESSAGE_BOX_YES_NO, "@guild:kick_title",
new Stf("@guild:kick_prompt").getStfValue().replace("%TU", target.getCustomName()), actor, null, 0);
kickPrompt.addHandler(0, "", Trigger.TRIGGER_OK, new Vector<String>(), (owner, eventType, resultList) -> {
leaveGuild(actor, target, guild);
});
core.suiService.openSUIWindow(kickPrompt);
}
public void showDisbandConfirmWindow(CreatureObject actor, Guild guild) {
if (!guild.getMember(actor.getObjectID()).hasDisbandPermission() && actor.getObjectID() != guild.getLeader()) {
actor.sendSystemMessage("@guild:guild_no_permission_operation", DisplayType.Broadcast);
return;
}
SUIWindow disbandConfirm = core.suiService.createMessageBox(MessageBoxType.MESSAGE_BOX_YES_NO, "@guild:disband_title", "@guild:disband_prompt", actor, null, 0);
disbandConfirm.addHandler(0, "", Trigger.TRIGGER_OK, new Vector<String>(), (owner, eventType, resultList) -> {
handleGuildDisband(actor, guild);
});
core.suiService.openSUIWindow(disbandConfirm);
}
public void leaveGuild(CreatureObject actor, CreatureObject target, Guild guild) {
GuildMember actingMember = guild.getMember(actor.getObjectID());
if (actingMember == null)
return;
if ((!actingMember.hasKickPermission() && actor != target) || (target.getObjectID() == guild.getLeader() && target.getObjectID() != actor.getObjectID())) {
actor.sendSystemMessage("@guild:guild_no_permission_operation", DisplayType.Broadcast);
return;
}
if (actor.getObjectID() != target.getObjectID()) {
guild.sendGuildMail(guild.getName(), "@guildmail:kick_subject", new Stf("@guildmail:kick_text").getStfValue().replace("%TU", actor.getCustomName()).replace("%TT", target.getCustomName()));
actor.sendSystemMessage(OutOfBand.ProsePackage("@guild:kick_self", "TU", target.getCustomName(), "TT", guild.getName()), DisplayType.Broadcast);
if (target.isInQuadtree())
target.sendSystemMessage(OutOfBand.ProsePackage("@guild:kick_target", "TU", actor.getCustomName(), "TT", guild.getName()), DisplayType.Broadcast);
} else {
if (target.getObjectID() == guild.getLeader()) {
actor.sendSystemMessage("@guild:leave_fail_leader_tried_to_leave", DisplayType.Broadcast);
return;
} else {
guild.sendGuildMail(guild.getName(), "@guildmail:leave_subject", new Stf("@guildmail:leave_text").getStfValue().replace("%TU", actor.getCustomName()));
actor.sendSystemMessage(OutOfBand.ProsePackage("@guild:leave_self", "TU", guild.getName()), DisplayType.Broadcast);
}
}
guild.getMembers().remove(target.getObjectID());
target.setGuildId(0);
core.chatService.leaveChatRoom(target, guild.getChatRoomId());
// Update association device
TangibleObject datapad = (TangibleObject) target.getSlottedObject("datapad");
if (datapad != null) {
datapad.viewChildren(target, true, false, (obj) -> {
if (obj instanceof IntangibleObject && obj.getTemplate().equals("object/intangible/data_item/shared_guild_stone.iff")) {
obj.setStringAttribute("guild_name", null);
obj.setStringAttribute("guild_abbrev", null);
obj.setStringAttribute("guild_leader", null);
}
});
}
}
public void sendMailToGuild(String sender, String subject, String message, int guildId) {
Guild guild = getGuildById(guildId);
@@ -435,24 +681,53 @@ public class GuildService implements INetworkDispatch {
guild.sendGuildMail(sender, subject, message);
}
public void sendGuildMotd(CreatureObject target, Guild guild) {
if (guild == null || guild.getMotd().isEmpty())
return;
ChatRoom room = core.chatService.getChatRoom(guild.getChatRoomId());
if (room == null)
return;
ChatRoomMessage roomMessage = new ChatRoomMessage(guild.getChatRoomId(), "Message of the Day", guild.getMotd());
target.getClient().getSession().write(roomMessage.serialize());
}
public GuildObject getGuildObject() {
return object;
}
public SWGSet<Guild> getGuildList() {
return object.getGuildList();
}
public Guild getGuildById(int id) {
return object.getGuildList().stream().filter(g -> g.getId() == id).findFirst().get();
}
public Guild getGuildByAbbreviation(String abbreviation) {
return object.getGuildList().stream().filter(g -> g.getAbbreviation().equals(abbreviation)).findFirst().get();
for (Guild guild : object.getGuildList()) {
if (guild.getId() == id)
return guild;
}
return null;
}
public Guild getGuildByAbbreviation(String abbreviation) {
for (Guild guild : object.getGuildList()) {
if (guild.getAbbreviation().equals(abbreviation))
return guild;
}
return null;
}
public Guild getGuildByName(String name) {
return object.getGuildList().stream().filter(g -> g.getName().equals(name)).findFirst().get();
for (Guild guild : object.getGuildList()) {
if (guild.getName().equals(name))
return guild;
}
return null;
}
public boolean removeGuild(int id) {
@@ -465,17 +740,6 @@ public class GuildService implements INetworkDispatch {
return false;
}
public boolean removeGuild(String abbreviation) {
Guild guild = getGuildByAbbreviation(abbreviation);
if (guild != null) {
object.getGuildList().remove(guild);
return true;
}
return false;
}
@Override
public void insertOpcodes(Map<Integer, INetworkRemoteEvent> swgOpcodes, Map<Integer, INetworkRemoteEvent> objControllerOpcodes) {

View File

@@ -621,6 +621,14 @@ public class PlayerService implements INetworkDispatch {
grantLevel(creature, level);
player.setProfessionIcon(Professions.get(profession));
if (creature.getGuildId() != 0) {
Guild guild = core.guildService.getGuildById(creature.getGuildId());
if (guild != null && guild.getMembers().containsKey(creature.getObjectID())) {
guild.getMember(creature.getObjectID()).setProfession(getFormalProfessionName(profession));
}
}
}
/*
@@ -709,6 +717,14 @@ public class PlayerService implements INetworkDispatch {
creature.setGrantedHealth(0);
creature.setLevel((short) 1);
if (creature.getGuildId() != 0) {
Guild guild = core.guildService.getGuildById(creature.getGuildId());
if (guild != null && guild.getMembers().containsKey(creature.getObjectID())) {
guild.getMember(creature.getObjectID()).setLevel((short) 1);
}
}
}
/*
@@ -879,6 +895,14 @@ public class PlayerService implements INetworkDispatch {
creature.showFlyText(OutOfBand.ProsePackage("@cbt_spam:skill_up"), 2.5f, new RGB(154, 205, 50), 0, true);
creature.playEffectObject("clienteffect/skill_granted.cef", "");
creature.playMusic("sound/music_acq_bountyhunter.snd");
if (creature.getGuildId() != 0) {
Guild guild = core.guildService.getGuildById(creature.getGuildId());
if (guild != null && guild.getMembers().containsKey(creature.getObjectID())) {
guild.getMember(creature.getObjectID()).setLevel((short) level);
}
}
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}

View File

@@ -811,6 +811,13 @@ public class SimulationService implements INetworkDispatch {
core.mountService.storeAll(object);
for (Integer roomId : ghost.getJoinedChatChannels()) {
ChatRoom room = core.chatService.getChatRoom(roomId.intValue());
if (room != null) { core.chatService.leaveChatRoom(object, roomId.intValue()); }
// work-around for any channels that may have been deleted, or only spawn on server startup, that were added to the joined channels
else { ghost.removeChannel(roomId); }
}
/*
object.createTransaction(core.getCreatureODB().getEnvironment());
core.getCreatureODB().put(object, Long.class, CreatureObject.class, object.getTransaction());

View File

@@ -48,6 +48,7 @@ import engine.resources.service.INetworkDispatch;
import engine.resources.service.INetworkRemoteEvent;
import resources.common.*;
import resources.datatables.DisplayType;
import resources.guild.Guild;
import resources.objects.creature.CreatureObject;
import resources.objects.player.PlayerObject;
import protocol.swg.AddIgnoreMessage;
@@ -262,9 +263,31 @@ public class ChatService implements INetworkDispatch {
if(sender == null)
return;
// TODO: Recipient handling for values: citizens, group, guild, guild ranks (ace, boot, admiral, etc.) - Nulls at this point atm
SWGObject recipient = getObjectByFirstName(packet.getRecipient());
// TODO: Recipient handling for values: citizens, group, guild ranks (ace, boot, admiral, etc.)
if (packet.getRecipient().equals("guild")) {
Guild guild = core.guildService.getGuildById(((CreatureObject) sender).getGuildId());
if (guild == null || !guild.getMembers().containsKey(sender.getObjectID())) {
ChatOnSendPersistentMessage response = new ChatOnSendPersistentMessage(4, packet.getCounter());
session.write(response.serialize());
return;
}
if (!guild.getMember(sender.getObjectID()).hasMailPermission()) {
((CreatureObject) sender).sendSystemMessage("@guild:generic_fail_no_permission", (byte) 0);
ChatOnSendPersistentMessage response = new ChatOnSendPersistentMessage(4, packet.getCounter());
session.write(response.serialize());
return;
}
guild.sendGuildMail(sender.getCustomName(), packet.getSubject(), packet.getMessage());
ChatOnSendPersistentMessage response = new ChatOnSendPersistentMessage(0, packet.getCounter());
session.write(response.serialize());
return;
}
SWGObject recipient = getObjectByFirstName(packet.getRecipient());
PlayerObject recipientGhost = (PlayerObject) recipient.getSlottedObject("ghost");
if (recipientGhost.getIgnoreList().contains(sender.getCustomName().toLowerCase()))
@@ -941,7 +964,9 @@ public class ChatService implements INetworkDispatch {
}
room.addUser(user.toLowerCase());
((CreatureObject) player).getPlayerObject().addChannel(roomId);
if (!((CreatureObject) player).getPlayerObject().isMemberOfChannel(roomId)) {
((CreatureObject) player).getPlayerObject().addChannel(roomId);
}
return true;
}
return false;
@@ -975,7 +1000,7 @@ public class ChatService implements INetworkDispatch {
}
});
((PlayerObject) player.getSlottedObject("ghost")).removeChannel(roomId);
((PlayerObject) player.getSlottedObject("ghost")).removeChannel((Integer) roomId);
}
public void sendChatRoomMessage(CreatureObject sender, int roomId, int msgId, String message) {

View File

@@ -46,8 +46,10 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import resources.common.*;
import resources.datatables.DisplayType;
import resources.datatables.Options;
import resources.datatables.PlayerFlags;
import resources.guild.Guild;
import resources.harvest.SurveyTool;
import org.apache.mina.core.buffer.IoBuffer;
@@ -902,8 +904,15 @@ public class ObjectService implements INetworkDispatch {
}
}
if(!core.getConfig().getString("MOTD").equals(""))
creature.sendSystemMessage(core.getConfig().getString("MOTD"), (byte) 2);
creature.sendSystemMessage(core.getMotd(), DisplayType.Chat);
if (creature.getGuildId() != 0) {
Guild guild = core.guildService.getGuildById(creature.getGuildId());
if (guild != null && guild.getMembers().containsKey(creature.getObjectID())) {
core.guildService.sendGuildMotd(creature, guild);
}
}
if (core.getBountiesODB().contains(creature.getObjectID()))
core.missionService.getBountyMap().put(creature.getObjectID(), (BountyListItem) core.getBountiesODB().get(creature.getObjectID()));