// 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 } } }