mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-31 13:16:39 +00:00
Compare commits
664 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2d7267cb4e | |||
| 3443d8eb25 | |||
| 1c5f0fba4f | |||
| 5b6f9d3bfb | |||
| 595138679d | |||
| 9e03d76211 | |||
| 94aa271a84 | |||
| 57c1cd0be4 | |||
| d331114f71 | |||
| 5b05987e27 | |||
| ed37715993 | |||
| d079feeb66 | |||
| 880285afa6 | |||
| 6faaff31be | |||
| 465071c2cf | |||
| cf6a9d6b2a | |||
| 782c5ebc75 | |||
| ef39395580 | |||
| 86c9b6b079 | |||
| 4a036116dd | |||
| 2bab945c34 | |||
| 26ed80bdda | |||
| a6c1314e3e | |||
| 979e54daa7 | |||
| b87e355db3 | |||
| 88ed2e64bb | |||
| 2010d1ba83 | |||
| 332a3d6c6a | |||
| 214503617e | |||
| 1a1cce859a | |||
| 0786b1158a | |||
| 4d87216ec6 | |||
| 7dbf24b95d | |||
| e7cf687d2b | |||
| 5544fd0ae5 | |||
| 842a40f76d | |||
| 70f55179b6 | |||
| a2e12667b4 | |||
| 213a496efb | |||
| b0336302ee | |||
| 58725b061e | |||
| 90c18c1dc9 | |||
| 97ee8e59a1 | |||
| 50eededd9f | |||
| ee95a2a0c8 | |||
| 254764c1e6 | |||
| 352e70cf28 | |||
| 0558b1bc48 | |||
| 2b38dbf1fb | |||
| bce92c5e02 | |||
| 653824ae9e | |||
| b61f612fbe | |||
| 028dbc4bda | |||
| 49b90eae76 | |||
| 65acefc6b1 | |||
| c985307057 | |||
| b475f66014 | |||
| eae7183de2 | |||
| 1d088a1ac1 | |||
| 7d0b7560bc | |||
| 7e86337b80 | |||
| ac25d49a62 | |||
| 8a911682bf | |||
| a87bf5681f | |||
| b84b98dd7c | |||
| c487acbf1a | |||
| 72349ddbb6 | |||
| c8389103e3 | |||
| 7a7069959f | |||
| a20615ea11 | |||
| 0e8672562a | |||
| 05ae8c8219 | |||
| add0c4de47 | |||
| 510d8083b3 | |||
| d0e960e64b | |||
| b8a844b9dc | |||
| f46e4f9aa4 | |||
| a828443b46 | |||
| e28ddcff25 | |||
| 80c7643396 | |||
| 66aaa92bd1 | |||
| eb463eef97 | |||
| d43273fd1b | |||
| 2c91d1db6e | |||
| d504397593 | |||
| 95043d637c | |||
| 51a006654a | |||
| dde3f603be | |||
| 4fe6836cf0 | |||
| fdcd39398c | |||
| f7fe10fc98 | |||
| 7d99becca9 | |||
| a53f65d86b | |||
| fb7362c092 | |||
| 714f8172ec | |||
| 9344896238 | |||
| 3081f7b24f | |||
| e594b7eac6 | |||
| 0f3fbc3883 | |||
| 2d20d5858e | |||
| fe57e4d924 | |||
| e4e40505b6 | |||
| 5b5c3a08e6 | |||
| 137d2d723d | |||
| aff481bd37 | |||
| a5a660b828 | |||
| d08b7dafa4 | |||
| 3e1b86a7c3 | |||
| fe68c7bc14 | |||
| 4ee35d7e56 | |||
| dbdad80960 | |||
| 72940b2511 | |||
| 70922975cf | |||
| 135cfd7617 | |||
| d58e88a2f7 | |||
| c29bdd4b1d | |||
| 0643bf9783 | |||
| 386261181e | |||
| d8b704ef7d | |||
| e46e2952e6 | |||
| a339d0d41d | |||
| d62f2d41fc | |||
| 339e921f17 | |||
| 5e963c05af | |||
| 638d43e3cf | |||
| fdef1090c3 | |||
| 89303d9218 | |||
| 341bc0723b | |||
| a6b31017e3 | |||
| ca29cb037e | |||
| d59931dc4d | |||
| 876335bb54 | |||
| 5c87b8152d | |||
| ef487112df | |||
| 49089f7537 | |||
| 736890119b | |||
| 2da70c69da | |||
| ae966e546b | |||
| 0d63c8b9ef | |||
| 8f66527e02 | |||
| 7e7f5f0bd6 | |||
| b3ac1001c9 | |||
| e5e779c064 | |||
| 525db1819d | |||
| bb3c0b41f6 | |||
| 35c4867334 | |||
| 690d8f9155 | |||
| b63923264d | |||
| 5aab187e17 | |||
| ee4a79616f | |||
| b667944612 | |||
| 6fb3c66fe5 | |||
| 66ef95b9c9 | |||
| bb3596d245 | |||
| a5c32b63b7 | |||
| 9e4f728f21 | |||
| 3cb7b362c8 | |||
| 1beb221337 | |||
| 28cb11f521 | |||
| d71e79b306 | |||
| 7edc891605 | |||
| 8e4aff391e | |||
| 1b84905941 | |||
| 06d22fa009 | |||
| 29f89cdfbc | |||
| 6f49a37914 | |||
| 1e316102ea | |||
| 03b2550520 | |||
| e547a1e778 | |||
| 9c69eed211 | |||
| 464c1cb584 | |||
| 4fbe55cc35 | |||
| 008b17aaf2 | |||
| c469571f62 | |||
| 6c2a8edea6 | |||
| 361937d443 | |||
| 4071e1d4d9 | |||
| 46a358abe6 | |||
| fc339cc9d0 | |||
| c87380fa54 | |||
| 959337b592 | |||
| ca0b9bc374 | |||
| 2d459a962e | |||
| f3b2ac6c17 | |||
| 6027a80c14 | |||
| 6934552dd9 | |||
| 0b755cac54 | |||
| 765ee5eeed | |||
| c36a1cd6dc | |||
| a493242c3c | |||
| 97bb50a5c4 | |||
| 27225b6047 | |||
| cbd68ff8c8 | |||
| a32dedeb48 | |||
| 91d3851d76 | |||
| b5e9c0f996 | |||
| de4782368d | |||
| 3e39c0c11a | |||
| d2360753fb | |||
| e747ea851a | |||
| 68d563c72f | |||
| c5e4bb08f4 | |||
| 0b97db9fd2 | |||
| fb8873e77b | |||
| e943771945 | |||
| 05a3c4b2b8 | |||
| 24b396e516 | |||
| cdd0b2de00 | |||
| 4096ee1f1e | |||
| f720e51585 | |||
| c5c93bb2e6 | |||
| 85bafecc93 | |||
| 2ed185aa2c | |||
| 1b2316ad1f | |||
| 80ad3a8940 | |||
| cef4928dd0 | |||
| ab65bb1d57 | |||
| c21293e508 | |||
| 3c794cfc07 | |||
| d71dbd1751 | |||
| 8805021960 | |||
| dd2b12b517 | |||
| 78f3a2aa64 | |||
| 03dbe47546 | |||
| 13ad5e4b46 | |||
| 6716e580f3 | |||
| 5d9c8c8e27 | |||
| 7bd5213be4 | |||
| 93ddf915a2 | |||
| f8ce10472b | |||
| ceb2b287bb | |||
| 8e9fa38197 | |||
| 5763672175 | |||
| 6ed3301110 | |||
| fbe456ed45 | |||
| 518a5e8ab1 | |||
| 008ac97a64 | |||
| 7892fed6d9 | |||
| 6042410b4b | |||
| 26532c03ac | |||
| 0fa5053ad1 | |||
| 39a94dba0d | |||
| a440269c6b | |||
| a7310cba17 | |||
| b82100bcd7 | |||
| e7ce79261d | |||
| d8bbb428d8 | |||
| 7adc93d806 | |||
| 62dcc188d1 | |||
| aa1114c387 | |||
| 462349ad84 | |||
| 19183f958e | |||
| 42d3a7e4f6 | |||
| af02b9f958 | |||
| f67d280845 | |||
| 6d7203ef4b | |||
| 90a9b98ae6 | |||
| 61fb708b73 | |||
| 4629b4f261 | |||
| 865c8562da | |||
| 7fea04c663 | |||
| 8620e1b7c9 | |||
| 9102c1a13a | |||
| 682df81339 | |||
| 40ebee9ff4 | |||
| 26213f9049 | |||
| 680f1f017d | |||
| cee3dc370d | |||
| f91de33e5d | |||
| fc844cefd7 | |||
| a5e65b93c9 | |||
| 92e20d07ae | |||
| c4432bcd7e | |||
| b6fc878aab | |||
| d18fb730ec | |||
| 4cd7d98224 | |||
| 760ba01e6b | |||
| fb2f8327e2 | |||
| 7559d96a0e | |||
| 1471784035 | |||
| 057823e4c1 | |||
| e1f8354905 | |||
| 50cc093250 | |||
| e25499b3f2 | |||
| 14b3525e9c | |||
| c2a35bb2e1 | |||
| 279cd4660d | |||
| 2dad087bbd | |||
| 4b612400da | |||
| 91da1305a4 | |||
| ee581f27c4 | |||
| d90982e63b | |||
| a3dc36ae22 | |||
| b25c5d509d | |||
| 6e1c8c665b | |||
| feafd43fdf | |||
| 7d7b9d0238 | |||
| c2b5820153 | |||
| a6b9cd87ec | |||
| 11092da32d | |||
| dfccb4a2bc | |||
| c1ad00cbc6 | |||
| 6686346473 | |||
| 0356c0a891 | |||
| 8af4730ddf | |||
| 994e2001a0 | |||
| c65864ffb6 | |||
| 8011c48641 | |||
| 97873ff42d | |||
| 9af9deb0f5 | |||
| 477ba3f4b9 | |||
| 9c6dbe699f | |||
| 9cfe6b936b | |||
| 9b4e63fbc7 | |||
| ba1a317119 | |||
| 55f1767001 | |||
| f8b924c262 | |||
| e19b7bd368 | |||
| 3bfa1d68f7 | |||
| aaac2c5a84 | |||
| 29a62dfa85 | |||
| 790304d1f1 | |||
| 7e0e9a037d | |||
| 712fe1f6ec | |||
| b03e9af597 | |||
| 52d31a6846 | |||
| a8427ca610 | |||
| 5880593cb1 | |||
| 6bb3ebc00e | |||
| da163be8db | |||
| e928046a95 | |||
| 3eaa0b4fb1 | |||
| 37bedfe9ba | |||
| df0004c1b0 | |||
| 24e4730204 | |||
| 7d12382333 | |||
| bc348dadad | |||
| ceadb1325d | |||
| 15f7440af2 | |||
| cd748e7d8b | |||
| ed98aa45d2 | |||
| 10477d3795 | |||
| 982c078926 | |||
| a721179aa8 | |||
| 50d5f3785c | |||
| 9856df20fb | |||
| c8b75e982e | |||
| 199dd7d618 | |||
| ab569681b1 | |||
| b10f5d3745 | |||
| 7dd904c8d1 | |||
| 624be70990 | |||
| b9d2c1b9f6 | |||
| 00b2debb32 | |||
| f29fe17496 | |||
| e80f3c87e9 | |||
| a7d0251b77 | |||
| 3bcfcc6308 | |||
| 7d004e1eb0 | |||
| 90f6023f0f | |||
| 4e9c3e19d2 | |||
| 0f1ca0856c | |||
| 2ef5ade596 | |||
| 75e60b7f8e | |||
| 64d39134b9 | |||
| 414cafdbed | |||
| f566cba56a | |||
| 8400994c57 | |||
| 43f459b194 | |||
| e352171efa | |||
| 6c2f554a31 | |||
| bb2a6dce23 | |||
| 288ae4bad3 | |||
| f2c48d4c58 | |||
| f8571a57dd | |||
| 5285e8a163 | |||
| f8a4f2e6bd | |||
| c7ad873581 | |||
| 78759add4a | |||
| 48b674a13d | |||
| 8c9b852586 | |||
| 9634bef7fc | |||
| cbbfae0cfc | |||
| fc7623b690 | |||
| 0cf5a7aec3 | |||
| 59152a9d77 | |||
| e3972cc9e6 | |||
| 2a4d6523b1 | |||
| 6d8b96068d | |||
| e88cd61097 | |||
| b71f3031bc | |||
| 9dd4002337 | |||
| ccdebf0116 | |||
| 1a4aa1692a | |||
| 240f04eda7 | |||
| 7b4c130e0a | |||
| 7e3fdee86c | |||
| 6a79694fa1 | |||
| c52ff4249a | |||
| 4e7870c634 | |||
| 487dcc4459 | |||
| 0ba9b3fedc | |||
| 46561b9cf5 | |||
| 545ac6b420 | |||
| 2146489740 | |||
| 3746128014 | |||
| ca32e35ef6 | |||
| c37e83e235 | |||
| 00604722bb | |||
| 808654743c | |||
| bb2d8f6a4d | |||
| 7a263c032d | |||
| ad7dfc31a9 | |||
| 0663e9cb6f | |||
| b0a3e9205f | |||
| 0e8f6a32b1 | |||
| 17544d4577 | |||
| b22a88eccc | |||
| 563878f20e | |||
| dd8d23be62 | |||
| 4d3dda23f8 | |||
| 718a2c2205 | |||
| ffbee0ad1a | |||
| bb8c6da0b4 | |||
| 575ba28b62 | |||
| 3afee1f841 | |||
| d5699fb68d | |||
| 519c049902 | |||
| 28fca1f8dc | |||
| 935dc7d8fb | |||
| 771c3b175e | |||
| b468945eb7 | |||
| 3554211233 | |||
| 0fc72875b2 | |||
| 2286203123 | |||
| 210655ddc7 | |||
| 034ebab064 | |||
| e32b6c55e4 | |||
| 4f016de277 | |||
| 832c31a41a | |||
| 02b7e3fafb | |||
| ff13f162ce | |||
| 80f1c65e1c | |||
| 7d3f35d48b | |||
| 0b11340c4e | |||
| 898ec8fcf1 | |||
| c4d7fb8724 | |||
| b8c0b2c326 | |||
| 8ec9f36954 | |||
| db0b4045a2 | |||
| b4a234b1c0 | |||
| dcfefee060 | |||
| 6859d92716 | |||
| f6f3060c9d | |||
| 6bf2cf8cb8 | |||
| a0140ff943 | |||
| df1e486df6 | |||
| a0cfba5b3e | |||
| 84b1a719f2 | |||
| 734d79d540 | |||
| 2c388117ad | |||
| 92a678d0b4 | |||
| ed1015fa89 | |||
| 934450b749 | |||
| e025bfdb46 | |||
| 055daddcaf | |||
| 618252882c | |||
| efda99c230 | |||
| 8a50039482 | |||
| 79e825b7c7 | |||
| ec6b74aa7f | |||
| dad6f2ead5 | |||
| 3b1c663e58 | |||
| 0624667572 | |||
| 07c80f9560 | |||
| 947341a5ee | |||
| 44eef6482c | |||
| f534e69a90 | |||
| 03399fe3fd | |||
| 51c9cec35a | |||
| da660b461f | |||
| 69c6879ac9 | |||
| a1ff12d9ab | |||
| 24ab98be4b | |||
| 49d0c308e8 | |||
| edf1cfefd3 | |||
| 601e495da7 | |||
| e84799e15b | |||
| bdc90ac3a7 | |||
| dfdd775519 | |||
| a36b37b1ea | |||
| ceb0fe22f1 | |||
| aa8a2ea41b | |||
| 159fb62898 | |||
| d8bbd85abb | |||
| 57d260f30a | |||
| ef74205503 | |||
| 89bbf05b63 | |||
| 7d5089f5e8 | |||
| ab33148f81 | |||
| c2766db89d | |||
| f97693f8e1 | |||
| 034c076882 | |||
| 12bed1462f | |||
| 79ff4dd944 | |||
| ec77e3a6fd | |||
| 35977b02ed | |||
| 20b6c2f556 | |||
| 7cda4aaa2c | |||
| 07bdb3a632 | |||
| fe8c55ac63 | |||
| a83edb83ba | |||
| 5f1063acb9 | |||
| f917a38e1a | |||
| accc8aee57 | |||
| 0977471201 | |||
| e61e7fd008 | |||
| 596e3b28b5 | |||
| 077ba02004 | |||
| 75ee3b30e2 | |||
| 10a27c2081 | |||
| 78d95cab89 | |||
| 7881d6609a | |||
| b9336bad7e | |||
| 84b3cff936 | |||
| e265f7713c | |||
| 3312d8c05b | |||
| 8b5389e719 | |||
| 6f2de7d31b | |||
| fb208657ea | |||
| eab6bb8314 | |||
| 0b489bc507 | |||
| b2b447516d | |||
| f7cc23d415 | |||
| 6fcd39b4f8 | |||
| 4ed6e20b35 | |||
| 70a74d6615 | |||
| de7e6e8e66 | |||
| b33f2e5989 | |||
| 55c557f227 | |||
| ab5fe1e518 | |||
| 10325fed8b | |||
| 58970282da | |||
| 4d12481822 | |||
| ff005a22a3 | |||
| 92031bbd70 | |||
| d0ef6a5293 | |||
| f9480f2518 | |||
| 56c570fd19 | |||
| 0b647c7ae5 | |||
| 91589eae34 | |||
| 89a5a45d7e | |||
| 06b91a6e01 | |||
| 19bee763bd | |||
| b0710ff8d1 | |||
| 2342caff32 | |||
| e05a45f6c7 | |||
| c7e33eb6b9 | |||
| 6c1efd74cb | |||
| 43204e52f8 | |||
| 2a7a88ff47 | |||
| 6580aad173 | |||
| 574a5e303c | |||
| 5c75a68715 | |||
| ee618f70ab | |||
| 94038ebb75 | |||
| be0374d197 | |||
| c8b20ecb1a | |||
| 45b29aedf3 | |||
| 855796448c | |||
| 0153726755 | |||
| d47daa2857 | |||
| d9a1cf8c7b | |||
| 59a2f0cdde | |||
| a6e2110f3d | |||
| 9296f2bdc5 | |||
| ec00daa5be | |||
| dceb79ad69 | |||
| a41c690a62 | |||
| 62e4169e50 | |||
| 122e71f4a3 | |||
| c6c6d00bad | |||
| ccdeb4d385 | |||
| b7338d5bf0 | |||
| 127f51e758 | |||
| aae1d2f049 | |||
| 9c88dda251 | |||
| 900a5f83da | |||
| 0c532236a5 | |||
| bebab942cc | |||
| 58c15b0287 | |||
| bfae4273c2 | |||
| 7300776a85 | |||
| 3878bd0c76 | |||
| 786e03b0ac | |||
| f8b5637112 | |||
| 2f4944ca21 | |||
| a7c0e82c9e | |||
| 5542107f02 | |||
| 94b5684b42 | |||
| 4a84c311b2 | |||
| 49505a7a45 | |||
| 10b01e62df | |||
| eff8000196 | |||
| c6bb4a6470 | |||
| 3dcc2edceb | |||
| cfd2f8776e | |||
| d11e2410bf | |||
| 83605831ec | |||
| aed1959dbe | |||
| c3c60b331a | |||
| 15606a99fc | |||
| eddc9c9baf | |||
| 7bbc4a6a44 | |||
| 1f39a0cb3e | |||
| 8d680b2222 | |||
| 21ef83bcbe | |||
| 6253162166 | |||
| 1110b284d8 | |||
| 5c6f684808 | |||
| 9b1a449fba | |||
| e4f337edb6 | |||
| 5a9744b429 | |||
| e0237ce526 | |||
| 4d2825d817 | |||
| 09ccd23d0b | |||
| cbbd01b391 | |||
| 539fa8b262 | |||
| 592bbd3180 | |||
| b09792812a | |||
| 9154938827 | |||
| 4f7b8e0934 | |||
| c0f53647b8 | |||
| 3e1b75b814 | |||
| 497170c453 | |||
| 6773412e40 | |||
| 1c8dea909e | |||
| d6ac686a54 | |||
| 5fac13075b | |||
| 6cc774faf4 | |||
| 8f4ec1b960 | |||
| 357be65a69 | |||
| f164833b00 | |||
| 627859ba73 | |||
| a7c239b801 | |||
| 1cabb091e7 | |||
| d0e612b5ff | |||
| 0a8b21d4ab | |||
| 27fd6316f1 | |||
| 4e15364d42 | |||
| 35c194e2eb | |||
| 0c5c6587e5 | |||
| b5a81fbd07 | |||
| 0a0d4fbb70 | |||
| c1669299aa | |||
| d62219d0ad | |||
| 59ddf507e6 | |||
| 4d94d5fe17 | |||
| d64f2e40c5 | |||
| 75d7c40098 | |||
| 7c377e8904 | |||
| 5a88ea6950 | |||
| 9841ca233d | |||
| 999677d314 |
@@ -37,3 +37,6 @@ x64/
|
|||||||
x86/
|
x86/
|
||||||
log/
|
log/
|
||||||
logs/
|
logs/
|
||||||
|
vcpkg/
|
||||||
|
|
||||||
|
.idea/*
|
||||||
+20
-25
@@ -1,32 +1,27 @@
|
|||||||
language: cpp
|
language: cpp
|
||||||
compiler: gcc
|
compiler: gcc
|
||||||
sudo: false
|
dist: trusty
|
||||||
addons:
|
|
||||||
apt:
|
before_install:
|
||||||
sources:
|
- sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
|
||||||
- ubuntu-toolchain-r-test
|
- sudo apt-get update -qq
|
||||||
packages:
|
- mkdir $HOME/usr
|
||||||
- gcc-4.8
|
- export PATH="$HOME/usr/bin:$PATH"
|
||||||
- g++-4.8
|
- wget https://cmake.org/files/v3.11/cmake-3.11.2-Linux-x86_64.sh
|
||||||
- libmysqlclient-dev
|
- chmod +x cmake-3.11.2-Linux-x86_64.sh
|
||||||
- libperl-dev
|
- ./cmake-3.11.2-Linux-x86_64.sh --prefix=$HOME/usr --exclude-subdir --skip-license
|
||||||
- libboost-dev
|
|
||||||
- liblua5.1-0-dev
|
|
||||||
- zlib1g-dev
|
|
||||||
- uuid-dev
|
|
||||||
- libssl-dev
|
|
||||||
install:
|
install:
|
||||||
- if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi
|
- sudo apt-get install -qq g++-7
|
||||||
|
- sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 90
|
||||||
|
- sudo apt-get install libmysqlclient-dev
|
||||||
|
- sudo apt-get install libperl-dev
|
||||||
|
- sudo apt-get install libboost-dev
|
||||||
|
- sudo apt-get install liblua5.1-0-dev
|
||||||
|
- sudo apt-get install zlib1g-dev
|
||||||
|
- sudo apt-get install uuid-dev
|
||||||
|
- sudo apt-get install libssl-dev
|
||||||
script:
|
script:
|
||||||
- cmake -G "Unix Makefiles" -DEQEMU_BUILD_TESTS=ON -DEQEMU_ENABLE_BOTS=ON -DEQEMU_BUILD_LOGIN=ON
|
- cmake -G "Unix Makefiles" -DEQEMU_BUILD_TESTS=ON -DEQEMU_ENABLE_BOTS=ON -DEQEMU_BUILD_LOGIN=ON
|
||||||
- make -j2
|
- make -j2
|
||||||
- ./bin/tests
|
- ./bin/tests
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
- stable
|
|
||||||
notifications:
|
|
||||||
email: false
|
|
||||||
irc:
|
|
||||||
channels: "irc.eqemulator.net#eqemucoders"
|
|
||||||
os: linux
|
|
||||||
+6
-50
@@ -27,8 +27,6 @@
|
|||||||
#EQEMU_USE_MAP_MMFS
|
#EQEMU_USE_MAP_MMFS
|
||||||
#EQEMU_MAP_DIR
|
#EQEMU_MAP_DIR
|
||||||
|
|
||||||
#We set a fairly new version (as of 2013) because I found finding perl was a bit... buggy on older ones
|
|
||||||
#Can change this if you really want but you should upgrade!
|
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
|
|
||||||
#FindMySQL is located here so lets make it so CMake can find it
|
#FindMySQL is located here so lets make it so CMake can find it
|
||||||
@@ -42,6 +40,8 @@ IF(NOT CMAKE_BUILD_TYPE)
|
|||||||
SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE)
|
SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE)
|
||||||
ENDIF(NOT CMAKE_BUILD_TYPE)
|
ENDIF(NOT CMAKE_BUILD_TYPE)
|
||||||
|
|
||||||
|
SET(CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}/dependencies" "${CMAKE_PREFIX_PATH}")
|
||||||
|
|
||||||
#Add our various windows definitions
|
#Add our various windows definitions
|
||||||
IF(MSVC OR MINGW)
|
IF(MSVC OR MINGW)
|
||||||
ADD_DEFINITIONS(-D_WINDOWS)
|
ADD_DEFINITIONS(-D_WINDOWS)
|
||||||
@@ -53,35 +53,6 @@ IF(MSVC OR MINGW)
|
|||||||
ENDIF(MSVC OR MINGW)
|
ENDIF(MSVC OR MINGW)
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
#Set our default locations for zlib/mysql based on x86/x64
|
|
||||||
IF(CMAKE_CL_64)
|
|
||||||
SET(ZLIB_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/zlib_x64")
|
|
||||||
SET(MYSQL_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/mysql_x64")
|
|
||||||
SET(LUA_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/luaj_x64")
|
|
||||||
SET(OPENSSL_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/openssl_x64")
|
|
||||||
SET(SODIUM_INCLUDE_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/include")
|
|
||||||
IF(MSVC_VERSION GREATER 1800)
|
|
||||||
SET(SODIUM_LIBRARY_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/x64/Release/v140/dynamic")
|
|
||||||
ELSEIF(MSVC_VERSION EQUAL 1800)
|
|
||||||
SET(SODIUM_LIBRARY_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/x64/Release/v120/dynamic")
|
|
||||||
ELSE()
|
|
||||||
SET(SODIUM_LIBRARY_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/x64/Release/v110/dynamic")
|
|
||||||
ENDIF()
|
|
||||||
ELSE(CMAKE_CL_64)
|
|
||||||
SET(ZLIB_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/zlib_x86")
|
|
||||||
SET(MYSQL_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/mysql_x86")
|
|
||||||
SET(LUA_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/luaj_x86")
|
|
||||||
SET(SODIUM_INCLUDE_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/include")
|
|
||||||
SET(OPENSSL_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/openssl_x86")
|
|
||||||
IF(MSVC_VERSION GREATER 1800)
|
|
||||||
SET(SODIUM_LIBRARY_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/Win32/Release/v140/dynamic")
|
|
||||||
ELSEIF(MSVC_VERSION EQUAL 1800)
|
|
||||||
SET(SODIUM_LIBRARY_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/Win32/Release/v120/dynamic")
|
|
||||||
ELSE()
|
|
||||||
SET(SODIUM_LIBRARY_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/Win32/Release/v110/dynamic")
|
|
||||||
ENDIF()
|
|
||||||
ENDIF(CMAKE_CL_64)
|
|
||||||
|
|
||||||
#disable CRT warnings on windows cause they're annoying as shit and we use C functions everywhere
|
#disable CRT warnings on windows cause they're annoying as shit and we use C functions everywhere
|
||||||
OPTION(EQEMU_DISABLE_CRT_SECURE_WARNINGS "Disable Secure CRT Warnings" ON)
|
OPTION(EQEMU_DISABLE_CRT_SECURE_WARNINGS "Disable Secure CRT Warnings" ON)
|
||||||
IF(EQEMU_DISABLE_CRT_SECURE_WARNINGS)
|
IF(EQEMU_DISABLE_CRT_SECURE_WARNINGS)
|
||||||
@@ -100,23 +71,6 @@ IF(MSVC)
|
|||||||
ADD_DEFINITIONS(-DCRASH_LOGGING)
|
ADD_DEFINITIONS(-DCRASH_LOGGING)
|
||||||
ENDIF(EQEMU_ENABLE_CRASH_LOGGING)
|
ENDIF(EQEMU_ENABLE_CRASH_LOGGING)
|
||||||
|
|
||||||
#Disable safe SEH or not?
|
|
||||||
OPTION(EQEMU_DISABLE_SAFESEH "Disable Safe SEH (Needed for Strawberry Perl)" OFF)
|
|
||||||
IF(EQEMU_DISABLE_SAFESEH)
|
|
||||||
SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /SAFESEH:NO")
|
|
||||||
SET(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} /SAFESEH:NO")
|
|
||||||
SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /SAFESEH:NO")
|
|
||||||
SET(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} /SAFESEH:NO")
|
|
||||||
SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} /SAFESEH:NO")
|
|
||||||
SET(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "${CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL} /SAFESEH:NO")
|
|
||||||
SET(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /SAFESEH:NO")
|
|
||||||
SET(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} /SAFESEH:NO")
|
|
||||||
SET(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS_DEBUG} /SAFESEH:NO")
|
|
||||||
SET(CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL "${CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL} /SAFESEH:NO")
|
|
||||||
SET(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} /SAFESEH:NO")
|
|
||||||
SET(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO} /SAFESEH:NO")
|
|
||||||
ENDIF(EQEMU_DISABLE_SAFESEH)
|
|
||||||
|
|
||||||
OPTION(EQEMU_BUILD_MSVC_MP "Enable build with multiple processes." ON)
|
OPTION(EQEMU_BUILD_MSVC_MP "Enable build with multiple processes." ON)
|
||||||
IF(EQEMU_BUILD_MSVC_MP)
|
IF(EQEMU_BUILD_MSVC_MP)
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
|
||||||
@@ -309,7 +263,7 @@ IF(EQEMU_BUILD_PERL)
|
|||||||
INCLUDE_DIRECTORIES(SYSTEM "${PERL_INCLUDE_PATH}")
|
INCLUDE_DIRECTORIES(SYSTEM "${PERL_INCLUDE_PATH}")
|
||||||
ENDIF(EQEMU_BUILD_PERL)
|
ENDIF(EQEMU_BUILD_PERL)
|
||||||
|
|
||||||
SET(SERVER_LIBS common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY} libuv fmt)
|
SET(SERVER_LIBS common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY} libuv fmt recast_navigation)
|
||||||
|
|
||||||
FIND_PACKAGE(Sodium REQUIRED)
|
FIND_PACKAGE(Sodium REQUIRED)
|
||||||
IF(SODIUM_FOUND)
|
IF(SODIUM_FOUND)
|
||||||
@@ -342,7 +296,7 @@ IF(EQEMU_BUILD_LUA)
|
|||||||
|
|
||||||
FIND_PACKAGE(Boost REQUIRED)
|
FIND_PACKAGE(Boost REQUIRED)
|
||||||
INCLUDE_DIRECTORIES(SYSTEM "${LUA_INCLUDE_DIR}" "${Boost_INCLUDE_DIRS}")
|
INCLUDE_DIRECTORIES(SYSTEM "${LUA_INCLUDE_DIR}" "${Boost_INCLUDE_DIRS}")
|
||||||
INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/luabind")
|
INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/libs/luabind")
|
||||||
|
|
||||||
OPTION(EQEMU_SANITIZE_LUA_LIBS "Sanitize Lua Libraries (Remove OS and IO standard libraries from being able to run)." ON)
|
OPTION(EQEMU_SANITIZE_LUA_LIBS "Sanitize Lua Libraries (Remove OS and IO standard libraries from being able to run)." ON)
|
||||||
IF(EQEMU_SANITIZE_LUA_LIBS)
|
IF(EQEMU_SANITIZE_LUA_LIBS)
|
||||||
@@ -357,6 +311,8 @@ INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/libs/cereal")
|
|||||||
INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/libs/libuv/include" )
|
INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/libs/libuv/include" )
|
||||||
INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/libs/libuv/src")
|
INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/libs/libuv/src")
|
||||||
INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/libs/format")
|
INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/libs/format")
|
||||||
|
INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/libs/recast/detour/include")
|
||||||
|
INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/libs/recast/recast/include")
|
||||||
|
|
||||||
IF(EQEMU_BUILD_SERVER OR EQEMU_BUILD_LOGIN OR EQEMU_BUILD_TESTS OR EQEMU_BUILD_HC)
|
IF(EQEMU_BUILD_SERVER OR EQEMU_BUILD_LOGIN OR EQEMU_BUILD_TESTS OR EQEMU_BUILD_HC)
|
||||||
ADD_SUBDIRECTORY(common)
|
ADD_SUBDIRECTORY(common)
|
||||||
|
|||||||
@@ -1,339 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License.
|
|
||||||
@@ -0,0 +1,165 @@
|
|||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
|
||||||
|
This version of the GNU Lesser General Public License incorporates
|
||||||
|
the terms and conditions of version 3 of the GNU General Public
|
||||||
|
License, supplemented by the additional permissions listed below.
|
||||||
|
|
||||||
|
0. Additional Definitions.
|
||||||
|
|
||||||
|
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||||
|
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||||
|
General Public License.
|
||||||
|
|
||||||
|
"The Library" refers to a covered work governed by this License,
|
||||||
|
other than an Application or a Combined Work as defined below.
|
||||||
|
|
||||||
|
An "Application" is any work that makes use of an interface provided
|
||||||
|
by the Library, but which is not otherwise based on the Library.
|
||||||
|
Defining a subclass of a class defined by the Library is deemed a mode
|
||||||
|
of using an interface provided by the Library.
|
||||||
|
|
||||||
|
A "Combined Work" is a work produced by combining or linking an
|
||||||
|
Application with the Library. The particular version of the Library
|
||||||
|
with which the Combined Work was made is also called the "Linked
|
||||||
|
Version".
|
||||||
|
|
||||||
|
The "Minimal Corresponding Source" for a Combined Work means the
|
||||||
|
Corresponding Source for the Combined Work, excluding any source code
|
||||||
|
for portions of the Combined Work that, considered in isolation, are
|
||||||
|
based on the Application, and not on the Linked Version.
|
||||||
|
|
||||||
|
The "Corresponding Application Code" for a Combined Work means the
|
||||||
|
object code and/or source code for the Application, including any data
|
||||||
|
and utility programs needed for reproducing the Combined Work from the
|
||||||
|
Application, but excluding the System Libraries of the Combined Work.
|
||||||
|
|
||||||
|
1. Exception to Section 3 of the GNU GPL.
|
||||||
|
|
||||||
|
You may convey a covered work under sections 3 and 4 of this License
|
||||||
|
without being bound by section 3 of the GNU GPL.
|
||||||
|
|
||||||
|
2. Conveying Modified Versions.
|
||||||
|
|
||||||
|
If you modify a copy of the Library, and, in your modifications, a
|
||||||
|
facility refers to a function or data to be supplied by an Application
|
||||||
|
that uses the facility (other than as an argument passed when the
|
||||||
|
facility is invoked), then you may convey a copy of the modified
|
||||||
|
version:
|
||||||
|
|
||||||
|
a) under this License, provided that you make a good faith effort to
|
||||||
|
ensure that, in the event an Application does not supply the
|
||||||
|
function or data, the facility still operates, and performs
|
||||||
|
whatever part of its purpose remains meaningful, or
|
||||||
|
|
||||||
|
b) under the GNU GPL, with none of the additional permissions of
|
||||||
|
this License applicable to that copy.
|
||||||
|
|
||||||
|
3. Object Code Incorporating Material from Library Header Files.
|
||||||
|
|
||||||
|
The object code form of an Application may incorporate material from
|
||||||
|
a header file that is part of the Library. You may convey such object
|
||||||
|
code under terms of your choice, provided that, if the incorporated
|
||||||
|
material is not limited to numerical parameters, data structure
|
||||||
|
layouts and accessors, or small macros, inline functions and templates
|
||||||
|
(ten or fewer lines in length), you do both of the following:
|
||||||
|
|
||||||
|
a) Give prominent notice with each copy of the object code that the
|
||||||
|
Library is used in it and that the Library and its use are
|
||||||
|
covered by this License.
|
||||||
|
|
||||||
|
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||||
|
document.
|
||||||
|
|
||||||
|
4. Combined Works.
|
||||||
|
|
||||||
|
You may convey a Combined Work under terms of your choice that,
|
||||||
|
taken together, effectively do not restrict modification of the
|
||||||
|
portions of the Library contained in the Combined Work and reverse
|
||||||
|
engineering for debugging such modifications, if you also do each of
|
||||||
|
the following:
|
||||||
|
|
||||||
|
a) Give prominent notice with each copy of the Combined Work that
|
||||||
|
the Library is used in it and that the Library and its use are
|
||||||
|
covered by this License.
|
||||||
|
|
||||||
|
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||||
|
document.
|
||||||
|
|
||||||
|
c) For a Combined Work that displays copyright notices during
|
||||||
|
execution, include the copyright notice for the Library among
|
||||||
|
these notices, as well as a reference directing the user to the
|
||||||
|
copies of the GNU GPL and this license document.
|
||||||
|
|
||||||
|
d) Do one of the following:
|
||||||
|
|
||||||
|
0) Convey the Minimal Corresponding Source under the terms of this
|
||||||
|
License, and the Corresponding Application Code in a form
|
||||||
|
suitable for, and under terms that permit, the user to
|
||||||
|
recombine or relink the Application with a modified version of
|
||||||
|
the Linked Version to produce a modified Combined Work, in the
|
||||||
|
manner specified by section 6 of the GNU GPL for conveying
|
||||||
|
Corresponding Source.
|
||||||
|
|
||||||
|
1) Use a suitable shared library mechanism for linking with the
|
||||||
|
Library. A suitable mechanism is one that (a) uses at run time
|
||||||
|
a copy of the Library already present on the user's computer
|
||||||
|
system, and (b) will operate properly with a modified version
|
||||||
|
of the Library that is interface-compatible with the Linked
|
||||||
|
Version.
|
||||||
|
|
||||||
|
e) Provide Installation Information, but only if you would otherwise
|
||||||
|
be required to provide such information under section 6 of the
|
||||||
|
GNU GPL, and only to the extent that such information is
|
||||||
|
necessary to install and execute a modified version of the
|
||||||
|
Combined Work produced by recombining or relinking the
|
||||||
|
Application with a modified version of the Linked Version. (If
|
||||||
|
you use option 4d0, the Installation Information must accompany
|
||||||
|
the Minimal Corresponding Source and Corresponding Application
|
||||||
|
Code. If you use option 4d1, you must provide the Installation
|
||||||
|
Information in the manner specified by section 6 of the GNU GPL
|
||||||
|
for conveying Corresponding Source.)
|
||||||
|
|
||||||
|
5. Combined Libraries.
|
||||||
|
|
||||||
|
You may place library facilities that are a work based on the
|
||||||
|
Library side by side in a single library together with other library
|
||||||
|
facilities that are not Applications and are not covered by this
|
||||||
|
License, and convey such a combined library under terms of your
|
||||||
|
choice, if you do both of the following:
|
||||||
|
|
||||||
|
a) Accompany the combined library with a copy of the same work based
|
||||||
|
on the Library, uncombined with any other library facilities,
|
||||||
|
conveyed under the terms of this License.
|
||||||
|
|
||||||
|
b) Give prominent notice with the combined library that part of it
|
||||||
|
is a work based on the Library, and explaining where to find the
|
||||||
|
accompanying uncombined form of the same work.
|
||||||
|
|
||||||
|
6. Revised Versions of the GNU Lesser General Public License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the GNU Lesser General Public License from time to time. Such new
|
||||||
|
versions will be similar in spirit to the present version, but may
|
||||||
|
differ in detail to address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Library as you received it specifies that a certain numbered version
|
||||||
|
of the GNU Lesser General Public License "or any later version"
|
||||||
|
applies to it, you have the option of following the terms and
|
||||||
|
conditions either of that published version or of any later version
|
||||||
|
published by the Free Software Foundation. If the Library as you
|
||||||
|
received it does not specify a version number of the GNU Lesser
|
||||||
|
General Public License, you may choose any version of the GNU Lesser
|
||||||
|
General Public License ever published by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Library as you received it specifies that a proxy can decide
|
||||||
|
whether future versions of the GNU Lesser General Public License shall
|
||||||
|
apply, that proxy's public statement of acceptance of any version is
|
||||||
|
permanent authorization for you to choose that version for the
|
||||||
|
Library.
|
||||||
-12
@@ -1,12 +0,0 @@
|
|||||||
The server code and utilities are released under GPLv3.
|
|
||||||
|
|
||||||
We also include some small libraries for convienence that may be under different licensing:
|
|
||||||
|
|
||||||
SocketLib - GPL
|
|
||||||
LibXML - ZLib License
|
|
||||||
StackWalker - New BSD License
|
|
||||||
ZLib - ZLib License
|
|
||||||
MySQL - GPL
|
|
||||||
Perl - GPL / ActiveState (under the assumption that this is a free project).
|
|
||||||
CPPUnit - GLP
|
|
||||||
StringUtilities - Apache
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# EQEmulator Core Server
|
# EQEmulator Core Server
|
||||||
|Travis CI (Linux)|Appveyor (Windows) |
|
|Travis CI (Linux)|Appveyor w/ Bots (Windows) |Appveyor w/o Bots (Windows) |
|
||||||
|:---:|:---:|
|
|:---:|:---:|:---:|
|
||||||
|[](https://travis-ci.org/EQEmu/Server) |[](https://ci.appveyor.com/project/KimLS/server/branch/master) |
|
|[](https://travis-ci.org/EQEmu/Server) |[](https://ci.appveyor.com/project/KimLS/server-87crp/branch/master) |[](https://ci.appveyor.com/project/KimLS/server-w0pq2/branch/master) |
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
@@ -17,10 +17,7 @@
|
|||||||
|:---:|:---:|:---:|
|
|:---:|:---:|:---:|
|
||||||
|**Install Count**|||
|
|**Install Count**|||
|
||||||
### > Windows
|
### > Windows
|
||||||
* [Easy Install](http://wiki.eqemulator.org/p?Akkas_PEQ_Server_Installer&frm=Main#from-scratch-installation-instructions-windows)
|
* [Install](https://github.com/EQEmu/Server/wiki/Windows-Server)
|
||||||
* [Advanced Setup](http://wiki.eqemulator.org/p?Complete_Windows-based_Server_Setup_Guide)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### > Debian/Ubuntu/CentOS/Fedora
|
### > Debian/Ubuntu/CentOS/Fedora
|
||||||
* You can use curl or wget to kick off the installer (whichever your OS has)
|
* You can use curl or wget to kick off the installer (whichever your OS has)
|
||||||
@@ -53,7 +50,23 @@ forum, although pull requests will be much quicker and easier on all parties.
|
|||||||
- **User Discord Channel**: `#general`
|
- **User Discord Channel**: `#general`
|
||||||
- **Developer Discord Channel**: `#eqemucoders`
|
- **Developer Discord Channel**: `#eqemucoders`
|
||||||
|
|
||||||
Resources
|
## Resources
|
||||||
---
|
|
||||||
- [EQEmulator Forums](http://www.eqemulator.org/forums)
|
- [EQEmulator Forums](http://www.eqemulator.org/forums)
|
||||||
- [EQEmulator Wiki](http://wiki.eqemulator.org/i?M=Wiki)
|
- [EQEmulator Wiki](https://github.com/EQEmu/Server/wiki)
|
||||||
|
|
||||||
|
## Related Repositories
|
||||||
|
* [ProjectEQ Quests](https://github.com/ProjectEQ/projecteqquests)
|
||||||
|
* [Maps](https://github.com/Akkadius/EQEmuMaps)
|
||||||
|
* [Installer Resources](https://github.com/Akkadius/EQEmuInstall)
|
||||||
|
* [Zone Utilities](https://github.com/EQEmu/zone-utilities) - Various utilities and libraries for parsing, rendering and manipulating EQ Zone files.
|
||||||
|
|
||||||
|
## Other License Info
|
||||||
|
|
||||||
|
* The server code and utilities are released under **GPLv3**
|
||||||
|
* We also include some small libraries for convienence that may be under different licensing
|
||||||
|
* SocketLib - GPL LibXML
|
||||||
|
* zlib - zlib license
|
||||||
|
* MariaDB/MySQL - GPL
|
||||||
|
* GPL Perl - GPL / ActiveState (under the assumption that this is a free project)
|
||||||
|
* CPPUnit - GLP StringUtilities - Apache
|
||||||
|
* LUA - MIT
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
version: 1.0.{build}
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
image: Visual Studio 2017
|
||||||
|
configuration: RelWithDebInfo
|
||||||
|
clone_folder: c:\projects\eqemu
|
||||||
|
init:
|
||||||
|
- ps: git config --global core.autocrlf input
|
||||||
|
before_build:
|
||||||
|
- ps: >-
|
||||||
|
$wc = New-Object System.Net.WebClient
|
||||||
|
|
||||||
|
$wc.DownloadFile("https://github.com/EQEmu/eqemu.github.com/blob/master/downloads/appveyor/vcpkg-export.7z?raw=true", "c:\projects\eqemu\vcpkg-export.7z")
|
||||||
|
|
||||||
|
$wc.DownloadFile("http://strawberryperl.com/download/5.26.2.1/strawberry-perl-5.26.2.1-64bit-portable.zip", "c:\projects\eqemu\strawberry-perl-5.26.2.1-64bit-portable.zip")
|
||||||
|
|
||||||
|
cd c:\projects\eqemu
|
||||||
|
|
||||||
|
7z x c:/projects/eqemu/vcpkg-export.7z -oc:/projects/eqemu/vcpkg -y
|
||||||
|
|
||||||
|
7z x c:/projects/eqemu/strawberry-perl-5.26.2.1-64bit-portable.zip -oc:/projects/eqemu/strawberry-perl-portable -y
|
||||||
|
|
||||||
|
(Get-Content C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE/config.h).replace('#define PERL_STATIC_INLINE static __inline__', '#define PERL_STATIC_INLINE static __inline') | Set-Content C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE/config.h
|
||||||
|
|
||||||
|
mkdir build
|
||||||
|
|
||||||
|
cd build
|
||||||
|
|
||||||
|
cmake -G "Visual Studio 15 2017 Win64" -DEQEMU_BUILD_TESTS=ON -DEQEMU_BUILD_LOGIN=ON -EQEMU_ENABLE_BOTS=ON -DPERL_EXECUTABLE="C:/projects/eqemu/strawberry-perl-portable/perl/bin/perl.exe" -DPERL_INCLUDE_PATH="C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE" -DPERL_LIBRARY="C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE/libperl526.a" -DCMAKE_TOOLCHAIN_FILE="C:/projects/eqemu/vcpkg/vcpkg-export-20180627-133249/scripts/buildsystems/vcpkg.cmake" ..
|
||||||
|
build:
|
||||||
|
project: C:\projects\eqemu\build\EQEmu.sln
|
||||||
|
parallel: true
|
||||||
|
verbosity: minimal
|
||||||
|
after_build:
|
||||||
|
- cmd: >-
|
||||||
|
7z a build_x64-bots.zip C:\projects\eqemu\build\bin\RelWithDebInfo\*.exe C:\projects\eqemu\build\bin\RelWithDebInfo\*.dll C:\projects\eqemu\build\bin\RelWithDebInfo\*.pdb
|
||||||
|
|
||||||
|
appveyor PushArtifact build_x64-bots.zip
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
version: 1.0.{build}
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
image: Visual Studio 2017
|
||||||
|
configuration: RelWithDebInfo
|
||||||
|
clone_folder: c:\projects\eqemu
|
||||||
|
init:
|
||||||
|
- ps: git config --global core.autocrlf input
|
||||||
|
before_build:
|
||||||
|
- ps: >-
|
||||||
|
$wc = New-Object System.Net.WebClient
|
||||||
|
|
||||||
|
$wc.DownloadFile("https://github.com/EQEmu/eqemu.github.com/blob/master/downloads/appveyor/vcpkg-export.7z?raw=true", "c:\projects\eqemu\vcpkg-export.7z")
|
||||||
|
|
||||||
|
$wc.DownloadFile("http://strawberryperl.com/download/5.26.2.1/strawberry-perl-5.26.2.1-64bit-portable.zip", "c:\projects\eqemu\strawberry-perl-5.26.2.1-64bit-portable.zip")
|
||||||
|
|
||||||
|
cd c:\projects\eqemu
|
||||||
|
|
||||||
|
7z x c:/projects/eqemu/vcpkg-export.7z -oc:/projects/eqemu/vcpkg -y
|
||||||
|
|
||||||
|
7z x c:/projects/eqemu/strawberry-perl-5.26.2.1-64bit-portable.zip -oc:/projects/eqemu/strawberry-perl-portable -y
|
||||||
|
|
||||||
|
(Get-Content C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE/config.h).replace('#define PERL_STATIC_INLINE static __inline__', '#define PERL_STATIC_INLINE static __inline') | Set-Content C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE/config.h
|
||||||
|
|
||||||
|
mkdir build
|
||||||
|
|
||||||
|
cd build
|
||||||
|
|
||||||
|
cmake -G "Visual Studio 15 2017 Win64" -DEQEMU_BUILD_TESTS=ON -DEQEMU_BUILD_LOGIN=ON -EQEMU_ENABLE_BOTS=OFF -DPERL_EXECUTABLE="C:/projects/eqemu/strawberry-perl-portable/perl/bin/perl.exe" -DPERL_INCLUDE_PATH="C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE" -DPERL_LIBRARY="C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE/libperl526.a" -DCMAKE_TOOLCHAIN_FILE="C:/projects/eqemu/vcpkg/vcpkg-export-20180627-133249/scripts/buildsystems/vcpkg.cmake" ..
|
||||||
|
build:
|
||||||
|
project: C:\projects\eqemu\build\EQEmu.sln
|
||||||
|
parallel: true
|
||||||
|
verbosity: minimal
|
||||||
|
after_build:
|
||||||
|
- cmd: >-
|
||||||
|
7z a build_x64-no-bots.zip C:\projects\eqemu\build\bin\RelWithDebInfo\*.exe C:\projects\eqemu\build\bin\RelWithDebInfo\*.dll C:\projects\eqemu\build\bin\RelWithDebInfo\*.pdb
|
||||||
|
|
||||||
|
appveyor PushArtifact build_x64-no-bots.zip
|
||||||
+153
@@ -1,5 +1,158 @@
|
|||||||
EQEMu Changelog (Started on Sept 24, 2003 15:50)
|
EQEMu Changelog (Started on Sept 24, 2003 15:50)
|
||||||
-------------------------------------------------------
|
-------------------------------------------------------
|
||||||
|
== 05/28/2018 ==
|
||||||
|
Akkadius: Fixed an issue where size 0 NPC's hop in and out of the ground at idle
|
||||||
|
Akkadius: NPC's now open doors within proximity given the door doesn't have locked requirements
|
||||||
|
Akkadius: #reloadallrules will now display zones that have had their rules reloaded to GM's
|
||||||
|
Akkadius: Zones should now respect "shutdowndelay" in the zones table at all times
|
||||||
|
Akkadius: Fixed an issue where boats would snap to the bed of the body of water
|
||||||
|
Akkadius: Added rule Aggro:NPCAggroMaxDistanceEnabled - defaults to true
|
||||||
|
Akkadius: Changed map directory load structure
|
||||||
|
- maps/base/*.map
|
||||||
|
- maps/nav/*.nav
|
||||||
|
- maps/water/*.wtr
|
||||||
|
- maps/path/*.path
|
||||||
|
|
||||||
|
KLS: Implemented navigation mesh
|
||||||
|
- All up to date maps and navs can be found https://github.com/Akkadius/EQEmuMaps
|
||||||
|
- To update maps either check out the maps found in the above repository or use the maintenance command:
|
||||||
|
perl eqemu_server.pl maps
|
||||||
|
|
||||||
|
== 03/28/2018 ==
|
||||||
|
Kayen: SE_CastOnFadeEffect, SE_CastOnFadeEffectNPC, SE_CastOnFadeEffectAlway triggered spell will now hit
|
||||||
|
the correct targets.
|
||||||
|
|
||||||
|
== 03/07/2018 ==
|
||||||
|
Uleat: Added command '#ucs' to force a reconnect to UCS server.
|
||||||
|
- Works in place of client auto-reconnect packet in zones where feature is unsupported
|
||||||
|
- Currently, you will need to manually re-join channels
|
||||||
|
|
||||||
|
== 03/04/2018 ==
|
||||||
|
Uleat: Updated UCS versioning
|
||||||
|
- SoF and higher clients have a new opcode identified (update your *.conf files)
|
||||||
|
- Rework of previous ucs connectivity code
|
||||||
|
- Unrelated: Zone::weatherSend() now takes an optional parameter for singular updates (as in client entering zone)
|
||||||
|
-- prior to this, every client already in-zone received a weather update packet whenever a new client zoned in
|
||||||
|
|
||||||
|
== 02/18/2018 ==
|
||||||
|
Uleat: Bug reporting fix and overhaul.
|
||||||
|
- Fixed bug reporting for SoD+ clients
|
||||||
|
- Added ability to disable bug reporting (set rule 'Bugs:ReportingSystemActive' to 'false')
|
||||||
|
- Implemented a more detailed reporting system (set rule 'Bugs:UseOldReportingMethod' to 'false')
|
||||||
|
-- New system is not currently compatible with script-based monitoring
|
||||||
|
- Soft-removal of defunct 'Petition Bug' system
|
||||||
|
|
||||||
|
== 02/14/2018 ==
|
||||||
|
mackal: Fix Heading -- Quests broken
|
||||||
|
|
||||||
|
Please report any other issues with heading, most things were tested and worked
|
||||||
|
|
||||||
|
You can use eqemu_server.pl to run a conversion to fix your headings in quests.
|
||||||
|
Some may need manual review.
|
||||||
|
|
||||||
|
== 02/10/2018 ==
|
||||||
|
mackal: Add Global Loot system
|
||||||
|
|
||||||
|
This will allow us to implement global loot similarly to how it works on live
|
||||||
|
This system reuses our current loottable tables which the global_loot table references.
|
||||||
|
The limits for the rules to govern if a table should be rolled are min level, max level, rare,
|
||||||
|
raid, race, class, bodytype, and zone
|
||||||
|
|
||||||
|
race, class, bodytype, and zone are a pipe | separated list of IDs.
|
||||||
|
|
||||||
|
== 01/31/2018 ==
|
||||||
|
Uleat: Re-work of Bot::AI_Process(). Overall behavior is much improved.
|
||||||
|
- Removed a 'ton' of unneeded packet updates
|
||||||
|
- Added a 'leash' to the distance a bot can travel
|
||||||
|
- Added a 'main assist' feature to target control (set using group roles)
|
||||||
|
- Added combat 'jitter' movement to complement the existing rogue movement
|
||||||
|
- Attack can now be aborted if target contains no leash owner nor bot hate and leash owner turns off auto-attack
|
||||||
|
- Please report any issues with the bot AI code
|
||||||
|
|
||||||
|
Added a work-around for heal rotations crashing the server - under certain conditions.
|
||||||
|
|
||||||
|
== 01/28/2018 ==
|
||||||
|
Mackal: Spell AI tweaks
|
||||||
|
|
||||||
|
AI spells are treated as "innate" spells (devs use this term, and I think this is what they mean by it)
|
||||||
|
These spells are spammed by the NPC, lots of encounters on live work like this and this will greatly reduce
|
||||||
|
the need to do quest scripting on these types of encounters.
|
||||||
|
|
||||||
|
You can safely run update npc_spells_entries set priority = priority + 1 where priority >= 0; if you want to disable this new behavior
|
||||||
|
|
||||||
|
== 10/08/2017 ==
|
||||||
|
Mackal: Rework regens
|
||||||
|
|
||||||
|
Regen will now match whats reported by modern clients, besides where they lie due to known bugs
|
||||||
|
|
||||||
|
HP and END regens are now based on the BaseData.txt values allowing easy customization
|
||||||
|
Those cases:
|
||||||
|
- The client always applies hunger penalties, it appears they don't exist anymore on live you can turn them on with a rule
|
||||||
|
- The way the client gets buff mana/end regen benefits incorrectly applies the bard mod making these values lie sometimes
|
||||||
|
|
||||||
|
== 9/17/2017 ==
|
||||||
|
Akkadius: Add model/race offset to FixZ calc (KLS)
|
||||||
|
Akkadius: Fix 95% of food/water consumption issues, if there are additional modifiers for race/class combos - those will need to be applied
|
||||||
|
|
||||||
|
Stages should be put in place if not already:
|
||||||
|
https://wiki.project1999.com/Food_and_drink#Stages_of_Hunger_and_Thirst
|
||||||
|
|
||||||
|
Values stored in the database are 0-6000, previously we capped it at 6000 but previous math would have normal values in the 60k+ range in order for food to be consumed at a reasonable rate. We are now using more native logic where 1 = 1 minute, following logic:
|
||||||
|
|
||||||
|
(Minutes)
|
||||||
|
0 - 5 - This is a snack.
|
||||||
|
6 - 20 - This is a meal.
|
||||||
|
21 - 30 - This is a hearty meal.
|
||||||
|
31 - 40 - This is a banquet size meal.
|
||||||
|
41 - 50 - This meal is a feast!
|
||||||
|
51 - 60 - This is an enduring meal!
|
||||||
|
61 - X - This is a miraculous meal!
|
||||||
|
|
||||||
|
== 7/14/2017 ==
|
||||||
|
Akkadius: HP Update tuning - HP Updates are now forced when a client is targeted
|
||||||
|
Akkadius: Client position updates should be smoother (granted the client has a good connection)
|
||||||
|
- Clients should also no longer randomly disappear
|
||||||
|
|
||||||
|
== 7/11/2017 ==
|
||||||
|
Akkadius: Raid/Group/XTarget HP/Mana/Endurance updates now only send when percentage changes
|
||||||
|
Akkadius: Raid/Group Mana/Endurance updates should now update real-time once again
|
||||||
|
Akkadius: Fixed an issue with clients looking like they are 'skipping' when they are moving in view of another client
|
||||||
|
Akkadius: Fixed an issue with NPC's who are ghosted in plain view of a client when they are not really there
|
||||||
|
|
||||||
|
== 7/9/2017 ==
|
||||||
|
Akkadius: Fix HP update issues, rework logic for more accurate HP updates
|
||||||
|
Akkadius: Massive reductions in unnecessary network traffic especially during high spam combat fights
|
||||||
|
- HP Updates now only send to others when HP percentage changes (0-100%)
|
||||||
|
- HP Updates were sending excessively even during idle zones when HP wasn't changing at all
|
||||||
|
- Attack animations now only send once per second versus up to a hundred times a second per Mob/Client
|
||||||
|
- 17,000 OP_ClientUpdate packets per second have been observed in combat scenarios, some of the major culprits have been
|
||||||
|
throttled without affecting what the client should see
|
||||||
|
- Before and After packet differences under similar load/tests (Packets per second)
|
||||||
|
- 7,000 - 8,000 OP_Animation pps After: 600-800 pps
|
||||||
|
- 13,0000 - 17,000 OP_MobHealth pps After: 1-10 pps
|
||||||
|
- 15,0000 - 20,000 OP_ClientUpdate pps After: 500-1,000 pps
|
||||||
|
- Packet reports from a 46 client test here:
|
||||||
|
https://gist.github.com/Akkadius/28b7ad2fdd82bdd15ea737c68f404346
|
||||||
|
- Servers who use Marquee HP updates will also recieve far less packet spam as they will only be sent when HP changes
|
||||||
|
|
||||||
|
== 7/1/2017 ==
|
||||||
|
Akkadius: Resolve issues with NPC's hopping to the ceiling in small corridors
|
||||||
|
Akkadius: Improved grounding issues with NPC's during combat
|
||||||
|
Akkadius: Improved scenarios where NPC's need to be dragged out of the ground - they should correct themselves far more consistently
|
||||||
|
- Scenarios where an NPC is coming up from the bottom floor, or from the top floor, they will correct much better
|
||||||
|
- A video of these tests can be found here: https://www.youtube.com/watch?v=HtC7bVNM7ZQ&feature=youtu.be
|
||||||
|
|
||||||
|
== 6/28/2017 ==
|
||||||
|
Akkadius: Fixed issues with Z correctness when NPCs are pathing on normal grids
|
||||||
|
Akkadius: Fixed issues with Z correctness when NPCs are engaged with players following
|
||||||
|
Akkadius: NPC corpses should fall into the ground far less
|
||||||
|
|
||||||
|
== 6/25/2017 ==
|
||||||
|
Akkadius: New rules made by developers are now automatically created when world boots up, this keeps
|
||||||
|
from having to issue schema SQL updates every time rules are added.
|
||||||
|
- Whenever a rule isn't present in the database, it will be automatically created
|
||||||
|
Akkadius: Sped up saylink retrieval x1000 helpful for dialogues, plugins with many saylinks
|
||||||
|
|
||||||
== 4/16/2017 ==
|
== 4/16/2017 ==
|
||||||
KLS: Merge eqstream branch
|
KLS: Merge eqstream branch
|
||||||
- UDP client stack completely rewritten should both have better throughput and recover better (peq has had far fewer reports of desyncs).
|
- UDP client stack completely rewritten should both have better throughput and recover better (peq has had far fewer reports of desyncs).
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
|||||||
SET(common_sources
|
SET(common_sources
|
||||||
base_packet.cpp
|
base_packet.cpp
|
||||||
classes.cpp
|
classes.cpp
|
||||||
|
compression.cpp
|
||||||
condition.cpp
|
condition.cpp
|
||||||
crash.cpp
|
crash.cpp
|
||||||
crc16.cpp
|
crc16.cpp
|
||||||
@@ -113,6 +114,7 @@ SET(common_headers
|
|||||||
base_data.h
|
base_data.h
|
||||||
bodytypes.h
|
bodytypes.h
|
||||||
classes.h
|
classes.h
|
||||||
|
compression.h
|
||||||
condition.h
|
condition.h
|
||||||
crash.h
|
crash.h
|
||||||
crc16.h
|
crc16.h
|
||||||
|
|||||||
+2
-2
@@ -24,8 +24,8 @@ struct BaseDataStruct
|
|||||||
double base_hp;
|
double base_hp;
|
||||||
double base_mana;
|
double base_mana;
|
||||||
double base_end;
|
double base_end;
|
||||||
double unk1;
|
double hp_regen;
|
||||||
double unk2;
|
double end_regen;
|
||||||
double hp_factor;
|
double hp_factor;
|
||||||
double mana_factor;
|
double mana_factor;
|
||||||
double endurance_factor;
|
double endurance_factor;
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
#include "global_define.h"
|
||||||
|
#include "types.h"
|
||||||
|
#include <string.h>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
namespace EQEmu
|
||||||
|
{
|
||||||
|
uint32 EstimateDeflateBuffer(uint32 len) {
|
||||||
|
z_stream zstream;
|
||||||
|
memset(&zstream, 0, sizeof(zstream));
|
||||||
|
|
||||||
|
zstream.zalloc = Z_NULL;
|
||||||
|
zstream.zfree = Z_NULL;
|
||||||
|
zstream.opaque = Z_NULL;
|
||||||
|
if (deflateInit(&zstream, Z_FINISH) != Z_OK)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return deflateBound(&zstream, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 DeflateData(const char *buffer, uint32 len, char *out_buffer, uint32 out_len_max) {
|
||||||
|
z_stream zstream;
|
||||||
|
memset(&zstream, 0, sizeof(zstream));
|
||||||
|
int zerror;
|
||||||
|
|
||||||
|
zstream.next_in = const_cast<unsigned char*>(reinterpret_cast<const unsigned char*>(buffer));
|
||||||
|
zstream.avail_in = len;
|
||||||
|
zstream.zalloc = Z_NULL;
|
||||||
|
zstream.zfree = Z_NULL;
|
||||||
|
zstream.opaque = Z_NULL;
|
||||||
|
deflateInit(&zstream, Z_FINISH);
|
||||||
|
|
||||||
|
zstream.next_out = reinterpret_cast<unsigned char*>(out_buffer);
|
||||||
|
zstream.avail_out = out_len_max;
|
||||||
|
zerror = deflate(&zstream, Z_FINISH);
|
||||||
|
|
||||||
|
if (zerror == Z_STREAM_END)
|
||||||
|
{
|
||||||
|
deflateEnd(&zstream);
|
||||||
|
return (uint32)zstream.total_out;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
zerror = deflateEnd(&zstream);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 InflateData(const char* buffer, uint32 len, char* out_buffer, uint32 out_len_max) {
|
||||||
|
z_stream zstream;
|
||||||
|
int zerror = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
zstream.next_in = const_cast<unsigned char*>(reinterpret_cast<const unsigned char*>(buffer));
|
||||||
|
zstream.avail_in = len;
|
||||||
|
zstream.next_out = reinterpret_cast<unsigned char*>(out_buffer);;
|
||||||
|
zstream.avail_out = out_len_max;
|
||||||
|
zstream.zalloc = Z_NULL;
|
||||||
|
zstream.zfree = Z_NULL;
|
||||||
|
zstream.opaque = Z_NULL;
|
||||||
|
|
||||||
|
i = inflateInit2(&zstream, 15);
|
||||||
|
if (i != Z_OK) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
zerror = inflate(&zstream, Z_FINISH);
|
||||||
|
if (zerror == Z_STREAM_END) {
|
||||||
|
inflateEnd(&zstream);
|
||||||
|
return zstream.total_out;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (zerror == -4 && zstream.msg == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
zerror = inflateEnd(&zstream);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace EQEmu
|
||||||
|
{
|
||||||
|
uint32 EstimateDeflateBuffer(uint32 len);
|
||||||
|
uint32 DeflateData(const char *buffer, uint32 len, char *out_buffer, uint32 out_len_max);
|
||||||
|
uint32 InflateData(const char* buffer, uint32 len, char* out_buffer, uint32 out_len_max);
|
||||||
|
}
|
||||||
@@ -472,16 +472,6 @@ bool Database::CheckDatabaseConversions() {
|
|||||||
CheckDatabaseConvertPPDeblob();
|
CheckDatabaseConvertPPDeblob();
|
||||||
CheckDatabaseConvertCorpseDeblob();
|
CheckDatabaseConvertCorpseDeblob();
|
||||||
|
|
||||||
/* Fetch EQEmu Server script */
|
|
||||||
if (!std::ifstream("eqemu_server.pl")){
|
|
||||||
std::cout << "Pulling down automatic database upgrade script..." << std::endl;
|
|
||||||
#ifdef _WIN32
|
|
||||||
system("perl -MLWP::UserAgent -e \"require LWP::UserAgent; my $ua = LWP::UserAgent->new; $ua->timeout(10); $ua->env_proxy; my $response = $ua->get('https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/eqemu_server.pl'); if ($response->is_success){ open(FILE, '> eqemu_server.pl'); print FILE $response->decoded_content; close(FILE); }\"");
|
|
||||||
#else
|
|
||||||
system("wget --no-check-certificate -O eqemu_server.pl https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/eqemu_server.pl");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Run EQEmu Server script (Checks for database updates) */
|
/* Run EQEmu Server script (Checks for database updates) */
|
||||||
system("perl eqemu_server.pl ran_from_world");
|
system("perl eqemu_server.pl ran_from_world");
|
||||||
|
|
||||||
|
|||||||
@@ -18,3 +18,68 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "emu_constants.h"
|
#include "emu_constants.h"
|
||||||
|
|
||||||
|
|
||||||
|
const char* EQEmu::bug::CategoryIDToCategoryName(CategoryID category_id) {
|
||||||
|
switch (category_id) {
|
||||||
|
case catVideo:
|
||||||
|
return "Video";
|
||||||
|
case catAudio:
|
||||||
|
return "Audio";
|
||||||
|
case catPathing:
|
||||||
|
return "Pathing";
|
||||||
|
case catQuest:
|
||||||
|
return "Quest";
|
||||||
|
case catTradeskills:
|
||||||
|
return "Tradeskills";
|
||||||
|
case catSpellStacking:
|
||||||
|
return "Spell stacking";
|
||||||
|
case catDoorsPortals:
|
||||||
|
return "Doors/Portals";
|
||||||
|
case catItems:
|
||||||
|
return "Items";
|
||||||
|
case catNPC:
|
||||||
|
return "NPC";
|
||||||
|
case catDialogs:
|
||||||
|
return "Dialogs";
|
||||||
|
case catLoNTCG:
|
||||||
|
return "LoN - TCG";
|
||||||
|
case catMercenaries:
|
||||||
|
return "Mercenaries";
|
||||||
|
case catOther:
|
||||||
|
default:
|
||||||
|
return "Other";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EQEmu::bug::CategoryID EQEmu::bug::CategoryNameToCategoryID(const char* category_name) {
|
||||||
|
if (!category_name)
|
||||||
|
return catOther;
|
||||||
|
|
||||||
|
if (!strcmp(category_name, "Video"))
|
||||||
|
return catVideo;
|
||||||
|
if (!strcmp(category_name, "Audio"))
|
||||||
|
return catAudio;
|
||||||
|
if (!strcmp(category_name, "Pathing"))
|
||||||
|
return catPathing;
|
||||||
|
if (!strcmp(category_name, "Quest"))
|
||||||
|
return catQuest;
|
||||||
|
if (!strcmp(category_name, "Tradeskills"))
|
||||||
|
return catTradeskills;
|
||||||
|
if (!strcmp(category_name, "Spell stacking"))
|
||||||
|
return catSpellStacking;
|
||||||
|
if (!strcmp(category_name, "Doors/Portals"))
|
||||||
|
return catDoorsPortals;
|
||||||
|
if (!strcmp(category_name, "Items"))
|
||||||
|
return catItems;
|
||||||
|
if (!strcmp(category_name, "NPC"))
|
||||||
|
return catNPC;
|
||||||
|
if (!strcmp(category_name, "Dialogs"))
|
||||||
|
return catDialogs;
|
||||||
|
if (!strcmp(category_name, "LoN - TCG"))
|
||||||
|
return catLoNTCG;
|
||||||
|
if (!strcmp(category_name, "Mercenaries"))
|
||||||
|
return catMercenaries;
|
||||||
|
|
||||||
|
return catOther;
|
||||||
|
}
|
||||||
|
|||||||
+36
-1
@@ -24,7 +24,7 @@
|
|||||||
#include "emu_legacy.h"
|
#include "emu_legacy.h"
|
||||||
#include "emu_versions.h"
|
#include "emu_versions.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
namespace EQEmu
|
namespace EQEmu
|
||||||
@@ -114,7 +114,11 @@ namespace EQEmu
|
|||||||
const EQEmu::versions::ClientVersion CharacterCreationClient = EQEmu::versions::ClientVersion::RoF2;
|
const EQEmu::versions::ClientVersion CharacterCreationClient = EQEmu::versions::ClientVersion::RoF2;
|
||||||
const size_t CharacterCreationMax = RoF2::constants::CharacterCreationLimit;
|
const size_t CharacterCreationMax = RoF2::constants::CharacterCreationLimit;
|
||||||
|
|
||||||
|
const size_t SayLinkOpenerSize = 1;
|
||||||
const size_t SayLinkBodySize = RoF2::constants::SayLinkBodySize;
|
const size_t SayLinkBodySize = RoF2::constants::SayLinkBodySize;
|
||||||
|
const size_t SayLinkTextSize = 256; // this may be varied until it breaks something (tested:374) - the others are constant
|
||||||
|
const size_t SayLinkCloserSize = 1;
|
||||||
|
const size_t SayLinkMaximumSize = (SayLinkOpenerSize + SayLinkBodySize + SayLinkTextSize + SayLinkCloserSize);
|
||||||
|
|
||||||
const int LongBuffs = RoF2::constants::LongBuffs;
|
const int LongBuffs = RoF2::constants::LongBuffs;
|
||||||
const int ShortBuffs = RoF2::constants::ShortBuffs;
|
const int ShortBuffs = RoF2::constants::ShortBuffs;
|
||||||
@@ -126,6 +130,37 @@ namespace EQEmu
|
|||||||
|
|
||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
|
||||||
|
namespace bug {
|
||||||
|
enum CategoryID : uint32 {
|
||||||
|
catOther = 0,
|
||||||
|
catVideo,
|
||||||
|
catAudio,
|
||||||
|
catPathing,
|
||||||
|
catQuest,
|
||||||
|
catTradeskills,
|
||||||
|
catSpellStacking,
|
||||||
|
catDoorsPortals,
|
||||||
|
catItems,
|
||||||
|
catNPC,
|
||||||
|
catDialogs,
|
||||||
|
catLoNTCG,
|
||||||
|
catMercenaries
|
||||||
|
};
|
||||||
|
|
||||||
|
enum OptionalInfoFlag : uint32 {
|
||||||
|
infoNoOptionalInfo = 0x0,
|
||||||
|
infoCanDuplicate = 0x1,
|
||||||
|
infoCrashBug = 0x2,
|
||||||
|
infoTargetInfo = 0x4,
|
||||||
|
infoCharacterFlags = 0x8,
|
||||||
|
infoUnknownValue = 0xFFFFFFF0
|
||||||
|
};
|
||||||
|
|
||||||
|
const char* CategoryIDToCategoryName(CategoryID category_id);
|
||||||
|
CategoryID CategoryNameToCategoryID(const char* category_name);
|
||||||
|
|
||||||
|
} // namespace bug
|
||||||
|
|
||||||
enum class CastingSlot : uint32 {
|
enum class CastingSlot : uint32 {
|
||||||
Gem1 = 0,
|
Gem1 = 0,
|
||||||
Gem2 = 1,
|
Gem2 = 1,
|
||||||
|
|||||||
+2
-2
@@ -78,6 +78,8 @@ namespace EQEmu
|
|||||||
SLOT_CURSOR_BAG_END = 340,
|
SLOT_CURSOR_BAG_END = 340,
|
||||||
SLOT_TRIBUTE_BEGIN = 400,
|
SLOT_TRIBUTE_BEGIN = 400,
|
||||||
SLOT_TRIBUTE_END = 404,
|
SLOT_TRIBUTE_END = 404,
|
||||||
|
SLOT_GUILD_TRIBUTE_BEGIN = 450,
|
||||||
|
SLOT_GUILD_TRIBUTE_END = 451,
|
||||||
SLOT_BANK_BEGIN = 2000,
|
SLOT_BANK_BEGIN = 2000,
|
||||||
SLOT_BANK_END = 2023,
|
SLOT_BANK_END = 2023,
|
||||||
SLOT_BANK_BAGS_BEGIN = 2031,
|
SLOT_BANK_BAGS_BEGIN = 2031,
|
||||||
@@ -173,8 +175,6 @@ namespace EQEmu
|
|||||||
|
|
||||||
// POTION_BELT_SIZE sets maximum limit..active limit will need to be handled by the appropriate AA or spell (or item?)
|
// POTION_BELT_SIZE sets maximum limit..active limit will need to be handled by the appropriate AA or spell (or item?)
|
||||||
static const size_t POTION_BELT_ITEM_COUNT = 5;
|
static const size_t POTION_BELT_ITEM_COUNT = 5;
|
||||||
|
|
||||||
static const size_t TEXT_LINK_BODY_LENGTH = 56;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ N(OP_AcceptNewTask),
|
|||||||
N(OP_AckPacket),
|
N(OP_AckPacket),
|
||||||
N(OP_Action),
|
N(OP_Action),
|
||||||
N(OP_Action2),
|
N(OP_Action2),
|
||||||
|
N(OP_AddNimbusEffect),
|
||||||
N(OP_AdventureData),
|
N(OP_AdventureData),
|
||||||
N(OP_AdventureDetails),
|
N(OP_AdventureDetails),
|
||||||
N(OP_AdventureFinish),
|
N(OP_AdventureFinish),
|
||||||
@@ -339,6 +340,7 @@ N(OP_MOTD),
|
|||||||
N(OP_MoveCoin),
|
N(OP_MoveCoin),
|
||||||
N(OP_MoveDoor),
|
N(OP_MoveDoor),
|
||||||
N(OP_MoveItem),
|
N(OP_MoveItem),
|
||||||
|
N(OP_MoveMultipleItems),
|
||||||
N(OP_MoveLogDisregard),
|
N(OP_MoveLogDisregard),
|
||||||
N(OP_MoveLogRequest),
|
N(OP_MoveLogRequest),
|
||||||
N(OP_MultiLineMsg),
|
N(OP_MultiLineMsg),
|
||||||
@@ -391,6 +393,7 @@ N(OP_PVPLeaderBoardReply),
|
|||||||
N(OP_PVPLeaderBoardRequest),
|
N(OP_PVPLeaderBoardRequest),
|
||||||
N(OP_PVPStats),
|
N(OP_PVPStats),
|
||||||
N(OP_QueryResponseThing),
|
N(OP_QueryResponseThing),
|
||||||
|
N(OP_QueryUCSServerStatus),
|
||||||
N(OP_RaidInvite),
|
N(OP_RaidInvite),
|
||||||
N(OP_RaidJoin),
|
N(OP_RaidJoin),
|
||||||
N(OP_RaidUpdate),
|
N(OP_RaidUpdate),
|
||||||
@@ -408,6 +411,7 @@ N(OP_ReloadUI),
|
|||||||
N(OP_RemoveAllDoors),
|
N(OP_RemoveAllDoors),
|
||||||
N(OP_RemoveBlockedBuffs),
|
N(OP_RemoveBlockedBuffs),
|
||||||
N(OP_RemoveNimbusEffect),
|
N(OP_RemoveNimbusEffect),
|
||||||
|
N(OP_RemoveTrap),
|
||||||
N(OP_Report),
|
N(OP_Report),
|
||||||
N(OP_ReqClientSpawn),
|
N(OP_ReqClientSpawn),
|
||||||
N(OP_ReqNewZone),
|
N(OP_ReqNewZone),
|
||||||
@@ -523,6 +527,7 @@ N(OP_TributeToggle),
|
|||||||
N(OP_TributeUpdate),
|
N(OP_TributeUpdate),
|
||||||
N(OP_Untargetable),
|
N(OP_Untargetable),
|
||||||
N(OP_UpdateAA),
|
N(OP_UpdateAA),
|
||||||
|
N(OP_UpdateAura),
|
||||||
N(OP_UpdateLeadershipAA),
|
N(OP_UpdateLeadershipAA),
|
||||||
N(OP_VetClaimReply),
|
N(OP_VetClaimReply),
|
||||||
N(OP_VetClaimRequest),
|
N(OP_VetClaimRequest),
|
||||||
|
|||||||
+16
-2
@@ -28,7 +28,7 @@
|
|||||||
namespace EQEmu
|
namespace EQEmu
|
||||||
{
|
{
|
||||||
namespace versions {
|
namespace versions {
|
||||||
enum class ClientVersion {
|
enum class ClientVersion : uint32 {
|
||||||
Unknown = 0,
|
Unknown = 0,
|
||||||
Client62, // Build: 'Aug 4 2005 15:40:59'
|
Client62, // Build: 'Aug 4 2005 15:40:59'
|
||||||
Titanium, // Build: 'Oct 31 2005 10:33:37'
|
Titanium, // Build: 'Oct 31 2005 10:33:37'
|
||||||
@@ -72,7 +72,7 @@ namespace EQEmu
|
|||||||
uint32 ConvertClientVersionToExpansion(ClientVersion client_version);
|
uint32 ConvertClientVersionToExpansion(ClientVersion client_version);
|
||||||
|
|
||||||
|
|
||||||
enum class MobVersion {
|
enum class MobVersion : uint32 {
|
||||||
Unknown = 0,
|
Unknown = 0,
|
||||||
Client62,
|
Client62,
|
||||||
Titanium,
|
Titanium,
|
||||||
@@ -121,6 +121,20 @@ namespace EQEmu
|
|||||||
ClientVersion ConvertOfflinePCMobVersionToClientVersion(MobVersion mob_version);
|
ClientVersion ConvertOfflinePCMobVersionToClientVersion(MobVersion mob_version);
|
||||||
MobVersion ConvertClientVersionToOfflinePCMobVersion(ClientVersion client_version);
|
MobVersion ConvertClientVersionToOfflinePCMobVersion(ClientVersion client_version);
|
||||||
|
|
||||||
|
|
||||||
|
enum UCSVersion : char {
|
||||||
|
ucsUnknown = '\0',
|
||||||
|
ucsClient62Chat = 'A',
|
||||||
|
ucsClient62Mail = 'a',
|
||||||
|
ucsTitaniumChat = 'B',
|
||||||
|
ucsTitaniumMail = 'b',
|
||||||
|
ucsSoFCombined = 'C',
|
||||||
|
ucsSoDCombined = 'D',
|
||||||
|
ucsUFCombined = 'E',
|
||||||
|
ucsRoFCombined = 'F',
|
||||||
|
ucsRoF2Combined = 'G'
|
||||||
|
};
|
||||||
|
|
||||||
} /*versions*/
|
} /*versions*/
|
||||||
|
|
||||||
} /*EQEmu*/
|
} /*EQEmu*/
|
||||||
|
|||||||
+22
-18
@@ -27,7 +27,7 @@
|
|||||||
//SpawnAppearance types: (compared two clients for server-originating types: SoF & RoF2)
|
//SpawnAppearance types: (compared two clients for server-originating types: SoF & RoF2)
|
||||||
#define AT_Die 0 // this causes the client to keel over and zone to bind point (default action)
|
#define AT_Die 0 // this causes the client to keel over and zone to bind point (default action)
|
||||||
#define AT_WhoLevel 1 // the level that shows up on /who
|
#define AT_WhoLevel 1 // the level that shows up on /who
|
||||||
//#define AT_2 2 // unknown
|
#define AT_HPMax 2 // idk
|
||||||
#define AT_Invis 3 // 0 = visible, 1 = invisible
|
#define AT_Invis 3 // 0 = visible, 1 = invisible
|
||||||
#define AT_PVP 4 // 0 = blue, 1 = pvp (red)
|
#define AT_PVP 4 // 0 = blue, 1 = pvp (red)
|
||||||
#define AT_Light 5 // light type emitted by player (lightstone, shiny shield)
|
#define AT_Light 5 // light type emitted by player (lightstone, shiny shield)
|
||||||
@@ -36,33 +36,37 @@
|
|||||||
#define AT_SpawnID 16 // server to client, sets player spawn id
|
#define AT_SpawnID 16 // server to client, sets player spawn id
|
||||||
#define AT_HP 17 // Client->Server, my HP has changed (like regen tic)
|
#define AT_HP 17 // Client->Server, my HP has changed (like regen tic)
|
||||||
#define AT_Linkdead 18 // 0 = normal, 1 = linkdead
|
#define AT_Linkdead 18 // 0 = normal, 1 = linkdead
|
||||||
#define AT_Levitate 19 // 0=off, 1=flymode, 2=levitate
|
#define AT_Levitate 19 // 0=off, 1=flymode, 2=levitate max 5, see GravityBehavior enum
|
||||||
#define AT_GM 20 // 0 = normal, 1 = GM - all odd numbers seem to make it GM
|
#define AT_GM 20 // 0 = normal, 1 = GM - all odd numbers seem to make it GM
|
||||||
#define AT_Anon 21 // 0 = normal, 1 = anon, 2 = roleplay
|
#define AT_Anon 21 // 0 = normal, 1 = anon, 2 = roleplay
|
||||||
#define AT_GuildID 22
|
#define AT_GuildID 22
|
||||||
#define AT_GuildRank 23 // 0=member, 1=officer, 2=leader
|
#define AT_GuildRank 23 // 0=member, 1=officer, 2=leader
|
||||||
#define AT_AFK 24 // 0 = normal, 1 = afk
|
#define AT_AFK 24 // 0 = normal, 1 = afk
|
||||||
#define AT_Pet 25 // Param is EntityID of owner, or 0 for when charm breaks
|
#define AT_Pet 25 // Param is EntityID of owner, or 0 for when charm breaks
|
||||||
//#define AT_27 27 // unknown
|
#define AT_Summoned 27 // Unsure
|
||||||
#define AT_Split 28 // 0 = normal, 1 = autosplit on (not showing in SoF+) (client-to-server only)
|
#define AT_Split 28 // 0 = normal, 1 = autosplit on (not showing in SoF+) (client-to-server only)
|
||||||
#define AT_Size 29 // spawn's size (present: SoF, absent: RoF2)
|
#define AT_Size 29 // spawn's size (present: SoF, absent: RoF2)
|
||||||
//#define AT_30 30 // unknown
|
#define AT_SetType 30 // 0 = PC, 1 = NPC, 2 <= = corpse
|
||||||
#define AT_NPCName 31 // change PC's name's color to NPC color 0 = normal, 1 = npc name
|
#define AT_NPCName 31 // change PC's name's color to NPC color 0 = normal, 1 = npc name, Trader on RoF2?
|
||||||
//#define AT_32 32 // unknown
|
#define AT_AARank 32 // AA Rank Title ID thingy, does is this the title in /who?
|
||||||
//#define AT_33 33 // unknown
|
#define AT_CancelSneakHide 33 // Turns off Hide and Sneak
|
||||||
//#define AT_34 34 // unknown (present: SoF, absent: RoF2)
|
//#define AT_34 34 // unknown (present: SoF, absent: RoF2)
|
||||||
//#define AT_35 35 // unknown
|
#define AT_AreaHPRegen 35 // guild hall regen pool sets to value * 0.001
|
||||||
//#define AT_36 36 // unknown
|
#define AT_AreaManaRegen 36 // guild hall regen pool sets to value * 0.001
|
||||||
//#define AT_37 37 // unknown
|
#define AT_AreaEndRegen 37 // guild hall regen pool sets to value * 0.001
|
||||||
//#define AT_38 38 // unknown
|
#define AT_FreezeBuffs 38 // Freezes beneficial buff timers
|
||||||
//#define AT_39 39 // unknown
|
#define AT_NpcTintIndex 39 // not 100% sure
|
||||||
|
#define AT_GroupConsent 40 // auto consent group
|
||||||
|
#define AT_RaidConsent 41 // auto consent raid
|
||||||
|
#define AT_GuildConsent 42 // auto consent guild
|
||||||
#define AT_ShowHelm 43 // 0 = hide graphic, 1 = show graphic
|
#define AT_ShowHelm 43 // 0 = hide graphic, 1 = show graphic
|
||||||
#define AT_DamageState 44 // The damage state of a destructible object (0 through 4)
|
#define AT_DamageState 44 // The damage state of a destructible object (0 through 10) plays soundids most only have 2 or 4 states though
|
||||||
//#define AT_46 46 // unknown
|
#define AT_EQPlayers 45 // /eqplayersupdate
|
||||||
//#define AT_48 48 // unknown
|
#define AT_FindBits 46 // set FindBits, whatever those are!
|
||||||
//#define AT_49 49 // unknown
|
#define AT_TextureType 48 // TextureType
|
||||||
//#define AT_52 52 // (absent: SoF, present: RoF2) (not a replacement for RoF absent 29 or 34)
|
#define AT_FacePick 49 // Turns off face pick window? maybe ...
|
||||||
//#define AT_53 53 // (absent: SoF, present: RoF2) (not a replacement for RoF absent 29 or 34)
|
#define AT_GuildShow 52 // this is what MQ2 call sit, not sure
|
||||||
|
#define AT_Offline 53 // Offline mode
|
||||||
|
|
||||||
//#define AT_Trader 300 // Bazaar Trader Mode (not present in SoF or RoF2)
|
//#define AT_Trader 300 // Bazaar Trader Mode (not present in SoF or RoF2)
|
||||||
|
|
||||||
|
|||||||
+100
-48
@@ -280,7 +280,7 @@ union
|
|||||||
// horse: 0=brown, 1=white, 2=black, 3=tan
|
// horse: 0=brown, 1=white, 2=black, 3=tan
|
||||||
};
|
};
|
||||||
/*0340*/ uint32 spawnId; // Spawn Id
|
/*0340*/ uint32 spawnId; // Spawn Id
|
||||||
/*0344*/ uint8 unknown0344[3];
|
/*0344*/ float bounding_radius; // used in melee, overrides calc
|
||||||
/*0347*/ uint8 IsMercenary;
|
/*0347*/ uint8 IsMercenary;
|
||||||
/*0348*/ EQEmu::TintProfile equipment_tint;
|
/*0348*/ EQEmu::TintProfile equipment_tint;
|
||||||
/*0384*/ uint8 lfg; // 0=off, 1=lfg on
|
/*0384*/ uint8 lfg; // 0=off, 1=lfg on
|
||||||
@@ -305,6 +305,7 @@ union
|
|||||||
uint8 DestructibleUnk8;
|
uint8 DestructibleUnk8;
|
||||||
uint32 DestructibleUnk9;
|
uint32 DestructibleUnk9;
|
||||||
bool targetable_with_hotkey;
|
bool targetable_with_hotkey;
|
||||||
|
bool show_name;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -550,6 +551,7 @@ struct BlockedBuffs_Struct
|
|||||||
/*86*/ uint16 Flags;
|
/*86*/ uint16 Flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// same for adding
|
||||||
struct RemoveNimbusEffect_Struct
|
struct RemoveNimbusEffect_Struct
|
||||||
{
|
{
|
||||||
/*00*/ uint32 spawnid; // Spawn ID
|
/*00*/ uint32 spawnid; // Spawn ID
|
||||||
@@ -853,6 +855,7 @@ static const uint32 MAX_PP_REF_SPELLBOOK = 480; // Set for Player Profile size r
|
|||||||
static const uint32 MAX_PP_REF_MEMSPELL = 9; // Set for Player Profile size retain
|
static const uint32 MAX_PP_REF_MEMSPELL = 9; // Set for Player Profile size retain
|
||||||
|
|
||||||
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
||||||
|
static const uint32 MAX_PP_INNATE_SKILL = 25;
|
||||||
static const uint32 MAX_PP_AA_ARRAY = 240;
|
static const uint32 MAX_PP_AA_ARRAY = 240;
|
||||||
static const uint32 MAX_GROUP_MEMBERS = 6;
|
static const uint32 MAX_GROUP_MEMBERS = 6;
|
||||||
static const uint32 MAX_RECAST_TYPES = 20;
|
static const uint32 MAX_RECAST_TYPES = 20;
|
||||||
@@ -992,7 +995,8 @@ struct PlayerProfile_Struct
|
|||||||
/*4768*/ int32 platinum_shared; // Platinum shared between characters
|
/*4768*/ int32 platinum_shared; // Platinum shared between characters
|
||||||
/*4772*/ uint8 unknown4808[24];
|
/*4772*/ uint8 unknown4808[24];
|
||||||
/*4796*/ uint32 skills[MAX_PP_SKILL]; // [400] List of skills // 100 dword buffer
|
/*4796*/ uint32 skills[MAX_PP_SKILL]; // [400] List of skills // 100 dword buffer
|
||||||
/*5196*/ uint8 unknown5132[184];
|
/*5196*/ uint32 InnateSkills[MAX_PP_INNATE_SKILL];
|
||||||
|
/*5296*/ uint8 unknown5132[84];
|
||||||
/*5380*/ uint32 pvp2; //
|
/*5380*/ uint32 pvp2; //
|
||||||
/*5384*/ uint32 unknown5420; //
|
/*5384*/ uint32 unknown5420; //
|
||||||
/*5388*/ uint32 pvptype; //
|
/*5388*/ uint32 pvptype; //
|
||||||
@@ -1249,21 +1253,22 @@ struct Action_Struct
|
|||||||
{
|
{
|
||||||
/* 00 */ uint16 target; // id of target
|
/* 00 */ uint16 target; // id of target
|
||||||
/* 02 */ uint16 source; // id of caster
|
/* 02 */ uint16 source; // id of caster
|
||||||
/* 04 */ uint16 level; // level of caster
|
/* 04 */ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level
|
||||||
/* 06 */ uint16 instrument_mod;
|
/* 06 */ uint32 instrument_mod; // OSX dump says base damage, spells use it for bard song (different from newer clients)
|
||||||
/* 08 */ uint32 bard_focus_id;
|
/* 10 */ float force;
|
||||||
/* 12 */ uint16 unknown16;
|
/* 14 */ float hit_heading;
|
||||||
// some kind of sequence that's the same in both actions
|
/* 18 */ float hit_pitch;
|
||||||
// as well as the combat damage, to tie em together?
|
/* 22 */ uint8 type; // 231 (0xE7) for spells, skill
|
||||||
/* 14 */ uint32 sequence;
|
/* 23 */ uint16 unknown23; // OSX says min_damage
|
||||||
/* 18 */ uint32 unknown18;
|
/* 25 */ uint16 unknown25; // OSX says tohit
|
||||||
/* 22 */ uint8 type; // 231 (0xE7) for spells
|
|
||||||
/* 23 */ uint32 unknown23;
|
|
||||||
/* 27 */ uint16 spell; // spell id being cast
|
/* 27 */ uint16 spell; // spell id being cast
|
||||||
/* 29 */ uint8 unknown29;
|
/* 29 */ uint8 spell_level;
|
||||||
// this field seems to be some sort of success flag, if it's 4
|
// this field seems to be some sort of success flag, if it's 4
|
||||||
/* 30 */ uint8 buff_unknown; // if this is 4, a buff icon is made
|
/* 30 */ uint8 effect_flag; // if this is 4, a buff icon is made
|
||||||
/* 31 */
|
// newer clients have some data for setting LaunchSpellData when effect_flag & 4
|
||||||
|
// /* 31 */ uint8 spell_gem;
|
||||||
|
// /* 32 */ uint32 inventory_slot;
|
||||||
|
// /* 36 */ uint32 item_cast_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
// this is what prints the You have been struck. and the regular
|
// this is what prints the You have been struck. and the regular
|
||||||
@@ -1273,12 +1278,12 @@ struct CombatDamage_Struct
|
|||||||
{
|
{
|
||||||
/* 00 */ uint16 target;
|
/* 00 */ uint16 target;
|
||||||
/* 02 */ uint16 source;
|
/* 02 */ uint16 source;
|
||||||
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells
|
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells, skill
|
||||||
/* 05 */ uint16 spellid;
|
/* 05 */ uint16 spellid;
|
||||||
/* 07 */ uint32 damage;
|
/* 07 */ uint32 damage;
|
||||||
/* 11 */ float force;
|
/* 11 */ float force;
|
||||||
/* 15 */ float meleepush_xy; // see above notes in Action_Struct
|
/* 15 */ float hit_heading; // see above notes in Action_Struct
|
||||||
/* 19 */ float meleepush_z;
|
/* 19 */ float hit_pitch;
|
||||||
/* 23 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage
|
/* 23 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3319,23 +3324,32 @@ struct GuildMakeLeader{
|
|||||||
char target[64];
|
char target[64];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct BugStruct{
|
struct BugReport_Struct {
|
||||||
/*0000*/ char chartype[64];
|
/*0000*/ uint32 category_id;
|
||||||
/*0064*/ char name[96];
|
/*0004*/ char category_name[64];
|
||||||
/*0160*/ char ui[128];
|
/*0068*/ char reporter_name[64];
|
||||||
/*0288*/ float x;
|
/*0132*/ char unused_0132[32];
|
||||||
/*0292*/ float y;
|
/*0164*/ char ui_path[128];
|
||||||
/*0296*/ float z;
|
/*0292*/ float pos_x;
|
||||||
/*0300*/ float heading;
|
/*0296*/ float pos_y;
|
||||||
/*0304*/ uint32 unknown304;
|
/*0300*/ float pos_z;
|
||||||
/*0308*/ char unknown308[160];
|
/*0304*/ uint32 heading;
|
||||||
/*0468*/ char target_name[64];
|
/*0308*/ uint32 unused_0308;
|
||||||
/*0532*/ uint32 type;
|
/*0312*/ uint32 time_played;
|
||||||
/*0536*/ char unknown536[2052];
|
/*0316*/ char padding_0316[8];
|
||||||
/*2584*/ char bug[2048];
|
/*0324*/ uint32 target_id;
|
||||||
/*4632*/ char unknown4632[6];
|
/*0328*/ char padding_0328[140];
|
||||||
/*4638*/ char system_info[4094];
|
/*0468*/ uint32 unknown_0468; // seems to always be '0'
|
||||||
|
/*0472*/ char target_name[64];
|
||||||
|
/*0536*/ uint32 optional_info_mask;
|
||||||
|
|
||||||
|
// this looks like a butchered 8k buffer with 2 trailing dword fields
|
||||||
|
/*0540*/ char unused_0540[2052];
|
||||||
|
/*2592*/ char bug_report[2050];
|
||||||
|
/*4642*/ char system_info[4098];
|
||||||
|
/*8740*/
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Make_Pet_Struct { //Simple struct for getting pet info
|
struct Make_Pet_Struct { //Simple struct for getting pet info
|
||||||
uint8 level;
|
uint8 level;
|
||||||
uint8 class_;
|
uint8 class_;
|
||||||
@@ -3362,20 +3376,21 @@ struct Ground_Spawn{
|
|||||||
struct Ground_Spawns {
|
struct Ground_Spawns {
|
||||||
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
||||||
};
|
};
|
||||||
struct PetitionBug_Struct{
|
|
||||||
uint32 petition_number;
|
//struct PetitionBug_Struct{
|
||||||
uint32 unknown4;
|
// uint32 petition_number;
|
||||||
char accountname[64];
|
// uint32 unknown4;
|
||||||
uint32 zoneid;
|
// char accountname[64];
|
||||||
char name[64];
|
// uint32 zoneid;
|
||||||
uint32 level;
|
// char name[64];
|
||||||
uint32 class_;
|
// uint32 level;
|
||||||
uint32 race;
|
// uint32 class_;
|
||||||
uint32 unknown152[3];
|
// uint32 race;
|
||||||
uint32 time;
|
// uint32 unknown152[3];
|
||||||
uint32 unknown168;
|
// uint32 time;
|
||||||
char text[1028];
|
// uint32 unknown168;
|
||||||
};
|
// char text[1028];
|
||||||
|
//};
|
||||||
|
|
||||||
struct ApproveZone_Struct {
|
struct ApproveZone_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
@@ -4763,6 +4778,7 @@ struct BuffIconEntry_Struct
|
|||||||
uint32 spell_id;
|
uint32 spell_id;
|
||||||
int32 tics_remaining;
|
int32 tics_remaining;
|
||||||
uint32 num_hits;
|
uint32 num_hits;
|
||||||
|
char caster[64];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct BuffIcon_Struct
|
struct BuffIcon_Struct
|
||||||
@@ -4772,6 +4788,7 @@ struct BuffIcon_Struct
|
|||||||
uint16 count;
|
uint16 count;
|
||||||
uint8 type; // 0 = self buff window, 1 = self target window, 4 = group, 5 = PC, 7 = NPC
|
uint8 type; // 0 = self buff window, 1 = self target window, 4 = group, 5 = PC, 7 = NPC
|
||||||
int32 tic_timer;
|
int32 tic_timer;
|
||||||
|
int32 name_lengths; // so ahh we kind of do these packets hacky, this is the total length of all the names to make creating the real packets in the translators easier
|
||||||
BuffIconEntry_Struct entries[0];
|
BuffIconEntry_Struct entries[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -5332,6 +5349,41 @@ struct fling_struct {
|
|||||||
/* 28 */
|
/* 28 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// used when action == 0
|
||||||
|
struct AuraCreate_Struct {
|
||||||
|
/* 00 */ uint32 action; // 0 = add, 1 = delete, 2 = reset
|
||||||
|
/* 04 */ uint32 type; // unsure -- normal auras show 1 clicky (ex. Circle of Power) show 0
|
||||||
|
/* 08 */ char aura_name[64];
|
||||||
|
/* 72 */ uint32 entity_id;
|
||||||
|
/* 76 */ uint32 icon;
|
||||||
|
/* 80 */
|
||||||
|
};
|
||||||
|
|
||||||
|
// used when action == 1
|
||||||
|
struct AuraDestory_Struct {
|
||||||
|
/* 00 */ uint32 action; // 0 = add, 1 = delete, 2 = reset
|
||||||
|
/* 04 */ uint32 entity_id;
|
||||||
|
/* 08 */
|
||||||
|
};
|
||||||
|
// I think we can assume it's just action for 2, client doesn't seem to do anything with the rest of the data in that case
|
||||||
|
|
||||||
|
struct SayLinkBodyFrame_Struct {
|
||||||
|
/*000*/ char ActionID[1];
|
||||||
|
/*001*/ char ItemID[5];
|
||||||
|
/*006*/ char Augment1[5];
|
||||||
|
/*011*/ char Augment2[5];
|
||||||
|
/*016*/ char Augment3[5];
|
||||||
|
/*021*/ char Augment4[5];
|
||||||
|
/*026*/ char Augment5[5];
|
||||||
|
/*031*/ char Augment6[5];
|
||||||
|
/*036*/ char IsEvolving[1];
|
||||||
|
/*037*/ char EvolveGroup[4];
|
||||||
|
/*041*/ char EvolveLevel[2];
|
||||||
|
/*043*/ char OrnamentIcon[5];
|
||||||
|
/*048*/ char Hash[8];
|
||||||
|
/*056*/
|
||||||
|
};
|
||||||
|
|
||||||
// Restore structure packing to default
|
// Restore structure packing to default
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
#include "global_define.h"
|
#include "global_define.h"
|
||||||
#include "eq_stream_proxy.h"
|
#include "eq_stream_proxy.h"
|
||||||
#include "struct_strategy.h"
|
#include "struct_strategy.h"
|
||||||
|
#include "eqemu_logsys.h"
|
||||||
|
#include "opcodemgr.h"
|
||||||
|
|
||||||
|
|
||||||
EQStreamProxy::EQStreamProxy(std::shared_ptr<EQStreamInterface> &stream, const StructStrategy *structs, OpcodeManager **opcodes)
|
EQStreamProxy::EQStreamProxy(std::shared_ptr<EQStreamInterface> &stream, const StructStrategy *structs, OpcodeManager **opcodes)
|
||||||
@@ -39,6 +41,11 @@ void EQStreamProxy::QueuePacket(const EQApplicationPacket *p, bool ack_req) {
|
|||||||
if(p == nullptr)
|
if(p == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (p->GetOpcode() != OP_SpecialMesg) {
|
||||||
|
Log(Logs::General, Logs::Server_Client_Packet, "[%s - 0x%04x] [Size: %u]", OpcodeManager::EmuToName(p->GetOpcode()), p->GetOpcode(), p->Size());
|
||||||
|
Log(Logs::General, Logs::Server_Client_Packet_With_Dump, "[%s - 0x%04x] [Size: %u] %s", OpcodeManager::EmuToName(p->GetOpcode()), p->GetOpcode(), p->Size(), DumpPacketToString(p).c_str());
|
||||||
|
}
|
||||||
|
|
||||||
EQApplicationPacket *newp = p->Copy();
|
EQApplicationPacket *newp = p->Copy();
|
||||||
FastQueuePacket(&newp, ack_req);
|
FastQueuePacket(&newp, ack_req);
|
||||||
}
|
}
|
||||||
|
|||||||
+90
-330
@@ -23,351 +23,112 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
std::string EQEmuConfig::ConfigFile = "eqemu_config.xml";
|
std::string EQEmuConfig::ConfigFile = "eqemu_config.json";
|
||||||
EQEmuConfig *EQEmuConfig::_config = nullptr;
|
EQEmuConfig *EQEmuConfig::_config = nullptr;
|
||||||
|
|
||||||
void EQEmuConfig::do_world(TiXmlElement *ele)
|
void EQEmuConfig::parse_config() {
|
||||||
{
|
|
||||||
const char *text;
|
ShortName = _root["server"]["world"].get("shortname", "").asString();
|
||||||
TiXmlElement * sub_ele;;
|
LongName = _root["server"]["world"].get("longname", "").asString();
|
||||||
text = ParseTextBlock(ele, "shortname");
|
WorldAddress = _root["server"]["world"].get("address", "").asString();
|
||||||
if (text) {
|
LocalAddress = _root["server"]["world"].get("localaddress", "").asString();
|
||||||
ShortName = text;
|
MaxClients = atoi(_root["server"]["world"].get("maxclients", "-1").asString().c_str());
|
||||||
}
|
SharedKey = _root["server"]["world"].get("key", "").asString();
|
||||||
text = ParseTextBlock(ele, "longname");
|
LoginCount = 0;
|
||||||
if (text) {
|
|
||||||
LongName = text;
|
if (_root["server"]["world"]["loginserver"].isObject()) {
|
||||||
}
|
LoginHost = _root["server"]["world"]["loginserver"].get("host", "login.eqemulator.net").asString();
|
||||||
text = ParseTextBlock(ele, "address", true);
|
LoginPort = atoi(_root["server"]["world"]["loginserver"].get("port", "5998").asString().c_str());
|
||||||
if (text) {
|
LoginLegacy = false;
|
||||||
WorldAddress = text;
|
if (_root["server"]["world"]["loginserver"].get("legacy", "0").asString() == "1") LoginLegacy = true;
|
||||||
}
|
LoginAccount = _root["server"]["world"]["loginserver"].get("account", "").asString();
|
||||||
text = ParseTextBlock(ele, "localaddress", true);
|
LoginPassword = _root["server"]["world"]["loginserver"].get("password", "").asString();
|
||||||
if (text) {
|
|
||||||
LocalAddress = text;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "maxclients", true);
|
|
||||||
if (text) {
|
|
||||||
MaxClients = atoi(text);
|
|
||||||
}
|
|
||||||
// Get the <key> element
|
|
||||||
text = ParseTextBlock(ele, "key", true);
|
|
||||||
if (text) {
|
|
||||||
SharedKey = text;
|
|
||||||
}
|
|
||||||
// Get the <loginserver> element
|
|
||||||
sub_ele = ele->FirstChildElement("loginserver");
|
|
||||||
if (sub_ele) {
|
|
||||||
text = ParseTextBlock(sub_ele, "host", true);
|
|
||||||
if (text) {
|
|
||||||
LoginHost = text;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(sub_ele, "port", true);
|
|
||||||
if (text) {
|
|
||||||
LoginPort = atoi(text);
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(sub_ele, "legacy", true);
|
|
||||||
if (text) {
|
|
||||||
LoginLegacy = atoi(text) > 0 ? true : false;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(sub_ele, "account", true);
|
|
||||||
if (text) {
|
|
||||||
LoginAccount = text;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(sub_ele, "password", true);
|
|
||||||
if (text) {
|
|
||||||
LoginPassword = text;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
char str[32];
|
char str[32];
|
||||||
|
loginlist.Clear();
|
||||||
do {
|
do {
|
||||||
sprintf(str, "loginserver%i", ++LoginCount);
|
sprintf(str, "loginserver%i", ++LoginCount);
|
||||||
sub_ele = ele->FirstChildElement(str);
|
if (!_root["server"]["world"][str].isObject()) {
|
||||||
if (sub_ele) {
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
auto loginconfig = new LoginConfig;
|
auto loginconfig = new LoginConfig;
|
||||||
text = ParseTextBlock(sub_ele, "host", true);
|
loginconfig->LoginHost = _root["server"]["world"][str].get("host", "login.eqemulator.net").asString();
|
||||||
if (text) {
|
loginconfig->LoginPort = atoi(_root["server"]["world"][str].get("port", "5998").asString().c_str());
|
||||||
loginconfig->LoginHost = text;
|
loginconfig->LoginAccount = _root["server"]["world"][str].get("account", "").asString();
|
||||||
}
|
loginconfig->LoginPassword = _root["server"]["world"][str].get("password", "").asString();
|
||||||
text = ParseTextBlock(sub_ele, "port", true);
|
|
||||||
if (text) {
|
loginconfig->LoginLegacy = false;
|
||||||
loginconfig->LoginPort = atoi(text);
|
if (_root["server"]["world"][str].get("legacy", "0").asString() == "1") loginconfig->LoginLegacy = true;
|
||||||
}
|
|
||||||
text = ParseTextBlock(sub_ele, "legacy", true);
|
|
||||||
if (text) {
|
|
||||||
loginconfig->LoginLegacy = atoi(text) > 0 ? true : false;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(sub_ele, "account", true);
|
|
||||||
if (text) {
|
|
||||||
loginconfig->LoginAccount = text;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(sub_ele, "password", true);
|
|
||||||
if (text) {
|
|
||||||
loginconfig->LoginPassword = text;
|
|
||||||
}
|
|
||||||
loginlist.Insert(loginconfig);
|
loginlist.Insert(loginconfig);
|
||||||
}
|
} while (LoginCount < 100);
|
||||||
} while (sub_ele);
|
|
||||||
}
|
|
||||||
// Check for locked
|
|
||||||
sub_ele = ele->FirstChildElement("locked");
|
|
||||||
if (sub_ele != nullptr) {
|
|
||||||
Locked = true;
|
|
||||||
}
|
|
||||||
// Get the <tcp> element
|
|
||||||
sub_ele = ele->FirstChildElement("tcp");
|
|
||||||
if (sub_ele != nullptr) {
|
|
||||||
text = sub_ele->Attribute("ip");
|
|
||||||
if (text) {
|
|
||||||
WorldIP = text;
|
|
||||||
}
|
|
||||||
text = sub_ele->Attribute("port");
|
|
||||||
if (text) {
|
|
||||||
WorldTCPPort = atoi(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub_ele = ele->FirstChildElement("telnet");
|
|
||||||
if (sub_ele != nullptr) {
|
|
||||||
text = sub_ele->Attribute("ip");
|
|
||||||
if (text) {
|
|
||||||
TelnetIP = text;
|
|
||||||
}
|
|
||||||
text = sub_ele->Attribute("port");
|
|
||||||
if (text) {
|
|
||||||
TelnetTCPPort = atoi(text);
|
|
||||||
}
|
|
||||||
text = sub_ele->Attribute("enabled");
|
|
||||||
if (text && !strcasecmp(text, "true")) {
|
|
||||||
TelnetEnabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the <http> element
|
|
||||||
sub_ele = ele->FirstChildElement("http");
|
|
||||||
if (sub_ele != nullptr) {
|
|
||||||
// text = sub_ele->Attribute("ip");
|
|
||||||
// if (text)
|
|
||||||
// WorldIP=text;
|
|
||||||
text = sub_ele->Attribute("mimefile");
|
|
||||||
if (text) {
|
|
||||||
WorldHTTPMimeFile = text;
|
|
||||||
}
|
|
||||||
text = sub_ele->Attribute("port");
|
|
||||||
if (text) {
|
|
||||||
WorldHTTPPort = atoi(text);
|
|
||||||
}
|
|
||||||
text = sub_ele->Attribute("enabled");
|
|
||||||
if (text && !strcasecmp(text, "true")) {
|
|
||||||
WorldHTTPEnabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EQEmuConfig::do_chatserver(TiXmlElement *ele)
|
|
||||||
{
|
|
||||||
const char *text;
|
|
||||||
text = ParseTextBlock(ele, "host", true);
|
|
||||||
if (text) {
|
|
||||||
ChatHost = text;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "port", true);
|
|
||||||
if (text) {
|
|
||||||
ChatPort = atoi(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EQEmuConfig::do_mailserver(TiXmlElement *ele)
|
|
||||||
{
|
|
||||||
const char *text;
|
|
||||||
text = ParseTextBlock(ele, "host", true);
|
|
||||||
if (text) {
|
|
||||||
MailHost = text;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "port", true);
|
|
||||||
if (text) {
|
|
||||||
MailPort = atoi(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EQEmuConfig::do_database(TiXmlElement *ele)
|
|
||||||
{
|
|
||||||
const char *text;
|
|
||||||
text = ParseTextBlock(ele, "host", true);
|
|
||||||
if (text) {
|
|
||||||
DatabaseHost = text;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "port", true);
|
|
||||||
if (text) {
|
|
||||||
DatabasePort = atoi(text);
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "username", true);
|
|
||||||
if (text) {
|
|
||||||
DatabaseUsername = text;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "password", true);
|
|
||||||
if (text) {
|
|
||||||
DatabasePassword = text;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "db", true);
|
|
||||||
if (text) {
|
|
||||||
DatabaseDB = text;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void EQEmuConfig::do_qsdatabase(TiXmlElement *ele)
|
//<locked> from xml converts to json as locked: "", so i default to "false".
|
||||||
{
|
//The only way to enable locked is by switching to true, meaning this value is always false until manually set true
|
||||||
const char *text;
|
Locked = false;
|
||||||
text = ParseTextBlock(ele, "host", true);
|
if (_root["server"]["world"].get("locked", "false").asString() == "true") Locked = true;
|
||||||
if (text) {
|
WorldIP = _root["server"]["world"]["tcp"].get("host", "127.0.0.1").asString();
|
||||||
QSDatabaseHost = text;
|
WorldTCPPort = atoi(_root["server"]["world"]["tcp"].get("port", "9000").asString().c_str());
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "port", true);
|
|
||||||
if (text) {
|
|
||||||
QSDatabasePort = atoi(text);
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "username", true);
|
|
||||||
if (text) {
|
|
||||||
QSDatabaseUsername = text;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "password", true);
|
|
||||||
if (text) {
|
|
||||||
QSDatabasePassword = text;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "db", true);
|
|
||||||
if (text) {
|
|
||||||
QSDatabaseDB = text;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EQEmuConfig::do_zones(TiXmlElement *ele)
|
TelnetIP = _root["server"]["world"]["telnet"].get("ip", "127.0.0.1").asString();
|
||||||
{
|
TelnetTCPPort = atoi(_root["server"]["world"]["telnet"].get("port", "9001").asString().c_str());
|
||||||
const char *text;
|
TelnetEnabled = false;
|
||||||
TiXmlElement *sub_ele;
|
if (_root["server"]["world"]["telnet"].get("enabled", "false").asString() == "true") TelnetEnabled = true;
|
||||||
// TiXmlNode *node,*sub_node;
|
|
||||||
text = ParseTextBlock(ele, "defaultstatus", true);
|
|
||||||
if (text) {
|
|
||||||
DefaultStatus = atoi(text);
|
|
||||||
}
|
|
||||||
// Get the <ports> element
|
|
||||||
sub_ele = ele->FirstChildElement("ports");
|
|
||||||
if (sub_ele != nullptr) {
|
|
||||||
text = sub_ele->Attribute("low");
|
|
||||||
if (text) {
|
|
||||||
ZonePortLow = atoi(text);
|
|
||||||
};
|
|
||||||
text = sub_ele->Attribute("high");
|
|
||||||
if (text) {
|
|
||||||
ZonePortHigh = atoi(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EQEmuConfig::do_files(TiXmlElement *ele)
|
WorldHTTPMimeFile = _root["server"]["world"]["http"].get("mimefile", "mime.types").asString();
|
||||||
{
|
WorldHTTPPort = atoi(_root["server"]["world"]["http"].get("port", "9080").asString().c_str());
|
||||||
const char *text;
|
WorldHTTPEnabled = false;
|
||||||
text = ParseTextBlock(ele, "spells", true);
|
if (_root["server"]["world"]["http"].get("enabled", "false").asString() == "true") WorldHTTPEnabled = true;
|
||||||
if (text) {
|
|
||||||
SpellsFile = text;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "opcodes", true);
|
|
||||||
if (text) {
|
|
||||||
OpCodesFile = text;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "plugin.pl", true);
|
|
||||||
if (text) {
|
|
||||||
PluginPlFile = text;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EQEmuConfig::do_directories(TiXmlElement *ele)
|
ChatHost = _root["server"]["chatserver"].get("host", "eqchat.eqemulator.net").asString();
|
||||||
{
|
ChatPort = atoi(_root["server"]["chatserver"].get("port", "7778").asString().c_str());
|
||||||
const char *text;
|
|
||||||
text = ParseTextBlock(ele, "maps", true);
|
|
||||||
if (text) {
|
|
||||||
MapDir = text;
|
|
||||||
if ( MapDir.back() != '/' )
|
|
||||||
MapDir += '/';
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "quests", true);
|
|
||||||
if (text) {
|
|
||||||
QuestDir = text;
|
|
||||||
if ( QuestDir.back() != '/' )
|
|
||||||
QuestDir += '/';
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "plugins", true);
|
|
||||||
if (text) {
|
|
||||||
PluginDir = text;
|
|
||||||
if ( PluginDir.back() != '/' )
|
|
||||||
PluginDir += '/';
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "lua_modules", true);
|
|
||||||
if (text) {
|
|
||||||
LuaModuleDir = text;
|
|
||||||
if ( LuaModuleDir.back() != '/' )
|
|
||||||
LuaModuleDir += '/';
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "patches", true);
|
|
||||||
if (text) {
|
|
||||||
PatchDir = text;
|
|
||||||
if ( PatchDir.back() != '/' )
|
|
||||||
PatchDir += '/';
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "shared_memory", true);
|
|
||||||
if (text) {
|
|
||||||
SharedMemDir = text;
|
|
||||||
if ( SharedMemDir.back() != '/' )
|
|
||||||
SharedMemDir += '/';
|
|
||||||
}
|
|
||||||
//Not Fully Implemented yet LogDir
|
|
||||||
text = ParseTextBlock(ele, "logs", true);
|
|
||||||
if (text) {
|
|
||||||
LogDir = text;
|
|
||||||
if ( LogDir.back() != '/' )
|
|
||||||
LogDir += '/';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EQEmuConfig::do_launcher(TiXmlElement *ele)
|
MailHost = _root["server"]["mailserver"].get("host", "eqmail.eqemulator.net").asString();
|
||||||
{
|
MailPort = atoi(_root["server"]["mailserver"].get("port", "7778").asString().c_str());
|
||||||
const char *text;
|
|
||||||
TiXmlElement *sub_ele;
|
|
||||||
text = ParseTextBlock(ele, "logprefix", true);
|
|
||||||
if (text) {
|
|
||||||
LogPrefix = text;
|
|
||||||
}
|
|
||||||
text = ParseTextBlock(ele, "logsuffix", true);
|
|
||||||
if (text) {
|
|
||||||
LogSuffix = text;
|
|
||||||
}
|
|
||||||
// Get the <exe> element
|
|
||||||
text = ParseTextBlock(ele, "exe", true);
|
|
||||||
if (text) {
|
|
||||||
ZoneExe = text;
|
|
||||||
}
|
|
||||||
// Get the <timers> element
|
|
||||||
sub_ele = ele->FirstChildElement("timers");
|
|
||||||
if (sub_ele != nullptr) {
|
|
||||||
text = sub_ele->Attribute("restart");
|
|
||||||
if (text) {
|
|
||||||
RestartWait = atoi(text);
|
|
||||||
}
|
|
||||||
text = sub_ele->Attribute("reterminate");
|
|
||||||
if (text) {
|
|
||||||
TerminateWait = atoi(text);
|
|
||||||
}
|
|
||||||
text = sub_ele->Attribute("initial");
|
|
||||||
if (text) {
|
|
||||||
InitialBootWait = atoi(text);
|
|
||||||
}
|
|
||||||
text = sub_ele->Attribute("interval");
|
|
||||||
if (text) {
|
|
||||||
ZoneBootInterval = atoi(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
DatabaseUsername = _root["server"]["database"].get("username", "eq").asString();
|
||||||
|
DatabasePassword = _root["server"]["database"].get("password", "eq").asString();
|
||||||
|
DatabaseHost = _root["server"]["database"].get("host", "localhost").asString();
|
||||||
|
DatabasePort = atoi(_root["server"]["database"].get("port", "3306").asString().c_str());
|
||||||
|
DatabaseDB = _root["server"]["database"].get("db", "eq").asString();
|
||||||
|
|
||||||
|
QSDatabaseHost = _root["server"]["qsdatabase"].get("host", "localhost").asString();
|
||||||
|
QSDatabasePort = atoi(_root["server"]["qsdatabase"].get("port", "3306").asString().c_str());
|
||||||
|
QSDatabaseUsername = _root["server"]["qsdatabase"].get("username", "eq").asString();
|
||||||
|
QSDatabasePassword = _root["server"]["qsdatabase"].get("password", "eq").asString();
|
||||||
|
QSDatabaseDB = _root["server"]["qsdatabase"].get("db", "eq").asString();
|
||||||
|
|
||||||
|
DefaultStatus = atoi(_root["server"]["zones"].get("defaultstatus", 0).asString().c_str());
|
||||||
|
ZonePortLow = atoi(_root["server"]["zones"]["ports"].get("low", "7000").asString().c_str());
|
||||||
|
ZonePortHigh = atoi(_root["server"]["zones"]["ports"].get("high", "7999").asString().c_str());
|
||||||
|
|
||||||
|
SpellsFile = _root["server"]["files"].get("spells", "spells_us.txt").asString();
|
||||||
|
OpCodesFile = _root["server"]["files"].get("opcodes", "opcodes.conf").asString();
|
||||||
|
PluginPlFile = _root["server"]["files"].get("plugin.pl", "plugin.pl").asString();
|
||||||
|
|
||||||
|
MapDir = _root["server"]["directories"].get("maps", "Maps/").asString();
|
||||||
|
QuestDir = _root["server"]["directories"].get("quests", "quests/").asString();
|
||||||
|
PluginDir = _root["server"]["directories"].get("plugins", "plugins/").asString();
|
||||||
|
LuaModuleDir = _root["server"]["directories"].get("lua_modules", "lua_modules/").asString();
|
||||||
|
PatchDir = _root["server"]["directories"].get("patches", "./").asString();
|
||||||
|
SharedMemDir = _root["server"]["directories"].get("shared_memory", "shared/").asString();
|
||||||
|
LogDir = _root["server"]["directories"].get("logs", "logs/").asString();
|
||||||
|
|
||||||
|
LogPrefix = _root["server"]["launcher"].get("logprefix", "logs/zone-").asString();
|
||||||
|
LogSuffix = _root["server"]["launcher"].get("logsuffix", ".log").asString();
|
||||||
|
RestartWait = atoi(_root["server"]["launcher"]["timers"].get("restart", "10000").asString().c_str());
|
||||||
|
TerminateWait = atoi(_root["server"]["launcher"]["timers"].get("reterminate", "10000").asString().c_str());
|
||||||
|
InitialBootWait = atoi(_root["server"]["launcher"]["timers"].get("initial", "20000").asString().c_str());
|
||||||
|
ZoneBootInterval = atoi(_root["server"]["launcher"]["timers"].get("interval", "2000").asString().c_str());
|
||||||
|
#ifdef WIN32
|
||||||
|
ZoneExe = _root["server"]["launcher"].get("exe", "zone.exe").asString();
|
||||||
|
#else
|
||||||
|
ZoneExe = _root["server"]["launcher"].get("exe", "./zone").asString();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
std::string EQEmuConfig::GetByName(const std::string &var_name) const
|
std::string EQEmuConfig::GetByName(const std::string &var_name) const
|
||||||
{
|
{
|
||||||
if (var_name == "ShortName") {
|
if (var_name == "ShortName") {
|
||||||
@@ -564,4 +325,3 @@ void EQEmuConfig::Dump() const
|
|||||||
std::cout << "DefaultStatus = " << (int)DefaultStatus << std::endl;
|
std::cout << "DefaultStatus = " << (int)DefaultStatus << std::endl;
|
||||||
// std::cout << "DynamicCount = " << DynamicCount << std::endl;
|
// std::cout << "DynamicCount = " << DynamicCount << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+25
-82
@@ -18,8 +18,9 @@
|
|||||||
#ifndef __EQEmuConfig_H
|
#ifndef __EQEmuConfig_H
|
||||||
#define __EQEmuConfig_H
|
#define __EQEmuConfig_H
|
||||||
|
|
||||||
#include "xml_parser.h"
|
#include "json/json.h"
|
||||||
#include "linked_list.h"
|
#include "linked_list.h"
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
struct LoginConfig {
|
struct LoginConfig {
|
||||||
std::string LoginHost;
|
std::string LoginHost;
|
||||||
@@ -29,7 +30,7 @@ struct LoginConfig {
|
|||||||
bool LoginLegacy;
|
bool LoginLegacy;
|
||||||
};
|
};
|
||||||
|
|
||||||
class EQEmuConfig : public XMLParser
|
class EQEmuConfig
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual std::string GetByName(const std::string &var_name) const;
|
virtual std::string GetByName(const std::string &var_name) const;
|
||||||
@@ -115,88 +116,14 @@ class EQEmuConfig : public XMLParser
|
|||||||
protected:
|
protected:
|
||||||
|
|
||||||
static EQEmuConfig *_config;
|
static EQEmuConfig *_config;
|
||||||
|
Json::Value _root;
|
||||||
static std::string ConfigFile;
|
static std::string ConfigFile;
|
||||||
|
|
||||||
#define ELEMENT(name) \
|
void parse_config();
|
||||||
void do_##name(TiXmlElement *ele);
|
|
||||||
#include "eqemu_config_elements.h"
|
|
||||||
|
|
||||||
|
|
||||||
EQEmuConfig()
|
EQEmuConfig()
|
||||||
{
|
{
|
||||||
// import the needed handler prototypes
|
|
||||||
#define ELEMENT(name) \
|
|
||||||
Handlers[#name]=(ElementHandler)&EQEmuConfig::do_##name;
|
|
||||||
#include "eqemu_config_elements.h"
|
|
||||||
// Set sane defaults
|
|
||||||
// Login server
|
|
||||||
LoginHost = "login.eqemulator.net";
|
|
||||||
LoginPort = 5998;
|
|
||||||
LoginLegacy = false;
|
|
||||||
// World
|
|
||||||
Locked = false;
|
|
||||||
WorldTCPPort = 9000;
|
|
||||||
TelnetTCPPort = 9001;
|
|
||||||
TelnetEnabled = false;
|
|
||||||
WorldHTTPEnabled = false;
|
|
||||||
WorldHTTPPort = 9080;
|
|
||||||
WorldHTTPMimeFile = "mime.types";
|
|
||||||
SharedKey = ""; //blank disables authentication
|
|
||||||
// Mail
|
|
||||||
ChatHost = "eqchat.eqemulator.net";
|
|
||||||
ChatPort = 7778;
|
|
||||||
// Mail
|
|
||||||
MailHost = "eqmail.eqemulator.net";
|
|
||||||
MailPort = 7779;
|
|
||||||
// Mysql
|
|
||||||
DatabaseHost = "localhost";
|
|
||||||
DatabasePort = 3306;
|
|
||||||
DatabaseUsername = "eq";
|
|
||||||
DatabasePassword = "eq";
|
|
||||||
DatabaseDB = "eq";
|
|
||||||
// QueryServ Database
|
|
||||||
QSDatabaseHost = "localhost";
|
|
||||||
QSDatabasePort = 3306;
|
|
||||||
QSDatabaseUsername = "eq";
|
|
||||||
QSDatabasePassword = "eq";
|
|
||||||
QSDatabaseDB = "eq";
|
|
||||||
// Files
|
|
||||||
SpellsFile = "spells_us.txt";
|
|
||||||
OpCodesFile = "opcodes.conf";
|
|
||||||
PluginPlFile = "plugin.pl";
|
|
||||||
// Dirs
|
|
||||||
MapDir = "Maps/";
|
|
||||||
QuestDir = "quests/";
|
|
||||||
PluginDir = "plugins/";
|
|
||||||
LuaModuleDir = "lua_modules/";
|
|
||||||
PatchDir = "./";
|
|
||||||
SharedMemDir = "shared/";
|
|
||||||
LogDir = "logs/";
|
|
||||||
|
|
||||||
// Launcher
|
|
||||||
LogPrefix = "logs/zone-";
|
|
||||||
LogSuffix = ".log";
|
|
||||||
RestartWait = 10000; //milliseconds
|
|
||||||
TerminateWait = 10000; //milliseconds
|
|
||||||
InitialBootWait = 20000; //milliseconds
|
|
||||||
ZoneBootInterval = 2000; //milliseconds
|
|
||||||
#ifdef WIN32
|
|
||||||
ZoneExe = "zone.exe";
|
|
||||||
#else
|
|
||||||
ZoneExe = "./zone";
|
|
||||||
#endif
|
|
||||||
// Zones
|
|
||||||
ZonePortLow = 7000;
|
|
||||||
ZonePortHigh = 7999;
|
|
||||||
DefaultStatus = 0;
|
|
||||||
// For where zones need to connect to.
|
|
||||||
WorldIP = "127.0.0.1";
|
|
||||||
TelnetIP = "127.0.0.1";
|
|
||||||
// Dynamics to start
|
|
||||||
//DynamicCount=5;
|
|
||||||
MaxClients = -1;
|
|
||||||
LoginCount = 0;
|
|
||||||
}
|
}
|
||||||
virtual ~EQEmuConfig() {}
|
virtual ~EQEmuConfig() {}
|
||||||
|
|
||||||
@@ -205,9 +132,7 @@ class EQEmuConfig : public XMLParser
|
|||||||
// Produce a const singleton
|
// Produce a const singleton
|
||||||
static const EQEmuConfig *get()
|
static const EQEmuConfig *get()
|
||||||
{
|
{
|
||||||
if (_config == nullptr) {
|
|
||||||
LoadConfig();
|
LoadConfig();
|
||||||
}
|
|
||||||
return (_config);
|
return (_config);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,10 +146,28 @@ class EQEmuConfig : public XMLParser
|
|||||||
static bool LoadConfig()
|
static bool LoadConfig()
|
||||||
{
|
{
|
||||||
if (_config != nullptr) {
|
if (_config != nullptr) {
|
||||||
delete _config;
|
return true;
|
||||||
}
|
}
|
||||||
_config = new EQEmuConfig;
|
_config = new EQEmuConfig;
|
||||||
return _config->ParseFile(EQEmuConfig::ConfigFile.c_str(), "server");
|
|
||||||
|
return parseFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load config file and parse data
|
||||||
|
static bool parseFile() {
|
||||||
|
if (_config == nullptr) {
|
||||||
|
return LoadConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ifstream fconfig(EQEmuConfig::ConfigFile, std::ifstream::binary);
|
||||||
|
try {
|
||||||
|
fconfig >> _config->_root;
|
||||||
|
_config->parse_config();
|
||||||
|
}
|
||||||
|
catch (std::exception) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dump() const;
|
void Dump() const;
|
||||||
|
|||||||
+10
-1
@@ -86,6 +86,10 @@ enum LogCategory {
|
|||||||
Login_Server,
|
Login_Server,
|
||||||
Client_Login,
|
Client_Login,
|
||||||
Headless_Client,
|
Headless_Client,
|
||||||
|
HP_Update,
|
||||||
|
FixZ,
|
||||||
|
Food,
|
||||||
|
Traps,
|
||||||
MaxCategoryID /* Don't Remove this*/
|
MaxCategoryID /* Don't Remove this*/
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -135,7 +139,12 @@ static const char* LogCategoryName[LogCategory::MaxCategoryID] = {
|
|||||||
"Packet :: Server -> Client (Dump)",
|
"Packet :: Server -> Client (Dump)",
|
||||||
"Packet :: Client -> Server (Dump)",
|
"Packet :: Client -> Server (Dump)",
|
||||||
"Login Server",
|
"Login Server",
|
||||||
"Client Login"
|
"Client Login",
|
||||||
|
"Headless Client",
|
||||||
|
"HP Update",
|
||||||
|
"FixZ",
|
||||||
|
"Food",
|
||||||
|
"Traps"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,32 +1,35 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include "../any.h"
|
||||||
#include "event_loop.h"
|
#include "event_loop.h"
|
||||||
|
|
||||||
namespace EQ {
|
namespace EQ {
|
||||||
class BackgroundTask
|
class BackgroundTask
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef std::function<void(void)> BackgroundTaskFunction;
|
typedef std::function<void(EQEmu::Any&)> BackgroundTaskFunction;
|
||||||
struct BackgroundTaskBaton
|
struct BackgroundTaskBaton
|
||||||
{
|
{
|
||||||
BackgroundTaskFunction fn;
|
BackgroundTaskFunction fn;
|
||||||
BackgroundTaskFunction on_finish;
|
BackgroundTaskFunction on_finish;
|
||||||
|
EQEmu::Any data;
|
||||||
};
|
};
|
||||||
|
|
||||||
BackgroundTask(BackgroundTaskFunction fn, BackgroundTaskFunction on_finish) {
|
BackgroundTask(BackgroundTaskFunction fn, BackgroundTaskFunction on_finish, EQEmu::Any data) {
|
||||||
uv_work_t *m_work = new uv_work_t;
|
uv_work_t *m_work = new uv_work_t;
|
||||||
memset(m_work, 0, sizeof(uv_work_t));
|
memset(m_work, 0, sizeof(uv_work_t));
|
||||||
BackgroundTaskBaton *baton = new BackgroundTaskBaton();
|
BackgroundTaskBaton *baton = new BackgroundTaskBaton();
|
||||||
baton->fn = fn;
|
baton->fn = fn;
|
||||||
baton->on_finish = on_finish;
|
baton->on_finish = on_finish;
|
||||||
|
baton->data = data;
|
||||||
|
|
||||||
m_work->data = baton;
|
m_work->data = baton;
|
||||||
uv_queue_work(EventLoop::Get().Handle(), m_work, [](uv_work_t* req) {
|
uv_queue_work(EventLoop::Get().Handle(), m_work, [](uv_work_t* req) {
|
||||||
BackgroundTaskBaton *baton = (BackgroundTaskBaton*)req->data;
|
BackgroundTaskBaton *baton = (BackgroundTaskBaton*)req->data;
|
||||||
baton->fn();
|
baton->fn(baton->data);
|
||||||
}, [](uv_work_t* req, int status) {
|
}, [](uv_work_t* req, int status) {
|
||||||
BackgroundTaskBaton *baton = (BackgroundTaskBaton*)req->data;
|
BackgroundTaskBaton *baton = (BackgroundTaskBaton*)req->data;
|
||||||
baton->on_finish();
|
baton->on_finish(baton->data);
|
||||||
delete baton;
|
delete baton;
|
||||||
delete req;
|
delete req;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
#include "event_sub.h"
|
#include "event_sub.h"
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
void EventSubscriptionWatcher::Subscribe(const std::string &event_name)
|
void EventSubscriptionWatcher::Subscribe(const std::string &event_name)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
class EventSubscriptionWatcher
|
class EventSubscriptionWatcher
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -154,6 +154,7 @@ enum { //timer settings, all in milliseconds
|
|||||||
AIscanarea_delay = 6000,
|
AIscanarea_delay = 6000,
|
||||||
AIfeignremember_delay = 500,
|
AIfeignremember_delay = 500,
|
||||||
AItarget_check_duration = 500,
|
AItarget_check_duration = 500,
|
||||||
|
AI_scan_door_open_interval = 1000,
|
||||||
// AIClientScanarea_delay = 750, //used in REVERSE_AGGRO
|
// AIClientScanarea_delay = 750, //used in REVERSE_AGGRO
|
||||||
AIassistcheck_delay = 3000, //now often a fighting NPC will yell for help
|
AIassistcheck_delay = 3000, //now often a fighting NPC will yell for help
|
||||||
AI_check_signal_timer_delay = 500, // How often EVENT_SIGNAL checks are processed
|
AI_check_signal_timer_delay = 500, // How often EVENT_SIGNAL checks are processed
|
||||||
@@ -219,6 +220,9 @@ enum { //some random constants
|
|||||||
//the square of the maximum range at whihc you could possibly use NPC services (shop, tribute, etc)
|
//the square of the maximum range at whihc you could possibly use NPC services (shop, tribute, etc)
|
||||||
#define USE_NPC_RANGE2 200*200 //arbitrary right now
|
#define USE_NPC_RANGE2 200*200 //arbitrary right now
|
||||||
|
|
||||||
|
// Squared range for rampage 75.0 * 75.0 for now
|
||||||
|
#define NPC_RAMPAGE_RANGE2 5625.0f
|
||||||
|
|
||||||
//the formula for experience for killing a mob.
|
//the formula for experience for killing a mob.
|
||||||
//level is the only valid variable to use
|
//level is the only valid variable to use
|
||||||
#define EXP_FORMULA level*level*75*35/10
|
#define EXP_FORMULA level*level*75*35/10
|
||||||
@@ -276,6 +280,11 @@ enum {
|
|||||||
#define SAYLINK_ITEM_ID 0xFFFFF
|
#define SAYLINK_ITEM_ID 0xFFFFF
|
||||||
|
|
||||||
|
|
||||||
|
// consumption timers for food/drink here instead of rules because the client
|
||||||
|
// uses these. Times in ms.
|
||||||
|
#define CONSUMPTION_TIMER 46000
|
||||||
|
#define CONSUMPTION_MNK_TIMER 92000
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
Developer configuration
|
Developer configuration
|
||||||
|
|||||||
@@ -111,7 +111,8 @@
|
|||||||
#define GLM_COMPILER_GCC70 0x02000A00
|
#define GLM_COMPILER_GCC70 0x02000A00
|
||||||
#define GLM_COMPILER_GCC71 0x02000B00
|
#define GLM_COMPILER_GCC71 0x02000B00
|
||||||
#define GLM_COMPILER_GCC72 0x02000C00
|
#define GLM_COMPILER_GCC72 0x02000C00
|
||||||
#define GLM_COMPILER_GCC80 0x02000D00
|
#define GLM_COMPILER_GCC73 0x02000D00
|
||||||
|
#define GLM_COMPILER_GCC80 0x02000E00
|
||||||
|
|
||||||
// CUDA
|
// CUDA
|
||||||
#define GLM_COMPILER_CUDA 0x10000000
|
#define GLM_COMPILER_CUDA 0x10000000
|
||||||
@@ -283,6 +284,8 @@
|
|||||||
# define GLM_COMPILER (GLM_COMPILER_GCC71)
|
# define GLM_COMPILER (GLM_COMPILER_GCC71)
|
||||||
# elif (__GNUC__ == 7) && (__GNUC_MINOR__ == 2)
|
# elif (__GNUC__ == 7) && (__GNUC_MINOR__ == 2)
|
||||||
# define GLM_COMPILER (GLM_COMPILER_GCC72)
|
# define GLM_COMPILER (GLM_COMPILER_GCC72)
|
||||||
|
# elif (__GNUC__ == 7) && (__GNUC_MINOR__ == 3)
|
||||||
|
# define GLM_COMPILER (GLM_COMPILER_GCC73)
|
||||||
# elif (__GNUC__ >= 8)
|
# elif (__GNUC__ >= 8)
|
||||||
# define GLM_COMPILER (GLM_COMPILER_GCC80)
|
# define GLM_COMPILER (GLM_COMPILER_GCC80)
|
||||||
# else
|
# else
|
||||||
|
|||||||
+52
-14
@@ -194,32 +194,70 @@ uint32 rnd_hash( time_t t, clock_t c )
|
|||||||
|
|
||||||
float EQ13toFloat(int d)
|
float EQ13toFloat(int d)
|
||||||
{
|
{
|
||||||
return ( float(d)/float(1<<2));
|
return static_cast<float>(d) / 64.0f;
|
||||||
}
|
|
||||||
|
|
||||||
float NewEQ13toFloat(int d)
|
|
||||||
{
|
|
||||||
return ( float(d)/float(1<<6));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float EQ19toFloat(int d)
|
float EQ19toFloat(int d)
|
||||||
{
|
{
|
||||||
return ( float(d)/float(1<<3));
|
return static_cast<float>(d) / 8.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
int FloatToEQ13(float d)
|
int FloatToEQ13(float d)
|
||||||
{
|
{
|
||||||
return int(d*float(1<<2));
|
return static_cast<int>(d * 64.0f);
|
||||||
}
|
|
||||||
|
|
||||||
int NewFloatToEQ13(float d)
|
|
||||||
{
|
|
||||||
return int(d*float(1<<6));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int FloatToEQ19(float d)
|
int FloatToEQ19(float d)
|
||||||
{
|
{
|
||||||
return int(d*float(1<<3));
|
return static_cast<int>(d * 8.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
float EQ12toFloat(int d)
|
||||||
|
{
|
||||||
|
return static_cast<float>(d) / 4.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FloatToEQ12(float d)
|
||||||
|
{
|
||||||
|
return static_cast<int>((d + 2048.0f) * 4.0f) % 2048;
|
||||||
|
}
|
||||||
|
|
||||||
|
float EQ10toFloat(int d)
|
||||||
|
{
|
||||||
|
return static_cast<float>(d) / 20.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FloatToEQ10(float d)
|
||||||
|
{
|
||||||
|
return static_cast<int>(d * 20.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
float EQSpeedRunToFloat(int d)
|
||||||
|
{
|
||||||
|
return static_cast<float>(d) / 40.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FloatToEQSpeedRun(float d)
|
||||||
|
{
|
||||||
|
return static_cast<int>(d * 40.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
float FixHeading(float in)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
if (in >= 512.0f) {
|
||||||
|
do {
|
||||||
|
in -= 512.0f;
|
||||||
|
} while (in >= 512.0f && i++ <= 5);
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
if (in < 0.0f) {
|
||||||
|
do {
|
||||||
|
in += 512.0f;
|
||||||
|
} while (in < 0.0f && i++ <= 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
+14
-2
@@ -50,13 +50,25 @@ uint32 ResolveIP(const char* hostname, char* errbuf = 0);
|
|||||||
bool ParseAddress(const char* iAddress, uint32* oIP, uint16* oPort, char* errbuf = 0);
|
bool ParseAddress(const char* iAddress, uint32* oIP, uint16* oPort, char* errbuf = 0);
|
||||||
void CoutTimestamp(bool ms = true);
|
void CoutTimestamp(bool ms = true);
|
||||||
float EQ13toFloat(int d);
|
float EQ13toFloat(int d);
|
||||||
float NewEQ13toFloat(int d);
|
|
||||||
float EQ19toFloat(int d);
|
float EQ19toFloat(int d);
|
||||||
float EQHtoFloat(int d);
|
float EQHtoFloat(int d);
|
||||||
int FloatToEQ13(float d);
|
int FloatToEQ13(float d);
|
||||||
int NewFloatToEQ13(float d);
|
|
||||||
int FloatToEQ19(float d);
|
int FloatToEQ19(float d);
|
||||||
int FloatToEQH(float d);
|
int FloatToEQH(float d);
|
||||||
|
|
||||||
|
float EQ12toFloat(int d);
|
||||||
|
int FloatToEQ12(float d);
|
||||||
|
|
||||||
|
float EQ10toFloat(int d);
|
||||||
|
int FloatToEQ10(float d);
|
||||||
|
|
||||||
|
// this is also a 10 bit float
|
||||||
|
float EQSpeedRunToFloat(int d);
|
||||||
|
int FloatToEQSpeedRun(float d);
|
||||||
|
|
||||||
|
// brings heading back into EQ angles range
|
||||||
|
float FixHeading(float in);
|
||||||
|
|
||||||
uint32 SwapBits21and22(uint32 mask);
|
uint32 SwapBits21and22(uint32 mask);
|
||||||
uint32 Catch22(uint32 mask);
|
uint32 Catch22(uint32 mask);
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <string>
|
||||||
#include <mysql.h>
|
#include <mysql.h>
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "mysql_request_row.h"
|
#include "mysql_request_row.h"
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#include "console_server.h"
|
#include "console_server.h"
|
||||||
#include "../common/util/uuid.h"
|
#include "../util/uuid.h"
|
||||||
#include "../common/net/packet.h"
|
#include "../net/packet.h"
|
||||||
#include "../common/eqemu_logsys.h"
|
#include "../eqemu_logsys.h"
|
||||||
#include "../common/servertalk.h"
|
#include "../servertalk.h"
|
||||||
#include "../common/rulesys.h"
|
#include "../rulesys.h"
|
||||||
|
|
||||||
EQ::Net::ConsoleServerConnection::ConsoleServerConnection(ConsoleServer *parent, std::shared_ptr<TCPConnection> connection)
|
EQ::Net::ConsoleServerConnection::ConsoleServerConnection(ConsoleServer *parent, std::shared_ptr<TCPConnection> connection)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -139,9 +139,9 @@ void EQ::Net::DaybreakConnectionManager::Process()
|
|||||||
auto time_since_last_send = std::chrono::duration_cast<std::chrono::milliseconds>(now - connection->m_last_send);
|
auto time_since_last_send = std::chrono::duration_cast<std::chrono::milliseconds>(now - connection->m_last_send);
|
||||||
if ((size_t)time_since_last_send.count() > m_options.connect_delay_ms) {
|
if ((size_t)time_since_last_send.count() > m_options.connect_delay_ms) {
|
||||||
connection->SendConnect();
|
connection->SendConnect();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case StatusConnected: {
|
case StatusConnected: {
|
||||||
if (m_options.keepalive_delay_ms != 0) {
|
if (m_options.keepalive_delay_ms != 0) {
|
||||||
auto time_since_last_send = std::chrono::duration_cast<std::chrono::milliseconds>(now - connection->m_last_send);
|
auto time_since_last_send = std::chrono::duration_cast<std::chrono::milliseconds>(now - connection->m_last_send);
|
||||||
@@ -165,7 +165,7 @@ void EQ::Net::DaybreakConnectionManager::ProcessResend()
|
|||||||
{
|
{
|
||||||
auto iter = m_connections.begin();
|
auto iter = m_connections.begin();
|
||||||
while (iter != m_connections.end()) {
|
while (iter != m_connections.end()) {
|
||||||
auto connection = iter->second;
|
auto &connection = iter->second;
|
||||||
auto status = connection->m_status;
|
auto status = connection->m_status;
|
||||||
|
|
||||||
switch (status)
|
switch (status)
|
||||||
@@ -277,7 +277,7 @@ EQ::Net::DaybreakConnection::DaybreakConnection(DaybreakConnectionManager *owner
|
|||||||
m_encode_passes[1] = owner->m_options.encode_passes[1];
|
m_encode_passes[1] = owner->m_options.encode_passes[1];
|
||||||
m_hold_time = Clock::now();
|
m_hold_time = Clock::now();
|
||||||
m_buffered_packets_length = 0;
|
m_buffered_packets_length = 0;
|
||||||
m_rolling_ping = 900;
|
m_rolling_ping = 500;
|
||||||
m_resend_delay = (m_rolling_ping * m_owner->m_options.resend_delay_factor) + m_owner->m_options.resend_delay_ms;
|
m_resend_delay = (m_rolling_ping * m_owner->m_options.resend_delay_factor) + m_owner->m_options.resend_delay_ms;
|
||||||
m_combined.reset(new char[512]);
|
m_combined.reset(new char[512]);
|
||||||
m_combined[0] = 0;
|
m_combined[0] = 0;
|
||||||
@@ -300,7 +300,7 @@ EQ::Net::DaybreakConnection::DaybreakConnection(DaybreakConnectionManager *owner
|
|||||||
m_crc_bytes = 0;
|
m_crc_bytes = 0;
|
||||||
m_hold_time = Clock::now();
|
m_hold_time = Clock::now();
|
||||||
m_buffered_packets_length = 0;
|
m_buffered_packets_length = 0;
|
||||||
m_rolling_ping = 900;
|
m_rolling_ping = 500;
|
||||||
m_resend_delay = (m_rolling_ping * m_owner->m_options.resend_delay_factor) + m_owner->m_options.resend_delay_ms;
|
m_resend_delay = (m_rolling_ping * m_owner->m_options.resend_delay_factor) + m_owner->m_options.resend_delay_ms;
|
||||||
m_combined.reset(new char[512]);
|
m_combined.reset(new char[512]);
|
||||||
m_combined[0] = 0;
|
m_combined[0] = 0;
|
||||||
@@ -382,13 +382,8 @@ void EQ::Net::DaybreakConnection::ProcessPacket(Packet &p)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p.GetInt8(0) != 0) {
|
|
||||||
LogF(Logs::Detail, Logs::Netcode, "Error parsing packet, did not start with a 0 frame, not a valid protocol packet.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto opcode = p.GetInt8(1);
|
auto opcode = p.GetInt8(1);
|
||||||
if (opcode == OP_KeepAlive || opcode == OP_OutboundPing) {
|
if (p.GetInt8(0) == 0 && (opcode == OP_KeepAlive || opcode == OP_OutboundPing)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,10 +402,16 @@ void EQ::Net::DaybreakConnection::ProcessPacket(Packet &p)
|
|||||||
for (int i = 1; i >= 0; --i) {
|
for (int i = 1; i >= 0; --i) {
|
||||||
switch (m_encode_passes[i]) {
|
switch (m_encode_passes[i]) {
|
||||||
case EncodeCompression:
|
case EncodeCompression:
|
||||||
|
if(temp.GetInt8(0) == 0)
|
||||||
Decompress(temp, DaybreakHeader::size(), temp.Length() - DaybreakHeader::size());
|
Decompress(temp, DaybreakHeader::size(), temp.Length() - DaybreakHeader::size());
|
||||||
|
else
|
||||||
|
Decompress(temp, 1, temp.Length() - 1);
|
||||||
break;
|
break;
|
||||||
case EncodeXOR:
|
case EncodeXOR:
|
||||||
|
if (temp.GetInt8(0) == 0)
|
||||||
Decode(temp, DaybreakHeader::size(), temp.Length() - DaybreakHeader::size());
|
Decode(temp, DaybreakHeader::size(), temp.Length() - DaybreakHeader::size());
|
||||||
|
else
|
||||||
|
Decode(temp, 1, temp.Length() - 1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -425,7 +426,10 @@ void EQ::Net::DaybreakConnection::ProcessPacket(Packet &p)
|
|||||||
for (int i = 1; i >= 0; --i) {
|
for (int i = 1; i >= 0; --i) {
|
||||||
switch (m_encode_passes[i]) {
|
switch (m_encode_passes[i]) {
|
||||||
case EncodeXOR:
|
case EncodeXOR:
|
||||||
|
if (temp.GetInt8(0) == 0)
|
||||||
Decode(temp, DaybreakHeader::size(), temp.Length() - DaybreakHeader::size());
|
Decode(temp, DaybreakHeader::size(), temp.Length() - DaybreakHeader::size());
|
||||||
|
else
|
||||||
|
Decode(temp, 1, temp.Length() - 1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -743,7 +747,7 @@ void EQ::Net::DaybreakConnection::ProcessDecodedPacket(const Packet &p)
|
|||||||
response.zero = 0;
|
response.zero = 0;
|
||||||
response.opcode = OP_SessionStatResponse;
|
response.opcode = OP_SessionStatResponse;
|
||||||
response.timestamp = request.timestamp;
|
response.timestamp = request.timestamp;
|
||||||
response.our_timestamp = EQ::Net::HostToNetwork(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count());
|
response.our_timestamp = EQ::Net::HostToNetwork(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count());
|
||||||
response.client_sent = request.packets_sent;
|
response.client_sent = request.packets_sent;
|
||||||
response.client_recv = request.packets_recv;
|
response.client_recv = request.packets_recv;
|
||||||
response.server_sent = EQ::Net::HostToNetwork(m_stats.sent_packets);
|
response.server_sent = EQ::Net::HostToNetwork(m_stats.sent_packets);
|
||||||
@@ -1026,7 +1030,7 @@ void EQ::Net::DaybreakConnection::ProcessResend(int stream)
|
|||||||
InternalBufferedSend(entry.second.packet);
|
InternalBufferedSend(entry.second.packet);
|
||||||
entry.second.last_sent = now;
|
entry.second.last_sent = now;
|
||||||
entry.second.times_resent++;
|
entry.second.times_resent++;
|
||||||
m_rolling_ping += 300;
|
m_rolling_ping += 100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -1040,7 +1044,7 @@ void EQ::Net::DaybreakConnection::ProcessResend(int stream)
|
|||||||
InternalBufferedSend(entry.second.packet);
|
InternalBufferedSend(entry.second.packet);
|
||||||
entry.second.last_sent = now;
|
entry.second.last_sent = now;
|
||||||
entry.second.times_resent++;
|
entry.second.times_resent++;
|
||||||
m_rolling_ping += 300;
|
m_rolling_ping += 100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1187,24 +1191,21 @@ void EQ::Net::DaybreakConnection::InternalSend(Packet &p)
|
|||||||
|
|
||||||
if (PacketCanBeEncoded(p)) {
|
if (PacketCanBeEncoded(p)) {
|
||||||
DynamicPacket out;
|
DynamicPacket out;
|
||||||
|
|
||||||
if (p.GetUInt8(0) != 0) {
|
|
||||||
out.PutUInt8(0, 0);
|
|
||||||
out.PutUInt8(1, OP_Combined);
|
|
||||||
out.PutUInt8(2, p.Length());
|
|
||||||
out.PutPacket(3, p);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
out.PutPacket(0, p);
|
out.PutPacket(0, p);
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < 2; ++i) {
|
for (int i = 0; i < 2; ++i) {
|
||||||
switch (m_encode_passes[i]) {
|
switch (m_encode_passes[i]) {
|
||||||
case EncodeCompression:
|
case EncodeCompression:
|
||||||
|
if(out.GetInt8(0) == 0)
|
||||||
Compress(out, DaybreakHeader::size(), out.Length() - DaybreakHeader::size());
|
Compress(out, DaybreakHeader::size(), out.Length() - DaybreakHeader::size());
|
||||||
|
else
|
||||||
|
Compress(out, 1, out.Length() - 1);
|
||||||
break;
|
break;
|
||||||
case EncodeXOR:
|
case EncodeXOR:
|
||||||
|
if (out.GetInt8(0) == 0)
|
||||||
Encode(out, DaybreakHeader::size(), out.Length() - DaybreakHeader::size());
|
Encode(out, DaybreakHeader::size(), out.Length() - DaybreakHeader::size());
|
||||||
|
else
|
||||||
|
Encode(out, 1, out.Length() - 1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <unordered_map>
|
|
||||||
#include <queue>
|
#include <queue>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
@@ -69,8 +68,8 @@ namespace EQ
|
|||||||
SequencePast
|
SequencePast
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::chrono::high_resolution_clock::time_point Timestamp;
|
typedef std::chrono::steady_clock::time_point Timestamp;
|
||||||
typedef std::chrono::high_resolution_clock Clock;
|
typedef std::chrono::steady_clock Clock;
|
||||||
|
|
||||||
struct DaybreakConnectionStats
|
struct DaybreakConnectionStats
|
||||||
{
|
{
|
||||||
@@ -156,13 +155,13 @@ namespace EQ
|
|||||||
|
|
||||||
uint16_t sequence_in;
|
uint16_t sequence_in;
|
||||||
uint16_t sequence_out;
|
uint16_t sequence_out;
|
||||||
std::unordered_map<uint16_t, Packet*> packet_queue;
|
std::map<uint16_t, Packet*> packet_queue;
|
||||||
|
|
||||||
DynamicPacket fragment_packet;
|
DynamicPacket fragment_packet;
|
||||||
uint32_t fragment_current_bytes;
|
uint32_t fragment_current_bytes;
|
||||||
uint32_t fragment_total_bytes;
|
uint32_t fragment_total_bytes;
|
||||||
|
|
||||||
std::unordered_map<uint16_t, DaybreakSentPacket> sent_packets;
|
std::map<uint16_t, DaybreakSentPacket> sent_packets;
|
||||||
};
|
};
|
||||||
|
|
||||||
DaybreakStream m_streams[4];
|
DaybreakStream m_streams[4];
|
||||||
@@ -206,10 +205,10 @@ namespace EQ
|
|||||||
DaybreakConnectionManagerOptions() {
|
DaybreakConnectionManagerOptions() {
|
||||||
max_connection_count = 0;
|
max_connection_count = 0;
|
||||||
keepalive_delay_ms = 9000;
|
keepalive_delay_ms = 9000;
|
||||||
resend_delay_ms = 300;
|
resend_delay_ms = 150;
|
||||||
resend_delay_factor = 1.5;
|
resend_delay_factor = 1.5;
|
||||||
resend_delay_min = 350;
|
resend_delay_min = 150;
|
||||||
resend_delay_max = 8000;
|
resend_delay_max = 1000;
|
||||||
connect_delay_ms = 500;
|
connect_delay_ms = 500;
|
||||||
stale_connection_ms = 90000;
|
stale_connection_ms = 90000;
|
||||||
connect_stale_ms = 5000;
|
connect_stale_ms = 5000;
|
||||||
@@ -219,7 +218,7 @@ namespace EQ
|
|||||||
encode_passes[1] = DaybreakEncodeType::EncodeNone;
|
encode_passes[1] = DaybreakEncodeType::EncodeNone;
|
||||||
port = 0;
|
port = 0;
|
||||||
hold_size = 448;
|
hold_size = 448;
|
||||||
hold_length_ms = 10;
|
hold_length_ms = 50;
|
||||||
simulated_in_packet_loss = 0;
|
simulated_in_packet_loss = 0;
|
||||||
simulated_out_packet_loss = 0;
|
simulated_out_packet_loss = 0;
|
||||||
tic_rate_hertz = 60.0;
|
tic_rate_hertz = 60.0;
|
||||||
|
|||||||
@@ -81,8 +81,13 @@ void EQ::Net::EQStream::QueuePacket(const EQApplicationPacket *p, bool ack_req)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ack_req) {
|
||||||
m_connection->QueuePacket(out);
|
m_connection->QueuePacket(out);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
m_connection->QueuePacket(out, 0, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EQ::Net::EQStream::FastQueuePacket(EQApplicationPacket **p, bool ack_req) {
|
void EQ::Net::EQStream::FastQueuePacket(EQApplicationPacket **p, bool ack_req) {
|
||||||
|
|||||||
+60
-56
@@ -57,11 +57,11 @@ namespace RoF
|
|||||||
static inline uint32 RoFToServerTypelessSlot(structs::TypelessInventorySlot_Struct rofSlot);
|
static inline uint32 RoFToServerTypelessSlot(structs::TypelessInventorySlot_Struct rofSlot);
|
||||||
static inline uint32 RoFToServerCorpseSlot(uint32 rofCorpseSlot);
|
static inline uint32 RoFToServerCorpseSlot(uint32 rofCorpseSlot);
|
||||||
|
|
||||||
// server to client text link converter
|
// server to client say link converter
|
||||||
static inline void ServerToRoFTextLink(std::string& rofTextLink, const std::string& serverTextLink);
|
static inline void ServerToRoFSayLink(std::string& rofSayLink, const std::string& serverSayLink);
|
||||||
|
|
||||||
// client to server text link converter
|
// client to server say link converter
|
||||||
static inline void RoFToServerTextLink(std::string& serverTextLink, const std::string& rofTextLink);
|
static inline void RoFToServerSayLink(std::string& serverSayLink, const std::string& rofSayLink);
|
||||||
|
|
||||||
static inline CastingSlot ServerToRoFCastingSlot(EQEmu::CastingSlot slot);
|
static inline CastingSlot ServerToRoFCastingSlot(EQEmu::CastingSlot slot);
|
||||||
static inline EQEmu::CastingSlot RoFToServerCastingSlot(CastingSlot slot);
|
static inline EQEmu::CastingSlot RoFToServerCastingSlot(CastingSlot slot);
|
||||||
@@ -163,22 +163,23 @@ namespace RoF
|
|||||||
OUT(level);
|
OUT(level);
|
||||||
eq->unknown06 = 0;
|
eq->unknown06 = 0;
|
||||||
eq->instrument_mod = 1.0f + (emu->instrument_mod - 10) / 10.0f;
|
eq->instrument_mod = 1.0f + (emu->instrument_mod - 10) / 10.0f;
|
||||||
eq->bard_focus_id = emu->bard_focus_id;
|
OUT(force);
|
||||||
eq->knockback_angle = emu->sequence;
|
OUT(hit_heading);
|
||||||
eq->unknown22 = 0;
|
OUT(hit_pitch);
|
||||||
OUT(type);
|
OUT(type);
|
||||||
eq->damage = 0;
|
eq->damage = 0;
|
||||||
eq->unknown31 = 0;
|
eq->unknown31 = 0;
|
||||||
OUT(spell);
|
OUT(spell);
|
||||||
eq->level2 = eq->level;
|
OUT(spell_level);
|
||||||
eq->effect_flag = emu->buff_unknown;
|
OUT(effect_flag);
|
||||||
eq->unknown39 = 14;
|
eq->spell_gem = 0;
|
||||||
eq->unknown43 = 0;
|
eq->slot.Type = INVALID_INDEX;
|
||||||
eq->unknown44 = 17;
|
eq->slot.Unknown02 = 0;
|
||||||
eq->unknown45 = 0;
|
eq->slot.Slot = INVALID_INDEX;
|
||||||
eq->unknown46 = -1;
|
eq->slot.SubIndex = INVALID_INDEX;
|
||||||
eq->unknown50 = 0;
|
eq->slot.AugIndex = INVALID_INDEX;
|
||||||
eq->unknown54 = 0;
|
eq->slot.Unknown01 = 0;
|
||||||
|
eq->item_cast_type = 0;
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -460,7 +461,7 @@ namespace RoF
|
|||||||
{
|
{
|
||||||
SETUP_VAR_ENCODE(BuffIcon_Struct);
|
SETUP_VAR_ENCODE(BuffIcon_Struct);
|
||||||
|
|
||||||
uint32 sz = 12 + (17 * emu->count);
|
uint32 sz = 12 + (17 * emu->count) + emu->name_lengths; // 17 includes nullterm
|
||||||
__packet->size = sz;
|
__packet->size = sz;
|
||||||
__packet->pBuffer = new unsigned char[sz];
|
__packet->pBuffer = new unsigned char[sz];
|
||||||
memset(__packet->pBuffer, 0, sz);
|
memset(__packet->pBuffer, 0, sz);
|
||||||
@@ -476,7 +477,7 @@ namespace RoF
|
|||||||
__packet->WriteUInt32(emu->entries[i].spell_id);
|
__packet->WriteUInt32(emu->entries[i].spell_id);
|
||||||
__packet->WriteUInt32(emu->entries[i].tics_remaining);
|
__packet->WriteUInt32(emu->entries[i].tics_remaining);
|
||||||
__packet->WriteUInt32(emu->entries[i].num_hits); // Unknown
|
__packet->WriteUInt32(emu->entries[i].num_hits); // Unknown
|
||||||
__packet->WriteString("");
|
__packet->WriteString(emu->entries[i].caster);
|
||||||
}
|
}
|
||||||
__packet->WriteUInt8(emu->type); // Unknown
|
__packet->WriteUInt8(emu->type); // Unknown
|
||||||
|
|
||||||
@@ -520,7 +521,7 @@ namespace RoF
|
|||||||
|
|
||||||
std::string old_message = emu->message;
|
std::string old_message = emu->message;
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToRoFTextLink(new_message, old_message);
|
ServerToRoFSayLink(new_message, old_message);
|
||||||
|
|
||||||
//in->size = strlen(emu->sender) + 1 + strlen(emu->targetname) + 1 + strlen(emu->message) + 1 + 36;
|
//in->size = strlen(emu->sender) + 1 + strlen(emu->targetname) + 1 + strlen(emu->message) + 1 + 36;
|
||||||
in->size = strlen(emu->sender) + strlen(emu->targetname) + new_message.length() + 39;
|
in->size = strlen(emu->sender) + strlen(emu->targetname) + new_message.length() + 39;
|
||||||
@@ -659,8 +660,8 @@ namespace RoF
|
|||||||
OUT(spellid);
|
OUT(spellid);
|
||||||
OUT(damage);
|
OUT(damage);
|
||||||
OUT(force);
|
OUT(force);
|
||||||
OUT(meleepush_xy);
|
OUT(hit_heading);
|
||||||
OUT(meleepush_z);
|
OUT(hit_pitch);
|
||||||
OUT(special);
|
OUT(special);
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
@@ -847,7 +848,7 @@ namespace RoF
|
|||||||
|
|
||||||
std::string old_message = emu->message;
|
std::string old_message = emu->message;
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToRoFTextLink(new_message, old_message);
|
ServerToRoFSayLink(new_message, old_message);
|
||||||
|
|
||||||
//if (new_message.length() > 512) // length restricted in packet building function due vari-length name size (no nullterm)
|
//if (new_message.length() > 512) // length restricted in packet building function due vari-length name size (no nullterm)
|
||||||
// new_message = new_message.substr(0, 512);
|
// new_message = new_message.substr(0, 512);
|
||||||
@@ -899,7 +900,7 @@ namespace RoF
|
|||||||
|
|
||||||
for (int i = 0; i < 9; ++i) {
|
for (int i = 0; i < 9; ++i) {
|
||||||
if (old_message_array[i].length() == 0) { break; }
|
if (old_message_array[i].length() == 0) { break; }
|
||||||
ServerToRoFTextLink(new_message_array[i], old_message_array[i]);
|
ServerToRoFSayLink(new_message_array[i], old_message_array[i]);
|
||||||
new_message_size += new_message_array[i].length() + 1;
|
new_message_size += new_message_array[i].length() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2184,11 +2185,11 @@ namespace RoF
|
|||||||
outapp->WriteUInt32(emu->skills[r]);
|
outapp->WriteUInt32(emu->skills[r]);
|
||||||
}
|
}
|
||||||
|
|
||||||
outapp->WriteUInt32(25); // Unknown count
|
outapp->WriteUInt32(structs::MAX_PP_INNATE_SKILL); // Innate Skills count
|
||||||
|
|
||||||
for (uint32 r = 0; r < 25; r++)
|
for (uint32 r = 0; r < structs::MAX_PP_INNATE_SKILL; r++)
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(0); // Unknown
|
outapp->WriteUInt32(emu->InnateSkills[r]); // Innate Skills (regen, slam, etc)
|
||||||
}
|
}
|
||||||
|
|
||||||
outapp->WriteUInt32(structs::MAX_PP_DISCIPLINES); // Discipline count
|
outapp->WriteUInt32(structs::MAX_PP_DISCIPLINES); // Discipline count
|
||||||
@@ -3295,7 +3296,7 @@ namespace RoF
|
|||||||
std::string old_message = &emu->message[strlen(emu->sayer)];
|
std::string old_message = &emu->message[strlen(emu->sayer)];
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
|
|
||||||
ServerToRoFTextLink(new_message, old_message);
|
ServerToRoFSayLink(new_message, old_message);
|
||||||
|
|
||||||
//in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1;
|
//in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1;
|
||||||
in->size = strlen(emu->sayer) + new_message.length() + 25;
|
in->size = strlen(emu->sayer) + new_message.length() + 25;
|
||||||
@@ -3369,7 +3370,7 @@ namespace RoF
|
|||||||
|
|
||||||
std::string old_message = InBuffer; // start 'Reward' as string
|
std::string old_message = InBuffer; // start 'Reward' as string
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToRoFTextLink(new_message, old_message);
|
ServerToRoFSayLink(new_message, old_message);
|
||||||
|
|
||||||
in->size = sizeof(TaskDescriptionHeader_Struct) + sizeof(TaskDescriptionData1_Struct)+
|
in->size = sizeof(TaskDescriptionHeader_Struct) + sizeof(TaskDescriptionData1_Struct)+
|
||||||
sizeof(TaskDescriptionData2_Struct) + sizeof(TaskDescriptionTrailer_Struct)+
|
sizeof(TaskDescriptionData2_Struct) + sizeof(TaskDescriptionTrailer_Struct)+
|
||||||
@@ -3850,6 +3851,9 @@ namespace RoF
|
|||||||
OUT(zone_reason);
|
OUT(zone_reason);
|
||||||
OUT(success);
|
OUT(success);
|
||||||
|
|
||||||
|
if (eq->success < 0)
|
||||||
|
eq->success -= 1;
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3930,7 +3934,7 @@ namespace RoF
|
|||||||
if (strlen(emu->suffix))
|
if (strlen(emu->suffix))
|
||||||
PacketSize += strlen(emu->suffix) + 1;
|
PacketSize += strlen(emu->suffix) + 1;
|
||||||
|
|
||||||
bool ShowName = 1;
|
bool ShowName = emu->show_name;
|
||||||
if (emu->bodytype >= 66)
|
if (emu->bodytype >= 66)
|
||||||
{
|
{
|
||||||
emu->race = 127;
|
emu->race = 127;
|
||||||
@@ -4352,7 +4356,7 @@ namespace RoF
|
|||||||
|
|
||||||
std::string old_message = InBuffer;
|
std::string old_message = InBuffer;
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
RoFToServerTextLink(new_message, old_message);
|
RoFToServerSayLink(new_message, old_message);
|
||||||
|
|
||||||
//__packet->size = sizeof(ChannelMessage_Struct)+strlen(InBuffer) + 1;
|
//__packet->size = sizeof(ChannelMessage_Struct)+strlen(InBuffer) + 1;
|
||||||
__packet->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
__packet->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
||||||
@@ -4463,7 +4467,7 @@ namespace RoF
|
|||||||
IN(type);
|
IN(type);
|
||||||
IN(spellid);
|
IN(spellid);
|
||||||
IN(damage);
|
IN(damage);
|
||||||
IN(meleepush_xy);
|
IN(hit_heading);
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
@@ -4486,7 +4490,7 @@ namespace RoF
|
|||||||
|
|
||||||
std::string old_message = (char *)&__eq_buffer[4]; // unknown01 offset
|
std::string old_message = (char *)&__eq_buffer[4]; // unknown01 offset
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
RoFToServerTextLink(new_message, old_message);
|
RoFToServerSayLink(new_message, old_message);
|
||||||
|
|
||||||
__packet->size = sizeof(Emote_Struct);
|
__packet->size = sizeof(Emote_Struct);
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
__packet->pBuffer = new unsigned char[__packet->size];
|
||||||
@@ -5913,19 +5917,19 @@ namespace RoF
|
|||||||
return (rofCorpseSlot - 1);
|
return (rofCorpseSlot - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void ServerToRoFTextLink(std::string& rofTextLink, const std::string& serverTextLink)
|
static inline void ServerToRoFSayLink(std::string& rofSayLink, const std::string& serverSayLink)
|
||||||
{
|
{
|
||||||
if ((constants::SayLinkBodySize == EQEmu::legacy::TEXT_LINK_BODY_LENGTH) || (serverTextLink.find('\x12') == std::string::npos)) {
|
if ((constants::SayLinkBodySize == EQEmu::constants::SayLinkBodySize) || (serverSayLink.find('\x12') == std::string::npos)) {
|
||||||
rofTextLink = serverTextLink;
|
rofSayLink = serverSayLink;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto segments = SplitString(serverTextLink, '\x12');
|
auto segments = SplitString(serverSayLink, '\x12');
|
||||||
|
|
||||||
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
||||||
if (segment_iter & 1) {
|
if (segment_iter & 1) {
|
||||||
if (segments[segment_iter].length() <= EQEmu::legacy::TEXT_LINK_BODY_LENGTH) {
|
if (segments[segment_iter].length() <= EQEmu::constants::SayLinkBodySize) {
|
||||||
rofTextLink.append(segments[segment_iter]);
|
rofSayLink.append(segments[segment_iter]);
|
||||||
// TODO: log size mismatch error
|
// TODO: log size mismatch error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -5935,36 +5939,36 @@ namespace RoF
|
|||||||
// RoF: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX X XXXXX XXXXXXXX (55)
|
// RoF: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX X XXXXX XXXXXXXX (55)
|
||||||
// Diff: ^
|
// Diff: ^
|
||||||
|
|
||||||
rofTextLink.push_back('\x12');
|
rofSayLink.push_back('\x12');
|
||||||
rofTextLink.append(segments[segment_iter].substr(0, 41));
|
rofSayLink.append(segments[segment_iter].substr(0, 41));
|
||||||
|
|
||||||
if (segments[segment_iter][41] == '0')
|
if (segments[segment_iter][41] == '0')
|
||||||
rofTextLink.push_back(segments[segment_iter][42]);
|
rofSayLink.push_back(segments[segment_iter][42]);
|
||||||
else
|
else
|
||||||
rofTextLink.push_back('F');
|
rofSayLink.push_back('F');
|
||||||
|
|
||||||
rofTextLink.append(segments[segment_iter].substr(43));
|
rofSayLink.append(segments[segment_iter].substr(43));
|
||||||
rofTextLink.push_back('\x12');
|
rofSayLink.push_back('\x12');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
rofTextLink.append(segments[segment_iter]);
|
rofSayLink.append(segments[segment_iter]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void RoFToServerTextLink(std::string& serverTextLink, const std::string& rofTextLink)
|
static inline void RoFToServerSayLink(std::string& serverSayLink, const std::string& rofSayLink)
|
||||||
{
|
{
|
||||||
if ((EQEmu::legacy::TEXT_LINK_BODY_LENGTH == constants::SayLinkBodySize) || (rofTextLink.find('\x12') == std::string::npos)) {
|
if ((EQEmu::constants::SayLinkBodySize == constants::SayLinkBodySize) || (rofSayLink.find('\x12') == std::string::npos)) {
|
||||||
serverTextLink = rofTextLink;
|
serverSayLink = rofSayLink;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto segments = SplitString(rofTextLink, '\x12');
|
auto segments = SplitString(rofSayLink, '\x12');
|
||||||
|
|
||||||
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
||||||
if (segment_iter & 1) {
|
if (segment_iter & 1) {
|
||||||
if (segments[segment_iter].length() <= constants::SayLinkBodySize) {
|
if (segments[segment_iter].length() <= constants::SayLinkBodySize) {
|
||||||
serverTextLink.append(segments[segment_iter]);
|
serverSayLink.append(segments[segment_iter]);
|
||||||
// TODO: log size mismatch error
|
// TODO: log size mismatch error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -5974,14 +5978,14 @@ namespace RoF
|
|||||||
// RoF2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX XX XXXXX XXXXXXXX (56)
|
// RoF2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX XX XXXXX XXXXXXXX (56)
|
||||||
// Diff: ^
|
// Diff: ^
|
||||||
|
|
||||||
serverTextLink.push_back('\x12');
|
serverSayLink.push_back('\x12');
|
||||||
serverTextLink.append(segments[segment_iter].substr(0, 41));
|
serverSayLink.append(segments[segment_iter].substr(0, 41));
|
||||||
serverTextLink.push_back('0');
|
serverSayLink.push_back('0');
|
||||||
serverTextLink.append(segments[segment_iter].substr(41));
|
serverSayLink.append(segments[segment_iter].substr(41));
|
||||||
serverTextLink.push_back('\x12');
|
serverSayLink.push_back('\x12');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
serverTextLink.append(segments[segment_iter]);
|
serverSayLink.append(segments[segment_iter]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+109
-95
@@ -57,11 +57,11 @@ namespace RoF2
|
|||||||
static inline uint32 RoF2ToServerTypelessSlot(structs::TypelessInventorySlot_Struct rof2Slot);
|
static inline uint32 RoF2ToServerTypelessSlot(structs::TypelessInventorySlot_Struct rof2Slot);
|
||||||
static inline uint32 RoF2ToServerCorpseSlot(uint32 rof2CorpseSlot);
|
static inline uint32 RoF2ToServerCorpseSlot(uint32 rof2CorpseSlot);
|
||||||
|
|
||||||
// server to client text link converter
|
// server to client say link converter
|
||||||
static inline void ServerToRoF2TextLink(std::string& rof2TextLink, const std::string& serverTextLink);
|
static inline void ServerToRoF2SayLink(std::string& rof2SayLink, const std::string& serverSayLink);
|
||||||
|
|
||||||
// client to server text link converter
|
// client to server say link converter
|
||||||
static inline void RoF2ToServerTextLink(std::string& serverTextLink, const std::string& rof2TextLink);
|
static inline void RoF2ToServerSayLink(std::string& serverSayLink, const std::string& rof2SayLink);
|
||||||
|
|
||||||
static inline CastingSlot ServerToRoF2CastingSlot(EQEmu::CastingSlot slot);
|
static inline CastingSlot ServerToRoF2CastingSlot(EQEmu::CastingSlot slot);
|
||||||
static inline EQEmu::CastingSlot RoF2ToServerCastingSlot(CastingSlot slot);
|
static inline EQEmu::CastingSlot RoF2ToServerCastingSlot(CastingSlot slot);
|
||||||
@@ -232,22 +232,23 @@ namespace RoF2
|
|||||||
OUT(level);
|
OUT(level);
|
||||||
eq->unknown06 = 0;
|
eq->unknown06 = 0;
|
||||||
eq->instrument_mod = 1.0f + (emu->instrument_mod - 10) / 10.0f;
|
eq->instrument_mod = 1.0f + (emu->instrument_mod - 10) / 10.0f;
|
||||||
eq->bard_focus_id = emu->bard_focus_id;
|
OUT(force);
|
||||||
eq->knockback_angle = emu->sequence;
|
OUT(hit_heading);
|
||||||
eq->unknown22 = 0;
|
OUT(hit_pitch);
|
||||||
OUT(type);
|
OUT(type);
|
||||||
eq->damage = 0;
|
eq->damage = 0;
|
||||||
eq->unknown31 = 0;
|
eq->unknown31 = 0;
|
||||||
OUT(spell);
|
OUT(spell);
|
||||||
eq->level2 = eq->level;
|
OUT(spell_level);
|
||||||
eq->effect_flag = emu->buff_unknown;
|
OUT(effect_flag);
|
||||||
eq->unknown39 = 14;
|
eq->spell_gem = 0;
|
||||||
eq->unknown43 = 0;
|
eq->slot.Type = INVALID_INDEX;
|
||||||
eq->unknown44 = 17;
|
eq->slot.Unknown02 = 0;
|
||||||
eq->unknown45 = 0;
|
eq->slot.Slot = INVALID_INDEX;
|
||||||
eq->unknown46 = -1;
|
eq->slot.SubIndex = INVALID_INDEX;
|
||||||
eq->unknown50 = 0;
|
eq->slot.AugIndex = INVALID_INDEX;
|
||||||
eq->unknown54 = 0;
|
eq->slot.Unknown01 = 0;
|
||||||
|
eq->item_cast_type = 0;
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -528,7 +529,7 @@ namespace RoF2
|
|||||||
{
|
{
|
||||||
SETUP_VAR_ENCODE(BuffIcon_Struct);
|
SETUP_VAR_ENCODE(BuffIcon_Struct);
|
||||||
|
|
||||||
uint32 sz = 12 + (17 * emu->count);
|
uint32 sz = 12 + (17 * emu->count) + emu->name_lengths; // 17 includes nullterm
|
||||||
__packet->size = sz;
|
__packet->size = sz;
|
||||||
__packet->pBuffer = new unsigned char[sz];
|
__packet->pBuffer = new unsigned char[sz];
|
||||||
memset(__packet->pBuffer, 0, sz);
|
memset(__packet->pBuffer, 0, sz);
|
||||||
@@ -544,7 +545,7 @@ namespace RoF2
|
|||||||
__packet->WriteUInt32(emu->entries[i].spell_id);
|
__packet->WriteUInt32(emu->entries[i].spell_id);
|
||||||
__packet->WriteUInt32(emu->entries[i].tics_remaining);
|
__packet->WriteUInt32(emu->entries[i].tics_remaining);
|
||||||
__packet->WriteUInt32(emu->entries[i].num_hits); // Unknown
|
__packet->WriteUInt32(emu->entries[i].num_hits); // Unknown
|
||||||
__packet->WriteString("");
|
__packet->WriteString(emu->entries[i].caster);
|
||||||
}
|
}
|
||||||
__packet->WriteUInt8(emu->type); // Unknown
|
__packet->WriteUInt8(emu->type); // Unknown
|
||||||
|
|
||||||
@@ -588,7 +589,7 @@ namespace RoF2
|
|||||||
|
|
||||||
std::string old_message = emu->message;
|
std::string old_message = emu->message;
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToRoF2TextLink(new_message, old_message);
|
ServerToRoF2SayLink(new_message, old_message);
|
||||||
|
|
||||||
//in->size = strlen(emu->sender) + 1 + strlen(emu->targetname) + 1 + strlen(emu->message) + 1 + 36;
|
//in->size = strlen(emu->sender) + 1 + strlen(emu->targetname) + 1 + strlen(emu->message) + 1 + 36;
|
||||||
in->size = strlen(emu->sender) + strlen(emu->targetname) + new_message.length() + 39;
|
in->size = strlen(emu->sender) + strlen(emu->targetname) + new_message.length() + 39;
|
||||||
@@ -727,8 +728,8 @@ namespace RoF2
|
|||||||
OUT(spellid);
|
OUT(spellid);
|
||||||
OUT(damage);
|
OUT(damage);
|
||||||
OUT(force);
|
OUT(force);
|
||||||
OUT(meleepush_xy);
|
OUT(hit_heading);
|
||||||
OUT(meleepush_z);
|
OUT(hit_pitch);
|
||||||
OUT(special);
|
OUT(special);
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
@@ -915,7 +916,7 @@ namespace RoF2
|
|||||||
|
|
||||||
std::string old_message = emu->message;
|
std::string old_message = emu->message;
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToRoF2TextLink(new_message, old_message);
|
ServerToRoF2SayLink(new_message, old_message);
|
||||||
|
|
||||||
//if (new_message.length() > 512) // length restricted in packet building function due vari-length name size (no nullterm)
|
//if (new_message.length() > 512) // length restricted in packet building function due vari-length name size (no nullterm)
|
||||||
// new_message = new_message.substr(0, 512);
|
// new_message = new_message.substr(0, 512);
|
||||||
@@ -967,7 +968,7 @@ namespace RoF2
|
|||||||
|
|
||||||
for (int i = 0; i < 9; ++i) {
|
for (int i = 0; i < 9; ++i) {
|
||||||
if (old_message_array[i].length() == 0) { break; }
|
if (old_message_array[i].length() == 0) { break; }
|
||||||
ServerToRoF2TextLink(new_message_array[i], old_message_array[i]);
|
ServerToRoF2SayLink(new_message_array[i], old_message_array[i]);
|
||||||
new_message_size += new_message_array[i].length() + 1;
|
new_message_size += new_message_array[i].length() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1883,35 +1884,34 @@ namespace RoF2
|
|||||||
eq->FogDensity = emu->fog_density;
|
eq->FogDensity = emu->fog_density;
|
||||||
|
|
||||||
/*fill in some unknowns with observed values, hopefully it will help */
|
/*fill in some unknowns with observed values, hopefully it will help */
|
||||||
eq->unknown569 = 0;
|
eq->ZoneTimeZone = 0;
|
||||||
eq->unknown571 = 0;
|
eq->unknown571 = 0;
|
||||||
eq->unknown572 = 4;
|
eq->WaterMidi = 4;
|
||||||
eq->unknown576 = 2;
|
eq->DayMidi = 2;
|
||||||
eq->unknown580 = 0;
|
eq->NightMidi = 0;
|
||||||
|
|
||||||
eq->unknown800 = -1;
|
eq->SkyRelated2 = -1;
|
||||||
eq->unknown844 = 600;
|
eq->NPCAggroMaxDist = 600;
|
||||||
eq->unknown848 = 2008; // Guild Lobby observed value
|
eq->FilterID = 2008; // Guild Lobby observed value
|
||||||
eq->unknown880 = 50;
|
eq->LavaDamage = 50;
|
||||||
eq->unknown884 = 10;
|
eq->MinLavaDamage = 10;
|
||||||
eq->unknown888 = 1;
|
eq->bDisallowManaStone = 1;
|
||||||
eq->unknown889 = 0;
|
eq->bNoBind = 0;
|
||||||
eq->unknown890 = 1;
|
eq->bNoAttack = 0;
|
||||||
eq->unknown891 = 0;
|
eq->bNoCallOfHero = 0;
|
||||||
eq->unknown892 = 0;
|
eq->bNoFlux = 0;
|
||||||
eq->unknown893 = 0;
|
eq->bNoFear = 0;
|
||||||
eq->fall_damage = 0; // 0 = Fall Damage on, 1 = Fall Damage off
|
eq->fall_damage = 0; // 0 = Fall Damage on, 1 = Fall Damage off
|
||||||
eq->unknown895 = 0;
|
eq->unknown895 = 0;
|
||||||
eq->unknown896 = 180;
|
eq->FastRegenHP = 180;
|
||||||
eq->unknown900 = 180;
|
eq->FastRegenMana = 180;
|
||||||
eq->unknown904 = 180;
|
eq->FastRegenEndurance = 180;
|
||||||
eq->unknown908 = 2;
|
eq->CanPlaceCampsite = 2;
|
||||||
eq->unknown912 = 2;
|
eq->CanPlaceGuildBanner = 2;
|
||||||
eq->unknown932 = -1; // Set from PoK Example
|
eq->FishingRelated = -1; // Set from PoK Example
|
||||||
eq->unknown936 = -1; // Set from PoK Example
|
eq->ForageRelated = -1; // Set from PoK Example
|
||||||
eq->unknown944 = 1.0; // Set from PoK Example
|
eq->bNoLevitate = 0;
|
||||||
eq->unknown948 = 0; // New on Live as of Dec 15 2014
|
eq->Blooming = 1.0; // Set from PoK Example
|
||||||
eq->unknown952 = 100; // New on Live as of Dec 15 2014
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -2262,11 +2262,11 @@ namespace RoF2
|
|||||||
outapp->WriteUInt32(emu->skills[r]);
|
outapp->WriteUInt32(emu->skills[r]);
|
||||||
}
|
}
|
||||||
|
|
||||||
outapp->WriteUInt32(25); // Unknown count
|
outapp->WriteUInt32(structs::MAX_PP_INNATE_SKILL); // Innate Skills count
|
||||||
|
|
||||||
for (uint32 r = 0; r < 25; r++)
|
for (uint32 r = 0; r < structs::MAX_PP_INNATE_SKILL; r++)
|
||||||
{
|
{
|
||||||
outapp->WriteUInt32(0); // Unknown
|
outapp->WriteUInt32(emu->InnateSkills[r]); // Innate Skills (regen, slam, etc)
|
||||||
}
|
}
|
||||||
|
|
||||||
outapp->WriteUInt32(structs::MAX_PP_DISCIPLINES); // Discipline count
|
outapp->WriteUInt32(structs::MAX_PP_DISCIPLINES); // Discipline count
|
||||||
@@ -3365,7 +3365,7 @@ namespace RoF2
|
|||||||
std::string old_message = &emu->message[strlen(emu->sayer)];
|
std::string old_message = &emu->message[strlen(emu->sayer)];
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
|
|
||||||
ServerToRoF2TextLink(new_message, old_message);
|
ServerToRoF2SayLink(new_message, old_message);
|
||||||
|
|
||||||
//in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1;
|
//in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1;
|
||||||
in->size = strlen(emu->sayer) + new_message.length() + 25;
|
in->size = strlen(emu->sayer) + new_message.length() + 25;
|
||||||
@@ -3439,7 +3439,7 @@ namespace RoF2
|
|||||||
|
|
||||||
std::string old_message = InBuffer; // start 'Reward' as string
|
std::string old_message = InBuffer; // start 'Reward' as string
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToRoF2TextLink(new_message, old_message);
|
ServerToRoF2SayLink(new_message, old_message);
|
||||||
|
|
||||||
in->size = sizeof(TaskDescriptionHeader_Struct) + sizeof(TaskDescriptionData1_Struct)+
|
in->size = sizeof(TaskDescriptionHeader_Struct) + sizeof(TaskDescriptionData1_Struct)+
|
||||||
sizeof(TaskDescriptionData2_Struct) + sizeof(TaskDescriptionTrailer_Struct)+
|
sizeof(TaskDescriptionData2_Struct) + sizeof(TaskDescriptionTrailer_Struct)+
|
||||||
@@ -3995,6 +3995,9 @@ namespace RoF2
|
|||||||
OUT(zone_reason);
|
OUT(zone_reason);
|
||||||
OUT(success);
|
OUT(success);
|
||||||
|
|
||||||
|
if (eq->success < 0)
|
||||||
|
eq->success -= 1;
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4086,7 +4089,7 @@ namespace RoF2
|
|||||||
PacketSize += strlen(emu->DestructibleString) + 1;
|
PacketSize += strlen(emu->DestructibleString) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ShowName = 1;
|
bool ShowName = emu->show_name;
|
||||||
if (emu->bodytype >= 66)
|
if (emu->bodytype >= 66)
|
||||||
{
|
{
|
||||||
emu->race = 127;
|
emu->race = 127;
|
||||||
@@ -4120,6 +4123,7 @@ namespace RoF2
|
|||||||
VARSTRUCT_ENCODE_STRING(Buffer, emu->name);
|
VARSTRUCT_ENCODE_STRING(Buffer, emu->name);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->spawnId);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->spawnId);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->level);
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->level);
|
||||||
|
// actually melee range variable, this probably screws the shit out of melee ranges :D
|
||||||
if (emu->DestructibleObject)
|
if (emu->DestructibleObject)
|
||||||
{
|
{
|
||||||
VARSTRUCT_ENCODE_TYPE(float, Buffer, 10); // was int and 0x41200000
|
VARSTRUCT_ENCODE_TYPE(float, Buffer, 10); // was int and 0x41200000
|
||||||
@@ -4128,7 +4132,7 @@ namespace RoF2
|
|||||||
{
|
{
|
||||||
VARSTRUCT_ENCODE_TYPE(float, Buffer, SpawnSize - 0.7); // Eye Height?
|
VARSTRUCT_ENCODE_TYPE(float, Buffer, SpawnSize - 0.7); // Eye Height?
|
||||||
}
|
}
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->NPC);
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->NPC); // 0 PC, 1 NPC etc
|
||||||
|
|
||||||
structs::Spawn_Struct_Bitfields *Bitfields = (structs::Spawn_Struct_Bitfields*)Buffer;
|
structs::Spawn_Struct_Bitfields *Bitfields = (structs::Spawn_Struct_Bitfields*)Buffer;
|
||||||
|
|
||||||
@@ -4159,6 +4163,7 @@ namespace RoF2
|
|||||||
|
|
||||||
Buffer += sizeof(structs::Spawn_Struct_Bitfields);
|
Buffer += sizeof(structs::Spawn_Struct_Bitfields);
|
||||||
|
|
||||||
|
// actually part of bitfields
|
||||||
uint8 OtherData = 0;
|
uint8 OtherData = 0;
|
||||||
|
|
||||||
if (emu->class_ == 62) //LDoN Chest
|
if (emu->class_ == 62) //LDoN Chest
|
||||||
@@ -4174,6 +4179,7 @@ namespace RoF2
|
|||||||
OtherData = OtherData | 0xe1; // Live has 0xe1 for OtherData
|
OtherData = OtherData | 0xe1; // Live has 0xe1 for OtherData
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, OtherData);
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, OtherData);
|
||||||
|
// float EmitterScalingRadius
|
||||||
|
|
||||||
if (emu->DestructibleObject)
|
if (emu->DestructibleObject)
|
||||||
{
|
{
|
||||||
@@ -4183,6 +4189,7 @@ namespace RoF2
|
|||||||
{
|
{
|
||||||
VARSTRUCT_ENCODE_TYPE(float, Buffer, -1); // unknown3
|
VARSTRUCT_ENCODE_TYPE(float, Buffer, -1); // unknown3
|
||||||
}
|
}
|
||||||
|
// int DefaultEmitterID
|
||||||
VARSTRUCT_ENCODE_TYPE(float, Buffer, 0); // unknown4
|
VARSTRUCT_ENCODE_TYPE(float, Buffer, 0); // unknown4
|
||||||
|
|
||||||
if (emu->DestructibleObject || emu->class_ == 62)
|
if (emu->DestructibleObject || emu->class_ == 62)
|
||||||
@@ -4192,8 +4199,9 @@ namespace RoF2
|
|||||||
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleString);
|
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleString);
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleAppearance);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleAppearance);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleUnk1);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleUnk1); // ObjectAnimationID
|
||||||
|
|
||||||
|
// these 10 are SoundIDs
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleID1);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleID1);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleID2);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleID2);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleID3);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleID3);
|
||||||
@@ -4205,8 +4213,8 @@ namespace RoF2
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleUnk5);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleUnk5);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleUnk6);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleUnk6);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleUnk7);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleUnk7);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->DestructibleUnk8);
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->DestructibleUnk8); // bInteractiveObjectCollidable
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleUnk9);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->DestructibleUnk9); // IteractiveObjectType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -4214,6 +4222,7 @@ namespace RoF2
|
|||||||
{
|
{
|
||||||
// Setting this next field to zero will cause a crash. Looking at ShowEQ, if it is zero, the bodytype field is not
|
// Setting this next field to zero will cause a crash. Looking at ShowEQ, if it is zero, the bodytype field is not
|
||||||
// present. Will sort that out later.
|
// present. Will sort that out later.
|
||||||
|
// This is the CharacterPropertyHash, it can have multiple fields
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 1); // This is a properties count field
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 1); // This is a properties count field
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->bodytype);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->bodytype);
|
||||||
}
|
}
|
||||||
@@ -4233,10 +4242,10 @@ namespace RoF2
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->drakkin_tattoo);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->drakkin_tattoo);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->drakkin_details);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->drakkin_details);
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->equip_chest2);
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->equip_chest2); // InNonPCRaceIllusion
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // unknown9
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // material
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // unknown10
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // variation
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->helm); // unknown11
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->helm); // headtype
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(float, Buffer, emu->size);
|
VARSTRUCT_ENCODE_TYPE(float, Buffer, emu->size);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->face);
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->face);
|
||||||
@@ -4244,6 +4253,7 @@ namespace RoF2
|
|||||||
VARSTRUCT_ENCODE_TYPE(float, Buffer, emu->runspeed);
|
VARSTRUCT_ENCODE_TYPE(float, Buffer, emu->runspeed);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->race);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->race);
|
||||||
|
|
||||||
|
// From MQ2: todo: create enum for this byte. Holding: Nothing=0 A RightHand Weapon=1 A Shield=2 Dual Wielding Two Weapons=3 A Spear=4 A LeftHand Weapon=5 A Two Handed Weapon=6 A bow=7
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // ShowEQ calls this 'Holding'
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // ShowEQ calls this 'Holding'
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->deity);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->deity);
|
||||||
if (emu->NPC)
|
if (emu->NPC)
|
||||||
@@ -4276,19 +4286,19 @@ namespace RoF2
|
|||||||
|
|
||||||
VARSTRUCT_ENCODE_STRING(Buffer, emu->lastName);
|
VARSTRUCT_ENCODE_STRING(Buffer, emu->lastName);
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // aatitle ??
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // aatitle
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->NPC ? 0 : 1); // unknown - Must be 1 for guild name to be shown abover players head.
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->NPC ? 0 : 1); // unknown - Must be 1 for guild name to be shown abover players head.
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // unknown
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // TempPet
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->petOwnerId);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->petOwnerId);
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // unknown13
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // FindBits MQ2 name
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->PlayerState);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->PlayerState);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // unknown15
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // NpcTintIndex
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // unknown16
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // PrimaryTintIndex
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // unknown17
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // SecondaryTintIndex
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // unknown18
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // These do something with OP_WeaponEquip1
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // unknown19
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // ^
|
||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
|
if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))
|
||||||
{
|
{
|
||||||
@@ -4356,12 +4366,16 @@ namespace RoF2
|
|||||||
VARSTRUCT_ENCODE_STRING(Buffer, emu->suffix);
|
VARSTRUCT_ENCODE_STRING(Buffer, emu->suffix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// skipping two ints
|
||||||
|
// unknown, maybe some sort of spawn ID
|
||||||
|
// SplineID -- no idea
|
||||||
Buffer += 8;
|
Buffer += 8;
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->IsMercenary);
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->IsMercenary);
|
||||||
VARSTRUCT_ENCODE_STRING(Buffer, "0000000000000000");
|
VARSTRUCT_ENCODE_STRING(Buffer, "0000000000000000"); // RealEstateItemGuid
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // RealEstateID
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // RealEstateItemID
|
||||||
// 29 zero bytes follow
|
// 29 zero bytes follow
|
||||||
|
// PhysicsEffects follow here ... unsure what they are but it's a count followed by a struct like {spellid, casterid, effectid, baseeffect}
|
||||||
Buffer += 29;
|
Buffer += 29;
|
||||||
if (Buffer != (BufferStart + PacketSize))
|
if (Buffer != (BufferStart + PacketSize))
|
||||||
{
|
{
|
||||||
@@ -4582,7 +4596,7 @@ namespace RoF2
|
|||||||
|
|
||||||
std::string old_message = InBuffer;
|
std::string old_message = InBuffer;
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
RoF2ToServerTextLink(new_message, old_message);
|
RoF2ToServerSayLink(new_message, old_message);
|
||||||
|
|
||||||
//__packet->size = sizeof(ChannelMessage_Struct)+strlen(InBuffer) + 1;
|
//__packet->size = sizeof(ChannelMessage_Struct)+strlen(InBuffer) + 1;
|
||||||
__packet->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
__packet->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
||||||
@@ -4693,7 +4707,7 @@ namespace RoF2
|
|||||||
IN(type);
|
IN(type);
|
||||||
IN(spellid);
|
IN(spellid);
|
||||||
IN(damage);
|
IN(damage);
|
||||||
IN(meleepush_xy);
|
IN(hit_heading);
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
@@ -4716,7 +4730,7 @@ namespace RoF2
|
|||||||
|
|
||||||
std::string old_message = (char *)&__eq_buffer[4]; // unknown01 offset
|
std::string old_message = (char *)&__eq_buffer[4]; // unknown01 offset
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
RoF2ToServerTextLink(new_message, old_message);
|
RoF2ToServerSayLink(new_message, old_message);
|
||||||
|
|
||||||
__packet->size = sizeof(Emote_Struct);
|
__packet->size = sizeof(Emote_Struct);
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
__packet->pBuffer = new unsigned char[__packet->size];
|
||||||
@@ -6220,19 +6234,19 @@ namespace RoF2
|
|||||||
return (rof2CorpseSlot + EQEmu::legacy::CORPSE_BEGIN - 1);
|
return (rof2CorpseSlot + EQEmu::legacy::CORPSE_BEGIN - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void ServerToRoF2TextLink(std::string& rof2TextLink, const std::string& serverTextLink)
|
static inline void ServerToRoF2SayLink(std::string& rof2SayLink, const std::string& serverSayLink)
|
||||||
{
|
{
|
||||||
if ((constants::SayLinkBodySize == EQEmu::legacy::TEXT_LINK_BODY_LENGTH) || (serverTextLink.find('\x12') == std::string::npos)) {
|
if ((constants::SayLinkBodySize == EQEmu::constants::SayLinkBodySize) || (serverSayLink.find('\x12') == std::string::npos)) {
|
||||||
rof2TextLink = serverTextLink;
|
rof2SayLink = serverSayLink;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto segments = SplitString(serverTextLink, '\x12');
|
auto segments = SplitString(serverSayLink, '\x12');
|
||||||
|
|
||||||
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
||||||
if (segment_iter & 1) {
|
if (segment_iter & 1) {
|
||||||
if (segments[segment_iter].length() <= EQEmu::legacy::TEXT_LINK_BODY_LENGTH) {
|
if (segments[segment_iter].length() <= EQEmu::constants::SayLinkBodySize) {
|
||||||
rof2TextLink.append(segments[segment_iter]);
|
rof2SayLink.append(segments[segment_iter]);
|
||||||
// TODO: log size mismatch error
|
// TODO: log size mismatch error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -6242,29 +6256,29 @@ namespace RoF2
|
|||||||
// RoF2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX XX XXXXX XXXXXXXX (56)
|
// RoF2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX XX XXXXX XXXXXXXX (56)
|
||||||
// Diff:
|
// Diff:
|
||||||
|
|
||||||
rof2TextLink.push_back('\x12');
|
rof2SayLink.push_back('\x12');
|
||||||
rof2TextLink.append(segments[segment_iter]);
|
rof2SayLink.append(segments[segment_iter]);
|
||||||
rof2TextLink.push_back('\x12');
|
rof2SayLink.push_back('\x12');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
rof2TextLink.append(segments[segment_iter]);
|
rof2SayLink.append(segments[segment_iter]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void RoF2ToServerTextLink(std::string& serverTextLink, const std::string& rof2TextLink)
|
static inline void RoF2ToServerSayLink(std::string& serverSayLink, const std::string& rof2SayLink)
|
||||||
{
|
{
|
||||||
if ((EQEmu::legacy::TEXT_LINK_BODY_LENGTH == constants::SayLinkBodySize) || (rof2TextLink.find('\x12') == std::string::npos)) {
|
if ((EQEmu::constants::SayLinkBodySize == constants::SayLinkBodySize) || (rof2SayLink.find('\x12') == std::string::npos)) {
|
||||||
serverTextLink = rof2TextLink;
|
serverSayLink = rof2SayLink;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto segments = SplitString(rof2TextLink, '\x12');
|
auto segments = SplitString(rof2SayLink, '\x12');
|
||||||
|
|
||||||
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
||||||
if (segment_iter & 1) {
|
if (segment_iter & 1) {
|
||||||
if (segments[segment_iter].length() <= constants::SayLinkBodySize) {
|
if (segments[segment_iter].length() <= constants::SayLinkBodySize) {
|
||||||
serverTextLink.append(segments[segment_iter]);
|
serverSayLink.append(segments[segment_iter]);
|
||||||
// TODO: log size mismatch error
|
// TODO: log size mismatch error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -6274,12 +6288,12 @@ namespace RoF2
|
|||||||
// RoF2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX XX XXXXX XXXXXXXX (56)
|
// RoF2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX XX XXXXX XXXXXXXX (56)
|
||||||
// Diff:
|
// Diff:
|
||||||
|
|
||||||
serverTextLink.push_back('\x12');
|
serverSayLink.push_back('\x12');
|
||||||
serverTextLink.append(segments[segment_iter]);
|
serverSayLink.append(segments[segment_iter]);
|
||||||
serverTextLink.push_back('\x12');
|
serverSayLink.push_back('\x12');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
serverTextLink.append(segments[segment_iter]);
|
serverSayLink.append(segments[segment_iter]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -164,7 +164,7 @@ namespace RoF2
|
|||||||
ItemPacket11 = 111,
|
ItemPacket11 = 111,
|
||||||
ItemPacket12 = 112,
|
ItemPacket12 = 112,
|
||||||
ItemPacketRecovery = 113,
|
ItemPacketRecovery = 113,
|
||||||
ItemPacket14 = 115
|
ItemPacket14 = 115 // Parcel? adds to merchant window too
|
||||||
};
|
};
|
||||||
|
|
||||||
} /*item*/
|
} /*item*/
|
||||||
|
|||||||
+178
-134
@@ -131,6 +131,7 @@ static const uint32 MAX_PP_LANGUAGE = 32; // was 25
|
|||||||
static const uint32 MAX_PP_SPELLBOOK = 720; // was 480
|
static const uint32 MAX_PP_SPELLBOOK = 720; // was 480
|
||||||
static const uint32 MAX_PP_MEMSPELL = 16; // was 12
|
static const uint32 MAX_PP_MEMSPELL = 16; // was 12
|
||||||
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
||||||
|
static const uint32 MAX_PP_INNATE_SKILL = 25;
|
||||||
static const uint32 MAX_PP_AA_ARRAY = 300;
|
static const uint32 MAX_PP_AA_ARRAY = 300;
|
||||||
static const uint32 MAX_PP_DISCIPLINES = 300; // was 200
|
static const uint32 MAX_PP_DISCIPLINES = 300; // was 200
|
||||||
static const uint32 MAX_GROUP_MEMBERS = 6;
|
static const uint32 MAX_GROUP_MEMBERS = 6;
|
||||||
@@ -328,38 +329,43 @@ showeq -> eqemu
|
|||||||
sed -e 's/_t//g' -e 's/seto_0xFF/set_to_0xFF/g'
|
sed -e 's/_t//g' -e 's/seto_0xFF/set_to_0xFF/g'
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// I think this is actually 5 bytes
|
||||||
|
// IDA's pseudocode reads this as 5 bytes pulled into 2 DWORDs
|
||||||
struct Spawn_Struct_Bitfields
|
struct Spawn_Struct_Bitfields
|
||||||
{
|
{
|
||||||
|
// byte 1
|
||||||
/*00*/ unsigned gender:2; // Gender (0=male, 1=female, 2=monster)
|
/*00*/ unsigned gender:2; // Gender (0=male, 1=female, 2=monster)
|
||||||
/*02*/ unsigned ispet:1; // Guessed based on observing live spawns
|
/*02*/ unsigned ispet:1; // Guessed based on observing live spawns
|
||||||
/*03*/ unsigned afk:1; // 0=no, 1=afk
|
/*03*/ unsigned afk:1; // 0=no, 1=afk
|
||||||
/*04*/ unsigned anon:2; // 0=normal, 1=anon, 2=roleplay
|
/*04*/ unsigned anon:2; // 0=normal, 1=anon, 2=roleplay
|
||||||
/*06*/ unsigned gm:1;
|
/*06*/ unsigned gm:1;
|
||||||
/*06*/ unsigned sneak:1;
|
/*07*/ unsigned sneak:1;
|
||||||
|
// byte 2
|
||||||
/*08*/ unsigned lfg:1;
|
/*08*/ unsigned lfg:1;
|
||||||
/*09*/ unsigned unknown09:1;
|
/*09*/ unsigned betabuffed:1;
|
||||||
/*10*/ unsigned invis:1; // May have invis & sneak the wrong way around ... not sure how to tell which is which
|
/*10*/ unsigned invis:12; // there are 3000 different (non-GM) invis levels
|
||||||
/*11*/ unsigned invis1:1; // GM Invis? Can only be seen with #gm on - same for the below
|
|
||||||
/*12*/ unsigned invis2:1; // This one also make the NPC/PC invis
|
|
||||||
/*13*/ unsigned invis3:1; // This one also make the NPC/PC invis
|
|
||||||
/*14*/ unsigned invis4:1; // This one also make the NPC/PC invis
|
|
||||||
/*15*/ unsigned invis6:1; // This one also make the NPC/PC invis
|
|
||||||
/*16*/ unsigned invis7:1; // This one also make the NPC/PC invis
|
|
||||||
/*17*/ unsigned invis8:1; // This one also make the NPC/PC invis
|
|
||||||
/*18*/ unsigned invis9:1; // This one also make the NPC/PC invis
|
|
||||||
/*19*/ unsigned invis10:1; // This one also make the NPC/PC invis
|
|
||||||
/*20*/ unsigned invis11:1; // This one also make the NPC/PC invis
|
|
||||||
/*21*/ unsigned invis12:1; // This one also make the NPC/PC invis
|
|
||||||
/*22*/ unsigned linkdead:1; // 1 Toggles LD on or off after name. Correct for RoF2
|
/*22*/ unsigned linkdead:1; // 1 Toggles LD on or off after name. Correct for RoF2
|
||||||
/*23*/ unsigned showhelm:1;
|
/*23*/ unsigned showhelm:1;
|
||||||
|
// byte 4
|
||||||
/*24*/ unsigned unknown24:1; // Prefixes name with !
|
/*24*/ unsigned unknown24:1; // Prefixes name with !
|
||||||
/*25*/ unsigned trader:1;
|
/*25*/ unsigned trader:1;
|
||||||
/*26*/ unsigned unknown26:1;
|
/*26*/ unsigned animationonpop:1;
|
||||||
/*27*/ unsigned targetable:1;
|
/*27*/ unsigned targetable:1;
|
||||||
/*28*/ unsigned targetable_with_hotkey:1;
|
/*28*/ unsigned targetable_with_hotkey:1;
|
||||||
/*29*/ unsigned showname:1;
|
/*29*/ unsigned showname:1;
|
||||||
/*30*/ unsigned unknown30:1;
|
/*30*/ unsigned idleanimationsoff:1; // what we called statue?
|
||||||
/*30*/ unsigned untargetable:1; // Untargetable with mouse
|
/*31*/ unsigned untargetable:1; // bClickThrough
|
||||||
|
/* do these later
|
||||||
|
32 unsigned buyer:1;
|
||||||
|
33 unsigned offline:1;
|
||||||
|
34 unsigned interactiveobject:1;
|
||||||
|
35 unsigned flung:1; // hmm this vfunc appears to do stuff with leve and flung variables
|
||||||
|
36 unsigned title:1;
|
||||||
|
37 unsigned suffix:1;
|
||||||
|
38 unsigned padding1:1;
|
||||||
|
39 unsigned padding2:1;
|
||||||
|
40 unsinged padding3:1;
|
||||||
|
*/
|
||||||
/*
|
/*
|
||||||
// Unknown in RoF2
|
// Unknown in RoF2
|
||||||
unsigned betabuffed:1;
|
unsigned betabuffed:1;
|
||||||
@@ -394,7 +400,7 @@ struct Spawn_Struct_Position
|
|||||||
|
|
||||||
struct Spawn_Struct_Position
|
struct Spawn_Struct_Position
|
||||||
{
|
{
|
||||||
signed padding0000:12;
|
signed angle:12; // pitch of camera?
|
||||||
signed y:19;
|
signed y:19;
|
||||||
signed padding0001:1;
|
signed padding0001:1;
|
||||||
|
|
||||||
@@ -410,7 +416,7 @@ struct Spawn_Struct_Position
|
|||||||
signed z:19;
|
signed z:19;
|
||||||
signed padding0020:3;
|
signed padding0020:3;
|
||||||
|
|
||||||
signed animation:10; // animation
|
signed animation:10; // SpeedRun
|
||||||
signed deltaY:13;
|
signed deltaY:13;
|
||||||
signed padding0023:9;
|
signed padding0023:9;
|
||||||
};
|
};
|
||||||
@@ -424,7 +430,7 @@ struct Spawn_Struct
|
|||||||
/*0000*/ //uint8 nullterm1; // hack to null terminate name
|
/*0000*/ //uint8 nullterm1; // hack to null terminate name
|
||||||
/*0064*/ uint32 spawnId;
|
/*0064*/ uint32 spawnId;
|
||||||
/*0068*/ uint8 level;
|
/*0068*/ uint8 level;
|
||||||
/*0069*/ float unknown1;
|
/*0069*/ float bounding_radius; // used in melee, overrides calc
|
||||||
/*0073*/ uint8 NPC; // 0=player,1=npc,2=pc corpse,3=npc corpse
|
/*0073*/ uint8 NPC; // 0=player,1=npc,2=pc corpse,3=npc corpse
|
||||||
Spawn_Struct_Bitfields Bitfields;
|
Spawn_Struct_Bitfields Bitfields;
|
||||||
/*0000*/ uint8 otherData; // & 4 - has title, & 8 - has suffix, & 1 - it's a chest or untargetable
|
/*0000*/ uint8 otherData; // & 4 - has title, & 8 - has suffix, & 1 - it's a chest or untargetable
|
||||||
@@ -498,7 +504,7 @@ struct Spawn_Struct
|
|||||||
|
|
||||||
/*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4)
|
/*0000*/ //char title[0]; // only read if(hasTitleOrSuffix & 4)
|
||||||
/*0000*/ //char suffix[0]; // only read if(hasTitleOrSuffix & 8)
|
/*0000*/ //char suffix[0]; // only read if(hasTitleOrSuffix & 8)
|
||||||
char unknown20[8];
|
char unknown20[8]; // 2 ints, first unknown, 2nd SplineID
|
||||||
uint8 IsMercenary; // If NPC == 1 and this == 1, then the NPC name is Orange.
|
uint8 IsMercenary; // If NPC == 1 and this == 1, then the NPC name is Orange.
|
||||||
/*0000*/ char unknown21[55];
|
/*0000*/ char unknown21[55];
|
||||||
};
|
};
|
||||||
@@ -556,74 +562,100 @@ struct ServerZoneEntry_Struct //Adjusted from SEQ Everquest.h Struct
|
|||||||
//New Zone Struct - Size: 948
|
//New Zone Struct - Size: 948
|
||||||
struct NewZone_Struct {
|
struct NewZone_Struct {
|
||||||
/*0000*/ char char_name[64]; // Character Name
|
/*0000*/ char char_name[64]; // Character Name
|
||||||
/*0064*/ char zone_short_name[32]; // Zone Short Name
|
/*0064*/ char zone_short_name[128]; // Zone Short Name
|
||||||
/*0096*/ char unknown0096[96];
|
/*0192*/ char zone_long_name[128]; // Zone Long Name
|
||||||
/*0192*/ char zone_long_name[278]; // Zone Long Name
|
/*0320*/ char zone_desc[5][30]; // mostly just empty strings
|
||||||
/*0470*/ uint8 ztype; // Zone type (usually FF)
|
/*0470*/ uint8 ztype; // Zone type (usually FF) FogOnOff
|
||||||
/*0471*/ uint8 fog_red[4]; // Zone fog (red)
|
/*0471*/ uint8 fog_red[4]; // Zone fog (red) ARGBCOLOR
|
||||||
/*0475*/ uint8 fog_green[4]; // Zone fog (green)
|
/*0475*/ uint8 fog_green[4]; // Zone fog (green) ARGBCOLOR
|
||||||
/*0479*/ uint8 fog_blue[4]; // Zone fog (blue)
|
/*0479*/ uint8 fog_blue[4]; // Zone fog (blue) ARGBCOLO
|
||||||
/*0483*/ uint8 unknown323;
|
/*0483*/ uint8 unknown323; // padding?
|
||||||
/*0484*/ float fog_minclip[4];
|
/*0484*/ float fog_minclip[4]; // MQ2 has this starting at this offset, must be padding above
|
||||||
/*0500*/ float fog_maxclip[4];
|
/*0500*/ float fog_maxclip[4];
|
||||||
/*0516*/ float gravity;
|
/*0516*/ float gravity;
|
||||||
/*0520*/ uint8 time_type;
|
/*0520*/ uint8 time_type; // OutDoor flag 0 = IndoorDungeon, 1 = OUtdoor, 2 = OutdoorCity, 3 = DungeonCity, 4 = IndoorCity, 5 = OutdoorDungeon
|
||||||
/*0521*/ uint8 rain_chance[4];
|
/*0521*/ uint8 rain_chance[4];
|
||||||
/*0525*/ uint8 rain_duration[4];
|
/*0525*/ uint8 rain_duration[4];
|
||||||
/*0529*/ uint8 snow_chance[4];
|
/*0529*/ uint8 snow_chance[4];
|
||||||
/*0533*/ uint8 snow_duration[4];
|
/*0533*/ uint8 snow_duration[4];
|
||||||
/*0537*/ uint8 unknown537[32]; // Seen all 0xff
|
/*0537*/ uint8 unknown537[32]; // this is removed on live, specialdates and specialcodes probably macro'd out
|
||||||
/*0569*/ uint8 unknown569; // Unknown - Seen 0
|
/*0569*/ uint8 ZoneTimeZone; // MQ2 "in hours from worldserver, can be negative"
|
||||||
/*0570*/ uint8 sky; // Sky Type
|
/*0570*/ uint8 sky; // Sky Type
|
||||||
/*0571*/ uint8 unknown571; // Unknown - Seen 0
|
/*0571*/ uint8 unknown571; // Padding I think
|
||||||
/*0572*/ uint32 unknown572; // Unknown - Seen 4 in Guild Lobby
|
/*0572*/ uint32 WaterMidi; // Unknown - Seen 4 in Guild Lobby
|
||||||
/*0576*/ uint32 unknown576; // Unknown - Seen 2 in Guild Lobby
|
/*0576*/ uint32 DayMidi; // Unknown - Seen 2 in Guild Lobby
|
||||||
/*0580*/ uint32 unknown580; // Unknown - Seen 0 in Guild Lobby
|
/*0580*/ uint32 NightMidi; // Unknown - Seen 0 in Guild Lobby
|
||||||
/*0584*/ float zone_exp_multiplier; // Experience Multiplier
|
/*0584*/ float zone_exp_multiplier; // Experience Multiplier
|
||||||
/*0588*/ float safe_y; // Zone Safe Y
|
/*0588*/ float safe_y; // Zone Safe Y
|
||||||
/*0592*/ float safe_x; // Zone Safe X
|
/*0592*/ float safe_x; // Zone Safe X
|
||||||
/*0596*/ float safe_z; // Zone Safe Z
|
/*0596*/ float safe_z; // Zone Safe Z
|
||||||
/*0600*/ float min_z; // Guessed - NEW - Seen 0
|
/*0600*/ float min_z; // This isn't safe heading like live -- could be default heading rather than succor heading
|
||||||
/*0604*/ float max_z; // Guessed
|
/*0604*/ float max_z; // Ceiling
|
||||||
/*0608*/ float underworld; // Underworld, min z (Not Sure?)
|
/*0608*/ float underworld; // Underworld, min z (Not Sure?) Floor
|
||||||
/*0612*/ float minclip; // Minimum View Distance
|
/*0612*/ float minclip; // Minimum View Distance
|
||||||
/*0616*/ float maxclip; // Maximum View DIstance
|
/*0616*/ float maxclip; // Maximum View DIstance
|
||||||
/*0620*/ uint8 unknown620[84]; // ***Placeholder
|
/*0620*/ uint32 ForageLow; // Forage loot table ID?
|
||||||
/*0704*/ char zone_short_name2[96]; //zone file name? excludes instance number which can be in previous version.
|
/*0624*/ uint32 ForageMedium; // Forage loot table ID?
|
||||||
/*0800*/ int32 unknown800; //seen -1
|
/*0628*/ uint32 ForageHigh; // Forage loot table ID?
|
||||||
/*0804*/ char unknown804[40]; //
|
/*0632*/ uint32 FishingLow; // Fishing loot table ID?
|
||||||
/*0844*/ int32 unknown844; //seen 600
|
/*0636*/ uint32 FishingMedium; // Fishing loot table ID?
|
||||||
/*0848*/ int32 unknown848; //seen 2008
|
/*0640*/ uint32 FishingHigh; // Fishing loot table ID?
|
||||||
/*0852*/ uint16 zone_id;
|
/*0644*/ uint32 sky_lock; // MQ2 skyrelated
|
||||||
|
/*0648*/ uint32 graveyard_timer; // minutes until corpse pop to graveyard
|
||||||
|
/*0652*/ uint32 scriptIDHour; // These are IDs of scripts
|
||||||
|
/*0656*/ uint32 scriptIDMinute; // These are IDs of scripts
|
||||||
|
/*0660*/ uint32 scriptIDTick; // These are IDs of scripts
|
||||||
|
/*0664*/ uint32 scriptIDOnPlayerDeath; // These are IDs of scripts
|
||||||
|
/*0668*/ uint32 scriptIDOnNPCDeath; // These are IDs of scripts
|
||||||
|
/*0672*/ uint32 scriptIDPlayerEnteringZone; // These are IDs of scripts
|
||||||
|
/*0676*/ uint32 scriptIDOnZonePop; // These are IDs of scripts
|
||||||
|
/*0680*/ uint32 scriptIDNPCLoot; // These are IDs of scripts
|
||||||
|
/*0684*/ uint32 scriptIDAdventureFailed; // These are IDs of scripts
|
||||||
|
/*0688*/ uint32 CanExploreTasks;
|
||||||
|
/*0692*/ uint32 UnknownFlag; // not sure, neither is MQ2!
|
||||||
|
/*0696*/ uint32 scriptIDOnFishing; // THese are IDs of scripts
|
||||||
|
/*0700*/ uint32 scriptIDOnForage; // THese are IDs of scripts
|
||||||
|
/*0704*/ char zone_short_name2[32]; //zone file name? excludes instance number which can be in previous version.
|
||||||
|
/*0736*/ char WeatherString[32];
|
||||||
|
/*0768*/ char SkyString2[32];
|
||||||
|
/*0800*/ int32 SkyRelated2; //seen -1 -- maybe some default sky time?
|
||||||
|
/*0804*/ char WeatherString2[32]; //
|
||||||
|
/*0836*/ float WeatherChangeTime; // not sure :P
|
||||||
|
/*0840*/ uint32 Climate;
|
||||||
|
/*0844*/ int32 NPCAggroMaxDist; //seen 600
|
||||||
|
/*0848*/ int32 FilterID; //seen 2008 -- maybe zone guide related?
|
||||||
|
/*0852*/ uint16 zone_id; // this might just be instance ID got 1736 for time
|
||||||
/*0854*/ uint16 zone_instance;
|
/*0854*/ uint16 zone_instance;
|
||||||
/*0856*/ char unknown856[20];
|
/*0856*/ uint32 scriptNPCReceivedanItem;
|
||||||
/*0876*/ uint32 SuspendBuffs;
|
/*0860*/ uint32 bCheck; // padded bool
|
||||||
/*0880*/ uint32 unknown880; // Seen 50
|
/*0864*/ uint32 scriptIDSomething;
|
||||||
/*0884*/ uint32 unknown884; // Seen 10
|
/*0868*/ uint32 scriptIDSomething2;
|
||||||
/*0888*/ uint8 unknown888; // Seen 1
|
/*0872*/ uint32 scriptIDSomething3;
|
||||||
/*0889*/ uint8 unknown889; // Seen 0 (POK) or 1 (rujj)
|
/*0876*/ uint32 SuspendBuffs; // padded bool
|
||||||
/*0890*/ uint8 unknown890; // Seen 1
|
/*0880*/ uint32 LavaDamage; // LavaDamage value
|
||||||
/*0891*/ uint8 unknown891; // Seen 0
|
/*0884*/ uint32 MinLavaDamage; // min cap after resist calcs
|
||||||
/*0892*/ uint8 unknown892; // Seen 0
|
/*0888*/ uint8 bDisallowManaStone; // can't use manastone in this zone
|
||||||
/*0893*/ uint8 unknown893; // Seen 0 - 00
|
/*0889*/ uint8 bNoBind; // can't bind even if outdoor says we can!
|
||||||
/*0894*/ uint8 fall_damage; // 0 = Fall Damage on, 1 = Fall Damage off
|
/*0890*/ uint8 bNoAttack; // non-attack zone
|
||||||
/*0895*/ uint8 unknown895; // Seen 0 - 00
|
/*0891*/ uint8 bNoCallOfHero; // coth line disabled
|
||||||
/*0896*/ uint32 unknown896; // Seen 180
|
/*0892*/ uint8 bNoFlux; // gflux no worky
|
||||||
/*0900*/ uint32 unknown900; // Seen 180
|
/*0893*/ uint8 bNoFear; // fear spells no worky
|
||||||
/*0904*/ uint32 unknown904; // Seen 180
|
/*0894*/ uint8 fall_damage; // 0 = Fall Damage on, 1 = Fall Damage off MQ2 calls bNoEncumber
|
||||||
/*0908*/ uint32 unknown908; // Seen 2
|
/*0895*/ uint8 unknown895; // padding
|
||||||
/*0912*/ uint32 unknown912; // Seen 2
|
/*0896*/ uint32 FastRegenHP; // percentage I think?
|
||||||
|
/*0900*/ uint32 FastRegenMana; // percentage I think?
|
||||||
|
/*0904*/ uint32 FastRegenEndurance; // percentage I think?
|
||||||
|
/*0908*/ uint32 CanPlaceCampsite; // 0 = no, 1 = can place, 2 = place and goto
|
||||||
|
/*0912*/ uint32 CanPlaceGuildBanner; // ^
|
||||||
/*0916*/ float FogDensity; // Most zones have this set to 0.33 Blightfire had 0.16
|
/*0916*/ float FogDensity; // Most zones have this set to 0.33 Blightfire had 0.16
|
||||||
/*0920*/ uint32 unknown920; // Seen 0
|
/*0920*/ uint32 bAdjustGamma; // padded bool
|
||||||
/*0924*/ uint32 unknown924; // Seen 0
|
/*0924*/ uint32 TimeStringID; // Seen 0
|
||||||
/*0928*/ uint32 unknown928; // Seen 0
|
/*0928*/ uint32 bNoMercenaries; // padded bool
|
||||||
/*0932*/ int32 unknown932; // Seen -1
|
/*0932*/ int32 FishingRelated; // Seen -1 idk
|
||||||
/*0936*/ int32 unknown936; // Seen -1
|
/*0936*/ int32 ForageRelated; // Seen -1 idk
|
||||||
/*0940*/ uint32 unknown940; // Seen 0
|
/*0940*/ uint32 bNoLevitate; // padded bool
|
||||||
/*0944*/ float unknown944; // Seen 1.0 in PoK, and 0.25 in Guild Lobby
|
/*0944*/ float Blooming; // Seen 1.0 in PoK, and 0.25 in Guild Lobby
|
||||||
/*0948*/ uint32 unknown948; // Seen 0 - New on Live as of Dec 15 2014
|
/*0948*/
|
||||||
/*0952*/ uint32 unknown952; // Seen 100 - New on Live as of Dec 15 2014
|
|
||||||
/*0956*/
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1124,8 +1156,8 @@ union
|
|||||||
/*01012*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [300] 3600 bytes - AAs 12 bytes each
|
/*01012*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [300] 3600 bytes - AAs 12 bytes each
|
||||||
/*04612*/ uint32 skill_count; // Seen 100
|
/*04612*/ uint32 skill_count; // Seen 100
|
||||||
/*04616*/ uint32 skills[MAX_PP_SKILL]; // [100] 400 bytes - List of skills
|
/*04616*/ uint32 skills[MAX_PP_SKILL]; // [100] 400 bytes - List of skills
|
||||||
/*05016*/ uint32 unknown15_count; // Seen 25
|
/*05016*/ uint32 InnateSkills_count; // Seen 25
|
||||||
/*05020*/ uint32 unknown_rof15[25]; // Most are 255 or 0
|
/*05020*/ uint32 InnateSkills[MAX_PP_INNATE_SKILL]; // Most are 255 or 0
|
||||||
/*05120*/ uint32 discipline_count; // Seen 200
|
/*05120*/ uint32 discipline_count; // Seen 200
|
||||||
/*05124*/ Disciplines_Struct disciplines; // [200] 800 bytes Known disciplines
|
/*05124*/ Disciplines_Struct disciplines; // [200] 800 bytes Known disciplines
|
||||||
/*05924*/ uint32 timestamp_count; // Seen 20
|
/*05924*/ uint32 timestamp_count; // Seen 20
|
||||||
@@ -1430,17 +1462,17 @@ struct Action_Struct
|
|||||||
{
|
{
|
||||||
/*00*/ uint16 target; // id of target
|
/*00*/ uint16 target; // id of target
|
||||||
/*02*/ uint16 source; // id of caster
|
/*02*/ uint16 source; // id of caster
|
||||||
/*04*/ uint16 level; // level of caster - Seen 0
|
/*04*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level
|
||||||
/*06*/ uint32 unknown06;
|
/*06*/ uint32 unknown06; // OSX dump says base_damage, was used for bard mod too, this is 0'd :(
|
||||||
/*10*/ float instrument_mod;
|
/*10*/ float instrument_mod;
|
||||||
/*14*/ uint32 bard_focus_id; // seen 0
|
/*14*/ float force;
|
||||||
/*18*/ float knockback_angle; //seems to go from 0-512 then it rolls over again
|
/*18*/ float hit_heading;
|
||||||
/*22*/ uint32 unknown22;
|
/*22*/ float hit_pitch;
|
||||||
/*26*/ uint8 type;
|
/*26*/ uint8 type; // 231 (0xE7) for spells, skill
|
||||||
/*27*/ uint32 damage;
|
/*27*/ uint32 damage; // OSX says min_damage
|
||||||
/*31*/ uint16 unknown31;
|
/*31*/ uint16 unknown31; // OSX says tohit
|
||||||
/*33*/ uint32 spell; // spell id being cast
|
/*33*/ uint32 spell; // spell id being cast
|
||||||
/*37*/ uint8 level2; // level of caster again? Or maybe the castee
|
/*37*/ uint8 spell_level; // level of caster again? Or maybe the castee
|
||||||
/*38*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time?
|
/*38*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time?
|
||||||
/*39*/
|
/*39*/
|
||||||
};
|
};
|
||||||
@@ -1452,25 +1484,21 @@ struct ActionAlt_Struct
|
|||||||
{
|
{
|
||||||
/*00*/ uint16 target; // id of target
|
/*00*/ uint16 target; // id of target
|
||||||
/*02*/ uint16 source; // id of caster
|
/*02*/ uint16 source; // id of caster
|
||||||
/*04*/ uint16 level; // level of caster - Seen 0
|
/*04*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level
|
||||||
/*06*/ uint32 unknown06;
|
/*06*/ uint32 unknown06; // OSX dump says base_damage, was used for bard mod too, this is 0'd :(
|
||||||
/*10*/ float instrument_mod;
|
/*10*/ float instrument_mod;
|
||||||
/*14*/ uint32 bard_focus_id; // seen 0
|
/*14*/ float force;
|
||||||
/*18*/ float knockback_angle; //seems to go from 0-512 then it rolls over again
|
/*18*/ float hit_heading;
|
||||||
/*22*/ uint32 unknown22;
|
/*22*/ float hit_pitch;
|
||||||
/*26*/ uint8 type;
|
/*26*/ uint8 type; // 231 (0xE7) for spells, skill
|
||||||
/*27*/ uint32 damage;
|
/*27*/ uint32 damage; // OSX says min_damage
|
||||||
/*31*/ uint16 unknown31;
|
/*31*/ uint16 unknown31; // OSX says tohit
|
||||||
/*33*/ uint32 spell; // spell id being cast
|
/*33*/ uint32 spell; // spell id being cast
|
||||||
/*37*/ uint8 level2; // level of caster again? Or maybe the castee
|
/*37*/ uint8 spell_level; // level of caster again? Or maybe the castee
|
||||||
/*38*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time?
|
/*38*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time?
|
||||||
/*39*/ uint32 unknown39; // New field to Underfoot - Seen 14
|
/*39*/ uint8 spell_gem;
|
||||||
/*43*/ uint8 unknown43; // New field to Underfoot - Seen 0
|
/*40*/ InventorySlot_Struct slot;
|
||||||
/*44*/ uint8 unknown44; // New field to Underfoot - Seen 17
|
/*52*/ uint32 item_cast_type; // ItemSpellTypes enum from MQ2
|
||||||
/*45*/ uint8 unknown45; // New field to Underfoot - Seen 0
|
|
||||||
/*46*/ int32 unknown46; // New field to Underfoot - Seen -1
|
|
||||||
/*50*/ uint32 unknown50; // New field to Underfoot - Seen 0
|
|
||||||
/*54*/ uint16 unknown54; // New field to Underfoot - Seen 0
|
|
||||||
/*56*/
|
/*56*/
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1485,9 +1513,9 @@ struct CombatDamage_Struct
|
|||||||
/* 05 */ uint32 spellid;
|
/* 05 */ uint32 spellid;
|
||||||
/* 09 */ int32 damage;
|
/* 09 */ int32 damage;
|
||||||
/* 13 */ float force; // cd cc cc 3d
|
/* 13 */ float force; // cd cc cc 3d
|
||||||
/* 17 */ float meleepush_xy; // see above notes in Action_Struct
|
/* 17 */ float hit_heading; // see above notes in Action_Struct
|
||||||
/* 21 */ float meleepush_z;
|
/* 21 */ float hit_pitch;
|
||||||
/* 25 */ uint8 unknown25; // was [9]
|
/* 25 */ uint8 secondary; // 0 for primary hand, 1 for secondary
|
||||||
/* 26 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage
|
/* 26 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage
|
||||||
/* 30 */
|
/* 30 */
|
||||||
};
|
};
|
||||||
@@ -1795,6 +1823,20 @@ struct MoveItem_Struct
|
|||||||
/*0028*/
|
/*0028*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct MultiMoveItemSub_Struct
|
||||||
|
{
|
||||||
|
/*0000*/ InventorySlot_Struct from_slot;
|
||||||
|
/*0012*/ InventorySlot_Struct to_slot;
|
||||||
|
/*0024*/ uint32 number_in_stack;
|
||||||
|
/*0028*/ uint8 unknown[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MultiMoveItem_Struct
|
||||||
|
{
|
||||||
|
/*0000*/ uint32 count;
|
||||||
|
/*0004*/ MultiMoveItemSub_Struct moves[0];
|
||||||
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// from_slot/to_slot
|
// from_slot/to_slot
|
||||||
// -1 - destroy
|
// -1 - destroy
|
||||||
@@ -2304,7 +2346,6 @@ struct AltCurrencySelectItem_Struct
|
|||||||
/*064*/ uint32 unknown064;
|
/*064*/ uint32 unknown064;
|
||||||
/*068*/ uint32 unknown068;
|
/*068*/ uint32 unknown068;
|
||||||
/*072*/ uint32 unknown072;
|
/*072*/ uint32 unknown072;
|
||||||
/*076*/ uint32 unknown076;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//Server -> Client
|
//Server -> Client
|
||||||
@@ -3559,21 +3600,6 @@ struct GuildSetRank_Struct
|
|||||||
/*80*/
|
/*80*/
|
||||||
};
|
};
|
||||||
|
|
||||||
struct BugStruct{
|
|
||||||
/*0000*/ char chartype[64];
|
|
||||||
/*0064*/ char name[96];
|
|
||||||
/*0160*/ char ui[128];
|
|
||||||
/*0288*/ float x;
|
|
||||||
/*0292*/ float y;
|
|
||||||
/*0296*/ float z;
|
|
||||||
/*0300*/ float heading;
|
|
||||||
/*0304*/ uint32 unknown304;
|
|
||||||
/*0308*/ uint32 type;
|
|
||||||
/*0312*/ char unknown312[2144];
|
|
||||||
/*2456*/ char bug[1024];
|
|
||||||
/*3480*/ char placeholder[2];
|
|
||||||
/*3482*/ char system_info[4098];
|
|
||||||
};
|
|
||||||
struct Make_Pet_Struct { //Simple struct for getting pet info
|
struct Make_Pet_Struct { //Simple struct for getting pet info
|
||||||
uint8 level;
|
uint8 level;
|
||||||
uint8 class_;
|
uint8 class_;
|
||||||
@@ -3600,20 +3626,21 @@ struct Ground_Spawn{
|
|||||||
struct Ground_Spawns {
|
struct Ground_Spawns {
|
||||||
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
||||||
};
|
};
|
||||||
struct PetitionBug_Struct{
|
|
||||||
uint32 petition_number;
|
//struct PetitionBug_Struct{
|
||||||
uint32 unknown4;
|
// uint32 petition_number;
|
||||||
char accountname[64];
|
// uint32 unknown4;
|
||||||
uint32 zoneid;
|
// char accountname[64];
|
||||||
char name[64];
|
// uint32 zoneid;
|
||||||
uint32 level;
|
// char name[64];
|
||||||
uint32 class_;
|
// uint32 level;
|
||||||
uint32 race;
|
// uint32 class_;
|
||||||
uint32 unknown152[3];
|
// uint32 race;
|
||||||
uint32 time;
|
// uint32 unknown152[3];
|
||||||
uint32 unknown168;
|
// uint32 time;
|
||||||
char text[1028];
|
// uint32 unknown168;
|
||||||
};
|
// char text[1028];
|
||||||
|
//};
|
||||||
|
|
||||||
struct ApproveZone_Struct {
|
struct ApproveZone_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
@@ -5057,6 +5084,23 @@ struct CrystalCountUpdate_Struct
|
|||||||
/*012*/ uint32 CareerEbonCrystals;
|
/*012*/ uint32 CareerEbonCrystals;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SayLinkBodyFrame_Struct {
|
||||||
|
/*000*/ char ActionID[1];
|
||||||
|
/*001*/ char ItemID[5];
|
||||||
|
/*006*/ char Augment1[5];
|
||||||
|
/*011*/ char Augment2[5];
|
||||||
|
/*016*/ char Augment3[5];
|
||||||
|
/*021*/ char Augment4[5];
|
||||||
|
/*026*/ char Augment5[5];
|
||||||
|
/*031*/ char Augment6[5];
|
||||||
|
/*036*/ char IsEvolving[1];
|
||||||
|
/*037*/ char EvolveGroup[4];
|
||||||
|
/*041*/ char EvolveLevel[2];
|
||||||
|
/*043*/ char OrnamentIcon[5];
|
||||||
|
/*048*/ char Hash[8];
|
||||||
|
/*056*/
|
||||||
|
};
|
||||||
|
|
||||||
}; /*structs*/
|
}; /*structs*/
|
||||||
|
|
||||||
}; /*RoF2*/
|
}; /*RoF2*/
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ static const uint32 MAX_PP_LANGUAGE = 32; // was 25
|
|||||||
static const uint32 MAX_PP_SPELLBOOK = 720; // was 480
|
static const uint32 MAX_PP_SPELLBOOK = 720; // was 480
|
||||||
static const uint32 MAX_PP_MEMSPELL = 16; // was 12
|
static const uint32 MAX_PP_MEMSPELL = 16; // was 12
|
||||||
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
||||||
|
static const uint32 MAX_PP_INNATE_SKILL = 25;
|
||||||
static const uint32 MAX_PP_AA_ARRAY = 300;
|
static const uint32 MAX_PP_AA_ARRAY = 300;
|
||||||
static const uint32 MAX_PP_DISCIPLINES = 200; // was 100
|
static const uint32 MAX_PP_DISCIPLINES = 200; // was 100
|
||||||
static const uint32 MAX_GROUP_MEMBERS = 6;
|
static const uint32 MAX_GROUP_MEMBERS = 6;
|
||||||
@@ -339,18 +340,7 @@ struct Spawn_Struct_Bitfields
|
|||||||
/*06*/ unsigned sneak:1;
|
/*06*/ unsigned sneak:1;
|
||||||
/*08*/ unsigned lfg:1;
|
/*08*/ unsigned lfg:1;
|
||||||
/*09*/ unsigned unknown09:1;
|
/*09*/ unsigned unknown09:1;
|
||||||
/*10*/ unsigned invis:1; // May have invis & sneak the wrong way around ... not sure how to tell which is which
|
/*10*/ unsigned invis:12; // there are 3000 different (non-GM) invis levels
|
||||||
/*11*/ unsigned invis1:1; // GM Invis? Can only be seen with #gm on - same for the below
|
|
||||||
/*12*/ unsigned invis2:1; // This one also make the NPC/PC invis
|
|
||||||
/*13*/ unsigned invis3:1; // This one also make the NPC/PC invis
|
|
||||||
/*14*/ unsigned invis4:1; // This one also make the NPC/PC invis
|
|
||||||
/*15*/ unsigned invis6:1; // This one also make the NPC/PC invis
|
|
||||||
/*16*/ unsigned invis7:1; // This one also make the NPC/PC invis
|
|
||||||
/*17*/ unsigned invis8:1; // This one also make the NPC/PC invis
|
|
||||||
/*18*/ unsigned invis9:1; // This one also make the NPC/PC invis
|
|
||||||
/*19*/ unsigned invis10:1; // This one also make the NPC/PC invis
|
|
||||||
/*20*/ unsigned invis11:1; // This one also make the NPC/PC invis
|
|
||||||
/*21*/ unsigned invis12:1; // This one also make the NPC/PC invis
|
|
||||||
/*22*/ unsigned linkdead:1; // 1 Toggles LD on or off after name. Correct for RoF
|
/*22*/ unsigned linkdead:1; // 1 Toggles LD on or off after name. Correct for RoF
|
||||||
/*23*/ unsigned showhelm:1;
|
/*23*/ unsigned showhelm:1;
|
||||||
/*24*/ unsigned unknown24:1; // Prefixes name with !
|
/*24*/ unsigned unknown24:1; // Prefixes name with !
|
||||||
@@ -418,7 +408,7 @@ struct Spawn_Struct
|
|||||||
/*0000*/ //uint8 nullterm1; // hack to null terminate name
|
/*0000*/ //uint8 nullterm1; // hack to null terminate name
|
||||||
/*0064*/ uint32 spawnId;
|
/*0064*/ uint32 spawnId;
|
||||||
/*0068*/ uint8 level;
|
/*0068*/ uint8 level;
|
||||||
/*0069*/ float unknown1;
|
/*0069*/ float bounding_radius; // used in melee, overrides calc
|
||||||
/*0073*/ uint8 NPC; // 0=player,1=npc,2=pc corpse,3=npc corpse
|
/*0073*/ uint8 NPC; // 0=player,1=npc,2=pc corpse,3=npc corpse
|
||||||
Spawn_Struct_Bitfields Bitfields;
|
Spawn_Struct_Bitfields Bitfields;
|
||||||
/*0000*/ uint8 otherData; // & 4 - has title, & 8 - has suffix, & 1 - it's a chest or untargetable
|
/*0000*/ uint8 otherData; // & 4 - has title, & 8 - has suffix, & 1 - it's a chest or untargetable
|
||||||
@@ -1107,8 +1097,8 @@ union
|
|||||||
/*01012*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [300] 3600 bytes - AAs 12 bytes each
|
/*01012*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; // [300] 3600 bytes - AAs 12 bytes each
|
||||||
/*04612*/ uint32 skill_count; // Seen 100
|
/*04612*/ uint32 skill_count; // Seen 100
|
||||||
/*04616*/ uint32 skills[MAX_PP_SKILL]; // [100] 400 bytes - List of skills
|
/*04616*/ uint32 skills[MAX_PP_SKILL]; // [100] 400 bytes - List of skills
|
||||||
/*05016*/ uint32 unknown15_count; // Seen 25
|
/*05016*/ uint32 InnateSkills_count; // Seen 25
|
||||||
/*05020*/ uint32 unknown_rof15[25]; // Most are 255 or 0
|
/*05020*/ uint32 InnateSkills[MAX_PP_INNATE_SKILL]; // Most are 255 or 0
|
||||||
/*05120*/ uint32 discipline_count; // Seen 200
|
/*05120*/ uint32 discipline_count; // Seen 200
|
||||||
/*05124*/ Disciplines_Struct disciplines; // [200] 800 bytes Known disciplines
|
/*05124*/ Disciplines_Struct disciplines; // [200] 800 bytes Known disciplines
|
||||||
/*05924*/ uint32 timestamp_count; // Seen 20
|
/*05924*/ uint32 timestamp_count; // Seen 20
|
||||||
@@ -1460,17 +1450,17 @@ struct Action_Struct
|
|||||||
{
|
{
|
||||||
/*00*/ uint16 target; // id of target
|
/*00*/ uint16 target; // id of target
|
||||||
/*02*/ uint16 source; // id of caster
|
/*02*/ uint16 source; // id of caster
|
||||||
/*04*/ uint16 level; // level of caster - Seen 0
|
/*04*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level
|
||||||
/*06*/ uint32 unknown06;
|
/*06*/ uint32 unknown06; // OSX dump says base_damage, was used for bard mod too, this is 0'd :(
|
||||||
/*10*/ float instrument_mod;
|
/*10*/ float instrument_mod;
|
||||||
/*14*/ uint32 bard_focus_id; // seen 0
|
/*14*/ float force;
|
||||||
/*18*/ float knockback_angle; //seems to go from 0-512 then it rolls over again
|
/*18*/ float hit_heading;
|
||||||
/*22*/ uint32 unknown22;
|
/*22*/ float hit_pitch;
|
||||||
/*26*/ uint8 type;
|
/*26*/ uint8 type; // 231 (0xE7) for spells, skill
|
||||||
/*27*/ uint32 damage;
|
/*27*/ uint32 damage; // OSX says min_damage
|
||||||
/*31*/ uint16 unknown31;
|
/*31*/ uint16 unknown31; // OSX says tohit
|
||||||
/*33*/ uint32 spell; // spell id being cast
|
/*33*/ uint32 spell; // spell id being cast
|
||||||
/*37*/ uint8 level2; // level of caster again? Or maybe the castee
|
/*37*/ uint8 spell_level; // level of caster again? Or maybe the castee
|
||||||
/*38*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time?
|
/*38*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time?
|
||||||
/*39*/
|
/*39*/
|
||||||
};
|
};
|
||||||
@@ -1482,25 +1472,21 @@ struct ActionAlt_Struct
|
|||||||
{
|
{
|
||||||
/*00*/ uint16 target; // id of target
|
/*00*/ uint16 target; // id of target
|
||||||
/*02*/ uint16 source; // id of caster
|
/*02*/ uint16 source; // id of caster
|
||||||
/*04*/ uint16 level; // level of caster - Seen 0
|
/*04*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level
|
||||||
/*06*/ uint32 unknown06;
|
/*06*/ uint32 unknown06; // OSX dump says base_damage, was used for bard mod too, this is 0'd :(
|
||||||
/*10*/ float instrument_mod;
|
/*10*/ float instrument_mod;
|
||||||
/*14*/ uint32 bard_focus_id; // seen 0
|
/*14*/ float force;
|
||||||
/*18*/ float knockback_angle; //seems to go from 0-512 then it rolls over again
|
/*18*/ float hit_heading;
|
||||||
/*22*/ uint32 unknown22;
|
/*22*/ float hit_pitch;
|
||||||
/*26*/ uint8 type;
|
/*26*/ uint8 type; // 231 (0xE7) for spells, skill
|
||||||
/*27*/ uint32 damage;
|
/*27*/ uint32 damage; // OSX says min_damage
|
||||||
/*31*/ uint16 unknown31;
|
/*31*/ uint16 unknown31; // OSX says tohit
|
||||||
/*33*/ uint32 spell; // spell id being cast
|
/*33*/ uint32 spell; // spell id being cast
|
||||||
/*37*/ uint8 level2; // level of caster again? Or maybe the castee
|
/*37*/ uint8 spell_level; // level of caster again? Or maybe the castee
|
||||||
/*38*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time?
|
/*38*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time?
|
||||||
/*39*/ uint32 unknown39; // New field to Underfoot - Seen 14
|
/*39*/ uint8 spell_gem;
|
||||||
/*43*/ uint8 unknown43; // New field to Underfoot - Seen 0
|
/*40*/ InventorySlot_Struct slot;
|
||||||
/*44*/ uint8 unknown44; // New field to Underfoot - Seen 17
|
/*52*/ uint32 item_cast_type; // ItemSpellTypes enum from MQ2
|
||||||
/*45*/ uint8 unknown45; // New field to Underfoot - Seen 0
|
|
||||||
/*46*/ int32 unknown46; // New field to Underfoot - Seen -1
|
|
||||||
/*50*/ uint32 unknown50; // New field to Underfoot - Seen 0
|
|
||||||
/*54*/ uint16 unknown54; // New field to Underfoot - Seen 0
|
|
||||||
/*56*/
|
/*56*/
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1515,9 +1501,9 @@ struct CombatDamage_Struct
|
|||||||
/* 05 */ uint32 spellid;
|
/* 05 */ uint32 spellid;
|
||||||
/* 09 */ int32 damage;
|
/* 09 */ int32 damage;
|
||||||
/* 13 */ float force; // cd cc cc 3d
|
/* 13 */ float force; // cd cc cc 3d
|
||||||
/* 17 */ float meleepush_xy; // see above notes in Action_Struct
|
/* 17 */ float hit_heading; // see above notes in Action_Struct
|
||||||
/* 21 */ float meleepush_z;
|
/* 21 */ float hit_pitch;
|
||||||
/* 25 */ uint8 unknown25; // was [9]
|
/* 25 */ uint8 secondary; // 0 for primary hand, 1 for secondary
|
||||||
/* 26 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage
|
/* 26 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage
|
||||||
/* 30 */
|
/* 30 */
|
||||||
};
|
};
|
||||||
@@ -3555,21 +3541,6 @@ struct GuildSetRank_Struct
|
|||||||
/*80*/
|
/*80*/
|
||||||
};
|
};
|
||||||
|
|
||||||
struct BugStruct{
|
|
||||||
/*0000*/ char chartype[64];
|
|
||||||
/*0064*/ char name[96];
|
|
||||||
/*0160*/ char ui[128];
|
|
||||||
/*0288*/ float x;
|
|
||||||
/*0292*/ float y;
|
|
||||||
/*0296*/ float z;
|
|
||||||
/*0300*/ float heading;
|
|
||||||
/*0304*/ uint32 unknown304;
|
|
||||||
/*0308*/ uint32 type;
|
|
||||||
/*0312*/ char unknown312[2144];
|
|
||||||
/*2456*/ char bug[1024];
|
|
||||||
/*3480*/ char placeholder[2];
|
|
||||||
/*3482*/ char system_info[4098];
|
|
||||||
};
|
|
||||||
struct Make_Pet_Struct { //Simple struct for getting pet info
|
struct Make_Pet_Struct { //Simple struct for getting pet info
|
||||||
uint8 level;
|
uint8 level;
|
||||||
uint8 class_;
|
uint8 class_;
|
||||||
@@ -3596,20 +3567,21 @@ struct Ground_Spawn{
|
|||||||
struct Ground_Spawns {
|
struct Ground_Spawns {
|
||||||
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
||||||
};
|
};
|
||||||
struct PetitionBug_Struct{
|
|
||||||
uint32 petition_number;
|
//struct PetitionBug_Struct{
|
||||||
uint32 unknown4;
|
// uint32 petition_number;
|
||||||
char accountname[64];
|
// uint32 unknown4;
|
||||||
uint32 zoneid;
|
// char accountname[64];
|
||||||
char name[64];
|
// uint32 zoneid;
|
||||||
uint32 level;
|
// char name[64];
|
||||||
uint32 class_;
|
// uint32 level;
|
||||||
uint32 race;
|
// uint32 class_;
|
||||||
uint32 unknown152[3];
|
// uint32 race;
|
||||||
uint32 time;
|
// uint32 unknown152[3];
|
||||||
uint32 unknown168;
|
// uint32 time;
|
||||||
char text[1028];
|
// uint32 unknown168;
|
||||||
};
|
// char text[1028];
|
||||||
|
//};
|
||||||
|
|
||||||
struct ApproveZone_Struct {
|
struct ApproveZone_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
@@ -5030,6 +5002,23 @@ struct MercenaryMerchantRequest_Struct {
|
|||||||
struct MercenaryMerchantResponse_Struct {
|
struct MercenaryMerchantResponse_Struct {
|
||||||
/*0000*/ uint32 ResponseType;
|
/*0000*/ uint32 ResponseType;
|
||||||
/*0004*/
|
/*0004*/
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SayLinkBodyFrame_Struct {
|
||||||
|
/*000*/ char ActionID[1];
|
||||||
|
/*001*/ char ItemID[5];
|
||||||
|
/*006*/ char Augment1[5];
|
||||||
|
/*011*/ char Augment2[5];
|
||||||
|
/*016*/ char Augment3[5];
|
||||||
|
/*021*/ char Augment4[5];
|
||||||
|
/*026*/ char Augment5[5];
|
||||||
|
/*031*/ char Augment6[5];
|
||||||
|
/*036*/ char IsEvolving[1];
|
||||||
|
/*037*/ char EvolveGroup[4];
|
||||||
|
/*041*/ char EvolveLevel[1];
|
||||||
|
/*042*/ char OrnamentIcon[5];
|
||||||
|
/*047*/ char Hash[8];
|
||||||
|
/*055*/
|
||||||
};
|
};
|
||||||
|
|
||||||
}; /*structs*/
|
}; /*structs*/
|
||||||
|
|||||||
+47
-66
@@ -53,11 +53,11 @@ namespace SoD
|
|||||||
static inline uint32 SoDToServerSlot(uint32 sodSlot);
|
static inline uint32 SoDToServerSlot(uint32 sodSlot);
|
||||||
static inline uint32 SoDToServerCorpseSlot(uint32 sodCorpseSlot);
|
static inline uint32 SoDToServerCorpseSlot(uint32 sodCorpseSlot);
|
||||||
|
|
||||||
// server to client text link converter
|
// server to client say link converter
|
||||||
static inline void ServerToSoDTextLink(std::string& sodTextLink, const std::string& serverTextLink);
|
static inline void ServerToSoDSayLink(std::string& sodSayLink, const std::string& serverSayLink);
|
||||||
|
|
||||||
// client to server text link converter
|
// client to server say link converter
|
||||||
static inline void SoDToServerTextLink(std::string& serverTextLink, const std::string& sodTextLink);
|
static inline void SoDToServerSayLink(std::string& serverSayLink, const std::string& sodSayLink);
|
||||||
|
|
||||||
static inline CastingSlot ServerToSoDCastingSlot(EQEmu::CastingSlot slot);
|
static inline CastingSlot ServerToSoDCastingSlot(EQEmu::CastingSlot slot);
|
||||||
static inline EQEmu::CastingSlot SoDToServerCastingSlot(CastingSlot slot);
|
static inline EQEmu::CastingSlot SoDToServerCastingSlot(CastingSlot slot);
|
||||||
@@ -161,15 +161,14 @@ namespace SoD
|
|||||||
OUT(source);
|
OUT(source);
|
||||||
OUT(level);
|
OUT(level);
|
||||||
OUT(instrument_mod);
|
OUT(instrument_mod);
|
||||||
eq->sequence = emu->sequence;
|
OUT(force);
|
||||||
|
OUT(hit_heading);
|
||||||
|
OUT(hit_pitch);
|
||||||
OUT(type);
|
OUT(type);
|
||||||
//OUT(damage);
|
//OUT(damage);
|
||||||
OUT(spell);
|
OUT(spell);
|
||||||
eq->level2 = emu->level;
|
OUT(spell_level);
|
||||||
OUT(buff_unknown); // if this is 4, a buff icon is made
|
OUT(effect_flag); // if this is 4, a buff icon is made
|
||||||
//eq->unknown0036 = -1;
|
|
||||||
//eq->unknown0040 = -1;
|
|
||||||
//eq->unknown0044 = -1;
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -346,7 +345,7 @@ namespace SoD
|
|||||||
|
|
||||||
std::string old_message = emu->message;
|
std::string old_message = emu->message;
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToSoDTextLink(new_message, old_message);
|
ServerToSoDSayLink(new_message, old_message);
|
||||||
|
|
||||||
in->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
in->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
||||||
|
|
||||||
@@ -458,8 +457,8 @@ namespace SoD
|
|||||||
OUT(spellid);
|
OUT(spellid);
|
||||||
OUT(damage);
|
OUT(damage);
|
||||||
OUT(force);
|
OUT(force);
|
||||||
OUT(meleepush_xy);
|
OUT(hit_heading);
|
||||||
OUT(meleepush_z);
|
OUT(hit_pitch);
|
||||||
OUT(special);
|
OUT(special);
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
@@ -625,7 +624,7 @@ namespace SoD
|
|||||||
|
|
||||||
std::string old_message = emu->message;
|
std::string old_message = emu->message;
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToSoDTextLink(new_message, old_message);
|
ServerToSoDSayLink(new_message, old_message);
|
||||||
|
|
||||||
//if (new_message.length() > 512) // length restricted in packet building function due vari-length name size (no nullterm)
|
//if (new_message.length() > 512) // length restricted in packet building function due vari-length name size (no nullterm)
|
||||||
// new_message = new_message.substr(0, 512);
|
// new_message = new_message.substr(0, 512);
|
||||||
@@ -677,7 +676,7 @@ namespace SoD
|
|||||||
|
|
||||||
for (int i = 0; i < 9; ++i) {
|
for (int i = 0; i < 9; ++i) {
|
||||||
if (old_message_array[i].length() == 0) { break; }
|
if (old_message_array[i].length() == 0) { break; }
|
||||||
ServerToSoDTextLink(new_message_array[i], old_message_array[i]);
|
ServerToSoDSayLink(new_message_array[i], old_message_array[i]);
|
||||||
new_message_size += new_message_array[i].length() + 1;
|
new_message_size += new_message_array[i].length() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1605,6 +1604,7 @@ namespace SoD
|
|||||||
OUT(copper_cursor);
|
OUT(copper_cursor);
|
||||||
|
|
||||||
OUT_array(skills, structs::MAX_PP_SKILL); // 1:1 direct copy (100 dword)
|
OUT_array(skills, structs::MAX_PP_SKILL); // 1:1 direct copy (100 dword)
|
||||||
|
OUT_array(InnateSkills, structs::MAX_PP_INNATE_SKILL); // 1:1 direct copy (25 dword)
|
||||||
|
|
||||||
// OUT(unknown04760[236]);
|
// OUT(unknown04760[236]);
|
||||||
OUT(toxicity);
|
OUT(toxicity);
|
||||||
@@ -2155,7 +2155,7 @@ namespace SoD
|
|||||||
std::string old_message = &emu->message[strlen(emu->sayer)];
|
std::string old_message = &emu->message[strlen(emu->sayer)];
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
|
|
||||||
ServerToSoDTextLink(new_message, old_message);
|
ServerToSoDSayLink(new_message, old_message);
|
||||||
|
|
||||||
//in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1;
|
//in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1;
|
||||||
in->size = strlen(emu->sayer) + new_message.length() + 25;
|
in->size = strlen(emu->sayer) + new_message.length() + 25;
|
||||||
@@ -2251,7 +2251,7 @@ namespace SoD
|
|||||||
|
|
||||||
std::string old_message = InBuffer; // start 'Reward' as string
|
std::string old_message = InBuffer; // start 'Reward' as string
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToSoDTextLink(new_message, old_message);
|
ServerToSoDSayLink(new_message, old_message);
|
||||||
|
|
||||||
in->size = sizeof(TaskDescriptionHeader_Struct) + sizeof(TaskDescriptionData1_Struct)+
|
in->size = sizeof(TaskDescriptionHeader_Struct) + sizeof(TaskDescriptionData1_Struct)+
|
||||||
sizeof(TaskDescriptionData2_Struct) + sizeof(TaskDescriptionTrailer_Struct)+
|
sizeof(TaskDescriptionData2_Struct) + sizeof(TaskDescriptionTrailer_Struct)+
|
||||||
@@ -2560,7 +2560,7 @@ namespace SoD
|
|||||||
PacketSize += strlen(emu->DestructibleString) + 1;
|
PacketSize += strlen(emu->DestructibleString) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ShowName = 1;
|
bool ShowName = emu->show_name;
|
||||||
if (emu->bodytype >= 66)
|
if (emu->bodytype >= 66)
|
||||||
{
|
{
|
||||||
emu->race = 127;
|
emu->race = 127;
|
||||||
@@ -2932,25 +2932,6 @@ namespace SoD
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
DECODE(OP_Bug)
|
|
||||||
{
|
|
||||||
DECODE_LENGTH_EXACT(structs::BugStruct);
|
|
||||||
SETUP_DIRECT_DECODE(BugStruct, structs::BugStruct);
|
|
||||||
|
|
||||||
strn0cpy(emu->chartype, eq->chartype, sizeof(emu->chartype));
|
|
||||||
strn0cpy(emu->name, eq->name, sizeof(emu->name));
|
|
||||||
strn0cpy(emu->ui, eq->ui, sizeof(emu->ui));
|
|
||||||
IN(x);
|
|
||||||
IN(y);
|
|
||||||
IN(z);
|
|
||||||
IN(heading);
|
|
||||||
strn0cpy(emu->target_name, eq->target_name, sizeof(emu->target_name));
|
|
||||||
strn0cpy(emu->bug, eq->bug, sizeof(emu->bug));
|
|
||||||
strn0cpy(emu->system_info, eq->system_info, sizeof(emu->system_info));
|
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
|
||||||
}
|
|
||||||
|
|
||||||
DECODE(OP_CastSpell)
|
DECODE(OP_CastSpell)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
||||||
@@ -2971,7 +2952,7 @@ namespace SoD
|
|||||||
|
|
||||||
std::string old_message = (char *)&__eq_buffer[sizeof(ChannelMessage_Struct)];
|
std::string old_message = (char *)&__eq_buffer[sizeof(ChannelMessage_Struct)];
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
SoDToServerTextLink(new_message, old_message);
|
SoDToServerSayLink(new_message, old_message);
|
||||||
|
|
||||||
__packet->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
__packet->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
__packet->pBuffer = new unsigned char[__packet->size];
|
||||||
@@ -3085,7 +3066,7 @@ namespace SoD
|
|||||||
|
|
||||||
std::string old_message = (char *)&__eq_buffer[4]; // unknown01 offset
|
std::string old_message = (char *)&__eq_buffer[4]; // unknown01 offset
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
SoDToServerTextLink(new_message, old_message);
|
SoDToServerSayLink(new_message, old_message);
|
||||||
|
|
||||||
__packet->size = sizeof(Emote_Struct);
|
__packet->size = sizeof(Emote_Struct);
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
__packet->pBuffer = new unsigned char[__packet->size];
|
||||||
@@ -3935,19 +3916,19 @@ namespace SoD
|
|||||||
return (sodCorpseSlot - 1);
|
return (sodCorpseSlot - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void ServerToSoDTextLink(std::string& sodTextLink, const std::string& serverTextLink)
|
static inline void ServerToSoDSayLink(std::string& sodSayLink, const std::string& serverSayLink)
|
||||||
{
|
{
|
||||||
if ((constants::SayLinkBodySize == EQEmu::legacy::TEXT_LINK_BODY_LENGTH) || (serverTextLink.find('\x12') == std::string::npos)) {
|
if ((constants::SayLinkBodySize == EQEmu::constants::SayLinkBodySize) || (serverSayLink.find('\x12') == std::string::npos)) {
|
||||||
sodTextLink = serverTextLink;
|
sodSayLink = serverSayLink;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto segments = SplitString(serverTextLink, '\x12');
|
auto segments = SplitString(serverSayLink, '\x12');
|
||||||
|
|
||||||
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
||||||
if (segment_iter & 1) {
|
if (segment_iter & 1) {
|
||||||
if (segments[segment_iter].length() <= EQEmu::legacy::TEXT_LINK_BODY_LENGTH) {
|
if (segments[segment_iter].length() <= EQEmu::constants::SayLinkBodySize) {
|
||||||
sodTextLink.append(segments[segment_iter]);
|
sodSayLink.append(segments[segment_iter]);
|
||||||
// TODO: log size mismatch error
|
// TODO: log size mismatch error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -3957,37 +3938,37 @@ namespace SoD
|
|||||||
// SoF: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX X XXXXX XXXXXXXX (50)
|
// SoF: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX X XXXXX XXXXXXXX (50)
|
||||||
// Diff: ^^^^^ ^
|
// Diff: ^^^^^ ^
|
||||||
|
|
||||||
sodTextLink.push_back('\x12');
|
sodSayLink.push_back('\x12');
|
||||||
sodTextLink.append(segments[segment_iter].substr(0, 31));
|
sodSayLink.append(segments[segment_iter].substr(0, 31));
|
||||||
sodTextLink.append(segments[segment_iter].substr(36, 5));
|
sodSayLink.append(segments[segment_iter].substr(36, 5));
|
||||||
|
|
||||||
if (segments[segment_iter][41] == '0')
|
if (segments[segment_iter][41] == '0')
|
||||||
sodTextLink.push_back(segments[segment_iter][42]);
|
sodSayLink.push_back(segments[segment_iter][42]);
|
||||||
else
|
else
|
||||||
sodTextLink.push_back('F');
|
sodSayLink.push_back('F');
|
||||||
|
|
||||||
sodTextLink.append(segments[segment_iter].substr(43));
|
sodSayLink.append(segments[segment_iter].substr(43));
|
||||||
sodTextLink.push_back('\x12');
|
sodSayLink.push_back('\x12');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sodTextLink.append(segments[segment_iter]);
|
sodSayLink.append(segments[segment_iter]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void SoDToServerTextLink(std::string& serverTextLink, const std::string& sodTextLink)
|
static inline void SoDToServerSayLink(std::string& serverSayLink, const std::string& sodSayLink)
|
||||||
{
|
{
|
||||||
if ((EQEmu::legacy::TEXT_LINK_BODY_LENGTH == constants::SayLinkBodySize) || (sodTextLink.find('\x12') == std::string::npos)) {
|
if ((EQEmu::constants::SayLinkBodySize == constants::SayLinkBodySize) || (sodSayLink.find('\x12') == std::string::npos)) {
|
||||||
serverTextLink = sodTextLink;
|
serverSayLink = sodSayLink;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto segments = SplitString(sodTextLink, '\x12');
|
auto segments = SplitString(sodSayLink, '\x12');
|
||||||
|
|
||||||
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
||||||
if (segment_iter & 1) {
|
if (segment_iter & 1) {
|
||||||
if (segments[segment_iter].length() <= constants::SayLinkBodySize) {
|
if (segments[segment_iter].length() <= constants::SayLinkBodySize) {
|
||||||
serverTextLink.append(segments[segment_iter]);
|
serverSayLink.append(segments[segment_iter]);
|
||||||
// TODO: log size mismatch error
|
// TODO: log size mismatch error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -3997,16 +3978,16 @@ namespace SoD
|
|||||||
// RoF2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX XX XXXXX XXXXXXXX (56)
|
// RoF2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX XX XXXXX XXXXXXXX (56)
|
||||||
// Diff: ^^^^^ ^
|
// Diff: ^^^^^ ^
|
||||||
|
|
||||||
serverTextLink.push_back('\x12');
|
serverSayLink.push_back('\x12');
|
||||||
serverTextLink.append(segments[segment_iter].substr(0, 31));
|
serverSayLink.append(segments[segment_iter].substr(0, 31));
|
||||||
serverTextLink.append("00000");
|
serverSayLink.append("00000");
|
||||||
serverTextLink.append(segments[segment_iter].substr(31, 5));
|
serverSayLink.append(segments[segment_iter].substr(31, 5));
|
||||||
serverTextLink.push_back('0');
|
serverSayLink.push_back('0');
|
||||||
serverTextLink.append(segments[segment_iter].substr(36));
|
serverSayLink.append(segments[segment_iter].substr(36));
|
||||||
serverTextLink.push_back('\x12');
|
serverSayLink.push_back('\x12');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
serverTextLink.append(segments[segment_iter]);
|
serverSayLink.append(segments[segment_iter]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,7 +104,6 @@ D(OP_AugmentInfo)
|
|||||||
D(OP_AugmentItem)
|
D(OP_AugmentItem)
|
||||||
D(OP_BazaarSearch)
|
D(OP_BazaarSearch)
|
||||||
D(OP_Buff)
|
D(OP_Buff)
|
||||||
D(OP_Bug)
|
|
||||||
D(OP_CastSpell)
|
D(OP_CastSpell)
|
||||||
D(OP_ChannelMessage)
|
D(OP_ChannelMessage)
|
||||||
D(OP_CharacterCreate)
|
D(OP_CharacterCreate)
|
||||||
|
|||||||
@@ -250,8 +250,7 @@ struct Spawn_Struct_Bitfields
|
|||||||
unsigned sneak:1;
|
unsigned sneak:1;
|
||||||
unsigned lfg:1;
|
unsigned lfg:1;
|
||||||
unsigned padding5:1;
|
unsigned padding5:1;
|
||||||
unsigned invis:1; // 0 = visible, 1 = invis/sneaking
|
unsigned invis:12; // there are 3000 different (non-GM) invis levels
|
||||||
unsigned padding7:11;
|
|
||||||
unsigned gm:1;
|
unsigned gm:1;
|
||||||
unsigned anon:2; // 0=normal, 1=anon, 2=roleplay
|
unsigned anon:2; // 0=normal, 1=anon, 2=roleplay
|
||||||
unsigned gender:2; // Gender (0=male, 1=female, 2=monster)
|
unsigned gender:2; // Gender (0=male, 1=female, 2=monster)
|
||||||
@@ -293,7 +292,7 @@ struct Spawn_Struct
|
|||||||
/*0000*/ //uint8 nullterm1; // hack to null terminate name
|
/*0000*/ //uint8 nullterm1; // hack to null terminate name
|
||||||
/*0064*/ uint32 spawnId;
|
/*0064*/ uint32 spawnId;
|
||||||
/*0068*/ uint8 level;
|
/*0068*/ uint8 level;
|
||||||
/*0069*/ float unknown1;
|
/*0069*/ float bounding_radius; // used in melee, overrides calc
|
||||||
/*0073*/ uint8 NPC; // 0=player,1=npc,2=pc corpse,3=npc corpse
|
/*0073*/ uint8 NPC; // 0=player,1=npc,2=pc corpse,3=npc corpse
|
||||||
Spawn_Struct_Bitfields Bitfields;
|
Spawn_Struct_Bitfields Bitfields;
|
||||||
/*0000*/ uint8 otherData; // & 4 - has title, & 8 - has suffix, & 1 - it's a chest or untargetable
|
/*0000*/ uint8 otherData; // & 4 - has title, & 8 - has suffix, & 1 - it's a chest or untargetable
|
||||||
@@ -819,6 +818,7 @@ static const uint32 MAX_PP_LANGUAGE = 25; //
|
|||||||
static const uint32 MAX_PP_SPELLBOOK = 480; // Confirmed 60 pages on Live now
|
static const uint32 MAX_PP_SPELLBOOK = 480; // Confirmed 60 pages on Live now
|
||||||
static const uint32 MAX_PP_MEMSPELL = 10; //was 9 now 10 on Live
|
static const uint32 MAX_PP_MEMSPELL = 10; //was 9 now 10 on Live
|
||||||
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
||||||
|
static const uint32 MAX_PP_INNATE_SKILL = 25;
|
||||||
static const uint32 MAX_PP_AA_ARRAY = 300; //was 299
|
static const uint32 MAX_PP_AA_ARRAY = 300; //was 299
|
||||||
static const uint32 MAX_GROUP_MEMBERS = 6;
|
static const uint32 MAX_GROUP_MEMBERS = 6;
|
||||||
static const uint32 MAX_RECAST_TYPES = 20;
|
static const uint32 MAX_RECAST_TYPES = 20;
|
||||||
@@ -924,7 +924,8 @@ struct PlayerProfile_Struct
|
|||||||
/*06488*/ uint32 silver_cursor; // Silver Pieces on cursor
|
/*06488*/ uint32 silver_cursor; // Silver Pieces on cursor
|
||||||
/*06492*/ uint32 copper_cursor; // Copper Pieces on cursor
|
/*06492*/ uint32 copper_cursor; // Copper Pieces on cursor
|
||||||
/*06496*/ uint32 skills[MAX_PP_SKILL]; // [400] List of skills // 100 dword buffer
|
/*06496*/ uint32 skills[MAX_PP_SKILL]; // [400] List of skills // 100 dword buffer
|
||||||
/*06896*/ uint8 unknown04760[136];
|
/*06896*/ uint32 InnateSkills[MAX_PP_INNATE_SKILL];
|
||||||
|
/*06996*/ uint8 unknown04760[36];
|
||||||
/*07032*/ uint32 toxicity; // Potion Toxicity (15=too toxic, each potion adds 3)
|
/*07032*/ uint32 toxicity; // Potion Toxicity (15=too toxic, each potion adds 3)
|
||||||
/*07036*/ uint32 thirst_level; // Drink (ticks till next drink)
|
/*07036*/ uint32 thirst_level; // Drink (ticks till next drink)
|
||||||
/*07040*/ uint32 hunger_level; // Food (ticks till next eat)
|
/*07040*/ uint32 hunger_level; // Food (ticks till next eat)
|
||||||
@@ -1214,20 +1215,18 @@ struct Action_Struct
|
|||||||
{
|
{
|
||||||
/* 00 */ uint16 target; // id of target
|
/* 00 */ uint16 target; // id of target
|
||||||
/* 02 */ uint16 source; // id of caster
|
/* 02 */ uint16 source; // id of caster
|
||||||
/* 04 */ uint16 level; // level of caster
|
/* 04 */ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level
|
||||||
/* 06 */ uint16 instrument_mod; // seems to be fixed to 0x0A
|
/* 06 */ uint32 instrument_mod; // OSX dump says base damage, spells use it for bard song (different from newer clients)
|
||||||
/* 08 */ uint32 unknown08;
|
/* 10 */ float force;
|
||||||
/* 12 */ uint16 unknown16;
|
/* 14 */ float hit_heading;
|
||||||
// some kind of sequence that's the same in both actions
|
/* 18 */ float hit_pitch;
|
||||||
// as well as the combat damage, to tie em together?
|
/* 22 */ uint8 type; // 231 (0xE7) for spells, skill
|
||||||
/* 14 */ float sequence; // was uint32
|
/* 23 */ uint16 unknown23; // OSX says min_damage
|
||||||
/* 18 */ uint32 unknown18;
|
/* 25 */ uint16 unknown25; // OSX says tohit
|
||||||
/* 22 */ uint8 type; // 231 (0xE7) for spells
|
|
||||||
/* 23 */ uint32 unknown23;
|
|
||||||
/* 27 */ uint16 spell; // spell id being cast
|
/* 27 */ uint16 spell; // spell id being cast
|
||||||
/* 29 */ uint8 level2; // level of caster again? Or maybe the castee
|
/* 29 */ uint8 spell_level; // level of caster again? Or maybe the castee
|
||||||
// this field seems to be some sort of success flag, if it's 4
|
// this field seems to be some sort of success flag, if it's 4
|
||||||
/* 30 */ uint8 buff_unknown; // if this is 4, a buff icon is made
|
/* 30 */ uint8 effect_flag; // if this is 4, a buff icon is made
|
||||||
/* 31 */
|
/* 31 */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1236,26 +1235,23 @@ struct Action_Struct
|
|||||||
// has to do with buff blocking??
|
// has to do with buff blocking??
|
||||||
struct ActionAlt_Struct // ActionAlt_Struct - Size: 56 bytes
|
struct ActionAlt_Struct // ActionAlt_Struct - Size: 56 bytes
|
||||||
{
|
{
|
||||||
/*0000*/ uint16 target; // Target ID
|
/*0000*/ uint16 target; // id of target
|
||||||
/*0002*/ uint16 source; // SourceID
|
/*0002*/ uint16 source; // id of caster
|
||||||
/*0004*/ uint16 level; // level of caster
|
/*0004*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level
|
||||||
/*0006*/ uint16 instrument_mod; // seems to be fixed to 0x0A
|
/*0006*/ uint32 instrument_mod; // OSX dump says base damage, spells use it for bard song (different from newer clients)
|
||||||
/*0008*/ uint32 unknown08;
|
/*0010*/ float force;
|
||||||
/*0012*/ uint16 unknown16;
|
/*0014*/ float hit_heading;
|
||||||
/*0014*/ uint32 sequence;
|
/*0018*/ float hit_pitch;
|
||||||
/*0018*/ uint32 unknown18;
|
/*0022*/ uint8 type; // 231 (0xE7) for spells, skill
|
||||||
/*0022*/ uint8 type; // Casts, Falls, Bashes, etc...
|
/*0023*/ uint16 unknown23; // OSX says min_damage
|
||||||
/*0023*/ uint32 damage; // Amount of Damage
|
/*0025*/ uint16 unknown25; // OSX says tohit
|
||||||
/*0027*/ uint16 spell; // SpellID
|
/*0027*/ uint16 spell; // spell id being cast
|
||||||
/*0029*/ uint8 unknown29;
|
/*0029*/ uint8 spell_level; // level of caster again? Or maybe the castee
|
||||||
/*0030*/ uint8 buff_unknown; // if this is 4, a buff icon is made
|
// this field seems to be some sort of success flag, if it's 4
|
||||||
/*0031*/ uint32 unknown0031; // seen 00 00 00 00
|
/*0030*/ uint8 effect_flag; // if this is 4, a buff icon is made
|
||||||
/*0035*/ uint8 unknown0035; // seen 00
|
/*0031*/ uint8 spell_slot;
|
||||||
/*0036*/ uint32 unknown0036; // seen ff ff ff ff
|
/*0032*/ uint32 slot[5];
|
||||||
/*0040*/ uint32 unknown0040; // seen ff ff ff ff
|
/*0052*/ uint32 item_cast_type; // ItemSpellTypes enum from MQ2
|
||||||
/*0044*/ uint32 unknown0044; // seen ff ff ff ff
|
|
||||||
/*0048*/ uint32 unknown0048; // seen 00 00 00 00
|
|
||||||
/*0052*/ uint32 unknown0052; // seen 00 00 00 00
|
|
||||||
/*0056*/
|
/*0056*/
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1270,9 +1266,9 @@ struct CombatDamage_Struct
|
|||||||
/* 05 */ uint16 spellid;
|
/* 05 */ uint16 spellid;
|
||||||
/* 07 */ int32 damage;
|
/* 07 */ int32 damage;
|
||||||
/* 11 */ float force; // cd cc cc 3d
|
/* 11 */ float force; // cd cc cc 3d
|
||||||
/* 15 */ float meleepush_xy; // see above notes in Action_Struct
|
/* 15 */ float hit_heading; // see above notes in Action_Struct
|
||||||
/* 19 */ float meleepush_z;
|
/* 19 */ float hit_pitch;
|
||||||
/* 23 */ uint8 unknown23; // was [9]
|
/* 23 */ uint8 secondary; // 0 for primary hand, 1 for secondary
|
||||||
/* 24 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage
|
/* 24 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage
|
||||||
/* 28 */
|
/* 28 */
|
||||||
};
|
};
|
||||||
@@ -3007,24 +3003,6 @@ struct GuildMakeLeader{
|
|||||||
char target[64];
|
char target[64];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct BugStruct{
|
|
||||||
/*0000*/ uint32 type1; //seems to be just a different way of seeing type; seems to be ordered completely differently
|
|
||||||
/*0004*/ char chartype[64];
|
|
||||||
/*0068*/ char name[96];
|
|
||||||
/*0164*/ char ui[128];
|
|
||||||
/*0292*/ float x;
|
|
||||||
/*0296*/ float y;
|
|
||||||
/*0300*/ float z;
|
|
||||||
/*0304*/ float heading;
|
|
||||||
/*0308*/ uint32 unknown304;
|
|
||||||
/*0312*/ char unknown308[160];
|
|
||||||
/*0472*/ char target_name[64];
|
|
||||||
/*0536*/ uint32 type;
|
|
||||||
/*0540*/ char unknown536[2052];
|
|
||||||
/*2588*/ char bug[2048];
|
|
||||||
/*4636*/ char unknown4632[6];
|
|
||||||
/*4642*/ char system_info[4094];
|
|
||||||
};
|
|
||||||
struct Make_Pet_Struct { //Simple struct for getting pet info
|
struct Make_Pet_Struct { //Simple struct for getting pet info
|
||||||
uint8 level;
|
uint8 level;
|
||||||
uint8 class_;
|
uint8 class_;
|
||||||
@@ -3051,20 +3029,21 @@ struct Ground_Spawn{
|
|||||||
struct Ground_Spawns {
|
struct Ground_Spawns {
|
||||||
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
||||||
};
|
};
|
||||||
struct PetitionBug_Struct{
|
|
||||||
uint32 petition_number;
|
//struct PetitionBug_Struct{
|
||||||
uint32 unknown4;
|
// uint32 petition_number;
|
||||||
char accountname[64];
|
// uint32 unknown4;
|
||||||
uint32 zoneid;
|
// char accountname[64];
|
||||||
char name[64];
|
// uint32 zoneid;
|
||||||
uint32 level;
|
// char name[64];
|
||||||
uint32 class_;
|
// uint32 level;
|
||||||
uint32 race;
|
// uint32 class_;
|
||||||
uint32 unknown152[3];
|
// uint32 race;
|
||||||
uint32 time;
|
// uint32 unknown152[3];
|
||||||
uint32 unknown168;
|
// uint32 time;
|
||||||
char text[1028];
|
// uint32 unknown168;
|
||||||
};
|
// char text[1028];
|
||||||
|
//};
|
||||||
|
|
||||||
struct ApproveZone_Struct {
|
struct ApproveZone_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
@@ -4401,6 +4380,22 @@ struct MercenaryAssign_Struct {
|
|||||||
/*0004*/ uint32 MercUnk01; //
|
/*0004*/ uint32 MercUnk01; //
|
||||||
/*0008*/ uint32 MercUnk02; //
|
/*0008*/ uint32 MercUnk02; //
|
||||||
/*0012*/
|
/*0012*/
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SayLinkBodyFrame_Struct {
|
||||||
|
/*000*/ char ActionID[1];
|
||||||
|
/*001*/ char ItemID[5];
|
||||||
|
/*006*/ char Augment1[5];
|
||||||
|
/*011*/ char Augment2[5];
|
||||||
|
/*016*/ char Augment3[5];
|
||||||
|
/*021*/ char Augment4[5];
|
||||||
|
/*026*/ char Augment5[5];
|
||||||
|
/*031*/ char IsEvolving[1];
|
||||||
|
/*032*/ char EvolveGroup[4];
|
||||||
|
/*036*/ char EvolveLevel[1];
|
||||||
|
/*037*/ char OrnamentIcon[5];
|
||||||
|
/*042*/ char Hash[8];
|
||||||
|
/*050*/
|
||||||
};
|
};
|
||||||
|
|
||||||
}; /*structs*/
|
}; /*structs*/
|
||||||
|
|||||||
+58
-47
@@ -53,11 +53,11 @@ namespace SoF
|
|||||||
static inline uint32 SoFToServerSlot(uint32 sofSlot);
|
static inline uint32 SoFToServerSlot(uint32 sofSlot);
|
||||||
static inline uint32 SoFToServerCorpseSlot(uint32 sofCorpseSlot);
|
static inline uint32 SoFToServerCorpseSlot(uint32 sofCorpseSlot);
|
||||||
|
|
||||||
// server to client text link converter
|
// server to client say link converter
|
||||||
static inline void ServerToSoFTextLink(std::string& sofTextLink, const std::string& serverTextLink);
|
static inline void ServerToSoFSayLink(std::string& sofSayLink, const std::string& serverSayLink);
|
||||||
|
|
||||||
// client to server text link converter
|
// client to server say link converter
|
||||||
static inline void SoFToServerTextLink(std::string& serverTextLink, const std::string& sofTextLink);
|
static inline void SoFToServerSayLink(std::string& serverSayLink, const std::string& sofSayLink);
|
||||||
|
|
||||||
static inline CastingSlot ServerToSoFCastingSlot(EQEmu::CastingSlot slot);
|
static inline CastingSlot ServerToSoFCastingSlot(EQEmu::CastingSlot slot);
|
||||||
static inline EQEmu::CastingSlot SoFToServerCastingSlot(CastingSlot slot, uint32 itemlocation);
|
static inline EQEmu::CastingSlot SoFToServerCastingSlot(CastingSlot slot, uint32 itemlocation);
|
||||||
@@ -161,15 +161,14 @@ namespace SoF
|
|||||||
OUT(source);
|
OUT(source);
|
||||||
OUT(level);
|
OUT(level);
|
||||||
OUT(instrument_mod);
|
OUT(instrument_mod);
|
||||||
eq->sequence = emu->sequence;
|
OUT(force);
|
||||||
|
OUT(hit_heading);
|
||||||
|
OUT(hit_pitch);
|
||||||
OUT(type);
|
OUT(type);
|
||||||
//OUT(damage);
|
//OUT(damage);
|
||||||
OUT(spell);
|
OUT(spell);
|
||||||
eq->level2 = emu->level;
|
OUT(spell_level);
|
||||||
OUT(buff_unknown); // if this is 4, a buff icon is made
|
OUT(effect_flag); // if this is 4, a buff icon is made
|
||||||
//eq->unknown0036 = -1;
|
|
||||||
//eq->unknown0040 = -1;
|
|
||||||
//eq->unknown0044 = -1;
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -328,7 +327,7 @@ namespace SoF
|
|||||||
|
|
||||||
std::string old_message = emu->message;
|
std::string old_message = emu->message;
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToSoFTextLink(new_message, old_message);
|
ServerToSoFSayLink(new_message, old_message);
|
||||||
|
|
||||||
in->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
in->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
||||||
|
|
||||||
@@ -440,8 +439,8 @@ namespace SoF
|
|||||||
OUT(spellid);
|
OUT(spellid);
|
||||||
OUT(damage);
|
OUT(damage);
|
||||||
OUT(force);
|
OUT(force);
|
||||||
OUT(meleepush_xy);
|
OUT(hit_heading);
|
||||||
OUT(meleepush_z);
|
OUT(hit_pitch);
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -613,7 +612,7 @@ namespace SoF
|
|||||||
|
|
||||||
std::string old_message = emu->message;
|
std::string old_message = emu->message;
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToSoFTextLink(new_message, old_message);
|
ServerToSoFSayLink(new_message, old_message);
|
||||||
|
|
||||||
//if (new_message.length() > 512) // length restricted in packet building function due vari-length name size (no nullterm)
|
//if (new_message.length() > 512) // length restricted in packet building function due vari-length name size (no nullterm)
|
||||||
// new_message = new_message.substr(0, 512);
|
// new_message = new_message.substr(0, 512);
|
||||||
@@ -665,7 +664,7 @@ namespace SoF
|
|||||||
|
|
||||||
for (int i = 0; i < 9; ++i) {
|
for (int i = 0; i < 9; ++i) {
|
||||||
if (old_message_array[i].length() == 0) { break; }
|
if (old_message_array[i].length() == 0) { break; }
|
||||||
ServerToSoFTextLink(new_message_array[i], old_message_array[i]);
|
ServerToSoFSayLink(new_message_array[i], old_message_array[i]);
|
||||||
new_message_size += new_message_array[i].length() + 1;
|
new_message_size += new_message_array[i].length() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1276,6 +1275,7 @@ namespace SoF
|
|||||||
OUT(copper_cursor);
|
OUT(copper_cursor);
|
||||||
|
|
||||||
OUT_array(skills, structs::MAX_PP_SKILL); // 1:1 direct copy (100 dword)
|
OUT_array(skills, structs::MAX_PP_SKILL); // 1:1 direct copy (100 dword)
|
||||||
|
OUT_array(InnateSkills, structs::MAX_PP_INNATE_SKILL); // 1:1 direct copy (25 dword)
|
||||||
|
|
||||||
// OUT(unknown04760[236]);
|
// OUT(unknown04760[236]);
|
||||||
OUT(toxicity);
|
OUT(toxicity);
|
||||||
@@ -1813,7 +1813,7 @@ namespace SoF
|
|||||||
std::string old_message = &emu->message[strlen(emu->sayer)];
|
std::string old_message = &emu->message[strlen(emu->sayer)];
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
|
|
||||||
ServerToSoFTextLink(new_message, old_message);
|
ServerToSoFSayLink(new_message, old_message);
|
||||||
|
|
||||||
//in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1;
|
//in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1;
|
||||||
in->size = strlen(emu->sayer) + new_message.length() + 25;
|
in->size = strlen(emu->sayer) + new_message.length() + 25;
|
||||||
@@ -1881,7 +1881,7 @@ namespace SoF
|
|||||||
|
|
||||||
std::string old_message = InBuffer; // start 'Reward' as string
|
std::string old_message = InBuffer; // start 'Reward' as string
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToSoFTextLink(new_message, old_message);
|
ServerToSoFSayLink(new_message, old_message);
|
||||||
|
|
||||||
in->size = sizeof(TaskDescriptionHeader_Struct) + sizeof(TaskDescriptionData1_Struct)+
|
in->size = sizeof(TaskDescriptionHeader_Struct) + sizeof(TaskDescriptionData1_Struct)+
|
||||||
sizeof(TaskDescriptionData2_Struct) + sizeof(TaskDescriptionTrailer_Struct)+
|
sizeof(TaskDescriptionData2_Struct) + sizeof(TaskDescriptionTrailer_Struct)+
|
||||||
@@ -2097,7 +2097,7 @@ namespace SoF
|
|||||||
int k;
|
int k;
|
||||||
for (r = 0; r < entrycount; r++, eq++, emu++) {
|
for (r = 0; r < entrycount; r++, eq++, emu++) {
|
||||||
|
|
||||||
eq->showname = 1; //New Field - Toggles Name Display on or off - 0 = off, 1 = on
|
eq->showname = emu->show_name ? 1 : 0; //New Field - Toggles Name Display on or off - 0 = off, 1 = on
|
||||||
eq->linkdead = 0; //New Field - Toggles LD on or off after name - 0 = off, 1 = on
|
eq->linkdead = 0; //New Field - Toggles LD on or off after name - 0 = off, 1 = on
|
||||||
eq->statue = 0; //New Field - 1 freezes animation
|
eq->statue = 0; //New Field - 1 freezes animation
|
||||||
eq->showhelm = emu->showhelm;
|
eq->showhelm = emu->showhelm;
|
||||||
@@ -2384,6 +2384,17 @@ namespace SoF
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DECODE(OP_Bug)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_EXACT(structs::BugReport_Struct);
|
||||||
|
SETUP_DIRECT_DECODE(BugReport_Struct, structs::BugReport_Struct);
|
||||||
|
|
||||||
|
emu->category_id = EQEmu::bug::CategoryNameToCategoryID(eq->category_name);
|
||||||
|
memcpy(emu->category_name, eq, sizeof(structs::BugReport_Struct));
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
}
|
||||||
|
|
||||||
DECODE(OP_CastSpell)
|
DECODE(OP_CastSpell)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
||||||
@@ -2403,7 +2414,7 @@ namespace SoF
|
|||||||
|
|
||||||
std::string old_message = (char *)&__eq_buffer[sizeof(ChannelMessage_Struct)];
|
std::string old_message = (char *)&__eq_buffer[sizeof(ChannelMessage_Struct)];
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
SoFToServerTextLink(new_message, old_message);
|
SoFToServerSayLink(new_message, old_message);
|
||||||
|
|
||||||
__packet->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
__packet->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
__packet->pBuffer = new unsigned char[__packet->size];
|
||||||
@@ -2517,7 +2528,7 @@ namespace SoF
|
|||||||
|
|
||||||
std::string old_message = (char *)&__eq_buffer[4]; // unknown01 offset
|
std::string old_message = (char *)&__eq_buffer[4]; // unknown01 offset
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
SoFToServerTextLink(new_message, old_message);
|
SoFToServerSayLink(new_message, old_message);
|
||||||
|
|
||||||
__packet->size = sizeof(Emote_Struct);
|
__packet->size = sizeof(Emote_Struct);
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
__packet->pBuffer = new unsigned char[__packet->size];
|
||||||
@@ -3304,19 +3315,19 @@ namespace SoF
|
|||||||
return (sofCorpseSlot - 1);
|
return (sofCorpseSlot - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void ServerToSoFTextLink(std::string& sofTextLink, const std::string& serverTextLink)
|
static inline void ServerToSoFSayLink(std::string& sofSayLink, const std::string& serverSayLink)
|
||||||
{
|
{
|
||||||
if ((constants::SayLinkBodySize == EQEmu::legacy::TEXT_LINK_BODY_LENGTH) || (serverTextLink.find('\x12') == std::string::npos)) {
|
if ((constants::SayLinkBodySize == EQEmu::constants::SayLinkBodySize) || (serverSayLink.find('\x12') == std::string::npos)) {
|
||||||
sofTextLink = serverTextLink;
|
sofSayLink = serverSayLink;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto segments = SplitString(serverTextLink, '\x12');
|
auto segments = SplitString(serverSayLink, '\x12');
|
||||||
|
|
||||||
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
||||||
if (segment_iter & 1) {
|
if (segment_iter & 1) {
|
||||||
if (segments[segment_iter].length() <= EQEmu::legacy::TEXT_LINK_BODY_LENGTH) {
|
if (segments[segment_iter].length() <= EQEmu::constants::SayLinkBodySize) {
|
||||||
sofTextLink.append(segments[segment_iter]);
|
sofSayLink.append(segments[segment_iter]);
|
||||||
// TODO: log size mismatch error
|
// TODO: log size mismatch error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -3326,37 +3337,37 @@ namespace SoF
|
|||||||
// SoF: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX X XXXXX XXXXXXXX (50)
|
// SoF: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX X XXXXX XXXXXXXX (50)
|
||||||
// Diff: ^^^^^ ^
|
// Diff: ^^^^^ ^
|
||||||
|
|
||||||
sofTextLink.push_back('\x12');
|
sofSayLink.push_back('\x12');
|
||||||
sofTextLink.append(segments[segment_iter].substr(0, 31));
|
sofSayLink.append(segments[segment_iter].substr(0, 31));
|
||||||
sofTextLink.append(segments[segment_iter].substr(36, 5));
|
sofSayLink.append(segments[segment_iter].substr(36, 5));
|
||||||
|
|
||||||
if (segments[segment_iter][41] == '0')
|
if (segments[segment_iter][41] == '0')
|
||||||
sofTextLink.push_back(segments[segment_iter][42]);
|
sofSayLink.push_back(segments[segment_iter][42]);
|
||||||
else
|
else
|
||||||
sofTextLink.push_back('F');
|
sofSayLink.push_back('F');
|
||||||
|
|
||||||
sofTextLink.append(segments[segment_iter].substr(43));
|
sofSayLink.append(segments[segment_iter].substr(43));
|
||||||
sofTextLink.push_back('\x12');
|
sofSayLink.push_back('\x12');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sofTextLink.append(segments[segment_iter]);
|
sofSayLink.append(segments[segment_iter]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void SoFToServerTextLink(std::string& serverTextLink, const std::string& sofTextLink)
|
static inline void SoFToServerSayLink(std::string& serverSayLink, const std::string& sofSayLink)
|
||||||
{
|
{
|
||||||
if ((EQEmu::legacy::TEXT_LINK_BODY_LENGTH == constants::SayLinkBodySize) || (sofTextLink.find('\x12') == std::string::npos)) {
|
if ((EQEmu::constants::SayLinkBodySize == constants::SayLinkBodySize) || (sofSayLink.find('\x12') == std::string::npos)) {
|
||||||
serverTextLink = sofTextLink;
|
serverSayLink = sofSayLink;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto segments = SplitString(sofTextLink, '\x12');
|
auto segments = SplitString(sofSayLink, '\x12');
|
||||||
|
|
||||||
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
||||||
if (segment_iter & 1) {
|
if (segment_iter & 1) {
|
||||||
if (segments[segment_iter].length() <= constants::SayLinkBodySize) {
|
if (segments[segment_iter].length() <= constants::SayLinkBodySize) {
|
||||||
serverTextLink.append(segments[segment_iter]);
|
serverSayLink.append(segments[segment_iter]);
|
||||||
// TODO: log size mismatch error
|
// TODO: log size mismatch error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -3366,16 +3377,16 @@ namespace SoF
|
|||||||
// RoF2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX XX XXXXX XXXXXXXX (56)
|
// RoF2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX XX XXXXX XXXXXXXX (56)
|
||||||
// Diff: ^^^^^ ^
|
// Diff: ^^^^^ ^
|
||||||
|
|
||||||
serverTextLink.push_back('\x12');
|
serverSayLink.push_back('\x12');
|
||||||
serverTextLink.append(segments[segment_iter].substr(0, 31));
|
serverSayLink.append(segments[segment_iter].substr(0, 31));
|
||||||
serverTextLink.append("00000");
|
serverSayLink.append("00000");
|
||||||
serverTextLink.append(segments[segment_iter].substr(31, 5));
|
serverSayLink.append(segments[segment_iter].substr(31, 5));
|
||||||
serverTextLink.push_back('0');
|
serverSayLink.push_back('0');
|
||||||
serverTextLink.append(segments[segment_iter].substr(36));
|
serverSayLink.append(segments[segment_iter].substr(36));
|
||||||
serverTextLink.push_back('\x12');
|
serverSayLink.push_back('\x12');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
serverTextLink.append(segments[segment_iter]);
|
serverSayLink.append(segments[segment_iter]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ D(OP_ApplyPoison)
|
|||||||
D(OP_AugmentInfo)
|
D(OP_AugmentInfo)
|
||||||
D(OP_AugmentItem)
|
D(OP_AugmentItem)
|
||||||
D(OP_Buff)
|
D(OP_Buff)
|
||||||
|
D(OP_Bug)
|
||||||
D(OP_CastSpell)
|
D(OP_CastSpell)
|
||||||
D(OP_ChannelMessage)
|
D(OP_ChannelMessage)
|
||||||
D(OP_CharacterCreate)
|
D(OP_CharacterCreate)
|
||||||
|
|||||||
+122
-66
@@ -52,6 +52,25 @@ struct EnterWorld_Struct {
|
|||||||
struct WorldObjectsSent_Struct {
|
struct WorldObjectsSent_Struct {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// yep, even SoF had a version of the new inventory system, used by OP_MoveMultipleItems
|
||||||
|
struct InventorySlot_Struct
|
||||||
|
{
|
||||||
|
/*000*/ int32 Type; // Worn and Normal inventory = 0, Bank = 1, Shared Bank = 2, Trade = 3, World = 4, Limbo = 5
|
||||||
|
/*004*/ int32 Slot;
|
||||||
|
/*008*/ int32 SubIndex;
|
||||||
|
/*012*/ int32 AugIndex;
|
||||||
|
/*016*/ int32 Unknown01;
|
||||||
|
};
|
||||||
|
|
||||||
|
// unsure if they have a version of this, completeness though
|
||||||
|
struct TypelessInventorySlot_Struct
|
||||||
|
{
|
||||||
|
/*000*/ int32 Slot;
|
||||||
|
/*004*/ int32 SubIndex;
|
||||||
|
/*008*/ int32 AugIndex;
|
||||||
|
/*012*/ int32 Unknown01;
|
||||||
|
};
|
||||||
|
|
||||||
/* Name Approval Struct */
|
/* Name Approval Struct */
|
||||||
/* Len: */
|
/* Len: */
|
||||||
/* Opcode: 0x8B20*/
|
/* Opcode: 0x8B20*/
|
||||||
@@ -307,7 +326,8 @@ union
|
|||||||
/*0725*/ uint8 targetable; // 1 = Targetable 0 = Not Targetable (is_npc?)
|
/*0725*/ uint8 targetable; // 1 = Targetable 0 = Not Targetable (is_npc?)
|
||||||
/*0726*/ uint8 unknown0726[4];
|
/*0726*/ uint8 unknown0726[4];
|
||||||
/*0730*/ uint8 NPC; // 0=player,1=npc,2=pc corpse,3=npc corpse
|
/*0730*/ uint8 NPC; // 0=player,1=npc,2=pc corpse,3=npc corpse
|
||||||
/*0731*/ uint8 unknown0731[11];
|
/*0731*/ float bounding_radius; // used in melee, overrides calc
|
||||||
|
/*0735*/ uint8 unknown0731[7];
|
||||||
/*0742*/ uint8 targetable_with_hotkey;
|
/*0742*/ uint8 targetable_with_hotkey;
|
||||||
/*0743*/ signed padding00:12; // ***Placeholder
|
/*0743*/ signed padding00:12; // ***Placeholder
|
||||||
signed x:19; // x coord
|
signed x:19; // x coord
|
||||||
@@ -799,6 +819,7 @@ static const uint32 MAX_PP_LANGUAGE = 25; //
|
|||||||
static const uint32 MAX_PP_SPELLBOOK = 480; // Confirmed 60 pages on Live now
|
static const uint32 MAX_PP_SPELLBOOK = 480; // Confirmed 60 pages on Live now
|
||||||
static const uint32 MAX_PP_MEMSPELL = 10; //was 9 now 10 on Live
|
static const uint32 MAX_PP_MEMSPELL = 10; //was 9 now 10 on Live
|
||||||
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
||||||
|
static const uint32 MAX_PP_INNATE_SKILL = 25;
|
||||||
static const uint32 MAX_PP_AA_ARRAY = 300; //was 299
|
static const uint32 MAX_PP_AA_ARRAY = 300; //was 299
|
||||||
static const uint32 MAX_GROUP_MEMBERS = 6;
|
static const uint32 MAX_GROUP_MEMBERS = 6;
|
||||||
static const uint32 MAX_RECAST_TYPES = 20;
|
static const uint32 MAX_RECAST_TYPES = 20;
|
||||||
@@ -903,7 +924,8 @@ struct PlayerProfile_Struct //23576 Octets
|
|||||||
/*06488*/ uint32 silver_cursor; // Silver Pieces on cursor
|
/*06488*/ uint32 silver_cursor; // Silver Pieces on cursor
|
||||||
/*06492*/ uint32 copper_cursor; // Copper Pieces on cursor
|
/*06492*/ uint32 copper_cursor; // Copper Pieces on cursor
|
||||||
/*06496*/ uint32 skills[MAX_PP_SKILL]; // [400] List of skills // 100 dword buffer
|
/*06496*/ uint32 skills[MAX_PP_SKILL]; // [400] List of skills // 100 dword buffer
|
||||||
/*06896*/ uint8 unknown04760[136];
|
/*06896*/ uint32 InnateSkills[MAX_PP_INNATE_SKILL];
|
||||||
|
/*06996*/ uint8 unknown04760[36];
|
||||||
/*07032*/ uint32 toxicity; // Potion Toxicity (15=too toxic, each potion adds 3)
|
/*07032*/ uint32 toxicity; // Potion Toxicity (15=too toxic, each potion adds 3)
|
||||||
/*07036*/ uint32 thirst_level; // Drink (ticks till next drink)
|
/*07036*/ uint32 thirst_level; // Drink (ticks till next drink)
|
||||||
/*07040*/ uint32 hunger_level; // Food (ticks till next eat)
|
/*07040*/ uint32 hunger_level; // Food (ticks till next eat)
|
||||||
@@ -1193,20 +1215,18 @@ struct Action_Struct
|
|||||||
{
|
{
|
||||||
/* 00 */ uint16 target; // id of target
|
/* 00 */ uint16 target; // id of target
|
||||||
/* 02 */ uint16 source; // id of caster
|
/* 02 */ uint16 source; // id of caster
|
||||||
/* 04 */ uint16 level; // level of caster
|
/* 04 */ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level
|
||||||
/* 06 */ uint16 instrument_mod; // seems to be fixed to 0x0A
|
/* 06 */ uint32 instrument_mod; // OSX dump says base damage, spells use it for bard song (different from newer clients)
|
||||||
/* 08 */ uint32 unknown08;
|
/* 10 */ float force;
|
||||||
/* 12 */ uint16 unknown16;
|
/* 14 */ float hit_heading;
|
||||||
// some kind of sequence that's the same in both actions
|
/* 18 */ float hit_pitch;
|
||||||
// as well as the combat damage, to tie em together?
|
/* 22 */ uint8 type; // 231 (0xE7) for spells, skill
|
||||||
/* 14 */ float sequence; // was uint32
|
/* 23 */ uint16 unknown23; // OSX says min_damage
|
||||||
/* 18 */ uint32 unknown18;
|
/* 25 */ uint16 unknown25; // OSX says tohit
|
||||||
/* 22 */ uint8 type; // 231 (0xE7) for spells
|
|
||||||
/* 23 */ uint32 unknown23;
|
|
||||||
/* 27 */ uint16 spell; // spell id being cast
|
/* 27 */ uint16 spell; // spell id being cast
|
||||||
/* 29 */ uint8 level2; // level of caster again? Or maybe the castee
|
/* 29 */ uint8 spell_level; // level of caster again? Or maybe the castee
|
||||||
// this field seems to be some sort of success flag, if it's 4
|
// this field seems to be some sort of success flag, if it's 4
|
||||||
/* 30 */ uint8 buff_unknown; // if this is 4, a buff icon is made
|
/* 30 */ uint8 effect_flag; // if this is 4, a buff icon is made
|
||||||
/* 31 */
|
/* 31 */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1215,26 +1235,23 @@ struct Action_Struct
|
|||||||
// has to do with buff blocking??
|
// has to do with buff blocking??
|
||||||
struct ActionAlt_Struct // ActionAlt_Struct - Size: 56 bytes
|
struct ActionAlt_Struct // ActionAlt_Struct - Size: 56 bytes
|
||||||
{
|
{
|
||||||
/*0000*/ uint16 target; // Target ID
|
/*0000*/ uint16 target; // id of target
|
||||||
/*0002*/ uint16 source; // SourceID
|
/*0002*/ uint16 source; // id of caster
|
||||||
/*0004*/ uint16 level; // level of caster
|
/*0004*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level
|
||||||
/*0006*/ uint16 instrument_mod; // seems to be fixed to 0x0A
|
/*0006*/ uint32 instrument_mod; // OSX dump says base damage, spells use it for bard song (different from newer clients)
|
||||||
/*0008*/ uint32 unknown08;
|
/*0010*/ float force;
|
||||||
/*0012*/ uint16 unknown16;
|
/*0014*/ float hit_heading;
|
||||||
/*0014*/ uint32 sequence;
|
/*0018*/ float hit_pitch;
|
||||||
/*0018*/ uint32 unknown18;
|
/*0022*/ uint8 type; // 231 (0xE7) for spells, skill
|
||||||
/*0022*/ uint8 type; // Casts, Falls, Bashes, etc...
|
/*0023*/ uint16 unknown23; // OSX says min_damage
|
||||||
/*0023*/ uint32 damage; // Amount of Damage
|
/*0025*/ uint16 unknown25; // OSX says tohit
|
||||||
/*0027*/ uint16 spell; // SpellID
|
/*0027*/ uint16 spell; // spell id being cast
|
||||||
/*0029*/ uint8 unknown29;
|
/*0029*/ uint8 spell_level; // level of caster again? Or maybe the castee
|
||||||
/*0030*/ uint8 buff_unknown; // if this is 4, a buff icon is made
|
// this field seems to be some sort of success flag, if it's 4
|
||||||
/*0031*/ uint32 unknown0031; // seen 00 00 00 00
|
/*0030*/ uint8 effect_flag; // if this is 4, a buff icon is made
|
||||||
/*0035*/ uint8 unknown0035; // seen 00
|
/*0031*/ uint8 spell_slot;
|
||||||
/*0036*/ uint32 unknown0036; // seen ff ff ff ff
|
/*0032*/ uint32 slot[5];
|
||||||
/*0040*/ uint32 unknown0040; // seen ff ff ff ff
|
/*0052*/ uint32 item_cast_type; // ItemSpellTypes enum from MQ2
|
||||||
/*0044*/ uint32 unknown0044; // seen ff ff ff ff
|
|
||||||
/*0048*/ uint32 unknown0048; // seen 00 00 00 00
|
|
||||||
/*0052*/ uint32 unknown0052; // seen 00 00 00 00
|
|
||||||
/*0056*/
|
/*0056*/
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1249,9 +1266,10 @@ struct CombatDamage_Struct
|
|||||||
/* 05 */ uint16 spellid;
|
/* 05 */ uint16 spellid;
|
||||||
/* 07 */ int32 damage;
|
/* 07 */ int32 damage;
|
||||||
/* 11 */ float force; // cd cc cc 3d
|
/* 11 */ float force; // cd cc cc 3d
|
||||||
/* 15 */ float meleepush_xy; // see above notes in Action_Struct
|
/* 15 */ float hit_heading; // see above notes in Action_Struct
|
||||||
/* 19 */ float meleepush_z;
|
/* 19 */ float hit_pitch;
|
||||||
/* 23 */ uint8 unknown23[5]; // was [9] this appears unrelated to the stuff the other clients do here?
|
/* 23 */ uint8 secondary; // 0 for primary hand, 1 for secondary
|
||||||
|
/* 24 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage, Report function doesn't seem to check this :P
|
||||||
/* 28 */
|
/* 28 */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1555,6 +1573,19 @@ struct MoveItem_Struct
|
|||||||
/*0012*/
|
/*0012*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct MultiMoveItemSub_Struct
|
||||||
|
{
|
||||||
|
/*0000*/ InventorySlot_Struct from_slot;
|
||||||
|
/*0020*/ uint32 number_in_stack; // so the amount we are moving from the source
|
||||||
|
/*0024*/ InventorySlot_Struct to_slot;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MultiMoveItem_Struct
|
||||||
|
{
|
||||||
|
/*0000*/ uint32 count;
|
||||||
|
/*0004*/ MultiMoveItemSub_Struct moves[0];
|
||||||
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// from_slot/to_slot
|
// from_slot/to_slot
|
||||||
// -1 - destroy
|
// -1 - destroy
|
||||||
@@ -2872,23 +2903,31 @@ struct GuildMakeLeader{
|
|||||||
char target[64];
|
char target[64];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct BugReport_Struct {
|
||||||
|
/*0000*/ char category_name[64];
|
||||||
|
/*0064*/ char character_name[64];
|
||||||
|
/*0128*/ char unused_0128[32];
|
||||||
|
/*0160*/ char ui_path[128];
|
||||||
|
/*0288*/ float pos_x;
|
||||||
|
/*0292*/ float pos_y;
|
||||||
|
/*0296*/ float pos_z;
|
||||||
|
/*0300*/ uint32 heading;
|
||||||
|
/*0304*/ uint32 unused_0304;
|
||||||
|
/*0308*/ uint32 time_played;
|
||||||
|
/*0312*/ char padding_0312[8];
|
||||||
|
/*0320*/ uint32 target_id;
|
||||||
|
/*0324*/ char padding_0324[140];
|
||||||
|
/*0464*/ uint32 unknown_0464; // seems to always be '0'
|
||||||
|
/*0468*/ char target_name[64];
|
||||||
|
/*0532*/ uint32 optional_info_mask;
|
||||||
|
|
||||||
|
// this looks like a butchered 8k buffer with 2 trailing dword fields
|
||||||
struct BugStruct{
|
/*0536*/ char unused_0536[2052];
|
||||||
/*0000*/ char chartype[64];
|
/*2588*/ char bug_report[2050];
|
||||||
/*0064*/ char name[96];
|
/*4638*/ char system_info[4098];
|
||||||
/*0160*/ char ui[128];
|
/*8736*/
|
||||||
/*0288*/ float x;
|
|
||||||
/*0292*/ float y;
|
|
||||||
/*0296*/ float z;
|
|
||||||
/*0300*/ float heading;
|
|
||||||
/*0304*/ uint32 unknown304;
|
|
||||||
/*0308*/ uint32 type;
|
|
||||||
/*0312*/ char unknown312[2144];
|
|
||||||
/*2456*/ char bug[1024];
|
|
||||||
/*3480*/ char placeholder[2];
|
|
||||||
/*3482*/ char system_info[4098];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Make_Pet_Struct { //Simple struct for getting pet info
|
struct Make_Pet_Struct { //Simple struct for getting pet info
|
||||||
uint8 level;
|
uint8 level;
|
||||||
uint8 class_;
|
uint8 class_;
|
||||||
@@ -2915,20 +2954,21 @@ struct Ground_Spawn{
|
|||||||
struct Ground_Spawns {
|
struct Ground_Spawns {
|
||||||
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
||||||
};
|
};
|
||||||
struct PetitionBug_Struct{
|
|
||||||
uint32 petition_number;
|
//struct PetitionBug_Struct{
|
||||||
uint32 unknown4;
|
// uint32 petition_number;
|
||||||
char accountname[64];
|
// uint32 unknown4;
|
||||||
uint32 zoneid;
|
// char accountname[64];
|
||||||
char name[64];
|
// uint32 zoneid;
|
||||||
uint32 level;
|
// char name[64];
|
||||||
uint32 class_;
|
// uint32 level;
|
||||||
uint32 race;
|
// uint32 class_;
|
||||||
uint32 unknown152[3];
|
// uint32 race;
|
||||||
uint32 time;
|
// uint32 unknown152[3];
|
||||||
uint32 unknown168;
|
// uint32 time;
|
||||||
char text[1028];
|
// uint32 unknown168;
|
||||||
};
|
// char text[1028];
|
||||||
|
//};
|
||||||
|
|
||||||
struct ApproveZone_Struct {
|
struct ApproveZone_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
@@ -4112,6 +4152,22 @@ struct AltCurrencySellItem_Struct {
|
|||||||
/*004*/ uint32 slot_id;
|
/*004*/ uint32 slot_id;
|
||||||
/*006*/ uint32 charges;
|
/*006*/ uint32 charges;
|
||||||
/*010*/ uint32 cost;
|
/*010*/ uint32 cost;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SayLinkBodyFrame_Struct {
|
||||||
|
/*000*/ char ActionID[1];
|
||||||
|
/*001*/ char ItemID[5];
|
||||||
|
/*006*/ char Augment1[5];
|
||||||
|
/*011*/ char Augment2[5];
|
||||||
|
/*016*/ char Augment3[5];
|
||||||
|
/*021*/ char Augment4[5];
|
||||||
|
/*026*/ char Augment5[5];
|
||||||
|
/*031*/ char IsEvolving[1];
|
||||||
|
/*032*/ char EvolveGroup[4];
|
||||||
|
/*036*/ char EvolveLevel[1];
|
||||||
|
/*037*/ char OrnamentIcon[5];
|
||||||
|
/*042*/ char Hash[8];
|
||||||
|
/*050*/
|
||||||
};
|
};
|
||||||
|
|
||||||
}; /*structs*/
|
}; /*structs*/
|
||||||
|
|||||||
+59
-44
@@ -52,11 +52,11 @@ namespace Titanium
|
|||||||
static inline uint32 TitaniumToServerSlot(int16 titaniumSlot);
|
static inline uint32 TitaniumToServerSlot(int16 titaniumSlot);
|
||||||
static inline uint32 TitaniumToServerCorpseSlot(int16 titaniumCorpseSlot);
|
static inline uint32 TitaniumToServerCorpseSlot(int16 titaniumCorpseSlot);
|
||||||
|
|
||||||
// server to client text link converter
|
// server to client say link converter
|
||||||
static inline void ServerToTitaniumTextLink(std::string& titaniumTextLink, const std::string& serverTextLink);
|
static inline void ServerToTitaniumSayLink(std::string& titaniumSayLink, const std::string& serverSayLink);
|
||||||
|
|
||||||
// client to server text link converter
|
// client to server say link converter
|
||||||
static inline void TitaniumToServerTextLink(std::string& serverTextLink, const std::string& titaniumTextLink);
|
static inline void TitaniumToServerSayLink(std::string& serverSayLink, const std::string& titaniumSayLink);
|
||||||
|
|
||||||
static inline CastingSlot ServerToTitaniumCastingSlot(EQEmu::CastingSlot slot);
|
static inline CastingSlot ServerToTitaniumCastingSlot(EQEmu::CastingSlot slot);
|
||||||
static inline EQEmu::CastingSlot TitaniumToServerCastingSlot(CastingSlot slot, uint32 itemlocation);
|
static inline EQEmu::CastingSlot TitaniumToServerCastingSlot(CastingSlot slot, uint32 itemlocation);
|
||||||
@@ -164,11 +164,14 @@ namespace Titanium
|
|||||||
OUT(source);
|
OUT(source);
|
||||||
OUT(level);
|
OUT(level);
|
||||||
OUT(instrument_mod);
|
OUT(instrument_mod);
|
||||||
OUT(sequence);
|
OUT(force);
|
||||||
|
OUT(hit_heading);
|
||||||
|
OUT(hit_pitch);
|
||||||
OUT(type);
|
OUT(type);
|
||||||
//OUT(damage);
|
//OUT(damage);
|
||||||
OUT(spell);
|
OUT(spell);
|
||||||
OUT(buff_unknown); // if this is 4, a buff icon is made
|
OUT(spell_level);
|
||||||
|
OUT(effect_flag); // if this is 4, a buff icon is made
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -290,7 +293,7 @@ namespace Titanium
|
|||||||
|
|
||||||
std::string old_message = emu->message;
|
std::string old_message = emu->message;
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToTitaniumTextLink(new_message, old_message);
|
ServerToTitaniumSayLink(new_message, old_message);
|
||||||
|
|
||||||
in->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
in->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
||||||
|
|
||||||
@@ -358,8 +361,8 @@ namespace Titanium
|
|||||||
OUT(spellid);
|
OUT(spellid);
|
||||||
OUT(damage);
|
OUT(damage);
|
||||||
OUT(force);
|
OUT(force);
|
||||||
OUT(meleepush_xy);
|
OUT(hit_heading);
|
||||||
OUT(meleepush_z);
|
OUT(hit_pitch);
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -532,7 +535,7 @@ namespace Titanium
|
|||||||
|
|
||||||
std::string old_message = emu->message;
|
std::string old_message = emu->message;
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToTitaniumTextLink(new_message, old_message);
|
ServerToTitaniumSayLink(new_message, old_message);
|
||||||
|
|
||||||
//if (new_message.length() > 512) // length restricted in packet building function due vari-length name size (no nullterm)
|
//if (new_message.length() > 512) // length restricted in packet building function due vari-length name size (no nullterm)
|
||||||
// new_message = new_message.substr(0, 512);
|
// new_message = new_message.substr(0, 512);
|
||||||
@@ -574,7 +577,7 @@ namespace Titanium
|
|||||||
|
|
||||||
for (int i = 0; i < 9; ++i) {
|
for (int i = 0; i < 9; ++i) {
|
||||||
if (old_message_array[i].length() == 0) { break; }
|
if (old_message_array[i].length() == 0) { break; }
|
||||||
ServerToTitaniumTextLink(new_message_array[i], old_message_array[i]);
|
ServerToTitaniumSayLink(new_message_array[i], old_message_array[i]);
|
||||||
new_message_size += new_message_array[i].length() + 1;
|
new_message_size += new_message_array[i].length() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1020,6 +1023,7 @@ namespace Titanium
|
|||||||
OUT(copper_cursor);
|
OUT(copper_cursor);
|
||||||
|
|
||||||
OUT_array(skills, structs::MAX_PP_SKILL); // 1:1 direct copy (100 dword)
|
OUT_array(skills, structs::MAX_PP_SKILL); // 1:1 direct copy (100 dword)
|
||||||
|
OUT_array(InnateSkills, structs::MAX_PP_INNATE_SKILL); // 1:1 direct copy (25 dword)
|
||||||
|
|
||||||
// OUT(unknown04760[236]);
|
// OUT(unknown04760[236]);
|
||||||
OUT(toxicity);
|
OUT(toxicity);
|
||||||
@@ -1401,7 +1405,7 @@ namespace Titanium
|
|||||||
std::string old_message = &emu->message[strlen(emu->sayer)];
|
std::string old_message = &emu->message[strlen(emu->sayer)];
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
|
|
||||||
ServerToTitaniumTextLink(new_message, old_message);
|
ServerToTitaniumSayLink(new_message, old_message);
|
||||||
|
|
||||||
//in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1;
|
//in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1;
|
||||||
in->size = strlen(emu->sayer) + new_message.length() + 25;
|
in->size = strlen(emu->sayer) + new_message.length() + 25;
|
||||||
@@ -1457,7 +1461,7 @@ namespace Titanium
|
|||||||
|
|
||||||
std::string old_message = InBuffer; // start 'Reward' as string
|
std::string old_message = InBuffer; // start 'Reward' as string
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToTitaniumTextLink(new_message, old_message);
|
ServerToTitaniumSayLink(new_message, old_message);
|
||||||
|
|
||||||
in->size = sizeof(TaskDescriptionHeader_Struct) + sizeof(TaskDescriptionData1_Struct) +
|
in->size = sizeof(TaskDescriptionHeader_Struct) + sizeof(TaskDescriptionData1_Struct) +
|
||||||
sizeof(TaskDescriptionData2_Struct) + sizeof(TaskDescriptionTrailer_Struct) +
|
sizeof(TaskDescriptionData2_Struct) + sizeof(TaskDescriptionTrailer_Struct) +
|
||||||
@@ -1788,6 +1792,17 @@ namespace Titanium
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DECODE(OP_Bug)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_EXACT(structs::BugReport_Struct);
|
||||||
|
SETUP_DIRECT_DECODE(BugReport_Struct, structs::BugReport_Struct);
|
||||||
|
|
||||||
|
emu->category_id = EQEmu::bug::CategoryNameToCategoryID(eq->category_name);
|
||||||
|
memcpy(emu->category_name, eq, sizeof(structs::BugReport_Struct));
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
}
|
||||||
|
|
||||||
DECODE(OP_CastSpell)
|
DECODE(OP_CastSpell)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
||||||
@@ -1807,7 +1822,7 @@ namespace Titanium
|
|||||||
|
|
||||||
std::string old_message = (char *)&__eq_buffer[sizeof(ChannelMessage_Struct)];
|
std::string old_message = (char *)&__eq_buffer[sizeof(ChannelMessage_Struct)];
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
TitaniumToServerTextLink(new_message, old_message);
|
TitaniumToServerSayLink(new_message, old_message);
|
||||||
|
|
||||||
__packet->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
__packet->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
__packet->pBuffer = new unsigned char[__packet->size];
|
||||||
@@ -1879,7 +1894,7 @@ namespace Titanium
|
|||||||
|
|
||||||
std::string old_message = (char *)&__eq_buffer[4]; // unknown01 offset
|
std::string old_message = (char *)&__eq_buffer[4]; // unknown01 offset
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
TitaniumToServerTextLink(new_message, old_message);
|
TitaniumToServerSayLink(new_message, old_message);
|
||||||
|
|
||||||
__packet->size = sizeof(Emote_Struct);
|
__packet->size = sizeof(Emote_Struct);
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
__packet->pBuffer = new unsigned char[__packet->size];
|
||||||
@@ -2473,19 +2488,19 @@ namespace Titanium
|
|||||||
return titaniumCorpseSlot;
|
return titaniumCorpseSlot;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void ServerToTitaniumTextLink(std::string& titaniumTextLink, const std::string& serverTextLink)
|
static inline void ServerToTitaniumSayLink(std::string& titaniumSayLink, const std::string& serverSayLink)
|
||||||
{
|
{
|
||||||
if ((constants::SayLinkBodySize == EQEmu::legacy::TEXT_LINK_BODY_LENGTH) || (serverTextLink.find('\x12') == std::string::npos)) {
|
if ((constants::SayLinkBodySize == EQEmu::constants::SayLinkBodySize) || (serverSayLink.find('\x12') == std::string::npos)) {
|
||||||
titaniumTextLink = serverTextLink;
|
titaniumSayLink = serverSayLink;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto segments = SplitString(serverTextLink, '\x12');
|
auto segments = SplitString(serverSayLink, '\x12');
|
||||||
|
|
||||||
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
||||||
if (segment_iter & 1) {
|
if (segment_iter & 1) {
|
||||||
if (segments[segment_iter].length() <= EQEmu::legacy::TEXT_LINK_BODY_LENGTH) {
|
if (segments[segment_iter].length() <= EQEmu::constants::SayLinkBodySize) {
|
||||||
titaniumTextLink.append(segments[segment_iter]);
|
titaniumSayLink.append(segments[segment_iter]);
|
||||||
// TODO: log size mismatch error
|
// TODO: log size mismatch error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -2495,37 +2510,37 @@ namespace Titanium
|
|||||||
// 6.2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX X XXXXXXXX (45)
|
// 6.2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX X XXXXXXXX (45)
|
||||||
// Diff: ^^^^^ ^ ^^^^^
|
// Diff: ^^^^^ ^ ^^^^^
|
||||||
|
|
||||||
titaniumTextLink.push_back('\x12');
|
titaniumSayLink.push_back('\x12');
|
||||||
titaniumTextLink.append(segments[segment_iter].substr(0, 31));
|
titaniumSayLink.append(segments[segment_iter].substr(0, 31));
|
||||||
titaniumTextLink.append(segments[segment_iter].substr(36, 5));
|
titaniumSayLink.append(segments[segment_iter].substr(36, 5));
|
||||||
|
|
||||||
if (segments[segment_iter][41] == '0')
|
if (segments[segment_iter][41] == '0')
|
||||||
titaniumTextLink.push_back(segments[segment_iter][42]);
|
titaniumSayLink.push_back(segments[segment_iter][42]);
|
||||||
else
|
else
|
||||||
titaniumTextLink.push_back('F');
|
titaniumSayLink.push_back('F');
|
||||||
|
|
||||||
titaniumTextLink.append(segments[segment_iter].substr(48));
|
titaniumSayLink.append(segments[segment_iter].substr(48));
|
||||||
titaniumTextLink.push_back('\x12');
|
titaniumSayLink.push_back('\x12');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
titaniumTextLink.append(segments[segment_iter]);
|
titaniumSayLink.append(segments[segment_iter]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void TitaniumToServerTextLink(std::string& serverTextLink, const std::string& titaniumTextLink)
|
static inline void TitaniumToServerSayLink(std::string& serverSayLink, const std::string& titaniumSayLink)
|
||||||
{
|
{
|
||||||
if ((EQEmu::legacy::TEXT_LINK_BODY_LENGTH == constants::SayLinkBodySize) || (titaniumTextLink.find('\x12') == std::string::npos)) {
|
if ((EQEmu::constants::SayLinkBodySize == constants::SayLinkBodySize) || (titaniumSayLink.find('\x12') == std::string::npos)) {
|
||||||
serverTextLink = titaniumTextLink;
|
serverSayLink = titaniumSayLink;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto segments = SplitString(titaniumTextLink, '\x12');
|
auto segments = SplitString(titaniumSayLink, '\x12');
|
||||||
|
|
||||||
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
||||||
if (segment_iter & 1) {
|
if (segment_iter & 1) {
|
||||||
if (segments[segment_iter].length() <= constants::SayLinkBodySize) {
|
if (segments[segment_iter].length() <= constants::SayLinkBodySize) {
|
||||||
serverTextLink.append(segments[segment_iter]);
|
serverSayLink.append(segments[segment_iter]);
|
||||||
// TODO: log size mismatch error
|
// TODO: log size mismatch error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -2535,18 +2550,18 @@ namespace Titanium
|
|||||||
// RoF2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX XX XXXXX XXXXXXXX (56)
|
// RoF2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX XX XXXXX XXXXXXXX (56)
|
||||||
// Diff: ^^^^^ ^ ^^^^^
|
// Diff: ^^^^^ ^ ^^^^^
|
||||||
|
|
||||||
serverTextLink.push_back('\x12');
|
serverSayLink.push_back('\x12');
|
||||||
serverTextLink.append(segments[segment_iter].substr(0, 31));
|
serverSayLink.append(segments[segment_iter].substr(0, 31));
|
||||||
serverTextLink.append("00000");
|
serverSayLink.append("00000");
|
||||||
serverTextLink.append(segments[segment_iter].substr(31, 5));
|
serverSayLink.append(segments[segment_iter].substr(31, 5));
|
||||||
serverTextLink.push_back('0');
|
serverSayLink.push_back('0');
|
||||||
serverTextLink.push_back(segments[segment_iter][36]);
|
serverSayLink.push_back(segments[segment_iter][36]);
|
||||||
serverTextLink.append("00000");
|
serverSayLink.append("00000");
|
||||||
serverTextLink.append(segments[segment_iter].substr(37));
|
serverSayLink.append(segments[segment_iter].substr(37));
|
||||||
serverTextLink.push_back('\x12');
|
serverSayLink.push_back('\x12');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
serverTextLink.append(segments[segment_iter]);
|
serverSayLink.append(segments[segment_iter]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ D(OP_AdventureMerchantSell)
|
|||||||
D(OP_ApplyPoison)
|
D(OP_ApplyPoison)
|
||||||
D(OP_AugmentItem)
|
D(OP_AugmentItem)
|
||||||
D(OP_Buff)
|
D(OP_Buff)
|
||||||
|
D(OP_Bug)
|
||||||
D(OP_CastSpell)
|
D(OP_CastSpell)
|
||||||
D(OP_ChannelMessage)
|
D(OP_ChannelMessage)
|
||||||
D(OP_CharacterCreate)
|
D(OP_CharacterCreate)
|
||||||
|
|||||||
@@ -48,6 +48,23 @@ struct EnterWorld_Struct {
|
|||||||
/*068*/ uint32 return_home; // 01 on "Return Home", 00 if not
|
/*068*/ uint32 return_home; // 01 on "Return Home", 00 if not
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// yep, even tit had a version of the new inventory system, used by OP_MoveMultipleItems
|
||||||
|
struct InventorySlot_Struct
|
||||||
|
{
|
||||||
|
/*000*/ int32 Type; // Worn and Normal inventory = 0, Bank = 1, Shared Bank = 2, Trade = 3, World = 4, Limbo = 5
|
||||||
|
/*004*/ int32 Slot;
|
||||||
|
/*008*/ int32 SubIndex; // no aug index in Tit
|
||||||
|
/*012*/ int32 Unknown01;
|
||||||
|
};
|
||||||
|
|
||||||
|
// unsure if they have a version of this, completeness though
|
||||||
|
struct TypelessInventorySlot_Struct
|
||||||
|
{
|
||||||
|
/*000*/ int32 Slot;
|
||||||
|
/*004*/ int32 SubIndex; // no aug index in Tit
|
||||||
|
/*008*/ int32 Unknown01;
|
||||||
|
};
|
||||||
|
|
||||||
/* Name Approval Struct */
|
/* Name Approval Struct */
|
||||||
/* Len: */
|
/* Len: */
|
||||||
/* Opcode: 0x8B20*/
|
/* Opcode: 0x8B20*/
|
||||||
@@ -310,7 +327,7 @@ union
|
|||||||
// horse: 0=brown, 1=white, 2=black, 3=tan
|
// horse: 0=brown, 1=white, 2=black, 3=tan
|
||||||
};
|
};
|
||||||
/*0340*/ uint32 spawnId; // Spawn Id
|
/*0340*/ uint32 spawnId; // Spawn Id
|
||||||
/*0344*/ uint8 unknown0344[4];
|
/*0344*/ float bounding_radius; // used in melee, overrides calc
|
||||||
/*0348*/ TintProfile equipment_tint;
|
/*0348*/ TintProfile equipment_tint;
|
||||||
/*0384*/ uint8 lfg; // 0=off, 1=lfg on
|
/*0384*/ uint8 lfg; // 0=off, 1=lfg on
|
||||||
/*0385*/
|
/*0385*/
|
||||||
@@ -740,6 +757,7 @@ static const uint32 MAX_PP_LANGUAGE = 28;
|
|||||||
static const uint32 MAX_PP_SPELLBOOK = 400;
|
static const uint32 MAX_PP_SPELLBOOK = 400;
|
||||||
static const uint32 MAX_PP_MEMSPELL = 9;
|
static const uint32 MAX_PP_MEMSPELL = 9;
|
||||||
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
||||||
|
static const uint32 MAX_PP_INNATE_SKILL = 25;
|
||||||
static const uint32 MAX_PP_AA_ARRAY = 240;
|
static const uint32 MAX_PP_AA_ARRAY = 240;
|
||||||
static const uint32 MAX_GROUP_MEMBERS = 6;
|
static const uint32 MAX_GROUP_MEMBERS = 6;
|
||||||
static const uint32 MAX_RECAST_TYPES = 20;
|
static const uint32 MAX_RECAST_TYPES = 20;
|
||||||
@@ -844,7 +862,8 @@ struct PlayerProfile_Struct
|
|||||||
/*04452*/ uint32 silver_cursor; // Silver Pieces on cursor
|
/*04452*/ uint32 silver_cursor; // Silver Pieces on cursor
|
||||||
/*04456*/ uint32 copper_cursor; // Copper Pieces on cursor
|
/*04456*/ uint32 copper_cursor; // Copper Pieces on cursor
|
||||||
/*04460*/ uint32 skills[MAX_PP_SKILL]; // [400] List of skills // 100 dword buffer
|
/*04460*/ uint32 skills[MAX_PP_SKILL]; // [400] List of skills // 100 dword buffer
|
||||||
/*04860*/ uint8 unknown04760[136];
|
/*04860*/ uint32 InnateSkills[MAX_PP_INNATE_SKILL];
|
||||||
|
/*04960*/ uint8 unknown04760[36];
|
||||||
/*04996*/ uint32 toxicity; // Potion Toxicity (15=too toxic, each potion adds 3)
|
/*04996*/ uint32 toxicity; // Potion Toxicity (15=too toxic, each potion adds 3)
|
||||||
/*05000*/ uint32 thirst_level; // Drink (ticks till next drink)
|
/*05000*/ uint32 thirst_level; // Drink (ticks till next drink)
|
||||||
/*05004*/ uint32 hunger_level; // Food (ticks till next eat)
|
/*05004*/ uint32 hunger_level; // Food (ticks till next eat)
|
||||||
@@ -1100,20 +1119,18 @@ struct Action_Struct
|
|||||||
{
|
{
|
||||||
/* 00 */ uint16 target; // id of target
|
/* 00 */ uint16 target; // id of target
|
||||||
/* 02 */ uint16 source; // id of caster
|
/* 02 */ uint16 source; // id of caster
|
||||||
/* 04 */ uint16 level; // level of caster
|
/* 04 */ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level
|
||||||
/* 06 */ uint16 instrument_mod;
|
/* 06 */ uint32 instrument_mod; // OSX dump says base damage, spells use it for bard song (different from newer clients)
|
||||||
/* 08 */ uint32 unknown08;
|
/* 10 */ float force;
|
||||||
/* 12 */ uint16 unknown16;
|
/* 14 */ float hit_heading;
|
||||||
// some kind of sequence that's the same in both actions
|
/* 18 */ float hit_pitch;
|
||||||
// as well as the combat damage, to tie em together?
|
/* 22 */ uint8 type; // 231 (0xE7) for spells, skill
|
||||||
/* 14 */ uint32 sequence;
|
/* 23 */ uint16 unknown23; // OSX says min_damage
|
||||||
/* 18 */ uint32 unknown18;
|
/* 25 */ uint16 unknown25; // OSX says tohit
|
||||||
/* 22 */ uint8 type; // 231 (0xE7) for spells
|
|
||||||
/* 23 */ uint32 unknown23;
|
|
||||||
/* 27 */ uint16 spell; // spell id being cast
|
/* 27 */ uint16 spell; // spell id being cast
|
||||||
/* 29 */ uint8 unknown29;
|
/* 29 */ uint8 spell_level;
|
||||||
// this field seems to be some sort of success flag, if it's 4
|
// this field seems to be some sort of success flag, if it's 4
|
||||||
/* 30 */ uint8 buff_unknown; // if this is 4, a buff icon is made
|
/* 30 */ uint8 effect_flag; // if this is 4, a buff icon is made
|
||||||
/* 31 */
|
/* 31 */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1124,12 +1141,12 @@ struct CombatDamage_Struct
|
|||||||
{
|
{
|
||||||
/* 00 */ uint16 target;
|
/* 00 */ uint16 target;
|
||||||
/* 02 */ uint16 source;
|
/* 02 */ uint16 source;
|
||||||
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells
|
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells, skill
|
||||||
/* 05 */ uint16 spellid;
|
/* 05 */ uint16 spellid;
|
||||||
/* 07 */ uint32 damage;
|
/* 07 */ uint32 damage;
|
||||||
/* 11 */ float force;
|
/* 11 */ float force;
|
||||||
/* 15 */ float meleepush_xy; // see above notes in Action_Struct
|
/* 15 */ float hit_heading; // see above notes in Action_Struct
|
||||||
/* 19 */ float meleepush_z;
|
/* 19 */ float hit_pitch;
|
||||||
/* 23 */
|
/* 23 */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1327,6 +1344,19 @@ struct MoveItem_Struct
|
|||||||
/*0012*/
|
/*0012*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct MultiMoveItemSub_Struct
|
||||||
|
{
|
||||||
|
/*0000*/ InventorySlot_Struct from_slot;
|
||||||
|
/*0016*/ uint32 number_in_stack; // so the amount we are moving from the source
|
||||||
|
/*0020*/ InventorySlot_Struct to_slot;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MultiMoveItem_Struct
|
||||||
|
{
|
||||||
|
/*0000*/ uint32 count;
|
||||||
|
/*0004*/ MultiMoveItemSub_Struct moves[0];
|
||||||
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// from_slot/to_slot
|
// from_slot/to_slot
|
||||||
// -1 - destroy
|
// -1 - destroy
|
||||||
@@ -2539,21 +2569,32 @@ struct GuildMakeLeader{
|
|||||||
char name[64];
|
char name[64];
|
||||||
char target[64];
|
char target[64];
|
||||||
};
|
};
|
||||||
struct BugStruct{
|
|
||||||
/*0000*/ char chartype[64];
|
struct BugReport_Struct {
|
||||||
/*0064*/ char name[96];
|
/*0000*/ char category_name[64];
|
||||||
/*0160*/ char ui[128];
|
/*0064*/ char character_name[64];
|
||||||
/*0288*/ float x;
|
/*0128*/ char unused_0128[32];
|
||||||
/*0292*/ float y;
|
/*0160*/ char ui_path[128];
|
||||||
/*0296*/ float z;
|
/*0288*/ float pos_x;
|
||||||
/*0300*/ float heading;
|
/*0292*/ float pos_y;
|
||||||
/*0304*/ uint32 unknown304;
|
/*0296*/ float pos_z;
|
||||||
/*0308*/ uint32 type;
|
/*0300*/ uint32 heading;
|
||||||
/*0312*/ char unknown312[2144];
|
/*0304*/ uint32 unused_0304;
|
||||||
/*2456*/ char bug[1024];
|
/*0308*/ uint32 time_played;
|
||||||
/*3480*/ char placeholder[2];
|
/*0312*/ char padding_0312[8];
|
||||||
/*3482*/ char system_info[4098];
|
/*0320*/ uint32 target_id;
|
||||||
|
/*0324*/ char padding_0324[140];
|
||||||
|
/*0464*/ uint32 unknown_0464; // seems to always be '0'
|
||||||
|
/*0468*/ char target_name[64];
|
||||||
|
/*0532*/ uint32 optional_info_mask;
|
||||||
|
|
||||||
|
// this looks like a butchered 8k buffer with 2 trailing dword fields
|
||||||
|
/*0536*/ char unused_0536[2052];
|
||||||
|
/*2588*/ char bug_report[2050];
|
||||||
|
/*4638*/ char system_info[4098];
|
||||||
|
/*8736*/
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Make_Pet_Struct { //Simple struct for getting pet info
|
struct Make_Pet_Struct { //Simple struct for getting pet info
|
||||||
uint8 level;
|
uint8 level;
|
||||||
uint8 class_;
|
uint8 class_;
|
||||||
@@ -2580,20 +2621,21 @@ struct Ground_Spawn{
|
|||||||
struct Ground_Spawns {
|
struct Ground_Spawns {
|
||||||
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
||||||
};
|
};
|
||||||
struct PetitionBug_Struct{
|
|
||||||
uint32 petition_number;
|
//struct PetitionBug_Struct{
|
||||||
uint32 unknown4;
|
// uint32 petition_number;
|
||||||
char accountname[64];
|
// uint32 unknown4;
|
||||||
uint32 zoneid;
|
// char accountname[64];
|
||||||
char name[64];
|
// uint32 zoneid;
|
||||||
uint32 level;
|
// char name[64];
|
||||||
uint32 class_;
|
// uint32 level;
|
||||||
uint32 race;
|
// uint32 class_;
|
||||||
uint32 unknown152[3];
|
// uint32 race;
|
||||||
uint32 time;
|
// uint32 unknown152[3];
|
||||||
uint32 unknown168;
|
// uint32 time;
|
||||||
char text[1028];
|
// uint32 unknown168;
|
||||||
};
|
// char text[1028];
|
||||||
|
//};
|
||||||
|
|
||||||
struct ApproveZone_Struct {
|
struct ApproveZone_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
@@ -3521,6 +3563,21 @@ struct LFGuild_GuildToggle_Struct
|
|||||||
// char ScrollName; // '0'
|
// char ScrollName; // '0'
|
||||||
//};
|
//};
|
||||||
|
|
||||||
|
struct SayLinkBodyFrame_Struct {
|
||||||
|
/*000*/ char ActionID[1];
|
||||||
|
/*001*/ char ItemID[5];
|
||||||
|
/*006*/ char Augment1[5];
|
||||||
|
/*011*/ char Augment2[5];
|
||||||
|
/*016*/ char Augment3[5];
|
||||||
|
/*021*/ char Augment4[5];
|
||||||
|
/*026*/ char Augment5[5];
|
||||||
|
/*031*/ char IsEvolving[1];
|
||||||
|
/*032*/ char EvolveGroup[4];
|
||||||
|
/*036*/ char EvolveLevel[1];
|
||||||
|
/*037*/ char Hash[8];
|
||||||
|
/*045*/
|
||||||
|
};
|
||||||
|
|
||||||
}; /*structs*/
|
}; /*structs*/
|
||||||
|
|
||||||
}; /*Titanium*/
|
}; /*Titanium*/
|
||||||
|
|||||||
+57
-65
@@ -53,11 +53,11 @@ namespace UF
|
|||||||
static inline uint32 UFToServerSlot(uint32 ufSlot);
|
static inline uint32 UFToServerSlot(uint32 ufSlot);
|
||||||
static inline uint32 UFToServerCorpseSlot(uint32 ufCorpseSlot);
|
static inline uint32 UFToServerCorpseSlot(uint32 ufCorpseSlot);
|
||||||
|
|
||||||
// server to client text link converter
|
// server to client say link converter
|
||||||
static inline void ServerToUFTextLink(std::string& ufTextLink, const std::string& serverTextLink);
|
static inline void ServerToUFSayLink(std::string& ufSayLink, const std::string& serverSayLink);
|
||||||
|
|
||||||
// client to server text link converter
|
// client to server say link converter
|
||||||
static inline void UFToServerTextLink(std::string& serverTextLink, const std::string& ufTextLink);
|
static inline void UFToServerSayLink(std::string& serverSayLink, const std::string& ufSayLink);
|
||||||
|
|
||||||
static inline CastingSlot ServerToUFCastingSlot(EQEmu::CastingSlot slot);
|
static inline CastingSlot ServerToUFCastingSlot(EQEmu::CastingSlot slot);
|
||||||
static inline EQEmu::CastingSlot UFToServerCastingSlot(CastingSlot slot);
|
static inline EQEmu::CastingSlot UFToServerCastingSlot(CastingSlot slot);
|
||||||
@@ -161,29 +161,20 @@ namespace UF
|
|||||||
OUT(source);
|
OUT(source);
|
||||||
OUT(level);
|
OUT(level);
|
||||||
eq->instrument_mod = 1.0f + (emu->instrument_mod - 10) / 10.0f;
|
eq->instrument_mod = 1.0f + (emu->instrument_mod - 10) / 10.0f;
|
||||||
eq->knockback_angle = emu->sequence;
|
OUT(force);
|
||||||
|
OUT(hit_heading);
|
||||||
|
OUT(hit_pitch);
|
||||||
OUT(type);
|
OUT(type);
|
||||||
OUT(spell);
|
OUT(spell);
|
||||||
eq->level2 = eq->level;
|
OUT(spell_level);
|
||||||
eq->effect_flag = emu->buff_unknown;
|
OUT(effect_flag);
|
||||||
eq->unknown37 = 0x01;
|
eq->spell_gem = 0;
|
||||||
eq->unknown44 = 0xFFFFFFFF;
|
eq->slot[0] = -1; // type
|
||||||
eq->unknown48 = 0xFFFFFFFF;
|
eq->slot[1] = -1; // slot
|
||||||
eq->unknown52 = 0xFFFFFFFF;
|
eq->slot[2] = -1; // sub index
|
||||||
|
eq->slot[3] = -1; // aug index
|
||||||
/*OUT(target);
|
eq->slot[4] = -1; // unknown
|
||||||
OUT(source);
|
eq->item_cast_type = 0;
|
||||||
OUT(level);
|
|
||||||
OUT(instrument_mod);
|
|
||||||
eq->sequence = emu->sequence;
|
|
||||||
OUT(type);
|
|
||||||
//OUT(damage);
|
|
||||||
OUT(spell);
|
|
||||||
eq->level2 = emu->level;
|
|
||||||
OUT(buff_unknown); // if this is 4, a buff icon is made
|
|
||||||
//eq->unknown0036 = -1;
|
|
||||||
//eq->unknown0040 = -1;
|
|
||||||
//eq->unknown0044 = -1;*/
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -391,7 +382,7 @@ namespace UF
|
|||||||
{
|
{
|
||||||
SETUP_VAR_ENCODE(BuffIcon_Struct);
|
SETUP_VAR_ENCODE(BuffIcon_Struct);
|
||||||
|
|
||||||
uint32 sz = 12 + (17 * emu->count);
|
uint32 sz = 12 + (17 * emu->count) + emu->name_lengths; // 17 includes nullterm
|
||||||
__packet->size = sz;
|
__packet->size = sz;
|
||||||
__packet->pBuffer = new unsigned char[sz];
|
__packet->pBuffer = new unsigned char[sz];
|
||||||
memset(__packet->pBuffer, 0, sz);
|
memset(__packet->pBuffer, 0, sz);
|
||||||
@@ -407,7 +398,7 @@ namespace UF
|
|||||||
__packet->WriteUInt32(emu->entries[i].spell_id);
|
__packet->WriteUInt32(emu->entries[i].spell_id);
|
||||||
__packet->WriteUInt32(emu->entries[i].tics_remaining);
|
__packet->WriteUInt32(emu->entries[i].tics_remaining);
|
||||||
__packet->WriteUInt32(emu->entries[i].num_hits);
|
__packet->WriteUInt32(emu->entries[i].num_hits);
|
||||||
__packet->WriteString("");
|
__packet->WriteString(emu->entries[i].caster);
|
||||||
}
|
}
|
||||||
__packet->WriteUInt8(emu->type);
|
__packet->WriteUInt8(emu->type);
|
||||||
|
|
||||||
@@ -463,7 +454,7 @@ namespace UF
|
|||||||
|
|
||||||
std::string old_message = emu->message;
|
std::string old_message = emu->message;
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToUFTextLink(new_message, old_message);
|
ServerToUFSayLink(new_message, old_message);
|
||||||
|
|
||||||
//in->size = strlen(emu->sender) + 1 + strlen(emu->targetname) + 1 + strlen(emu->message) + 1 + 36;
|
//in->size = strlen(emu->sender) + 1 + strlen(emu->targetname) + 1 + strlen(emu->message) + 1 + 36;
|
||||||
in->size = strlen(emu->sender) + strlen(emu->targetname) + new_message.length() + 39;
|
in->size = strlen(emu->sender) + strlen(emu->targetname) + new_message.length() + 39;
|
||||||
@@ -586,8 +577,8 @@ namespace UF
|
|||||||
OUT(spellid);
|
OUT(spellid);
|
||||||
OUT(damage);
|
OUT(damage);
|
||||||
OUT(force);
|
OUT(force);
|
||||||
OUT(meleepush_xy);
|
OUT(hit_heading);
|
||||||
OUT(meleepush_z);
|
OUT(hit_pitch);
|
||||||
OUT(special);
|
OUT(special);
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
@@ -762,7 +753,7 @@ namespace UF
|
|||||||
|
|
||||||
std::string old_message = emu->message;
|
std::string old_message = emu->message;
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToUFTextLink(new_message, old_message);
|
ServerToUFSayLink(new_message, old_message);
|
||||||
|
|
||||||
//if (new_message.length() > 512) // length restricted in packet building function due vari-length name size (no nullterm)
|
//if (new_message.length() > 512) // length restricted in packet building function due vari-length name size (no nullterm)
|
||||||
// new_message = new_message.substr(0, 512);
|
// new_message = new_message.substr(0, 512);
|
||||||
@@ -814,7 +805,7 @@ namespace UF
|
|||||||
|
|
||||||
for (int i = 0; i < 9; ++i) {
|
for (int i = 0; i < 9; ++i) {
|
||||||
if (old_message_array[i].length() == 0) { break; }
|
if (old_message_array[i].length() == 0) { break; }
|
||||||
ServerToUFTextLink(new_message_array[i], old_message_array[i]);
|
ServerToUFSayLink(new_message_array[i], old_message_array[i]);
|
||||||
new_message_size += new_message_array[i].length() + 1;
|
new_message_size += new_message_array[i].length() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1850,6 +1841,7 @@ namespace UF
|
|||||||
OUT(copper_cursor);
|
OUT(copper_cursor);
|
||||||
|
|
||||||
OUT_array(skills, structs::MAX_PP_SKILL); // 1:1 direct copy (100 dword)
|
OUT_array(skills, structs::MAX_PP_SKILL); // 1:1 direct copy (100 dword)
|
||||||
|
OUT_array(InnateSkills, structs::MAX_PP_INNATE_SKILL); // 1:1 direct copy (25 dword)
|
||||||
|
|
||||||
// OUT(unknown04760[236]);
|
// OUT(unknown04760[236]);
|
||||||
OUT(toxicity);
|
OUT(toxicity);
|
||||||
@@ -2468,7 +2460,7 @@ namespace UF
|
|||||||
std::string old_message = &emu->message[strlen(emu->sayer)];
|
std::string old_message = &emu->message[strlen(emu->sayer)];
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
|
|
||||||
ServerToUFTextLink(new_message, old_message);
|
ServerToUFSayLink(new_message, old_message);
|
||||||
|
|
||||||
//in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1;
|
//in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1;
|
||||||
in->size = strlen(emu->sayer) + new_message.length() + 25;
|
in->size = strlen(emu->sayer) + new_message.length() + 25;
|
||||||
@@ -2538,7 +2530,7 @@ namespace UF
|
|||||||
|
|
||||||
std::string old_message = InBuffer; // start 'Reward' as string
|
std::string old_message = InBuffer; // start 'Reward' as string
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
ServerToUFTextLink(new_message, old_message);
|
ServerToUFSayLink(new_message, old_message);
|
||||||
|
|
||||||
in->size = sizeof(TaskDescriptionHeader_Struct) + sizeof(TaskDescriptionData1_Struct)+
|
in->size = sizeof(TaskDescriptionHeader_Struct) + sizeof(TaskDescriptionData1_Struct)+
|
||||||
sizeof(TaskDescriptionData2_Struct) + sizeof(TaskDescriptionTrailer_Struct)+
|
sizeof(TaskDescriptionData2_Struct) + sizeof(TaskDescriptionTrailer_Struct)+
|
||||||
@@ -2844,7 +2836,7 @@ namespace UF
|
|||||||
PacketSize += strlen(emu->DestructibleString) + 1;
|
PacketSize += strlen(emu->DestructibleString) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ShowName = 1;
|
bool ShowName = emu->show_name;
|
||||||
if (emu->bodytype >= 66)
|
if (emu->bodytype >= 66)
|
||||||
{
|
{
|
||||||
emu->race = 127;
|
emu->race = 127;
|
||||||
@@ -3286,7 +3278,7 @@ namespace UF
|
|||||||
|
|
||||||
std::string old_message = InBuffer;
|
std::string old_message = InBuffer;
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
UFToServerTextLink(new_message, old_message);
|
UFToServerSayLink(new_message, old_message);
|
||||||
|
|
||||||
//__packet->size = sizeof(ChannelMessage_Struct)+strlen(InBuffer) + 1;
|
//__packet->size = sizeof(ChannelMessage_Struct)+strlen(InBuffer) + 1;
|
||||||
__packet->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
__packet->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1;
|
||||||
@@ -3397,7 +3389,7 @@ namespace UF
|
|||||||
IN(type);
|
IN(type);
|
||||||
IN(spellid);
|
IN(spellid);
|
||||||
IN(damage);
|
IN(damage);
|
||||||
IN(meleepush_xy);
|
IN(hit_heading);
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
@@ -3420,7 +3412,7 @@ namespace UF
|
|||||||
|
|
||||||
std::string old_message = (char *)&__eq_buffer[4]; // unknown01 offset
|
std::string old_message = (char *)&__eq_buffer[4]; // unknown01 offset
|
||||||
std::string new_message;
|
std::string new_message;
|
||||||
UFToServerTextLink(new_message, old_message);
|
UFToServerSayLink(new_message, old_message);
|
||||||
|
|
||||||
__packet->size = sizeof(Emote_Struct);
|
__packet->size = sizeof(Emote_Struct);
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
__packet->pBuffer = new unsigned char[__packet->size];
|
||||||
@@ -4289,19 +4281,19 @@ namespace UF
|
|||||||
return (ufCorpseSlot - 1);
|
return (ufCorpseSlot - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void ServerToUFTextLink(std::string& ufTextLink, const std::string& serverTextLink)
|
static inline void ServerToUFSayLink(std::string& ufSayLink, const std::string& serverSayLink)
|
||||||
{
|
{
|
||||||
if ((constants::SayLinkBodySize == EQEmu::legacy::TEXT_LINK_BODY_LENGTH) || (serverTextLink.find('\x12') == std::string::npos)) {
|
if ((constants::SayLinkBodySize == EQEmu::constants::SayLinkBodySize) || (serverSayLink.find('\x12') == std::string::npos)) {
|
||||||
ufTextLink = serverTextLink;
|
ufSayLink = serverSayLink;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto segments = SplitString(serverTextLink, '\x12');
|
auto segments = SplitString(serverSayLink, '\x12');
|
||||||
|
|
||||||
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
||||||
if (segment_iter & 1) {
|
if (segment_iter & 1) {
|
||||||
if (segments[segment_iter].length() <= EQEmu::legacy::TEXT_LINK_BODY_LENGTH) {
|
if (segments[segment_iter].length() <= EQEmu::constants::SayLinkBodySize) {
|
||||||
ufTextLink.append(segments[segment_iter]);
|
ufSayLink.append(segments[segment_iter]);
|
||||||
// TODO: log size mismatch error
|
// TODO: log size mismatch error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -4311,37 +4303,37 @@ namespace UF
|
|||||||
// SoF: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX X XXXXX XXXXXXXX (50)
|
// SoF: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX X XXXXX XXXXXXXX (50)
|
||||||
// Diff: ^^^^^ ^
|
// Diff: ^^^^^ ^
|
||||||
|
|
||||||
ufTextLink.push_back('\x12');
|
ufSayLink.push_back('\x12');
|
||||||
ufTextLink.append(segments[segment_iter].substr(0, 31));
|
ufSayLink.append(segments[segment_iter].substr(0, 31));
|
||||||
ufTextLink.append(segments[segment_iter].substr(36, 5));
|
ufSayLink.append(segments[segment_iter].substr(36, 5));
|
||||||
|
|
||||||
if (segments[segment_iter][41] == '0')
|
if (segments[segment_iter][41] == '0')
|
||||||
ufTextLink.push_back(segments[segment_iter][42]);
|
ufSayLink.push_back(segments[segment_iter][42]);
|
||||||
else
|
else
|
||||||
ufTextLink.push_back('F');
|
ufSayLink.push_back('F');
|
||||||
|
|
||||||
ufTextLink.append(segments[segment_iter].substr(43));
|
ufSayLink.append(segments[segment_iter].substr(43));
|
||||||
ufTextLink.push_back('\x12');
|
ufSayLink.push_back('\x12');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ufTextLink.append(segments[segment_iter]);
|
ufSayLink.append(segments[segment_iter]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void UFToServerTextLink(std::string& serverTextLink, const std::string& ufTextLink)
|
static inline void UFToServerSayLink(std::string& serverSayLink, const std::string& ufSayLink)
|
||||||
{
|
{
|
||||||
if ((EQEmu::legacy::TEXT_LINK_BODY_LENGTH == constants::SayLinkBodySize) || (ufTextLink.find('\x12') == std::string::npos)) {
|
if ((EQEmu::constants::SayLinkBodySize == constants::SayLinkBodySize) || (ufSayLink.find('\x12') == std::string::npos)) {
|
||||||
serverTextLink = ufTextLink;
|
serverSayLink = ufSayLink;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto segments = SplitString(ufTextLink, '\x12');
|
auto segments = SplitString(ufSayLink, '\x12');
|
||||||
|
|
||||||
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) {
|
||||||
if (segment_iter & 1) {
|
if (segment_iter & 1) {
|
||||||
if (segments[segment_iter].length() <= constants::SayLinkBodySize) {
|
if (segments[segment_iter].length() <= constants::SayLinkBodySize) {
|
||||||
serverTextLink.append(segments[segment_iter]);
|
serverSayLink.append(segments[segment_iter]);
|
||||||
// TODO: log size mismatch error
|
// TODO: log size mismatch error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -4351,16 +4343,16 @@ namespace UF
|
|||||||
// RoF2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX XX XXXXX XXXXXXXX (56)
|
// RoF2: X XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX X XXXX XX XXXXX XXXXXXXX (56)
|
||||||
// Diff: ^^^^^ ^
|
// Diff: ^^^^^ ^
|
||||||
|
|
||||||
serverTextLink.push_back('\x12');
|
serverSayLink.push_back('\x12');
|
||||||
serverTextLink.append(segments[segment_iter].substr(0, 31));
|
serverSayLink.append(segments[segment_iter].substr(0, 31));
|
||||||
serverTextLink.append("00000");
|
serverSayLink.append("00000");
|
||||||
serverTextLink.append(segments[segment_iter].substr(31, 5));
|
serverSayLink.append(segments[segment_iter].substr(31, 5));
|
||||||
serverTextLink.push_back('0');
|
serverSayLink.push_back('0');
|
||||||
serverTextLink.append(segments[segment_iter].substr(36));
|
serverSayLink.append(segments[segment_iter].substr(36));
|
||||||
serverTextLink.push_back('\x12');
|
serverSayLink.push_back('\x12');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
serverTextLink.append(segments[segment_iter]);
|
serverSayLink.append(segments[segment_iter]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+63
-67
@@ -250,8 +250,7 @@ struct Spawn_Struct_Bitfields
|
|||||||
unsigned sneak:1;
|
unsigned sneak:1;
|
||||||
unsigned lfg:1;
|
unsigned lfg:1;
|
||||||
unsigned padding5:1;
|
unsigned padding5:1;
|
||||||
unsigned invis:1; // 0 = visible, 1 = invis/sneaking
|
unsigned invis:12; // there are 3000 different (non-GM) invis levels
|
||||||
unsigned padding7:11;
|
|
||||||
unsigned gm:1;
|
unsigned gm:1;
|
||||||
unsigned anon:2; // 0=normal, 1=anon, 2=roleplay
|
unsigned anon:2; // 0=normal, 1=anon, 2=roleplay
|
||||||
unsigned gender:2; // Gender (0=male, 1=female, 2=monster)
|
unsigned gender:2; // Gender (0=male, 1=female, 2=monster)
|
||||||
@@ -293,7 +292,7 @@ struct Spawn_Struct
|
|||||||
/*0000*/ //uint8 nullterm1; // hack to null terminate name
|
/*0000*/ //uint8 nullterm1; // hack to null terminate name
|
||||||
/*0064*/ uint32 spawnId;
|
/*0064*/ uint32 spawnId;
|
||||||
/*0068*/ uint8 level;
|
/*0068*/ uint8 level;
|
||||||
/*0069*/ float unknown1;
|
/*0069*/ float bounding_radius; // used in melee, overrides calc
|
||||||
/*0073*/ uint8 NPC; // 0=player,1=npc,2=pc corpse,3=npc corpse
|
/*0073*/ uint8 NPC; // 0=player,1=npc,2=pc corpse,3=npc corpse
|
||||||
Spawn_Struct_Bitfields Bitfields;
|
Spawn_Struct_Bitfields Bitfields;
|
||||||
/*0000*/ uint8 otherData; // & 4 - has title, & 8 - has suffix, & 1 - it's a chest or untargetable
|
/*0000*/ uint8 otherData; // & 4 - has title, & 8 - has suffix, & 1 - it's a chest or untargetable
|
||||||
@@ -849,6 +848,7 @@ static const uint32 MAX_PP_LANGUAGE = 25; //
|
|||||||
static const uint32 MAX_PP_SPELLBOOK = 720; // Confirmed 60 pages on Underfoot now
|
static const uint32 MAX_PP_SPELLBOOK = 720; // Confirmed 60 pages on Underfoot now
|
||||||
static const uint32 MAX_PP_MEMSPELL = 12; //was 9 now 10 on Underfoot
|
static const uint32 MAX_PP_MEMSPELL = 12; //was 9 now 10 on Underfoot
|
||||||
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
static const uint32 MAX_PP_SKILL = PACKET_SKILL_ARRAY_SIZE; // 100 - actual skills buffer size
|
||||||
|
static const uint32 MAX_PP_INNATE_SKILL = 25;
|
||||||
static const uint32 MAX_PP_AA_ARRAY = 300; //was 299
|
static const uint32 MAX_PP_AA_ARRAY = 300; //was 299
|
||||||
static const uint32 MAX_GROUP_MEMBERS = 6;
|
static const uint32 MAX_GROUP_MEMBERS = 6;
|
||||||
static const uint32 MAX_RECAST_TYPES = 20;
|
static const uint32 MAX_RECAST_TYPES = 20;
|
||||||
@@ -955,7 +955,8 @@ struct PlayerProfile_Struct
|
|||||||
/*07336*/ uint32 silver_cursor; // Silver Pieces on cursor
|
/*07336*/ uint32 silver_cursor; // Silver Pieces on cursor
|
||||||
/*07340*/ uint32 copper_cursor; // Copper Pieces on cursor
|
/*07340*/ uint32 copper_cursor; // Copper Pieces on cursor
|
||||||
/*07344*/ uint32 skills[MAX_PP_SKILL]; // [400] List of skills // 100 dword buffer
|
/*07344*/ uint32 skills[MAX_PP_SKILL]; // [400] List of skills // 100 dword buffer
|
||||||
/*07744*/ uint8 unknown07644[136];
|
/*07744*/ uint32 InnateSkills[MAX_PP_INNATE_SKILL];
|
||||||
|
/*07844*/ uint8 unknown07644[36];
|
||||||
/*07880*/ uint32 toxicity; // Potion Toxicity (15=too toxic, each potion adds 3)
|
/*07880*/ uint32 toxicity; // Potion Toxicity (15=too toxic, each potion adds 3)
|
||||||
/*07884*/ uint32 thirst_level; // Drink (ticks till next drink)
|
/*07884*/ uint32 thirst_level; // Drink (ticks till next drink)
|
||||||
/*07888*/ uint32 hunger_level; // Food (ticks till next eat)
|
/*07888*/ uint32 hunger_level; // Food (ticks till next eat)
|
||||||
@@ -1251,19 +1252,19 @@ struct Action_Struct
|
|||||||
{
|
{
|
||||||
/*00*/ uint16 target; // id of target
|
/*00*/ uint16 target; // id of target
|
||||||
/*02*/ uint16 source; // id of caster
|
/*02*/ uint16 source; // id of caster
|
||||||
/*04*/ uint16 level; // level of caster - Seen 0
|
/*04*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level
|
||||||
/*06*/ uint32 unknown06;
|
/*06*/ uint32 unknown06; // OSX dump says base_damage, was used for bard mod too, this is 0'd :(
|
||||||
/*10*/ uint16 instrument_focus;
|
/*10*/ float instrument_mod;
|
||||||
/*12*/ uint16 unknown12; // seems to always be set to something and it doesn't change between casts except in special cases like changing instrument mods
|
/*14*/ float force;
|
||||||
/*14*/ uint32 unknown14; // seen 0
|
/*18*/ float hit_heading;
|
||||||
/*18*/ float knockback_angle; //seems to go from 0-512 then it rolls over again
|
/*22*/ float hit_pitch;
|
||||||
/*22*/ uint32 unknown22;
|
/*26*/ uint8 type; // 231 (0xE7) for spells, skill
|
||||||
/*26*/ uint8 type;
|
/*27*/ uint32 damage; // OSX says min_damage
|
||||||
/*27*/ uint32 damage;
|
/*31*/ uint16 unknown31; // OSX says tohit
|
||||||
/*31*/ uint16 unknown31;
|
|
||||||
/*33*/ uint16 spell; // spell id being cast
|
/*33*/ uint16 spell; // spell id being cast
|
||||||
/*35*/ uint8 level2; // level of caster again? Or maybe the castee
|
/*35*/ uint8 spell_level; // level of caster again? Or maybe the castee
|
||||||
/*36*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time?
|
/*36*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time?
|
||||||
|
/*37*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -1275,27 +1276,22 @@ struct ActionAlt_Struct
|
|||||||
{
|
{
|
||||||
/*00*/ uint16 target; // id of target
|
/*00*/ uint16 target; // id of target
|
||||||
/*02*/ uint16 source; // id of caster
|
/*02*/ uint16 source; // id of caster
|
||||||
/*04*/ uint16 level; // level of caster - Seen 0
|
/*04*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level
|
||||||
/*06*/ uint32 unknown06;
|
/*06*/ uint32 unknown06; // OSX dump says base_damage, was used for bard mod too, this is 0'd :(
|
||||||
/*10*/ float instrument_mod;
|
/*10*/ float instrument_mod;
|
||||||
/*14*/ uint32 unknown14; // seen 0
|
/*14*/ float force;
|
||||||
/*18*/ float knockback_angle; //seems to go from 0-512 then it rolls over again
|
/*18*/ float hit_heading;
|
||||||
/*22*/ uint32 unknown22;
|
/*22*/ float hit_pitch;
|
||||||
/*26*/ uint8 type;
|
/*26*/ uint8 type; // 231 (0xE7) for spells, skill
|
||||||
/*27*/ uint32 damage;
|
/*27*/ uint32 damage; // OSX says min_damage
|
||||||
/*31*/ uint16 unknown31;
|
/*31*/ uint16 unknown31; // OSX says tohit
|
||||||
/*33*/ uint16 spell; // spell id being cast
|
/*33*/ uint16 spell; // spell id being cast
|
||||||
/*35*/ uint8 level2; // level of caster again? Or maybe the castee
|
/*35*/ uint8 spell_level; // level of caster again? Or maybe the castee
|
||||||
/*36*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time?
|
/*36*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time?
|
||||||
/*37*/ uint32 unknown37; // New field to Underfoot - Seen 14
|
/*37*/ uint8 spell_gem;
|
||||||
/*41*/ uint8 unknown41; // New field to Underfoot - Seen 0
|
/*38*/ uint8 padding38[2];
|
||||||
/*42*/ uint8 unknown42; // New field to Underfoot - Seen 0
|
/*40*/ uint32 slot[5];
|
||||||
/*43*/ uint8 unknown43; // New field to Underfoot - Seen 0
|
/*60*/ uint32 item_cast_type; // ItemSpellTypes enum from MQ2
|
||||||
/*44*/ uint32 unknown44; // New field to Underfoot - Seen 23
|
|
||||||
/*48*/ uint32 unknown48; // New field to Underfoot - Seen -1
|
|
||||||
/*52*/ uint32 unknown52; // New field to Underfoot - Seen -1
|
|
||||||
/*56*/ uint32 unknown56; // New field to Underfoot - Seen 0
|
|
||||||
/*60*/ uint32 unknown60; // New field to Underfoot - Seen 0
|
|
||||||
/*64*/
|
/*64*/
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1310,9 +1306,9 @@ struct CombatDamage_Struct
|
|||||||
/* 05 */ uint16 spellid;
|
/* 05 */ uint16 spellid;
|
||||||
/* 07 */ int32 damage;
|
/* 07 */ int32 damage;
|
||||||
/* 11 */ float force; // cd cc cc 3d
|
/* 11 */ float force; // cd cc cc 3d
|
||||||
/* 15 */ float meleepush_xy; // see above notes in Action_Struct
|
/* 15 */ float hit_heading; // see above notes in Action_Struct
|
||||||
/* 19 */ float meleepush_z;
|
/* 19 */ float hit_pitch;
|
||||||
/* 23 */ uint8 unknown23; // was [9]
|
/* 23 */ uint8 secondary; // 0 for primary hand, 1 for secondary
|
||||||
/* 24 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage
|
/* 24 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage
|
||||||
/* 28 */
|
/* 28 */
|
||||||
};
|
};
|
||||||
@@ -3059,23 +3055,6 @@ struct GuildMakeLeader{
|
|||||||
char target[64];
|
char target[64];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct BugStruct{
|
|
||||||
/*0000*/ char chartype[64];
|
|
||||||
/*0064*/ char name[96];
|
|
||||||
/*0160*/ char ui[128];
|
|
||||||
/*0288*/ float x;
|
|
||||||
/*0292*/ float y;
|
|
||||||
/*0296*/ float z;
|
|
||||||
/*0300*/ float heading;
|
|
||||||
/*0304*/ uint32 unknown304;
|
|
||||||
/*0308*/ uint32 type;
|
|
||||||
/*0312*/ char unknown312[2144];
|
|
||||||
/*2456*/ char bug[1024];
|
|
||||||
/*3480*/ char placeholder[2];
|
|
||||||
/*3482*/ char system_info[4098];
|
|
||||||
};
|
|
||||||
struct Make_Pet_Struct { //Simple struct for getting pet info
|
struct Make_Pet_Struct { //Simple struct for getting pet info
|
||||||
uint8 level;
|
uint8 level;
|
||||||
uint8 class_;
|
uint8 class_;
|
||||||
@@ -3102,20 +3081,21 @@ struct Ground_Spawn{
|
|||||||
struct Ground_Spawns {
|
struct Ground_Spawns {
|
||||||
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
||||||
};
|
};
|
||||||
struct PetitionBug_Struct{
|
|
||||||
uint32 petition_number;
|
//struct PetitionBug_Struct{
|
||||||
uint32 unknown4;
|
// uint32 petition_number;
|
||||||
char accountname[64];
|
// uint32 unknown4;
|
||||||
uint32 zoneid;
|
// char accountname[64];
|
||||||
char name[64];
|
// uint32 zoneid;
|
||||||
uint32 level;
|
// char name[64];
|
||||||
uint32 class_;
|
// uint32 level;
|
||||||
uint32 race;
|
// uint32 class_;
|
||||||
uint32 unknown152[3];
|
// uint32 race;
|
||||||
uint32 time;
|
// uint32 unknown152[3];
|
||||||
uint32 unknown168;
|
// uint32 time;
|
||||||
char text[1028];
|
// uint32 unknown168;
|
||||||
};
|
// char text[1028];
|
||||||
|
//};
|
||||||
|
|
||||||
struct ApproveZone_Struct {
|
struct ApproveZone_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
@@ -4504,6 +4484,22 @@ struct MercenaryAssign_Struct {
|
|||||||
/*0004*/ uint32 MercUnk01; //
|
/*0004*/ uint32 MercUnk01; //
|
||||||
/*0008*/ uint32 MercUnk02; //
|
/*0008*/ uint32 MercUnk02; //
|
||||||
/*0012*/
|
/*0012*/
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SayLinkBodyFrame_Struct {
|
||||||
|
/*000*/ char ActionID[1];
|
||||||
|
/*001*/ char ItemID[5];
|
||||||
|
/*006*/ char Augment1[5];
|
||||||
|
/*011*/ char Augment2[5];
|
||||||
|
/*016*/ char Augment3[5];
|
||||||
|
/*021*/ char Augment4[5];
|
||||||
|
/*026*/ char Augment5[5];
|
||||||
|
/*031*/ char IsEvolving[1];
|
||||||
|
/*032*/ char EvolveGroup[4];
|
||||||
|
/*036*/ char EvolveLevel[1];
|
||||||
|
/*037*/ char OrnamentIcon[5];
|
||||||
|
/*042*/ char Hash[8];
|
||||||
|
/*050*/
|
||||||
};
|
};
|
||||||
|
|
||||||
}; /*structs*/
|
}; /*structs*/
|
||||||
|
|||||||
@@ -28,9 +28,9 @@
|
|||||||
typedef const char Const_char;
|
typedef const char Const_char;
|
||||||
|
|
||||||
#ifdef EMBPERL
|
#ifdef EMBPERL
|
||||||
#include "../common/global_define.h"
|
#include "global_define.h"
|
||||||
#include "../common/useperl.h"
|
|
||||||
#include "eqdb.h"
|
#include "eqdb.h"
|
||||||
|
#include "useperl.h"
|
||||||
|
|
||||||
#ifdef THIS /* this macro seems to leak out on some systems */
|
#ifdef THIS /* this macro seems to leak out on some systems */
|
||||||
#undef THIS
|
#undef THIS
|
||||||
|
|||||||
@@ -28,9 +28,9 @@
|
|||||||
typedef const char Const_char;
|
typedef const char Const_char;
|
||||||
|
|
||||||
#ifdef EMBPERL
|
#ifdef EMBPERL
|
||||||
#include "../common/global_define.h"
|
#include "global_define.h"
|
||||||
#include "../common/useperl.h"
|
|
||||||
#include "eqdb_res.h"
|
#include "eqdb_res.h"
|
||||||
|
#include "useperl.h"
|
||||||
|
|
||||||
|
|
||||||
XS(XS_EQDBRes_num_rows); /* prototype to pass -Wmissing-prototypes */
|
XS(XS_EQDBRes_num_rows); /* prototype to pass -Wmissing-prototypes */
|
||||||
|
|||||||
+119
-6
@@ -1349,8 +1349,7 @@ const char* GetPlayerRaceName(uint32 player_race_value)
|
|||||||
return GetRaceIDName(GetRaceIDFromPlayerRaceValue(player_race_value));
|
return GetRaceIDName(GetRaceIDFromPlayerRaceValue(player_race_value));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 GetPlayerRaceValue(uint16 race_id)
|
uint32 GetPlayerRaceValue(uint16 race_id) {
|
||||||
{
|
|
||||||
switch (race_id) {
|
switch (race_id) {
|
||||||
case HUMAN:
|
case HUMAN:
|
||||||
case BARBARIAN:
|
case BARBARIAN:
|
||||||
@@ -1379,8 +1378,7 @@ uint32 GetPlayerRaceValue(uint16 race_id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 GetPlayerRaceBit(uint16 race_id)
|
uint32 GetPlayerRaceBit(uint16 race_id) {
|
||||||
{
|
|
||||||
switch (race_id) {
|
switch (race_id) {
|
||||||
case HUMAN:
|
case HUMAN:
|
||||||
return PLAYER_RACE_HUMAN_BIT;
|
return PLAYER_RACE_HUMAN_BIT;
|
||||||
@@ -1419,8 +1417,7 @@ uint32 GetPlayerRaceBit(uint16 race_id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16 GetRaceIDFromPlayerRaceValue(uint32 player_race_value)
|
uint16 GetRaceIDFromPlayerRaceValue(uint32 player_race_value) {
|
||||||
{
|
|
||||||
switch (player_race_value) {
|
switch (player_race_value) {
|
||||||
case PLAYER_RACE_HUMAN:
|
case PLAYER_RACE_HUMAN:
|
||||||
case PLAYER_RACE_BARBARIAN:
|
case PLAYER_RACE_BARBARIAN:
|
||||||
@@ -1488,6 +1485,122 @@ uint16 GetRaceIDFromPlayerRaceBit(uint32 player_race_bit)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float GetRaceGenderDefaultHeight(int race, int gender)
|
||||||
|
{
|
||||||
|
static float male_height[] = {
|
||||||
|
6.0f, 6.0f, 7.0f, 6.0f, 5.0f, 6.0f, 5.0f, 5.5f, 4.0f, 8.0f, 9.0f, 3.5f, 3.0f, 6.0f, 6.0f,
|
||||||
|
2.0f, 8.5f, 8.0f, 21.0f, 20.0f, 6.0f, 6.0f, 3.5f, 3.0f, 6.0f, 2.0f, 5.0f, 5.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 7.5f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 5.0f, 6.0f, 6.0f, 7.0f, 4.0f, 4.7f, 6.0f,
|
||||||
|
8.0f, 3.0f, 12.0f, 5.0f, 21.0f, 6.0f, 6.0f, 3.0f, 9.0f, 6.0f, 6.0f, 2.0f, 6.0f, 3.0f, 6.0f,
|
||||||
|
4.0f, 20.0f, 5.0f, 5.0f, 6.0f, 9.0f, 25.0f, 6.0f, 6.0f, 10.0f, 6.0f, 6.0f, 6.0f, 6.0f, 2.5f,
|
||||||
|
7.0f, 6.0f, 5.0f, 6.0f, 1.5f, 1.0f, 3.5f, 7.0f, 6.0f, 6.0f, 6.0f, 6.0f, 7.0f, 3.0f, 3.0f,
|
||||||
|
7.0f, 12.0f, 8.0f, 9.0f, 4.0f, 11.5f, 8.0f, 6.0f, 6.0f, 12.0f, 6.0f, 6.0f, 6.0f, 20.0f, 10.0f,
|
||||||
|
6.5f, 6.0f, 17.0f, 1.0f, 4.0f, 6.0f, 8.0f, 5.0f, 1.0f, 6.0f, 6.0f, 5.0f, 5.0f, 5.0f, 9.0f,
|
||||||
|
3.0f, 8.0f, 2.0f, 24.0f, 6.0f, 10.0f, 6.0f, 6.0f, 6.0f, 3.0f, 7.0f, 9.0f, 6.0f, 11.0f, 2.5f,
|
||||||
|
14.0f, 8.0f, 7.0f, 12.0f, 6.0f, 27.0f, 6.0f, 6.0f, 6.0f, 6.0f, 2.0f, 9.0f, 9.0f, 6.0f, 9.0f,
|
||||||
|
3.0f, 3.0f, 6.0f, 6.0f, 10.0f, 6.0f, 6.0f, 15.0f, 15.0f, 9.0f, 7.0f, 6.0f, 6.0f, 7.0f, 8.0f,
|
||||||
|
3.0f, 3.0f, 6.0f, 7.0f, 13.0f, 6.0f, 6.0f, 9.0f, 5.0f, 7.0f, 9.0f, 6.0f, 6.0f, 8.0f, 6.0f,
|
||||||
|
6.0f, 5.5f, 6.0f, 4.0f, 25.0f, 6.0f, 6.0f, 6.0f, 22.0f, 20.0f, 6.0f, 10.0f, 13.5f, 12.0f, 3.0f,
|
||||||
|
30.0f, 6.0f, 6.0f, 35.0f, 1.5f, 8.0f, 3.0f, 6.0f, 2.0f, 6.0f, 6.0f, 5.0f, 2.0f, 7.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 4.0f, 6.0f, 6.0f, 6.0f, 8.0f, 8.0f, 7.0f, 8.0f, 6.0f, 7.0f, 6.0f, 7.0f,
|
||||||
|
6.0f, 10.0f, 3.0f, 6.0f, 8.0f, 9.0f, 15.0f, 5.0f, 10.0f, 7.0f, 6.0f, 7.0f, 6.0f, 7.0f, 7.0f,
|
||||||
|
12.0f, 6.0f, 4.0f, 6.0f, 5.0f, 3.0f, 30.0f, 30.0f, 15.0f, 20.0f, 6.0f, 10.0f, 6.0f, 14.0f, 14.0f,
|
||||||
|
16.0f, 15.0f, 30.0f, 15.0f, 7.5f, 5.0f, 4.0f, 6.0f, 15.0f, 6.5f, 3.0f, 12.0f, 10.0f, 10.5f, 10.0f,
|
||||||
|
7.5f, 6.0f, 6.0f, 12.5f, 9.0f, 20.0f, 2.0f, 10.0f, 25.0f, 8.0f, 6.0f, 6.0f, 10.0f, 18.0f, 45.0f,
|
||||||
|
13.0f, 15.0f, 8.0f, 30.0f, 25.0f, 25.0f, 10.0f, 13.0f, 5.0f, 3.5f, 15.0f, 35.0f, 11.0f, 15.0f, 50.0f,
|
||||||
|
13.0f, 6.0f, 7.0f, 6.0f, 60.0f, 6.0f, 22.0f, 22.0f, 21.0f, 22.0f, 15.0f, 25.0f, 23.0f, 8.0f, 15.0f,
|
||||||
|
10.0f, 6.0f, 7.0f, 6.0f, 12.0f, 9.5f, 6.0f, 12.0f, 12.0f, 12.0f, 15.0f, 4.0f, 5.0f, 105.0f, 20.0f,
|
||||||
|
5.0f, 10.0f, 10.0f, 10.0f, 20.0f, 13.5f, 8.0f, 10.0f, 3.0f, 5.0f, 9.0f, 6.0f, 6.0f, 6.0f, 10.0f,
|
||||||
|
8.0f, 8.0f, 8.0f, 6.0f, 6.0f, 5.0f, 5.0f, 5.0f, 9.0f, 9.0f, 9.0f, 6.0f, 8.5f, 6.0f, 7.0f,
|
||||||
|
8.0f, 7.0f, 11.0f, 6.0f, 7.0f, 9.0f, 8.0f, 6.0f, 8.0f, 6.0f, 6.0f, 6.0f, 6.0f, 9.0f, 10.0f,
|
||||||
|
6.0f, 3.0f, 4.0f, 3.0f, 3.0f, 4.0f, 10.0f, 10.0f, 2.0f, 8.0f, 6.0f, 6.0f, 14.0f, 7.0f, 5.0f,
|
||||||
|
9.0f, 7.0f, 7.0f, 10.0f, 10.0f, 12.0f, 9.0f, 7.0f, 12.0f, 13.0f, 16.0f, 6.0f, 9.0f, 6.0f, 6.0f,
|
||||||
|
10.0f, 25.0f, 15.0f, 6.0f, 25.0f, 6.0f, 6.0f, 8.0f, 11.0f, 6.0f, 9.0f, 2.0f, 6.0f, 5.0f, 4.0f,
|
||||||
|
8.5f, 6.0f, 6.0f, 6.0f, 4.0f, 6.0f, 15.0f, 1.0f, 2.0f, 6.0f, 40.0f, 8.0f, 12.0f, 3.0f, 8.0f,
|
||||||
|
99.0f, 9.0f, 100.0f, 100.0f, 10.0f, 6.0f, 27.5f, 20.0f, 6.0f, 6.0f, 5.0f, 6.0f, 8.0f, 5.0f, 3.0f,
|
||||||
|
11.5f, 25.0f, 80.0f, 20.0f, 9.0f, 8.0f, 5.0f, 4.0f, 7.0f, 10.0f, 6.0f, 11.0f, 8.0f, 5.0f, 6.0f,
|
||||||
|
6.0f, 30.0f, 7.0f, 15.0f, 9.0f, 6.0f, 9.0f, 6.0f, 3.0f, 32.5f, 15.0f, 7.5f, 10.0f, 10.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 9.0f, 20.0f, 6.0f, 6.0f, 6.0f, 25.0f, 12.0f, 6.0f, 8.0f, 6.0f,
|
||||||
|
6.0f, 20.0f, 10.0f, 8.0f, 12.0f, 8.0f, 2.0f, 6.0f, 3.0f, 6.0f, 7.0f, 1.5f, 6.0f, 3.0f, 3.0f,
|
||||||
|
3.0f, 3.0f, 2.0f, 3.0f, 3.0f, 6.0f, 6.0f, 6.0f, 4.5f, 7.0f, 6.0f, 7.0f, 6.0f, 22.0f, 8.0f,
|
||||||
|
15.0f, 22.0f, 8.0f, 15.0f, 6.0f, 80.0f, 150.0f, 7.0f, 6.0f, 6.0f, 6.0f, 12.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 35.0f, 20.0f, 9.0f, 6.0f, 6.0f, 6.0f, 20.0f, 20.0f,
|
||||||
|
20.0f, 20.0f, 20.0f, 9.0f, 4.0f, 4.0f, 10.0f, 5.0f, 8.0f, 6.0f, 10.0f, 6.0f, 6.0f, 2.0f, 36.0f,
|
||||||
|
14.0f, 7.0f, 250.0f, 6.0f, 9.0f, 6.0f, 7.0f, 4.0f, 6.0f, 8.0f, 6.0f, 23.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
70.0f, 6.0f, 7.0f, 6.0f, 6.0f, 6.0f, 20.0f, 6.0f, 6.0f, 6.0f, 5.0f, 1.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
4.0f, 4.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 10.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 7.0f, 7.0f, 7.0f, 7.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 8.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 7.0f, 6.0f, 6.0f, 6.0f, 7.5f, 6.0f, 6.0f, 4.0f, 6.0f, 3.0f, 6.0f, 6.0f,
|
||||||
|
1.0f, 9.0f, 7.0f, 8.0f, 7.0f, 8.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 8.0f,
|
||||||
|
};
|
||||||
|
|
||||||
|
static float female_height[] = {
|
||||||
|
6.0f, 6.0f, 7.0f, 6.0f, 5.0f, 6.0f, 5.0f, 5.5f, 4.0f, 8.0f, 9.0f, 3.5f, 3.0f, 6.0f, 6.0f,
|
||||||
|
2.0f, 8.5f, 8.0f, 21.0f, 20.0f, 6.0f, 6.0f, 3.5f, 3.0f, 6.0f, 2.0f, 5.0f, 5.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 7.5f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 5.0f, 6.0f, 6.0f, 7.0f, 4.0f, 4.7f, 6.0f,
|
||||||
|
8.0f, 3.0f, 12.0f, 5.0f, 21.0f, 6.0f, 6.0f, 3.0f, 9.0f, 6.0f, 6.0f, 2.0f, 6.0f, 3.0f, 6.0f,
|
||||||
|
4.0f, 20.0f, 5.0f, 5.0f, 6.0f, 9.0f, 25.0f, 6.0f, 6.0f, 10.0f, 6.0f, 6.0f, 6.0f, 6.0f, 2.5f,
|
||||||
|
7.0f, 6.0f, 5.0f, 6.0f, 1.5f, 1.0f, 3.5f, 7.0f, 6.0f, 6.0f, 6.0f, 6.0f, 7.0f, 3.0f, 3.0f,
|
||||||
|
7.0f, 12.0f, 8.0f, 9.0f, 4.0f, 11.5f, 8.0f, 6.0f, 6.0f, 12.0f, 6.0f, 6.0f, 6.0f, 20.0f, 10.0f,
|
||||||
|
6.5f, 6.0f, 17.0f, 1.0f, 4.0f, 6.0f, 8.0f, 5.0f, 1.0f, 6.0f, 6.0f, 5.0f, 5.0f, 5.0f, 9.0f,
|
||||||
|
3.0f, 8.0f, 2.0f, 24.0f, 6.0f, 10.0f, 6.0f, 6.0f, 6.0f, 3.0f, 7.0f, 9.0f, 6.0f, 11.0f, 2.5f,
|
||||||
|
14.0f, 8.0f, 7.0f, 12.0f, 6.0f, 27.0f, 6.0f, 6.0f, 6.0f, 6.0f, 2.0f, 9.0f, 9.0f, 6.0f, 9.0f,
|
||||||
|
3.0f, 3.0f, 6.0f, 6.0f, 10.0f, 6.0f, 6.0f, 15.0f, 15.0f, 9.0f, 7.0f, 6.0f, 6.0f, 7.0f, 8.0f,
|
||||||
|
3.0f, 3.0f, 6.0f, 7.0f, 13.0f, 6.0f, 6.0f, 9.0f, 5.0f, 7.0f, 9.0f, 6.0f, 6.0f, 8.0f, 6.0f,
|
||||||
|
6.0f, 5.5f, 6.0f, 4.0f, 25.0f, 6.0f, 6.0f, 6.0f, 22.0f, 20.0f, 6.0f, 10.0f, 13.5f, 12.0f, 3.0f,
|
||||||
|
30.0f, 6.0f, 6.0f, 35.0f, 1.5f, 8.0f, 3.0f, 6.0f, 2.0f, 6.0f, 6.0f, 5.0f, 2.0f, 7.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 4.0f, 6.0f, 6.0f, 6.0f, 8.0f, 8.0f, 7.0f, 8.0f, 6.0f, 7.0f, 6.0f, 7.0f,
|
||||||
|
6.0f, 10.0f, 3.0f, 6.0f, 8.0f, 9.0f, 15.0f, 5.0f, 10.0f, 7.0f, 6.0f, 7.0f, 6.0f, 7.0f, 7.0f,
|
||||||
|
12.0f, 6.0f, 4.0f, 6.0f, 5.0f, 3.0f, 30.0f, 30.0f, 15.0f, 20.0f, 6.0f, 10.0f, 6.0f, 14.0f, 14.0f,
|
||||||
|
16.0f, 15.0f, 30.0f, 15.0f, 7.5f, 5.0f, 4.0f, 6.0f, 15.0f, 6.5f, 3.0f, 12.0f, 10.0f, 10.5f, 10.0f,
|
||||||
|
7.5f, 6.0f, 6.0f, 12.5f, 9.0f, 20.0f, 2.0f, 10.0f, 25.0f, 8.0f, 6.0f, 6.0f, 10.0f, 18.0f, 45.0f,
|
||||||
|
13.0f, 15.0f, 8.0f, 30.0f, 25.0f, 25.0f, 10.0f, 13.0f, 5.0f, 3.5f, 15.0f, 35.0f, 11.0f, 15.0f, 50.0f,
|
||||||
|
13.0f, 6.0f, 7.0f, 6.0f, 60.0f, 6.0f, 22.0f, 22.0f, 21.0f, 22.0f, 15.0f, 25.0f, 23.0f, 8.0f, 15.0f,
|
||||||
|
10.0f, 6.0f, 7.0f, 6.0f, 12.0f, 9.5f, 6.0f, 12.0f, 12.0f, 12.0f, 15.0f, 4.0f, 5.0f, 105.0f, 20.0f,
|
||||||
|
5.0f, 10.0f, 10.0f, 10.0f, 20.0f, 13.5f, 8.0f, 10.0f, 3.0f, 5.0f, 9.0f, 6.0f, 6.0f, 6.0f, 10.0f,
|
||||||
|
8.0f, 8.0f, 8.0f, 6.0f, 6.0f, 5.0f, 5.0f, 5.0f, 9.0f, 9.0f, 9.0f, 6.0f, 8.5f, 6.0f, 7.0f,
|
||||||
|
8.0f, 7.0f, 11.0f, 6.0f, 7.0f, 9.0f, 8.0f, 6.0f, 8.0f, 6.0f, 6.0f, 6.0f, 6.0f, 9.0f, 10.0f,
|
||||||
|
6.0f, 3.0f, 4.0f, 3.0f, 3.0f, 4.0f, 10.0f, 10.0f, 2.0f, 8.0f, 6.0f, 6.0f, 14.0f, 7.0f, 5.0f,
|
||||||
|
9.0f, 7.0f, 7.0f, 10.0f, 10.0f, 12.0f, 9.0f, 7.0f, 12.0f, 13.0f, 16.0f, 6.0f, 9.0f, 6.0f, 6.0f,
|
||||||
|
10.0f, 25.0f, 15.0f, 6.0f, 25.0f, 6.0f, 6.0f, 8.0f, 11.0f, 6.0f, 9.0f, 2.0f, 6.0f, 5.0f, 4.0f,
|
||||||
|
8.5f, 6.0f, 6.0f, 6.0f, 4.0f, 6.0f, 15.0f, 1.0f, 2.0f, 6.0f, 40.0f, 8.0f, 12.0f, 3.0f, 8.0f,
|
||||||
|
99.0f, 9.0f, 100.0f, 100.0f, 10.0f, 6.0f, 27.5f, 20.0f, 6.0f, 6.0f, 5.0f, 6.0f, 8.0f, 5.0f, 3.0f,
|
||||||
|
11.5f, 25.0f, 80.0f, 20.0f, 9.0f, 8.0f, 5.0f, 4.0f, 7.0f, 10.0f, 6.0f, 11.0f, 8.0f, 5.0f, 6.0f,
|
||||||
|
6.0f, 30.0f, 7.0f, 15.0f, 9.0f, 6.0f, 9.0f, 6.0f, 3.0f, 32.5f, 15.0f, 7.5f, 10.0f, 10.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 9.0f, 20.0f, 6.0f, 6.0f, 6.0f, 25.0f, 12.0f, 6.0f, 8.0f, 6.0f,
|
||||||
|
6.0f, 20.0f, 9.0f, 8.0f, 12.0f, 8.0f, 2.0f, 6.0f, 3.0f, 6.0f, 7.0f, 1.5f, 6.0f, 3.0f, 3.0f,
|
||||||
|
3.0f, 3.0f, 2.0f, 3.0f, 3.0f, 6.0f, 6.0f, 6.0f, 4.5f, 7.0f, 6.0f, 7.0f, 5.7f, 22.0f, 8.0f,
|
||||||
|
15.0f, 22.0f, 8.0f, 15.0f, 6.0f, 80.0f, 150.0f, 7.0f, 6.0f, 6.0f, 6.0f, 12.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 35.0f, 20.0f, 9.0f, 6.0f, 6.0f, 6.0f, 20.0f, 20.0f,
|
||||||
|
20.0f, 20.0f, 20.0f, 9.0f, 4.0f, 4.0f, 10.0f, 5.0f, 8.0f, 6.0f, 10.0f, 5.7f, 6.0f, 2.0f, 36.0f,
|
||||||
|
14.0f, 7.0f, 250.0f, 6.0f, 9.0f, 6.0f, 7.0f, 4.0f, 6.0f, 8.0f, 6.0f, 23.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
70.0f, 6.0f, 7.0f, 6.0f, 6.0f, 6.0f, 20.0f, 6.0f, 6.0f, 6.0f, 5.0f, 1.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
4.0f, 4.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 10.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 7.0f, 7.0f, 7.0f, 7.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 8.0f,
|
||||||
|
6.0f, 6.0f, 6.0f, 7.0f, 6.0f, 6.0f, 6.0f, 7.5f, 6.0f, 6.0f, 4.0f, 6.0f, 3.0f, 6.0f, 6.0f,
|
||||||
|
1.0f, 9.0f, 7.0f, 8.0f, 7.0f, 8.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 8.0f,
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto size = sizeof(male_height) / sizeof(male_height[0]);
|
||||||
|
|
||||||
|
if (race >= size)
|
||||||
|
return 6.0f;
|
||||||
|
|
||||||
|
if (gender == 1)
|
||||||
|
return female_height[race];
|
||||||
|
|
||||||
|
return male_height[race];
|
||||||
|
}
|
||||||
|
|
||||||
// PlayerAppearance prep
|
// PlayerAppearance prep
|
||||||
#define HUMAN_MALE ((HUMAN << 8) | MALE)
|
#define HUMAN_MALE ((HUMAN << 8) | MALE)
|
||||||
|
|||||||
+728
-409
File diff suppressed because it is too large
Load Diff
+16
-7
@@ -237,7 +237,7 @@ void RuleManager::SaveRules(Database *database, const char *ruleset_name) {
|
|||||||
|
|
||||||
bool RuleManager::LoadRules(Database *database, const char *ruleset_name) {
|
bool RuleManager::LoadRules(Database *database, const char *ruleset_name) {
|
||||||
|
|
||||||
int ruleset_id = GetRulesetID(database, ruleset_name);
|
int ruleset_id = this->GetRulesetID(database, ruleset_name);
|
||||||
if (ruleset_id < 0) {
|
if (ruleset_id < 0) {
|
||||||
Log(Logs::Detail, Logs::Rules, "Failed to find ruleset '%s' for load operation. Canceling.", ruleset_name);
|
Log(Logs::Detail, Logs::Rules, "Failed to find ruleset '%s' for load operation. Canceling.", ruleset_name);
|
||||||
return (false);
|
return (false);
|
||||||
@@ -253,12 +253,17 @@ bool RuleManager::LoadRules(Database *database, const char *ruleset_name) {
|
|||||||
std::string default_ruleset_name = "default";
|
std::string default_ruleset_name = "default";
|
||||||
int default_ruleset_id = GetRulesetID(database, default_ruleset_name.c_str());
|
int default_ruleset_id = GetRulesetID(database, default_ruleset_name.c_str());
|
||||||
if (default_ruleset_id < 0) {
|
if (default_ruleset_id < 0) {
|
||||||
Log(Logs::Detail, Logs::Rules, "Failed to find default ruleset '%s' for load operation. Canceling.", default_ruleset_name.c_str());
|
Log(Logs::Detail, Logs::Rules, "Failed to find default ruleset '%s' for load operation. Canceling.",
|
||||||
|
default_ruleset_name.c_str());
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
Log(Logs::Detail, Logs::Rules, "Loading rule set '%s' (%d)", default_ruleset_name.c_str(), default_ruleset_id);
|
Log(Logs::Detail, Logs::Rules, "Loading rule set '%s' (%d)", default_ruleset_name.c_str(), default_ruleset_id);
|
||||||
|
|
||||||
std::string query = StringFormat("SELECT rule_name, rule_value FROM rule_values WHERE ruleset_id = %d", default_ruleset_id);
|
std::string query = StringFormat(
|
||||||
|
"SELECT rule_name, rule_value FROM rule_values WHERE ruleset_id = %d",
|
||||||
|
default_ruleset_id
|
||||||
|
);
|
||||||
|
|
||||||
auto results = database->QueryDatabase(query);
|
auto results = database->QueryDatabase(query);
|
||||||
if (!results.Success())
|
if (!results.Success())
|
||||||
return false;
|
return false;
|
||||||
@@ -295,18 +300,22 @@ void RuleManager::_SaveRule(Database *database, RuleType type, uint16 index) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string query = StringFormat("REPLACE INTO rule_values "
|
std::string query = StringFormat(
|
||||||
|
"REPLACE INTO rule_values "
|
||||||
"(ruleset_id, rule_name, rule_value) "
|
"(ruleset_id, rule_name, rule_value) "
|
||||||
" VALUES(%d, '%s', '%s')",
|
" VALUES(%d, '%s', '%s')",
|
||||||
m_activeRuleset, _GetRuleName(type, index), value_string);
|
m_activeRuleset,
|
||||||
auto results = database->QueryDatabase(query);
|
_GetRuleName(type, index),
|
||||||
|
value_string
|
||||||
|
);
|
||||||
|
|
||||||
|
database->QueryDatabase(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int RuleManager::GetRulesetID(Database *database, const char *ruleset_name) {
|
int RuleManager::GetRulesetID(Database *database, const char *ruleset_name) {
|
||||||
|
|
||||||
uint32 len = strlen(ruleset_name);
|
uint32 len = static_cast<uint32>(strlen(ruleset_name));
|
||||||
auto rst = new char[2 * len + 1];
|
auto rst = new char[2 * len + 1];
|
||||||
database->DoEscapeString(rst, ruleset_name, len);
|
database->DoEscapeString(rst, ruleset_name, len);
|
||||||
|
|
||||||
|
|||||||
+39
-14
@@ -44,6 +44,7 @@ RULE_INT(Character, DeathExpLossMaxLevel, 255) // Any level greater than this wi
|
|||||||
RULE_INT(Character, DeathItemLossLevel, 10)
|
RULE_INT(Character, DeathItemLossLevel, 10)
|
||||||
RULE_INT(Character, DeathExpLossMultiplier, 3) //Adjust how much exp is lost
|
RULE_INT(Character, DeathExpLossMultiplier, 3) //Adjust how much exp is lost
|
||||||
RULE_BOOL(Character, UseDeathExpLossMult, false) //Adjust to use the above multiplier or to use code default.
|
RULE_BOOL(Character, UseDeathExpLossMult, false) //Adjust to use the above multiplier or to use code default.
|
||||||
|
RULE_BOOL(Character, UseOldRaceRezEffects, false) // older clients had ID 757 for races with high starting STR, but it doesn't seem used anymore
|
||||||
RULE_INT(Character, CorpseDecayTimeMS, 10800000)
|
RULE_INT(Character, CorpseDecayTimeMS, 10800000)
|
||||||
RULE_INT(Character, CorpseResTimeMS, 10800000) // time before cant res corpse(3 hours)
|
RULE_INT(Character, CorpseResTimeMS, 10800000) // time before cant res corpse(3 hours)
|
||||||
RULE_BOOL(Character, LeaveCorpses, true)
|
RULE_BOOL(Character, LeaveCorpses, true)
|
||||||
@@ -66,11 +67,12 @@ RULE_INT(Character, AutosaveIntervalS, 300) //0=disabled
|
|||||||
RULE_INT(Character, HPRegenMultiplier, 100)
|
RULE_INT(Character, HPRegenMultiplier, 100)
|
||||||
RULE_INT(Character, ManaRegenMultiplier, 100)
|
RULE_INT(Character, ManaRegenMultiplier, 100)
|
||||||
RULE_INT(Character, EnduranceRegenMultiplier, 100)
|
RULE_INT(Character, EnduranceRegenMultiplier, 100)
|
||||||
|
RULE_BOOL(Character, OldMinMana, false) // this is used for servers that want to follow older skill cap formulas so they can still have some regen w/o mediate
|
||||||
RULE_INT(Character, ConsumptionMultiplier, 100) //item's hunger restored = this value * item's food level, 100 = normal, 50 = people eat 2x as fast, 200 = people eat 2x as slow
|
RULE_INT(Character, ConsumptionMultiplier, 100) //item's hunger restored = this value * item's food level, 100 = normal, 50 = people eat 2x as fast, 200 = people eat 2x as slow
|
||||||
RULE_BOOL(Character, HealOnLevel, false)
|
RULE_BOOL(Character, HealOnLevel, false)
|
||||||
RULE_BOOL(Character, FeignKillsPet, false)
|
RULE_BOOL(Character, FeignKillsPet, false)
|
||||||
RULE_INT(Character, ItemManaRegenCap, 15)
|
RULE_INT(Character, ItemManaRegenCap, 15)
|
||||||
RULE_INT(Character, ItemHealthRegenCap, 35)
|
RULE_INT(Character, ItemHealthRegenCap, 30)
|
||||||
RULE_INT(Character, ItemDamageShieldCap, 30)
|
RULE_INT(Character, ItemDamageShieldCap, 30)
|
||||||
RULE_INT(Character, ItemAccuracyCap, 150)
|
RULE_INT(Character, ItemAccuracyCap, 150)
|
||||||
RULE_INT(Character, ItemAvoidanceCap, 100)
|
RULE_INT(Character, ItemAvoidanceCap, 100)
|
||||||
@@ -91,10 +93,12 @@ RULE_INT(Character, HasteCap, 100) // Haste cap for non-v3(overhaste) haste.
|
|||||||
RULE_INT(Character, SkillUpModifier, 100) //skill ups are at 100%
|
RULE_INT(Character, SkillUpModifier, 100) //skill ups are at 100%
|
||||||
RULE_BOOL(Character, SharedBankPlat, false) //off by default to prevent duping for now
|
RULE_BOOL(Character, SharedBankPlat, false) //off by default to prevent duping for now
|
||||||
RULE_BOOL(Character, BindAnywhere, false)
|
RULE_BOOL(Character, BindAnywhere, false)
|
||||||
RULE_INT(Character, RestRegenPercent, 0) // Set to >0 to enable rest state bonus HP and mana regen.
|
RULE_BOOL(Character, RestRegenEnabled, true) // Enable OOC Regen
|
||||||
|
RULE_INT(Character, RestRegenHP, 180) // seconds until full from 0. this is actually zone setable, but most or all zones are 180
|
||||||
|
RULE_INT(Character, RestRegenMana, 180) // seconds until full from 0. this is actually zone setable, but most or all zones are 180
|
||||||
|
RULE_INT(Character, RestRegenEnd, 180) // seconds until full from 0. this is actually zone setable, but most or all zones are 180
|
||||||
RULE_INT(Character, RestRegenTimeToActivate, 30) // Time in seconds for rest state regen to kick in.
|
RULE_INT(Character, RestRegenTimeToActivate, 30) // Time in seconds for rest state regen to kick in.
|
||||||
RULE_INT(Character, RestRegenRaidTimeToActivate, 300) // Time in seconds for rest state regen to kick in with a raid target.
|
RULE_INT(Character, RestRegenRaidTimeToActivate, 300) // Time in seconds for rest state regen to kick in with a raid target.
|
||||||
RULE_BOOL(Character, RestRegenEndurance, false) // Whether rest regen will work for endurance or not.
|
|
||||||
RULE_INT(Character, KillsPerGroupLeadershipAA, 250) // Number of dark blues or above per Group Leadership AA
|
RULE_INT(Character, KillsPerGroupLeadershipAA, 250) // Number of dark blues or above per Group Leadership AA
|
||||||
RULE_INT(Character, KillsPerRaidLeadershipAA, 250) // Number of dark blues or above per Raid Leadership AA
|
RULE_INT(Character, KillsPerRaidLeadershipAA, 250) // Number of dark blues or above per Raid Leadership AA
|
||||||
RULE_INT(Character, MaxFearDurationForPlayerCharacter, 4) //4 tics, each tic calculates every 6 seconds.
|
RULE_INT(Character, MaxFearDurationForPlayerCharacter, 4) //4 tics, each tic calculates every 6 seconds.
|
||||||
@@ -117,7 +121,8 @@ RULE_BOOL(Character, EnableDiscoveredItems, true) // If enabled, it enables EVEN
|
|||||||
RULE_BOOL(Character, EnableXTargetting, true) // Enable Extended Targetting Window, for users with UF and later clients.
|
RULE_BOOL(Character, EnableXTargetting, true) // Enable Extended Targetting Window, for users with UF and later clients.
|
||||||
RULE_BOOL(Character, EnableAggroMeter, true) // Enable Aggro Meter, for users with RoF and later clients.
|
RULE_BOOL(Character, EnableAggroMeter, true) // Enable Aggro Meter, for users with RoF and later clients.
|
||||||
RULE_BOOL(Character, KeepLevelOverMax, false) // Don't delevel a character that has somehow gone over the level cap
|
RULE_BOOL(Character, KeepLevelOverMax, false) // Don't delevel a character that has somehow gone over the level cap
|
||||||
RULE_INT(Character, FoodLossPerUpdate, 35) // How much food/water you lose per stamina update
|
RULE_INT(Character, FoodLossPerUpdate, 32) // How much food/water you lose per stamina update
|
||||||
|
RULE_BOOL(Character, EnableHungerPenalties, false) // being hungry/thirsty has negative effects -- it does appear normal live servers do not have penalties
|
||||||
RULE_INT(Character, BaseInstrumentSoftCap, 36) // Softcap for instrument mods, 36 commonly referred to as "3.6" as well.
|
RULE_INT(Character, BaseInstrumentSoftCap, 36) // Softcap for instrument mods, 36 commonly referred to as "3.6" as well.
|
||||||
RULE_BOOL(Character, UseSpellFileSongCap, true) // When they removed the AA that increased the cap they removed the above and just use the spell field
|
RULE_BOOL(Character, UseSpellFileSongCap, true) // When they removed the AA that increased the cap they removed the above and just use the spell field
|
||||||
RULE_INT(Character, BaseRunSpeedCap, 158) // Base Run Speed Cap, on live it's 158% which will give you a runspeed of 1.580 hard capped to 225.
|
RULE_INT(Character, BaseRunSpeedCap, 158) // Base Run Speed Cap, on live it's 158% which will give you a runspeed of 1.580 hard capped to 225.
|
||||||
@@ -134,7 +139,6 @@ RULE_INT(Character, TradeskillUpMakePoison, 2) // Make Poison skillup rate adjus
|
|||||||
RULE_INT(Character, TradeskillUpPottery, 4) // Pottery skillup rate adjust. Lower is faster.
|
RULE_INT(Character, TradeskillUpPottery, 4) // Pottery skillup rate adjust. Lower is faster.
|
||||||
RULE_INT(Character, TradeskillUpResearch, 1) // Research skillup rate adjust. Lower is faster.
|
RULE_INT(Character, TradeskillUpResearch, 1) // Research skillup rate adjust. Lower is faster.
|
||||||
RULE_INT(Character, TradeskillUpTinkering, 2) // Tinkering skillup rate adjust. Lower is faster.
|
RULE_INT(Character, TradeskillUpTinkering, 2) // Tinkering skillup rate adjust. Lower is faster.
|
||||||
RULE_BOOL(Character, SpamHPUpdates, false) // if your server has stupid amounts of HP that causes client display issues, turn this on!
|
|
||||||
RULE_BOOL(Character, MarqueeHPUpdates, false) // Will show Health % in center of screen < 100%
|
RULE_BOOL(Character, MarqueeHPUpdates, false) // Will show Health % in center of screen < 100%
|
||||||
RULE_INT(Character, IksarCommonTongue, 95) // 95 By default (live-like?)
|
RULE_INT(Character, IksarCommonTongue, 95) // 95 By default (live-like?)
|
||||||
RULE_INT(Character, OgreCommonTongue, 95) // 95 By default (live-like?)
|
RULE_INT(Character, OgreCommonTongue, 95) // 95 By default (live-like?)
|
||||||
@@ -151,6 +155,9 @@ RULE_BOOL(Character, AllowMQTarget, false) // Disables putting players in the 'h
|
|||||||
RULE_BOOL(Character, UseOldBindWound, false) // Uses the original bind wound behavior
|
RULE_BOOL(Character, UseOldBindWound, false) // Uses the original bind wound behavior
|
||||||
RULE_BOOL(Character, GrantHoTTOnCreate, false) // Grant Health of Target's Target leadership AA on character creation
|
RULE_BOOL(Character, GrantHoTTOnCreate, false) // Grant Health of Target's Target leadership AA on character creation
|
||||||
RULE_BOOL(Character, UseOldConSystem, false) // Grant Health of Target's Target leadership AA on character creation
|
RULE_BOOL(Character, UseOldConSystem, false) // Grant Health of Target's Target leadership AA on character creation
|
||||||
|
RULE_BOOL(Character, OPClientUpdateVisualDebug, false) // Shows a pulse and forward directional particle each time the client sends its position to server
|
||||||
|
RULE_BOOL(Character, AllowCrossClassTrainers, false)
|
||||||
|
RULE_BOOL(Character, PetsUseReagents, true) //Pets use reagent on spells
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
RULE_CATEGORY(Mercs)
|
RULE_CATEGORY(Mercs)
|
||||||
@@ -186,12 +193,14 @@ RULE_INT(Skills, MaxTrainSpecializations, 50) // Max level a GM trainer will tra
|
|||||||
RULE_INT(Skills, SwimmingStartValue, 100)
|
RULE_INT(Skills, SwimmingStartValue, 100)
|
||||||
RULE_BOOL(Skills, TrainSenseHeading, false)
|
RULE_BOOL(Skills, TrainSenseHeading, false)
|
||||||
RULE_INT(Skills, SenseHeadingStartValue, 200)
|
RULE_INT(Skills, SenseHeadingStartValue, 200)
|
||||||
|
RULE_BOOL(Skills, SelfLanguageLearning, true)
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
RULE_CATEGORY(Pets)
|
RULE_CATEGORY(Pets)
|
||||||
RULE_REAL(Pets, AttackCommandRange, 150)
|
RULE_REAL(Pets, AttackCommandRange, 150)
|
||||||
RULE_BOOL(Pets, UnTargetableSwarmPet, false)
|
RULE_BOOL(Pets, UnTargetableSwarmPet, false)
|
||||||
RULE_REAL(Pets, PetPowerLevelCap, 10) // Max number of levels your pet can go up with pet power
|
RULE_REAL(Pets, PetPowerLevelCap, 10) // Max number of levels your pet can go up with pet power
|
||||||
|
RULE_BOOL(Pets, CanTakeNoDrop, false) // Can everyone trade nodrop gear to pets
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
RULE_CATEGORY(GM)
|
RULE_CATEGORY(GM)
|
||||||
@@ -226,6 +235,7 @@ RULE_INT(World, TitaniumStartZoneID, -1) //Sets the Starting Zone for Titanium C
|
|||||||
RULE_INT(World, ExpansionSettings, 16383) // Sets the expansion settings for the server, This is sent on login to world and affects client expansion settings. Defaults to all expansions enabled up to TSS.
|
RULE_INT(World, ExpansionSettings, 16383) // Sets the expansion settings for the server, This is sent on login to world and affects client expansion settings. Defaults to all expansions enabled up to TSS.
|
||||||
RULE_BOOL(World, UseClientBasedExpansionSettings, true) // if true it will overrule World, ExpansionSettings and set someone's expansion based on the client they're using
|
RULE_BOOL(World, UseClientBasedExpansionSettings, true) // if true it will overrule World, ExpansionSettings and set someone's expansion based on the client they're using
|
||||||
RULE_INT(World, PVPSettings, 0) // Sets the PVP settings for the server, 1 = Rallos Zek RuleSet, 2 = Tallon/Vallon Zek Ruleset, 4 = Sullon Zek Ruleset, 6 = Discord Ruleset, anything above 6 is the Discord Ruleset without the no-drop restrictions removed. TODO: Edit IsAttackAllowed in Zone to accomodate for these rules.
|
RULE_INT(World, PVPSettings, 0) // Sets the PVP settings for the server, 1 = Rallos Zek RuleSet, 2 = Tallon/Vallon Zek Ruleset, 4 = Sullon Zek Ruleset, 6 = Discord Ruleset, anything above 6 is the Discord Ruleset without the no-drop restrictions removed. TODO: Edit IsAttackAllowed in Zone to accomodate for these rules.
|
||||||
|
RULE_INT(World, PVPMinLevel, 0) // minimum level to pvp
|
||||||
RULE_BOOL (World, IsGMPetitionWindowEnabled, false)
|
RULE_BOOL (World, IsGMPetitionWindowEnabled, false)
|
||||||
RULE_INT (World, FVNoDropFlag, 0) // Sets the Firiona Vie settings on the client. If set to 2, the flag will be set for GMs only, allowing trading of no-drop items.
|
RULE_INT (World, FVNoDropFlag, 0) // Sets the Firiona Vie settings on the client. If set to 2, the flag will be set for GMs only, allowing trading of no-drop items.
|
||||||
RULE_BOOL (World, IPLimitDisconnectAll, false)
|
RULE_BOOL (World, IPLimitDisconnectAll, false)
|
||||||
@@ -235,7 +245,6 @@ RULE_BOOL(World, StartZoneSameAsBindOnCreation, true) //Should the start zone AL
|
|||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
RULE_CATEGORY(Zone)
|
RULE_CATEGORY(Zone)
|
||||||
RULE_INT(Zone, NPCPositonUpdateTicCount, 32) //ms between intervals of sending a position update to the entire zone.
|
|
||||||
RULE_INT(Zone, ClientLinkdeadMS, 180000) //the time a client remains link dead on the server after a sudden disconnection
|
RULE_INT(Zone, ClientLinkdeadMS, 180000) //the time a client remains link dead on the server after a sudden disconnection
|
||||||
RULE_INT(Zone, GraveyardTimeMS, 1200000) //ms time until a player corpse is moved to a zone's graveyard, if one is specified for the zone
|
RULE_INT(Zone, GraveyardTimeMS, 1200000) //ms time until a player corpse is moved to a zone's graveyard, if one is specified for the zone
|
||||||
RULE_BOOL(Zone, EnableShadowrest, 1) // enables or disables the shadowrest zone feature for player corpses. Default is turned on.
|
RULE_BOOL(Zone, EnableShadowrest, 1) // enables or disables the shadowrest zone feature for player corpses. Default is turned on.
|
||||||
@@ -269,15 +278,10 @@ RULE_INT(Zone, GlobalLootMultiplier, 1) // Sets Global Loot drop multiplier for
|
|||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
RULE_CATEGORY(Map)
|
RULE_CATEGORY(Map)
|
||||||
//enable these to help prevent mob hopping when they are pathing
|
|
||||||
RULE_BOOL(Map, FixPathingZWhenLoading, true) //increases zone boot times a bit to reduce hopping.
|
|
||||||
RULE_BOOL(Map, FixPathingZAtWaypoints, false) //alternative to `WhenLoading`, accomplishes the same thing but does it at each waypoint instead of once at boot time.
|
|
||||||
RULE_BOOL(Map, FixPathingZWhenMoving, false) //very CPU intensive, but helps hopping with widely spaced waypoints.
|
|
||||||
RULE_BOOL(Map, FixPathingZOnSendTo, false) //try to repair Z coords in the SendTo routine as well.
|
RULE_BOOL(Map, FixPathingZOnSendTo, false) //try to repair Z coords in the SendTo routine as well.
|
||||||
RULE_REAL(Map, FixPathingZMaxDeltaMoving, 20) //at runtime while pathing: max change in Z to allow the BestZ code to apply.
|
RULE_BOOL(Map, FixZWhenMoving, true) // Automatically fix NPC Z coordinates when moving/pathing/engaged (Far less CPU intensive than its predecessor)
|
||||||
RULE_REAL(Map, FixPathingZMaxDeltaWaypoint, 20) //at runtime at each waypoint: max change in Z to allow the BestZ code to apply.
|
RULE_BOOL(Map, MobZVisualDebug, false) // Displays spell effects determining whether or not NPC is hitting Best Z calcs (blue for hit, red for miss)
|
||||||
RULE_REAL(Map, FixPathingZMaxDeltaSendTo, 20) //at runtime in SendTo: max change in Z to allow the BestZ code to apply.
|
RULE_REAL(Map, FixPathingZMaxDeltaSendTo, 20) //at runtime in SendTo: max change in Z to allow the BestZ code to apply.
|
||||||
RULE_REAL(Map, FixPathingZMaxDeltaLoading, 45) //while loading each waypoint: max change in Z to allow the BestZ code to apply.
|
|
||||||
RULE_INT(Map, FindBestZHeightAdjust, 1) // Adds this to the current Z before seeking the best Z position
|
RULE_INT(Map, FindBestZHeightAdjust, 1) // Adds this to the current Z before seeking the best Z position
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
@@ -289,7 +293,7 @@ RULE_BOOL(Pathing, AggroReturnToGrid, true) // Enable pathing for aggroed roamin
|
|||||||
RULE_BOOL(Pathing, Guard, true) // Enable pathing for mobs moving to their guard point.
|
RULE_BOOL(Pathing, Guard, true) // Enable pathing for mobs moving to their guard point.
|
||||||
RULE_BOOL(Pathing, Find, true) // Enable pathing for FindPerson requests from the client.
|
RULE_BOOL(Pathing, Find, true) // Enable pathing for FindPerson requests from the client.
|
||||||
RULE_BOOL(Pathing, Fear, true) // Enable pathing for fear
|
RULE_BOOL(Pathing, Fear, true) // Enable pathing for fear
|
||||||
RULE_REAL(Pathing, ZDiffThreshold, 10) // If a mob las LOS to it's target, it will run to it if the Z difference is < this.
|
RULE_REAL(Pathing, ZDiffThresholdNew, 80) // If a mob las LOS to it's target, it will run to it if the Z difference is < this.
|
||||||
RULE_INT(Pathing, LOSCheckFrequency, 1000) // A mob will check for LOS to it's target this often (milliseconds).
|
RULE_INT(Pathing, LOSCheckFrequency, 1000) // A mob will check for LOS to it's target this often (milliseconds).
|
||||||
RULE_INT(Pathing, RouteUpdateFrequencyShort, 1000) // How often a new route will be calculated if the target has moved.
|
RULE_INT(Pathing, RouteUpdateFrequencyShort, 1000) // How often a new route will be calculated if the target has moved.
|
||||||
RULE_INT(Pathing, RouteUpdateFrequencyLong, 5000) // How often a new route will be calculated if the target has moved.
|
RULE_INT(Pathing, RouteUpdateFrequencyLong, 5000) // How often a new route will be calculated if the target has moved.
|
||||||
@@ -348,6 +352,7 @@ RULE_INT(Spells, MaxTotalSlotsNPC, 60) // default to Tit's limit
|
|||||||
RULE_INT(Spells, MaxTotalSlotsPET, 30) // default to Tit's limit
|
RULE_INT(Spells, MaxTotalSlotsPET, 30) // default to Tit's limit
|
||||||
RULE_BOOL (Spells, EnableBlockedBuffs, true)
|
RULE_BOOL (Spells, EnableBlockedBuffs, true)
|
||||||
RULE_INT(Spells, ReflectType, 3) //0 = disabled, 1 = single target player spells only, 2 = all player spells, 3 = all single target spells, 4 = all spells
|
RULE_INT(Spells, ReflectType, 3) //0 = disabled, 1 = single target player spells only, 2 = all player spells, 3 = all single target spells, 4 = all spells
|
||||||
|
RULE_BOOL(Spells, ReflectMessagesClose, true) // Live functionality is for Reflect messages to show to players within close proximity, false shows just player reflecting
|
||||||
RULE_INT(Spells, VirusSpreadDistance, 30) // The distance a viral spell will jump to its next victim
|
RULE_INT(Spells, VirusSpreadDistance, 30) // The distance a viral spell will jump to its next victim
|
||||||
RULE_BOOL(Spells, LiveLikeFocusEffects, true) // Determines whether specific healing, dmg and mana reduction focuses are randomized
|
RULE_BOOL(Spells, LiveLikeFocusEffects, true) // Determines whether specific healing, dmg and mana reduction focuses are randomized
|
||||||
RULE_INT(Spells, BaseImmunityLevel, 55) // The level that targets start to be immune to stun, fear and mez spells with a max level of 0.
|
RULE_INT(Spells, BaseImmunityLevel, 55) // The level that targets start to be immune to stun, fear and mez spells with a max level of 0.
|
||||||
@@ -397,6 +402,8 @@ RULE_BOOL(Spells, FlatItemExtraSpellAmt, false) // allow SpellDmg stat to affect
|
|||||||
RULE_BOOL(Spells, IgnoreSpellDmgLvlRestriction, false) // ignore the 5 level spread on applying SpellDmg
|
RULE_BOOL(Spells, IgnoreSpellDmgLvlRestriction, false) // ignore the 5 level spread on applying SpellDmg
|
||||||
RULE_BOOL(Spells, AllowItemTGB, false) // TGB doesn't work with items on live, custom servers want it though
|
RULE_BOOL(Spells, AllowItemTGB, false) // TGB doesn't work with items on live, custom servers want it though
|
||||||
RULE_BOOL(Spells, NPCInnateProcOverride, true) // NPC innate procs override the target type to single target.
|
RULE_BOOL(Spells, NPCInnateProcOverride, true) // NPC innate procs override the target type to single target.
|
||||||
|
RULE_BOOL(Spells, OldRainTargets, false) // use old incorrectly implemented max targets for rains
|
||||||
|
RULE_BOOL(Spells, NPCSpellPush, false) // enable spell push on NPCs
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
RULE_CATEGORY(Combat)
|
RULE_CATEGORY(Combat)
|
||||||
@@ -499,6 +506,7 @@ RULE_INT(Combat, NPCAssistCapTimer, 6000) // Time in milliseconds a NPC will tak
|
|||||||
RULE_BOOL(Combat, UseRevampHandToHand, false) // use h2h revamped dmg/delays I believe this was implemented during SoF
|
RULE_BOOL(Combat, UseRevampHandToHand, false) // use h2h revamped dmg/delays I believe this was implemented during SoF
|
||||||
RULE_BOOL(Combat, ClassicMasterWu, false) // classic master wu uses a random special, modern doesn't
|
RULE_BOOL(Combat, ClassicMasterWu, false) // classic master wu uses a random special, modern doesn't
|
||||||
RULE_INT(Combat, LevelToStopDamageCaps, 0) // 1 will effectively disable them, 20 should give basically same results as old incorrect system
|
RULE_INT(Combat, LevelToStopDamageCaps, 0) // 1 will effectively disable them, 20 should give basically same results as old incorrect system
|
||||||
|
RULE_BOOL(Combat, ClassicNPCBackstab, false) // true disables npc facestab - npcs get normal attack if not behind
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
RULE_CATEGORY(NPC)
|
RULE_CATEGORY(NPC)
|
||||||
@@ -507,6 +515,7 @@ RULE_INT(NPC, MajorNPCCorpseDecayTimeMS, 1500000) //level>=55
|
|||||||
RULE_INT(NPC, CorpseUnlockTimer, 150000)
|
RULE_INT(NPC, CorpseUnlockTimer, 150000)
|
||||||
RULE_INT(NPC, EmptyNPCCorpseDecayTimeMS, 0)
|
RULE_INT(NPC, EmptyNPCCorpseDecayTimeMS, 0)
|
||||||
RULE_BOOL(NPC, UseItemBonusesForNonPets, true)
|
RULE_BOOL(NPC, UseItemBonusesForNonPets, true)
|
||||||
|
RULE_BOOL(NPC, UseBaneDamage, false)
|
||||||
RULE_INT(NPC, SayPauseTimeInSec, 5)
|
RULE_INT(NPC, SayPauseTimeInSec, 5)
|
||||||
RULE_INT(NPC, OOCRegen, 0)
|
RULE_INT(NPC, OOCRegen, 0)
|
||||||
RULE_BOOL(NPC, BuffFriends, false)
|
RULE_BOOL(NPC, BuffFriends, false)
|
||||||
@@ -539,6 +548,8 @@ RULE_INT(Aggro, IntAggroThreshold, 75) // Int <= this will aggro regardless of l
|
|||||||
RULE_BOOL(Aggro, AllowTickPulling, false) // tick pulling is an exploit in an NPC's call for help fixed sometime in 2006 on live
|
RULE_BOOL(Aggro, AllowTickPulling, false) // tick pulling is an exploit in an NPC's call for help fixed sometime in 2006 on live
|
||||||
RULE_BOOL(Aggro, UseLevelAggro, true) // Level 18+ and Undead will aggro regardless of level difference. (this will disabled Rule:IntAggroThreshold if set to true)
|
RULE_BOOL(Aggro, UseLevelAggro, true) // Level 18+ and Undead will aggro regardless of level difference. (this will disabled Rule:IntAggroThreshold if set to true)
|
||||||
RULE_INT(Aggro, ClientAggroCheckInterval, 6) // Interval in which clients actually check for aggro - in seconds
|
RULE_INT(Aggro, ClientAggroCheckInterval, 6) // Interval in which clients actually check for aggro - in seconds
|
||||||
|
RULE_REAL(Aggro, PetAttackRange, 40000.0) // max squared range /pet attack works at default is 200
|
||||||
|
RULE_BOOL(Aggro, NPCAggroMaxDistanceEnabled, true) /* If enabled, NPC's will drop aggro beyond 600 units or what is defined at the zone level */
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
RULE_CATEGORY(TaskSystem)
|
RULE_CATEGORY(TaskSystem)
|
||||||
@@ -560,6 +571,8 @@ RULE_INT(Range, DamageMessages, 50)
|
|||||||
RULE_INT(Range, SpellMessages, 75)
|
RULE_INT(Range, SpellMessages, 75)
|
||||||
RULE_INT(Range, SongMessages, 75)
|
RULE_INT(Range, SongMessages, 75)
|
||||||
RULE_INT(Range, MobPositionUpdates, 600)
|
RULE_INT(Range, MobPositionUpdates, 600)
|
||||||
|
RULE_INT(Range, ClientPositionUpdates, 300)
|
||||||
|
RULE_INT(Range, ClientForceSpawnUpdateRange, 1000)
|
||||||
RULE_INT(Range, CriticalDamage, 80)
|
RULE_INT(Range, CriticalDamage, 80)
|
||||||
RULE_INT(Range, ClientNPCScan, 300)
|
RULE_INT(Range, ClientNPCScan, 300)
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
@@ -663,6 +676,12 @@ RULE_CATEGORY_END()
|
|||||||
RULE_CATEGORY(AA)
|
RULE_CATEGORY(AA)
|
||||||
RULE_INT(AA, ExpPerPoint, 23976503) //Amount of exp per AA. Is the same as the amount of exp to go from level 51 to level 52.
|
RULE_INT(AA, ExpPerPoint, 23976503) //Amount of exp per AA. Is the same as the amount of exp to go from level 51 to level 52.
|
||||||
RULE_BOOL(AA, Stacking, true) //Allow AA that belong to the same group to stack on SOF+ clients.
|
RULE_BOOL(AA, Stacking, true) //Allow AA that belong to the same group to stack on SOF+ clients.
|
||||||
|
RULE_BOOL(AA, NormalizedAAEnabled, false) // TSS+ change to AA that normalizes AA XP to a fixed # of white con kills independent of level.
|
||||||
|
RULE_INT(AA, NormalizedAANumberOfWhiteConPerAA, 25) // The number of white con kills per AA point.
|
||||||
|
RULE_BOOL(AA, ModernAAScalingEnabled, false) // Are we linearly scaling AA XP based on total # of earned AA?
|
||||||
|
RULE_REAL(AA, ModernAAScalingStartPercent, 1000) // 1000% or 10x AA XP at the start of the scaling range
|
||||||
|
RULE_INT(AA, ModernAAScalingAAMinimum, 0) // The minimum number of earned AA before AA XP scaling begins.
|
||||||
|
RULE_INT(AA, ModernAAScalingAALimit, 4000) // The number of earned AA when AA XP scaling ends
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
RULE_CATEGORY(Console)
|
RULE_CATEGORY(Console)
|
||||||
@@ -708,6 +727,12 @@ RULE_BOOL(Client, UseLiveFactionMessage, false) // Allows players to see faction
|
|||||||
RULE_BOOL(Client, UseLiveBlockedMessage, false) // Allows players to see faction adjustments like Live
|
RULE_BOOL(Client, UseLiveBlockedMessage, false) // Allows players to see faction adjustments like Live
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
|
RULE_CATEGORY(Bugs)
|
||||||
|
RULE_BOOL(Bugs, ReportingSystemActive, true) // Activates bug reporting
|
||||||
|
RULE_BOOL(Bugs, UseOldReportingMethod, true) // Forces the use of the old bug reporting system
|
||||||
|
RULE_BOOL(Bugs, DumpTargetEntity, false) // Dumps the target entity, if one is provided
|
||||||
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
#undef RULE_CATEGORY
|
#undef RULE_CATEGORY
|
||||||
#undef RULE_INT
|
#undef RULE_INT
|
||||||
#undef RULE_REAL
|
#undef RULE_REAL
|
||||||
|
|||||||
+51
-53
@@ -29,10 +29,10 @@
|
|||||||
bool EQEmu::saylink::DegenerateLinkBody(SayLinkBody_Struct& say_link_body_struct, const std::string& say_link_body)
|
bool EQEmu::saylink::DegenerateLinkBody(SayLinkBody_Struct& say_link_body_struct, const std::string& say_link_body)
|
||||||
{
|
{
|
||||||
memset(&say_link_body_struct, 0, sizeof(say_link_body_struct));
|
memset(&say_link_body_struct, 0, sizeof(say_link_body_struct));
|
||||||
if (say_link_body.length() != EQEmu::legacy::TEXT_LINK_BODY_LENGTH)
|
if (say_link_body.length() != EQEmu::constants::SayLinkBodySize)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
say_link_body_struct.unknown_1 = (uint8)strtol(say_link_body.substr(0, 1).c_str(), nullptr, 16);
|
say_link_body_struct.action_id = (uint8)strtol(say_link_body.substr(0, 1).c_str(), nullptr, 16);
|
||||||
say_link_body_struct.item_id = (uint32)strtol(say_link_body.substr(1, 5).c_str(), nullptr, 16);
|
say_link_body_struct.item_id = (uint32)strtol(say_link_body.substr(1, 5).c_str(), nullptr, 16);
|
||||||
say_link_body_struct.augment_1 = (uint32)strtol(say_link_body.substr(6, 5).c_str(), nullptr, 16);
|
say_link_body_struct.augment_1 = (uint32)strtol(say_link_body.substr(6, 5).c_str(), nullptr, 16);
|
||||||
say_link_body_struct.augment_2 = (uint32)strtol(say_link_body.substr(11, 5).c_str(), nullptr, 16);
|
say_link_body_struct.augment_2 = (uint32)strtol(say_link_body.substr(11, 5).c_str(), nullptr, 16);
|
||||||
@@ -44,7 +44,7 @@ bool EQEmu::saylink::DegenerateLinkBody(SayLinkBody_Struct& say_link_body_struct
|
|||||||
say_link_body_struct.evolve_group = (uint32)strtol(say_link_body.substr(37, 4).c_str(), nullptr, 16);
|
say_link_body_struct.evolve_group = (uint32)strtol(say_link_body.substr(37, 4).c_str(), nullptr, 16);
|
||||||
say_link_body_struct.evolve_level = (uint8)strtol(say_link_body.substr(41, 2).c_str(), nullptr, 16);
|
say_link_body_struct.evolve_level = (uint8)strtol(say_link_body.substr(41, 2).c_str(), nullptr, 16);
|
||||||
say_link_body_struct.ornament_icon = (uint32)strtol(say_link_body.substr(43, 5).c_str(), nullptr, 16);
|
say_link_body_struct.ornament_icon = (uint32)strtol(say_link_body.substr(43, 5).c_str(), nullptr, 16);
|
||||||
say_link_body_struct.hash = (int)strtol(say_link_body.substr(48, 8).c_str(), nullptr, 16);
|
say_link_body_struct.hash = (uint32)strtol(say_link_body.substr(48, 8).c_str(), nullptr, 16);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -53,7 +53,7 @@ bool EQEmu::saylink::GenerateLinkBody(std::string& say_link_body, const SayLinkB
|
|||||||
{
|
{
|
||||||
say_link_body = StringFormat(
|
say_link_body = StringFormat(
|
||||||
"%1X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%1X" "%04X" "%02X" "%05X" "%08X",
|
"%1X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%1X" "%04X" "%02X" "%05X" "%08X",
|
||||||
(0x0F & say_link_body_struct.unknown_1),
|
(0x0F & say_link_body_struct.action_id),
|
||||||
(0x000FFFFF & say_link_body_struct.item_id),
|
(0x000FFFFF & say_link_body_struct.item_id),
|
||||||
(0x000FFFFF & say_link_body_struct.augment_1),
|
(0x000FFFFF & say_link_body_struct.augment_1),
|
||||||
(0x000FFFFF & say_link_body_struct.augment_2),
|
(0x000FFFFF & say_link_body_struct.augment_2),
|
||||||
@@ -68,7 +68,7 @@ bool EQEmu::saylink::GenerateLinkBody(std::string& say_link_body, const SayLinkB
|
|||||||
(0xFFFFFFFF & say_link_body_struct.hash)
|
(0xFFFFFFFF & say_link_body_struct.hash)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (say_link_body.length() != EQEmu::legacy::TEXT_LINK_BODY_LENGTH)
|
if (say_link_body.length() != EQEmu::constants::SayLinkBodySize)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -79,7 +79,7 @@ EQEmu::SayLinkEngine::SayLinkEngine()
|
|||||||
Reset();
|
Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string EQEmu::SayLinkEngine::GenerateLink()
|
const std::string& EQEmu::SayLinkEngine::GenerateLink()
|
||||||
{
|
{
|
||||||
m_Link.clear();
|
m_Link.clear();
|
||||||
m_LinkBody.clear();
|
m_LinkBody.clear();
|
||||||
@@ -88,18 +88,26 @@ std::string EQEmu::SayLinkEngine::GenerateLink()
|
|||||||
generate_body();
|
generate_body();
|
||||||
generate_text();
|
generate_text();
|
||||||
|
|
||||||
if ((m_LinkBody.length() == EQEmu::legacy::TEXT_LINK_BODY_LENGTH) && (m_LinkText.length() > 0)) {
|
if ((m_LinkBody.length() == EQEmu::constants::SayLinkBodySize) && (m_LinkText.length() > 0)) {
|
||||||
m_Link.push_back(0x12);
|
m_Link.push_back(0x12);
|
||||||
m_Link.append(m_LinkBody);
|
m_Link.append(m_LinkBody);
|
||||||
m_Link.append(m_LinkText);
|
m_Link.append(m_LinkText);
|
||||||
m_Link.push_back(0x12);
|
m_Link.push_back(0x12);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m_Link.length() == 0) || (m_Link.length() > 250)) {
|
if ((m_Link.length() == 0) || (m_Link.length() > (EQEmu::constants::SayLinkMaximumSize))) {
|
||||||
m_Error = true;
|
m_Error = true;
|
||||||
m_Link = "<LINKER ERROR>";
|
m_Link = "<LINKER ERROR>";
|
||||||
Log(Logs::General, Logs::Error, "TextLink::GenerateLink() failed to generate a useable text link (LinkType: %i, Lengths: {link: %u, body: %u, text: %u})",
|
Log(Logs::General, Logs::Error, "SayLinkEngine::GenerateLink() failed to generate a useable say link");
|
||||||
m_LinkType, m_Link.length(), m_LinkBody.length(), m_LinkText.length());
|
Log(Logs::General, Logs::Error, ">> LinkType: %i, Lengths: {link: %u(%u), body: %u(%u), text: %u(%u)}",
|
||||||
|
m_LinkType,
|
||||||
|
m_Link.length(),
|
||||||
|
EQEmu::constants::SayLinkMaximumSize,
|
||||||
|
m_LinkBody.length(),
|
||||||
|
EQEmu::constants::SayLinkBodySize,
|
||||||
|
m_LinkText.length(),
|
||||||
|
EQEmu::constants::SayLinkTextSize
|
||||||
|
);
|
||||||
Log(Logs::General, Logs::Error, ">> LinkBody: %s", m_LinkBody.c_str());
|
Log(Logs::General, Logs::Error, ">> LinkBody: %s", m_LinkBody.c_str());
|
||||||
Log(Logs::General, Logs::Error, ">> LinkText: %s", m_LinkText.c_str());
|
Log(Logs::General, Logs::Error, ">> LinkText: %s", m_LinkText.c_str());
|
||||||
}
|
}
|
||||||
@@ -113,20 +121,10 @@ void EQEmu::SayLinkEngine::Reset()
|
|||||||
m_ItemData = nullptr;
|
m_ItemData = nullptr;
|
||||||
m_LootData = nullptr;
|
m_LootData = nullptr;
|
||||||
m_ItemInst = nullptr;
|
m_ItemInst = nullptr;
|
||||||
m_Proxy_unknown_1 = 0;
|
|
||||||
m_ProxyItemID = 0;
|
memset(&m_LinkBodyStruct, 0, sizeof(SayLinkBody_Struct));
|
||||||
m_ProxyAugment1ID = 0;
|
memset(&m_LinkProxyStruct, 0, sizeof(SayLinkProxy_Struct));
|
||||||
m_ProxyAugment2ID = 0;
|
|
||||||
m_ProxyAugment3ID = 0;
|
|
||||||
m_ProxyAugment4ID = 0;
|
|
||||||
m_ProxyAugment5ID = 0;
|
|
||||||
m_ProxyAugment6ID = 0;
|
|
||||||
m_ProxyIsEvolving = 0;
|
|
||||||
m_ProxyEvolveGroup = 0;
|
|
||||||
m_ProxyEvolveLevel = 0;
|
|
||||||
m_ProxyOrnamentIcon = 0;
|
|
||||||
m_ProxyHash = 0;
|
|
||||||
m_ProxyText = nullptr;
|
|
||||||
m_TaskUse = false;
|
m_TaskUse = false;
|
||||||
m_Link.clear();
|
m_Link.clear();
|
||||||
m_LinkBody.clear();
|
m_LinkBody.clear();
|
||||||
@@ -194,32 +192,32 @@ void EQEmu::SayLinkEngine::generate_body()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_Proxy_unknown_1)
|
if (m_LinkProxyStruct.action_id)
|
||||||
m_LinkBodyStruct.unknown_1 = m_Proxy_unknown_1;
|
m_LinkBodyStruct.action_id = m_LinkProxyStruct.action_id;
|
||||||
if (m_ProxyItemID)
|
if (m_LinkProxyStruct.item_id)
|
||||||
m_LinkBodyStruct.item_id = m_ProxyItemID;
|
m_LinkBodyStruct.item_id = m_LinkProxyStruct.item_id;
|
||||||
if (m_ProxyAugment1ID)
|
if (m_LinkProxyStruct.augment_1)
|
||||||
m_LinkBodyStruct.augment_1 = m_ProxyAugment1ID;
|
m_LinkBodyStruct.augment_1 = m_LinkProxyStruct.augment_1;
|
||||||
if (m_ProxyAugment2ID)
|
if (m_LinkProxyStruct.augment_2)
|
||||||
m_LinkBodyStruct.augment_2 = m_ProxyAugment2ID;
|
m_LinkBodyStruct.augment_2 = m_LinkProxyStruct.augment_2;
|
||||||
if (m_ProxyAugment3ID)
|
if (m_LinkProxyStruct.augment_3)
|
||||||
m_LinkBodyStruct.augment_3 = m_ProxyAugment3ID;
|
m_LinkBodyStruct.augment_3 = m_LinkProxyStruct.augment_3;
|
||||||
if (m_ProxyAugment4ID)
|
if (m_LinkProxyStruct.augment_4)
|
||||||
m_LinkBodyStruct.augment_4 = m_ProxyAugment4ID;
|
m_LinkBodyStruct.augment_4 = m_LinkProxyStruct.augment_4;
|
||||||
if (m_ProxyAugment5ID)
|
if (m_LinkProxyStruct.augment_5)
|
||||||
m_LinkBodyStruct.augment_5 = m_ProxyAugment5ID;
|
m_LinkBodyStruct.augment_5 = m_LinkProxyStruct.augment_5;
|
||||||
if (m_ProxyAugment6ID)
|
if (m_LinkProxyStruct.augment_6)
|
||||||
m_LinkBodyStruct.augment_6 = m_ProxyAugment6ID;
|
m_LinkBodyStruct.augment_6 = m_LinkProxyStruct.augment_6;
|
||||||
if (m_ProxyIsEvolving)
|
if (m_LinkProxyStruct.is_evolving)
|
||||||
m_LinkBodyStruct.is_evolving = m_ProxyIsEvolving;
|
m_LinkBodyStruct.is_evolving = m_LinkProxyStruct.is_evolving;
|
||||||
if (m_ProxyEvolveGroup)
|
if (m_LinkProxyStruct.evolve_group)
|
||||||
m_LinkBodyStruct.evolve_group = m_ProxyEvolveGroup;
|
m_LinkBodyStruct.evolve_group = m_LinkProxyStruct.evolve_group;
|
||||||
if (m_ProxyEvolveLevel)
|
if (m_LinkProxyStruct.evolve_level)
|
||||||
m_LinkBodyStruct.evolve_level = m_ProxyEvolveLevel;
|
m_LinkBodyStruct.evolve_level = m_LinkProxyStruct.evolve_level;
|
||||||
if (m_ProxyOrnamentIcon)
|
if (m_LinkProxyStruct.ornament_icon)
|
||||||
m_LinkBodyStruct.ornament_icon = m_ProxyOrnamentIcon;
|
m_LinkBodyStruct.ornament_icon = m_LinkProxyStruct.ornament_icon;
|
||||||
if (m_ProxyHash)
|
if (m_LinkProxyStruct.hash)
|
||||||
m_LinkBodyStruct.hash = m_ProxyHash;
|
m_LinkBodyStruct.hash = m_LinkProxyStruct.hash;
|
||||||
|
|
||||||
|
|
||||||
if (m_TaskUse)
|
if (m_TaskUse)
|
||||||
@@ -227,7 +225,7 @@ void EQEmu::SayLinkEngine::generate_body()
|
|||||||
|
|
||||||
m_LinkBody = StringFormat(
|
m_LinkBody = StringFormat(
|
||||||
"%1X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%1X" "%04X" "%02X" "%05X" "%08X",
|
"%1X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%1X" "%04X" "%02X" "%05X" "%08X",
|
||||||
(0x0F & m_LinkBodyStruct.unknown_1),
|
(0x0F & m_LinkBodyStruct.action_id),
|
||||||
(0x000FFFFF & m_LinkBodyStruct.item_id),
|
(0x000FFFFF & m_LinkBodyStruct.item_id),
|
||||||
(0x000FFFFF & m_LinkBodyStruct.augment_1),
|
(0x000FFFFF & m_LinkBodyStruct.augment_1),
|
||||||
(0x000FFFFF & m_LinkBodyStruct.augment_2),
|
(0x000FFFFF & m_LinkBodyStruct.augment_2),
|
||||||
@@ -245,8 +243,8 @@ void EQEmu::SayLinkEngine::generate_body()
|
|||||||
|
|
||||||
void EQEmu::SayLinkEngine::generate_text()
|
void EQEmu::SayLinkEngine::generate_text()
|
||||||
{
|
{
|
||||||
if (m_ProxyText != nullptr) {
|
if (m_LinkProxyStruct.text != nullptr) {
|
||||||
m_LinkText = m_ProxyText;
|
m_LinkText = m_LinkProxyStruct.text;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+28
-37
@@ -47,7 +47,7 @@ namespace EQEmu
|
|||||||
} /*saylink*/
|
} /*saylink*/
|
||||||
|
|
||||||
struct SayLinkBody_Struct {
|
struct SayLinkBody_Struct {
|
||||||
uint8 unknown_1; /* %1X */
|
uint8 action_id; /* %1X */
|
||||||
uint32 item_id; /* %05X */
|
uint32 item_id; /* %05X */
|
||||||
uint32 augment_1; /* %05X */
|
uint32 augment_1; /* %05X */
|
||||||
uint32 augment_2; /* %05X */
|
uint32 augment_2; /* %05X */
|
||||||
@@ -56,13 +56,18 @@ namespace EQEmu
|
|||||||
uint32 augment_5; /* %05X */
|
uint32 augment_5; /* %05X */
|
||||||
uint32 augment_6; /* %05X */
|
uint32 augment_6; /* %05X */
|
||||||
uint8 is_evolving; /* %1X */
|
uint8 is_evolving; /* %1X */
|
||||||
uint32 evolve_group; /* %05X */
|
uint32 evolve_group; /* %04X */
|
||||||
uint8 evolve_level; /* %02X */
|
uint8 evolve_level; /* %02X */
|
||||||
uint32 ornament_icon; /* %05X */
|
uint32 ornament_icon; /* %05X */
|
||||||
int hash; /* %08X */
|
uint32 hash; /* %08X */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SayLinkProxy_Struct : SayLinkBody_Struct {
|
||||||
|
const char* text;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SayLinkEngine {
|
class SayLinkEngine {
|
||||||
|
// TODO: consider methods for direct 'saylink' assignments
|
||||||
public:
|
public:
|
||||||
SayLinkEngine();
|
SayLinkEngine();
|
||||||
|
|
||||||
@@ -72,29 +77,29 @@ namespace EQEmu
|
|||||||
void SetItemInst(const ItemInstance* item_inst) { m_ItemInst = item_inst; }
|
void SetItemInst(const ItemInstance* item_inst) { m_ItemInst = item_inst; }
|
||||||
|
|
||||||
// mainly for saylinks..but, not limited to
|
// mainly for saylinks..but, not limited to
|
||||||
void SetProxyUnknown1(uint8 proxy_unknown_1) { m_Proxy_unknown_1 = proxy_unknown_1; }
|
void SetProxyActionID(uint8 proxy_action_id) { m_LinkProxyStruct.action_id = proxy_action_id; } // should always be '0'
|
||||||
void SetProxyItemID(uint32 proxy_item_id) { m_ProxyItemID = proxy_item_id; }
|
void SetProxyItemID(uint32 proxy_item_id) { m_LinkProxyStruct.item_id = proxy_item_id; }
|
||||||
void SetProxyAugment1ID(uint32 proxy_augment_id) { m_ProxyAugment1ID = proxy_augment_id; }
|
void SetProxyAugment1ID(uint32 proxy_augment_id) { m_LinkProxyStruct.augment_1 = proxy_augment_id; }
|
||||||
void SetProxyAugment2ID(uint32 proxy_augment_id) { m_ProxyAugment2ID = proxy_augment_id; }
|
void SetProxyAugment2ID(uint32 proxy_augment_id) { m_LinkProxyStruct.augment_2 = proxy_augment_id; }
|
||||||
void SetProxyAugment3ID(uint32 proxy_augment_id) { m_ProxyAugment3ID = proxy_augment_id; }
|
void SetProxyAugment3ID(uint32 proxy_augment_id) { m_LinkProxyStruct.augment_3 = proxy_augment_id; }
|
||||||
void SetProxyAugment4ID(uint32 proxy_augment_id) { m_ProxyAugment4ID = proxy_augment_id; }
|
void SetProxyAugment4ID(uint32 proxy_augment_id) { m_LinkProxyStruct.augment_4 = proxy_augment_id; }
|
||||||
void SetProxyAugment5ID(uint32 proxy_augment_id) { m_ProxyAugment5ID = proxy_augment_id; }
|
void SetProxyAugment5ID(uint32 proxy_augment_id) { m_LinkProxyStruct.augment_5 = proxy_augment_id; }
|
||||||
void SetProxyAugment6ID(uint32 proxy_augment_id) { m_ProxyAugment6ID = proxy_augment_id; }
|
void SetProxyAugment6ID(uint32 proxy_augment_id) { m_LinkProxyStruct.augment_6 = proxy_augment_id; }
|
||||||
void SetProxyIsEvolving(uint8 proxy_is_evolving) { m_ProxyIsEvolving = proxy_is_evolving; }
|
void SetProxyIsEvolving(uint8 proxy_is_evolving) { m_LinkProxyStruct.is_evolving = proxy_is_evolving; }
|
||||||
void SetProxyEvolveGroup(uint32 proxy_evolve_group) { m_ProxyEvolveGroup = proxy_evolve_group; }
|
void SetProxyEvolveGroup(uint32 proxy_evolve_group) { m_LinkProxyStruct.evolve_group = proxy_evolve_group; }
|
||||||
void SetProxyEvolveLevel(uint8 proxy_evolve_level) { m_ProxyEvolveLevel = proxy_evolve_level; }
|
void SetProxyEvolveLevel(uint8 proxy_evolve_level) { m_LinkProxyStruct.evolve_level = proxy_evolve_level; }
|
||||||
void SetProxyOrnamentIcon(uint32 proxy_ornament_icon) { m_ProxyOrnamentIcon = proxy_ornament_icon; }
|
void SetProxyOrnamentIcon(uint32 proxy_ornament_icon) { m_LinkProxyStruct.ornament_icon = proxy_ornament_icon; }
|
||||||
void SetProxyHash(int proxy_hash) { m_ProxyHash = proxy_hash; }
|
void SetProxyHash(uint32 proxy_hash) { m_LinkProxyStruct.hash = proxy_hash; }
|
||||||
|
|
||||||
void SetProxyText(const char* proxy_text) { m_ProxyText = proxy_text; } // overrides standard text use
|
void SetProxyText(const char* proxy_text) { m_LinkProxyStruct.text = proxy_text; } // overrides standard text use
|
||||||
void SetTaskUse() { m_TaskUse = true; }
|
void SetTaskUse() { m_TaskUse = true; }
|
||||||
|
|
||||||
std::string GenerateLink();
|
const std::string& GenerateLink();
|
||||||
bool LinkError() { return m_Error; }
|
bool LinkError() { return m_Error; }
|
||||||
|
|
||||||
std::string Link() { return m_Link; } // contains full string format: '/12x' '<LinkBody>' '<LinkText>' '/12x'
|
const std::string& Link() { return m_Link; } // contains full string format: '\x12' '<LinkBody>' '<LinkText>' '\x12'
|
||||||
std::string LinkBody() { return m_LinkBody; } // contains string format: '<LinkBody>'
|
const std::string& LinkBody() { return m_LinkBody; } // contains string format: '<LinkBody>'
|
||||||
std::string LinkText() { return m_LinkText; } // contains string format: '<LinkText>'
|
const std::string& LinkText() { return m_LinkText; } // contains string format: '<LinkText>'
|
||||||
|
|
||||||
void Reset();
|
void Reset();
|
||||||
|
|
||||||
@@ -106,23 +111,9 @@ namespace EQEmu
|
|||||||
const ItemData* m_ItemData;
|
const ItemData* m_ItemData;
|
||||||
const ServerLootItem_Struct* m_LootData;
|
const ServerLootItem_Struct* m_LootData;
|
||||||
const ItemInstance* m_ItemInst;
|
const ItemInstance* m_ItemInst;
|
||||||
|
|
||||||
uint8 m_Proxy_unknown_1;
|
|
||||||
uint32 m_ProxyItemID;
|
|
||||||
uint32 m_ProxyAugment1ID;
|
|
||||||
uint32 m_ProxyAugment2ID;
|
|
||||||
uint32 m_ProxyAugment3ID;
|
|
||||||
uint32 m_ProxyAugment4ID;
|
|
||||||
uint32 m_ProxyAugment5ID;
|
|
||||||
uint32 m_ProxyAugment6ID;
|
|
||||||
uint8 m_ProxyIsEvolving;
|
|
||||||
uint32 m_ProxyEvolveGroup;
|
|
||||||
uint8 m_ProxyEvolveLevel;
|
|
||||||
uint32 m_ProxyOrnamentIcon;
|
|
||||||
int m_ProxyHash;
|
|
||||||
const char* m_ProxyText;
|
|
||||||
bool m_TaskUse;
|
|
||||||
SayLinkBody_Struct m_LinkBodyStruct;
|
SayLinkBody_Struct m_LinkBodyStruct;
|
||||||
|
SayLinkProxy_Struct m_LinkProxyStruct;
|
||||||
|
bool m_TaskUse;
|
||||||
std::string m_Link;
|
std::string m_Link;
|
||||||
std::string m_LinkBody;
|
std::string m_LinkBody;
|
||||||
std::string m_LinkText;
|
std::string m_LinkText;
|
||||||
|
|||||||
@@ -189,6 +189,9 @@
|
|||||||
#define ServerOP_ReloadWorld 0x4009
|
#define ServerOP_ReloadWorld 0x4009
|
||||||
#define ServerOP_ReloadLogs 0x4010
|
#define ServerOP_ReloadLogs 0x4010
|
||||||
#define ServerOP_ReloadPerlExportSettings 0x4011
|
#define ServerOP_ReloadPerlExportSettings 0x4011
|
||||||
|
#define ServerOP_CZSetEntityVariableByClientName 0x4012
|
||||||
|
#define ServerOP_UCSServerStatusRequest 0x4013
|
||||||
|
#define ServerOP_UCSServerStatusReply 0x4014
|
||||||
/* Query Server OP Codes */
|
/* Query Server OP Codes */
|
||||||
#define ServerOP_QSPlayerLogTrades 0x5010
|
#define ServerOP_QSPlayerLogTrades 0x5010
|
||||||
#define ServerOP_QSPlayerLogHandins 0x5011
|
#define ServerOP_QSPlayerLogHandins 0x5011
|
||||||
@@ -1263,6 +1266,12 @@ struct CZSetEntVarByNPCTypeID_Struct {
|
|||||||
char m_var[256];
|
char m_var[256];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct CZSetEntVarByClientName_Struct {
|
||||||
|
char CharName[64];
|
||||||
|
char id[256];
|
||||||
|
char m_var[256];
|
||||||
|
};
|
||||||
|
|
||||||
struct ReloadWorld_Struct{
|
struct ReloadWorld_Struct{
|
||||||
uint32 Option;
|
uint32 Option;
|
||||||
};
|
};
|
||||||
@@ -1271,6 +1280,17 @@ struct ServerRequestTellQueue_Struct {
|
|||||||
char name[64];
|
char name[64];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct UCSServerStatus_Struct {
|
||||||
|
uint8 available; // non-zero=true, 0=false
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
uint16 port;
|
||||||
|
uint16 unused;
|
||||||
|
};
|
||||||
|
uint32 timestamp;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+38
-2
@@ -110,6 +110,41 @@ uint32 SharedDatabase::GetTotalTimeEntitledOnAccount(uint32 AccountID) {
|
|||||||
return EntitledTime;
|
return EntitledTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SharedDatabase::SetMailKey(int CharID, int IPAddress, int MailKey)
|
||||||
|
{
|
||||||
|
char MailKeyString[17];
|
||||||
|
|
||||||
|
if (RuleB(Chat, EnableMailKeyIPVerification) == true)
|
||||||
|
sprintf(MailKeyString, "%08X%08X", IPAddress, MailKey);
|
||||||
|
else
|
||||||
|
sprintf(MailKeyString, "%08X", MailKey);
|
||||||
|
|
||||||
|
std::string query = StringFormat("UPDATE character_data SET mailkey = '%s' WHERE id = '%i'",
|
||||||
|
MailKeyString, CharID);
|
||||||
|
auto results = QueryDatabase(query);
|
||||||
|
if (!results.Success())
|
||||||
|
Log(Logs::General, Logs::Error, "SharedDatabase::SetMailKey(%i, %s) : %s", CharID, MailKeyString, results.ErrorMessage().c_str());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string SharedDatabase::GetMailKey(int CharID, bool key_only)
|
||||||
|
{
|
||||||
|
std::string query = StringFormat("SELECT `mailkey` FROM `character_data` WHERE `id`='%i' LIMIT 1", CharID);
|
||||||
|
auto results = QueryDatabase(query);
|
||||||
|
if (!results.Success()) {
|
||||||
|
Log(Logs::Detail, Logs::MySQLError, "Error retrieving mailkey from database: %s", results.ErrorMessage().c_str());
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto row = results.begin();
|
||||||
|
std::string mail_key = row[0];
|
||||||
|
|
||||||
|
if (mail_key.length() > 8 && key_only)
|
||||||
|
return mail_key.substr(8);
|
||||||
|
else
|
||||||
|
return mail_key;
|
||||||
|
}
|
||||||
|
|
||||||
bool SharedDatabase::SaveCursor(uint32 char_id, std::list<EQEmu::ItemInstance*>::const_iterator &start, std::list<EQEmu::ItemInstance*>::const_iterator &end)
|
bool SharedDatabase::SaveCursor(uint32 char_id, std::list<EQEmu::ItemInstance*>::const_iterator &start, std::list<EQEmu::ItemInstance*>::const_iterator &end)
|
||||||
{
|
{
|
||||||
// Delete cursor items
|
// Delete cursor items
|
||||||
@@ -1674,6 +1709,7 @@ void SharedDatabase::LoadSpells(void *data, int max_spells) {
|
|||||||
for (y = 0; y < 16; y++)
|
for (y = 0; y < 16; y++)
|
||||||
sp[tempid].deities[y]=atoi(row[126+y]);
|
sp[tempid].deities[y]=atoi(row[126+y]);
|
||||||
|
|
||||||
|
sp[tempid].new_icon=atoi(row[144]);
|
||||||
sp[tempid].uninterruptable=atoi(row[146]) != 0;
|
sp[tempid].uninterruptable=atoi(row[146]) != 0;
|
||||||
sp[tempid].ResistDiff=atoi(row[147]);
|
sp[tempid].ResistDiff=atoi(row[147]);
|
||||||
sp[tempid].dot_stacking_exempt = atoi(row[148]) != 0;
|
sp[tempid].dot_stacking_exempt = atoi(row[148]) != 0;
|
||||||
@@ -1816,8 +1852,8 @@ void SharedDatabase::LoadBaseData(void *data, int max_level) {
|
|||||||
bd->base_hp = atof(row[2]);
|
bd->base_hp = atof(row[2]);
|
||||||
bd->base_mana = atof(row[3]);
|
bd->base_mana = atof(row[3]);
|
||||||
bd->base_end = atof(row[4]);
|
bd->base_end = atof(row[4]);
|
||||||
bd->unk1 = atof(row[5]);
|
bd->hp_regen = atof(row[5]);
|
||||||
bd->unk2 = atof(row[6]);
|
bd->end_regen = atof(row[6]);
|
||||||
bd->hp_factor = atof(row[7]);
|
bd->hp_factor = atof(row[7]);
|
||||||
bd->mana_factor = atof(row[8]);
|
bd->mana_factor = atof(row[8]);
|
||||||
bd->endurance_factor = atof(row[9]);
|
bd->endurance_factor = atof(row[9]);
|
||||||
|
|||||||
@@ -72,6 +72,8 @@ class SharedDatabase : public Database
|
|||||||
void SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* message);
|
void SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* message);
|
||||||
bool GetCommandSettings(std::map<std::string, std::pair<uint8, std::vector<std::string>>> &command_settings);
|
bool GetCommandSettings(std::map<std::string, std::pair<uint8, std::vector<std::string>>> &command_settings);
|
||||||
uint32 GetTotalTimeEntitledOnAccount(uint32 AccountID);
|
uint32 GetTotalTimeEntitledOnAccount(uint32 AccountID);
|
||||||
|
void SetMailKey(int CharID, int IPAddress, int MailKey);
|
||||||
|
std::string GetMailKey(int CharID, bool key_only = false);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Character InventoryProfile
|
Character InventoryProfile
|
||||||
|
|||||||
+1
-2
@@ -244,8 +244,7 @@ bool IsBeneficialSpell(uint16 spell_id)
|
|||||||
} else {
|
} else {
|
||||||
// If the resisttype is not magic and spell is Bind Sight or Cast Sight
|
// If the resisttype is not magic and spell is Bind Sight or Cast Sight
|
||||||
// It's not beneficial
|
// It's not beneficial
|
||||||
if (sai == SAI_Dispell_Sight && spells[spell_id].skill == 18 &&
|
if ((sai == SAI_Calm && IsEffectInSpell(spell_id, SE_Harmony)) || (sai == SAI_Calm_Song && IsEffectInSpell(spell_id, SE_BindSight)) || (sai == SAI_Dispell_Sight && spells[spell_id].skill == 18 && !IsEffectInSpell(spell_id, SE_VoiceGraft)))
|
||||||
!IsEffectInSpell(spell_id, SE_VoiceGraft))
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-5
@@ -73,6 +73,8 @@ enum SpellTypes : uint32
|
|||||||
SpellTypes_Detrimental = (SpellType_Nuke | SpellType_Root | SpellType_Lifetap | SpellType_Snare | SpellType_DOT | SpellType_Dispel | SpellType_Mez | SpellType_Charm | SpellType_Debuff | SpellType_Slow),
|
SpellTypes_Detrimental = (SpellType_Nuke | SpellType_Root | SpellType_Lifetap | SpellType_Snare | SpellType_DOT | SpellType_Dispel | SpellType_Mez | SpellType_Charm | SpellType_Debuff | SpellType_Slow),
|
||||||
SpellTypes_Beneficial = (SpellType_Heal | SpellType_Buff | SpellType_Escape | SpellType_Pet | SpellType_InCombatBuff | SpellType_Cure | SpellType_HateRedux | SpellType_InCombatBuffSong | SpellType_OutOfCombatBuffSong | SpellType_PreCombatBuff | SpellType_PreCombatBuffSong),
|
SpellTypes_Beneficial = (SpellType_Heal | SpellType_Buff | SpellType_Escape | SpellType_Pet | SpellType_InCombatBuff | SpellType_Cure | SpellType_HateRedux | SpellType_InCombatBuffSong | SpellType_OutOfCombatBuffSong | SpellType_PreCombatBuff | SpellType_PreCombatBuffSong),
|
||||||
|
|
||||||
|
SpellTypes_Innate = (SpellType_Nuke | SpellType_Lifetap | SpellType_DOT | SpellType_Dispel | SpellType_Mez | SpellType_Slow | SpellType_Debuff | SpellType_Charm | SpellType_Root),
|
||||||
|
|
||||||
SpellType_Any = 0xFFFFFFFF
|
SpellType_Any = 0xFFFFFFFF
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -131,6 +133,11 @@ enum SpellAffectIndex {
|
|||||||
SAI_NPC_Special_80 = 80,
|
SAI_NPC_Special_80 = 80,
|
||||||
SAI_Trap_Lock = 88
|
SAI_Trap_Lock = 88
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class GlobalGroup {
|
||||||
|
Lich = 46,
|
||||||
|
};
|
||||||
|
|
||||||
enum RESISTTYPE
|
enum RESISTTYPE
|
||||||
{
|
{
|
||||||
RESIST_NONE = 0,
|
RESIST_NONE = 0,
|
||||||
@@ -562,9 +569,9 @@ typedef enum {
|
|||||||
#define SE_LimitManaMin 348 // implemented
|
#define SE_LimitManaMin 348 // implemented
|
||||||
#define SE_ShieldEquipDmgMod 349 // implemented[AA] Increase melee base damage (indirectly increasing hate) when wearing a shield.
|
#define SE_ShieldEquipDmgMod 349 // implemented[AA] Increase melee base damage (indirectly increasing hate) when wearing a shield.
|
||||||
#define SE_ManaBurn 350 // implemented - Drains mana for damage/heal at a defined ratio up to a defined maximum amount of mana.
|
#define SE_ManaBurn 350 // implemented - Drains mana for damage/heal at a defined ratio up to a defined maximum amount of mana.
|
||||||
//#define SE_PersistentEffect 351 // *not implemented. creates a trap/totem that casts a spell (spell id + base1?) when anything comes near it. can probably make a beacon for this
|
#define SE_PersistentEffect 351 // *not implemented. creates a trap/totem that casts a spell (spell id + base1?) when anything comes near it. can probably make a beacon for this
|
||||||
//#define SE_IncreaseTrapCount 352 // *not implemented - looks to be some type of invulnerability? Test ITC (8755)
|
#define SE_IncreaseTrapCount 352 // *not implemented - looks to be some type of invulnerability? Test ITC (8755)
|
||||||
//#define SE_AdditionalAura 353 // *not implemented - allows use of more than 1 aura, aa effect
|
#define SE_AdditionalAura 353 // *not implemented - allows use of more than 1 aura, aa effect
|
||||||
//#define SE_DeactivateAllTraps 354 // *not implemented - looks to be some type of invulnerability? Test DAT (8757)
|
//#define SE_DeactivateAllTraps 354 // *not implemented - looks to be some type of invulnerability? Test DAT (8757)
|
||||||
//#define SE_LearnTrap 355 // *not implemented - looks to be some type of invulnerability? Test LT (8758)
|
//#define SE_LearnTrap 355 // *not implemented - looks to be some type of invulnerability? Test LT (8758)
|
||||||
//#define SE_ChangeTriggerType 356 // not used
|
//#define SE_ChangeTriggerType 356 // not used
|
||||||
@@ -757,7 +764,7 @@ struct SPDat_Spell_Struct
|
|||||||
// -- DIETY_BERTOXXULOUS ... DIETY_VEESHAN
|
// -- DIETY_BERTOXXULOUS ... DIETY_VEESHAN
|
||||||
/* 142 */ //int8 npc_no_cast; // 142: between 0 & 100 -- NPC_NO_CAST
|
/* 142 */ //int8 npc_no_cast; // 142: between 0 & 100 -- NPC_NO_CAST
|
||||||
/* 143 */ //int ai_pt_bonus; // 143: always set to 0, client doesn't save this -- AI_PT_BONUS
|
/* 143 */ //int ai_pt_bonus; // 143: always set to 0, client doesn't save this -- AI_PT_BONUS
|
||||||
/* 144 */ //int16 new_icon // Spell icon used by the client in uifiles/default/spells??.tga, both for spell gems & buff window. Looks to depreciate icon & memicon -- NEW_ICON
|
/* 144 */ int16 new_icon; // Spell icon used by the client in uifiles/default/spells??.tga, both for spell gems & buff window. Looks to depreciate icon & memicon -- NEW_ICON
|
||||||
/* 145 */ //int16 spellanim; // Doesn't look like it's the same as #doanim, so not sure what this is, particles I think -- SPELL_EFFECT_INDEX
|
/* 145 */ //int16 spellanim; // Doesn't look like it's the same as #doanim, so not sure what this is, particles I think -- SPELL_EFFECT_INDEX
|
||||||
/* 146 */ bool uninterruptable; // Looks like anything != 0 is uninterruptable. Values are mostly -1, 0, & 1 (Fetid Breath = 90?) -- NO_INTERRUPT
|
/* 146 */ bool uninterruptable; // Looks like anything != 0 is uninterruptable. Values are mostly -1, 0, & 1 (Fetid Breath = 90?) -- NO_INTERRUPT
|
||||||
/* 147 */ int16 ResistDiff; // -- RESIST_MOD
|
/* 147 */ int16 ResistDiff; // -- RESIST_MOD
|
||||||
@@ -965,7 +972,6 @@ bool IsCastWhileInvis(uint16 spell_id);
|
|||||||
bool IsEffectIgnoredInStacking(int spa);
|
bool IsEffectIgnoredInStacking(int spa);
|
||||||
|
|
||||||
int CalcPetHp(int levelb, int classb, int STA = 75);
|
int CalcPetHp(int levelb, int classb, int STA = 75);
|
||||||
const char *GetRandPetName();
|
|
||||||
int GetSpellEffectDescNum(uint16 spell_id);
|
int GetSpellEffectDescNum(uint16 spell_id);
|
||||||
DmgShieldType GetDamageShieldType(uint16 spell_id, int32 DSType = 0);
|
DmgShieldType GetDamageShieldType(uint16 spell_id, int32 DSType = 0);
|
||||||
bool DetrimentalSpellAllowsRest(uint16 spell_id);
|
bool DetrimentalSpellAllowsRest(uint16 spell_id);
|
||||||
|
|||||||
+1
-2
@@ -135,8 +135,7 @@ uint32 Timer::GetRemainingTime() {
|
|||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
return (start_time + timer_time) - current_time;
|
return (start_time + timer_time) - current_time;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return 0xFFFFFFFF;
|
return 0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-1
@@ -6,6 +6,10 @@
|
|||||||
#include <EXTERN.h>
|
#include <EXTERN.h>
|
||||||
#define WIN32IO_IS_STDIO
|
#define WIN32IO_IS_STDIO
|
||||||
|
|
||||||
|
// header to detect if libc++ is the std lib
|
||||||
|
// this doesn't do shit for C++ but libc++ and GCC 6.1+ use it to define some macros
|
||||||
|
#include <ciso646>
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
extern "C" { //the perl headers dont do this for us...
|
extern "C" { //the perl headers dont do this for us...
|
||||||
#endif
|
#endif
|
||||||
@@ -47,7 +51,7 @@ extern "C" { //the perl headers dont do this for us...
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
//These need to be cleaned up on FreeBSD
|
//These need to be cleaned up on FreeBSD
|
||||||
#ifdef __FreeBSD__
|
#if defined(__FreeBSD__) || defined(_LIBCPP_VERSION)
|
||||||
#ifdef do_open
|
#ifdef do_open
|
||||||
#undef do_open
|
#undef do_open
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+2
-2
@@ -30,9 +30,9 @@
|
|||||||
Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
|
Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define CURRENT_BINARY_DATABASE_VERSION 9110
|
#define CURRENT_BINARY_DATABASE_VERSION 9122
|
||||||
#ifdef BOTS
|
#ifdef BOTS
|
||||||
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9017
|
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9019
|
||||||
#else
|
#else
|
||||||
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 0 // must be 0
|
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 0 // must be 0
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -4,3 +4,4 @@ ENDIF(EQEMU_BUILD_LUA)
|
|||||||
|
|
||||||
ADD_SUBDIRECTORY(libuv)
|
ADD_SUBDIRECTORY(libuv)
|
||||||
ADD_SUBDIRECTORY(format)
|
ADD_SUBDIRECTORY(format)
|
||||||
|
ADD_SUBDIRECTORY(recast)
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
<!---
|
||||||
|
Please make sure you've followed the guidelines outlined in the CONTRIBUTING.rst file.
|
||||||
|
--->
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
bin/
|
||||||
|
/_CPack_Packages
|
||||||
|
/doc/doxyxml
|
||||||
|
/doc/html
|
||||||
|
virtualenv
|
||||||
|
/Testing
|
||||||
|
/install_manifest.txt
|
||||||
|
*~
|
||||||
|
*.a
|
||||||
|
*.so*
|
||||||
|
*.zip
|
||||||
|
cmake_install.cmake
|
||||||
|
CPack*.cmake
|
||||||
|
fmt-*.cmake
|
||||||
|
CTestTestfile.cmake
|
||||||
|
CMakeCache.txt
|
||||||
|
CMakeFiles
|
||||||
|
Makefile
|
||||||
|
run-msbuild.bat
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
language: cpp
|
language: cpp
|
||||||
|
dist: trusty
|
||||||
sudo: required # the doc target uses sudo to install dependencies
|
sudo: required # the doc target uses sudo to install dependencies
|
||||||
|
|
||||||
os:
|
os:
|
||||||
@@ -22,12 +23,5 @@ matrix:
|
|||||||
- os: osx
|
- os: osx
|
||||||
env: BUILD=Doc
|
env: BUILD=Doc
|
||||||
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- kubuntu-backports # cmake 2.8.12
|
|
||||||
packages:
|
|
||||||
- cmake
|
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- support/travis-build.py
|
- support/travis-build.py
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
message(STATUS "CMake version: ${CMAKE_VERSION}")
|
message(STATUS "CMake version: ${CMAKE_VERSION}")
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 2.8)
|
cmake_minimum_required(VERSION 2.8.12)
|
||||||
|
|
||||||
# Determine if fmt is built as a subproject (using add_subdirectory)
|
# Determine if fmt is built as a subproject (using add_subdirectory)
|
||||||
# or if it is the master project.
|
# or if it is the master project.
|
||||||
@@ -9,12 +9,22 @@ if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
|
|||||||
set(MASTER_PROJECT ON)
|
set(MASTER_PROJECT ON)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
# Joins arguments and places the results in ${result_var}.
|
||||||
|
function(join result_var)
|
||||||
|
set(result )
|
||||||
|
foreach (arg ${ARGN})
|
||||||
|
set(result "${result}${arg}")
|
||||||
|
endforeach ()
|
||||||
|
set(${result_var} "${result}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
# Set the default CMAKE_BUILD_TYPE to Release.
|
# Set the default CMAKE_BUILD_TYPE to Release.
|
||||||
# This should be done before the project command since the latter can set
|
# This should be done before the project command since the latter can set
|
||||||
# CMAKE_BUILD_TYPE itself (it does so for nmake).
|
# CMAKE_BUILD_TYPE itself (it does so for nmake).
|
||||||
if (NOT CMAKE_BUILD_TYPE)
|
if (NOT CMAKE_BUILD_TYPE)
|
||||||
set(CMAKE_BUILD_TYPE Release CACHE STRING
|
join(doc "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or "
|
||||||
"Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.")
|
"CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.")
|
||||||
|
set(CMAKE_BUILD_TYPE Release CACHE STRING ${doc})
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
option(FMT_PEDANTIC "Enable extra warnings and expensive tests." OFF)
|
option(FMT_PEDANTIC "Enable extra warnings and expensive tests." OFF)
|
||||||
@@ -28,13 +38,17 @@ option(FMT_USE_CPP11 "Enable the addition of C++11 compiler flags." ON)
|
|||||||
project(FMT)
|
project(FMT)
|
||||||
|
|
||||||
# Starting with cmake 3.0 VERSION is part of the project command.
|
# Starting with cmake 3.0 VERSION is part of the project command.
|
||||||
set(FMT_VERSION 3.0.0)
|
file(READ fmt/format.h format_h)
|
||||||
if (NOT FMT_VERSION MATCHES "^([0-9]+).([0-9]+).([0-9]+)$")
|
if (NOT format_h MATCHES "FMT_VERSION ([0-9]+)([0-9][0-9])([0-9][0-9])")
|
||||||
message(FATAL_ERROR "Invalid version format ${FMT_VERSION}.")
|
message(FATAL_ERROR "Cannot get FMT_VERSION from format.h.")
|
||||||
endif ()
|
endif ()
|
||||||
set(CPACK_PACKAGE_VERSION_MAJOR ${CMAKE_MATCH_1})
|
# Use math to skip leading zeros if any.
|
||||||
set(CPACK_PACKAGE_VERSION_MINOR ${CMAKE_MATCH_2})
|
math(EXPR CPACK_PACKAGE_VERSION_MAJOR ${CMAKE_MATCH_1})
|
||||||
set(CPACK_PACKAGE_VERSION_PATCH ${CMAKE_MATCH_3})
|
math(EXPR CPACK_PACKAGE_VERSION_MINOR ${CMAKE_MATCH_2})
|
||||||
|
math(EXPR CPACK_PACKAGE_VERSION_PATCH ${CMAKE_MATCH_3})
|
||||||
|
join(FMT_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.
|
||||||
|
${CPACK_PACKAGE_VERSION_PATCH})
|
||||||
|
message(STATUS "Version: ${FMT_VERSION}")
|
||||||
|
|
||||||
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
|
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
Contributing to fmt
|
||||||
|
===================
|
||||||
|
|
||||||
|
All C++ code must adhere to `Google C++ Style Guide
|
||||||
|
<https://google.github.io/styleguide/cppguide.html>`_ with the following
|
||||||
|
exceptions:
|
||||||
|
|
||||||
|
* Exceptions are permitted
|
||||||
|
* snake_case should be used instead of UpperCamelCase for function names
|
||||||
|
|
||||||
|
Thanks for contributing!
|
||||||
@@ -1,3 +1,113 @@
|
|||||||
|
4.0.0 - 2017-06-27
|
||||||
|
------------------
|
||||||
|
|
||||||
|
* Removed old compatibility headers ``cppformat/*.h`` and CMake options (`#527 <https://github.com/pull/527>`_). Thanks `@maddinat0r (Alex Martin) <https://github.com/maddinat0r>`_.
|
||||||
|
|
||||||
|
* Added ``string.h`` containing ``fmt::to_string()`` as alternative to ``std::to_string()`` as well as other string writer functionality (`#326 <https://github.com/fmtlib/fmt/issues/326>`_ and `#441 <https://github.com/fmtlib/fmt/pull/441>`_):
|
||||||
|
|
||||||
|
.. code:: c++
|
||||||
|
|
||||||
|
#include "fmt/string.h"
|
||||||
|
|
||||||
|
std::string answer = fmt::to_string(42);
|
||||||
|
|
||||||
|
Thanks to `@glebov-andrey (Andrey Glebov) <https://github.com/glebov-andrey>`_.
|
||||||
|
|
||||||
|
* Moved ``fmt::printf()`` to new ``printf.h`` header and allowed ``%s`` as generic specifier (`#453 <https://github.com/fmtlib/fmt/pull/453>`_), made ``%.f`` more conformant to regular ``printf()`` (`#490 <https://github.com/fmtlib/fmt/pull/490>`_), added custom writer support (`#476 <https://github.com/fmtlib/fmt/issues/476>`_) and implemented missing custom argument formatting (`#339 <https://github.com/fmtlib/fmt/pull/339>`_ and `#340 <https://github.com/fmtlib/fmt/pull/340>`_):
|
||||||
|
|
||||||
|
.. code:: c++
|
||||||
|
|
||||||
|
#include "fmt/printf.h"
|
||||||
|
|
||||||
|
// %s format specifier can be used with any argument type.
|
||||||
|
fmt::printf("%s", 42);
|
||||||
|
|
||||||
|
Thanks `@mojoBrendan <https://github.com/mojoBrendan>`_, `@manylegged (Arthur Danskin) <https://github.com/manylegged>`_ and `@spacemoose (Glen Stark) <https://github.com/spacemoose>`_. See also `#360 <https://github.com/fmtlib/fmt/issues/360>`_, `#335 <https://github.com/fmtlib/fmt/issues/335>`_ and `#331 <https://github.com/fmtlib/fmt/issues/331>`_.
|
||||||
|
|
||||||
|
* Added ``container.h`` containing a ``BasicContainerWriter`` to write to containers like ``std::vector`` (`#450 <https://github.com/fmtlib/fmt/pull/450>`_). Thanks `@polyvertex (Jean-Charles Lefebvre) <https://github.com/polyvertex>`_.
|
||||||
|
|
||||||
|
* Added ``fmt::join()`` function that takes a range and formats its elements separated by a given string (`#466 <https://github.com/fmtlib/fmt/pull/466>`_):
|
||||||
|
|
||||||
|
.. code:: c++
|
||||||
|
|
||||||
|
#include "fmt/format.h"
|
||||||
|
|
||||||
|
std::vector<double> v = {1.2, 3.4, 5.6};
|
||||||
|
// Prints "(+01.20, +03.40, +05.60)".
|
||||||
|
fmt::print("({:+06.2f})", fmt::join(v.begin(), v.end(), ", "));
|
||||||
|
|
||||||
|
Thanks `@olivier80 <https://github.com/olivier80>`_.
|
||||||
|
|
||||||
|
* Added support for custom formatting specifications to simplify customization of built-in formatting (`#444 <https://github.com/fmtlib/fmt/pull/444>`_). Thanks `@polyvertex (Jean-Charles Lefebvre) <https://github.com/polyvertex>`_. See also `#439 <https://github.com/fmtlib/fmt/issues/439>`_.
|
||||||
|
|
||||||
|
* Added ``fmt::format_system_error()`` for error code formatting (`#323 <https://github.com/fmtlib/fmt/issues/323>`_ and `#526 <https://github.com/fmtlib/fmt/pull/526>`_). Thanks `@maddinat0r (Alex Martin) <https://github.com/maddinat0r>`_.
|
||||||
|
|
||||||
|
* Added thread-safe ``fmt::localtime()`` and ``fmt::gmtime()`` as replacement for the standard version to ``time.h`` (`#396 <https://github.com/fmtlib/fmt/pull/396>`_). Thanks `@codicodi <https://github.com/codicodi>`_.
|
||||||
|
|
||||||
|
* Internal improvements to ``NamedArg`` and ``ArgLists`` (`#389 <https://github.com/fmtlib/fmt/pull/389>`_ and `#390 <https://github.com/fmtlib/fmt/pull/390>`_). Thanks `@chronoxor <https://github.com/chronoxor>`_.
|
||||||
|
|
||||||
|
* Fixed crash due to bug in ``FormatBuf`` (`#493 <https://github.com/fmtlib/fmt/pull/493>`_). Thanks `@effzeh <https://github.com/effzeh>`_. See also `#480 <https://github.com/fmtlib/fmt/issues/480>`_ and `#491 <https://github.com/fmtlib/fmt/issues/491>`_.
|
||||||
|
|
||||||
|
* Fixed handling of wide strings in ``fmt::StringWriter``.
|
||||||
|
|
||||||
|
* Improved compiler error messages (`#357 <https://github.com/fmtlib/fmt/issues/357>`_).
|
||||||
|
|
||||||
|
* Fixed various warnings and issues with various compilers (`#494 <https://github.com/fmtlib/fmt/pull/494>`_, `#499 <https://github.com/fmtlib/fmt/pull/499>`_, `#483 <https://github.com/fmtlib/fmt/pull/483>`_, `#519 <https://github.com/fmtlib/fmt/pull/519>`_, `#485 <https://github.com/fmtlib/fmt/pull/485>`_, `#482 <https://github.com/fmtlib/fmt/pull/482>`_, `#475 <https://github.com/fmtlib/fmt/pull/475>`_, `#473 <https://github.com/fmtlib/fmt/pull/473>`_ and `#414 <https://github.com/fmtlib/fmt/pull/414>`_). Thanks `@chronoxor <https://github.com/chronoxor>`_, `@zhaohuaxishi <https://github.com/zhaohuaxishi>`_, `@pkestene (Pierre Kestener) <https://github.com/pkestene>`_, `@dschmidt (Dominik Schmidt) <https://github.com/dschmidt>`_ and `@0x414c (Alexey Gorishny) <https://github.com/0x414c>`_ .
|
||||||
|
|
||||||
|
* Improved CMake: targets are now namespaced (`#511 <https://github.com/fmtlib/fmt/pull/511>`_ and `#513 <https://github.com/fmtlib/fmt/pull/513>`_), supported header-only ``printf.h`` (`#354 <https://github.com/fmtlib/fmt/pull/354>`_), fixed issue with minimal supported library subset (`#418 <https://github.com/fmtlib/fmt/issues/418>`_, `#419 <https://github.com/fmtlib/fmt/pull/419>`_ and `#420 <https://github.com/fmtlib/fmt/pull/420>`_). Thanks `@bjoernthiel (Bjoern Thiel) <https://github.com/bjoernthiel>`_,
|
||||||
|
`@niosHD (Mario Werner) <https://github.com/niosHD>`_, `@LogicalKnight (Sean LK) <https://github.com/LogicalKnight>`_ and `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_.
|
||||||
|
|
||||||
|
* Improved documentation. Thanks to `@pwm1234 (Phil) <https://github.com/pwm1234>`_ for `#393 <https://github.com/fmtlib/fmt/pull/393>`_.
|
||||||
|
|
||||||
|
3.0.2 - 2017-06-14
|
||||||
|
------------------
|
||||||
|
|
||||||
|
* Added ``FMT_VERSION`` macro (`#411 <https://github.com/fmtlib/fmt/issues/411>`_).
|
||||||
|
|
||||||
|
* Used ``FMT_NULL`` instead of literal ``0`` (`#409 <https://github.com/fmtlib/fmt/pull/409>`_). Thanks `@alabuzhev (Alex Alabuzhev) <https://github.com/alabuzhev>`_.
|
||||||
|
|
||||||
|
* Added extern templates for ``format_float`` (`#413 <https://github.com/fmtlib/fmt/issues/413>`_).
|
||||||
|
|
||||||
|
* Fixed implicit conversion issue (`#507 <https://github.com/fmtlib/fmt/issues/507>`_).
|
||||||
|
|
||||||
|
* Fixed signbit detection (`#423 <https://github.com/fmtlib/fmt/issues/423>`_).
|
||||||
|
|
||||||
|
* Fixed naming collision (`#425 <https://github.com/fmtlib/fmt/issues/425>`_).
|
||||||
|
|
||||||
|
* Fixed missing intrinsic for C++/CLI (`#457 <https://github.com/fmtlib/fmt/pull/457>`_). Thanks `@calumr (Calum Robinson) <https://github.com/calumr>`_
|
||||||
|
|
||||||
|
* Fixed Android detection (`#458 <https://github.com/fmtlib/fmt/pull/458>`_). Thanks `@Gachapen (Magnus Bjerke Vik) <https://github.com/Gachapen>`_.
|
||||||
|
|
||||||
|
* Use lean ``windows.h`` if not in header-only mode (`#503 <https://github.com/fmtlib/fmt/pull/503>`_). Thanks `@Quentin01 (Quentin Buathier) <https://github.com/Quentin01>`_.
|
||||||
|
|
||||||
|
* Fixed issue with CMake exporting C++11 flag (`#445 <https://github.com/fmtlib/fmt/pull/455>`_). Thanks `@EricWF (Eric) <https://github.com/EricWF>`_.
|
||||||
|
|
||||||
|
* Fixed issue with nvcc and MSVC compiler bug and MinGW (`#505 <https://github.com/fmtlib/fmt/issues/505>`_).
|
||||||
|
|
||||||
|
* Fixed DLL issues (`#469 <https://github.com/fmtlib/fmt/pull/469>`_ and `#502 <https://github.com/fmtlib/fmt/pull/502>`_). Thanks `@richardeakin (Richard Eakin) <https://github.com/richardeakin>`_ and `@AndreasSchoenle (Andreas Schönle) <https://github.com/AndreasSchoenle>`_.
|
||||||
|
|
||||||
|
* Fixed test compilation under FreeBSD (`#433 <https://github.com/fmtlib/fmt/issues/433>`_).
|
||||||
|
|
||||||
|
* Fixed various warnings (`#403 <https://github.com/fmtlib/fmt/pull/403>`_, `#410 <https://github.com/fmtlib/fmt/pull/410>`_ and `#510 <https://github.com/fmtlib/fmt/pull/510>`_). Thanks `@Lecetem <https://github.com/Lectem>`_, `@chenhayat (Chen Hayat) <https://github.com/chenhayat>`_ and `@trozen <https://github.com/trozen>`_.
|
||||||
|
|
||||||
|
* Removed redundant include (`#479 <https://github.com/fmtlib/fmt/issues/479>`_).
|
||||||
|
|
||||||
|
* Fixed documentation issues.
|
||||||
|
|
||||||
|
3.0.1 - 2016-11-01
|
||||||
|
------------------
|
||||||
|
* Fixed handling of thousands seperator (`#353 <https://github.com/fmtlib/fmt/issues/353>`_)
|
||||||
|
|
||||||
|
* Fixed handling of ``unsigned char`` strings (`#373 <https://github.com/fmtlib/fmt/issues/373>`_)
|
||||||
|
|
||||||
|
* Corrected buffer growth when formatting time (`#367 <https://github.com/fmtlib/fmt/issues/367>`_)
|
||||||
|
|
||||||
|
* Removed warnings under MSVC and clang (`#318 <https://github.com/fmtlib/fmt/issues/318>`_, `#250 <https://github.com/fmtlib/fmt/issues/250>`_, also merged `#385 <https://github.com/fmtlib/fmt/pull/385>`_ and `#361 <https://github.com/fmtlib/fmt/pull/361>`_). Thanks `@jcelerier (Jean-Michaël Celerier) <https://github.com/jcelerier>`_ and `@nmoehrle (Nils Moehrle) <https://github.com/nmoehrle>`_.
|
||||||
|
|
||||||
|
* Fixed compilation issues under Android (`#327 <https://github.com/fmtlib/fmt/pull/327>`_, `#345 <https://github.com/fmtlib/fmt/issues/345>`_ and `#381 <https://github.com/fmtlib/fmt/pull/381>`_), FreeBSD (`#358 <https://github.com/fmtlib/fmt/pull/358>`_), Cygwin (`#388 <https://github.com/fmtlib/fmt/issues/388>`_), MinGW (`#355 <https://github.com/fmtlib/fmt/issues/355>`_) as well as other issues (`#350 <https://github.com/fmtlib/fmt/issues/350>`_, `#366 <https://github.com/fmtlib/fmt/issues/355>`_, `#348 <https://github.com/fmtlib/fmt/pull/348>`_, `#402 <https://github.com/fmtlib/fmt/pull/402>`_, `#405 <https://github.com/fmtlib/fmt/pull/405>`_). Thanks to `@dpantele (Dmitry) <https://github.com/dpantele>`_, `@hghwng (Hugh Wang) <https://github.com/hghwng>`_, `@arvedarved (Tilman Keskinöz) <https://github.com/arvedarved>`_, `@LogicalKnight (Sean) <https://github.com/LogicalKnight>`_ and `@JanHellwig (Jan Hellwig) <https://github.com/janhellwig>`_.
|
||||||
|
|
||||||
|
* Fixed some documentation issues and extended specification (`#320 <https://github.com/fmtlib/fmt/issues/320>`_, `#333 <https://github.com/fmtlib/fmt/pull/333>`_, `#347 <https://github.com/fmtlib/fmt/issues/347>`_, `#362 <https://github.com/fmtlib/fmt/pull/362>`_). Thanks to `@smellman (Taro Matsuzawa aka. btm) <https://github.com/smellman>`_.
|
||||||
|
|
||||||
3.0.0 - 2016-05-07
|
3.0.0 - 2016-05-07
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
|||||||
+28
-5
@@ -20,9 +20,11 @@ alternative to IOStreams.
|
|||||||
Features
|
Features
|
||||||
--------
|
--------
|
||||||
|
|
||||||
* Two APIs: faster concatenation-based write API and slower (but still
|
* Two APIs: faster concatenation-based `write API
|
||||||
very fast) replacement-based format API with positional arguments for
|
<http://fmtlib.net/latest/api.html#write-api>`_ and slower,
|
||||||
localization.
|
but still very fast, replacement-based `format API
|
||||||
|
<http://fmtlib.net/latest/api.html#format-api>`_ with positional arguments
|
||||||
|
for localization.
|
||||||
* Write API similar to the one used by IOStreams but stateless allowing
|
* Write API similar to the one used by IOStreams but stateless allowing
|
||||||
faster implementation.
|
faster implementation.
|
||||||
* Format API with `format string syntax
|
* Format API with `format string syntax
|
||||||
@@ -35,10 +37,10 @@ Features
|
|||||||
* Support for user-defined types.
|
* Support for user-defined types.
|
||||||
* High speed: performance of the format API is close to that of
|
* High speed: performance of the format API is close to that of
|
||||||
glibc's `printf <http://en.cppreference.com/w/cpp/io/c/fprintf>`_
|
glibc's `printf <http://en.cppreference.com/w/cpp/io/c/fprintf>`_
|
||||||
and better than performance of IOStreams. See `Speed tests`_ and
|
and better than the performance of IOStreams. See `Speed tests`_ and
|
||||||
`Fast integer to string conversion in C++
|
`Fast integer to string conversion in C++
|
||||||
<http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html>`_.
|
<http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html>`_.
|
||||||
* Small code size both in terms of source code (format consists of a single
|
* Small code size both in terms of source code (the core library consists of a single
|
||||||
header file and a single source file) and compiled code.
|
header file and a single source file) and compiled code.
|
||||||
See `Compile time and code bloat`_.
|
See `Compile time and code bloat`_.
|
||||||
* Reliability: the library has an extensive set of `unit tests
|
* Reliability: the library has an extensive set of `unit tests
|
||||||
@@ -89,6 +91,8 @@ An object of any user-defined type for which there is an overloaded
|
|||||||
|
|
||||||
.. code:: c++
|
.. code:: c++
|
||||||
|
|
||||||
|
#include "fmt/ostream.h"
|
||||||
|
|
||||||
class Date {
|
class Date {
|
||||||
int year_, month_, day_;
|
int year_, month_, day_;
|
||||||
public:
|
public:
|
||||||
@@ -132,6 +136,12 @@ Projects using this library
|
|||||||
* `AMPL/MP <https://github.com/ampl/mp>`_:
|
* `AMPL/MP <https://github.com/ampl/mp>`_:
|
||||||
An open-source library for mathematical programming
|
An open-source library for mathematical programming
|
||||||
|
|
||||||
|
* `CUAUV <http://cuauv.org/>`_: Cornell University's autonomous underwater vehicle
|
||||||
|
|
||||||
|
* `Drake <http://drake.mit.edu/>`_: A planning, control, and analysis toolbox for nonlinear dynamical systems (MIT)
|
||||||
|
|
||||||
|
* `Envoy <https://lyft.github.io/envoy/>`_: C++ L7 proxy and communication bus (Lyft)
|
||||||
|
|
||||||
* `HarpyWar/pvpgn <https://github.com/pvpgn/pvpgn-server>`_:
|
* `HarpyWar/pvpgn <https://github.com/pvpgn/pvpgn-server>`_:
|
||||||
Player vs Player Gaming Network with tweaks
|
Player vs Player Gaming Network with tweaks
|
||||||
|
|
||||||
@@ -139,6 +149,8 @@ Projects using this library
|
|||||||
|
|
||||||
* `Keypirinha <http://keypirinha.com/>`_: A semantic launcher for Windows
|
* `Keypirinha <http://keypirinha.com/>`_: A semantic launcher for Windows
|
||||||
|
|
||||||
|
* `Kodi <https://kodi.tv/>`_ (formerly xbmc): Home theater software
|
||||||
|
|
||||||
* `Lifeline <https://github.com/peter-clark/lifeline>`_: A 2D game
|
* `Lifeline <https://github.com/peter-clark/lifeline>`_: A 2D game
|
||||||
|
|
||||||
* `MongoDB Smasher <https://github.com/duckie/mongo_smasher>`_: A small tool to generate randomized datasets
|
* `MongoDB Smasher <https://github.com/duckie/mongo_smasher>`_: A small tool to generate randomized datasets
|
||||||
@@ -158,6 +170,12 @@ Projects using this library
|
|||||||
* `Salesforce Analytics Cloud <http://www.salesforce.com/analytics-cloud/overview/>`_:
|
* `Salesforce Analytics Cloud <http://www.salesforce.com/analytics-cloud/overview/>`_:
|
||||||
Business intelligence software
|
Business intelligence software
|
||||||
|
|
||||||
|
* `Scylla <http://www.scylladb.com/>`_: A Cassandra-compatible NoSQL data store that can handle
|
||||||
|
1 million transactions per second on a single server
|
||||||
|
|
||||||
|
* `Seastar <http://www.seastar-project.org/>`_: An advanced, open-source C++ framework for
|
||||||
|
high-performance server applications on modern hardware
|
||||||
|
|
||||||
* `spdlog <https://github.com/gabime/spdlog>`_: Super fast C++ logging library
|
* `spdlog <https://github.com/gabime/spdlog>`_: Super fast C++ logging library
|
||||||
|
|
||||||
* `Stellar <https://www.stellar.org/>`_: Financial platform
|
* `Stellar <https://www.stellar.org/>`_: Financial platform
|
||||||
@@ -390,6 +408,11 @@ It only applies if you distribute the documentation of fmt.
|
|||||||
Acknowledgments
|
Acknowledgments
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
The fmt library is maintained by Victor Zverovich (`vitaut <https://github.com/vitaut>`_)
|
||||||
|
and Jonathan Müller (`foonathan <https://github.com/foonathan>`_) with contributions from many
|
||||||
|
other people. See `Contributors <https://github.com/fmtlib/fmt/graphs/contributors>`_ and `Releases <https://github.com/fmtlib/fmt/releases>`_ for some of the names. Let us know if your contribution
|
||||||
|
is not listed or mentioned incorrectly and we'll make it right.
|
||||||
|
|
||||||
The benchmark section of this readme file and the performance tests are taken
|
The benchmark section of this readme file and the performance tests are taken
|
||||||
from the excellent `tinyformat <https://github.com/c42f/tinyformat>`_ library
|
from the excellent `tinyformat <https://github.com/c42f/tinyformat>`_ library
|
||||||
written by Chris Foster. Boost Format library is acknowledged transitively
|
written by Chris Foster. Boost Format library is acknowledged transitively
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
#include "../fmt/format.h"
|
|
||||||
#warning Including cppformat/format.h is deprecated. Include fmt/format.h instead.
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
#include "../fmt/posix.h"
|
|
||||||
#warning Including cppformat/posix.h is deprecated. Include fmt/posix.h instead.
|
|
||||||
@@ -5,6 +5,8 @@ if (NOT DOXYGEN)
|
|||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
add_custom_target(doc
|
add_custom_target(doc
|
||||||
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build.py ${FMT_VERSION})
|
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build.py ${FMT_VERSION}
|
||||||
|
SOURCES build.py conf.py _templates/layout.html)
|
||||||
|
|
||||||
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/ DESTINATION share/doc/fmt)
|
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/
|
||||||
|
DESTINATION share/doc/fmt OPTIONAL)
|
||||||
|
|||||||
Vendored
+28
@@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
/* -- breathe specific styles ----------------------------------------------- */
|
||||||
|
|
||||||
|
/* So enum value descriptions are displayed inline to the item */
|
||||||
|
.breatheenumvalues li tt + p {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* So parameter descriptions are displayed inline to the item */
|
||||||
|
.breatheparameterlist li tt + p {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container .breathe-sectiondef {
|
||||||
|
width: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.github-btn {
|
||||||
|
border: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jumbotron {
|
||||||
|
background-size: 100% 4px;
|
||||||
|
background-repeat: repeat-y;
|
||||||
|
color: white;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
+30
-19
@@ -8,8 +8,9 @@
|
|||||||
{# Google Analytics #}
|
{# Google Analytics #}
|
||||||
<script>
|
<script>
|
||||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();
|
||||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;
|
||||||
|
a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||||
ga('create', 'UA-20116650-4', 'fmtlib.net');
|
ga('create', 'UA-20116650-4', 'fmtlib.net');
|
||||||
ga('send', 'pageview');
|
ga('send', 'pageview');
|
||||||
@@ -17,9 +18,11 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{%- macro searchform(classes, button) %}
|
{%- macro searchform(classes, button) %}
|
||||||
<form class="{{classes}}" role="search" action="{{ pathto('search') }}" method="get">
|
<form class="{{classes}}" role="search" action="{{ pathto('search') }}"
|
||||||
|
method="get">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<input type="text" name="q" class="form-control" {{ 'placeholder="Search"' if not button }} >
|
<input type="text" name="q" class="form-control"
|
||||||
|
{{ 'placeholder="Search"' if not button }} >
|
||||||
</div>
|
</div>
|
||||||
<input type="hidden" name="check_keywords" value="yes" />
|
<input type="hidden" name="check_keywords" value="yes" />
|
||||||
<input type="hidden" name="area" value="default" />
|
<input type="hidden" name="area" value="default" />
|
||||||
@@ -36,7 +39,8 @@
|
|||||||
<div class="navbar-content">
|
<div class="navbar-content">
|
||||||
{# Brand and toggle get grouped for better mobile display #}
|
{# Brand and toggle get grouped for better mobile display #}
|
||||||
<div class="navbar-header">
|
<div class="navbar-header">
|
||||||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
|
<button type="button" class="navbar-toggle collapsed"
|
||||||
|
data-toggle="collapse" data-target=".navbar-collapse">
|
||||||
<span class="sr-only">Toggle navigation</span>
|
<span class="sr-only">Toggle navigation</span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
@@ -49,18 +53,19 @@
|
|||||||
<div class="collapse navbar-collapse">
|
<div class="collapse navbar-collapse">
|
||||||
<ul class="nav navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
{# TODO: update versions automatically #}
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown"
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
|
role="button" aria-expanded="false">{{ version }}
|
||||||
aria-expanded="false">{{ version }} <span class="caret"></span></a>
|
<span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="http://fmtlib.net/2.0.0/">2.0.0</a></li>
|
{% for v in versions.split(',') %}
|
||||||
<li><a href="http://fmtlib.net/1.1.0/">1.1.0</a></li>
|
<li><a href="http://fmtlib.net/{{v}}">{{v}}</a></li>
|
||||||
<li><a href="http://fmtlib.net/1.0.0/">1.0.0</a></li>
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
{% for name in ['Contents', 'Usage', 'API', 'Syntax'] %}
|
{% for name in ['Contents', 'Usage', 'API', 'Syntax'] %}
|
||||||
{% if pagename == name.lower() %}
|
{% if pagename == name.lower() %}
|
||||||
<li class="active"><a href="{{name.lower()}}.html">{{name}} <span class="sr-only">(current)</span></a></li>
|
<li class="active"><a href="{{name.lower()}}.html">{{name}}
|
||||||
|
<span class="sr-only">(current)</span></a></li>
|
||||||
{%else%}
|
{%else%}
|
||||||
<li><a href="{{name.lower()}}.html">{{name}}</a></li>
|
<li><a href="{{name.lower()}}.html">{{name}}</a></li>
|
||||||
{%endif%}
|
{%endif%}
|
||||||
@@ -75,20 +80,25 @@
|
|||||||
</div> {# /.tb-container #}
|
</div> {# /.tb-container #}
|
||||||
</nav>
|
</nav>
|
||||||
{% if pagename == "index" %}
|
{% if pagename == "index" %}
|
||||||
|
{% set download_url = 'https://github.com/fmtlib/fmt/releases/download' %}
|
||||||
<div class="jumbotron">
|
<div class="jumbotron">
|
||||||
<div class="tb-container">
|
<div class="tb-container">
|
||||||
<h1>{fmt}</h1>
|
<h1>{fmt}</h1>
|
||||||
<p class="lead">Small, safe and fast formatting library</p>
|
<p class="lead">Small, safe and fast formatting library</p>
|
||||||
<div class="btn-group" role="group">
|
<div class="btn-group" role="group">
|
||||||
|
{% set name = 'fmt' if version.split('.')[0]|int >= 3 else 'cppformat' %}
|
||||||
<a class="btn btn-success"
|
<a class="btn btn-success"
|
||||||
href="https://github.com/fmtlib/fmt/releases/download/2.0.0/cppformat-2.0.0.zip">
|
href="{{download_url}}/{{version}}/{{name}}-{{version}}.zip">
|
||||||
<span class="glyphicon glyphicon-download"></span> Download
|
<span class="glyphicon glyphicon-download"></span> Download
|
||||||
</a>
|
</a>
|
||||||
<button type="button" class="btn btn-success dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
|
<button type="button" class="btn btn-success dropdown-toggle"
|
||||||
|
data-toggle="dropdown"><span class="caret"></span></button>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li><a href="https://github.com/fmtlib/fmt/releases/download/2.0.0/cppformat-2.0.0.zip">Version 2.0.0</a></li>
|
{% for v in versions.split(',') %}
|
||||||
<li><a href="https://github.com/fmtlib/fmt/releases/download/1.1.0/cppformat-1.1.0.zip">Version 1.1.0</a></li>
|
{% set name = 'fmt' if v.split('.')[0]|int >= 3 else 'cppformat' %}
|
||||||
<li><a href="https://github.com/fmtlib/fmt/releases/download/1.0.0/cppformat-1.0.0.zip">Version 1.0.0</a></li>
|
<li><a href="{{download_url}}/{{v}}/{{name}}-{{v}}.zip">Version {{v}}
|
||||||
|
</a></li>
|
||||||
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -105,14 +115,15 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="tb-container">
|
<div class="tb-container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
{# TODO: integrate sidebar
|
{# Sidebar is currently disabled.
|
||||||
<div class="bs-sidebar">
|
<div class="bs-sidebar">
|
||||||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||||||
<div class="sphinxsidebarwrapper">
|
<div class="sphinxsidebarwrapper">
|
||||||
{%- block sidebarlogo %}
|
{%- block sidebarlogo %}
|
||||||
{%- if logo %}
|
{%- if logo %}
|
||||||
<p class="logo"><a href="{{ pathto(master_doc) }}">
|
<p class="logo"><a href="{{ pathto(master_doc) }}">
|
||||||
<img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
|
<img class="logo" src="{{ pathto('_static/' + logo, 1) }}"
|
||||||
|
alt="Logo"/>
|
||||||
</a></p>
|
</a></p>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- endblock %}
|
{%- endblock %}
|
||||||
|
|||||||
+76
-10
@@ -11,8 +11,8 @@ namespace is usually omitted in examples.
|
|||||||
Format API
|
Format API
|
||||||
==========
|
==========
|
||||||
|
|
||||||
The following functions use :ref:`format string syntax <syntax>` similar
|
The following functions defined in ``fmt/format.h`` use :ref:`format string
|
||||||
to the one used by Python's `str.format
|
syntax <syntax>` similar to the one used by Python's `str.format
|
||||||
<http://docs.python.org/3/library/stdtypes.html#str.format>`_ function.
|
<http://docs.python.org/3/library/stdtypes.html#str.format>`_ function.
|
||||||
They take *format_str* and *args* as arguments.
|
They take *format_str* and *args* as arguments.
|
||||||
|
|
||||||
@@ -22,6 +22,11 @@ arguments in the resulting string.
|
|||||||
|
|
||||||
*args* is an argument list representing arbitrary arguments.
|
*args* is an argument list representing arbitrary arguments.
|
||||||
|
|
||||||
|
The `performance of the format API
|
||||||
|
<https://github.com/fmtlib/fmt/blob/master/README.rst#speed-tests>`_ is close
|
||||||
|
to that of glibc's ``printf`` and better than the performance of IOStreams.
|
||||||
|
For even better speed use the `write API`_.
|
||||||
|
|
||||||
.. _format:
|
.. _format:
|
||||||
|
|
||||||
.. doxygenfunction:: format(CStringRef, ArgList)
|
.. doxygenfunction:: format(CStringRef, ArgList)
|
||||||
@@ -40,8 +45,9 @@ arguments in the resulting string.
|
|||||||
Date and time formatting
|
Date and time formatting
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
The library supports `strftime <http://en.cppreference.com/w/cpp/chrono/c/strftime>`_-like
|
The library supports `strftime
|
||||||
date and time formatting::
|
<http://en.cppreference.com/w/cpp/chrono/c/strftime>`_-like date and time
|
||||||
|
formatting::
|
||||||
|
|
||||||
#include "fmt/time.h"
|
#include "fmt/time.h"
|
||||||
|
|
||||||
@@ -52,6 +58,36 @@ date and time formatting::
|
|||||||
The format string syntax is described in the documentation of
|
The format string syntax is described in the documentation of
|
||||||
`strftime <http://en.cppreference.com/w/cpp/chrono/c/strftime>`_.
|
`strftime <http://en.cppreference.com/w/cpp/chrono/c/strftime>`_.
|
||||||
|
|
||||||
|
Formatting user-defined types
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
A custom ``format_arg`` function may be implemented and used to format any
|
||||||
|
user-defined type. That is how date and time formatting described in the
|
||||||
|
previous section is implemented in :file:`fmt/time.h`. The following example
|
||||||
|
shows how to implement custom formatting for a user-defined structure.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
struct MyStruct { double a, b; };
|
||||||
|
|
||||||
|
void format_arg(fmt::BasicFormatter<char> &f,
|
||||||
|
const char *&format_str, const MyStruct &s) {
|
||||||
|
f.writer().write("[MyStruct: a={:.1f}, b={:.2f}]", s.a, s.b);
|
||||||
|
}
|
||||||
|
|
||||||
|
MyStruct m = { 1, 2 };
|
||||||
|
std::string s = fmt::format("m={}", n);
|
||||||
|
// s == "m=[MyStruct: a=1.0, b=2.00]"
|
||||||
|
|
||||||
|
Note in the example above the ``format_arg`` function ignores the contents of
|
||||||
|
``format_str`` so the type will always be formatted as specified. See
|
||||||
|
``format_arg`` in :file:`fmt/time.h` for an advanced example of how to use
|
||||||
|
the ``format_str`` argument to customize the formatted output.
|
||||||
|
|
||||||
|
This section shows how to define a custom format function for a user-defined
|
||||||
|
type. The next section describes how to get ``fmt`` to use a conventional stream
|
||||||
|
output ``operator<<`` when one is defined for a user-defined type.
|
||||||
|
|
||||||
``std::ostream`` support
|
``std::ostream`` support
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
@@ -75,8 +111,6 @@ formatting of user-defined types that have overloaded ``operator<<``::
|
|||||||
|
|
||||||
.. doxygenfunction:: print(std::ostream&, CStringRef, ArgList)
|
.. doxygenfunction:: print(std::ostream&, CStringRef, ArgList)
|
||||||
|
|
||||||
.. doxygenfunction:: fprintf(std::ostream&, CStringRef, ArgList)
|
|
||||||
|
|
||||||
Argument formatters
|
Argument formatters
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
@@ -120,22 +154,43 @@ custom argument formatter class::
|
|||||||
.. doxygenclass:: fmt::ArgFormatter
|
.. doxygenclass:: fmt::ArgFormatter
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
Printf formatting functions
|
Printf formatting
|
||||||
---------------------------
|
-----------------
|
||||||
|
|
||||||
|
The header ``fmt/printf.h`` provides ``printf``-like formatting functionality.
|
||||||
The following functions use `printf format string syntax
|
The following functions use `printf format string syntax
|
||||||
<http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html>`_ with
|
<http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html>`_ with
|
||||||
a POSIX extension for positional arguments.
|
the POSIX extension for positional arguments. Unlike their standard
|
||||||
|
counterparts, the ``fmt`` functions are type-safe and throw an exception if an
|
||||||
|
argument type doesn't match its format specification.
|
||||||
|
|
||||||
.. doxygenfunction:: printf(CStringRef, ArgList)
|
.. doxygenfunction:: printf(CStringRef, ArgList)
|
||||||
|
|
||||||
.. doxygenfunction:: fprintf(std::FILE *, CStringRef, ArgList)
|
.. doxygenfunction:: fprintf(std::FILE *, CStringRef, ArgList)
|
||||||
|
|
||||||
|
.. doxygenfunction:: fprintf(std::ostream&, CStringRef, ArgList)
|
||||||
|
|
||||||
.. doxygenfunction:: sprintf(CStringRef, ArgList)
|
.. doxygenfunction:: sprintf(CStringRef, ArgList)
|
||||||
|
|
||||||
|
.. doxygenclass:: fmt::PrintfFormatter
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. doxygenclass:: fmt::BasicPrintfArgFormatter
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. doxygenclass:: fmt::PrintfArgFormatter
|
||||||
|
:members:
|
||||||
|
|
||||||
Write API
|
Write API
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
The write API provides classes for writing formatted data into character
|
||||||
|
streams. It is usually faster than the `format API`_ but, as IOStreams,
|
||||||
|
may result in larger compiled code size. The main writer class is
|
||||||
|
`~fmt::BasicMemoryWriter` which stores its output in a memory buffer and
|
||||||
|
provides direct access to it. It is possible to create custom writers that
|
||||||
|
store output elsewhere by subclassing `~fmt::BasicWriter`.
|
||||||
|
|
||||||
.. doxygenclass:: fmt::BasicWriter
|
.. doxygenclass:: fmt::BasicWriter
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
@@ -145,6 +200,12 @@ Write API
|
|||||||
.. doxygenclass:: fmt::BasicArrayWriter
|
.. doxygenclass:: fmt::BasicArrayWriter
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
|
.. doxygenclass:: fmt::BasicStringWriter
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. doxygenclass:: fmt::BasicContainerWriter
|
||||||
|
:members:
|
||||||
|
|
||||||
.. doxygenfunction:: bin(int)
|
.. doxygenfunction:: bin(int)
|
||||||
|
|
||||||
.. doxygenfunction:: oct(int)
|
.. doxygenfunction:: oct(int)
|
||||||
@@ -169,6 +230,8 @@ Utilities
|
|||||||
.. doxygenclass:: fmt::ArgList
|
.. doxygenclass:: fmt::ArgList
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
|
.. doxygenfunction:: fmt::to_string(const T&)
|
||||||
|
|
||||||
.. doxygenclass:: fmt::BasicStringRef
|
.. doxygenclass:: fmt::BasicStringRef
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
@@ -185,6 +248,8 @@ System errors
|
|||||||
.. doxygenclass:: fmt::SystemError
|
.. doxygenclass:: fmt::SystemError
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
|
.. doxygenfunction:: fmt::format_system_error
|
||||||
|
|
||||||
.. doxygenclass:: fmt::WindowsError
|
.. doxygenclass:: fmt::WindowsError
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
@@ -202,7 +267,8 @@ A custom allocator class can be specified as a template argument to
|
|||||||
It is also possible to write a formatting function that uses a custom
|
It is also possible to write a formatting function that uses a custom
|
||||||
allocator::
|
allocator::
|
||||||
|
|
||||||
typedef std::basic_string<char, std::char_traits<char>, CustomAllocator> CustomString;
|
typedef std::basic_string<char, std::char_traits<char>, CustomAllocator>
|
||||||
|
CustomString;
|
||||||
|
|
||||||
CustomString format(CustomAllocator alloc, fmt::CStringRef format_str,
|
CustomString format(CustomAllocator alloc, fmt::CStringRef format_str,
|
||||||
fmt::ArgList args) {
|
fmt::ArgList args) {
|
||||||
|
|||||||
@@ -90,7 +90,8 @@
|
|||||||
VERSION: '{{ release|e }}',
|
VERSION: '{{ release|e }}',
|
||||||
COLLAPSE_INDEX: false,
|
COLLAPSE_INDEX: false,
|
||||||
FILE_SUFFIX: '{{ '' if no_search_suffix else file_suffix }}',
|
FILE_SUFFIX: '{{ '' if no_search_suffix else file_suffix }}',
|
||||||
HAS_SOURCE: {{ has_source|lower }}
|
HAS_SOURCE: {{ has_source|lower }},
|
||||||
|
SOURCELINK_SUFFIX: '{{ sourcelink_suffix }}'
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
{%- for scriptfile in script_files %}
|
{%- for scriptfile in script_files %}
|
||||||
|
|||||||
+46
-28
@@ -8,30 +8,35 @@ from distutils.version import LooseVersion
|
|||||||
|
|
||||||
def pip_install(package, commit=None, **kwargs):
|
def pip_install(package, commit=None, **kwargs):
|
||||||
"Install package using pip."
|
"Install package using pip."
|
||||||
|
min_version = kwargs.get('min_version')
|
||||||
|
if min_version:
|
||||||
|
from pkg_resources import get_distribution, DistributionNotFound
|
||||||
|
try:
|
||||||
|
installed_version = get_distribution(os.path.basename(package)).version
|
||||||
|
if LooseVersion(installed_version) >= min_version:
|
||||||
|
print('{} {} already installed'.format(package, min_version))
|
||||||
|
return
|
||||||
|
except DistributionNotFound:
|
||||||
|
pass
|
||||||
if commit:
|
if commit:
|
||||||
check_version = kwargs.get('check_version', '')
|
package = 'git+https://github.com/{0}.git@{1}'.format(package, commit)
|
||||||
#output = check_output(['pip', 'show', package.split('/')[1]])
|
print('Installing {0}'.format(package))
|
||||||
#if check_version in output:
|
check_call(['pip', 'install', package])
|
||||||
# print('{} already installed'.format(package))
|
|
||||||
# return
|
|
||||||
package = 'git+git://github.com/{0}.git@{1}'.format(package, commit)
|
|
||||||
print('Installing {}'.format(package))
|
|
||||||
check_call(['pip', 'install', '--upgrade', package])
|
|
||||||
|
|
||||||
def build_docs(version='dev'):
|
def create_build_env(dirname='virtualenv'):
|
||||||
# Create virtualenv.
|
# Create virtualenv.
|
||||||
doc_dir = os.path.dirname(os.path.realpath(__file__))
|
if not os.path.exists(dirname):
|
||||||
virtualenv_dir = 'virtualenv'
|
check_call(['virtualenv', dirname])
|
||||||
check_call(['virtualenv', virtualenv_dir])
|
|
||||||
import sysconfig
|
import sysconfig
|
||||||
scripts_dir = os.path.basename(sysconfig.get_path('scripts'))
|
scripts_dir = os.path.basename(sysconfig.get_path('scripts'))
|
||||||
activate_this_file = os.path.join(virtualenv_dir, scripts_dir,
|
activate_this_file = os.path.join(dirname, scripts_dir, 'activate_this.py')
|
||||||
'activate_this.py')
|
|
||||||
with open(activate_this_file) as f:
|
with open(activate_this_file) as f:
|
||||||
exec(f.read(), dict(__file__=activate_this_file))
|
exec(f.read(), dict(__file__=activate_this_file))
|
||||||
|
# Import get_distribution after activating virtualenv to get info about
|
||||||
|
# the correct packages.
|
||||||
|
from pkg_resources import get_distribution, DistributionNotFound
|
||||||
# Upgrade pip because installation of sphinx with pip 1.1 available on Travis
|
# Upgrade pip because installation of sphinx with pip 1.1 available on Travis
|
||||||
# is broken (see #207) and it doesn't support the show command.
|
# is broken (see #207) and it doesn't support the show command.
|
||||||
from pkg_resources import get_distribution, DistributionNotFound
|
|
||||||
pip_version = get_distribution('pip').version
|
pip_version = get_distribution('pip').version
|
||||||
if LooseVersion(pip_version) < LooseVersion('1.5.4'):
|
if LooseVersion(pip_version) < LooseVersion('1.5.4'):
|
||||||
print("Updating pip")
|
print("Updating pip")
|
||||||
@@ -46,27 +51,35 @@ def build_docs(version='dev'):
|
|||||||
except DistributionNotFound:
|
except DistributionNotFound:
|
||||||
pass
|
pass
|
||||||
# Install Sphinx and Breathe.
|
# Install Sphinx and Breathe.
|
||||||
pip_install('fmtlib/sphinx',
|
pip_install('sphinx-doc/sphinx', '12b83372ac9316e8cbe86e7fed889296a4cc29ee',
|
||||||
'12dde8afdb0a7bb5576e2656692c3478c69d8cc3',
|
min_version='1.4.1.dev20160531')
|
||||||
check_version='1.4a0.dev-20151013')
|
|
||||||
pip_install('michaeljones/breathe',
|
pip_install('michaeljones/breathe',
|
||||||
'1c9d7f80378a92cffa755084823a78bb38ee4acc')
|
'6b1c5bb7a1866f15fc328b8716258354b10c1daa',
|
||||||
|
min_version='4.2.0')
|
||||||
|
|
||||||
|
def build_docs(version='dev', **kwargs):
|
||||||
|
doc_dir = kwargs.get('doc_dir', os.path.dirname(os.path.realpath(__file__)))
|
||||||
|
work_dir = kwargs.get('work_dir', '.')
|
||||||
|
include_dir = kwargs.get('include_dir',
|
||||||
|
os.path.join(os.path.dirname(doc_dir), 'fmt'))
|
||||||
# Build docs.
|
# Build docs.
|
||||||
cmd = ['doxygen', '-']
|
cmd = ['doxygen', '-']
|
||||||
p = Popen(cmd, stdin=PIPE)
|
p = Popen(cmd, stdin=PIPE)
|
||||||
|
doxyxml_dir = os.path.join(work_dir, 'doxyxml')
|
||||||
p.communicate(input=r'''
|
p.communicate(input=r'''
|
||||||
PROJECT_NAME = fmt
|
PROJECT_NAME = fmt
|
||||||
GENERATE_LATEX = NO
|
GENERATE_LATEX = NO
|
||||||
GENERATE_MAN = NO
|
GENERATE_MAN = NO
|
||||||
GENERATE_RTF = NO
|
GENERATE_RTF = NO
|
||||||
CASE_SENSE_NAMES = NO
|
CASE_SENSE_NAMES = NO
|
||||||
INPUT = {0}/format.h {0}/ostream.h
|
INPUT = {0}/container.h {0}/format.h {0}/ostream.h \
|
||||||
|
{0}/printf.h {0}/string.h
|
||||||
QUIET = YES
|
QUIET = YES
|
||||||
JAVADOC_AUTOBRIEF = YES
|
JAVADOC_AUTOBRIEF = YES
|
||||||
AUTOLINK_SUPPORT = NO
|
AUTOLINK_SUPPORT = NO
|
||||||
GENERATE_HTML = NO
|
GENERATE_HTML = NO
|
||||||
GENERATE_XML = YES
|
GENERATE_XML = YES
|
||||||
XML_OUTPUT = doxyxml
|
XML_OUTPUT = {1}
|
||||||
ALIASES = "rst=\verbatim embed:rst"
|
ALIASES = "rst=\verbatim embed:rst"
|
||||||
ALIASES += "endrst=\endverbatim"
|
ALIASES += "endrst=\endverbatim"
|
||||||
MACRO_EXPANSION = YES
|
MACRO_EXPANSION = YES
|
||||||
@@ -76,24 +89,29 @@ def build_docs(version='dev'):
|
|||||||
FMT_USE_USER_DEFINED_LITERALS=1 \
|
FMT_USE_USER_DEFINED_LITERALS=1 \
|
||||||
FMT_API=
|
FMT_API=
|
||||||
EXCLUDE_SYMBOLS = fmt::internal::* StringValue write_str
|
EXCLUDE_SYMBOLS = fmt::internal::* StringValue write_str
|
||||||
'''.format(os.path.join(os.path.dirname(doc_dir), 'fmt')).encode('UTF-8'))
|
'''.format(include_dir, doxyxml_dir).encode('UTF-8'))
|
||||||
if p.returncode != 0:
|
if p.returncode != 0:
|
||||||
raise CalledProcessError(p.returncode, cmd)
|
raise CalledProcessError(p.returncode, cmd)
|
||||||
|
html_dir = os.path.join(work_dir, 'html')
|
||||||
|
versions = ['3.0.0', '2.0.0', '1.1.0']
|
||||||
check_call(['sphinx-build',
|
check_call(['sphinx-build',
|
||||||
'-Dbreathe_projects.format=' + os.path.join(os.getcwd(), 'doxyxml'),
|
'-Dbreathe_projects.format=' + os.path.abspath(doxyxml_dir),
|
||||||
'-Dversion=' + version, '-Drelease=' + version, '-Aversion=' + version,
|
'-Dversion=' + version, '-Drelease=' + version,
|
||||||
'-b', 'html', doc_dir, 'html'])
|
'-Aversion=' + version, '-Aversions=' + ','.join(versions),
|
||||||
|
'-b', 'html', doc_dir, html_dir])
|
||||||
try:
|
try:
|
||||||
check_call(['lessc', '--clean-css',
|
check_call(['lessc', '--clean-css',
|
||||||
'--include-path=' + os.path.join(doc_dir, 'bootstrap'),
|
'--include-path=' + os.path.join(doc_dir, 'bootstrap'),
|
||||||
os.path.join(doc_dir, 'fmt.less'),
|
os.path.join(doc_dir, 'fmt.less'),
|
||||||
'html/_static/fmt.css'])
|
os.path.join(html_dir, '_static', 'fmt.css')])
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
if e.errno != errno.ENOENT:
|
if e.errno != errno.ENOENT:
|
||||||
raise
|
raise
|
||||||
print('lessc not found; make sure that Less (http://lesscss.org/) is installed')
|
print('lessc not found; make sure that Less (http://lesscss.org/) ' +
|
||||||
|
'is installed')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
return 'html'
|
return html_dir
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
create_build_env()
|
||||||
build_docs(sys.argv[1])
|
build_docs(sys.argv[1])
|
||||||
|
|||||||
@@ -228,8 +228,7 @@ latex_documents = [
|
|||||||
# One entry per manual page. List of tuples
|
# One entry per manual page. List of tuples
|
||||||
# (source start file, name, description, authors, manual section).
|
# (source start file, name, description, authors, manual section).
|
||||||
man_pages = [
|
man_pages = [
|
||||||
('index', 'format', u'format Documentation',
|
('index', 'fmt', u'fmt documentation', [u'Victor Zverovich'], 1)
|
||||||
[u'Victor Zverovich'], 1)
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
# If true, show URL addresses after external links.
|
||||||
@@ -242,8 +241,8 @@ man_pages = [
|
|||||||
# (source start file, target name, title, author,
|
# (source start file, target name, title, author,
|
||||||
# dir menu entry, description, category)
|
# dir menu entry, description, category)
|
||||||
texinfo_documents = [
|
texinfo_documents = [
|
||||||
('index', 'format', u'format Documentation',
|
('index', 'fmt', u'fmt documentation',
|
||||||
u'Victor Zverovich', 'format', 'One line description of project.',
|
u'Victor Zverovich', 'fmt', 'One line description of project.',
|
||||||
'Miscellaneous'),
|
'Miscellaneous'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ namespace is usually omitted in examples.
|
|||||||
Format API
|
Format API
|
||||||
==========
|
==========
|
||||||
|
|
||||||
The following functions use :ref:`format string syntax <syntax>` similar
|
The following functions defined in ``fmt/format.h`` use :ref:`format string
|
||||||
to the one used by Python's `str.format
|
syntax <syntax>` similar to the one used by Python's `str.format
|
||||||
<http://docs.python.org/3/library/stdtypes.html#str.format>`_ function.
|
<http://docs.python.org/3/library/stdtypes.html#str.format>`_ function.
|
||||||
They take *format_str* and *args* as arguments.
|
They take *format_str* and *args* as arguments.
|
||||||
|
|
||||||
@@ -22,6 +22,11 @@ arguments in the resulting string.
|
|||||||
|
|
||||||
*args* is an argument list representing arbitrary arguments.
|
*args* is an argument list representing arbitrary arguments.
|
||||||
|
|
||||||
|
The `performance of the format API
|
||||||
|
<https://github.com/fmtlib/fmt/blob/master/README.rst#speed-tests>`_ is close
|
||||||
|
to that of glibc's ``printf`` and better than the performance of IOStreams.
|
||||||
|
For even better speed use the `write API`_.
|
||||||
|
|
||||||
.. _format:
|
.. _format:
|
||||||
|
|
||||||
.. doxygenfunction:: format(CStringRef, ArgList)
|
.. doxygenfunction:: format(CStringRef, ArgList)
|
||||||
@@ -40,8 +45,9 @@ arguments in the resulting string.
|
|||||||
Date and time formatting
|
Date and time formatting
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
The library supports `strftime <http://en.cppreference.com/w/cpp/chrono/c/strftime>`_-like
|
The library supports `strftime
|
||||||
date and time formatting::
|
<http://en.cppreference.com/w/cpp/chrono/c/strftime>`_-like date and time
|
||||||
|
formatting::
|
||||||
|
|
||||||
#include "fmt/time.h"
|
#include "fmt/time.h"
|
||||||
|
|
||||||
@@ -52,6 +58,36 @@ date and time formatting::
|
|||||||
The format string syntax is described in the documentation of
|
The format string syntax is described in the documentation of
|
||||||
`strftime <http://en.cppreference.com/w/cpp/chrono/c/strftime>`_.
|
`strftime <http://en.cppreference.com/w/cpp/chrono/c/strftime>`_.
|
||||||
|
|
||||||
|
Formatting user-defined types
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
A custom ``format_arg`` function may be implemented and used to format any
|
||||||
|
user-defined type. That is how date and time formatting described in the
|
||||||
|
previous section is implemented in :file:`fmt/time.h`. The following example
|
||||||
|
shows how to implement custom formatting for a user-defined structure.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
struct MyStruct { double a, b; };
|
||||||
|
|
||||||
|
void format_arg(fmt::BasicFormatter<char> &f,
|
||||||
|
const char *&format_str, const MyStruct &s) {
|
||||||
|
f.writer().write("[MyStruct: a={:.1f}, b={:.2f}]", s.a, s.b);
|
||||||
|
}
|
||||||
|
|
||||||
|
MyStruct m = { 1, 2 };
|
||||||
|
std::string s = fmt::format("m={}", n);
|
||||||
|
// s == "m=[MyStruct: a=1.0, b=2.00]"
|
||||||
|
|
||||||
|
Note in the example above the ``format_arg`` function ignores the contents of
|
||||||
|
``format_str`` so the type will always be formatted as specified. See
|
||||||
|
``format_arg`` in :file:`fmt/time.h` for an advanced example of how to use
|
||||||
|
the ``format_str`` argument to customize the formatted output.
|
||||||
|
|
||||||
|
This section shows how to define a custom format function for a user-defined
|
||||||
|
type. The next section describes how to get ``fmt`` to use a conventional stream
|
||||||
|
output ``operator<<`` when one is defined for a user-defined type.
|
||||||
|
|
||||||
``std::ostream`` support
|
``std::ostream`` support
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
@@ -75,8 +111,6 @@ formatting of user-defined types that have overloaded ``operator<<``::
|
|||||||
|
|
||||||
.. doxygenfunction:: print(std::ostream&, CStringRef, ArgList)
|
.. doxygenfunction:: print(std::ostream&, CStringRef, ArgList)
|
||||||
|
|
||||||
.. doxygenfunction:: fprintf(std::ostream&, CStringRef, ArgList)
|
|
||||||
|
|
||||||
Argument formatters
|
Argument formatters
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
@@ -120,22 +154,43 @@ custom argument formatter class::
|
|||||||
.. doxygenclass:: fmt::ArgFormatter
|
.. doxygenclass:: fmt::ArgFormatter
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
Printf formatting functions
|
Printf formatting
|
||||||
---------------------------
|
-----------------
|
||||||
|
|
||||||
|
The header ``fmt/printf.h`` provides ``printf``-like formatting functionality.
|
||||||
The following functions use `printf format string syntax
|
The following functions use `printf format string syntax
|
||||||
<http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html>`_ with
|
<http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html>`_ with
|
||||||
a POSIX extension for positional arguments.
|
the POSIX extension for positional arguments. Unlike their standard
|
||||||
|
counterparts, the ``fmt`` functions are type-safe and throw an exception if an
|
||||||
|
argument type doesn't match its format specification.
|
||||||
|
|
||||||
.. doxygenfunction:: printf(CStringRef, ArgList)
|
.. doxygenfunction:: printf(CStringRef, ArgList)
|
||||||
|
|
||||||
.. doxygenfunction:: fprintf(std::FILE *, CStringRef, ArgList)
|
.. doxygenfunction:: fprintf(std::FILE *, CStringRef, ArgList)
|
||||||
|
|
||||||
|
.. doxygenfunction:: fprintf(std::ostream&, CStringRef, ArgList)
|
||||||
|
|
||||||
.. doxygenfunction:: sprintf(CStringRef, ArgList)
|
.. doxygenfunction:: sprintf(CStringRef, ArgList)
|
||||||
|
|
||||||
|
.. doxygenclass:: fmt::PrintfFormatter
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. doxygenclass:: fmt::BasicPrintfArgFormatter
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. doxygenclass:: fmt::PrintfArgFormatter
|
||||||
|
:members:
|
||||||
|
|
||||||
Write API
|
Write API
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
The write API provides classes for writing formatted data into character
|
||||||
|
streams. It is usually faster than the `format API`_ but, as IOStreams,
|
||||||
|
may result in larger compiled code size. The main writer class is
|
||||||
|
`~fmt::BasicMemoryWriter` which stores its output in a memory buffer and
|
||||||
|
provides direct access to it. It is possible to create custom writers that
|
||||||
|
store output elsewhere by subclassing `~fmt::BasicWriter`.
|
||||||
|
|
||||||
.. doxygenclass:: fmt::BasicWriter
|
.. doxygenclass:: fmt::BasicWriter
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
@@ -145,6 +200,12 @@ Write API
|
|||||||
.. doxygenclass:: fmt::BasicArrayWriter
|
.. doxygenclass:: fmt::BasicArrayWriter
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
|
.. doxygenclass:: fmt::BasicStringWriter
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. doxygenclass:: fmt::BasicContainerWriter
|
||||||
|
:members:
|
||||||
|
|
||||||
.. doxygenfunction:: bin(int)
|
.. doxygenfunction:: bin(int)
|
||||||
|
|
||||||
.. doxygenfunction:: oct(int)
|
.. doxygenfunction:: oct(int)
|
||||||
@@ -169,6 +230,8 @@ Utilities
|
|||||||
.. doxygenclass:: fmt::ArgList
|
.. doxygenclass:: fmt::ArgList
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
|
.. doxygenfunction:: fmt::to_string(const T&)
|
||||||
|
|
||||||
.. doxygenclass:: fmt::BasicStringRef
|
.. doxygenclass:: fmt::BasicStringRef
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
@@ -185,6 +248,8 @@ System errors
|
|||||||
.. doxygenclass:: fmt::SystemError
|
.. doxygenclass:: fmt::SystemError
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
|
.. doxygenfunction:: fmt::format_system_error
|
||||||
|
|
||||||
.. doxygenclass:: fmt::WindowsError
|
.. doxygenclass:: fmt::WindowsError
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
@@ -202,7 +267,8 @@ A custom allocator class can be specified as a template argument to
|
|||||||
It is also possible to write a formatting function that uses a custom
|
It is also possible to write a formatting function that uses a custom
|
||||||
allocator::
|
allocator::
|
||||||
|
|
||||||
typedef std::basic_string<char, std::char_traits<char>, CustomAllocator> CustomString;
|
typedef std::basic_string<char, std::char_traits<char>, CustomAllocator>
|
||||||
|
CustomString;
|
||||||
|
|
||||||
CustomString format(CustomAllocator alloc, fmt::CStringRef format_str,
|
CustomString format(CustomAllocator alloc, fmt::CStringRef format_str,
|
||||||
fmt::ArgList args) {
|
fmt::ArgList args) {
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ alternative to C++ IOStreams.
|
|||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">What users say:</div>
|
<div class="panel-heading">What users say:</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
Thanks for creating this library. It’s been a hole in C++ for a long time.
|
Thanks for creating this library. It’s been a hole in C++ for a long
|
||||||
I’ve used both boost::format and loki::SPrintf, and neither felt like the
|
time. I’ve used both boost::format and loki::SPrintf, and neither felt
|
||||||
right answer. This does.
|
like the right answer. This does.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -24,8 +24,8 @@ Format API
|
|||||||
The replacement-based Format API provides a safe alternative to ``printf``,
|
The replacement-based Format API provides a safe alternative to ``printf``,
|
||||||
``sprintf`` and friends with comparable or `better performance
|
``sprintf`` and friends with comparable or `better performance
|
||||||
<http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html>`_.
|
<http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html>`_.
|
||||||
The `format string syntax <doc/latest/index.html#format-string-syntax>`_ is similar
|
The `format string syntax <syntax.html>`_ is similar to the one used by
|
||||||
to the one used by `str.format <http://docs.python.org/2/library/stdtypes.html#str.format>`_
|
`str.format <http://docs.python.org/2/library/stdtypes.html#str.format>`_
|
||||||
in Python:
|
in Python:
|
||||||
|
|
||||||
.. code:: c++
|
.. code:: c++
|
||||||
@@ -98,8 +98,8 @@ literal operators, they must be made visible with the directive
|
|||||||
Write API
|
Write API
|
||||||
---------
|
---------
|
||||||
|
|
||||||
The concatenation-based Write API (experimental) provides a
|
The concatenation-based Write API (experimental) provides a `fast
|
||||||
`fast <http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html>`_
|
<http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html>`_
|
||||||
stateless alternative to IOStreams:
|
stateless alternative to IOStreams:
|
||||||
|
|
||||||
.. code:: c++
|
.. code:: c++
|
||||||
@@ -112,8 +112,9 @@ stateless alternative to IOStreams:
|
|||||||
Safety
|
Safety
|
||||||
------
|
------
|
||||||
|
|
||||||
The library is fully type safe, automatic memory management prevents buffer overflow,
|
The library is fully type safe, automatic memory management prevents buffer
|
||||||
errors in format strings are reported using exceptions. For example, the code
|
overflow, errors in format strings are reported using exceptions. For example,
|
||||||
|
the code
|
||||||
|
|
||||||
.. code:: c++
|
.. code:: c++
|
||||||
|
|
||||||
@@ -138,19 +139,21 @@ formatted into a narrow string. You can use a wide format string instead:
|
|||||||
fmt::format(L"Cyrillic letter {}", L'\x42e');
|
fmt::format(L"Cyrillic letter {}", L'\x42e');
|
||||||
|
|
||||||
For comparison, writing a wide character to ``std::ostream`` results in
|
For comparison, writing a wide character to ``std::ostream`` results in
|
||||||
its numeric value being written to the stream (i.e. 1070 instead of letter 'ю' which
|
its numeric value being written to the stream (i.e. 1070 instead of letter 'ю'
|
||||||
is represented by ``L'\x42e'`` if we use Unicode) which is rarely what is needed.
|
which is represented by ``L'\x42e'`` if we use Unicode) which is rarely what is
|
||||||
|
needed.
|
||||||
|
|
||||||
.. _portability:
|
.. _portability:
|
||||||
|
|
||||||
Portability
|
Portability
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
The library is highly portable. Here is an incomplete list of operating systems and
|
The library is highly portable. Here is an incomplete list of operating systems
|
||||||
compilers where it has been tested and known to work:
|
and compilers where it has been tested and known to work:
|
||||||
|
|
||||||
* 64-bit (amd64) GNU/Linux with GCC 4.4.3, `4.6.3 <https://travis-ci.org/fmtlib/fmt>`_,
|
* 64-bit (amd64) GNU/Linux with GCC 4.4.3,
|
||||||
4.7.2, 4.8.1 and Intel C++ Compiler (ICC) 14.0.2
|
`4.6.3 <https://travis-ci.org/fmtlib/fmt>`_, 4.7.2, 4.8.1, and Intel C++
|
||||||
|
Compiler (ICC) 14.0.2
|
||||||
|
|
||||||
* 32-bit (i386) GNU/Linux with GCC 4.4.3, 4.6.3
|
* 32-bit (i386) GNU/Linux with GCC 4.4.3, 4.6.3
|
||||||
|
|
||||||
@@ -161,21 +164,21 @@ compilers where it has been tested and known to work:
|
|||||||
|
|
||||||
* 32-bit Windows with Visual C++ 2010
|
* 32-bit Windows with Visual C++ 2010
|
||||||
|
|
||||||
Although the library uses C++11 features when available, it also works with older
|
Although the library uses C++11 features when available, it also works with
|
||||||
compilers and standard library implementations. The only thing to keep in mind
|
older compilers and standard library implementations. The only thing to keep in
|
||||||
for C++98 portability:
|
mind for C++98 portability:
|
||||||
|
|
||||||
* Variadic templates: minimum GCC 4.4, Clang 2.9 or VS2013. This feature allows
|
* Variadic templates: minimum GCC 4.4, Clang 2.9 or VS2013. This feature allows
|
||||||
the Format API to accept an unlimited number of arguments. With older compilers
|
the Format API to accept an unlimited number of arguments. With older
|
||||||
the maximum is 15.
|
compilers the maximum is 15.
|
||||||
|
|
||||||
* User-defined literals: minimum GCC 4.7, Clang 3.1 or VS2015. The suffixes
|
* User-defined literals: minimum GCC 4.7, Clang 3.1 or VS2015. The suffixes
|
||||||
``_format`` and ``_a`` are functionally equivalent to the functions
|
``_format`` and ``_a`` are functionally equivalent to the functions
|
||||||
``fmt::format`` and ``fmt::arg``.
|
``fmt::format`` and ``fmt::arg``.
|
||||||
|
|
||||||
The output of all formatting functions is consistent across platforms. In particular,
|
The output of all formatting functions is consistent across platforms. In
|
||||||
formatting a floating-point infinity always gives ``inf`` while the output
|
particular, formatting a floating-point infinity always gives ``inf`` while the
|
||||||
of ``printf`` is platform-dependent in this case. For example,
|
output of ``printf`` is platform-dependent in this case. For example,
|
||||||
|
|
||||||
.. code::
|
.. code::
|
||||||
|
|
||||||
@@ -188,10 +191,10 @@ always prints ``inf``.
|
|||||||
Ease of Use
|
Ease of Use
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
fmt has a small self-contained code base consisting of a single header file
|
fmt has a small self-contained code base with the core library consisting of
|
||||||
and a single source file and no external dependencies. A permissive BSD `license
|
a single header file and a single source file and no external dependencies.
|
||||||
<https://github.com/fmtlib/fmt#license>`_ allows using the library both
|
A permissive BSD `license <https://github.com/fmtlib/fmt#license>`_ allows
|
||||||
in open-source and commercial projects.
|
using the library both in open-source and commercial projects.
|
||||||
|
|
||||||
.. raw:: html
|
.. raw:: html
|
||||||
|
|
||||||
|
|||||||
@@ -49,12 +49,10 @@ mini-language" or interpretation of the *format_spec*.
|
|||||||
Most built-in types support a common formatting mini-language, which is
|
Most built-in types support a common formatting mini-language, which is
|
||||||
described in the next section.
|
described in the next section.
|
||||||
|
|
||||||
A *format_spec* field can also include nested replacement fields within it.
|
A *format_spec* field can also include nested replacement fields in certain
|
||||||
These nested replacement fields can contain only an argument index;
|
positions within it. These nested replacement fields can contain only an
|
||||||
format specifications are not allowed. Formatting is performed as if the
|
argument id; format specifications are not allowed. This allows the
|
||||||
replacement fields within the format_spec are substituted before the
|
formatting of a value to be dynamically specified.
|
||||||
*format_spec* string is interpreted. This allows the formatting of a value
|
|
||||||
to be dynamically specified.
|
|
||||||
|
|
||||||
See the :ref:`formatexamples` section for some examples.
|
See the :ref:`formatexamples` section for some examples.
|
||||||
|
|
||||||
@@ -80,8 +78,8 @@ The general form of a *standard format specifier* is:
|
|||||||
sign: "+" | "-" | " "
|
sign: "+" | "-" | " "
|
||||||
width: `integer` | "{" `arg_id` "}"
|
width: `integer` | "{" `arg_id` "}"
|
||||||
precision: `integer` | "{" `arg_id` "}"
|
precision: `integer` | "{" `arg_id` "}"
|
||||||
type: `int_type` | "c" | "e" | "E" | "f" | "F" | "g" | "G" | "p" | "s"
|
type: `int_type` | "a" | "A" | "c" | "e" | "E" | "f" | "F" | "g" | "G" | "p" | "s"
|
||||||
int_type: "b" | "B" | "d" | "o" | "x" | "X"
|
int_type: "b" | "B" | "d" | "n" | "o" | "x" | "X"
|
||||||
|
|
||||||
The *fill* character can be any character other than '{' or '}'. The presence
|
The *fill* character can be any character other than '{' or '}'. The presence
|
||||||
of a fill character is signaled by the character following it, which must be
|
of a fill character is signaled by the character following it, which must be
|
||||||
@@ -234,7 +232,7 @@ The available presentation types for floating-point values are:
|
|||||||
+=========+==========================================================+
|
+=========+==========================================================+
|
||||||
| ``'a'`` | Hexadecimal floating point format. Prints the number in |
|
| ``'a'`` | Hexadecimal floating point format. Prints the number in |
|
||||||
| | base 16 with prefix ``"0x"`` and lower-case letters for |
|
| | base 16 with prefix ``"0x"`` and lower-case letters for |
|
||||||
| | digits above 9. Uses 'p' to indicate the exponent. |
|
| | digits above 9. Uses ``'p'`` to indicate the exponent. |
|
||||||
+---------+----------------------------------------------------------+
|
+---------+----------------------------------------------------------+
|
||||||
| ``'A'`` | Same as ``'a'`` except it uses upper-case letters for |
|
| ``'A'`` | Same as ``'a'`` except it uses upper-case letters for |
|
||||||
| | the prefix, digits above 9 and to indicate the exponent. |
|
| | the prefix, digits above 9 and to indicate the exponent. |
|
||||||
|
|||||||
@@ -54,6 +54,23 @@ To build a `shared library`__ set the ``BUILD_SHARED_LIBS`` CMake variable to
|
|||||||
|
|
||||||
__ http://en.wikipedia.org/wiki/Library_%28computing%29#Shared_libraries
|
__ http://en.wikipedia.org/wiki/Library_%28computing%29#Shared_libraries
|
||||||
|
|
||||||
|
Header-only usage with CMake
|
||||||
|
============================
|
||||||
|
|
||||||
|
In order to add ``fmtlib`` into an existing ``CMakeLists.txt`` file, you can add the ``fmt`` library directory into your main project, which will enable the ``fmt`` library::
|
||||||
|
|
||||||
|
add_subdirectory(fmt)
|
||||||
|
|
||||||
|
If you have a project called ``foo`` that you would like to link against the fmt library in a header-only fashion, you can enable with with::
|
||||||
|
|
||||||
|
target_link_libraries(foo PRIVATE fmt::fmt-header-only)
|
||||||
|
|
||||||
|
And then to ensure that the ``fmt`` library does not always get built, you can modify the call to ``add_subdirectory`` to read ::
|
||||||
|
|
||||||
|
add_subdirectory(fmt EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
|
This will ensure that the ``fmt`` library is exluded from calls to ``make``, ``make all``, or ``cmake --build .``.
|
||||||
|
|
||||||
Building the documentation
|
Building the documentation
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
@@ -62,7 +79,11 @@ system:
|
|||||||
|
|
||||||
* `Python <https://www.python.org/>`_ with pip and virtualenv
|
* `Python <https://www.python.org/>`_ with pip and virtualenv
|
||||||
* `Doxygen <http://www.stack.nl/~dimitri/doxygen/>`_
|
* `Doxygen <http://www.stack.nl/~dimitri/doxygen/>`_
|
||||||
* `Less <http://lesscss.org/>`_ with less-plugin-clean-css
|
* `Less <http://lesscss.org/>`_ with ``less-plugin-clean-css``.
|
||||||
|
Ubuntu doesn't package the ``clean-css`` plugin so you should use ``npm``
|
||||||
|
instead of ``apt`` to install both ``less`` and the plugin::
|
||||||
|
|
||||||
|
sudo npm install -g less less-plugin-clean-css.
|
||||||
|
|
||||||
First generate makefiles or project files using CMake as described in
|
First generate makefiles or project files using CMake as described in
|
||||||
the previous section. Then compile the ``doc`` target/project, for example::
|
the previous section. Then compile the ``doc`` target/project, for example::
|
||||||
@@ -87,4 +108,4 @@ Homebrew
|
|||||||
|
|
||||||
fmt can be installed on OS X using `Homebrew <http://brew.sh/>`_::
|
fmt can be installed on OS X using `Homebrew <http://brew.sh/>`_::
|
||||||
|
|
||||||
brew install cppformat
|
brew install fmt
|
||||||
|
|||||||
@@ -47,8 +47,10 @@
|
|||||||
.highlight .mh { color: #208050 } /* Literal.Number.Hex */
|
.highlight .mh { color: #208050 } /* Literal.Number.Hex */
|
||||||
.highlight .mi { color: #208050 } /* Literal.Number.Integer */
|
.highlight .mi { color: #208050 } /* Literal.Number.Integer */
|
||||||
.highlight .mo { color: #208050 } /* Literal.Number.Oct */
|
.highlight .mo { color: #208050 } /* Literal.Number.Oct */
|
||||||
|
.highlight .sa { color: #4070a0 } /* Literal.String.Affix */
|
||||||
.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
|
.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
|
||||||
.highlight .sc { color: #4070a0 } /* Literal.String.Char */
|
.highlight .sc { color: #4070a0 } /* Literal.String.Char */
|
||||||
|
.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */
|
||||||
.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
|
.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
|
||||||
.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
|
.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
|
||||||
.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
|
.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
|
||||||
@@ -59,7 +61,9 @@
|
|||||||
.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
|
.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
|
||||||
.highlight .ss { color: #517918 } /* Literal.String.Symbol */
|
.highlight .ss { color: #517918 } /* Literal.String.Symbol */
|
||||||
.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
|
.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
|
||||||
|
.highlight .fm { color: #06287e } /* Name.Function.Magic */
|
||||||
.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
|
.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
|
||||||
.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
|
.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
|
||||||
.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
|
.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
|
||||||
|
.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */
|
||||||
.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */
|
.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */
|
||||||
+403
-130
@@ -8,7 +8,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
|
||||||
<title>API Reference — fmt 3.0.0 documentation</title>
|
<title>API Reference — fmt 4.0.0 documentation</title>
|
||||||
|
|
||||||
<link rel="stylesheet" href="_static/basic.css" type="text/css" />
|
<link rel="stylesheet" href="_static/basic.css" type="text/css" />
|
||||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||||
@@ -17,10 +17,11 @@
|
|||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var DOCUMENTATION_OPTIONS = {
|
var DOCUMENTATION_OPTIONS = {
|
||||||
URL_ROOT: './',
|
URL_ROOT: './',
|
||||||
VERSION: '3.0.0',
|
VERSION: '4.0.0',
|
||||||
COLLAPSE_INDEX: false,
|
COLLAPSE_INDEX: false,
|
||||||
FILE_SUFFIX: '.html',
|
FILE_SUFFIX: '.html',
|
||||||
HAS_SOURCE: true
|
HAS_SOURCE: true,
|
||||||
|
SOURCELINK_SUFFIX: ''
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<script type="text/javascript" src="_static/jquery.js"></script>
|
<script type="text/javascript" src="_static/jquery.js"></script>
|
||||||
@@ -35,8 +36,9 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();
|
||||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;
|
||||||
|
a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||||
ga('create', 'UA-20116650-4', 'fmtlib.net');
|
ga('create', 'UA-20116650-4', 'fmtlib.net');
|
||||||
ga('send', 'pageview');
|
ga('send', 'pageview');
|
||||||
@@ -50,7 +52,8 @@
|
|||||||
<div class="navbar-content">
|
<div class="navbar-content">
|
||||||
|
|
||||||
<div class="navbar-header">
|
<div class="navbar-header">
|
||||||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
|
<button type="button" class="navbar-toggle collapsed"
|
||||||
|
data-toggle="collapse" data-target=".navbar-collapse">
|
||||||
<span class="sr-only">Toggle navigation</span>
|
<span class="sr-only">Toggle navigation</span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
@@ -63,13 +66,17 @@
|
|||||||
<div class="collapse navbar-collapse">
|
<div class="collapse navbar-collapse">
|
||||||
<ul class="nav navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown"
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
|
role="button" aria-expanded="false">4.0.0
|
||||||
aria-expanded="false">3.0.0 <span class="caret"></span></a>
|
<span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="http://fmtlib.net/2.0.0/">2.0.0</a></li>
|
|
||||||
<li><a href="http://fmtlib.net/1.1.0/">1.1.0</a></li>
|
<li><a href="http://fmtlib.net/3.0.0">3.0.0</a></li>
|
||||||
<li><a href="http://fmtlib.net/1.0.0/">1.0.0</a></li>
|
|
||||||
|
<li><a href="http://fmtlib.net/2.0.0">2.0.0</a></li>
|
||||||
|
|
||||||
|
<li><a href="http://fmtlib.net/1.1.0">1.1.0</a></li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
@@ -82,7 +89,8 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="active"><a href="api.html">API <span class="sr-only">(current)</span></a></li>
|
<li class="active"><a href="api.html">API
|
||||||
|
<span class="sr-only">(current)</span></a></li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -92,9 +100,11 @@
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
<form class="navbar-form navbar-right" role="search" action="search.html" method="get">
|
<form class="navbar-form navbar-right" role="search" action="search.html"
|
||||||
|
method="get">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<input type="text" name="q" class="form-control" placeholder="Search" >
|
<input type="text" name="q" class="form-control"
|
||||||
|
placeholder="Search" >
|
||||||
</div>
|
</div>
|
||||||
<input type="hidden" name="check_keywords" value="yes" />
|
<input type="hidden" name="check_keywords" value="yes" />
|
||||||
<input type="hidden" name="area" value="default" />
|
<input type="hidden" name="area" value="default" />
|
||||||
@@ -122,13 +132,16 @@ in namespace <code class="docutils literal"><span class="pre">fmt</span></code>
|
|||||||
namespace is usually omitted in examples.</p>
|
namespace is usually omitted in examples.</p>
|
||||||
<div class="section" id="format-api">
|
<div class="section" id="format-api">
|
||||||
<h2>Format API<a class="headerlink" href="#format-api" title="Permalink to this headline">¶</a></h2>
|
<h2>Format API<a class="headerlink" href="#format-api" title="Permalink to this headline">¶</a></h2>
|
||||||
<p>The following functions use <a class="reference internal" href="syntax.html#syntax"><span class="std std-ref">format string syntax</span></a> similar
|
<p>The following functions defined in <code class="docutils literal"><span class="pre">fmt/format.h</span></code> use <a class="reference internal" href="syntax.html#syntax"><span class="std std-ref">format string
|
||||||
to the one used by Python’s <a class="reference external" href="http://docs.python.org/3/library/stdtypes.html#str.format">str.format</a> function.
|
syntax</span></a> similar to the one used by Python’s <a class="reference external" href="http://docs.python.org/3/library/stdtypes.html#str.format">str.format</a> function.
|
||||||
They take <em>format_str</em> and <em>args</em> as arguments.</p>
|
They take <em>format_str</em> and <em>args</em> as arguments.</p>
|
||||||
<p><em>format_str</em> is a format string that contains literal text and replacement
|
<p><em>format_str</em> is a format string that contains literal text and replacement
|
||||||
fields surrounded by braces <code class="docutils literal"><span class="pre">{}</span></code>. The fields are replaced with formatted
|
fields surrounded by braces <code class="docutils literal"><span class="pre">{}</span></code>. The fields are replaced with formatted
|
||||||
arguments in the resulting string.</p>
|
arguments in the resulting string.</p>
|
||||||
<p><em>args</em> is an argument list representing arbitrary arguments.</p>
|
<p><em>args</em> is an argument list representing arbitrary arguments.</p>
|
||||||
|
<p>The <a class="reference external" href="https://github.com/fmtlib/fmt/blob/master/README.rst#speed-tests">performance of the format API</a> is close
|
||||||
|
to that of glibc’s <code class="docutils literal"><span class="pre">printf</span></code> and better than the performance of IOStreams.
|
||||||
|
For even better speed use the <a class="reference internal" href="#write-api">write API</a>.</p>
|
||||||
<span class="target" id="format"></span><dl class="function">
|
<span class="target" id="format"></span><dl class="function">
|
||||||
<dt id="_CPPv2N3fmt6formatE10CStringRef7ArgList">
|
<dt id="_CPPv2N3fmt6formatE10CStringRef7ArgList">
|
||||||
<span id="fmt::format__CStringRef.ArgList"></span><span class="target" id="formatformat_8h_1a638f25c535b3bfa12dc1478b11885b6f"></span>std::string <code class="descclassname">fmt::</code><code class="descname">format</code><span class="sig-paren">(</span>CStringRef <em>format_str</em>, <a class="reference internal" href="#_CPPv2N3fmt7ArgListE" title="fmt::ArgList">ArgList</a> <em>args</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt6formatE10CStringRef7ArgList" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::format__CStringRef.ArgList"></span><span class="target" id="formatformat_8h_1a638f25c535b3bfa12dc1478b11885b6f"></span>std::string <code class="descclassname">fmt::</code><code class="descname">format</code><span class="sig-paren">(</span>CStringRef <em>format_str</em>, <a class="reference internal" href="#_CPPv2N3fmt7ArgListE" title="fmt::ArgList">ArgList</a> <em>args</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt6formatE10CStringRef7ArgList" title="Permalink to this definition">¶</a></dt>
|
||||||
@@ -140,18 +153,10 @@ arguments in the resulting string.</p>
|
|||||||
</p>
|
</p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<div class="admonition warning">
|
||||||
<dt id="_CPPv2N3fmt8literalsli7_formatEPKcNSt6size_tE">
|
<p class="first admonition-title">Warning</p>
|
||||||
<span class="target" id="formatformat_8h_1a8f568cdac4d075838347616fc4899417"></span>internal::UdlFormat<char> <code class="descclassname">fmt::literals::</code><code class="descname">operator""_format</code><span class="sig-paren">(</span><em class="property">const</em> char *<em>s</em>, std::size_t<span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt8literalsli7_formatEPKcNSt6size_tE" title="Permalink to this definition">¶</a></dt>
|
<p class="last">doxygenfunction: Cannot find function “operator”“_format” in doxygen xml output for project “format” from directory: /home/foonathan/Programming/fmt/build/doc/doxyxml</p>
|
||||||
<dd><p><p>C++11 literal equivalent of <a class="reference internal" href="#_CPPv2N3fmt6formatE10CStringRef7ArgList" title="fmt::format"><code class="xref cpp cpp-func docutils literal"><span class="pre">fmt::format()</span></code></a>.</p>
|
|
||||||
<p><strong>Example</strong>:</p>
|
|
||||||
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="k">using</span> <span class="k">namespace</span> <span class="n">fmt</span><span class="o">::</span><span class="n">literals</span><span class="p">;</span>
|
|
||||||
<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">message</span> <span class="o">=</span> <span class="s">"The answer is {}"</span><span class="n">_format</span><span class="p">(</span><span class="mi">42</span><span class="p">);</span>
|
|
||||||
</pre></div>
|
|
||||||
</div>
|
</div>
|
||||||
</p>
|
|
||||||
</dd></dl>
|
|
||||||
|
|
||||||
<span class="target" id="print"></span><dl class="function">
|
<span class="target" id="print"></span><dl class="function">
|
||||||
<dt id="_CPPv2N3fmt5printE10CStringRef7ArgList">
|
<dt id="_CPPv2N3fmt5printE10CStringRef7ArgList">
|
||||||
<span id="fmt::print__CStringRef.ArgList"></span><span class="target" id="formatformat_8h_1a7cfad68e64995774f11072aaf5008e8a"></span>void <code class="descclassname">fmt::</code><code class="descname">print</code><span class="sig-paren">(</span>CStringRef <em>format_str</em>, <a class="reference internal" href="#_CPPv2N3fmt7ArgListE" title="fmt::ArgList">ArgList</a> <em>args</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt5printE10CStringRef7ArgList" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::print__CStringRef.ArgList"></span><span class="target" id="formatformat_8h_1a7cfad68e64995774f11072aaf5008e8a"></span>void <code class="descclassname">fmt::</code><code class="descname">print</code><span class="sig-paren">(</span>CStringRef <em>format_str</em>, <a class="reference internal" href="#_CPPv2N3fmt7ArgListE" title="fmt::ArgList">ArgList</a> <em>args</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt5printE10CStringRef7ArgList" title="Permalink to this definition">¶</a></dt>
|
||||||
@@ -180,7 +185,8 @@ arguments in the resulting string.</p>
|
|||||||
<dt id="_CPPv2N3fmt14BasicFormatterE">
|
<dt id="_CPPv2N3fmt14BasicFormatterE">
|
||||||
<span id="fmt::BasicFormatter"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">BasicFormatter</code><a class="headerlink" href="#_CPPv2N3fmt14BasicFormatterE" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicFormatter"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">BasicFormatter</code><a class="headerlink" href="#_CPPv2N3fmt14BasicFormatterE" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>This template formats data and writes the output to a writer. </p>
|
<dd><p>This template formats data and writes the output to a writer. </p>
|
||||||
<div class="breathe-sectiondef container">
|
<p>Inherits from fmt::internal::FormatterBase</p>
|
||||||
|
<div class="breathe-sectiondef docutils container">
|
||||||
<p class="breathe-sectiondef-title rubric">Public Types</p>
|
<p class="breathe-sectiondef-title rubric">Public Types</p>
|
||||||
<dl class="type">
|
<dl class="type">
|
||||||
<dt id="_CPPv2N3fmt14BasicFormatter4CharE">
|
<dt id="_CPPv2N3fmt14BasicFormatter4CharE">
|
||||||
@@ -189,7 +195,7 @@ arguments in the resulting string.</p>
|
|||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="breathe-sectiondef container">
|
<div class="breathe-sectiondef docutils container">
|
||||||
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt14BasicFormatter14BasicFormatterERK7ArgListR11BasicWriterI4CharE">
|
<dt id="_CPPv2N3fmt14BasicFormatter14BasicFormatterERK7ArgListR11BasicWriterI4CharE">
|
||||||
@@ -217,8 +223,8 @@ appropriate lifetimes.</p>
|
|||||||
|
|
||||||
<div class="section" id="date-and-time-formatting">
|
<div class="section" id="date-and-time-formatting">
|
||||||
<h3>Date and time formatting<a class="headerlink" href="#date-and-time-formatting" title="Permalink to this headline">¶</a></h3>
|
<h3>Date and time formatting<a class="headerlink" href="#date-and-time-formatting" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>The library supports <a class="reference external" href="http://en.cppreference.com/w/cpp/chrono/c/strftime">strftime</a>-like
|
<p>The library supports <a class="reference external" href="http://en.cppreference.com/w/cpp/chrono/c/strftime">strftime</a>-like date and time
|
||||||
date and time formatting:</p>
|
formatting:</p>
|
||||||
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="cp">#include</span> <span class="cpf">"fmt/time.h"</span><span class="cp"></span>
|
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="cp">#include</span> <span class="cpf">"fmt/time.h"</span><span class="cp"></span>
|
||||||
|
|
||||||
<span class="n">std</span><span class="o">::</span><span class="kt">time_t</span> <span class="n">t</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">time</span><span class="p">(</span><span class="k">nullptr</span><span class="p">);</span>
|
<span class="n">std</span><span class="o">::</span><span class="kt">time_t</span> <span class="n">t</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">time</span><span class="p">(</span><span class="k">nullptr</span><span class="p">);</span>
|
||||||
@@ -229,6 +235,32 @@ date and time formatting:</p>
|
|||||||
<p>The format string syntax is described in the documentation of
|
<p>The format string syntax is described in the documentation of
|
||||||
<a class="reference external" href="http://en.cppreference.com/w/cpp/chrono/c/strftime">strftime</a>.</p>
|
<a class="reference external" href="http://en.cppreference.com/w/cpp/chrono/c/strftime">strftime</a>.</p>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="section" id="formatting-user-defined-types">
|
||||||
|
<h3>Formatting user-defined types<a class="headerlink" href="#formatting-user-defined-types" title="Permalink to this headline">¶</a></h3>
|
||||||
|
<p>A custom <code class="docutils literal"><span class="pre">format_arg</span></code> function may be implemented and used to format any
|
||||||
|
user-defined type. That is how date and time formatting described in the
|
||||||
|
previous section is implemented in <code class="file docutils literal"><span class="pre">fmt/time.h</span></code>. The following example
|
||||||
|
shows how to implement custom formatting for a user-defined structure.</p>
|
||||||
|
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="k">struct</span> <span class="n">MyStruct</span> <span class="p">{</span> <span class="kt">double</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">;</span> <span class="p">};</span>
|
||||||
|
|
||||||
|
<span class="kt">void</span> <span class="nf">format_arg</span><span class="p">(</span><span class="n">fmt</span><span class="o">::</span><span class="n">BasicFormatter</span><span class="o"><</span><span class="kt">char</span><span class="o">></span> <span class="o">&</span><span class="n">f</span><span class="p">,</span>
|
||||||
|
<span class="k">const</span> <span class="kt">char</span> <span class="o">*&</span><span class="n">format_str</span><span class="p">,</span> <span class="k">const</span> <span class="n">MyStruct</span> <span class="o">&</span><span class="n">s</span><span class="p">)</span> <span class="p">{</span>
|
||||||
|
<span class="n">f</span><span class="p">.</span><span class="n">writer</span><span class="p">().</span><span class="n">write</span><span class="p">(</span><span class="s">"[MyStruct: a={:.1f}, b={:.2f}]"</span><span class="p">,</span> <span class="n">s</span><span class="p">.</span><span class="n">a</span><span class="p">,</span> <span class="n">s</span><span class="p">.</span><span class="n">b</span><span class="p">);</span>
|
||||||
|
<span class="p">}</span>
|
||||||
|
|
||||||
|
<span class="n">MyStruct</span> <span class="n">m</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span> <span class="p">};</span>
|
||||||
|
<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">s</span> <span class="o">=</span> <span class="n">fmt</span><span class="o">::</span><span class="n">format</span><span class="p">(</span><span class="s">"m={}"</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
|
||||||
|
<span class="c1">// s == "m=[MyStruct: a=1.0, b=2.00]"</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>Note in the example above the <code class="docutils literal"><span class="pre">format_arg</span></code> function ignores the contents of
|
||||||
|
<code class="docutils literal"><span class="pre">format_str</span></code> so the type will always be formatted as specified. See
|
||||||
|
<code class="docutils literal"><span class="pre">format_arg</span></code> in <code class="file docutils literal"><span class="pre">fmt/time.h</span></code> for an advanced example of how to use
|
||||||
|
the <code class="docutils literal"><span class="pre">format_str</span></code> argument to customize the formatted output.</p>
|
||||||
|
<p>This section shows how to define a custom format function for a user-defined
|
||||||
|
type. The next section describes how to get <code class="docutils literal"><span class="pre">fmt</span></code> to use a conventional stream
|
||||||
|
output <code class="docutils literal"><span class="pre">operator<<</span></code> when one is defined for a user-defined type.</p>
|
||||||
|
</div>
|
||||||
<div class="section" id="std-ostream-support">
|
<div class="section" id="std-ostream-support">
|
||||||
<h3><code class="docutils literal"><span class="pre">std::ostream</span></code> support<a class="headerlink" href="#std-ostream-support" title="Permalink to this headline">¶</a></h3>
|
<h3><code class="docutils literal"><span class="pre">std::ostream</span></code> support<a class="headerlink" href="#std-ostream-support" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>The header <code class="docutils literal"><span class="pre">fmt/ostream.h</span></code> provides <code class="docutils literal"><span class="pre">std::ostream</span></code> support including
|
<p>The header <code class="docutils literal"><span class="pre">fmt/ostream.h</span></code> provides <code class="docutils literal"><span class="pre">std::ostream</span></code> support including
|
||||||
@@ -260,17 +292,6 @@ formatting of user-defined types that have overloaded <code class="docutils lite
|
|||||||
</p>
|
</p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
|
||||||
<dt id="_CPPv2N3fmt7fprintfERNSt7ostreamE10CStringRef7ArgList">
|
|
||||||
<span id="fmt::fprintf__osR.CStringRef.ArgList"></span><span class="target" id="formatostream_8h_1adf9e00e4ddf5cad224a101333cfac9e8"></span>int <code class="descclassname">fmt::</code><code class="descname">fprintf</code><span class="sig-paren">(</span>std::ostream &<em>os</em>, CStringRef <em>format_str</em>, <a class="reference internal" href="#_CPPv2N3fmt7ArgListE" title="fmt::ArgList">ArgList</a> <em>args</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt7fprintfERNSt7ostreamE10CStringRef7ArgList" title="Permalink to this definition">¶</a></dt>
|
|
||||||
<dd><p><p>Prints formatted data to the stream <em>os</em>.</p>
|
|
||||||
<p><strong>Example</strong>:</p>
|
|
||||||
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="n">fprintf</span><span class="p">(</span><span class="n">cerr</span><span class="p">,</span> <span class="s">"Don't %s!"</span><span class="p">,</span> <span class="s">"panic"</span><span class="p">);</span>
|
|
||||||
</pre></div>
|
|
||||||
</div>
|
|
||||||
</p>
|
|
||||||
</dd></dl>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="argument-formatters">
|
<div class="section" id="argument-formatters">
|
||||||
<h3>Argument formatters<a class="headerlink" href="#argument-formatters" title="Permalink to this headline">¶</a></h3>
|
<h3>Argument formatters<a class="headerlink" href="#argument-formatters" title="Permalink to this headline">¶</a></h3>
|
||||||
@@ -329,7 +350,7 @@ then a corresponding method of <a class="reference internal" href="#_CPPv2N3fmt1
|
|||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</p>
|
</p>
|
||||||
<div class="breathe-sectiondef container">
|
<div class="breathe-sectiondef docutils container">
|
||||||
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt10ArgVisitor9visit_intEi">
|
<dt id="_CPPv2N3fmt10ArgVisitor9visit_intEi">
|
||||||
@@ -440,7 +461,7 @@ called.</p>
|
|||||||
|
|
||||||
<dl class="class">
|
<dl class="class">
|
||||||
<dt>
|
<dt>
|
||||||
<span class="target" id="formatclassfmt_1_1_basic_arg_formatter"></span><em class="property">template </em><typename <em>Impl</em>, typename <em>Char</em>></dt>
|
<span class="target" id="formatclassfmt_1_1_basic_arg_formatter"></span><em class="property">template </em><typename <em>Impl</em>, typename <em>Char</em>, typename <em>Spec</em> = fmt::FormatSpec></dt>
|
||||||
<dt id="_CPPv2N3fmt17BasicArgFormatterE">
|
<dt id="_CPPv2N3fmt17BasicArgFormatterE">
|
||||||
<span id="fmt::BasicArgFormatter"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">BasicArgFormatter</code><a class="headerlink" href="#_CPPv2N3fmt17BasicArgFormatterE" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicArgFormatter"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">BasicArgFormatter</code><a class="headerlink" href="#_CPPv2N3fmt17BasicArgFormatterE" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>An argument formatter based on the <a class="reference external" href="http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern">curiously recurring template pattern</a>.</p>
|
<dd><p><p>An argument formatter based on the <a class="reference external" href="http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern">curiously recurring template pattern</a>.</p>
|
||||||
@@ -455,11 +476,12 @@ will be called. If the subclass doesn’t contain a method with this signatu
|
|||||||
then a corresponding method of <a class="reference internal" href="#_CPPv2N3fmt17BasicArgFormatterE" title="fmt::BasicArgFormatter"><code class="xref cpp cpp-any docutils literal"><span class="pre">BasicArgFormatter</span></code></a> or its superclass
|
then a corresponding method of <a class="reference internal" href="#_CPPv2N3fmt17BasicArgFormatterE" title="fmt::BasicArgFormatter"><code class="xref cpp cpp-any docutils literal"><span class="pre">BasicArgFormatter</span></code></a> or its superclass
|
||||||
will be called.</p>
|
will be called.</p>
|
||||||
</p>
|
</p>
|
||||||
<div class="breathe-sectiondef container">
|
<p>Inherits from fmt::internal::ArgFormatterBase< Impl, Char, Spec ></p>
|
||||||
|
<div class="breathe-sectiondef docutils container">
|
||||||
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt17BasicArgFormatter17BasicArgFormatterER14BasicFormatterI4Char4ImplER10FormatSpecPK4Char">
|
<dt id="_CPPv2N3fmt17BasicArgFormatter17BasicArgFormatterER14BasicFormatterI4Char4ImplER4SpecPK4Char">
|
||||||
<span id="fmt::BasicArgFormatter::BasicArgFormatter__BasicFormatter:Char.Impl:R.FormatSpecR.CharCP"></span><span class="target" id="formatclassfmt_1_1_basic_arg_formatter_1a207b17b258c5e16cf61ebfc9b13211d3"></span><code class="descname">BasicArgFormatter</code><span class="sig-paren">(</span><a class="reference internal" href="#_CPPv2N3fmt14BasicFormatterE" title="fmt::BasicFormatter">BasicFormatter</a><Char, Impl> &<em>formatter</em>, FormatSpec &<em>spec</em>, <em class="property">const</em> Char *<em>fmt</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt17BasicArgFormatter17BasicArgFormatterER14BasicFormatterI4Char4ImplER10FormatSpecPK4Char" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicArgFormatter::BasicArgFormatter__BasicFormatter:Char.Impl:R.SpecR.CharCP"></span><span class="target" id="formatclassfmt_1_1_basic_arg_formatter_1a9fbfaaf573b6714ed03894326b0a5106"></span><code class="descname">BasicArgFormatter</code><span class="sig-paren">(</span><a class="reference internal" href="#_CPPv2N3fmt14BasicFormatterE" title="fmt::BasicFormatter">BasicFormatter</a><Char, Impl> &<em>formatter</em>, Spec &<em>spec</em>, <em class="property">const</em> Char *<em>fmt</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt17BasicArgFormatter17BasicArgFormatterER14BasicFormatterI4Char4ImplER4SpecPK4Char" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>Constructs an argument formatter object.
|
<dd><p><p>Constructs an argument formatter object.
|
||||||
<em>formatter</em> is a reference to the main formatter object, <em>spec</em> contains
|
<em>formatter</em> is a reference to the main formatter object, <em>spec</em> contains
|
||||||
format specifier information for standard argument types, and <em>fmt</em> points
|
format specifier information for standard argument types, and <em>fmt</em> points
|
||||||
@@ -469,8 +491,8 @@ to the part of the format string being parsed for custom argument types.</p>
|
|||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt17BasicArgFormatter12visit_customEN8internal3Arg11CustomValueE">
|
<dt id="_CPPv2N3fmt17BasicArgFormatter12visit_customEN8internal3Arg11CustomValueE">
|
||||||
<span id="fmt::BasicArgFormatter::visit_custom__internal::Arg::CustomValue"></span><span class="target" id="formatclassfmt_1_1_basic_arg_formatter_1ae0aab0f90c9c93e3513203fc84c2c4dc"></span>void <code class="descname">visit_custom</code><span class="sig-paren">(</span>internal::Arg::CustomValue <em>c</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt17BasicArgFormatter12visit_customEN8internal3Arg11CustomValueE" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicArgFormatter::visit_custom__internal::Arg::CustomValue"></span><span class="target" id="formatclassfmt_1_1_basic_arg_formatter_1acc822e8efaa99b664deaf38b08950b88"></span>void <code class="descname">visit_custom</code><span class="sig-paren">(</span>internal::Arg::CustomValue <em>c</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt17BasicArgFormatter12visit_customEN8internal3Arg11CustomValueE" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>Formats argument of a custom (user-defined) type. </p>
|
<dd><p>Formats an argument of a custom (user-defined) type. </p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -482,7 +504,8 @@ to the part of the format string being parsed for custom argument types.</p>
|
|||||||
<dt id="_CPPv2N3fmt12ArgFormatterE">
|
<dt id="_CPPv2N3fmt12ArgFormatterE">
|
||||||
<span id="fmt::ArgFormatter"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">ArgFormatter</code><a class="headerlink" href="#_CPPv2N3fmt12ArgFormatterE" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::ArgFormatter"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">ArgFormatter</code><a class="headerlink" href="#_CPPv2N3fmt12ArgFormatterE" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>The default argument formatter. </p>
|
<dd><p>The default argument formatter. </p>
|
||||||
<div class="breathe-sectiondef container">
|
<p>Inherits from <a class="reference internal" href="#formatclassfmt_1_1_basic_arg_formatter"><span class="std std-ref">fmt::BasicArgFormatter< ArgFormatter< Char >, Char, FormatSpec ></span></a></p>
|
||||||
|
<div class="breathe-sectiondef docutils container">
|
||||||
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt12ArgFormatter12ArgFormatterER14BasicFormatterI4CharER10FormatSpecPK4Char">
|
<dt id="_CPPv2N3fmt12ArgFormatter12ArgFormatterER14BasicFormatterI4CharER10FormatSpecPK4Char">
|
||||||
@@ -494,13 +517,16 @@ to the part of the format string being parsed for custom argument types.</p>
|
|||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="printf-formatting-functions">
|
<div class="section" id="printf-formatting">
|
||||||
<h3>Printf formatting functions<a class="headerlink" href="#printf-formatting-functions" title="Permalink to this headline">¶</a></h3>
|
<h3>Printf formatting<a class="headerlink" href="#printf-formatting" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>The following functions use <a class="reference external" href="http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html">printf format string syntax</a> with
|
<p>The header <code class="docutils literal"><span class="pre">fmt/printf.h</span></code> provides <code class="docutils literal"><span class="pre">printf</span></code>-like formatting functionality.
|
||||||
a POSIX extension for positional arguments.</p>
|
The following functions use <a class="reference external" href="http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html">printf format string syntax</a> with
|
||||||
|
the POSIX extension for positional arguments. Unlike their standard
|
||||||
|
counterparts, the <code class="docutils literal"><span class="pre">fmt</span></code> functions are type-safe and throw an exception if an
|
||||||
|
argument type doesn’t match its format specification.</p>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt6printfE10CStringRef7ArgList">
|
<dt id="_CPPv2N3fmt6printfE10CStringRef7ArgList">
|
||||||
<span id="fmt::printf__CStringRef.ArgList"></span><span class="target" id="formatformat_8h_1aa936ffccf89f4609cd9fce18825f0b14"></span>int <code class="descclassname">fmt::</code><code class="descname">printf</code><span class="sig-paren">(</span>CStringRef <em>format</em>, <a class="reference internal" href="#_CPPv2N3fmt7ArgListE" title="fmt::ArgList">ArgList</a> <em>args</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt6printfE10CStringRef7ArgList" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::printf__CStringRef.ArgList"></span><span class="target" id="formatprintf_8h_1aa936ffccf89f4609cd9fce18825f0b14"></span>int <code class="descclassname">fmt::</code><code class="descname">printf</code><span class="sig-paren">(</span>CStringRef <em>format</em>, <a class="reference internal" href="#_CPPv2N3fmt7ArgListE" title="fmt::ArgList">ArgList</a> <em>args</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt6printfE10CStringRef7ArgList" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>Prints formatted data to <code class="docutils literal"><span class="pre">stdout</span></code>.</p>
|
<dd><p><p>Prints formatted data to <code class="docutils literal"><span class="pre">stdout</span></code>.</p>
|
||||||
<p><strong>Example</strong>:</p>
|
<p><strong>Example</strong>:</p>
|
||||||
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="n">fmt</span><span class="o">::</span><span class="n">printf</span><span class="p">(</span><span class="s">"Elapsed time: %.2f seconds"</span><span class="p">,</span> <span class="mf">1.23</span><span class="p">);</span>
|
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="n">fmt</span><span class="o">::</span><span class="n">printf</span><span class="p">(</span><span class="s">"Elapsed time: %.2f seconds"</span><span class="p">,</span> <span class="mf">1.23</span><span class="p">);</span>
|
||||||
@@ -511,7 +537,7 @@ a POSIX extension for positional arguments.</p>
|
|||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt7fprintfEPNSt4FILEE10CStringRef7ArgList">
|
<dt id="_CPPv2N3fmt7fprintfEPNSt4FILEE10CStringRef7ArgList">
|
||||||
<span id="fmt::fprintf__std::FILEP.CStringRef.ArgList"></span><span class="target" id="formatformat_8h_1ae70c0a9615eef5e1e78450496d2a90e6"></span>int <code class="descclassname">fmt::</code><code class="descname">fprintf</code><span class="sig-paren">(</span>std::FILE *<em>f</em>, CStringRef <em>format</em>, <a class="reference internal" href="#_CPPv2N3fmt7ArgListE" title="fmt::ArgList">ArgList</a> <em>args</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt7fprintfEPNSt4FILEE10CStringRef7ArgList" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::fprintf__std::FILEP.CStringRef.ArgList"></span><span class="target" id="formatprintf_8h_1ae70c0a9615eef5e1e78450496d2a90e6"></span>int <code class="descclassname">fmt::</code><code class="descname">fprintf</code><span class="sig-paren">(</span>std::FILE *<em>f</em>, CStringRef <em>format</em>, <a class="reference internal" href="#_CPPv2N3fmt7ArgListE" title="fmt::ArgList">ArgList</a> <em>args</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt7fprintfEPNSt4FILEE10CStringRef7ArgList" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>Prints formatted data to the file <em>f</em>.</p>
|
<dd><p><p>Prints formatted data to the file <em>f</em>.</p>
|
||||||
<p><strong>Example</strong>:</p>
|
<p><strong>Example</strong>:</p>
|
||||||
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="n">fmt</span><span class="o">::</span><span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">"Don't %s!"</span><span class="p">,</span> <span class="s">"panic"</span><span class="p">);</span>
|
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="n">fmt</span><span class="o">::</span><span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">"Don't %s!"</span><span class="p">,</span> <span class="s">"panic"</span><span class="p">);</span>
|
||||||
@@ -520,9 +546,20 @@ a POSIX extension for positional arguments.</p>
|
|||||||
</p>
|
</p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
|
<dl class="function">
|
||||||
|
<dt id="_CPPv2N3fmt7fprintfERNSt7ostreamE10CStringRef7ArgList">
|
||||||
|
<span id="fmt::fprintf__osR.CStringRef.ArgList"></span><span class="target" id="formatprintf_8h_1adf9e00e4ddf5cad224a101333cfac9e8"></span>int <code class="descclassname">fmt::</code><code class="descname">fprintf</code><span class="sig-paren">(</span>std::ostream &<em>os</em>, CStringRef <em>format_str</em>, <a class="reference internal" href="#_CPPv2N3fmt7ArgListE" title="fmt::ArgList">ArgList</a> <em>args</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt7fprintfERNSt7ostreamE10CStringRef7ArgList" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p><p>Prints formatted data to the stream <em>os</em>.</p>
|
||||||
|
<p><strong>Example</strong>:</p>
|
||||||
|
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="n">fprintf</span><span class="p">(</span><span class="n">cerr</span><span class="p">,</span> <span class="s">"Don't %s!"</span><span class="p">,</span> <span class="s">"panic"</span><span class="p">);</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</p>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt7sprintfE10CStringRef7ArgList">
|
<dt id="_CPPv2N3fmt7sprintfE10CStringRef7ArgList">
|
||||||
<span id="fmt::sprintf__CStringRef.ArgList"></span><span class="target" id="formatformat_8h_1a956d655d1291fb85203c58fadd4bba1a"></span>std::string <code class="descclassname">fmt::</code><code class="descname">sprintf</code><span class="sig-paren">(</span>CStringRef <em>format</em>, <a class="reference internal" href="#_CPPv2N3fmt7ArgListE" title="fmt::ArgList">ArgList</a> <em>args</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt7sprintfE10CStringRef7ArgList" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::sprintf__CStringRef.ArgList"></span><span class="target" id="formatprintf_8h_1a956d655d1291fb85203c58fadd4bba1a"></span>std::string <code class="descclassname">fmt::</code><code class="descname">sprintf</code><span class="sig-paren">(</span>CStringRef <em>format</em>, <a class="reference internal" href="#_CPPv2N3fmt7ArgListE" title="fmt::ArgList">ArgList</a> <em>args</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt7sprintfE10CStringRef7ArgList" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>Formats arguments and returns the result as a string.</p>
|
<dd><p><p>Formats arguments and returns the result as a string.</p>
|
||||||
<p><strong>Example</strong>:</p>
|
<p><strong>Example</strong>:</p>
|
||||||
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">message</span> <span class="o">=</span> <span class="n">fmt</span><span class="o">::</span><span class="n">sprintf</span><span class="p">(</span><span class="s">"The answer is %d"</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>
|
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">message</span> <span class="o">=</span> <span class="n">fmt</span><span class="o">::</span><span class="n">sprintf</span><span class="p">(</span><span class="s">"The answer is %d"</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>
|
||||||
@@ -531,10 +568,124 @@ a POSIX extension for positional arguments.</p>
|
|||||||
</p>
|
</p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
|
<dl class="class">
|
||||||
|
<dt>
|
||||||
|
<span class="target" id="formatclassfmt_1_1_printf_formatter"></span><em class="property">template </em><typename <em>Char</em>, typename <em>ArgFormatter</em> = <a class="reference internal" href="#formatclassfmt_1_1_printf_arg_formatter"><span class="std std-ref">PrintfArgFormatter</span></a><Char>></dt>
|
||||||
|
<dt id="_CPPv2N3fmt15PrintfFormatterE">
|
||||||
|
<span id="fmt::PrintfFormatter"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">PrintfFormatter</code><a class="headerlink" href="#_CPPv2N3fmt15PrintfFormatterE" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p>This template formats data and writes the output to a writer. </p>
|
||||||
|
<p>Inherits from fmt::internal::FormatterBase</p>
|
||||||
|
<div class="breathe-sectiondef docutils container">
|
||||||
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
|
<dl class="function">
|
||||||
|
<dt id="_CPPv2N3fmt15PrintfFormatter15PrintfFormatterERK7ArgListR11BasicWriterI4CharE">
|
||||||
|
<span id="fmt::PrintfFormatter::PrintfFormatter__ArgListCR.BasicWriter:Char:R"></span><span class="target" id="formatclassfmt_1_1_printf_formatter_1a9cb3cad9a8e4cd08445e9ff2338d40b0"></span><code class="descname">PrintfFormatter</code><span class="sig-paren">(</span><em class="property">const</em> <a class="reference internal" href="#_CPPv2N3fmt7ArgListE" title="fmt::ArgList">ArgList</a> &<em>al</em>, <a class="reference internal" href="#_CPPv2N3fmt11BasicWriterE" title="fmt::BasicWriter">BasicWriter</a><Char> &<em>w</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt15PrintfFormatter15PrintfFormatterERK7ArgListR11BasicWriterI4CharE" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p><p>Constructs a <code class="docutils literal"><span class="pre">PrintfFormatter</span></code> object. References to the arguments and
|
||||||
|
the writer are stored in the formatter object so make sure they have
|
||||||
|
appropriate lifetimes.</p>
|
||||||
|
</p>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
<dl class="function">
|
||||||
|
<dt id="_CPPv2N3fmt15PrintfFormatter6formatE15BasicCStringRefI4CharE">
|
||||||
|
<span id="fmt::PrintfFormatter::format__BasicCStringRef:Char:"></span><span class="target" id="formatclassfmt_1_1_printf_formatter_1a295c50e11b9a77720c8078f287040e5c"></span>void <code class="descname">format</code><span class="sig-paren">(</span><a class="reference internal" href="#_CPPv2N3fmt15BasicCStringRefE" title="fmt::BasicCStringRef">BasicCStringRef</a><Char> <em>format_str</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt15PrintfFormatter6formatE15BasicCStringRefI4CharE" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p>Formats stored arguments and writes the output to the writer. </p>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
<dl class="class">
|
||||||
|
<dt>
|
||||||
|
<span class="target" id="formatclassfmt_1_1_basic_printf_arg_formatter"></span><em class="property">template </em><typename <em>Impl</em>, typename <em>Char</em>, typename <em>Spec</em>></dt>
|
||||||
|
<dt id="_CPPv2N3fmt23BasicPrintfArgFormatterE">
|
||||||
|
<span id="fmt::BasicPrintfArgFormatter"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">BasicPrintfArgFormatter</code><a class="headerlink" href="#_CPPv2N3fmt23BasicPrintfArgFormatterE" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p><p>A <code class="docutils literal"><span class="pre">printf</span></code> argument formatter based on the <a class="reference external" href="http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern">curiously recurring template
|
||||||
|
pattern</a>.</p>
|
||||||
|
<p>To use <a class="reference internal" href="#_CPPv2N3fmt23BasicPrintfArgFormatterE" title="fmt::BasicPrintfArgFormatter"><code class="xref cpp cpp-any docutils literal"><span class="pre">BasicPrintfArgFormatter</span></code></a> define a subclass that implements some
|
||||||
|
or all of the visit methods with the same signatures as the methods in
|
||||||
|
<a class="reference internal" href="#_CPPv2N3fmt10ArgVisitorE" title="fmt::ArgVisitor"><code class="xref cpp cpp-any docutils literal"><span class="pre">ArgVisitor</span></code></a>, for example, <a class="reference internal" href="#_CPPv2N3fmt10ArgVisitor9visit_intEi" title="fmt::ArgVisitor::visit_int"><code class="xref cpp cpp-any docutils literal"><span class="pre">visit_int()</span></code></a>.
|
||||||
|
Pass the subclass as the <em>Impl</em> template parameter. When a formatting
|
||||||
|
function processes an argument, it will dispatch to a visit method
|
||||||
|
specific to the argument type. For example, if the argument type is
|
||||||
|
<code class="docutils literal"><span class="pre">double</span></code> then the <a class="reference internal" href="#_CPPv2N3fmt10ArgVisitor12visit_doubleEd" title="fmt::ArgVisitor::visit_double"><code class="xref cpp cpp-any docutils literal"><span class="pre">visit_double()</span></code></a> method of a subclass
|
||||||
|
will be called. If the subclass doesn’t contain a method with this signature,
|
||||||
|
then a corresponding method of <a class="reference internal" href="#_CPPv2N3fmt23BasicPrintfArgFormatterE" title="fmt::BasicPrintfArgFormatter"><code class="xref cpp cpp-any docutils literal"><span class="pre">BasicPrintfArgFormatter</span></code></a> or its
|
||||||
|
superclass will be called.</p>
|
||||||
|
</p>
|
||||||
|
<p>Inherits from fmt::internal::ArgFormatterBase< Impl, Char, Spec ></p>
|
||||||
|
<div class="breathe-sectiondef docutils container">
|
||||||
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
|
<dl class="function">
|
||||||
|
<dt id="_CPPv2N3fmt23BasicPrintfArgFormatter23BasicPrintfArgFormatterER11BasicWriterI4CharER4Spec">
|
||||||
|
<span id="fmt::BasicPrintfArgFormatter::BasicPrintfArgFormatter__BasicWriter:Char:R.SpecR"></span><span class="target" id="formatclassfmt_1_1_basic_printf_arg_formatter_1a7027cf03f0a54f8d7e53563e948d9f54"></span><code class="descname">BasicPrintfArgFormatter</code><span class="sig-paren">(</span><a class="reference internal" href="#_CPPv2N3fmt11BasicWriterE" title="fmt::BasicWriter">BasicWriter</a><Char> &<em>w</em>, Spec &<em>s</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt23BasicPrintfArgFormatter23BasicPrintfArgFormatterER11BasicWriterI4CharER4Spec" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p><p>Constructs an argument formatter object.
|
||||||
|
<em>writer</em> is a reference to the output writer and <em>spec</em> contains format
|
||||||
|
specifier information for standard argument types.</p>
|
||||||
|
</p>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
<dl class="function">
|
||||||
|
<dt id="_CPPv2N3fmt23BasicPrintfArgFormatter10visit_boolEb">
|
||||||
|
<span id="fmt::BasicPrintfArgFormatter::visit_bool__b"></span><span class="target" id="formatclassfmt_1_1_basic_printf_arg_formatter_1a5a8896e3b7e60b678ad7ac1145d2d7db"></span>void <code class="descname">visit_bool</code><span class="sig-paren">(</span>bool <em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt23BasicPrintfArgFormatter10visit_boolEb" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p>Formats an argument of type <code class="docutils literal"><span class="pre">bool</span></code>. </p>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
<dl class="function">
|
||||||
|
<dt id="_CPPv2N3fmt23BasicPrintfArgFormatter10visit_charEi">
|
||||||
|
<span id="fmt::BasicPrintfArgFormatter::visit_char__i"></span><span class="target" id="formatclassfmt_1_1_basic_printf_arg_formatter_1a6d6a9710fe756a8682efa6e83eea8146"></span>void <code class="descname">visit_char</code><span class="sig-paren">(</span>int <em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt23BasicPrintfArgFormatter10visit_charEi" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p>Formats a character. </p>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
<dl class="function">
|
||||||
|
<dt id="_CPPv2N3fmt23BasicPrintfArgFormatter13visit_cstringEPKc">
|
||||||
|
<span id="fmt::BasicPrintfArgFormatter::visit_cstring__cCP"></span><span class="target" id="formatclassfmt_1_1_basic_printf_arg_formatter_1a202e5093c8d7ab388c05f58956e8f721"></span>void <code class="descname">visit_cstring</code><span class="sig-paren">(</span><em class="property">const</em> char *<em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt23BasicPrintfArgFormatter13visit_cstringEPKc" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p>Formats a null-terminated C string. </p>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
<dl class="function">
|
||||||
|
<dt id="_CPPv2N3fmt23BasicPrintfArgFormatter13visit_pointerEPKv">
|
||||||
|
<span id="fmt::BasicPrintfArgFormatter::visit_pointer__voidCP"></span><span class="target" id="formatclassfmt_1_1_basic_printf_arg_formatter_1a4184ac39a994f38d4b4850393e413a1c"></span>void <code class="descname">visit_pointer</code><span class="sig-paren">(</span><em class="property">const</em> void *<em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt23BasicPrintfArgFormatter13visit_pointerEPKv" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p>Formats a pointer. </p>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
<dl class="function">
|
||||||
|
<dt id="_CPPv2N3fmt23BasicPrintfArgFormatter12visit_customEN8internal3Arg11CustomValueE">
|
||||||
|
<span id="fmt::BasicPrintfArgFormatter::visit_custom__internal::Arg::CustomValue"></span><span class="target" id="formatclassfmt_1_1_basic_printf_arg_formatter_1a5ad1e99dfd69b88a6b7940c1bfc52d23"></span>void <code class="descname">visit_custom</code><span class="sig-paren">(</span>internal::Arg::CustomValue <em>c</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt23BasicPrintfArgFormatter12visit_customEN8internal3Arg11CustomValueE" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p>Formats an argument of a custom (user-defined) type. </p>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
<dl class="class">
|
||||||
|
<dt>
|
||||||
|
<span class="target" id="formatclassfmt_1_1_printf_arg_formatter"></span><em class="property">template </em><<em class="property">typename</em> Char></dt>
|
||||||
|
<dt id="_CPPv2N3fmt18PrintfArgFormatterE">
|
||||||
|
<span id="fmt::PrintfArgFormatter"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">PrintfArgFormatter</code><a class="headerlink" href="#_CPPv2N3fmt18PrintfArgFormatterE" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p>The default printf argument formatter. </p>
|
||||||
|
<p>Inherits from <a class="reference internal" href="#formatclassfmt_1_1_basic_printf_arg_formatter"><span class="std std-ref">fmt::BasicPrintfArgFormatter< PrintfArgFormatter< Char >, Char, FormatSpec ></span></a></p>
|
||||||
|
<div class="breathe-sectiondef docutils container">
|
||||||
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
|
<dl class="function">
|
||||||
|
<dt id="_CPPv2N3fmt18PrintfArgFormatter18PrintfArgFormatterER11BasicWriterI4CharER10FormatSpec">
|
||||||
|
<span id="fmt::PrintfArgFormatter::PrintfArgFormatter__BasicWriter:Char:R.FormatSpecR"></span><span class="target" id="formatclassfmt_1_1_printf_arg_formatter_1aa4b9526d3c614205d607f63918c33245"></span><code class="descname">PrintfArgFormatter</code><span class="sig-paren">(</span><a class="reference internal" href="#_CPPv2N3fmt11BasicWriterE" title="fmt::BasicWriter">BasicWriter</a><Char> &<em>w</em>, FormatSpec &<em>s</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt18PrintfArgFormatter18PrintfArgFormatterER11BasicWriterI4CharER10FormatSpec" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p>Constructs an argument formatter object. </p>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="write-api">
|
<div class="section" id="write-api">
|
||||||
<h2>Write API<a class="headerlink" href="#write-api" title="Permalink to this headline">¶</a></h2>
|
<h2>Write API<a class="headerlink" href="#write-api" title="Permalink to this headline">¶</a></h2>
|
||||||
|
<p>The write API provides classes for writing formatted data into character
|
||||||
|
streams. It is usually faster than the <a class="reference internal" href="#format-api">format API</a> but, as IOStreams,
|
||||||
|
may result in larger compiled code size. The main writer class is
|
||||||
|
<a class="reference internal" href="#_CPPv2N3fmt17BasicMemoryWriterE" title="fmt::BasicMemoryWriter"><code class="xref cpp cpp-any docutils literal"><span class="pre">BasicMemoryWriter</span></code></a> which stores its output in a memory buffer and
|
||||||
|
provides direct access to it. It is possible to create custom writers that
|
||||||
|
store output elsewhere by subclassing <a class="reference internal" href="#_CPPv2N3fmt11BasicWriterE" title="fmt::BasicWriter"><code class="xref cpp cpp-any docutils literal"><span class="pre">BasicWriter</span></code></a>.</p>
|
||||||
<dl class="class">
|
<dl class="class">
|
||||||
<dt>
|
<dt>
|
||||||
<span class="target" id="formatclassfmt_1_1_basic_writer"></span><em class="property">template </em><typename <em>Char</em>></dt>
|
<span class="target" id="formatclassfmt_1_1_basic_writer"></span><em class="property">template </em><typename <em>Char</em>></dt>
|
||||||
@@ -564,37 +715,38 @@ such as <a class="reference internal" href="#_CPPv2N3fmt17BasicMemoryWriterE" ti
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</p>
|
</p>
|
||||||
<div class="breathe-sectiondef container">
|
<p>Subclassed by <a class="reference internal" href="#formatclassfmt_1_1_basic_array_writer"><span class="std std-ref">fmt::BasicArrayWriter< Char ></span></a>, <a class="reference internal" href="#formatclassfmt_1_1_basic_memory_writer"><span class="std std-ref">fmt::BasicMemoryWriter< Char, Allocator ></span></a>, <a class="reference internal" href="#formatclassfmt_1_1_basic_string_writer"><span class="std std-ref">fmt::BasicStringWriter< Char, Allocator ></span></a></p>
|
||||||
|
<div class="breathe-sectiondef docutils container">
|
||||||
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt11BasicWriterD0Ev">
|
<dt id="_CPPv2N3fmt11BasicWriterD0Ev">
|
||||||
<span id="fmt::BasicWriter::~BasicWriter"></span>virtual <span class="target" id="formatclassfmt_1_1_basic_writer_1a25f6fc2e43d3bcfb3de9ac33afe6050d"></span><code class="descname">~BasicWriter</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt11BasicWriterD0Ev" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicWriter::~BasicWriter"></span><span class="target" id="formatclassfmt_1_1_basic_writer_1a25f6fc2e43d3bcfb3de9ac33afe6050d"></span><em class="property">virtual</em> <code class="descname">~BasicWriter</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt11BasicWriterD0Ev" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>Destroys a <code class="docutils literal"><span class="pre">BasicWriter</span></code> object.</p>
|
<dd><p><p>Destroys a <code class="docutils literal"><span class="pre">BasicWriter</span></code> object.</p>
|
||||||
</p>
|
</p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt11BasicWriter4sizeEv">
|
<dt id="_CPPv2NK3fmt11BasicWriter4sizeEv">
|
||||||
<span id="fmt::BasicWriter::size"></span><span class="target" id="formatclassfmt_1_1_basic_writer_1a1b6721b4ba4d3fa18ac781a36616cc2a"></span>std::size_t <code class="descname">size</code><span class="sig-paren">(</span><span class="sig-paren">)</span> const<a class="headerlink" href="#_CPPv2N3fmt11BasicWriter4sizeEv" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicWriter::sizeC"></span><span class="target" id="formatclassfmt_1_1_basic_writer_1a8d4534eea273ef4a3dd9078b995d3d15"></span>std::size_t <code class="descname">size</code><span class="sig-paren">(</span><span class="sig-paren">)</span> <em class="property">const</em><a class="headerlink" href="#_CPPv2NK3fmt11BasicWriter4sizeEv" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>Returns the total number of characters written. </p>
|
<dd><p>Returns the total number of characters written. </p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt11BasicWriter4dataEv">
|
<dt id="_CPPv2NK3fmt11BasicWriter4dataEv">
|
||||||
<span id="fmt::BasicWriter::data"></span><span class="target" id="formatclassfmt_1_1_basic_writer_1a6f3f431fab4a937cd6844a5bda609391"></span><em class="property">const</em> Char *<code class="descname">data</code><span class="sig-paren">(</span><span class="sig-paren">)</span> const<a class="headerlink" href="#_CPPv2N3fmt11BasicWriter4dataEv" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicWriter::dataC"></span><span class="target" id="formatclassfmt_1_1_basic_writer_1a06ada257ca9ae580212d6fe0147fe2cc"></span><em class="property">const</em> Char *<code class="descname">data</code><span class="sig-paren">(</span><span class="sig-paren">)</span> <em class="property">const</em><a class="headerlink" href="#_CPPv2NK3fmt11BasicWriter4dataEv" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>Returns a pointer to the output buffer content. </p>
|
<dd><p>Returns a pointer to the output buffer content. </p>
|
||||||
<p>No terminating null character is appended. </p>
|
<p>No terminating null character is appended. </p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt11BasicWriter5c_strEv">
|
<dt id="_CPPv2NK3fmt11BasicWriter5c_strEv">
|
||||||
<span id="fmt::BasicWriter::c_str"></span><span class="target" id="formatclassfmt_1_1_basic_writer_1a8b68001f5c1c0ea851ddaef27dcbc691"></span><em class="property">const</em> Char *<code class="descname">c_str</code><span class="sig-paren">(</span><span class="sig-paren">)</span> const<a class="headerlink" href="#_CPPv2N3fmt11BasicWriter5c_strEv" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicWriter::c_strC"></span><span class="target" id="formatclassfmt_1_1_basic_writer_1ab608044b16c838ed394cfe937e2ed8b9"></span><em class="property">const</em> Char *<code class="descname">c_str</code><span class="sig-paren">(</span><span class="sig-paren">)</span> <em class="property">const</em><a class="headerlink" href="#_CPPv2NK3fmt11BasicWriter5c_strEv" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>Returns a pointer to the output buffer content with terminating null character appended. </p>
|
<dd><p>Returns a pointer to the output buffer content with terminating null character appended. </p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt11BasicWriter3strEv">
|
<dt id="_CPPv2NK3fmt11BasicWriter3strEv">
|
||||||
<span id="fmt::BasicWriter::str"></span><span class="target" id="formatclassfmt_1_1_basic_writer_1a91f06ced6e063ee77a99740e0e79faf6"></span>std::basic_string<Char> <code class="descname">str</code><span class="sig-paren">(</span><span class="sig-paren">)</span> const<a class="headerlink" href="#_CPPv2N3fmt11BasicWriter3strEv" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicWriter::strC"></span><span class="target" id="formatclassfmt_1_1_basic_writer_1aac8dbeddff3d4e268d17a4f9c16264f6"></span>std::basic_string<Char> <code class="descname">str</code><span class="sig-paren">(</span><span class="sig-paren">)</span> <em class="property">const</em><a class="headerlink" href="#_CPPv2NK3fmt11BasicWriter3strEv" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>Returns the content of the output buffer as an <code class="xref cpp cpp-any docutils literal"><span class="pre">std::string</span></code>.</p>
|
<dd><p><p>Returns the content of the output buffer as an <code class="xref cpp cpp-any docutils literal"><span class="pre">std::string</span></code>.</p>
|
||||||
</p>
|
</p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
@@ -695,11 +847,12 @@ and the standard allocator:</p>
|
|||||||
<p>The output can be converted to an <code class="docutils literal"><span class="pre">std::string</span></code> with <code class="docutils literal"><span class="pre">out.str()</span></code> or
|
<p>The output can be converted to an <code class="docutils literal"><span class="pre">std::string</span></code> with <code class="docutils literal"><span class="pre">out.str()</span></code> or
|
||||||
accessed as a C string with <code class="docutils literal"><span class="pre">out.c_str()</span></code>.</p>
|
accessed as a C string with <code class="docutils literal"><span class="pre">out.c_str()</span></code>.</p>
|
||||||
</p>
|
</p>
|
||||||
<div class="breathe-sectiondef container">
|
<p>Inherits from <a class="reference internal" href="#formatclassfmt_1_1_basic_writer"><span class="std std-ref">fmt::BasicWriter< Char ></span></a></p>
|
||||||
|
<div class="breathe-sectiondef docutils container">
|
||||||
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt17BasicMemoryWriter17BasicMemoryWriterERR17BasicMemoryWriter">
|
<dt id="_CPPv2N3fmt17BasicMemoryWriter17BasicMemoryWriterERR17BasicMemoryWriter">
|
||||||
<span id="fmt::BasicMemoryWriter::BasicMemoryWriter__BasicMemoryWriterRR"></span><span class="target" id="formatclassfmt_1_1_basic_memory_writer_1a245047763a93566d0a7c1f90e8901672"></span><code class="descname">BasicMemoryWriter</code><span class="sig-paren">(</span><a class="reference internal" href="#_CPPv2N3fmt17BasicMemoryWriterE" title="fmt::BasicMemoryWriter">BasicMemoryWriter</a> &&<em>other</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt17BasicMemoryWriter17BasicMemoryWriterERR17BasicMemoryWriter" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicMemoryWriter::BasicMemoryWriter__BasicMemoryWriterRR"></span><span class="target" id="formatclassfmt_1_1_basic_memory_writer_1a245047763a93566d0a7c1f90e8901672"></span><code class="descname">BasicMemoryWriter</code><span class="sig-paren">(</span><a class="reference internal" href="#_CPPv2N3fmt17BasicMemoryWriter17BasicMemoryWriterERR17BasicMemoryWriter" title="fmt::BasicMemoryWriter::BasicMemoryWriter">BasicMemoryWriter</a> &&<em>other</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt17BasicMemoryWriter17BasicMemoryWriterERR17BasicMemoryWriter" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>Constructs a <a class="reference internal" href="#_CPPv2N3fmt17BasicMemoryWriterE" title="fmt::BasicMemoryWriter"><code class="xref cpp cpp-class docutils literal"><span class="pre">fmt::BasicMemoryWriter</span></code></a> object moving the content
|
<dd><p><p>Constructs a <a class="reference internal" href="#_CPPv2N3fmt17BasicMemoryWriterE" title="fmt::BasicMemoryWriter"><code class="xref cpp cpp-class docutils literal"><span class="pre">fmt::BasicMemoryWriter</span></code></a> object moving the content
|
||||||
of the other object to it.</p>
|
of the other object to it.</p>
|
||||||
</p>
|
</p>
|
||||||
@@ -746,7 +899,8 @@ into the array.</p>
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</p>
|
</p>
|
||||||
<div class="breathe-sectiondef container">
|
<p>Inherits from <a class="reference internal" href="#formatclassfmt_1_1_basic_writer"><span class="std std-ref">fmt::BasicWriter< Char ></span></a></p>
|
||||||
|
<div class="breathe-sectiondef docutils container">
|
||||||
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt16BasicArrayWriter16BasicArrayWriterEP4CharNSt6size_tE">
|
<dt id="_CPPv2N3fmt16BasicArrayWriter16BasicArrayWriterEP4CharNSt6size_tE">
|
||||||
@@ -769,27 +923,118 @@ size known at compile time.</p>
|
|||||||
</div>
|
</div>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
|
<dl class="class">
|
||||||
|
<dt>
|
||||||
|
<span class="target" id="formatclassfmt_1_1_basic_string_writer"></span><em class="property">template </em><<em class="property">typename</em> Char, <em class="property">typename</em> Allocator = std::allocator<Char>></dt>
|
||||||
|
<dt id="_CPPv2N3fmt17BasicStringWriterE">
|
||||||
|
<span id="fmt::BasicStringWriter"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">BasicStringWriter</code><a class="headerlink" href="#_CPPv2N3fmt17BasicStringWriterE" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p><p>This class template provides operations for formatting and writing data
|
||||||
|
into a character stream. The output is stored in a <code class="docutils literal"><span class="pre">std::basic_string</span></code>
|
||||||
|
that grows dynamically.</p>
|
||||||
|
<p>You can use one of the following typedefs for common character types
|
||||||
|
and the standard allocator:</p>
|
||||||
|
<table border="1" class="docutils">
|
||||||
|
<colgroup>
|
||||||
|
<col width="35%" />
|
||||||
|
<col width="65%" />
|
||||||
|
</colgroup>
|
||||||
|
<thead valign="bottom">
|
||||||
|
<tr class="row-odd"><th class="head">Type</th>
|
||||||
|
<th class="head">Definition</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody valign="top">
|
||||||
|
<tr class="row-even"><td>StringWriter</td>
|
||||||
|
<td>BasicStringWriter<char></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="row-odd"><td>WStringWriter</td>
|
||||||
|
<td>BasicStringWriter<wchar_t></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<p><strong>Example</strong>:</p>
|
||||||
|
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="n">StringWriter</span> <span class="n">out</span><span class="p">;</span>
|
||||||
|
<span class="n">out</span> <span class="o"><<</span> <span class="s">"The answer is "</span> <span class="o"><<</span> <span class="mi">42</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>This will write the following output to the <code class="docutils literal"><span class="pre">out</span></code> object:</p>
|
||||||
|
<div class="highlight-none"><div class="highlight"><pre><span></span>The answer is 42
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p>The output can be moved to a <code class="docutils literal"><span class="pre">std::basic_string</span></code> with <code class="docutils literal"><span class="pre">out.move_to()</span></code>.</p>
|
||||||
|
</p>
|
||||||
|
<p>Inherits from <a class="reference internal" href="#formatclassfmt_1_1_basic_writer"><span class="std std-ref">fmt::BasicWriter< Char ></span></a></p>
|
||||||
|
<div class="breathe-sectiondef docutils container">
|
||||||
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
|
<dl class="function">
|
||||||
|
<dt id="_CPPv2N3fmt17BasicStringWriter17BasicStringWriterERK9Allocator">
|
||||||
|
<span id="fmt::BasicStringWriter::BasicStringWriter__AllocatorCR"></span><span class="target" id="formatclassfmt_1_1_basic_string_writer_1a39e60f775feda49e58964a9c540831fc"></span><code class="descname">BasicStringWriter</code><span class="sig-paren">(</span><em class="property">const</em> Allocator &<em>allocator</em> = Allocator()<span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt17BasicStringWriter17BasicStringWriterERK9Allocator" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p><p>Constructs a <a class="reference internal" href="#_CPPv2N3fmt17BasicStringWriterE" title="fmt::BasicStringWriter"><code class="xref cpp cpp-class docutils literal"><span class="pre">fmt::BasicStringWriter</span></code></a> object.</p>
|
||||||
|
</p>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
<dl class="function">
|
||||||
|
<dt id="_CPPv2N3fmt17BasicStringWriter7move_toERNSt12basic_stringI4CharNSt11char_traitsI4CharEE9AllocatorEE">
|
||||||
|
<span id="fmt::BasicStringWriter::move_to__std::basic_string:Char.std::char_traits:Char:.Allocator:R"></span><span class="target" id="formatclassfmt_1_1_basic_string_writer_1af5eb54db9a51ef610d55ecb858257fb0"></span>void <code class="descname">move_to</code><span class="sig-paren">(</span>std::basic_string<Char, std::char_traits<Char>, Allocator> &<em>str</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt17BasicStringWriter7move_toERNSt12basic_stringI4CharNSt11char_traitsI4CharEE9AllocatorEE" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p><p>Moves the buffer content to <em>str</em> clearing the buffer.</p>
|
||||||
|
</p>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
<dl class="class">
|
||||||
|
<dt>
|
||||||
|
<span class="target" id="formatclassfmt_1_1_basic_container_writer"></span><em class="property">template </em><<em class="property">class</em> Container></dt>
|
||||||
|
<dt id="_CPPv2N3fmt20BasicContainerWriterE">
|
||||||
|
<span id="fmt::BasicContainerWriter"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">BasicContainerWriter</code><a class="headerlink" href="#_CPPv2N3fmt20BasicContainerWriterE" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p><p>This class template provides operations for formatting and appending data
|
||||||
|
to a standard <em>container</em> like <code class="docutils literal"><span class="pre">std::vector</span></code> or <code class="docutils literal"><span class="pre">std::basic_string</span></code>.</p>
|
||||||
|
<p><strong>Example</strong>:</p>
|
||||||
|
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">vecformat</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">char</span><span class="o">>&</span> <span class="n">dest</span><span class="p">,</span> <span class="n">fmt</span><span class="o">::</span><span class="n">BasicCStringRef</span><span class="o"><</span><span class="kt">char</span><span class="o">></span> <span class="n">format</span><span class="p">,</span>
|
||||||
|
<span class="n">fmt</span><span class="o">::</span><span class="n">ArgList</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
|
||||||
|
<span class="n">fmt</span><span class="o">::</span><span class="n">BasicContainerWriter</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">char</span><span class="o">></span> <span class="o">></span> <span class="n">appender</span><span class="p">(</span><span class="n">dest</span><span class="p">);</span>
|
||||||
|
<span class="n">appender</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">format</span><span class="p">,</span> <span class="n">args</span><span class="p">);</span>
|
||||||
|
<span class="p">}</span>
|
||||||
|
<span class="n">FMT_VARIADIC</span><span class="p">(</span><span class="kt">void</span><span class="p">,</span> <span class="n">vecformat</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">char</span><span class="o">>&</span><span class="p">,</span>
|
||||||
|
<span class="n">fmt</span><span class="o">::</span><span class="n">BasicCStringRef</span><span class="o"><</span><span class="kt">char</span><span class="o">></span><span class="p">);</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</p>
|
||||||
|
<p>Inherits from <a class="reference internal" href="#formatclassfmt_1_1_basic_writer"><span class="std std-ref">fmt::BasicWriter< Container::value_type ></span></a></p>
|
||||||
|
<div class="breathe-sectiondef docutils container">
|
||||||
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
|
<dl class="function">
|
||||||
|
<dt id="_CPPv2N3fmt20BasicContainerWriter20BasicContainerWriterER9Container">
|
||||||
|
<span id="fmt::BasicContainerWriter::BasicContainerWriter__ContainerR"></span><span class="target" id="formatclassfmt_1_1_basic_container_writer_1a1c5f521af91a36bf07d580d3b5e8fde4"></span><code class="descname">BasicContainerWriter</code><span class="sig-paren">(</span>Container &<em>dest</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt20BasicContainerWriter20BasicContainerWriterER9Container" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p><p>Constructs a <a class="reference internal" href="#_CPPv2N3fmt20BasicContainerWriterE" title="fmt::BasicContainerWriter"><code class="xref cpp cpp-class docutils literal"><span class="pre">fmt::BasicContainerWriter</span></code></a> object.</p>
|
||||||
|
</p>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt3binEi">
|
<dt id="_CPPv2N3fmt3binEi">
|
||||||
<span id="fmt::bin__i"></span><span class="target" id="formatformat_8h_1aa3e8966d52b70224d46861fabd090e4b"></span>IntFormatSpec<int, TypeSpec<'b'>> <code class="descclassname">fmt::</code><code class="descname">bin</code><span class="sig-paren">(</span>int <em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt3binEi" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::bin__i"></span><span class="target" id="formatformat_8h_1a760fce6f0963895343b50eec787f80db"></span>IntFormatSpec<int, TypeSpec<'b'>> <code class="descclassname">fmt::</code><code class="descname">bin</code><span class="sig-paren">(</span>int <em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt3binEi" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>Returns an integer format specifier to format the value in base 2. </p>
|
<dd><p>Returns an integer format specifier to format the value in base 2. </p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt3octEi">
|
<dt id="_CPPv2N3fmt3octEi">
|
||||||
<span id="fmt::oct__i"></span><span class="target" id="formatformat_8h_1a1d166c5b2242a6a0aefba5455c32a2b3"></span>IntFormatSpec<int, TypeSpec<'o'>> <code class="descclassname">fmt::</code><code class="descname">oct</code><span class="sig-paren">(</span>int <em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt3octEi" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::oct__i"></span><span class="target" id="formatformat_8h_1a49d07603108a758be5cc6157f456e32d"></span>IntFormatSpec<int, TypeSpec<'o'>> <code class="descclassname">fmt::</code><code class="descname">oct</code><span class="sig-paren">(</span>int <em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt3octEi" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>Returns an integer format specifier to format the value in base 8. </p>
|
<dd><p>Returns an integer format specifier to format the value in base 8. </p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt3hexEi">
|
<dt id="_CPPv2N3fmt3hexEi">
|
||||||
<span id="fmt::hex__i"></span><span class="target" id="formatformat_8h_1aaa926c5c42fbad5f5c98aaad84b9f66a"></span>IntFormatSpec<int, TypeSpec<'x'>> <code class="descclassname">fmt::</code><code class="descname">hex</code><span class="sig-paren">(</span>int <em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt3hexEi" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::hex__i"></span><span class="target" id="formatformat_8h_1a8451bad40c90c2ce2aa1a932851cf090"></span>IntFormatSpec<int, TypeSpec<'x'>> <code class="descclassname">fmt::</code><code class="descname">hex</code><span class="sig-paren">(</span>int <em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt3hexEi" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>Returns an integer format specifier to format the value in base 16 using lower-case letters for the digits above 9. </p>
|
<dd><p>Returns an integer format specifier to format the value in base 16 using lower-case letters for the digits above 9. </p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt4hexuEi">
|
<dt id="_CPPv2N3fmt4hexuEi">
|
||||||
<span id="fmt::hexu__i"></span><span class="target" id="formatformat_8h_1ac2fd8f73cfcd1321dfb6fb0302f23f66"></span>IntFormatSpec<int, TypeSpec<'X'>> <code class="descclassname">fmt::</code><code class="descname">hexu</code><span class="sig-paren">(</span>int <em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt4hexuEi" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::hexu__i"></span><span class="target" id="formatformat_8h_1ae08e783a599e0667dae7b5a63a265de4"></span>IntFormatSpec<int, TypeSpec<'X'>> <code class="descclassname">fmt::</code><code class="descname">hexu</code><span class="sig-paren">(</span>int <em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt4hexuEi" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>Returns an integer formatter format specifier to format in base 16 using upper-case letters for the digits above 9. </p>
|
<dd><p>Returns an integer formatter format specifier to format in base 16 using upper-case letters for the digits above 9. </p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
@@ -797,7 +1042,7 @@ size known at compile time.</p>
|
|||||||
<dt>
|
<dt>
|
||||||
<em class="property">template </em><char <em>TYPE_CODE</em>, <em class="property">typename</em> Char></dt>
|
<em class="property">template </em><char <em>TYPE_CODE</em>, <em class="property">typename</em> Char></dt>
|
||||||
<dt id="_CPPv2N3fmt3padEij4Char">
|
<dt id="_CPPv2N3fmt3padEij4Char">
|
||||||
<span id="fmt::pad__i.unsigned.Char"></span><span class="target" id="formatformat_8h_1a48d6010061d1710d807853ad9125d825"></span>IntFormatSpec<int, AlignTypeSpec<TYPE_CODE>, Char> <code class="descclassname">fmt::</code><code class="descname">pad</code><span class="sig-paren">(</span>int <em>value</em>, unsigned <em>width</em>, Char <em>fill</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt3padEij4Char" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::pad__i.unsigned.Char"></span><span class="target" id="formatformat_8h_1aa6ebb90e2adc57f2c942e226fd708b24"></span>IntFormatSpec<int, AlignTypeSpec<TYPE_CODE>, Char> <code class="descclassname">fmt::</code><code class="descname">pad</code><span class="sig-paren">(</span>int <em>value</em>, unsigned <em>width</em>, Char <em>fill</em> = ' '<span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt3padEij4Char" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>Returns an integer format specifier to pad the formatted argument with the
|
<dd><p><p>Returns an integer format specifier to pad the formatted argument with the
|
||||||
fill character to the specified width using the default (right) numeric
|
fill character to the specified width using the default (right) numeric
|
||||||
alignment.</p>
|
alignment.</p>
|
||||||
@@ -817,7 +1062,7 @@ alignment.</p>
|
|||||||
<dt>
|
<dt>
|
||||||
<em class="property">template </em><<em class="property">typename</em> T></dt>
|
<em class="property">template </em><<em class="property">typename</em> T></dt>
|
||||||
<dt id="_CPPv2N3fmt3argE9StringRefRK1T">
|
<dt id="_CPPv2N3fmt3argE9StringRefRK1T">
|
||||||
<span id="fmt::arg__StringRef.TCR"></span><span class="target" id="formatformat_8h_1a4649a895b3f769fe24b268e39a8cf152"></span>internal::NamedArg<char> <code class="descclassname">fmt::</code><code class="descname">arg</code><span class="sig-paren">(</span>StringRef <em>name</em>, <em class="property">const</em> T &<em>arg</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt3argE9StringRefRK1T" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::arg__StringRef.TCR"></span><span class="target" id="formatformat_8h_1a3ccc93714460459602dc6fc2b055ee6b"></span>internal::NamedArgWithType<char, T> <code class="descclassname">fmt::</code><code class="descname">arg</code><span class="sig-paren">(</span>StringRef <em>name</em>, <em class="property">const</em> T &<em>arg</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt3argE9StringRefRK1T" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>Returns a named argument for formatting functions.</p>
|
<dd><p><p>Returns a named argument for formatting functions.</p>
|
||||||
<p><strong>Example</strong>:</p>
|
<p><strong>Example</strong>:</p>
|
||||||
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="n">print</span><span class="p">(</span><span class="s">"Elapsed time: {s:.2f} seconds"</span><span class="p">,</span> <span class="n">arg</span><span class="p">(</span><span class="s">"s"</span><span class="p">,</span> <span class="mf">1.23</span><span class="p">));</span>
|
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="n">print</span><span class="p">(</span><span class="s">"Elapsed time: {s:.2f} seconds"</span><span class="p">,</span> <span class="n">arg</span><span class="p">(</span><span class="s">"s"</span><span class="p">,</span> <span class="mf">1.23</span><span class="p">));</span>
|
||||||
@@ -826,18 +1071,10 @@ alignment.</p>
|
|||||||
</p>
|
</p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<div class="admonition warning">
|
||||||
<dt id="_CPPv2N3fmt8literalsli2_aEPKcNSt6size_tE">
|
<p class="first admonition-title">Warning</p>
|
||||||
<span class="target" id="formatformat_8h_1a1f0ec67406a0e4937166e6481f481198"></span>internal::UdlArg<char> <code class="descclassname">fmt::literals::</code><code class="descname">operator""_a</code><span class="sig-paren">(</span><em class="property">const</em> char *<em>s</em>, std::size_t<span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt8literalsli2_aEPKcNSt6size_tE" title="Permalink to this definition">¶</a></dt>
|
<p class="last">doxygenfunction: Cannot find function “operator”“_a” in doxygen xml output for project “format” from directory: /home/foonathan/Programming/fmt/build/doc/doxyxml</p>
|
||||||
<dd><p><p>C++11 literal equivalent of <a class="reference internal" href="#_CPPv2N3fmt3argE9StringRefRK1T" title="fmt::arg"><code class="xref cpp cpp-func docutils literal"><span class="pre">fmt::arg()</span></code></a>.</p>
|
|
||||||
<p><strong>Example</strong>:</p>
|
|
||||||
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="k">using</span> <span class="k">namespace</span> <span class="n">fmt</span><span class="o">::</span><span class="n">literals</span><span class="p">;</span>
|
|
||||||
<span class="n">print</span><span class="p">(</span><span class="s">"Elapsed time: {s:.2f} seconds"</span><span class="p">,</span> <span class="s">"s"</span><span class="n">_a</span><span class="o">=</span><span class="mf">1.23</span><span class="p">);</span>
|
|
||||||
</pre></div>
|
|
||||||
</div>
|
</div>
|
||||||
</p>
|
|
||||||
</dd></dl>
|
|
||||||
|
|
||||||
<dl class="macro">
|
<dl class="macro">
|
||||||
<dt id="c.FMT_CAPTURE">
|
<dt id="c.FMT_CAPTURE">
|
||||||
<span class="target" id="formatformat_8h_1a3caa326fabdddb0e4fbcad7e5ec8bd37"></span><code class="descname">FMT_CAPTURE</code><span class="sig-paren">(</span>...<span class="sig-paren">)</span><a class="headerlink" href="#c.FMT_CAPTURE" title="Permalink to this definition">¶</a></dt>
|
<span class="target" id="formatformat_8h_1a3caa326fabdddb0e4fbcad7e5ec8bd37"></span><code class="descname">FMT_CAPTURE</code><span class="sig-paren">(</span>...<span class="sig-paren">)</span><a class="headerlink" href="#c.FMT_CAPTURE" title="Permalink to this definition">¶</a></dt>
|
||||||
@@ -886,23 +1123,39 @@ directly:</p>
|
|||||||
<dt id="_CPPv2N3fmt7ArgListE">
|
<dt id="_CPPv2N3fmt7ArgListE">
|
||||||
<span id="fmt::ArgList"></span><span class="target" id="formatclassfmt_1_1_arg_list"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">ArgList</code><a class="headerlink" href="#_CPPv2N3fmt7ArgListE" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::ArgList"></span><span class="target" id="formatclassfmt_1_1_arg_list"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">ArgList</code><a class="headerlink" href="#_CPPv2N3fmt7ArgListE" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>An argument list. </p>
|
<dd><p>An argument list. </p>
|
||||||
<div class="breathe-sectiondef container">
|
<div class="breathe-sectiondef docutils container">
|
||||||
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt7ArgListixEj">
|
<dt id="_CPPv2NK3fmt7ArgListixEj">
|
||||||
<span id="fmt::ArgList::subscript-operator__unsigned"></span><span class="target" id="formatclassfmt_1_1_arg_list_1ad2c2672388e003aa70d9c948ac8140cd"></span>internal::Arg <code class="descname">operator[]</code><span class="sig-paren">(</span>unsigned <em>index</em><span class="sig-paren">)</span> const<a class="headerlink" href="#_CPPv2N3fmt7ArgListixEj" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::ArgList::subscript-operator__unsignedC"></span><span class="target" id="formatclassfmt_1_1_arg_list_1a9a717b2022170c8f2918141a80cc6eb2"></span>internal::Arg <code class="descname">operator[]</code><span class="sig-paren">(</span>unsigned <em>index</em><span class="sig-paren">)</span> <em class="property">const</em><a class="headerlink" href="#_CPPv2NK3fmt7ArgListixEj" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>Returns the argument at specified index. </p>
|
<dd><p>Returns the argument at specified index. </p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
|
<dl class="function">
|
||||||
|
<dt>
|
||||||
|
<em class="property">template </em><<em class="property">typename</em> T></dt>
|
||||||
|
<dt id="_CPPv2N3fmt9to_stringERK1T">
|
||||||
|
<span id="fmt::to_string__TCR"></span><span class="target" id="formatstring_8h_1abfd84051cd3673d750be5851ee93b05f"></span>std::string <code class="descclassname">fmt::</code><code class="descname">to_string</code><span class="sig-paren">(</span><em class="property">const</em> T &<em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt9to_stringERK1T" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p><p>Converts <em>value</em> to <code class="docutils literal"><span class="pre">std::string</span></code> using the default format for type <em>T</em>.</p>
|
||||||
|
<p><strong>Example</strong>:</p>
|
||||||
|
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="cp">#include</span> <span class="cpf">"fmt/string.h"</span><span class="cp"></span>
|
||||||
|
|
||||||
|
<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">answer</span> <span class="o">=</span> <span class="n">fmt</span><span class="o">::</span><span class="n">to_string</span><span class="p">(</span><span class="mi">42</span><span class="p">);</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</p>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="class">
|
<dl class="class">
|
||||||
<dt>
|
<dt>
|
||||||
<span class="target" id="formatclassfmt_1_1_basic_string_ref"></span><em class="property">template </em><typename <em>Char</em>></dt>
|
<span class="target" id="formatclassfmt_1_1_basic_string_ref"></span><em class="property">template </em><typename <em>Char</em>></dt>
|
||||||
<dt id="_CPPv2N3fmt14BasicStringRefE">
|
<dt id="_CPPv2N3fmt14BasicStringRefE">
|
||||||
<span id="fmt::BasicStringRef"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">BasicStringRef</code><a class="headerlink" href="#_CPPv2N3fmt14BasicStringRefE" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicStringRef"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">BasicStringRef</code><a class="headerlink" href="#_CPPv2N3fmt14BasicStringRefE" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>A string reference. It can be constructed from a C string or <code class="docutils literal"><span class="pre">std::string</span></code>.</p>
|
<dd><p><p>A string reference. It can be constructed from a C string or
|
||||||
|
<code class="docutils literal"><span class="pre">std::basic_string</span></code>.</p>
|
||||||
<p>You can use one of the following typedefs for common character types:</p>
|
<p>You can use one of the following typedefs for common character types:</p>
|
||||||
<table border="1" class="docutils">
|
<table border="1" class="docutils">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
@@ -933,7 +1186,7 @@ different types of strings to a function, for example:</p>
|
|||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</p>
|
</p>
|
||||||
<div class="breathe-sectiondef container">
|
<div class="breathe-sectiondef docutils container">
|
||||||
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt14BasicStringRef14BasicStringRefEPK4CharNSt6size_tE">
|
<dt id="_CPPv2N3fmt14BasicStringRef14BasicStringRefEPK4CharNSt6size_tE">
|
||||||
@@ -950,28 +1203,30 @@ the size with <code class="docutils literal"><span class="pre">std::char_traits&
|
|||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt14BasicStringRef14BasicStringRefERKNSt12basic_stringI4CharEE">
|
<dt>
|
||||||
<span id="fmt::BasicStringRef::BasicStringRef__std::basic_string:Char:CR"></span><span class="target" id="formatclassfmt_1_1_basic_string_ref_1afd8ffd0c6d2ccac657f277a4faea3889"></span><code class="descname">BasicStringRef</code><span class="sig-paren">(</span><em class="property">const</em> std::basic_string<Char> &<em>s</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt14BasicStringRef14BasicStringRefERKNSt12basic_stringI4CharEE" title="Permalink to this definition">¶</a></dt>
|
<em class="property">template </em><<em class="property">typename</em> Allocator></dt>
|
||||||
<dd><p><p>Constructs a string reference from an <code class="docutils literal"><span class="pre">std::string</span></code> object.</p>
|
<dt id="_CPPv2N3fmt14BasicStringRef14BasicStringRefERKNSt12basic_stringI4CharNSt11char_traitsI4CharEE9AllocatorEE">
|
||||||
|
<span id="fmt::BasicStringRef::BasicStringRef__std::basic_string:Char.std::char_traits:Char:.Allocator:CR"></span><span class="target" id="formatclassfmt_1_1_basic_string_ref_1a7c4c0c3bfc4768d7cb657f5756549863"></span><code class="descname">BasicStringRef</code><span class="sig-paren">(</span><em class="property">const</em> std::basic_string<Char, std::char_traits<Char>, Allocator> &<em>s</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt14BasicStringRef14BasicStringRefERKNSt12basic_stringI4CharNSt11char_traitsI4CharEE9AllocatorEE" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p><p>Constructs a string reference from a <code class="docutils literal"><span class="pre">std::basic_string</span></code> object.</p>
|
||||||
</p>
|
</p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt14BasicStringRef9to_stringEv">
|
<dt id="_CPPv2NK3fmt14BasicStringRef9to_stringEv">
|
||||||
<span id="fmt::BasicStringRef::to_string"></span><span class="target" id="formatclassfmt_1_1_basic_string_ref_1a7340f48f53cf9188e9fea5e6e1556969"></span>std::basic_string<Char> <code class="descname">to_string</code><span class="sig-paren">(</span><span class="sig-paren">)</span> const<a class="headerlink" href="#_CPPv2N3fmt14BasicStringRef9to_stringEv" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicStringRef::to_stringC"></span><span class="target" id="formatclassfmt_1_1_basic_string_ref_1a85503c30cd35cd6deff9e77da52857e6"></span>std::basic_string<Char> <code class="descname">to_string</code><span class="sig-paren">(</span><span class="sig-paren">)</span> <em class="property">const</em><a class="headerlink" href="#_CPPv2NK3fmt14BasicStringRef9to_stringEv" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>Converts a string reference to an <code class="docutils literal"><span class="pre">std::string</span></code> object.</p>
|
<dd><p><p>Converts a string reference to an <code class="docutils literal"><span class="pre">std::string</span></code> object.</p>
|
||||||
</p>
|
</p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt14BasicStringRef4dataEv">
|
<dt id="_CPPv2NK3fmt14BasicStringRef4dataEv">
|
||||||
<span id="fmt::BasicStringRef::data"></span><span class="target" id="formatclassfmt_1_1_basic_string_ref_1ae9c80502c527437215fe1c11dca8b475"></span><em class="property">const</em> Char *<code class="descname">data</code><span class="sig-paren">(</span><span class="sig-paren">)</span> const<a class="headerlink" href="#_CPPv2N3fmt14BasicStringRef4dataEv" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicStringRef::dataC"></span><span class="target" id="formatclassfmt_1_1_basic_string_ref_1aeca62faae1111525b0ef2667e75187f7"></span><em class="property">const</em> Char *<code class="descname">data</code><span class="sig-paren">(</span><span class="sig-paren">)</span> <em class="property">const</em><a class="headerlink" href="#_CPPv2NK3fmt14BasicStringRef4dataEv" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>Returns a pointer to the string data. </p>
|
<dd><p>Returns a pointer to the string data. </p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt14BasicStringRef4sizeEv">
|
<dt id="_CPPv2NK3fmt14BasicStringRef4sizeEv">
|
||||||
<span id="fmt::BasicStringRef::size"></span><span class="target" id="formatclassfmt_1_1_basic_string_ref_1ae38d9106dd5bec69488e5464aedc266a"></span>std::size_t <code class="descname">size</code><span class="sig-paren">(</span><span class="sig-paren">)</span> const<a class="headerlink" href="#_CPPv2N3fmt14BasicStringRef4sizeEv" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicStringRef::sizeC"></span><span class="target" id="formatclassfmt_1_1_basic_string_ref_1a765ddcb00e0a0a880a4a9458f9e68ea0"></span>std::size_t <code class="descname">size</code><span class="sig-paren">(</span><span class="sig-paren">)</span> <em class="property">const</em><a class="headerlink" href="#_CPPv2NK3fmt14BasicStringRef4sizeEv" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>Returns the string size. </p>
|
<dd><p>Returns the string size. </p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
@@ -984,7 +1239,7 @@ the size with <code class="docutils literal"><span class="pre">std::char_traits&
|
|||||||
<dt id="_CPPv2N3fmt15BasicCStringRefE">
|
<dt id="_CPPv2N3fmt15BasicCStringRefE">
|
||||||
<span id="fmt::BasicCStringRef"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">BasicCStringRef</code><a class="headerlink" href="#_CPPv2N3fmt15BasicCStringRefE" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicCStringRef"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">BasicCStringRef</code><a class="headerlink" href="#_CPPv2N3fmt15BasicCStringRefE" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>A reference to a null terminated string. It can be constructed from a C
|
<dd><p><p>A reference to a null terminated string. It can be constructed from a C
|
||||||
string or <code class="docutils literal"><span class="pre">std::string</span></code>.</p>
|
string or <code class="docutils literal"><span class="pre">std::basic_string</span></code>.</p>
|
||||||
<p>You can use one of the following typedefs for common character types:</p>
|
<p>You can use one of the following typedefs for common character types:</p>
|
||||||
<table border="1" class="docutils">
|
<table border="1" class="docutils">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
@@ -1015,7 +1270,7 @@ different types of strings to a function, for example:</p>
|
|||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</p>
|
</p>
|
||||||
<div class="breathe-sectiondef container">
|
<div class="breathe-sectiondef docutils container">
|
||||||
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt15BasicCStringRef15BasicCStringRefEPK4Char">
|
<dt id="_CPPv2N3fmt15BasicCStringRef15BasicCStringRefEPK4Char">
|
||||||
@@ -1024,15 +1279,17 @@ different types of strings to a function, for example:</p>
|
|||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt15BasicCStringRef15BasicCStringRefERKNSt12basic_stringI4CharEE">
|
<dt>
|
||||||
<span id="fmt::BasicCStringRef::BasicCStringRef__std::basic_string:Char:CR"></span><span class="target" id="formatclassfmt_1_1_basic_c_string_ref_1ab460855d19c769773de532296f9f13f9"></span><code class="descname">BasicCStringRef</code><span class="sig-paren">(</span><em class="property">const</em> std::basic_string<Char> &<em>s</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt15BasicCStringRef15BasicCStringRefERKNSt12basic_stringI4CharEE" title="Permalink to this definition">¶</a></dt>
|
<em class="property">template </em><<em class="property">typename</em> Allocator></dt>
|
||||||
<dd><p><p>Constructs a string reference from an <code class="docutils literal"><span class="pre">std::string</span></code> object.</p>
|
<dt id="_CPPv2N3fmt15BasicCStringRef15BasicCStringRefERKNSt12basic_stringI4CharNSt11char_traitsI4CharEE9AllocatorEE">
|
||||||
|
<span id="fmt::BasicCStringRef::BasicCStringRef__std::basic_string:Char.std::char_traits:Char:.Allocator:CR"></span><span class="target" id="formatclassfmt_1_1_basic_c_string_ref_1aa7caaa44a192e0184031d60c2a71bd12"></span><code class="descname">BasicCStringRef</code><span class="sig-paren">(</span><em class="property">const</em> std::basic_string<Char, std::char_traits<Char>, Allocator> &<em>s</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt15BasicCStringRef15BasicCStringRefERKNSt12basic_stringI4CharNSt11char_traitsI4CharEE9AllocatorEE" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p><p>Constructs a string reference from a <code class="docutils literal"><span class="pre">std::basic_string</span></code> object.</p>
|
||||||
</p>
|
</p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt15BasicCStringRef5c_strEv">
|
<dt id="_CPPv2NK3fmt15BasicCStringRef5c_strEv">
|
||||||
<span id="fmt::BasicCStringRef::c_str"></span><span class="target" id="formatclassfmt_1_1_basic_c_string_ref_1ae3bafa845b53339b20c4f5edb4f635f9"></span><em class="property">const</em> Char *<code class="descname">c_str</code><span class="sig-paren">(</span><span class="sig-paren">)</span> const<a class="headerlink" href="#_CPPv2N3fmt15BasicCStringRef5c_strEv" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::BasicCStringRef::c_strC"></span><span class="target" id="formatclassfmt_1_1_basic_c_string_ref_1ac1064b18371a8762e3d89395d253d436"></span><em class="property">const</em> Char *<code class="descname">c_str</code><span class="sig-paren">(</span><span class="sig-paren">)</span> <em class="property">const</em><a class="headerlink" href="#_CPPv2NK3fmt15BasicCStringRef5c_strEv" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>Returns the pointer to a C string. </p>
|
<dd><p>Returns the pointer to a C string. </p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
@@ -1046,17 +1303,18 @@ different types of strings to a function, for example:</p>
|
|||||||
<span id="fmt::Buffer"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">Buffer</code><a class="headerlink" href="#_CPPv2N3fmt6BufferE" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::Buffer"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">Buffer</code><a class="headerlink" href="#_CPPv2N3fmt6BufferE" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>A buffer supporting a subset of <code class="docutils literal"><span class="pre">std::vector</span></code>‘s operations.</p>
|
<dd><p><p>A buffer supporting a subset of <code class="docutils literal"><span class="pre">std::vector</span></code>‘s operations.</p>
|
||||||
</p>
|
</p>
|
||||||
<div class="breathe-sectiondef container">
|
<p>Subclassed by fmt::internal::MemoryBuffer< T, SIZE, Allocator ></p>
|
||||||
|
<div class="breathe-sectiondef docutils container">
|
||||||
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt6Buffer4sizeEv">
|
<dt id="_CPPv2NK3fmt6Buffer4sizeEv">
|
||||||
<span id="fmt::Buffer::size"></span><span class="target" id="formatclassfmt_1_1_buffer_1a14fa72f0ddf584c14ffffb1446f598aa"></span>std::size_t <code class="descname">size</code><span class="sig-paren">(</span><span class="sig-paren">)</span> const<a class="headerlink" href="#_CPPv2N3fmt6Buffer4sizeEv" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::Buffer::sizeC"></span><span class="target" id="formatclassfmt_1_1_buffer_1a2489cffd9cdc6f846cdf17988d52f785"></span>std::size_t <code class="descname">size</code><span class="sig-paren">(</span><span class="sig-paren">)</span> <em class="property">const</em><a class="headerlink" href="#_CPPv2NK3fmt6Buffer4sizeEv" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>Returns the size of this buffer. </p>
|
<dd><p>Returns the size of this buffer. </p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt6Buffer8capacityEv">
|
<dt id="_CPPv2NK3fmt6Buffer8capacityEv">
|
||||||
<span id="fmt::Buffer::capacity"></span><span class="target" id="formatclassfmt_1_1_buffer_1aaf54fe786de91157629f96380e0cb215"></span>std::size_t <code class="descname">capacity</code><span class="sig-paren">(</span><span class="sig-paren">)</span> const<a class="headerlink" href="#_CPPv2N3fmt6Buffer8capacityEv" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::Buffer::capacityC"></span><span class="target" id="formatclassfmt_1_1_buffer_1af38a0b9f1afac4901f24a73207f72e6f"></span>std::size_t <code class="descname">capacity</code><span class="sig-paren">(</span><span class="sig-paren">)</span> <em class="property">const</em><a class="headerlink" href="#_CPPv2NK3fmt6Buffer8capacityEv" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>Returns the capacity of this buffer. </p>
|
<dd><p>Returns the capacity of this buffer. </p>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
@@ -1083,11 +1341,11 @@ different types of strings to a function, for example:</p>
|
|||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="breathe-sectiondef container">
|
<div class="breathe-sectiondef docutils container">
|
||||||
<p class="breathe-sectiondef-title rubric">Protected Functions</p>
|
<p class="breathe-sectiondef-title rubric">Protected Functions</p>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt6Buffer4growENSt6size_tE">
|
<dt id="_CPPv2N3fmt6Buffer4growENSt6size_tE">
|
||||||
<span id="fmt::Buffer::grow__std::s"></span>virtual <span class="target" id="formatclassfmt_1_1_buffer_1abdc7aaf5813aa07008b3d715969a7e19"></span>void <code class="descname">grow</code><span class="sig-paren">(</span>std::size_t <em>size</em><span class="sig-paren">)</span> = 0<a class="headerlink" href="#_CPPv2N3fmt6Buffer4growENSt6size_tE" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::Buffer::grow__std::s"></span><span class="target" id="formatclassfmt_1_1_buffer_1abdc7aaf5813aa07008b3d715969a7e19"></span><em class="property">virtual</em> void <code class="descname">grow</code><span class="sig-paren">(</span>std::size_t <em>size</em><span class="sig-paren">)</span> = 0<a class="headerlink" href="#_CPPv2N3fmt6Buffer4growENSt6size_tE" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>Increases the buffer capacity to hold at least <em>size</em> elements updating
|
<dd><p><p>Increases the buffer capacity to hold at least <em>size</em> elements updating
|
||||||
<code class="docutils literal"><span class="pre">ptr_</span></code> and <code class="docutils literal"><span class="pre">capacity_</span></code>.</p>
|
<code class="docutils literal"><span class="pre">ptr_</span></code> and <code class="docutils literal"><span class="pre">capacity_</span></code>.</p>
|
||||||
</p>
|
</p>
|
||||||
@@ -1103,21 +1361,17 @@ different types of strings to a function, for example:</p>
|
|||||||
<dt id="_CPPv2N3fmt11SystemErrorE">
|
<dt id="_CPPv2N3fmt11SystemErrorE">
|
||||||
<span id="fmt::SystemError"></span><span class="target" id="formatclassfmt_1_1_system_error"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">SystemError</code><a class="headerlink" href="#_CPPv2N3fmt11SystemErrorE" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::SystemError"></span><span class="target" id="formatclassfmt_1_1_system_error"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">SystemError</code><a class="headerlink" href="#_CPPv2N3fmt11SystemErrorE" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>An error returned by an operating system or a language runtime, for example a file opening error. </p>
|
<dd><p>An error returned by an operating system or a language runtime, for example a file opening error. </p>
|
||||||
<div class="breathe-sectiondef container">
|
<p>Inherits from fmt::internal::RuntimeError</p>
|
||||||
|
<p>Subclassed by <a class="reference internal" href="#formatclassfmt_1_1_windows_error"><span class="std std-ref">fmt::WindowsError</span></a></p>
|
||||||
|
<div class="breathe-sectiondef docutils container">
|
||||||
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt11SystemError11SystemErrorEi10CStringRef">
|
<dt id="_CPPv2N3fmt11SystemError11SystemErrorEi10CStringRef">
|
||||||
<span id="fmt::SystemError::SystemError__i.CStringRef"></span><span class="target" id="formatclassfmt_1_1_system_error_1a307c40b2542f53d7426b09319255d35c"></span><code class="descname">SystemError</code><span class="sig-paren">(</span>int <em>error_code</em>, CStringRef <em>message</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt11SystemError11SystemErrorEi10CStringRef" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::SystemError::SystemError__i.CStringRef"></span><span class="target" id="formatclassfmt_1_1_system_error_1a307c40b2542f53d7426b09319255d35c"></span><code class="descname">SystemError</code><span class="sig-paren">(</span>int <em>error_code</em>, CStringRef <em>message</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt11SystemError11SystemErrorEi10CStringRef" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p><p>Constructs a <a class="reference internal" href="#_CPPv2N3fmt11SystemErrorE" title="fmt::SystemError"><code class="xref cpp cpp-class docutils literal"><span class="pre">fmt::SystemError</span></code></a> object with the description
|
<dd><p><p>Constructs a <a class="reference internal" href="#_CPPv2N3fmt11SystemErrorE" title="fmt::SystemError"><code class="xref cpp cpp-class docutils literal"><span class="pre">fmt::SystemError</span></code></a> object with a description
|
||||||
of the form</p>
|
formatted with <a class="reference internal" href="#_CPPv2N3fmt19format_system_errorERN3fmt6WriterEiN3fmt9StringRefE" title="fmt::format_system_error"><code class="xref cpp cpp-any docutils literal"><span class="pre">fmt::format_system_error()</span></code></a>. <em>message</em> and additional
|
||||||
<pre class="literal-block">
|
arguments passed into the constructor are formatted similarly to
|
||||||
<em><message></em>: <em><system-message></em>
|
<a class="reference internal" href="#_CPPv2N3fmt6formatE10CStringRef7ArgList" title="fmt::format"><code class="xref cpp cpp-any docutils literal"><span class="pre">fmt::format()</span></code></a>.</p>
|
||||||
</pre>
|
|
||||||
<p>where <em><message></em> is the formatted message and <em><system-message></em> is
|
|
||||||
the system message corresponding to the error code.
|
|
||||||
<em>error_code</em> is a system error code as given by <code class="docutils literal"><span class="pre">errno</span></code>.
|
|
||||||
If <em>error_code</em> is not a valid error code such as -1, the system message
|
|
||||||
may look like “Unknown error -1” and is platform-dependent.</p>
|
|
||||||
<p><strong>Example</strong>:</p>
|
<p><strong>Example</strong>:</p>
|
||||||
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="c1">// This throws a SystemError with the description</span>
|
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="c1">// This throws a SystemError with the description</span>
|
||||||
<span class="c1">// cannot open file 'madeup': No such file or directory</span>
|
<span class="c1">// cannot open file 'madeup': No such file or directory</span>
|
||||||
@@ -1134,11 +1388,29 @@ may look like “Unknown error -1” and is platform-dependent.</p>
|
|||||||
</div>
|
</div>
|
||||||
</dd></dl>
|
</dd></dl>
|
||||||
|
|
||||||
|
<dl class="function">
|
||||||
|
<dt id="_CPPv2N3fmt19format_system_errorERN3fmt6WriterEiN3fmt9StringRefE">
|
||||||
|
<span id="fmt::format_system_error__fmt::WriterR.i.fmt::StringRef"></span><span class="target" id="formatformat_8h_1a3933879503d45e8cce0ef1e284f98402"></span>void <code class="descclassname">fmt::</code><code class="descname">format_system_error</code><span class="sig-paren">(</span>fmt::Writer &<em>out</em>, int <em>error_code</em>, fmt::StringRef <em>message</em><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv2N3fmt19format_system_errorERN3fmt6WriterEiN3fmt9StringRefE" title="Permalink to this definition">¶</a></dt>
|
||||||
|
<dd><p><p>Formats an error returned by an operating system or a language runtime,
|
||||||
|
for example a file opening error, and writes it to <em>out</em> in the following
|
||||||
|
form:</p>
|
||||||
|
<pre class="literal-block">
|
||||||
|
<em><message></em>: <em><system-message></em>
|
||||||
|
</pre>
|
||||||
|
<p>where <em><message></em> is the passed message and <em><system-message></em> is
|
||||||
|
the system message corresponding to the error code.
|
||||||
|
<em>error_code</em> is a system error code as given by <code class="docutils literal"><span class="pre">errno</span></code>.
|
||||||
|
If <em>error_code</em> is not a valid error code such as -1, the system message
|
||||||
|
may look like “Unknown error -1” and is platform-dependent.</p>
|
||||||
|
</p>
|
||||||
|
</dd></dl>
|
||||||
|
|
||||||
<dl class="class">
|
<dl class="class">
|
||||||
<dt id="_CPPv2N3fmt12WindowsErrorE">
|
<dt id="_CPPv2N3fmt12WindowsErrorE">
|
||||||
<span id="fmt::WindowsError"></span><span class="target" id="formatclassfmt_1_1_windows_error"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">WindowsError</code><a class="headerlink" href="#_CPPv2N3fmt12WindowsErrorE" title="Permalink to this definition">¶</a></dt>
|
<span id="fmt::WindowsError"></span><span class="target" id="formatclassfmt_1_1_windows_error"></span><em class="property">class </em><code class="descclassname">fmt::</code><code class="descname">WindowsError</code><a class="headerlink" href="#_CPPv2N3fmt12WindowsErrorE" title="Permalink to this definition">¶</a></dt>
|
||||||
<dd><p>A Windows error. </p>
|
<dd><p>A Windows error. </p>
|
||||||
<div class="breathe-sectiondef container">
|
<p>Inherits from <a class="reference internal" href="#formatclassfmt_1_1_system_error"><span class="std std-ref">fmt::SystemError</span></a></p>
|
||||||
|
<div class="breathe-sectiondef docutils container">
|
||||||
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
<p class="breathe-sectiondef-title rubric">Public Functions</p>
|
||||||
<dl class="function">
|
<dl class="function">
|
||||||
<dt id="_CPPv2N3fmt12WindowsError12WindowsErrorEi10CStringRef">
|
<dt id="_CPPv2N3fmt12WindowsError12WindowsErrorEi10CStringRef">
|
||||||
@@ -1183,7 +1455,8 @@ A custom allocator class can be specified as a template argument to
|
|||||||
</div>
|
</div>
|
||||||
<p>It is also possible to write a formatting function that uses a custom
|
<p>It is also possible to write a formatting function that uses a custom
|
||||||
allocator:</p>
|
allocator:</p>
|
||||||
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="k">typedef</span> <span class="n">std</span><span class="o">::</span><span class="n">basic_string</span><span class="o"><</span><span class="kt">char</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">char_traits</span><span class="o"><</span><span class="kt">char</span><span class="o">></span><span class="p">,</span> <span class="n">CustomAllocator</span><span class="o">></span> <span class="n">CustomString</span><span class="p">;</span>
|
<div class="highlight-c++"><div class="highlight"><pre><span></span><span class="k">typedef</span> <span class="n">std</span><span class="o">::</span><span class="n">basic_string</span><span class="o"><</span><span class="kt">char</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">char_traits</span><span class="o"><</span><span class="kt">char</span><span class="o">></span><span class="p">,</span> <span class="n">CustomAllocator</span><span class="o">></span>
|
||||||
|
<span class="n">CustomString</span><span class="p">;</span>
|
||||||
|
|
||||||
<span class="n">CustomString</span> <span class="nf">format</span><span class="p">(</span><span class="n">CustomAllocator</span> <span class="n">alloc</span><span class="p">,</span> <span class="n">fmt</span><span class="o">::</span><span class="n">CStringRef</span> <span class="n">format_str</span><span class="p">,</span>
|
<span class="n">CustomString</span> <span class="nf">format</span><span class="p">(</span><span class="n">CustomAllocator</span> <span class="n">alloc</span><span class="p">,</span> <span class="n">fmt</span><span class="o">::</span><span class="n">CStringRef</span> <span class="n">format_str</span><span class="p">,</span>
|
||||||
<span class="n">fmt</span><span class="o">::</span><span class="n">ArgList</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
|
<span class="n">fmt</span><span class="o">::</span><span class="n">ArgList</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
|
||||||
@@ -1206,7 +1479,7 @@ allocator:</p>
|
|||||||
|
|
||||||
<div class="footer" role="contentinfo">
|
<div class="footer" role="contentinfo">
|
||||||
© Copyright 2012-2015, Victor Zverovich.
|
© Copyright 2012-2015, Victor Zverovich.
|
||||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.1.
|
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.1+.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="_static/bootstrap.min.js"></script>
|
<script src="_static/bootstrap.min.js"></script>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
|
||||||
<title>Contents — fmt 3.0.0 documentation</title>
|
<title>Contents — fmt 4.0.0 documentation</title>
|
||||||
|
|
||||||
<link rel="stylesheet" href="_static/basic.css" type="text/css" />
|
<link rel="stylesheet" href="_static/basic.css" type="text/css" />
|
||||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||||
@@ -17,10 +17,11 @@
|
|||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var DOCUMENTATION_OPTIONS = {
|
var DOCUMENTATION_OPTIONS = {
|
||||||
URL_ROOT: './',
|
URL_ROOT: './',
|
||||||
VERSION: '3.0.0',
|
VERSION: '4.0.0',
|
||||||
COLLAPSE_INDEX: false,
|
COLLAPSE_INDEX: false,
|
||||||
FILE_SUFFIX: '.html',
|
FILE_SUFFIX: '.html',
|
||||||
HAS_SOURCE: true
|
HAS_SOURCE: true,
|
||||||
|
SOURCELINK_SUFFIX: ''
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<script type="text/javascript" src="_static/jquery.js"></script>
|
<script type="text/javascript" src="_static/jquery.js"></script>
|
||||||
@@ -34,8 +35,9 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();
|
||||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;
|
||||||
|
a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||||
ga('create', 'UA-20116650-4', 'fmtlib.net');
|
ga('create', 'UA-20116650-4', 'fmtlib.net');
|
||||||
ga('send', 'pageview');
|
ga('send', 'pageview');
|
||||||
@@ -49,7 +51,8 @@
|
|||||||
<div class="navbar-content">
|
<div class="navbar-content">
|
||||||
|
|
||||||
<div class="navbar-header">
|
<div class="navbar-header">
|
||||||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
|
<button type="button" class="navbar-toggle collapsed"
|
||||||
|
data-toggle="collapse" data-target=".navbar-collapse">
|
||||||
<span class="sr-only">Toggle navigation</span>
|
<span class="sr-only">Toggle navigation</span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
@@ -62,18 +65,23 @@
|
|||||||
<div class="collapse navbar-collapse">
|
<div class="collapse navbar-collapse">
|
||||||
<ul class="nav navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown"
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
|
role="button" aria-expanded="false">4.0.0
|
||||||
aria-expanded="false">3.0.0 <span class="caret"></span></a>
|
<span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="http://fmtlib.net/2.0.0/">2.0.0</a></li>
|
|
||||||
<li><a href="http://fmtlib.net/1.1.0/">1.1.0</a></li>
|
<li><a href="http://fmtlib.net/3.0.0">3.0.0</a></li>
|
||||||
<li><a href="http://fmtlib.net/1.0.0/">1.0.0</a></li>
|
|
||||||
|
<li><a href="http://fmtlib.net/2.0.0">2.0.0</a></li>
|
||||||
|
|
||||||
|
<li><a href="http://fmtlib.net/1.1.0">1.1.0</a></li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
|
||||||
<li class="active"><a href="contents.html">Contents <span class="sr-only">(current)</span></a></li>
|
<li class="active"><a href="contents.html">Contents
|
||||||
|
<span class="sr-only">(current)</span></a></li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -91,9 +99,11 @@
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
<form class="navbar-form navbar-right" role="search" action="search.html" method="get">
|
<form class="navbar-form navbar-right" role="search" action="search.html"
|
||||||
|
method="get">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<input type="text" name="q" class="form-control" placeholder="Search" >
|
<input type="text" name="q" class="form-control"
|
||||||
|
placeholder="Search" >
|
||||||
</div>
|
</div>
|
||||||
<input type="hidden" name="check_keywords" value="yes" />
|
<input type="hidden" name="check_keywords" value="yes" />
|
||||||
<input type="hidden" name="area" value="default" />
|
<input type="hidden" name="area" value="default" />
|
||||||
@@ -120,6 +130,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li class="toctree-l1"><a class="reference internal" href="usage.html">Usage</a><ul>
|
<li class="toctree-l1"><a class="reference internal" href="usage.html">Usage</a><ul>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="usage.html#building-the-library">Building the library</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="usage.html#building-the-library">Building the library</a></li>
|
||||||
|
<li class="toctree-l2"><a class="reference internal" href="usage.html#header-only-usage-with-cmake">Header-only usage with CMake</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="usage.html#building-the-documentation">Building the documentation</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="usage.html#building-the-documentation">Building the documentation</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="usage.html#android-ndk">Android NDK</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="usage.html#android-ndk">Android NDK</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="usage.html#homebrew">Homebrew</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="usage.html#homebrew">Homebrew</a></li>
|
||||||
@@ -151,7 +162,7 @@
|
|||||||
|
|
||||||
<div class="footer" role="contentinfo">
|
<div class="footer" role="contentinfo">
|
||||||
© Copyright 2012-2015, Victor Zverovich.
|
© Copyright 2012-2015, Victor Zverovich.
|
||||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.1.
|
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.1+.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="_static/bootstrap.min.js"></script>
|
<script src="_static/bootstrap.min.js"></script>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
|
||||||
<title>Index — fmt 3.0.0 documentation</title>
|
<title>Index — fmt 4.0.0 documentation</title>
|
||||||
|
|
||||||
<link rel="stylesheet" href="_static/basic.css" type="text/css" />
|
<link rel="stylesheet" href="_static/basic.css" type="text/css" />
|
||||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||||
@@ -18,10 +18,11 @@
|
|||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var DOCUMENTATION_OPTIONS = {
|
var DOCUMENTATION_OPTIONS = {
|
||||||
URL_ROOT: './',
|
URL_ROOT: './',
|
||||||
VERSION: '3.0.0',
|
VERSION: '4.0.0',
|
||||||
COLLAPSE_INDEX: false,
|
COLLAPSE_INDEX: false,
|
||||||
FILE_SUFFIX: '.html',
|
FILE_SUFFIX: '.html',
|
||||||
HAS_SOURCE: true
|
HAS_SOURCE: true,
|
||||||
|
SOURCELINK_SUFFIX: ''
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<script type="text/javascript" src="_static/jquery.js"></script>
|
<script type="text/javascript" src="_static/jquery.js"></script>
|
||||||
@@ -34,8 +35,9 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();
|
||||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;
|
||||||
|
a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||||
ga('create', 'UA-20116650-4', 'fmtlib.net');
|
ga('create', 'UA-20116650-4', 'fmtlib.net');
|
||||||
ga('send', 'pageview');
|
ga('send', 'pageview');
|
||||||
@@ -49,7 +51,8 @@
|
|||||||
<div class="navbar-content">
|
<div class="navbar-content">
|
||||||
|
|
||||||
<div class="navbar-header">
|
<div class="navbar-header">
|
||||||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
|
<button type="button" class="navbar-toggle collapsed"
|
||||||
|
data-toggle="collapse" data-target=".navbar-collapse">
|
||||||
<span class="sr-only">Toggle navigation</span>
|
<span class="sr-only">Toggle navigation</span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
@@ -62,13 +65,17 @@
|
|||||||
<div class="collapse navbar-collapse">
|
<div class="collapse navbar-collapse">
|
||||||
<ul class="nav navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown"
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
|
role="button" aria-expanded="false">4.0.0
|
||||||
aria-expanded="false">3.0.0 <span class="caret"></span></a>
|
<span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="http://fmtlib.net/2.0.0/">2.0.0</a></li>
|
|
||||||
<li><a href="http://fmtlib.net/1.1.0/">1.1.0</a></li>
|
<li><a href="http://fmtlib.net/3.0.0">3.0.0</a></li>
|
||||||
<li><a href="http://fmtlib.net/1.0.0/">1.0.0</a></li>
|
|
||||||
|
<li><a href="http://fmtlib.net/2.0.0">2.0.0</a></li>
|
||||||
|
|
||||||
|
<li><a href="http://fmtlib.net/1.1.0">1.1.0</a></li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
@@ -91,9 +98,11 @@
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
<form class="navbar-form navbar-right" role="search" action="search.html" method="get">
|
<form class="navbar-form navbar-right" role="search" action="search.html"
|
||||||
|
method="get">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<input type="text" name="q" class="form-control" placeholder="Search" >
|
<input type="text" name="q" class="form-control"
|
||||||
|
placeholder="Search" >
|
||||||
</div>
|
</div>
|
||||||
<input type="hidden" name="check_keywords" value="yes" />
|
<input type="hidden" name="check_keywords" value="yes" />
|
||||||
<input type="hidden" name="area" value="default" />
|
<input type="hidden" name="area" value="default" />
|
||||||
@@ -141,7 +150,7 @@
|
|||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt7ArgListixEj">fmt::ArgList::operator[] (C++ function)</a>
|
<dt><a href="api.html#_CPPv2NK3fmt7ArgListixEj">fmt::ArgList::operator[] (C++ function)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
@@ -217,7 +226,7 @@
|
|||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt17BasicArgFormatter17BasicArgFormatterER14BasicFormatterI4Char4ImplER10FormatSpecPK4Char">fmt::BasicArgFormatter::BasicArgFormatter (C++ function)</a>
|
<dt><a href="api.html#_CPPv2N3fmt17BasicArgFormatter17BasicArgFormatterER14BasicFormatterI4Char4ImplER4SpecPK4Char">fmt::BasicArgFormatter::BasicArgFormatter (C++ function)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
@@ -233,15 +242,23 @@
|
|||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt20BasicContainerWriterE">fmt::BasicContainerWriter (C++ class)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt20BasicContainerWriter20BasicContainerWriterER9Container">fmt::BasicContainerWriter::BasicContainerWriter (C++ function)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt15BasicCStringRefE">fmt::BasicCStringRef (C++ class)</a>
|
<dt><a href="api.html#_CPPv2N3fmt15BasicCStringRefE">fmt::BasicCStringRef (C++ class)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt15BasicCStringRef15BasicCStringRefEPK4Char">fmt::BasicCStringRef::BasicCStringRef (C++ function)</a>, <a href="api.html#_CPPv2N3fmt15BasicCStringRef15BasicCStringRefERKNSt12basic_stringI4CharEE">[1]</a>
|
<dt><a href="api.html#_CPPv2N3fmt15BasicCStringRef15BasicCStringRefEPK4Char">fmt::BasicCStringRef::BasicCStringRef (C++ function)</a>, <a href="api.html#_CPPv2N3fmt15BasicCStringRef15BasicCStringRefERKNSt12basic_stringI4CharNSt11char_traitsI4CharEE9AllocatorEE">[1]</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt15BasicCStringRef5c_strEv">fmt::BasicCStringRef::c_str (C++ function)</a>
|
<dt><a href="api.html#_CPPv2NK3fmt15BasicCStringRef5c_strEv">fmt::BasicCStringRef::c_str (C++ function)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
@@ -276,6 +293,34 @@
|
|||||||
<dt><a href="api.html#_CPPv2N3fmt17BasicMemoryWriteraSERR17BasicMemoryWriter">fmt::BasicMemoryWriter::operator= (C++ function)</a>
|
<dt><a href="api.html#_CPPv2N3fmt17BasicMemoryWriteraSERR17BasicMemoryWriter">fmt::BasicMemoryWriter::operator= (C++ function)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt23BasicPrintfArgFormatterE">fmt::BasicPrintfArgFormatter (C++ class)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt23BasicPrintfArgFormatter23BasicPrintfArgFormatterER11BasicWriterI4CharER4Spec">fmt::BasicPrintfArgFormatter::BasicPrintfArgFormatter (C++ function)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt23BasicPrintfArgFormatter10visit_boolEb">fmt::BasicPrintfArgFormatter::visit_bool (C++ function)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt23BasicPrintfArgFormatter10visit_charEi">fmt::BasicPrintfArgFormatter::visit_char (C++ function)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt23BasicPrintfArgFormatter13visit_cstringEPKc">fmt::BasicPrintfArgFormatter::visit_cstring (C++ function)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt23BasicPrintfArgFormatter12visit_customEN8internal3Arg11CustomValueE">fmt::BasicPrintfArgFormatter::visit_custom (C++ function)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt23BasicPrintfArgFormatter13visit_pointerEPKv">fmt::BasicPrintfArgFormatter::visit_pointer (C++ function)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
</dl></td>
|
</dl></td>
|
||||||
<td style="width: 33%" valign="top"><dl>
|
<td style="width: 33%" valign="top"><dl>
|
||||||
|
|
||||||
@@ -283,19 +328,31 @@
|
|||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt14BasicStringRef14BasicStringRefEPK4Char">fmt::BasicStringRef::BasicStringRef (C++ function)</a>, <a href="api.html#_CPPv2N3fmt14BasicStringRef14BasicStringRefEPK4CharNSt6size_tE">[1]</a>, <a href="api.html#_CPPv2N3fmt14BasicStringRef14BasicStringRefERKNSt12basic_stringI4CharEE">[2]</a>
|
<dt><a href="api.html#_CPPv2N3fmt14BasicStringRef14BasicStringRefEPK4Char">fmt::BasicStringRef::BasicStringRef (C++ function)</a>, <a href="api.html#_CPPv2N3fmt14BasicStringRef14BasicStringRefEPK4CharNSt6size_tE">[1]</a>, <a href="api.html#_CPPv2N3fmt14BasicStringRef14BasicStringRefERKNSt12basic_stringI4CharNSt11char_traitsI4CharEE9AllocatorEE">[2]</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt14BasicStringRef4dataEv">fmt::BasicStringRef::data (C++ function)</a>
|
<dt><a href="api.html#_CPPv2NK3fmt14BasicStringRef4dataEv">fmt::BasicStringRef::data (C++ function)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt14BasicStringRef4sizeEv">fmt::BasicStringRef::size (C++ function)</a>
|
<dt><a href="api.html#_CPPv2NK3fmt14BasicStringRef4sizeEv">fmt::BasicStringRef::size (C++ function)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt14BasicStringRef9to_stringEv">fmt::BasicStringRef::to_string (C++ function)</a>
|
<dt><a href="api.html#_CPPv2NK3fmt14BasicStringRef9to_stringEv">fmt::BasicStringRef::to_string (C++ function)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt17BasicStringWriterE">fmt::BasicStringWriter (C++ class)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt17BasicStringWriter17BasicStringWriterERK9Allocator">fmt::BasicStringWriter::BasicStringWriter (C++ function)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt17BasicStringWriter7move_toERNSt12basic_stringI4CharNSt11char_traitsI4CharEE9AllocatorEE">fmt::BasicStringWriter::move_to (C++ function)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
@@ -303,11 +360,11 @@
|
|||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt11BasicWriter5c_strEv">fmt::BasicWriter::c_str (C++ function)</a>
|
<dt><a href="api.html#_CPPv2NK3fmt11BasicWriter5c_strEv">fmt::BasicWriter::c_str (C++ function)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt11BasicWriter4dataEv">fmt::BasicWriter::data (C++ function)</a>
|
<dt><a href="api.html#_CPPv2NK3fmt11BasicWriter4dataEv">fmt::BasicWriter::data (C++ function)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
@@ -315,11 +372,11 @@
|
|||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt11BasicWriter4sizeEv">fmt::BasicWriter::size (C++ function)</a>
|
<dt><a href="api.html#_CPPv2NK3fmt11BasicWriter4sizeEv">fmt::BasicWriter::size (C++ function)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt11BasicWriter3strEv">fmt::BasicWriter::str (C++ function)</a>
|
<dt><a href="api.html#_CPPv2NK3fmt11BasicWriter3strEv">fmt::BasicWriter::str (C++ function)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
@@ -343,7 +400,7 @@
|
|||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt6Buffer8capacityEv">fmt::Buffer::capacity (C++ function)</a>
|
<dt><a href="api.html#_CPPv2NK3fmt6Buffer8capacityEv">fmt::Buffer::capacity (C++ function)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
@@ -359,7 +416,7 @@
|
|||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt6Buffer4sizeEv">fmt::Buffer::size (C++ function)</a>
|
<dt><a href="api.html#_CPPv2NK3fmt6Buffer4sizeEv">fmt::Buffer::size (C++ function)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
@@ -367,6 +424,10 @@
|
|||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt19format_system_errorERN3fmt6WriterEiN3fmt9StringRefE">fmt::format_system_error (C++ function)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt7fprintfEPNSt4FILEE10CStringRef7ArgList">fmt::fprintf (C++ function)</a>, <a href="api.html#_CPPv2N3fmt7fprintfERNSt7ostreamE10CStringRef7ArgList">[1]</a>
|
<dt><a href="api.html#_CPPv2N3fmt7fprintfEPNSt4FILEE10CStringRef7ArgList">fmt::fprintf (C++ function)</a>, <a href="api.html#_CPPv2N3fmt7fprintfERNSt7ostreamE10CStringRef7ArgList">[1]</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
@@ -379,14 +440,6 @@
|
|||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt8literalsli2_aEPKcNSt6size_tE">fmt::literals::operator""_a (C++ function)</a>
|
|
||||||
</dt>
|
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt8literalsli7_formatEPKcNSt6size_tE">fmt::literals::operator""_format (C++ function)</a>
|
|
||||||
</dt>
|
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt3octEi">fmt::oct (C++ function)</a>
|
<dt><a href="api.html#_CPPv2N3fmt3octEi">fmt::oct (C++ function)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
@@ -403,6 +456,26 @@
|
|||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt18PrintfArgFormatterE">fmt::PrintfArgFormatter (C++ class)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt18PrintfArgFormatter18PrintfArgFormatterER11BasicWriterI4CharER10FormatSpec">fmt::PrintfArgFormatter::PrintfArgFormatter (C++ function)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt15PrintfFormatterE">fmt::PrintfFormatter (C++ class)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt15PrintfFormatter6formatE15BasicCStringRefI4CharE">fmt::PrintfFormatter::format (C++ function)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt15PrintfFormatter15PrintfFormatterERK7ArgListR11BasicWriterI4CharE">fmt::PrintfFormatter::PrintfFormatter (C++ function)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt7sprintfE10CStringRef7ArgList">fmt::sprintf (C++ function)</a>
|
<dt><a href="api.html#_CPPv2N3fmt7sprintfE10CStringRef7ArgList">fmt::sprintf (C++ function)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
@@ -415,6 +488,10 @@
|
|||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="api.html#_CPPv2N3fmt9to_stringERK1T">fmt::to_string (C++ function)</a>
|
||||||
|
</dt>
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="api.html#_CPPv2N3fmt12WindowsErrorE">fmt::WindowsError (C++ class)</a>
|
<dt><a href="api.html#_CPPv2N3fmt12WindowsErrorE">fmt::WindowsError (C++ class)</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
@@ -443,7 +520,7 @@
|
|||||||
|
|
||||||
<div class="footer" role="contentinfo">
|
<div class="footer" role="contentinfo">
|
||||||
© Copyright 2012-2015, Victor Zverovich.
|
© Copyright 2012-2015, Victor Zverovich.
|
||||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.1.
|
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.1+.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="_static/bootstrap.min.js"></script>
|
<script src="_static/bootstrap.min.js"></script>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
|
||||||
<title>Overview — fmt 3.0.0 documentation</title>
|
<title>Overview — fmt 4.0.0 documentation</title>
|
||||||
|
|
||||||
<link rel="stylesheet" href="_static/basic.css" type="text/css" />
|
<link rel="stylesheet" href="_static/basic.css" type="text/css" />
|
||||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||||
@@ -17,10 +17,11 @@
|
|||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var DOCUMENTATION_OPTIONS = {
|
var DOCUMENTATION_OPTIONS = {
|
||||||
URL_ROOT: './',
|
URL_ROOT: './',
|
||||||
VERSION: '3.0.0',
|
VERSION: '4.0.0',
|
||||||
COLLAPSE_INDEX: false,
|
COLLAPSE_INDEX: false,
|
||||||
FILE_SUFFIX: '.html',
|
FILE_SUFFIX: '.html',
|
||||||
HAS_SOURCE: true
|
HAS_SOURCE: true,
|
||||||
|
SOURCELINK_SUFFIX: ''
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<script type="text/javascript" src="_static/jquery.js"></script>
|
<script type="text/javascript" src="_static/jquery.js"></script>
|
||||||
@@ -33,8 +34,9 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();
|
||||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;
|
||||||
|
a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||||
ga('create', 'UA-20116650-4', 'fmtlib.net');
|
ga('create', 'UA-20116650-4', 'fmtlib.net');
|
||||||
ga('send', 'pageview');
|
ga('send', 'pageview');
|
||||||
@@ -48,7 +50,8 @@
|
|||||||
<div class="navbar-content">
|
<div class="navbar-content">
|
||||||
|
|
||||||
<div class="navbar-header">
|
<div class="navbar-header">
|
||||||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
|
<button type="button" class="navbar-toggle collapsed"
|
||||||
|
data-toggle="collapse" data-target=".navbar-collapse">
|
||||||
<span class="sr-only">Toggle navigation</span>
|
<span class="sr-only">Toggle navigation</span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
@@ -61,13 +64,17 @@
|
|||||||
<div class="collapse navbar-collapse">
|
<div class="collapse navbar-collapse">
|
||||||
<ul class="nav navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown"
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
|
role="button" aria-expanded="false">4.0.0
|
||||||
aria-expanded="false">3.0.0 <span class="caret"></span></a>
|
<span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="http://fmtlib.net/2.0.0/">2.0.0</a></li>
|
|
||||||
<li><a href="http://fmtlib.net/1.1.0/">1.1.0</a></li>
|
<li><a href="http://fmtlib.net/3.0.0">3.0.0</a></li>
|
||||||
<li><a href="http://fmtlib.net/1.0.0/">1.0.0</a></li>
|
|
||||||
|
<li><a href="http://fmtlib.net/2.0.0">2.0.0</a></li>
|
||||||
|
|
||||||
|
<li><a href="http://fmtlib.net/1.1.0">1.1.0</a></li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
@@ -90,9 +97,11 @@
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
<form class="navbar-form navbar-right" role="search" action="search.html" method="get">
|
<form class="navbar-form navbar-right" role="search" action="search.html"
|
||||||
|
method="get">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<input type="text" name="q" class="form-control" placeholder="Search" >
|
<input type="text" name="q" class="form-control"
|
||||||
|
placeholder="Search" >
|
||||||
</div>
|
</div>
|
||||||
<input type="hidden" name="check_keywords" value="yes" />
|
<input type="hidden" name="check_keywords" value="yes" />
|
||||||
<input type="hidden" name="area" value="default" />
|
<input type="hidden" name="area" value="default" />
|
||||||
@@ -105,20 +114,33 @@
|
|||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
|
|
||||||
<div class="jumbotron">
|
<div class="jumbotron">
|
||||||
<div class="tb-container">
|
<div class="tb-container">
|
||||||
<h1>{fmt}</h1>
|
<h1>{fmt}</h1>
|
||||||
<p class="lead">Small, safe and fast formatting library</p>
|
<p class="lead">Small, safe and fast formatting library</p>
|
||||||
<div class="btn-group" role="group">
|
<div class="btn-group" role="group">
|
||||||
|
|
||||||
<a class="btn btn-success"
|
<a class="btn btn-success"
|
||||||
href="https://github.com/fmtlib/fmt/releases/download/2.0.0/cppformat-2.0.0.zip">
|
href="https://github.com/fmtlib/fmt/releases/download/4.0.0/fmt-4.0.0.zip">
|
||||||
<span class="glyphicon glyphicon-download"></span> Download
|
<span class="glyphicon glyphicon-download"></span> Download
|
||||||
</a>
|
</a>
|
||||||
<button type="button" class="btn btn-success dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
|
<button type="button" class="btn btn-success dropdown-toggle"
|
||||||
|
data-toggle="dropdown"><span class="caret"></span></button>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li><a href="https://github.com/fmtlib/fmt/releases/download/2.0.0/cppformat-2.0.0.zip">Version 2.0.0</a></li>
|
|
||||||
<li><a href="https://github.com/fmtlib/fmt/releases/download/1.1.0/cppformat-1.1.0.zip">Version 1.1.0</a></li>
|
|
||||||
<li><a href="https://github.com/fmtlib/fmt/releases/download/1.0.0/cppformat-1.0.0.zip">Version 1.0.0</a></li>
|
<li><a href="https://github.com/fmtlib/fmt/releases/download/3.0.0/fmt-3.0.0.zip">Version 3.0.0
|
||||||
|
</a></li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><a href="https://github.com/fmtlib/fmt/releases/download/2.0.0/cppformat-2.0.0.zip">Version 2.0.0
|
||||||
|
</a></li>
|
||||||
|
|
||||||
|
|
||||||
|
<li><a href="https://github.com/fmtlib/fmt/releases/download/1.1.0/cppformat-1.1.0.zip">Version 1.1.0
|
||||||
|
</a></li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -140,16 +162,16 @@ alternative to C++ IOStreams.</p>
|
|||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">What users say:</div>
|
<div class="panel-heading">What users say:</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
Thanks for creating this library. It’s been a hole in C++ for a long time.
|
Thanks for creating this library. It’s been a hole in C++ for a long
|
||||||
I’ve used both boost::format and loki::SPrintf, and neither felt like the
|
time. I’ve used both boost::format and loki::SPrintf, and neither felt
|
||||||
right answer. This does.
|
like the right answer. This does.
|
||||||
</div>
|
</div>
|
||||||
</div><div class="section" id="format-api">
|
</div><div class="section" id="format-api">
|
||||||
<span id="id1"></span><h2>Format API<a class="headerlink" href="#format-api" title="Permalink to this headline">¶</a></h2>
|
<span id="id1"></span><h2>Format API<a class="headerlink" href="#format-api" title="Permalink to this headline">¶</a></h2>
|
||||||
<p>The replacement-based Format API provides a safe alternative to <code class="docutils literal"><span class="pre">printf</span></code>,
|
<p>The replacement-based Format API provides a safe alternative to <code class="docutils literal"><span class="pre">printf</span></code>,
|
||||||
<code class="docutils literal"><span class="pre">sprintf</span></code> and friends with comparable or <a class="reference external" href="http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html">better performance</a>.
|
<code class="docutils literal"><span class="pre">sprintf</span></code> and friends with comparable or <a class="reference external" href="http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html">better performance</a>.
|
||||||
The <a class="reference external" href="doc/latest/index.html#format-string-syntax">format string syntax</a> is similar
|
The <a class="reference external" href="syntax.html">format string syntax</a> is similar to the one used by
|
||||||
to the one used by <a class="reference external" href="http://docs.python.org/2/library/stdtypes.html#str.format">str.format</a>
|
<a class="reference external" href="http://docs.python.org/2/library/stdtypes.html#str.format">str.format</a>
|
||||||
in Python:</p>
|
in Python:</p>
|
||||||
<div class="code c++ highlight-c++"><div class="highlight"><pre><span></span><span class="n">fmt</span><span class="o">::</span><span class="n">format</span><span class="p">(</span><span class="s">"The answer is {}"</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>
|
<div class="code c++ highlight-c++"><div class="highlight"><pre><span></span><span class="n">fmt</span><span class="o">::</span><span class="n">format</span><span class="p">(</span><span class="s">"The answer is {}"</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
@@ -202,8 +224,7 @@ literal operators, they must be made visible with the directive
|
|||||||
</div>
|
</div>
|
||||||
<div class="section" id="write-api">
|
<div class="section" id="write-api">
|
||||||
<span id="id2"></span><h2>Write API<a class="headerlink" href="#write-api" title="Permalink to this headline">¶</a></h2>
|
<span id="id2"></span><h2>Write API<a class="headerlink" href="#write-api" title="Permalink to this headline">¶</a></h2>
|
||||||
<p>The concatenation-based Write API (experimental) provides a
|
<p>The concatenation-based Write API (experimental) provides a <a class="reference external" href="http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html">fast</a>
|
||||||
<a class="reference external" href="http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html">fast</a>
|
|
||||||
stateless alternative to IOStreams:</p>
|
stateless alternative to IOStreams:</p>
|
||||||
<div class="code c++ highlight-c++"><div class="highlight"><pre><span></span><span class="n">fmt</span><span class="o">::</span><span class="n">MemoryWriter</span> <span class="n">out</span><span class="p">;</span>
|
<div class="code c++ highlight-c++"><div class="highlight"><pre><span></span><span class="n">fmt</span><span class="o">::</span><span class="n">MemoryWriter</span> <span class="n">out</span><span class="p">;</span>
|
||||||
<span class="n">out</span> <span class="o"><<</span> <span class="s">"The answer in hexadecimal is "</span> <span class="o"><<</span> <span class="n">hex</span><span class="p">(</span><span class="mi">42</span><span class="p">);</span>
|
<span class="n">out</span> <span class="o"><<</span> <span class="s">"The answer in hexadecimal is "</span> <span class="o"><<</span> <span class="n">hex</span><span class="p">(</span><span class="mi">42</span><span class="p">);</span>
|
||||||
@@ -212,8 +233,9 @@ stateless alternative to IOStreams:</p>
|
|||||||
</div>
|
</div>
|
||||||
<div class="section" id="safety">
|
<div class="section" id="safety">
|
||||||
<span id="id3"></span><h2>Safety<a class="headerlink" href="#safety" title="Permalink to this headline">¶</a></h2>
|
<span id="id3"></span><h2>Safety<a class="headerlink" href="#safety" title="Permalink to this headline">¶</a></h2>
|
||||||
<p>The library is fully type safe, automatic memory management prevents buffer overflow,
|
<p>The library is fully type safe, automatic memory management prevents buffer
|
||||||
errors in format strings are reported using exceptions. For example, the code</p>
|
overflow, errors in format strings are reported using exceptions. For example,
|
||||||
|
the code</p>
|
||||||
<div class="code c++ highlight-c++"><div class="highlight"><pre><span></span><span class="n">fmt</span><span class="o">::</span><span class="n">format</span><span class="p">(</span><span class="s">"The answer is {:d}"</span><span class="p">,</span> <span class="s">"forty-two"</span><span class="p">);</span>
|
<div class="code c++ highlight-c++"><div class="highlight"><pre><span></span><span class="n">fmt</span><span class="o">::</span><span class="n">format</span><span class="p">(</span><span class="s">"The answer is {:d}"</span><span class="p">,</span> <span class="s">"forty-two"</span><span class="p">);</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -231,36 +253,38 @@ formatted into a narrow string. You can use a wide format string instead:</p>
|
|||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>For comparison, writing a wide character to <code class="docutils literal"><span class="pre">std::ostream</span></code> results in
|
<p>For comparison, writing a wide character to <code class="docutils literal"><span class="pre">std::ostream</span></code> results in
|
||||||
its numeric value being written to the stream (i.e. 1070 instead of letter ‘ю’ which
|
its numeric value being written to the stream (i.e. 1070 instead of letter ‘ю’
|
||||||
is represented by <code class="docutils literal"><span class="pre">L'\x42e'</span></code> if we use Unicode) which is rarely what is needed.</p>
|
which is represented by <code class="docutils literal"><span class="pre">L'\x42e'</span></code> if we use Unicode) which is rarely what is
|
||||||
|
needed.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="portability">
|
<div class="section" id="portability">
|
||||||
<span id="id4"></span><h2>Portability<a class="headerlink" href="#portability" title="Permalink to this headline">¶</a></h2>
|
<span id="id4"></span><h2>Portability<a class="headerlink" href="#portability" title="Permalink to this headline">¶</a></h2>
|
||||||
<p>The library is highly portable. Here is an incomplete list of operating systems and
|
<p>The library is highly portable. Here is an incomplete list of operating systems
|
||||||
compilers where it has been tested and known to work:</p>
|
and compilers where it has been tested and known to work:</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li>64-bit (amd64) GNU/Linux with GCC 4.4.3, <a class="reference external" href="https://travis-ci.org/fmtlib/fmt">4.6.3</a>,
|
<li>64-bit (amd64) GNU/Linux with GCC 4.4.3,
|
||||||
4.7.2, 4.8.1 and Intel C++ Compiler (ICC) 14.0.2</li>
|
<a class="reference external" href="https://travis-ci.org/fmtlib/fmt">4.6.3</a>, 4.7.2, 4.8.1, and Intel C++
|
||||||
|
Compiler (ICC) 14.0.2</li>
|
||||||
<li>32-bit (i386) GNU/Linux with GCC 4.4.3, 4.6.3</li>
|
<li>32-bit (i386) GNU/Linux with GCC 4.4.3, 4.6.3</li>
|
||||||
<li>Mac OS X with GCC 4.2.1 and Clang 4.2, 5.1.0</li>
|
<li>Mac OS X with GCC 4.2.1 and Clang 4.2, 5.1.0</li>
|
||||||
<li>64-bit Windows with Visual C++ 2010, 2013 and
|
<li>64-bit Windows with Visual C++ 2010, 2013 and
|
||||||
<a class="reference external" href="https://ci.appveyor.com/project/vitaut/fmt">2015</a></li>
|
<a class="reference external" href="https://ci.appveyor.com/project/vitaut/fmt">2015</a></li>
|
||||||
<li>32-bit Windows with Visual C++ 2010</li>
|
<li>32-bit Windows with Visual C++ 2010</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Although the library uses C++11 features when available, it also works with older
|
<p>Although the library uses C++11 features when available, it also works with
|
||||||
compilers and standard library implementations. The only thing to keep in mind
|
older compilers and standard library implementations. The only thing to keep in
|
||||||
for C++98 portability:</p>
|
mind for C++98 portability:</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li>Variadic templates: minimum GCC 4.4, Clang 2.9 or VS2013. This feature allows
|
<li>Variadic templates: minimum GCC 4.4, Clang 2.9 or VS2013. This feature allows
|
||||||
the Format API to accept an unlimited number of arguments. With older compilers
|
the Format API to accept an unlimited number of arguments. With older
|
||||||
the maximum is 15.</li>
|
compilers the maximum is 15.</li>
|
||||||
<li>User-defined literals: minimum GCC 4.7, Clang 3.1 or VS2015. The suffixes
|
<li>User-defined literals: minimum GCC 4.7, Clang 3.1 or VS2015. The suffixes
|
||||||
<code class="docutils literal"><span class="pre">_format</span></code> and <code class="docutils literal"><span class="pre">_a</span></code> are functionally equivalent to the functions
|
<code class="docutils literal"><span class="pre">_format</span></code> and <code class="docutils literal"><span class="pre">_a</span></code> are functionally equivalent to the functions
|
||||||
<code class="docutils literal"><span class="pre">fmt::format</span></code> and <code class="docutils literal"><span class="pre">fmt::arg</span></code>.</li>
|
<code class="docutils literal"><span class="pre">fmt::format</span></code> and <code class="docutils literal"><span class="pre">fmt::arg</span></code>.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>The output of all formatting functions is consistent across platforms. In particular,
|
<p>The output of all formatting functions is consistent across platforms. In
|
||||||
formatting a floating-point infinity always gives <code class="docutils literal"><span class="pre">inf</span></code> while the output
|
particular, formatting a floating-point infinity always gives <code class="docutils literal"><span class="pre">inf</span></code> while the
|
||||||
of <code class="docutils literal"><span class="pre">printf</span></code> is platform-dependent in this case. For example,</p>
|
output of <code class="docutils literal"><span class="pre">printf</span></code> is platform-dependent in this case. For example,</p>
|
||||||
<div class="code highlight-c++"><div class="highlight"><pre><span></span><span class="n">fmt</span><span class="o">::</span><span class="n">print</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">numeric_limits</span><span class="o"><</span><span class="kt">double</span><span class="o">>::</span><span class="n">infinity</span><span class="p">());</span>
|
<div class="code highlight-c++"><div class="highlight"><pre><span></span><span class="n">fmt</span><span class="o">::</span><span class="n">print</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">numeric_limits</span><span class="o"><</span><span class="kt">double</span><span class="o">>::</span><span class="n">infinity</span><span class="p">());</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -268,9 +292,10 @@ of <code class="docutils literal"><span class="pre">printf</span></code> is plat
|
|||||||
</div>
|
</div>
|
||||||
<div class="section" id="ease-of-use">
|
<div class="section" id="ease-of-use">
|
||||||
<span id="id7"></span><h2>Ease of Use<a class="headerlink" href="#ease-of-use" title="Permalink to this headline">¶</a></h2>
|
<span id="id7"></span><h2>Ease of Use<a class="headerlink" href="#ease-of-use" title="Permalink to this headline">¶</a></h2>
|
||||||
<p>fmt has a small self-contained code base consisting of a single header file
|
<p>fmt has a small self-contained code base with the core library consisting of
|
||||||
and a single source file and no external dependencies. A permissive BSD <a class="reference external" href="https://github.com/fmtlib/fmt#license">license</a> allows using the library both
|
a single header file and a single source file and no external dependencies.
|
||||||
in open-source and commercial projects.</p>
|
A permissive BSD <a class="reference external" href="https://github.com/fmtlib/fmt#license">license</a> allows
|
||||||
|
using the library both in open-source and commercial projects.</p>
|
||||||
<a class="btn btn-success" href="https://github.com/fmtlib/fmt">GitHub Repository</a>
|
<a class="btn btn-success" href="https://github.com/fmtlib/fmt">GitHub Repository</a>
|
||||||
|
|
||||||
<div class="section footer">
|
<div class="section footer">
|
||||||
@@ -288,7 +313,7 @@ in open-source and commercial projects.</p>
|
|||||||
|
|
||||||
<div class="footer" role="contentinfo">
|
<div class="footer" role="contentinfo">
|
||||||
© Copyright 2012-2015, Victor Zverovich.
|
© Copyright 2012-2015, Victor Zverovich.
|
||||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.1.
|
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.1+.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="_static/bootstrap.min.js"></script>
|
<script src="_static/bootstrap.min.js"></script>
|
||||||
|
|||||||
Binary file not shown.
@@ -8,7 +8,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
|
||||||
<title>Search — fmt 3.0.0 documentation</title>
|
<title>Search — fmt 4.0.0 documentation</title>
|
||||||
|
|
||||||
<link rel="stylesheet" href="_static/basic.css" type="text/css" />
|
<link rel="stylesheet" href="_static/basic.css" type="text/css" />
|
||||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||||
@@ -17,10 +17,11 @@
|
|||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var DOCUMENTATION_OPTIONS = {
|
var DOCUMENTATION_OPTIONS = {
|
||||||
URL_ROOT: './',
|
URL_ROOT: './',
|
||||||
VERSION: '3.0.0',
|
VERSION: '4.0.0',
|
||||||
COLLAPSE_INDEX: false,
|
COLLAPSE_INDEX: false,
|
||||||
FILE_SUFFIX: '.html',
|
FILE_SUFFIX: '.html',
|
||||||
HAS_SOURCE: true
|
HAS_SOURCE: true,
|
||||||
|
SOURCELINK_SUFFIX: ''
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<script type="text/javascript" src="_static/jquery.js"></script>
|
<script type="text/javascript" src="_static/jquery.js"></script>
|
||||||
@@ -40,8 +41,9 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();
|
||||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;
|
||||||
|
a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||||
ga('create', 'UA-20116650-4', 'fmtlib.net');
|
ga('create', 'UA-20116650-4', 'fmtlib.net');
|
||||||
ga('send', 'pageview');
|
ga('send', 'pageview');
|
||||||
@@ -56,7 +58,8 @@
|
|||||||
<div class="navbar-content">
|
<div class="navbar-content">
|
||||||
|
|
||||||
<div class="navbar-header">
|
<div class="navbar-header">
|
||||||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
|
<button type="button" class="navbar-toggle collapsed"
|
||||||
|
data-toggle="collapse" data-target=".navbar-collapse">
|
||||||
<span class="sr-only">Toggle navigation</span>
|
<span class="sr-only">Toggle navigation</span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
@@ -69,13 +72,17 @@
|
|||||||
<div class="collapse navbar-collapse">
|
<div class="collapse navbar-collapse">
|
||||||
<ul class="nav navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown"
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
|
role="button" aria-expanded="false">4.0.0
|
||||||
aria-expanded="false">3.0.0 <span class="caret"></span></a>
|
<span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="http://fmtlib.net/2.0.0/">2.0.0</a></li>
|
|
||||||
<li><a href="http://fmtlib.net/1.1.0/">1.1.0</a></li>
|
<li><a href="http://fmtlib.net/3.0.0">3.0.0</a></li>
|
||||||
<li><a href="http://fmtlib.net/1.0.0/">1.0.0</a></li>
|
|
||||||
|
<li><a href="http://fmtlib.net/2.0.0">2.0.0</a></li>
|
||||||
|
|
||||||
|
<li><a href="http://fmtlib.net/1.1.0">1.1.0</a></li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
@@ -126,9 +133,11 @@
|
|||||||
containing fewer words won't appear in the result list.
|
containing fewer words won't appear in the result list.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<form class="form-inline" role="search" action="#" method="get">
|
<form class="form-inline" role="search" action="#"
|
||||||
|
method="get">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<input type="text" name="q" class="form-control" >
|
<input type="text" name="q" class="form-control"
|
||||||
|
>
|
||||||
</div>
|
</div>
|
||||||
<input type="hidden" name="check_keywords" value="yes" />
|
<input type="hidden" name="check_keywords" value="yes" />
|
||||||
<input type="hidden" name="area" value="default" />
|
<input type="hidden" name="area" value="default" />
|
||||||
@@ -149,7 +158,7 @@
|
|||||||
|
|
||||||
<div class="footer" role="contentinfo">
|
<div class="footer" role="contentinfo">
|
||||||
© Copyright 2012-2015, Victor Zverovich.
|
© Copyright 2012-2015, Victor Zverovich.
|
||||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.1.
|
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.1+.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="_static/bootstrap.min.js"></script>
|
<script src="_static/bootstrap.min.js"></script>
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -8,7 +8,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
|
||||||
<title>Format String Syntax — fmt 3.0.0 documentation</title>
|
<title>Format String Syntax — fmt 4.0.0 documentation</title>
|
||||||
|
|
||||||
<link rel="stylesheet" href="_static/basic.css" type="text/css" />
|
<link rel="stylesheet" href="_static/basic.css" type="text/css" />
|
||||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||||
@@ -17,10 +17,11 @@
|
|||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var DOCUMENTATION_OPTIONS = {
|
var DOCUMENTATION_OPTIONS = {
|
||||||
URL_ROOT: './',
|
URL_ROOT: './',
|
||||||
VERSION: '3.0.0',
|
VERSION: '4.0.0',
|
||||||
COLLAPSE_INDEX: false,
|
COLLAPSE_INDEX: false,
|
||||||
FILE_SUFFIX: '.html',
|
FILE_SUFFIX: '.html',
|
||||||
HAS_SOURCE: true
|
HAS_SOURCE: true,
|
||||||
|
SOURCELINK_SUFFIX: ''
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<script type="text/javascript" src="_static/jquery.js"></script>
|
<script type="text/javascript" src="_static/jquery.js"></script>
|
||||||
@@ -34,8 +35,9 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();
|
||||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;
|
||||||
|
a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||||
ga('create', 'UA-20116650-4', 'fmtlib.net');
|
ga('create', 'UA-20116650-4', 'fmtlib.net');
|
||||||
ga('send', 'pageview');
|
ga('send', 'pageview');
|
||||||
@@ -49,7 +51,8 @@
|
|||||||
<div class="navbar-content">
|
<div class="navbar-content">
|
||||||
|
|
||||||
<div class="navbar-header">
|
<div class="navbar-header">
|
||||||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
|
<button type="button" class="navbar-toggle collapsed"
|
||||||
|
data-toggle="collapse" data-target=".navbar-collapse">
|
||||||
<span class="sr-only">Toggle navigation</span>
|
<span class="sr-only">Toggle navigation</span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
@@ -62,13 +65,17 @@
|
|||||||
<div class="collapse navbar-collapse">
|
<div class="collapse navbar-collapse">
|
||||||
<ul class="nav navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown"
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
|
role="button" aria-expanded="false">4.0.0
|
||||||
aria-expanded="false">3.0.0 <span class="caret"></span></a>
|
<span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="http://fmtlib.net/2.0.0/">2.0.0</a></li>
|
|
||||||
<li><a href="http://fmtlib.net/1.1.0/">1.1.0</a></li>
|
<li><a href="http://fmtlib.net/3.0.0">3.0.0</a></li>
|
||||||
<li><a href="http://fmtlib.net/1.0.0/">1.0.0</a></li>
|
|
||||||
|
<li><a href="http://fmtlib.net/2.0.0">2.0.0</a></li>
|
||||||
|
|
||||||
|
<li><a href="http://fmtlib.net/1.1.0">1.1.0</a></li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
@@ -85,15 +92,18 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="active"><a href="syntax.html">Syntax <span class="sr-only">(current)</span></a></li>
|
<li class="active"><a href="syntax.html">Syntax
|
||||||
|
<span class="sr-only">(current)</span></a></li>
|
||||||
|
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
<form class="navbar-form navbar-right" role="search" action="search.html" method="get">
|
<form class="navbar-form navbar-right" role="search" action="search.html"
|
||||||
|
method="get">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<input type="text" name="q" class="form-control" placeholder="Search" >
|
<input type="text" name="q" class="form-control"
|
||||||
|
placeholder="Search" >
|
||||||
</div>
|
</div>
|
||||||
<input type="hidden" name="check_keywords" value="yes" />
|
<input type="hidden" name="check_keywords" value="yes" />
|
||||||
<input type="hidden" name="area" value="default" />
|
<input type="hidden" name="area" value="default" />
|
||||||
@@ -153,12 +163,10 @@ precision and so on. Each value type can define its own “formatting
|
|||||||
mini-language” or interpretation of the <em>format_spec</em>.</p>
|
mini-language” or interpretation of the <em>format_spec</em>.</p>
|
||||||
<p>Most built-in types support a common formatting mini-language, which is
|
<p>Most built-in types support a common formatting mini-language, which is
|
||||||
described in the next section.</p>
|
described in the next section.</p>
|
||||||
<p>A <em>format_spec</em> field can also include nested replacement fields within it.
|
<p>A <em>format_spec</em> field can also include nested replacement fields in certain
|
||||||
These nested replacement fields can contain only an argument index;
|
positions within it. These nested replacement fields can contain only an
|
||||||
format specifications are not allowed. Formatting is performed as if the
|
argument id; format specifications are not allowed. This allows the
|
||||||
replacement fields within the format_spec are substituted before the
|
formatting of a value to be dynamically specified.</p>
|
||||||
<em>format_spec</em> string is interpreted. This allows the formatting of a value
|
|
||||||
to be dynamically specified.</p>
|
|
||||||
<p>See the <a class="reference internal" href="#formatexamples"><span class="std std-ref">Format examples</span></a> section for some examples.</p>
|
<p>See the <a class="reference internal" href="#formatexamples"><span class="std std-ref">Format examples</span></a> section for some examples.</p>
|
||||||
<div class="section" id="format-specification-mini-language">
|
<div class="section" id="format-specification-mini-language">
|
||||||
<span id="formatspec"></span><h2>Format Specification Mini-Language<a class="headerlink" href="#format-specification-mini-language" title="Permalink to this headline">¶</a></h2>
|
<span id="formatspec"></span><h2>Format Specification Mini-Language<a class="headerlink" href="#format-specification-mini-language" title="Permalink to this headline">¶</a></h2>
|
||||||
@@ -176,8 +184,8 @@ although some of the formatting options are only supported by the numeric types.
|
|||||||
<strong id="grammar-token-sign">sign </strong> ::= "+" | "-" | " "
|
<strong id="grammar-token-sign">sign </strong> ::= "+" | "-" | " "
|
||||||
<strong id="grammar-token-width">width </strong> ::= <a class="reference internal" href="#grammar-token-integer"><code class="xref docutils literal"><span class="pre">integer</span></code></a> | "{" <a class="reference internal" href="#grammar-token-arg_id"><code class="xref docutils literal"><span class="pre">arg_id</span></code></a> "}"
|
<strong id="grammar-token-width">width </strong> ::= <a class="reference internal" href="#grammar-token-integer"><code class="xref docutils literal"><span class="pre">integer</span></code></a> | "{" <a class="reference internal" href="#grammar-token-arg_id"><code class="xref docutils literal"><span class="pre">arg_id</span></code></a> "}"
|
||||||
<strong id="grammar-token-precision">precision </strong> ::= <a class="reference internal" href="#grammar-token-integer"><code class="xref docutils literal"><span class="pre">integer</span></code></a> | "{" <a class="reference internal" href="#grammar-token-arg_id"><code class="xref docutils literal"><span class="pre">arg_id</span></code></a> "}"
|
<strong id="grammar-token-precision">precision </strong> ::= <a class="reference internal" href="#grammar-token-integer"><code class="xref docutils literal"><span class="pre">integer</span></code></a> | "{" <a class="reference internal" href="#grammar-token-arg_id"><code class="xref docutils literal"><span class="pre">arg_id</span></code></a> "}"
|
||||||
<strong id="grammar-token-type">type </strong> ::= <a class="reference internal" href="#grammar-token-int_type"><code class="xref docutils literal"><span class="pre">int_type</span></code></a> | "c" | "e" | "E" | "f" | "F" | "g" | "G" | "p" | "s"
|
<strong id="grammar-token-type">type </strong> ::= <a class="reference internal" href="#grammar-token-int_type"><code class="xref docutils literal"><span class="pre">int_type</span></code></a> | "a" | "A" | "c" | "e" | "E" | "f" | "F" | "g" | "G" | "p" | "s"
|
||||||
<strong id="grammar-token-int_type">int_type </strong> ::= "b" | "B" | "d" | "o" | "x" | "X"
|
<strong id="grammar-token-int_type">int_type </strong> ::= "b" | "B" | "d" | "n" | "o" | "x" | "X"
|
||||||
</pre>
|
</pre>
|
||||||
<p>The <em>fill</em> character can be any character other than ‘{‘ or ‘}’. The presence
|
<p>The <em>fill</em> character can be any character other than ‘{‘ or ‘}’. The presence
|
||||||
of a fill character is signaled by the character following it, which must be
|
of a fill character is signaled by the character following it, which must be
|
||||||
@@ -383,7 +391,7 @@ Boolean values are formatted using textual representation, either <code class="d
|
|||||||
<tr class="row-even"><td><code class="docutils literal"><span class="pre">'a'</span></code></td>
|
<tr class="row-even"><td><code class="docutils literal"><span class="pre">'a'</span></code></td>
|
||||||
<td>Hexadecimal floating point format. Prints the number in
|
<td>Hexadecimal floating point format. Prints the number in
|
||||||
base 16 with prefix <code class="docutils literal"><span class="pre">"0x"</span></code> and lower-case letters for
|
base 16 with prefix <code class="docutils literal"><span class="pre">"0x"</span></code> and lower-case letters for
|
||||||
digits above 9. Uses ‘p’ to indicate the exponent.</td>
|
digits above 9. Uses <code class="docutils literal"><span class="pre">'p'</span></code> to indicate the exponent.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="row-odd"><td><code class="docutils literal"><span class="pre">'A'</span></code></td>
|
<tr class="row-odd"><td><code class="docutils literal"><span class="pre">'A'</span></code></td>
|
||||||
<td>Same as <code class="docutils literal"><span class="pre">'a'</span></code> except it uses upper-case letters for
|
<td>Same as <code class="docutils literal"><span class="pre">'a'</span></code> except it uses upper-case letters for
|
||||||
@@ -507,7 +515,7 @@ following examples.</p>
|
|||||||
|
|
||||||
<div class="footer" role="contentinfo">
|
<div class="footer" role="contentinfo">
|
||||||
© Copyright 2012-2015, Victor Zverovich.
|
© Copyright 2012-2015, Victor Zverovich.
|
||||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.1.
|
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.1+.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="_static/bootstrap.min.js"></script>
|
<script src="_static/bootstrap.min.js"></script>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user