Eliminate return from AvatarActor

This commit is contained in:
Jakob Gillich 2020-08-26 22:47:39 +02:00
parent ce641cffbd
commit 63dea5af05

View file

@ -390,7 +390,9 @@ class AvatarActor(
case Success((loadouts, implants, certs)) => case Success((loadouts, implants, certs)) =>
avatar = avatar.copy( avatar = avatar.copy(
loadouts = loadouts, loadouts = loadouts,
certifications = certs.map(cert => Certification.withValue(cert.id)).toSet, // make sure we always have the base certifications
certifications =
certs.map(cert => Certification.withValue(cert.id)).toSet ++ Certification.values.filter(_.cost == 0),
implants = implants.map(implant => Some(Implant(implant.toImplantDefinition))).padTo(3, None) implants = implants.map(implant => Some(Implant(implant.toImplantDefinition))).padTo(3, None)
) )
@ -416,61 +418,60 @@ class AvatarActor(
sessionActor ! SessionActor.SendResponse( sessionActor ! SessionActor.SendResponse(
ItemTransactionResultMessage(terminalGuid, TransactionType.Learn, success = false) ItemTransactionResultMessage(terminalGuid, TransactionType.Learn, success = false)
) )
return Behaviors.same } else {
} val replace = certification.replaces.intersect(avatar.certifications)
Future
val replace = certification.replaces.intersect(avatar.certifications) .sequence(replace.map(cert => {
Future
.sequence(replace.map(cert => {
ctx
.run(
query[persistence.Certification]
.filter(_.avatarId == lift(avatar.id))
.filter(_.id == lift(cert.value))
.delete
)
.map(_ => cert)
}))
.onComplete {
case Failure(exception) =>
log.error(exception)("db failure")
sessionActor ! SessionActor.SendResponse(
ItemTransactionResultMessage(terminalGuid, TransactionType.Sell, success = false)
)
case Success(replace) =>
replace.foreach { cert =>
sessionActor ! SessionActor.SendResponse(
PlanetsideAttributeMessage(session.get.player.GUID, 25, cert.value)
)
}
ctx ctx
.run( .run(
query[persistence.Certification] query[persistence.Certification]
.insert(_.id -> lift(certification.value), _.avatarId -> lift(avatar.id)) .filter(_.avatarId == lift(avatar.id))
.filter(_.id == lift(cert.value))
.delete
) )
.onComplete { .map(_ => cert)
case Failure(exception) => }))
log.error(exception)("db failure") .onComplete {
sessionActor ! SessionActor.SendResponse( case Failure(exception) =>
ItemTransactionResultMessage(terminalGuid, TransactionType.Sell, success = false) log.error(exception)("db failure")
) sessionActor ! SessionActor.SendResponse(
ItemTransactionResultMessage(terminalGuid, TransactionType.Sell, success = false)
case Success(_) => )
sessionActor ! SessionActor.SendResponse( case Success(replace) =>
PlanetsideAttributeMessage(session.get.player.GUID, 24, certification.value) replace.foreach { cert =>
) sessionActor ! SessionActor.SendResponse(
avatar = avatar.copy(certifications = avatar.certifications.diff(replace) + certification) PlanetsideAttributeMessage(session.get.player.GUID, 25, cert.value)
sessionActor ! SessionActor.SendResponse( )
ItemTransactionResultMessage(terminalGuid, TransactionType.Sell, success = true)
)
avatar.deployables.UpdateMaxCounts(avatar.certifications)
updateDeployableUIElements(
avatar.deployables.UpdateUI()
)
} }
ctx
.run(
query[persistence.Certification]
.insert(_.id -> lift(certification.value), _.avatarId -> lift(avatar.id))
)
.onComplete {
case Failure(exception) =>
log.error(exception)("db failure")
sessionActor ! SessionActor.SendResponse(
ItemTransactionResultMessage(terminalGuid, TransactionType.Sell, success = false)
)
} case Success(_) =>
sessionActor ! SessionActor.SendResponse(
PlanetsideAttributeMessage(session.get.player.GUID, 24, certification.value)
)
avatar = avatar.copy(certifications = avatar.certifications.diff(replace) + certification)
sessionActor ! SessionActor.SendResponse(
ItemTransactionResultMessage(terminalGuid, TransactionType.Sell, success = true)
)
avatar.deployables.UpdateMaxCounts(avatar.certifications)
updateDeployableUIElements(
avatar.deployables.UpdateUI()
)
}
}
}
Behaviors.same Behaviors.same
case SellCertification(terminalGuid, certification) => case SellCertification(terminalGuid, certification) =>
@ -480,48 +481,48 @@ class AvatarActor(
sessionActor ! SessionActor.SendResponse( sessionActor ! SessionActor.SendResponse(
ItemTransactionResultMessage(terminalGuid, TransactionType.Learn, success = false) ItemTransactionResultMessage(terminalGuid, TransactionType.Learn, success = false)
) )
return Behaviors.same } else {
}
val deps = Certification.values.filter(_.requires.contains(certification)).toSet val deps = Certification.values.filter(_.requires.contains(certification)).toSet
val remove = deps ++ Certification.values.filter(_.replaces.intersect(deps).nonEmpty).toSet + certification val remove = deps ++ Certification.values.filter(_.replaces.intersect(deps).nonEmpty).toSet + certification
Future Future
.sequence( .sequence(
avatar.certifications avatar.certifications
.intersect(remove) .intersect(remove)
.map(cert => { .map(cert => {
ctx ctx
.run( .run(
query[persistence.Certification] query[persistence.Certification]
.filter(_.avatarId == lift(avatar.id)) .filter(_.avatarId == lift(avatar.id))
.filter(_.id == lift(cert.value)) .filter(_.id == lift(cert.value))
.delete .delete
) )
.map(_ => cert) .map(_ => cert)
}) })
) )
.onComplete { .onComplete {
case Failure(exception) => case Failure(exception) =>
log.error(exception)("db failure") log.error(exception)("db failure")
sessionActor ! SessionActor.SendResponse(
ItemTransactionResultMessage(terminalGuid, TransactionType.Sell, success = false)
)
case Success(certs) =>
certs.foreach { cert =>
sessionActor ! SessionActor.SendResponse( sessionActor ! SessionActor.SendResponse(
PlanetsideAttributeMessage(session.get.player.GUID, 25, cert.value) ItemTransactionResultMessage(terminalGuid, TransactionType.Sell, success = false)
) )
} case Success(certs) =>
avatar = avatar.copy(certifications = avatar.certifications.diff(remove)) certs.foreach { cert =>
sessionActor ! SessionActor.SendResponse( sessionActor ! SessionActor.SendResponse(
ItemTransactionResultMessage(terminalGuid, TransactionType.Sell, success = true) PlanetsideAttributeMessage(session.get.player.GUID, 25, cert.value)
) )
avatar.deployables.UpdateMaxCounts(avatar.certifications) }
updateDeployableUIElements( avatar = avatar.copy(certifications = avatar.certifications.diff(remove))
avatar.deployables.UpdateUI() sessionActor ! SessionActor.SendResponse(
) ItemTransactionResultMessage(terminalGuid, TransactionType.Sell, success = true)
} )
avatar.deployables.UpdateMaxCounts(avatar.certifications)
updateDeployableUIElements(
avatar.deployables.UpdateUI()
)
}
}
Behaviors.same Behaviors.same
case SetCertifications(certifications) => case SetCertifications(certifications) =>
@ -716,12 +717,12 @@ class AvatarActor(
if (!Avatar.purchaseCooldowns.contains(definition)) { if (!Avatar.purchaseCooldowns.contains(definition)) {
// TODO only send for items with cooldowns // TODO only send for items with cooldowns
//log.warn(s"UpdatePurchaseTime message for item '${definition.Name}' without cooldown") //log.warn(s"UpdatePurchaseTime message for item '${definition.Name}' without cooldown")
return Behaviors.same } else {
// TODO save to db
avatar = avatar.copy(purchaseTimes = avatar.purchaseTimes.updated(definition.Name, time))
// we could be more selective and only send what changed, but it doesn't hurt to refresh everything
context.self ! RefreshPurchaseTimes()
} }
// TODO save to db
avatar = avatar.copy(purchaseTimes = avatar.purchaseTimes.updated(definition.Name, time))
// we could be more selective and only send what changed, but it doesn't hurt to refresh everything
context.self ! RefreshPurchaseTimes()
Behaviors.same Behaviors.same
case UpdateUseTime(definition, time) => case UpdateUseTime(definition, time) =>
@ -779,51 +780,47 @@ class AvatarActor(
case Some((implant, slot)) => case Some((implant, slot)) =>
if (!implant.initialized) { if (!implant.initialized) {
log.error(s"requested activation of uninitialized implant $implant") log.error(s"requested activation of uninitialized implant $implant")
return Behaviors.same } else if (!consumeStamina(implant.definition.ActivationStaminaCost)) {
}
if (!consumeStamina(implant.definition.ActivationStaminaCost)) {
sessionActor ! SessionActor.SendResponse( sessionActor ! SessionActor.SendResponse(
AvatarImplantMessage(session.get.player.GUID, ImplantAction.OutOfStamina, slot, 1) AvatarImplantMessage(session.get.player.GUID, ImplantAction.OutOfStamina, slot, 1)
) )
return Behaviors.same } else if (implant.definition.implantType.disabledFor.contains(session.get.player.ExoSuit)) {
}
if (implant.definition.implantType.disabledFor.contains(session.get.player.ExoSuit)) {
// TODO can this really happen? can we prevent it? // TODO can this really happen? can we prevent it?
return Behaviors.same } else {
}
avatar = avatar.copy( avatar = avatar.copy(
implants = avatar.implants.updated(slot, Some(implant.copy(active = true))) implants = avatar.implants.updated(slot, Some(implant.copy(active = true)))
)
sessionActor ! SessionActor.SendResponse(
AvatarImplantMessage(
session.get.player.GUID,
ImplantAction.Activation,
slot,
1
) )
) sessionActor ! SessionActor.SendResponse(
AvatarImplantMessage(
// Activation sound / effect session.get.player.GUID,
session.get.zone.AvatarEvents ! AvatarServiceMessage( ImplantAction.Activation,
session.get.zone.id, slot,
AvatarAction.PlanetsideAttribute( 1
session.get.player.GUID, )
28,
implant.definition.implantType.value * 2 + 1
) )
)
implantTimers.get(slot).foreach(_.cancel()) // Activation sound / effect
session.get.zone.AvatarEvents ! AvatarServiceMessage(
session.get.zone.id,
AvatarAction.PlanetsideAttribute(
session.get.player.GUID,
28,
implant.definition.implantType.value * 2 + 1
)
)
val interval = implant.definition.GetCostIntervalByExoSuit(session.get.player.ExoSuit).milliseconds implantTimers.get(slot).foreach(_.cancel())
// TODO costInterval should be an option ^
if (interval.toMillis > 0) { val interval = implant.definition.GetCostIntervalByExoSuit(session.get.player.ExoSuit).milliseconds
implantTimers(slot) = context.system.scheduler.scheduleWithFixedDelay(interval, interval)(() => { // TODO costInterval should be an option ^
if (!consumeStamina(implant.definition.StaminaCost)) { if (interval.toMillis > 0) {
context.self ! DeactivateImplant(implantType) implantTimers(slot) = context.system.scheduler.scheduleWithFixedDelay(interval, interval)(() => {
} if (!consumeStamina(implant.definition.StaminaCost)) {
}) context.self ! DeactivateImplant(implantType)
}
})
}
} }
case None => log.error(s"requested activation of unknown implant $implantType") case None => log.error(s"requested activation of unknown implant $implantType")
@ -870,21 +867,20 @@ class AvatarActor(
case RestoreStamina(stamina) => case RestoreStamina(stamina) =>
assert(stamina > 0) assert(stamina > 0)
if (!session.get.player.HasGUID) return Behaviors.same if (session.get.player.HasGUID) {
val totalStamina = math.min(avatar.maxStamina, avatar.stamina + stamina)
val fatigued = if (avatar.fatigued && totalStamina >= 20) {
context.self ! InitializeImplants(instant = true)
false
} else {
avatar.fatigued
}
avatar = avatar.copy(stamina = totalStamina, fatigued = fatigued)
val totalStamina = math.min(avatar.maxStamina, avatar.stamina + stamina) sessionActor ! SessionActor.SendResponse(
val fatigued = if (avatar.fatigued && totalStamina >= 20) { PlanetsideAttributeMessage(session.get.player.GUID, 2, avatar.stamina)
context.self ! InitializeImplants(instant = true) )
false
} else {
avatar.fatigued
} }
avatar = avatar.copy(stamina = totalStamina, fatigued = fatigued)
sessionActor ! SessionActor.SendResponse(
PlanetsideAttributeMessage(session.get.player.GUID, 2, avatar.stamina)
)
Behaviors.same Behaviors.same
case ConsumeStamina(stamina) => case ConsumeStamina(stamina) =>