mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-04-21 11:55:19 +00:00
* Add .scalafmt.conf
* Adopt quill for database access
* Removed postgresql-async
* Refactored all instances of database access
* Creating duplicate characters of the same account is no longer possible
* Rewrote large parts of LoginSessionActor
* Implement migrations
* Move overrides into subdirectory
* Make usernames case insensitive
* Use LOWER(?) comparison instead of storing lowercased username
* import scala.util.{Success, Failure}
* Add config and joda-time dependencies
* Add sbt-scalafmt
* Use defaultWithAlign scalafmt preset
* Format all
* Add scalafix
* Remove unused imports
* Don't lowercase username when inserting
* Update readme
* Listen on worldserver.Hostname address
* Remove database test on startup
It could fail when the global thread pool is busy loading zone
maps. Migrations run on the main thread and also serve the
purpose of verifying the database configuration so it's fine to
remove the test altogether.
* Refactor chat message handlers, zones
What started as a small change to how zones are stored turned
into a pretty big effort of refactoring the chat message handler.
The !hack command was removed, the /capturebase commandwas added.
* Expose db ports in docker-compose.yml
* Silence property override log
* Rework configuration
* Unify configuration using the typesafe.config library
* Add configuration option for public address
* Configuration is now loaded from application.conf rather than worldserver.ini
* Refactor PsLogin and remove unnecessary logging
* Move pslogin into net.psforever.pslogin namespace
* Fix coverage
This commit is contained in:
parent
88b194fde2
commit
e0defe8240
850 changed files with 144487 additions and 47476 deletions
|
|
@ -9,14 +9,16 @@ import org.specs2.mutable._
|
|||
import scodec.bits._
|
||||
|
||||
class CharacterDataTest extends Specification {
|
||||
val string = hex"17 73070000 BC8 3E0F 6C2D7 65535 CA16 00 00 09 9741E4F804000000 234530063007200610077006E00790052006F006E006E0069006500 220B7 E67B540404001000000000022B50100 268042006C00610063006B002000420065007200650074002000410072006D006F007500720065006400200043006F00720070007300 1700E0030050040003BC00000234040001A004000 3FFF67A8F A0A5424E0E800000000080952A9C3A03000001081103E040000000A023782F1080C0000016244108200000000808382403A030000014284C3A0C0000000202512F00B80C00000578F80F840000000280838B3C320300000080"
|
||||
val string =
|
||||
hex"17 73070000 BC8 3E0F 6C2D7 65535 CA16 00 00 09 9741E4F804000000 234530063007200610077006E00790052006F006E006E0069006500 220B7 E67B540404001000000000022B50100 268042006C00610063006B002000420065007200650074002000410072006D006F007500720065006400200043006F00720070007300 1700E0030050040003BC00000234040001A004000 3FFF67A8F A0A5424E0E800000000080952A9C3A03000001081103E040000000A023782F1080C0000016244108200000000808382403A030000014284C3A0C0000000202512F00B80C00000578F80F840000000280838B3C320300000080"
|
||||
//string seated was intentionally-produced test data
|
||||
val string_seated =
|
||||
hex"170307000069023c83e0f800000011a0530063007200610077006e00790052006f006e006e0069006500220b700000000000000000000000" ++
|
||||
hex"06800000268042006c00610063006b002000420065007200650074002000410072006d006f007500720065006400200043006f0072007000" ++
|
||||
hex"73001700e0030050040003bc00000234040001a00400020a8fa0a5424e0e800000000080952a9c3a03000001081103e040000000a023782f" ++
|
||||
hex"1080c0000016244108200000000808382403a030000014284c3a0c0000000202512f00b80c00000578f80f840000000280838b3c320300000080"
|
||||
val string_backpack = hex"17 9C030000 BC8 340D F20A9 3956C AF0D 00 00 73 480000 87041006E00670065006C006C006F00 4A148 0000000000000000000000005C54200 24404F0072006900670069006E0061006C00200044006900730074007200690063007400 1740180181E8000000C202000042000000D202000000010A3C00"
|
||||
hex"06800000268042006c00610063006b002000420065007200650074002000410072006d006f007500720065006400200043006f0072007000" ++
|
||||
hex"73001700e0030050040003bc00000234040001a00400020a8fa0a5424e0e800000000080952a9c3a03000001081103e040000000a023782f" ++
|
||||
hex"1080c0000016244108200000000808382403a030000014284c3a0c0000000202512f00b80c00000578f80f840000000280838b3c320300000080"
|
||||
val string_backpack =
|
||||
hex"17 9C030000 BC8 340D F20A9 3956C AF0D 00 00 73 480000 87041006E00670065006C006C006F00 4A148 0000000000000000000000005C54200 24404F0072006900670069006E0061006C00200044006900730074007200690063007400 1740180181E8000000C202000042000000D202000000010A3C00"
|
||||
|
||||
"CharacterData" should {
|
||||
"decode" in {
|
||||
|
|
@ -88,8 +90,13 @@ class CharacterDataTest extends Specification {
|
|||
char.implant_effects.length mustEqual 1
|
||||
char.implant_effects.head mustEqual ImplantEffects.NoEffects
|
||||
char.cosmetics match {
|
||||
case Some(c : Cosmetics) =>
|
||||
c.Styles mustEqual Set(PersonalStyle.NoHelmet, PersonalStyle.Beret, PersonalStyle.Sunglasses, PersonalStyle.Earpiece)
|
||||
case Some(c: Cosmetics) =>
|
||||
c.Styles mustEqual Set(
|
||||
PersonalStyle.NoHelmet,
|
||||
PersonalStyle.Beret,
|
||||
PersonalStyle.Sunglasses,
|
||||
PersonalStyle.Earpiece
|
||||
)
|
||||
case None =>
|
||||
ko
|
||||
}
|
||||
|
|
@ -196,7 +203,7 @@ class CharacterDataTest extends Specification {
|
|||
ribbons.middle mustEqual MeritCommendation.HeavyInfantry4
|
||||
ribbons.lower mustEqual MeritCommendation.TankBuster7
|
||||
ribbons.tos mustEqual MeritCommendation.SixYearTR
|
||||
//etc..
|
||||
//etc..
|
||||
case _ =>
|
||||
ko
|
||||
}
|
||||
|
|
@ -276,8 +283,13 @@ class CharacterDataTest extends Specification {
|
|||
char.command_rank mustEqual 2
|
||||
char.implant_effects.isEmpty mustEqual true
|
||||
char.cosmetics match {
|
||||
case Some(c : Cosmetics) =>
|
||||
c.Styles mustEqual Set(PersonalStyle.NoHelmet, PersonalStyle.Beret, PersonalStyle.Sunglasses, PersonalStyle.Earpiece)
|
||||
case Some(c: Cosmetics) =>
|
||||
c.Styles mustEqual Set(
|
||||
PersonalStyle.NoHelmet,
|
||||
PersonalStyle.Beret,
|
||||
PersonalStyle.Sunglasses,
|
||||
PersonalStyle.Earpiece
|
||||
)
|
||||
case None =>
|
||||
ko
|
||||
}
|
||||
|
|
@ -293,12 +305,12 @@ class CharacterDataTest extends Specification {
|
|||
}
|
||||
|
||||
"encode" in {
|
||||
val pos : PlacementData = PlacementData(
|
||||
val pos: PlacementData = PlacementData(
|
||||
Vector3(3674.8438f, 2726.789f, 91.15625f),
|
||||
Vector3(0f, 0f, 64.6875f),
|
||||
Some(Vector3(1.4375f, -0.4375f, 0f))
|
||||
)
|
||||
val a : Int=>CharacterAppearanceA = CharacterAppearanceA(
|
||||
val a: Int => CharacterAppearanceA = CharacterAppearanceA(
|
||||
BasicCharacterData(
|
||||
"ScrawnyRonnie",
|
||||
PlanetSideEmpire.TR,
|
||||
|
|
@ -325,7 +337,7 @@ class CharacterDataTest extends Specification {
|
|||
0,
|
||||
0
|
||||
)
|
||||
val b : (Boolean,Int)=>CharacterAppearanceB = CharacterAppearanceB(
|
||||
val b: (Boolean, Int) => CharacterAppearanceB = CharacterAppearanceB(
|
||||
316554L,
|
||||
"Black Beret Armoured Corps",
|
||||
23,
|
||||
|
|
@ -334,7 +346,8 @@ class CharacterDataTest extends Specification {
|
|||
false,
|
||||
false,
|
||||
false,
|
||||
-39.375f, 0f,
|
||||
-39.375f,
|
||||
0f,
|
||||
false,
|
||||
GrenadeState.None,
|
||||
false,
|
||||
|
|
@ -345,8 +358,9 @@ class CharacterDataTest extends Specification {
|
|||
None
|
||||
)
|
||||
|
||||
val app : Int=>CharacterAppearanceData = CharacterAppearanceData(
|
||||
a, b,
|
||||
val app: Int => CharacterAppearanceData = CharacterAppearanceData(
|
||||
a,
|
||||
b,
|
||||
RibbonBars(
|
||||
MeritCommendation.MarkovVeteran,
|
||||
MeritCommendation.HeavyInfantry4,
|
||||
|
|
@ -354,8 +368,9 @@ class CharacterDataTest extends Specification {
|
|||
MeritCommendation.SixYearTR
|
||||
)
|
||||
)
|
||||
val char : (Boolean,Boolean)=>CharacterData = CharacterData(
|
||||
255, 253,
|
||||
val char: (Boolean, Boolean) => CharacterData = CharacterData(
|
||||
255,
|
||||
253,
|
||||
UniformStyle.ThirdUpgrade,
|
||||
7,
|
||||
5,
|
||||
|
|
@ -363,11 +378,36 @@ class CharacterDataTest extends Specification {
|
|||
Some(Cosmetics(true, true, true, true, false))
|
||||
)
|
||||
val inv = InventoryData(
|
||||
InventoryItemData(ObjectClass.plasma_grenade, PlanetSideGUID(3662), 0, WeaponData(0, 0, ObjectClass.plasma_grenade_ammo, PlanetSideGUID(3751), 0, CommonFieldData()(false))) ::
|
||||
InventoryItemData(ObjectClass.bank, PlanetSideGUID(3908), 1, WeaponData(0, 0, 1, ObjectClass.armor_canister, PlanetSideGUID(4143), 0, CommonFieldData()(false))) ::
|
||||
InventoryItemData(ObjectClass.mini_chaingun, PlanetSideGUID(4164), 2, WeaponData(0, 0, ObjectClass.bullet_9mm, PlanetSideGUID(3728), 0, CommonFieldData()(false))) ::
|
||||
InventoryItemData(ObjectClass.phoenix, PlanetSideGUID(3603), 3, WeaponData(0, 0, ObjectClass.phoenix_missile, PlanetSideGUID(3056), 0, CommonFieldData()(false))) ::
|
||||
InventoryItemData(ObjectClass.chainblade, PlanetSideGUID(4088), 4, WeaponData(0, 0, 1, ObjectClass.melee_ammo, PlanetSideGUID(3279), 0, CommonFieldData()(false))) ::
|
||||
InventoryItemData(
|
||||
ObjectClass.plasma_grenade,
|
||||
PlanetSideGUID(3662),
|
||||
0,
|
||||
WeaponData(0, 0, ObjectClass.plasma_grenade_ammo, PlanetSideGUID(3751), 0, CommonFieldData()(false))
|
||||
) ::
|
||||
InventoryItemData(
|
||||
ObjectClass.bank,
|
||||
PlanetSideGUID(3908),
|
||||
1,
|
||||
WeaponData(0, 0, 1, ObjectClass.armor_canister, PlanetSideGUID(4143), 0, CommonFieldData()(false))
|
||||
) ::
|
||||
InventoryItemData(
|
||||
ObjectClass.mini_chaingun,
|
||||
PlanetSideGUID(4164),
|
||||
2,
|
||||
WeaponData(0, 0, ObjectClass.bullet_9mm, PlanetSideGUID(3728), 0, CommonFieldData()(false))
|
||||
) ::
|
||||
InventoryItemData(
|
||||
ObjectClass.phoenix,
|
||||
PlanetSideGUID(3603),
|
||||
3,
|
||||
WeaponData(0, 0, ObjectClass.phoenix_missile, PlanetSideGUID(3056), 0, CommonFieldData()(false))
|
||||
) ::
|
||||
InventoryItemData(
|
||||
ObjectClass.chainblade,
|
||||
PlanetSideGUID(4088),
|
||||
4,
|
||||
WeaponData(0, 0, 1, ObjectClass.melee_ammo, PlanetSideGUID(3279), 0, CommonFieldData()(false))
|
||||
) ::
|
||||
Nil
|
||||
)
|
||||
val obj = PlayerData(pos, app, char, inv, DrawnSlot.Rifle1)
|
||||
|
|
@ -378,7 +418,7 @@ class CharacterDataTest extends Specification {
|
|||
}
|
||||
|
||||
"encode (seated)" in {
|
||||
val a : Int=>CharacterAppearanceA = CharacterAppearanceA(
|
||||
val a: Int => CharacterAppearanceA = CharacterAppearanceA(
|
||||
BasicCharacterData(
|
||||
"ScrawnyRonnie",
|
||||
PlanetSideEmpire.TR,
|
||||
|
|
@ -405,7 +445,7 @@ class CharacterDataTest extends Specification {
|
|||
0,
|
||||
0
|
||||
)
|
||||
val b : (Boolean,Int)=>CharacterAppearanceB = CharacterAppearanceB(
|
||||
val b: (Boolean, Int) => CharacterAppearanceB = CharacterAppearanceB(
|
||||
26L,
|
||||
"Black Beret Armoured Corps",
|
||||
23,
|
||||
|
|
@ -414,7 +454,8 @@ class CharacterDataTest extends Specification {
|
|||
false,
|
||||
false,
|
||||
false,
|
||||
-39.375f, 0f,
|
||||
-39.375f,
|
||||
0f,
|
||||
false,
|
||||
GrenadeState.None,
|
||||
false,
|
||||
|
|
@ -425,8 +466,9 @@ class CharacterDataTest extends Specification {
|
|||
None
|
||||
)
|
||||
|
||||
val app : Int=>CharacterAppearanceData = CharacterAppearanceData(
|
||||
a, b,
|
||||
val app: Int => CharacterAppearanceData = CharacterAppearanceData(
|
||||
a,
|
||||
b,
|
||||
RibbonBars(
|
||||
MeritCommendation.MarkovVeteran,
|
||||
MeritCommendation.HeavyInfantry4,
|
||||
|
|
@ -434,24 +476,55 @@ class CharacterDataTest extends Specification {
|
|||
MeritCommendation.SixYearTR
|
||||
)
|
||||
)
|
||||
val char : (Boolean,Boolean)=>CharacterData = CharacterData(
|
||||
255, 253,
|
||||
val char: (Boolean, Boolean) => CharacterData = CharacterData(
|
||||
255,
|
||||
253,
|
||||
UniformStyle.ThirdUpgrade,
|
||||
5,
|
||||
List(ImplantEffects.NoEffects),
|
||||
Some(Cosmetics(true, true, true, true, false))
|
||||
)
|
||||
val inv = InventoryData(
|
||||
InventoryItemData(ObjectClass.plasma_grenade, PlanetSideGUID(3662), 0, WeaponData(0, 0, ObjectClass.plasma_grenade_ammo, PlanetSideGUID(3751), 0, CommonFieldData()(false))) ::
|
||||
InventoryItemData(ObjectClass.bank, PlanetSideGUID(3908), 1, WeaponData(0, 0, 1, ObjectClass.armor_canister, PlanetSideGUID(4143), 0, CommonFieldData()(false))) ::
|
||||
InventoryItemData(ObjectClass.mini_chaingun, PlanetSideGUID(4164), 2, WeaponData(0, 0, ObjectClass.bullet_9mm, PlanetSideGUID(3728), 0, CommonFieldData()(false))) ::
|
||||
InventoryItemData(ObjectClass.phoenix, PlanetSideGUID(3603), 3, WeaponData(0, 0, ObjectClass.phoenix_missile, PlanetSideGUID(3056), 0, CommonFieldData()(false))) ::
|
||||
InventoryItemData(ObjectClass.chainblade, PlanetSideGUID(4088), 4, WeaponData(0, 0, 1, ObjectClass.melee_ammo, PlanetSideGUID(3279), 0, CommonFieldData()(false))) ::
|
||||
InventoryItemData(
|
||||
ObjectClass.plasma_grenade,
|
||||
PlanetSideGUID(3662),
|
||||
0,
|
||||
WeaponData(0, 0, ObjectClass.plasma_grenade_ammo, PlanetSideGUID(3751), 0, CommonFieldData()(false))
|
||||
) ::
|
||||
InventoryItemData(
|
||||
ObjectClass.bank,
|
||||
PlanetSideGUID(3908),
|
||||
1,
|
||||
WeaponData(0, 0, 1, ObjectClass.armor_canister, PlanetSideGUID(4143), 0, CommonFieldData()(false))
|
||||
) ::
|
||||
InventoryItemData(
|
||||
ObjectClass.mini_chaingun,
|
||||
PlanetSideGUID(4164),
|
||||
2,
|
||||
WeaponData(0, 0, ObjectClass.bullet_9mm, PlanetSideGUID(3728), 0, CommonFieldData()(false))
|
||||
) ::
|
||||
InventoryItemData(
|
||||
ObjectClass.phoenix,
|
||||
PlanetSideGUID(3603),
|
||||
3,
|
||||
WeaponData(0, 0, ObjectClass.phoenix_missile, PlanetSideGUID(3056), 0, CommonFieldData()(false))
|
||||
) ::
|
||||
InventoryItemData(
|
||||
ObjectClass.chainblade,
|
||||
PlanetSideGUID(4088),
|
||||
4,
|
||||
WeaponData(0, 0, 1, ObjectClass.melee_ammo, PlanetSideGUID(3279), 0, CommonFieldData()(false))
|
||||
) ::
|
||||
Nil
|
||||
)
|
||||
val obj = PlayerData(app, char, inv, DrawnSlot.Rifle1)
|
||||
|
||||
val msg = ObjectCreateMessage(ObjectClass.avatar, PlanetSideGUID(3902), ObjectCreateMessageParent(PlanetSideGUID(1234), 0), obj)
|
||||
val msg = ObjectCreateMessage(
|
||||
ObjectClass.avatar,
|
||||
PlanetSideGUID(3902),
|
||||
ObjectCreateMessageParent(PlanetSideGUID(1234), 0),
|
||||
obj
|
||||
)
|
||||
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||
pkt mustEqual string_seated
|
||||
}
|
||||
|
|
@ -461,7 +534,7 @@ class CharacterDataTest extends Specification {
|
|||
Vector3(4629.8906f, 6316.4453f, 54.734375f),
|
||||
Vector3(0, 0, 126.5625f)
|
||||
)
|
||||
val a : Int=>CharacterAppearanceA = CharacterAppearanceA(
|
||||
val a: Int => CharacterAppearanceA = CharacterAppearanceA(
|
||||
BasicCharacterData(
|
||||
"Angello",
|
||||
PlanetSideEmpire.VS,
|
||||
|
|
@ -488,16 +561,17 @@ class CharacterDataTest extends Specification {
|
|||
0,
|
||||
0
|
||||
)
|
||||
val b : (Boolean,Int)=>CharacterAppearanceB = CharacterAppearanceB(
|
||||
val b: (Boolean, Int) => CharacterAppearanceB = CharacterAppearanceB(
|
||||
529687L,
|
||||
"Original District",
|
||||
23,
|
||||
false, //unk1
|
||||
true, //backpack
|
||||
true, //backpack
|
||||
false, //unk2
|
||||
false, //unk3
|
||||
false, //unk4
|
||||
351.5625f, 0f, //also: -8.4375f, 0f
|
||||
351.5625f,
|
||||
0f, //also: -8.4375f, 0f
|
||||
false, //lfs
|
||||
GrenadeState.None,
|
||||
false, //is_cloaking
|
||||
|
|
@ -508,8 +582,9 @@ class CharacterDataTest extends Specification {
|
|||
None
|
||||
)
|
||||
|
||||
val app : Int=>CharacterAppearanceData = CharacterAppearanceData(
|
||||
a, b,
|
||||
val app: Int => CharacterAppearanceData = CharacterAppearanceData(
|
||||
a,
|
||||
b,
|
||||
RibbonBars(
|
||||
MeritCommendation.Jacking2,
|
||||
MeritCommendation.ScavengerVS1,
|
||||
|
|
@ -517,8 +592,9 @@ class CharacterDataTest extends Specification {
|
|||
MeritCommendation.SixYearVS
|
||||
)
|
||||
)
|
||||
val char : (Boolean,Boolean)=>CharacterData = CharacterData(
|
||||
0, 0,
|
||||
val char: (Boolean, Boolean) => CharacterData = CharacterData(
|
||||
0,
|
||||
0,
|
||||
UniformStyle.ThirdUpgrade,
|
||||
1,
|
||||
List(),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue