Files
dsrc/sku.0/sys.server/compiled/game/script/systems/battlefield/destroy_objective.script
T

168 lines
5.3 KiB
Plaintext

/**********************************************************************
* Copyright (c)2000-2002 Sony Online Entertainment Inc.
* All Rights Reserved
*
* Title: destroy_objective
* Description: script that goes on the target destructible objects
* in a destroy mission.
* @author $Author:$
* @version $Revision:$
**********************************************************************/
/***** INCLUDES ********************************************************/
include library.battlefield;
include library.factions;
include library.utils;
/***** CONSTANTS *******************************************************/
const string VAR_WARNING_LEVEL = "battlefield.warning_level";
const string VAR_FACTION = "battlefield.faction";
const string_id SID_REPAIR_STRUCTURE = new string_id("battlefield", "repair_structure");
/***** TRIGGERS ********************************************************/
trigger OnAttach()
{
LOG("LOG_CHANNEL", "battlefield.destroy_objective::OnAttach -- " + self);
// We don't want to base destructible building script since this script overrides its triggers.
//if (hasScript(self, "systems.battlefield.destructible_building"))
// detachScript(self, "systems.battlefield.destructible_building");
// Set hitpoints to critical object value1
if (hasObjVar(self, battlefield.VAR_VALUE1))
{
int hitpoints = (int)getFloatObjVar(self, battlefield.VAR_VALUE1);
setMaxHitpoints(self, hitpoints);
setHitpoints(self, hitpoints);
}
// Set repair cost to critical object value2
if (hasObjVar(self, battlefield.VAR_VALUE2))
{
int repair_cost = getIntObjVar(self, battlefield.VAR_VALUE2);
setObjVar(self, battlefield.VAR_REPAIR_COST, repair_cost);
}
else
setObjVar(self, battlefield.VAR_REPAIR_COST, 10);
region bf = battlefield.getBattlefield(self);
obj_id master_object = battlefield.getMasterObjectFromRegion(bf);
int faction_id = pvpBattlefieldGetFaction(self, bf);
string faction = factions.getFactionNameByHashCode(faction_id);
// Mark the faction on the object so that it can be read OnDestroy.
setObjVar(self, VAR_FACTION, faction_id);
return SCRIPT_CONTINUE;
}
trigger OnObjectDamaged(obj_id attacker, obj_id weapon, int damage)
{
LOG("LOG_CHANNEL", "destroy_objective::OnCombatDamaged");
region bf = battlefield.getBattlefield(self);
string name = getName(self);
int faction_id = pvpBattlefieldGetFaction(self, bf);
string faction = factions.getFactionNameByHashCode(faction_id);
//string objVar_name = battlefield.VAR_GAME + "." + faction + "_warning_level";
// warning_level determines what warning messages have already been sent.
int warning_level = 0;
if (hasObjVar(self, VAR_WARNING_LEVEL))
warning_level = getIntObjVar(self, VAR_WARNING_LEVEL);
int hitpoints = getHitpoints(self);
int max_hitpoints = getMaxHitpoints(self);
float percent_hp = (float)hitpoints / (float)max_hitpoints;
//LOG("LOG_CHANNEL", "percent ->" + percent_hp + " warning level ->" + warning_level);
if (percent_hp < .5)
{
if (warning_level == 0)
{
battlefield.sendFactionMessage(bf, faction, name + " is heavily damaged!");
setObjVar(self, VAR_WARNING_LEVEL, 1);
}
}
if (percent_hp < .25)
{
if (warning_level == 1)
{
battlefield.sendFactionMessage(bf, faction, name + " is severely damaged!");
setObjVar(self, VAR_WARNING_LEVEL, 2);
}
}
if (percent_hp < .1)
{
if (warning_level == 2)
{
battlefield.sendFactionMessage(bf, faction, name + " is about to be destroyed!");
setObjVar(self, VAR_WARNING_LEVEL, 3);
}
}
return SCRIPT_CONTINUE;
}
trigger OnDestroy()
{
LOG("LOG_CHANNEL", "destroy_objective::OnObjectDisabled");
// If the object was not destroyed in combat, we don't want to do anything.
if (!hasObjVar(self, battlefield.VAR_COMBAT_DESTROYED))
return SCRIPT_CONTINUE;
region bf = battlefield.getBattlefield(self);
obj_id master_object = battlefield.getMasterObjectFromRegion(bf);
string name = getName(self);
int faction_id = getIntObjVar(self, VAR_FACTION);
string faction = factions.getFactionNameByHashCode(faction_id);
// Determine what destroy objectives are left for the faction
string objVar_name = battlefield.VAR_GAME + "." + faction + "_destroy";
//LOG("LOG_CHANNEL", "bf ->" + master_object + " name ->" + name + " faction_id ->" + faction_id + " faction ->" + faction);
resizeable obj_id[] destroy_objs = getResizeableObjIdArrayObjVar(master_object, objVar_name);
if (destroy_objs == null)
{
LOG("LOG_CHANNEL", "destroy_objective::OnObjectDisabled -- destroy_objs is null");
return SCRIPT_CONTINUE;
}
if (destroy_objs.length == 1)
{
// If this is the faction's last objective, it is eliminated.
dictionary params = new dictionary();
params.put("faction", faction);
messageTo(master_object, "msgEliminateFaction", params, 0.0f, true);
}
else
{
// Remove the destroyed object from the list.
int idx = utils.getElementPositionInArray(destroy_objs, self);
if (idx == -1)
LOG("LOG_CHANNEL", "battlefield.destroy_objective::OnObjectDisabled -- cannot find " + self + " in objective list.");
else
{
destroy_objs = utils.removeElementAt(destroy_objs, idx);
setObjVar(master_object, objVar_name, destroy_objs);
}
}
//battlefield.removeBattlefieldObject(self);
return SCRIPT_CONTINUE;
}
/***** COMMANDHANDLERS *************************************************/
/***** FUNCTIONS *******************************************************/