// ====================================================================== // // master_guild_object.script // // Copyright 2002 Sony Online Entertainment // // ====================================================================== include library.guild; include library.objvar_mangle; include library.utils; // ====================================================================== int guildProcessInterval = -1; int guildUpdateInterval = -1; const int DEFAULT_GUILD_PROCESS_INTERVAL = 60*60; const int DEFAULT_GUILD_UPDATE_INTERVAL = 60*60*24*7; const int MIN_GUILD_MEMBERS = 5; const string VAR_NAMECHANGE = "guildNamechange"; const string VAR_NAMECHANGE_IDS = VAR_NAMECHANGE + ".ids"; const string VAR_NAMECHANGE_TIMES = VAR_NAMECHANGE + ".times"; const string VAR_NAMECHANGE_NAMES = VAR_NAMECHANGE + ".names"; const string VAR_NAMECHANGE_ABBREVS = VAR_NAMECHANGE + ".abbrevs"; const string VAR_NAMECHANGE_CHANGERS = VAR_NAMECHANGE + ".changers"; // ====================================================================== trigger OnInitialize() { messageTo(self, "onGuildUpdatePulse", null, getGuildProcessInterval(), false); return SCRIPT_CONTINUE; } // ====================================================================== messageHandler onGuildUpdatePulse() { updateGuilds(self, false); updateGuildNameChanges(self, false); messageTo(self, "onGuildUpdatePulse", null, getGuildProcessInterval(), false); return SCRIPT_CONTINUE; } // ---------------------------------------------------------------------- messageHandler forceUpdateGuilds() { updateGuilds(self, true); return SCRIPT_CONTINUE; } // ---------------------------------------------------------------------- messageHandler forceUpdateGuildNameChanges() { updateGuildNameChanges(self, true); return SCRIPT_CONTINUE; } // ---------------------------------------------------------------------- messageHandler initiateGuildNameChange() { int guildId = params.getInt("guildId"); string newName = params.getString("newName"); string newAbbrev = params.getString("newAbbrev"); obj_id changerId = params.getObjId("changerId"); int[] guildNamechangeIds = objvar_mangle.getMangledIntArrayObjVar(self, VAR_NAMECHANGE_IDS); int[] guildNamechangeTimes = objvar_mangle.getMangledIntArrayObjVar(self, VAR_NAMECHANGE_TIMES); string[] guildNamechangeNames = objvar_mangle.getMangledStringArrayObjVar(self, VAR_NAMECHANGE_NAMES); string[] guildNamechangeAbbrevs = objvar_mangle.getMangledStringArrayObjVar(self, VAR_NAMECHANGE_ABBREVS); obj_id[] guildNamechangeChangers = objvar_mangle.getMangledObjIdArrayObjVar(self, VAR_NAMECHANGE_CHANGERS); // the changers array was added, so we need to fix it up if it doesn't exist if (guildNamechangeChangers == null && guildNamechangeIds != null) { guildNamechangeChangers = new obj_id[guildNamechangeIds.length]; for (int i = 0; i < guildNamechangeChangers.length; ++i) guildNamechangeChangers[i] = obj_id.NULL_ID; } int nextTime = getGameTime()+getGuildUpdateInterval(); if ( guildNamechangeIds != null && guildNamechangeTimes != null && guildNamechangeNames != null && guildNamechangeAbbrevs != null && guildNamechangeChangers != null && guildNamechangeIds.length == guildNamechangeTimes.length && guildNamechangeIds.length == guildNamechangeNames.length && guildNamechangeIds.length == guildNamechangeAbbrevs.length && guildNamechangeIds.length == guildNamechangeChangers.length) { for (int i = 0; i < guildNamechangeIds.length; ++i) { if (guildNamechangeIds[i] == guildId) { guildNamechangeTimes[i] = nextTime; guildNamechangeNames[i] = newName; guildNamechangeAbbrevs[i] = newAbbrev; guildNamechangeChangers[i] = changerId; objvar_mangle.setMangledIntArrayObjVar(self, VAR_NAMECHANGE_TIMES, guildNamechangeTimes); objvar_mangle.setMangledStringArrayObjVar(self, VAR_NAMECHANGE_NAMES, guildNamechangeNames); objvar_mangle.setMangledStringArrayObjVar(self, VAR_NAMECHANGE_ABBREVS, guildNamechangeAbbrevs); objvar_mangle.setMangledObjIdArrayObjVar(self, VAR_NAMECHANGE_CHANGERS, guildNamechangeChangers); return SCRIPT_CONTINUE; } } } else { guildNamechangeIds = null; guildNamechangeTimes = null; guildNamechangeNames = null; guildNamechangeAbbrevs = null; guildNamechangeChangers = null; } int newCount = 1; if (guildNamechangeIds != null) newCount = guildNamechangeIds.length+1; int[] newGuildNamechangeIds = new int[newCount]; int[] newGuildNamechangeTimes = new int[newCount]; string[] newGuildNamechangeNames = new string[newCount]; string[] newGuildNamechangeAbbrevs = new string[newCount]; obj_id[] newGuildNamechangeChangers = new obj_id[newCount]; for (int i = 0; i < newCount-1; ++i) { newGuildNamechangeIds[i] = guildNamechangeIds[i]; newGuildNamechangeTimes[i] = guildNamechangeTimes[i]; newGuildNamechangeNames[i] = guildNamechangeNames[i]; newGuildNamechangeAbbrevs[i] = guildNamechangeAbbrevs[i]; newGuildNamechangeChangers[i] = guildNamechangeChangers[i]; } newGuildNamechangeIds[newCount-1] = guildId; newGuildNamechangeTimes[newCount-1] = nextTime; newGuildNamechangeNames[newCount-1] = newName; newGuildNamechangeAbbrevs[newCount-1] = newAbbrev; newGuildNamechangeChangers[newCount-1] = changerId; objvar_mangle.setMangledIntArrayObjVar(self, VAR_NAMECHANGE_IDS, newGuildNamechangeIds); objvar_mangle.setMangledIntArrayObjVar(self, VAR_NAMECHANGE_TIMES, newGuildNamechangeTimes); objvar_mangle.setMangledStringArrayObjVar(self, VAR_NAMECHANGE_NAMES, newGuildNamechangeNames); objvar_mangle.setMangledStringArrayObjVar(self, VAR_NAMECHANGE_ABBREVS, newGuildNamechangeAbbrevs); objvar_mangle.setMangledObjIdArrayObjVar(self, VAR_NAMECHANGE_CHANGERS, newGuildNamechangeChangers); return SCRIPT_CONTINUE; } // ====================================================================== void updateGuilds(obj_id self, boolean force) { int[] guildUpdateIds = objvar_mangle.getMangledIntArrayObjVar(self, "guildUpdate.ids"); int[] guildUpdateTimes = objvar_mangle.getMangledIntArrayObjVar(self, "guildUpdate.times"); int currentTime = getGameTime(); int nextTime = currentTime+getGuildUpdateInterval(); if (guildUpdateIds != null && guildUpdateTimes != null && guildUpdateIds.length == guildUpdateTimes.length) { // process any pending updates for (int i = 0; i < guildUpdateIds.length; ++i) { if (force || guildUpdateTimes[i] <= currentTime) { guildUpdateTimes[i] = nextTime; handleGuildUpdate(guildUpdateIds[i]); } } } else { guildUpdateIds = null; guildUpdateTimes = null; } // update the guild information to match all current guilds int[] guildIds = getAllGuildIds(); int[] newGuildUpdateTimes = new int[guildIds.length]; for (int i = 0; i < guildIds.length; ++i) { int pos = findIntOffsetInTable(guildUpdateIds, guildIds[i]); if (pos == -1) newGuildUpdateTimes[i] = nextTime; else newGuildUpdateTimes[i] = guildUpdateTimes[pos]; } objvar_mangle.setMangledIntArrayObjVar(self, "guildUpdate.ids", guildIds); objvar_mangle.setMangledIntArrayObjVar(self, "guildUpdate.times", newGuildUpdateTimes); } // ---------------------------------------------------------------------- void updateGuildNameChanges(obj_id self, boolean force) { int currentTime = getGameTime(); int nextTime = currentTime+getGuildUpdateInterval(); // look for any name changes that need to be handled int[] guildNamechangeIds = objvar_mangle.getMangledIntArrayObjVar(self, VAR_NAMECHANGE_IDS); int[] guildNamechangeTimes = objvar_mangle.getMangledIntArrayObjVar(self, VAR_NAMECHANGE_TIMES); string[] guildNamechangeNames = objvar_mangle.getMangledStringArrayObjVar(self, VAR_NAMECHANGE_NAMES); string[] guildNamechangeAbbrevs = objvar_mangle.getMangledStringArrayObjVar(self, VAR_NAMECHANGE_ABBREVS); obj_id[] guildNamechangeChangers = objvar_mangle.getMangledObjIdArrayObjVar(self, VAR_NAMECHANGE_CHANGERS); // the changers array was added, so we need to fix it up if it doesn't exist if (guildNamechangeChangers == null && guildNamechangeIds != null) { guildNamechangeChangers = new obj_id[guildNamechangeIds.length]; for (int i = 0; i < guildNamechangeChangers.length; ++i) guildNamechangeChangers[i] = obj_id.NULL_ID; } if ( guildNamechangeIds != null && guildNamechangeTimes != null && guildNamechangeNames != null && guildNamechangeAbbrevs != null && guildNamechangeChangers != null && guildNamechangeIds.length == guildNamechangeTimes.length && guildNamechangeIds.length == guildNamechangeNames.length && guildNamechangeIds.length == guildNamechangeAbbrevs.length && guildNamechangeIds.length == guildNamechangeChangers.length) { int newCount = 0; for (int i = 0; i < guildNamechangeIds.length; ++i) { if (force || guildNamechangeTimes[i] <= currentTime) guild.handleGuildNameChange(guildNamechangeIds[i], guildNamechangeNames[i], guildNamechangeAbbrevs[i], guildNamechangeChangers[i]); else ++newCount; } if (newCount == 0) clearNamechanges(self); else if (newCount != guildNamechangeIds.length) { int[] newGuildNamechangeIds = new int[newCount]; int[] newGuildNamechangeTimes = new int[newCount]; string[] newGuildNamechangeNames = new string[newCount]; string[] newGuildNamechangeAbbrevs = new string[newCount]; obj_id[] newGuildNamechangeChangers = new obj_id[newCount]; int pos = 0; for (int i = 0; i < guildNamechangeIds.length; ++i) { if (guildNamechangeTimes[i] > currentTime) { newGuildNamechangeIds[pos] = guildNamechangeIds[i]; newGuildNamechangeTimes[pos] = guildNamechangeTimes[i]; newGuildNamechangeNames[pos] = guildNamechangeNames[i]; newGuildNamechangeAbbrevs[pos] = guildNamechangeAbbrevs[i]; newGuildNamechangeChangers[pos] = guildNamechangeChangers[i]; ++pos; } } objvar_mangle.setMangledIntArrayObjVar(self, VAR_NAMECHANGE_IDS, newGuildNamechangeIds); objvar_mangle.setMangledIntArrayObjVar(self, VAR_NAMECHANGE_TIMES, newGuildNamechangeTimes); objvar_mangle.setMangledStringArrayObjVar(self, VAR_NAMECHANGE_NAMES, newGuildNamechangeNames); objvar_mangle.setMangledStringArrayObjVar(self, VAR_NAMECHANGE_ABBREVS, newGuildNamechangeAbbrevs); objvar_mangle.setMangledObjIdArrayObjVar(self, VAR_NAMECHANGE_CHANGERS, newGuildNamechangeChangers); } } else clearNamechanges(self); } // ---------------------------------------------------------------------- void clearNamechanges(obj_id self) { removeObjVar(self, VAR_NAMECHANGE); } // ---------------------------------------------------------------------- void handleGuildUpdate( int guildId ) { // Run through removing any members or sponsored people that no longer exist. obj_id[] memberIds = guildGetMemberIds( guildId ); for ( int i = 0; i < memberIds.length; ++i ) { if ( !playerExists(memberIds[i]) ) guildRemoveMember( guildId, memberIds[i] ); } // Check for disbanding due to insufficient membership. memberIds = guild.getMemberIds( guildId, false, true ); if ( memberIds.length < MIN_GUILD_MEMBERS ) guild.disbandForNotEnoughMembers( guildId ); } // ---------------------------------------------------------------------- int findIntOffsetInTable(int[] from, int find) { if (from != null) for (int i = 0; i < from.length; ++i) if (from[i] == find) return i; return -1; } // ---------------------------------------------------------------------- int getGuildProcessInterval() { if (guildProcessInterval == -1) { string strGuildProcessInterval = getConfigSetting("GameServer", "guildProcessInterval"); if (strGuildProcessInterval != null) guildProcessInterval = utils.stringToInt(strGuildProcessInterval); if (guildProcessInterval <= 0) guildProcessInterval = DEFAULT_GUILD_PROCESS_INTERVAL; debugServerConsoleMsg(null, "guildProcessInterval set to " + guildProcessInterval + " seconds."); } return guildProcessInterval; } // ---------------------------------------------------------------------- int getGuildUpdateInterval() { if (guildUpdateInterval == -1) { string strGuildUpdateInterval = getConfigSetting("GameServer", "guildUpdateInterval"); if (strGuildUpdateInterval != null) guildUpdateInterval = utils.stringToInt(strGuildUpdateInterval); if (guildUpdateInterval <= 0) guildUpdateInterval = DEFAULT_GUILD_UPDATE_INTERVAL; debugServerConsoleMsg(null, "guildUpdateInterval set to " + guildUpdateInterval + " seconds."); } return guildUpdateInterval; } // ======================================================================