Files
dsrc/sku.0/sys.server/compiled/game/script/player/player_instance.java
Elour 9eaf8af328 Prevent players from receiving tokens from another instance
Using client side modifications could allow players to move between instances, being in "range" of the next instance would provide the reward without ending the exploting player's timer
2019-03-30 10:31:42 -07:00

823 lines
45 KiB
Java
Executable File

package script.player;
import script.*;
import script.library.*;
import java.util.Vector;
public class player_instance extends script.base_script
{
public player_instance()
{
}
public int OnHearSpeech(obj_id self, obj_id speaker, String text) throws InterruptedException
{
if (!isGod(self))
{
return SCRIPT_CONTINUE;
}
String[] parse = split(text, ' ');
if (parse.length < 2)
{
return SCRIPT_CONTINUE;
}
if (parse[0].equals("instanceRequest") && speaker == self)
{
if (parse.length == 3)
{
instance.requestInstanceMovement(self, parse[1], parse[2]);
}
else if (parse.length == 4)
{
instance.requestInstanceMovement(self, parse[1], utils.stringToInt(parse[2]), parse[3]);
}
else
{
instance.requestInstanceMovement(self, parse[1]);
}
}
if (parse[0].equals("closeInstance") && speaker == self)
{
instance.closeOwnedInstance(self, parse[1]);
}
if (parse[0].equals("exitInstance") && speaker == self)
{
instance.requestExitPlayer(parse[1], self);
}
return SCRIPT_CONTINUE;
}
public int OnUnsticking(obj_id self) throws InterruptedException
{
obj_id instanceController = instance.getAreaInstanceController(self);
if (hasScript(self, "npe.trigger_journal") && hasObjVar(self, "npe"))
{
location myLoc = getLocation(self);
if (myLoc.area.equals("dungeon1"))
{
String room = getCellName(myLoc.cell);
if (room.equals("cave_entrance"))
{
warpPlayer(self, "dungeon1", 0.0f, 0.0f, 0.0f, myLoc.cell, 7.10f, 9.5f, 6.5f);
return SCRIPT_OVERRIDE;
}
}
}
if (isIdValid(instanceController))
{
String instanceName = instance.getInstanceName(instanceController);
instance.requestExitPlayer(instanceName, self);
return SCRIPT_CONTINUE;
}
return SCRIPT_CONTINUE;
}
public int OnDuelRequest(obj_id self, obj_id actor, obj_id target) throws InterruptedException
{
if (instance.isInInstanceArea(actor) || instance.isInInstanceArea(target))
{
sendConsoleMessage(actor, "Dueling is not permitted here");
sendConsoleMessage(target, "Dueling is not permitted here");
return SCRIPT_OVERRIDE;
}
return SCRIPT_CONTINUE;
}
public int OnLogin(obj_id self) throws InterruptedException
{
String area_name = locations.getBuildoutAreaName(self);
int area_row = locations.getBuildoutAreaRow(self);
obj_id planet = getPlanetByName(getLocation(self).area);
String instance_controller = "" + area_name + "_" + area_row;
obj_id areaInstanceController = utils.hasScriptVar(planet, instance_controller) ? utils.getObjIdScriptVar(planet, instance_controller) : null;
if (!instance.isInInstanceArea(self))
{
return SCRIPT_CONTINUE;
}
if (!isIdValid(areaInstanceController))
{
doLogging("OnLogin", "Could not locate instance controller");
return SCRIPT_CONTINUE;
}
dictionary dict = new dictionary();
dict.put("player", self);
messageTo(areaInstanceController, "validatePlayer", dict, 1.0f, false);
return SCRIPT_CONTINUE;
}
public int OnClusterWideDataResponse(obj_id self, String manage_name, String name, int request_id, String[] element_name_list, dictionary[] data, int lock_key) throws InterruptedException
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ")recieved trigger");
int requestType = instance.getInstanceRequestType(self);
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ")'s requestType is " + requestType);
int team = instance.getInstanceRequestTeam(self);
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ")'s team is " + team);
if (requestType == instance.REQUEST_MOVETO && team != instance.REQUEST_INVALID)
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ")'s requestType was " + instance.REQUEST_MOVETO + " and team was not " + instance.REQUEST_INVALID);
if (data == null || data.length == 0 || !manage_name.startsWith("instance_manager"))
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ")'s dictionary 'data' was null, or manage name didnt start with 'instance_manager'. Releasing lock and dieing here.");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ")'s manage_name was " + manage_name + " and instance name was " + name + ".");
doLogging("Insufficient Data. Manage name = " + manage_name + ", instance name = " + name);
releaseClusterWideDataLock(manage_name, lock_key);
instance.setRequestResolved(self);
return SCRIPT_CONTINUE;
}
int emptyInstance = -1;
String instance_name = "";
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-about to start looping thru player " + self + "(" + getPlayerName(self) + ")'s dictionary 'data' passed from the trigger.");
for (int i = 0; i < data.length; i++)
{
dictionary dict = data[i];
obj_id instance_id = dict.getObjId("instance_id");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-Dictionary " + i + "'s instance_id for player " + self + "(" + getPlayerName(self) + ") is " + instance_id + ".");
instance_name = dict.getString("instance_name");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-Dictionary " + i + "'s instance_name for player " + self + "(" + getPlayerName(self) + ") is " + instance_name + ".");
obj_id owner = dict.getObjId("owner");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-Dictionary " + i + "'s owner for player " + self + "(" + getPlayerName(self) + ") is " + owner + ".");
int instance_team = dict.getInt("team");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-Dictionary " + i + "'s team for player " + self + "(" + getPlayerName(self) + ") is " + team + ".");
String groupList = "none";
if (team == 1)
{
groupList = dict.getString("groupOne");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-Dictionary " + i + "'s groupList for player " + self + "(" + getPlayerName(self) + ") is " + groupList + ".");
}
if (team == 2)
{
groupList = dict.getString("groupTwo");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-Dictionary " + i + "'s groupList for player " + self + "(" + getPlayerName(self) + ") is " + groupList + ".");
}
boolean isInstanceGroupValidated = instance.isPlayerOwnerGroupList(self, owner, instance_id, groupList, team, instance_team);
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-Dictionary " + i + "'s isInstanceGroupValidated for player " + self + "(" + getPlayerName(self) + ") is " + isInstanceGroupValidated + ".");
if (isInstanceGroupValidated)
{
doLogging("Found instance, initializing the move");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-Dictionary " + i + "'s isInstanceGroupValidated for player " + self + "(" + getPlayerName(self) + ") was true, so we are going to stop here.");
if (instance.isValidatedByLockoutData(self, instance_id, owner, instance_name))
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-calling movePlayerToInstance(" + self + ", " + instance_id + ", " + instance_name + ", " + owner + ", false, " + team + ") for player " + self + "(" + getPlayerName(self) + ").");
instance.movePlayerToInstance(self, instance_id, instance_name, owner, false, team);
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ") is being sent to instance. We now need to add them to the player list, if they are not in it already.");
if (!instance.isPlayerInPlayerList(self, groupList))
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ") was not in group list. Adding now.");
String newList = "";
if (groupList.equals("none"))
{
newList = "" + self;
}
else
{
newList = groupList.concat("_" + self);
}
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ")'s new groupList is " + newList);
if (team == 1)
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ") assigning new list to group1");
dict.put("groupOne", newList);
}
if (team == 2)
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ") assigning new list to group2");
dict.put("groupTwo", newList);
}
}
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ") replacing clusterwide data");
name = instance_name + "_" + instance_id;
replaceClusterWideData(manage_name, name, dict, true, lock_key);
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ") releasing clusterwide data");
releaseClusterWideDataLock(manage_name, lock_key);
instance.setRequestResolved(self);
return SCRIPT_CONTINUE;
}
else
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "movePlayerToInstance-isValidatedByLockoutData returned false for player " + getFirstName(self) + "(" + self + "). Sending messageTo 'instanceFailureMessage'");
dict.put("fail_reason", instance.FAIL_INVALID_LOCKOUT);
messageTo(self, "instanceFailureMessage", dict, 0.0f, false);
releaseClusterWideDataLock(manage_name, lock_key);
instance.setRequestResolved(self);
return SCRIPT_CONTINUE;
}
}
if ((instance_id == owner) && emptyInstance == -1)
{
emptyInstance = i;
}
}
dictionary lockoutData = instance.getLockoutData(self, instance_name);
if (lockoutData != null)
{
String strName = "@" + new string_id("instance", instance_name);
prose_package pp = new prose_package();
pp.other.set(strName);
pp.stringId = new string_id("instance", "lockout_notification");
sendSystemMessageProse(self, pp);
}
else if (emptyInstance > -1)
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-we had an empty instance (" + data[emptyInstance] + ") for player " + self + "(" + getPlayerName(self) + ").");
dictionary newDict = data[emptyInstance];
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-calling movePlayerToInstance(" + self + ", " + newDict.getObjId("instance_id") + ", " + newDict.getString("instance_name") + ", " + newDict.getObjId("owner") + ", true, " + team + ") for player " + self + "(" + getPlayerName(self) + ").");
instance.movePlayerToInstance(self, newDict.getObjId("instance_id"), newDict.getString("instance_name"), newDict.getObjId("owner"), true, team);
newDict.put("owner", self);
newDict.put("team", team);
String strName = newDict.getString("instance_name");
obj_id objName = newDict.getObjId("instance_id");
name = strName + "_" + objName;
String groupList = "" + self;
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ")'s new groupList is " + groupList);
if (team == 1)
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ") assigning new list to group1");
newDict.put("groupOne", groupList);
}
if (team == 2)
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ") assigning new list to group2");
newDict.put("groupTwo", groupList);
}
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-calling replaceClusterWideData(" + manage_name + ", " + name + ", " + newDict + ", true, " + lock_key + ") for player " + self + "(" + getPlayerName(self) + ").");
replaceClusterWideData(manage_name, name, newDict, true, lock_key);
releaseClusterWideDataLock(manage_name, lock_key);
instance.setRequestResolved(self);
return SCRIPT_CONTINUE;
}
else
{
sendSystemMessage(self, new string_id("instance", "all_full"));
}
}
if (requestType == instance.REQUEST_CLOSE)
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ")'s requestType was " + instance.REQUEST_CLOSE + ".");
if (data == null || data.length == 0 || !manage_name.startsWith("instance_manager"))
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-player " + self + "(" + getPlayerName(self) + ")'s dictionary 'data' was null, or manage name didnt start with 'instance_manager'. Releasing lock and dieing here.");
doLogging("Insufficient Data. Manage name = " + manage_name + ", instance name = " + name);
releaseClusterWideDataLock(manage_name, lock_key);
instance.setRequestResolved(self);
return SCRIPT_CONTINUE;
}
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-about to start looping thru player " + self + "(" + getPlayerName(self) + ")'s dictionary 'data' passed from the trigger.");
for (int i = 0; i < data.length; i++)
{
dictionary dict = data[i];
obj_id instance_id = dict.getObjId("instance_id");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-Dictionary " + i + "'s instance_id for player " + self + "(" + getPlayerName(self) + ") is " + instance_id + ".");
String instance_name = dict.getString("instance_name");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-Dictionary " + i + "'s instance_name for player " + self + "(" + getPlayerName(self) + ") is " + instance_name + ".");
obj_id owner = dict.getObjId("owner");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-Dictionary " + i + "'s owner for player " + self + "(" + getPlayerName(self) + ") is " + owner + ".");
String groupOne = dict.getString("groupOne");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-Dictionary " + i + "'s groupOne for player " + self + "(" + getPlayerName(self) + ") is " + groupOne + ".");
String groupTwo = dict.getString("groupTwo");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-Dictionary " + i + "'s groupTwo for player " + self + "(" + getPlayerName(self) + ") is " + groupTwo + ".");
if (isIdValid(owner) && owner == self)
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "OnClusterWideDataResponse-Dictionary " + i + "'s found owned instance for player " + self + "(" + getPlayerName(self) + "). Closing Instance");
doLogging("Found owned instance: Player list = " + groupOne);
instance.closeInstance(self, dict);
releaseClusterWideDataLock(manage_name, lock_key);
instance.setRequestResolved(self);
return SCRIPT_CONTINUE;
}
}
}
releaseClusterWideDataLock(manage_name, lock_key);
instance.setRequestResolved(self);
return SCRIPT_CONTINUE;
}
public int movePlayerToInstance(obj_id self, dictionary params) throws InterruptedException
{
if (params == null || params.isEmpty())
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "movePlayerToInstance-Params was empty, we are bailing out to avoid exceptions.");
return SCRIPT_CONTINUE;
}
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "movePlayerToInstance-MessageHandler starts here for player " + self + "(" + getPlayerName(self) + ").");
location instanceLoc = params.getLocation("location");
obj_id instance_id = params.getObjId("instance_id");
String instance_name = params.getString("instance_name");
obj_id owner = params.getObjId("owner");
int start_time = params.getInt("start_time");
int join_code = params.getInt("join_code");
int team = params.getInt("team");
utils.removeScriptVar(self, instance.REQUEST_TYPE);
utils.removeScriptVar(self, instance.REQUEST_TEAM);
utils.removeScriptVar(self, instance.REQUEST_TRIGGER);
if (!dataTableOpen(instance.INSTANCE_DATATABLE))
{
doLogging("Could not open table");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "movePlayerToInstance-datatable " + instance.INSTANCE_DATATABLE + " couldnt be opened exiting scripts");
return SCRIPT_CONTINUE;
}
dictionary data = dataTableGetRow(instance.INSTANCE_DATATABLE, instance_name);
if (data == null)
{
doLogging("null data in table");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "movePlayerToInstance-dataTableGetRow(" + instance.INSTANCE_DATATABLE + ", " + instance_name + ") returned null, exiting.");
return SCRIPT_CONTINUE;
}
instance.attachInstanceScriptsOnPlayer(self, data);
if (instance.isExclusiveInstance(instance_name))
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "movePlayerToInstance-isExclusiveInstance returned true, calling setResetDataOnPlayer for player " + self + "(" + getPlayerName(self) + ").");
instance.setResetDataOnPlayer(self, instance_id, owner, instance_name, start_time);
}
callable.storeCallables(self);
utils.dismountRiderJetpackCheck(self);
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "movePlayerToInstance-Team for player " + self + "(" + getPlayerName(self) + ") is " + team + ".");
if (team == 1)
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "movePlayerToInstance-team equaled 1 for player " + self + "(" + getPlayerName(self) + "). calling sendToEnterOne");
instance.sendToEnterOne(self, instance_id, instanceLoc, data);
}
if (team == 2)
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "movePlayerToInstance-team equaled 1 for player " + self + "(" + getPlayerName(self) + "). calling sendToEnterTwo");
instance.sendToEnterTwo(self, instance_id, instanceLoc, data);
}
int calendarTime = getCalendarTime();
String realTime = getCalendarTimeStringLocal(calendarTime);
int duration = data.getInt("time_limit");
String strProfession = skill.getProfessionName(getSkillTemplate(self));
String playerName = getPlayerName(self);
int playerLevel = getLevel(self);
obj_id groupId = getGroupObject(self);
String playerFaction = factions.getFaction(self);
int remaining = (start_time + duration) - getGameTime();
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "movePlayerToInstance-join_code for player " + self + "(" + getPlayerName(self) + ") was " + join_code + ".");
if (join_code == 0)
{
CustomerServiceLog("instance-" + instance_name, "Player(" + playerName + " STARTED instance_id(" + instance_id + ")");
CustomerServiceLog("instance-" + instance_name, "Start Time: " + realTime + ", Duration: " + duration);
CustomerServiceLog("instance-" + instance_name, "Instance Physical Location: " + instanceLoc);
CustomerServiceLog("instance-" + instance_name, "Side " + team);
CustomerServiceLog("instance-" + instance_name, "Players Is: " + strProfession + "/" + playerLevel + "/" + playerFaction);
if (isIdValid(groupId))
{
obj_id[] players = getGroupMemberIds(groupId);
CustomerServiceLog("instance-" + instance_name, "GROUP LIST");
for (int i = 0; i < players.length; i++)
{
if (players[i] == self)
{
continue;
}
CustomerServiceLog("instance-" + instance_name, "Member: " + getPlayerName(players[i]));
}
}
}
if (join_code == 1)
{
CustomerServiceLog("instance-" + instance_name, "Player(" + playerName + " JOINED instance_id(" + instance_id + ")");
CustomerServiceLog("instance-" + instance_name, "Instance owned by " + getPlayerName(owner));
CustomerServiceLog("instance-" + instance_name, "Player Joined at: " + realTime + ", time remaining: " + remaining);
CustomerServiceLog("instance-" + instance_name, "Instance Physical Location: " + instanceLoc);
CustomerServiceLog("instance-" + instance_name, "Side " + team);
CustomerServiceLog("instance-" + instance_name, "Players Is: " + strProfession + "/" + playerLevel + "/" + playerFaction);
if (isIdValid(groupId))
{
obj_id[] players = getGroupMemberIds(groupId);
CustomerServiceLog("instance-" + instance_name, "GROUP LIST");
for (int i = 0; i < players.length; i++)
{
if (players[i] == self)
{
continue;
}
CustomerServiceLog("instance-" + instance_name, "Member: " + getPlayerName(players[i]));
}
}
}
return SCRIPT_CONTINUE;
}
public int cmdShowInstanceInformation(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
{
if (utils.hasScriptVar(self, "showInstanceSui"))
{
int oldPid = utils.getIntScriptVar(self, "showInstanceSui");
sui.forceCloseSUIPage(oldPid);
}
String title = utils.packStringId(new string_id("instance", "instance_sui_title"));
String prompt = getShowInstanceInformationPrompt(self);
int pid = createSUIPage(sui.SUI_LISTBOX, self, self, "noHandler");
setSUIProperty(pid, "", "Size", "650,375");
setSUIProperty(pid, sui.LISTBOX_TITLE, sui.PROP_TEXT, title);
setSUIProperty(pid, sui.LISTBOX_PROMPT, sui.PROP_TEXT, prompt);
sui.listboxButtonSetup(pid, sui.OK_ONLY);
setSUIProperty(pid, sui.LISTBOX_BTN_OK, sui.PROP_TEXT, "@cancel");
String playerRaidId = "";
clearSUIDataSource(pid, sui.LISTBOX_DATASOURCE);
dictionary[] instance_data = instance.getAllLockoutData(self);
int idx = 0;
Vector listId = new Vector();
listId.setSize(0);
String header = utils.packStringId(new string_id("instance", "instance_sui_heading"));
addSUIDataItem(pid, sui.LISTBOX_DATASOURCE, "" + idx);
setSUIProperty(pid, sui.LISTBOX_DATASOURCE + "." + idx, sui.PROP_TEXT, header);
idx++;
if (instance_data == null || instance_data.length == 0)
{
addSUIDataItem(pid, sui.LISTBOX_DATASOURCE, "" + idx);
setSUIProperty(pid, sui.LISTBOX_DATASOURCE + "." + idx, sui.PROP_TEXT, "No Instance Data");
idx++;
}
else
{
for (int i = 0; i < instance_data.length; i++)
{
if (instance_data[i] == null)
{
listId.set(i, "");
continue;
}
int time = instance_data[i].getInt("time");
obj_id instance_id = instance_data[i].getObjId("instance_id");
obj_id owner = instance_data[i].getObjId("owner");
String instance_name = instance_data[i].getString("instance_name");
int startTime = instance_data[i].getInt("start_time");
int timeToClose = startTime + instance.getInstanceDuration(instance_name) - getGameTime();
String xxTimeToClose = getCalendarTimeStringLocal(getCalendarTime() + timeToClose);
if (timeToClose < 0)
{
timeToClose = 0;
}
playerRaidId = getRaidId("" + startTime, "" + instance_id, "" + owner);
listId.add(instance_name + "-" + playerRaidId);
int timeDifference = time - getCalendarTime();
String timeString = utils.formatTimeVerbose(timeDifference);
String xxTimeString = getCalendarTimeStringLocal(getCalendarTime() + timeDifference);
String closeString = "";
boolean isClosed = false;
prose_package statusProse = new prose_package();
if (timeToClose == 0)
{
isClosed = true;
closeString = "Instance Closed";
}
else
{
isClosed = false;
closeString = utils.formatTimeVerbose(timeToClose);
}
prose_package pp = new prose_package();
if (isClosed)
{
pp.stringId = new string_id("instance", "player_closed");
}
else
{
pp.stringId = new string_id("instance", "player_open");
}
String instanceName = "@" + new string_id("instance", instance_name);
pp.actor.set(playerRaidId);
pp.other.set(timeString);
pp.target.set(closeString);
String dataPoint = " \0" + packOutOfBandProsePackage(null, pp);
dataPoint = "" + instanceName + dataPoint;
addSUIDataItem(pid, sui.LISTBOX_DATASOURCE, "" + idx);
setSUIProperty(pid, sui.LISTBOX_DATASOURCE + "." + idx, sui.PROP_TEXT, dataPoint);
idx++;
}
}
obj_id groupId = getGroupObject(self);
if (isIdValid(groupId))
{
obj_id[] members = getGroupMemberIds(groupId);
if (members != null || members.length > 0)
{
addSUIDataItem(pid, sui.LISTBOX_DATASOURCE, "" + idx);
setSUIProperty(pid, sui.LISTBOX_DATASOURCE + "." + idx, sui.PROP_TEXT, "Group Members In Range");
idx++;
for (int i = 0; i < members.length; i++)
{
if (!isIdValid(members[i]) || !exists(members[i]))
{
continue;
}
if (!isPlayer(members[i]) || members[i] == self)
{
continue;
}
String playerName = getPlayerFullName(members[i]);
prose_package namePackage = new prose_package();
namePackage.stringId = new string_id("instance", "gold_text");
namePackage.actor.set(playerName);
playerName = "\0" + packOutOfBandProsePackage(null, namePackage);
addSUIDataItem(pid, sui.LISTBOX_DATASOURCE, "" + idx);
setSUIProperty(pid, sui.LISTBOX_DATASOURCE + "." + idx, sui.PROP_TEXT, playerName);
idx++;
dictionary[] groupMemberInstanceData = instance.getAllLockoutData(members[i]);
if (groupMemberInstanceData == null || groupMemberInstanceData.length == 0)
{
addSUIDataItem(pid, sui.LISTBOX_DATASOURCE, "" + idx);
setSUIProperty(pid, sui.LISTBOX_DATASOURCE + "." + idx, sui.PROP_TEXT, "No Instance Data");
idx++;
}
else
{
for (int q = 0; q < groupMemberInstanceData.length; q++)
{
if (groupMemberInstanceData[q] == null)
{
continue;
}
int time = groupMemberInstanceData[q].getInt("time");
obj_id instance_id = groupMemberInstanceData[q].getObjId("instance_id");
obj_id owner = groupMemberInstanceData[q].getObjId("owner");
String instance_name = groupMemberInstanceData[q].getString("instance_name");
int startTime = groupMemberInstanceData[q].getInt("start_time");
int timeToClose = startTime + instance.getInstanceDuration(instance_name) - getGameTime();
String xxTimeToClose = getCalendarTimeStringLocal(getCalendarTime() + timeToClose);
if (timeToClose < 0)
{
timeToClose = 0;
}
String raidId = getRaidId("" + startTime, "" + instance_id, "" + owner);
prose_package raidProse = new prose_package();
boolean bClose = false;
boolean bMatch = false;
String passedId = getPassedId(listId, instance_name);
if (!passedId.equals("") && raidId.equals(passedId))
{
bMatch = true;
}
else
{
bMatch = false;
}
int timeDifference = time - getCalendarTime();
String timeString = utils.formatTimeVerbose(timeDifference);
String xxTimeString = getCalendarTimeStringLocal(getCalendarTime() + timeDifference);
prose_package statusProse = new prose_package();
String closeString = "";
if (timeToClose == 0)
{
bClose = true;
closeString = "Instance Closed";
}
else
{
bClose = false;
closeString = utils.formatTimeVerbose(timeToClose);
}
prose_package pp = new prose_package();
if (bClose && bMatch)
{
pp.stringId = new string_id("instance", "close_same");
}
if (bClose && !bMatch)
{
pp.stringId = new string_id("instance", "close_different");
}
if (!bClose && bMatch)
{
pp.stringId = new string_id("instance", "open_same");
}
if (!bClose && !bMatch)
{
pp.stringId = new string_id("instance", "open_different");
}
String instanceName = "@" + new string_id("instance", instance_name);
pp.other.set(timeString);
pp.target.set(closeString);
pp.actor.set(raidId);
String dataPoint = " \0" + packOutOfBandProsePackage(null, pp);
dataPoint = "" + instanceName + dataPoint;
addSUIDataItem(pid, sui.LISTBOX_DATASOURCE, "" + idx);
setSUIProperty(pid, sui.LISTBOX_DATASOURCE + "." + idx, sui.PROP_TEXT, dataPoint);
idx++;
}
}
}
}
}
subscribeToSUIEvent(pid, sui_event_type.SET_onGenericSelection, sui.LISTBOX_LIST, "noHandler");
subscribeToSUIPropertyForEvent(pid, sui_event_type.SET_onGenericSelection, sui.LISTBOX_LIST, sui.LISTBOX_LIST, sui.PROP_SELECTEDROW);
subscribeToSUIProperty(pid, sui.LISTBOX_LIST, sui.PROP_SELECTEDROW);
subscribeToSUIProperty(pid, sui.LISTBOX_TITLE, sui.PROP_TEXT);
showSUIPage(pid);
flushSUIPage(pid);
utils.setScriptVar(self, "showInstanceSui", pid);
return SCRIPT_CONTINUE;
}
public String getShowInstanceInformationPrompt(obj_id self) throws InterruptedException
{
String concatenatedAtrocity = getString(new string_id("instance", "flagging_header"));
concatenatedAtrocity += "\n";
concatenatedAtrocity += getUnflaggedInstancesString(self);
concatenatedAtrocity += "\n";
obj_id groupId = getGroupObject(self);
if (isIdValid(groupId))
{
obj_id[] members = getGroupMemberIds(groupId);
if (members != null || members.length > 0)
{
for (int i = 0; i < members.length; i++)
{
if (!isIdValid(members[i]) || !exists(members[i]))
{
continue;
}
if (!isPlayer(members[i]) || members[i] == self)
{
continue;
}
concatenatedAtrocity += getUnflaggedInstancesString(members[i]);
concatenatedAtrocity += "\n";
}
}
}
return concatenatedAtrocity;
}
public String getUnflaggedInstancesString(obj_id player) throws InterruptedException
{
String[] instanceList = new String[dataTableGetNumRows(instance.INSTANCE_DATATABLE)];
int numNotFlagged = 0;
String unflaggedInstancesString = getString(new string_id("instance", "gold"));
unflaggedInstancesString += getFirstName(player) + ": ";
String instancesString = "";
String preambleString = "";
for (int i = 0; i < instanceList.length; i++)
{
String thisInstance = dataTableGetString(instance.INSTANCE_DATATABLE, i, "key_required");
if (thisInstance.equals("none"))
{
continue;
}
if (!hasObjVar(player, "instance_player_protected_data." + thisInstance))
{
if (numNotFlagged > 0)
{
instancesString += ", ";
}
instancesString += getString(new string_id("instance", thisInstance));
numNotFlagged++;
}
}
if (numNotFlagged == 0)
{
preambleString += getString(new string_id("instance", "flagging_all_flags"));
}
else
{
preambleString += getString(new string_id("instance", "flagging_not_flagged_for"));
}
unflaggedInstancesString += preambleString + instancesString;
return unflaggedInstancesString;
}
public String getRaidId(String time, String instance, String owner) throws InterruptedException
{
String subTime = time.substring(time.length() - 3, time.length());
String subInstance = instance.substring(instance.length() - 3, instance.length());
String subOwner = owner.substring(owner.length() - 3, owner.length());
return subTime + subInstance + subOwner;
}
public String getPassedId(Vector listId, String instance_name) throws InterruptedException
{
if (listId == null || listId.size() == 0)
{
return "";
}
for (int i = 0; i < listId.size(); i++)
{
if (((String)listId.get(i)).equals(""))
{
continue;
}
String[] parse = split(((String)listId.get(i)), '-');
String passedName = parse[0];
String passedId = parse[1];
if (passedName.equals(instance_name))
{
return passedId;
}
}
return "";
}
public void doLogging(String message) throws InterruptedException
{
LOG("doLogging/player_instance", message);
}
public void doLogging(String section, String message) throws InterruptedException
{
LOG("doLogging/player_instance/" + section, message);
}
public int handleAwardtoken(obj_id self, dictionary params) throws InterruptedException
{
obj_id instanceController = instance.getAreaInstanceController(self);
if (!isIdValid(instanceController))
{
return SCRIPT_CONTINUE;
}
if (!instance.isPlayerInPlayerList(self, instance.getPlayerList(instanceController)))
{
return SCRIPT_CONTINUE;
}
int tokenIndex = params.getInt("tokenIndex");
int count = 1;
if (params.containsKey("tokenCount"))
{
count = params.getInt("tokenCount");
}
float multiplier = utils.stringToFloat(getConfigSetting("GameServer", "heroicTokenBonus"));
if (multiplier > 1)
{
count = (int)((float)count * (float)multiplier);
}
if (tokenIndex < 0 || tokenIndex >= trial.HEROIC_TOKENS.length)
{
sendSystemMessageTestingOnly(self, "DEBUG: handleAwardtoken sent with out of range tokenIndex.");
return SCRIPT_CONTINUE;
}
obj_id inventory = utils.getInventoryContainer(self);
obj_id token = static_item.createNewItemFunction(trial.HEROIC_TOKENS[tokenIndex], inventory, count);
prose_package pp = new prose_package();
if (count > 1)
{
pp = prose.setStringId(pp, new string_id("set_bonus", "recieve_heroic_token_multi"));
}
else
{
pp = prose.setStringId(pp, new string_id("set_bonus", "recieve_heroic_token"));
}
pp = prose.setDI(pp, count);
pp = prose.setTT(pp, new string_id("static_item_n", trial.HEROIC_TOKENS[tokenIndex]));
sendSystemMessageProse(self, pp);
if (tokenIndex == 5 && count == 9)
{
badge.grantBadge(self, "champion_of_hoth");
obj_id[] rewards = new obj_id[1];
rewards[0] = static_item.createNewItemFunction("item_hoth_flawless_painting", inventory);
showLootBox(self, rewards);
setObjVar(self, "hoth.flawless_reward", 1);
}
return SCRIPT_CONTINUE;
}
public int instanceFailureMessage(obj_id self, dictionary params) throws InterruptedException
{
if (params == null || params.isEmpty())
{
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "instanceFailureMessage-has a null params exiting handler.");
return SCRIPT_CONTINUE;
}
int reason = params.getInt("fail_reason");
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "instanceFailureMessage-params.fail_reason was " + reason + ".");
switch (reason)
{
case instance.FAIL_INSTANCE_FULL:
sendSystemMessage(self, new string_id("instance", "fail_instance_full"));
break;
case instance.FAIL_NOT_MEMBER:
sendSystemMessage(self, new string_id("instance", "fail_not_member"));
break;
case instance.INSTANCE_TIMEOUT:
sendSystemMessage(self, new string_id("instance", "instance_time_out"));
break;
case instance.FAIL_INVALID_LOCKOUT:
sendSystemMessage(self, new string_id("instance", "fail_invalid_lockout"));
break;
case instance.FAIL_INSTANCE_CLOSED:
sendSystemMessageTestingOnly(self, "The instance you are attempting to enter is currently inactive");
break;
case instance.FAIL_INSTANCE_FEW_PLAYERS:
sendSystemMessage(self, new string_id("instance", "fail_under_player_limit"));
break;
case instance.FAIL_WARN_TOO_FEW:
int limit = params.getInt("player_low_limit");
prose_package pp = new prose_package();
pp = prose.setStringId(pp, new string_id("instance", "fail_under_player_limit_warning"));
pp = prose.setDI(pp, limit);
sendSystemMessageProse(self, pp);
break;
default:
CustomerServiceLog(instance.INSTANCE_DEBUG_LOG, "instanceFailureMessage-switch statement reached the default case this means no system message to player and we died.");
break;
}
return SCRIPT_CONTINUE;
}
public int requestInstance(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
{
obj_id enterObject = getFirstObjectWithObjVar(getLocation(trial.getTop(self)), 1000.0f, "instance_name");
if (!isIdValid(enterObject))
{
sendSystemMessageTestingOnly(self, "No object in range");
return SCRIPT_CONTINUE;
}
String instance_name = getStringObjVar(enterObject, "instance_name");
instance.requestInstanceMovement(self, instance_name);
return SCRIPT_CONTINUE;
}
public int delayInstanceRequest(obj_id self, dictionary params) throws InterruptedException
{
String instance_name = params.getString("instance_name");
instance.requestInstanceMovement(self, instance_name);
return SCRIPT_CONTINUE;
}
public int clearInstanceScriptVar(obj_id self, dictionary params) throws InterruptedException
{
utils.removeScriptVarTree(self, "instance");
return SCRIPT_CONTINUE;
}
}