Compare commits
104 Commits
v2.22.0
...
v2.28.2dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c1302ce7ee | ||
|
|
e4ea9c2ab9 | ||
|
|
9760d2c4a5 | ||
|
|
4efa9a6961 | ||
|
|
b27d4bcbbd | ||
|
|
7bff295012 | ||
|
|
01249dfd9c | ||
|
|
0cc2668c1c | ||
|
|
dfad734a0a | ||
|
|
66c901a2b0 | ||
|
|
3673e7f39e | ||
|
|
124b35d108 | ||
|
|
5181e8e95a | ||
|
|
48cc4ce9d4 | ||
|
|
07ff43b576 | ||
|
|
70969cc9fb | ||
|
|
d23bf2fa4c | ||
|
|
04c8659922 | ||
|
|
5e3b92699b | ||
|
|
1755ab4c3f | ||
|
|
26ec741094 | ||
|
|
530f7510d5 | ||
|
|
37ab704cd7 | ||
|
|
683ad3802f | ||
|
|
c882351886 | ||
|
|
9d71215c52 | ||
|
|
d2a0605abe | ||
|
|
bee6652cc6 | ||
|
|
047ef75960 | ||
|
|
32e57f8138 | ||
|
|
e891804b64 | ||
|
|
7d42b89726 | ||
|
|
6561996327 | ||
|
|
0d2ad6eac2 | ||
|
|
3b2bfd01c5 | ||
|
|
a317dab9a8 | ||
|
|
db6d8b93e9 | ||
|
|
7d585c1a62 | ||
|
|
c45e84470e | ||
|
|
ab3b40e136 | ||
|
|
b566a8bfa6 | ||
|
|
ccb395d592 | ||
|
|
3d039724c9 | ||
|
|
d0e7e7eed5 | ||
|
|
a387bc8d09 | ||
|
|
94344bd432 | ||
|
|
a976fb33f0 | ||
|
|
f850fdf0d5 | ||
|
|
0fcbedba45 | ||
|
|
5707bddacd | ||
|
|
8ed9257dfa | ||
|
|
056ae590cf | ||
|
|
7733fd38c2 | ||
|
|
fef78c971f | ||
|
|
e52ceacdb9 | ||
|
|
85b2d7af8d | ||
|
|
3e658a31bb | ||
|
|
0d2a4d4d44 | ||
|
|
bc2cdcdea7 | ||
|
|
30ad554cc0 | ||
|
|
4a85fd5d1b | ||
|
|
4d8dbe74bd | ||
|
|
016f2b44ff | ||
|
|
676794baed | ||
|
|
ca488089fd | ||
|
|
96f9b9a719 | ||
|
|
508572e08b | ||
|
|
f91e0b2e23 | ||
|
|
93ae9e0891 | ||
|
|
2ed5dbc3c7 | ||
|
|
bca8ba3114 | ||
|
|
174ac97682 | ||
|
|
2d9e873d42 | ||
|
|
33377357f6 | ||
|
|
3ee0ee7e40 | ||
|
|
2f02747b29 | ||
|
|
78b176a135 | ||
|
|
52063beea9 | ||
|
|
03a55d94e9 | ||
|
|
db256f57d1 | ||
|
|
8de6d78be0 | ||
|
|
902a00d37d | ||
|
|
523cb1467e | ||
|
|
f75de70d79 | ||
|
|
4b635f4d21 | ||
|
|
63632e09b3 | ||
|
|
df78eb5781 | ||
|
|
c1a5828d6b | ||
|
|
5377210b89 | ||
|
|
1936255f2c | ||
|
|
b3e5763cfc | ||
|
|
7442f315c9 | ||
|
|
433c9555bf | ||
|
|
d1345fc71e | ||
|
|
31cae0e54b | ||
|
|
b2cc3ae600 | ||
|
|
62d1d6a06d | ||
|
|
83fa567321 | ||
|
|
9b315b5870 | ||
|
|
3094fd32fc | ||
|
|
c3f1824a84 | ||
|
|
b558ae3810 | ||
|
|
c38f05902a | ||
|
|
181e1e1e30 |
@@ -33,7 +33,7 @@ DB_PATH = os.path.join(ROOT_DIR, 'eve.db')
|
||||
JSON_DIR = os.path.join(ROOT_DIR, 'staticdata')
|
||||
if ROOT_DIR not in sys.path:
|
||||
sys.path.insert(0, ROOT_DIR)
|
||||
GAMEDATA_SCHEMA_VERSION = 3
|
||||
GAMEDATA_SCHEMA_VERSION = 4
|
||||
|
||||
|
||||
def db_needs_update():
|
||||
@@ -122,7 +122,8 @@ def update_db():
|
||||
if (
|
||||
# Apparently people really want Civilian modules available
|
||||
(row['typeName'].startswith('Civilian') and "Shuttle" not in row['typeName']) or
|
||||
row['typeName'] == 'Capsule'
|
||||
row['typeName'] == 'Capsule' or
|
||||
row['groupID'] == 4033 # destructible effect beacons
|
||||
):
|
||||
row['published'] = True
|
||||
# Nearly useless and clutter search results too much
|
||||
@@ -142,8 +143,7 @@ def update_db():
|
||||
1882,
|
||||
1975,
|
||||
1971,
|
||||
# the "container" for the abyssal environments
|
||||
1983)
|
||||
1983) # the "container" for the abyssal environments
|
||||
):
|
||||
newData.append(row)
|
||||
|
||||
|
||||
18
eos/db/migrations/upgrade40.py
Normal file
18
eos/db/migrations/upgrade40.py
Normal file
@@ -0,0 +1,18 @@
|
||||
"""
|
||||
Migration 40
|
||||
|
||||
Imports all item conversions since Migration 28 and runs them against module.baseItemID. This column seems to have been
|
||||
forgotten about since it's been added.
|
||||
|
||||
"""
|
||||
from .upgrade36 import CONVERSIONS as u36
|
||||
from .upgrade37 import CONVERSIONS as u37
|
||||
from .upgrade38 import CONVERSIONS as u38
|
||||
from .upgrade39 import CONVERSIONS as u39
|
||||
|
||||
def upgrade(saveddata_engine):
|
||||
for conversions in [u36, u37, u38, u39]:
|
||||
for replacement_item, list in conversions.items():
|
||||
for retired_item in list:
|
||||
saveddata_engine.execute('UPDATE "modules" SET "baseItemID" = ? WHERE "baseItemID" = ?',
|
||||
(replacement_item, retired_item))
|
||||
50
eos/db/migrations/upgrade41.py
Normal file
50
eos/db/migrations/upgrade41.py
Normal file
@@ -0,0 +1,50 @@
|
||||
"""
|
||||
Migration 41
|
||||
|
||||
- Resistance plating tiericide
|
||||
"""
|
||||
|
||||
CONVERSIONS = {
|
||||
16345: ( # Upgraded Layered Coating I
|
||||
16347, # Limited Layered Plating I
|
||||
16349, # 'Scarab' Layered Plating I
|
||||
16351, # 'Grail' Layered Plating I
|
||||
),
|
||||
16305: ( # Upgraded Multispectrum Coating I
|
||||
16307, # Limited Adaptive Nano Plating I
|
||||
16309, # 'Collateral' Adaptive Nano Plating I
|
||||
16311, # 'Refuge' Adaptive Nano Plating I
|
||||
),
|
||||
16329: ( # Upgraded EM Coating I
|
||||
16331, # Limited EM Plating I
|
||||
16333, # 'Contour' EM Plating I
|
||||
16335, # 'Spiegel' EM Plating I
|
||||
),
|
||||
16321: ( # Upgraded Explosive Coating I
|
||||
16323, # Limited Explosive Plating I
|
||||
16325, # Experimental Explosive Plating I
|
||||
16319, # 'Aegis' Explosive Plating I
|
||||
),
|
||||
16313: ( # Upgraded Kinetic Coating I
|
||||
16315, # Limited Kinetic Plating I
|
||||
16317, # Experimental Kinetic Plating I
|
||||
16327, # 'Element' Kinetic Plating I
|
||||
),
|
||||
16337: ( # Upgraded Thermal Coating I
|
||||
16339, # Limited Thermal Plating I
|
||||
16341, # Experimental Thermal Plating I
|
||||
16343, # Prototype Thermal Plating I
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
def upgrade(saveddata_engine):
|
||||
# Convert modules
|
||||
for replacement_item, list in CONVERSIONS.items():
|
||||
for retired_item in list:
|
||||
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?',
|
||||
(replacement_item, retired_item))
|
||||
saveddata_engine.execute('UPDATE "modules" SET "baseItemID" = ? WHERE "baseItemID" = ?',
|
||||
(replacement_item, retired_item))
|
||||
saveddata_engine.execute('UPDATE "cargo" SET "itemID" = ? WHERE "itemID" = ?',
|
||||
(replacement_item, retired_item))
|
||||
50
eos/db/migrations/upgrade42.py
Normal file
50
eos/db/migrations/upgrade42.py
Normal file
@@ -0,0 +1,50 @@
|
||||
"""
|
||||
Migration 42
|
||||
|
||||
- Resistance membrane tiericide
|
||||
"""
|
||||
|
||||
CONVERSIONS = {
|
||||
16391: ( # Compact Multispectrum Energized Membrane
|
||||
16389, # Experimental Energized Adaptive Nano Membrane I
|
||||
16387, # Limited Energized Adaptive Nano Membrane I
|
||||
16385, # Upgraded Energized Adaptive Nano Membrane I
|
||||
),
|
||||
16423: ( # Compact Layered Energized Membrane
|
||||
16421, # Experimental Energized Armor Layering Membrane I
|
||||
16419, # Limited Energized Armor Layering Membrane I
|
||||
16417, # Upgraded Energized Armor Layering Membrane I
|
||||
),
|
||||
16415: ( # Compact EM Energized Membrane
|
||||
16413, # Experimental Energized EM Membrane I
|
||||
16411, # Limited Energized EM Membrane I
|
||||
16409, # Upgraded Energized EM Membrane I
|
||||
),
|
||||
16407: ( # Compact Explosive Energized Membrane
|
||||
16405, # Experimental Energized Explosive Membrane I
|
||||
16403, # Limited Energized Explosive Membrane I
|
||||
16401, # Upgraded Energized Explosive Membrane I
|
||||
),
|
||||
16399: ( # Compact Kinetic Energized Membrane
|
||||
16397, # Experimental Energized Kinetic Membrane I
|
||||
16395, # Limited Energized Kinetic Membrane I
|
||||
16393, # Upgraded Energized Kinetic Membrane I
|
||||
),
|
||||
16431: ( # Compact Thermal Energized Membrane
|
||||
16429, # Experimental Energized Thermal Membrane I
|
||||
16427, # Limited Energized Thermal Membrane I
|
||||
16425, # Upgraded Energized Thermal Membrane I
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
def upgrade(saveddata_engine):
|
||||
# Convert modules
|
||||
for replacement_item, list in CONVERSIONS.items():
|
||||
for retired_item in list:
|
||||
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?',
|
||||
(replacement_item, retired_item))
|
||||
saveddata_engine.execute('UPDATE "modules" SET "baseItemID" = ? WHERE "baseItemID" = ?',
|
||||
(replacement_item, retired_item))
|
||||
saveddata_engine.execute('UPDATE "cargo" SET "itemID" = ? WHERE "itemID" = ?',
|
||||
(replacement_item, retired_item))
|
||||
26
eos/db/migrations/upgrade43.py
Normal file
26
eos/db/migrations/upgrade43.py
Normal file
@@ -0,0 +1,26 @@
|
||||
"""
|
||||
Migration 43
|
||||
|
||||
- Shield booster amplifier tiericide
|
||||
"""
|
||||
|
||||
CONVERSIONS = {
|
||||
16533: ( # Stalwart Restrained Shield Boost Amplifier
|
||||
16531, # 5a Prototype Shield Support I
|
||||
),
|
||||
16535: ( # Copasetic Compact Shield Boost Amplifier
|
||||
16529, # Ionic Field Accelerator I
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
def upgrade(saveddata_engine):
|
||||
# Convert modules
|
||||
for replacement_item, list in CONVERSIONS.items():
|
||||
for retired_item in list:
|
||||
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?',
|
||||
(replacement_item, retired_item))
|
||||
saveddata_engine.execute('UPDATE "modules" SET "baseItemID" = ? WHERE "baseItemID" = ?',
|
||||
(replacement_item, retired_item))
|
||||
saveddata_engine.execute('UPDATE "cargo" SET "itemID" = ? WHERE "itemID" = ?',
|
||||
(replacement_item, retired_item))
|
||||
699
eos/effects.py
699
eos/effects.py
File diff suppressed because it is too large
Load Diff
@@ -21,7 +21,7 @@ import datetime
|
||||
import time
|
||||
from copy import deepcopy
|
||||
from itertools import chain
|
||||
from math import log, sqrt
|
||||
from math import floor, log, sqrt
|
||||
|
||||
from logbook import Logger
|
||||
from sqlalchemy.orm import reconstructor, validates
|
||||
@@ -39,6 +39,7 @@ from eos.saveddata.damagePattern import DamagePattern
|
||||
from eos.saveddata.module import Module
|
||||
from eos.saveddata.ship import Ship
|
||||
from eos.saveddata.targetProfile import TargetProfile
|
||||
from eos.utils.float import floatUnerr
|
||||
from eos.utils.stats import DmgTypes, RRTypes
|
||||
|
||||
|
||||
@@ -378,8 +379,9 @@ class Fit:
|
||||
|
||||
@property
|
||||
def maxTargets(self):
|
||||
return min(self.extraAttributes["maxTargetsLockedFromSkills"],
|
||||
self.ship.getModifiedItemAttr("maxLockedTargets"))
|
||||
maxTargets = min(self.extraAttributes["maxTargetsLockedFromSkills"],
|
||||
self.ship.getModifiedItemAttr("maxLockedTargets"))
|
||||
return floor(floatUnerr(maxTargets))
|
||||
|
||||
@property
|
||||
def maxTargetRange(self):
|
||||
@@ -750,14 +752,14 @@ class Fit:
|
||||
|
||||
if warfareBuffID == 79: # AOE_Beacon_bioluminescence_cloud
|
||||
self.ship.boostItemAttr("signatureRadius", value, stackingPenalties=True)
|
||||
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
|
||||
"signatureRadius", value, stackingPenalties=True)
|
||||
|
||||
if warfareBuffID == 80: # AOE_Beacon_caustic_cloud_local_repair
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"),
|
||||
"armorDamageAmount", value, stackingPenalties=True)
|
||||
if warfareBuffID == 80: # AOE_Beacon_caustic_cloud_inertia
|
||||
self.ship.boostItemAttr("agility", value, stackingPenalties=True)
|
||||
|
||||
if warfareBuffID == 81: # AOE_Beacon_caustic_cloud_remote_repair
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Remote Armor Repair Systems"),
|
||||
"armorDamageAmount", value, stackingPenalties=True)
|
||||
if warfareBuffID == 81: # AOE_Beacon_caustic_cloud_velocity
|
||||
self.ship.boostItemAttr("maxVelocity", value, stackingPenalties=True)
|
||||
|
||||
if warfareBuffID == 88: # AOE_Beacon_filament_cloud_shield_booster_shield_bonus
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Shield Operation"),
|
||||
@@ -772,7 +774,11 @@ class Fit:
|
||||
if warfareBuffID == 90: # Weather_electric_storm_EM_resistance_penalty
|
||||
for tankType in ("shield", "armor"):
|
||||
self.ship.boostItemAttr("{}EmDamageResonance".format(tankType), value)
|
||||
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
|
||||
"{}EmDamageResonance".format(tankType), value)
|
||||
self.ship.boostItemAttr("emDamageResonance", value) # for hull
|
||||
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
|
||||
"emDamageResonance", value) #for hull
|
||||
|
||||
if warfareBuffID == 92: # Weather_electric_storm_capacitor_recharge_bonus
|
||||
self.ship.boostItemAttr("rechargeRate", value, stackingPenalties=True)
|
||||
@@ -780,32 +786,54 @@ class Fit:
|
||||
if warfareBuffID == 93: # Weather_xenon_gas_explosive_resistance_penalty
|
||||
for tankType in ("shield", "armor"):
|
||||
self.ship.boostItemAttr("{}ExplosiveDamageResonance".format(tankType), value)
|
||||
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
|
||||
"{}ExplosiveDamageResonance".format(tankType), value)
|
||||
self.ship.boostItemAttr("explosiveDamageResonance", value) # for hull
|
||||
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
|
||||
"explosiveDamageResonance", value) # for hull
|
||||
|
||||
if warfareBuffID == 94: # Weather_xenon_gas_shield_hp_bonus
|
||||
self.ship.boostItemAttr("shieldCapacity", value) # for hull
|
||||
self.ship.boostItemAttr("shieldCapacity", value)
|
||||
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
|
||||
"shieldCapacity", value)
|
||||
|
||||
if warfareBuffID == 95: # Weather_infernal_thermal_resistance_penalty
|
||||
for tankType in ("shield", "armor"):
|
||||
self.ship.boostItemAttr("{}ThermalDamageResonance".format(tankType), value)
|
||||
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
|
||||
"{}ThermalDamageResonance".format(tankType), value)
|
||||
self.ship.boostItemAttr("thermalDamageResonance", value) # for hull
|
||||
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
|
||||
"thermalDamageResonance", value) # for hull
|
||||
|
||||
if warfareBuffID == 96: # Weather_infernal_armor_hp_bonus
|
||||
self.ship.boostItemAttr("armorHP", value) # for hull
|
||||
self.ship.boostItemAttr("armorHP", value)
|
||||
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
|
||||
"armorHP", value)
|
||||
|
||||
if warfareBuffID == 97: # Weather_darkness_turret_range_penalty
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
|
||||
"maxRange", value, stackingPenalties=True)
|
||||
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
|
||||
"maxRange", value, stackingPenalties=True)
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
|
||||
"falloff", value, stackingPenalties=True)
|
||||
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
|
||||
"falloff", value, stackingPenalties=True)
|
||||
|
||||
if warfareBuffID == 98: # Weather_darkness_velocity_bonus
|
||||
self.ship.boostItemAttr("maxVelocity", value)
|
||||
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
|
||||
"maxVelocity", value)
|
||||
|
||||
if warfareBuffID == 99: # Weather_caustic_toxin_kinetic_resistance_penalty
|
||||
for tankType in ("shield", "armor"):
|
||||
self.ship.boostItemAttr("{}KineticDamageResonance".format(tankType), value)
|
||||
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
|
||||
"{}KineticDamageResonance".format(tankType), value)
|
||||
self.ship.boostItemAttr("kineticDamageResonance", value) # for hull
|
||||
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
|
||||
"kineticDamageResonance", value) # for hull
|
||||
|
||||
if warfareBuffID == 100: # Weather_caustic_toxin_scan_resolution_bonus
|
||||
self.ship.boostItemAttr("scanResolution", value, stackingPenalties=True)
|
||||
|
||||
@@ -64,7 +64,9 @@ ProjectedSystem = {
|
||||
class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
|
||||
"""An instance of this class represents a module together with its charge and modified attributes"""
|
||||
MINING_ATTRIBUTES = ("miningAmount",)
|
||||
SYSTEM_GROUPS = ("Effect Beacon", "MassiveEnvironments", "Abyssal Hazards", "Non-Interactable Object")
|
||||
SYSTEM_GROUPS = (
|
||||
"Effect Beacon", "MassiveEnvironments", "Abyssal Hazards",
|
||||
"Non-Interactable Object", "Destructible Effect Beacon")
|
||||
|
||||
def __init__(self, item, baseItem=None, mutaplasmid=None):
|
||||
"""Initialize a module from the program"""
|
||||
@@ -196,11 +198,18 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
|
||||
# todo: validate baseItem as well if it's set.
|
||||
if self.isEmpty:
|
||||
return False
|
||||
return (
|
||||
self.__item is None or (
|
||||
self.__item.category.name not in ("Module", "Subsystem", "Structure Module") and
|
||||
self.__item.group.name not in self.SYSTEM_GROUPS) or
|
||||
(self.item.isAbyssal and not self.isMutated))
|
||||
if self.__item is None:
|
||||
return True
|
||||
if (
|
||||
self.__item.category.name not in ("Module", "Subsystem", "Structure Module")
|
||||
and self.__item.group.name not in self.SYSTEM_GROUPS
|
||||
):
|
||||
return True
|
||||
if self.item.isAbyssal and not self.isMutated:
|
||||
return True
|
||||
if self.isMutated and not self.__mutaplasmid:
|
||||
return True
|
||||
return False
|
||||
|
||||
@property
|
||||
def isMutated(self):
|
||||
@@ -265,7 +274,9 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
|
||||
|
||||
@property
|
||||
def isExclusiveSystemEffect(self):
|
||||
return self.item.group.name in ("Effect Beacon", "Non-Interactable Object", "MassiveEnvironments")
|
||||
# See issue #2258
|
||||
# return self.item.group.name in ("Effect Beacon", "Non-Interactable Object", "MassiveEnvironments")
|
||||
return False
|
||||
|
||||
@property
|
||||
def isCapitalSize(self):
|
||||
@@ -726,6 +737,9 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
|
||||
return False
|
||||
elif state == FittingModuleState.OVERHEATED and not self.item.isType("overheat"):
|
||||
return False
|
||||
# Some destructible effect beacons contain active effects, hardcap those at online state
|
||||
elif state > FittingModuleState.ONLINE and self.slot == FittingSlot.SYSTEM:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
@@ -1051,7 +1065,10 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
|
||||
elif click == "ctrl":
|
||||
state = FittingModuleState.OFFLINE
|
||||
else:
|
||||
state = transitionMap[currState]
|
||||
try:
|
||||
state = transitionMap[currState]
|
||||
except KeyError:
|
||||
state = min(transitionMap)
|
||||
# If passive module tries to transition into online and fails,
|
||||
# put it to passive instead
|
||||
if not mod.isValidState(state) and currState == FittingModuleState.ONLINE:
|
||||
|
||||
@@ -120,15 +120,24 @@ class Mutator(EqBase):
|
||||
|
||||
@property
|
||||
def baseValue(self):
|
||||
return self.baseAttribute.value
|
||||
try:
|
||||
return self.baseAttribute.value
|
||||
except AttributeError:
|
||||
return 0
|
||||
|
||||
@property
|
||||
def minValue(self):
|
||||
return self.minMod * self.baseAttribute.value
|
||||
try:
|
||||
return self.minMod * self.baseAttribute.value
|
||||
except AttributeError:
|
||||
return 0
|
||||
|
||||
@property
|
||||
def maxValue(self):
|
||||
return self.maxMod * self.baseAttribute.value
|
||||
try:
|
||||
return self.maxMod * self.baseAttribute.value
|
||||
except AttributeError:
|
||||
return 0
|
||||
|
||||
@property
|
||||
def attribute(self):
|
||||
|
||||
@@ -86,7 +86,7 @@ BUILTINS = OrderedDict([
|
||||
# Source: ticket #2067
|
||||
(-52, ('[NPC][Invasion]Invading Precursor Entities', 0.422, 0.367, 0.453, 0.411)),
|
||||
(-53, ('[NPC][Invasion]Retaliating Amarr Entities', 0.360, 0.310, 0.441, 0.602)),
|
||||
(-54, ('[NPC][Invasion]Retaliating Caldari Entities', 0.287, 0.610, 0.487, 0.401)),
|
||||
(-54, ('[NPC][Invasion]Retaliating Caldari Entities', 0.303, 0.610, 0.487, 0.401)),
|
||||
(-55, ('[NPC][Invasion]Retaliating Gallente Entities', 0.383, 0.414, 0.578, 0.513)),
|
||||
(-56, ('[NPC][Invasion]Retaliating Minmatar Entities', 0.620, 0.422, 0.355, 0.399)),
|
||||
(-57, ('[NPC][Abyssal][Dark Matter All Tiers]Drones', 0.439, 0.522, 0.529, 0.435)),
|
||||
|
||||
@@ -36,9 +36,9 @@ class VectorPicker(wx.Window):
|
||||
self._labelpos = int(kwargs.pop('labelpos', 0))
|
||||
self._offset = float(kwargs.pop('offset', 0))
|
||||
self._size = max(0, float(kwargs.pop('size', 50)))
|
||||
self._fontsize = max(1, float(kwargs.pop('fontsize', 8)))
|
||||
self._directionOnly = kwargs.pop('directionOnly', False)
|
||||
super().__init__(*args, **kwargs)
|
||||
self._fontsize = max(1, float(kwargs.pop('fontsize', 8 / self.GetContentScaleFactor())))
|
||||
self._font = wx.Font(self._fontsize, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False)
|
||||
self._angle = 0
|
||||
self.__length = 1
|
||||
@@ -107,8 +107,11 @@ class VectorPicker(wx.Window):
|
||||
dc = wx.BufferedPaintDC(self)
|
||||
self.Draw(dc)
|
||||
|
||||
def GetScaledClientSize(self):
|
||||
return tuple([dim / self.GetContentScaleFactor() for dim in self.GetClientSize()])
|
||||
|
||||
def Draw(self, dc):
|
||||
width, height = self.GetClientSize()
|
||||
width, height = self.GetScaledClientSize()
|
||||
if not width or not height:
|
||||
return
|
||||
dc.SetBackground(wx.Brush(self.GetBackgroundColour(), wx.BRUSHSTYLE_SOLID))
|
||||
@@ -122,9 +125,11 @@ class VectorPicker(wx.Window):
|
||||
a = math.radians(self._angle + self._offset)
|
||||
x = math.cos(a) * radius
|
||||
y = math.sin(a) * radius
|
||||
# See PR #2260 on why this is needed
|
||||
pointRadius = 2 / self.GetContentScaleFactor() if 'wxGTK' in wx.PlatformInfo else 2
|
||||
dc.DrawLine(radius + 2, radius + 2, radius + 2 + x * self._length, radius + 2 - y * self._length)
|
||||
dc.SetBrush(wx.BLACK_BRUSH)
|
||||
dc.DrawCircle(radius + 2 + x * self._length, radius + 2 - y * self._length, 2)
|
||||
dc.DrawCircle(radius + 2 + x * self._length, radius + 2 - y * self._length, pointRadius)
|
||||
|
||||
if self._label:
|
||||
labelText = self._label
|
||||
|
||||
@@ -90,8 +90,6 @@ class ProjectedView(d.Display):
|
||||
self.Bind(wx.EVT_LEFT_DCLICK, self.onLeftDoubleClick)
|
||||
self.Bind(wx.EVT_KEY_UP, self.kbEvent)
|
||||
|
||||
self.droneView = gui.builtinAdditionPanes.droneView.DroneView
|
||||
|
||||
self.Bind(wx.EVT_CONTEXT_MENU, self.spawnMenu)
|
||||
|
||||
self.SetDropTarget(ProjectedViewDrop(self.handleListDrag))
|
||||
@@ -162,7 +160,7 @@ class ProjectedView(d.Display):
|
||||
if item.marketGroup is None:
|
||||
item = item.metaGroup.parent
|
||||
|
||||
return (self.droneView.DRONE_ORDER.index(item.marketGroup.name),
|
||||
return (gui.builtinAdditionPanes.droneView.DRONE_ORDER.index(item.marketGroup.name),
|
||||
drone.item.name)
|
||||
|
||||
@staticmethod
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import re
|
||||
from collections import OrderedDict
|
||||
from itertools import chain
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
@@ -10,6 +11,28 @@ from gui.contextMenu import ContextMenuUnconditional
|
||||
from service.market import Market
|
||||
|
||||
|
||||
class Group:
|
||||
|
||||
def __init__(self):
|
||||
self.groups = OrderedDict()
|
||||
self.items = []
|
||||
|
||||
def sort(self):
|
||||
self.groups = OrderedDict((k, self.groups[k]) for k in sorted(self.groups))
|
||||
for group in self.groups.values():
|
||||
group.sort()
|
||||
self.items.sort(key=lambda e: e.shortName)
|
||||
|
||||
|
||||
class Entry:
|
||||
|
||||
def __init__(self, itemID, name, shortName):
|
||||
self.itemID = itemID
|
||||
self.name = name
|
||||
self.shortName = shortName
|
||||
|
||||
|
||||
|
||||
class AddEnvironmentEffect(ContextMenuUnconditional):
|
||||
|
||||
# CCP doesn't currently provide a mapping between the general Environment, and the specific environment effect
|
||||
@@ -32,107 +55,78 @@ class AddEnvironmentEffect(ContextMenuUnconditional):
|
||||
def getText(self, callingWindow, itmContext):
|
||||
return "Add Environmental Effect"
|
||||
|
||||
def _addGroup(self, parentMenu, name):
|
||||
id = ContextMenuUnconditional.nextID()
|
||||
menuItem = wx.MenuItem(parentMenu, id, name)
|
||||
parentMenu.Bind(wx.EVT_MENU, self.handleSelection, menuItem)
|
||||
return menuItem
|
||||
|
||||
def _addEffect(self, parentMenu, typeID, name):
|
||||
id = ContextMenuUnconditional.nextID()
|
||||
self.idmap[id] = typeID
|
||||
menuItem = wx.MenuItem(parentMenu, id, name)
|
||||
parentMenu.Bind(wx.EVT_MENU, self.handleSelection, menuItem)
|
||||
return menuItem
|
||||
|
||||
def getSubMenu(self, callingWindow, context, rootMenu, i, pitem):
|
||||
msw = True if "wxMSW" in wx.PlatformInfo else False
|
||||
|
||||
# Wormholes
|
||||
|
||||
self.idmap = {}
|
||||
sub = wx.Menu()
|
||||
data = self.getData()
|
||||
msw = "wxMSW" in wx.PlatformInfo
|
||||
|
||||
wormhole_item = wx.MenuItem(sub, wx.ID_ANY, "Wormhole")
|
||||
wormhole_menu = wx.Menu()
|
||||
wormhole_item.SetSubMenu(wormhole_menu)
|
||||
sub.Append(wormhole_item)
|
||||
|
||||
grouped_data, flat_data = self.getEffectBeacons()
|
||||
self.buildMenu(grouped_data, flat_data, wormhole_menu, rootMenu, msw)
|
||||
|
||||
# Incursions
|
||||
|
||||
grouped_data, flat_data = self.getEffectBeacons(incursions=True)
|
||||
self.buildMenu(grouped_data, flat_data, sub, rootMenu, msw)
|
||||
|
||||
# Abyssal Weather
|
||||
|
||||
abyssal_item = wx.MenuItem(sub, wx.ID_ANY, "Abyssal Weather")
|
||||
abyssal_menu = wx.Menu()
|
||||
abyssal_item.SetSubMenu(abyssal_menu)
|
||||
sub.Append(abyssal_item)
|
||||
|
||||
grouped_data, flat_data = self.getAbyssalWeather()
|
||||
self.buildMenu(grouped_data, flat_data, abyssal_menu, rootMenu, msw)
|
||||
|
||||
# Localized Weather
|
||||
|
||||
local_item = wx.MenuItem(sub, wx.ID_ANY, "Localized")
|
||||
local_menu = wx.Menu()
|
||||
local_item.SetSubMenu(local_menu)
|
||||
sub.Append(local_item)
|
||||
|
||||
grouped_data, flat_data = self.getLocalizedEnvironments()
|
||||
self.buildMenu(grouped_data, flat_data, local_menu, rootMenu, msw)
|
||||
def makeMenu(data, parentMenu):
|
||||
menu = wx.Menu()
|
||||
for group_name in data.groups:
|
||||
menuItem = self._addGroup(rootMenu if msw else parentMenu, group_name)
|
||||
subMenu = makeMenu(data.groups[group_name], menu)
|
||||
menuItem.SetSubMenu(subMenu)
|
||||
menu.Append(menuItem)
|
||||
for entry in data.items:
|
||||
menuItem = self._addEffect(rootMenu if msw else parentMenu, entry.itemID, entry.shortName)
|
||||
menu.Append(menuItem)
|
||||
menu.Bind(wx.EVT_MENU, self.handleSelection)
|
||||
return menu
|
||||
|
||||
sub = makeMenu(data, rootMenu)
|
||||
return sub
|
||||
|
||||
def handleSelection(self, event):
|
||||
# Skip events ids that aren't mapped
|
||||
|
||||
swObj, swName = self.idmap.get(event.Id, (False, False))
|
||||
if not swObj and not swName:
|
||||
swObj = self.idmap.get(event.Id, False)
|
||||
if not swObj:
|
||||
event.Skip()
|
||||
return
|
||||
|
||||
fitID = self.mainFrame.getActiveFit()
|
||||
self.mainFrame.command.Submit(cmd.GuiAddProjectedModuleCommand(fitID, swObj.ID))
|
||||
self.mainFrame.command.Submit(cmd.GuiAddProjectedModuleCommand(fitID, swObj))
|
||||
|
||||
def buildMenu(self, grouped_data, flat_data, local_menu, rootMenu, msw):
|
||||
def getData(self):
|
||||
data = Group()
|
||||
data.groups['Metaliminal Storm'] = self.getEffectBeacons(
|
||||
'Electrical', 'Exotic', 'Gamma', 'Plasma',
|
||||
extra_garbage=('Metaliminal', 'Storm', 'Matter', 'Ray', 'Firestorm'))
|
||||
data.groups['Wormhole'] = self.getEffectBeacons(
|
||||
'Black Hole', 'Cataclysmic Variable', 'Magnetar',
|
||||
'Pulsar', 'Red Giant', 'Wolf Rayet')
|
||||
data.groups['Abyssal Weather'] = self.getAbyssalWeather()
|
||||
data.groups['Sansha Incursion'] = self.getEffectBeacons('Sansha Incursion')
|
||||
data.groups['Triglavian Invasion'] = self.getEffectBeacons('Triglavian Invasion')
|
||||
data.groups['Triglavian Invasion'].groups['Destructible Beacons'] = self.getDestructibleBeacons()
|
||||
return data
|
||||
|
||||
def processFlat(data, root, sub):
|
||||
for swData in sorted(data, key=lambda tpl: tpl[2]):
|
||||
wxid = ContextMenuUnconditional.nextID()
|
||||
swObj, swName, swClass = swData
|
||||
self.idmap[wxid] = (swObj, swName)
|
||||
subItem = wx.MenuItem(sub, wxid, swClass)
|
||||
if msw:
|
||||
root.Bind(wx.EVT_MENU, self.handleSelection, subItem)
|
||||
else:
|
||||
sub.Bind(wx.EVT_MENU, self.handleSelection, subItem)
|
||||
sub.Append(subItem)
|
||||
|
||||
for swType in sorted(grouped_data):
|
||||
subItem = wx.MenuItem(local_menu, wx.ID_ANY, swType)
|
||||
grandSub = wx.Menu()
|
||||
subItem.SetSubMenu(grandSub)
|
||||
local_menu.Append(subItem)
|
||||
processFlat(grouped_data[swType], rootMenu, grandSub)
|
||||
|
||||
processFlat(flat_data, rootMenu, local_menu)
|
||||
|
||||
def getEffectBeacons(self, incursions=False):
|
||||
def getEffectBeacons(self, *groups, extra_garbage=()):
|
||||
"""
|
||||
Get dictionary with wormhole system-wide effects
|
||||
Get dictionary with system-wide effects
|
||||
"""
|
||||
compacted = len(groups) <= 1
|
||||
sMkt = Market.getInstance()
|
||||
|
||||
# todo: rework this
|
||||
# Container for system-wide effects
|
||||
grouped = {}
|
||||
|
||||
# Expressions for matching when detecting effects we're looking for
|
||||
if incursions:
|
||||
validgroups = ("Sansha Incursion",
|
||||
"Triglavian Invasion")
|
||||
else:
|
||||
validgroups = ("Black Hole",
|
||||
"Cataclysmic Variable",
|
||||
"Magnetar",
|
||||
"Pulsar",
|
||||
"Red Giant",
|
||||
"Wolf Rayet")
|
||||
data = Group()
|
||||
|
||||
# Stuff we don't want to see in names
|
||||
garbages = ("System Effects", "Effects")
|
||||
garbages = ["System Effects", "Effects"]
|
||||
garbages.extend(extra_garbage)
|
||||
|
||||
# Get group with all the system-wide beacons
|
||||
grp = sMkt.getGroup("Effect Beacon")
|
||||
@@ -140,7 +134,7 @@ class AddEnvironmentEffect(ContextMenuUnconditional):
|
||||
# Cycle through them
|
||||
for beacon in sMkt.getItemsByGroup(grp):
|
||||
# Check if it belongs to any valid group
|
||||
for group in validgroups:
|
||||
for group in groups:
|
||||
# Check beginning of the name only
|
||||
if re.search(group, beacon.name):
|
||||
# Get full beacon name
|
||||
@@ -159,64 +153,65 @@ class AddEnvironmentEffect(ContextMenuUnconditional):
|
||||
groupname = re.sub(garbage, "", groupname)
|
||||
groupname = re.sub(" {2,}", " ", groupname).strip()
|
||||
# Add stuff to dictionary
|
||||
if groupname not in grouped:
|
||||
grouped[groupname] = set()
|
||||
grouped[groupname].add((beacon, beaconname, shortname))
|
||||
if compacted:
|
||||
container = data.items
|
||||
else:
|
||||
container = data.groups.setdefault(groupname, Group()).items
|
||||
container.append(Entry(beacon.ID, beaconname, shortname))
|
||||
# Break loop on 1st result
|
||||
break
|
||||
|
||||
return grouped, ()
|
||||
data.sort()
|
||||
return data
|
||||
|
||||
def getAbyssalWeather(self):
|
||||
sMkt = Market.getInstance()
|
||||
data = Group()
|
||||
|
||||
environments = {x.ID: x for x in sMkt.getGroup("Abyssal Environment").items}
|
||||
items = chain(sMkt.getGroup("MassiveEnvironments").items, sMkt.getGroup("Non-Interactable Object").items)
|
||||
|
||||
grouped = {}
|
||||
flat = set()
|
||||
|
||||
items = chain(
|
||||
sMkt.getGroup("MassiveEnvironments").items,
|
||||
sMkt.getGroup("Non-Interactable Object").items)
|
||||
for beacon in items:
|
||||
if not beacon.isType('projected'):
|
||||
continue
|
||||
|
||||
type = self.__class__.abyssal_mapping.get(beacon.name[0:-2], None)
|
||||
type = environments.get(type, None)
|
||||
if type is None:
|
||||
continue
|
||||
|
||||
if type.name not in grouped:
|
||||
grouped[type.name] = set()
|
||||
|
||||
subdata = data.groups.setdefault(type.name, Group())
|
||||
display_name = "{} {}".format(type.name, beacon.name[-1:])
|
||||
grouped[type.name].add((beacon, display_name, display_name))
|
||||
subdata.items.append(Entry(beacon.ID, display_name, display_name))
|
||||
data.sort()
|
||||
|
||||
# Localized abyssal hazards
|
||||
items = sMkt.getGroup("Abyssal Hazards").items
|
||||
if items:
|
||||
subdata = data.groups.setdefault('Localized', Group())
|
||||
for beacon in sMkt.getGroup("Abyssal Hazards").items:
|
||||
if not beacon.isType('projected'):
|
||||
continue
|
||||
# Localized effects, currently, have a name like "(size) (type) Cloud"
|
||||
# Until this inevitably changes, do a simple split
|
||||
name_parts = beacon.name.split(" ")
|
||||
|
||||
key = name_parts[1].strip()
|
||||
subsubdata = subdata.groups.setdefault(key, Group())
|
||||
subsubdata.items.append(Entry(beacon.ID, beacon.name, beacon.name))
|
||||
subdata.sort()
|
||||
|
||||
# PVP weather
|
||||
flat.add((sMkt.getItem(49766), 'PvP Weather', 'PvP Weather'))
|
||||
data.items.append(Entry(49766, 'PvP Weather', 'PvP Weather'))
|
||||
|
||||
return grouped, flat
|
||||
return data
|
||||
|
||||
def getLocalizedEnvironments(self):
|
||||
def getDestructibleBeacons(self):
|
||||
data = Group()
|
||||
sMkt = Market.getInstance()
|
||||
|
||||
grp = sMkt.getGroup("Abyssal Hazards")
|
||||
|
||||
grouped = dict()
|
||||
|
||||
for beacon in grp.items:
|
||||
if not beacon.isType('projected'):
|
||||
for item in sMkt.getItemsByGroup(sMkt.getGroup('Destructible Effect Beacon')):
|
||||
if not item.isType('projected'):
|
||||
continue
|
||||
# Localized effects, currently, have a name like "(size) (type) Cloud"
|
||||
# Until this inevitably changes, do a simple split
|
||||
name_parts = beacon.name.split(" ")
|
||||
|
||||
key = name_parts[1].strip()
|
||||
if key not in grouped:
|
||||
grouped[key] = set()
|
||||
|
||||
grouped[key].add((beacon, beacon.name, beacon.name))
|
||||
|
||||
return grouped, ()
|
||||
|
||||
data.items.append(Entry(item.ID, item.name, item.name))
|
||||
data.sort()
|
||||
return data
|
||||
|
||||
AddEnvironmentEffect.register()
|
||||
|
||||
@@ -691,6 +691,13 @@ class Miscellanea(ViewColumn):
|
||||
formatAmount(itemArmorResistanceShiftHardenerExp, 3, 0, 3),
|
||||
)
|
||||
return text, tooltip
|
||||
elif itemGroup in ("Cargo Scanner", "Ship Scanner", "Survey Scanner"):
|
||||
duration = stuff.getModifiedItemAttr("duration")
|
||||
if not duration:
|
||||
return "", None
|
||||
text = "{}s".format(formatAmount(duration / 1000, 3, 0, 0))
|
||||
tooltip = "Scan duration"
|
||||
return text, tooltip
|
||||
elif stuff.charge is not None:
|
||||
chargeGroup = stuff.charge.group.name
|
||||
if chargeGroup.endswith("Rocket") or chargeGroup.endswith("Missile") or chargeGroup.endswith("Torpedo"):
|
||||
|
||||
@@ -562,7 +562,10 @@ class FittingView(d.Display):
|
||||
|
||||
if sFit.serviceFittingOptions["rackSlots"]:
|
||||
# flag to know when to add blanks, based on previous slot
|
||||
slotDivider = None if sFit.serviceFittingOptions["rackLabels"] else self.mods[0].slot
|
||||
if sFit.serviceFittingOptions["rackLabels"] or len(self.mods) == 0:
|
||||
slotDivider = None
|
||||
else:
|
||||
slotDivider = self.mods[0].slot
|
||||
|
||||
# first loop finds where slot dividers must go before modifying self.mods
|
||||
for i, mod in enumerate(self.mods):
|
||||
|
||||
@@ -312,6 +312,7 @@ class CharacterEditor(AuxiliaryFrame):
|
||||
|
||||
|
||||
class SkillTreeView(wx.Panel):
|
||||
|
||||
def __init__(self, parent):
|
||||
wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
|
||||
style=wx.TAB_TRAVERSAL)
|
||||
@@ -611,12 +612,16 @@ class SkillTreeView(wx.Panel):
|
||||
|
||||
def spawnMenu(self, event):
|
||||
item = event.GetItem()
|
||||
itemData = self.skillTreeListCtrl.GetItemData(item)
|
||||
if itemData is None:
|
||||
return
|
||||
|
||||
self.skillTreeListCtrl.Select(item)
|
||||
thing = self.skillTreeListCtrl.GetFirstChild(item).IsOk()
|
||||
if thing:
|
||||
return
|
||||
|
||||
id = self.skillTreeListCtrl.GetItemData(item)[1]
|
||||
id = itemData[1]
|
||||
eveItem = Market.getInstance().getItem(id)
|
||||
|
||||
srcContext = "skillItem"
|
||||
|
||||
@@ -367,7 +367,7 @@ class _TabRenderer:
|
||||
width = max(width, self.min_width)
|
||||
height = max(height, self.min_height)
|
||||
|
||||
self.disabled = False
|
||||
self._disabled = False
|
||||
self.baseText = text
|
||||
self.extraText = ''
|
||||
self.tab_size = (width, height)
|
||||
@@ -383,6 +383,18 @@ class _TabRenderer:
|
||||
self.position = (0, 0) # Not used internally for rendering - helper for tab container
|
||||
self.InitTab()
|
||||
|
||||
@property
|
||||
def disabled(self):
|
||||
return self._disabled
|
||||
|
||||
@disabled.setter
|
||||
def disabled(self, value):
|
||||
if value == self._disabled: # Avoid unnecessary re-rendering
|
||||
return
|
||||
|
||||
self._disabled = value
|
||||
self._Render()
|
||||
|
||||
@property
|
||||
def text(self):
|
||||
return self.baseText + self.extraText
|
||||
@@ -402,6 +414,10 @@ class _TabRenderer:
|
||||
width = max(width, self.min_width)
|
||||
height = max(height, self.min_height)
|
||||
|
||||
cur_width, cur_height = self.tab_size
|
||||
if (width == cur_width) and (height == cur_height):
|
||||
return
|
||||
|
||||
self.tab_size = (width, height)
|
||||
self.InitTab()
|
||||
|
||||
@@ -927,7 +943,6 @@ class _TabsContainer(wx.Panel):
|
||||
tb_renderer = self.tabs[tab]
|
||||
tb_renderer.disabled = disabled
|
||||
|
||||
self.AdjustTabsSize()
|
||||
self.Refresh()
|
||||
|
||||
def GetSelectedTab(self):
|
||||
@@ -975,9 +990,6 @@ class _TabsContainer(wx.Panel):
|
||||
sel_tab = self.tabs.index(tab)
|
||||
self.Parent.SetSelection(sel_tab)
|
||||
|
||||
wx.PostEvent(self.Parent, PageChanged(self.tabs.index(old_sel_tab),
|
||||
self.tabs.index(tab)))
|
||||
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
@@ -177,7 +177,7 @@ class CopySelectDialog(wx.Dialog):
|
||||
|
||||
def exportEsi(self, options, callback):
|
||||
fit = getFit(self.mainFrame.getActiveFit())
|
||||
Port.exportESI(fit, callback)
|
||||
Port.exportESI(fit, True, callback)
|
||||
|
||||
def exportXml(self, options, callback):
|
||||
fit = getFit(self.mainFrame.getActiveFit())
|
||||
|
||||
@@ -18,6 +18,7 @@ from service.esiAccess import APIException
|
||||
from service.fit import Fit
|
||||
from service.port import Port
|
||||
from service.port.esi import ESIExportException
|
||||
from service.settings import EsiSettings
|
||||
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
@@ -61,8 +62,10 @@ class EveFittings(AuxiliaryFrame):
|
||||
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.importBtn = wx.Button(self, wx.ID_ANY, "Import to pyfa", wx.DefaultPosition, wx.DefaultSize, 5)
|
||||
self.deleteBtn = wx.Button(self, wx.ID_ANY, "Delete from EVE", wx.DefaultPosition, wx.DefaultSize, 5)
|
||||
self.deleteAllBtn = wx.Button(self, wx.ID_ANY, "Delete all from Eve", wx.DefaultPosition, wx.DefaultSize, 5)
|
||||
btnSizer.Add(self.importBtn, 1, wx.ALL, 5)
|
||||
btnSizer.Add(self.deleteBtn, 1, wx.ALL, 5)
|
||||
btnSizer.Add(self.deleteAllBtn, 1, wx.ALL, 5)
|
||||
fitSizer.Add(btnSizer, 0, wx.EXPAND)
|
||||
|
||||
contentSizer.Add(fitSizer, 1, wx.EXPAND, 0)
|
||||
@@ -71,6 +74,7 @@ class EveFittings(AuxiliaryFrame):
|
||||
self.fetchBtn.Bind(wx.EVT_BUTTON, self.fetchFittings)
|
||||
self.importBtn.Bind(wx.EVT_BUTTON, self.importFitting)
|
||||
self.deleteBtn.Bind(wx.EVT_BUTTON, self.deleteFitting)
|
||||
self.deleteAllBtn.Bind(wx.EVT_BUTTON, self.deleteAllFittings)
|
||||
|
||||
self.Bind(wx.EVT_CHAR_HOOK, self.kbEvent)
|
||||
|
||||
@@ -168,6 +172,37 @@ class EveFittings(AuxiliaryFrame):
|
||||
pyfalog.error(msg)
|
||||
self.statusbar.SetStatusText(msg)
|
||||
|
||||
def deleteAllFittings(self, event):
|
||||
sEsi = Esi.getInstance()
|
||||
activeChar = self.getActiveCharacter()
|
||||
if activeChar is None:
|
||||
return
|
||||
charName = sEsi.getSsoCharacter(activeChar).characterName
|
||||
anyDeleted = False
|
||||
with wx.MessageDialog(
|
||||
self, "Do you really want to delete all fits from %s in EVE?"%(charName),
|
||||
"Confirm Delete", wx.YES | wx.NO | wx.ICON_QUESTION
|
||||
) as dlg:
|
||||
if dlg.ShowModal() == wx.ID_YES:
|
||||
try:
|
||||
for fit in self.fittings:
|
||||
sEsi.delFitting(activeChar, fit['fitting_id'])
|
||||
anyDeleted = True
|
||||
except requests.exceptions.ConnectionError:
|
||||
msg = "Connection error, please check your internet connection"
|
||||
pyfalog.error(msg)
|
||||
self.statusbar.SetStatusText(msg)
|
||||
except APIException as ex:
|
||||
if anyDeleted:
|
||||
msg = "Some fits were not deleted: ESI error {} received".format(ex.status_code)
|
||||
else:
|
||||
msg = "Failed to delete fits: ESI error {} received".format(ex.status_code)
|
||||
pyfalog.error(msg)
|
||||
self.statusbar.SetStatusText(msg)
|
||||
# repopulate the fitting list
|
||||
self.fitTree.populateSkillTree(self.fittings)
|
||||
self.fitView.update([])
|
||||
|
||||
|
||||
class ESIServerExceptionHandler:
|
||||
def __init__(self, parentWindow, ex):
|
||||
@@ -207,7 +242,7 @@ class ExportToEve(AuxiliaryFrame):
|
||||
def __init__(self, parent):
|
||||
super().__init__(
|
||||
parent, id=wx.ID_ANY, title="Export fit to EVE", pos=wx.DefaultPosition,
|
||||
size=wx.Size(400, 120) if "wxGTK" in wx.PlatformInfo else wx.Size(350, 100), resizeable=True)
|
||||
size=wx.Size(400, 140) if "wxGTK" in wx.PlatformInfo else wx.Size(350, 115), resizeable=True)
|
||||
|
||||
self.mainFrame = parent
|
||||
|
||||
@@ -224,6 +259,11 @@ class ExportToEve(AuxiliaryFrame):
|
||||
|
||||
mainSizer.Add(hSizer, 0, wx.EXPAND, 5)
|
||||
|
||||
self.exportChargesCb = wx.CheckBox(self, wx.ID_ANY, 'Export Loaded Charges', wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.exportChargesCb.SetValue(EsiSettings.getInstance().get('exportCharges'))
|
||||
self.exportChargesCb.Bind(wx.EVT_CHECKBOX, self.OnChargeExportChange)
|
||||
mainSizer.Add(self.exportChargesCb, 0, 0, 5)
|
||||
|
||||
self.exportBtn.Bind(wx.EVT_BUTTON, self.exportFitting)
|
||||
|
||||
self.statusbar = wx.StatusBar(self)
|
||||
@@ -239,6 +279,10 @@ class ExportToEve(AuxiliaryFrame):
|
||||
|
||||
self.Center(wx.BOTH)
|
||||
|
||||
def OnChargeExportChange(self, event):
|
||||
EsiSettings.getInstance().set('exportCharges', self.exportChargesCb.GetValue())
|
||||
event.Skip()
|
||||
|
||||
def updateCharList(self):
|
||||
sEsi = Esi.getInstance()
|
||||
chars = sEsi.getSsoCharacters()
|
||||
@@ -274,8 +318,9 @@ class ExportToEve(AuxiliaryFrame):
|
||||
sEsi = Esi.getInstance()
|
||||
|
||||
sFit = Fit.getInstance()
|
||||
exportCharges = self.exportChargesCb.GetValue()
|
||||
try:
|
||||
data = sPort.exportESI(sFit.getFit(fitID))
|
||||
data = sPort.exportESI(sFit.getFit(fitID), exportCharges)
|
||||
except ESIExportException as e:
|
||||
msg = str(e)
|
||||
if not msg:
|
||||
|
||||
@@ -63,8 +63,8 @@ class GuiCargoToLocalModuleCommand(wx.Command):
|
||||
dstModSlot = dstMod.slot
|
||||
if self.srcCargoItemID == dstModItemID:
|
||||
return False
|
||||
# To keep all old item properties, copy them over from old module
|
||||
newModInfo = ModuleInfo.fromModule(dstMod)
|
||||
# To keep all old item properties, copy them over from old module, except for mutations
|
||||
newModInfo = ModuleInfo.fromModule(dstMod, unmutate=True)
|
||||
newModInfo.itemID = self.srcCargoItemID
|
||||
if dstMod.isEmpty:
|
||||
newCargoModItemID = None
|
||||
|
||||
@@ -324,7 +324,8 @@ def activeStateLimit(itemIdentity):
|
||||
'microJumpDrive', 'microJumpPortalDrive', 'emergencyHullEnergizer',
|
||||
'cynosuralGeneration', 'jumpPortalGeneration', 'jumpPortalGenerationBO',
|
||||
'cloneJumpAccepting', 'cloakingWarpSafe', 'cloakingPrototype', 'cloaking',
|
||||
'massEntanglerEffect5', 'electronicAttributeModifyOnline', 'targetPassively'
|
||||
'massEntanglerEffect5', 'electronicAttributeModifyOnline', 'targetPassively',
|
||||
'cargoScan', 'shipScan', 'surveyScan'
|
||||
}.intersection(item.effects):
|
||||
return FittingModuleState.ONLINE
|
||||
return FittingModuleState.ACTIVE
|
||||
|
||||
@@ -110,8 +110,6 @@ class OpenFitsThread(threading.Thread):
|
||||
self.start()
|
||||
|
||||
def run(self):
|
||||
time.sleep(0.5) # Give GUI some time to finish drawing
|
||||
|
||||
# `startup` tells FitSpawner that we are loading fits are startup, and
|
||||
# has 3 values:
|
||||
# False = Set as default in FitSpawner itself, never set here
|
||||
@@ -610,7 +608,9 @@ class MainFrame(wx.Frame):
|
||||
(wx.ACCEL_CTRL, wx.WXK_PAGEDOWN, ctabnext),
|
||||
(wx.ACCEL_CTRL, wx.WXK_PAGEUP, ctabprev),
|
||||
(wx.ACCEL_CMD, wx.WXK_PAGEDOWN, ctabnext),
|
||||
(wx.ACCEL_CMD, wx.WXK_PAGEUP, ctabprev)
|
||||
(wx.ACCEL_CMD, wx.WXK_PAGEUP, ctabprev),
|
||||
|
||||
(wx.ACCEL_CMD | wx.ACCEL_SHIFT, ord("Z"), wx.ID_REDO)
|
||||
]
|
||||
|
||||
# Ctrl/Cmd+# for addition pane selection
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
wxPython == 4.0.6
|
||||
logbook >= 1.0.0
|
||||
matplotlib >= 3.1.2
|
||||
matplotlib == 3.2.2
|
||||
python-dateutil
|
||||
requests >= 2.0.0
|
||||
sqlalchemy >= 1.3.0
|
||||
|
||||
@@ -16,94 +16,10 @@ rename_phrase = " renamed to "
|
||||
conversion_phrase = " converted to "
|
||||
|
||||
text = """
|
||||
Supplemental EM Ward Amplifier converted to 'Basic' EM Shield Amplifier
|
||||
Supplemental Explosive Deflection Amplifier converted to 'Basic' Explosive Shield Amplifier
|
||||
Supplemental Kinetic Deflection Amplifier converted to 'Basic' Kinetic Shield Amplifier
|
||||
Supplemental Thermal Dissipation Amplifier converted to 'Basic' Thermal Shield Amplifier
|
||||
Basic EM Ward Amplifier renamed to 'Basic' EM Shield Amplifier
|
||||
Basic Thermal Dissipation Amplifier renamed to 'Basic' Thermal Shield Amplifier
|
||||
Basic Kinetic Deflection Amplifier renamed to 'Basic' Kinetic Shield Amplifier
|
||||
Basic Explosive Deflection Amplifier renamed to 'Basic' Explosive Shield Amplifier
|
||||
EM Ward Amplifier I renamed to EM Shield Amplifier I
|
||||
Explosive Deflection Amplifier I renamed to Explosive Shield Amplifier I
|
||||
Explosive Deflection Amplifier II renamed to Explosive Shield Amplifier II
|
||||
Thermal Dissipation Amplifier I renamed to Thermal Shield Amplifier I
|
||||
Thermal Dissipation Amplifier II renamed to Thermal Shield Amplifier II
|
||||
Kinetic Deflection Amplifier I renamed to Kinetic Shield Amplifier I
|
||||
Kinetic Deflection Amplifier II renamed to Kinetic Shield Amplifier II
|
||||
EM Ward Amplifier II renamed to EM Shield Amplifier II
|
||||
Upgraded Explosive Deflection Amplifier I renamed to Compact Explosive Shield Amplifier
|
||||
Upgraded Thermal Dissipation Amplifier I renamed to Compact Thermal Shield Amplifier
|
||||
Upgraded EM Ward Amplifier I renamed to Compact EM Shield Amplifier
|
||||
Upgraded Kinetic Deflection Amplifier I renamed to Compact Kinetic Shield Amplifier
|
||||
Domination Explosive Deflection Amplifier renamed to Domination Explosive Shield Amplifier
|
||||
Dread Guristas Explosive Deflection Amplifier renamed to Dread Guristas Explosive Shield Amplifier
|
||||
Domination Thermal Dissipation Amplifier renamed to Domination Thermal Shield Amplifier
|
||||
Dread Guristas Thermal Dissipation Amplifier renamed to Dread Guristas Thermal Shield Amplifier
|
||||
Domination Kinetic Deflection Amplifier renamed to Domination Kinetic Shield Amplifier
|
||||
Dread Guristas Kinetic Deflection Amplifier renamed to Dread Guristas Kinetic Shield Amplifier
|
||||
Domination EM Ward Amplifier renamed to Domination EM Shield Amplifier
|
||||
Dread Guristas EM Ward Amplifier renamed to Dread Guristas EM Shield Amplifier
|
||||
Hakim's Modified Explosive Deflection Amplifier renamed to Hakim's Modified Explosive Shield Amplifier
|
||||
Tobias' Modified Explosive Deflection Amplifier renamed to Tobias' Modified Explosive Shield Amplifier
|
||||
Hakim's Modified Thermal Dissipation Amplifier renamed to Hakim's Modified Thermal Shield Amplifier
|
||||
Tobias' Modified Thermal Dissipation Amplifier renamed to Tobias' Modified Thermal Shield Amplifier
|
||||
Hakim's Modified Kinetic Deflection Amplifier renamed to Hakim's Modified Kinetic Shield Amplifier
|
||||
Tobias' Modified Kinetic Deflection Amplifier renamed to Tobias' Modified Kinetic Shield Amplifier
|
||||
Hakim's Modified EM Ward Amplifier renamed to Hakim's Modified EM Shield Amplifier
|
||||
Tobias' Modified EM Ward Amplifier renamed to Tobias' Modified EM Shield Amplifier
|
||||
Kaikka's Modified Explosive Deflection Amplifier renamed to Kaikka's Modified Explosive Shield Amplifier
|
||||
Thon's Modified Explosive Deflection Amplifier renamed to Thon's Modified Explosive Shield Amplifier
|
||||
Vepas' Modified Explosive Deflection Amplifier renamed to Vepas' Modified Explosive Shield Amplifier
|
||||
Estamel's Modified Explosive Deflection Amplifier renamed to Estamel's Modified Explosive Shield Amplifier
|
||||
Kaikka's Modified Thermal Dissipation Amplifier renamed to Kaikka's Modified Thermal Shield Amplifier
|
||||
Thon's Modified Thermal Dissipation Amplifier renamed to Thon's Modified Thermal Shield Amplifier
|
||||
Vepas' Modified Thermal Dissipation Amplifier renamed to Vepas' Modified Thermal Shield Amplifier
|
||||
Estamel's Modified Thermal Dissipation Amplifier renamed to Estamel's Modified Thermal Shield Amplifier
|
||||
Kaikka's Modified Kinetic Deflection Amplifier renamed to Kaikka's Modified Kinetic Shield Amplifier
|
||||
Thon's Modified Kinetic Deflection Amplifier renamed to Thon's Modified Kinetic Shield Amplifier
|
||||
Vepas' Modified Kinetic Deflection Amplifier renamed to Vepas' Modified Kinetic Shield Amplifier
|
||||
Estamel's Modified Kinetic Deflection Amplifier renamed to Estamel's Modified Kinetic Shield Amplifier
|
||||
Kaikka's Modified EM Ward Amplifier renamed to Kaikka's Modified EM Shield Amplifier
|
||||
Thon's Modified EM Ward Amplifier renamed to Thon's Modified EM Shield Amplifier
|
||||
Vepas' Modified EM Ward Amplifier renamed to Vepas' Modified EM Shield Amplifier
|
||||
Estamel's Modified EM Ward Amplifier renamed to Estamel's Modified EM Shield Amplifier
|
||||
Caldari Navy EM Ward Amplifier renamed to Caldari Navy EM Shield Amplifier
|
||||
Caldari Navy Kinetic Deflection Amplifier renamed to Caldari Navy Kinetic Shield Amplifier
|
||||
Caldari Navy Thermal Dissipation Amplifier renamed to Caldari Navy Thermal Shield Amplifier
|
||||
Caldari Navy Explosive Deflection Amplifier renamed to Caldari Navy Explosive Shield Amplifier
|
||||
Republic Fleet EM Ward Amplifier renamed to Republic Fleet EM Shield Amplifier
|
||||
Republic Fleet Kinetic Deflection Amplifier renamed to Republic Fleet Kinetic Shield Amplifier
|
||||
Republic Fleet Thermal Dissipation Amplifier renamed to Republic Fleet Thermal Shield Amplifier
|
||||
Republic Fleet Explosive Deflection Amplifier renamed to Republic Fleet Explosive Shield Amplifier
|
||||
Pithum C-Type Explosive Deflection Amplifier renamed to Pithum C-Type Explosive Shield Amplifier
|
||||
Pithum C-Type Thermal Dissipation Amplifier renamed to Pithum C-Type Thermal Shield Amplifier
|
||||
Pithum C-Type Kinetic Deflection Amplifier renamed to Pithum C-Type Kinetic Shield Amplifier
|
||||
Pithum C-Type EM Ward Amplifier renamed to Pithum C-Type EM Shield Amplifier
|
||||
Pithum B-Type Explosive Deflection Amplifier renamed to Pithum B-Type Explosive Shield Amplifier
|
||||
Pithum B-Type Thermal Dissipation Amplifier renamed to Pithum B-Type Thermal Shield Amplifier
|
||||
Pithum B-Type Kinetic Deflection Amplifier renamed to Pithum B-Type Kinetic Shield Amplifier
|
||||
Pithum B-Type EM Ward Amplifier renamed to Pithum B-Type EM Shield Amplifier
|
||||
Pithum A-Type Explosive Deflection Amplifier renamed to Pithum A-Type Explosive Shield Amplifier
|
||||
Pithum A-Type Thermal Dissipation Amplifier renamed to Pithum A-Type Thermal Shield Amplifier
|
||||
Pithum A-Type Kinetic Deflection Amplifier renamed to Pithum A-Type Kinetic Shield Amplifier
|
||||
Pithum A-Type EM Ward Amplifier renamed to Pithum A-Type EM Shield Amplifier
|
||||
Gistum C-Type Explosive Deflection Amplifier renamed to Gistum C-Type Explosive Shield Amplifier
|
||||
Gistum B-Type Explosive Deflection Amplifier renamed to Gistum B-Type Explosive Shield Amplifier
|
||||
Gistum C-Type Thermal Dissipation Amplifier renamed to Gistum C-Type Thermal Shield Amplifier
|
||||
Gistum B-Type Thermal Dissipation Amplifier renamed to Gistum B-Type Thermal Shield Amplifier
|
||||
Gistum C-Type Kinetic Deflection Amplifier renamed to Gistum C-Type Kinetic Shield Amplifier
|
||||
Gistum B-Type Kinetic Deflection Amplifier renamed to Gistum B-Type Kinetic Shield Amplifier
|
||||
Gistum C-Type EM Ward Amplifier renamed to Gistum C-Type EM Shield Amplifier
|
||||
Gistum B-Type EM Ward Amplifier renamed to Gistum B-Type EM Shield Amplifier
|
||||
Gistum A-Type Explosive Deflection Amplifier renamed to Gistum A-Type Explosive Shield Amplifier
|
||||
Gistum A-Type Thermal Dissipation Amplifier renamed to Gistum A-Type Thermal Shield Amplifier
|
||||
Gistum A-Type Kinetic Deflection Amplifier renamed to Gistum A-Type Kinetic Shield Amplifier
|
||||
Gistum A-Type EM Ward Amplifier renamed to Gistum A-Type EM Shield Amplifier
|
||||
'Whiskey' Explosive Deflection Amplifier renamed to 'Whiskey' Explosive Shield Amplifier
|
||||
'High Noon' Thermal Dissipation Amplifier renamed to 'High Noon' Thermal Shield Amplifier
|
||||
'Cactus' Modified Kinetic Deflection Amplifier renamed to 'Cactus' Modified Kinetic Shield Amplifier
|
||||
'Prospector' EM Ward Amplifier renamed to 'Prospector' EM Shield Amplifier
|
||||
'Stalwart' Particle Field Magnifier renamed to Stalwart Restrained Shield Boost Amplifier
|
||||
'Copasetic' Particle Field Acceleration renamed to Copasetic Compact Shield Boost Amplifier
|
||||
5a Prototype Shield Support I converted to Stalwart Restrained Shield Boost Amplifier
|
||||
Ionic Field Accelerator I converted to Copasetic Compact Shield Boost Amplifier
|
||||
"""
|
||||
|
||||
def main(old, new):
|
||||
|
||||
194
service/conversions/releaseAug2020.py
Normal file
194
service/conversions/releaseAug2020.py
Normal file
@@ -0,0 +1,194 @@
|
||||
"""
|
||||
Conversion pack for August 2020 release
|
||||
"""
|
||||
|
||||
CONVERSIONS = {
|
||||
# Renamed items, extracted via diff file
|
||||
"Basic Energized EM Membrane": "'Basic' EM Energized Membrane",
|
||||
"Energized EM Membrane I": "EM Energized Membrane I",
|
||||
"Energized EM Membrane II": "EM Energized Membrane II",
|
||||
"Basic Energized Explosive Membrane": "'Basic' Explosive Energized Membrane",
|
||||
"Energized Explosive Membrane I": "Explosive Energized Membrane I",
|
||||
"Energized Explosive Membrane II": "Explosive Energized Membrane II",
|
||||
"Basic Energized Armor Layering Membrane": "'Basic' Layered Energized Membrane",
|
||||
"Energized Armor Layering Membrane I": "Layered Energized Membrane I",
|
||||
"Energized Armor Layering Membrane II": "Layered Energized Membrane II",
|
||||
"Basic Energized Kinetic Membrane": "'Basic' Kinetic Energized Membrane",
|
||||
"Energized Kinetic Membrane I": "Kinetic Energized Membrane I",
|
||||
"Energized Kinetic Membrane II": "Kinetic Energized Membrane II",
|
||||
"Basic Energized Thermal Membrane": "'Basic' Thermal Energized Membrane",
|
||||
"Energized Thermal Membrane I": "Thermal Energized Membrane I",
|
||||
"Energized Thermal Membrane II": "Thermal Energized Membrane II",
|
||||
"Basic Energized Adaptive Nano Membrane": "'Basic' Multispectrum Energized Membrane",
|
||||
"Energized Adaptive Nano Membrane I": "Multispectrum Energized Membrane I",
|
||||
"Energized Adaptive Nano Membrane II": "Multispectrum Energized Membrane II",
|
||||
"Dark Blood Energized Adaptive Nano Membrane": "Dark Blood Multispectrum Energized Membrane",
|
||||
"True Sansha Energized Adaptive Nano Membrane": "True Sansha Multispectrum Energized Membrane",
|
||||
"Shadow Serpentis Energized Adaptive Nano Membrane": "Shadow Serpentis Multispectrum Energized Membrane",
|
||||
"Dark Blood Energized Kinetic Membrane": "Dark Blood Kinetic Energized Membrane",
|
||||
"True Sansha Energized Kinetic Membrane": "True Sansha Kinetic Energized Membrane",
|
||||
"Shadow Serpentis Energized Kinetic Membrane": "Shadow Serpentis Kinetic Energized Membrane",
|
||||
"Dark Blood Energized Explosive Membrane": "Dark Blood Explosive Energized Membrane",
|
||||
"True Sansha Energized Explosive Membrane": "True Sansha Explosive Energized Membrane",
|
||||
"Shadow Serpentis Energized Explosive Membrane": "Shadow Serpentis Explosive Energized Membrane",
|
||||
"Dark Blood Energized EM Membrane": "Dark Blood EM Energized Membrane",
|
||||
"True Sansha Energized EM Membrane": "True Sansha EM Energized Membrane",
|
||||
"Shadow Serpentis Energized EM Membrane": "Shadow Serpentis EM Energized Membrane",
|
||||
"Dark Blood Energized Thermal Membrane": "Dark Blood Thermal Energized Membrane",
|
||||
"True Sansha Energized Thermal Membrane": "True Sansha Thermal Energized Membrane",
|
||||
"Shadow Serpentis Energized Thermal Membrane": "Shadow Serpentis Thermal Energized Membrane",
|
||||
"Brokara's Modified Energized Adaptive Nano Membrane": "Brokara's Modified Multispectrum Energized Membrane",
|
||||
"Tairei's Modified Energized Adaptive Nano Membrane": "Tairei's Modified Multispectrum Energized Membrane",
|
||||
"Selynne's Modified Energized Adaptive Nano Membrane": "Selynne's Modified Multispectrum Energized Membrane",
|
||||
"Raysere's Modified Energized Adaptive Nano Membrane": "Raysere's Modified Multispectrum Energized Membrane",
|
||||
"Vizan's Modified Energized Adaptive Nano Membrane": "Vizan's Modified Multispectrum Energized Membrane",
|
||||
"Ahremen's Modified Energized Adaptive Nano Membrane": "Ahremen's Modified Multispectrum Energized Membrane",
|
||||
"Chelm's Modified Energized Adaptive Nano Membrane": "Chelm's Modified Multispectrum Energized Membrane",
|
||||
"Draclira's Modified Energized Adaptive Nano Membrane": "Draclira's Modified Multispectrum Energized Membrane",
|
||||
"Brokara's Modified Energized Thermal Membrane": "Brokara's Modified Thermal Energized Membrane",
|
||||
"Tairei's Modified Energized Thermal Membrane": "Tairei's Modified Thermal Energized Membrane",
|
||||
"Selynne's Modified Energized Thermal Membrane": "Selynne's Modified Thermal Energized Membrane",
|
||||
"Raysere's Modified Energized Thermal Membrane": "Raysere's Modified Thermal Energized Membrane",
|
||||
"Vizan's Modified Energized Thermal Membrane": "Vizan's Modified Thermal Energized Membrane",
|
||||
"Ahremen's Modified Energized Thermal Membrane": "Ahremen's Modified Thermal Energized Membrane",
|
||||
"Chelm's Modified Energized Thermal Membrane": "Chelm's Modified Thermal Energized Membrane",
|
||||
"Draclira's Modified Energized Thermal Membrane": "Draclira's Modified Thermal Energized Membrane",
|
||||
"Brokara's Modified Energized EM Membrane": "Brokara's Modified EM Energized Membrane",
|
||||
"Tairei's Modified Energized EM Membrane": "Tairei's Modified EM Energized Membrane",
|
||||
"Selynne's Modified Energized EM Membrane": "Selynne's Modified EM Energized Membrane",
|
||||
"Raysere's Modified Energized EM Membrane": "Raysere's Modified EM Energized Membrane",
|
||||
"Vizan's Modified Energized EM Membrane": "Vizan's Modified EM Energized Membrane",
|
||||
"Ahremen's Modified Energized EM Membrane": "Ahremen's Modified EM Energized Membrane",
|
||||
"Chelm's Modified Energized EM Membrane": "Chelm's Modified EM Energized Membrane",
|
||||
"Draclira's Modified Energized EM Membrane": "Draclira's Modified EM Energized Membrane",
|
||||
"Brokara's Modified Energized Explosive Membrane": "Brokara's Modified Explosive Energized Membrane",
|
||||
"Tairei's Modified Energized Explosive Membrane": "Tairei's Modified Explosive Energized Membrane",
|
||||
"Selynne's Modified Energized Explosive Membrane": "Selynne's Modified Explosive Energized Membrane",
|
||||
"Raysere's Modified Energized Explosive Membrane": "Raysere's Modified Explosive Energized Membrane",
|
||||
"Vizan's Modified Energized Explosive Membrane": "Vizan's Modified Explosive Energized Membrane",
|
||||
"Ahremen's Modified Energized Explosive Membrane": "Ahremen's Modified Explosive Energized Membrane",
|
||||
"Chelm's Modified Energized Explosive Membrane": "Chelm's Modified Explosive Energized Membrane",
|
||||
"Draclira's Modified Energized Explosive Membrane": "Draclira's Modified Explosive Energized Membrane",
|
||||
"Brokara's Modified Energized Kinetic Membrane": "Brokara's Modified Kinetic Energized Membrane",
|
||||
"Tairei's Modified Energized Kinetic Membrane": "Tairei's Modified Kinetic Energized Membrane",
|
||||
"Selynne's Modified Energized Kinetic Membrane": "Selynne's Modified Kinetic Energized Membrane",
|
||||
"Raysere's Modified Energized Kinetic Membrane": "Raysere's Modified Kinetic Energized Membrane",
|
||||
"Vizan's Modified Energized Kinetic Membrane": "Vizan's Modified Kinetic Energized Membrane",
|
||||
"Ahremen's Modified Energized Kinetic Membrane": "Ahremen's Modified Kinetic Energized Membrane",
|
||||
"Chelm's Modified Energized Kinetic Membrane": "Chelm's Modified Kinetic Energized Membrane",
|
||||
"Draclira's Modified Energized Kinetic Membrane": "Draclira's Modified Kinetic Energized Membrane",
|
||||
"Brynn's Modified Energized Adaptive Nano Membrane": "Brynn's Modified Multispectrum Energized Membrane",
|
||||
"Tuvan's Modified Energized Adaptive Nano Membrane": "Tuvan's Modified Multispectrum Energized Membrane",
|
||||
"Setele's Modified Energized Adaptive Nano Membrane": "Setele's Modified Multispectrum Energized Membrane",
|
||||
"Cormack's Modified Energized Adaptive Nano Membrane": "Cormack's Modified Multispectrum Energized Membrane",
|
||||
"Brynn's Modified Energized Thermal Membrane": "Brynn's Modified Thermal Energized Membrane",
|
||||
"Tuvan's Modified Energized Thermal Membrane": "Tuvan's Modified Thermal Energized Membrane",
|
||||
"Setele's Modified Energized Thermal Membrane": "Setele's Modified Thermal Energized Membrane",
|
||||
"Cormack's Modified Energized Thermal Membrane": "Cormack's Modified Thermal Energized Membrane",
|
||||
"Brynn's Modified Energized EM Membrane": "Brynn's Modified EM Energized Membrane",
|
||||
"Tuvan's Modified Energized EM Membrane": "Tuvan's Modified EM Energized Membrane",
|
||||
"Setele's Modified Energized EM Membrane": "Setele's Modified EM Energized Membrane",
|
||||
"Cormack's Modified Energized EM Membrane": "Cormack's Modified EM Energized Membrane",
|
||||
"Brynn's Modified Energized Explosive Membrane": "Brynn's Modified Explosive Energized Membrane",
|
||||
"Tuvan's Modified Energized Explosive Membrane": "Tuvan's Modified Explosive Energized Membrane",
|
||||
"Setele's Modified Energized Explosive Membrane": "Setele's Modified Explosive Energized Membrane",
|
||||
"Cormack's Modified Energized Explosive Membrane": "Cormack's Modified Explosive Energized Membrane",
|
||||
"Brynn's Modified Energized Kinetic Membrane": "Brynn's Modified Kinetic Energized Membrane",
|
||||
"Tuvan's Modified Energized Kinetic Membrane": "Tuvan's Modified Kinetic Energized Membrane",
|
||||
"Setele's Modified Energized Kinetic Membrane": "Setele's Modified Kinetic Energized Membrane",
|
||||
"Cormack's Modified Energized Kinetic Membrane": "Cormack's Modified Kinetic Energized Membrane",
|
||||
"Imperial Navy Energized Thermal Membrane": "Imperial Navy Thermal Energized Membrane",
|
||||
"Imperial Navy Energized EM Membrane": "Imperial Navy EM Energized Membrane",
|
||||
"Imperial Navy Energized Explosive Membrane": "Imperial Navy Explosive Energized Membrane",
|
||||
"Imperial Navy Energized Kinetic Membrane": "Imperial Navy Kinetic Energized Membrane",
|
||||
"Imperial Navy Energized Adaptive Nano Membrane": "Imperial Navy Multispectrum Energized Membrane",
|
||||
"Federation Navy Energized Thermal Membrane": "Federation Navy Thermal Energized Membrane",
|
||||
"Federation Navy Energized EM Membrane": "Federation Navy EM Energized Membrane",
|
||||
"Federation Navy Energized Explosive Membrane": "Federation Navy Explosive Energized Membrane",
|
||||
"Federation Navy Energized Kinetic Membrane": "Federation Navy Kinetic Energized Membrane",
|
||||
"Federation Navy Energized Adaptive Nano Membrane": "Federation Navy Multispectrum Energized Membrane",
|
||||
"Prototype Energized Adaptive Nano Membrane I": "Compact Multispectrum Energized Membrane",
|
||||
"Prototype Energized Kinetic Membrane I": "Compact Kinetic Energized Membrane",
|
||||
"Prototype Energized Explosive Membrane I": "Compact Explosive Energized Membrane",
|
||||
"Prototype Energized EM Membrane I": "Compact EM Energized Membrane",
|
||||
"Prototype Energized Armor Layering Membrane I": "Compact Layered Energized Membrane",
|
||||
"Prototype Energized Thermal Membrane I": "Compact Thermal Energized Membrane",
|
||||
"Ammatar Navy Energized Adaptive Nano Membrane": "Ammatar Navy Multispectrum Energized Membrane",
|
||||
"Ammatar Navy Energized Kinetic Membrane": "Ammatar Navy Kinetic Energized Membrane",
|
||||
"Ammatar Navy Energized Explosive Membrane": "Ammatar Navy Explosive Energized Membrane",
|
||||
"Ammatar Navy Energized EM Membrane": "Ammatar Navy EM Energized Membrane",
|
||||
"Ammatar Navy Energized Thermal Membrane": "Ammatar Navy Thermal Energized Membrane",
|
||||
"Corelum C-Type Energized Adaptive Nano Membrane": "Corelum C-Type Multispectrum Energized Membrane",
|
||||
"Corelum C-Type Energized Kinetic Membrane": "Corelum C-Type Kinetic Energized Membrane",
|
||||
"Corelum C-Type Energized Explosive Membrane": "Corelum C-Type Explosive Energized Membrane",
|
||||
"Corelum C-Type Energized EM Membrane": "Corelum C-Type EM Energized Membrane",
|
||||
"Corelum C-Type Energized Thermal Membrane": "Corelum C-Type Thermal Energized Membrane",
|
||||
"Corelum B-Type Energized Adaptive Nano Membrane": "Corelum B-Type Multispectrum Energized Membrane",
|
||||
"Corelum B-Type Energized Kinetic Membrane": "Corelum B-Type Kinetic Energized Membrane",
|
||||
"Corelum B-Type Energized Explosive Membrane": "Corelum B-Type Explosive Energized Membrane",
|
||||
"Corelum B-Type Energized EM Membrane": "Corelum B-Type EM Energized Membrane",
|
||||
"Corelum B-Type Energized Thermal Membrane": "Corelum B-Type Thermal Energized Membrane",
|
||||
"Corelum A-Type Energized Adaptive Nano Membrane": "Corelum A-Type Multispectrum Energized Membrane",
|
||||
"Corelum A-Type Energized Kinetic Membrane": "Corelum A-Type Kinetic Energized Membrane",
|
||||
"Corelum A-Type Energized Explosive Membrane": "Corelum A-Type Explosive Energized Membrane",
|
||||
"Corelum A-Type Energized EM Membrane": "Corelum A-Type EM Energized Membrane",
|
||||
"Corelum A-Type Energized Thermal Membrane": "Corelum A-Type Thermal Energized Membrane",
|
||||
"Corpum C-Type Energized Adaptive Nano Membrane": "Corpum C-Type Multispectrum Energized Membrane",
|
||||
"Centum C-Type Energized Adaptive Nano Membrane": "Centum C-Type Multispectrum Energized Membrane",
|
||||
"Corpum C-Type Energized Kinetic Membrane": "Corpum C-Type Kinetic Energized Membrane",
|
||||
"Centum C-Type Energized Kinetic Membrane": "Centum C-Type Kinetic Energized Membrane",
|
||||
"Corpum C-Type Energized Explosive Membrane": "Corpum C-Type Explosive Energized Membrane",
|
||||
"Centum C-Type Energized Explosive Membrane": "Centum C-Type Explosive Energized Membrane",
|
||||
"Corpum C-Type Energized EM Membrane": "Corpum C-Type EM Energized Membrane",
|
||||
"Centum C-Type Energized EM Membrane": "Centum C-Type EM Energized Membrane",
|
||||
"Corpum C-Type Energized Thermal Membrane": "Corpum C-Type Thermal Energized Membrane",
|
||||
"Centum C-Type Energized Thermal Membrane": "Centum C-Type Thermal Energized Membrane",
|
||||
"Corpum B-Type Energized Adaptive Nano Membrane": "Corpum B-Type Multispectrum Energized Membrane",
|
||||
"Centum B-Type Energized Adaptive Nano Membrane": "Centum B-Type Multispectrum Energized Membrane",
|
||||
"Corpum B-Type Energized Kinetic Membrane": "Corpum B-Type Kinetic Energized Membrane",
|
||||
"Centum B-Type Energized Kinetic Membrane": "Centum B-Type Kinetic Energized Membrane",
|
||||
"Corpum B-Type Energized Explosive Membrane": "Corpum B-Type Explosive Energized Membrane",
|
||||
"Centum B-Type Energized Explosive Membrane": "Centum B-Type Explosive Energized Membrane",
|
||||
"Corpum B-Type Energized Thermal Membrane": "Corpum B-Type Thermal Energized Membrane",
|
||||
"Centum B-Type Energized Thermal Membrane": "Centum B-Type Thermal Energized Membrane",
|
||||
"Corpum A-Type Energized Thermal Membrane": "Corpum A-Type Thermal Energized Membrane",
|
||||
"Centum A-Type Energized Thermal Membrane": "Centum A-Type Thermal Energized Membrane",
|
||||
"Corpum A-Type Energized EM Membrane": "Corpum A-Type EM Energized Membrane",
|
||||
"Centum A-Type Energized EM Membrane": "Centum A-Type EM Energized Membrane",
|
||||
"Corpum A-Type Energized Explosive Membrane": "Corpum A-Type Explosive Energized Membrane",
|
||||
"Centum A-Type Energized Explosive Membrane": "Centum A-Type Explosive Energized Membrane",
|
||||
"Corpum A-Type Energized Kinetic Membrane": "Corpum A-Type Kinetic Energized Membrane",
|
||||
"Centum A-Type Energized Kinetic Membrane": "Centum A-Type Kinetic Energized Membrane",
|
||||
"Corpum A-Type Energized Adaptive Nano Membrane": "Corpum A-Type Multispectrum Energized Membrane",
|
||||
"Centum A-Type Energized Adaptive Nano Membrane": "Centum A-Type Multispectrum Energized Membrane",
|
||||
"Corpum B-Type Energized EM Membrane": "Corpum B-Type EM Energized Membrane",
|
||||
"Centum B-Type Energized EM Membrane": "Centum B-Type EM Energized Membrane",
|
||||
"'Pilfer' Energized Adaptive Nano Membrane I": "'Pilfer' Multispectrum Energized Membrane",
|
||||
"'Moonshine' Energized Thermal Membrane I": "'Moonshine' Thermal Energized Membrane",
|
||||
"'Mafia' Energized Kinetic Membrane I": "'Mafia' Kinetic Energized Membrane",
|
||||
"Khanid Navy Energized Adaptive Nano Membrane": "Khanid Navy Multispectrum Energized Membrane",
|
||||
"Khanid Navy Energized Kinetic Membrane": "Khanid Navy Kinetic Energized Membrane",
|
||||
"Khanid Navy Energized Explosive Membrane": "Khanid Navy Explosive Energized Membrane",
|
||||
"Khanid Navy Energized EM Membrane": "Khanid Navy EM Energized Membrane",
|
||||
"Khanid Navy Energized Thermal Membrane": "Khanid Navy Thermal Energized Membrane",
|
||||
"Large Compact Vorton projector": "Large Compact Vorton Projector",
|
||||
# Converted items
|
||||
"Experimental Energized Adaptive Nano Membrane I": "Compact Multispectrum Energized Membrane",
|
||||
"Limited Energized Adaptive Nano Membrane I": "Compact Multispectrum Energized Membrane",
|
||||
"Upgraded Energized Adaptive Nano Membrane I": "Compact Multispectrum Energized Membrane",
|
||||
"Experimental Energized Armor Layering Membrane I": "Compact Layered Energized Membrane",
|
||||
"Limited Energized Armor Layering Membrane I": "Compact Layered Energized Membrane",
|
||||
"Upgraded Energized Armor Layering Membrane I": "Compact Layered Energized Membrane",
|
||||
"Experimental Energized EM Membrane I": "Compact EM Energized Membrane",
|
||||
"Limited Energized EM Membrane I": "Compact EM Energized Membrane",
|
||||
"Upgraded Energized EM Membrane I": "Compact EM Energized Membrane",
|
||||
"Experimental Energized Explosive Membrane I": "Compact Explosive Energized Membrane",
|
||||
"Limited Energized Explosive Membrane I": "Compact Explosive Energized Membrane",
|
||||
"Upgraded Energized Explosive Membrane I": "Compact Explosive Energized Membrane",
|
||||
"Experimental Energized Kinetic Membrane I": "Compact Kinetic Energized Membrane",
|
||||
"Limited Energized Kinetic Membrane I": "Compact Kinetic Energized Membrane",
|
||||
"Upgraded Energized Kinetic Membrane I": "Compact Kinetic Energized Membrane",
|
||||
"Experimental Energized Thermal Membrane I": "Compact Thermal Energized Membrane",
|
||||
"Limited Energized Thermal Membrane I": "Compact Thermal Energized Membrane",
|
||||
"Upgraded Energized Thermal Membrane I": "Compact Thermal Energized Membrane",
|
||||
}
|
||||
228
service/conversions/releaseJul2020.py
Normal file
228
service/conversions/releaseJul2020.py
Normal file
@@ -0,0 +1,228 @@
|
||||
"""
|
||||
Conversion pack for July 2020 release
|
||||
"""
|
||||
|
||||
CONVERSIONS = {
|
||||
# Renamed items, extracted via diff file
|
||||
"Basic EM Plating": "'Basic' EM Coating",
|
||||
"EM Plating I": "EM Coating I",
|
||||
"EM Plating II": "EM Coating II",
|
||||
"Basic Explosive Plating": "'Basic' Explosive Coating",
|
||||
"Explosive Plating I": "Explosive Coating I",
|
||||
"Explosive Plating II": "Explosive Coating II",
|
||||
"Basic Layered Plating": "'Basic' Layered Coating",
|
||||
"Layered Plating I": "Layered Coating I",
|
||||
"Layered Plating II": "Layered Coating II",
|
||||
"Basic Kinetic Plating": "'Basic' Kinetic Coating",
|
||||
"Kinetic Plating I": "Kinetic Coating I",
|
||||
"Kinetic Plating II": "Kinetic Coating II",
|
||||
"Basic Thermal Plating": "'Basic' Thermal Coating",
|
||||
"Thermal Plating I": "Thermal Coating I",
|
||||
"Thermal Plating II": "Thermal Coating II",
|
||||
"Basic Adaptive Nano Plating": "'Basic' Multispectrum Coating",
|
||||
"Adaptive Nano Plating I": "Multispectrum Coating I",
|
||||
"Adaptive Nano Plating II": "Multispectrum Coating II",
|
||||
"Domination Adaptive Nano Plating": "Domination Multispectrum Coating",
|
||||
"True Sansha Adaptive Nano Plating": "True Sansha Multispectrum Coating",
|
||||
"Dark Blood Adaptive Nano Plating": "Dark Blood Multispectrum Coating",
|
||||
"Domination Kinetic Plating": "Domination Kinetic Coating",
|
||||
"True Sansha Kinetic Plating": "True Sansha Kinetic Coating",
|
||||
"Dark Blood Kinetic Plating": "Dark Blood Kinetic Coating",
|
||||
"Domination Explosive Plating": "Domination Explosive Coating",
|
||||
"True Sansha Explosive Plating": "True Sansha Explosive Coating",
|
||||
"Dark Blood Explosive Plating": "Dark Blood Explosive Coating",
|
||||
"Domination EM Plating": "Domination EM Coating",
|
||||
"True Sansha EM Plating": "True Sansha EM Coating",
|
||||
"Dark Blood EM Plating": "Dark Blood EM Coating",
|
||||
"Domination Thermal Plating": "Domination Thermal Coating",
|
||||
"True Sansha Thermal Plating": "True Sansha Thermal Coating",
|
||||
"Dark Blood Thermal Plating": "Dark Blood Thermal Coating",
|
||||
"Shadow Serpentis Adaptive Nano Plating": "Shadow Serpentis Multispectrum Coating",
|
||||
"Shadow Serpentis Kinetic Plating": "Shadow Serpentis Kinetic Coating",
|
||||
"Shadow Serpentis Explosive Plating": "Shadow Serpentis Explosive Coating",
|
||||
"Shadow Serpentis EM Plating": "Shadow Serpentis EM Coating",
|
||||
"Shadow Serpentis Thermal Plating": "Shadow Serpentis Thermal Coating",
|
||||
"Mizuro's Modified Adaptive Nano Plating": "Mizuro's Modified Multispectrum Coating",
|
||||
"Gotan's Modified Adaptive Nano Plating": "Gotan's Modified Multispectrum Coating",
|
||||
"Mizuro's Modified Kinetic Plating": "Mizuro's Modified Kinetic Coating",
|
||||
"Gotan's Modified Kinetic Plating": "Gotan's Modified Kinetic Coating",
|
||||
"Mizuro's Modified Explosive Plating": "Mizuro's Modified Explosive Coating",
|
||||
"Gotan's Modified Explosive Plating": "Gotan's Modified Explosive Coating",
|
||||
"Mizuro's Modified EM Plating": "Mizuro's Modified EM Coating",
|
||||
"Gotan's Modified EM Plating": "Gotan's Modified EM Coating",
|
||||
"Mizuro's Modified Thermal Plating": "Mizuro's Modified Thermal Coating",
|
||||
"Gotan's Modified Thermal Plating": "Gotan's Modified Thermal Coating",
|
||||
"Brokara's Modified Adaptive Nano Plating": "Brokara's Modified Multispectrum Coating",
|
||||
"Tairei's Modified Adaptive Nano Plating": "Tairei's Modified Multispectrum Coating",
|
||||
"Selynne's Modified Adaptive Nano Plating": "Selynne's Modified Multispectrum Coating",
|
||||
"Raysere's Modified Adaptive Nano Plating": "Raysere's Modified Multispectrum Coating",
|
||||
"Vizan's Modified Adaptive Nano Plating": "Vizan's Modified Multispectrum Coating",
|
||||
"Ahremen's Modified Adaptive Nano Plating": "Ahremen's Modified Multispectrum Coating",
|
||||
"Chelm's Modified Adaptive Nano Plating": "Chelm's Modified Multispectrum Coating",
|
||||
"Draclira's Modified Adaptive Nano Plating": "Draclira's Modified Multispectrum Coating",
|
||||
"Brokara's Modified Kinetic Plating": "Brokara's Modified Kinetic Coating",
|
||||
"Tairei's Modified Kinetic Plating": "Tairei's Modified Kinetic Coating",
|
||||
"Selynne's Modified Kinetic Plating": "Selynne's Modified Kinetic Coating",
|
||||
"Raysere's Modified Kinetic Plating": "Raysere's Modified Kinetic Coating",
|
||||
"Vizan's Modified Kinetic Plating": "Vizan's Modified Kinetic Coating",
|
||||
"Ahremen's Modified Kinetic Plating": "Ahremen's Modified Kinetic Coating",
|
||||
"Chelm's Modified Kinetic Plating": "Chelm's Modified Kinetic Coating",
|
||||
"Draclira's Modified Kinetic Plating": "Draclira's Modified Kinetic Coating",
|
||||
"Brokara's Modified Explosive Plating": "Brokara's Modified Explosive Coating",
|
||||
"Tairei's Modified Explosive Plating": "Tairei's Modified Explosive Coating",
|
||||
"Selynne's Modified Explosive Plating": "Selynne's Modified Explosive Coating",
|
||||
"Raysere's Modified Explosive Plating": "Raysere's Modified Explosive Coating",
|
||||
"Vizan's Modified Explosive Plating": "Vizan's Modified Explosive Coating",
|
||||
"Ahremen's Modified Explosive Plating": "Ahremen's Modified Explosive Coating",
|
||||
"Chelm's Modified Explosive Plating": "Chelm's Modified Explosive Coating",
|
||||
"Draclira's Modified Explosive Plating": "Draclira's Modified Explosive Coating",
|
||||
"Brokara's Modified EM Plating": "Brokara's Modified EM Coating",
|
||||
"Tairei's Modified EM Plating": "Tairei's Modified EM Coating",
|
||||
"Selynne's Modified EM Plating": "Selynne's Modified EM Coating",
|
||||
"Raysere's Modified EM Plating": "Raysere's Modified EM Coating",
|
||||
"Vizan's Modified EM Plating": "Vizan's Modified EM Coating",
|
||||
"Ahremen's Modified EM Plating": "Ahremen's Modified EM Coating",
|
||||
"Chelm's Modified EM Plating": "Chelm's Modified EM Coating",
|
||||
"Draclira's Modified EM Plating": "Draclira's Modified EM Coating",
|
||||
"Brokara's Modified Thermal Plating": "Brokara's Modified Thermal Coating",
|
||||
"Tairei's Modified Thermal Plating": "Tairei's Modified Thermal Coating",
|
||||
"Selynne's Modified Thermal Plating": "Selynne's Modified Thermal Coating",
|
||||
"Raysere's Modified Thermal Plating": "Raysere's Modified Thermal Coating",
|
||||
"Vizan's Modified Thermal Plating": "Vizan's Modified Thermal Coating",
|
||||
"Ahremen's Modified Thermal Plating": "Ahremen's Modified Thermal Coating",
|
||||
"Chelm's Modified Thermal Plating": "Chelm's Modified Thermal Coating",
|
||||
"Draclira's Modified Thermal Plating": "Draclira's Modified Thermal Coating",
|
||||
"Brynn's Modified Adaptive Nano Plating": "Brynn's Modified Multispectrum Coating",
|
||||
"Tuvan's Modified Adaptive Nano Plating": "Tuvan's Modified Multispectrum Coating",
|
||||
"Setele's Modified Adaptive Nano Plating": "Setele's Modified Multispectrum Coating",
|
||||
"Cormack's Modified Adaptive Nano Plating": "Cormack's Modified Multispectrum Coating",
|
||||
"Brynn's Modified Thermal Plating": "Brynn's Modified Thermal Coating",
|
||||
"Tuvan's Modified Thermal Plating": "Tuvan's Modified Thermal Coating",
|
||||
"Setele's Modified Thermal Plating": "Setele's Modified Thermal Coating",
|
||||
"Cormack's Modified Thermal Plating": "Cormack's Modified Thermal Coating",
|
||||
"Brynn's Modified EM Plating": "Brynn's Modified EM Coating",
|
||||
"Tuvan's Modified EM Plating": "Tuvan's Modified EM Coating",
|
||||
"Setele's Modified EM Plating": "Setele's Modified EM Coating",
|
||||
"Cormack's Modified EM Plating": "Cormack's Modified EM Coating",
|
||||
"Brynn's Modified Explosive Plating": "Brynn's Modified Explosive Coating",
|
||||
"Tuvan's Modified Explosive Plating": "Tuvan's Modified Explosive Coating",
|
||||
"Setele's Modified Explosive Plating": "Setele's Modified Explosive Coating",
|
||||
"Cormack's Modified Explosive Plating": "Cormack's Modified Explosive Coating",
|
||||
"Brynn's Modified Kinetic Plating": "Brynn's Modified Kinetic Coating",
|
||||
"Tuvan's Modified Kinetic Plating": "Tuvan's Modified Kinetic Coating",
|
||||
"Setele's Modified Kinetic Plating": "Setele's Modified Kinetic Coating",
|
||||
"Cormack's Modified Kinetic Plating": "Cormack's Modified Kinetic Coating",
|
||||
"Imperial Navy Thermal Plating": "Imperial Navy Thermal Coating",
|
||||
"Imperial Navy EM Plating": "Imperial Navy EM Coating",
|
||||
"Imperial Navy Explosive Plating": "Imperial Navy Explosive Coating",
|
||||
"Imperial Navy Kinetic Plating": "Imperial Navy Kinetic Coating",
|
||||
"Imperial Navy Adaptive Nano Plating": "Imperial Navy Multispectrum Coating",
|
||||
"Republic Fleet Thermal Plating": "Republic Fleet Thermal Coating",
|
||||
"Republic Fleet EM Plating": "Republic Fleet EM Coating",
|
||||
"Republic Fleet Explosive Plating": "Republic Fleet Explosive Coating",
|
||||
"Republic Fleet Kinetic Plating": "Republic Fleet Kinetic Coating",
|
||||
"Republic Fleet Adaptive Nano Plating": "Republic Fleet Multispectrum Coating",
|
||||
"Upgraded Adaptive Nano Plating I": "Upgraded Multispectrum Coating I",
|
||||
"Upgraded Kinetic Plating I": "Upgraded Kinetic Coating I",
|
||||
"Upgraded Explosive Plating I": "Upgraded Explosive Coating I",
|
||||
"Upgraded EM Plating I": "Upgraded EM Coating I",
|
||||
"Upgraded Thermal Plating I": "Upgraded Thermal Coating I",
|
||||
"Upgraded Layered Plating I": "Upgraded Layered Coating I",
|
||||
"Ammatar Navy Kinetic Plating": "Ammatar Navy Kinetic Coating",
|
||||
"Ammatar Navy Adaptive Nano Plating": "Ammatar Navy Multispectrum Coating",
|
||||
"Ammatar Navy Explosive Plating": "Ammatar Navy Explosive Coating",
|
||||
"Ammatar Navy EM Plating": "Ammatar Navy EM Coating",
|
||||
"Federation Navy Adaptive Nano Plating": "Federation Navy Multispectrum Coating",
|
||||
"Federation Navy Kinetic Plating": "Federation Navy Kinetic Coating",
|
||||
"Federation Navy Explosive Plating": "Federation Navy Explosive Coating",
|
||||
"Federation Navy EM Plating": "Federation Navy EM Coating",
|
||||
"Federation Navy Thermal Plating": "Federation Navy Thermal Coating",
|
||||
"Corpii C-Type Adaptive Nano Plating": "Corpii C-Type Multispectrum Coating",
|
||||
"Centii C-Type Adaptive Nano Plating": "Centii C-Type Multispectrum Coating",
|
||||
"Corpii B-Type Adaptive Nano Plating": "Corpii B-Type Multispectrum Coating",
|
||||
"Centii B-Type Adaptive Nano Plating": "Centii B-Type Multispectrum Coating",
|
||||
"Corpii A-Type Adaptive Nano Plating": "Corpii A-Type Multispectrum Coating",
|
||||
"Centii A-Type Adaptive Nano Plating": "Centii A-Type Multispectrum Coating",
|
||||
"Corpii C-Type Kinetic Plating": "Corpii C-Type Kinetic Coating",
|
||||
"Centii C-Type Kinetic Plating": "Centii C-Type Kinetic Coating",
|
||||
"Corpii C-Type Explosive Plating": "Corpii C-Type Explosive Coating",
|
||||
"Centii C-Type Explosive Plating": "Centii C-Type Explosive Coating",
|
||||
"Corpii C-Type EM Plating": "Corpii C-Type EM Coating",
|
||||
"Centii C-Type EM Plating": "Centii C-Type EM Coating",
|
||||
"Corpii C-Type Thermal Plating": "Corpii C-Type Thermal Coating",
|
||||
"Centii C-Type Thermal Plating": "Centii C-Type Thermal Coating",
|
||||
"Corpii B-Type Thermal Plating": "Corpii B-Type Thermal Coating",
|
||||
"Centii B-Type Thermal Plating": "Centii B-Type Thermal Coating",
|
||||
"Corpii B-Type Kinetic Plating": "Corpii B-Type Kinetic Coating",
|
||||
"Centii B-Type Kinetic Plating": "Centii B-Type Kinetic Coating",
|
||||
"Corpii B-Type Explosive Plating": "Corpii B-Type Explosive Coating",
|
||||
"Centii B-Type Explosive Plating": "Centii B-Type Explosive Coating",
|
||||
"Corpii B-Type EM Plating": "Corpii B-Type EM Coating",
|
||||
"Centii B-Type EM Plating": "Centii B-Type EM Coating",
|
||||
"Corpii A-Type Kinetic Plating": "Corpii A-Type Kinetic Coating",
|
||||
"Centii A-Type Kinetic Plating": "Centii A-Type Kinetic Coating",
|
||||
"Corpii A-Type Explosive Plating": "Corpii A-Type Explosive Coating",
|
||||
"Centii A-Type Explosive Plating": "Centii A-Type Explosive Coating",
|
||||
"Corpii A-Type EM Plating": "Corpii A-Type EM Coating",
|
||||
"Centii A-Type EM Plating": "Centii A-Type EM Coating",
|
||||
"Corpii A-Type Thermal Plating": "Corpii A-Type Thermal Coating",
|
||||
"Centii A-Type Thermal Plating": "Centii A-Type Thermal Coating",
|
||||
"Coreli C-Type Adaptive Nano Plating": "Coreli C-Type Multispectrum Coating",
|
||||
"Coreli C-Type Kinetic Plating": "Coreli C-Type Kinetic Coating",
|
||||
"Coreli C-Type Explosive Plating": "Coreli C-Type Explosive Coating",
|
||||
"Coreli C-Type EM Plating": "Coreli C-Type EM Coating",
|
||||
"Coreli C-Type Thermal Plating": "Coreli C-Type Thermal Coating",
|
||||
"Coreli B-Type Adaptive Nano Plating": "Coreli B-Type Multispectrum Coating",
|
||||
"Coreli B-Type Kinetic Plating": "Coreli B-Type Kinetic Coating",
|
||||
"Coreli B-Type Explosive Plating": "Coreli B-Type Explosive Coating",
|
||||
"Coreli B-Type EM Plating": "Coreli B-Type EM Coating",
|
||||
"Coreli B-Type Thermal Plating": "Coreli B-Type Thermal Coating",
|
||||
"Coreli A-Type Adaptive Nano Plating": "Coreli A-Type Multispectrum Coating",
|
||||
"Coreli A-Type Kinetic Plating": "Coreli A-Type Kinetic Coating",
|
||||
"Coreli A-Type Explosive Plating": "Coreli A-Type Explosive Coating",
|
||||
"Coreli A-Type EM Plating": "Coreli A-Type EM Coating",
|
||||
"Coreli A-Type Thermal Plating": "Coreli A-Type Thermal Coating",
|
||||
"Khanid Navy Adaptive Nano Plating": "Khanid Navy Multispectrum Coating",
|
||||
"Khanid Navy Kinetic Plating": "Khanid Navy Kinetic Coating",
|
||||
"Khanid Navy Explosive Plating": "Khanid Navy Explosive Coating",
|
||||
"Khanid Navy EM Plating": "Khanid Navy EM Coating",
|
||||
"Khanid Navy Thermal Plating": "Khanid Navy Thermal Coating",
|
||||
"Ammatar Navy Thermal Plating": "Ammatar Navy Thermal Coating",
|
||||
"Low-Grade Mimesis Alpha": "Low-grade Mimesis Alpha",
|
||||
"Low-Grade Mimesis Beta": "Low-grade Mimesis Beta",
|
||||
"Low-Grade Mimesis Gamma": "Low-grade Mimesis Gamma",
|
||||
"Low-Grade Mimesis Delta": "Low-grade Mimesis Delta",
|
||||
"Low-Grade Mimesis Epsilon": "Low-grade Mimesis Epsilon",
|
||||
"Low-Grade Mimesis Omega": "Low-grade Mimesis Omega",
|
||||
"Mid-Grade Mimesis Alpha": "Mid-grade Mimesis Alpha",
|
||||
"Mid-Grade Mimesis Beta": "Mid-grade Mimesis Beta",
|
||||
"Mid-Grade Mimesis Gamma": "Mid-grade Mimesis Gamma",
|
||||
"Mid-Grade Mimesis Delta": "Mid-grade Mimesis Delta",
|
||||
"Mid-Grade Mimesis Epsilon": "Mid-grade Mimesis Epsilon",
|
||||
"Mid-Grade Mimesis Omega": "Mid-grade Mimesis Omega",
|
||||
"High-Grade Mimesis Alpha": "High-grade Mimesis Alpha",
|
||||
"High-Grade Mimesis Beta": "High-grade Mimesis Beta",
|
||||
"High-Grade Mimesis Delta": "High-grade Mimesis Delta",
|
||||
"High-Grade Mimesis Epsilon": "High-grade Mimesis Epsilon",
|
||||
"High-Grade Mimesis Gamma": "High-grade Mimesis Gamma",
|
||||
"High-Grade Mimesis Omega": "High-grade Mimesis Omega",
|
||||
# Converted items
|
||||
"Limited Layered Plating I": "Upgraded Layered Coating I",
|
||||
"'Scarab' Layered Plating I": "Upgraded Layered Coating I",
|
||||
"'Grail' Layered Plating I": "Upgraded Layered Coating I",
|
||||
"Limited Adaptive Nano Plating I": "Upgraded Multispectrum Coating I",
|
||||
"'Collateral' Adaptive Nano Plating I": "Upgraded Multispectrum Coating I",
|
||||
"'Refuge' Adaptive Nano Plating I": "Upgraded Multispectrum Coating I",
|
||||
"Limited EM Plating I": "Upgraded EM Coating I",
|
||||
"'Contour' EM Plating I": "Upgraded EM Coating I",
|
||||
"'Spiegel' EM Plating I": "Upgraded EM Coating I",
|
||||
"Limited Explosive Plating I": "Upgraded Explosive Coating I",
|
||||
"Experimental Explosive Plating I": "Upgraded Explosive Coating I",
|
||||
"'Aegis' Explosive Plating I": "Upgraded Explosive Coating I",
|
||||
"Limited Kinetic Plating I": "Upgraded Kinetic Coating I",
|
||||
"Experimental Kinetic Plating I": "Upgraded Kinetic Coating I",
|
||||
"'Element' Kinetic Plating I": "Upgraded Kinetic Coating I",
|
||||
"Limited Thermal Plating I": "Upgraded Thermal Coating I",
|
||||
"Experimental Thermal Plating I": "Upgraded Thermal Coating I",
|
||||
"Prototype Thermal Plating I": "Upgraded Thermal Coating I"
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
"""
|
||||
Conversion pack for May 2020 release
|
||||
Conversion pack for June 2020 release
|
||||
"""
|
||||
|
||||
CONVERSIONS = {
|
||||
|
||||
12
service/conversions/releaseSep2020.py
Normal file
12
service/conversions/releaseSep2020.py
Normal file
@@ -0,0 +1,12 @@
|
||||
"""
|
||||
Conversion pack for September 2020 release
|
||||
"""
|
||||
|
||||
CONVERSIONS = {
|
||||
# Renamed items
|
||||
"'Stalwart' Particle Field Magnifier": "Stalwart Restrained Shield Boost Amplifier",
|
||||
"'Copasetic' Particle Field Acceleration": "Copasetic Compact Shield Boost Amplifier",
|
||||
# Converted items
|
||||
"5a Prototype Shield Support I": "Stalwart Restrained Shield Boost Amplifier",
|
||||
"Ionic Field Accelerator I": "Copasetic Compact Shield Boost Amplifier"
|
||||
}
|
||||
@@ -447,7 +447,7 @@ class Fit:
|
||||
dp = sDP.getDamagePattern("Selected Ammo")
|
||||
if dp is None:
|
||||
dp = es_DamagePattern()
|
||||
dp.name = "Selected Ammo"
|
||||
dp.rawName = "Selected Ammo"
|
||||
|
||||
fit = eos.db.getFit(fitID)
|
||||
for attr in ("em", "thermal", "kinetic", "explosive"):
|
||||
|
||||
@@ -580,13 +580,22 @@ anti\-:
|
||||
# Armor modules
|
||||
eanm:
|
||||
- 'eanm'
|
||||
- 'energized adaptive nano membrane'
|
||||
- 'multispectrum energized membrane'
|
||||
enam: # mistype of "eanm"
|
||||
- 'enam'
|
||||
- 'energized adaptive nano membrane'
|
||||
- 'multispectrum energized membrane'
|
||||
mem:
|
||||
- 'mem'
|
||||
- 'multispectrum energized membrane'
|
||||
anp:
|
||||
- 'anp'
|
||||
- 'adaptive nano plating'
|
||||
- 'multispectrum coating'
|
||||
mc:
|
||||
- 'mc'
|
||||
- 'multispectrum coating'
|
||||
plating:
|
||||
- 'plating'
|
||||
- 'coating'
|
||||
rah:
|
||||
- 'rah'
|
||||
- 'reactive armor hardener'
|
||||
@@ -618,6 +627,15 @@ laar:
|
||||
caar:
|
||||
- 'caar'
|
||||
- 'capital ancillary (.+ )?(?<!remote )armor repairer'
|
||||
25k:
|
||||
- '25k'
|
||||
- '25000'
|
||||
25kmm:
|
||||
- '25kmm'
|
||||
- '25000mm'
|
||||
25m:
|
||||
- '25m'
|
||||
- '25000mm'
|
||||
|
||||
# Hull modules
|
||||
dc:
|
||||
@@ -640,6 +658,18 @@ cehe:
|
||||
- 'capital (.+ )?emergency hull energizer'
|
||||
|
||||
# Propulsion modules and upgrades
|
||||
10k:
|
||||
- '10k'
|
||||
- '10000'
|
||||
10kmn:
|
||||
- '10kmn'
|
||||
- '10000mn'
|
||||
50k:
|
||||
- '50k'
|
||||
- '50000'
|
||||
50kmn:
|
||||
- '50kmn'
|
||||
- '50000mn'
|
||||
ab:
|
||||
- '(^| )ab' # Checking only beginning of a word to remove unwanted spam
|
||||
- 'afterburner'
|
||||
@@ -806,11 +836,11 @@ damp:
|
||||
- 'sd-\d00'
|
||||
sd:
|
||||
- '(^| )sd' # Checking only beginning of a word to remove unwanted spam
|
||||
- 'remote sensor dampener'
|
||||
- 'sensor dampener'
|
||||
- '(targeting range|scan resolution) dampening script'
|
||||
rsd:
|
||||
- 'rsd'
|
||||
- 'remote sensor dampener'
|
||||
- 'sensor dampener'
|
||||
- 'sd-\d00'
|
||||
- '(targeting range|scan resolution) dampening script'
|
||||
|
||||
|
||||
@@ -721,8 +721,9 @@ class Market:
|
||||
groupItems = set(group.items)
|
||||
if hasattr(group, 'addItems'):
|
||||
groupItems.update(group.addItems)
|
||||
items = set(
|
||||
[item for item in groupItems if self.getPublicityByItem(item) and self.getGroupByItem(item) == group])
|
||||
items = set([
|
||||
item for item in groupItems
|
||||
if self.getPublicityByItem(item) and self.getGroupByItem(item) == group])
|
||||
return items
|
||||
|
||||
def getItemsByMarketGroup(self, mg, vars_=True):
|
||||
|
||||
@@ -1 +1 @@
|
||||
__all__ = ['evemarketer', 'evepraisal', 'evemarketdata', 'fuzzwork']
|
||||
__all__ = ['evemarketer', 'evepraisal', 'evemarketdata', 'fuzzwork', 'cevemarket']
|
||||
|
||||
89
service/marketSources/cevemarket.py
Normal file
89
service/marketSources/cevemarket.py
Normal file
@@ -0,0 +1,89 @@
|
||||
# =============================================================================
|
||||
# Copyright (C) 2020 Copy Liu
|
||||
#
|
||||
# This file is part of pyfa.
|
||||
#
|
||||
# pyfa is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# pyfa is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
|
||||
# =============================================================================
|
||||
|
||||
|
||||
from xml.dom import minidom
|
||||
|
||||
from logbook import Logger
|
||||
|
||||
from eos.saveddata.price import PriceStatus
|
||||
from service.network import Network
|
||||
from service.price import Price
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
|
||||
|
||||
|
||||
class CEveMarketBase:
|
||||
|
||||
@staticmethod
|
||||
def fetchPrices(priceMap, fetchTimeout, system=None, serenity=False):
|
||||
params = {'typeid': {typeID for typeID in priceMap}}
|
||||
if system is not None:
|
||||
params['usesystem'] = system
|
||||
baseurl = 'https://www.ceve-market.org/api/marketstat' if serenity else 'https://www.ceve-market.org/tqapi/marketstat'
|
||||
network = Network.getInstance()
|
||||
data = network.get(url=baseurl, type=network.PRICES, params=params, timeout=fetchTimeout)
|
||||
xml = minidom.parseString(data.text)
|
||||
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, skip the item
|
||||
try:
|
||||
percprice = float(sell.getElementsByTagName('percentile').item(0).firstChild.data)
|
||||
except (TypeError, ValueError):
|
||||
pyfalog.warning('Failed to get price for: {0}', type_)
|
||||
continue
|
||||
if percprice == 0 and system is not None:
|
||||
continue
|
||||
priceMap[typeID].update(PriceStatus.fetchSuccess, percprice)
|
||||
del priceMap[typeID]
|
||||
|
||||
|
||||
class CEveMarketTq(CEveMarketBase):
|
||||
|
||||
name = 'ceve-market.org (Tranquility)'
|
||||
group = 'tranquility'
|
||||
|
||||
def __init__(self, priceMap, system, fetchTimeout):
|
||||
# Try selected system first
|
||||
self.fetchPrices(priceMap, max(2 * fetchTimeout / 3, 2), system, serenity=False)
|
||||
# If price was not available - try globally
|
||||
if priceMap:
|
||||
self.fetchPrices(priceMap, max(fetchTimeout / 3, 2), serenity=False)
|
||||
|
||||
|
||||
class CEveMarketCn(CEveMarketBase):
|
||||
|
||||
name = 'ceve-market.org (Serenity)'
|
||||
group = 'serenity'
|
||||
|
||||
def __init__(self, priceMap, system, fetchTimeout):
|
||||
# Try selected system first
|
||||
self.fetchPrices(priceMap, max(2 * fetchTimeout / 3, 2), system, serenity=True)
|
||||
# If price was not available - try globally
|
||||
if priceMap:
|
||||
self.fetchPrices(priceMap, max(fetchTimeout / 3, 2), serenity=True)
|
||||
|
||||
|
||||
Price.register(CEveMarketCn)
|
||||
Price.register(CEveMarketTq)
|
||||
@@ -32,6 +32,7 @@ pyfalog = Logger(__name__)
|
||||
class EveMarketData:
|
||||
|
||||
name = 'eve-marketdata.com'
|
||||
group = 'tranquility'
|
||||
|
||||
def __init__(self, priceMap, system, fetchTimeout):
|
||||
# Try selected system first
|
||||
|
||||
@@ -32,6 +32,7 @@ pyfalog = Logger(__name__)
|
||||
class EveMarketer:
|
||||
|
||||
name = 'evemarketer'
|
||||
group = 'tranquility'
|
||||
|
||||
def __init__(self, priceMap, system, fetchTimeout):
|
||||
# Try selected system first
|
||||
|
||||
@@ -38,6 +38,7 @@ systemAliases = {
|
||||
class EvePraisal:
|
||||
|
||||
name = 'evepraisal'
|
||||
group = 'tranquility'
|
||||
|
||||
def __init__(self, priceMap, system, fetchTimeout):
|
||||
# Try selected system first
|
||||
|
||||
@@ -39,6 +39,7 @@ locations = {
|
||||
class FuzzworkMarket:
|
||||
|
||||
name = 'fuzzwork market'
|
||||
group = 'tranquility'
|
||||
|
||||
def __init__(self, priceMap, system, fetchTimeout):
|
||||
# Try selected system first
|
||||
|
||||
@@ -598,7 +598,7 @@ def _importCreateFit(lines):
|
||||
"""Create fit and set top-level entity (ship or citadel)."""
|
||||
fit = Fit()
|
||||
header = lines.pop(0)
|
||||
m = re.match('\[(?P<shipType>[\w\s]+),\s*(?P<fitName>.+)\]', header)
|
||||
m = re.match('\[(?P<shipType>[^,]+),\s*(?P<fitName>.+)\]', header)
|
||||
if not m:
|
||||
pyfalog.warning('service.port.eft.importEft: corrupted fit header')
|
||||
raise EftImportError
|
||||
|
||||
@@ -56,7 +56,7 @@ INV_FLAG_DRONEBAY = 87
|
||||
INV_FLAG_FIGHTER = 158
|
||||
|
||||
|
||||
def exportESI(ofit, callback):
|
||||
def exportESI(ofit, exportCharges, callback):
|
||||
# A few notes:
|
||||
# max fit name length is 50 characters
|
||||
# Most keys are created simply because they are required, but bogus data is okay
|
||||
@@ -72,7 +72,7 @@ def exportESI(ofit, callback):
|
||||
|
||||
# 2017/03/29 NOTE: "<" or "<" is Ignored
|
||||
# fit['description'] = "<pyfa:%d />" % ofit.ID
|
||||
fit['description'] = ofit.notes[:397] + '...' if len(ofit.notes) > 400 else ofit.notes if ofit.notes is not None else ""
|
||||
fit['description'] = "" if ofit.notes is None else ofit.notes[:397] + '...' if len(ofit.notes) > 400 else ofit.notes
|
||||
fit['items'] = []
|
||||
|
||||
slotNum = {}
|
||||
@@ -99,7 +99,7 @@ def exportESI(ofit, callback):
|
||||
item['type_id'] = module.item.ID
|
||||
fit['items'].append(item)
|
||||
|
||||
if module.charge:
|
||||
if module.charge and exportCharges:
|
||||
if module.chargeID not in charges:
|
||||
charges[module.chargeID] = 0
|
||||
# `or 1` because some charges (ie scripts) are without qty
|
||||
|
||||
@@ -314,8 +314,8 @@ class Port:
|
||||
return importESI(string)
|
||||
|
||||
@staticmethod
|
||||
def exportESI(fit, callback=None):
|
||||
return exportESI(fit, callback=callback)
|
||||
def exportESI(fit, exportCharges, callback=None):
|
||||
return exportESI(fit, exportCharges, callback=callback)
|
||||
|
||||
# XML-related methods
|
||||
@staticmethod
|
||||
|
||||
@@ -106,6 +106,9 @@ class Price:
|
||||
# attempt to find user's selected price source, otherwise get first one
|
||||
sourceAll = list(cls.sources.keys())
|
||||
sourcePrimary = sFit.serviceFittingOptions["priceSource"] if sFit.serviceFittingOptions["priceSource"] in sourceAll else sourceAll[0]
|
||||
# When we have picked primary source, make sure to include only sources from the same group to avoid fetching
|
||||
# tranquility data for serenity or vice versa
|
||||
sourceAll = list(n for n, s in cls.sources.items() if s.group == cls.sources[sourcePrimary].group)
|
||||
|
||||
# Format: {source name: timeout weight}
|
||||
sources = {sourcePrimary: len(sourceAll)}
|
||||
@@ -273,4 +276,4 @@ class PriceWorkerThread(threading.Thread):
|
||||
|
||||
|
||||
# Import market sources only to initialize price source modules, they register on their own
|
||||
from service.marketSources import evemarketer, evemarketdata, evepraisal, fuzzwork # noqa: E402
|
||||
from service.marketSources import evemarketer, evemarketdata, evepraisal, fuzzwork, cevemarket # noqa: E402
|
||||
|
||||
@@ -370,7 +370,8 @@ class EsiSettings:
|
||||
"loginMode": 0,
|
||||
"clientID": "",
|
||||
"clientSecret": "",
|
||||
"timeout": 60}
|
||||
"timeout": 60,
|
||||
"exportCharges": True}
|
||||
|
||||
self.settings = SettingsProvider.getInstance().getSettings(
|
||||
"pyfaServiceEsiSettings",
|
||||
|
||||
@@ -7353,8 +7353,7 @@
|
||||
"displayName": "Meta Level",
|
||||
"displayNameID": 233633,
|
||||
"highIsGood": 1,
|
||||
"iconID": 0,
|
||||
"name": "metaLevel",
|
||||
"name": "metaLevelOld",
|
||||
"published": 1,
|
||||
"stackable": 1,
|
||||
"unitID": 140
|
||||
@@ -25853,7 +25852,7 @@
|
||||
"displayName": "Missile Damage Bonus",
|
||||
"displayNameID": 311932,
|
||||
"highIsGood": 1,
|
||||
"iconID": 0,
|
||||
"iconID": 1397,
|
||||
"name": "siegeMissileDamageBonus",
|
||||
"published": 1,
|
||||
"stackable": 1,
|
||||
@@ -26320,7 +26319,7 @@
|
||||
"displayName": "Armor Repairer / Shield Booster Duration Bonus",
|
||||
"displayNameID": 312084,
|
||||
"highIsGood": 1,
|
||||
"iconID": 0,
|
||||
"iconID": 2104,
|
||||
"name": "siegeLocalLogisticsDurationBonus",
|
||||
"published": 1,
|
||||
"stackable": 1,
|
||||
@@ -26335,7 +26334,7 @@
|
||||
"displayName": "Armor Repairer / Shield Booster Amount Bonus",
|
||||
"displayNameID": 312085,
|
||||
"highIsGood": 1,
|
||||
"iconID": 0,
|
||||
"iconID": 2104,
|
||||
"name": "siegeLocalLogisticsAmountBonus",
|
||||
"published": 1,
|
||||
"stackable": 1,
|
||||
@@ -32497,6 +32496,46 @@
|
||||
"published": 0,
|
||||
"stackable": 1
|
||||
},
|
||||
"3050": {
|
||||
"attributeID": 3050,
|
||||
"dataType": 4,
|
||||
"defaultValue": 2.0,
|
||||
"description": "The amount of fleets needed for a single pvp filament match ",
|
||||
"highIsGood": 0,
|
||||
"name": "AmountOfFleetsPerMatch",
|
||||
"published": 0,
|
||||
"stackable": 0
|
||||
},
|
||||
"3051": {
|
||||
"attributeID": 3051,
|
||||
"categoryID": 17,
|
||||
"dataType": 5,
|
||||
"defaultValue": 1000.0,
|
||||
"description": "The range players in fleet need to be within fleet member doing an action",
|
||||
"displayName": "Area Effect Radius",
|
||||
"displayNameID": 564554,
|
||||
"highIsGood": 1,
|
||||
"iconID": 1391,
|
||||
"name": "FleetMemberPickupRadius",
|
||||
"published": 1,
|
||||
"stackable": 1,
|
||||
"tooltipTitleID": 564555,
|
||||
"unitID": 1
|
||||
},
|
||||
"3052": {
|
||||
"attributeID": 3052,
|
||||
"categoryID": 17,
|
||||
"dataType": 4,
|
||||
"defaultValue": 1.0,
|
||||
"description": "Amount of players in fleet needed to be valid",
|
||||
"displayName": "Number Of Ships required",
|
||||
"displayNameID": 564556,
|
||||
"highIsGood": 1,
|
||||
"iconID": 1391,
|
||||
"name": "FleetMembersNeeded",
|
||||
"published": 1,
|
||||
"stackable": 1
|
||||
},
|
||||
"3093": {
|
||||
"attributeID": 3093,
|
||||
"dataType": 4,
|
||||
@@ -32506,5 +32545,50 @@
|
||||
"name": "showSystemInfoBubble",
|
||||
"published": 0,
|
||||
"stackable": 0
|
||||
},
|
||||
"3095": {
|
||||
"attributeID": 3095,
|
||||
"categoryID": 7,
|
||||
"dataType": 5,
|
||||
"defaultValue": 0.0,
|
||||
"displayName": "Probe Strength Bonus",
|
||||
"displayNameID": 568981,
|
||||
"highIsGood": 1,
|
||||
"name": "scanProbeStrengthBonus",
|
||||
"published": 1,
|
||||
"stackable": 0,
|
||||
"unitID": 105
|
||||
},
|
||||
"3098": {
|
||||
"attributeID": 3098,
|
||||
"dataType": 5,
|
||||
"defaultValue": 0.0,
|
||||
"highIsGood": 0,
|
||||
"name": "armorRepairDurationBonus",
|
||||
"published": 0,
|
||||
"stackable": 0
|
||||
},
|
||||
"3099": {
|
||||
"attributeID": 3099,
|
||||
"dataType": 5,
|
||||
"defaultValue": 0.0,
|
||||
"highIsGood": 0,
|
||||
"name": "shieldBoosterDurationBonus",
|
||||
"published": 0,
|
||||
"stackable": 0
|
||||
},
|
||||
"3101": {
|
||||
"attributeID": 3101,
|
||||
"categoryID": 1,
|
||||
"dataType": 11,
|
||||
"defaultValue": 0.0,
|
||||
"description": "Describes which type of deed fits in this structure",
|
||||
"displayName": "Quantum Core Type",
|
||||
"displayNameID": 569361,
|
||||
"highIsGood": 0,
|
||||
"name": "structureRequiresDeedType",
|
||||
"published": 1,
|
||||
"stackable": 0,
|
||||
"unitID": 116
|
||||
}
|
||||
}
|
||||
@@ -40835,8 +40835,6 @@
|
||||
"rangeChance": 0
|
||||
},
|
||||
"5229": {
|
||||
"description": "Automatically generated effect",
|
||||
"descriptionID": 286583,
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 5229,
|
||||
@@ -44807,7 +44805,7 @@
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 5503,
|
||||
"effectName": "eliteBonusCommandShipHeavyDroneTrackingCS2",
|
||||
"effectName": "eliteBonusCommandShipDroneTrackingCS2",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
@@ -44819,7 +44817,7 @@
|
||||
"modifiedAttributeID": 160,
|
||||
"modifyingAttributeID": 999,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3441
|
||||
"skillTypeID": 3436
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
@@ -77788,9 +77786,8 @@
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 7,
|
||||
"effectID": 7237,
|
||||
"effectName": "\tsystemWarpSpeed",
|
||||
"effectName": "systemWarpSpeedBonus",
|
||||
"electronicChance": 0,
|
||||
"guid": "",
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
@@ -79064,5 +79061,487 @@
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8068": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 8068,
|
||||
"effectName": "shipShieldResistanceBonusMBC1",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "ItemModifier",
|
||||
"modifiedAttributeID": 271,
|
||||
"modifyingAttributeID": 748,
|
||||
"operation": 6
|
||||
},
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "ItemModifier",
|
||||
"modifiedAttributeID": 274,
|
||||
"modifyingAttributeID": 748,
|
||||
"operation": 6
|
||||
},
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "ItemModifier",
|
||||
"modifiedAttributeID": 272,
|
||||
"modifyingAttributeID": 748,
|
||||
"operation": 6
|
||||
},
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "ItemModifier",
|
||||
"modifiedAttributeID": 273,
|
||||
"modifyingAttributeID": 748,
|
||||
"operation": 6
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8070": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 8070,
|
||||
"effectName": "eliteBonusCommandShipsHeavyHAMvelocityCS2",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "charID",
|
||||
"func": "OwnerRequiredSkillModifier",
|
||||
"modifiedAttributeID": 37,
|
||||
"modifyingAttributeID": 999,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3324
|
||||
},
|
||||
{
|
||||
"domain": "charID",
|
||||
"func": "OwnerRequiredSkillModifier",
|
||||
"modifiedAttributeID": 37,
|
||||
"modifyingAttributeID": 999,
|
||||
"operation": 6,
|
||||
"skillTypeID": 25719
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8071": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 8071,
|
||||
"effectName": " eliteBonusCommandShipDroneRangeCS1",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "charID",
|
||||
"func": "OwnerRequiredSkillModifier",
|
||||
"modifiedAttributeID": 54,
|
||||
"modifyingAttributeID": 1000,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3436
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8072": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 8072,
|
||||
"effectName": "shipArmorResistanceBonusGBC2",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "ItemModifier",
|
||||
"modifiedAttributeID": 267,
|
||||
"modifyingAttributeID": 746,
|
||||
"operation": 6
|
||||
},
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "ItemModifier",
|
||||
"modifiedAttributeID": 270,
|
||||
"modifyingAttributeID": 746,
|
||||
"operation": 6
|
||||
},
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "ItemModifier",
|
||||
"modifiedAttributeID": 268,
|
||||
"modifyingAttributeID": 746,
|
||||
"operation": 6
|
||||
},
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "ItemModifier",
|
||||
"modifiedAttributeID": 269,
|
||||
"modifyingAttributeID": 746,
|
||||
"operation": 6
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8073": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 8073,
|
||||
"effectName": "eliteBonusCommandShipShieldHPCS1",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "ItemModifier",
|
||||
"modifiedAttributeID": 263,
|
||||
"modifyingAttributeID": 1000,
|
||||
"operation": 6
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8074": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 0,
|
||||
"effectID": 8074,
|
||||
"effectName": "shipBonusPC2maxRange",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 54,
|
||||
"modifyingAttributeID": 2765,
|
||||
"operation": 6,
|
||||
"skillTypeID": 47871
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8075": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 7,
|
||||
"effectID": 8075,
|
||||
"effectName": "systemHullEmResistance",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "ItemModifier",
|
||||
"modifiedAttributeID": 113,
|
||||
"modifyingAttributeID": 984,
|
||||
"operation": 6
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8076": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 7,
|
||||
"effectID": 8076,
|
||||
"effectName": "systemHullThermalResistance",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "ItemModifier",
|
||||
"modifiedAttributeID": 110,
|
||||
"modifyingAttributeID": 987,
|
||||
"operation": 6
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8077": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 7,
|
||||
"effectID": 8077,
|
||||
"effectName": "systemHullKineticResistance",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "ItemModifier",
|
||||
"modifiedAttributeID": 109,
|
||||
"modifyingAttributeID": 986,
|
||||
"operation": 6
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8078": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 7,
|
||||
"effectID": 8078,
|
||||
"effectName": "systemHullExplosiveResistance",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "ItemModifier",
|
||||
"modifiedAttributeID": 111,
|
||||
"modifyingAttributeID": 985,
|
||||
"operation": 6
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8079": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 7,
|
||||
"effectID": 8079,
|
||||
"effectName": "systemVirusCoherenceBonus",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 1909,
|
||||
"modifyingAttributeID": 1915,
|
||||
"operation": 2,
|
||||
"skillTypeID": 13278
|
||||
},
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 1909,
|
||||
"modifyingAttributeID": 1915,
|
||||
"operation": 2,
|
||||
"skillTypeID": 21718
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8080": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 7,
|
||||
"effectID": 8080,
|
||||
"effectName": "systemProbeStrengthBonus",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "charID",
|
||||
"func": "OwnerRequiredSkillModifier",
|
||||
"modifiedAttributeID": 1371,
|
||||
"modifyingAttributeID": 3095,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3412
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8081": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 7,
|
||||
"effectID": 8081,
|
||||
"effectName": "systemDisallowCloaking",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "ItemModifier",
|
||||
"modifiedAttributeID": 2454,
|
||||
"modifyingAttributeID": 2454,
|
||||
"operation": 2
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8082": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 7,
|
||||
"effectID": 8082,
|
||||
"effectName": "systemScanResolutionBonus",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "ItemModifier",
|
||||
"modifiedAttributeID": 564,
|
||||
"modifyingAttributeID": 566,
|
||||
"operation": 6
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8083": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 7,
|
||||
"effectID": 8083,
|
||||
"effectName": "systemArmorRepairerDurationBonus",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 73,
|
||||
"modifyingAttributeID": 3098,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3393
|
||||
},
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 73,
|
||||
"modifyingAttributeID": 3098,
|
||||
"operation": 6,
|
||||
"skillTypeID": 21803
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8084": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 7,
|
||||
"effectID": 8084,
|
||||
"effectName": "systemShieldBoosterDurationBonus",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 73,
|
||||
"modifyingAttributeID": 3099,
|
||||
"operation": 6,
|
||||
"skillTypeID": 3416
|
||||
},
|
||||
{
|
||||
"domain": "shipID",
|
||||
"func": "LocationRequiredSkillModifier",
|
||||
"modifiedAttributeID": 73,
|
||||
"modifyingAttributeID": 3099,
|
||||
"operation": 6,
|
||||
"skillTypeID": 21802
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8085": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"effectCategory": 7,
|
||||
"effectID": 8085,
|
||||
"effectName": "systemFighterExplosionRadius",
|
||||
"electronicChance": 0,
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 0,
|
||||
"isWarpSafe": 0,
|
||||
"modifierInfo": [
|
||||
{
|
||||
"domain": "charID",
|
||||
"func": "OwnerRequiredSkillModifier",
|
||||
"modifiedAttributeID": 2234,
|
||||
"modifyingAttributeID": 1967,
|
||||
"operation": 4,
|
||||
"skillTypeID": 23069
|
||||
},
|
||||
{
|
||||
"domain": "charID",
|
||||
"func": "OwnerRequiredSkillModifier",
|
||||
"modifiedAttributeID": 2125,
|
||||
"modifyingAttributeID": 1967,
|
||||
"operation": 4,
|
||||
"skillTypeID": 23069
|
||||
}
|
||||
],
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeChance": 0
|
||||
},
|
||||
"8088": {
|
||||
"disallowAutoRepeat": 0,
|
||||
"dischargeAttributeID": 6,
|
||||
"distribution": 2,
|
||||
"durationAttributeID": 51,
|
||||
"effectCategory": 2,
|
||||
"effectID": 8088,
|
||||
"effectName": "EntityChainLightning",
|
||||
"electronicChance": 0,
|
||||
"guid": "effects.AttackMode",
|
||||
"isAssistance": 0,
|
||||
"isOffensive": 1,
|
||||
"isWarpSafe": 0,
|
||||
"propulsionChance": 0,
|
||||
"published": 0,
|
||||
"rangeAttributeID": 54,
|
||||
"rangeChance": 0
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2519,20 +2519,20 @@
|
||||
"parentGroupID": 14
|
||||
},
|
||||
"540": {
|
||||
"description": "Mechanically enhanced armor plating augmentation.",
|
||||
"description": "Armor Resistance Coatings",
|
||||
"descriptionID": 64722,
|
||||
"hasTypes": 0,
|
||||
"iconID": 1030,
|
||||
"name": "Resistance Plating",
|
||||
"name": "Armor Resistance Coatings",
|
||||
"nameID": 65796,
|
||||
"parentGroupID": 14
|
||||
},
|
||||
"541": {
|
||||
"description": "An advanced form of mechanically enhanced armor plating upgrades.",
|
||||
"description": "Energized Armor Resistance Membranes",
|
||||
"descriptionID": 64723,
|
||||
"hasTypes": 0,
|
||||
"iconID": 2066,
|
||||
"name": "Energized Plating",
|
||||
"name": "Energized Armor Resistance Membranes",
|
||||
"nameID": 65797,
|
||||
"parentGroupID": 14
|
||||
},
|
||||
@@ -9051,20 +9051,20 @@
|
||||
"parentGroupID": 214
|
||||
},
|
||||
"1543": {
|
||||
"description": "Blueprints for Energized Plating",
|
||||
"description": "Blueprints for Energized Armor Membranes",
|
||||
"descriptionID": 281321,
|
||||
"hasTypes": 1,
|
||||
"iconID": 2703,
|
||||
"name": "Energized Plating",
|
||||
"name": "Energized Armor Membranes",
|
||||
"nameID": 281320,
|
||||
"parentGroupID": 214
|
||||
},
|
||||
"1544": {
|
||||
"description": "Blueprints for Resistance Plating",
|
||||
"description": "Blueprints for Armor Coatings",
|
||||
"descriptionID": 281323,
|
||||
"hasTypes": 1,
|
||||
"iconID": 2703,
|
||||
"name": "Resistance Plating",
|
||||
"name": "Armor Coatings",
|
||||
"nameID": 281322,
|
||||
"parentGroupID": 214
|
||||
},
|
||||
@@ -9856,56 +9856,56 @@
|
||||
"parentGroupID": 1659
|
||||
},
|
||||
"1665": {
|
||||
"description": "Thermal Resistance Plating",
|
||||
"description": "Thermal Coatings",
|
||||
"descriptionID": 285353,
|
||||
"hasTypes": 1,
|
||||
"iconID": 1394,
|
||||
"name": "Thermal Resistance Plating",
|
||||
"name": "Thermal Coatings",
|
||||
"nameID": 285352,
|
||||
"parentGroupID": 540
|
||||
},
|
||||
"1666": {
|
||||
"description": "Kinetic Resistance Plating",
|
||||
"description": "Kinetic Coatings",
|
||||
"descriptionID": 285355,
|
||||
"hasTypes": 1,
|
||||
"iconID": 1393,
|
||||
"name": "Kinetic Resistance Plating",
|
||||
"name": "Kinetic Coatings",
|
||||
"nameID": 285354,
|
||||
"parentGroupID": 540
|
||||
},
|
||||
"1667": {
|
||||
"description": "Explosive Resistance Plating",
|
||||
"description": "Explosive Coatings",
|
||||
"descriptionID": 285357,
|
||||
"hasTypes": 1,
|
||||
"iconID": 1395,
|
||||
"name": "Explosive Resistance Plating",
|
||||
"name": "Explosive Coatings",
|
||||
"nameID": 285356,
|
||||
"parentGroupID": 540
|
||||
},
|
||||
"1668": {
|
||||
"description": "EM Resistance Plating",
|
||||
"description": "EM Coatings",
|
||||
"descriptionID": 285359,
|
||||
"hasTypes": 1,
|
||||
"iconID": 1396,
|
||||
"name": "EM Resistance Plating",
|
||||
"name": "EM Coatings",
|
||||
"nameID": 285358,
|
||||
"parentGroupID": 540
|
||||
},
|
||||
"1669": {
|
||||
"description": "Layered Plating",
|
||||
"description": "Layered Armor Coatings",
|
||||
"descriptionID": 285361,
|
||||
"hasTypes": 1,
|
||||
"iconID": 1030,
|
||||
"name": "Layered Plating",
|
||||
"name": "Layered Armor Coatings",
|
||||
"nameID": 285360,
|
||||
"parentGroupID": 14
|
||||
},
|
||||
"1670": {
|
||||
"description": "Adaptive Resistance Plating",
|
||||
"description": "Multispectrum Coatings",
|
||||
"descriptionID": 285363,
|
||||
"hasTypes": 1,
|
||||
"iconID": 1030,
|
||||
"name": "Adaptive Resistance Plating",
|
||||
"name": "Multispectrum Coatings",
|
||||
"nameID": 285362,
|
||||
"parentGroupID": 540
|
||||
},
|
||||
@@ -9989,56 +9989,56 @@
|
||||
"parentGroupID": 535
|
||||
},
|
||||
"1682": {
|
||||
"description": "Energized Explosive Plating",
|
||||
"description": "Explosive Energized Membranes",
|
||||
"descriptionID": 285386,
|
||||
"hasTypes": 1,
|
||||
"iconID": 1395,
|
||||
"name": "Energized Explosive Plating",
|
||||
"name": "Explosive Energized Membranes",
|
||||
"nameID": 285385,
|
||||
"parentGroupID": 541
|
||||
},
|
||||
"1683": {
|
||||
"description": "Energized Thermal Plating",
|
||||
"description": "Thermal Energized Membranes",
|
||||
"descriptionID": 285388,
|
||||
"hasTypes": 1,
|
||||
"iconID": 1394,
|
||||
"name": "Energized Thermal Plating",
|
||||
"name": "Thermal Energized Membranes",
|
||||
"nameID": 285387,
|
||||
"parentGroupID": 541
|
||||
},
|
||||
"1684": {
|
||||
"description": "Energized EM Plating",
|
||||
"description": "EM Energized Membranes",
|
||||
"descriptionID": 285390,
|
||||
"hasTypes": 1,
|
||||
"iconID": 1396,
|
||||
"name": "Energized EM Plating",
|
||||
"name": "EM Energized Membranes",
|
||||
"nameID": 285389,
|
||||
"parentGroupID": 541
|
||||
},
|
||||
"1685": {
|
||||
"description": "Energized Kinetic Plating",
|
||||
"description": "Kinetic Energized Membranes",
|
||||
"descriptionID": 285392,
|
||||
"hasTypes": 1,
|
||||
"iconID": 1393,
|
||||
"name": "Energized Kinetic Plating",
|
||||
"name": "Kinetic Energized Membranes",
|
||||
"nameID": 285391,
|
||||
"parentGroupID": 541
|
||||
},
|
||||
"1686": {
|
||||
"description": "Energized Adaptive Plating",
|
||||
"description": "Multispectrum Energized Membranes",
|
||||
"descriptionID": 285394,
|
||||
"hasTypes": 1,
|
||||
"iconID": 2066,
|
||||
"name": "Energized Adaptive Plating",
|
||||
"name": "Multispectrum Energized Membranes",
|
||||
"nameID": 285393,
|
||||
"parentGroupID": 541
|
||||
},
|
||||
"1687": {
|
||||
"description": "Energized Armor Layering",
|
||||
"description": "Layered Energized Armor Membranes",
|
||||
"descriptionID": 285396,
|
||||
"hasTypes": 1,
|
||||
"iconID": 2066,
|
||||
"name": "Energized Armor Layering",
|
||||
"name": "Layered Energized Armor Membranes",
|
||||
"nameID": 285395,
|
||||
"parentGroupID": 14
|
||||
},
|
||||
@@ -15477,10 +15477,10 @@
|
||||
"parentGroupID": 1031
|
||||
},
|
||||
"2480": {
|
||||
"description": "Data found in Abyssal Deadspace",
|
||||
"description": "Triglavian Data Storage Devices",
|
||||
"descriptionID": 317920,
|
||||
"hasTypes": 1,
|
||||
"iconID": 2037,
|
||||
"iconID": 21982,
|
||||
"name": "Triglavian Data",
|
||||
"nameID": 317919,
|
||||
"parentGroupID": 19
|
||||
@@ -16173,5 +16173,63 @@
|
||||
"name": "Large",
|
||||
"nameID": 564569,
|
||||
"parentGroupID": 2741
|
||||
},
|
||||
"2747": {
|
||||
"description": "Filaments that connect to the Abyssal Proving Grounds for limited time PVP events.",
|
||||
"descriptionID": 567625,
|
||||
"hasTypes": 1,
|
||||
"iconID": 21925,
|
||||
"name": "Proving Ground Filaments",
|
||||
"nameID": 567624,
|
||||
"parentGroupID": 2456
|
||||
},
|
||||
"2749": {
|
||||
"description": "Quantum Cores are FTL communications facillities vital to the efficient operation of Upwell structures.",
|
||||
"descriptionID": 569752,
|
||||
"hasTypes": 1,
|
||||
"iconID": 21729,
|
||||
"name": "Quantum Cores",
|
||||
"nameID": 569644,
|
||||
"parentGroupID": 2202
|
||||
},
|
||||
"2750": {
|
||||
"description": "Capital Astronautic Mutaplasmids",
|
||||
"descriptionID": 569939,
|
||||
"hasTypes": 1,
|
||||
"name": "Capital Astronautic Mutaplasmids",
|
||||
"nameID": 569938,
|
||||
"parentGroupID": 2439
|
||||
},
|
||||
"2751": {
|
||||
"description": "Capital Armor Mutaplasmids",
|
||||
"descriptionID": 569941,
|
||||
"hasTypes": 1,
|
||||
"name": "Capital Armor Mutaplasmids",
|
||||
"nameID": 569940,
|
||||
"parentGroupID": 2437
|
||||
},
|
||||
"2752": {
|
||||
"description": "Capital Shield Mutaplasmids",
|
||||
"descriptionID": 569944,
|
||||
"hasTypes": 1,
|
||||
"name": "Capital Shield Mutaplasmids",
|
||||
"nameID": 569943,
|
||||
"parentGroupID": 2438
|
||||
},
|
||||
"2753": {
|
||||
"description": "Capital Engineering Mutaplasmids",
|
||||
"descriptionID": 569946,
|
||||
"hasTypes": 1,
|
||||
"name": "Capital Engineering Mutaplasmids",
|
||||
"nameID": 569945,
|
||||
"parentGroupID": 2440
|
||||
},
|
||||
"2754": {
|
||||
"description": "Siege Module Mutaplasmids",
|
||||
"descriptionID": 569952,
|
||||
"hasTypes": 1,
|
||||
"name": "Siege Module Mutaplasmids",
|
||||
"nameID": 569951,
|
||||
"parentGroupID": 2512
|
||||
}
|
||||
}
|
||||
@@ -728,7 +728,7 @@
|
||||
"3394": 4
|
||||
},
|
||||
"1292": {
|
||||
"3392": 1
|
||||
"3392": 2
|
||||
},
|
||||
"1294": {
|
||||
"3394": 1
|
||||
@@ -19957,6 +19957,21 @@
|
||||
"33529": {
|
||||
"3411": 5
|
||||
},
|
||||
"33530": {
|
||||
"21718": 1
|
||||
},
|
||||
"33531": {
|
||||
"21718": 1
|
||||
},
|
||||
"33532": {
|
||||
"21718": 1
|
||||
},
|
||||
"33533": {
|
||||
"21718": 1
|
||||
},
|
||||
"33534": {
|
||||
"21718": 1
|
||||
},
|
||||
"33553": {
|
||||
"3332": 2,
|
||||
"3335": 2
|
||||
@@ -25573,5 +25588,133 @@
|
||||
},
|
||||
"55700": {
|
||||
"3402": 1
|
||||
},
|
||||
"55747": {
|
||||
"3402": 1
|
||||
},
|
||||
"55803": {
|
||||
"3402": 1
|
||||
},
|
||||
"55804": {
|
||||
"3402": 1
|
||||
},
|
||||
"55805": {
|
||||
"3402": 1
|
||||
},
|
||||
"55806": {
|
||||
"3402": 1
|
||||
},
|
||||
"55826": {
|
||||
"3402": 1
|
||||
},
|
||||
"55859": {
|
||||
"3402": 1
|
||||
},
|
||||
"55860": {
|
||||
"3394": 3
|
||||
},
|
||||
"55862": {
|
||||
"3394": 3
|
||||
},
|
||||
"55927": {
|
||||
"3402": 1
|
||||
},
|
||||
"55928": {
|
||||
"3402": 1
|
||||
},
|
||||
"55929": {
|
||||
"3402": 1
|
||||
},
|
||||
"55942": {
|
||||
"3402": 1
|
||||
},
|
||||
"55943": {
|
||||
"3402": 1
|
||||
},
|
||||
"55944": {
|
||||
"3402": 1
|
||||
},
|
||||
"55945": {
|
||||
"3402": 1
|
||||
},
|
||||
"55946": {
|
||||
"3402": 1
|
||||
},
|
||||
"55947": {
|
||||
"3402": 1
|
||||
},
|
||||
"55977": {
|
||||
"3402": 1
|
||||
},
|
||||
"56128": {
|
||||
"3402": 1
|
||||
},
|
||||
"56129": {
|
||||
"3402": 1
|
||||
},
|
||||
"56130": {
|
||||
"3402": 1
|
||||
},
|
||||
"56179": {
|
||||
"3402": 1
|
||||
},
|
||||
"56180": {
|
||||
"3402": 1
|
||||
},
|
||||
"56181": {
|
||||
"3402": 1
|
||||
},
|
||||
"56182": {
|
||||
"3402": 1
|
||||
},
|
||||
"56183": {
|
||||
"3402": 1
|
||||
},
|
||||
"56184": {
|
||||
"3402": 1
|
||||
},
|
||||
"56185": {
|
||||
"3402": 1
|
||||
},
|
||||
"56186": {
|
||||
"3402": 1
|
||||
},
|
||||
"56187": {
|
||||
"3402": 1
|
||||
},
|
||||
"56303": {
|
||||
"3435": 5,
|
||||
"3449": 5
|
||||
},
|
||||
"56304": {
|
||||
"3435": 5
|
||||
},
|
||||
"56305": {
|
||||
"3450": 4
|
||||
},
|
||||
"56306": {
|
||||
"3454": 4
|
||||
},
|
||||
"56307": {
|
||||
"21803": 4
|
||||
},
|
||||
"56308": {
|
||||
"3392": 3,
|
||||
"21803": 1
|
||||
},
|
||||
"56309": {
|
||||
"21802": 4
|
||||
},
|
||||
"56310": {
|
||||
"21802": 4
|
||||
},
|
||||
"56311": {
|
||||
"3423": 5
|
||||
},
|
||||
"56312": {
|
||||
"3423": 5
|
||||
},
|
||||
"56313": {
|
||||
"22043": 1
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1373,39 +1373,33 @@
|
||||
},
|
||||
"80": {
|
||||
"aggregateMode": "Minimum",
|
||||
"developerDescription": "AOE_Beacon_caustic_cloud_local_repair",
|
||||
"displayName": "Local Armor Repairer penalty",
|
||||
"developerDescription": "AOE_Beacon_caustic_cloud_inertia",
|
||||
"displayName": "Inertia Bonus",
|
||||
"displayNameID": 532902,
|
||||
"itemModifiers": [],
|
||||
"locationGroupModifiers": [],
|
||||
"locationModifiers": [],
|
||||
"locationRequiredSkillModifiers": [
|
||||
"itemModifiers": [
|
||||
{
|
||||
"dogmaAttributeID": 84,
|
||||
"skillID": 3393
|
||||
"dogmaAttributeID": 70
|
||||
}
|
||||
],
|
||||
"locationGroupModifiers": [],
|
||||
"locationModifiers": [],
|
||||
"locationRequiredSkillModifiers": [],
|
||||
"operationName": "PostPercent",
|
||||
"showOutputValueInUI": "ShowNormal"
|
||||
},
|
||||
"81": {
|
||||
"aggregateMode": "Minimum",
|
||||
"developerDescription": "AOE_Beacon_caustic_cloud_remote_repair",
|
||||
"displayName": "Remote Armor Repairer penalty",
|
||||
"developerDescription": "AOE_Beacon_caustic_cloud_velocity",
|
||||
"displayName": "Max Velocity Bonus",
|
||||
"displayNameID": 532901,
|
||||
"itemModifiers": [
|
||||
{
|
||||
"dogmaAttributeID": 84
|
||||
"dogmaAttributeID": 37
|
||||
}
|
||||
],
|
||||
"locationGroupModifiers": [],
|
||||
"locationModifiers": [],
|
||||
"locationRequiredSkillModifiers": [
|
||||
{
|
||||
"dogmaAttributeID": 84,
|
||||
"skillID": 16069
|
||||
}
|
||||
],
|
||||
"locationRequiredSkillModifiers": [],
|
||||
"operationName": "PostPercent",
|
||||
"showOutputValueInUI": "ShowNormal"
|
||||
},
|
||||
|
||||
@@ -4646,7 +4646,7 @@
|
||||
"groupName": "Money",
|
||||
"groupNameID": 63592,
|
||||
"iconID": 21,
|
||||
"published": false,
|
||||
"published": true,
|
||||
"useBasePrice": false
|
||||
},
|
||||
"170": {
|
||||
@@ -7177,7 +7177,7 @@
|
||||
"groupName": "Triglavian Data",
|
||||
"groupNameID": 536625,
|
||||
"published": true,
|
||||
"useBasePrice": false
|
||||
"useBasePrice": true
|
||||
},
|
||||
"1996": {
|
||||
"anchorable": false,
|
||||
@@ -8450,7 +8450,7 @@
|
||||
"categoryID": 7,
|
||||
"fittableNonSingleton": false,
|
||||
"groupID": 326,
|
||||
"groupName": "Armor Plating Energized",
|
||||
"groupName": "Energized Armor Membrane",
|
||||
"groupNameID": 63791,
|
||||
"iconID": 0,
|
||||
"published": true,
|
||||
@@ -9567,6 +9567,17 @@
|
||||
"published": false,
|
||||
"useBasePrice": false
|
||||
},
|
||||
"4050": {
|
||||
"anchorable": false,
|
||||
"anchored": false,
|
||||
"categoryID": 17,
|
||||
"fittableNonSingleton": false,
|
||||
"groupID": 4050,
|
||||
"groupName": "Abyssal Proving Filaments",
|
||||
"groupNameID": 559431,
|
||||
"published": true,
|
||||
"useBasePrice": false
|
||||
},
|
||||
"4052": {
|
||||
"anchorable": false,
|
||||
"anchored": false,
|
||||
@@ -9631,7 +9642,7 @@
|
||||
"groupID": 4060,
|
||||
"groupName": "Vorton Projector",
|
||||
"groupNameID": 563701,
|
||||
"published": false,
|
||||
"published": true,
|
||||
"useBasePrice": false
|
||||
},
|
||||
"4061": {
|
||||
@@ -9642,7 +9653,7 @@
|
||||
"groupID": 4061,
|
||||
"groupName": "Advanced Condenser Pack",
|
||||
"groupNameID": 563793,
|
||||
"published": false,
|
||||
"published": true,
|
||||
"useBasePrice": false
|
||||
},
|
||||
"4062": {
|
||||
@@ -9653,7 +9664,7 @@
|
||||
"groupID": 4062,
|
||||
"groupName": "Condenser Pack",
|
||||
"groupNameID": 563792,
|
||||
"published": false,
|
||||
"published": true,
|
||||
"useBasePrice": false
|
||||
},
|
||||
"4064": {
|
||||
@@ -9664,7 +9675,7 @@
|
||||
"groupID": 4064,
|
||||
"groupName": "Vorton Projector Blueprint",
|
||||
"groupNameID": 564057,
|
||||
"published": false,
|
||||
"published": true,
|
||||
"useBasePrice": false
|
||||
},
|
||||
"4065": {
|
||||
@@ -9675,7 +9686,7 @@
|
||||
"groupID": 4065,
|
||||
"groupName": "Condenser Pack Blueprint",
|
||||
"groupNameID": 564058,
|
||||
"published": false,
|
||||
"published": true,
|
||||
"useBasePrice": false
|
||||
},
|
||||
"4066": {
|
||||
@@ -9686,7 +9697,7 @@
|
||||
"groupID": 4066,
|
||||
"groupName": "Advanced Condenser Pack Blueprint",
|
||||
"groupNameID": 564059,
|
||||
"published": false,
|
||||
"published": true,
|
||||
"useBasePrice": false
|
||||
},
|
||||
"4067": {
|
||||
@@ -9697,7 +9708,7 @@
|
||||
"groupID": 4067,
|
||||
"groupName": "Vorton Projector Upgrade",
|
||||
"groupNameID": 564488,
|
||||
"published": false,
|
||||
"published": true,
|
||||
"useBasePrice": false
|
||||
},
|
||||
"4069": {
|
||||
@@ -9708,7 +9719,7 @@
|
||||
"groupID": 4069,
|
||||
"groupName": "Vorton Projector Upgrade Blueprints",
|
||||
"groupNameID": 564489,
|
||||
"published": false,
|
||||
"published": true,
|
||||
"useBasePrice": false
|
||||
},
|
||||
"407": {
|
||||
@@ -9756,6 +9767,18 @@
|
||||
"published": true,
|
||||
"useBasePrice": false
|
||||
},
|
||||
"4073": {
|
||||
"anchorable": false,
|
||||
"anchored": true,
|
||||
"categoryID": 11,
|
||||
"fittableNonSingleton": false,
|
||||
"groupID": 4073,
|
||||
"groupName": "Temporary Collidable Structure",
|
||||
"groupNameID": 567507,
|
||||
"iconID": 0,
|
||||
"published": false,
|
||||
"useBasePrice": false
|
||||
},
|
||||
"408": {
|
||||
"anchorable": false,
|
||||
"anchored": false,
|
||||
@@ -9768,6 +9791,17 @@
|
||||
"published": true,
|
||||
"useBasePrice": true
|
||||
},
|
||||
"4086": {
|
||||
"anchorable": false,
|
||||
"anchored": false,
|
||||
"categoryID": 66,
|
||||
"fittableNonSingleton": false,
|
||||
"groupID": 4086,
|
||||
"groupName": "Quantum Cores",
|
||||
"groupNameID": 569641,
|
||||
"published": true,
|
||||
"useBasePrice": true
|
||||
},
|
||||
"409": {
|
||||
"anchorable": false,
|
||||
"anchored": false,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,10 +1,10 @@
|
||||
[
|
||||
{
|
||||
"field_name": "client_build",
|
||||
"field_value": 1748920
|
||||
"field_value": 1801413
|
||||
},
|
||||
{
|
||||
"field_name": "dump_time",
|
||||
"field_value": 1592209279
|
||||
"field_value": 1599630922
|
||||
}
|
||||
]
|
||||
@@ -73,8 +73,8 @@
|
||||
"text": "bonus to Heavy Missile and Heavy Assault Missile Launcher rate of fire"
|
||||
},
|
||||
{
|
||||
"number": "5%",
|
||||
"text": "bonus to Heavy Missile and Heavy Assault Missile explosion velocity"
|
||||
"number": "10%",
|
||||
"text": "bonus to Heavy Missile and Heavy Assault Missile velocity"
|
||||
},
|
||||
{
|
||||
"number": "3%",
|
||||
@@ -90,8 +90,8 @@
|
||||
"text": "bonus to Heavy Missile and Heavy Assault Missile Launcher rate of fire"
|
||||
},
|
||||
{
|
||||
"number": "7.5%",
|
||||
"text": "bonus to Shield Booster amount"
|
||||
"number": "4%",
|
||||
"text": "bonus to all shield resistances"
|
||||
}
|
||||
],
|
||||
"header": "Minmatar Battlecruiser bonuses (per skill level):"
|
||||
@@ -120,10 +120,6 @@
|
||||
"bonuses": [
|
||||
{
|
||||
"text": "·Can use two Command Burst modules"
|
||||
},
|
||||
{
|
||||
"number": "100%",
|
||||
"text": "bonus to Command Burst area of effect range"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -140,7 +136,7 @@
|
||||
"text": "bonus to Medium Hybrid Turret falloff"
|
||||
},
|
||||
{
|
||||
"number": "3%",
|
||||
"number": "4%",
|
||||
"text": "bonus to Armored Command and Skirmish Command burst strength and duration"
|
||||
}
|
||||
],
|
||||
@@ -163,6 +159,36 @@
|
||||
},
|
||||
"typeID": 22466
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
"misc": {
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "25%",
|
||||
"text": "reduction in ship kinetic resistances"
|
||||
},
|
||||
{
|
||||
"number": "50%",
|
||||
"text": "bonus to ship scan resolution"
|
||||
},
|
||||
{
|
||||
"number": "25%",
|
||||
"text": "bonus to mining laser cycle speed"
|
||||
},
|
||||
{
|
||||
"number": "25%",
|
||||
"text": "bonus to local Armor Repairer and Shield Booster cycle speed"
|
||||
},
|
||||
{
|
||||
"number": "100%",
|
||||
"text": "bonus to ship warp speed"
|
||||
}
|
||||
],
|
||||
"header": "Misc bonus:"
|
||||
}
|
||||
},
|
||||
"typeID": 56059
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
"role": {
|
||||
@@ -1105,34 +1131,30 @@
|
||||
"misc": {
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "44%",
|
||||
"text": "bonus to ship velocity"
|
||||
"number": "10%",
|
||||
"text": "reduction in ship kinetic resistances"
|
||||
},
|
||||
{
|
||||
"number": "44%",
|
||||
"text": "bonus to maximum targeting range"
|
||||
"number": "20%",
|
||||
"text": "bonus to ship scan resolution"
|
||||
},
|
||||
{
|
||||
"number": "22%",
|
||||
"text": "bonus to missile velocity"
|
||||
"number": "10%",
|
||||
"text": "bonus to mining laser cycle speed"
|
||||
},
|
||||
{
|
||||
"number": "44%",
|
||||
"text": "bonus to missile explosion velocity"
|
||||
"number": "10%",
|
||||
"text": "bonus to local Armor Repairer and Shield Booster cycle speed"
|
||||
},
|
||||
{
|
||||
"number": "22%",
|
||||
"text": "penalty to ship agility"
|
||||
},
|
||||
{
|
||||
"number": "22%",
|
||||
"text": "penalty to stasis webifier strength"
|
||||
"number": "40%",
|
||||
"text": "bonus to ship warp speed"
|
||||
}
|
||||
],
|
||||
"header": "Misc bonus:"
|
||||
}
|
||||
},
|
||||
"typeID": 30850
|
||||
"typeID": 56058
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
@@ -1316,6 +1338,35 @@
|
||||
},
|
||||
"typeID": 598
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
"misc": {
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "25%",
|
||||
"text": "reduction in ship EM resistances"
|
||||
},
|
||||
{
|
||||
"number": "25%",
|
||||
"text": "bonus to ship capacitor recharge rate"
|
||||
},
|
||||
{
|
||||
"number": "25+",
|
||||
"text": "bonus to Relic and Data Analyzer virus coherence"
|
||||
},
|
||||
{
|
||||
"number": "50%",
|
||||
"text": "bonus to Core and Combat Scanner Probe strength"
|
||||
},
|
||||
{
|
||||
"text": "·Cloaking devices cannot operate within systems affected by this storm"
|
||||
}
|
||||
],
|
||||
"header": "Misc bonus:"
|
||||
}
|
||||
},
|
||||
"typeID": 56057
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
"role": {
|
||||
@@ -2493,6 +2544,40 @@
|
||||
},
|
||||
"typeID": 28710
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
"misc": {
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "44%",
|
||||
"text": "bonus to ship velocity"
|
||||
},
|
||||
{
|
||||
"number": "44%",
|
||||
"text": "bonus to maximum targeting range"
|
||||
},
|
||||
{
|
||||
"number": "22%",
|
||||
"text": "bonus to missile velocity"
|
||||
},
|
||||
{
|
||||
"number": "44%",
|
||||
"text": "bonus to missile explosion velocity"
|
||||
},
|
||||
{
|
||||
"number": "22%",
|
||||
"text": "penalty to ship agility"
|
||||
},
|
||||
{
|
||||
"number": "22%",
|
||||
"text": "penalty to stasis webifier strength"
|
||||
}
|
||||
],
|
||||
"header": "Misc bonus:"
|
||||
}
|
||||
},
|
||||
"typeID": 30850
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
"skills": [
|
||||
@@ -5549,6 +5634,9 @@
|
||||
},
|
||||
{
|
||||
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle"
|
||||
},
|
||||
{
|
||||
"text": "·This structure requires an Astrahus Upwell Quantum Core to be installed for anchoring to complete"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -5603,6 +5691,9 @@
|
||||
},
|
||||
{
|
||||
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle"
|
||||
},
|
||||
{
|
||||
"text": "·This structure requires a Keepstar Upwell Quantum Core to be installed for anchoring to complete"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -5630,6 +5721,9 @@
|
||||
},
|
||||
{
|
||||
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle."
|
||||
},
|
||||
{
|
||||
"text": "·This structure requires an Athanor Upwell Quantum Core to be installed for anchoring to complete"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -5665,6 +5759,9 @@
|
||||
},
|
||||
{
|
||||
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle."
|
||||
},
|
||||
{
|
||||
"text": "·This structure requires a Tatara Upwell Quantum Core to be installed for anchoring to complete"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -5994,10 +6091,6 @@
|
||||
"bonuses": [
|
||||
{
|
||||
"text": "·Can use two Command Burst modules"
|
||||
},
|
||||
{
|
||||
"number": "100%",
|
||||
"text": "bonus to Command Burst area of effect range"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -6006,7 +6099,7 @@
|
||||
{
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "7.5%",
|
||||
"number": "10%",
|
||||
"text": "bonus to Heavy Missile and Heavy Assault Missile Launcher rate of fire"
|
||||
},
|
||||
{
|
||||
@@ -6014,7 +6107,7 @@
|
||||
"text": "bonus to Heavy Missile and Heavy Assault Missile explosion radius"
|
||||
},
|
||||
{
|
||||
"number": "3%",
|
||||
"number": "4%",
|
||||
"text": "bonus to Shield Command and Information Command burst strength and duration"
|
||||
}
|
||||
],
|
||||
@@ -6663,7 +6756,7 @@
|
||||
{
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "15%",
|
||||
"number": "30%",
|
||||
"text": "bonus to Light Entropic Disintegrator optimal range"
|
||||
},
|
||||
{
|
||||
@@ -8945,11 +9038,11 @@
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "7.5%",
|
||||
"text": "bonus to Heavy Drone max velocity and tracking speed"
|
||||
"text": "bonus to Drone tracking speed"
|
||||
},
|
||||
{
|
||||
"number": "7.5%",
|
||||
"text": "bonus to Medium Hybrid Turret tracking speed"
|
||||
"number": "10%",
|
||||
"text": "bonus to Drone optimal range"
|
||||
},
|
||||
{
|
||||
"number": "3%",
|
||||
@@ -8965,8 +9058,8 @@
|
||||
"text": "bonus to Drone hitpoints and damage"
|
||||
},
|
||||
{
|
||||
"number": "7.5%",
|
||||
"text": "bonus to Armor Repairer amount"
|
||||
"number": "4%",
|
||||
"text": "bonus to all armor resistances"
|
||||
}
|
||||
],
|
||||
"header": "Gallente Battlecruiser bonuses (per skill level):"
|
||||
@@ -8981,10 +9074,6 @@
|
||||
"bonuses": [
|
||||
{
|
||||
"text": "·Can use two Command Burst modules"
|
||||
},
|
||||
{
|
||||
"number": "100%",
|
||||
"text": "bonus to Command Burst area of effect range"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -9001,7 +9090,7 @@
|
||||
"text": "bonus to Medium Projectile Turret falloff"
|
||||
},
|
||||
{
|
||||
"number": "3%",
|
||||
"number": "4%",
|
||||
"text": "bonus to Shield Command and Skirmish Command burst strength and duration"
|
||||
}
|
||||
],
|
||||
@@ -9043,7 +9132,7 @@
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "10%",
|
||||
"text": "bonus to Medium Hybrid Turret optimal range"
|
||||
"text": "bonus to shield hitpoints"
|
||||
},
|
||||
{
|
||||
"number": "10%",
|
||||
@@ -9079,10 +9168,6 @@
|
||||
"bonuses": [
|
||||
{
|
||||
"text": "·Can use two Command Burst modules"
|
||||
},
|
||||
{
|
||||
"number": "100%",
|
||||
"text": "bonus to Command Burst area of effect range"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -9099,7 +9184,7 @@
|
||||
"text": "bonus to Medium Energy Turret rate of fire"
|
||||
},
|
||||
{
|
||||
"number": "3%",
|
||||
"number": "4%",
|
||||
"text": "bonus to Armored Command and Information Command burst strength and duration"
|
||||
}
|
||||
],
|
||||
@@ -10258,6 +10343,9 @@
|
||||
},
|
||||
{
|
||||
"text": "·This structure is able to maintain a low-power state indefinitely, and so will not lapse to into an abandoned state."
|
||||
},
|
||||
{
|
||||
"text": "·This structure requires a Fortizar Upwell Quantum Core to be installed for anchoring to complete"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -10294,6 +10382,9 @@
|
||||
},
|
||||
{
|
||||
"text": "·This structure is able to maintain a low-power state indefinitely, and so will not lapse to into an abandoned state."
|
||||
},
|
||||
{
|
||||
"text": "·This structure requires a Fortizar Upwell Quantum Core to be installed for anchoring to complete"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -10326,6 +10417,9 @@
|
||||
},
|
||||
{
|
||||
"text": "·This structure is able to maintain a low-power state indefinitely, and so will not lapse to into an abandoned state."
|
||||
},
|
||||
{
|
||||
"text": "·This structure requires a Fortizar Upwell Quantum Core to be installed for anchoring to complete"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -10362,6 +10456,9 @@
|
||||
},
|
||||
{
|
||||
"text": "·This structure is able to maintain a low-power state indefinitely, and so will not lapse to into an abandoned state."
|
||||
},
|
||||
{
|
||||
"text": "·This structure requires a Fortizar Upwell Quantum Core to be installed for anchoring to complete"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -10390,6 +10487,9 @@
|
||||
},
|
||||
{
|
||||
"text": "·This structure is able to maintain a low-power state indefinitely, and so will not lapse to into an abandoned state."
|
||||
},
|
||||
{
|
||||
"text": "·This structure requires a Fortizar Upwell Quantum Core to be installed for anchoring to complete"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -12019,6 +12119,9 @@
|
||||
},
|
||||
{
|
||||
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle"
|
||||
},
|
||||
{
|
||||
"text": "·This structure requires a Fortizar Upwell Quantum Core to be installed for anchoring to complete"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -16235,6 +16338,9 @@
|
||||
},
|
||||
{
|
||||
"text": "·Only one Upwell Palatine Keepstar may be deployed at a time in New Eden"
|
||||
},
|
||||
{
|
||||
"text": "·This structure requires a Keepstar Upwell Quantum Core to be installed for anchoring to complete"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -16242,6 +16348,26 @@
|
||||
},
|
||||
"typeID": 40340
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
"skills": [
|
||||
{
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "7.5%",
|
||||
"text": "bonus to Small Hybrid Turret tracking speed"
|
||||
},
|
||||
{
|
||||
"number": "10%",
|
||||
"text": "bonus to Drone hitpoints and tracking speed"
|
||||
}
|
||||
],
|
||||
"header": "Gallente Frigate bonuses (per skill level):"
|
||||
}
|
||||
]
|
||||
},
|
||||
"typeID": 34443
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
"role": {
|
||||
@@ -16496,6 +16622,26 @@
|
||||
},
|
||||
"typeID": 23913
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
"skills": [
|
||||
{
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "10%",
|
||||
"text": "bonus to Drone hitpoints and damage"
|
||||
},
|
||||
{
|
||||
"number": "7.5%",
|
||||
"text": "bonus to Drone optimal range and tracking speed"
|
||||
}
|
||||
],
|
||||
"header": "Gallente Battleship bonuses (per skill level):"
|
||||
}
|
||||
]
|
||||
},
|
||||
"typeID": 34441
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
"role": {
|
||||
@@ -20160,43 +20306,152 @@
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
"skills": [
|
||||
{
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "7.5%",
|
||||
"text": "bonus to Small Hybrid Turret tracking speed"
|
||||
},
|
||||
{
|
||||
"number": "10%",
|
||||
"text": "bonus to Drone hitpoints and tracking speed"
|
||||
}
|
||||
],
|
||||
"header": "Gallente Frigate bonuses (per skill level):"
|
||||
}
|
||||
]
|
||||
"misc": {
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "10%",
|
||||
"text": "reduction in ship explosive resistances"
|
||||
},
|
||||
{
|
||||
"number": "10%",
|
||||
"text": "bonus to ship shield hitpoints"
|
||||
},
|
||||
{
|
||||
"number": "10%",
|
||||
"text": "bonus to ship capacitor capacity"
|
||||
},
|
||||
{
|
||||
"number": "10%",
|
||||
"text": "reduction in ship signature radius"
|
||||
},
|
||||
{
|
||||
"number": "50%",
|
||||
"text": "reduction in Remote Armor Repairer and Remote Shield Booster effectiveness"
|
||||
}
|
||||
],
|
||||
"header": "Misc bonus:"
|
||||
}
|
||||
},
|
||||
"typeID": 34443
|
||||
"typeID": 56060
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
"skills": [
|
||||
{
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "10%",
|
||||
"text": "bonus to Drone hitpoints and damage"
|
||||
},
|
||||
{
|
||||
"number": "7.5%",
|
||||
"text": "bonus to Drone optimal range and tracking speed"
|
||||
}
|
||||
],
|
||||
"header": "Gallente Battleship bonuses (per skill level):"
|
||||
}
|
||||
]
|
||||
"misc": {
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "25%",
|
||||
"text": "reduction in ship explosive resistances"
|
||||
},
|
||||
{
|
||||
"number": "25%",
|
||||
"text": "bonus to ship shield hitpoints"
|
||||
},
|
||||
{
|
||||
"number": "25%",
|
||||
"text": "bonus to ship capacitor capacity"
|
||||
},
|
||||
{
|
||||
"number": "25%",
|
||||
"text": "reduction in ship signature radius"
|
||||
},
|
||||
{
|
||||
"number": "90%",
|
||||
"text": "reduction in Remote Armor Repairer and Remote Shield Booster effectiveness"
|
||||
}
|
||||
],
|
||||
"header": "Misc bonus:"
|
||||
}
|
||||
},
|
||||
"typeID": 34441
|
||||
"typeID": 56061
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
"misc": {
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "10%",
|
||||
"text": "reduction in ship thermal resistances"
|
||||
},
|
||||
{
|
||||
"number": "10%",
|
||||
"text": "bonus to ship armor hitpoints"
|
||||
},
|
||||
{
|
||||
"number": "20%",
|
||||
"text": "bonus to turret, missile, drone, and fighter damage"
|
||||
},
|
||||
{
|
||||
"number": "20%",
|
||||
"text": "reduction in turret and drone tracking speed"
|
||||
},
|
||||
{
|
||||
"number": "20%",
|
||||
"text": "increase to missile and fighter explosion radius"
|
||||
}
|
||||
],
|
||||
"header": "Misc bonus:"
|
||||
}
|
||||
},
|
||||
"typeID": 56062
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
"misc": {
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "25%",
|
||||
"text": "reduction in ship thermal resistances"
|
||||
},
|
||||
{
|
||||
"number": "25%",
|
||||
"text": "bonus to ship armor hitpoints"
|
||||
},
|
||||
{
|
||||
"number": "50%",
|
||||
"text": "bonus to turret, missile, drone, and fighter damage"
|
||||
},
|
||||
{
|
||||
"number": "50%",
|
||||
"text": "reduction in turret and drone tracking speed"
|
||||
},
|
||||
{
|
||||
"number": "50%",
|
||||
"text": "increase to missile and fighter explosion radius"
|
||||
}
|
||||
],
|
||||
"header": "Misc bonus:"
|
||||
}
|
||||
},
|
||||
"typeID": 56063
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
"misc": {
|
||||
"bonuses": [
|
||||
{
|
||||
"number": "10%",
|
||||
"text": "reduction in ship EM resistances"
|
||||
},
|
||||
{
|
||||
"number": "10%",
|
||||
"text": "bonus to ship capacitor recharge rate"
|
||||
},
|
||||
{
|
||||
"number": "10+",
|
||||
"text": "bonus to Relic and Data Analyzer virus coherence"
|
||||
},
|
||||
{
|
||||
"number": "20%",
|
||||
"text": "bonus to Core and Combat Scanner Probe strength"
|
||||
},
|
||||
{
|
||||
"text": "·Cloaking devices cannot operate within systems affected by this storm"
|
||||
}
|
||||
],
|
||||
"header": "Misc bonus:"
|
||||
}
|
||||
},
|
||||
"typeID": 56064
|
||||
},
|
||||
{
|
||||
"traits": {
|
||||
@@ -20290,8 +20545,8 @@
|
||||
"text": "bonus to Heavy Entropic Disintegrator damage"
|
||||
},
|
||||
{
|
||||
"number": "5%",
|
||||
"text": "bonus to Heavy Entropic Disintegrator tracking speed"
|
||||
"number": "7.5%",
|
||||
"text": "bonus to Heavy Entropic Disintegrator optimal range"
|
||||
}
|
||||
],
|
||||
"header": "Precursor Cruiser bonuses (per skill level):"
|
||||
@@ -20608,6 +20863,9 @@
|
||||
},
|
||||
{
|
||||
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle."
|
||||
},
|
||||
{
|
||||
"text": "·This structure requires a Sotiyo Upwell Quantum Core to be installed for anchoring to complete"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -20641,6 +20899,9 @@
|
||||
},
|
||||
{
|
||||
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle."
|
||||
},
|
||||
{
|
||||
"text": "·This structure requires an Azbel Upwell Quantum Core to be installed for anchoring to complete"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
@@ -20670,6 +20931,9 @@
|
||||
},
|
||||
{
|
||||
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle."
|
||||
},
|
||||
{
|
||||
"text": "·This structure requires a Raitaru Upwell Quantum Core to be installed for anchoring to complete"
|
||||
}
|
||||
],
|
||||
"header": "Role Bonus:"
|
||||
|
||||
@@ -1 +1 @@
|
||||
version: v2.22.0
|
||||
version: v2.28.2dev1
|
||||
|
||||
Reference in New Issue
Block a user