mirror of
https://github.com/SWG-Source/dsrc.git
synced 2026-07-28 22:15:54 -04:00
333 lines
12 KiB
Plaintext
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;
|
|
}
|
|
|
|
// ======================================================================
|
|
|