Reviving a player will drain 25 rounds after revival is complete, instead of on each progress tick (#505)

This commit is contained in:
Mazo 2020-06-29 18:01:16 +01:00 committed by GitHub
parent d1e7d8f8e0
commit 5437b3f068
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 47 additions and 41 deletions

View file

@ -28,12 +28,10 @@ object Players {
def RevivingTickAction(target : Player, user : Player, item : Tool)(progress : Float) : Boolean = {
if(!target.isAlive && !target.isBackpack &&
user.isAlive && !user.isMoving &&
user.Slot(user.DrawnSlot).Equipment.contains(item) && item.Magazine > 0 &&
user.Slot(user.DrawnSlot).Equipment.contains(item) && item.Magazine >= 25 &&
Vector3.Distance(target.Position, user.Position) < target.Definition.RepairDistance) {
val magazine = item.Discharge
val events = target.Zone.AvatarEvents
val uname = user.Name
events ! AvatarServiceMessage(uname, AvatarAction.SendResponse(Service.defaultPlayerGUID, InventoryStateMessage(item.AmmoSlot.Box.GUID, item.GUID, magazine)))
events ! AvatarServiceMessage(uname, AvatarAction.SendResponse(Service.defaultPlayerGUID, RepairMessage(target.GUID, progress.toInt)))
true
}
@ -48,10 +46,13 @@ object Players {
* @see `AvatarResponse.Revive`
* @param target the player being revived
* @param medic the name of the player doing the reviving
* @param item the tool being used to revive the target player
*/
def FinishRevivingPlayer(target : Player, medic : String)() : Unit = {
def FinishRevivingPlayer(target : Player, medic : String, item : Tool)() : Unit = {
val name = target.Name
log.info(s"$medic had revived $name")
val magazine = item.Discharge(Some(25))
target.Zone.AvatarEvents ! AvatarServiceMessage(medic, AvatarAction.SendResponse(Service.defaultPlayerGUID, InventoryStateMessage(item.AmmoSlot.Box.GUID, item.GUID, magazine)))
target.Zone.AvatarEvents ! AvatarServiceMessage(name, AvatarAction.Revive(target.GUID))
}

View file

@ -97,9 +97,9 @@ class Tool(private val toolDef : ToolDefinition) extends Equipment
}
}
def Discharge : Int = {
def Discharge(rounds : Option[Int] = None) : Int = {
lastDischarge = System.nanoTime()
Magazine = FireMode.Discharge(this)
Magazine = FireMode.Discharge(this, rounds)
}
def LastDischarge : Long = {

View file

@ -120,7 +120,7 @@ class PlayerControl(player : Player) extends Actor
val guid = player.GUID
if(!(player.isMoving || user.isMoving)) { //only allow stationary heals
val newHealth = player.Health = originalHealth + 10
val magazine = item.Discharge
val magazine = item.Discharge()
events ! AvatarServiceMessage(uname, AvatarAction.SendResponse(Service.defaultPlayerGUID, InventoryStateMessage(item.AmmoSlot.Box.GUID, item.GUID, magazine.toLong)))
events ! AvatarServiceMessage(zone.Id, AvatarAction.PlanetsideAttributeToAll(guid, 0, newHealth))
player.History(HealFromEquipment(PlayerSource(player), PlayerSource(user), newHealth - originalHealth, GlobalDefinitions.medicalapplicator))
@ -142,7 +142,7 @@ class PlayerControl(player : Player) extends Actor
item.Magazine >= 25) {
sender ! CommonMessages.Progress(
4,
Players.FinishRevivingPlayer(player, user.Name),
Players.FinishRevivingPlayer(player, user.Name, item),
Players.RevivingTickAction(player, user, item)
)
}
@ -160,7 +160,7 @@ class PlayerControl(player : Player) extends Actor
val guid = player.GUID
if(!(player.isMoving || user.isMoving)) { //only allow stationary repairs
val newArmor = player.Armor = originalArmor + Repairable.Quality + RepairValue(item) + definition.RepairMod
val magazine = item.Discharge
val magazine = item.Discharge()
events ! AvatarServiceMessage(uname, AvatarAction.SendResponse(Service.defaultPlayerGUID, InventoryStateMessage(item.AmmoSlot.Box.GUID, item.GUID, magazine.toLong)))
events ! AvatarServiceMessage(zone.Id, AvatarAction.PlanetsideAttributeToAll(guid, 4, player.Armor))
player.History(RepairFromEquipment(PlayerSource(player), PlayerSource(user), newArmor - originalArmor, GlobalDefinitions.bank))

View file

@ -83,10 +83,15 @@ class FireModeDefinition {
/**
* Shoot a weapon, remove an anticipated amount of ammunition.
* @param weapon the weapon
* @param rounds The number of rounds to remove, if specified
* @return the size of the weapon's magazine after discharge
*/
def Discharge(weapon : Tool) : Int = {
weapon.Magazine - Rounds
def Discharge(weapon : Tool, rounds : Option[Int] = None) : Int = {
val dischargedAmount = rounds match {
case Some(rounds : Int) => rounds
case _ => Rounds
}
weapon.Magazine - dischargedAmount
}
}
@ -100,7 +105,7 @@ class PelletFireModeDefinition extends FireModeDefinition {
* @param weapon the weapon
* @return the size of the weapon's magazine after discharge
*/
override def Discharge(weapon : Tool) : Int = {
override def Discharge(weapon : Tool, rounds : Option[Int] = None) : Int = {
val ammoSlot = weapon.AmmoSlot
val magazine = weapon.Magazine
val chamber : Int = ammoSlot.Chamber = ammoSlot.Chamber - 1
@ -128,7 +133,7 @@ class InfiniteFireModeDefinition extends FireModeDefinition {
* @return the size of the weapon's magazine after discharge;
* will always return 1
*/
override def Discharge(weapon : Tool) : Int = 1
override def Discharge(weapon : Tool, rounds : Option[Int] = None) : Int = 1
}
class DamageModifiers extends DamageProfile {

View file

@ -83,7 +83,7 @@ trait RepairableEntity extends Repairable {
val updatedHealth = if(!(player.isMoving(1f) || target.isMoving(1f))) { //only allow stationary repairs within margin of error
val newHealth = target.Health = originalHealth + Repairable.Quality + RepairValue(item) + definition.RepairMod
val zoneId = zone.Id
val magazine = item.Discharge
val magazine = item.Discharge()
events ! AvatarServiceMessage(name, AvatarAction.SendResponse(Service.defaultPlayerGUID, InventoryStateMessage(item.AmmoSlot.Box.GUID, item.GUID, magazine.toLong)))
if(target.Destroyed) {
if(newHealth >= definition.RepairRestoresAt) {

View file

@ -308,10 +308,10 @@ class EquipmentTest extends Specification {
"discharge (1)" in {
val obj = Tool(GlobalDefinitions.punisher)
obj.Magazine mustEqual 30
obj.Discharge
obj.Discharge()
obj.Magazine mustEqual 29
obj.Discharge
obj.Discharge
obj.Discharge()
obj.Discharge()
obj.Magazine mustEqual 27
}
@ -320,20 +320,20 @@ class EquipmentTest extends Specification {
obj.Magazine mustEqual 12
obj.AmmoSlot.Chamber mustEqual 8
obj.Discharge
obj.Discharge()
obj.Magazine mustEqual 12
obj.AmmoSlot.Chamber mustEqual 7
obj.Discharge
obj.Discharge
obj.Discharge()
obj.Discharge()
obj.Magazine mustEqual 12
obj.AmmoSlot.Chamber mustEqual 5
obj.Discharge
obj.Discharge
obj.Discharge
obj.Discharge
obj.Discharge()
obj.Discharge()
obj.Discharge()
obj.Discharge()
obj.Magazine mustEqual 12
obj.AmmoSlot.Chamber mustEqual 1
obj.Discharge
obj.Discharge()
obj.Magazine mustEqual 11
obj.AmmoSlot.Chamber mustEqual 8
}

View file

@ -58,10 +58,10 @@ class FireModeTest extends Specification {
obj.FireMode.Chamber mustEqual 1
obj.Magazine mustEqual 16
obj.Discharge
obj.Discharge()
obj.Magazine mustEqual 15
obj.Discharge
obj.Discharge
obj.Discharge()
obj.Discharge()
obj.Magazine mustEqual 13
}
}
@ -84,17 +84,17 @@ class FireModeTest extends Specification {
obj.FireMode.Chamber mustEqual 8
obj.Magazine mustEqual 12
obj.Discharge //1
obj.Discharge() //1
obj.Magazine mustEqual 12
obj.Discharge //2
obj.Discharge //3
obj.Discharge() //2
obj.Discharge() //3
obj.Magazine mustEqual 12
obj.Discharge //4
obj.Discharge //5
obj.Discharge //6
obj.Discharge //7
obj.Discharge() //4
obj.Discharge() //5
obj.Discharge() //6
obj.Discharge() //7
obj.Magazine mustEqual 12
obj.Discharge //8
obj.Discharge() //8
obj.Magazine mustEqual 11
}
}
@ -117,10 +117,10 @@ class FireModeTest extends Specification {
obj.FireMode.Chamber mustEqual 1
obj.Magazine mustEqual 1
obj.Discharge
obj.Discharge()
obj.Magazine mustEqual 1
obj.Discharge
obj.Discharge
obj.Discharge()
obj.Discharge()
obj.Magazine mustEqual 1
}
}

View file

@ -5595,7 +5595,7 @@ class WorldSessionActor extends Actor
}
else if(!player.isAlive) { //proper internal accounting, but no projectile
prefire = shooting.orElse(Some(weapon_guid))
tool.Discharge
tool.Discharge()
projectiles(projectile_guid.guid - Projectile.BaseUID) = None
shotsWhileDead += 1
}
@ -5606,7 +5606,7 @@ class WorldSessionActor extends Actor
}
prefire = shooting.orElse(Some(weapon_guid))
tool.Discharge //always
tool.Discharge() //always
val projectileIndex = projectile_guid.guid - Projectile.BaseUID
val projectilePlace = projectiles(projectileIndex)
if(projectilePlace match {