Turret Fix (#267)

* created a transitional period within facility turret upgrades structured around a completion boolean; the turret upgrader responds properly to this boolean and also possesses a new task flow for GUID registration; facility turrets now have variable weapon rendering, a custom mounting function, and a back door in case they get stuck upgrading

* moving the code to reset the turret upgrade process from the case for RequestDestory to ChatMsg, alongside the vehicle terminal reset
This commit is contained in:
Fate-JH 2019-10-06 14:05:17 -04:00 committed by GitHub
parent d7a950a16f
commit 242cc4f7c2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 94 additions and 45 deletions

View file

@ -11,6 +11,7 @@ class FacilityTurret(tDef : TurretDefinition) extends Amenity
with StandardResistanceProfile {
/** some turrets can be updated; they all start without updates */
private var upgradePath : TurretUpgrade.Value = TurretUpgrade.None
private var middleOfUpgrade : Boolean = false
WeaponTurret.LoadDefinition(this)
@ -23,16 +24,33 @@ class FacilityTurret(tDef : TurretDefinition) extends Amenity
def Upgrade : TurretUpgrade.Value = upgradePath
def Upgrade_=(upgrade : TurretUpgrade.Value) : TurretUpgrade.Value = {
upgradePath = upgrade
middleOfUpgrade = true //blocking flag; block early
var updated = false
//upgrade each weapon as long as that weapon has a valid option for that upgrade
Definition.Weapons.foreach({ case(index, upgradePaths) =>
if(upgradePaths.contains(upgrade)) {
updated = true
weapons(index).Equipment.get.asInstanceOf[TurretWeapon].Upgrade = upgrade
}
})
if(updated) {
upgradePath = upgrade
}
else {
middleOfUpgrade = false //reset
}
Upgrade
}
def ConfirmUpgrade(upgrade : TurretUpgrade.Value) : TurretUpgrade.Value = {
if(middleOfUpgrade && upgradePath == upgrade) {
middleOfUpgrade = false
}
upgradePath
}
def isUpgrading : Boolean = middleOfUpgrade
def DamageModel = Definition.asInstanceOf[DamageResistanceModel]
def Definition : TurretDefinition = tDef

View file

@ -176,11 +176,13 @@ class TurretUpgrader extends SupportActor[TurretUpgrader.Entry] {
})
info(s"Converting manned wall turret weapon to $upgrade")
val oldBoxesTask = AllMountedWeaponMagazines(target)
.map(box => GUIDTask.UnregisterEquipment(box)(guid))
.toList
val oldBoxes = AllMountedWeaponMagazines(target)
target.Upgrade = upgrade //perform upgrade
val newBoxes = AllMountedWeaponMagazines(target)
val oldBoxesTask = oldBoxes
.filterNot { box => newBoxes.exists(_ eq box) }
.map(box => GUIDTask.UnregisterEquipment(box)(guid)).toList
val newBoxesTask = TaskResolver.GiveTask(
new Task() {
private val localFunc : ()=>Unit = FinishUpgradingTurret(entry)
@ -188,17 +190,27 @@ class TurretUpgrader extends SupportActor[TurretUpgrader.Entry] {
override def isComplete = Task.Resolution.Success
def Execute(resolver : ActorRef) : Unit = {
localFunc()
resolver ! scala.util.Success(this)
}
}, AllMountedWeaponMagazines(target).map(box => GUIDTask.RegisterEquipment(box)(guid)).toList
override def onSuccess() : Unit = {
super.onSuccess()
localFunc()
}
},
newBoxes
.filterNot { box => oldBoxes.exists(_ eq box) }
.map(box => GUIDTask.RegisterEquipment(box)(guid)).toList
)
taskResolver ! TaskResolver.GiveTask(
new Task() {
private val tasks = oldBoxesTask
def Execute(resolver : ActorRef) : Unit = {
tasks.foreach { resolver ! _ }
resolver ! scala.util.Success(this)
}
}, oldBoxesTask :+ newBoxesTask
}, List(newBoxesTask)
)
}
@ -225,15 +237,18 @@ class TurretUpgrader extends SupportActor[TurretUpgrader.Entry] {
val target = entry.obj.asInstanceOf[FacilityTurret]
val zone = entry.zone
info(s"Wall turret finished ${target.Upgrade} upgrade")
target.ConfirmUpgrade(entry.upgrade)
val targetGUID = target.GUID
target.Weapons
.map({ case (index, slot) => (index, slot.Equipment) })
.collect { case (index, Some(tool : Tool)) =>
context.parent ! VehicleServiceMessage(
zone.Id,
VehicleAction.EquipmentInSlot(PlanetSideGUID(0), targetGUID, index, tool)
)
}
if(target.Health > 0) {
target.Weapons
.map({ case (index, slot) => (index, slot.Equipment) })
.collect { case (index, Some(tool : Tool)) =>
context.parent ! VehicleServiceMessage(
zone.Id,
VehicleAction.EquipmentInSlot(PlanetSideGUID(0), targetGUID, index, tool)
)
}
}
}
}