Files
dsrc/sku.0/sys.server/compiled/game/script/guild/master_guild_object.script
T
2013-09-10 23:17:15 -07:00

333 lines
12 KiB
Plaintext

// ======================================================================
//
// 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;
}
// ======================================================================