Merge branch 'master' into test-3
# Conflicts: # .gitignore # eos/saveddata/character.py # service/network.py # service/price.py
This commit is contained in:
10
config.py
10
config.py
@@ -20,10 +20,10 @@ debug = False
|
||||
saveInRoot = False
|
||||
|
||||
# Version data
|
||||
version = "1.33.3"
|
||||
tag = "git"
|
||||
expansionName = "Lifeblood"
|
||||
expansionVersion = "1.7"
|
||||
version = "1.34.0"
|
||||
tag = "Stable"
|
||||
expansionName = " Arms Race"
|
||||
expansionVersion = "1.3"
|
||||
evemonMinVersion = "4081"
|
||||
|
||||
pyfaPath = None
|
||||
@@ -65,7 +65,7 @@ def getPyfaRoot():
|
||||
|
||||
|
||||
def getGitVersion():
|
||||
with open(os.path.join(pyfaPath, 'gitversion')) as f:
|
||||
with open(os.path.join(pyfaPath, '.version')) as f:
|
||||
version = f.readline()
|
||||
return version
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ added_files = [
|
||||
('../../eve.db', '.'),
|
||||
('../../README.md', '.'),
|
||||
('../../LICENSE', '.'),
|
||||
('../../gitversion', '.'),
|
||||
('../../.version', '.'),
|
||||
]
|
||||
|
||||
import_these = []
|
||||
|
||||
9
eos/db/migrations/upgrade27.py
Normal file
9
eos/db/migrations/upgrade27.py
Normal file
@@ -0,0 +1,9 @@
|
||||
"""
|
||||
Migration 27
|
||||
|
||||
- Resets all alpha clones to 1 (CCP consolidated all alpha's into one skillset)
|
||||
"""
|
||||
|
||||
|
||||
def upgrade(saveddata_engine):
|
||||
saveddata_engine.execute("UPDATE characters SET alphaCloneID = 1 WHERE alphaCloneID IS NOT NULL")
|
||||
@@ -6,4 +6,4 @@ type = "passive"
|
||||
|
||||
|
||||
def handler(fit, module, context):
|
||||
fit.ship.increaseItemAttr("warmScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
|
||||
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# boosterArmorHpPenalty
|
||||
#
|
||||
# Used by:
|
||||
# Implants from group: Booster (12 of 52)
|
||||
# Implants from group: Booster (12 of 54)
|
||||
type = "boosterSideEffect"
|
||||
|
||||
# User-friendly name for the side effect
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# boosterMaxVelocityPenalty
|
||||
#
|
||||
# Used by:
|
||||
# Implants from group: Booster (12 of 52)
|
||||
# Implants from group: Booster (12 of 54)
|
||||
type = "boosterSideEffect"
|
||||
|
||||
# User-friendly name for the side effect
|
||||
|
||||
@@ -9,7 +9,7 @@ type = "passive"
|
||||
|
||||
def handler(fit, container, context):
|
||||
level = container.level if "skill" in context else 1
|
||||
attrs = ("boosterTurretFalloffPenalty", "boosterTurretOptimalRange", "boosterTurretTrackingPenalty")
|
||||
attrs = ("boosterTurretFalloffPenalty", "boosterTurretOptimalRangePenalty", "boosterTurretTrackingPenalty")
|
||||
for attr in attrs:
|
||||
fit.boosters.filteredItemBoost(lambda booster: True, attr,
|
||||
container.getModifiedItemAttr("boosterAttributeModifier") * level)
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
# boosterShieldBoostAmountPenaltyShieldSkills
|
||||
#
|
||||
# Used by:
|
||||
# Implants named like: Crash Booster (3 of 4)
|
||||
# Implants named like: Frentix Booster (3 of 4)
|
||||
# Implants named like: Mindflood Booster (3 of 4)
|
||||
type = "boosterSideEffect"
|
||||
|
||||
# User-friendly name for the side effect
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# boosterShieldCapacityPenalty
|
||||
#
|
||||
# Used by:
|
||||
# Implants from group: Booster (12 of 52)
|
||||
# Implants from group: Booster (12 of 54)
|
||||
type = "boosterSideEffect"
|
||||
|
||||
# User-friendly name for the side effect
|
||||
|
||||
@@ -10,7 +10,7 @@ type = "boosterSideEffect"
|
||||
displayName = "Turret Optimal Range"
|
||||
|
||||
# Attribute that this effect targets
|
||||
attr = "boosterTurretOptimalRange"
|
||||
attr = "boosterTurretOptimalRangePenalty"
|
||||
|
||||
|
||||
def handler(fit, booster, context):
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
# Ships from group: Blockade Runner (4 of 4)
|
||||
# Ships from group: Covert Ops (7 of 7)
|
||||
# Ships from group: Expedition Frigate (2 of 2)
|
||||
# Ships from group: Force Recon Ship (7 of 8)
|
||||
# Ships from group: Stealth Bomber (4 of 5)
|
||||
# Ships from group: Force Recon Ship (8 of 8)
|
||||
# Ships from group: Stealth Bomber (5 of 5)
|
||||
# Ships named like: Stratios (2 of 2)
|
||||
# Subsystems named like: Defensive Covert Reconfiguration (4 of 4)
|
||||
# Ship: Astero
|
||||
|
||||
@@ -8,4 +8,4 @@ runTime = "early"
|
||||
|
||||
def handler(fit, ship, context):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Cloaking"),
|
||||
"cpu", ship.getModifiedItemAttr("eliteBonusCoverOps1"), skill="Covert Ops")
|
||||
"cpu", ship.getModifiedItemAttr("eliteBonusCovertOps1"), skill="Covert Ops")
|
||||
|
||||
@@ -5,7 +5,9 @@
|
||||
# Ship: Astero
|
||||
# Ship: Enforcer
|
||||
# Ship: Pacifier
|
||||
# Ship: Victor
|
||||
# Ship: Victorieux Luxury Yacht
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
runTime = "early"
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
# covertOpsStealthBomberSiegeMissileLauncherCPUNeedBonus
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, ship, context):
|
||||
fit.modules.filteredItemMultiply(lambda mod: mod.item.group.name == "Missile Launcher Torpedo",
|
||||
"cpu", ship.getModifiedItemAttr("stealthBomberLauncherCPU"))
|
||||
@@ -1,7 +1,7 @@
|
||||
# covertOpsStealthBomberSiegeMissileLauncerPowerNeedBonus
|
||||
# covertOpsStealthBomberSiegeMissileLauncherPowerNeedBonus
|
||||
#
|
||||
# Used by:
|
||||
# Ships from group: Stealth Bomber (4 of 5)
|
||||
# Ships from group: Stealth Bomber (5 of 5)
|
||||
type = "passive"
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# Used by:
|
||||
# Ships from group: Black Ops (5 of 5)
|
||||
# Ships from group: Stealth Bomber (4 of 5)
|
||||
# Ships from group: Stealth Bomber (5 of 5)
|
||||
# Ship: Caedes
|
||||
# Ship: Chremoas
|
||||
# Ship: Endurance
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# cynosuralDurationBonus
|
||||
#
|
||||
# Used by:
|
||||
# Ships from group: Force Recon Ship (6 of 8)
|
||||
# Ships from group: Force Recon Ship (7 of 8)
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# cynosuralTheoryConsumptionBonus
|
||||
#
|
||||
# Used by:
|
||||
# Ships from group: Force Recon Ship (6 of 8)
|
||||
# Ships from group: Force Recon Ship (7 of 8)
|
||||
# Skill: Cynosural Field Theory
|
||||
type = "passive"
|
||||
|
||||
|
||||
@@ -7,4 +7,4 @@ type = "passive"
|
||||
|
||||
def handler(fit, ship, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Bomb Deployment"),
|
||||
"emDamage", ship.getModifiedItemAttr("eliteBonusCoverOps1"), skill="Covert Ops")
|
||||
"emDamage", ship.getModifiedItemAttr("eliteBonusCovertOps1"), skill="Covert Ops")
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Hound
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, ship, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Bomb Deployment"),
|
||||
"explosiveDamage", ship.getModifiedItemAttr("eliteBonusCoverOps1"),
|
||||
"explosiveDamage", ship.getModifiedItemAttr("eliteBonusCovertOps1"),
|
||||
skill="Covert Ops")
|
||||
|
||||
@@ -7,5 +7,5 @@ type = "passive"
|
||||
|
||||
def handler(fit, ship, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Bomb Deployment"),
|
||||
"kineticDamage", ship.getModifiedItemAttr("eliteBonusCoverOps1"),
|
||||
"kineticDamage", ship.getModifiedItemAttr("eliteBonusCovertOps1"),
|
||||
skill="Covert Ops")
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Nemesis
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, ship, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Bomb Deployment"),
|
||||
"thermalDamage", ship.getModifiedItemAttr("eliteBonusCoverOps1"),
|
||||
"thermalDamage", ship.getModifiedItemAttr("eliteBonusCovertOps1"),
|
||||
skill="Covert Ops")
|
||||
|
||||
@@ -7,5 +7,5 @@ type = "passive"
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name in ("Energy Nosferatu", "Energy Neutralizer"),
|
||||
"falloffEffectiveness", src.getModifiedItemAttr("eliteBonusCoverOps1"),
|
||||
"falloffEffectiveness", src.getModifiedItemAttr("eliteBonusCovertOps1"),
|
||||
stackingPenalties=True, skill="Covert Ops")
|
||||
|
||||
@@ -7,5 +7,5 @@ type = "passive"
|
||||
|
||||
def handler(fit, ship, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.group.name == "Scanner Probe",
|
||||
"baseSensorStrength", ship.getModifiedItemAttr("eliteBonusCoverOps2"),
|
||||
"baseSensorStrength", ship.getModifiedItemAttr("eliteBonusCovertOps2"),
|
||||
skill="Covert Ops")
|
||||
|
||||
@@ -6,4 +6,4 @@ type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.ship.boostItemAttr("warpSpeedMultiplier", src.getModifiedItemAttr("eliteBonusCoverOps1"), skill="Covert Ops")
|
||||
fit.ship.boostItemAttr("warpSpeedMultiplier", src.getModifiedItemAttr("eliteBonusCovertOps1"), skill="Covert Ops")
|
||||
|
||||
10
eos/effects/elitebonuscovertopsshtdamage3.py
Normal file
10
eos/effects/elitebonuscovertopsshtdamage3.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# eliteBonusCovertOpsSHTDamage3
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Small Hybrid Turret"), "damageMultiplier",
|
||||
src.getModifiedItemAttr("eliteBonusCovertOps3"), skill="Covert Ops")
|
||||
10
eos/effects/elitecovertopsbonusarmorrepamount4.py
Normal file
10
eos/effects/elitecovertopsbonusarmorrepamount4.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# eliteCovertOpsBonusArmorRepAmount4
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"), "armorDamageAmount",
|
||||
src.getModifiedItemAttr("eliteBonusCovertOps4"), skill="Covert Ops")
|
||||
10
eos/effects/elitereconbonusarmorrepamount3.py
Normal file
10
eos/effects/elitereconbonusarmorrepamount3.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# eliteReconBonusArmorRepAmount3
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Victor
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"), "armorDamageAmount",
|
||||
src.getModifiedItemAttr("eliteBonusReconShip3"), skill="Recon Ships")
|
||||
10
eos/effects/elitereconbonusmhtdamage1.py
Normal file
10
eos/effects/elitereconbonusmhtdamage1.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# eliteReconBonusMHTDamage1
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Victor
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Hybrid Turret"), "damageMultiplier",
|
||||
src.getModifiedItemAttr("eliteBonusReconShip1"), skill="Recon Ships")
|
||||
@@ -4,6 +4,7 @@
|
||||
# Ship: Huginn
|
||||
# Ship: Moracha
|
||||
# Ship: Rapier
|
||||
# Ship: Victor
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
6
eos/effects/hackingvirusstrengthbonus.py
Normal file
6
eos/effects/hackingvirusstrengthbonus.py
Normal file
@@ -0,0 +1,6 @@
|
||||
# Not used by any item
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredItemIncrease(lambda mod: mod.item.requiresSkill("Hacking"), "virusStrength", src.getModifiedItemAttr("virusStrengthBonus"))
|
||||
@@ -1,7 +1,7 @@
|
||||
# missileSkillWarheadUpgradesEmDamageBonus
|
||||
#
|
||||
# Used by:
|
||||
# Implants named like: Agency Damage Booster (3 of 3)
|
||||
# Implants named like: Agency 'Pyrolancea' DB Dose (3 of 3)
|
||||
# Skill: Warhead Upgrades
|
||||
type = "passive"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# missileSkillWarheadUpgradesExplosiveDamageBonus
|
||||
#
|
||||
# Used by:
|
||||
# Implants named like: Agency Damage Booster (3 of 3)
|
||||
# Implants named like: Agency 'Pyrolancea' DB Dose (3 of 3)
|
||||
# Skill: Warhead Upgrades
|
||||
type = "passive"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# missileSkillWarheadUpgradesKineticDamageBonus
|
||||
#
|
||||
# Used by:
|
||||
# Implants named like: Agency Damage Booster (3 of 3)
|
||||
# Implants named like: Agency 'Pyrolancea' DB Dose (3 of 3)
|
||||
# Skill: Warhead Upgrades
|
||||
type = "passive"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# missileSkillWarheadUpgradesThermalDamageBonus
|
||||
#
|
||||
# Used by:
|
||||
# Implants named like: Agency Damage Booster (3 of 3)
|
||||
# Implants named like: Agency 'Pyrolancea' DB Dose (3 of 3)
|
||||
# Skill: Warhead Upgrades
|
||||
type = "passive"
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# Used by:
|
||||
# Modules from group: Rig Anchor (4 of 4)
|
||||
# Implants named like: Agency Speed Booster (3 of 3)
|
||||
# Implants named like: Agency 'Overclocker' SB Dose (3 of 3)
|
||||
# Implants named like: grade Snake (16 of 18)
|
||||
# Modules named like: Auxiliary Thrusters (8 of 8)
|
||||
# Implant: Quafe Zero
|
||||
|
||||
21
eos/effects/rolebonus2boosterpenaltyreduction.py
Normal file
21
eos/effects/rolebonus2boosterpenaltyreduction.py
Normal file
@@ -0,0 +1,21 @@
|
||||
# roleBonus2BoosterPenaltyReduction
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Victor
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterMissileAOECloudPenalty", src.getModifiedItemAttr("shipBonusRole2"))
|
||||
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterCapacitorCapacityPenalty", src.getModifiedItemAttr("shipBonusRole2"))
|
||||
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterAOEVelocityPenalty", src.getModifiedItemAttr("shipBonusRole2"))
|
||||
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterArmorRepairAmountPenalty", src.getModifiedItemAttr("shipBonusRole2"))
|
||||
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterMissileVelocityPenalty", src.getModifiedItemAttr("shipBonusRole2"))
|
||||
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterTurretTrackingPenalty", src.getModifiedItemAttr("shipBonusRole2"))
|
||||
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterShieldCapacityPenalty", src.getModifiedItemAttr("shipBonusRole2"))
|
||||
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterTurretOptimalRangePenalty", src.getModifiedItemAttr("shipBonusRole2"))
|
||||
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterShieldBoostAmountPenalty", src.getModifiedItemAttr("shipBonusRole2"))
|
||||
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterTurretFalloffPenalty", src.getModifiedItemAttr("shipBonusRole2"))
|
||||
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterArmorHPPenalty", src.getModifiedItemAttr("shipBonusRole2"))
|
||||
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterMaxVelocityPenalty", src.getModifiedItemAttr("shipBonusRole2"))
|
||||
10
eos/effects/rolebonusbomblauncherpwgcpu3.py
Normal file
10
eos/effects/rolebonusbomblauncherpwgcpu3.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# roleBonusBombLauncherPWGCPU3
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Bomb Deployment"), "power", src.getModifiedItemAttr("shipBonusRole3"))
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Bomb Deployment"), "cpu", src.getModifiedItemAttr("shipBonusRole3"))
|
||||
9
eos/effects/rolebonusmhtdamage1.py
Normal file
9
eos/effects/rolebonusmhtdamage1.py
Normal file
@@ -0,0 +1,9 @@
|
||||
# roleBonusMHTDamage1
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Victor
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Hybrid Turret"), "damageMultiplier", src.getModifiedItemAttr("shipBonusRole1"))
|
||||
9
eos/effects/rolebonustorprof1.py
Normal file
9
eos/effects/rolebonustorprof1.py
Normal file
@@ -0,0 +1,9 @@
|
||||
# roleBonusTorpRoF1
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Missile Launcher Torpedo", "speed", src.getModifiedItemAttr("shipBonusRole1"))
|
||||
@@ -1,7 +1,7 @@
|
||||
# shieldBoostAmplifierPassive
|
||||
#
|
||||
# Used by:
|
||||
# Implants named like: Agency Tank Booster (3 of 3)
|
||||
# Implants named like: Agency 'Hardshell' TB Dose (3 of 3)
|
||||
# Implants named like: grade Crystal (15 of 18)
|
||||
type = "passive"
|
||||
|
||||
|
||||
@@ -7,4 +7,4 @@ type = "passive"
|
||||
|
||||
def handler(fit, ship, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Torpedoes"),
|
||||
"emDamage", ship.getModifiedItemAttr("eliteBonusCoverOps2"), skill="Covert Ops")
|
||||
"emDamage", ship.getModifiedItemAttr("eliteBonusCovertOps2"), skill="Covert Ops")
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Hound
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, ship, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Torpedoes"),
|
||||
"explosiveDamage", ship.getModifiedItemAttr("eliteBonusCoverOps2"),
|
||||
"explosiveDamage", ship.getModifiedItemAttr("eliteBonusCovertOps2"),
|
||||
skill="Covert Ops")
|
||||
|
||||
@@ -7,5 +7,5 @@ type = "passive"
|
||||
|
||||
def handler(fit, ship, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Torpedoes"),
|
||||
"kineticDamage", ship.getModifiedItemAttr("eliteBonusCoverOps2"),
|
||||
"kineticDamage", ship.getModifiedItemAttr("eliteBonusCovertOps2"),
|
||||
skill="Covert Ops")
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Nemesis
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, ship, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Torpedoes"),
|
||||
"thermalDamage", ship.getModifiedItemAttr("eliteBonusCoverOps2"),
|
||||
"thermalDamage", ship.getModifiedItemAttr("eliteBonusCovertOps2"),
|
||||
skill="Covert Ops")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# shipBonusEmShieldResistanceCB2
|
||||
#
|
||||
# Used by:
|
||||
# Ships named like: Rattlesnake (2 of 2)
|
||||
# Ship: Rattlesnake
|
||||
# Ship: Rokh
|
||||
# Ship: Scorpion Navy Issue
|
||||
type = "passive"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# shipBonusExplosiveShieldResistanceCB2
|
||||
#
|
||||
# Used by:
|
||||
# Ships named like: Rattlesnake (2 of 2)
|
||||
# Ship: Rattlesnake
|
||||
# Ship: Rokh
|
||||
# Ship: Scorpion Navy Issue
|
||||
type = "passive"
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# shipBonusForceAuxiliaryC1RemoteBoostAndCapAmount
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Loggerhead
|
||||
# Ship: Minokawa
|
||||
type = "passive"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# shipBonusHeavyDroneArmorHpPirateFaction
|
||||
#
|
||||
# Used by:
|
||||
# Ships named like: Rattlesnake (2 of 2)
|
||||
# Ship: Rattlesnake
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# shipBonusHeavyDroneDamageMultiplierPirateFaction
|
||||
#
|
||||
# Used by:
|
||||
# Ships named like: Rattlesnake (2 of 2)
|
||||
# Ship: Rattlesnake
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# shipBonusHeavyDroneHPPirateFaction
|
||||
#
|
||||
# Used by:
|
||||
# Ships named like: Rattlesnake (2 of 2)
|
||||
# Ship: Rattlesnake
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# shipBonusHeavyDroneShieldHpPirateFaction
|
||||
#
|
||||
# Used by:
|
||||
# Ships named like: Rattlesnake (2 of 2)
|
||||
# Ship: Rattlesnake
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# shipBonusKineticMissileDamageGB2
|
||||
#
|
||||
# Used by:
|
||||
# Ships named like: Rattlesnake (2 of 2)
|
||||
# Ship: Rattlesnake
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# shipBonusKineticShieldResistanceCB2
|
||||
#
|
||||
# Used by:
|
||||
# Ships named like: Rattlesnake (2 of 2)
|
||||
# Ship: Rattlesnake
|
||||
# Ship: Rokh
|
||||
# Ship: Scorpion Navy Issue
|
||||
type = "passive"
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Hound
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Hound
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# shipBonusSentryDroneArmorHpPirateFaction
|
||||
#
|
||||
# Used by:
|
||||
# Ships named like: Rattlesnake (2 of 2)
|
||||
# Ship: Rattlesnake
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# shipBonusSentryDroneDamageMultiplierPirateFaction
|
||||
#
|
||||
# Used by:
|
||||
# Ships named like: Rattlesnake (2 of 2)
|
||||
# Ship: Rattlesnake
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# shipBonusSentryDroneHPPirateFaction
|
||||
#
|
||||
# Used by:
|
||||
# Ships named like: Rattlesnake (2 of 2)
|
||||
# Ship: Rattlesnake
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# shipBonusSentryDroneShieldHpPirateFaction
|
||||
#
|
||||
# Used by:
|
||||
# Ships named like: Rattlesnake (2 of 2)
|
||||
# Ship: Rattlesnake
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
10
eos/effects/shipbonusshtfalloffgf1.py
Normal file
10
eos/effects/shipbonusshtfalloffgf1.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# shipBonusSHTFalloffGF1
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Small Hybrid Turret"), "falloff",
|
||||
src.getModifiedItemAttr("shipBonusGF"), skill="Gallente Frigate")
|
||||
@@ -1,4 +1,4 @@
|
||||
# shipFalloffBonusGF
|
||||
# shipBonusSHTFalloffGF2
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Atron
|
||||
@@ -7,5 +7,5 @@ type = "passive"
|
||||
|
||||
def handler(fit, ship, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.group.name == "Survey Probe",
|
||||
"explosionDelay", ship.getModifiedItemAttr("eliteBonusCoverOps3"),
|
||||
"explosionDelay", ship.getModifiedItemAttr("eliteBonusCovertOps3"),
|
||||
skill="Covert Ops")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# shipBonusThermalMissileDamageGB2
|
||||
#
|
||||
# Used by:
|
||||
# Ships named like: Rattlesnake (2 of 2)
|
||||
# Ship: Rattlesnake
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# shipBonusThermicShieldResistanceCB2
|
||||
#
|
||||
# Used by:
|
||||
# Ships named like: Rattlesnake (2 of 2)
|
||||
# Ship: Rattlesnake
|
||||
# Ship: Rokh
|
||||
# Ship: Scorpion Navy Issue
|
||||
type = "passive"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# shipBonusTitanG2AllDamageBonus
|
||||
# shipBonusTitanG2EMExplosiveDamageBonus
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Komodo
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Nemesis
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# shipHTurretFalloffBonusGC
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Victor
|
||||
# Ship: Vigilant
|
||||
type = "passive"
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
# Used by:
|
||||
# Ship: Velator
|
||||
# Ship: Violator
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# shipStasisWebStrengthBonusMC2
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Victor
|
||||
# Ship: Vigilant
|
||||
type = "passive"
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Daredevil
|
||||
# Ship: Virtuoso
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# structuralAnalysisEffect
|
||||
#
|
||||
# Used by:
|
||||
# Implants named like: Agency Tank Booster (3 of 3)
|
||||
# Implants named like: Agency 'Hardshell' TB Dose (3 of 3)
|
||||
# Implants named like: Inherent Implants 'Noble' Repair Proficiency RP (6 of 6)
|
||||
# Modules named like: Auxiliary Nano Pump (8 of 8)
|
||||
# Implant: Imperial Navy Modified 'Noble' Implant
|
||||
|
||||
@@ -9,6 +9,9 @@ type = "projected", "active"
|
||||
def handler(fit, module, context):
|
||||
if "projected" not in context:
|
||||
return
|
||||
|
||||
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
|
||||
|
||||
# this is such a dirty hack
|
||||
for mod in fit.modules:
|
||||
if not mod.isEmpty and mod.item.requiresSkill("High Speed Maneuvering") and mod.state > State.ONLINE:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# surgicalStrikeDamageMultiplierBonusPostPercentDamageMultiplierLocationShipModulesRequiringGunnery
|
||||
#
|
||||
# Used by:
|
||||
# Implants named like: Agency Damage Booster (3 of 3)
|
||||
# Implants named like: Agency 'Pyrolancea' DB Dose (3 of 3)
|
||||
# Implants named like: Eifyr and Co. 'Gunslinger' Surgical Strike SS (6 of 6)
|
||||
# Implant: Standard Cerebral Accelerator
|
||||
type = "passive"
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
#
|
||||
# Used by:
|
||||
# Modules from group: Warp Disrupt Field Generator (7 of 7)
|
||||
type = "active"
|
||||
from eos.saveddata.module import State
|
||||
|
||||
type = "projected", "active"
|
||||
runTime = "early"
|
||||
|
||||
|
||||
@@ -14,3 +16,11 @@ def handler(fit, module, context):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Propulsion Module",
|
||||
"speedFactor", module.getModifiedItemAttr("speedFactorBonus"))
|
||||
fit.ship.forceItemAttr("disallowAssistance", 1)
|
||||
|
||||
if "projected" in context:
|
||||
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
|
||||
|
||||
if module.charge is not None and module.charge.ID == 45010:
|
||||
for mod in fit.modules:
|
||||
if not mod.isEmpty and mod.item.requiresSkill("High Speed Maneuvering") and mod.state > State.ONLINE:
|
||||
mod.state = State.ONLINE
|
||||
|
||||
@@ -6,4 +6,5 @@ type = "projected", "active"
|
||||
|
||||
|
||||
def handler(fit, module, context):
|
||||
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
|
||||
if "projected" in context:
|
||||
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
#
|
||||
# Used by:
|
||||
# Modules named like: Warp Scrambler (26 of 26)
|
||||
|
||||
from eos.saveddata.module import State
|
||||
|
||||
runTime = "early"
|
||||
@@ -12,6 +11,9 @@ type = "projected", "active"
|
||||
def handler(fit, module, context):
|
||||
if "projected" not in context:
|
||||
return
|
||||
|
||||
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
|
||||
|
||||
# this is such a dirty hack
|
||||
for mod in fit.modules:
|
||||
if not mod.isEmpty and mod.item.requiresSkill("High Speed Maneuvering") and mod.state > State.ONLINE:
|
||||
|
||||
@@ -158,9 +158,7 @@ class Character(object):
|
||||
name += " *"
|
||||
|
||||
if self.alphaCloneID:
|
||||
clone = eos.db.getAlphaClone(self.alphaCloneID)
|
||||
type = clone.alphaCloneName.split()[1]
|
||||
name += ' (\u03B1{})'.format(type[0].upper())
|
||||
name += ' (\u03B1)'
|
||||
|
||||
return name
|
||||
|
||||
|
||||
@@ -89,6 +89,10 @@ class PFGeneralPref(PreferenceView):
|
||||
self.stDefaultSystem = wx.StaticText(panel, wx.ID_ANY, "Default Market Prices:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stDefaultSystem.Wrap(-1)
|
||||
priceSizer.Add(self.stDefaultSystem, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
self.stDefaultSystem.SetCursor(helpCursor)
|
||||
self.stDefaultSystem.SetToolTip(
|
||||
wx.ToolTip('The source you choose will be tried first, but subsequent sources will be used if the preferred '
|
||||
'source fails. The system you choose is absolute and requests will not be made against other systems.'))
|
||||
|
||||
self.chPriceSource = wx.Choice(panel, choices=sorted(Price.sources.keys()))
|
||||
self.chPriceSystem = wx.Choice(panel, choices=list(Price.systemsList.keys()))
|
||||
|
||||
@@ -193,7 +193,12 @@ class TargetingMiscViewFull(StatsView):
|
||||
elif labelName == "labelFullSigRadius":
|
||||
label.SetToolTip(wx.ToolTip("Probe Size: %.3f" % (fit.probeSize or 0)))
|
||||
elif labelName == "labelFullWarpSpeed":
|
||||
label.SetToolTip(wx.ToolTip("Max Warp Distance: %.1f AU" % fit.maxWarpDistance))
|
||||
maxWarpDistance = "Max Warp Distance: %.1f AU" % fit.maxWarpDistance
|
||||
if fit.ship.getModifiedItemAttr("warpScrambleStatus"):
|
||||
warpScrambleStatus = "Warp Core Strength: %.1f" % (fit.ship.getModifiedItemAttr("warpScrambleStatus") * -1)
|
||||
else:
|
||||
warpScrambleStatus = "Warp Core Strength: %.1f" % 0
|
||||
label.SetToolTip(wx.ToolTip("%s\n%s" % (maxWarpDistance, warpScrambleStatus)))
|
||||
elif labelName == "labelSensorStr":
|
||||
if fit.jamChance > 0:
|
||||
label.SetToolTip(
|
||||
@@ -218,9 +223,12 @@ class TargetingMiscViewFull(StatsView):
|
||||
self._cachedValues[counter] = newValues
|
||||
elif labelName == "labelFullWarpSpeed":
|
||||
if fit:
|
||||
label.SetToolTip(wx.ToolTip("Max Warp Distance: %.1f AU" % fit.maxWarpDistance))
|
||||
else:
|
||||
label.SetToolTip(wx.ToolTip(""))
|
||||
maxWarpDistance = "Max Warp Distance: %.1f AU" % fit.maxWarpDistance
|
||||
if fit.ship.getModifiedItemAttr("warpScrambleStatus"):
|
||||
warpScrambleStatus = "Warp Core Strength: %.1f" % (fit.ship.getModifiedItemAttr("warpScrambleStatus") * -1)
|
||||
else:
|
||||
warpScrambleStatus = "Warp Core Strength: %.1f" % 0
|
||||
label.SetToolTip(wx.ToolTip("%s\n%s" % (maxWarpDistance, warpScrambleStatus)))
|
||||
elif labelName == "labelSensorStr":
|
||||
if fit:
|
||||
if fit.jamChance > 0:
|
||||
|
||||
@@ -188,7 +188,12 @@ class TargetingMiscViewMinimal(StatsView):
|
||||
lockTime += "%5s\t%s\n" % (left, right)
|
||||
label.SetToolTip(wx.ToolTip(lockTime))
|
||||
elif labelName == "labelFullWarpSpeed":
|
||||
label.SetToolTip(wx.ToolTip("Max Warp Distance: %.1f AU" % fit.maxWarpDistance))
|
||||
maxWarpDistance = "Max Warp Distance: %.1f AU" % fit.maxWarpDistance
|
||||
if fit.ship.getModifiedItemAttr("warpScrambleStatus"):
|
||||
warpScrambleStatus = "Warp Core Strength: %.1f" % (fit.ship.getModifiedItemAttr("warpScrambleStatus") * -1)
|
||||
else:
|
||||
warpScrambleStatus = "Warp Core Strength: %.1f" % 0
|
||||
label.SetToolTip(wx.ToolTip("%s\n%s" % (maxWarpDistance, warpScrambleStatus)))
|
||||
elif labelName == "labelSensorStr":
|
||||
if fit.jamChance > 0:
|
||||
label.SetToolTip(wx.ToolTip("Type: %s\n%.1f%% Chance of Jam" % (fit.scanType, fit.jamChance)))
|
||||
@@ -212,7 +217,12 @@ class TargetingMiscViewMinimal(StatsView):
|
||||
self._cachedValues[counter] = newValues
|
||||
elif labelName == "labelFullWarpSpeed":
|
||||
if fit:
|
||||
label.SetToolTip(wx.ToolTip("Max Warp Distance: %.1f AU" % fit.maxWarpDistance))
|
||||
maxWarpDistance = "Max Warp Distance: %.1f AU" % fit.maxWarpDistance
|
||||
if fit.ship.getModifiedItemAttr("warpScrambleStatus"):
|
||||
warpScrambleStatus = "Warp Core Strength: %.1f" % (fit.ship.getModifiedItemAttr("warpScrambleStatus") * -1)
|
||||
else:
|
||||
warpScrambleStatus = "Warp Core Strength: %.1f" % 0
|
||||
label.SetToolTip(wx.ToolTip("%s\n%s" % (maxWarpDistance, warpScrambleStatus)))
|
||||
else:
|
||||
label.SetToolTip(wx.ToolTip(""))
|
||||
elif labelName == "labelSensorStr":
|
||||
|
||||
@@ -405,10 +405,11 @@ if options.effects:
|
||||
else:
|
||||
effect_list = []
|
||||
for effect_file in os.listdir(effects_path):
|
||||
file_name, file_extension = effect_file.rsplit('.', 1)
|
||||
# Ignore non-py files and exclude implementation-specific 'effects'
|
||||
if file_extension == "py" and not file_name in ("__init__"):
|
||||
effect_list.append(file_name)
|
||||
if not effect_file.startswith('__'):
|
||||
file_name, file_extension = effect_file.rsplit('.', 1)
|
||||
# Ignore non-py files and exclude implementation-specific 'effects'
|
||||
if file_extension == "py" and not file_name in ("__init__"):
|
||||
effect_list.append(file_name)
|
||||
|
||||
# Stage 2
|
||||
|
||||
|
||||
@@ -113,13 +113,30 @@ def main(db, json_path):
|
||||
def convertClones(data):
|
||||
newData = []
|
||||
|
||||
# December, 2017 - CCP decided to use only one set of skill levels for alpha clones. However, this is still
|
||||
# represented in the data as a skillset per race. To ensure that all skills are the same, we store them in a way
|
||||
# that we can check to make sure all races have the same skills, as well as skill levels
|
||||
|
||||
check = {}
|
||||
|
||||
for ID in data:
|
||||
for skill in data[ID]["skills"]:
|
||||
newData.append({
|
||||
"alphaCloneID": int(ID),
|
||||
"alphaCloneName": data[ID]["internalDescription"],
|
||||
"alphaCloneName": "Alpha Clone",
|
||||
"typeID": skill["typeID"],
|
||||
"level": skill["level"]})
|
||||
if ID not in check:
|
||||
check[ID] = {}
|
||||
check[ID][int(skill["typeID"])] = int(skill["level"])
|
||||
|
||||
if not reduce(lambda a, b: a if a == b else False, [v for _, v in check.iteritems()]):
|
||||
raise Exception("Alpha Clones not all equal")
|
||||
|
||||
newData = [x for x in newData if x['alphaCloneID'] == 1]
|
||||
|
||||
if len(newData) == 0:
|
||||
raise Exception("Alpha Clone processing failed")
|
||||
|
||||
return newData
|
||||
|
||||
|
||||
@@ -223,8 +223,6 @@ class Market(object):
|
||||
"Guristas Shuttle" : False,
|
||||
"Mobile Decoy Unit" : False, # Seems to be left over test mod for deployables
|
||||
"Tournament Micro Jump Unit" : False, # Normally seen only on tournament arenas
|
||||
"Victor": False, # See GH Issue 1323
|
||||
"Virtuoso": False, # See GH Issue 1323
|
||||
}
|
||||
|
||||
# do not publish ships that we convert
|
||||
|
||||
@@ -40,48 +40,30 @@ class EveCentral(object):
|
||||
for typeID in types: # Add all typeID arguments
|
||||
data.append(("typeid", typeID))
|
||||
|
||||
# Attempt to send request and process it
|
||||
try:
|
||||
network = Network.getInstance()
|
||||
data = network.request(baseurl, network.PRICES, data)
|
||||
xml = minidom.parse(data)
|
||||
types = xml.getElementsByTagName("marketstat").item(0).getElementsByTagName("type")
|
||||
# Cycle through all types we've got from request
|
||||
for type_ in types:
|
||||
# Get data out of each typeID details tree
|
||||
typeID = int(type_.getAttribute("id"))
|
||||
sell = type_.getElementsByTagName("sell").item(0)
|
||||
# If price data wasn't there, set price to zero
|
||||
try:
|
||||
percprice = float(sell.getElementsByTagName("percentile").item(0).firstChild.data)
|
||||
except (TypeError, ValueError):
|
||||
pyfalog.warning("Failed to get price for: {0}", type_)
|
||||
percprice = 0
|
||||
network = Network.getInstance()
|
||||
data = network.request(baseurl, network.PRICES, data)
|
||||
xml = minidom.parse(data)
|
||||
types = xml.getElementsByTagName("marketstat").item(0).getElementsByTagName("type")
|
||||
# Cycle through all types we've got from request
|
||||
for type_ in types:
|
||||
# Get data out of each typeID details tree
|
||||
typeID = int(type_.getAttribute("id"))
|
||||
sell = type_.getElementsByTagName("sell").item(0)
|
||||
# If price data wasn't there, set price to zero
|
||||
try:
|
||||
percprice = float(sell.getElementsByTagName("percentile").item(0).firstChild.data)
|
||||
except (TypeError, ValueError):
|
||||
pyfalog.warning("Failed to get price for: {0}", type_)
|
||||
percprice = 0
|
||||
|
||||
# Fill price data
|
||||
priceobj = priceMap[typeID]
|
||||
priceobj.price = percprice
|
||||
priceobj.time = time.time() + VALIDITY
|
||||
priceobj.failed = None
|
||||
# Fill price data
|
||||
priceobj = priceMap[typeID]
|
||||
priceobj.price = percprice
|
||||
priceobj.time = time.time() + VALIDITY
|
||||
priceobj.failed = None
|
||||
|
||||
# delete price from working dict
|
||||
del priceMap[typeID]
|
||||
|
||||
# If getting or processing data returned any errors
|
||||
except TimeoutError:
|
||||
# Timeout error deserves special treatment
|
||||
pyfalog.warning("Price fetch timout")
|
||||
for typeID in priceMap.keys():
|
||||
priceobj = priceMap[typeID]
|
||||
priceobj.time = time.time() + TIMEOUT
|
||||
priceobj.failed = True
|
||||
|
||||
del priceMap[typeID]
|
||||
except:
|
||||
# all other errors will pass and continue onward to the REREQUEST delay
|
||||
pyfalog.warning("Caught exception in fetchPrices")
|
||||
pass
|
||||
pass
|
||||
# delete price from working dict
|
||||
del priceMap[typeID]
|
||||
|
||||
|
||||
Price.register(EveCentral)
|
||||
|
||||
@@ -38,48 +38,36 @@ class EveMarketData(object):
|
||||
data.append(("system_id", system)) # Use Jita for market
|
||||
data.append(("type_ids", ','.join(str(x) for x in types)))
|
||||
|
||||
# Attempt to send request and process it
|
||||
try:
|
||||
network = Network.getInstance()
|
||||
data = network.request(baseurl, network.PRICES, data)
|
||||
xml = minidom.parse(data)
|
||||
print (xml.getElementsByTagName("eve").item(0))
|
||||
types = xml.getElementsByTagName("eve").item(0).getElementsByTagName("price")
|
||||
# Cycle through all types we've got from request
|
||||
for type_ in types:
|
||||
# Get data out of each typeID details tree
|
||||
typeID = int(type_.getAttribute("id"))
|
||||
price = 0
|
||||
network = Network.getInstance()
|
||||
data = network.request(baseurl, network.PRICES, data)
|
||||
xml = minidom.parse(data)
|
||||
types = xml.getElementsByTagName("eve").item(0).getElementsByTagName("price")
|
||||
|
||||
try:
|
||||
price = float(type_.firstChild.data)
|
||||
except (TypeError, ValueError):
|
||||
pyfalog.warning("Failed to get price for: {0}", type_)
|
||||
# Cycle through all types we've got from request
|
||||
for type_ in types:
|
||||
# Get data out of each typeID details tree
|
||||
typeID = int(type_.getAttribute("id"))
|
||||
|
||||
# Fill price data
|
||||
priceobj = priceMap[typeID]
|
||||
try:
|
||||
price = float(type_.firstChild.data)
|
||||
except (TypeError, ValueError):
|
||||
pyfalog.warning("Failed to get price for: {0}", type_)
|
||||
|
||||
# Fill price data
|
||||
priceobj = priceMap[typeID]
|
||||
|
||||
# eve-marketdata returns 0 if price data doesn't even exist for the item. In this case, don't reset the
|
||||
# cached price, and set the price timeout to TIMEOUT (every 15 minutes currently). Se GH issue #1334
|
||||
if price != 0:
|
||||
priceobj.price = price
|
||||
priceobj.time = time.time() + VALIDITY
|
||||
priceobj.failed = None
|
||||
|
||||
# delete price from working dict
|
||||
del priceMap[typeID]
|
||||
|
||||
# If getting or processing data returned any errors
|
||||
except TimeoutError:
|
||||
# Timeout error deserves special treatment
|
||||
pyfalog.warning("Price fetch timout")
|
||||
for typeID in priceMap.keys():
|
||||
priceobj = priceMap[typeID]
|
||||
else:
|
||||
priceobj.time = time.time() + TIMEOUT
|
||||
priceobj.failed = True
|
||||
|
||||
del priceMap[typeID]
|
||||
except:
|
||||
# all other errors will pass and continue onward to the REREQUEST delay
|
||||
pyfalog.warning("Caught exception in fetchPrices")
|
||||
pass
|
||||
pass
|
||||
priceobj.failed = None
|
||||
|
||||
# delete price from working dict
|
||||
del priceMap[typeID]
|
||||
|
||||
|
||||
Price.register(EveMarketData)
|
||||
|
||||
@@ -126,6 +126,7 @@ class Network(object):
|
||||
raise AuthenticationError()
|
||||
elif error.code >= 500:
|
||||
raise ServerError()
|
||||
raise Error(error)
|
||||
except urllib.error.URLError as error:
|
||||
pyfalog.warning("Timed out or other URL error:")
|
||||
pyfalog.warning(error)
|
||||
|
||||
@@ -105,11 +105,34 @@ class Price(object):
|
||||
return
|
||||
|
||||
# attempt to find user's selected price source, otherwise get first one
|
||||
sourceCls = cls.sources.get(sFit.serviceFittingOptions["priceSource"], cls.sources[list(cls.sources.keys())[0]])
|
||||
sourceCls(toRequest, cls.systemsList[sFit.serviceFittingOptions["priceSystem"]], priceMap)
|
||||
sourcesToTry = list(cls.sources.keys())
|
||||
curr = sFit.serviceFittingOptions["priceSource"] if sFit.serviceFittingOptions["priceSource"] in sourcesToTry else sourcesToTry[0]
|
||||
|
||||
# if we get to this point, then we've got an error. Set to REREQUEST delay
|
||||
for typeID in list(priceMap.keys()):
|
||||
while len(sourcesToTry) > 0:
|
||||
sourcesToTry.remove(curr)
|
||||
try:
|
||||
sourceCls = cls.sources.get(curr)
|
||||
sourceCls(toRequest, cls.systemsList[sFit.serviceFittingOptions["priceSystem"]], priceMap)
|
||||
break
|
||||
# If getting or processing data returned any errors
|
||||
except TimeoutError:
|
||||
# Timeout error deserves special treatment
|
||||
pyfalog.warning("Price fetch timout")
|
||||
for typeID in priceMap.keys():
|
||||
priceobj = priceMap[typeID]
|
||||
priceobj.time = time.time() + TIMEOUT
|
||||
priceobj.failed = True
|
||||
|
||||
del priceMap[typeID]
|
||||
except Exception as ex:
|
||||
# something happened, try another source
|
||||
pyfalog.warn('Failed to fetch prices from price source {}: {}'.format(curr, ex, sourcesToTry[0]))
|
||||
if len(sourcesToTry) > 0:
|
||||
pyfalog.warn('Trying {}'.format(sourcesToTry[0]))
|
||||
curr = sourcesToTry[0]
|
||||
|
||||
# if we get to this point, then we've got an error in all of our sources. Set to REREQUEST delay
|
||||
for typeID in priceMap.keys():
|
||||
priceobj = priceMap[typeID]
|
||||
priceobj.time = time.time() + REREQUEST
|
||||
priceobj.failed = True
|
||||
|
||||
Reference in New Issue
Block a user