mirror of
https://github.com/psforever/PSF-LoginServer.git
synced 2026-03-02 20:10:24 +00:00
3398 lines
186 KiB
Scala
3398 lines
186 KiB
Scala
// Copyright (c) 2017 PSForever
|
|
package game.objectcreatedetailed
|
|
|
|
import org.specs2.mutable._
|
|
import net.psforever.packet._
|
|
import net.psforever.packet.game.{ObjectCreateDetailedMessage, _}
|
|
import net.psforever.packet.game.objectcreate._
|
|
import net.psforever.types._
|
|
import scodec.bits._
|
|
|
|
class DetailedCharacterDataTest extends Specification {
|
|
val string = hex"18 570C0000 BC8 4B00 6C2D7 65535 CA16 0 00 01 34 40 00 0970 49006C006C006C004900490049006C006C006C0049006C0049006C006C0049006C006C006C0049006C006C004900 84 52 70 76 1E 80 80 00 00 00 00 00 3FFFC 0 00 00 00 20 00 00 0F F6 A7 03 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 90 01 90 00 64 00 00 01 00 7E C8 00 C8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 C0 00 42 C5 46 86 C7 00 00 00 80 00 00 12 40 78 70 65 5F 73 61 6E 63 74 75 61 72 79 5F 68 65 6C 70 90 78 70 65 5F 74 68 5F 66 69 72 65 6D 6F 64 65 73 8B 75 73 65 64 5F 62 65 61 6D 65 72 85 6D 61 70 31 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0A 23 02 60 04 04 40 00 00 10 00 06 02 08 14 D0 08 0C 80 00 02 00 02 6B 4E 00 82 88 00 00 02 00 00 C0 41 C0 9E 01 01 90 00 00 64 00 44 2A 00 10 91 00 00 00 40 00 18 08 38 94 40 20 32 00 00 00 80 19 05 48 02 17 20 00 00 08 00 70 29 80 43 64 00 00 32 00 0E 05 40 08 9C 80 00 06 40 01 C0 AA 01 19 90 00 00 C8 00 3A 15 80 28 72 00 00 19 00 04 0A B8 05 26 40 00 03 20 06 C2 58 00 A7 88 00 00 02 00 00 80 00 00"
|
|
val string_seated =
|
|
hex"181f0c000066d5bc84b00808000012e049006c006c006c004900490049006c006c006c0049006c0049006c006c0049006c006c006c004900" ++
|
|
hex"6c006c0049008452700000000000000000000000000000002000000fe6a703fffffffffffffffffffffffffffffffc000000000000000000" ++
|
|
hex"00000000000000000000019001900064000001007ec800c80000000000000000000000000000000000000001c00042c54686c70000008000" ++
|
|
hex"0012407870655f73616e6374756172795f68656c70907870655f74685f666972656d6f6465738b757365645f6265616d6572856d61703133" ++
|
|
hex"0000000000000000000000000000000000000000000000000000000000010a2302600404400000100006020814d0080c80000200026b4e00" ++
|
|
hex"82880000020000c041c09e01019000006400442a001091000000400018083894402032000000801905480217200000080070298043640000" ++
|
|
hex"32000e0540089c8000064001c0aa0119900000c8003a1580287200001900040ab805264000032006c25800a7880000020000800000"
|
|
val string_max =
|
|
hex"187d280000bc8010063cb74a247ad390000080400008a048006100480061004100540052004d00610078004a727bb69e808000000000003f" ++
|
|
hex"ffc000000020000000400703ffffffffffffffffffffffffffffffff14ec000000000000000000000000000000000001e001e00102040001" ++
|
|
hex"007ec800c800000000000000000000000000000000000000000000000140004686c840000600000012207870655f626174746c655f72616e" ++
|
|
hex"6b5f33917870655f62696e645f666163696c697479927870655f696e7374616e745f616374696f6e917870655f626174746c655f72616e6b" ++
|
|
hex"5f34917870655f626174746c655f72616e6b5f32927870655f73616e6374756172795f68656c708c7870655f64726f705f706f6493787065" ++
|
|
hex"5f6f72626974616c5f73687574746c65917870655f626174746c655f72616e6b5f358e7870655f74685f6e6f6e73616e638f7870655f7468" ++
|
|
hex"5f67726f756e645f708b7870655f74685f616d6d6f907870655f74685f666972656d6f6465738a7870655f74685f6d617897766973697465" ++
|
|
hex"645f73706974666972655f74757272657493766973697465645f77616c6c5f74757272657495766973697465645f7265736f757263655f73" ++
|
|
hex"696c6f9e766973697465645f63657274696669636174696f6e5f7465726d696e616c94766973697465645f6d65645f7465726d696e616c9a" ++
|
|
hex"766973697465645f62726f6164636173745f77617270676174658c757365645f7068616c616e789c766973697465645f6169725f76656869" ++
|
|
hex"636c655f7465726d696e616c94766973697465645f6266725f7465726d696e616c8b757365645f6379636c657297766973697465645f6761" ++
|
|
hex"6c6178795f7465726d696e616c98766973697465645f696d706c616e745f7465726d696e616c9a766973697465645f65787465726e616c5f" ++
|
|
hex"646f6f725f6c6f636b98766973697465645f7265737061776e5f7465726d696e616c8e766973697465645f6c6f636b657295766973697465" ++
|
|
hex"645f6d6f74696f6e5f73656e736f7293757365645f6772656e6164655f706c61736d6188757365645f72656b8d757365645f726570656174" ++
|
|
hex"65729f766973697465645f6465636f6e737472756374696f6e5f7465726d696e616c99766973697465645f7365636f6e646172795f636170" ++
|
|
hex"747572658f757365645f73757070726573736f7292757365645f74726865765f6275727374657295757365645f74726865765f6475616c63" ++
|
|
hex"79636c657292757365645f74726865765f706f756e64657298766973697465645f636170747572655f7465726d696e616c96766973697465" ++
|
|
hex"645f6f726465725f7465726d696e616c9f766973697465645f67726f756e645f76656869636c655f7465726d696e616c856d61703132856d" ++
|
|
hex"61703130856d61703039856d61703035856d61703033856d6170303200000000000000000000000000000000000000000000000000000000" ++
|
|
hex"0001131e5810040040000010000606049030080c800019000092080103900003200012414020b20000640015e01802102000000800030107" ++
|
|
hex"10380406400000100320840042e400000100049090086c80000480009214011590000190001242c023b20000320002486004964000064000" ++
|
|
hex"490d00c6c80000c8000921c019590000190001243c033b20000320002488006964000064000c211000086c80000020018424000115900000" ++
|
|
hex"04003084c00023b2000000800610a00004964000001000c2150000a6c8000002001842c00015590000004003085c0002bb2000000800610c" ++
|
|
hex"000059640000010000"
|
|
val string_br32 = hex"18 2c e0 00 00 bc 84 B0 00 0b ea 00 6c 7d f1 10 00 00 02 40 00 08 60 4b 00 69 00 43 00 6b 00 4a 00 72 00 02 31 3a cc 82 c0 00 00 00 00 00 00 00 00 3e df 42 00 20 00 0e 00 40 43 40 4c 04 00 02 e8 00 00 03 a8 00 00 01 9c 04 00 00 b8 99 84 00 0e 68 28 00 00 00 00 00 00 00 00 00 00 00 00 01 90 01 90 00 c8 00 00 01 00 7e c8 00 5c 00 00 01 29 c1 cc 80 00 00 00 00 00 00 00 00 00 00 00 00 03 c0 00 40 81 01 c4 45 46 86 c8 88 c9 09 4a 4a 80 50 0c 13 00 00 15 00 80 00 48 00 7870655f6f766572686561645f6d6170 8d7870655f776172705f676174658f7870655f666f726d5f6f75746669748c7870655f626c61636b6f7073927870655f636f6d6d616e645f72616e6b5f35927870655f636f6d6d616e645f72616e6b5f33927870655f73616e6374756172795f68656c70927870655f626174746c655f72616e6b5f3133927870655f626174746c655f72616e6b5f3132927870655f626174746c655f72616e6b5f3130927870655f626174746c655f72616e6b5f3134927870655f626174746c655f72616e6b5f3135937870655f6f72626974616c5f73687574746c658c7870655f64726f705f706f64917870655f62696e645f666163696c697479917870655f626174746c655f72616e6b5f33917870655f626174746c655f72616e6b5f35917870655f626174746c655f72616e6b5f348e7870655f6a6f696e5f73717561648e7870655f666f726d5f7371756164927870655f696e7374616e745f616374696f6e917870655f626174746c655f72616e6b5f32937870655f776172705f676174655f7573616765917870655f626174746c655f72616e6b5f38927870655f626174746c655f72616e6b5f3131917870655f626174746c655f72616e6b5f368e7870655f6d61696c5f616c657274927870655f636f6d6d616e645f72616e6b5f31927870655f626174746c655f72616e6b5f3230927870655f626174746c655f72616e6b5f3138927870655f626174746c655f72616e6b5f3139907870655f6a6f696e5f706c61746f6f6e927870655f626174746c655f72616e6b5f3137927870655f626174746c655f72616e6b5f31368f7870655f6a6f696e5f6f7574666974927870655f626174746c655f72616e6b5f3235927870655f626174746c655f72616e6b5f3234927870655f636f6d6d616e645f72616e6b5f34907870655f666f726d5f706c61746f6f6e8c7870655f62696e645f616d73917870655f626174746c655f72616e6b5f39917870655f626174746c655f72616e6b5f378d7870655f74685f726f757465728c7870655f74685f666c61696c8a7870655f74685f616e748a7870655f74685f616d738f7870655f74685f67726f756e645f708c7870655f74685f6169725f708c7870655f74685f686f7665728d7870655f74685f67726f756e648a7870655f74685f626672927870655f74685f61667465726275726e65728a7870655f74685f6169728c7870655f74685f636c6f616b89757365645f6f69637791757365645f616476616e6365645f61636597766973697465645f73706974666972655f74757272657498766973697465645f73706974666972655f636c6f616b656493766973697465645f73706974666972655f616192766973697465645f74616e6b5f7472617073a1766973697465645f706f727461626c655f6d616e6e65645f7475727265745f6e63a1766973697465645f706f727461626c655f6d616e6e65645f7475727265745f74728e757365645f6d61676375747465728f757365645f636861696e626c6164658f757365645f666f726365626c61646593766973697465645f77616c6c5f74757272657498766973697465645f616e6369656e745f7465726d696e616c8b766973697465645f616d738b766973697465645f616e7490766973697465645f64726f707368697091766973697465645f6c6962657261746f7294766973697465645f6c6967687467756e7368697091766973697465645f6c696768746e696e6790766973697465645f6d616772696465728f766973697465645f70726f776c657293766973697465645f71756164737465616c746890766973697465645f736b7967756172649a766973697465645f74687265656d616e686561767962756767799d766973697465645f74776f5f6d616e5f61737361756c745f627567677998766973697465645f74776f6d616e6865617679627567677998766973697465645f74776f6d616e686f766572627567677990766973697465645f76616e67756172648d766973697465645f666c61696c8e766973697465645f726f7574657293766973697465645f737769746368626c6164658e766973697465645f6175726f726193766973697465645f626174746c657761676f6e8c766973697465645f6675727993766973697465645f7175616461737361756c7496766973697465645f67616c6178795f67756e736869708e766973697465645f6170635f74728e766973697465645f6170635f767390766973697465645f6c6f64657374617290766973697465645f7068616e7461736d91766973697465645f7468756e64657265728e766973697465645f6170635f6e638f766973697465645f76756c747572658c766973697465645f7761737090766973697465645f6d6f73717569746f97766973697465645f617068656c696f6e5f666c6967687497766973697465645f617068656c696f6e5f67756e6e657297766973697465645f636f6c6f737375735f666c6967687497766973697465645f636f6c6f737375735f67756e6e657298766973697465645f706572656772696e655f666c6967687498766973697465645f706572656772696e655f67756e6e657289757365645f62616e6b95766973697465645f7265736f757263655f73696c6f9e766973697465645f63657274696669636174696f6e5f7465726d696e616c94766973697465645f6d65645f7465726d696e616c93757365645f6e616e6f5f64697370656e73657295766973697465645f73656e736f725f736869656c649a766973697465645f62726f6164636173745f77617270676174658c757365645f7068616c616e7894757365645f7068616c616e785f6176636f6d626f96757365645f7068616c616e785f666c616b636f6d626f96766973697465645f77617270676174655f736d616c6c91757365645f666c616d657468726f7765729a757365645f616e6369656e745f7475727265745f776561706f6e92766973697465645f4c4c555f736f636b657492757365645f656e657267795f67756e5f6e6397766973697465645f6d656469756d7472616e73706f72749f757365645f617068656c696f6e5f696d6d6f6c6174696f6e5f63616e6e6f6e93757365645f6772656e6164655f706c61736d6193757365645f6772656e6164655f6a616d6d657298766973697465645f736869656c645f67656e657261746f7295766973697465645f6d6f74696f6e5f73656e736f7296766973697465645f6865616c74685f6372797374616c96766973697465645f7265706169725f6372797374616c97766973697465645f76656869636c655f6372797374616c91757365645f6772656e6164655f6672616788757365645f61636598766973697465645f6164765f6d65645f7465726d696e616c8b757365645f6265616d657290757365645f626f6c745f6472697665728b757365645f6379636c65728a757365645f676175737391757365645f68756e7465727365656b657288757365645f6973708b757365645f6c616e6365728b757365645f6c61736865728e757365645f6d61656c7374726f6d8c757365645f70686f656e69788b757365645f70756c7361728d757365645f70756e69736865728e757365645f725f73686f7467756e8d757365645f7261646961746f7288757365645f72656b8d757365645f72657065617465728c757365645f726f636b6c65748c757365645f737472696b65728f757365645f73757070726573736f728c757365645f7468756d7065729c766973697465645f76616e755f636f6e74726f6c5f636f6e736f6c6598766973697465645f636170747572655f7465726d696e616c92757365645f6d696e695f636861696e67756e91757365645f6c617a655f706f696e7465728c757365645f74656c657061648b757365645f7370696b657291757365645f68656176795f736e6970657293757365645f636f6d6d616e645f75706c696e6b8d757365645f66697265626972648e757365645f666c6563686574746594757365645f68656176795f7261696c5f6265616d89757365645f696c63399a766973697465645f67656e657261746f725f7465726d696e616c8e766973697465645f6c6f636b65729a766973697465645f65787465726e616c5f646f6f725f6c6f636b9c766973697465645f6169725f76656869636c655f7465726d696e616c97766973697465645f67616c6178795f7465726d696e616c98766973697465645f696d706c616e745f7465726d696e616c99766973697465645f7365636f6e646172795f6361707475726590757365645f32356d6d5f63616e6e6f6e99757365645f6c6962657261746f725f626f6d6261726469657293766973697465645f7265706169725f73696c6f93766973697465645f76616e755f6d6f64756c6591757365645f666c61696c5f776561706f6e8b757365645f73637974686598766973697465645f7265737061776e5f7465726d696e616c8c757365645f62616c6c67756e92757365645f656e657267795f67756e5f747295757365645f616e6e69766572736172795f67756e6195757365645f616e6e69766572736172795f67756e6294757365645f616e6e69766572736172795f67756e90757365645f37356d6d5f63616e6e6f6e92757365645f6170635f6e635f776561706f6e92757365645f6170635f74725f776561706f6e92757365645f6170635f76735f776561706f6e90757365645f666c75785f63616e6e6f6e9f757365645f617068656c696f6e5f706c61736d615f726f636b65745f706f6491757365645f617068656c696f6e5f7070618c757365645f666c7578706f6494766973697465645f6266725f7465726d696e616c9e757365645f636f6c6f737375735f636c75737465725f626f6d625f706f64a0757365645f636f6c6f737375735f6475616c5f3130306d6d5f63616e6e6f6e7399757365645f636f6c6f737375735f74616e6b5f63616e6e6f6e96766973697465645f656e657267795f6372797374616c9b757365645f68656176795f6772656e6164655f6c61756e6368657298757365645f33356d6d5f726f74617279636861696e67756e8b757365645f6b6174616e6190757365645f33356d6d5f63616e6e6f6e93757365645f7265617665725f776561706f6e7396757365645f6c696768746e696e675f776561706f6e738c757365645f6d65645f61707090757365645f32306d6d5f63616e6e6f6e98766973697465645f6d6f6e6f6c6974685f616d657269736899766973697465645f6d6f6e6f6c6974685f636572797368656e97766973697465645f6d6f6e6f6c6974685f637973736f7297766973697465645f6d6f6e6f6c6974685f6573616d697299766973697465645f6d6f6e6f6c6974685f666f72736572616c99766973697465645f6d6f6e6f6c6974685f697368756e64617298766973697465645f6d6f6e6f6c6974685f7365617268757397766973697465645f6d6f6e6f6c6974685f736f6c73617292757365645f6e635f6865765f66616c636f6e99757365645f6e635f6865765f7363617474657263616e6e6f6e93757365645f6e635f6865765f73706172726f7791757365645f61726d6f725f736970686f6e9f757365645f706572656772696e655f6475616c5f6d616368696e655f67756e9f757365645f706572656772696e655f6475616c5f726f636b65745f706f647399757365645f706572656772696e655f6d65636868616d6d65729e757365645f706572656772696e655f7061727469636c655f63616e6e6f6e96757365645f706572656772696e655f73706172726f7791757365645f3130356d6d5f63616e6e6f6e92757365645f31356d6d5f636861696e67756ea0757365645f70756c7365645f7061727469636c655f616363656c657261746f7293757365645f726f74617279636861696e67756e9f766973697465645f6465636f6e737472756374696f6e5f7465726d696e616c95757365645f736b7967756172645f776561706f6e7391766973697465645f67656e657261746f7291757365645f67617573735f63616e6e6f6e89757365645f7472656b95757365645f76616e67756172645f776561706f6e73a4766973697465645f616e6369656e745f6169725f76656869636c655f7465726d696e616ca2766973697465645f616e6369656e745f65717569706d656e745f7465726d696e616c96766973697465645f6f726465725f7465726d696e616ca7766973697465645f616e6369656e745f67726f756e645f76656869636c655f7465726d696e616c9f766973697465645f67726f756e645f76656869636c655f7465726d696e616c97757365645f76756c747572655f626f6d6261726469657298757365645f76756c747572655f6e6f73655f63616e6e6f6e98757365645f76756c747572655f7461696c5f63616e6e6f6e97757365645f776173705f776561706f6e5f73797374656d91766973697465645f636861726c6965303191766973697465645f636861726c6965303291766973697465645f636861726c6965303391766973697465645f636861726c6965303491766973697465645f636861726c6965303591766973697465645f636861726c6965303691766973697465645f636861726c6965303791766973697465645f636861726c6965303891766973697465645f636861726c6965303996766973697465645f67696e6765726d616e5f6174617298766973697465645f67696e6765726d616e5f646168616b6196766973697465645f67696e6765726d616e5f6876617296766973697465645f67696e6765726d616e5f697a686199766973697465645f67696e6765726d616e5f6a616d7368696498766973697465645f67696e6765726d616e5f6d697468726198766973697465645f67696e6765726d616e5f726173686e7599766973697465645f67696e6765726d616e5f7372616f73686198766973697465645f67696e6765726d616e5f79617a61746195766973697465645f67696e6765726d616e5f7a616c8e766973697465645f736c656430318e766973697465645f736c656430328e766973697465645f736c656430348e766973697465645f736c656430358e766973697465645f736c656430368e766973697465645f736c656430378e766973697465645f736c6564303897766973697465645f736e6f776d616e5f616d657269736898766973697465645f736e6f776d616e5f636572797368656e96766973697465645f736e6f776d616e5f637973736f7296766973697465645f736e6f776d616e5f6573616d697298766973697465645f736e6f776d616e5f666f72736572616c96766973697465645f736e6f776d616e5f686f7373696e98766973697465645f736e6f776d616e5f697368756e64617297766973697465645f736e6f776d616e5f7365617268757396766973697465645f736e6f776d616e5f736f6c736172857567643036857567643035857567643034857567643033857567643032857567643031856d61703939856d61703938856d61703937856d61703936856d61703135856d61703134856d61703131856d61703038856d61703034856d61703035856d61703033856d61703031856d61703036856d61703032856d61703039856d61703037856d617031300300000091747261696e696e675f73746172745f6e638b747261696e696e675f75698c747261696e696e675f6d61700000000000000000000000000000000000000000800000003d0c04d350840240000010000602429660f80c80000c8004200c1b81480000020000c046f18a47019000019000ca4644304900000040001809e6bb052032000008001a84787211200000080003010714889c06400000100320ff0a42e4000001009e95a7342e03200000080003010408c914064000000001198990c4e4000001000060223b9b2180c800000a00081c20c92c800003600414ec172d900000040001808de1284a0320000320008ef1c336b20000078011d830e6f6400000600569c417e2c80000020000c04102502f019000008c00ce31027d99000000400018099e6146203200004b0015a7d44002f720000008000301040c18dc064000023000b1240800636400000100006020e0e92280c80000c800081650c00cfc800006400ce32a1801a59000000400018099e6fc3e03200004b00058b14680463200000080003010742610c064000043000b16c8880916400000100006020e0d01580c80000c8006714e24012cc80000020000c04cf25c190190000258001032e240307900000c8019c74470061b2000000800030133ced8fc0640000960012d9a8d00f0640000010025b9c1401e4c8000002004b6b23c03d1900000040098f585007b3200000080131a58c00f864000001002536f1c01f4c8000002004a64e2a03f190000004015e1b4580873200000080003010711f8a406400000100110a00c010ee400000100006020e2a51380c8000002002218d21021ec80000020000c041c40249019000000400af18a44043f90000004000180838b44760320000008015e38c80088320000008000301071490cc064000001002bc35890110e400000100006020e2052180c800000200221f90d0222c80000020000c041c5e447019000000400442e62e044790000004000180838af032032000000800886d08c089320000008000301071738740640000010011098898112e400000100006020e2361c80c8000002002212a1b0226c80000020000c041c512170190000004004420a32044f900000040001808389104a0320000008008874c8808a3200000080003010715907c06400000100110c0898114e400000100006020e2771a80c800000200578bd13022ac80000020000c041c424330190000004004423848045790000004000180838bfc32032000000801a86506008b320000008000301071030dc06400000100129f68a0117640000010026353110232c8000002004b69438046d90000004015e2887008eb200000080003010715909406400000100350fb8e011de400000100006020e2881980c8000002005786d0f023cc80000020000c041c4cc3b019000000400af1ba1c047b90000004000180838af872032000000800886344408fb20000008000301071620d406400000100110c10b011fe400000100006020e2870d80c800000200578f30c0240c80000020000c041c5863b019000000400442ee300483900000040001808388605e032000000801a86f03c090b200000080003010712a8fc064000001002bc0d858121e400000100006020e2521c80c800000200578b7230244c80000020000c041c49629019000000400d434026048b90000004000180838afc42032000000801a86d864091b200000080003010711989c064000001003508c8c8123e400000100006020e2a82280c8000002006a14f110248c80000020000c041c4be21019000000400af12640049390000004000180838a54720320000008015e33430092b20000008000301071228cc064000001003546e8d432400000100004f34a631139000004001b0834723120000008000204000c2ed0fa1c800000200a8432234a90000004000180952b248a0320000018004024c569d20000008000250a4d0ebc480000020000c04a24bc43019000000c00e0"
|
|
val string_ccrider = hex"18 4a c7 00 00 bc 84 B0 0c 0b 95 59 9a 84 40 b0 00 01 32 00 00 08 70 43 00 43 00 52 00 49 00 44 00 45 00 52 00 82 28 c9 3d 04 40 03 c0 01 40 02 80 00 40 35 18 40 00 25 40 42 00 6c 00 61 00 63 00 6b 00 20 00 41 00 72 00 6d 00 6f 00 72 00 65 00 64 00 20 00 52 00 65 00 61 00 70 00 65 00 72 00 73 00 0f 00 00 03 02 0c 00 00 03 88 00 00 00 d4 00 00 01 9c 04 00 00 09 19 90 02 04 3c 28 00 00 00 00 00 00 00 00 00 00 00 00 01 90 01 90 00 64 00 00 01 00 7e c8 00 c8 00 00 01 b9 53 4c 00 00 00 00 00 00 00 00 00 00 00 00 00 03 40 00 40 81 c6 86 c8 48 88 c9 09 49 8a 67 86 e0 00 01 25 e0 32 d8 09 6c 00 00 3c 04 00 02 30 7870655f626c61636b6f7073917870655f626174746c655f72616e6b5f39927870655f626174746c655f72616e6b5f3233927870655f636f6d6d616e645f72616e6b5f318f7870655f666f726d5f6f75746669748e7870655f6d61696c5f616c657274927870655f626174746c655f72616e6b5f3232927870655f636f6d6d616e645f72616e6b5f33907870655f666f726d5f706c61746f6f6e927870655f626174746c655f72616e6b5f3133927870655f626174746c655f72616e6b5f3132927870655f626174746c655f72616e6b5f3130927870655f626174746c655f72616e6b5f3134927870655f626174746c655f72616e6b5f3135917870655f626174746c655f72616e6b5f38927870655f626174746c655f72616e6b5f3131927870655f626174746c655f72616e6b5f3231927870655f626174746c655f72616e6b5f3230927870655f626174746c655f72616e6b5f3138927870655f626174746c655f72616e6b5f3139907870655f6a6f696e5f706c61746f6f6e927870655f626174746c655f72616e6b5f3137927870655f626174746c655f72616e6b5f31368f7870655f6a6f696e5f6f7574666974927870655f626174746c655f72616e6b5f3235927870655f626174746c655f72616e6b5f3234917870655f626174746c655f72616e6b5f37917870655f62696e645f666163696c6974798c7870655f62696e645f616d73927870655f636f6d6d616e645f72616e6b5f35927870655f636f6d6d616e645f72616e6b5f32927870655f696e7374616e745f616374696f6e8e7870655f666f726d5f7371756164917870655f626174746c655f72616e6b5f34937870655f776172705f676174655f7573616765917870655f626174746c655f72616e6b5f32917870655f626174746c655f72616e6b5f33927870655f73616e6374756172795f68656c708c7870655f64726f705f706f64937870655f6f72626974616c5f73687574746c65917870655f626174746c655f72616e6b5f368e7870655f6a6f696e5f7371756164917870655f626174746c655f72616e6b5f35927870655f74685f737769746368626c6164658d7870655f74685f726f757465728c7870655f74685f666c61696c8a7870655f74685f616e748a7870655f74685f616d738a7870655f74685f62667289757365645f6f69637791757365645f616476616e6365645f61636597766973697465645f73706974666972655f74757272657498766973697465645f73706974666972655f636c6f616b656493766973697465645f73706974666972655f616192766973697465645f74616e6b5f7472617073a1766973697465645f706f727461626c655f6d616e6e65645f7475727265745f6e638e757365645f6d616763757474657293766973697465645f77616c6c5f7475727265748b766973697465645f616d738b766973697465645f616e7490766973697465645f64726f707368697091766973697465645f6c6962657261746f7294766973697465645f6c6967687467756e7368697091766973697465645f6c696768746e696e6790766973697465645f6d616772696465728f766973697465645f70726f776c657293766973697465645f71756164737465616c746890766973697465645f736b7967756172649a766973697465645f74687265656d616e686561767962756767799d766973697465645f74776f5f6d616e5f61737361756c745f627567677998766973697465645f74776f6d616e6865617679627567677998766973697465645f74776f6d616e686f766572627567677990766973697465645f76616e67756172648d766973697465645f666c61696c8e766973697465645f726f7574657293766973697465645f737769746368626c6164658e766973697465645f6175726f726193766973697465645f626174746c657761676f6e8c766973697465645f6675727993766973697465645f7175616461737361756c7496766973697465645f67616c6178795f67756e736869708e766973697465645f6170635f74728e766973697465645f6170635f767390766973697465645f6c6f64657374617290766973697465645f7068616e7461736d91766973697465645f7468756e64657265728e766973697465645f6170635f6e638f766973697465645f76756c747572658c766973697465645f7761737090766973697465645f6d6f73717569746f97766973697465645f617068656c696f6e5f666c6967687497766973697465645f617068656c696f6e5f67756e6e657297766973697465645f636f6c6f737375735f666c6967687497766973697465645f636f6c6f737375735f67756e6e657298766973697465645f706572656772696e655f666c6967687498766973697465645f706572656772696e655f67756e6e657289757365645f62616e6b95766973697465645f7265736f757263655f73696c6f9e766973697465645f63657274696669636174696f6e5f7465726d696e616c94766973697465645f6d65645f7465726d696e616c93757365645f6e616e6f5f64697370656e73657295766973697465645f73656e736f725f736869656c649a766973697465645f62726f6164636173745f77617270676174658c757365645f7068616c616e7894757365645f7068616c616e785f6176636f6d626f96757365645f7068616c616e785f666c616b636f6d626f96766973697465645f77617270676174655f736d616c6c91757365645f666c616d657468726f7765729a757365645f616e6369656e745f7475727265745f776561706f6e92766973697465645f4c4c555f736f636b657492757365645f656e657267795f67756e5f6e6397766973697465645f6d656469756d7472616e73706f72749f757365645f617068656c696f6e5f696d6d6f6c6174696f6e5f63616e6e6f6e93757365645f6772656e6164655f706c61736d6193757365645f6772656e6164655f6a616d6d657298766973697465645f736869656c645f67656e657261746f7295766973697465645f6d6f74696f6e5f73656e736f7296766973697465645f6865616c74685f6372797374616c96766973697465645f7265706169725f6372797374616c97766973697465645f76656869636c655f6372797374616c91757365645f6772656e6164655f6672616788757365645f61636598766973697465645f6164765f6d65645f7465726d696e616c8b757365645f6265616d657290757365645f626f6c745f6472697665728b757365645f6379636c65728a757365645f676175737391757365645f68756e7465727365656b657288757365645f6973708b757365645f6c616e6365728b757365645f6c61736865728e757365645f6d61656c7374726f6d8c757365645f70686f656e69788b757365645f70756c7361728d757365645f70756e69736865728e757365645f725f73686f7467756e8d757365645f7261646961746f7288757365645f72656b8d757365645f72657065617465728c757365645f726f636b6c65748c757365645f737472696b65728f757365645f73757070726573736f728c757365645f7468756d7065729c766973697465645f76616e755f636f6e74726f6c5f636f6e736f6c6598766973697465645f636170747572655f7465726d696e616c92757365645f6d696e695f636861696e67756e91757365645f6c617a655f706f696e7465728c757365645f74656c657061648b757365645f7370696b657291757365645f68656176795f736e6970657293757365645f636f6d6d616e645f75706c696e6b8d757365645f66697265626972648e757365645f666c6563686574746594757365645f68656176795f7261696c5f6265616d89757365645f696c63399a766973697465645f67656e657261746f725f7465726d696e616c8e766973697465645f6c6f636b65729a766973697465645f65787465726e616c5f646f6f725f6c6f636b9c766973697465645f6169725f76656869636c655f7465726d696e616c97766973697465645f67616c6178795f7465726d696e616c98766973697465645f696d706c616e745f7465726d696e616c99766973697465645f7365636f6e646172795f6361707475726590757365645f32356d6d5f63616e6e6f6e99757365645f6c6962657261746f725f626f6d6261726469657293766973697465645f7265706169725f73696c6f93766973697465645f76616e755f6d6f64756c6591757365645f666c61696c5f776561706f6e8b757365645f73637974686598766973697465645f7265737061776e5f7465726d696e616c8c757365645f62616c6c67756e95757365645f616e6e69766572736172795f67756e6195757365645f616e6e69766572736172795f67756e6294757365645f616e6e69766572736172795f67756e90757365645f37356d6d5f63616e6e6f6e92757365645f6170635f6e635f776561706f6e92757365645f6170635f74725f776561706f6e92757365645f6170635f76735f776561706f6e90757365645f666c75785f63616e6e6f6e93757365645f617068656c696f6e5f6c617365729f757365645f617068656c696f6e5f706c61736d615f726f636b65745f706f6491757365645f617068656c696f6e5f70706196757365645f617068656c696f6e5f73746172666972658c757365645f666c7578706f6494766973697465645f6266725f7465726d696e616c95757365645f636f6c6f737375735f6275727374657296757365645f636f6c6f737375735f636861696e67756e9e757365645f636f6c6f737375735f636c75737465725f626f6d625f706f64a0757365645f636f6c6f737375735f6475616c5f3130306d6d5f63616e6e6f6e7399757365645f636f6c6f737375735f74616e6b5f63616e6e6f6e96766973697465645f64616d6167655f6372797374616c96766973697465645f656e657267795f6372797374616c9b757365645f68656176795f6772656e6164655f6c61756e6368657298757365645f33356d6d5f726f74617279636861696e67756e8b757365645f6b6174616e6190757365645f33356d6d5f63616e6e6f6e93757365645f7265617665725f776561706f6e7396757365645f6c696768746e696e675f776561706f6e738c757365645f6d65645f61707090757365645f32306d6d5f63616e6e6f6e98766973697465645f6d6f6e6f6c6974685f616d657269736899766973697465645f6d6f6e6f6c6974685f636572797368656e97766973697465645f6d6f6e6f6c6974685f637973736f7297766973697465645f6d6f6e6f6c6974685f6573616d697299766973697465645f6d6f6e6f6c6974685f666f72736572616c97766973697465645f6d6f6e6f6c6974685f686f7373696e99766973697465645f6d6f6e6f6c6974685f697368756e64617298766973697465645f6d6f6e6f6c6974685f7365617268757397766973697465645f6d6f6e6f6c6974685f736f6c73617292757365645f6e635f6865765f66616c636f6e99757365645f6e635f6865765f7363617474657263616e6e6f6e93757365645f6e635f6865765f73706172726f7791757365645f61726d6f725f736970686f6e9f757365645f706572656772696e655f6475616c5f6d616368696e655f67756e9f757365645f706572656772696e655f6475616c5f726f636b65745f706f647399757365645f706572656772696e655f6d65636868616d6d65728f757365645f6e74755f736970686f6e9e757365645f706572656772696e655f7061727469636c655f63616e6e6f6e96757365645f706572656772696e655f73706172726f7791757365645f3130356d6d5f63616e6e6f6e92757365645f31356d6d5f636861696e67756ea0757365645f70756c7365645f7061727469636c655f616363656c657261746f7293757365645f726f74617279636861696e67756e9f766973697465645f6465636f6e737472756374696f6e5f7465726d696e616c95757365645f736b7967756172645f776561706f6e7391766973697465645f67656e657261746f7291757365645f67617573735f63616e6e6f6e89757365645f7472656b95757365645f76616e67756172645f776561706f6e73a4766973697465645f616e6369656e745f6169725f76656869636c655f7465726d696e616ca2766973697465645f616e6369656e745f65717569706d656e745f7465726d696e616c96766973697465645f6f726465725f7465726d696e616ca7766973697465645f616e6369656e745f67726f756e645f76656869636c655f7465726d696e616c9f766973697465645f67726f756e645f76656869636c655f7465726d696e616c97757365645f76756c747572655f626f6d6261726469657298757365645f76756c747572655f6e6f73655f63616e6e6f6e98757365645f76756c747572655f7461696c5f63616e6e6f6e97757365645f776173705f776561706f6e5f73797374656d91766973697465645f636861726c6965303591766973697465645f636861726c6965303691766973697465645f636861726c6965303791766973697465645f636861726c6965303891766973697465645f636861726c696530398e766973697465645f736c656430348e766973697465645f736c656430358e766973697465645f736c656430368e766973697465645f736c656430378e766973697465645f736c65643038857567643036857567643035857567643034857567643033857567643032857567643031856d61703939856d61703938856d61703937856d61703936856d61703135856d61703134856d61703133856d61703132856d61703131856d61703034856d61703035856d61703033856d61703031856d61703036856d61703032856d61703039856d61703037856d617031300800000092747261696e696e675f776561706f6e73303192747261696e696e675f7761727067617465738c747261696e696e675f6d617092747261696e696e675f696e76656e746f727990747261696e696e675f6865616c696e678d747261696e696e675f686172748f747261696e696e675f61726d6f727390747261696e696e675f77656c636f6d650000000000000000000000000000000000000000ab000480000005000000058000000800000008800000090000000f0000000f8000001000000012800000130000001a0000001a8000001c800000228000002e00000031800000320000003580000036000000368000003700000039000000398000003a0000003a8000003b0000003f800000400000004080000041000000418000004e000000518000005580000059000000598000005a0000005a800000610000006180000063000000648000006b8000006c0000006c8000006f0000006f800000700000007080000071000000718000007280000073000000798000007a0000000080800004808000050080000a8080000b0080000d8080000e0080000e8080000f0080001080800011008000140080001c808000270080002a8080002b00800033808000388080003c0080003c8080004000800043808000440080004480800045008000470080004c0080004f808000520080005400800000002f0a26c9313c024000001000060279a272780c80000100026b271682480000020000c041c0464f019000006400d43541d08900000040001808388946a0320000008019041c821700000008046ce915631018000000400018083822c6a030000019001d2338421b00000008000301070438ac060000032003a4630c466000000100006020e06c1e80c000006400748e01c92c00000020000c041c11e4101800000c800e90a02331800000040001808381b06e030000019001989ec436b000000080003010c81d924060000019003310e87f0600000010000602190d31780c000003200662fa22e6c00000020000c04320a82f018000006400e90683bd9800000040001808381205a030000019000205808bcb000001900040e4908058e0000032006629c1d00b4c00000020000c043209c35018000006400cc480320175800000040001808642084a03000000c80198880540303000000080003010c87d86c060000019000b17e9100636000000100006020e01f2080c00000c800081580f010bc000006400414961a022f800000040001808de0004603000003200082818840477000000080003011bc0a11406000006400040a28680b2e000003200569271a017ac00000020000c041037435018000008c00ce2e04003498000000400018099e6c46e03000004b0019c4483406b70000000800030133cc28ec06000009600040ad8e80dfe0000032006710e1201fec00000020000c04cf2a837018000025800ce37432040f8000000400018099e7586a03000004b00058b18480843000000080003010702f11406000006400040f690010ce0000032000e0222786c8000064001c1d82b13900000c800380205233200001900074559050e40000320079afa0fa4c800002000d84b64f4e9000000400010300380"
|
|
val string_xrider912 = hex"18cf8c0000bc83e0d97fc6204c5f20800008e00000089078005200690064006500720039003100320082084295c4c000c000c0000000001ed00000248048006f006f006b006500640020004f006e00200049006e00730061006e006900740079000500000302ac0000016c04000114000001a004000220e46c03cb4000000000000000000000000000019001900064000001007ec800c8000001abc44480000000000000000000000000030000408101c686c888c9094a7e8a40000125e012d8196c000344000002487870655f636f6d6d616e645f72616e6b5f32907870655f6a6f696e5f706c61746f6f6e927870655f626174746c655f72616e6b5f3230927870655f626174746c655f72616e6b5f3231927870655f626174746c655f72616e6b5f32328f7870655f666f726d5f6f75746669748c7870655f626c61636b6f7073927870655f626174746c655f72616e6b5f3133927870655f626174746c655f72616e6b5f3132927870655f626174746c655f72616e6b5f3130927870655f626174746c655f72616e6b5f3134927870655f626174746c655f72616e6b5f3135917870655f626174746c655f72616e6b5f358e7870655f6a6f696e5f73717561648e7870655f666f726d5f7371756164927870655f696e7374616e745f616374696f6e917870655f626174746c655f72616e6b5f38927870655f626174746c655f72616e6b5f3131917870655f626174746c655f72616e6b5f36927870655f626174746c655f72616e6b5f3138927870655f626174746c655f72616e6b5f3139927870655f626174746c655f72616e6b5f3137927870655f626174746c655f72616e6b5f31368f7870655f6a6f696e5f6f7574666974917870655f626174746c655f72616e6b5f39917870655f626174746c655f72616e6b5f37927870655f636f6d6d616e645f72616e6b5f31937870655f6f72626974616c5f73687574746c658c7870655f64726f705f706f64927870655f73616e6374756172795f68656c70917870655f62696e645f666163696c697479917870655f626174746c655f72616e6b5f33917870655f626174746c655f72616e6b5f32937870655f776172705f676174655f75736167658c7870655f62696e645f616d73917870655f626174746c655f72616e6b5f348e7870655f74685f6e6f6e73616e638d7870655f74685f726f757465728c7870655f74685f666c61696c8a7870655f74685f616e748a7870655f74685f616d738f7870655f74685f67726f756e645f708c7870655f74685f6169725f708c7870655f74685f686f7665728d7870655f74685f67726f756e648a7870655f74685f626672927870655f74685f61667465726275726e65728a7870655f74685f6169728b7870655f74685f616d6d6f907870655f74685f666972656d6f6465738c7870655f74685f636c6f616b8a7870655f74685f6d617889757365645f6f69637791757365645f616476616e6365645f61636597766973697465645f73706974666972655f74757272657498766973697465645f73706974666972655f636c6f616b656493766973697465645f73706974666972655f616192766973697465645f74616e6b5f7472617073a1766973697465645f706f727461626c655f6d616e6e65645f7475727265745f74728f757365645f636861696e626c61646593766973697465645f77616c6c5f7475727265748b766973697465645f616d738b766973697465645f616e7490766973697465645f64726f707368697091766973697465645f6c6962657261746f7294766973697465645f6c6967687467756e7368697091766973697465645f6c696768746e696e678f766973697465645f70726f776c657293766973697465645f71756164737465616c746890766973697465645f736b7967756172649a766973697465645f74687265656d616e686561767962756767799d766973697465645f74776f5f6d616e5f61737361756c745f627567677998766973697465645f74776f6d616e6865617679627567677998766973697465645f74776f6d616e686f766572627567677990766973697465645f76616e67756172648d766973697465645f666c61696c8e766973697465645f726f7574657293766973697465645f626174746c657761676f6e8c766973697465645f6675727993766973697465645f7175616461737361756c7496766973697465645f67616c6178795f67756e736869708e766973697465645f6170635f747290766973697465645f6c6f64657374617290766973697465645f7068616e7461736d8e766973697465645f6170635f6e638f766973697465645f76756c747572658c766973697465645f7761737090766973697465645f6d6f73717569746f97766973697465645f636f6c6f737375735f666c6967687489757365645f62616e6b95766973697465645f7265736f757263655f73696c6f9e766973697465645f63657274696669636174696f6e5f7465726d696e616c94766973697465645f6d65645f7465726d696e616c93757365645f6e616e6f5f64697370656e73657295766973697465645f73656e736f725f736869656c649a766973697465645f62726f6164636173745f77617270676174658c757365645f7068616c616e7896757365645f7068616c616e785f666c616b636f6d626f96766973697465645f77617270676174655f736d616c6c91757365645f666c616d657468726f7765729a757365645f616e6369656e745f7475727265745f776561706f6e92766973697465645f4c4c555f736f636b657497766973697465645f6d656469756d7472616e73706f727493757365645f6772656e6164655f706c61736d6193757365645f6772656e6164655f6a616d6d657298766973697465645f736869656c645f67656e657261746f7295766973697465645f6d6f74696f6e5f73656e736f7297766973697465645f76656869636c655f6372797374616c91757365645f6772656e6164655f6672616788757365645f61636598766973697465645f6164765f6d65645f7465726d696e616c90757365645f626f6c745f6472697665728b757365645f6379636c65728a757365645f676175737391757365645f68756e7465727365656b657288757365645f6973708b757365645f6c616e6365728b757365645f6c61736865728e757365645f6d61656c7374726f6d8c757365645f70686f656e69788b757365645f70756c7361728d757365645f70756e69736865728e757365645f725f73686f7467756e8d757365645f7261646961746f7288757365645f72656b8d757365645f72657065617465728c757365645f726f636b6c65748c757365645f737472696b65728f757365645f73757070726573736f728c757365645f7468756d70657292757365645f74726865765f6275727374657295757365645f74726865765f6475616c6379636c657292757365645f74726865765f706f756e6465729c766973697465645f76616e755f636f6e74726f6c5f636f6e736f6c6598766973697465645f636170747572655f7465726d696e616c92757365645f6d696e695f636861696e67756e91757365645f6c617a655f706f696e7465728c757365645f74656c657061648b757365645f7370696b657291757365645f68656176795f736e697065728d757365645f66697265626972648e757365645f666c6563686574746594757365645f68656176795f7261696c5f6265616d9a766973697465645f67656e657261746f725f7465726d696e616c8e766973697465645f6c6f636b65729a766973697465645f65787465726e616c5f646f6f725f6c6f636b9c766973697465645f6169725f76656869636c655f7465726d696e616c97766973697465645f67616c6178795f7465726d696e616c98766973697465645f696d706c616e745f7465726d696e616c99766973697465645f7365636f6e646172795f6361707475726590757365645f32356d6d5f63616e6e6f6e99757365645f6c6962657261746f725f626f6d6261726469657293766973697465645f7265706169725f73696c6f93766973697465645f76616e755f6d6f64756c6591757365645f666c61696c5f776561706f6e98766973697465645f7265737061776e5f7465726d696e616c92757365645f656e657267795f67756e5f747295757365645f616e6e69766572736172795f67756e6195757365645f616e6e69766572736172795f67756e6292757365645f6170635f74725f776561706f6e90757365645f666c75785f63616e6e6f6e94766973697465645f6266725f7465726d696e616ca0757365645f636f6c6f737375735f6475616c5f3130306d6d5f63616e6e6f6e7399757365645f636f6c6f737375735f74616e6b5f63616e6e6f6e9b757365645f68656176795f6772656e6164655f6c61756e6368657298757365645f33356d6d5f726f74617279636861696e67756e8b757365645f6b6174616e6190757365645f33356d6d5f63616e6e6f6e93757365645f7265617665725f776561706f6e7396757365645f6c696768746e696e675f776561706f6e738c757365645f6d65645f61707090757365645f32306d6d5f63616e6e6f6e99766973697465645f6d6f6e6f6c6974685f666f72736572616c91757365645f3130356d6d5f63616e6e6f6e92757365645f31356d6d5f636861696e67756e93757365645f726f74617279636861696e67756e9f766973697465645f6465636f6e737472756374696f6e5f7465726d696e616c95757365645f736b7967756172645f776561706f6e7391766973697465645f67656e657261746f7289757365645f7472656b95757365645f76616e67756172645f776561706f6e73a4766973697465645f616e6369656e745f6169725f76656869636c655f7465726d696e616ca2766973697465645f616e6369656e745f65717569706d656e745f7465726d696e616c96766973697465645f6f726465725f7465726d696e616c9f766973697465645f67726f756e645f76656869636c655f7465726d696e616c97757365645f76756c747572655f626f6d6261726469657298757365645f76756c747572655f6e6f73655f63616e6e6f6e98757365645f76756c747572655f7461696c5f63616e6e6f6e97757365645f776173705f776561706f6e5f73797374656d857567643035857567643034857567643033857567643032857567643031856d61703939856d61703938856d61703937856d61703135856d61703134856d61703132856d61703034856d61703035856d61703033856d61703031856d61703036856d61703032856d61703039856d61703037856d617031300000000000000000000000000000000000000000000000008b00048000000800000008800000228000003580000036000000390000003980000043000000558000005900000062000000638000006f000000728000000d808000148080002d8080003400800043808000478080005280800000002146d2890d80080000020000c041c1141d0190000050004d6822704100000040001808382004a03200000c8015e0103610200000080003010716107406400000100320db0a42e000000100889949102a03000000080003013cd5d8b4060000010003294084c4e0000001000060279a2b0e80c0000020006524c0f92c00000020000c04f35fa17018000004000443142b3b800000040001808389304e0300000008019c5b42b6b0000000800030133cf284406000009600338fa8a71e00000010000602679e41580c000012c00652fc16ecc00000020000c04f350a2d018000004000ce2222801698000000400018099e7202e03000004b0019c5ec4402f70000000800030133cc688406000009600338808780636000000100006026796d1580c000012c00671eb0f010ec00000020000c04cf2c623018000025800ce21824022f8000000400018099e4d42603000004b0019499c300483000000080003013cd798a406000001000329078a80b8e0000001000060279af10a80c0000020006522011017ac00000020000c04f34001d018000004000415ec100397800000040001808de1385603000002700194bdc4c0747000000080003013cd6609c06000000f000701108c364000032000e0dc0d89c8000064001c00e2119900000c800380ec52872000019000744a875264000032006c27b12a708000002000081001c"
|
|
|
|
"DetailedCharacterData" should {
|
|
"decode" in {
|
|
PacketCoding.DecodePacket(string).require match {
|
|
case ObjectCreateDetailedMessage(len, cls, guid, parent, data) =>
|
|
len mustEqual 3159
|
|
cls mustEqual ObjectClass.avatar
|
|
guid mustEqual PlanetSideGUID(75)
|
|
parent.isDefined mustEqual false
|
|
data match {
|
|
case DetailedPlayerData(Some(pos), basic, char, inv, hand) =>
|
|
pos.coord mustEqual Vector3(3674.8438f, 2726.789f, 91.15625f)
|
|
pos.orient mustEqual Vector3(0, 0, 36.5625f)
|
|
pos.vel.isDefined mustEqual false
|
|
|
|
basic match {
|
|
case CharacterAppearanceData(a, b, ribbons) =>
|
|
a.app.name mustEqual "IlllIIIlllIlIllIlllIllI"
|
|
a.app.faction mustEqual PlanetSideEmpire.VS
|
|
a.app.sex mustEqual CharacterGender.Female
|
|
a.app.head mustEqual 41
|
|
a.app.voice mustEqual CharacterVoice.Voice1
|
|
a.data.bops mustEqual false
|
|
a.data.v1 mustEqual true
|
|
a.data.v2.isEmpty mustEqual true
|
|
a.data.v3 mustEqual false
|
|
a.data.v4.isEmpty mustEqual true
|
|
a.data.v5.isEmpty mustEqual true
|
|
a.exosuit mustEqual ExoSuitType.Standard
|
|
a.unk5 mustEqual 0
|
|
a.char_id mustEqual 41605313L
|
|
a.unk7 mustEqual 0
|
|
a.unk8 mustEqual 0
|
|
a.unk9 mustEqual 0
|
|
a.unkA mustEqual 65535
|
|
|
|
b.outfit_name mustEqual ""
|
|
b.outfit_logo mustEqual 0
|
|
b.backpack mustEqual false
|
|
b.facingPitch mustEqual 2.8125f
|
|
b.facingYawUpper mustEqual 61.875f
|
|
b.lfs mustEqual true
|
|
b.grenade_state mustEqual GrenadeState.None
|
|
b.is_cloaking mustEqual false
|
|
b.charging_pose mustEqual false
|
|
b.on_zipline.isEmpty mustEqual true
|
|
b.unk0 mustEqual 0L
|
|
b.unk1 mustEqual false
|
|
b.unk2 mustEqual false
|
|
b.unk3 mustEqual false
|
|
b.unk4 mustEqual false
|
|
b.unk5 mustEqual false
|
|
b.unk6 mustEqual false
|
|
b.unk7 mustEqual false
|
|
|
|
ribbons.upper mustEqual MeritCommendation.None
|
|
ribbons.middle mustEqual MeritCommendation.None
|
|
ribbons.lower mustEqual MeritCommendation.None
|
|
ribbons.tos mustEqual MeritCommendation.None
|
|
case _ =>
|
|
ko
|
|
}
|
|
|
|
char match {
|
|
case DetailedCharacterData(a, b) =>
|
|
a.bep mustEqual 0L
|
|
a.cep mustEqual 0L
|
|
a.healthMax mustEqual 100
|
|
a.health mustEqual 100
|
|
a.armor mustEqual 50 //standard exosuit value
|
|
a.staminaMax mustEqual 100
|
|
a.stamina mustEqual 100
|
|
a.max_field.isEmpty mustEqual true
|
|
a.certs mustEqual List(
|
|
CertificationType.StandardAssault,
|
|
CertificationType.MediumAssault,
|
|
CertificationType.ATV,
|
|
CertificationType.Harasser,
|
|
CertificationType.StandardExoSuit,
|
|
CertificationType.AgileExoSuit,
|
|
CertificationType.ReinforcedExoSuit
|
|
)
|
|
a.unk1 mustEqual 0L
|
|
a.unk2 mustEqual 0L
|
|
a.unk3 mustEqual 0L
|
|
a.unk4 mustEqual false
|
|
a.unk5 mustEqual 32831L
|
|
a.unk6 mustEqual 0
|
|
a.unk7 mustEqual 0
|
|
a.unk8 mustEqual 0L
|
|
a.unk9 mustEqual List(0, 0, 0, 0, 0, 0)
|
|
|
|
b.implants mustEqual List()
|
|
b.firstTimeEvents mustEqual List(
|
|
"xpe_sanctuary_help",
|
|
"xpe_th_firemodes",
|
|
"used_beamer",
|
|
"map13"
|
|
)
|
|
b.tutorials mustEqual Nil
|
|
b.cosmetics.isEmpty mustEqual true
|
|
b.unk1.isEmpty mustEqual true
|
|
b.unk2 mustEqual Nil
|
|
b.unk3 mustEqual Nil
|
|
b.unk4 mustEqual 0L
|
|
b.unk5 mustEqual 0L
|
|
b.unk6 mustEqual 0L
|
|
b.unk7 mustEqual 0L
|
|
b.unk8 mustEqual 0L
|
|
b.unk9.contains(DCDExtra2(0, 0)) mustEqual true
|
|
b.unkA mustEqual Nil
|
|
b.unkB mustEqual Nil
|
|
b.unkC mustEqual false
|
|
case _ =>
|
|
ko
|
|
}
|
|
|
|
inv.isDefined mustEqual true
|
|
val inventory = inv.get.contents
|
|
inventory.size mustEqual 10
|
|
//0
|
|
inventory.head.objectClass mustEqual ObjectClass.beamer
|
|
inventory.head.guid mustEqual PlanetSideGUID(76)
|
|
inventory.head.parentSlot mustEqual 0
|
|
var wep = inventory.head.obj.asInstanceOf[DetailedWeaponData]
|
|
wep.ammo.head.objectClass mustEqual ObjectClass.energy_cell
|
|
wep.ammo.head.guid mustEqual PlanetSideGUID(77)
|
|
wep.ammo.head.parentSlot mustEqual 0
|
|
wep.ammo.head.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 16
|
|
//1
|
|
inventory(1).objectClass mustEqual ObjectClass.suppressor
|
|
inventory(1).guid mustEqual PlanetSideGUID(78)
|
|
inventory(1).parentSlot mustEqual 2
|
|
wep = inventory(1).obj.asInstanceOf[DetailedWeaponData]
|
|
wep.ammo.head.objectClass mustEqual ObjectClass.bullet_9mm
|
|
wep.ammo.head.guid mustEqual PlanetSideGUID(79)
|
|
wep.ammo.head.parentSlot mustEqual 0
|
|
wep.ammo.head.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 25
|
|
//2
|
|
inventory(2).objectClass mustEqual ObjectClass.forceblade
|
|
inventory(2).guid mustEqual PlanetSideGUID(80)
|
|
inventory(2).parentSlot mustEqual 4
|
|
wep = inventory(2).obj.asInstanceOf[DetailedWeaponData]
|
|
wep.ammo.head.objectClass mustEqual ObjectClass.melee_ammo
|
|
wep.ammo.head.guid mustEqual PlanetSideGUID(81)
|
|
wep.ammo.head.parentSlot mustEqual 0
|
|
wep.ammo.head.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 1
|
|
//3
|
|
inventory(3).objectClass mustEqual ObjectClass.locker_container
|
|
inventory(3).guid mustEqual PlanetSideGUID(82)
|
|
inventory(3).parentSlot mustEqual 5
|
|
inventory(3).obj.isInstanceOf[DetailedLockerContainerData] mustEqual true
|
|
inventory(3).obj.asInstanceOf[DetailedLockerContainerData].inventory.isDefined mustEqual false
|
|
//4
|
|
inventory(4).objectClass mustEqual ObjectClass.bullet_9mm
|
|
inventory(4).guid mustEqual PlanetSideGUID(83)
|
|
inventory(4).parentSlot mustEqual 6
|
|
inventory(4).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
|
|
//5
|
|
inventory(5).objectClass mustEqual ObjectClass.bullet_9mm
|
|
inventory(5).guid mustEqual PlanetSideGUID(84)
|
|
inventory(5).parentSlot mustEqual 9
|
|
inventory(5).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
|
|
//6
|
|
inventory(6).objectClass mustEqual ObjectClass.bullet_9mm
|
|
inventory(6).guid mustEqual PlanetSideGUID(85)
|
|
inventory(6).parentSlot mustEqual 12
|
|
inventory(6).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
|
|
//7
|
|
inventory(7).objectClass mustEqual ObjectClass.bullet_9mm_AP
|
|
inventory(7).guid mustEqual PlanetSideGUID(86)
|
|
inventory(7).parentSlot mustEqual 33
|
|
inventory(7).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
|
|
//8
|
|
inventory(8).objectClass mustEqual ObjectClass.energy_cell
|
|
inventory(8).guid mustEqual PlanetSideGUID(87)
|
|
inventory(8).parentSlot mustEqual 36
|
|
inventory(8).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
|
|
//9
|
|
inventory(9).objectClass mustEqual ObjectClass.remote_electronics_kit
|
|
inventory(9).guid mustEqual PlanetSideGUID(88)
|
|
inventory(9).parentSlot mustEqual 39
|
|
//the rek has data but none worth testing here
|
|
hand mustEqual DrawnSlot.Pistol1
|
|
case _ =>
|
|
ko
|
|
}
|
|
case _ =>
|
|
ko
|
|
}
|
|
}
|
|
|
|
"decode (character, seated)" in {
|
|
PacketCoding.DecodePacket(string_seated).require match {
|
|
case ObjectCreateDetailedMessage(len, cls, guid, parent, data) =>
|
|
len mustEqual 3103
|
|
cls mustEqual ObjectClass.avatar
|
|
guid mustEqual PlanetSideGUID(75)
|
|
parent.isDefined mustEqual true
|
|
parent.get.guid mustEqual PlanetSideGUID(43981)
|
|
parent.get.slot mustEqual 0
|
|
data match {
|
|
case DetailedPlayerData(None, basic, char, inv, hand) =>
|
|
basic match {
|
|
case CharacterAppearanceData(a, b, ribbons) =>
|
|
a.app.name mustEqual "IlllIIIlllIlIllIlllIllI"
|
|
a.app.faction mustEqual PlanetSideEmpire.VS
|
|
a.app.sex mustEqual CharacterGender.Female
|
|
a.app.head mustEqual 41
|
|
a.app.voice mustEqual CharacterVoice.Voice1
|
|
a.data.bops mustEqual false
|
|
a.data.v1 mustEqual false
|
|
a.data.v2.isEmpty mustEqual true
|
|
a.data.v3 mustEqual false
|
|
a.data.v4.isEmpty mustEqual true
|
|
a.data.v5.isEmpty mustEqual true
|
|
a.exosuit mustEqual ExoSuitType.Standard
|
|
a.unk5 mustEqual 0
|
|
a.char_id mustEqual 192L
|
|
a.unk7 mustEqual 0
|
|
a.unk8 mustEqual 0
|
|
a.unk9 mustEqual 0
|
|
a.unkA mustEqual 0
|
|
|
|
b.outfit_name mustEqual ""
|
|
b.outfit_logo mustEqual 0
|
|
b.backpack mustEqual false
|
|
b.facingPitch mustEqual 5.625f
|
|
b.facingYawUpper mustEqual 61.875f
|
|
b.lfs mustEqual true
|
|
b.grenade_state mustEqual GrenadeState.None
|
|
b.is_cloaking mustEqual false
|
|
b.charging_pose mustEqual false
|
|
b.on_zipline.isEmpty mustEqual true
|
|
b.unk0 mustEqual 0L
|
|
b.unk1 mustEqual false
|
|
b.unk2 mustEqual false
|
|
b.unk3 mustEqual false
|
|
b.unk4 mustEqual false
|
|
b.unk5 mustEqual false
|
|
b.unk6 mustEqual false
|
|
b.unk7 mustEqual false
|
|
|
|
ribbons.upper mustEqual MeritCommendation.None
|
|
ribbons.middle mustEqual MeritCommendation.None
|
|
ribbons.lower mustEqual MeritCommendation.None
|
|
ribbons.tos mustEqual MeritCommendation.None
|
|
case _ =>
|
|
ko
|
|
}
|
|
|
|
char match {
|
|
case DetailedCharacterData(a, b) =>
|
|
a.bep mustEqual 0L
|
|
a.cep mustEqual 0L
|
|
a.healthMax mustEqual 100
|
|
a.health mustEqual 100
|
|
a.armor mustEqual 50 //standard exosuit value
|
|
a.staminaMax mustEqual 100
|
|
a.stamina mustEqual 100
|
|
a.max_field.isEmpty mustEqual true
|
|
a.certs mustEqual List(
|
|
CertificationType.StandardAssault,
|
|
CertificationType.MediumAssault,
|
|
CertificationType.ATV,
|
|
CertificationType.Harasser,
|
|
CertificationType.StandardExoSuit,
|
|
CertificationType.AgileExoSuit,
|
|
CertificationType.ReinforcedExoSuit
|
|
)
|
|
a.unk1 mustEqual 0L
|
|
a.unk2 mustEqual 0L
|
|
a.unk3 mustEqual 0L
|
|
a.unk4 mustEqual false
|
|
a.unk5 mustEqual 32831L
|
|
a.unk6 mustEqual 0
|
|
a.unk7 mustEqual 0
|
|
a.unk8 mustEqual 0L
|
|
a.unk9 mustEqual List(0, 0, 0, 0, 0, 0)
|
|
|
|
b.implants mustEqual List()
|
|
b.firstTimeEvents mustEqual List(
|
|
"xpe_sanctuary_help",
|
|
"xpe_th_firemodes",
|
|
"used_beamer",
|
|
"map13"
|
|
)
|
|
b.tutorials mustEqual Nil
|
|
b.cosmetics.isEmpty mustEqual true
|
|
b.unk1.isEmpty mustEqual true
|
|
b.unk2 mustEqual Nil
|
|
b.unk3 mustEqual Nil
|
|
b.unk4 mustEqual 0L
|
|
b.unk5 mustEqual 0L
|
|
b.unk6 mustEqual 0L
|
|
b.unk7 mustEqual 0L
|
|
b.unk8 mustEqual 0L
|
|
b.unk9.contains(DCDExtra2(0, 0)) mustEqual true
|
|
b.unkA mustEqual Nil
|
|
b.unkB mustEqual Nil
|
|
b.unkC mustEqual false
|
|
case _ =>
|
|
ko
|
|
}
|
|
|
|
inv.isDefined mustEqual true
|
|
val inventory = inv.get.contents
|
|
inventory.size mustEqual 10
|
|
//0
|
|
inventory.head.objectClass mustEqual ObjectClass.beamer
|
|
inventory.head.guid mustEqual PlanetSideGUID(76)
|
|
inventory.head.parentSlot mustEqual 0
|
|
var wep = inventory.head.obj.asInstanceOf[DetailedWeaponData]
|
|
wep.ammo.head.objectClass mustEqual ObjectClass.energy_cell
|
|
wep.ammo.head.guid mustEqual PlanetSideGUID(77)
|
|
wep.ammo.head.parentSlot mustEqual 0
|
|
wep.ammo.head.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 16
|
|
//1
|
|
inventory(1).objectClass mustEqual ObjectClass.suppressor
|
|
inventory(1).guid mustEqual PlanetSideGUID(78)
|
|
inventory(1).parentSlot mustEqual 2
|
|
wep = inventory(1).obj.asInstanceOf[DetailedWeaponData]
|
|
wep.ammo.head.objectClass mustEqual ObjectClass.bullet_9mm
|
|
wep.ammo.head.guid mustEqual PlanetSideGUID(79)
|
|
wep.ammo.head.parentSlot mustEqual 0
|
|
wep.ammo.head.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 25
|
|
//2
|
|
inventory(2).objectClass mustEqual ObjectClass.forceblade
|
|
inventory(2).guid mustEqual PlanetSideGUID(80)
|
|
inventory(2).parentSlot mustEqual 4
|
|
wep = inventory(2).obj.asInstanceOf[DetailedWeaponData]
|
|
wep.ammo.head.objectClass mustEqual ObjectClass.melee_ammo
|
|
wep.ammo.head.guid mustEqual PlanetSideGUID(81)
|
|
wep.ammo.head.parentSlot mustEqual 0
|
|
wep.ammo.head.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 1
|
|
//3
|
|
inventory(3).objectClass mustEqual ObjectClass.locker_container
|
|
inventory(3).guid mustEqual PlanetSideGUID(82)
|
|
inventory(3).parentSlot mustEqual 5
|
|
inventory(3).obj.isInstanceOf[DetailedLockerContainerData] mustEqual true
|
|
inventory(3).obj.asInstanceOf[DetailedLockerContainerData].inventory.isDefined mustEqual false
|
|
//4
|
|
inventory(4).objectClass mustEqual ObjectClass.bullet_9mm
|
|
inventory(4).guid mustEqual PlanetSideGUID(83)
|
|
inventory(4).parentSlot mustEqual 6
|
|
inventory(4).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
|
|
//5
|
|
inventory(5).objectClass mustEqual ObjectClass.bullet_9mm
|
|
inventory(5).guid mustEqual PlanetSideGUID(84)
|
|
inventory(5).parentSlot mustEqual 9
|
|
inventory(5).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
|
|
//6
|
|
inventory(6).objectClass mustEqual ObjectClass.bullet_9mm
|
|
inventory(6).guid mustEqual PlanetSideGUID(85)
|
|
inventory(6).parentSlot mustEqual 12
|
|
inventory(6).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
|
|
//7
|
|
inventory(7).objectClass mustEqual ObjectClass.bullet_9mm_AP
|
|
inventory(7).guid mustEqual PlanetSideGUID(86)
|
|
inventory(7).parentSlot mustEqual 33
|
|
inventory(7).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
|
|
//8
|
|
inventory(8).objectClass mustEqual ObjectClass.energy_cell
|
|
inventory(8).guid mustEqual PlanetSideGUID(87)
|
|
inventory(8).parentSlot mustEqual 36
|
|
inventory(8).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 50
|
|
//9
|
|
inventory(9).objectClass mustEqual ObjectClass.remote_electronics_kit
|
|
inventory(9).guid mustEqual PlanetSideGUID(88)
|
|
inventory(9).parentSlot mustEqual 39
|
|
//the rek has data but none worth testing here
|
|
hand mustEqual DrawnSlot.Pistol1
|
|
case _ =>
|
|
ko
|
|
}
|
|
case _ =>
|
|
ko
|
|
}
|
|
}
|
|
|
|
"decode (max)" in {
|
|
PacketCoding.DecodePacket(string_max).require match {
|
|
case ObjectCreateDetailedMessage(_, _, _, _, data) =>
|
|
//this test is mainly for an alternate bitstream parsing order
|
|
//the object produced is massive and most of it is already covered in other tests
|
|
//only certain details towards the end of the stream will be checked
|
|
data match {
|
|
case DetailedPlayerData(Some(_), basic, char, inv, hand) =>
|
|
basic match {
|
|
case CharacterAppearanceData(a, b, ribbons) =>
|
|
a.app.name mustEqual "HaHaATRMax"
|
|
a.app.faction mustEqual PlanetSideEmpire.TR
|
|
a.app.sex mustEqual CharacterGender.Male
|
|
a.app.head mustEqual 57
|
|
a.app.voice mustEqual CharacterVoice.Voice1
|
|
a.data.bops mustEqual false
|
|
a.data.v1 mustEqual true
|
|
a.data.v2.isEmpty mustEqual true
|
|
a.data.v3 mustEqual false
|
|
a.data.v4.isEmpty mustEqual true
|
|
a.data.v5.isEmpty mustEqual true
|
|
a.exosuit mustEqual ExoSuitType.MAX
|
|
a.unk5 mustEqual 1
|
|
a.char_id mustEqual 41605870L
|
|
a.unk7 mustEqual 0
|
|
a.unk8 mustEqual 0
|
|
a.unk9 mustEqual 0
|
|
a.unkA mustEqual 65535
|
|
|
|
b.outfit_name mustEqual ""
|
|
b.outfit_logo mustEqual 0
|
|
b.backpack mustEqual false
|
|
b.facingPitch mustEqual 348.75f
|
|
b.facingYawUpper mustEqual 0
|
|
b.lfs mustEqual true
|
|
b.grenade_state mustEqual GrenadeState.None
|
|
b.is_cloaking mustEqual false
|
|
b.charging_pose mustEqual false
|
|
b.on_zipline.isEmpty mustEqual true
|
|
b.unk0 mustEqual 0L
|
|
b.unk1 mustEqual false
|
|
b.unk2 mustEqual false
|
|
b.unk3 mustEqual false
|
|
b.unk4 mustEqual false
|
|
b.unk5 mustEqual false
|
|
b.unk6 mustEqual false
|
|
b.unk7 mustEqual false
|
|
|
|
ribbons.upper mustEqual MeritCommendation.None
|
|
ribbons.middle mustEqual MeritCommendation.None
|
|
ribbons.lower mustEqual MeritCommendation.None
|
|
ribbons.tos mustEqual MeritCommendation.None
|
|
case _ =>
|
|
ko
|
|
}
|
|
|
|
DetailedCharacterData.isBR24(char.a.bep) mustEqual false //br5+
|
|
char match {
|
|
case DetailedCharacterData(a, b) =>
|
|
a.bep mustEqual 15301L
|
|
a.cep mustEqual 0L
|
|
a.healthMax mustEqual 120
|
|
a.health mustEqual 120
|
|
a.armor mustEqual 641
|
|
a.staminaMax mustEqual 100
|
|
a.stamina mustEqual 100
|
|
a.max_field.contains(0) mustEqual true //important!
|
|
a.certs mustEqual List(
|
|
CertificationType.StandardAssault,
|
|
CertificationType.MediumAssault,
|
|
CertificationType.StandardExoSuit,
|
|
CertificationType.AgileExoSuit,
|
|
CertificationType.UniMAX
|
|
)
|
|
a.unk1 mustEqual 0L
|
|
a.unk2 mustEqual 0L
|
|
a.unk3 mustEqual 0L
|
|
a.unk4 mustEqual false
|
|
a.unk5 mustEqual 32831L
|
|
a.unk6 mustEqual 0
|
|
a.unk7 mustEqual 0
|
|
a.unk8 mustEqual 0L
|
|
a.unk9 mustEqual List(0, 0, 0, 0, 0, 0)
|
|
|
|
b.implants mustEqual Nil
|
|
b.firstTimeEvents mustEqual List(
|
|
"xpe_battle_rank_3",
|
|
"xpe_bind_facility",
|
|
"xpe_instant_action",
|
|
"xpe_battle_rank_4",
|
|
"xpe_battle_rank_2",
|
|
"xpe_sanctuary_help",
|
|
"xpe_drop_pod",
|
|
"xpe_orbital_shuttle",
|
|
"xpe_battle_rank_5",
|
|
"xpe_th_nonsanc",
|
|
"xpe_th_ground_p",
|
|
"xpe_th_ammo",
|
|
"xpe_th_firemodes",
|
|
"xpe_th_max",
|
|
"visited_spitfire_turret",
|
|
"visited_wall_turret",
|
|
"visited_resource_silo",
|
|
"visited_certification_terminal",
|
|
"visited_med_terminal",
|
|
"visited_broadcast_warpgate",
|
|
"used_phalanx",
|
|
"visited_air_vehicle_terminal",
|
|
"visited_bfr_terminal",
|
|
"used_cycler",
|
|
"visited_galaxy_terminal",
|
|
"visited_implant_terminal",
|
|
"visited_external_door_lock",
|
|
"visited_respawn_terminal",
|
|
"visited_locker",
|
|
"visited_motion_sensor",
|
|
"used_grenade_plasma",
|
|
"used_rek",
|
|
"used_repeater",
|
|
"visited_deconstruction_terminal",
|
|
"visited_secondary_capture",
|
|
"used_suppressor",
|
|
"used_trhev_burster",
|
|
"used_trhev_dualcycler",
|
|
"used_trhev_pounder",
|
|
"visited_capture_terminal",
|
|
"visited_order_terminal",
|
|
"visited_ground_vehicle_terminal",
|
|
"map12",
|
|
"map10",
|
|
"map09",
|
|
"map05",
|
|
"map03",
|
|
"map02"
|
|
)
|
|
b.tutorials mustEqual Nil
|
|
b.cosmetics.isEmpty mustEqual true
|
|
b.unk1.isEmpty mustEqual true
|
|
b.unk2 mustEqual Nil
|
|
b.unk3 mustEqual Nil
|
|
b.unk4 mustEqual 0L
|
|
b.unk5 mustEqual 0L
|
|
b.unk6 mustEqual 0L
|
|
b.unk7 mustEqual 0L
|
|
b.unk8 mustEqual 0L
|
|
b.unk9.contains(DCDExtra2(0, 0)) mustEqual true
|
|
b.unkA mustEqual Nil
|
|
b.unkB mustEqual Nil
|
|
b.unkC mustEqual false
|
|
case _ =>
|
|
ko
|
|
}
|
|
//inventory
|
|
inv.isDefined mustEqual true
|
|
inv.get.contents.size mustEqual 19
|
|
val contents = inv.get.contents
|
|
//0
|
|
contents.head mustEqual InternalSlot(889, PlanetSideGUID(2), 0,
|
|
DetailedWeaponData(
|
|
CommonFieldData(PlanetSideEmpire.TR, false, false, true, None, false, None, None, PlanetSideGUID(0)),
|
|
0,
|
|
List(
|
|
InternalSlot(265, PlanetSideGUID(3), 0, DetailedAmmoBoxData(8,200)),
|
|
InternalSlot(265, PlanetSideGUID(4), 1, DetailedAmmoBoxData(8,200)),
|
|
InternalSlot(265, PlanetSideGUID(5), 2, DetailedAmmoBoxData(8,200))
|
|
)
|
|
)
|
|
)
|
|
contents(1) mustEqual InternalSlot(175, PlanetSideGUID(6), 4,
|
|
DetailedWeaponData(
|
|
CommonFieldData(PlanetSideEmpire.TR, false, false, true, None, false, None, None, PlanetSideGUID(0)),
|
|
0,
|
|
List(
|
|
InternalSlot(540, PlanetSideGUID(7), 0, DetailedAmmoBoxData(8,1))
|
|
)
|
|
)
|
|
)
|
|
contents(2) mustEqual InternalSlot(456, PlanetSideGUID(8), 5, DetailedLockerContainerData(
|
|
CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)),
|
|
None
|
|
))
|
|
contents(3) mustEqual InternalSlot(265, PlanetSideGUID(9), 6, DetailedAmmoBoxData(8, 36))
|
|
contents(4) mustEqual InternalSlot(265, PlanetSideGUID(10), 10, DetailedAmmoBoxData(8, 100))
|
|
contents(5) mustEqual InternalSlot(265, PlanetSideGUID(11), 14, DetailedAmmoBoxData(8, 100))
|
|
contents(6) mustEqual InternalSlot(265, PlanetSideGUID(12), 18, DetailedAmmoBoxData(8, 100))
|
|
contents(7) mustEqual InternalSlot(265, PlanetSideGUID(13), 70, DetailedAmmoBoxData(8, 100))
|
|
contents(8) mustEqual InternalSlot(265, PlanetSideGUID(14), 74, DetailedAmmoBoxData(8, 100))
|
|
contents(9) mustEqual InternalSlot(265, PlanetSideGUID(15), 78, DetailedAmmoBoxData(8, 100))
|
|
contents(10) mustEqual InternalSlot(265, PlanetSideGUID(16), 82, DetailedAmmoBoxData(8, 100))
|
|
contents(11) mustEqual InternalSlot(536, PlanetSideGUID(17), 134, DetailedAmmoBoxData(8, 1))
|
|
contents(12) mustEqual InternalSlot(536, PlanetSideGUID(18), 138, DetailedAmmoBoxData(8, 1))
|
|
contents(13) mustEqual InternalSlot(536, PlanetSideGUID(19), 142, DetailedAmmoBoxData(8, 1))
|
|
contents(14) mustEqual InternalSlot(536, PlanetSideGUID(20), 146, DetailedAmmoBoxData(8, 1))
|
|
contents(15) mustEqual InternalSlot(536, PlanetSideGUID(21), 166, DetailedAmmoBoxData(8, 1))
|
|
contents(16) mustEqual InternalSlot(536, PlanetSideGUID(22), 170, DetailedAmmoBoxData(8, 1))
|
|
contents(17) mustEqual InternalSlot(536, PlanetSideGUID(23), 174, DetailedAmmoBoxData(8, 1))
|
|
contents(18) mustEqual InternalSlot(536, PlanetSideGUID(24), 178, DetailedAmmoBoxData(8, 1))
|
|
|
|
|
|
hand mustEqual DrawnSlot.Pistol1
|
|
case _ =>
|
|
ko
|
|
}
|
|
case _ =>
|
|
ko
|
|
}
|
|
}
|
|
|
|
"decode (BR32)" in {
|
|
PacketCoding.DecodePacket(string_br32).require match {
|
|
case ObjectCreateDetailedMessage(_, _, _, _, data) =>
|
|
//this test is mainly for an alternate bitstream parsing order
|
|
//the object produced is massive and most of it is already covered in other tests
|
|
//only certain details towards the end of the stream will be checked
|
|
data match {
|
|
case DetailedPlayerData(Some(_), basic, char, inv, hand) =>
|
|
basic match {
|
|
case CharacterAppearanceData(a, b, ribbons) =>
|
|
a.app.name mustEqual "KiCkJr"
|
|
a.app.faction mustEqual PlanetSideEmpire.NC
|
|
a.app.sex mustEqual CharacterGender.Male
|
|
a.app.head mustEqual 24
|
|
a.app.voice mustEqual CharacterVoice.Voice4
|
|
a.data.bops mustEqual false
|
|
a.data.v1 mustEqual true
|
|
a.data.v2.isEmpty mustEqual true
|
|
a.data.v3 mustEqual false
|
|
a.data.v4.isEmpty mustEqual true
|
|
a.data.v5.isEmpty mustEqual true
|
|
a.exosuit mustEqual ExoSuitType.Agile
|
|
a.unk5 mustEqual 0
|
|
a.char_id mustEqual 733931L
|
|
a.unk7 mustEqual 0
|
|
a.unk8 mustEqual 0
|
|
a.unk9 mustEqual 0
|
|
a.unkA mustEqual 0
|
|
|
|
b.outfit_name mustEqual ""
|
|
b.outfit_logo mustEqual 14
|
|
b.backpack mustEqual false
|
|
b.facingPitch mustEqual 348.75f
|
|
b.facingYawUpper mustEqual 348.75f
|
|
b.lfs mustEqual false
|
|
b.grenade_state mustEqual GrenadeState.None
|
|
b.is_cloaking mustEqual false
|
|
b.charging_pose mustEqual false
|
|
b.on_zipline.isEmpty mustEqual true
|
|
b.unk0 mustEqual 556539L
|
|
b.unk1 mustEqual false
|
|
b.unk2 mustEqual false
|
|
b.unk3 mustEqual false
|
|
b.unk4 mustEqual false
|
|
b.unk5 mustEqual true
|
|
b.unk6 mustEqual false
|
|
b.unk7 mustEqual false
|
|
|
|
ribbons.upper mustEqual MeritCommendation.Loser4
|
|
ribbons.middle mustEqual MeritCommendation.EventNCElite
|
|
ribbons.lower mustEqual MeritCommendation.HeavyAssault6
|
|
ribbons.tos mustEqual MeritCommendation.SixYearNC
|
|
case _ =>
|
|
ko
|
|
}
|
|
|
|
DetailedCharacterData.isBR24(char.a.bep) mustEqual true
|
|
char match {
|
|
case DetailedCharacterData(a, b) =>
|
|
a.bep mustEqual 6366766L
|
|
a.cep mustEqual 694787L
|
|
a.healthMax mustEqual 100
|
|
a.health mustEqual 100
|
|
a.armor mustEqual 100 //standard exosuit value
|
|
a.staminaMax mustEqual 100
|
|
a.stamina mustEqual 46
|
|
a.max_field.isEmpty mustEqual true
|
|
a.certs mustEqual List(
|
|
CertificationType.StandardAssault,
|
|
CertificationType.MediumAssault,
|
|
CertificationType.HeavyAssault,
|
|
CertificationType.AntiVehicular,
|
|
CertificationType.AirCavalryScout,
|
|
CertificationType.GroundSupport,
|
|
CertificationType.Harasser,
|
|
CertificationType.StandardExoSuit,
|
|
CertificationType.AgileExoSuit,
|
|
CertificationType.Medical,
|
|
CertificationType.AdvancedMedical,
|
|
CertificationType.Hacking,
|
|
CertificationType.AdvancedHacking,
|
|
CertificationType.Engineering,
|
|
CertificationType.CombatEngineering
|
|
)
|
|
a.unk1 mustEqual 0L
|
|
a.unk2 mustEqual 0L
|
|
a.unk3 mustEqual 0L
|
|
a.unk4 mustEqual false
|
|
a.unk5 mustEqual 32831L
|
|
a.unk6 mustEqual 0
|
|
a.unk7 mustEqual 4
|
|
a.unk8 mustEqual 3278759L
|
|
a.unk9 mustEqual List(0, 0, 0, 0, 0, 0)
|
|
|
|
b.implants mustEqual List(
|
|
ImplantEntry(ImplantType.AudioAmplifier, None, false),
|
|
ImplantEntry(ImplantType.Targeting, None, false),
|
|
ImplantEntry(ImplantType.Surge, None, false)
|
|
)
|
|
b.firstTimeEvents mustEqual List(
|
|
"xpe_overhead_map",
|
|
"xpe_warp_gate",
|
|
"xpe_form_outfit",
|
|
"xpe_blackops",
|
|
"xpe_command_rank_5",
|
|
"xpe_command_rank_3",
|
|
"xpe_sanctuary_help",
|
|
"xpe_battle_rank_13",
|
|
"xpe_battle_rank_12",
|
|
"xpe_battle_rank_10",
|
|
"xpe_battle_rank_14",
|
|
"xpe_battle_rank_15",
|
|
"xpe_orbital_shuttle",
|
|
"xpe_drop_pod",
|
|
"xpe_bind_facility",
|
|
"xpe_battle_rank_3",
|
|
"xpe_battle_rank_5",
|
|
"xpe_battle_rank_4",
|
|
"xpe_join_squad",
|
|
"xpe_form_squad",
|
|
"xpe_instant_action",
|
|
"xpe_battle_rank_2",
|
|
"xpe_warp_gate_usage",
|
|
"xpe_battle_rank_8",
|
|
"xpe_battle_rank_11",
|
|
"xpe_battle_rank_6",
|
|
"xpe_mail_alert",
|
|
"xpe_command_rank_1",
|
|
"xpe_battle_rank_20",
|
|
"xpe_battle_rank_18",
|
|
"xpe_battle_rank_19",
|
|
"xpe_join_platoon",
|
|
"xpe_battle_rank_17",
|
|
"xpe_battle_rank_16",
|
|
"xpe_join_outfit",
|
|
"xpe_battle_rank_25",
|
|
"xpe_battle_rank_24",
|
|
"xpe_command_rank_4",
|
|
"xpe_form_platoon",
|
|
"xpe_bind_ams",
|
|
"xpe_battle_rank_9",
|
|
"xpe_battle_rank_7",
|
|
"xpe_th_router",
|
|
"xpe_th_flail",
|
|
"xpe_th_ant",
|
|
"xpe_th_ams",
|
|
"xpe_th_ground_p",
|
|
"xpe_th_air_p",
|
|
"xpe_th_hover",
|
|
"xpe_th_ground",
|
|
"xpe_th_bfr",
|
|
"xpe_th_afterburner",
|
|
"xpe_th_air",
|
|
"xpe_th_cloak",
|
|
"used_oicw",
|
|
"used_advanced_ace",
|
|
"visited_spitfire_turret",
|
|
"visited_spitfire_cloaked",
|
|
"visited_spitfire_aa",
|
|
"visited_tank_traps",
|
|
"visited_portable_manned_turret_nc",
|
|
"visited_portable_manned_turret_tr",
|
|
"used_magcutter",
|
|
"used_chainblade",
|
|
"used_forceblade",
|
|
"visited_wall_turret",
|
|
"visited_ancient_terminal",
|
|
"visited_ams",
|
|
"visited_ant",
|
|
"visited_dropship",
|
|
"visited_liberator",
|
|
"visited_lightgunship",
|
|
"visited_lightning",
|
|
"visited_magrider",
|
|
"visited_prowler",
|
|
"visited_quadstealth",
|
|
"visited_skyguard",
|
|
"visited_threemanheavybuggy",
|
|
"visited_two_man_assault_buggy",
|
|
"visited_twomanheavybuggy",
|
|
"visited_twomanhoverbuggy",
|
|
"visited_vanguard",
|
|
"visited_flail",
|
|
"visited_router",
|
|
"visited_switchblade",
|
|
"visited_aurora",
|
|
"visited_battlewagon",
|
|
"visited_fury",
|
|
"visited_quadassault",
|
|
"visited_galaxy_gunship",
|
|
"visited_apc_tr",
|
|
"visited_apc_vs",
|
|
"visited_lodestar",
|
|
"visited_phantasm",
|
|
"visited_thunderer",
|
|
"visited_apc_nc",
|
|
"visited_vulture",
|
|
"visited_wasp",
|
|
"visited_mosquito",
|
|
"visited_aphelion_flight",
|
|
"visited_aphelion_gunner",
|
|
"visited_colossus_flight",
|
|
"visited_colossus_gunner",
|
|
"visited_peregrine_flight",
|
|
"visited_peregrine_gunner",
|
|
"used_bank",
|
|
"visited_resource_silo",
|
|
"visited_certification_terminal",
|
|
"visited_med_terminal",
|
|
"used_nano_dispenser",
|
|
"visited_sensor_shield",
|
|
"visited_broadcast_warpgate",
|
|
"used_phalanx",
|
|
"used_phalanx_avcombo",
|
|
"used_phalanx_flakcombo",
|
|
"visited_warpgate_small",
|
|
"used_flamethrower",
|
|
"used_ancient_turret_weapon",
|
|
"visited_LLU_socket",
|
|
"used_energy_gun_nc",
|
|
"visited_mediumtransport",
|
|
"used_aphelion_immolation_cannon",
|
|
"used_grenade_plasma",
|
|
"used_grenade_jammer",
|
|
"visited_shield_generator",
|
|
"visited_motion_sensor",
|
|
"visited_health_crystal",
|
|
"visited_repair_crystal",
|
|
"visited_vehicle_crystal",
|
|
"used_grenade_frag",
|
|
"used_ace",
|
|
"visited_adv_med_terminal",
|
|
"used_beamer",
|
|
"used_bolt_driver",
|
|
"used_cycler",
|
|
"used_gauss",
|
|
"used_hunterseeker",
|
|
"used_isp",
|
|
"used_lancer",
|
|
"used_lasher",
|
|
"used_maelstrom",
|
|
"used_phoenix",
|
|
"used_pulsar",
|
|
"used_punisher",
|
|
"used_r_shotgun",
|
|
"used_radiator",
|
|
"used_rek",
|
|
"used_repeater",
|
|
"used_rocklet",
|
|
"used_striker",
|
|
"used_suppressor",
|
|
"used_thumper",
|
|
"visited_vanu_control_console",
|
|
"visited_capture_terminal",
|
|
"used_mini_chaingun",
|
|
"used_laze_pointer",
|
|
"used_telepad",
|
|
"used_spiker",
|
|
"used_heavy_sniper",
|
|
"used_command_uplink",
|
|
"used_firebird",
|
|
"used_flechette",
|
|
"used_heavy_rail_beam",
|
|
"used_ilc9",
|
|
"visited_generator_terminal",
|
|
"visited_locker",
|
|
"visited_external_door_lock",
|
|
"visited_air_vehicle_terminal",
|
|
"visited_galaxy_terminal",
|
|
"visited_implant_terminal",
|
|
"visited_secondary_capture",
|
|
"used_25mm_cannon",
|
|
"used_liberator_bombardier",
|
|
"visited_repair_silo",
|
|
"visited_vanu_module",
|
|
"used_flail_weapon",
|
|
"used_scythe",
|
|
"visited_respawn_terminal",
|
|
"used_ballgun",
|
|
"used_energy_gun_tr",
|
|
"used_anniversary_guna",
|
|
"used_anniversary_gunb",
|
|
"used_anniversary_gun",
|
|
"used_75mm_cannon",
|
|
"used_apc_nc_weapon",
|
|
"used_apc_tr_weapon",
|
|
"used_apc_vs_weapon",
|
|
"used_flux_cannon",
|
|
"used_aphelion_plasma_rocket_pod",
|
|
"used_aphelion_ppa",
|
|
"used_fluxpod",
|
|
"visited_bfr_terminal",
|
|
"used_colossus_cluster_bomb_pod",
|
|
"used_colossus_dual_100mm_cannons",
|
|
"used_colossus_tank_cannon",
|
|
"visited_energy_crystal",
|
|
"used_heavy_grenade_launcher",
|
|
"used_35mm_rotarychaingun",
|
|
"used_katana",
|
|
"used_35mm_cannon",
|
|
"used_reaver_weapons",
|
|
"used_lightning_weapons",
|
|
"used_med_app",
|
|
"used_20mm_cannon",
|
|
"visited_monolith_amerish",
|
|
"visited_monolith_ceryshen",
|
|
"visited_monolith_cyssor",
|
|
"visited_monolith_esamir",
|
|
"visited_monolith_forseral",
|
|
"visited_monolith_ishundar",
|
|
"visited_monolith_searhus",
|
|
"visited_monolith_solsar",
|
|
"used_nc_hev_falcon",
|
|
"used_nc_hev_scattercannon",
|
|
"used_nc_hev_sparrow",
|
|
"used_armor_siphon",
|
|
"used_peregrine_dual_machine_gun",
|
|
"used_peregrine_dual_rocket_pods",
|
|
"used_peregrine_mechhammer",
|
|
"used_peregrine_particle_cannon",
|
|
"used_peregrine_sparrow",
|
|
"used_105mm_cannon",
|
|
"used_15mm_chaingun",
|
|
"used_pulsed_particle_accelerator",
|
|
"used_rotarychaingun",
|
|
"visited_deconstruction_terminal",
|
|
"used_skyguard_weapons",
|
|
"visited_generator",
|
|
"used_gauss_cannon",
|
|
"used_trek",
|
|
"used_vanguard_weapons",
|
|
"visited_ancient_air_vehicle_terminal",
|
|
"visited_ancient_equipment_terminal",
|
|
"visited_order_terminal",
|
|
"visited_ancient_ground_vehicle_terminal",
|
|
"visited_ground_vehicle_terminal",
|
|
"used_vulture_bombardier",
|
|
"used_vulture_nose_cannon",
|
|
"used_vulture_tail_cannon",
|
|
"used_wasp_weapon_system",
|
|
"visited_charlie01",
|
|
"visited_charlie02",
|
|
"visited_charlie03",
|
|
"visited_charlie04",
|
|
"visited_charlie05",
|
|
"visited_charlie06",
|
|
"visited_charlie07",
|
|
"visited_charlie08",
|
|
"visited_charlie09",
|
|
"visited_gingerman_atar",
|
|
"visited_gingerman_dahaka",
|
|
"visited_gingerman_hvar",
|
|
"visited_gingerman_izha",
|
|
"visited_gingerman_jamshid",
|
|
"visited_gingerman_mithra",
|
|
"visited_gingerman_rashnu",
|
|
"visited_gingerman_sraosha",
|
|
"visited_gingerman_yazata",
|
|
"visited_gingerman_zal",
|
|
"visited_sled01",
|
|
"visited_sled02",
|
|
"visited_sled04",
|
|
"visited_sled05",
|
|
"visited_sled06",
|
|
"visited_sled07",
|
|
"visited_sled08",
|
|
"visited_snowman_amerish",
|
|
"visited_snowman_ceryshen",
|
|
"visited_snowman_cyssor",
|
|
"visited_snowman_esamir",
|
|
"visited_snowman_forseral",
|
|
"visited_snowman_hossin",
|
|
"visited_snowman_ishundar",
|
|
"visited_snowman_searhus",
|
|
"visited_snowman_solsar",
|
|
"ugd06",
|
|
"ugd05",
|
|
"ugd04",
|
|
"ugd03",
|
|
"ugd02",
|
|
"ugd01",
|
|
"map99",
|
|
"map98",
|
|
"map97",
|
|
"map96",
|
|
"map15",
|
|
"map14",
|
|
"map11",
|
|
"map08",
|
|
"map04",
|
|
"map05",
|
|
"map03",
|
|
"map01",
|
|
"map06",
|
|
"map02",
|
|
"map09",
|
|
"map07",
|
|
"map10"
|
|
)
|
|
b.tutorials mustEqual List(
|
|
"training_start_nc",
|
|
"training_ui",
|
|
"training_map"
|
|
)
|
|
b.cosmetics match {
|
|
case Some(c : Cosmetics) =>
|
|
c.Styles mustEqual Set(PersonalStyle.NoHelmet, PersonalStyle.Beret, PersonalStyle.Sunglasses, PersonalStyle.Earpiece)
|
|
case None =>
|
|
ko
|
|
}
|
|
b.unk1.isEmpty mustEqual true
|
|
b.unk2 mustEqual Nil
|
|
b.unk3 mustEqual Nil
|
|
b.unk4 mustEqual 0L
|
|
b.unk5 mustEqual 0L
|
|
b.unk6 mustEqual 0L
|
|
b.unk7 mustEqual 0L
|
|
b.unk8 mustEqual 0L
|
|
b.unk9.isEmpty mustEqual true
|
|
b.unkA mustEqual Nil
|
|
b.unkB mustEqual Nil
|
|
b.unkC mustEqual false
|
|
case _ =>
|
|
ko
|
|
}
|
|
//inventory (but just briefly)
|
|
inv.isDefined mustEqual true
|
|
inv.get.contents.size mustEqual 12
|
|
//0
|
|
inv.get.contents.head.objectClass mustEqual 531
|
|
inv.get.contents.head.guid mustEqual PlanetSideGUID(4202)
|
|
inv.get.contents.head.parentSlot mustEqual 0
|
|
inv.get.contents.head.obj match {
|
|
case DetailedWeaponData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid), fmode, ammo, _) =>
|
|
faction mustEqual PlanetSideEmpire.NC
|
|
bops mustEqual false
|
|
alternate mustEqual false
|
|
v1 mustEqual true
|
|
v2.isEmpty mustEqual true
|
|
v3 mustEqual false
|
|
v4.isEmpty mustEqual true
|
|
v5.isEmpty mustEqual true
|
|
fguid mustEqual PlanetSideGUID(0)
|
|
|
|
fmode mustEqual 0
|
|
|
|
ammo.head.objectClass mustEqual 389
|
|
ammo.head.guid mustEqual PlanetSideGUID(3942)
|
|
ammo.head.parentSlot mustEqual 0
|
|
ammo.head.obj.asInstanceOf[DetailedAmmoBoxData].data.v1 mustEqual true
|
|
ammo.head.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 100
|
|
case _ =>
|
|
ko
|
|
}
|
|
//4
|
|
inv.get.contents(4).objectClass mustEqual 456
|
|
inv.get.contents(4).guid mustEqual PlanetSideGUID(5374)
|
|
inv.get.contents(4).parentSlot mustEqual 5
|
|
inv.get.contents(4).obj.asInstanceOf[DetailedLockerContainerData].inventory.get.contents.size mustEqual 61
|
|
//10
|
|
inv.get.contents(10).objectClass mustEqual 32
|
|
inv.get.contents(10).guid mustEqual PlanetSideGUID(5523)
|
|
inv.get.contents(10).parentSlot mustEqual 39
|
|
inv.get.contents(10).obj match {
|
|
case cdata : DetailedConstructionToolData =>
|
|
cdata.data.faction mustEqual PlanetSideEmpire.NC
|
|
cdata.data.bops mustEqual false
|
|
cdata.data.alternate mustEqual false
|
|
cdata.data.v1 mustEqual true
|
|
cdata.data.v2.isEmpty mustEqual true
|
|
cdata.data.v3 mustEqual false
|
|
cdata.data.v4.isEmpty mustEqual true
|
|
cdata.data.v5.isEmpty mustEqual true
|
|
cdata.data.guid mustEqual PlanetSideGUID(0)
|
|
case _ =>
|
|
ko
|
|
}
|
|
//11
|
|
inv.get.contents(11).objectClass mustEqual 673
|
|
inv.get.contents(11).guid mustEqual PlanetSideGUID(3661)
|
|
inv.get.contents(11).parentSlot mustEqual 60
|
|
inv.get.contents(11).obj match {
|
|
case DetailedWeaponData(CommonFieldData(faction, bops, alternate, v1, v2, v3, v4, v5, fguid), fmode, ammo, _) =>
|
|
faction mustEqual PlanetSideEmpire.NC
|
|
bops mustEqual false
|
|
alternate mustEqual false
|
|
v1 mustEqual true
|
|
v2.isEmpty mustEqual true
|
|
v3 mustEqual false
|
|
v4.isEmpty mustEqual true
|
|
v5.isEmpty mustEqual true
|
|
fguid mustEqual PlanetSideGUID(0)
|
|
|
|
fmode mustEqual 0
|
|
|
|
ammo.head.objectClass mustEqual 674
|
|
ammo.head.guid mustEqual PlanetSideGUID(8542)
|
|
ammo.head.parentSlot mustEqual 0
|
|
ammo.head.obj.asInstanceOf[DetailedAmmoBoxData].data.v1 mustEqual true
|
|
ammo.head.obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 3
|
|
case _ =>
|
|
ko
|
|
}
|
|
|
|
hand mustEqual DrawnSlot.None
|
|
case _ =>
|
|
ko
|
|
}
|
|
case _ =>
|
|
ko
|
|
}
|
|
}
|
|
|
|
"decode (ccrider)" in {
|
|
PacketCoding.DecodePacket(string_ccrider).require match {
|
|
case ObjectCreateDetailedMessage(len, _, _, None, data) =>
|
|
len mustEqual 51018L
|
|
data match {
|
|
case DetailedPlayerData(_, basic, char, inv, _) =>
|
|
basic match {
|
|
case CharacterAppearanceData(a, b, ribbons) =>
|
|
a.app mustEqual BasicCharacterData("CCRIDER", PlanetSideEmpire.NC, CharacterGender.Male, 20, CharacterVoice.Voice3)
|
|
a.data.bops mustEqual false
|
|
a.data.alternate mustEqual false
|
|
a.data.v1 mustEqual false
|
|
a.data.v2.isEmpty mustEqual true
|
|
a.data.v3 mustEqual false
|
|
a.data.v4.isEmpty mustEqual true
|
|
a.data.v5.isEmpty mustEqual true
|
|
a.exosuit mustEqual ExoSuitType.Standard
|
|
a.unk5 mustEqual 0
|
|
a.char_id mustEqual 1176612L
|
|
a.unk7 mustEqual 15
|
|
a.unk8 mustEqual 5
|
|
a.unk9 mustEqual 10
|
|
a.unkA mustEqual 1
|
|
|
|
b.unk0 mustEqual 25044L
|
|
b.outfit_name mustEqual "Black Armored Reapers"
|
|
b.outfit_logo mustEqual 15
|
|
b.unk1 mustEqual false
|
|
b.backpack mustEqual false
|
|
b.unk2 mustEqual false
|
|
b.unk3 mustEqual false
|
|
b.unk4 mustEqual false
|
|
b.facingPitch mustEqual 0
|
|
b.facingYawUpper mustEqual 0
|
|
b.lfs mustEqual false
|
|
b.grenade_state mustEqual GrenadeState.None
|
|
b.is_cloaking mustEqual false
|
|
b.unk5 mustEqual false
|
|
b.unk6 mustEqual false
|
|
b.charging_pose mustEqual false
|
|
b.unk7 mustEqual false
|
|
b.on_zipline.isEmpty mustEqual true
|
|
|
|
ribbons.upper mustEqual MeritCommendation.DefenseNC5
|
|
ribbons.middle mustEqual MeritCommendation.HackingSupport5
|
|
ribbons.lower mustEqual MeritCommendation.BFRAdvanced2
|
|
ribbons.tos mustEqual MeritCommendation.SixYearNC
|
|
case _ =>
|
|
ko
|
|
}
|
|
|
|
char match {
|
|
case DetailedCharacterData(a, b) =>
|
|
a.bep mustEqual 6571522L
|
|
a.cep mustEqual 659329L
|
|
a.unk1 mustEqual 0L
|
|
a.unk2 mustEqual 0L
|
|
a.unk3 mustEqual 0L
|
|
a.healthMax mustEqual 100
|
|
a.health mustEqual 100
|
|
a.unk4 mustEqual false
|
|
a.armor mustEqual 50
|
|
a.unk5 mustEqual 32831L
|
|
a.staminaMax mustEqual 100
|
|
a.stamina mustEqual 100
|
|
a.max_field.isEmpty mustEqual true
|
|
a.unk6 mustEqual 0
|
|
a.unk7 mustEqual 6
|
|
a.unk8 mustEqual 3165669L
|
|
a.unk9 mustEqual List(0, 0, 0, 0, 0, 0)
|
|
a.certs mustEqual List(
|
|
CertificationType.StandardAssault,
|
|
CertificationType.MediumAssault,
|
|
CertificationType.HeavyAssault,
|
|
CertificationType.AirCavalryScout,
|
|
CertificationType.StandardExoSuit,
|
|
CertificationType.AgileExoSuit,
|
|
CertificationType.UniMAX,
|
|
CertificationType.Medical,
|
|
CertificationType.AdvancedMedical,
|
|
CertificationType.Hacking,
|
|
CertificationType.AdvancedHacking,
|
|
CertificationType.ExpertHacking,
|
|
CertificationType.Engineering
|
|
)
|
|
|
|
b.unk1.contains(14140) mustEqual true
|
|
b.implants mustEqual List(
|
|
ImplantEntry(ImplantType.Surge, Some(94), false),
|
|
ImplantEntry(ImplantType.DarklightVision, Some(91), false),
|
|
ImplantEntry(ImplantType.Targeting, Some(91), false)
|
|
)
|
|
b.unk2 mustEqual List()
|
|
b.unk3 mustEqual List()
|
|
b.firstTimeEvents.size mustEqual 271 //too many to bother listing; see encoding test
|
|
b.tutorials mustEqual List(
|
|
"training_weapons01",
|
|
"training_warpgates",
|
|
"training_map",
|
|
"training_inventory",
|
|
"training_healing",
|
|
"training_hart",
|
|
"training_armors",
|
|
"training_welcome"
|
|
)
|
|
b.unk4 mustEqual 0L
|
|
b.unk5 mustEqual 0L
|
|
b.unk6 mustEqual 0L
|
|
b.unk7 mustEqual 0L
|
|
b.unk8 mustEqual 0L
|
|
b.unk9.isEmpty mustEqual true
|
|
b.unkA.size mustEqual 86
|
|
b.unkA mustEqual List(
|
|
9,
|
|
10, 11, 16, 17, 18, 30, 31, 32,
|
|
37, 38, 52, 53, 57, 69, 92, 99,
|
|
100, 107, 108, 109, 110, 114, 115, 116, 117, 118,
|
|
127, 128, 129, 130, 131, 156, 163, 171, 178, 179,
|
|
180, 181, 194, 195, 198, 201, 215, 216, 217, 222,
|
|
223, 224, 225, 226, 227, 229, 230, 243, 244, 257,
|
|
265, 266, 277, 278, 283, 284, 285, 286, 289, 290,
|
|
296, 313, 334, 341, 342, 359, 369, 376, 377, 384,
|
|
391, 392, 393, 394, 398, 408, 415, 420, 424
|
|
)
|
|
b.unkB mustEqual List()
|
|
b.unkC mustEqual false
|
|
b.cosmetics match {
|
|
case Some(c : Cosmetics) =>
|
|
c.Styles mustEqual Set(PersonalStyle.NoHelmet, PersonalStyle.Sunglasses, PersonalStyle.Earpiece, PersonalStyle.BrimmedCap)
|
|
case None =>
|
|
ko
|
|
}
|
|
b.cosmetics.contains(Cosmetics(true, false, true, true, true)) mustEqual true
|
|
case _ =>
|
|
ko
|
|
}
|
|
case _ =>
|
|
ko
|
|
}
|
|
case _ =>
|
|
ko
|
|
}
|
|
}
|
|
|
|
"decode (xRider912)" in {
|
|
PacketCoding.DecodePacket(string_xrider912).require match {
|
|
case ObjectCreateDetailedMessage(len, cls, guid, parentInfo, data) =>
|
|
len mustEqual 36047
|
|
cls mustEqual ObjectClass.avatar
|
|
guid mustEqual PlanetSideGUID(3390)
|
|
parentInfo.isEmpty mustEqual true
|
|
|
|
data match {
|
|
case DetailedPlayerData(Some(pos), basic , char, Some(inv), hand) =>
|
|
pos mustEqual PlacementData(3577.1797f, 2712.25f, 35.78125f, 0, 0, 50.625f)
|
|
|
|
basic match {
|
|
case CharacterAppearanceData(a, b, ribbons) =>
|
|
a.app mustEqual BasicCharacterData("xRider912", PlanetSideEmpire.TR, CharacterGender.Male, 4, CharacterVoice.Voice1)
|
|
a.data.bops mustEqual false
|
|
a.data.alternate mustEqual false
|
|
a.data.v1 mustEqual false
|
|
a.data.v2.isEmpty mustEqual true
|
|
a.data.v3 mustEqual false
|
|
a.data.v4.isEmpty mustEqual true
|
|
a.data.v5.isEmpty mustEqual true
|
|
a.exosuit mustEqual ExoSuitType.Standard
|
|
a.unk5 mustEqual 0
|
|
a.char_id mustEqual 1267466L
|
|
a.unk7 mustEqual 3
|
|
a.unk8 mustEqual 3
|
|
a.unk9 mustEqual 0
|
|
a.unkA mustEqual 0
|
|
|
|
b.unk0 mustEqual 16507L
|
|
b.outfit_name mustEqual "Hooked On Insanity"
|
|
b.outfit_logo mustEqual 5
|
|
b.unk1 mustEqual false
|
|
b.backpack mustEqual false
|
|
b.unk2 mustEqual false
|
|
b.unk3 mustEqual false
|
|
b.unk4 mustEqual false
|
|
b.facingPitch mustEqual 0
|
|
b.facingYawUpper mustEqual 0
|
|
b.lfs mustEqual false
|
|
b.grenade_state mustEqual GrenadeState.None
|
|
b.is_cloaking mustEqual false
|
|
b.unk5 mustEqual false
|
|
b.unk6 mustEqual false
|
|
b.charging_pose mustEqual false
|
|
b.unk7 mustEqual false
|
|
b.on_zipline.isEmpty mustEqual true
|
|
|
|
ribbons.upper mustEqual MeritCommendation.EmeraldVeteran
|
|
ribbons.middle mustEqual MeritCommendation.ScavengerTR1
|
|
ribbons.lower mustEqual MeritCommendation.BlackOpsParticipant
|
|
ribbons.tos mustEqual MeritCommendation.SixYearTR
|
|
case _ =>
|
|
ko
|
|
}
|
|
|
|
DetailedCharacterData.isBR24(char.a.bep) mustEqual false
|
|
char match {
|
|
case DetailedCharacterData(a, b) =>
|
|
a.bep mustEqual 1784200L
|
|
a.cep mustEqual 53490L
|
|
a.unk1 mustEqual 0L
|
|
a.unk2 mustEqual 0L
|
|
a.unk3 mustEqual 0L
|
|
a.healthMax mustEqual 100
|
|
a.health mustEqual 100
|
|
a.unk4 mustEqual false
|
|
a.armor mustEqual 50
|
|
a.unk5 mustEqual 32831L
|
|
a.staminaMax mustEqual 100
|
|
a.stamina mustEqual 100
|
|
a.max_field.isEmpty mustEqual true
|
|
a.unk6 mustEqual 0
|
|
a.unk7 mustEqual 6
|
|
a.unk8 mustEqual 1184175L
|
|
a.unk9 mustEqual List(0, 0, 0, 0, 0, 0)
|
|
a.certs mustEqual List(
|
|
CertificationType.StandardAssault,
|
|
CertificationType.MediumAssault,
|
|
CertificationType.HeavyAssault,
|
|
CertificationType.AntiVehicular,
|
|
CertificationType.AirCavalryScout,
|
|
CertificationType.StandardExoSuit,
|
|
CertificationType.AgileExoSuit,
|
|
CertificationType.Medical,
|
|
CertificationType.AdvancedMedical,
|
|
CertificationType.Hacking,
|
|
CertificationType.AdvancedHacking,
|
|
CertificationType.Engineering
|
|
)
|
|
|
|
b.unk1.contains(21236) mustEqual true
|
|
b.implants mustEqual List(
|
|
ImplantEntry(ImplantType.Surge, Some(94), false),
|
|
ImplantEntry(ImplantType.Targeting, Some(91), false),
|
|
ImplantEntry(ImplantType.DarklightVision, Some(91), false)
|
|
)
|
|
b.unk2 mustEqual List()
|
|
b.unk3 mustEqual List()
|
|
b.firstTimeEvents.size mustEqual 209 //too many to bother listing; see encoding test
|
|
b.tutorials mustEqual List()
|
|
b.unk4 mustEqual 0L
|
|
b.unk5 mustEqual 0L
|
|
b.unk6 mustEqual 0L
|
|
b.unk7 mustEqual 0L
|
|
b.unk8 mustEqual 0L
|
|
b.unk9.isEmpty mustEqual true
|
|
b.unkA mustEqual List(
|
|
9, 16, 17, 69, 107, 108,
|
|
114, 115, 134, 171, 178,
|
|
196, 199, 222, 229, 283,
|
|
297, 347, 360, 391, 399, 421
|
|
)
|
|
b.unkB mustEqual List()
|
|
b.unkC mustEqual false
|
|
b.cosmetics.isEmpty mustEqual true
|
|
case _ =>
|
|
ko
|
|
}
|
|
|
|
inv.contents.length mustEqual 10
|
|
//check first and last entries of inventory for accuracy
|
|
inv.contents.head mustEqual InternalSlot(
|
|
730, PlanetSideGUID(3465), 0,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.TR, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(
|
|
InternalSlot(28, PlanetSideGUID(3722), 0,
|
|
DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 20)
|
|
)
|
|
), false)
|
|
)
|
|
//...
|
|
inv.contents(9) mustEqual InternalSlot(
|
|
728, PlanetSideGUID(4731), 39,
|
|
DetailedREKData(CommonFieldData(PlanetSideEmpire.TR, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)), 16)
|
|
)
|
|
|
|
hand mustEqual DrawnSlot.None
|
|
case _ =>
|
|
ko
|
|
}
|
|
case _ =>
|
|
ko
|
|
}
|
|
}
|
|
|
|
"encode" in {
|
|
val pos : PlacementData = PlacementData(
|
|
3674.8438f, 2726.789f, 91.15625f,
|
|
0, 0, 36.5625f
|
|
)
|
|
val aa : Int=>CharacterAppearanceA = CharacterAppearanceA(
|
|
BasicCharacterData(
|
|
"IlllIIIlllIlIllIlllIllI",
|
|
PlanetSideEmpire.VS,
|
|
CharacterGender.Female,
|
|
41,
|
|
CharacterVoice.Voice1
|
|
),
|
|
CommonFieldData(
|
|
PlanetSideEmpire.VS,
|
|
false,
|
|
false,
|
|
true,
|
|
None,
|
|
false,
|
|
None,
|
|
None,
|
|
PlanetSideGUID(0)
|
|
),
|
|
ExoSuitType.Standard,
|
|
0,
|
|
41605313L,
|
|
0,
|
|
0,
|
|
0,
|
|
65535
|
|
)
|
|
val ab : (Boolean,Int)=>CharacterAppearanceB = CharacterAppearanceB(
|
|
0L,
|
|
"",
|
|
0,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
2.8125f, 61.875f,
|
|
true,
|
|
GrenadeState.None,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
None
|
|
)
|
|
|
|
val app : Int=>CharacterAppearanceData = CharacterAppearanceData(
|
|
aa, ab,
|
|
RibbonBars(
|
|
MeritCommendation.None,
|
|
MeritCommendation.None,
|
|
MeritCommendation.None,
|
|
MeritCommendation.None
|
|
)
|
|
)
|
|
val ba : DetailedCharacterA = DetailedCharacterA(
|
|
0L,
|
|
0L,
|
|
0L, 0L, 0L,
|
|
100, 100,
|
|
false,
|
|
50,
|
|
32831L,
|
|
100, 100,
|
|
None,
|
|
0, 0, 0L,
|
|
List(0, 0, 0, 0, 0, 0),
|
|
List(
|
|
CertificationType.StandardAssault,
|
|
CertificationType.MediumAssault,
|
|
CertificationType.ATV,
|
|
CertificationType.Harasser,
|
|
CertificationType.StandardExoSuit,
|
|
CertificationType.AgileExoSuit,
|
|
CertificationType.ReinforcedExoSuit
|
|
)
|
|
)
|
|
val bb : (Long, Option[Int])=>DetailedCharacterB = DetailedCharacterB(
|
|
None,
|
|
Nil,
|
|
Nil, Nil,
|
|
List(
|
|
"xpe_sanctuary_help",
|
|
"xpe_th_firemodes",
|
|
"used_beamer",
|
|
"map13"
|
|
),
|
|
Nil,
|
|
0L, 0L, 0L, 0L, 0L,
|
|
Some(DCDExtra2(0, 0)),
|
|
Nil, Nil, false,
|
|
None
|
|
)
|
|
val char : Option[Int]=>DetailedCharacterData =
|
|
(pad_length : Option[Int]) => DetailedCharacterData(ba, bb(ba.bep, pad_length))(pad_length)
|
|
|
|
val inv = InventoryData(List(
|
|
InventoryItemData(ObjectClass.beamer, PlanetSideGUID(76), 0,
|
|
DetailedWeaponData(
|
|
CommonFieldData(PlanetSideEmpire.VS, false, false, true, None, false, None, None, PlanetSideGUID(0)),
|
|
0,
|
|
List(InternalSlot(ObjectClass.energy_cell, PlanetSideGUID(77), 0, DetailedAmmoBoxData(8, 16)))
|
|
)
|
|
),
|
|
InventoryItemData(ObjectClass.suppressor, PlanetSideGUID(78), 2,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.VS, false, false, true, None, false, None, None, PlanetSideGUID(0)),
|
|
0,
|
|
List(InternalSlot(ObjectClass.bullet_9mm, PlanetSideGUID(79), 0, DetailedAmmoBoxData(8, 25)))
|
|
)
|
|
),
|
|
InventoryItemData(ObjectClass.forceblade, PlanetSideGUID(80), 4,
|
|
DetailedWeaponData(
|
|
CommonFieldData(PlanetSideEmpire.VS, false, false, true, None, false, None, None, PlanetSideGUID(0)),
|
|
0,
|
|
List(InternalSlot(ObjectClass.melee_ammo, PlanetSideGUID(81), 0, DetailedAmmoBoxData(8, 1)))
|
|
)
|
|
),
|
|
InventoryItemData(ObjectClass.locker_container, PlanetSideGUID(82), 5, DetailedLockerContainerData(8)),
|
|
InventoryItemData(ObjectClass.bullet_9mm, PlanetSideGUID(83), 6, DetailedAmmoBoxData(8, 50)),
|
|
InventoryItemData(ObjectClass.bullet_9mm, PlanetSideGUID(84), 9, DetailedAmmoBoxData(8, 50)),
|
|
InventoryItemData(ObjectClass.bullet_9mm, PlanetSideGUID(85), 12, DetailedAmmoBoxData(8, 50)),
|
|
InventoryItemData(ObjectClass.bullet_9mm_AP, PlanetSideGUID(86), 33, DetailedAmmoBoxData(8, 50)),
|
|
InventoryItemData(ObjectClass.energy_cell, PlanetSideGUID(87), 36, DetailedAmmoBoxData(8, 50)),
|
|
InventoryItemData(ObjectClass.remote_electronics_kit, PlanetSideGUID(88), 39, DetailedREKData(CommonFieldData(PlanetSideEmpire.VS, false, false, true, None, false, Some(false), None, PlanetSideGUID(0))))
|
|
))
|
|
val obj = DetailedPlayerData.apply(pos, app, char, inv, DrawnSlot.Pistol1)
|
|
|
|
val msg = ObjectCreateDetailedMessage(0x79, PlanetSideGUID(75), obj)
|
|
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
|
val pkt_bitv = pkt.toBitVector
|
|
val ori_bitv = string.toBitVector
|
|
pkt_bitv.take(724) mustEqual ori_bitv.take(724) //skip 1; this is the highest bit of facingPitch
|
|
pkt_bitv.drop(725) mustEqual ori_bitv.drop(725)
|
|
//TODO work on DetailedCharacterData to make this pass as a single stream
|
|
}
|
|
|
|
"encode (character, seated)" in {
|
|
val aa : Int=>CharacterAppearanceA = CharacterAppearanceA(
|
|
BasicCharacterData(
|
|
"IlllIIIlllIlIllIlllIllI",
|
|
PlanetSideEmpire.VS,
|
|
CharacterGender.Female,
|
|
41,
|
|
CharacterVoice.Voice1
|
|
),
|
|
CommonFieldData(
|
|
PlanetSideEmpire.VS,
|
|
false,
|
|
false,
|
|
false,
|
|
None,
|
|
false,
|
|
None,
|
|
None,
|
|
PlanetSideGUID(0)
|
|
),
|
|
ExoSuitType.Standard,
|
|
0,
|
|
192L,
|
|
0,
|
|
0,
|
|
0,
|
|
0
|
|
)
|
|
val ab : (Boolean,Int)=>CharacterAppearanceB = CharacterAppearanceB(
|
|
0L,
|
|
"",
|
|
0,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
5.625f, 61.875f,
|
|
true,
|
|
GrenadeState.None,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
None
|
|
)
|
|
|
|
val app : Int=>CharacterAppearanceData = CharacterAppearanceData(
|
|
aa, ab,
|
|
RibbonBars(
|
|
MeritCommendation.None,
|
|
MeritCommendation.None,
|
|
MeritCommendation.None,
|
|
MeritCommendation.None
|
|
)
|
|
)
|
|
val ba : DetailedCharacterA = DetailedCharacterA(
|
|
0L,
|
|
0L,
|
|
0L, 0L, 0L,
|
|
100, 100,
|
|
false,
|
|
50,
|
|
32831L,
|
|
100, 100,
|
|
None,
|
|
0, 0, 0L,
|
|
List(0, 0, 0, 0, 0, 0),
|
|
List(
|
|
CertificationType.StandardAssault,
|
|
CertificationType.MediumAssault,
|
|
CertificationType.ATV,
|
|
CertificationType.Harasser,
|
|
CertificationType.StandardExoSuit,
|
|
CertificationType.AgileExoSuit,
|
|
CertificationType.ReinforcedExoSuit
|
|
)
|
|
)
|
|
val bb : (Long, Option[Int])=>DetailedCharacterB = DetailedCharacterB(
|
|
None,
|
|
Nil,
|
|
Nil, Nil,
|
|
List(
|
|
"xpe_sanctuary_help",
|
|
"xpe_th_firemodes",
|
|
"used_beamer",
|
|
"map13"
|
|
),
|
|
Nil,
|
|
0L, 0L, 0L, 0L, 0L,
|
|
Some(DCDExtra2(0, 0)),
|
|
Nil, Nil, false,
|
|
None
|
|
)
|
|
val char : Option[Int]=>DetailedCharacterData =
|
|
(pad_length : Option[Int]) => DetailedCharacterData(ba, bb(ba.bep, pad_length))(pad_length)
|
|
|
|
val inv = InventoryData(List(
|
|
InventoryItemData(ObjectClass.beamer, PlanetSideGUID(76), 0,
|
|
DetailedWeaponData(
|
|
CommonFieldData(PlanetSideEmpire.VS, false, false, true, None, false, None, None, PlanetSideGUID(0)),
|
|
0,
|
|
List(InternalSlot(ObjectClass.energy_cell, PlanetSideGUID(77), 0, DetailedAmmoBoxData(8, 16)))
|
|
)
|
|
),
|
|
InventoryItemData(ObjectClass.suppressor, PlanetSideGUID(78), 2,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.VS, false, false, true, None, false, None, None, PlanetSideGUID(0)),
|
|
0,
|
|
List(InternalSlot(ObjectClass.bullet_9mm, PlanetSideGUID(79), 0, DetailedAmmoBoxData(8, 25)))
|
|
)
|
|
),
|
|
InventoryItemData(ObjectClass.forceblade, PlanetSideGUID(80), 4,
|
|
DetailedWeaponData(
|
|
CommonFieldData(PlanetSideEmpire.VS, false, false, true, None, false, None, None, PlanetSideGUID(0)),
|
|
0,
|
|
List(InternalSlot(ObjectClass.melee_ammo, PlanetSideGUID(81), 0, DetailedAmmoBoxData(8, 1)))
|
|
)
|
|
),
|
|
InventoryItemData(ObjectClass.locker_container, PlanetSideGUID(82), 5, DetailedLockerContainerData(8)),
|
|
InventoryItemData(ObjectClass.bullet_9mm, PlanetSideGUID(83), 6, DetailedAmmoBoxData(8, 50)),
|
|
InventoryItemData(ObjectClass.bullet_9mm, PlanetSideGUID(84), 9, DetailedAmmoBoxData(8, 50)),
|
|
InventoryItemData(ObjectClass.bullet_9mm, PlanetSideGUID(85), 12, DetailedAmmoBoxData(8, 50)),
|
|
InventoryItemData(ObjectClass.bullet_9mm_AP, PlanetSideGUID(86), 33, DetailedAmmoBoxData(8, 50)),
|
|
InventoryItemData(ObjectClass.energy_cell, PlanetSideGUID(87), 36, DetailedAmmoBoxData(8, 50)),
|
|
InventoryItemData(ObjectClass.remote_electronics_kit, PlanetSideGUID(88), 39, DetailedREKData(CommonFieldData(PlanetSideEmpire.VS, false, false, true, None, false, Some(false), None, PlanetSideGUID(0))))
|
|
))
|
|
val obj = DetailedPlayerData.apply(app, char, inv, DrawnSlot.Pistol1)
|
|
//it shouldn't be Pistol1 if he's seated but it's fine for the test
|
|
|
|
val msg = ObjectCreateDetailedMessage(0x79, PlanetSideGUID(75), ObjectCreateMessageParent(PlanetSideGUID(43981), 0), obj)
|
|
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
|
val pkt_bitv = pkt.toBitVector
|
|
val ori_bitv = string_seated.toBitVector
|
|
pkt_bitv.take(668) mustEqual ori_bitv.take(668) //skip 1; this is the highest bit of facingPitch
|
|
pkt_bitv.drop(670) mustEqual ori_bitv.drop(670)
|
|
//TODO work on DetailedCharacterData to make this pass as a single stream
|
|
}
|
|
|
|
"encode (max)" in {
|
|
val pos : PlacementData = PlacementData(
|
|
Vector3(3990.7734f, 3656.5781f, 230.70312f),
|
|
Vector3(0, 0, 67.5f),
|
|
None
|
|
)
|
|
val aa : Int=>CharacterAppearanceA = CharacterAppearanceA(
|
|
BasicCharacterData(
|
|
"HaHaATRMax",
|
|
PlanetSideEmpire.TR,
|
|
CharacterGender.Male,
|
|
57,
|
|
CharacterVoice.Voice1
|
|
),CommonFieldData(
|
|
PlanetSideEmpire.TR,
|
|
false,
|
|
false,
|
|
true,
|
|
None,
|
|
false,
|
|
None,
|
|
None,
|
|
PlanetSideGUID(0)
|
|
),
|
|
ExoSuitType.MAX,
|
|
1,
|
|
41605870L,
|
|
0,
|
|
0,
|
|
0,
|
|
65535
|
|
)
|
|
val ab : (Boolean,Int)=>CharacterAppearanceB = CharacterAppearanceB(
|
|
0L,
|
|
"",
|
|
0,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
348.75f, 0,
|
|
true,
|
|
GrenadeState.None,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
None
|
|
)
|
|
|
|
val app : Int=>CharacterAppearanceData = CharacterAppearanceData(
|
|
aa, ab,
|
|
RibbonBars()
|
|
)
|
|
val ba : DetailedCharacterA = DetailedCharacterA(
|
|
15301L,
|
|
0L,
|
|
0L, 0L, 0L,
|
|
120, 120,
|
|
false,
|
|
641,
|
|
32831L,
|
|
100, 100,
|
|
Some(0),
|
|
0, 0, 0L,
|
|
List(0, 0, 0, 0, 0, 0),
|
|
List(
|
|
CertificationType.StandardAssault,
|
|
CertificationType.MediumAssault,
|
|
CertificationType.StandardExoSuit,
|
|
CertificationType.AgileExoSuit,
|
|
CertificationType.UniMAX
|
|
)
|
|
)
|
|
val bb : (Long, Option[Int])=>DetailedCharacterB = DetailedCharacterB(
|
|
None,
|
|
Nil,
|
|
Nil, Nil,
|
|
List(
|
|
"xpe_battle_rank_3",
|
|
"xpe_bind_facility",
|
|
"xpe_instant_action",
|
|
"xpe_battle_rank_4",
|
|
"xpe_battle_rank_2",
|
|
"xpe_sanctuary_help",
|
|
"xpe_drop_pod",
|
|
"xpe_orbital_shuttle",
|
|
"xpe_battle_rank_5",
|
|
"xpe_th_nonsanc",
|
|
"xpe_th_ground_p",
|
|
"xpe_th_ammo",
|
|
"xpe_th_firemodes",
|
|
"xpe_th_max",
|
|
"visited_spitfire_turret",
|
|
"visited_wall_turret",
|
|
"visited_resource_silo",
|
|
"visited_certification_terminal",
|
|
"visited_med_terminal",
|
|
"visited_broadcast_warpgate",
|
|
"used_phalanx",
|
|
"visited_air_vehicle_terminal",
|
|
"visited_bfr_terminal",
|
|
"used_cycler",
|
|
"visited_galaxy_terminal",
|
|
"visited_implant_terminal",
|
|
"visited_external_door_lock",
|
|
"visited_respawn_terminal",
|
|
"visited_locker",
|
|
"visited_motion_sensor",
|
|
"used_grenade_plasma",
|
|
"used_rek",
|
|
"used_repeater",
|
|
"visited_deconstruction_terminal",
|
|
"visited_secondary_capture",
|
|
"used_suppressor",
|
|
"used_trhev_burster",
|
|
"used_trhev_dualcycler",
|
|
"used_trhev_pounder",
|
|
"visited_capture_terminal",
|
|
"visited_order_terminal",
|
|
"visited_ground_vehicle_terminal",
|
|
"map12",
|
|
"map10",
|
|
"map09",
|
|
"map05",
|
|
"map03",
|
|
"map02"
|
|
),
|
|
Nil,
|
|
0L, 0L, 0L, 0L, 0L,
|
|
Some(DCDExtra2(0, 0)),
|
|
Nil, Nil, false,
|
|
None
|
|
)
|
|
val char : Option[Int]=>DetailedCharacterData =
|
|
(pad_length : Option[Int]) => DetailedCharacterData(ba, bb(ba.bep, pad_length))(pad_length)
|
|
|
|
val inv = InventoryData(
|
|
List(
|
|
InternalSlot(889, PlanetSideGUID(2), 0,
|
|
DetailedWeaponData(
|
|
CommonFieldData(PlanetSideEmpire.TR, false, false, true, None, false, None, None, PlanetSideGUID(0)),
|
|
0,
|
|
List(
|
|
InternalSlot(265, PlanetSideGUID(3), 0, DetailedAmmoBoxData(8,200)),
|
|
InternalSlot(265, PlanetSideGUID(4), 1, DetailedAmmoBoxData(8,200)),
|
|
InternalSlot(265, PlanetSideGUID(5), 2, DetailedAmmoBoxData(8,200))
|
|
)
|
|
)
|
|
),
|
|
InternalSlot(175, PlanetSideGUID(6), 4,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.TR, false, false, true, None, false, None, None, PlanetSideGUID(0)),
|
|
0,
|
|
List(
|
|
InternalSlot(540, PlanetSideGUID(7), 0, DetailedAmmoBoxData(8,1))
|
|
)
|
|
)
|
|
),
|
|
InternalSlot(456, PlanetSideGUID(8), 5, DetailedLockerContainerData(
|
|
CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)),
|
|
None
|
|
)),
|
|
InternalSlot(265, PlanetSideGUID(9), 6, DetailedAmmoBoxData(8, 36)),
|
|
InternalSlot(265, PlanetSideGUID(10), 10, DetailedAmmoBoxData(8, 100)),
|
|
InternalSlot(265, PlanetSideGUID(11), 14, DetailedAmmoBoxData(8, 100)),
|
|
InternalSlot(265, PlanetSideGUID(12), 18, DetailedAmmoBoxData(8, 100)),
|
|
InternalSlot(265, PlanetSideGUID(13), 70, DetailedAmmoBoxData(8, 100)),
|
|
InternalSlot(265, PlanetSideGUID(14), 74, DetailedAmmoBoxData(8, 100)),
|
|
InternalSlot(265, PlanetSideGUID(15), 78, DetailedAmmoBoxData(8, 100)),
|
|
InternalSlot(265, PlanetSideGUID(16), 82, DetailedAmmoBoxData(8, 100)),
|
|
InternalSlot(536, PlanetSideGUID(17), 134, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(536, PlanetSideGUID(18), 138, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(536, PlanetSideGUID(19), 142, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(536, PlanetSideGUID(20), 146, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(536, PlanetSideGUID(21), 166, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(536, PlanetSideGUID(22), 170, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(536, PlanetSideGUID(23), 174, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(536, PlanetSideGUID(24), 178, DetailedAmmoBoxData(8, 1))
|
|
)
|
|
)
|
|
val obj = DetailedPlayerData(pos, app, char, inv, DrawnSlot.Pistol1)
|
|
|
|
val msg = ObjectCreateDetailedMessage(ObjectClass.avatar, PlanetSideGUID(1), obj)
|
|
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
|
pkt mustEqual string_max
|
|
}
|
|
|
|
"encode (BR32)" in {
|
|
val pos : PlacementData = PlacementData(
|
|
Vector3(5500.0f, 3800.0f, 71.484375f),
|
|
Vector3(0, 0, 90.0f),
|
|
None
|
|
)
|
|
val aa : Int=>CharacterAppearanceA = CharacterAppearanceA(
|
|
BasicCharacterData(
|
|
"KiCkJr",
|
|
PlanetSideEmpire.NC,
|
|
CharacterGender.Male,
|
|
24,
|
|
CharacterVoice.Voice4
|
|
),
|
|
CommonFieldData(
|
|
PlanetSideEmpire.NC,
|
|
false,
|
|
false,
|
|
true,
|
|
None,
|
|
false,
|
|
None,
|
|
None,
|
|
PlanetSideGUID(0)
|
|
),
|
|
ExoSuitType.Agile,
|
|
0,
|
|
733931L,
|
|
0,
|
|
0,
|
|
0,
|
|
0
|
|
)
|
|
val ab : (Boolean,Int)=>CharacterAppearanceB = CharacterAppearanceB(
|
|
556539L,
|
|
"",
|
|
14,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
348.75f, 348.75f,
|
|
false,
|
|
GrenadeState.None,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
false,
|
|
None
|
|
)
|
|
|
|
val app : Int=>CharacterAppearanceData = CharacterAppearanceData(
|
|
aa, ab,
|
|
RibbonBars(
|
|
MeritCommendation.Loser4,
|
|
MeritCommendation.EventNCElite,
|
|
MeritCommendation.HeavyAssault6,
|
|
MeritCommendation.SixYearNC
|
|
)
|
|
)
|
|
val ba : DetailedCharacterA = DetailedCharacterA(
|
|
6366766L,
|
|
694787L,
|
|
0L, 0L, 0L,
|
|
100, 100,
|
|
false,
|
|
100,
|
|
32831L,
|
|
100, 46,
|
|
None,
|
|
0, 4, 3278759L,
|
|
List(0, 0, 0, 0, 0, 0),
|
|
List(
|
|
CertificationType.StandardAssault,
|
|
CertificationType.MediumAssault,
|
|
CertificationType.HeavyAssault,
|
|
CertificationType.AntiVehicular,
|
|
CertificationType.AirCavalryScout,
|
|
CertificationType.GroundSupport,
|
|
CertificationType.Harasser,
|
|
CertificationType.StandardExoSuit,
|
|
CertificationType.AgileExoSuit,
|
|
CertificationType.Medical,
|
|
CertificationType.AdvancedMedical,
|
|
CertificationType.Hacking,
|
|
CertificationType.AdvancedHacking,
|
|
CertificationType.Engineering,
|
|
CertificationType.CombatEngineering
|
|
)
|
|
)
|
|
val bb : (Long, Option[Int])=>DetailedCharacterB = DetailedCharacterB(
|
|
None,
|
|
List(
|
|
ImplantEntry(ImplantType.AudioAmplifier, None),
|
|
ImplantEntry(ImplantType.Targeting, None),
|
|
ImplantEntry(ImplantType.Surge, None)
|
|
),
|
|
Nil, Nil,
|
|
List(
|
|
"xpe_overhead_map",
|
|
"xpe_warp_gate",
|
|
"xpe_form_outfit",
|
|
"xpe_blackops",
|
|
"xpe_command_rank_5",
|
|
"xpe_command_rank_3",
|
|
"xpe_sanctuary_help",
|
|
"xpe_battle_rank_13",
|
|
"xpe_battle_rank_12",
|
|
"xpe_battle_rank_10",
|
|
"xpe_battle_rank_14",
|
|
"xpe_battle_rank_15",
|
|
"xpe_orbital_shuttle",
|
|
"xpe_drop_pod",
|
|
"xpe_bind_facility",
|
|
"xpe_battle_rank_3",
|
|
"xpe_battle_rank_5",
|
|
"xpe_battle_rank_4",
|
|
"xpe_join_squad",
|
|
"xpe_form_squad",
|
|
"xpe_instant_action",
|
|
"xpe_battle_rank_2",
|
|
"xpe_warp_gate_usage",
|
|
"xpe_battle_rank_8",
|
|
"xpe_battle_rank_11",
|
|
"xpe_battle_rank_6",
|
|
"xpe_mail_alert",
|
|
"xpe_command_rank_1",
|
|
"xpe_battle_rank_20",
|
|
"xpe_battle_rank_18",
|
|
"xpe_battle_rank_19",
|
|
"xpe_join_platoon",
|
|
"xpe_battle_rank_17",
|
|
"xpe_battle_rank_16",
|
|
"xpe_join_outfit",
|
|
"xpe_battle_rank_25",
|
|
"xpe_battle_rank_24",
|
|
"xpe_command_rank_4",
|
|
"xpe_form_platoon",
|
|
"xpe_bind_ams",
|
|
"xpe_battle_rank_9",
|
|
"xpe_battle_rank_7",
|
|
"xpe_th_router",
|
|
"xpe_th_flail",
|
|
"xpe_th_ant",
|
|
"xpe_th_ams",
|
|
"xpe_th_ground_p",
|
|
"xpe_th_air_p",
|
|
"xpe_th_hover",
|
|
"xpe_th_ground",
|
|
"xpe_th_bfr",
|
|
"xpe_th_afterburner",
|
|
"xpe_th_air",
|
|
"xpe_th_cloak",
|
|
"used_oicw",
|
|
"used_advanced_ace",
|
|
"visited_spitfire_turret",
|
|
"visited_spitfire_cloaked",
|
|
"visited_spitfire_aa",
|
|
"visited_tank_traps",
|
|
"visited_portable_manned_turret_nc",
|
|
"visited_portable_manned_turret_tr",
|
|
"used_magcutter",
|
|
"used_chainblade",
|
|
"used_forceblade",
|
|
"visited_wall_turret",
|
|
"visited_ancient_terminal",
|
|
"visited_ams",
|
|
"visited_ant",
|
|
"visited_dropship",
|
|
"visited_liberator",
|
|
"visited_lightgunship",
|
|
"visited_lightning",
|
|
"visited_magrider",
|
|
"visited_prowler",
|
|
"visited_quadstealth",
|
|
"visited_skyguard",
|
|
"visited_threemanheavybuggy",
|
|
"visited_two_man_assault_buggy",
|
|
"visited_twomanheavybuggy",
|
|
"visited_twomanhoverbuggy",
|
|
"visited_vanguard",
|
|
"visited_flail",
|
|
"visited_router",
|
|
"visited_switchblade",
|
|
"visited_aurora",
|
|
"visited_battlewagon",
|
|
"visited_fury",
|
|
"visited_quadassault",
|
|
"visited_galaxy_gunship",
|
|
"visited_apc_tr",
|
|
"visited_apc_vs",
|
|
"visited_lodestar",
|
|
"visited_phantasm",
|
|
"visited_thunderer",
|
|
"visited_apc_nc",
|
|
"visited_vulture",
|
|
"visited_wasp",
|
|
"visited_mosquito",
|
|
"visited_aphelion_flight",
|
|
"visited_aphelion_gunner",
|
|
"visited_colossus_flight",
|
|
"visited_colossus_gunner",
|
|
"visited_peregrine_flight",
|
|
"visited_peregrine_gunner",
|
|
"used_bank",
|
|
"visited_resource_silo",
|
|
"visited_certification_terminal",
|
|
"visited_med_terminal",
|
|
"used_nano_dispenser",
|
|
"visited_sensor_shield",
|
|
"visited_broadcast_warpgate",
|
|
"used_phalanx",
|
|
"used_phalanx_avcombo",
|
|
"used_phalanx_flakcombo",
|
|
"visited_warpgate_small",
|
|
"used_flamethrower",
|
|
"used_ancient_turret_weapon",
|
|
"visited_LLU_socket",
|
|
"used_energy_gun_nc",
|
|
"visited_mediumtransport",
|
|
"used_aphelion_immolation_cannon",
|
|
"used_grenade_plasma",
|
|
"used_grenade_jammer",
|
|
"visited_shield_generator",
|
|
"visited_motion_sensor",
|
|
"visited_health_crystal",
|
|
"visited_repair_crystal",
|
|
"visited_vehicle_crystal",
|
|
"used_grenade_frag",
|
|
"used_ace",
|
|
"visited_adv_med_terminal",
|
|
"used_beamer",
|
|
"used_bolt_driver",
|
|
"used_cycler",
|
|
"used_gauss",
|
|
"used_hunterseeker",
|
|
"used_isp",
|
|
"used_lancer",
|
|
"used_lasher",
|
|
"used_maelstrom",
|
|
"used_phoenix",
|
|
"used_pulsar",
|
|
"used_punisher",
|
|
"used_r_shotgun",
|
|
"used_radiator",
|
|
"used_rek",
|
|
"used_repeater",
|
|
"used_rocklet",
|
|
"used_striker",
|
|
"used_suppressor",
|
|
"used_thumper",
|
|
"visited_vanu_control_console",
|
|
"visited_capture_terminal",
|
|
"used_mini_chaingun",
|
|
"used_laze_pointer",
|
|
"used_telepad",
|
|
"used_spiker",
|
|
"used_heavy_sniper",
|
|
"used_command_uplink",
|
|
"used_firebird",
|
|
"used_flechette",
|
|
"used_heavy_rail_beam",
|
|
"used_ilc9",
|
|
"visited_generator_terminal",
|
|
"visited_locker",
|
|
"visited_external_door_lock",
|
|
"visited_air_vehicle_terminal",
|
|
"visited_galaxy_terminal",
|
|
"visited_implant_terminal",
|
|
"visited_secondary_capture",
|
|
"used_25mm_cannon",
|
|
"used_liberator_bombardier",
|
|
"visited_repair_silo",
|
|
"visited_vanu_module",
|
|
"used_flail_weapon",
|
|
"used_scythe",
|
|
"visited_respawn_terminal",
|
|
"used_ballgun",
|
|
"used_energy_gun_tr",
|
|
"used_anniversary_guna",
|
|
"used_anniversary_gunb",
|
|
"used_anniversary_gun",
|
|
"used_75mm_cannon",
|
|
"used_apc_nc_weapon",
|
|
"used_apc_tr_weapon",
|
|
"used_apc_vs_weapon",
|
|
"used_flux_cannon",
|
|
"used_aphelion_plasma_rocket_pod",
|
|
"used_aphelion_ppa",
|
|
"used_fluxpod",
|
|
"visited_bfr_terminal",
|
|
"used_colossus_cluster_bomb_pod",
|
|
"used_colossus_dual_100mm_cannons",
|
|
"used_colossus_tank_cannon",
|
|
"visited_energy_crystal",
|
|
"used_heavy_grenade_launcher",
|
|
"used_35mm_rotarychaingun",
|
|
"used_katana",
|
|
"used_35mm_cannon",
|
|
"used_reaver_weapons",
|
|
"used_lightning_weapons",
|
|
"used_med_app",
|
|
"used_20mm_cannon",
|
|
"visited_monolith_amerish",
|
|
"visited_monolith_ceryshen",
|
|
"visited_monolith_cyssor",
|
|
"visited_monolith_esamir",
|
|
"visited_monolith_forseral",
|
|
"visited_monolith_ishundar",
|
|
"visited_monolith_searhus",
|
|
"visited_monolith_solsar",
|
|
"used_nc_hev_falcon",
|
|
"used_nc_hev_scattercannon",
|
|
"used_nc_hev_sparrow",
|
|
"used_armor_siphon",
|
|
"used_peregrine_dual_machine_gun",
|
|
"used_peregrine_dual_rocket_pods",
|
|
"used_peregrine_mechhammer",
|
|
"used_peregrine_particle_cannon",
|
|
"used_peregrine_sparrow",
|
|
"used_105mm_cannon",
|
|
"used_15mm_chaingun",
|
|
"used_pulsed_particle_accelerator",
|
|
"used_rotarychaingun",
|
|
"visited_deconstruction_terminal",
|
|
"used_skyguard_weapons",
|
|
"visited_generator",
|
|
"used_gauss_cannon",
|
|
"used_trek",
|
|
"used_vanguard_weapons",
|
|
"visited_ancient_air_vehicle_terminal",
|
|
"visited_ancient_equipment_terminal",
|
|
"visited_order_terminal",
|
|
"visited_ancient_ground_vehicle_terminal",
|
|
"visited_ground_vehicle_terminal",
|
|
"used_vulture_bombardier",
|
|
"used_vulture_nose_cannon",
|
|
"used_vulture_tail_cannon",
|
|
"used_wasp_weapon_system",
|
|
"visited_charlie01",
|
|
"visited_charlie02",
|
|
"visited_charlie03",
|
|
"visited_charlie04",
|
|
"visited_charlie05",
|
|
"visited_charlie06",
|
|
"visited_charlie07",
|
|
"visited_charlie08",
|
|
"visited_charlie09",
|
|
"visited_gingerman_atar",
|
|
"visited_gingerman_dahaka",
|
|
"visited_gingerman_hvar",
|
|
"visited_gingerman_izha",
|
|
"visited_gingerman_jamshid",
|
|
"visited_gingerman_mithra",
|
|
"visited_gingerman_rashnu",
|
|
"visited_gingerman_sraosha",
|
|
"visited_gingerman_yazata",
|
|
"visited_gingerman_zal",
|
|
"visited_sled01",
|
|
"visited_sled02",
|
|
"visited_sled04",
|
|
"visited_sled05",
|
|
"visited_sled06",
|
|
"visited_sled07",
|
|
"visited_sled08",
|
|
"visited_snowman_amerish",
|
|
"visited_snowman_ceryshen",
|
|
"visited_snowman_cyssor",
|
|
"visited_snowman_esamir",
|
|
"visited_snowman_forseral",
|
|
"visited_snowman_hossin",
|
|
"visited_snowman_ishundar",
|
|
"visited_snowman_searhus",
|
|
"visited_snowman_solsar",
|
|
"ugd06",
|
|
"ugd05",
|
|
"ugd04",
|
|
"ugd03",
|
|
"ugd02",
|
|
"ugd01",
|
|
"map99",
|
|
"map98",
|
|
"map97",
|
|
"map96",
|
|
"map15",
|
|
"map14",
|
|
"map11",
|
|
"map08",
|
|
"map04",
|
|
"map05",
|
|
"map03",
|
|
"map01",
|
|
"map06",
|
|
"map02",
|
|
"map09",
|
|
"map07",
|
|
"map10"
|
|
),
|
|
List(
|
|
"training_start_nc",
|
|
"training_ui",
|
|
"training_map"
|
|
),
|
|
0L, 0L, 0L, 0L, 0L,
|
|
None,
|
|
Nil, Nil, false,
|
|
Some(Cosmetics(true, true, true, true, false))
|
|
)
|
|
val char : Option[Int]=>DetailedCharacterData =
|
|
(pad_length : Option[Int]) => DetailedCharacterData(ba, bb(ba.bep, pad_length))(pad_length)
|
|
|
|
val inv = InventoryData(
|
|
List(
|
|
InternalSlot(531, PlanetSideGUID(4202), 0,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NC, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(389, PlanetSideGUID(3942), 0,DetailedAmmoBoxData(8, 100))))
|
|
),
|
|
InternalSlot(132, PlanetSideGUID(6924), 1,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NC, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(111, PlanetSideGUID(9157), 0, DetailedAmmoBoxData(8, 100))))
|
|
),
|
|
InternalSlot(714, PlanetSideGUID(8498), 2,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NC, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(755, PlanetSideGUID(5356), 0, DetailedAmmoBoxData(8, 16))))
|
|
),
|
|
InternalSlot(468, PlanetSideGUID(7198), 4,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NC, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(5009), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(456, PlanetSideGUID(5374), 5,
|
|
DetailedLockerContainerData(
|
|
CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)),
|
|
Some(InventoryData(List(
|
|
InternalSlot(429, PlanetSideGUID(3021), 0,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(272, PlanetSideGUID(8729), 0, DetailedAmmoBoxData(8, 0))))
|
|
),
|
|
InternalSlot(838, PlanetSideGUID(8467), 9,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(839, PlanetSideGUID(8603), 0, DetailedAmmoBoxData(8, 5))))
|
|
),
|
|
InternalSlot(272, PlanetSideGUID(3266), 18, DetailedAmmoBoxData(8, 27)),
|
|
InternalSlot(577, PlanetSideGUID(2934), 22,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(111, PlanetSideGUID(4682), 0, DetailedAmmoBoxData(8, 100))))
|
|
),
|
|
InternalSlot(839, PlanetSideGUID(3271), 90, DetailedAmmoBoxData(8, 15)),
|
|
InternalSlot(839, PlanetSideGUID(7174), 94, DetailedAmmoBoxData(8, 6)),
|
|
InternalSlot(429, PlanetSideGUID(6084), 98,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(272, PlanetSideGUID(5928), 0, DetailedAmmoBoxData(8, 35))))
|
|
),
|
|
InternalSlot(462, PlanetSideGUID(5000), 108,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(463, PlanetSideGUID(6277), 0, DetailedAmmoBoxData(8, 150))))
|
|
),
|
|
InternalSlot(429, PlanetSideGUID(4341), 189,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(272, PlanetSideGUID(7043), 0, DetailedAmmoBoxData(8, 35))))
|
|
),
|
|
InternalSlot(556, PlanetSideGUID(4168), 198,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(28, PlanetSideGUID(8937), 0, DetailedAmmoBoxData(8, 100))))
|
|
),
|
|
InternalSlot(272, PlanetSideGUID(3173), 207, DetailedAmmoBoxData(8, 50)),
|
|
InternalSlot(462, PlanetSideGUID(3221), 210,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(463, PlanetSideGUID(4031), 0, DetailedAmmoBoxData(8, 150))))
|
|
),
|
|
InternalSlot(556, PlanetSideGUID(6853), 280,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(29, PlanetSideGUID(8524), 0, DetailedAmmoBoxData(8, 67))))
|
|
),
|
|
InternalSlot(556, PlanetSideGUID(4569), 290,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(28, PlanetSideGUID(5584), 0, DetailedAmmoBoxData(8, 100))))
|
|
),
|
|
InternalSlot(462, PlanetSideGUID(9294), 300,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(463, PlanetSideGUID(3118), 0, DetailedAmmoBoxData(8, 150))))
|
|
),
|
|
InternalSlot(272, PlanetSideGUID(4759), 387, DetailedAmmoBoxData(8, 50)),
|
|
InternalSlot(462, PlanetSideGUID(7377), 390,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(463, PlanetSideGUID(8155), 0, DetailedAmmoBoxData(8, 150))))
|
|
),
|
|
InternalSlot(843, PlanetSideGUID(6709), 480, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(843, PlanetSideGUID(5276), 484, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(843, PlanetSideGUID(7769), 488, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(844, PlanetSideGUID(5334), 492, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(844, PlanetSideGUID(6219), 496, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(842, PlanetSideGUID(7279), 500, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(842, PlanetSideGUID(5415), 504, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(175, PlanetSideGUID(5741), 540,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(5183), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(324, PlanetSideGUID(6208), 541,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(5029), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(324, PlanetSideGUID(8589), 542,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(9217), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(175, PlanetSideGUID(8901), 543,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(7633), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(175, PlanetSideGUID(8419), 544,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(6546), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(175, PlanetSideGUID(4715), 545,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(8453), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(324, PlanetSideGUID(3577), 546,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(9202), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(324, PlanetSideGUID(6003), 547,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(3260), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(324, PlanetSideGUID(9140), 548,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540,PlanetSideGUID(3815),0,DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(324, PlanetSideGUID(4913), 549,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540,PlanetSideGUID(7222),0,DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(324, PlanetSideGUID(6954), 550,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540,PlanetSideGUID(2953),0,DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(324, PlanetSideGUID(6405), 551,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540,PlanetSideGUID(4676),0,DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(324, PlanetSideGUID(8915), 552,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540,PlanetSideGUID(4018),0,DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(324, PlanetSideGUID(4993), 553,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540,PlanetSideGUID(6775),0,DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(175, PlanetSideGUID(5053), 554,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540,PlanetSideGUID(6418),0,DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(324, PlanetSideGUID(9244), 555,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540,PlanetSideGUID(3327),0,DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(468, PlanetSideGUID(6292), 556,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540,PlanetSideGUID(6918),0,DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(842, PlanetSideGUID(5357), 558, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(844, PlanetSideGUID(4435), 562, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(843, PlanetSideGUID(7242), 566, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(175, PlanetSideGUID(7330), 570,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(4786), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(468, PlanetSideGUID(7415), 571,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(6536), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(175, PlanetSideGUID(3949), 572,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(7526), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(175, PlanetSideGUID(3805), 573,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(7358), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(324, PlanetSideGUID(4493), 574,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(6852), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(324, PlanetSideGUID(5762), 575,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(3463), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(175, PlanetSideGUID(3315), 576,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(7619), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(324, PlanetSideGUID(6263), 577,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(5912), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(468, PlanetSideGUID(4028), 578,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(8021), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(175, PlanetSideGUID(2843), 579,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(7250), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(175, PlanetSideGUID(9143), 580,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(5195), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(468, PlanetSideGUID(5024), 581,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(4287), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(468, PlanetSideGUID(6582), 582,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(4915), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(468, PlanetSideGUID(6425), 583,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(8872), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(468, PlanetSideGUID(4431), 584,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(4191), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(175, PlanetSideGUID(8339), 585,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(7317), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(175, PlanetSideGUID(3277), 586,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(6469), 0, DetailedAmmoBoxData(8, 1))))
|
|
)
|
|
)
|
|
)))
|
|
),
|
|
InternalSlot(213, PlanetSideGUID(6877), 6, DetailedCommandDetonaterData(CommonFieldData(PlanetSideEmpire.NC, false, false, true, None, false, None, None, PlanetSideGUID(0)))),
|
|
InternalSlot(755, PlanetSideGUID(6227), 9, DetailedAmmoBoxData(8, 16)),
|
|
InternalSlot(728, PlanetSideGUID(7181), 12, DetailedREKData(CommonFieldData(PlanetSideEmpire.NC, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)), 16)),
|
|
InternalSlot(536, PlanetSideGUID(4077), 33, DetailedAmmoBoxData(8, 1)),
|
|
InternalSlot(680, PlanetSideGUID(4377), 37,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NC, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(681, PlanetSideGUID(8905), 0, DetailedAmmoBoxData(8, 3))))
|
|
),
|
|
InternalSlot(32, PlanetSideGUID(5523), 39, DetailedConstructionToolData(
|
|
CommonFieldData(PlanetSideEmpire.NC, false, false, true, None, false, None, None, PlanetSideGUID(0))
|
|
)),
|
|
InternalSlot(673, PlanetSideGUID(3661), 60,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NC, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(674, PlanetSideGUID(8542), 0, DetailedAmmoBoxData(8, 3))))
|
|
)
|
|
)
|
|
)
|
|
val obj = DetailedPlayerData(pos, app, char, inv, DrawnSlot.None)
|
|
|
|
val msg = ObjectCreateDetailedMessage(ObjectClass.avatar, PlanetSideGUID(75), obj)
|
|
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
|
pkt mustEqual string_br32
|
|
}
|
|
|
|
"encode (ccrider)" in {
|
|
val pos : PlacementData = PlacementData(
|
|
Vector3(2931.5f, 4404.6953f, 45.0625f),
|
|
Vector3.z(36.5625f),
|
|
None
|
|
)
|
|
val aa : Int=>CharacterAppearanceA = CharacterAppearanceA(
|
|
BasicCharacterData(
|
|
"CCRIDER",
|
|
PlanetSideEmpire.NC,
|
|
CharacterGender.Male,
|
|
20,
|
|
CharacterVoice.Voice3
|
|
),
|
|
CommonFieldData(
|
|
PlanetSideEmpire.NC,
|
|
false,
|
|
false,
|
|
false,
|
|
None,
|
|
false,
|
|
None,
|
|
None,
|
|
PlanetSideGUID(0)
|
|
),
|
|
ExoSuitType.Standard,
|
|
0,
|
|
1176612L,
|
|
15,
|
|
5,
|
|
10,
|
|
1
|
|
)
|
|
val ab : (Boolean, Int)=>CharacterAppearanceB = CharacterAppearanceB(
|
|
25044L,
|
|
"Black Armored Reapers",
|
|
15,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
0, 0,
|
|
false,
|
|
GrenadeState.None,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
None
|
|
)
|
|
|
|
val app : Int=>CharacterAppearanceData = CharacterAppearanceData(
|
|
aa, ab,
|
|
RibbonBars(
|
|
MeritCommendation.DefenseNC5,
|
|
MeritCommendation.HackingSupport5,
|
|
MeritCommendation.BFRAdvanced2,
|
|
MeritCommendation.SixYearNC
|
|
)
|
|
)
|
|
val ba : DetailedCharacterA = DetailedCharacterA(
|
|
6571522L,
|
|
659329L,
|
|
0L, 0L, 0L,
|
|
100, 100,
|
|
false,
|
|
50,
|
|
32831,
|
|
100, 100,
|
|
None,
|
|
0,
|
|
6,
|
|
3165669,
|
|
List(0, 0, 0, 0, 0, 0),
|
|
List(
|
|
CertificationType.StandardAssault,
|
|
CertificationType.MediumAssault,
|
|
CertificationType.HeavyAssault,
|
|
CertificationType.AirCavalryScout,
|
|
CertificationType.StandardExoSuit,
|
|
CertificationType.AgileExoSuit,
|
|
CertificationType.UniMAX,
|
|
CertificationType.Medical,
|
|
CertificationType.AdvancedMedical,
|
|
CertificationType.Hacking,
|
|
CertificationType.AdvancedHacking,
|
|
CertificationType.ExpertHacking,
|
|
CertificationType.Engineering
|
|
)
|
|
)
|
|
val bb : (Long, Option[Int])=>DetailedCharacterB = DetailedCharacterB(
|
|
Some(14140),
|
|
List(
|
|
ImplantEntry(ImplantType.Surge, Some(94), false),
|
|
ImplantEntry(ImplantType.DarklightVision, Some(91), false),
|
|
ImplantEntry(ImplantType.Targeting, Some(91), false)
|
|
),
|
|
List(), List(),
|
|
List(
|
|
"xpe_blackops",
|
|
"xpe_battle_rank_9",
|
|
"xpe_battle_rank_23",
|
|
"xpe_command_rank_1",
|
|
"xpe_form_outfit",
|
|
"xpe_mail_alert",
|
|
"xpe_battle_rank_22",
|
|
"xpe_command_rank_3",
|
|
"xpe_form_platoon",
|
|
"xpe_battle_rank_13",
|
|
"xpe_battle_rank_12",
|
|
"xpe_battle_rank_10",
|
|
"xpe_battle_rank_14",
|
|
"xpe_battle_rank_15",
|
|
"xpe_battle_rank_8",
|
|
"xpe_battle_rank_11",
|
|
"xpe_battle_rank_21",
|
|
"xpe_battle_rank_20",
|
|
"xpe_battle_rank_18",
|
|
"xpe_battle_rank_19",
|
|
"xpe_join_platoon",
|
|
"xpe_battle_rank_17",
|
|
"xpe_battle_rank_16",
|
|
"xpe_join_outfit",
|
|
"xpe_battle_rank_25",
|
|
"xpe_battle_rank_24",
|
|
"xpe_battle_rank_7",
|
|
"xpe_bind_facility",
|
|
"xpe_bind_ams",
|
|
"xpe_command_rank_5",
|
|
"xpe_command_rank_2",
|
|
"xpe_instant_action",
|
|
"xpe_form_squad",
|
|
"xpe_battle_rank_4",
|
|
"xpe_warp_gate_usage",
|
|
"xpe_battle_rank_2",
|
|
"xpe_battle_rank_3",
|
|
"xpe_sanctuary_help",
|
|
"xpe_drop_pod",
|
|
"xpe_orbital_shuttle",
|
|
"xpe_battle_rank_6",
|
|
"xpe_join_squad",
|
|
"xpe_battle_rank_5",
|
|
"xpe_th_switchblade",
|
|
"xpe_th_router",
|
|
"xpe_th_flail",
|
|
"xpe_th_ant",
|
|
"xpe_th_ams",
|
|
"xpe_th_bfr",
|
|
"used_oicw",
|
|
"used_advanced_ace",
|
|
"visited_spitfire_turret",
|
|
"visited_spitfire_cloaked",
|
|
"visited_spitfire_aa",
|
|
"visited_tank_traps",
|
|
"visited_portable_manned_turret_nc",
|
|
"used_magcutter",
|
|
"visited_wall_turret",
|
|
"visited_ams",
|
|
"visited_ant",
|
|
"visited_dropship",
|
|
"visited_liberator",
|
|
"visited_lightgunship",
|
|
"visited_lightning",
|
|
"visited_magrider",
|
|
"visited_prowler",
|
|
"visited_quadstealth",
|
|
"visited_skyguard",
|
|
"visited_threemanheavybuggy",
|
|
"visited_two_man_assault_buggy",
|
|
"visited_twomanheavybuggy",
|
|
"visited_twomanhoverbuggy",
|
|
"visited_vanguard",
|
|
"visited_flail",
|
|
"visited_router",
|
|
"visited_switchblade",
|
|
"visited_aurora",
|
|
"visited_battlewagon",
|
|
"visited_fury",
|
|
"visited_quadassault",
|
|
"visited_galaxy_gunship",
|
|
"visited_apc_tr",
|
|
"visited_apc_vs",
|
|
"visited_lodestar",
|
|
"visited_phantasm",
|
|
"visited_thunderer",
|
|
"visited_apc_nc",
|
|
"visited_vulture",
|
|
"visited_wasp",
|
|
"visited_mosquito",
|
|
"visited_aphelion_flight",
|
|
"visited_aphelion_gunner",
|
|
"visited_colossus_flight",
|
|
"visited_colossus_gunner",
|
|
"visited_peregrine_flight",
|
|
"visited_peregrine_gunner",
|
|
"used_bank",
|
|
"visited_resource_silo",
|
|
"visited_certification_terminal",
|
|
"visited_med_terminal",
|
|
"used_nano_dispenser",
|
|
"visited_sensor_shield",
|
|
"visited_broadcast_warpgate",
|
|
"used_phalanx",
|
|
"used_phalanx_avcombo",
|
|
"used_phalanx_flakcombo",
|
|
"visited_warpgate_small",
|
|
"used_flamethrower",
|
|
"used_ancient_turret_weapon",
|
|
"visited_LLU_socket",
|
|
"used_energy_gun_nc",
|
|
"visited_mediumtransport",
|
|
"used_aphelion_immolation_cannon",
|
|
"used_grenade_plasma",
|
|
"used_grenade_jammer",
|
|
"visited_shield_generator",
|
|
"visited_motion_sensor",
|
|
"visited_health_crystal",
|
|
"visited_repair_crystal",
|
|
"visited_vehicle_crystal",
|
|
"used_grenade_frag",
|
|
"used_ace",
|
|
"visited_adv_med_terminal",
|
|
"used_beamer",
|
|
"used_bolt_driver",
|
|
"used_cycler",
|
|
"used_gauss",
|
|
"used_hunterseeker",
|
|
"used_isp",
|
|
"used_lancer",
|
|
"used_lasher",
|
|
"used_maelstrom",
|
|
"used_phoenix",
|
|
"used_pulsar",
|
|
"used_punisher",
|
|
"used_r_shotgun",
|
|
"used_radiator",
|
|
"used_rek",
|
|
"used_repeater",
|
|
"used_rocklet",
|
|
"used_striker",
|
|
"used_suppressor",
|
|
"used_thumper",
|
|
"visited_vanu_control_console",
|
|
"visited_capture_terminal",
|
|
"used_mini_chaingun",
|
|
"used_laze_pointer",
|
|
"used_telepad",
|
|
"used_spiker",
|
|
"used_heavy_sniper",
|
|
"used_command_uplink",
|
|
"used_firebird",
|
|
"used_flechette",
|
|
"used_heavy_rail_beam",
|
|
"used_ilc9",
|
|
"visited_generator_terminal",
|
|
"visited_locker",
|
|
"visited_external_door_lock",
|
|
"visited_air_vehicle_terminal",
|
|
"visited_galaxy_terminal",
|
|
"visited_implant_terminal",
|
|
"visited_secondary_capture",
|
|
"used_25mm_cannon",
|
|
"used_liberator_bombardier",
|
|
"visited_repair_silo",
|
|
"visited_vanu_module",
|
|
"used_flail_weapon",
|
|
"used_scythe",
|
|
"visited_respawn_terminal",
|
|
"used_ballgun",
|
|
"used_anniversary_guna",
|
|
"used_anniversary_gunb",
|
|
"used_anniversary_gun",
|
|
"used_75mm_cannon",
|
|
"used_apc_nc_weapon",
|
|
"used_apc_tr_weapon",
|
|
"used_apc_vs_weapon",
|
|
"used_flux_cannon",
|
|
"used_aphelion_laser",
|
|
"used_aphelion_plasma_rocket_pod",
|
|
"used_aphelion_ppa",
|
|
"used_aphelion_starfire",
|
|
"used_fluxpod",
|
|
"visited_bfr_terminal",
|
|
"used_colossus_burster",
|
|
"used_colossus_chaingun",
|
|
"used_colossus_cluster_bomb_pod",
|
|
"used_colossus_dual_100mm_cannons",
|
|
"used_colossus_tank_cannon",
|
|
"visited_damage_crystal",
|
|
"visited_energy_crystal",
|
|
"used_heavy_grenade_launcher",
|
|
"used_35mm_rotarychaingun",
|
|
"used_katana",
|
|
"used_35mm_cannon",
|
|
"used_reaver_weapons",
|
|
"used_lightning_weapons",
|
|
"used_med_app",
|
|
"used_20mm_cannon",
|
|
"visited_monolith_amerish",
|
|
"visited_monolith_ceryshen",
|
|
"visited_monolith_cyssor",
|
|
"visited_monolith_esamir",
|
|
"visited_monolith_forseral",
|
|
"visited_monolith_hossin",
|
|
"visited_monolith_ishundar",
|
|
"visited_monolith_searhus",
|
|
"visited_monolith_solsar",
|
|
"used_nc_hev_falcon",
|
|
"used_nc_hev_scattercannon",
|
|
"used_nc_hev_sparrow",
|
|
"used_armor_siphon",
|
|
"used_peregrine_dual_machine_gun",
|
|
"used_peregrine_dual_rocket_pods",
|
|
"used_peregrine_mechhammer",
|
|
"used_ntu_siphon",
|
|
"used_peregrine_particle_cannon",
|
|
"used_peregrine_sparrow",
|
|
"used_105mm_cannon",
|
|
"used_15mm_chaingun",
|
|
"used_pulsed_particle_accelerator",
|
|
"used_rotarychaingun",
|
|
"visited_deconstruction_terminal",
|
|
"used_skyguard_weapons",
|
|
"visited_generator",
|
|
"used_gauss_cannon",
|
|
"used_trek",
|
|
"used_vanguard_weapons",
|
|
"visited_ancient_air_vehicle_terminal",
|
|
"visited_ancient_equipment_terminal",
|
|
"visited_order_terminal",
|
|
"visited_ancient_ground_vehicle_terminal",
|
|
"visited_ground_vehicle_terminal",
|
|
"used_vulture_bombardier",
|
|
"used_vulture_nose_cannon",
|
|
"used_vulture_tail_cannon",
|
|
"used_wasp_weapon_system",
|
|
"visited_charlie05",
|
|
"visited_charlie06",
|
|
"visited_charlie07",
|
|
"visited_charlie08",
|
|
"visited_charlie09",
|
|
"visited_sled04",
|
|
"visited_sled05",
|
|
"visited_sled06",
|
|
"visited_sled07",
|
|
"visited_sled08",
|
|
"ugd06",
|
|
"ugd05",
|
|
"ugd04",
|
|
"ugd03",
|
|
"ugd02",
|
|
"ugd01",
|
|
"map99",
|
|
"map98",
|
|
"map97",
|
|
"map96",
|
|
"map15",
|
|
"map14",
|
|
"map13",
|
|
"map12",
|
|
"map11",
|
|
"map04",
|
|
"map05",
|
|
"map03",
|
|
"map01",
|
|
"map06",
|
|
"map02",
|
|
"map09",
|
|
"map07",
|
|
"map10"
|
|
),
|
|
List(
|
|
"training_weapons01",
|
|
"training_warpgates",
|
|
"training_map",
|
|
"training_inventory",
|
|
"training_healing",
|
|
"training_hart",
|
|
"training_armors",
|
|
"training_welcome"
|
|
),
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
None,
|
|
List(
|
|
9,
|
|
10, 11, 16, 17, 18, 30, 31, 32,
|
|
37, 38, 52, 53, 57, 69, 92, 99,
|
|
100, 107, 108, 109, 110, 114, 115, 116, 117, 118,
|
|
127, 128, 129, 130, 131, 156, 163, 171, 178, 179,
|
|
180, 181, 194, 195, 198, 201, 215, 216, 217, 222,
|
|
223, 224, 225, 226, 227, 229, 230, 243, 244, 257,
|
|
265, 266, 277, 278, 283, 284, 285, 286, 289, 290,
|
|
296, 313, 334, 341, 342, 359, 369, 376, 377, 384,
|
|
391, 392, 393, 394, 398, 408, 415, 420, 424
|
|
),
|
|
List(),
|
|
false,
|
|
Some(Cosmetics(true, false, true, true, true))
|
|
)
|
|
val char : Option[Int]=>DetailedCharacterData =
|
|
(pad_length : Option[Int]) => DetailedCharacterData(ba, bb(ba.bep, pad_length))(pad_length)
|
|
|
|
val inv : InventoryData = InventoryData(List(
|
|
InternalSlot(411, PlanetSideGUID(10022), 0,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NC, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(755, PlanetSideGUID(10023), 0, DetailedAmmoBoxData(8, 8))))
|
|
),
|
|
InternalSlot(845, PlanetSideGUID(5671), 2,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NC, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(28, PlanetSideGUID(10019), 0, DetailedAmmoBoxData(8, 25))))
|
|
),
|
|
InternalSlot(468, PlanetSideGUID(3754), 4,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NC, false, false, true, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(540, PlanetSideGUID(6693), 0, DetailedAmmoBoxData(8, 1))))
|
|
),
|
|
InternalSlot(456, PlanetSideGUID(8199), 5,
|
|
DetailedLockerContainerData(
|
|
CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)),
|
|
Some(InventoryData(List(
|
|
InternalSlot(233, PlanetSideGUID(6315), 0,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(28, PlanetSideGUID(6795), 0, DetailedAmmoBoxData(0, 50))))
|
|
),
|
|
InternalSlot(233, PlanetSideGUID(4302), 6,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(28, PlanetSideGUID(5511), 0, DetailedAmmoBoxData(0, 50))))
|
|
),
|
|
InternalSlot(233, PlanetSideGUID(6342), 12,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(28, PlanetSideGUID(7788), 0, DetailedAmmoBoxData(0, 50))))
|
|
),
|
|
InternalSlot(233, PlanetSideGUID(7392), 18,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(28, PlanetSideGUID(8335), 0, DetailedAmmoBoxData(0, 50))))
|
|
),
|
|
InternalSlot(233, PlanetSideGUID(4432), 24,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(28, PlanetSideGUID(7020), 0, DetailedAmmoBoxData(0,50))))
|
|
),
|
|
InternalSlot(716, PlanetSideGUID(4219), 90,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(50, PlanetSideGUID(9275), 0, DetailedAmmoBoxData(0, 25))))
|
|
),
|
|
InternalSlot(716, PlanetSideGUID(3869), 96,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(50, PlanetSideGUID(6099), 0, DetailedAmmoBoxData(0, 25))))
|
|
),
|
|
InternalSlot(716, PlanetSideGUID(8954), 102,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(50, PlanetSideGUID(5972), 0, DetailedAmmoBoxData(0, 25))))
|
|
),
|
|
InternalSlot(233, PlanetSideGUID(7476), 108,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(28, PlanetSideGUID(5704), 0, DetailedAmmoBoxData(0, 50))))
|
|
),
|
|
InternalSlot(272, PlanetSideGUID(8800), 114, DetailedAmmoBoxData(0, 50)),
|
|
InternalSlot(272, PlanetSideGUID(8649), 177, DetailedAmmoBoxData(0, 50)),
|
|
InternalSlot(716, PlanetSideGUID(7580), 180,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(50, PlanetSideGUID(6734), 0, DetailedAmmoBoxData(0, 25))))
|
|
),
|
|
InternalSlot(716, PlanetSideGUID(6464), 186,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(50, PlanetSideGUID(4738), 0, DetailedAmmoBoxData(0, 25))))
|
|
),
|
|
InternalSlot(716, PlanetSideGUID(5408), 192,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(50, PlanetSideGUID(3579), 0, DetailedAmmoBoxData(0, 25))))
|
|
),
|
|
InternalSlot(556, PlanetSideGUID(8957), 198,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(28, PlanetSideGUID(8223), 0, DetailedAmmoBoxData(0, 100))))
|
|
),
|
|
InternalSlot(272, PlanetSideGUID(3928), 267, DetailedAmmoBoxData(0, 50)),
|
|
InternalSlot(577, PlanetSideGUID(3403), 279,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(111, PlanetSideGUID(4352), 0, DetailedAmmoBoxData(0, 100))))
|
|
),
|
|
InternalSlot(577, PlanetSideGUID(8454), 285,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(111, PlanetSideGUID(8724), 0, DetailedAmmoBoxData(0,100))))
|
|
),
|
|
InternalSlot(272, PlanetSideGUID(3397), 357, DetailedAmmoBoxData(0, 50)),
|
|
InternalSlot(429, PlanetSideGUID(6695), 378,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(272, PlanetSideGUID(6842), 0, DetailedAmmoBoxData(0, 35))))
|
|
),
|
|
InternalSlot(462, PlanetSideGUID(8304), 420,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(463, PlanetSideGUID(7089), 0, DetailedAmmoBoxData(0, 150))))
|
|
),
|
|
InternalSlot(462, PlanetSideGUID(3346), 429,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(463, PlanetSideGUID(7557), 0, DetailedAmmoBoxData(0, 150))))
|
|
),
|
|
InternalSlot(272, PlanetSideGUID(7515), 447, DetailedAmmoBoxData(0, 50)),
|
|
InternalSlot(462, PlanetSideGUID(4622), 510,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(463, PlanetSideGUID(6996), 0, DetailedAmmoBoxData(0, 150))))
|
|
),
|
|
InternalSlot(462, PlanetSideGUID(6586), 519,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(463, PlanetSideGUID(6870), 0, DetailedAmmoBoxData(0, 150))))
|
|
),
|
|
InternalSlot(556, PlanetSideGUID(4806), 528,
|
|
DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(28, PlanetSideGUID(8798), 0, DetailedAmmoBoxData(0, 100))))
|
|
),
|
|
InternalSlot(272, PlanetSideGUID(8429), 537, DetailedAmmoBoxData(0, 50))
|
|
))
|
|
))
|
|
),
|
|
InternalSlot(28, PlanetSideGUID(10018), 6, DetailedAmmoBoxData(8, 50)),
|
|
InternalSlot(28, PlanetSideGUID(5612), 9, DetailedAmmoBoxData(8, 50)),
|
|
InternalSlot(28, PlanetSideGUID(5128), 12, DetailedAmmoBoxData(8, 50)),
|
|
InternalSlot(29, PlanetSideGUID(8363), 33, DetailedAmmoBoxData(8, 50)),
|
|
InternalSlot(755, PlanetSideGUID(4090), 36, DetailedAmmoBoxData(8, 16)),
|
|
InternalSlot(728, PlanetSideGUID(10075), 39, DetailedREKData(CommonFieldData(PlanetSideEmpire.NC, false, false, true, None, false, Some(false), None, PlanetSideGUID(0)), 24))
|
|
))
|
|
val obj = DetailedPlayerData.apply(pos, app, char, inv, DrawnSlot.None)
|
|
|
|
val msg = ObjectCreateDetailedMessage(0x79, PlanetSideGUID(75), obj)
|
|
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
|
pkt mustEqual string_ccrider
|
|
}
|
|
|
|
"encode (xRider912)" in {
|
|
val pos : PlacementData = PlacementData(
|
|
Vector3(3577.1797f, 2712.25f, 35.78125f),
|
|
Vector3.z(50.625f),
|
|
None
|
|
)
|
|
val aa : Int=>CharacterAppearanceA = CharacterAppearanceA(
|
|
BasicCharacterData(
|
|
"xRider912",
|
|
PlanetSideEmpire.TR,
|
|
CharacterGender.Male,
|
|
4,
|
|
CharacterVoice.Voice1
|
|
),
|
|
CommonFieldData(
|
|
PlanetSideEmpire.TR,
|
|
false,
|
|
false,
|
|
false,
|
|
None,
|
|
false,
|
|
None,
|
|
None,
|
|
PlanetSideGUID(0)
|
|
),
|
|
ExoSuitType.Standard,
|
|
0,
|
|
1267466L,
|
|
3,
|
|
3,
|
|
0,
|
|
0
|
|
)
|
|
|
|
val ab : (Boolean, Int)=>CharacterAppearanceB = CharacterAppearanceB(
|
|
16507L,
|
|
"Hooked On Insanity",
|
|
5,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
0, 0,
|
|
false,
|
|
GrenadeState.None,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
None
|
|
)
|
|
|
|
val app : Int=>CharacterAppearanceData = CharacterAppearanceData(
|
|
aa, ab,
|
|
RibbonBars(
|
|
MeritCommendation.EmeraldVeteran,
|
|
MeritCommendation.ScavengerTR1,
|
|
MeritCommendation.BlackOpsParticipant,
|
|
MeritCommendation.SixYearTR
|
|
)
|
|
)
|
|
|
|
val ba : DetailedCharacterA = DetailedCharacterA(
|
|
1784200L,
|
|
53490L,
|
|
0L, 0L, 0L,
|
|
100, 100,
|
|
false,
|
|
50,
|
|
32831,
|
|
100, 100,
|
|
None,
|
|
0,
|
|
6,
|
|
1184175,
|
|
List(0, 0, 0, 0, 0, 0),
|
|
List(
|
|
CertificationType.StandardAssault,
|
|
CertificationType.MediumAssault,
|
|
CertificationType.HeavyAssault,
|
|
CertificationType.AntiVehicular,
|
|
CertificationType.AirCavalryScout,
|
|
CertificationType.StandardExoSuit,
|
|
CertificationType.AgileExoSuit,
|
|
CertificationType.Medical,
|
|
CertificationType.AdvancedMedical,
|
|
CertificationType.Hacking,
|
|
CertificationType.AdvancedHacking,
|
|
CertificationType.Engineering
|
|
)
|
|
)
|
|
val bb : (Long, Option[Int])=>DetailedCharacterB = DetailedCharacterB(
|
|
Some(21236),
|
|
List(
|
|
ImplantEntry(ImplantType.Surge, Some(94), false),
|
|
ImplantEntry(ImplantType.Targeting, Some(91), false),
|
|
ImplantEntry(ImplantType.DarklightVision, Some(91), false)
|
|
),
|
|
List(), List(),
|
|
List(
|
|
"xpe_command_rank_2",
|
|
"xpe_join_platoon",
|
|
"xpe_battle_rank_20",
|
|
"xpe_battle_rank_21",
|
|
"xpe_battle_rank_22",
|
|
"xpe_form_outfit",
|
|
"xpe_blackops",
|
|
"xpe_battle_rank_13",
|
|
"xpe_battle_rank_12",
|
|
"xpe_battle_rank_10",
|
|
"xpe_battle_rank_14",
|
|
"xpe_battle_rank_15",
|
|
"xpe_battle_rank_5",
|
|
"xpe_join_squad",
|
|
"xpe_form_squad",
|
|
"xpe_instant_action",
|
|
"xpe_battle_rank_8",
|
|
"xpe_battle_rank_11",
|
|
"xpe_battle_rank_6",
|
|
"xpe_battle_rank_18",
|
|
"xpe_battle_rank_19",
|
|
"xpe_battle_rank_17",
|
|
"xpe_battle_rank_16",
|
|
"xpe_join_outfit",
|
|
"xpe_battle_rank_9",
|
|
"xpe_battle_rank_7",
|
|
"xpe_command_rank_1",
|
|
"xpe_orbital_shuttle",
|
|
"xpe_drop_pod",
|
|
"xpe_sanctuary_help",
|
|
"xpe_bind_facility",
|
|
"xpe_battle_rank_3",
|
|
"xpe_battle_rank_2",
|
|
"xpe_warp_gate_usage",
|
|
"xpe_bind_ams",
|
|
"xpe_battle_rank_4",
|
|
"xpe_th_nonsanc",
|
|
"xpe_th_router",
|
|
"xpe_th_flail",
|
|
"xpe_th_ant",
|
|
"xpe_th_ams",
|
|
"xpe_th_ground_p",
|
|
"xpe_th_air_p",
|
|
"xpe_th_hover",
|
|
"xpe_th_ground",
|
|
"xpe_th_bfr",
|
|
"xpe_th_afterburner",
|
|
"xpe_th_air",
|
|
"xpe_th_ammo",
|
|
"xpe_th_firemodes",
|
|
"xpe_th_cloak",
|
|
"xpe_th_max",
|
|
"used_oicw",
|
|
"used_advanced_ace",
|
|
"visited_spitfire_turret",
|
|
"visited_spitfire_cloaked",
|
|
"visited_spitfire_aa",
|
|
"visited_tank_traps",
|
|
"visited_portable_manned_turret_tr",
|
|
"used_chainblade",
|
|
"visited_wall_turret",
|
|
"visited_ams",
|
|
"visited_ant",
|
|
"visited_dropship",
|
|
"visited_liberator",
|
|
"visited_lightgunship",
|
|
"visited_lightning",
|
|
"visited_prowler",
|
|
"visited_quadstealth",
|
|
"visited_skyguard",
|
|
"visited_threemanheavybuggy",
|
|
"visited_two_man_assault_buggy",
|
|
"visited_twomanheavybuggy",
|
|
"visited_twomanhoverbuggy",
|
|
"visited_vanguard",
|
|
"visited_flail",
|
|
"visited_router",
|
|
"visited_battlewagon",
|
|
"visited_fury",
|
|
"visited_quadassault",
|
|
"visited_galaxy_gunship",
|
|
"visited_apc_tr",
|
|
"visited_lodestar",
|
|
"visited_phantasm",
|
|
"visited_apc_nc",
|
|
"visited_vulture",
|
|
"visited_wasp",
|
|
"visited_mosquito",
|
|
"visited_colossus_flight",
|
|
"used_bank",
|
|
"visited_resource_silo",
|
|
"visited_certification_terminal",
|
|
"visited_med_terminal",
|
|
"used_nano_dispenser",
|
|
"visited_sensor_shield",
|
|
"visited_broadcast_warpgate",
|
|
"used_phalanx",
|
|
"used_phalanx_flakcombo",
|
|
"visited_warpgate_small",
|
|
"used_flamethrower",
|
|
"used_ancient_turret_weapon",
|
|
"visited_LLU_socket",
|
|
"visited_mediumtransport",
|
|
"used_grenade_plasma",
|
|
"used_grenade_jammer",
|
|
"visited_shield_generator",
|
|
"visited_motion_sensor",
|
|
"visited_vehicle_crystal",
|
|
"used_grenade_frag",
|
|
"used_ace",
|
|
"visited_adv_med_terminal",
|
|
"used_bolt_driver",
|
|
"used_cycler",
|
|
"used_gauss",
|
|
"used_hunterseeker",
|
|
"used_isp",
|
|
"used_lancer",
|
|
"used_lasher",
|
|
"used_maelstrom",
|
|
"used_phoenix",
|
|
"used_pulsar",
|
|
"used_punisher",
|
|
"used_r_shotgun",
|
|
"used_radiator",
|
|
"used_rek",
|
|
"used_repeater",
|
|
"used_rocklet",
|
|
"used_striker",
|
|
"used_suppressor",
|
|
"used_thumper",
|
|
"used_trhev_burster",
|
|
"used_trhev_dualcycler",
|
|
"used_trhev_pounder",
|
|
"visited_vanu_control_console",
|
|
"visited_capture_terminal",
|
|
"used_mini_chaingun",
|
|
"used_laze_pointer",
|
|
"used_telepad",
|
|
"used_spiker",
|
|
"used_heavy_sniper",
|
|
"used_firebird",
|
|
"used_flechette",
|
|
"used_heavy_rail_beam",
|
|
"visited_generator_terminal",
|
|
"visited_locker",
|
|
"visited_external_door_lock",
|
|
"visited_air_vehicle_terminal",
|
|
"visited_galaxy_terminal",
|
|
"visited_implant_terminal",
|
|
"visited_secondary_capture",
|
|
"used_25mm_cannon",
|
|
"used_liberator_bombardier",
|
|
"visited_repair_silo",
|
|
"visited_vanu_module",
|
|
"used_flail_weapon",
|
|
"visited_respawn_terminal",
|
|
"used_energy_gun_tr",
|
|
"used_anniversary_guna",
|
|
"used_anniversary_gunb",
|
|
"used_apc_tr_weapon",
|
|
"used_flux_cannon",
|
|
"visited_bfr_terminal",
|
|
"used_colossus_dual_100mm_cannons",
|
|
"used_colossus_tank_cannon",
|
|
"used_heavy_grenade_launcher",
|
|
"used_35mm_rotarychaingun",
|
|
"used_katana",
|
|
"used_35mm_cannon",
|
|
"used_reaver_weapons",
|
|
"used_lightning_weapons",
|
|
"used_med_app",
|
|
"used_20mm_cannon",
|
|
"visited_monolith_forseral",
|
|
"used_105mm_cannon",
|
|
"used_15mm_chaingun",
|
|
"used_rotarychaingun",
|
|
"visited_deconstruction_terminal",
|
|
"used_skyguard_weapons",
|
|
"visited_generator",
|
|
"used_trek",
|
|
"used_vanguard_weapons",
|
|
"visited_ancient_air_vehicle_terminal",
|
|
"visited_ancient_equipment_terminal",
|
|
"visited_order_terminal",
|
|
"visited_ground_vehicle_terminal",
|
|
"used_vulture_bombardier",
|
|
"used_vulture_nose_cannon",
|
|
"used_vulture_tail_cannon",
|
|
"used_wasp_weapon_system",
|
|
"ugd05",
|
|
"ugd04",
|
|
"ugd03",
|
|
"ugd02",
|
|
"ugd01",
|
|
"map99",
|
|
"map98",
|
|
"map97",
|
|
"map15",
|
|
"map14",
|
|
"map12",
|
|
"map04",
|
|
"map05",
|
|
"map03",
|
|
"map01",
|
|
"map06",
|
|
"map02",
|
|
"map09",
|
|
"map07",
|
|
"map10"
|
|
),
|
|
List(),
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
None,
|
|
List(
|
|
9, 16, 17, 69, 107, 108, 114, 115, 134, 171, 178, 196,
|
|
199, 222, 229, 283, 297, 347, 360, 391, 399, 421
|
|
),
|
|
List(),
|
|
false,
|
|
None
|
|
)
|
|
val char : Option[Int]=>DetailedCharacterData =
|
|
(pad_length : Option[Int]) => DetailedCharacterData(ba, bb(ba.bep, pad_length))(pad_length)
|
|
|
|
val inv : InventoryData = InventoryData(List(
|
|
InternalSlot(730,PlanetSideGUID(3465),0,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.TR,false,false,true,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(28,PlanetSideGUID(3722),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),20))),false)),
|
|
InternalSlot(845,PlanetSideGUID(4929),2,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.TR,false,false,true,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(28,PlanetSideGUID(4736),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),25))),false)),
|
|
InternalSlot(175,PlanetSideGUID(3332),4,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.TR,false,false,true,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(540,PlanetSideGUID(3778),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),1))),false)),
|
|
InternalSlot(456,PlanetSideGUID(5302),5,DetailedLockerContainerData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),Some(InventoryData(List(
|
|
InternalSlot(714,PlanetSideGUID(2628),0,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(5819),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),16))),false)),
|
|
InternalSlot(714,PlanetSideGUID(2433),9,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(3627),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),16))),false)),
|
|
InternalSlot(714,PlanetSideGUID(3916),18,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(3069),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),16))),false)),
|
|
InternalSlot(324,PlanetSideGUID(5514),29,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(540,PlanetSideGUID(4940),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),1))),false)),
|
|
InternalSlot(462,PlanetSideGUID(2669),90,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(463,PlanetSideGUID(2277),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),150))),false)),
|
|
InternalSlot(462,PlanetSideGUID(5365),99,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(463,PlanetSideGUID(5604),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),150))),false)),
|
|
InternalSlot(714,PlanetSideGUID(5884),108,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(5765),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),16))),false)),
|
|
InternalSlot(462,PlanetSideGUID(5137),180,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(463,PlanetSideGUID(3016),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),150))),false)),
|
|
InternalSlot(462,PlanetSideGUID(4475),189,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(463,PlanetSideGUID(4237),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),150))),false)),
|
|
InternalSlot(462,PlanetSideGUID(3841),198,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(463,PlanetSideGUID(5485),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),150))),false)),
|
|
InternalSlot(462,PlanetSideGUID(4075),270,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(463,PlanetSideGUID(4451),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),150))),false)),
|
|
InternalSlot(462,PlanetSideGUID(4620),279,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(463,PlanetSideGUID(2357),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),150))),false)),
|
|
InternalSlot(714,PlanetSideGUID(3175),288,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(5363),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),16))),false)),
|
|
InternalSlot(714,PlanetSideGUID(5391),369,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(2801),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),16))),false)),
|
|
InternalSlot(714,PlanetSideGUID(4384),378,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(3584),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),16))),false)),
|
|
InternalSlot(577,PlanetSideGUID(2294),459,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(111,PlanetSideGUID(5454),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),78))),false)),
|
|
InternalSlot(714,PlanetSideGUID(5111),465,DetailedWeaponData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),0,List(InternalSlot(755,PlanetSideGUID(5068),0,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,false,None,false,None,None,PlanetSideGUID(0)),15))),false))
|
|
))))),
|
|
InternalSlot(28,PlanetSideGUID(4386),6,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),50)),
|
|
InternalSlot(28,PlanetSideGUID(3548),9,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),50)),
|
|
InternalSlot(28,PlanetSideGUID(4103),12,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),50)),
|
|
InternalSlot(28,PlanetSideGUID(5179),33,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),50)),
|
|
InternalSlot(29,PlanetSideGUID(3733),36,DetailedAmmoBoxData(CommonFieldData(PlanetSideEmpire.NEUTRAL,false,false,true,None,false,None,None,PlanetSideGUID(0)),50)),
|
|
InternalSlot(728,PlanetSideGUID(4731),39,DetailedREKData(CommonFieldData(PlanetSideEmpire.TR,false,false,true,None,false,Some(false),None,PlanetSideGUID(0)),16))
|
|
))
|
|
val obj = DetailedPlayerData.apply(pos, app, char, inv, DrawnSlot.None)
|
|
|
|
val msg = ObjectCreateDetailedMessage(0x79, PlanetSideGUID(3390), obj)
|
|
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
|
val pkt_bitv = pkt.toBitVector
|
|
val ori_bitv = string_xrider912.toBitVector
|
|
pkt_bitv.take(140) mustEqual ori_bitv.take(140) //skip 1; this is the highest bit of PlacementData::Orientation::z
|
|
pkt_bitv.drop(141) mustEqual ori_bitv.drop(141)
|
|
//TODO work on DetailedCharacterData to make this pass as a single stream
|
|
}
|
|
}
|
|
}
|