Files
dsrc/sku.0/sys.server/compiled/game/script/library/heavyweapons.java
Tekaoh 5c2e112349 Java 11.0.2 migration (#32)
* Code compiles - execution NOT tested

* updating gitignore

* Removed intellij settings files

* Removed more intellij files

* Added exclusion for JDK classes.

* Fixed purchasing script for vendors that have listed coin types.

* Updated script to not kick off until the entire preload is complete.

* adds static name entry for Solo movie poster and tcg9 vendor entry

* clean up empty and orphaned object templates

* adds placeholder black market (static) spawns

* corrects entries for the video game table to correctly set it in tcg series 2 and remove series 1 console errors

* Updated gitignore and removed intellij project files

* Fixed appearance reference for thranta payroll and kashyyyk door, added skipLosCheck objvar due to cannit see issue. Requires updated src

* Fixed appearance and template for terminal (#2)

* Fixed appearance and template for terminal (#3)

* Fixed appearance and template for terminal (#4)

* Deleted another faulty/orphaned object template

* Fixed gcw ranks option on frog. Only issue is that it doesn't award the officer commands or badges.

* Fixed some unneeded java 11 changes
2019-04-18 18:31:52 -05:00

412 lines
16 KiB
Java
Executable File

package script.library;
import script.combat_engine.attacker_data;
import script.combat_engine.defender_data;
import script.combat_engine.effect_data;
import script.combat_engine.weapon_data;
import script.dictionary;
import script.obj_id;
import script.string_id;
public class heavyweapons extends script.base_script
{
public heavyweapons()
{
}
public static final int TYPE_LAUNCHER_PISTOL = 1;
public static final int TYPE_ROCKET_LAUNCHER = 2;
public static final int TYPE_FLAME_THROWER = 3;
public static final int TYPE_HEAVY_PARTICLE_BEAM = 4;
public static final int TYPE_ACID_RIFLE = 5;
public static final int TYPE_HEAVY_ACID_BEAM = 6;
public static final int TYPE_LIGHTNING_BEAM_CANON = 7;
public static final int TYPE_PROTON_RIFLE = 8;
public static final int TYPE_HEAVY_FLAME_THROWER = 9;
public static final int TYPE_LAVA_CANNON = 10;
public static final int TYPE_MAX = 11;
public static final float LAUNCHER_PISTOL_AOE_RADIUS = 10.0f;
public static final float HVY_ACID_BEAM_AOE_RADIUS = 15.0f;
public static final int HVY_ACID_BEAM_AOE_CHANCE = 25;
public static final float HVY_ACID_BEAM_BLIND_DURATION = 20.0f;
public static final float HVY_LIGHTNING_BEAM_AOE_RADIUS = 10.0f;
public static final float FLAME_THROWER_CONE_ANGLE = 20.0f;
public static final float HEAVY_FLAME_THROWER_CONE_ANGLE = 25.0f;
public static final float LAVA_CANNON_AOE_RADIUS = 5.0f;
public static final int FLAME_THROWER_DOT_CHANCE = 30;
public static final float PARTICLE_BEAM_CONE_ANGLE = 1.0f;
public static final int ACID_RIFLE_PUNISHMENT_CHANCE = 40;
public static final float ACID_RIFLE_PUNISHMENT_DURATION = 15.0f;
public static final int ACID_RIFLE_MID_BLIND_CHANCE = 40;
public static final int ACID_RIFLE_MAX_BLIND_CHANCE = 20;
public static final int LIGHTNING_BEAM_CANON_DOT_CHANCE = 20;
public static final int LIGHTNING_BEAM_VEHICLE_SLOW_CHANCE = 100;
public static final float LIGHTNING_BEAM_VEHICLE_SLOW_DURATION = 20.0f;
public static final float LIGHTNING_BEAM_VEHICLE_SLOW_FACTOR = 0.1f;
public static final float FOCUS_FIRE_CONE_REDUCTION = 0.75f;
public static final float DEAD_BANG_RANGE_REDUCTION = 0.85f;
public static final float DEMOLITION_DAM_MULTIPLIER = 1.4f;
public static final float DEMOLITION_1_DAM_MULTIPLIER = 1.6f;
public static final float DEMOLITION_2_DAM_MULTIPLIER = 1.8f;
public static final String ATTACK_NAME_BASE_SINGLE = "co_hw_dot_";
public static final String ATTACK_NAME_BASE_AREA = "co_ae_hw_dot_";
public static int getHeavyWeaponType(obj_id weapon) throws InterruptedException
{
if (!hasObjVar(weapon, "intWeaponType"))
{
return -1;
}
int type = getIntObjVar(weapon, "intWeaponType");
if (type >= TYPE_MAX)
{
return -1;
}
return type;
}
public static boolean fillHeavyWeaponData(weapon_data dat) throws InterruptedException
{
int weaponType = getHeavyWeaponType(dat.id);
if (weaponType == -1)
{
return false;
}
float AOEDamagePercent = 0.0f;
if (hasObjVar(dat.id, "intAOEDamagePercent"))
{
AOEDamagePercent = getFloatObjVar(dat.id, "intAOEDamagePercent");
}
if (AOEDamagePercent > 1.0f)
{
AOEDamagePercent = 1.0f;
}
else if (AOEDamagePercent < 0.0f)
{
AOEDamagePercent = 0.0f;
}
dat.hvyWeaponType = weaponType;
dat.hvyWeaponAeDamageMod = AOEDamagePercent;
return true;
}
public static boolean canFireHeavyWeapon(obj_id player, weapon_data weapon) throws InterruptedException
{
if (cybernetic.hasCommandoLegs(player))
{
return true;
}
return true;
}
public static float getDemolitionShotDamageMod(obj_id attacker, obj_id defender, String actionName) throws InterruptedException
{
float mult = 1.05f;
if (isPlayer(defender) || ai_lib.isNpc(defender) || ai_lib.isAnimal(defender))
{
return mult;
}
actionName = toLower(actionName);
switch (actionName) {
case "demolitionshot_2":
mult = DEMOLITION_2_DAM_MULTIPLIER;
break;
case "demolitionshot":
mult = DEMOLITION_DAM_MULTIPLIER;
break;
case "demolitionshot_1":
mult = DEMOLITION_1_DAM_MULTIPLIER;
break;
}
return mult;
}
public static obj_id[] getAllHeavyWeaponTargets(obj_id attacker, obj_id defender, weapon_data weapon, dictionary actionData) throws InterruptedException
{
float rangeModifier = 1.0f;
float areaModifier = 1.0f;
String actionName = toLower(actionData.getString("actionName"));
if (actionName != null && actionName.length() > 0)
{
if (actionName.startsWith("demolition") || actionName.startsWith("overkill"))
{
return new obj_id[]
{
defender
};
}
if (actionName.startsWith("deadbang"))
{
rangeModifier = DEAD_BANG_RANGE_REDUCTION;
}
else if (actionName.startsWith("focusfire"))
{
areaModifier = FOCUS_FIRE_CONE_REDUCTION;
}
}
obj_id[] defenders = null;
switch (weapon.hvyWeaponType)
{
case TYPE_LAUNCHER_PISTOL:
defenders = pvpGetTargetsInRange(attacker, defender, LAUNCHER_PISTOL_AOE_RADIUS * areaModifier);
break;
case TYPE_LAVA_CANNON:
defenders = pvpGetTargetsInRange(attacker, defender, LAVA_CANNON_AOE_RADIUS * areaModifier);
break;
case TYPE_FLAME_THROWER:
defenders = pvpGetTargetsInCone(attacker, attacker, defender, weapon.maxRange * rangeModifier, FLAME_THROWER_CONE_ANGLE * areaModifier);
break;
case TYPE_HEAVY_FLAME_THROWER:
defenders = pvpGetTargetsInCone(attacker, attacker, defender, weapon.maxRange * rangeModifier, HEAVY_FLAME_THROWER_CONE_ANGLE * areaModifier);
break;
case TYPE_HEAVY_PARTICLE_BEAM:
defenders = pvpGetTargetsInCone(attacker, attacker, defender, weapon.maxRange * rangeModifier, PARTICLE_BEAM_CONE_ANGLE * areaModifier);
if (defenders != null && defenders.length > 1)
{
obj_id temp = defenders[0];
defenders[0] = defenders[defenders.length - 1];
defenders[defenders.length - 1] = temp;
}
break;
case TYPE_HEAVY_ACID_BEAM:
defenders = pvpGetTargetsInRange(attacker, defender, HVY_ACID_BEAM_AOE_RADIUS * areaModifier);
break;
case TYPE_LIGHTNING_BEAM_CANON:
defenders = pvpGetTargetsInRange(attacker, defender, HVY_LIGHTNING_BEAM_AOE_RADIUS * areaModifier);
break;
default:
defenders = new obj_id[]
{
defender
};
break;
}
return defenders;
}
public static void finalizeHeavyWeaponAttack(attacker_data attacker, defender_data[] defenders, weapon_data weapon) throws InterruptedException
{
effect_data dat = new effect_data();
defender_data defender = defenders[0];
switch (weapon.hvyWeaponType)
{
case TYPE_ACID_RIFLE:
float distance = getDistance(attacker.id, defender.id);
if (distance > (weapon.maxRange - weapon.minRange) / 2)
{
return;
}
if (rand(1, 100) <= ACID_RIFLE_PUNISHMENT_CHANCE)
{
sendSystemMessage(attacker.id, new string_id("cbt_spam", "acid_rifle_selfblind"));
}
break;
}
return;
}
public static effect_data doHeavyWeaponDefenderEffect(attacker_data attacker, defender_data defender, weapon_data weapon) throws InterruptedException
{
effect_data rslt = new effect_data();
switch (weapon.hvyWeaponType)
{
case TYPE_LAUNCHER_PISTOL:
rslt = _doLauncherPistolAttack(attacker, defender, weapon);
break;
case TYPE_ROCKET_LAUNCHER:
rslt = _doRocketLauncherAttack(attacker, defender, weapon);
break;
case TYPE_FLAME_THROWER:
case TYPE_HEAVY_FLAME_THROWER:
rslt = _doFlameThrowerAttack(attacker, defender, weapon);
break;
case TYPE_LAVA_CANNON:
rslt = _doLavaCannonAttack(attacker, defender, weapon);
break;
case TYPE_HEAVY_PARTICLE_BEAM:
rslt = _doHeavyParticleBeamAttack(attacker, defender, weapon);
break;
case TYPE_ACID_RIFLE:
rslt = _doAcidRifleAttack(attacker, defender, weapon);
break;
case TYPE_HEAVY_ACID_BEAM:
rslt = _doHeavyAcidBeamAttack(attacker, defender, weapon);
break;
case TYPE_LIGHTNING_BEAM_CANON:
rslt = _doLightningBeamCanonAttack(attacker, defender, weapon);
break;
}
return rslt;
}
public static effect_data _doLauncherPistolAttack(attacker_data attacker, defender_data defender, weapon_data weapon) throws InterruptedException
{
return new effect_data();
}
public static effect_data _doLavaCannonAttack(attacker_data attacker, defender_data defender, weapon_data weapon) throws InterruptedException
{
return new effect_data();
}
public static effect_data _doRocketLauncherAttack(attacker_data attacker, defender_data defender, weapon_data weapon) throws InterruptedException
{
effect_data dat = new effect_data();
dat.posture = POSTURE_KNOCKED_DOWN;
return dat;
}
public static effect_data _doFlameThrowerAttack(attacker_data attacker, defender_data defender, weapon_data weapon) throws InterruptedException
{
if (rand(1, 100) <= FLAME_THROWER_DOT_CHANCE)
{
_applyHealthStatFireDot(attacker, defender, weapon);
}
return new effect_data();
}
public static effect_data _doHeavyParticleBeamAttack(attacker_data attacker, defender_data defender, weapon_data weapon) throws InterruptedException
{
return new effect_data();
}
public static effect_data _doAcidRifleAttack(attacker_data attacker, defender_data defender, weapon_data weapon) throws InterruptedException
{
effect_data dat = new effect_data();
dat.states = new int[]
{
STATE_BLINDED
};
dat.durations = new float[]
{
ACID_RIFLE_PUNISHMENT_DURATION
};
float distance = getDistance(defender.id, attacker.id);
if (distance <= (weapon.maxRange - weapon.minRange) / 2)
{
dat.stateChance = ACID_RIFLE_MID_BLIND_CHANCE;
}
else
{
dat.stateChance = ACID_RIFLE_MAX_BLIND_CHANCE;
}
return dat;
}
public static effect_data _doHeavyAcidBeamAttack(attacker_data attacker, defender_data defender, weapon_data weapon) throws InterruptedException
{
effect_data dat = new effect_data();
dat.states = new int[]
{
STATE_BLINDED
};
dat.durations = new float[]
{
HVY_ACID_BEAM_BLIND_DURATION
};
dat.stateChance = HVY_ACID_BEAM_AOE_CHANCE;
return dat;
}
public static effect_data _doLightningBeamCanonAttack(attacker_data attacker, defender_data defender, weapon_data weapon) throws InterruptedException
{
if (rand(1, 100) <= LIGHTNING_BEAM_CANON_DOT_CHANCE)
{
_applyHealthStatFireDot(attacker, defender, weapon);
if (vehicle.isRidingVehicle(defender.id) && rand(1, 100) <= LIGHTNING_BEAM_VEHICLE_SLOW_CHANCE)
{
obj_id objVehicle = getMountId(defender.id);
vehicle.doTempMaxSpeedReduction(objVehicle, LIGHTNING_BEAM_VEHICLE_SLOW_FACTOR, LIGHTNING_BEAM_VEHICLE_SLOW_DURATION);
sendSystemMessage(defender.id, new string_id("cbt_spam", "vehicle_slow_lightning"));
}
}
return new effect_data();
}
public static void _applyHealthStatFireDot(attacker_data attacker, defender_data defender, weapon_data weapon) throws InterruptedException
{
int duration = 0;
int potency = 0;
int strength = 0;
switch (weapon.hvyWeaponType)
{
case TYPE_FLAME_THROWER:
case TYPE_LIGHTNING_BEAM_CANON:
{
duration = rand(15, 45);
potency = rand(125, 225);
strength = rand(200, 400);
}
break;
case TYPE_HEAVY_FLAME_THROWER:
{
duration = rand(15, 60);
potency = rand(150, 275);
strength = rand(300, 500);
}
break;
}
dot.applyDotEffect(defender.id, attacker.id, dot.DOT_FIRE, "hvyWeaponDot_" + HEALTH + "_" + attacker.id, HEALTH, potency, strength, duration, true, null);
}
public static String getHeavyWeaponDotName(obj_id player, obj_id weapon, boolean singleTarget) throws InterruptedException
{
int elementalDamageType = getWeaponElementalType(weapon);
return getHeavyWeaponDotName(player, elementalDamageType, singleTarget);
}
public static String getHeavyWeaponDotName(obj_id player, weapon_data weaponData, boolean singleTarget) throws InterruptedException
{
int elementalDamageType = weaponData.elementalType;
return getHeavyWeaponDotName(player, elementalDamageType, singleTarget);
}
public static String getHeavyWeaponDotName(obj_id player, int elementalDamageType, boolean singleTarget) throws InterruptedException
{
int playerLevel = getLevel(player);
if (elementalDamageType <= 0)
{
return null;
}
String attackNameBase = "";
String attackNameType = "";
String attackNameLevel = "";
String finalAttackName = "";
if (singleTarget)
{
attackNameBase = ATTACK_NAME_BASE_SINGLE;
}
else
{
attackNameBase = ATTACK_NAME_BASE_AREA;
}
switch (elementalDamageType)
{
case DAMAGE_ENERGY:
attackNameType = "energy_";
break;
case DAMAGE_KINETIC:
attackNameType = "kinetic_";
break;
case DAMAGE_ELEMENTAL_HEAT:
attackNameType = "fire_";
break;
case DAMAGE_ELEMENTAL_COLD:
attackNameType = "cold_";
break;
case DAMAGE_ELEMENTAL_ACID:
attackNameType = "acid_";
break;
case DAMAGE_ELEMENTAL_ELECTRICAL:
attackNameType = "electrical_";
break;
default:
break;
}
if (playerLevel == 90)
{
attackNameLevel = "5";
}
else if (playerLevel >= 80)
{
attackNameLevel = "4";
}
else if (playerLevel >= 70)
{
attackNameLevel = "3";
}
else if (playerLevel >= 60)
{
attackNameLevel = "2";
}
else if (playerLevel >= 50)
{
attackNameLevel = "1";
}
finalAttackName = attackNameBase + attackNameType + attackNameLevel;
return finalAttackName;
}
}