diff --git a/common/src/main/scala/net/psforever/objects/Players.scala b/common/src/main/scala/net/psforever/objects/Players.scala index 5a23d039..1757b8fb 100644 --- a/common/src/main/scala/net/psforever/objects/Players.scala +++ b/common/src/main/scala/net/psforever/objects/Players.scala @@ -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)) } diff --git a/common/src/main/scala/net/psforever/objects/Tool.scala b/common/src/main/scala/net/psforever/objects/Tool.scala index a13080d3..7a3302ac 100644 --- a/common/src/main/scala/net/psforever/objects/Tool.scala +++ b/common/src/main/scala/net/psforever/objects/Tool.scala @@ -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 = { diff --git a/common/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala b/common/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala index b1b39733..c39c045e 100644 --- a/common/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala +++ b/common/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala @@ -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)) diff --git a/common/src/main/scala/net/psforever/objects/equipment/FireModeDefinition.scala b/common/src/main/scala/net/psforever/objects/equipment/FireModeDefinition.scala index a38a1015..07d596ac 100644 --- a/common/src/main/scala/net/psforever/objects/equipment/FireModeDefinition.scala +++ b/common/src/main/scala/net/psforever/objects/equipment/FireModeDefinition.scala @@ -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 { diff --git a/common/src/main/scala/net/psforever/objects/serverobject/repair/RepairableEntity.scala b/common/src/main/scala/net/psforever/objects/serverobject/repair/RepairableEntity.scala index e3a27b9d..78cab827 100644 --- a/common/src/main/scala/net/psforever/objects/serverobject/repair/RepairableEntity.scala +++ b/common/src/main/scala/net/psforever/objects/serverobject/repair/RepairableEntity.scala @@ -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) { diff --git a/common/src/test/scala/objects/EquipmentTest.scala b/common/src/test/scala/objects/EquipmentTest.scala index 4979377f..f95ae025 100644 --- a/common/src/test/scala/objects/EquipmentTest.scala +++ b/common/src/test/scala/objects/EquipmentTest.scala @@ -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 } diff --git a/common/src/test/scala/objects/FireModeTest.scala b/common/src/test/scala/objects/FireModeTest.scala index 07342393..b6a49056 100644 --- a/common/src/test/scala/objects/FireModeTest.scala +++ b/common/src/test/scala/objects/FireModeTest.scala @@ -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 } } diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index 9f6e78e7..3c0c35c3 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -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 {