Space rare loot system functioning. Pending testing.

This commit is contained in:
Heron
2026-05-15 15:23:08 -04:00
parent d550f14830
commit 49edd3c461
4 changed files with 576 additions and 29 deletions
@@ -1,5 +1,6 @@
package script.space.rare_loot;
import script.library.luck;
import script.library.static_item;
import script.library.space_flags;
import script.library.space_utils;
@@ -16,6 +17,10 @@ public class space_rare_loot extends script.base_script
public static final String VAR_LAST_CHEST_AWARD_TIME = "loot.space_rare.lastChestAwardTime";
public static final String VAR_CHEST_REWARD_QUALITY = "loot.space_rare.rewardQuality";
public static final String VAR_CHEST_REWARD_TIER = "loot.space_rare.rewardTier";
public static final String VAR_ITEM_IS_RARE_SPACE_LOOT = "loot.space_rare.item.isRareSpaceLoot";
public static final String VAR_ITEM_REWARD_QUALITY = "loot.space_rare.item.rewardQuality";
public static final String VAR_ITEM_REWARD_QUALITY_NAME = "loot.space_rare.item.rewardQualityName";
public static final String VAR_ITEM_REWARD_TIER = "loot.space_rare.item.rewardTier";
public static final String SPACE_RLS_TABLE_LOCATION = "datatables/space_loot/space_rls";
public static final String REWARD_TABLE_BASE = SPACE_RLS_TABLE_LOCATION + "/rewards_tier_";
public static final String REWARD_TABLE_SUFFIX = ".iff";
@@ -29,6 +34,7 @@ public class space_rare_loot extends script.base_script
public static final String SCRIPT_SPACE_RARE_LOOT_CHEST = "space.rare_loot.space_rare_loot_chest";
public static final int MIN_REWARD_TIER = 1;
public static final int MAX_REWARD_TIER = 5;
public static final float LUCK_QUALITY_UPGRADE_MODIFIER = 0.10f;
public static boolean checkAwardEligibility(obj_id playerShip, obj_id targetShip) throws InterruptedException
{
@@ -107,9 +113,15 @@ public class space_rare_loot extends script.base_script
double rewardChanceTotal = adjustedRareChance + adjustedExceptionalChance + adjustedLegendaryChance;
double rewardRoll = rewardChanceTotal > 0.0d ? Math.random() * rewardChanceTotal : 0.0d;
int rewardQuality = determineRewardQuality(rewardRoll, adjustedRareChance, adjustedExceptionalChance, adjustedLegendaryChance);
int originalRewardQuality = rewardQuality;
boolean luckyQualityUpgrade = luck.isLucky(player, LUCK_QUALITY_UPGRADE_MODIFIER);
if (luckyQualityUpgrade)
{
rewardQuality = upgradeRewardQuality(rewardQuality);
}
String rewardQualityName = getRewardQualityName(rewardQuality);
float rewardQualityModifier = getRewardQualityModifier(rewardQuality);
int rewardTier = getRewardTier(effectivePlayerTier, targetTier);
int rewardTier = getRewardTier(targetTier);
obj_id lootContainer = getLootContainer(playerShip, player);
if (!isIdValid(lootContainer))
{
@@ -125,10 +137,23 @@ public class space_rare_loot extends script.base_script
}
setObjVar(player, VAR_LAST_CHEST_AWARD_TIME, getGameTime());
debug(player, "eligible, roll " + roll + " <= chance " + adjustedChance + " succeeded. Created " + rewardQualityName + " chest " + chest + ".");
CustomerServiceLog(LOG_CHANNEL, "Space rare loot award success. Player=" + player + " playerTier=" + playerTier + " effectivePlayerTier=" + effectivePlayerTier + " playerShip=" + playerShip + " targetShip=" + targetShip + " targetTier=" + targetTier + " lootContainer=" + lootContainer + " chest=" + chest + " rewardTier=" + rewardTier + " higherTierDelta=" + higherTierDelta + " chance=" + adjustedChance + " roll=" + roll + " rewardQuality=" + rewardQualityName + "(" + rewardQuality + ")" + " rewardQualityModifier=" + rewardQualityModifier + " rewardRoll=" + rewardRoll + " rewardChanceTotal=" + rewardChanceTotal + " baseRareChance=" + rareChance + " baseExceptionalChance=" + exceptionalChance + " baseLegendaryChance=" + legendaryChance + " adjustedRareChance=" + adjustedRareChance + " adjustedExceptionalChance=" + adjustedExceptionalChance + " adjustedLegendaryChance=" + adjustedLegendaryChance + " shiftedChance=" + shiftedChance);
CustomerServiceLog(LOG_CHANNEL, "Space rare loot award success. Player=" + player + " playerTier=" + playerTier + " effectivePlayerTier=" + effectivePlayerTier + " playerShip=" + playerShip + " targetShip=" + targetShip + " targetTier=" + targetTier + " lootContainer=" + lootContainer + " chest=" + chest + " rewardTier=" + rewardTier + " higherTierDelta=" + higherTierDelta + " chance=" + adjustedChance + " roll=" + roll + " rewardQuality=" + rewardQualityName + "(" + rewardQuality + ")" + " originalRewardQuality=" + getRewardQualityName(originalRewardQuality) + "(" + originalRewardQuality + ")" + " luckyQualityUpgrade=" + luckyQualityUpgrade + " rewardQualityModifier=" + rewardQualityModifier + " rewardRoll=" + rewardRoll + " rewardChanceTotal=" + rewardChanceTotal + " baseRareChance=" + rareChance + " baseExceptionalChance=" + exceptionalChance + " baseLegendaryChance=" + legendaryChance + " adjustedRareChance=" + adjustedRareChance + " adjustedExceptionalChance=" + adjustedExceptionalChance + " adjustedLegendaryChance=" + adjustedLegendaryChance + " shiftedChance=" + shiftedChance);
return true;
}
public static int upgradeRewardQuality(int rewardQuality)
{
if (rewardQuality == space_rare_loot_config.QUALITY_RARE)
{
return space_rare_loot_config.QUALITY_EXCEPTIONAL;
}
if (rewardQuality == space_rare_loot_config.QUALITY_EXCEPTIONAL)
{
return space_rare_loot_config.QUALITY_LEGENDARY;
}
return rewardQuality;
}
public static int getEffectivePilotTier(int playerTier, int targetTier)
{
if (targetTier > 0 && targetTier < playerTier)
@@ -230,22 +255,39 @@ public class space_rare_loot extends script.base_script
return parseTier(difficulty);
}
public static int getRewardTier(int playerTier, int targetTier)
public static int getRewardTier(int targetTier) throws InterruptedException
{
int rewardTier = playerTier;
if (targetTier < rewardTier)
{
rewardTier = targetTier;
}
if (rewardTier < MIN_REWARD_TIER)
int maxRewardTier = getClampedRewardTier(targetTier);
if (maxRewardTier <= MIN_REWARD_TIER)
{
return MIN_REWARD_TIER;
}
if (rewardTier > MAX_REWARD_TIER)
int totalWeight = 0;
int overCapTierCount = targetTier - MAX_REWARD_TIER;
if (overCapTierCount < 0)
{
return MAX_REWARD_TIER;
overCapTierCount = 0;
}
return rewardTier;
for (int rewardTier = MIN_REWARD_TIER; rewardTier <= maxRewardTier; rewardTier++)
{
totalWeight += getRewardTierWeight(rewardTier, overCapTierCount);
}
int roll = rand(1, totalWeight);
int currentWeight = 0;
for (int rewardTier = MIN_REWARD_TIER; rewardTier <= maxRewardTier; rewardTier++)
{
currentWeight += getRewardTierWeight(rewardTier, overCapTierCount);
if (roll <= currentWeight)
{
return rewardTier;
}
}
return maxRewardTier;
}
public static int getRewardTierWeight(int rewardTier, int overCapTierCount)
{
return rewardTier + (overCapTierCount * rewardTier * rewardTier);
}
public static String getRewardTable(int rewardTier)
@@ -1,5 +1,8 @@
package script.space.rare_loot;
import script.dictionary;
import script.library.create;
import script.library.space_crafting;
import script.library.utils;
import script.menu_info;
import script.menu_info_types;
@@ -16,6 +19,19 @@ public class space_rare_loot_chest extends script.base_script
public static final String ITEM_TYPE_CAPACITOR = "capacitor";
public static final String ITEM_TYPE_ARMOR = "armor";
public static final String ITEM_TYPE_DROID_INTERFACE = "droid_interface";
public static final String ARMOR_TABLE = "datatables/ship/components/armor.iff";
public static final String BOOSTER_TABLE = "datatables/ship/components/booster.iff";
public static final String CAPACITOR_TABLE = "datatables/ship/components/capacitor.iff";
public static final String DROID_INTERFACE_TABLE = "datatables/ship/components/droid_interface.iff";
public static final String DROID_INTERFACE_OVERRIDE_TABLE = space_rare_loot.SPACE_RLS_TABLE_LOCATION + "/droid_interface_override.iff";
public static final String ENGINE_TABLE = "datatables/ship/components/engine.iff";
public static final String REACTOR_TABLE = "datatables/ship/components/reactor.iff";
public static final String SHIELD_TABLE = "datatables/ship/components/shield.iff";
public static final String OVERRIDE_COLUMN_COMMAND_SPEED_MODIFIER = "commandSpeedModifier";
public static final String OVERRIDE_COLUMN_HITPOINTS_MODIFIER = "hitpointsModifier";
public static final String OVERRIDE_COLUMN_ARMOR_HITPOINTS_MODIFIER = "armorHitpointsModifier";
public static final String OVERRIDE_COLUMN_ENERGY_MAINTENANCE_MODIFIER = "energyMaintenanceModifier";
public static final String OVERRIDE_COLUMN_MASS_MODIFIER = "massModifier";
public space_rare_loot_chest()
{
@@ -62,9 +78,20 @@ public class space_rare_loot_chest extends script.base_script
}
String itemName = dataTableGetString(rewardTable, rewardRow, space_rare_loot.REWARD_TABLE_COLUMN_ITEM_NAME);
String itemType = dataTableGetString(rewardTable, rewardRow, space_rare_loot.REWARD_TABLE_COLUMN_ITEM_TYPE);
obj_id rewardItem = createSpaceRareLootItem(player, itemName, itemType, rewardQuality, rewardTier, rewardQualityModifier);
if (!isIdValid(rewardItem))
{
space_rare_loot.debug(player, "opened chest " + self + " but failed to create item " + itemName + " of type " + itemType + ".");
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot chest open failed, item creation failed. Player=" + player + " chest=" + self + " rewardTier=" + rewardTier + " rewardTable=" + rewardTable + " rewardRow=" + rewardRow + " itemName=" + itemName + " itemType=" + itemType + " rewardQuality=" + rewardQualityName + "(" + rewardQuality + ")");
return SCRIPT_CONTINUE;
}
space_rare_loot.debug(player, "opened chest " + self + " with reward tier " + rewardTier + ", quality " + rewardQualityName + ", row " + rewardRow + ", item " + itemName + ".");
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot chest opened. Player=" + player + " chest=" + self + " rewardTier=" + rewardTier + " rewardTable=" + rewardTable + " rewardRow=" + rewardRow + " itemName=" + itemName + " itemType=" + itemType + " rewardQuality=" + rewardQualityName + "(" + rewardQuality + ")" + " rewardQualityModifier=" + rewardQualityModifier);
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot chest opened. Player=" + player + " chest=" + self + " rewardItem=" + rewardItem + " rewardTier=" + rewardTier + " rewardTable=" + rewardTable + " rewardRow=" + rewardRow + " itemName=" + itemName + " itemType=" + itemType + " rewardQuality=" + rewardQualityName + "(" + rewardQuality + ")" + " rewardQualityModifier=" + rewardQualityModifier);
obj_id[] lootedItems = new obj_id[1];
lootedItems[0] = rewardItem;
showLootBox(player, lootedItems);
destroyObject(self);
return SCRIPT_CONTINUE;
}
@@ -76,77 +103,321 @@ public class space_rare_loot_chest extends script.base_script
}
if (itemType.equalsIgnoreCase(ITEM_TYPE_WEAPON))
{
return createWeaponReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier);
return stampRareSpaceLootItem(createWeaponReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier), rewardQuality, rewardTier);
}
if (itemType.equalsIgnoreCase(ITEM_TYPE_ENGINE))
{
return createEngineReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier);
return stampRareSpaceLootItem(createEngineReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier), rewardQuality, rewardTier);
}
if (itemType.equalsIgnoreCase(ITEM_TYPE_BOOSTER))
{
return createBoosterReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier);
return stampRareSpaceLootItem(createBoosterReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier), rewardQuality, rewardTier);
}
if (itemType.equalsIgnoreCase(ITEM_TYPE_REACTOR))
{
return createReactorReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier);
return stampRareSpaceLootItem(createReactorReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier), rewardQuality, rewardTier);
}
if (itemType.equalsIgnoreCase(ITEM_TYPE_SHIELD))
{
return createShieldReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier);
return stampRareSpaceLootItem(createShieldReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier), rewardQuality, rewardTier);
}
if (itemType.equalsIgnoreCase(ITEM_TYPE_CAPACITOR))
{
return createCapacitorReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier);
return stampRareSpaceLootItem(createCapacitorReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier), rewardQuality, rewardTier);
}
if (itemType.equalsIgnoreCase(ITEM_TYPE_ARMOR))
{
return createArmorReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier);
return stampRareSpaceLootItem(createArmorReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier), rewardQuality, rewardTier);
}
if (itemType.equalsIgnoreCase(ITEM_TYPE_DROID_INTERFACE))
{
return createDroidInterfaceReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier);
return stampRareSpaceLootItem(createDroidInterfaceReward(player, itemName, rewardQuality, rewardTier, rewardQualityModifier), rewardQuality, rewardTier);
}
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot chest open failed, unknown item type. Player=" + player + " itemName=" + itemName + " itemType=" + itemType + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality);
return null;
}
public obj_id stampRareSpaceLootItem(obj_id item, int rewardQuality, int rewardTier) throws InterruptedException
{
if (!isIdValid(item))
{
return item;
}
setObjVar(item, space_rare_loot.VAR_ITEM_IS_RARE_SPACE_LOOT, true);
setObjVar(item, space_rare_loot.VAR_ITEM_REWARD_QUALITY, rewardQuality);
setObjVar(item, space_rare_loot.VAR_ITEM_REWARD_QUALITY_NAME, space_rare_loot.getRewardQualityName(rewardQuality));
setObjVar(item, space_rare_loot.VAR_ITEM_REWARD_TIER, rewardTier);
return item;
}
public obj_id createWeaponReward(obj_id player, String itemName, int rewardQuality, int rewardTier, float rewardQualityModifier) throws InterruptedException
{
return null;
obj_id inventory = utils.getInventoryContainer(player);
if (!isIdValid(inventory) || getVolumeFree(inventory) <= 0)
{
return null;
}
obj_id weapon = create.object(itemName, inventory, false, false);
if (!isIdValid(weapon))
{
return null;
}
dictionary weaponData = dataTableGetRow(space_crafting.SHIP_WEAPON_TABLE, itemName);
if (weaponData == null)
{
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot weapon creation failed, missing weapon data. Player=" + player + " weapon=" + weapon + " itemName=" + itemName + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality);
destroyObject(weapon);
return null;
}
applyStandardComponentStats(weapon, weaponData, rewardQuality);
float minDamage = getDirectedValue(weaponData.getFloat("fltMinDamage"), weaponData.getFloat("fltMinDamageModifier"), rewardQuality, false);
float maxDamage = getDirectedValue(weaponData.getFloat("fltMaxDamage"), weaponData.getFloat("fltMaxDamageModifier"), rewardQuality, false);
if (maxDamage < minDamage)
{
maxDamage = minDamage;
}
space_crafting.setWeaponMinimumDamage(weapon, minDamage);
space_crafting.setWeaponMaximumDamage(weapon, maxDamage);
space_crafting.setWeaponShieldEffectiveness(weapon, getDirectedValue(weaponData.getFloat("fltShieldEffectiveness"), weaponData.getFloat("fltShieldEffectivenessModifier"), rewardQuality, false));
space_crafting.setWeaponArmorEffectiveness(weapon, getDirectedValue(weaponData.getFloat("fltArmorEffectiveness"), weaponData.getFloat("fltArmorEffectivenessModifier"), rewardQuality, false));
space_crafting.setWeaponEnergyPerShot(weapon, getDirectedValue(weaponData.getFloat("fltEnergyPerShot"), weaponData.getFloat("fltEnergyPerShotModifier"), rewardQuality, true));
space_crafting.setWeaponRefireRate(weapon, getDirectedValue(weaponData.getFloat("fltRefireRate"), weaponData.getFloat("fltRefireRateModifier"), rewardQuality, true));
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot weapon created. Player=" + player + " weapon=" + weapon + " itemName=" + itemName + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality + " rewardQualityModifier=" + rewardQualityModifier + " minDamage=" + minDamage + " maxDamage=" + maxDamage);
return weapon;
}
public void applyStandardComponentStats(obj_id component, dictionary componentData, int rewardQuality) throws InterruptedException
{
float energyMaintenance = getDirectedValue(componentData.getFloat("fltEnergyMaintenance"), componentData.getFloat("fltEnergyMaintenanceModifier"), rewardQuality, true);
float mass = getDirectedValue(componentData.getFloat("fltMass"), componentData.getFloat("fltMassModifier"), rewardQuality, true);
float armorHitpoints = getDirectedValue(componentData.getFloat("fltMaximumArmorHitpoints"), componentData.getFloat("fltMaximumArmorHitpointsMod"), rewardQuality, false);
float hitpoints = getDirectedValue(componentData.getFloat("fltMaximumHitpoints"), componentData.getFloat("fltMaximumArmorHitpointsMod"), rewardQuality, false);
float efficiency = componentData.getFloat("fltEfficiency");
space_crafting.setComponentCurrentArmorHitpoints(component, armorHitpoints);
space_crafting.setComponentMaximumArmorHitpoints(component, armorHitpoints);
space_crafting.setComponentCurrentConduitHitpoints(component, hitpoints);
space_crafting.setComponentMaximumConduitHitpoints(component, hitpoints);
space_crafting.setComponentCurrentHitpoints(component, hitpoints);
space_crafting.setComponentMaximumHitpoints(component, hitpoints);
space_crafting.setComponentMass(component, mass);
space_crafting.setComponentEnergyMaintenance(component, energyMaintenance);
space_crafting.setComponentEnergyEfficiency(component, efficiency);
space_crafting.setComponentGeneralEfficiency(component, efficiency);
}
public float getDirectedValue(float baseValue, float statModifier, int rewardQuality, boolean lowerIsBetter) throws InterruptedException
{
float effectiveModifier = space_rare_loot.getEffectiveStatModifier(statModifier, rewardQuality);
return space_crafting.getDirectedBellValue(baseValue, effectiveModifier, space_crafting.getRandomBellDeviation(), lowerIsBetter);
}
public obj_id createEngineReward(obj_id player, String itemName, int rewardQuality, int rewardTier, float rewardQualityModifier) throws InterruptedException
{
return null;
obj_id engine = createComponentFromTable(player, itemName, ENGINE_TABLE, rewardQuality, rewardTier);
if (!isIdValid(engine))
{
return null;
}
dictionary engineData = dataTableGetRow(ENGINE_TABLE, itemName);
space_crafting.setEngineMaximumSpeed(engine, getDirectedValue(engineData.getFloat("fltMaxSpeed"), engineData.getFloat("fltMaxSpeedModifier"), rewardQuality, false));
space_crafting.setEngineMaximumPitch(engine, getDirectedValue(engineData.getFloat("fltMaxPitch"), engineData.getFloat("fltMaxPitchModifier"), rewardQuality, false));
space_crafting.setEngineMaximumRoll(engine, getDirectedValue(engineData.getFloat("fltMaxRoll"), engineData.getFloat("fltMaxRollModifier"), rewardQuality, false));
space_crafting.setEngineMaximumYaw(engine, getDirectedValue(engineData.getFloat("fltMaxYaw"), engineData.getFloat("fltMaxYawModifier"), rewardQuality, false));
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot engine created. Player=" + player + " engine=" + engine + " itemName=" + itemName + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality + " rewardQualityModifier=" + rewardQualityModifier);
return engine;
}
public obj_id createBoosterReward(obj_id player, String itemName, int rewardQuality, int rewardTier, float rewardQualityModifier) throws InterruptedException
{
return null;
obj_id booster = createComponentFromTable(player, itemName, BOOSTER_TABLE, rewardQuality, rewardTier);
if (!isIdValid(booster))
{
return null;
}
dictionary boosterData = dataTableGetRow(BOOSTER_TABLE, itemName);
float maxEnergy = getDirectedValue(boosterData.getFloat("fltMaximumEnergy"), boosterData.getFloat("fltMaximumEnergyModifier"), rewardQuality, false);
space_crafting.setBoosterMaximumEnergy(booster, maxEnergy);
space_crafting.setBoosterCurrentEnergy(booster, maxEnergy);
space_crafting.setBoosterEnergyRechargeRate(booster, getDirectedValue(boosterData.getFloat("fltRechargeRate"), boosterData.getFloat("fltRechargeRateModifier"), rewardQuality, false));
space_crafting.setBoosterEnergyConsumptionRate(booster, getDirectedValue(boosterData.getFloat("fltConsumptionRate"), boosterData.getFloat("fltConsumptionRateModifier"), rewardQuality, true));
space_crafting.setBoosterAcceleration(booster, getDirectedValue(boosterData.getFloat("fltAcceleration"), boosterData.getFloat("fltAccelerationModifier"), rewardQuality, false));
space_crafting.setBoosterMaximumSpeed(booster, getDirectedValue(boosterData.getFloat("fltMaxSpeed"), boosterData.getFloat("fltMaxSpeedModifier"), rewardQuality, false));
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot booster created. Player=" + player + " booster=" + booster + " itemName=" + itemName + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality + " rewardQualityModifier=" + rewardQualityModifier + " maxEnergy=" + maxEnergy);
return booster;
}
public obj_id createReactorReward(obj_id player, String itemName, int rewardQuality, int rewardTier, float rewardQualityModifier) throws InterruptedException
{
return null;
obj_id reactor = createComponentFromTable(player, itemName, REACTOR_TABLE, rewardQuality, rewardTier);
if (!isIdValid(reactor))
{
return null;
}
dictionary reactorData = dataTableGetRow(REACTOR_TABLE, itemName);
float energyGeneration = getDirectedValue(reactorData.getFloat("fltEnergyGeneration"), reactorData.getFloat("fltEnergyGenerationModifier"), rewardQuality, false);
space_crafting.setReactorEnergyGeneration(reactor, energyGeneration);
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot reactor created. Player=" + player + " reactor=" + reactor + " itemName=" + itemName + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality + " rewardQualityModifier=" + rewardQualityModifier + " energyGeneration=" + energyGeneration);
return reactor;
}
public obj_id createShieldReward(obj_id player, String itemName, int rewardQuality, int rewardTier, float rewardQualityModifier) throws InterruptedException
{
return null;
obj_id shield = createComponentFromTable(player, itemName, SHIELD_TABLE, rewardQuality, rewardTier);
if (!isIdValid(shield))
{
return null;
}
dictionary shieldData = dataTableGetRow(SHIELD_TABLE, itemName);
float frontHitpoints = getDirectedValue(shieldData.getFloat("fltShieldHitpointsMaximumFront"), shieldData.getFloat("fltShieldHitpointsMaximumFrontModifier"), rewardQuality, false);
float backHitpoints = getDirectedValue(shieldData.getFloat("fltShieldHitpointsMaximumBack"), shieldData.getFloat("fltShieldHitpointsMaximumBackModifier"), rewardQuality, false);
float rechargeRate = getDirectedValue(shieldData.getFloat("fltShieldRechargeRate"), shieldData.getFloat("fltShieldRechargeRateModifier"), rewardQuality, false);
space_crafting.setShieldGeneratorCurrentFrontHitpoints(shield, 0.0f);
space_crafting.setShieldGeneratorCurrentBackHitpoints(shield, 0.0f);
space_crafting.setShieldGeneratorMaximumFrontHitpoints(shield, frontHitpoints);
space_crafting.setShieldGeneratorMaximumBackHitpoints(shield, backHitpoints);
space_crafting.setShieldGeneratorRechargeRate(shield, rechargeRate);
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot shield created. Player=" + player + " shield=" + shield + " itemName=" + itemName + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality + " rewardQualityModifier=" + rewardQualityModifier + " frontHitpoints=" + frontHitpoints + " backHitpoints=" + backHitpoints + " rechargeRate=" + rechargeRate);
return shield;
}
public obj_id createCapacitorReward(obj_id player, String itemName, int rewardQuality, int rewardTier, float rewardQualityModifier) throws InterruptedException
{
return null;
obj_id capacitor = createComponentFromTable(player, itemName, CAPACITOR_TABLE, rewardQuality, rewardTier);
if (!isIdValid(capacitor))
{
return null;
}
dictionary capacitorData = dataTableGetRow(CAPACITOR_TABLE, itemName);
float maxEnergy = getDirectedValue(capacitorData.getFloat("fltMaxEnergy"), capacitorData.getFloat("fltMaxEnergyModifier"), rewardQuality, false);
float rechargeRate = getDirectedValue(capacitorData.getFloat("fltRechargeRate"), capacitorData.getFloat("fltRechargeRateModifier"), rewardQuality, false);
space_crafting.setWeaponCapacitorMaximumEnergy(capacitor, maxEnergy);
space_crafting.setWeaponCapacitorCurrentEnergy(capacitor, maxEnergy);
space_crafting.setWeaponCapacitorRechargeRate(capacitor, rechargeRate);
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot capacitor created. Player=" + player + " capacitor=" + capacitor + " itemName=" + itemName + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality + " rewardQualityModifier=" + rewardQualityModifier + " maxEnergy=" + maxEnergy + " rechargeRate=" + rechargeRate);
return capacitor;
}
public obj_id createArmorReward(obj_id player, String itemName, int rewardQuality, int rewardTier, float rewardQualityModifier) throws InterruptedException
{
return null;
obj_id armor = createComponentFromTable(player, itemName, ARMOR_TABLE, rewardQuality, rewardTier);
if (isIdValid(armor))
{
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot armor created. Player=" + player + " armor=" + armor + " itemName=" + itemName + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality + " rewardQualityModifier=" + rewardQualityModifier);
}
return armor;
}
public obj_id createDroidInterfaceReward(obj_id player, String itemName, int rewardQuality, int rewardTier, float rewardQualityModifier) throws InterruptedException
{
return null;
obj_id inventory = utils.getInventoryContainer(player);
if (!isIdValid(inventory) || getVolumeFree(inventory) <= 0)
{
return null;
}
obj_id droidInterface = create.object(itemName, inventory, false, false);
if (!isIdValid(droidInterface))
{
return null;
}
dictionary droidData = dataTableGetRow(DROID_INTERFACE_TABLE, itemName);
if (droidData == null)
{
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot droid interface creation failed, missing droid interface data. Player=" + player + " droidInterface=" + droidInterface + " itemName=" + itemName + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality);
destroyObject(droidInterface);
return null;
}
String rewardQualityName = space_rare_loot.getRewardQualityName(rewardQuality);
int overrideRow = getDroidInterfaceOverrideRow(itemName, rewardQualityName);
float commandSpeedModifier = getDroidInterfaceModifier(overrideRow, OVERRIDE_COLUMN_COMMAND_SPEED_MODIFIER, droidData.getFloat("fltCommandSpeedModifier"));
float hitpointsModifier = getDroidInterfaceModifier(overrideRow, OVERRIDE_COLUMN_HITPOINTS_MODIFIER, droidData.getFloat("fltMaximumArmorHitpointsMod"));
float armorHitpointsModifier = getDroidInterfaceModifier(overrideRow, OVERRIDE_COLUMN_ARMOR_HITPOINTS_MODIFIER, droidData.getFloat("fltMaximumArmorHitpointsMod"));
float energyMaintenanceModifier = getDroidInterfaceModifier(overrideRow, OVERRIDE_COLUMN_ENERGY_MAINTENANCE_MODIFIER, droidData.getFloat("fltEnergyMaintenanceModifier"));
float massModifier = getDroidInterfaceModifier(overrideRow, OVERRIDE_COLUMN_MASS_MODIFIER, droidData.getFloat("fltMassModifier"));
float hitpoints = getDirectedValue(droidData.getFloat("fltMaximumHitpoints"), hitpointsModifier, rewardQuality, false);
float armorHitpoints = getDirectedValue(droidData.getFloat("fltMaximumArmorHitpoints"), armorHitpointsModifier, rewardQuality, false);
float energyMaintenance = getDirectedValue(droidData.getFloat("fltEnergyMaintenance"), energyMaintenanceModifier, rewardQuality, true);
float mass = getDirectedValue(droidData.getFloat("fltMass"), massModifier, rewardQuality, true);
float commandSpeed = getDirectedValue(droidData.getFloat("fltCommandSpeed"), commandSpeedModifier, rewardQuality, true);
float efficiency = droidData.getFloat("fltEfficiency");
space_crafting.setComponentCurrentArmorHitpoints(droidInterface, armorHitpoints);
space_crafting.setComponentMaximumArmorHitpoints(droidInterface, armorHitpoints);
space_crafting.setComponentCurrentConduitHitpoints(droidInterface, hitpoints);
space_crafting.setComponentMaximumConduitHitpoints(droidInterface, hitpoints);
space_crafting.setComponentCurrentHitpoints(droidInterface, hitpoints);
space_crafting.setComponentMaximumHitpoints(droidInterface, hitpoints);
space_crafting.setComponentMass(droidInterface, mass);
space_crafting.setComponentEnergyMaintenance(droidInterface, energyMaintenance);
space_crafting.setComponentEnergyEfficiency(droidInterface, efficiency);
space_crafting.setComponentGeneralEfficiency(droidInterface, efficiency);
space_crafting.setDroidInterfaceCommandSpeed(droidInterface, commandSpeed);
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot droid interface created. Player=" + player + " droidInterface=" + droidInterface + " itemName=" + itemName + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality + " rewardQualityModifier=" + rewardQualityModifier + " overrideRow=" + overrideRow + " commandSpeed=" + commandSpeed + " hitpoints=" + hitpoints + " armorHitpoints=" + armorHitpoints + " energyMaintenance=" + energyMaintenance + " mass=" + mass);
return droidInterface;
}
public int getDroidInterfaceOverrideRow(String itemName, String rewardQuality) throws InterruptedException
{
int rowCount = dataTableGetNumRows(DROID_INTERFACE_OVERRIDE_TABLE);
for (int row = 0; row < rowCount; row++)
{
if (dataTableGetInt(DROID_INTERFACE_OVERRIDE_TABLE, row, space_rare_loot.REWARD_TABLE_COLUMN_ENABLED) == 0)
{
continue;
}
String overrideItemName = dataTableGetString(DROID_INTERFACE_OVERRIDE_TABLE, row, space_rare_loot.REWARD_TABLE_COLUMN_ITEM_NAME);
if (overrideItemName == null || !overrideItemName.equals(itemName))
{
continue;
}
String overrideQuality = dataTableGetString(DROID_INTERFACE_OVERRIDE_TABLE, row, space_rare_loot.REWARD_TABLE_COLUMN_QUALITY);
if (space_rare_loot.isRewardQualityMatch(overrideQuality, rewardQuality))
{
return row;
}
}
return -1;
}
public float getDroidInterfaceModifier(int overrideRow, String modifierColumn, float defaultModifier) throws InterruptedException
{
if (overrideRow < 0)
{
return defaultModifier;
}
return dataTableGetFloat(DROID_INTERFACE_OVERRIDE_TABLE, overrideRow, modifierColumn);
}
public obj_id createComponentFromTable(obj_id player, String itemName, String componentTable, int rewardQuality, int rewardTier) throws InterruptedException
{
obj_id inventory = utils.getInventoryContainer(player);
if (!isIdValid(inventory) || getVolumeFree(inventory) <= 0)
{
return null;
}
obj_id component = create.object(itemName, inventory, false, false);
if (!isIdValid(component))
{
return null;
}
dictionary componentData = dataTableGetRow(componentTable, itemName);
if (componentData == null)
{
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot component creation failed, missing component data. Player=" + player + " component=" + component + " itemName=" + itemName + " componentTable=" + componentTable + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality);
destroyObject(component);
return null;
}
applyStandardComponentStats(component, componentData, rewardQuality);
return component;
}
}
@@ -0,0 +1,230 @@
package script.space.rare_loot;
import script.library.utils;
import script.obj_id;
import java.util.StringTokenizer;
public class space_rare_loot_test extends script.base_script
{
public space_rare_loot_test()
{
}
public int cmdCreateSpaceRareLootCrate(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
{
if (!canUseRareLootTestCommand(self))
{
return SCRIPT_CONTINUE;
}
StringTokenizer st = getTokenizer(params);
if (st.countTokens() != 2)
{
sendCrateSyntax(self);
return SCRIPT_CONTINUE;
}
int rewardTier = parseTier(st.nextToken());
int rewardQuality = parseQuality(st.nextToken());
if (!isValidTier(rewardTier) || !isValidQuality(rewardQuality))
{
sendCrateSyntax(self);
return SCRIPT_CONTINUE;
}
obj_id inventory = utils.getInventoryContainer(self);
if (!isIdValid(inventory) || getVolumeFree(inventory) <= 0)
{
sendSystemMessageTestingOnly(self, "Space rare loot crate test failed: inventory is full or invalid.");
return SCRIPT_CONTINUE;
}
obj_id chest = space_rare_loot.createRareLootChest(inventory, rewardQuality, rewardTier);
if (!isIdValid(chest))
{
sendSystemMessageTestingOnly(self, "Space rare loot crate test failed: could not create crate.");
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot test crate creation failed. Player=" + self + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality);
return SCRIPT_CONTINUE;
}
sendSystemMessageTestingOnly(self, "Created space rare loot crate: tier " + rewardTier + ", quality " + space_rare_loot.getRewardQualityName(rewardQuality) + ".");
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot test crate created. Player=" + self + " chest=" + chest + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality);
return SCRIPT_CONTINUE;
}
public int cmdCreateSpaceRareLootItem(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
{
if (!canUseRareLootTestCommand(self))
{
return SCRIPT_CONTINUE;
}
StringTokenizer st = getTokenizer(params);
if (st.countTokens() != 3 && st.countTokens() != 4)
{
sendItemSyntax(self);
return SCRIPT_CONTINUE;
}
int rewardTier = parseTier(st.nextToken());
int rewardQuality = parseQuality(st.nextToken());
String itemType = st.nextToken();
String itemName = st.hasMoreTokens() ? st.nextToken() : null;
if (!isValidTier(rewardTier) || !isValidQuality(rewardQuality) || itemType == null || itemType.length() < 1)
{
sendItemSyntax(self);
return SCRIPT_CONTINUE;
}
if (itemName == null || itemName.length() < 1)
{
String rewardTable = space_rare_loot.getRewardTable(rewardTier);
String rewardQualityName = space_rare_loot.getRewardQualityName(rewardQuality);
int rewardRow = getRandomRewardRowForItemType(rewardTable, rewardQualityName, itemType);
if (rewardRow < 0)
{
sendSystemMessageTestingOnly(self, "Space rare loot item test failed: could not find enabled " + rewardQualityName + " " + itemType + " reward in tier " + rewardTier + " table.");
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot test item creation failed, no matching reward row. Player=" + self + " itemType=" + itemType + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality + " rewardTable=" + rewardTable);
return SCRIPT_CONTINUE;
}
itemName = dataTableGetString(rewardTable, rewardRow, space_rare_loot.REWARD_TABLE_COLUMN_ITEM_NAME);
itemType = dataTableGetString(rewardTable, rewardRow, space_rare_loot.REWARD_TABLE_COLUMN_ITEM_TYPE);
if (itemName == null || itemName.length() < 1 || itemType == null || itemType.length() < 1)
{
sendSystemMessageTestingOnly(self, "Space rare loot item test failed: selected reward row is missing item data.");
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot test item creation failed, selected reward row missing item data. Player=" + self + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality + " rewardTable=" + rewardTable + " rewardRow=" + rewardRow + " itemName=" + itemName + " itemType=" + itemType);
return SCRIPT_CONTINUE;
}
}
obj_id inventory = utils.getInventoryContainer(self);
if (!isIdValid(inventory) || getVolumeFree(inventory) <= 0)
{
sendSystemMessageTestingOnly(self, "Space rare loot item test failed: inventory is full or invalid.");
return SCRIPT_CONTINUE;
}
space_rare_loot_chest chestScript = new space_rare_loot_chest();
obj_id item = chestScript.createSpaceRareLootItem(self, itemName, itemType, rewardQuality, rewardTier, space_rare_loot.getRewardQualityModifier(rewardQuality));
if (!isIdValid(item))
{
sendSystemMessageTestingOnly(self, "Space rare loot item test failed: could not create " + itemName + " as " + itemType + ".");
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot test item creation failed. Player=" + self + " itemName=" + itemName + " itemType=" + itemType + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality);
return SCRIPT_CONTINUE;
}
sendSystemMessageTestingOnly(self, "Created space rare loot item: " + itemName + " (" + itemType + "), tier " + rewardTier + ", quality " + space_rare_loot.getRewardQualityName(rewardQuality) + ".");
CustomerServiceLog(space_rare_loot.LOG_CHANNEL, "Space rare loot test item created. Player=" + self + " item=" + item + " itemName=" + itemName + " itemType=" + itemType + " rewardTier=" + rewardTier + " rewardQuality=" + rewardQuality);
return SCRIPT_CONTINUE;
}
public int getRandomRewardRowForItemType(String rewardTable, String rewardQuality, String itemType) throws InterruptedException
{
int rowCount = dataTableGetNumRows(rewardTable);
int matchingRows = 0;
for (int i = 0; i < rowCount; i++)
{
if (isRewardRowMatchForItemType(rewardTable, i, rewardQuality, itemType))
{
matchingRows++;
}
}
if (matchingRows <= 0)
{
return -1;
}
int selectedMatch = rand(1, matchingRows);
int currentMatch = 0;
for (int i = 0; i < rowCount; i++)
{
if (isRewardRowMatchForItemType(rewardTable, i, rewardQuality, itemType))
{
currentMatch++;
if (currentMatch == selectedMatch)
{
return i;
}
}
}
return -1;
}
public boolean isRewardRowMatchForItemType(String rewardTable, int row, String rewardQuality, String itemType) throws InterruptedException
{
if (!space_rare_loot.isRewardRowMatch(rewardTable, row, rewardQuality))
{
return false;
}
String rowItemType = dataTableGetString(rewardTable, row, space_rare_loot.REWARD_TABLE_COLUMN_ITEM_TYPE);
return rowItemType != null && itemType != null && rowItemType.equalsIgnoreCase(itemType);
}
public boolean canUseRareLootTestCommand(obj_id self) throws InterruptedException
{
return isPlayer(self) && isGod(self) && getGodLevel(self) >= 40;
}
public StringTokenizer getTokenizer(String params)
{
if (params == null)
{
params = "";
}
return new StringTokenizer(params);
}
public int parseTier(String value) throws InterruptedException
{
int rewardTier = utils.stringToInt(value);
if (!isValidTier(rewardTier))
{
return -1;
}
return rewardTier;
}
public int parseQuality(String value) throws InterruptedException
{
if (value == null)
{
return -1;
}
if (value.equalsIgnoreCase("rare"))
{
return space_rare_loot_config.QUALITY_RARE;
}
if (value.equalsIgnoreCase("exceptional"))
{
return space_rare_loot_config.QUALITY_EXCEPTIONAL;
}
if (value.equalsIgnoreCase("legendary"))
{
return space_rare_loot_config.QUALITY_LEGENDARY;
}
int rewardQuality = utils.stringToInt(value);
if (isValidQuality(rewardQuality))
{
return rewardQuality;
}
return -1;
}
public boolean isValidTier(int rewardTier)
{
return rewardTier >= space_rare_loot.MIN_REWARD_TIER && rewardTier <= space_rare_loot.MAX_REWARD_TIER;
}
public boolean isValidQuality(int rewardQuality)
{
return rewardQuality >= space_rare_loot_config.QUALITY_RARE && rewardQuality <= space_rare_loot_config.QUALITY_LEGENDARY;
}
public void sendCrateSyntax(obj_id self) throws InterruptedException
{
sendSystemMessageTestingOnly(self, "format: /createSpaceRareLootCrate <tier 1-5> <rare|exceptional|legendary>");
}
public void sendItemSyntax(obj_id self) throws InterruptedException
{
sendSystemMessageTestingOnly(self, "format: /createSpaceRareLootItem <tier 1-5> <rare|exceptional|legendary> <itemType> [itemName]");
}
}
@@ -597,6 +597,8 @@ createPrototype immediate createPrototype 0 1 0
createSpawningElement immediate createSpawningElement admin 1 1 0 1 none 0 csr 0
createSpawningElementWithDifficulty immediate createSpawningElementWithDifficulty admin 1 1 0 1 none 0 csr 0
createStaticItem immediate cmdCreateStaticItem admin 1 1 0 1 0 0 0 0 gm.cmd optional 0 40 csr 0
createSpaceRareLootCrate immediate cmdCreateSpaceRareLootCrate admin 1 1 0 1 0 0 0 0 space.rare_loot.space_rare_loot_test optional 0 40 csr 0
createSpaceRareLootItem immediate cmdCreateSpaceRareLootItem admin 1 1 0 1 0 0 0 0 space.rare_loot.space_rare_loot_test optional 0 40 csr 0
credits immediate cmdMoney failAdmin admin 1 1 0 1 1 gm.cmd optional 0 0 40 csr 0
csAppendComment immediate csAppendComment 1 1 0 1 1 none 0 0 0
csCancelTicket immediate csCancelTicket 1 1 0 1 1 none 0 0 0
@@ -1209,6 +1211,8 @@ searchLair commandClicky normal searchLair failSpecialAttack 1 1 0 1 1 1 1 1
adminLair commandClicky normal adminLair failAdmin 1 admin 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 other none 1 3 0 other 0 ALL gathering 0 0.25 1 0
zoneUtil commandClicky normal cmdZoneUtility failAdmin 1 admin 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 other none 1 3 0 other 0 ALL gathering 0 0.25 1 0
objInfo commandClicky normal cmdObjectInfo failAdmin 1 admin 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 other none 1 3 0 other 0 ALL gathering 0 0.25 1 0
cmdCreateSpaceRareLootCrate commandClicky normal cmdCreateSpaceRareLootCrate failAdmin 1 admin 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 other none 1 3 0 other 0 ALL gathering 0 0.25 1 0
cmdCreateSpaceRareLootItem commandClicky normal cmdCreateSpaceRareLootItem failAdmin 1 admin 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 other none 1 3 0 other 0 ALL gathering 0 0.25 1 0
of_buff_def_4 commandClicky normal of_buff_def_4 failSpecialAttack 1 of_buff_def_4 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 other none 2 combat_ranged combat 1 ALL of_buff_def 0.25 7 1
of_buff_def_5 commandClicky normal of_buff_def_5 failSpecialAttack 1 of_buff_def_5 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 other none 2 combat_ranged combat 1 ALL of_buff_def 0.25 7 1
of_buff_def_6 commandClicky normal of_buff_def_6 failSpecialAttack 1 of_buff_def_6 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 other none 2 combat_ranged combat 1 ALL of_buff_def 0.25 7 1