Add cargo support to XML, DNA, EFT import/export

This commit is contained in:
blitzmann
2014-05-04 19:15:25 -04:00
parent ac144e51e0
commit 19f0bbc811

View File

@@ -175,11 +175,9 @@ class Fit(object):
d.amount = int(amount)
f.drones.append(d)
elif item.category.name == "Charge":
for i in xrange(int(amount)):
for mod in f.modules:
if (mod.isValidCharge(item) and mod.charge == None):
mod.charge = item
break;
c = Cargo(item)
c.amount = int(amount)
f.cargo.append(c)
else:
for i in xrange(int(amount)):
try:
@@ -217,9 +215,10 @@ class Fit(object):
# maintain map of drones and their quantities
droneMap = {}
cargoMap = {}
for i in range(1, len(lines)):
ammoName = None
droneAmount = None
extraAmount = None
line = lines[i].strip()
if not line:
@@ -240,7 +239,7 @@ class Fit(object):
modName = modAmmo[0].strip()
elif len(modExtra) == 2:
# line with drone/cargo and qty
droneAmount = modExtra[1].strip()
extraAmount = modExtra[1].strip()
modName = modExtra[0].strip()
else:
# line with just module
@@ -249,17 +248,20 @@ class Fit(object):
try:
# get item information. If we are on a Drone/Cargo line, throw out cargo
item = db.getItem(modName, eager="group.category")
if len(modExtra) == 2 and item.category.name != "Drone":
continue
except:
# if no data can be found (old names)
continue
if item.category.name == "Drone":
droneAmount = int(droneAmount) if droneAmount is not None else 1
extraAmount = int(extraAmount) if extraAmount is not None else 1
if not modName in droneMap:
droneMap[modName] = 0
droneMap[modName] += droneAmount
droneMap[modName] += extraAmount
if len(modExtra) == 2 and item.category.name != "Drone":
extraAmount = int(extraAmount) if extraAmount is not None else 1
if not modName in cargoMap:
cargoMap[modName] = 0
cargoMap[modName] += extraAmount
elif item.category.name == "Implant":
fit.implants.append(Implant(item))
else:
@@ -287,6 +289,11 @@ class Fit(object):
d.amount = droneMap[droneName]
fit.drones.append(d)
for cargoName in cargoMap:
c = Cargo(db.getItem(cargoName))
c.amount = cargoMap[cargoName]
fit.cargo.append(c)
return fit
@classmethod
@@ -328,10 +335,12 @@ class Fit(object):
f.name = fitLines[0][1:-1]
# Assign ship to fitting
f.ship = Ship(db.getItem(shipname))
for i in range(1, len(fitLines)):
line = fitLines[i]
# Parse line into some data we will need
misc = re.match("(Drones|Implant|Booster)_(Active|Inactive)=(.+)",line)
cargo = re.match("Cargohold=(.+)",line)
if misc:
entityType = misc.group(1)
entityState = misc.group(2)
@@ -388,6 +397,19 @@ class Fit(object):
b.active = False
f.boosters.append(b)
# If we don't have any prefixes, then it's a module
elif cargo:
cargoData = re.match("(.+),([0-9]+)", cargo.group(1))
cargoName = cargoData.group(1) if cargoData else cargo.group(1)
cargoAmount = int(cargoData.group(2)) if cargoData else 1
# Bail if we can't get item
try:
item = db.getItem(cargoName)
except:
continue
# Add Cargo to the fitting
c = Cargo(item)
c.amount = cargoAmount
f.cargo.append(c)
else:
withCharge = re.match("(.+),(.+)", line)
modName = withCharge.group(1) if withCharge else line
@@ -397,6 +419,7 @@ class Fit(object):
modItem = db.getItem(modName)
except:
continue
# Create module and activate it if it's activable
m = Module(modItem)
if m.isValidState(State.ACTIVE):
@@ -448,7 +471,10 @@ class Fit(object):
d = Drone(item)
d.amount = int(hardware.getAttribute("qty"))
f.drones.append(d)
elif item.category.name == "Charge":
elif hardware.getAttribute("slot").lower() == "cargo":
# although the eve client only support charges in cargo, third-party programs
# may support items or "refits" in cargo. Support these by blindly adding all
# cargo, not just charges
c = Cargo(item)
c.amount = int(hardware.getAttribute("qty"))
f.cargo.append(c)
@@ -495,6 +521,9 @@ class Fit(object):
export += "\n\n"
for drone in self.drones:
export += "%s x%s\n" % (drone.item.name, drone.amount)
if len(self.cargo) > 0:
for cargo in self.cargo:
export += "%s x%s\n" % (cargo.item.name, cargo.amount)
if export[-1] == "\n":
export = export[:-1]
@@ -535,6 +564,17 @@ class Fit(object):
for drone in self.drones:
dna += ":{0};{1}".format(drone.itemID, drone.amount)
for cargo in self.cargo:
# DNA format is a simple/dumb format. As CCP uses the slot information of the item itself
# without designating slots in the DNA standard, we need to make sure we only include
# charges in the DNA export. If modules were included, the EVE Client will interpret these
# as being "Fitted" to whatever slot they are for, and it causes an corruption error in the
# client when trying to save the fit
if cargo.item.category.name == "Charge":
if not cargo.item.ID in charges:
charges[cargo.item.ID] = 0
charges[cargo.item.ID] += cargo.amount
for charge in charges:
dna += ":{0};{1}".format(charge, charges[charge])
@@ -586,6 +626,11 @@ class Fit(object):
hardware.setAttribute("type", drone.item.name)
fitting.appendChild(hardware)
for cargo in fit.cargo:
if not cargo.item.name in charges:
charges[cargo.item.name] = 0
charges[cargo.item.name] += cargo.amount
for name, qty in charges.items():
hardware = doc.createElement("hardware")
hardware.setAttribute("qty", "%d" % qty)
@@ -593,12 +638,6 @@ class Fit(object):
hardware.setAttribute("type", name)
fitting.appendChild(hardware)
for cargo in fit.cargo:
hardware = doc.createElement("hardware")
hardware.setAttribute("qty", "%d" % cargo.amount)
hardware.setAttribute("slot", "cargo")
hardware.setAttribute("type", cargo.item.name)
fitting.appendChild(hardware)
return doc.toprettyxml()
@reconstructor