Few more small vehicle related tweaks (#320)

* Revert back to using vehicle GUID for target gone check when jacking, as GUIDs are now retained when an object is removed from the world

* Don't allow dead vehicles to be repaired

* Don't show repair bar on dead vehicles

* Add IsDead flag to Vehicle
This commit is contained in:
Mazo 2020-01-17 18:20:33 +00:00 committed by Fate-JH
parent db82b9f01f
commit d0bd823e9e
3 changed files with 46 additions and 8 deletions

View file

@ -77,6 +77,7 @@ class Vehicle(private val vehicleDef : VehicleDefinition) extends AmenityOwner
private var faction : PlanetSideEmpire.Value = PlanetSideEmpire.TR private var faction : PlanetSideEmpire.Value = PlanetSideEmpire.TR
private var health : Int = 1 private var health : Int = 1
private var shields : Int = 0 private var shields : Int = 0
private var isDead : Boolean = false
private var decal : Int = 0 private var decal : Int = 0
private var trunkAccess : Option[PlanetSideGUID] = None private var trunkAccess : Option[PlanetSideGUID] = None
private var jammered : Boolean = false private var jammered : Boolean = false
@ -140,12 +141,23 @@ class Vehicle(private val vehicleDef : VehicleDefinition) extends AmenityOwner
MountedIn MountedIn
} }
def IsDead : Boolean = {
isDead
}
def Health : Int = { def Health : Int = {
health health
} }
def Health_=(assignHealth : Int) : Int = { def Health_=(assignHealth : Int) : Int = {
health = math.min(math.max(0, assignHealth), MaxHealth) if(!isDead) {
health = math.min(math.max(0, assignHealth), MaxHealth)
}
if(health == 0) {
isDead = true
}
health health
} }

View file

@ -630,6 +630,34 @@ class VehicleControlMountingOwnedUnlockedDriverSeatTest extends ActorTest {
} }
} }
class VehicleControlRepairTest extends ActorTest {
val probe = new TestProbe(system)
val vehicle = Vehicle(GlobalDefinitions.fury)
vehicle.GUID = PlanetSideGUID(10)
vehicle.Health = 50
vehicle.Actor = system.actorOf(Props(classOf[VehicleControl], vehicle), "vehicle-test")
vehicle.Zone = new Zone("test", new ZoneMap("test"), 0) {
VehicleEvents = probe.ref
}
"Can repair alive vehicle" in {
assert(vehicle.Health == 50)
vehicle.Health += 10
assert(vehicle.Health == 60)
}
"Can't repair dead vehicle" in {
assert(vehicle.Health > 0)
vehicle.Health = 0
assert(vehicle.Health == 0)
vehicle.Health += 10
assert(vehicle.Health == 0)
}
}
class VehicleControlShieldsChargingTest extends ActorTest { class VehicleControlShieldsChargingTest extends ActorTest {
val probe = new TestProbe(system) val probe = new TestProbe(system)
val vehicle = Vehicle(GlobalDefinitions.fury) val vehicle = Vehicle(GlobalDefinitions.fury)

View file

@ -861,7 +861,7 @@ class WorldSessionActor extends Actor
case Zone.Lattice.SpawnPoint(zone_id, spawn_tube) => case Zone.Lattice.SpawnPoint(zone_id, spawn_tube) =>
var (pos, ori) = spawn_tube.SpecificPoint(continent.GUID(player.VehicleSeated) match { var (pos, ori) = spawn_tube.SpecificPoint(continent.GUID(player.VehicleSeated) match {
case Some(obj : Vehicle) if obj.Health > 0 => case Some(obj : Vehicle) if !obj.IsDead =>
obj obj
case _ => case _ =>
player player
@ -3172,8 +3172,7 @@ class WorldSessionActor extends Actor
if(!target.HasGUID) { if(!target.HasGUID) {
// Target is gone, cancel the hack. // Target is gone, cancel the hack.
// Note: I couldn't find any examples of an object that no longer has a GUID in packet captures, but sending the hacking player's GUID as the target to cancel the hack seems to work sendResponse(HackMessage(progressType, target.GUID, player.GUID, 0, 0L, HackState.Cancelled, 8L))
sendResponse(HackMessage(progressType, player.GUID, player.GUID, 0, 0L, HackState.Cancelled, 8L))
} }
else if(vis == HackState.Cancelled) { else if(vis == HackState.Cancelled) {
// Object moved. Cancel the hack (e.g. vehicle drove away) // Object moved. Cancel the hack (e.g. vehicle drove away)
@ -5171,9 +5170,8 @@ class WorldSessionActor extends Actor
else if(equipment.isDefined) { else if(equipment.isDefined) {
equipment.get.Definition match { equipment.get.Definition match {
case GlobalDefinitions.nano_dispenser => case GlobalDefinitions.nano_dispenser =>
//TODO repairing behavior
if (!player.isMoving && Vector3.Distance(player.Position, obj.Position) < 5) { if (!player.isMoving && Vector3.Distance(player.Position, obj.Position) < 5) {
if (obj.Health < obj.MaxHealth) { if (obj.Health < obj.MaxHealth && !obj.IsDead) {
obj.Health += 48 obj.Health += 48
// sendResponse(QuantityUpdateMessage(PlanetSideGUID(8214),ammo_quantity_left)) // sendResponse(QuantityUpdateMessage(PlanetSideGUID(8214),ammo_quantity_left))
val RepairPercent: Int = obj.Health * 100 / obj.MaxHealth val RepairPercent: Int = obj.Health * 100 / obj.MaxHealth
@ -5918,7 +5916,7 @@ class WorldSessionActor extends Actor
case Some(vehicleGUID) => case Some(vehicleGUID) =>
continent.GUID(vehicleGUID) match { continent.GUID(vehicleGUID) match {
case Some(obj : Vehicle) => case Some(obj : Vehicle) =>
if(obj.Health > 0) { //vehicle will try to charge even if destroyed if(!obj.IsDead) { //vehicle will try to charge even if destroyed
obj.Actor ! Vehicle.ChargeShields(15) obj.Actor ! Vehicle.ChargeShields(15)
} }
case _ => case _ =>
@ -8311,7 +8309,7 @@ class WorldSessionActor extends Actor
} }
else { else {
continent.GUID(player.VehicleSeated) match { continent.GUID(player.VehicleSeated) match {
case Some(obj : Vehicle) if obj.Health > 0 => case Some(obj : Vehicle) if !obj.IsDead =>
cluster ! Zone.Lattice.RequestSpawnPoint(sanctNumber, tplayer, 12) //warp gates for functioning vehicles cluster ! Zone.Lattice.RequestSpawnPoint(sanctNumber, tplayer, 12) //warp gates for functioning vehicles
case None => case None =>
cluster ! Zone.Lattice.RequestSpawnPoint(sanctNumber, tplayer, 7) //player character spawns cluster ! Zone.Lattice.RequestSpawnPoint(sanctNumber, tplayer, 7) //player character spawns