mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-02-19 14:43:37 +00:00
Merge branch 'master' into projectiles
This commit is contained in:
commit
b2ec9d2cb6
17 changed files with 323 additions and 203 deletions
|
|
@ -17,9 +17,63 @@ trait WorldEntity {
|
|||
def Velocity_=(vec : Option[Vector3]) : Option[Vector3]
|
||||
|
||||
def Velocity_=(vec : Vector3) : Option[Vector3] = Velocity = Some(vec)
|
||||
|
||||
/**
|
||||
* A velocity of non-zero is the same as moving.
|
||||
* @return `true`, if we are moving; `false`, otherwise
|
||||
*/
|
||||
def isMoving : Boolean = WorldEntity.isMoving(Velocity)
|
||||
|
||||
/**
|
||||
* This object is not considered moving unless it is moving at least as fast as a certain velocity.
|
||||
* @param test the velocity to test against
|
||||
* @return `true`, if we are moving; `false`, otherwise
|
||||
*/
|
||||
def isMoving(test : Vector3) : Boolean = WorldEntity.isMoving(Velocity, test)
|
||||
|
||||
/**
|
||||
* This object is not considered moving unless it is moving at least as fast as a certain velocity.
|
||||
* @param test the (squared) velocity to test against
|
||||
* @return `true`, if we are moving; `false`, otherwise
|
||||
*/
|
||||
def isMoving(test : Float) : Boolean = WorldEntity.isMoving(Velocity, test)
|
||||
}
|
||||
|
||||
object WorldEntity {
|
||||
/**
|
||||
* A velocity of non-zero is the same as moving.
|
||||
* @return `true`, if we are moving; `false`, otherwise
|
||||
*/
|
||||
def isMoving(velocity : Option[Vector3]) : Boolean = {
|
||||
velocity match {
|
||||
case None => false
|
||||
case Some(Vector3.Zero) => false
|
||||
case Some(_) => true
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This object is not considered moving unless it is moving at least as fast as a certain velocity.
|
||||
* @param velocity the optional sample velocity
|
||||
* @param test the (squared) velocity to test against
|
||||
* @return `true`, if we are moving; `false`, otherwise
|
||||
*/
|
||||
def isMoving(velocity : Option[Vector3], test : Vector3) : Boolean = WorldEntity.isMoving(velocity, Vector3.MagnitudeSquared(test))
|
||||
|
||||
/**
|
||||
* This object is not considered moving unless it is moving at least as fast as a certain velocity.
|
||||
* @param velocity the optional sample velocity
|
||||
* @param test the (squared) velocity to test against
|
||||
* @return `true`, if we are moving; `false`, otherwise
|
||||
*/
|
||||
def isMoving(velocity : Option[Vector3], test : Float) : Boolean = {
|
||||
velocity match {
|
||||
case None => false
|
||||
case Some(Vector3.Zero) => false
|
||||
case Some(v) => Vector3.MagnitudeSquared(v) >= test
|
||||
}
|
||||
}
|
||||
|
||||
def toString(obj : WorldEntity) : String = {
|
||||
s"pos=${obj.Position}, ori=${obj.Orientation}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ import net.psforever.objects.entity.{Identifiable, WorldEntity}
|
|||
import net.psforever.objects.serverobject.affinity.FactionAffinity
|
||||
import net.psforever.objects.serverobject.hackable.Hackable
|
||||
import net.psforever.objects.serverobject.turret.TurretDefinition
|
||||
import net.psforever.types.Vector3
|
||||
|
||||
object MountableBehavior {
|
||||
/**
|
||||
|
|
@ -79,10 +78,9 @@ object MountableBehavior {
|
|||
val dismountBehavior : Receive = {
|
||||
case Mountable.TryDismount(user, seat_num) =>
|
||||
val obj = MountableObject
|
||||
val velocity = obj.Velocity.getOrElse(Vector3.Zero)
|
||||
obj.Seat(seat_num) match {
|
||||
case Some(seat) =>
|
||||
if(seat.Bailable || velocity == Vector3.Zero || Vector3.MagnitudeSquared(velocity).toInt == 0) {
|
||||
if(seat.Bailable || !obj.isMoving) {
|
||||
seat.Occupant = None
|
||||
user.VehicleSeated = None
|
||||
sender ! Mountable.MountMessages(user, Mountable.CanDismount(obj, seat_num))
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ object AutoDriveControls {
|
|||
* @param vehicle the vehicle being controlled
|
||||
* @return `true`, if the action can (probably) be accomplished under the current conditions; `false`, otherwise
|
||||
*/
|
||||
def Validate(vehicle : Vehicle) : Boolean = Vector3.MagnitudeSquared(vehicle.Velocity.getOrElse(Vector3.Zero).xy) > 0
|
||||
def Validate(vehicle : Vehicle) : Boolean = vehicle.isMoving
|
||||
/**
|
||||
* Perform a test to determine if the vehicle has reached a set of conditions
|
||||
* where the action performed by the instruction has been fulfilled.
|
||||
|
|
@ -84,7 +84,7 @@ object AutoDriveControls {
|
|||
|
||||
override def Validate(vehicle : Vehicle) : Boolean = true
|
||||
|
||||
def CompletionTest(vehicle : Vehicle) = Vector3.MagnitudeSquared(vehicle.Velocity.getOrElse(Vector3.Zero).xy) > 0
|
||||
def CompletionTest(vehicle : Vehicle) = vehicle.isMoving
|
||||
}
|
||||
|
||||
protected final case class AutoDriveDistance(start : Vector3, sqDistance : Float) extends Setting {
|
||||
|
|
@ -162,7 +162,7 @@ object AutoDriveControls {
|
|||
|
||||
override def Data = Some(speed)
|
||||
|
||||
def CompletionTest(vehicle : Vehicle) = Vector3.MagnitudeSquared(vehicle.Velocity.getOrElse(Vector3.Zero)) > 0
|
||||
def CompletionTest(vehicle : Vehicle) = vehicle.isMoving
|
||||
|
||||
override def Validate(vehicle : Vehicle) : Boolean = {
|
||||
speed = vehicle.Definition.AutoPilotSpeed1
|
||||
|
|
@ -177,7 +177,7 @@ object AutoDriveControls {
|
|||
|
||||
override def Data = Some(speed)
|
||||
|
||||
def CompletionTest(vehicle : Vehicle) = Vector3.MagnitudeSquared(vehicle.Velocity.getOrElse(Vector3.Zero)) > 0
|
||||
def CompletionTest(vehicle : Vehicle) = vehicle.isMoving
|
||||
|
||||
override def Validate(vehicle : Vehicle) : Boolean = {
|
||||
speed = vehicle.Definition.AutoPilotSpeed2
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ object HackState extends Enumeration {
|
|||
val
|
||||
Unknown0,
|
||||
Start,
|
||||
Unknown2,
|
||||
Cancelled,
|
||||
Ongoing,
|
||||
Finished,
|
||||
Unknown5,
|
||||
|
|
|
|||
|
|
@ -94,8 +94,8 @@ object PlayerStateMessage extends Marshallable[PlayerStateMessage] {
|
|||
("pos" | Vector3.codec_pos) ::
|
||||
optional(bool, "vel" | Vector3.codec_vel) ::
|
||||
("facingYaw" | Angular.codec_yaw()) ::
|
||||
("facingPitch" | Angular.codec_pitch) ::
|
||||
("facingYawUpper" | Angular.codec_yaw(0f)) ::
|
||||
("facingPitch" | Angular.codec_zero_centered) ::
|
||||
("facingYawUpper" | Angular.codec_zero_centered) ::
|
||||
("unk1" | uintL(10)) ::
|
||||
(bool >>:~ { fourBools =>
|
||||
newcodecs.binary_choice(!fourBools, booleanCodec, defaultCodec)
|
||||
|
|
|
|||
|
|
@ -16,10 +16,13 @@ import scodec.codecs._
|
|||
* @param pos where the player is in the world
|
||||
* @param vel how the player is moving
|
||||
* @param facingYaw a "yaw" angle
|
||||
* @param facingPitch a "pitch" angle
|
||||
* @param facingPitch a "pitch" angle;
|
||||
* 0 for forward-facing;
|
||||
* 75.9375 for the up-facing limit;
|
||||
* -73.125 for the down-facing limit
|
||||
* @param facingYawUpper a "yaw" angle that represents the angle of the avatar's upper body with respect to its forward-facing direction;
|
||||
* this number is normally 0 for forward facing;
|
||||
* the range is limited between approximately 61 degrees of center turned to left or right
|
||||
* 0 for forward-facing;
|
||||
* +/-61.875 for the clockwise/counterclockwise turn limits, respectively
|
||||
* @param seq_time the "time frame" according to the server;
|
||||
* starts at 0; max value is 1023 before resetting
|
||||
* @param unk1 na
|
||||
|
|
@ -59,8 +62,8 @@ object PlayerStateMessageUpstream extends Marshallable[PlayerStateMessageUpstrea
|
|||
("pos" | Vector3.codec_pos) ::
|
||||
("vel" | optional(bool, Vector3.codec_vel)) ::
|
||||
("facingYaw" | Angular.codec_yaw()) ::
|
||||
("facingPitch" | Angular.codec_pitch) ::
|
||||
("facingYawUpper" | Angular.codec_yaw(0f)) ::
|
||||
("facingPitch" | Angular.codec_zero_centered) ::
|
||||
("facingYawUpper" | Angular.codec_zero_centered) ::
|
||||
("seq_time" | uintL(10)) ::
|
||||
("unk1" | uintL(3)) ::
|
||||
("is_crouching" | bool) ::
|
||||
|
|
|
|||
|
|
@ -357,8 +357,8 @@ object CharacterAppearanceData extends Marshallable[CharacterAppearanceData] {
|
|||
("unk2" | bool) :: //requires alt_model flag (does NOT require health == 0)
|
||||
("unk3" | bool) :: //stream misalignment when set
|
||||
("unk4" | bool) :: //unknown
|
||||
("facingPitch" | Angular.codec_pitch) ::
|
||||
("facingYawUpper" | Angular.codec_yaw(0f)) ::
|
||||
("facingPitch" | Angular.codec_zero_centered) ::
|
||||
("facingYawUpper" | Angular.codec_zero_centered) ::
|
||||
("lfs" | uint2) ::
|
||||
("grenade_state" | GrenadeState.codec_2u) :: //note: bin10 and bin11 are neutral (bin00 is not defined)
|
||||
("is_cloaking" | bool) ::
|
||||
|
|
|
|||
|
|
@ -21,10 +21,7 @@ object Angular {
|
|||
case _ :: roll :: HNil =>
|
||||
roll
|
||||
},
|
||||
{
|
||||
case roll : Float =>
|
||||
() :: roll :: HNil
|
||||
}
|
||||
roll => () :: roll :: HNil
|
||||
)
|
||||
|
||||
def codec_roll(bits : Int) : Codec[Float] = newcodecs.q_float(0.0f, 360.0f, bits)
|
||||
|
|
@ -38,21 +35,12 @@ object Angular {
|
|||
case _ :: pitch :: HNil =>
|
||||
pitch
|
||||
},
|
||||
{
|
||||
case pitch : Float =>
|
||||
() :: pitch :: HNil
|
||||
}
|
||||
pitch => () :: pitch :: HNil
|
||||
)
|
||||
|
||||
def codec_pitch(bits : Int) : Codec[Float] = newcodecs.q_float(360.0f, 0.0f, bits).xmap[Float] (
|
||||
{
|
||||
case pitch =>
|
||||
decodeCorrectedAngle(pitch)
|
||||
},
|
||||
{
|
||||
case pitch : Float =>
|
||||
encodeCorrectedAngle(pitch)
|
||||
}
|
||||
pitch => decodeCorrectedAngle(pitch),
|
||||
pitch => encodeCorrectedAngle(pitch)
|
||||
)
|
||||
|
||||
//yaw
|
||||
|
|
@ -64,20 +52,21 @@ object Angular {
|
|||
case _ :: yaw :: HNil =>
|
||||
yaw
|
||||
},
|
||||
{
|
||||
case yaw : Float =>
|
||||
() :: yaw :: HNil
|
||||
}
|
||||
yaw => () :: yaw :: HNil
|
||||
)
|
||||
|
||||
def codec_yaw(bits : Int, North : Float) : Codec[Float] = newcodecs.q_float(360.0f, 0.0f, bits).xmap[Float] (
|
||||
{
|
||||
case yaw =>
|
||||
decodeCorrectedAngle(yaw, North)
|
||||
},
|
||||
{
|
||||
case yaw : Float =>
|
||||
encodeCorrectedAngle(yaw, North)
|
||||
yaw => decodeCorrectedAngle(yaw, North),
|
||||
yaw => encodeCorrectedAngle(yaw, North)
|
||||
)
|
||||
|
||||
val codec_zero_centered : Codec[Float] = codec_yaw(North = 0).xmap[Float] (
|
||||
out => if(out > 180) out - 360 else out,
|
||||
in => {
|
||||
val adjustedIn = in % 360
|
||||
if(adjustedIn < 0) 360 + adjustedIn
|
||||
else if(adjustedIn > 180) 360 - adjustedIn
|
||||
else adjustedIn
|
||||
}
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ class PlayerStateMessageTest extends Specification {
|
|||
vel.get.y mustEqual 6.5625f
|
||||
vel.get.z mustEqual 0.0f
|
||||
facingYaw mustEqual 22.5f
|
||||
facingPitch mustEqual 348.75f
|
||||
facingPitch mustEqual -11.25f
|
||||
facingUpper mustEqual 0f
|
||||
unk1 mustEqual 165
|
||||
crouching mustEqual false
|
||||
|
|
@ -105,7 +105,7 @@ class PlayerStateMessageTest extends Specification {
|
|||
PlanetSideGUID(1696),
|
||||
Vector3(4008.6016f, 5987.6016f, 44.1875f),
|
||||
Some(Vector3(2.53125f, 6.5625f, 0f)),
|
||||
22.5f, 348.75f, 0f, 165,
|
||||
22.5f, -11.25f, 0f, 165,
|
||||
false, false, false, false)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
pkt mustEqual string_vel
|
||||
|
|
|
|||
|
|
@ -15,9 +15,9 @@ class PlayerStateMessageUpstreamTest extends Specification {
|
|||
case PlayerStateMessageUpstream(avatar_guid, pos, vel, facingYaw, facingPitch, facingYawUpper, seq_time, unk1, is_crouching, is_jumping, jump_thrust, is_cloaked, unk2, unk3) =>
|
||||
avatar_guid mustEqual PlanetSideGUID(75)
|
||||
pos mustEqual Vector3(3694.1094f, 2735.4531f, 90.84375f)
|
||||
vel mustEqual Some(Vector3(4.375f, 2.59375f, 0.0f))
|
||||
vel.contains(Vector3(4.375f, 2.59375f, 0.0f)) mustEqual true
|
||||
facingYaw mustEqual 61.875f
|
||||
facingPitch mustEqual 351.5625f
|
||||
facingPitch mustEqual -8.4375f
|
||||
facingYawUpper mustEqual 0.0f
|
||||
seq_time mustEqual 136
|
||||
unk1 mustEqual 0
|
||||
|
|
@ -33,7 +33,7 @@ class PlayerStateMessageUpstreamTest extends Specification {
|
|||
}
|
||||
|
||||
"encode" in {
|
||||
val msg = PlayerStateMessageUpstream(PlanetSideGUID(75), Vector3(3694.1094f, 2735.4531f, 90.84375f), Some(Vector3(4.375f, 2.59375f, 0.0f)), 61.875f, 351.5625f, 0.0f, 136, 0, false, false, false, false, 112, 0)
|
||||
val msg = PlayerStateMessageUpstream(PlanetSideGUID(75), Vector3(3694.1094f, 2735.4531f, 90.84375f), Some(Vector3(4.375f, 2.59375f, 0.0f)), 61.875f, -8.4375f, 0.0f, 136, 0, false, false, false, false, 112, 0)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
|
||||
pkt mustEqual string
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ class CharacterDataTest extends Specification {
|
|||
b.outfit_name mustEqual "Black Beret Armoured Corps"
|
||||
b.outfit_logo mustEqual 23
|
||||
b.backpack mustEqual false
|
||||
b.facingPitch mustEqual 320.625f
|
||||
b.facingPitch mustEqual -39.375f
|
||||
b.facingYawUpper mustEqual 0
|
||||
b.lfs mustEqual false
|
||||
b.grenade_state mustEqual GrenadeState.None
|
||||
|
|
@ -176,7 +176,7 @@ class CharacterDataTest extends Specification {
|
|||
b.outfit_name mustEqual "Black Beret Armoured Corps"
|
||||
b.outfit_logo mustEqual 23
|
||||
b.backpack mustEqual false
|
||||
b.facingPitch mustEqual 320.625f
|
||||
b.facingPitch mustEqual -39.375f
|
||||
b.facingYawUpper mustEqual 0
|
||||
b.lfs mustEqual false
|
||||
b.grenade_state mustEqual GrenadeState.None
|
||||
|
|
@ -245,7 +245,7 @@ class CharacterDataTest extends Specification {
|
|||
b.outfit_name mustEqual "Original District"
|
||||
b.outfit_logo mustEqual 23
|
||||
b.backpack mustEqual true
|
||||
b.facingPitch mustEqual 351.5625f
|
||||
b.facingPitch mustEqual -8.4375f
|
||||
b.facingYawUpper mustEqual 0
|
||||
b.lfs mustEqual false
|
||||
b.grenade_state mustEqual GrenadeState.None
|
||||
|
|
@ -334,7 +334,7 @@ class CharacterDataTest extends Specification {
|
|||
false,
|
||||
false,
|
||||
false,
|
||||
320.625f, 0f,
|
||||
-39.375f, 0f,
|
||||
false,
|
||||
GrenadeState.None,
|
||||
false,
|
||||
|
|
@ -414,7 +414,7 @@ class CharacterDataTest extends Specification {
|
|||
false,
|
||||
false,
|
||||
false,
|
||||
320.625f, 0f,
|
||||
-39.375f, 0f,
|
||||
false,
|
||||
GrenadeState.None,
|
||||
false,
|
||||
|
|
@ -497,7 +497,7 @@ class CharacterDataTest extends Specification {
|
|||
false, //unk2
|
||||
false, //unk3
|
||||
false, //unk4
|
||||
351.5625f, 0f,
|
||||
351.5625f, 0f, //also: -8.4375f, 0f
|
||||
false, //lfs
|
||||
GrenadeState.None,
|
||||
false, //is_cloaking
|
||||
|
|
|
|||
|
|
@ -458,7 +458,7 @@ class DetailedCharacterDataTest extends Specification {
|
|||
b.outfit_name mustEqual ""
|
||||
b.outfit_logo mustEqual 0
|
||||
b.backpack mustEqual false
|
||||
b.facingPitch mustEqual 348.75f
|
||||
b.facingPitch mustEqual -11.25f
|
||||
b.facingYawUpper mustEqual 0
|
||||
b.lfs mustEqual true
|
||||
b.grenade_state mustEqual GrenadeState.None
|
||||
|
|
@ -666,8 +666,8 @@ class DetailedCharacterDataTest extends Specification {
|
|||
b.outfit_name mustEqual ""
|
||||
b.outfit_logo mustEqual 14
|
||||
b.backpack mustEqual false
|
||||
b.facingPitch mustEqual 348.75f
|
||||
b.facingYawUpper mustEqual 348.75f
|
||||
b.facingPitch mustEqual -11.25f
|
||||
b.facingYawUpper mustEqual -11.25f
|
||||
b.lfs mustEqual false
|
||||
b.grenade_state mustEqual GrenadeState.None
|
||||
b.is_cloaking mustEqual false
|
||||
|
|
@ -1759,7 +1759,7 @@ class DetailedCharacterDataTest extends Specification {
|
|||
false,
|
||||
false,
|
||||
false,
|
||||
348.75f, 0,
|
||||
-11.25f, 0,
|
||||
true,
|
||||
GrenadeState.None,
|
||||
false,
|
||||
|
|
@ -1949,7 +1949,7 @@ class DetailedCharacterDataTest extends Specification {
|
|||
false,
|
||||
false,
|
||||
false,
|
||||
348.75f, 348.75f,
|
||||
-11.25f, -11.25f,
|
||||
false,
|
||||
GrenadeState.None,
|
||||
false,
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ class MountedVehiclesTest extends Specification {
|
|||
b.outfit_name mustEqual "Black Beret Armoured Corps"
|
||||
b.outfit_logo mustEqual 23
|
||||
b.backpack mustEqual false
|
||||
b.facingPitch mustEqual 348.75f
|
||||
b.facingPitch mustEqual -11.25f
|
||||
b.facingYawUpper mustEqual 0
|
||||
b.lfs mustEqual false
|
||||
b.grenade_state mustEqual GrenadeState.None
|
||||
|
|
@ -167,7 +167,7 @@ class MountedVehiclesTest extends Specification {
|
|||
false,
|
||||
false,
|
||||
false,
|
||||
348.75f, 0,
|
||||
-11.25f, 0,
|
||||
false,
|
||||
GrenadeState.None,
|
||||
false,
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ class EntityTest extends Specification {
|
|||
val obj : EntityTestClass = new EntityTestClass()
|
||||
obj.Position mustEqual Vector3(0f, 0f, 0f)
|
||||
obj.Orientation mustEqual Vector3(0f, 0f, 0f)
|
||||
obj.Velocity mustEqual None
|
||||
obj.Velocity.isEmpty mustEqual true
|
||||
}
|
||||
|
||||
"mutate and access" in {
|
||||
|
|
@ -35,7 +35,7 @@ class EntityTest extends Specification {
|
|||
|
||||
obj.Position mustEqual Vector3(1f, 1f, 1f)
|
||||
obj.Orientation mustEqual Vector3(2f, 2f, 2f)
|
||||
obj.Velocity mustEqual Some(Vector3(3f, 3f, 3f))
|
||||
obj.Velocity.contains(Vector3(3f, 3f, 3f)) mustEqual true
|
||||
}
|
||||
|
||||
"clamp Orientation" in {
|
||||
|
|
@ -43,6 +43,61 @@ class EntityTest extends Specification {
|
|||
obj.Orientation = Vector3(-1f, 361f, -0f)
|
||||
obj.Orientation mustEqual Vector3(359f, 1f, 0f)
|
||||
}
|
||||
|
||||
"is moving (at all)" in {
|
||||
val obj : EntityTestClass = new EntityTestClass
|
||||
obj.Velocity.isEmpty mustEqual true
|
||||
obj.isMoving mustEqual false
|
||||
|
||||
obj.Velocity = Vector3.Zero
|
||||
obj.isMoving mustEqual false
|
||||
obj.Velocity = Vector3(1,0,0)
|
||||
obj.isMoving mustEqual true
|
||||
obj.Velocity = None
|
||||
obj.isMoving mustEqual false
|
||||
}
|
||||
|
||||
"is moving (Vector3 comparison)" in {
|
||||
val obj : EntityTestClass = new EntityTestClass
|
||||
val test1 = Vector3(1,0,0)
|
||||
val test2 = Vector3(2,0,0)
|
||||
obj.Velocity.isEmpty mustEqual true
|
||||
obj.isMoving mustEqual false
|
||||
obj.isMoving(test1) mustEqual false
|
||||
obj.isMoving(test2) mustEqual false
|
||||
|
||||
obj.Velocity = Vector3(1,0,0)
|
||||
obj.isMoving(test1) mustEqual true
|
||||
obj.isMoving(test2) mustEqual false
|
||||
obj.Velocity = Vector3(3,0,0)
|
||||
obj.isMoving(test1) mustEqual true
|
||||
obj.isMoving(test2) mustEqual true
|
||||
obj.Velocity = Vector3(1,1,0)
|
||||
obj.isMoving(test1) mustEqual true
|
||||
obj.isMoving(test2) mustEqual false
|
||||
}
|
||||
|
||||
"is moving (Float comparison)" in {
|
||||
val obj : EntityTestClass = new EntityTestClass
|
||||
obj.Velocity.isEmpty mustEqual true
|
||||
obj.isMoving mustEqual false
|
||||
obj.isMoving(1) mustEqual false
|
||||
obj.isMoving(2) mustEqual false
|
||||
obj.isMoving(4) mustEqual false
|
||||
|
||||
obj.Velocity = Vector3(1,0,0)
|
||||
obj.isMoving(1) mustEqual true
|
||||
obj.isMoving(2) mustEqual false
|
||||
obj.isMoving(4) mustEqual false
|
||||
obj.Velocity = Vector3(3,0,0)
|
||||
obj.isMoving(1) mustEqual true
|
||||
obj.isMoving(2) mustEqual true
|
||||
obj.isMoving(4) mustEqual true
|
||||
obj.Velocity = Vector3(1,1,1)
|
||||
obj.isMoving(1) mustEqual true
|
||||
obj.isMoving(2) mustEqual true
|
||||
obj.isMoving(4) mustEqual false
|
||||
}
|
||||
}
|
||||
|
||||
"IdentifiableEntity" should {
|
||||
|
|
|
|||
|
|
@ -133,26 +133,26 @@ class PlayerTest extends Specification {
|
|||
obj.Stamina mustEqual 456
|
||||
}
|
||||
|
||||
"set new values (health, armor, stamina) but only when alive" in {
|
||||
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
|
||||
obj.Health = 23
|
||||
obj.Armor = 34
|
||||
obj.Stamina = 45
|
||||
obj.Health mustEqual 0
|
||||
obj.Armor mustEqual 0
|
||||
obj.Stamina mustEqual 0
|
||||
|
||||
obj.Spawn
|
||||
obj.Health mustEqual obj.MaxHealth
|
||||
obj.Armor mustEqual obj.MaxArmor
|
||||
obj.Stamina mustEqual obj.MaxStamina
|
||||
obj.Health = 23
|
||||
obj.Armor = 34
|
||||
obj.Stamina = 45
|
||||
obj.Health mustEqual 23
|
||||
obj.Armor mustEqual 34
|
||||
obj.Stamina mustEqual 45
|
||||
}
|
||||
// "set new values (health, armor, stamina) but only when alive" in {
|
||||
// val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
|
||||
// obj.Health = 23
|
||||
// obj.Armor = 34
|
||||
// obj.Stamina = 45
|
||||
// obj.Health mustEqual 0
|
||||
// obj.Armor mustEqual 0
|
||||
// obj.Stamina mustEqual 0
|
||||
//
|
||||
// obj.Spawn
|
||||
// obj.Health mustEqual obj.MaxHealth
|
||||
// obj.Armor mustEqual obj.MaxArmor
|
||||
// obj.Stamina mustEqual obj.MaxStamina
|
||||
// obj.Health = 23
|
||||
// obj.Armor = 34
|
||||
// obj.Stamina = 45
|
||||
// obj.Health mustEqual 23
|
||||
// obj.Armor mustEqual 34
|
||||
// obj.Stamina mustEqual 45
|
||||
// }
|
||||
|
||||
"has visible slots" in {
|
||||
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue