Compare commits
1526 Commits
master
...
rpc_server
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6418c18739 | ||
|
|
833e0908a4 | ||
|
|
124d4468c4 | ||
|
|
46ba8af111 | ||
|
|
033dd8088e | ||
|
|
656fbf78fa | ||
|
|
a6993fa15f | ||
|
|
0f31ddd868 | ||
|
|
61e40b800e | ||
|
|
a8945997f7 | ||
|
|
aa160e397a | ||
|
|
c07cfbcf40 | ||
|
|
a7b2b39fd2 | ||
|
|
4dbb8de2e9 | ||
|
|
d161d06602 | ||
|
|
715762e80c | ||
|
|
97342e2c60 | ||
|
|
d709e81adf | ||
|
|
f2da1279a7 | ||
|
|
928b149d66 | ||
|
|
9d9f839a75 | ||
|
|
981e1d0d57 | ||
|
|
a89a745d8c | ||
|
|
c9e97c91bf | ||
|
|
71834aaf7e | ||
|
|
22e29b7564 | ||
|
|
578213ee50 | ||
|
|
c0fe7338ef | ||
|
|
57b2425569 | ||
|
|
b79cb08aca | ||
|
|
ed7cd0d962 | ||
|
|
7a04463517 | ||
|
|
34099258a7 | ||
|
|
19e4c292c7 | ||
|
|
2cbc354cb3 | ||
|
|
47de734e17 | ||
|
|
ae558370d5 | ||
|
|
4c966b46c4 | ||
|
|
dab7c252b4 | ||
|
|
420d0d6d9e | ||
|
|
2ba880d869 | ||
|
|
f62cd62952 | ||
|
|
820ae5bbfa | ||
|
|
5a04b66a1c | ||
|
|
1b54ab5f43 | ||
|
|
c090807cb3 | ||
|
|
9574295f8d | ||
|
|
bc417b6301 | ||
|
|
a4efd1bac1 | ||
|
|
36d0eed502 | ||
|
|
2aa7947dad | ||
|
|
6d46b9de85 | ||
|
|
de33ba1221 | ||
|
|
3468f8f220 | ||
|
|
381a932b06 | ||
|
|
186eba9d55 | ||
|
|
bf5eafc0e0 | ||
|
|
f3ce3249cc | ||
|
|
92417342bf | ||
|
|
d190c2edf8 | ||
|
|
e0b255a859 | ||
|
|
d38bb332d6 | ||
|
|
aa4656da0a | ||
|
|
bb32b5b124 | ||
|
|
ef03eb4581 | ||
|
|
72ccca583b | ||
|
|
3dda192a6f | ||
|
|
171aab883a | ||
|
|
0316e06823 | ||
|
|
e3d7370ff6 | ||
|
|
b1c72db334 | ||
|
|
1b0b77978c | ||
|
|
d2d31d94ab | ||
|
|
3c8f9a8eb6 | ||
|
|
519c8a7a68 | ||
|
|
852eb088fa | ||
|
|
57d2ab0f69 | ||
|
|
fdbeb25af2 | ||
|
|
7b18ddbbdd | ||
|
|
05c5c5dcaa | ||
|
|
7270808f80 | ||
|
|
31e41bab0f | ||
|
|
ee9b19b98c | ||
|
|
658fd9e2b8 | ||
|
|
c72819f253 | ||
|
|
32d66d96fd | ||
|
|
1b125ca222 | ||
|
|
1e7fac37b8 | ||
|
|
2341d2d144 | ||
|
|
66f985f758 | ||
|
|
95c4c4ee2e | ||
|
|
7df724a8d6 | ||
|
|
01fc89f874 | ||
|
|
7d5161a44d | ||
|
|
2a43279167 | ||
|
|
469e52f984 | ||
|
|
76e18cac7b | ||
|
|
9dec8fa266 | ||
|
|
b1b22e06d8 | ||
|
|
630064912a | ||
|
|
1f1aa56d1b | ||
|
|
fa8e1a93d7 | ||
|
|
47ffc52955 | ||
|
|
cb5c5e91f7 | ||
|
|
a2997b3be5 | ||
|
|
4caadbf837 | ||
|
|
0020a4af8c | ||
|
|
4f9b7ed56d | ||
|
|
53c573d7e0 | ||
|
|
ff3c6468cf | ||
|
|
9b653d37e6 | ||
|
|
6450c857ce | ||
|
|
410d918a75 | ||
|
|
1639ee330f | ||
|
|
a386b1e29f | ||
|
|
715e88a41e | ||
|
|
77ff241698 | ||
|
|
37ef7dd434 | ||
|
|
631944f2be | ||
|
|
fac56917a9 | ||
|
|
1a61c7fd1c | ||
|
|
a3622b43f0 | ||
|
|
0abecb446e | ||
|
|
5647721a41 | ||
|
|
a54b6a4175 | ||
|
|
b26297c864 | ||
|
|
bb820093ff | ||
|
|
f50c7f6e86 | ||
|
|
beda327165 | ||
|
|
d9eb329bea | ||
|
|
c28bf27f8f | ||
|
|
c18a8cc3ce | ||
|
|
485280243a | ||
|
|
fefc3e6eae | ||
|
|
89f9b84819 | ||
|
|
3c4824e59e | ||
|
|
ea603fd617 | ||
|
|
37bb6f8a70 | ||
|
|
8dbefbe3d9 | ||
|
|
8a79ce2b64 | ||
|
|
892d81907e | ||
|
|
50a4a9d9c2 | ||
|
|
55c40cf077 | ||
|
|
511a69454d | ||
|
|
e69ec1d786 | ||
|
|
f619449137 | ||
|
|
6547a4a9db | ||
|
|
fc830c47d9 | ||
|
|
5b0bda5291 | ||
|
|
da5b8f040b | ||
|
|
65bc278a06 | ||
|
|
a882a010d3 | ||
|
|
ce5c64f789 | ||
|
|
7c95366d59 | ||
|
|
bc55208047 | ||
|
|
d9212ee249 | ||
|
|
917c084ba1 | ||
|
|
6dc3be91f6 | ||
|
|
3a82f1cda8 | ||
|
|
aa337c2e63 | ||
|
|
5f00cf6a14 | ||
|
|
5b70a69ca1 | ||
|
|
7175dd3c78 | ||
|
|
e1022d475e | ||
|
|
df883aeea7 | ||
|
|
ac736dc6bd | ||
|
|
b966557d03 | ||
|
|
b8309ca89d | ||
|
|
4fcae1b8f0 | ||
|
|
db3a30b61d | ||
|
|
0e97028a25 | ||
|
|
20cd54b84f | ||
|
|
ed7e2d7625 | ||
|
|
ed981184d3 | ||
|
|
aa7ee2a381 | ||
|
|
c72761d627 | ||
|
|
a2a8da873e | ||
|
|
385d571c3a | ||
|
|
0e01178669 | ||
|
|
dfc6f986bc | ||
|
|
e892469ff9 | ||
|
|
4422dbc527 | ||
|
|
850cceecaa | ||
|
|
5e9710d2f3 | ||
|
|
2ae819376f | ||
|
|
33dc62db36 | ||
|
|
a1d97a1ab6 | ||
|
|
fa633cf184 | ||
|
|
3afcbdf2eb | ||
|
|
dff655484e | ||
|
|
49b6a6a928 | ||
|
|
8bf48093b7 | ||
|
|
a22e318c22 | ||
|
|
1e0ca0db80 | ||
|
|
0b2fdf49c3 | ||
|
|
ee8e3b9a5f | ||
|
|
fd4ab739bf | ||
|
|
b0e2c5672c | ||
|
|
64901ca8b0 | ||
|
|
5bdd93cbef | ||
|
|
766bcfd30b | ||
|
|
698aec8556 | ||
|
|
df9139cec8 | ||
|
|
ed57b527a3 | ||
|
|
b3689ca93d | ||
|
|
cf5f30cebb | ||
|
|
a33320065c | ||
|
|
0e391bc071 | ||
|
|
b856dfb5ff | ||
|
|
f38206184c | ||
|
|
d10124fdb2 | ||
|
|
1b545ea1b7 | ||
|
|
2d6bcc09b9 | ||
|
|
35f35d0a97 | ||
|
|
20dd3f6683 | ||
|
|
532dba9873 | ||
|
|
3de1b738a3 | ||
|
|
b7472d7ab3 | ||
|
|
8a6f0b4e92 | ||
|
|
776a05e959 | ||
|
|
abeabab66b | ||
|
|
295f7f9222 | ||
|
|
29a466dfb2 | ||
|
|
2c8af266b7 | ||
|
|
41ee2e48d4 | ||
|
|
11f7b4960d | ||
|
|
a10b2fefa7 | ||
|
|
c26c3086af | ||
|
|
2835465e0d | ||
|
|
d1111725ef | ||
|
|
d310ce93f6 | ||
|
|
5b7812c469 | ||
|
|
623baec632 | ||
|
|
468e65e8da | ||
|
|
f9d33219f5 | ||
|
|
1b51313cf0 | ||
|
|
7339e3c634 | ||
|
|
e6378568b1 | ||
|
|
260e623dfc | ||
|
|
c9742c54ee | ||
|
|
437eeac1dd | ||
|
|
f026927a10 | ||
|
|
87c3448dce | ||
|
|
738015e1d3 | ||
|
|
67cff6a431 | ||
|
|
4a0788729a | ||
|
|
324ec44b1f | ||
|
|
52a24f3376 | ||
|
|
4e8da1047f | ||
|
|
b9bd656130 | ||
|
|
62b8959806 | ||
|
|
f3a764e2dc | ||
|
|
97f8e3b96d | ||
|
|
8b236925c2 | ||
|
|
088208a3bb | ||
|
|
2084223308 | ||
|
|
e4ba7fd004 | ||
|
|
c94e97dbe6 | ||
|
|
8142cac415 | ||
|
|
13e580caaa | ||
|
|
1c058d5546 | ||
|
|
b41130b6fa | ||
|
|
8328ac6b63 | ||
|
|
60785c9909 | ||
|
|
1674ae161f | ||
|
|
9d4a2c9f15 | ||
|
|
8967922db6 | ||
|
|
ceb3c93df0 | ||
|
|
3703b2396a | ||
|
|
ccc02de315 | ||
|
|
05b5341a1d | ||
|
|
b68d8bd4d5 | ||
|
|
17340f056d | ||
|
|
806780b5b3 | ||
|
|
b66bfa0209 | ||
|
|
f42dd2dd95 | ||
|
|
b4317cf3c4 | ||
|
|
6172c12227 | ||
|
|
4e832972fa | ||
|
|
30f32e1da0 | ||
|
|
0f2aedb150 | ||
|
|
6560eb19ac | ||
|
|
69cbb39221 | ||
|
|
fb4367080d | ||
|
|
e6f7db6cca | ||
|
|
e2200be3ff | ||
|
|
8345076c28 | ||
|
|
46a76843a9 | ||
|
|
e5730c206e | ||
|
|
f17e2948a3 | ||
|
|
56157dd32c | ||
|
|
9b08cdebe6 | ||
|
|
a80d65ccd2 | ||
|
|
fdcb4faef9 | ||
|
|
75ae03be9f | ||
|
|
c1f9d0aa20 | ||
|
|
5da2f68a0c | ||
|
|
00809c8484 | ||
|
|
87aef36237 | ||
|
|
25cfbf30a2 | ||
|
|
6824df5a1c | ||
|
|
52fbce102f | ||
|
|
f14c0ba5d2 | ||
|
|
d9aedbdf55 | ||
|
|
e26266f1d7 | ||
|
|
123f4d2e1c | ||
|
|
bd96bfa29e | ||
|
|
90e1115798 | ||
|
|
8d496bfbda | ||
|
|
e59cbc9360 | ||
|
|
f621b938bd | ||
|
|
1c667bc066 | ||
|
|
7f085b6b80 | ||
|
|
34126d990a | ||
|
|
650bb1136f | ||
|
|
0a610a79bb | ||
|
|
cc77fff573 | ||
|
|
cbd054f050 | ||
|
|
feeef9c449 | ||
|
|
56f400a4ef | ||
|
|
524a0cfa0f | ||
|
|
1730d81990 | ||
|
|
8bf726f9a3 | ||
|
|
7cab2e6eb1 | ||
|
|
d60c56a767 | ||
|
|
746ad76a5b | ||
|
|
22c20dd8b3 | ||
|
|
69e4c823c4 | ||
|
|
ecf37639a5 | ||
|
|
e9d1565115 | ||
|
|
167e5dd28c | ||
|
|
b0fb5d0469 | ||
|
|
cee1ff220b | ||
|
|
4c9b3abae0 | ||
|
|
6acc529698 | ||
|
|
e622273a73 | ||
|
|
bd36f98954 | ||
|
|
1ed7fa71b9 | ||
|
|
94a056c18a | ||
|
|
892b6408d3 | ||
|
|
dd90f57f70 | ||
|
|
5586a4aa4f | ||
|
|
f81facf4cd | ||
|
|
edceb1cf1e | ||
|
|
dd6fdde8ce | ||
|
|
21ae017443 | ||
|
|
2e50f58a09 | ||
|
|
3d2cfa9380 | ||
|
|
104ab707a6 | ||
|
|
ab269ac8a6 | ||
|
|
08eeeb2a40 | ||
|
|
c0858e20f0 | ||
|
|
50c42e705d | ||
|
|
1782094f92 | ||
|
|
f435b444d7 | ||
|
|
54bf168f80 | ||
|
|
7e4a4c2bd4 | ||
|
|
deb90ba749 | ||
|
|
1ce0f639ce | ||
|
|
bf1b96fbb5 | ||
|
|
19881f2d09 | ||
|
|
0a48a58317 | ||
|
|
afd9c276f3 | ||
|
|
6dfb61ada9 | ||
|
|
48aae65afd | ||
|
|
f063cd199c | ||
|
|
87e8b9a261 | ||
|
|
804ee3251d | ||
|
|
497efd6e2d | ||
|
|
59bbfcd710 | ||
|
|
7d6a040cec | ||
|
|
ade21206c6 | ||
|
|
eaffa63ae8 | ||
|
|
5354e1bca0 | ||
|
|
158b7a840a | ||
|
|
9f8e2460ac | ||
|
|
48ddddb680 | ||
|
|
0df389240e | ||
|
|
650db03198 | ||
|
|
1d0ed79b13 | ||
|
|
ce8dabf112 | ||
|
|
9d9c5634e2 | ||
|
|
dcb0396a73 | ||
|
|
2612647e74 | ||
|
|
e1f086fb85 | ||
|
|
248405d984 | ||
|
|
02002e6c16 | ||
|
|
b9f6cceda1 | ||
|
|
c734417b1c | ||
|
|
739a328674 | ||
|
|
cf8b5f9c23 | ||
|
|
608d7d4168 | ||
|
|
dceed4be1e | ||
|
|
4f9d047196 | ||
|
|
9ac20a99b6 | ||
|
|
60725fca2a | ||
|
|
88b855d949 | ||
|
|
98c187869b | ||
|
|
0a53f88af7 | ||
|
|
4b471ad95d | ||
|
|
ed7ec40d34 | ||
|
|
59a8d692b1 | ||
|
|
d326a8c4cf | ||
|
|
2b5f0e099f | ||
|
|
5c0ea843a0 | ||
|
|
83568e3c23 | ||
|
|
42d59026fd | ||
|
|
f5fef79619 | ||
|
|
4cf882ecd2 | ||
|
|
cf11a71f03 | ||
|
|
2ca9f004bd | ||
|
|
07935149a7 | ||
|
|
f99ece7531 | ||
|
|
dd142fceaa | ||
|
|
eb3e1e376e | ||
|
|
b6a3b6f0be | ||
|
|
f962718717 | ||
|
|
caff1b207a | ||
|
|
09a48aa1ed | ||
|
|
a7bbfc3d59 | ||
|
|
a387920c1f | ||
|
|
8ed0cf8889 | ||
|
|
462f60a5da | ||
|
|
2b8ce93ab1 | ||
|
|
f8084e8baf | ||
|
|
e3661d11b5 | ||
|
|
798004b2a3 | ||
|
|
d7a1eededb | ||
|
|
857923f268 | ||
|
|
0f4cae323e | ||
|
|
9ec87776f0 | ||
|
|
e21aac1c08 | ||
|
|
d123fc93d5 | ||
|
|
5768776e56 | ||
|
|
a9e07f103a | ||
|
|
b336e42f21 | ||
|
|
ef1125b75d | ||
|
|
30eab6db4b | ||
|
|
e884b20e32 | ||
|
|
7e58fd3f4b | ||
|
|
68c8cfe620 | ||
|
|
b25a10f2fe | ||
|
|
c0f02217c1 | ||
|
|
0036ff96c7 | ||
|
|
2c33c24d42 | ||
|
|
98fcc02e38 | ||
|
|
50c6c07140 | ||
|
|
0e86975563 | ||
|
|
9dfa884349 | ||
|
|
28de534bd4 | ||
|
|
574b9f49a1 | ||
|
|
728656d23b | ||
|
|
3b02cd1241 | ||
|
|
408bd4df5b | ||
|
|
d16e2b3e25 | ||
|
|
dd9e934f2d | ||
|
|
c814fac8ba | ||
|
|
d3fde0949a | ||
|
|
bc6320d11d | ||
|
|
1feed48e0f | ||
|
|
dd48b8354c | ||
|
|
adaf454d36 | ||
|
|
17ac92f5a1 | ||
|
|
54dba4b18a | ||
|
|
420f0a2e2c | ||
|
|
11d38f9483 | ||
|
|
f64d18de82 | ||
|
|
eaaad55a10 | ||
|
|
65af33758b | ||
|
|
6f4366dffc | ||
|
|
d5735710cd | ||
|
|
bd6c3380ba | ||
|
|
eb7cee0292 | ||
|
|
b29eee3a1a | ||
|
|
58033e959f | ||
|
|
b1347f48cb | ||
|
|
1520798201 | ||
|
|
b8662c3afd | ||
|
|
5dde9f9f9f | ||
|
|
3466a7f0fb | ||
|
|
89849854bb | ||
|
|
8348e26ac4 | ||
|
|
9512b7b0e0 | ||
|
|
c1f32bc792 | ||
|
|
dc4f33b1f5 | ||
|
|
6fd2d3a039 | ||
|
|
865cc45c59 | ||
|
|
03eca57bb5 | ||
|
|
5a9b2a0fa8 | ||
|
|
d1d63de3bf | ||
|
|
cc2fbb53d8 | ||
|
|
fde2821109 | ||
|
|
e4e1b93a9a | ||
|
|
b48aeea1d8 | ||
|
|
88b1b3601e | ||
|
|
2b54cd128f | ||
|
|
1fc341b77b | ||
|
|
2aa0ccbd58 | ||
|
|
6471ccda73 | ||
|
|
822ae4c6ef | ||
|
|
7dcd683997 | ||
|
|
d17992a6f1 | ||
|
|
af72af6ec4 | ||
|
|
f6a43e8a21 | ||
|
|
4245b7e1d1 | ||
|
|
7a4586b1ef | ||
|
|
f611eccec9 | ||
|
|
eb71e599a2 | ||
|
|
f385a7f546 | ||
|
|
8c5f31d7a8 | ||
|
|
efab82709f | ||
|
|
baf4914f9b | ||
|
|
9080c8870a | ||
|
|
b6915f5073 | ||
|
|
a232698664 | ||
|
|
58c36d9180 | ||
|
|
61f065747e | ||
|
|
bcd385210a | ||
|
|
259814ab90 | ||
|
|
5ad2b64fc4 | ||
|
|
f4c9972fdf | ||
|
|
f25fbb2d4e | ||
|
|
3a10713337 | ||
|
|
d9d025fa95 | ||
|
|
f8363ff994 | ||
|
|
745ebaced4 | ||
|
|
dc2e1d8ea4 | ||
|
|
1191168a19 | ||
|
|
4421b9f613 | ||
|
|
8fabdd7137 | ||
|
|
91e5b48fe5 | ||
|
|
4dc6dcbee7 | ||
|
|
8c5b63a49a | ||
|
|
ca4a593d69 | ||
|
|
200cbaec68 | ||
|
|
39cf03a4ab | ||
|
|
c8f859d7e4 | ||
|
|
b7f2ed2e50 | ||
|
|
2ba0f54cb4 | ||
|
|
0e425f0355 | ||
|
|
14807a52ed | ||
|
|
ed99982d86 | ||
|
|
d85c048d8b | ||
|
|
0c979e7ff1 | ||
|
|
f1b0f96c07 | ||
|
|
0ac249ad30 | ||
|
|
b1af9103bf | ||
|
|
cd303b5658 | ||
|
|
3bd4a88221 | ||
|
|
1dfa4cda64 | ||
|
|
d0aec519d1 | ||
|
|
edae9c0a5e | ||
|
|
2ee93f2408 | ||
|
|
300d307b87 | ||
|
|
187742a6ca | ||
|
|
fe0fe15890 | ||
|
|
ee2a87988b | ||
|
|
7c30d076fb | ||
|
|
5ab3f9847a | ||
|
|
57b7ac838c | ||
|
|
513ec5597d | ||
|
|
3ec6de9b1e | ||
|
|
b749304e82 | ||
|
|
9b17d14437 | ||
|
|
8428678712 | ||
|
|
2b816c3370 | ||
|
|
e229ab8f98 | ||
|
|
17689cab25 | ||
|
|
6fc48de7ae | ||
|
|
20cb57a7f8 | ||
|
|
9d7bad07d1 | ||
|
|
4eeeffa4d6 | ||
|
|
5df375128c | ||
|
|
4c59b75e17 | ||
|
|
5e113715c8 | ||
|
|
82daf12862 | ||
|
|
8860026ff1 | ||
|
|
17d71f499b | ||
|
|
013b666a75 | ||
|
|
522f7bb036 | ||
|
|
a6a3b44f94 | ||
|
|
31c17a7766 | ||
|
|
28135b26ad | ||
|
|
c808db5db5 | ||
|
|
6b64677a12 | ||
|
|
f4fded038b | ||
|
|
42c88a9ffe | ||
|
|
80fc8fa0c6 | ||
|
|
2af5bff831 | ||
|
|
e97c46a09f | ||
|
|
bd792c72b8 | ||
|
|
23c232d0d3 | ||
|
|
74ead0b4e6 | ||
|
|
7d3e299877 | ||
|
|
bf5cbc9d5d | ||
|
|
4bfc5266b6 | ||
|
|
780a2150fb | ||
|
|
702d216a06 | ||
|
|
099f76a1ce | ||
|
|
627ee5c80b | ||
|
|
e065a15028 | ||
|
|
502943250a | ||
|
|
21e54e98fc | ||
|
|
3010cffe03 | ||
|
|
94ca75092b | ||
|
|
4305144472 | ||
|
|
0d258ccf3e | ||
|
|
380a005143 | ||
|
|
120d83901a | ||
|
|
0da23102a7 | ||
|
|
78bfb4eb2d | ||
|
|
2d68b7e2af | ||
|
|
f04b58b091 | ||
|
|
e038ca4ad4 | ||
|
|
551afa682a | ||
|
|
2149ee404b | ||
|
|
b49d7dbec3 | ||
|
|
dfb54e70f7 | ||
|
|
0dc7af2515 | ||
|
|
808e3ebf1b | ||
|
|
78221562cf | ||
|
|
3992d23f46 | ||
|
|
04c33850c0 | ||
|
|
8ee4ed3e93 | ||
|
|
74a8ba6d1b | ||
|
|
ff78509bc0 | ||
|
|
b2ea831498 | ||
|
|
144d30df98 | ||
|
|
6c62608929 | ||
|
|
bce5d809df | ||
|
|
9510ea96bc | ||
|
|
ae342334e8 | ||
|
|
61e69019b1 | ||
|
|
c883fb185e | ||
|
|
ba33d77e1e | ||
|
|
d3823bd9ca | ||
|
|
bf485f132c | ||
|
|
e8d0c38d59 | ||
|
|
30314bc979 | ||
|
|
e7e59cf739 | ||
|
|
f07499aa6c | ||
|
|
4566a4fa4b | ||
|
|
1886d56013 | ||
|
|
1b259919f7 | ||
|
|
66a40023e6 | ||
|
|
1da1ddf48a | ||
|
|
ddc051eebc | ||
|
|
3b9eba9a48 | ||
|
|
153493bd40 | ||
|
|
0c4104de41 | ||
|
|
6c78877c6a | ||
|
|
dddf7d3953 | ||
|
|
e11c24cc34 | ||
|
|
f14a49e072 | ||
|
|
849a75709c | ||
|
|
237a4c8d61 | ||
|
|
95a4c869ff | ||
|
|
c1137f6a72 | ||
|
|
687437dcb4 | ||
|
|
30a9d6c6eb | ||
|
|
f064cda204 | ||
|
|
d4a7447ae9 | ||
|
|
fef69f6edb | ||
|
|
e5cd774cc8 | ||
|
|
c87b55d74b | ||
|
|
103b70d5e8 | ||
|
|
af7afadf29 | ||
|
|
7c43add304 | ||
|
|
e65861c49f | ||
|
|
21cbfd6d82 | ||
|
|
b189bd633c | ||
|
|
0108996dd4 | ||
|
|
3aa1c3543e | ||
|
|
119b26b3d9 | ||
|
|
d80567c7b7 | ||
|
|
ae5a2e5732 | ||
|
|
5b2813d875 | ||
|
|
1d0a1f17b4 | ||
|
|
9fddde1ec3 | ||
|
|
17bd48f9fd | ||
|
|
e0f5d67ee6 | ||
|
|
169078a545 | ||
|
|
9ca619c75c | ||
|
|
c869bfbec2 | ||
|
|
e43b18b34a | ||
|
|
72ad6c5893 | ||
|
|
8be09db21c | ||
|
|
35b6f72d30 | ||
|
|
35d3fb5e81 | ||
|
|
05dd4e3ab7 | ||
|
|
a3665587e4 | ||
|
|
c3da735fe3 | ||
|
|
eebc7bcdce | ||
|
|
4512648ae7 | ||
|
|
d80d7adce5 | ||
|
|
94ea5b5751 | ||
|
|
5ecdfd81bd | ||
|
|
1344325fcc | ||
|
|
938d586ebf | ||
|
|
daff3f15a1 | ||
|
|
55b80c9135 | ||
|
|
9317aea2e3 | ||
|
|
558e443427 | ||
|
|
acfcd08d38 | ||
|
|
b6d5cbd5e2 | ||
|
|
f91ae551a0 | ||
|
|
871d2c564a | ||
|
|
e6b1bbd127 | ||
|
|
f28a9e7454 | ||
|
|
786c5d941d | ||
|
|
829a26dce0 | ||
|
|
41fe5c1c2c | ||
|
|
40becaa198 | ||
|
|
416a1067da | ||
|
|
30e11d1b50 | ||
|
|
302420b724 | ||
|
|
35499f2177 | ||
|
|
cca8a27f9a | ||
|
|
dda545ad0d | ||
|
|
cf4b4370e0 | ||
|
|
273d32d658 | ||
|
|
51246def30 | ||
|
|
53a5f0693f | ||
|
|
66ca58f075 | ||
|
|
3d9e697c04 | ||
|
|
475be1e5ae | ||
|
|
e53a023276 | ||
|
|
56fbd7ad3f | ||
|
|
91e9ebaea0 | ||
|
|
6f26efa8a5 | ||
|
|
d4104881c0 | ||
|
|
08a6960c9d | ||
|
|
0d649cc9b5 | ||
|
|
ecc3aec6af | ||
|
|
1602e3ded8 | ||
|
|
6ee551123f | ||
|
|
2b601c6d52 | ||
|
|
2d3c42bcb5 | ||
|
|
40f6fe40cd | ||
|
|
445cee80f6 | ||
|
|
cb4235baf7 | ||
|
|
14fd275cd9 | ||
|
|
72edb784fd | ||
|
|
d64fe56c22 | ||
|
|
9fec847b36 | ||
|
|
3759505847 | ||
|
|
2bd18208d4 | ||
|
|
de8777777b | ||
|
|
f54d558db5 | ||
|
|
31ed67dbed | ||
|
|
c3feafc38c | ||
|
|
d5470cd69e | ||
|
|
58be1191c5 | ||
|
|
4c9ebf13bb | ||
|
|
9e64882298 | ||
|
|
4d4611fb04 | ||
|
|
c1c30dc936 | ||
|
|
c869a2a3d5 | ||
|
|
754f52febf | ||
|
|
3d19b8ba7f | ||
|
|
c7f6ab790b | ||
|
|
0721c28dfc | ||
|
|
9bd9ca7fd8 | ||
|
|
bc23153c40 | ||
|
|
25a9032e6d | ||
|
|
e00a2292ae | ||
|
|
2446ba6a23 | ||
|
|
bedc0fdbdc | ||
|
|
787041b6ec | ||
|
|
9dde6ce4a7 | ||
|
|
4bd9ecdec2 | ||
|
|
50036af6a1 | ||
|
|
810067c37a | ||
|
|
d8e361ccc2 | ||
|
|
9d44143c90 | ||
|
|
daccee5ba4 | ||
|
|
dfe2931ab2 | ||
|
|
03d584c12c | ||
|
|
d84266817f | ||
|
|
4f24b30ba8 | ||
|
|
c65ba4d019 | ||
|
|
0b6b730ae5 | ||
|
|
0e526cadfd | ||
|
|
3cfef77824 | ||
|
|
58729f6500 | ||
|
|
5d61834398 | ||
|
|
0f535a2aea | ||
|
|
e79d7b6729 | ||
|
|
bf34ec773a | ||
|
|
6679f1638b | ||
|
|
f8d4ee070c | ||
|
|
8c002f7092 | ||
|
|
8e0947b054 | ||
|
|
3853663616 | ||
|
|
0b3961adc4 | ||
|
|
9faaaf86e2 | ||
|
|
618fc63604 | ||
|
|
c9b6c86139 | ||
|
|
35a6ae35ee | ||
|
|
18d6797e56 | ||
|
|
de6aa4db37 | ||
|
|
4b5788d8a3 | ||
|
|
47d4112999 | ||
|
|
659e9dc135 | ||
|
|
cd687ee1e2 | ||
|
|
6118aba235 | ||
|
|
fd246374da | ||
|
|
fcca991555 | ||
|
|
dce5b214ba | ||
|
|
5f214e2cb1 | ||
|
|
265038b8cb | ||
|
|
34ab97fb30 | ||
|
|
0a4ad94306 | ||
|
|
6ca18ac8f4 | ||
|
|
d836d785b4 | ||
|
|
de62790ff4 | ||
|
|
9cf0b15ec3 | ||
|
|
7c23a004c0 | ||
|
|
bab980b508 | ||
|
|
87c715cb84 | ||
|
|
04a9ca69c9 | ||
|
|
489a1ed7bc | ||
|
|
22ce441bcc | ||
|
|
54e283ed06 | ||
|
|
3fbf00c41c | ||
|
|
af28ca49a5 | ||
|
|
c490034238 | ||
|
|
4ef8aa86dc | ||
|
|
45f3e27de2 | ||
|
|
5155c77997 | ||
|
|
c513cb0255 | ||
|
|
cbeac8fd2a | ||
|
|
0bab2987ed | ||
|
|
e4dd46c0f7 | ||
|
|
6852df7484 | ||
|
|
e9ed6f0228 | ||
|
|
667f81f99d | ||
|
|
da8eefca45 | ||
|
|
e05fa5fbcf | ||
|
|
d39d1d206c | ||
|
|
0e327d9373 | ||
|
|
a3e70e6bf1 | ||
|
|
42e908a36a | ||
|
|
170a30be23 | ||
|
|
7a2f4de850 | ||
|
|
f125c77a0d | ||
|
|
22efb95048 | ||
|
|
a3d1d25bd1 | ||
|
|
e402917a85 | ||
|
|
8a1461d4af | ||
|
|
cd05ef1935 | ||
|
|
e4abe4ead6 | ||
|
|
59ec90f4ba | ||
|
|
c58c35c9ed | ||
|
|
b142411fc5 | ||
|
|
0765eaf13c | ||
|
|
6f7280e8b5 | ||
|
|
1d22f2052e | ||
|
|
12a8e16d0a | ||
|
|
83309a3c83 | ||
|
|
642703bc6a | ||
|
|
da2ae614f3 | ||
|
|
e8b91b8dd9 | ||
|
|
a77015015e | ||
|
|
054cbdf1e8 | ||
|
|
1714e9d27e | ||
|
|
d77a9f7e43 | ||
|
|
2677c1c7bc | ||
|
|
5df6d959d8 | ||
|
|
853e7775f9 | ||
|
|
82ec411046 | ||
|
|
ca0581553c | ||
|
|
eaa8a32b00 | ||
|
|
97c2c06c9a | ||
|
|
4972439ad6 | ||
|
|
a6493487c4 | ||
|
|
e8bce4c167 | ||
|
|
01c8479ad8 | ||
|
|
c5f974a39d | ||
|
|
989f68174a | ||
|
|
9d3f3bf6d7 | ||
|
|
b59093dfbb | ||
|
|
c2f8b7d9e4 | ||
|
|
673026b2ba | ||
|
|
b6d7913727 | ||
|
|
1cc633b5ac | ||
|
|
0c56cbd224 | ||
|
|
02b7884357 | ||
|
|
d79476b0d2 | ||
|
|
505f9a0dd6 | ||
|
|
12764c1070 | ||
|
|
53b065dd38 | ||
|
|
9f69ebb15d | ||
|
|
c19a82f119 | ||
|
|
8916d8489d | ||
|
|
bb826fdf47 | ||
|
|
4fee81001b | ||
|
|
2af6165372 | ||
|
|
ee22dd9770 | ||
|
|
a51e37490b | ||
|
|
0fb9c56de9 | ||
|
|
2fe1c75c4e | ||
|
|
7b086e99d2 | ||
|
|
cc3c693dc8 | ||
|
|
acf3a58515 | ||
|
|
e0ea39d02c | ||
|
|
23a60155c0 | ||
|
|
f3d088fa4d | ||
|
|
1870c4979d | ||
|
|
b6f28d7266 | ||
|
|
a574dabfe9 | ||
|
|
3f6ea08963 | ||
|
|
c1bc68bc43 | ||
|
|
a1a5d735d4 | ||
|
|
52e1427b08 | ||
|
|
c6b40c145c | ||
|
|
64531f94f4 | ||
|
|
9ffd430ae3 | ||
|
|
f6838d7bb9 | ||
|
|
6f36ee8920 | ||
|
|
031d22d195 | ||
|
|
72b4d08d93 | ||
|
|
97350e8bde | ||
|
|
9326a2a75c | ||
|
|
230b53e990 | ||
|
|
90bf326cf1 | ||
|
|
3fb89c3947 | ||
|
|
4212d46663 | ||
|
|
1976d60e35 | ||
|
|
6722304746 | ||
|
|
7bd781f032 | ||
|
|
43a27e9eba | ||
|
|
db9fb4ad85 | ||
|
|
61b4fe2c4e | ||
|
|
5ebb0daa01 | ||
|
|
6b1da9b2fb | ||
|
|
2754c5b787 | ||
|
|
41531e52fb | ||
|
|
bc1e788bd9 | ||
|
|
1145fd63ba | ||
|
|
5bc2d37de3 | ||
|
|
7f034659e3 | ||
|
|
61d865d6c5 | ||
|
|
dd5e04ed9f | ||
|
|
ca7becb3d4 | ||
|
|
f2517b95bd | ||
|
|
d881f0e679 | ||
|
|
bda7e96e30 | ||
|
|
3ac2336e76 | ||
|
|
5b2f8552e8 | ||
|
|
0be7aa3422 | ||
|
|
0896004185 | ||
|
|
af29896e76 | ||
|
|
4e50670358 | ||
|
|
7b9bf73b1a | ||
|
|
bde44a8a6d | ||
|
|
e7971ae3f6 | ||
|
|
dd9b66b368 | ||
|
|
b95f655b66 | ||
|
|
2ff05589c5 | ||
|
|
6c95148a63 | ||
|
|
43da244384 | ||
|
|
6437df189b | ||
|
|
f7089c55a7 | ||
|
|
17343a432e | ||
|
|
42e9b73764 | ||
|
|
5341353003 | ||
|
|
9c9c19c9a6 | ||
|
|
2ef0c6fabe | ||
|
|
461312dc87 | ||
|
|
87983240aa | ||
|
|
78b36ce4d4 | ||
|
|
1cb7532d8b | ||
|
|
ea66010137 | ||
|
|
38bf34520a | ||
|
|
7a03d82fcd | ||
|
|
812402526a | ||
|
|
322b0e1926 | ||
|
|
075ba32e99 | ||
|
|
0786f52259 | ||
|
|
d04f482da1 | ||
|
|
6df9903bc9 | ||
|
|
8ea3efb33a | ||
|
|
4255f95a12 | ||
|
|
b4dfeb2a09 | ||
|
|
a7fef8e6f1 | ||
|
|
735adeeac3 | ||
|
|
09879e9a4a | ||
|
|
d066b8b979 | ||
|
|
220d2bfc10 | ||
|
|
f0416cbb1f | ||
|
|
0fab14a138 | ||
|
|
c5d7f55543 | ||
|
|
a910950e45 | ||
|
|
37275d64fb | ||
|
|
a5866339b4 | ||
|
|
64d166fa7e | ||
|
|
4b37daa27a | ||
|
|
ed1364c21e | ||
|
|
0935f089e4 | ||
|
|
b20f111cbb | ||
|
|
38d6f14b95 | ||
|
|
c50e176e6c | ||
|
|
924cd98b5c | ||
|
|
a341917c7e | ||
|
|
3a86736040 | ||
|
|
5ac7ba79aa | ||
|
|
985f5ad0c9 | ||
|
|
8522a99dd6 | ||
|
|
3dedb5f21f | ||
|
|
eadb885126 | ||
|
|
e4cb8bfd5e | ||
|
|
43bbdc6f6c | ||
|
|
d022641ff2 | ||
|
|
787bec91cc | ||
|
|
7e6ebb205b | ||
|
|
23df24e0dd | ||
|
|
35c8ca8f82 | ||
|
|
75a6048ca4 | ||
|
|
69c8fabc68 | ||
|
|
7e59299731 | ||
|
|
44ca22a924 | ||
|
|
7a1a12d530 | ||
|
|
76b60c892a | ||
|
|
e37366c71a | ||
|
|
d3f859ab8e | ||
|
|
eac8c6b4d2 | ||
|
|
a3dc973d91 | ||
|
|
6b8c141e51 | ||
|
|
6b93915fb5 | ||
|
|
7d61511c32 | ||
|
|
7e6039f16a | ||
|
|
839aea3cfa | ||
|
|
f95a049c90 | ||
|
|
f659a1880f | ||
|
|
ed0890f9d2 | ||
|
|
6139208d0e | ||
|
|
cd3edb76fb | ||
|
|
6e4a804079 | ||
|
|
07781cfa63 | ||
|
|
fefac439c8 | ||
|
|
8ff8c7f34a | ||
|
|
cd38d8cb43 | ||
|
|
0801743ee0 | ||
|
|
20e6023c5e | ||
|
|
331ec61294 | ||
|
|
cf7401791e | ||
|
|
9227881d57 | ||
|
|
2b771fa30c | ||
|
|
51b612aed8 | ||
|
|
e7fa1bf25d | ||
|
|
53e305e9d3 | ||
|
|
564c650a28 | ||
|
|
4b74c69df4 | ||
|
|
61f50a8e61 | ||
|
|
befdbd75a4 | ||
|
|
10b45a9992 | ||
|
|
3bcd2d0b70 | ||
|
|
bfd29f02c4 | ||
|
|
01e7a90efd | ||
|
|
e3628c77b7 | ||
|
|
6dca79233c | ||
|
|
9d08ae6d33 | ||
|
|
19ebb2d6b6 | ||
|
|
46b93a0a5d | ||
|
|
4a7a02238b | ||
|
|
ed67514159 | ||
|
|
674af65789 | ||
|
|
454e428697 | ||
|
|
8ffd149d12 | ||
|
|
6c33c83033 | ||
|
|
8a521a5d43 | ||
|
|
c100fe828c | ||
|
|
6d7168caa4 | ||
|
|
993b1b20b7 | ||
|
|
56d3b6d53a | ||
|
|
4ddde1b2e9 | ||
|
|
c430dd8cae | ||
|
|
e8264aa348 | ||
|
|
4b009814f9 | ||
|
|
e5e75f9436 | ||
|
|
dd7840ffbd | ||
|
|
e93bd6b8aa | ||
|
|
3adf049c92 | ||
|
|
ece4e28731 | ||
|
|
21e1c63d0d | ||
|
|
a311e6ca03 | ||
|
|
bd5176db26 | ||
|
|
f5995941af | ||
|
|
80d0aa0996 | ||
|
|
0084b32f0f | ||
|
|
5f1889c753 | ||
|
|
e37c130cc0 | ||
|
|
29fa052ae9 | ||
|
|
df19eaaf9f | ||
|
|
ee5781df40 | ||
|
|
5ec5b42430 | ||
|
|
69dc7d638a | ||
|
|
71eafdecb0 | ||
|
|
534d00a975 | ||
|
|
c7a5363a75 | ||
|
|
e32a09bcd3 | ||
|
|
0f5bb01aec | ||
|
|
0c1ec3ce50 | ||
|
|
4e0023ec85 | ||
|
|
cb66894d3f | ||
|
|
328ebf9399 | ||
|
|
278ee8c44a | ||
|
|
815d896283 | ||
|
|
c86a66252d | ||
|
|
4518a455a8 | ||
|
|
9e3d8e5f39 | ||
|
|
4de86e2d61 | ||
|
|
b496fe07c2 | ||
|
|
c94fbff299 | ||
|
|
46e75a50ca | ||
|
|
5a91d9cbf0 | ||
|
|
32dbdf452c | ||
|
|
c019b57fde | ||
|
|
7797127879 | ||
|
|
5e4012965d | ||
|
|
3d697cadfc | ||
|
|
6402dedefa | ||
|
|
0b64edf79a | ||
|
|
d6bdbf08f9 | ||
|
|
31f935f1b9 | ||
|
|
4763b05981 | ||
|
|
bd767da106 | ||
|
|
a803e6c284 | ||
|
|
5e6e29cca9 | ||
|
|
5d70b05a67 | ||
|
|
c2a3f3c0ed | ||
|
|
ca398c7df8 | ||
|
|
9d76a84624 | ||
|
|
496940caa3 | ||
|
|
f527918672 | ||
|
|
92070b9c75 | ||
|
|
b650706f2f | ||
|
|
de271d25ef | ||
|
|
a9e52dc1e6 | ||
|
|
cb62a1f662 | ||
|
|
0c335a1a47 | ||
|
|
7ae38d5cf9 | ||
|
|
774a44d561 | ||
|
|
4d376505fd | ||
|
|
e1810b7188 | ||
|
|
348cf17068 | ||
|
|
defff755a3 | ||
|
|
33e4ff1c55 | ||
|
|
bd9cce0536 | ||
|
|
6846d45765 | ||
|
|
283cba2255 | ||
|
|
ff7954f500 | ||
|
|
d4f32d23a6 | ||
|
|
fd96ad4eeb | ||
|
|
54611a0a96 | ||
|
|
daf7152619 | ||
|
|
903559ca2a | ||
|
|
4190880b15 | ||
|
|
13eb99f410 | ||
|
|
c3798e7a29 | ||
|
|
fcb838fa9a | ||
|
|
29e3061fc7 | ||
|
|
cd9afa8c7e | ||
|
|
6f1ab4c1e0 | ||
|
|
76fd55d1d5 | ||
|
|
8325ce66f2 | ||
|
|
32e37f5bd4 | ||
|
|
a59a667a46 | ||
|
|
3ef9e724c4 | ||
|
|
bfb9649462 | ||
|
|
e7e8f3aad8 | ||
|
|
7dcdfbb06a | ||
|
|
df9cf9d44d | ||
|
|
a91952b796 | ||
|
|
5d00d87e18 | ||
|
|
6e0d3a2709 | ||
|
|
5d160f71ef | ||
|
|
d693b6d314 | ||
|
|
9e7be7ce01 | ||
|
|
67b7f09a6a | ||
|
|
c485317d8f | ||
|
|
c73add3bba | ||
|
|
4499df0b43 | ||
|
|
6cdb186f6d | ||
|
|
83305772e4 | ||
|
|
03f153c45b | ||
|
|
054be4f843 | ||
|
|
c51e7d2ac6 | ||
|
|
0ae51244ec | ||
|
|
c38f192aa9 | ||
|
|
f96355a239 | ||
|
|
5b1b870358 | ||
|
|
7fc47d72ee | ||
|
|
5496f1df45 | ||
|
|
ad529697e9 | ||
|
|
30d86ce06b | ||
|
|
7d0a5b1c89 | ||
|
|
56f9db57ef | ||
|
|
4f5adaab9b | ||
|
|
20622df1da | ||
|
|
49229e74d3 | ||
|
|
4679941755 | ||
|
|
498e8c24f5 | ||
|
|
2e04fe3164 | ||
|
|
002aabaeba | ||
|
|
fd0939df7f | ||
|
|
9f968554cb | ||
|
|
040481cdde | ||
|
|
76ab00b1c6 | ||
|
|
43b1b8e955 | ||
|
|
5435ffbed5 | ||
|
|
665f818f22 | ||
|
|
2ae7bb8d5a | ||
|
|
fe15155400 | ||
|
|
780f501941 | ||
|
|
d8c9347fea | ||
|
|
61a083658a | ||
|
|
668703d3f4 | ||
|
|
65eb41e01a | ||
|
|
163cdf68ff | ||
|
|
dc7634e385 | ||
|
|
ab01c7248d | ||
|
|
1f1381bd8b | ||
|
|
bca1e62368 | ||
|
|
a7305f66dc | ||
|
|
3bdf9850b9 | ||
|
|
b8525b762e | ||
|
|
05d9872bd7 | ||
|
|
5b995c9694 | ||
|
|
70ab147a3d | ||
|
|
822477f49a | ||
|
|
ede1b50b2c | ||
|
|
732d732027 | ||
|
|
f65abd6ff6 | ||
|
|
0aead0b14d | ||
|
|
1b3a08da0b | ||
|
|
d69d466651 | ||
|
|
a2e79d0962 | ||
|
|
caa096e79c | ||
|
|
fc3619a16d | ||
|
|
4304401960 | ||
|
|
e5a3d04ea2 | ||
|
|
0340e3dd83 | ||
|
|
aaa4f5e805 | ||
|
|
357d1b468f | ||
|
|
f8ce894ab6 | ||
|
|
61b5b091b9 | ||
|
|
7b0d9be8c1 | ||
|
|
9f1187962e | ||
|
|
cd5203b8f6 | ||
|
|
eb312084f1 | ||
|
|
6426cf266d | ||
|
|
774a7bd2b7 | ||
|
|
d7a39e9635 | ||
|
|
10a058967d | ||
|
|
a9763d5aab | ||
|
|
e21196906a | ||
|
|
e27b59283e | ||
|
|
4b0a9e50c3 | ||
|
|
140a7dc72b | ||
|
|
4b6920be1d | ||
|
|
f62e7b3dc9 | ||
|
|
9b8e26892f | ||
|
|
2d51971ff1 | ||
|
|
bf38f7d5c6 | ||
|
|
4dfe224ac1 | ||
|
|
908eea82f7 | ||
|
|
2c68486e08 | ||
|
|
862d885d21 | ||
|
|
a1056a5556 | ||
|
|
e7ccaf65d2 | ||
|
|
0c12dd7bc7 | ||
|
|
8d6834ac1f | ||
|
|
c04d31d778 | ||
|
|
fbcef69695 | ||
|
|
db64339ea6 | ||
|
|
d9cf7c8237 | ||
|
|
7c63dff032 | ||
|
|
6e1c9d42d3 | ||
|
|
b60261c1c1 | ||
|
|
d464813ed7 | ||
|
|
0a4b895e14 | ||
|
|
8a3c76231d | ||
|
|
4dc0d503b3 | ||
|
|
2511e26486 | ||
|
|
14628ba7e6 | ||
|
|
1c9d024b1e | ||
|
|
a1e0c487fe | ||
|
|
25bbf06444 | ||
|
|
09ef04565b | ||
|
|
18e40fa78e | ||
|
|
c464275763 | ||
|
|
fe6cffa6e4 | ||
|
|
e52432ec1a | ||
|
|
3a3d79624a | ||
|
|
ff818441f7 | ||
|
|
6893138df0 | ||
|
|
7c64006080 | ||
|
|
15e1f476ed | ||
|
|
328b101d05 | ||
|
|
ca0efb53dd | ||
|
|
0db815ba45 | ||
|
|
4b5b936a18 | ||
|
|
47c3ccda89 | ||
|
|
935e890db2 | ||
|
|
26be4af8a7 | ||
|
|
51ffa2449b | ||
|
|
8ee28c28e2 | ||
|
|
3c31586879 | ||
|
|
331a46e5ce | ||
|
|
7e96008168 | ||
|
|
91ab7b1861 | ||
|
|
e405207ea8 | ||
|
|
f23133e394 | ||
|
|
ce2eaa49fd | ||
|
|
dbf06fa9e5 | ||
|
|
a0417ad241 | ||
|
|
966e996ae0 | ||
|
|
0e3997eb0b | ||
|
|
2c3b420743 | ||
|
|
19ac59a26f | ||
|
|
4feea55788 | ||
|
|
8e386659e2 | ||
|
|
c8cdd1f2cf | ||
|
|
629855c2b7 | ||
|
|
7a5bb87b9e | ||
|
|
f7a9ab3be1 | ||
|
|
33ce4eba43 | ||
|
|
512a7e977f | ||
|
|
bc61b4520e | ||
|
|
f675b35cf6 | ||
|
|
ecca89df16 | ||
|
|
64e006c603 | ||
|
|
9bf4933ec6 | ||
|
|
55200f6bbe | ||
|
|
5331ceea99 | ||
|
|
f0c6b07c66 | ||
|
|
15508345ca | ||
|
|
a3b4937469 | ||
|
|
3860669bfe | ||
|
|
8c3ca0e3a5 | ||
|
|
ca4ddc283f | ||
|
|
316da899e7 | ||
|
|
b6dd03ce6a | ||
|
|
30af5939ba | ||
|
|
ce145f8215 | ||
|
|
9e97c0c32b | ||
|
|
8c5a8d78cf | ||
|
|
b2b9a8c2f9 | ||
|
|
77e686f97d | ||
|
|
dff9671f74 | ||
|
|
71cac1cb38 | ||
|
|
06dd7b4aa6 | ||
|
|
5808380440 | ||
|
|
a562733d9f | ||
|
|
3d13c78896 | ||
|
|
c230556d9b | ||
|
|
4b1af9f589 | ||
|
|
f2aca21e9a | ||
|
|
146db7a84f | ||
|
|
f687b4f19a | ||
|
|
155a9a06c3 | ||
|
|
27588b2b74 | ||
|
|
f6243d164c | ||
|
|
5f647da1ac | ||
|
|
06f177031b | ||
|
|
fad68b78dc | ||
|
|
02c916c11b | ||
|
|
eea0ed6cdb | ||
|
|
2caa12d4af | ||
|
|
8ddaa2c95d | ||
|
|
1c6c515e03 | ||
|
|
6f91c8892f | ||
|
|
b8de7d7da7 | ||
|
|
64c3285b5d | ||
|
|
3571c8947c | ||
|
|
1324f775d0 | ||
|
|
5617ed1e82 | ||
|
|
ff5c8bc777 | ||
|
|
326fc96371 | ||
|
|
2a3a7ffa81 | ||
|
|
795cd6ee96 | ||
|
|
b1f9e44746 | ||
|
|
b42609e0a0 | ||
|
|
4b4bbdc080 | ||
|
|
1bebf0ddc2 | ||
|
|
f9490379cc | ||
|
|
90734285f2 | ||
|
|
01ca01eecf | ||
|
|
e88166b64d | ||
|
|
62cd9b8ef4 | ||
|
|
5e6b3b4f87 | ||
|
|
1e091de9b3 | ||
|
|
156b9da2d3 | ||
|
|
c04d345970 | ||
|
|
a61eb69a0f | ||
|
|
d26720a9c2 | ||
|
|
d4c01061aa | ||
|
|
ea134948f6 | ||
|
|
e3870ec10a | ||
|
|
555d46e623 | ||
|
|
f778132175 | ||
|
|
4dbc0f3b54 | ||
|
|
80b6bddd65 | ||
|
|
bcd7743073 | ||
|
|
553fdef352 | ||
|
|
74948cd917 | ||
|
|
c6c884b232 | ||
|
|
e8fd0d9953 | ||
|
|
83bfb64d49 | ||
|
|
e0e6731d4f | ||
|
|
741a389ebd | ||
|
|
169378ff01 | ||
|
|
d96b05a2aa | ||
|
|
affc20bf9f | ||
|
|
e3fe8db5f4 | ||
|
|
282fd732f1 | ||
|
|
0d3b0733d2 | ||
|
|
599e4b40d1 | ||
|
|
eb6a8777a0 | ||
|
|
11845fd598 | ||
|
|
4a8a953247 | ||
|
|
c480c4d66a | ||
|
|
30c1b4414b | ||
|
|
886e026d17 | ||
|
|
6c60f90518 | ||
|
|
2b6b25bf80 | ||
|
|
3d70bfac4c | ||
|
|
18e22b4f1e | ||
|
|
356358f011 | ||
|
|
e93bcc02b1 | ||
|
|
fd96d805af | ||
|
|
a69ea709a3 | ||
|
|
163336bc0f | ||
|
|
4aac987725 | ||
|
|
11a93fa7e3 | ||
|
|
e4690f1235 | ||
|
|
328477628d | ||
|
|
a520e17de1 | ||
|
|
35b0bf57a7 | ||
|
|
bf3ba5c6d8 | ||
|
|
a6b5e94b24 | ||
|
|
0b60ff67ce | ||
|
|
80e1a2b9ca | ||
|
|
a235b772b4 | ||
|
|
c9b64db2bf | ||
|
|
61ad4fdab2 | ||
|
|
ef325d3b49 | ||
|
|
6039251df3 | ||
|
|
51f790cd62 | ||
|
|
662f61b437 | ||
|
|
ace4a53641 | ||
|
|
b2b9d8c818 | ||
|
|
d79ff003ca | ||
|
|
9e46a815cf | ||
|
|
4b6e5839ba | ||
|
|
e6a87a6c04 | ||
|
|
db575f5bc0 | ||
|
|
e51aecbba8 | ||
|
|
3d55a709f0 | ||
|
|
9a748cd008 | ||
|
|
8312df445d | ||
|
|
db07de59f9 | ||
|
|
c310b60eca | ||
|
|
e27526c635 | ||
|
|
b0c687d0ad | ||
|
|
504a92cb43 | ||
|
|
65790cbb02 | ||
|
|
281b8d0565 | ||
|
|
64f799102f | ||
|
|
f35c05cc12 | ||
|
|
aeccd787f0 | ||
|
|
2260462017 | ||
|
|
01f1009473 | ||
|
|
7146014b0f | ||
|
|
e3752d3f08 | ||
|
|
1b729145fe | ||
|
|
5a5b3a287a | ||
|
|
84de8d99f1 | ||
|
|
2dc1515d48 | ||
|
|
c5f7ff602d | ||
|
|
7e03391514 | ||
|
|
7dff488a44 | ||
|
|
0d7eea6356 | ||
|
|
d5325f59e5 | ||
|
|
3d63153d66 | ||
|
|
a2139b3ad4 | ||
|
|
fcf3be65be | ||
|
|
2ac0f00d00 | ||
|
|
5fdbc830b9 | ||
|
|
b96b200c47 | ||
|
|
4b4f101369 | ||
|
|
2a4b54f6c6 | ||
|
|
df99febd5f | ||
|
|
6104d52803 | ||
|
|
fc67916525 | ||
|
|
4ea86a221e | ||
|
|
fe97b5c31f | ||
|
|
e63ca32171 | ||
|
|
b5eb216860 | ||
|
|
7e794dc2dc | ||
|
|
7c51add1a1 | ||
|
|
3e809a4e7d | ||
|
|
417024ce88 | ||
|
|
a88818c0d8 | ||
|
|
a020d44b5c | ||
|
|
f4268d781a | ||
|
|
e5a7ae7182 | ||
|
|
edfb3acea7 | ||
|
|
d3d7e44f2e | ||
|
|
5134ceb766 | ||
|
|
0e65949997 | ||
|
|
a58675074a | ||
|
|
859433eee7 | ||
|
|
83f33f24ec | ||
|
|
f3d2f96181 | ||
|
|
3df1b09ac6 | ||
|
|
fbf8a5c257 | ||
|
|
0ab62a2a65 | ||
|
|
7655b2c96f | ||
|
|
1e345f4ca1 | ||
|
|
6c05584404 | ||
|
|
10c0d7bea9 | ||
|
|
891d9f40c1 | ||
|
|
a516884a65 |
13
.gitignore
vendored
13
.gitignore
vendored
@ -10,3 +10,16 @@ src/server/log/
|
||||
src/server/*.exe
|
||||
src/server/gamedata/config/*.json
|
||||
src/server/unit_test.go
|
||||
src/server/teLog/*
|
||||
src/server/teLog/log.2024-11-28
|
||||
src/server/logs/ga_log/*.log
|
||||
src/server/goroutine.prof
|
||||
src/server/heap_after.pb.gz
|
||||
src/server/test/logs/*
|
||||
src/server/test/teLog/*
|
||||
src/server/*.exe*
|
||||
src/server/msg/Gameapi.pb.go
|
||||
src/server/gen-go
|
||||
src/server/GeoLite2-Country
|
||||
src/server/test/GeoLite2-Country
|
||||
src/server/msg/Gameapi_grpc.pb.go
|
||||
|
||||
@ -1,179 +0,0 @@
|
||||
package GoUtil
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/gob"
|
||||
"math/rand"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 实例化一个通过字符串映射函数切片的map
|
||||
var eventByName = make(map[string][]*EventObj)
|
||||
|
||||
type EventObj struct {
|
||||
Callback func([]interface{})
|
||||
Obj interface{}
|
||||
}
|
||||
|
||||
func (o *EventObj) isEqual(tar *EventObj) bool {
|
||||
if reflect.ValueOf(o.Callback).Pointer() == reflect.ValueOf(tar.Callback).Pointer() && o.Obj == tar.Obj {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// 注册事件,提供事件名和回调函数
|
||||
func RegisterEvent(name string, callback func([]interface{}), Obj interface{}) {
|
||||
|
||||
eo := new(EventObj)
|
||||
eo.Callback = callback
|
||||
eo.Obj = Obj
|
||||
// 通过名字查找事件列表
|
||||
list := eventByName[name]
|
||||
|
||||
// 在列表切片中添加函数
|
||||
list = append(list, eo)
|
||||
|
||||
// 将修改的事件列表切片保存回去
|
||||
eventByName[name] = list
|
||||
}
|
||||
|
||||
// 调用事件
|
||||
func CallEvent(name string, param []interface{}) {
|
||||
|
||||
// 通过名字找到事件列表
|
||||
list := eventByName[name]
|
||||
|
||||
// 遍历这个事件的所有回调
|
||||
for _, eo := range list {
|
||||
// 传入参数调用回调
|
||||
eo.Callback(param)
|
||||
}
|
||||
}
|
||||
|
||||
func RemoveEvent(name string, callback func([]interface{}), Obj interface{}) {
|
||||
// 通过名字找到事件列表
|
||||
list := eventByName[name]
|
||||
j := 0
|
||||
eo := new(EventObj)
|
||||
eo.Callback = callback
|
||||
eo.Obj = Obj
|
||||
// 遍历这个事件的所有回调
|
||||
for _, v := range list {
|
||||
if !v.isEqual(eo) {
|
||||
list[j] = v
|
||||
j++
|
||||
}
|
||||
}
|
||||
eventByName[name] = list[:j]
|
||||
// fmt.Println("len eventByName[name]:", len(eventByName[name]))
|
||||
//fmt.Println("len eventByName[name]:", len(eventByName))
|
||||
// fmt.Println("len list:", len(list))
|
||||
}
|
||||
|
||||
func DeleteEleByValue(list []int, ele int) []int {
|
||||
j := 0
|
||||
for _, v := range list {
|
||||
if v != ele {
|
||||
list[j] = v
|
||||
j++
|
||||
}
|
||||
}
|
||||
ret := list[:j]
|
||||
return ret
|
||||
}
|
||||
|
||||
func BoolToInt32(b bool) int32 {
|
||||
if b {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func IfTrue(a bool, b, c interface{}) interface{} {
|
||||
if a {
|
||||
return b
|
||||
}
|
||||
return c
|
||||
}
|
||||
|
||||
func Int64(a interface{}) int64 {
|
||||
if a == nil {
|
||||
return 0
|
||||
}
|
||||
switch v := a.(type) {
|
||||
case int:
|
||||
return int64(v)
|
||||
case int32:
|
||||
return int64(v)
|
||||
case int64:
|
||||
return v
|
||||
case float64:
|
||||
return int64(v)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func Int(a interface{}) int {
|
||||
if a == nil {
|
||||
return 0
|
||||
}
|
||||
switch v := a.(type) {
|
||||
case int:
|
||||
return v
|
||||
case int32:
|
||||
return int(v)
|
||||
case int64:
|
||||
return int(v)
|
||||
case float64:
|
||||
return int(v)
|
||||
case string:
|
||||
r, err := strconv.Atoi(v)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return r
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GobMarshal(data interface{}) ([]byte, error) {
|
||||
var buf bytes.Buffer
|
||||
encode := gob.NewEncoder(&buf)
|
||||
err := encode.Encode(data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return buf.Bytes(), nil
|
||||
}
|
||||
|
||||
func GobUnmarshal(data []byte, obj interface{}) error {
|
||||
decode := gob.NewDecoder(bytes.NewReader(data))
|
||||
err := decode.Decode(obj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetServerIdByUid(uid int) int {
|
||||
return int(uid / 100000)
|
||||
}
|
||||
|
||||
func CreateOrderSn(uid int) string {
|
||||
Now := time.Now()
|
||||
return "order_" + strconv.Itoa(uid) + "_" + Now.Format("20060102150405") + RandString(6)
|
||||
}
|
||||
|
||||
// 生成指定长度的随机字符串
|
||||
func RandString(n int) string {
|
||||
const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
b := make([]byte, n)
|
||||
for i := range b {
|
||||
b[i] = letters[r.Intn(len(letters))]
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
@ -1,8 +0,0 @@
|
||||
package GoUtil
|
||||
|
||||
func RandNum(start int, end int) int {
|
||||
if start > end {
|
||||
return 0
|
||||
}
|
||||
return start + GetRand().Intn(end-start+1)
|
||||
}
|
||||
@ -1,172 +0,0 @@
|
||||
package GoUtil
|
||||
|
||||
import (
|
||||
"sort"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func IntToInt32(d []int) []int32 {
|
||||
r := make([]int32, 0, len(d))
|
||||
for _, d := range d {
|
||||
r = append(r, int32(d))
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func RandPopSlice(slice []int) ([]int, int) {
|
||||
slen := len(slice)
|
||||
if slen == 0 {
|
||||
return slice, -1
|
||||
}
|
||||
Id := GetRand().Intn(slen)
|
||||
return append(slice[0:Id], slice[Id+1:]...), slice[Id]
|
||||
}
|
||||
|
||||
func RandSlice(slice []int) int {
|
||||
slen := len(slice)
|
||||
if slen == 0 {
|
||||
return 0
|
||||
}
|
||||
Id := GetRand().Intn(slen)
|
||||
return slice[Id]
|
||||
}
|
||||
|
||||
func RandSliceNum(slice []int, num int) []int {
|
||||
r := make([]int, 0, num)
|
||||
if num <= 0 || len(slice) < num {
|
||||
return slice
|
||||
}
|
||||
|
||||
for i := 0; i < num; i++ {
|
||||
Id := GetRand().Intn(len(slice))
|
||||
r = append(r, slice[Id])
|
||||
slice = append(slice[0:Id], slice[Id+1:]...)
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func RandSliceNumNonAdjacent(slice []int, num int) []int {
|
||||
if len(slice) < 2*num {
|
||||
return nil
|
||||
}
|
||||
sort.Ints(slice)
|
||||
result := make([]int, 0, num)
|
||||
for len(result) < num {
|
||||
Id := GetRand().Intn(len(slice))
|
||||
result = append(result, slice[Id])
|
||||
slice = SubAdjacentElemSlice(slice, Id)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func SubAdjacentElemSlice(s []int, Id int) []int {
|
||||
r := make([]int, 0, len(s))
|
||||
for k, v := range s {
|
||||
if k < Id-1 || k > Id+1 {
|
||||
r = append(r, v)
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func RandStringSlice(slice []string) string {
|
||||
slen := len(slice)
|
||||
if slen == 0 {
|
||||
return ""
|
||||
}
|
||||
Id := GetRand().Intn(slen)
|
||||
return slice[Id]
|
||||
}
|
||||
|
||||
func SliceStringToInt(s []string) []int {
|
||||
if len(s) == 0 {
|
||||
return []int{}
|
||||
}
|
||||
r := make([]int, 0, len(s))
|
||||
for _, v := range s {
|
||||
v1, _ := strconv.Atoi(v)
|
||||
r = append(r, v1)
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func SliceIntToInt32(s []int) []int32 {
|
||||
r := make([]int32, 0, len(s))
|
||||
for _, v := range s {
|
||||
r = append(r, int32(v))
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func PopElemSlice(s []int, Id int) ([]int, bool) {
|
||||
for k, v := range s {
|
||||
if v == Id {
|
||||
return append(s[0:k], s[k+1:]...), true
|
||||
}
|
||||
}
|
||||
return s, false
|
||||
}
|
||||
|
||||
func ElemInSlice(s []int, Id int) bool {
|
||||
for _, v := range s {
|
||||
if v == Id {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func GetElemNum(s []int, Id int) int {
|
||||
n := 0
|
||||
for _, v := range s {
|
||||
if v == Id {
|
||||
n++
|
||||
}
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func InArray(Id int, s []int) bool {
|
||||
for _, v := range s {
|
||||
if v == Id {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func InStringArray(Id string, s []string) bool {
|
||||
for _, v := range s {
|
||||
if v == Id {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// toInterfaceSlice converts a slice of strings to a slice of empty interfaces
|
||||
func ToInterfaceSlice(slice []string) []interface{} {
|
||||
result := make([]interface{}, len(slice))
|
||||
for i, v := range slice {
|
||||
result[i] = v
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// a - b
|
||||
func SubSlices(a, b []int) []int {
|
||||
result := make([]int, 0, len(a))
|
||||
for _, num := range a {
|
||||
if !InArray(num, b) {
|
||||
result = append(result, num)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func PopSlice(s []int) (int, []int) {
|
||||
if len(s) == 0 {
|
||||
return -1, s
|
||||
}
|
||||
return s[0], s[1:]
|
||||
}
|
||||
@ -3,13 +3,19 @@ package MergeConst
|
||||
type ProtocolType int32
|
||||
|
||||
const (
|
||||
Protocol_Error_Account_Exist int32 = 100
|
||||
Protocol_Error_Account_OR_PWD_ERROR int32 = 101
|
||||
Protocol_Error_Account_OR_PWD_Short int32 = 102
|
||||
Protocol_Error_Account_Fail int32 = 103
|
||||
Protocol_Error_Account_NoExsit int32 = 104
|
||||
Protocol_Res_Buy_Cnt_Limit int32 = 110
|
||||
Protocol_Res_Buy_CD int32 = 111
|
||||
Protocol_Error_Account_Exist int32 = 100
|
||||
Protocol_Error_Account_OR_PWD_ERROR int32 = 101
|
||||
Protocol_Error_Account_OR_PWD_Short int32 = 102
|
||||
Protocol_Error_Account_Fail int32 = 103
|
||||
Protocol_Error_Account_NoExsit int32 = 104
|
||||
Protocol_Error_Account_Code_Error int32 = 105
|
||||
Protocol_Error_Account_Device_Error int32 = 106
|
||||
Protocol_Error_Id_Not_Verify int32 = 107
|
||||
Protocol_Error_Id_Verify_Error int32 = 108
|
||||
Protocol_Error_Account_Ban int32 = 109
|
||||
Protocol_Res_Buy_Cnt_Limit int32 = 110
|
||||
Protocol_Res_Buy_CD int32 = 111
|
||||
|
||||
Protocol_Email_Find_Fail int32 = 120
|
||||
Protocol_Active_No_Exsit int32 = 130
|
||||
Protocol_Active_7Day_Rewarded int32 = 131
|
||||
@ -94,10 +100,12 @@ const G_Champion_settlement_Duration = 3600 * 23
|
||||
const G_Champion_Unlock_Score = 2
|
||||
const G_Champion_Max_Score = 44650
|
||||
const G_Champion_People_Cnt = 50
|
||||
|
||||
const SUCCESS = 1
|
||||
const (
|
||||
ORDER_STATUS_IDLE = 0 // 订单未完成
|
||||
ORDER_STATUS_PAY = 1 // 订单已支付
|
||||
ORDER_STATUS_CANCLE = 2 // 订单取消
|
||||
ORDER_STATUS_CANCEL = 2 // 订单取消
|
||||
ORDER_STATUS_SHIP = 3 // 订单已发货
|
||||
)
|
||||
|
||||
const GLOBAL_SERVER_ID = 0 // 全局服ID
|
||||
|
||||
8
src/server/MergeConst/system.go
Normal file
8
src/server/MergeConst/system.go
Normal file
@ -0,0 +1,8 @@
|
||||
package MergeConst
|
||||
|
||||
const (
|
||||
Go_gc_percent = 200
|
||||
Go_gc_memory_limit = 1024 << 20
|
||||
Go_game_version = "1.0.3" // 游戏版本号,格式为 "主版本号.次版本号.修订号",每次发布新版本时需要更新
|
||||
Go_log_delete_days = 3 // 日志删除天数,超过这个天数的日志文件将被删除
|
||||
)
|
||||
BIN
src/server/Order.png
Normal file
BIN
src/server/Order.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
16
src/server/README.MD
Normal file
16
src/server/README.MD
Normal file
@ -0,0 +1,16 @@
|
||||
## 命名规范
|
||||
|
||||
|
||||
- **清晰优先**:名称应准确表达含义,避免歧义。
|
||||
- **导出规则**:导出标识符首字母大写,未导出首字母小写。
|
||||
- **包名**:小写单词,简短且描述职责(如 `store`、`auth`)。
|
||||
- **文件名**:小写(可下划线分隔),测试文件以 `_test.go` 结尾。
|
||||
- **函数/变量/类型**:驼峰命名;导出使用 PascalCase(例如 `UserService`、`CreateUser`)。
|
||||
- **接口**:以行为命名,常用 `-er` 结尾(如 `Reader`、`Store`),避免 `I` 前缀。
|
||||
- **缩写**:统一大小写(例如导出使用 `ID`、`URL`;未导出使用 `id`、`url`)。
|
||||
- **错误**:包级错误使用 `Err` 前缀(如 `ErrNotFound`)。
|
||||
- **Context 与并发**:统一使用 `ctx` 作 `context.Context`,通道命名要有语义(如 `done`, `jobs`)。
|
||||
- **构造函数/选项**:使用 `NewType` 与 `WithXxx` 约定,避免多个布尔参数。
|
||||
|
||||
|
||||
|
||||
77
src/server/backend/server.go
Normal file
77
src/server/backend/server.go
Normal file
@ -0,0 +1,77 @@
|
||||
package backend
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net"
|
||||
"server/conf"
|
||||
"server/game"
|
||||
"server/msg"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
|
||||
type backendServer struct {
|
||||
msg.UnimplementedBackendServer
|
||||
}
|
||||
|
||||
func (s *backendServer) ReloadActivity(ctx context.Context, req *msg.ReqActivityCfgReload) (*msg.ResActivityCfgReload, error) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
log.Error("ReloadActivity panic: %v", r)
|
||||
}
|
||||
}()
|
||||
log.Debug("Received ReloadActivity request: %v", req)
|
||||
game.AcitivityCfgReload()
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (s *backendServer) OrderShipping(ctx context.Context, req *msg.ReqOrderShipping) (*msg.ResOrderShipping, error) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
log.Error("OrderShipping panic: %v", r)
|
||||
}
|
||||
}()
|
||||
log.Debug("Received OrderShipping request: %v", req)
|
||||
res, err := game.AdminShipping(req)
|
||||
if err != nil {
|
||||
log.Error("OrderShipping error: %v", err)
|
||||
return nil, err
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (s *backendServer) UserDetail(ctx context.Context, req *msg.UserDetailParam) (*msg.ResUserDetail, error) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
log.Error("UserDetail panic: %v", r)
|
||||
}
|
||||
}()
|
||||
log.Debug("Received UserDetail request: %v", req)
|
||||
res, err := game.AdminPlayerDetailInfo(req)
|
||||
if err != nil {
|
||||
log.Error("UserDetail error: %v", err)
|
||||
return nil, err
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func Start() {
|
||||
if conf.Server.RPCAddr == "" {
|
||||
log.Debug("RPC server address not configured, skipping gRPC server startup")
|
||||
return
|
||||
}
|
||||
lis, err := net.Listen("tcp", conf.Server.RPCAddr)
|
||||
if err != nil {
|
||||
log.Error("failed to listen: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
s := grpc.NewServer()
|
||||
msg.RegisterBackendServer(s, &backendServer{})
|
||||
|
||||
log.Debug("gRPC server listening on %s", conf.Server.RPCAddr)
|
||||
if err := s.Serve(lis); err != nil {
|
||||
log.Error("server exited with error: %v", err)
|
||||
}
|
||||
}
|
||||
113
src/server/benchmark_test.go
Normal file
113
src/server/benchmark_test.go
Normal file
@ -0,0 +1,113 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
"server/game"
|
||||
"server/game/mod/msg"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// func TestBenchInit(t *testing.T) {
|
||||
// f := "wmz00%d"
|
||||
// for i := 0; i < 10000; i++ {
|
||||
// UserName := fmt.Sprintf(f, i)
|
||||
// game.G_GameLogicPtr.Db_AccountInfo.UserName = UserName
|
||||
// game.G_GameLogicPtr.Db_AccountInfo.UserPassword = "123456"
|
||||
// if game.G_GameLogicPtr.NewAccountInsertDataToDB() {
|
||||
// fmt.Printf("UserName:%s\n init success", UserName)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
/*
|
||||
*
|
||||
cluster 消息处理基准测试
|
||||
|
||||
36716 34961 ns/op 1690 B/op 38 allocs/op
|
||||
*/
|
||||
func BenchmarkClusterMsg(b *testing.B) {
|
||||
game.ClusterMgrInit()
|
||||
runtime.GOMAXPROCS(8)
|
||||
game.G_getGameLogic()
|
||||
for i := 0; i < b.N; i++ {
|
||||
m := &msg.Msg{
|
||||
HandleType: msg.HANDLE_MOD_PLAYER_LOGIN,
|
||||
Extra: 0,
|
||||
}
|
||||
game.MessageHandle(m)
|
||||
}
|
||||
}
|
||||
|
||||
func printMemUsage() {
|
||||
var m runtime.MemStats
|
||||
runtime.ReadMemStats(&m)
|
||||
// 输出内存使用情况
|
||||
fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc))
|
||||
fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc))
|
||||
fmt.Printf("\tSys = %v MiB", bToMb(m.Sys))
|
||||
fmt.Printf("\tNumGC = %v\n", m.NumGC)
|
||||
var playerCount int
|
||||
game.G_GameLogicPtr.M_Players.Range(func(key, value interface{}) bool {
|
||||
playerCount++
|
||||
return true
|
||||
})
|
||||
fmt.Printf("\tPlayerNum = %v\n", playerCount)
|
||||
}
|
||||
|
||||
func bToMb(b uint64) uint64 {
|
||||
return b / 1024 / 1024
|
||||
}
|
||||
|
||||
func BenchmarkChampionshipGroup(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
game.G_GameLogicPtr.CreateChampshipMgr()
|
||||
game.G_GameLogicPtr.ChampshipMgr.Debug()
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkPlayerInit(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
p := new(game.Player)
|
||||
p.InitPlayer("3625212")
|
||||
p.LoginBackData()
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkPlayerBackup(b *testing.B) {
|
||||
p := new(game.Player)
|
||||
p.InitPlayer("3625212")
|
||||
for i := 0; i < b.N; i++ {
|
||||
p.BackUp()
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkPlayerRecover(b *testing.B) {
|
||||
p := new(game.Player)
|
||||
p.InitPlayer("3625212")
|
||||
backup := p.BackUp()
|
||||
for i := 0; i < b.N; i++ {
|
||||
p.Recover(backup)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkPlayerHandleMsg(b *testing.B) {
|
||||
p := new(game.Player)
|
||||
p.InitPlayer("3625212")
|
||||
list := make([]*msg.Msg, 0, 1000)
|
||||
for i := 0; i < 1000; i++ {
|
||||
m := &msg.Msg{
|
||||
HandleType: msg.HANDLE_MOD_PLAYER_LOGIN,
|
||||
Type: msg.HANDLE_TYPE_APPLY,
|
||||
From: 100001,
|
||||
To: i + 100002,
|
||||
Extra: 0,
|
||||
}
|
||||
list = append(list, m)
|
||||
}
|
||||
for i := 0; i < b.N; i++ {
|
||||
for _, m := range list {
|
||||
p.HandleMsg(m)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3,9 +3,9 @@ package mergeCluster
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"server/GoUtil"
|
||||
"server/conf"
|
||||
"server/game/mod/msg"
|
||||
GoUtil "server/game_util"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"server/pkg/github.com/name5566/leaf/network"
|
||||
"sync"
|
||||
@ -16,7 +16,9 @@ const (
|
||||
)
|
||||
|
||||
var FuncMap = map[int]func(*Agent, *msg.Msg) error{} // 消息处理函数
|
||||
|
||||
var funcMapMu sync.RWMutex // FuncMap 的读写锁
|
||||
var CallbackChan = make(map[string]chan *msg.Msg) // 回调消息队列
|
||||
var callbackChanMu sync.RWMutex // CallbackChan 的读写锁
|
||||
var (
|
||||
server *network.TCPServer // 服务器
|
||||
Center *network.TCPClient // 集群中心
|
||||
@ -30,14 +32,14 @@ func Init() {
|
||||
server = new(network.TCPServer)
|
||||
server.Addr = conf.Server.ListenAddr
|
||||
server.MaxConnNum = int(math.MaxInt32)
|
||||
server.PendingWriteNum = conf.PendingWriteNum
|
||||
server.PendingWriteNum = 1 << 14
|
||||
server.LenMsgLen = 4
|
||||
server.MaxMsgLen = 4096
|
||||
server.MaxMsgLen = 1 << 16
|
||||
server.NewAgent = newServerAgent
|
||||
server.Start()
|
||||
}
|
||||
|
||||
if conf.Server.CenterAddr != "" {
|
||||
if conf.Server.CenterAddr != "" && conf.Server.ServerType != "center" {
|
||||
connectRemote(conf.Server.CenterAddr, ClusterCenterId, "center")
|
||||
}
|
||||
|
||||
@ -47,6 +49,11 @@ func Init() {
|
||||
registerFunc(msg.CLUSTER_EXIT, ClusterExit)
|
||||
}
|
||||
|
||||
// GetCallbackChanMu 返回 CallbackChan 的读写锁,供外部包安全访问 CallbackChan
|
||||
func GetCallbackChanMu() *sync.RWMutex {
|
||||
return &callbackChanMu
|
||||
}
|
||||
|
||||
func Destroy() {
|
||||
if server != nil {
|
||||
log.Release("closing cluster server")
|
||||
@ -88,7 +95,7 @@ func (a *Agent) Run() {
|
||||
m := msg.Msg{}
|
||||
err = GoUtil.GobUnmarshal(data, &m)
|
||||
if err != nil {
|
||||
log.Debug("decode err: %v", err)
|
||||
log.Debug("decode err: %v, data: %s", err, string(data))
|
||||
return
|
||||
}
|
||||
err = processMsg(a, &m)
|
||||
|
||||
@ -2,9 +2,9 @@ package mergeCluster
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"server/GoUtil"
|
||||
"server/conf"
|
||||
"server/game/mod/msg"
|
||||
GoUtil "server/game_util"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"server/pkg/github.com/name5566/leaf/network"
|
||||
"time"
|
||||
@ -48,19 +48,14 @@ func HandShakeRecv(a *Agent, m *msg.Msg) error {
|
||||
RemoteAddr: m.Extra.(string),
|
||||
},
|
||||
})
|
||||
} else {
|
||||
syncMsg := &msg.Msg{
|
||||
Type: msg.CLUSTER_FRIEND_SYNC,
|
||||
To: ServerId,
|
||||
HandleType: msg.HANDLE_MOD_CLUSTER_SYNC,
|
||||
}
|
||||
sendGameMsg(syncMsg)
|
||||
}
|
||||
syncMsg := &msg.Msg{
|
||||
Type: msg.CLUSTER_FRIEND_SYNC,
|
||||
To: ServerId,
|
||||
}
|
||||
sendGameMsg(syncMsg)
|
||||
fmt.Print("现有区服连接:")
|
||||
serverAgent.Range(func(key, value interface{}) bool {
|
||||
fmt.Print(key)
|
||||
fmt.Print(",")
|
||||
return true
|
||||
})
|
||||
fmt.Println()
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -79,7 +74,7 @@ func ClusterJoin(a *Agent, m *msg.Msg) error {
|
||||
return nil
|
||||
}
|
||||
log.Debug("ClusterJoin ServerId %v", clusterJoin.ServerId)
|
||||
connectRemote(clusterJoin.RemoteAddr, clusterJoin.ServerId, "server")
|
||||
//connectRemote(clusterJoin.RemoteAddr, clusterJoin.ServerId, "server")
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -96,23 +91,30 @@ func connectRemote(RemoteAddr string, ConnType int, ConnLabel string) error {
|
||||
client := new(network.TCPClient)
|
||||
client.Addr = RemoteAddr
|
||||
client.ConnNum = 1
|
||||
client.PendingWriteNum = conf.PendingWriteNum
|
||||
client.PendingWriteNum = 1 << 14
|
||||
client.LenMsgLen = 4
|
||||
client.MaxMsgLen = 4096
|
||||
client.MaxMsgLen = 1 << 16
|
||||
client.NewAgent = newAgent
|
||||
client.ConnType = ConnType
|
||||
client.ConnLabel = ConnLabel
|
||||
client.ConnectInterval = time.Duration(time.Minute * 5)
|
||||
client.ConnectInterval = time.Duration(time.Minute * 1)
|
||||
if ConnType == ClusterCenterId { // 中心服断开重连
|
||||
client.AutoReconnect = true
|
||||
}
|
||||
client.Start()
|
||||
Center = client
|
||||
clients = append(clients, client)
|
||||
log.Debug("connet remote to addr:%s", RemoteAddr)
|
||||
return nil
|
||||
}
|
||||
|
||||
func SendServerMsg(m *msg.Msg, serverId int) error {
|
||||
if m.UniKey == "" {
|
||||
m.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Cluster Msg", m))
|
||||
}
|
||||
if m.SendT == 0 {
|
||||
m.SendT = GoUtil.Now()
|
||||
}
|
||||
if v, ok := serverAgent.Load(serverId); ok {
|
||||
data, err := GoUtil.GobMarshal(m)
|
||||
if err != nil {
|
||||
@ -120,10 +122,47 @@ func SendServerMsg(m *msg.Msg, serverId int) error {
|
||||
return err
|
||||
}
|
||||
v.(network.Agent).WriteMsg(data)
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("server %d not online", serverId)
|
||||
}
|
||||
|
||||
func CallServerMsg(m *msg.Msg, serverId int) (*msg.Msg, error) {
|
||||
if m.UniKey == "" {
|
||||
m.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Cluster Msg", m))
|
||||
}
|
||||
if m.SendT == 0 {
|
||||
m.SendT = GoUtil.Now()
|
||||
}
|
||||
v, ok := serverAgent.Load(serverId)
|
||||
// 之后再发送消息
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("server %d not online", serverId)
|
||||
}
|
||||
// 先注册回调通道,避免发送出去后对方快速返回导致丢失
|
||||
newChan := make(chan *msg.Msg, 1)
|
||||
registerChanel(m.UniKey, newChan)
|
||||
defer unregisterChanel(m.UniKey)
|
||||
data, err := GoUtil.GobMarshal(m)
|
||||
if err != nil {
|
||||
log.Debug("CallServerMsg GobMarshal err %v", err)
|
||||
return nil, err
|
||||
}
|
||||
v.(network.Agent).WriteMsg(data)
|
||||
// 等待返回(直接接收一次)
|
||||
timeout := time.After(5 * time.Second)
|
||||
select {
|
||||
case backm := <-newChan:
|
||||
if backm == nil {
|
||||
return nil, fmt.Errorf("server %d not response", serverId)
|
||||
}
|
||||
// log.Debug("CallServerMsg reply %v", backm)
|
||||
return backm, nil
|
||||
case <-timeout:
|
||||
return nil, fmt.Errorf("timeout waiting for server %d response", serverId)
|
||||
}
|
||||
}
|
||||
|
||||
func SendMsgAll(m *msg.Msg) {
|
||||
data, err := GoUtil.GobMarshal(m)
|
||||
if err != nil {
|
||||
@ -138,7 +177,12 @@ func SendMsgAll(m *msg.Msg) {
|
||||
|
||||
func processMsg(a *Agent, m *msg.Msg) error {
|
||||
var err error
|
||||
if fun, ok := FuncMap[m.Type]; ok {
|
||||
|
||||
funcMapMu.RLock()
|
||||
fun, ok := FuncMap[m.Type]
|
||||
funcMapMu.RUnlock()
|
||||
|
||||
if ok {
|
||||
err = fun(a, m)
|
||||
} else {
|
||||
MsgChan <- m //交由game Module消息处理
|
||||
@ -147,7 +191,21 @@ func processMsg(a *Agent, m *msg.Msg) error {
|
||||
}
|
||||
|
||||
func registerFunc(key int, fun func(*Agent, *msg.Msg) error) {
|
||||
funcMapMu.Lock()
|
||||
FuncMap[key] = fun
|
||||
funcMapMu.Unlock()
|
||||
}
|
||||
|
||||
func registerChanel(key string, chanel chan *msg.Msg) {
|
||||
callbackChanMu.Lock()
|
||||
CallbackChan[key] = chanel
|
||||
callbackChanMu.Unlock()
|
||||
}
|
||||
|
||||
func unregisterChanel(key string) {
|
||||
callbackChanMu.Lock()
|
||||
delete(CallbackChan, key)
|
||||
callbackChanMu.Unlock()
|
||||
}
|
||||
|
||||
func sendGameMsg(m *msg.Msg) {
|
||||
@ -1,17 +1,8 @@
|
||||
package mergeCluster
|
||||
|
||||
import (
|
||||
"encoding/gob"
|
||||
"server/game/mod/msg"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gob.Register(&msg.Msg{})
|
||||
gob.Register(&ClusterJoinData{})
|
||||
}
|
||||
|
||||
type ClusterJoinData struct {
|
||||
ServerId int
|
||||
Country int
|
||||
RemoteAddr string
|
||||
}
|
||||
|
||||
@ -1,41 +0,0 @@
|
||||
package startOrderCfg
|
||||
|
||||
import (
|
||||
"server/gamedata"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type StartOrderCfg struct {
|
||||
}
|
||||
|
||||
var CFG_NAME = "StartOrder"
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_NAME)
|
||||
}
|
||||
|
||||
// 根据step 获取初始订单
|
||||
func GetStartOrderByStep(id int) []*gamedata.StartOrderData {
|
||||
ret := make([]*gamedata.StartOrderData, 0)
|
||||
data, err := gamedata.GetData(CFG_NAME)
|
||||
if err != nil {
|
||||
return ret
|
||||
}
|
||||
for k, v := range data {
|
||||
record := v.(map[string]interface{})
|
||||
stepVal := gamedata.ParseInt(record["step"])
|
||||
var MergeList []int
|
||||
for _, vv := range record["merge_id_list"].([]interface{}) {
|
||||
MergeList = append(MergeList, gamedata.ParseInt(vv))
|
||||
}
|
||||
if int(stepVal) == id {
|
||||
OrderId, _ := strconv.Atoi(k)
|
||||
ret = append(ret, &gamedata.StartOrderData{
|
||||
Id: OrderId,
|
||||
Step: int(stepVal),
|
||||
MergeList: MergeList,
|
||||
})
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
@ -1,46 +0,0 @@
|
||||
package activityCfg
|
||||
|
||||
import (
|
||||
"server/GoUtil"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_ACTIVITY = "Activity"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_ACTIVITY)
|
||||
}
|
||||
|
||||
func GetActivityList() []*gamedata.ActivityData {
|
||||
data, err := gamedata.GetData(CFG_ACTIVITY)
|
||||
if err != nil {
|
||||
log.Debug("GetActivityList err:%v", err)
|
||||
}
|
||||
Now := GoUtil.Now()
|
||||
var List []*gamedata.ActivityData
|
||||
|
||||
for k, v := range data {
|
||||
StartTimeStr := gamedata.GetStringValue(v, "StartTime")
|
||||
EndTimeStr := gamedata.GetStringValue(v, "EndTime")
|
||||
StartTime := GoUtil.ParseTime(StartTimeStr)
|
||||
EndTime := GoUtil.ParseTime(EndTimeStr)
|
||||
if Now >= StartTime && Now <= EndTime {
|
||||
Id, _ := strconv.Atoi(k)
|
||||
Type := gamedata.GetIntValue(v, "Type")
|
||||
Name := gamedata.GetStringValue(v, "Name")
|
||||
Title := gamedata.GetStringValue(v, "Title")
|
||||
ActivityData := &gamedata.ActivityData{
|
||||
Id: Id,
|
||||
Type: Type,
|
||||
Name: Name,
|
||||
Title: Title,
|
||||
}
|
||||
List = append(List, ActivityData)
|
||||
}
|
||||
}
|
||||
return List
|
||||
}
|
||||
144
src/server/conf/activity/activity_cfg.go
Normal file
144
src/server/conf/activity/activity_cfg.go
Normal file
@ -0,0 +1,144 @@
|
||||
package activityCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_ACTIVITY = "Activity"
|
||||
CFG_ACTIVITY_GIFT = "ActivityGift"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_ACTIVITY)
|
||||
gamedata.InitCfg(CFG_ACTIVITY_GIFT)
|
||||
}
|
||||
|
||||
func GetActivityGiftId(chargeId int) int {
|
||||
data, err := gamedata.GetData(CFG_ACTIVITY_GIFT)
|
||||
if err != nil {
|
||||
log.Debug("GetActivityGiftId err:%v", err)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
ChargeId := gamedata.GetIntValue(v, "ChargeId")
|
||||
if ChargeId == chargeId {
|
||||
return gamedata.GetIntValue(v, "AId")
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetActivityGiftItems(chargeId int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_ACTIVITY_GIFT)
|
||||
if err != nil {
|
||||
log.Debug("GetActivityGiftItems err:%v", err)
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
ChargeId := gamedata.GetIntValue(v, "ChargeId")
|
||||
if ChargeId == chargeId {
|
||||
Items := gamedata.GetItemList(v, "Items")
|
||||
return Items
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetActivityList() []*gamedata.ActivityData {
|
||||
data, err := gamedata.GetData(CFG_ACTIVITY)
|
||||
if err != nil {
|
||||
log.Debug("GetActivityList err:%v", err)
|
||||
return nil
|
||||
}
|
||||
List := make([]*gamedata.ActivityData, 0, len(data))
|
||||
|
||||
for k, v := range data {
|
||||
StartTimeStr := gamedata.GetStringValue(v, "StartTime")
|
||||
EndTimeStr := gamedata.GetStringValue(v, "EndTime")
|
||||
StartTime := GoUtil.ParseTime(StartTimeStr)
|
||||
EndTime := GoUtil.ParseTime(EndTimeStr)
|
||||
Type := gamedata.GetIntValue(v, "Type")
|
||||
Name := gamedata.GetStringValue(v, "Name")
|
||||
Title := gamedata.GetStringValue(v, "Title")
|
||||
Level := gamedata.GetIntValue(v, "Level")
|
||||
ActivityData := &gamedata.ActivityData{
|
||||
Id: GoUtil.Int(k),
|
||||
Type: Type,
|
||||
AType: gamedata.GetIntValue(v, "AType"),
|
||||
Name: Name,
|
||||
Title: Title,
|
||||
Level: Level,
|
||||
StartTime: StartTime,
|
||||
EndTime: EndTime,
|
||||
}
|
||||
List = append(List, ActivityData)
|
||||
}
|
||||
return List
|
||||
}
|
||||
func GetActivityListOrigin() []*gamedata.ActivityData {
|
||||
data, err := gamedata.GetData(CFG_ACTIVITY)
|
||||
if err != nil {
|
||||
log.Debug("GetActivityList err:%v", err)
|
||||
return nil
|
||||
}
|
||||
List := make([]*gamedata.ActivityData, 0, len(data))
|
||||
|
||||
for k, v := range data {
|
||||
StartTimeStr := gamedata.GetStringValue(v, "StartTime")
|
||||
EndTimeStr := gamedata.GetStringValue(v, "EndTime")
|
||||
StartTime := GoUtil.ParseTime(StartTimeStr)
|
||||
EndTime := GoUtil.ParseTime(EndTimeStr)
|
||||
Id, err := strconv.Atoi(k)
|
||||
if err != nil {
|
||||
log.Debug("GetActivityList parse id err:%v, key:%s", err, k)
|
||||
continue
|
||||
}
|
||||
Type := gamedata.GetIntValue(v, "Type")
|
||||
Name := gamedata.GetStringValue(v, "Name")
|
||||
Title := gamedata.GetStringValue(v, "Title")
|
||||
Level := gamedata.GetIntValue(v, "Level")
|
||||
ActivityData := &gamedata.ActivityData{
|
||||
Id: Id,
|
||||
Type: Type,
|
||||
AType: gamedata.GetIntValue(v, "AType"),
|
||||
Name: Name,
|
||||
Title: Title,
|
||||
Level: Level,
|
||||
StartTime: StartTime,
|
||||
EndTime: EndTime,
|
||||
}
|
||||
List = append(List, ActivityData)
|
||||
}
|
||||
return List
|
||||
}
|
||||
|
||||
func GetActivityRewardItems(ActId int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_ACTIVITY_GIFT)
|
||||
if err != nil {
|
||||
log.Debug("GetActivityRewardItems err:%v", err)
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
ChargeId := gamedata.GetIntValue(v, "ChargeId")
|
||||
AId := gamedata.GetIntValue(v, "AId")
|
||||
if ChargeId == 0 && AId == ActId {
|
||||
Items := gamedata.GetItemList(v, "Items")
|
||||
return Items
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetActivityRecycleMail(ActId int) (string, string, string) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_ACTIVITY, ActId)
|
||||
if err != nil {
|
||||
log.Debug("GetActivityRecycleMail err:%v", err)
|
||||
return "", "", ""
|
||||
}
|
||||
return gamedata.GetStringValue(data, "Title"), gamedata.GetStringValue(data, "Mail_Title"), gamedata.GetStringValue(data, "Mail_Content")
|
||||
}
|
||||
@ -1,6 +1,7 @@
|
||||
package avatarCfg
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
@ -20,7 +21,7 @@ func GetInitList() []int {
|
||||
log.Debug("GetInitList err: %v", err)
|
||||
return nil
|
||||
}
|
||||
r := make([]int, 0)
|
||||
r := make([]int, 0, len(data))
|
||||
for k, v := range data {
|
||||
IsInit := gamedata.GetIntValue(v, "Init")
|
||||
if IsInit == 1 {
|
||||
@ -31,6 +32,15 @@ func GetInitList() []int {
|
||||
return r
|
||||
}
|
||||
|
||||
func GetRandInitId() int {
|
||||
list := GetInitList()
|
||||
if len(list) == 0 {
|
||||
return 0
|
||||
}
|
||||
index := rand.Intn(len(list))
|
||||
return list[index]
|
||||
}
|
||||
|
||||
func CheckExist(Id int) bool {
|
||||
data, err := gamedata.GetData(CFG_AVATAR)
|
||||
if err != nil {
|
||||
@ -40,3 +50,17 @@ func CheckExist(Id int) bool {
|
||||
_, ok := data[strconv.Itoa(Id)]
|
||||
return ok
|
||||
}
|
||||
|
||||
func GetAllId() []int {
|
||||
data, err := gamedata.GetData(CFG_AVATAR)
|
||||
if err != nil {
|
||||
log.Debug("GetAllId err: %v", err)
|
||||
return nil
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for k := range data {
|
||||
Id, _ := strconv.Atoi(k)
|
||||
r = append(r, Id)
|
||||
}
|
||||
return r
|
||||
}
|
||||
@ -1,39 +0,0 @@
|
||||
package baseCfg
|
||||
|
||||
import (
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_BASE = "Base"
|
||||
)
|
||||
|
||||
const (
|
||||
ENERGY_SHOP_MUL = "energy_shop_mul"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_BASE)
|
||||
}
|
||||
|
||||
func GetEnergyByMul(T int) float64 {
|
||||
data, err := gamedata.GetDataByKey(CFG_BASE, ENERGY_SHOP_MUL)
|
||||
if err != nil {
|
||||
log.Debug("GetEnergyByMul err:%v", err)
|
||||
return 0
|
||||
}
|
||||
d := data["Value"].(map[string]interface{})
|
||||
if len(d) == 0 {
|
||||
return 0
|
||||
}
|
||||
T = min(T, len(d))
|
||||
T1 := strconv.Itoa(T)
|
||||
if v, ok := d[T1]; ok {
|
||||
return v.(float64)
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
|
||||
}
|
||||
97
src/server/conf/base/base_cfg.go
Normal file
97
src/server/conf/base/base_cfg.go
Normal file
@ -0,0 +1,97 @@
|
||||
package baseCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_BASE = "Base"
|
||||
)
|
||||
|
||||
const (
|
||||
ENERGY_SHOP_MUL = "energy_shop_mul"
|
||||
ENERGY_CFG = "BaseEnergy"
|
||||
MAX_ENERGY_LEVEL = 999 // 最大能量等级上限
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_BASE)
|
||||
gamedata.InitCfg(ENERGY_CFG)
|
||||
}
|
||||
|
||||
func GetEnergyByMul(T int) float64 {
|
||||
data, err := gamedata.GetDataByKey(CFG_BASE, ENERGY_SHOP_MUL)
|
||||
if err != nil {
|
||||
log.Debug("GetEnergyByMul err:%v", err)
|
||||
return 0
|
||||
}
|
||||
|
||||
valueData, ok := data["Value"]
|
||||
if !ok {
|
||||
log.Debug("GetEnergyByMul: Value field not found")
|
||||
return 0
|
||||
}
|
||||
|
||||
d, ok := valueData.(map[string]interface{})
|
||||
if !ok || len(d) == 0 {
|
||||
log.Debug("GetEnergyByMul: Value is not a valid map")
|
||||
return 0
|
||||
}
|
||||
|
||||
T = min(T, len(d))
|
||||
T1 := strconv.Itoa(T)
|
||||
if v, ok := d[T1]; ok {
|
||||
if floatVal, ok := v.(float64); ok {
|
||||
return floatVal
|
||||
}
|
||||
log.Debug("GetEnergyByMul: value is not float64, key=%s", T1)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetFriendReplyReward() []*item.Item {
|
||||
data, err := gamedata.GetDataByKey(CFG_BASE, "friend_reply")
|
||||
if err != nil {
|
||||
log.Debug("GetFriendReplyReward err:%v", err)
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Value")
|
||||
}
|
||||
|
||||
func GetEnergyByADNum() []*item.Item {
|
||||
data, err := gamedata.GetDataByKey(CFG_BASE, "ad_energy_gift")
|
||||
if err != nil {
|
||||
log.Debug("GetEnergyByADNum err:%v", err)
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Value")
|
||||
}
|
||||
|
||||
func GetMaxEnergyMul(Lv int, Energy int) int {
|
||||
Mul := 0
|
||||
for i := 1; i <= MAX_ENERGY_LEVEL; i++ {
|
||||
data, err := gamedata.GetDataByIntKey(ENERGY_CFG, i)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
UnlockLv := gamedata.GetIntValue(data, "UnlockLv")
|
||||
needEnergy := gamedata.GetIntValue(data, "NeedEnergy")
|
||||
if Lv < UnlockLv || Energy < needEnergy {
|
||||
break
|
||||
}
|
||||
Mul = i - 1
|
||||
}
|
||||
return Mul
|
||||
}
|
||||
|
||||
func GetLimitEnergyMul(Lv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(ENERGY_CFG, Lv+1)
|
||||
if err != nil {
|
||||
log.Debug("GetLimitEnergyMul err:%v, Lv=%d", err, Lv)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Limit")
|
||||
}
|
||||
@ -1,8 +1,8 @@
|
||||
package cardCfg
|
||||
|
||||
import (
|
||||
"server/GoUtil"
|
||||
"server/game/mod/item"
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
@ -28,51 +28,73 @@ func init() {
|
||||
func GetAllCollectReward() []*item.Item {
|
||||
data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "all_collect_reward")
|
||||
if err != nil {
|
||||
log.Debug("GetAllCollectReward data not found")
|
||||
log.Debug("GetAllCollectReward err:%v", err)
|
||||
return nil
|
||||
}
|
||||
return item.ParseItem(data["Value"])
|
||||
if value, ok := data["Value"]; ok {
|
||||
return item.ParseItem(value)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func GetStarById(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetStarById data not found")
|
||||
log.Debug("GetStarById err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Star")
|
||||
}
|
||||
|
||||
func GetRoundById(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetRoundById err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Round")
|
||||
}
|
||||
|
||||
// 获取开启卡包获得的卡牌数量
|
||||
func GetPackRewardCnt(Star int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CARD_PACK_CFG_NAME, Star)
|
||||
|
||||
if err != nil {
|
||||
log.Debug("GetPackRewardCnt data not found")
|
||||
log.Debug("GetPackRewardCnt err:%v, Star=%d", err, Star)
|
||||
return 0
|
||||
}
|
||||
|
||||
return gamedata.GetIntValue(data, "RewardCnt")
|
||||
}
|
||||
|
||||
// 获取开启开包比得x星卡
|
||||
// 获取开启开包必得x星卡
|
||||
func GetPackMustHave(Star int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CARD_PACK_CFG_NAME, Star)
|
||||
if err != nil {
|
||||
log.Debug("GetPackMustHave data not found")
|
||||
log.Debug("GetPackMustHave err:%v, Star=%d", err, Star)
|
||||
return 0
|
||||
}
|
||||
|
||||
return gamedata.GetIntValue(data, "MustHave")
|
||||
}
|
||||
|
||||
// 根据星级获取卡牌列表
|
||||
func GetCardListByStar(Star, IsGold int) []int {
|
||||
var CardList []int
|
||||
func GetCardListByStar(Round, Star, IsGold int) []int {
|
||||
data, err := gamedata.GetData(CARD_DETAIL_CFG_NAME)
|
||||
if err != nil {
|
||||
log.Debug("GetCardListByStar data not found")
|
||||
log.Debug("GetCardListByStar err:%v", err)
|
||||
return nil
|
||||
}
|
||||
CardList := make([]int, 0, len(data)/10)
|
||||
for k, v := range data {
|
||||
Extra := gamedata.GetIntValue(v, "Round")
|
||||
if Round < Extra {
|
||||
continue
|
||||
}
|
||||
vStar := gamedata.GetIntValue(v, "Star")
|
||||
isGold := gamedata.GetIntValue(v, "IsGold")
|
||||
if vStar == Star && IsGold == isGold {
|
||||
id, _ := strconv.Atoi(k)
|
||||
id, err := strconv.Atoi(k)
|
||||
if err != nil {
|
||||
log.Debug("GetCardListByStar parse id err:%v, key=%s", err, k)
|
||||
continue
|
||||
}
|
||||
CardList = append(CardList, id)
|
||||
}
|
||||
}
|
||||
@ -80,16 +102,20 @@ func GetCardListByStar(Star, IsGold int) []int {
|
||||
}
|
||||
|
||||
// 获取随机卡牌
|
||||
func GetRandListByStar(Star int) []int {
|
||||
var randList []int
|
||||
func GetRandListByStar(Star int) map[int]int {
|
||||
data, err := gamedata.GetDataByIntKey(CARD_PACK_CFG_NAME, Star)
|
||||
if err != nil {
|
||||
log.Debug("GetRandListByStar data not found")
|
||||
log.Debug("GetRandListByStar err:%v, Star=%d", err, Star)
|
||||
return nil
|
||||
}
|
||||
r1 := gamedata.GetStringValue(data, "RandRate")
|
||||
r2 := strings.Split(r1, ",")
|
||||
randList = GoUtil.SliceStringToInt(r2)
|
||||
return randList
|
||||
randList := GoUtil.SliceStringToInt(r2)
|
||||
r := make(map[int]int, len(randList))
|
||||
for k, v := range randList {
|
||||
r[k+1] = v
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
// 获取卡牌收集奖励
|
||||
@ -106,33 +132,33 @@ func GetCollectReward(Color int) ([]*item.Item, int) {
|
||||
}
|
||||
|
||||
// 获取兑换奖励
|
||||
func GetExchangeCfg(Id int) (int, []*item.Item, []int) {
|
||||
func GetExchangeCfg(Id int) (int, []*item.Item) {
|
||||
data, err := gamedata.GetDataByIntKey(CARD_EXCHANGE_CFG, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetExchangeCfg data not found")
|
||||
return 0, nil, nil
|
||||
log.Debug("GetExchangeCfg err:%v, Id=%d", err, Id)
|
||||
return 0, nil
|
||||
}
|
||||
itemNum := gamedata.GetIntValue(data, "Item")
|
||||
itemList := []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, itemNum)}
|
||||
CostStar := gamedata.GetIntValue(data, "CostStar")
|
||||
CardPackStr := gamedata.GetStringValue(data, "CardPack")
|
||||
s1 := CardPackStr[1 : len(CardPackStr)-1]
|
||||
CardPack := GoUtil.SliceStringToInt(strings.Split(s1, ","))
|
||||
return CostStar, itemList, CardPack
|
||||
itemList := gamedata.GetItemList(data, "Item")
|
||||
return CostStar, itemList
|
||||
}
|
||||
|
||||
// 根据系列获取卡牌列表
|
||||
func GetCardListByColor(Id int) []int {
|
||||
data, err := gamedata.GetData(CARD_DETAIL_CFG_NAME)
|
||||
if err != nil {
|
||||
log.Debug("GetCardListByColor data not found")
|
||||
return []int{}
|
||||
log.Debug("GetCardListByColor err:%v, Id=%d", err, Id)
|
||||
return nil
|
||||
}
|
||||
var r []int
|
||||
r := make([]int, 0, len(data)/5)
|
||||
for k, v := range data {
|
||||
color := gamedata.GetIntValue(v, "PictureAlbum")
|
||||
if color == Id {
|
||||
k1, _ := strconv.Atoi(k)
|
||||
k1, err := strconv.Atoi(k)
|
||||
if err != nil {
|
||||
log.Debug("GetCardListByColor parse id err:%v, key=%s", err, k)
|
||||
continue
|
||||
}
|
||||
r = append(r, k1)
|
||||
}
|
||||
}
|
||||
@ -140,24 +166,42 @@ func GetCardListByColor(Id int) []int {
|
||||
}
|
||||
|
||||
// 获取所有卡牌id
|
||||
func GetAllCardId() []int {
|
||||
func GetAllCardId(Round int) []int {
|
||||
data, err := gamedata.GetData(CARD_DETAIL_CFG_NAME)
|
||||
if err != nil {
|
||||
log.Debug("GetCardListByColor data not found")
|
||||
return []int{}
|
||||
log.Debug("GetAllCardId err:%v, Round=%d", err, Round)
|
||||
return nil
|
||||
}
|
||||
var r []int
|
||||
for k := range data {
|
||||
k1, _ := strconv.Atoi(k)
|
||||
r := make([]int, 0, len(data))
|
||||
for k, v := range data {
|
||||
Extra := gamedata.GetIntValue(v, "Round")
|
||||
if Round < Extra {
|
||||
continue
|
||||
}
|
||||
k1, err := strconv.Atoi(k)
|
||||
if err != nil {
|
||||
log.Debug("GetAllCardId parse id err:%v, key=%s", err, k)
|
||||
continue
|
||||
}
|
||||
r = append(r, k1)
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func CheckCardIsGold(Id int) bool {
|
||||
data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("CheckCardIsGold err:%v, Id=%d", err, Id)
|
||||
return false
|
||||
}
|
||||
return gamedata.GetIntValue(data, "IsGold") == 1
|
||||
}
|
||||
|
||||
func GetCardDuration() int64 {
|
||||
data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "duration")
|
||||
if err != nil {
|
||||
log.Debug("GetCardDuration data not found")
|
||||
log.Debug("GetCardDuration err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return int64(gamedata.GetIntValue(data, "Value"))
|
||||
}
|
||||
@ -165,7 +209,8 @@ func GetCardDuration() int64 {
|
||||
func GetExTimes() int {
|
||||
data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "exchange_times")
|
||||
if err != nil {
|
||||
log.Debug("GetExTimes data not found")
|
||||
log.Debug("GetExTimes err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
@ -173,7 +218,29 @@ func GetExTimes() int {
|
||||
func GetReqTimes() int {
|
||||
data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "request_times")
|
||||
if err != nil {
|
||||
log.Debug("GetReqTimes data not found")
|
||||
log.Debug("GetReqTimes err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetItemIdByCardId(CardId int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, CardId)
|
||||
if err != nil {
|
||||
log.Debug("GetItemIdByCardId err:%v, CardId=%d", err, CardId)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "ItemId")
|
||||
}
|
||||
|
||||
func GetSeasonFirstReward() []*item.Item {
|
||||
data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "season_first")
|
||||
if err != nil {
|
||||
log.Debug("GetSeasonFirstReward err:%v", err)
|
||||
return nil
|
||||
}
|
||||
if value, ok := data["Value"]; ok {
|
||||
return item.ParseItem(value)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
155
src/server/conf/catnip/catnip_cfg.go
Normal file
155
src/server/conf/catnip/catnip_cfg.go
Normal file
@ -0,0 +1,155 @@
|
||||
package catnipCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
)
|
||||
|
||||
const (
|
||||
CATNIP_TEMPLATE_CFG_NAME = "CatnipTemplate"
|
||||
CATNIP_JACKPOT_CFG_NAME = "CatnipJackpot"
|
||||
CATNIP_MULTIPLIER_CFG_NAME = "CatnipMultiplier"
|
||||
CATNIP_GAME_CFG_NAME = "CatnipGame"
|
||||
)
|
||||
|
||||
const (
|
||||
CATNIP_REWARD_TYPE_LOW = 1
|
||||
CATNIP_REWARD_TYPE_MID = 2
|
||||
CATNIP_REWARD_TYPE_HIGH = 3
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CATNIP_TEMPLATE_CFG_NAME)
|
||||
gamedata.InitCfg(CATNIP_JACKPOT_CFG_NAME)
|
||||
gamedata.InitCfg(CATNIP_MULTIPLIER_CFG_NAME)
|
||||
gamedata.InitCfg(CATNIP_GAME_CFG_NAME)
|
||||
}
|
||||
|
||||
func GetGameNum(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetGameNum err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "PassNum")
|
||||
}
|
||||
|
||||
func GetGameMaxProgress(Id int) int {
|
||||
TemplateId := GetTemplateId(Id)
|
||||
data, err := gamedata.GetData(CATNIP_GAME_CFG_NAME)
|
||||
if err != nil {
|
||||
log.Debug("GetGameMaxProgress err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
MaxProgress := 0
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "Template") != TemplateId {
|
||||
continue
|
||||
}
|
||||
MaxProgress = max(MaxProgress, gamedata.GetIntValue(v, "Need"))
|
||||
}
|
||||
return MaxProgress
|
||||
}
|
||||
|
||||
func GetJackpotItem(Mul int) (int, []*item.Item, int, int) {
|
||||
data, err := gamedata.GetData(CATNIP_JACKPOT_CFG_NAME)
|
||||
if err != nil {
|
||||
log.Debug("GetJackpotItem err:%v, Mul=%d", err, Mul)
|
||||
return 0, nil, 0, 0
|
||||
}
|
||||
JackpotType := GetJackpotType(Mul)
|
||||
r := make(map[int]int, len(data))
|
||||
for k, v := range data {
|
||||
if gamedata.GetIntValue(v, "Type") == JackpotType {
|
||||
r[GoUtil.Int(k)] = 1
|
||||
}
|
||||
}
|
||||
Id := GoUtil.RandMap(r)
|
||||
if Id == 0 {
|
||||
return 0, nil, 0, 0
|
||||
}
|
||||
itemData, err := gamedata.GetDataByIntKey(CATNIP_JACKPOT_CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetJackpotItem get itemData err:%v, Id=%d", err, Id)
|
||||
return 0, nil, 0, 0
|
||||
}
|
||||
return Id, gamedata.GetItemList(itemData, "Items"), gamedata.GetIntValue(itemData, "Growth"), gamedata.GetIntValue(itemData, "FriendItems")
|
||||
}
|
||||
|
||||
func GetJackpotType(Mul int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CATNIP_MULTIPLIER_CFG_NAME, Mul)
|
||||
if err != nil {
|
||||
log.Debug("GetJackpotType err:%v, Mul=%d", err, Mul)
|
||||
return 0
|
||||
}
|
||||
R := map[int]int{
|
||||
CATNIP_REWARD_TYPE_LOW: gamedata.GetIntValue(data, "Low"),
|
||||
CATNIP_REWARD_TYPE_MID: gamedata.GetIntValue(data, "Mid"),
|
||||
CATNIP_REWARD_TYPE_HIGH: gamedata.GetIntValue(data, "High"),
|
||||
}
|
||||
return GoUtil.RandMap(R)
|
||||
}
|
||||
|
||||
func GetTemplateId(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetTemplateId err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Template")
|
||||
}
|
||||
|
||||
func GetProgressReward(Id int, Rewards []int, Progress int) ([]*item.Item, []int) {
|
||||
TemplateId := GetTemplateId(Id)
|
||||
data, err := gamedata.GetData(CATNIP_GAME_CFG_NAME)
|
||||
if err != nil {
|
||||
log.Debug("GetProgressReward err:%v, Id=%d", err, Id)
|
||||
return nil, nil
|
||||
}
|
||||
Items := make([]*item.Item, 0, len(data))
|
||||
Ids := make([]int, 0, len(data))
|
||||
for k, v := range data {
|
||||
rewardId := GoUtil.Int(k)
|
||||
if !GoUtil.InArray(rewardId, Rewards) && gamedata.GetIntValue(v, "Need") < Progress && gamedata.GetIntValue(v, "Template") == TemplateId {
|
||||
Items = append(Items, gamedata.GetItemList(v, "Items")...)
|
||||
Ids = append(Ids, rewardId)
|
||||
}
|
||||
}
|
||||
return Items, Ids
|
||||
}
|
||||
|
||||
func GetProgressNum(Id int) int {
|
||||
TemplateId := GetTemplateId(Id)
|
||||
data, err := gamedata.GetData(CATNIP_GAME_CFG_NAME)
|
||||
if err != nil {
|
||||
log.Debug("GetProgressNum err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
Num := 0
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "Template") == TemplateId {
|
||||
Num++
|
||||
}
|
||||
}
|
||||
return Num
|
||||
}
|
||||
|
||||
func GetItemCost(Id, Mul int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetItemCost err:%v, Id=%d", err, Id)
|
||||
return nil
|
||||
}
|
||||
return item.MutilItem(gamedata.GetItemList(data, "ItemCost"), Mul)
|
||||
}
|
||||
|
||||
func GetGrandReward(Id int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetGrandReward err:%v, Id=%d", err, Id)
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Reward")
|
||||
}
|
||||
@ -1,47 +0,0 @@
|
||||
package champshipCfg
|
||||
|
||||
import (
|
||||
"server/GoUtil"
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_CHAMPSHIP_SCORE = "ChampshipScore"
|
||||
CFG_CHAMPSHIP_RANK = "ChampshipRank"
|
||||
CFG_CHAMPSHIP_JACKPOT = "ChampshipJackpot"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_CHAMPSHIP_SCORE)
|
||||
gamedata.InitCfg(CFG_CHAMPSHIP_RANK)
|
||||
gamedata.InitCfg(CFG_CHAMPSHIP_JACKPOT)
|
||||
}
|
||||
|
||||
func GetChessScore(ChessLv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_CHAMPSHIP_SCORE, ChessLv)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Score")
|
||||
}
|
||||
|
||||
func GetReward(Reward, Score int) (int, []*item.Item) {
|
||||
data, err := gamedata.GetData(CFG_CHAMPSHIP_JACKPOT)
|
||||
if err != nil {
|
||||
return Reward, nil
|
||||
}
|
||||
r := make([]*item.Item, 0)
|
||||
for k, v := range data {
|
||||
Id := GoUtil.Int(k)
|
||||
if Reward >= Id {
|
||||
continue
|
||||
}
|
||||
Reward = max(Reward, Id)
|
||||
if Score >= gamedata.GetIntValue(v, "Score") {
|
||||
Items := item.ParseItem(gamedata.GetStringValue(v, "Items"))
|
||||
r = item.Merge(r, Items)
|
||||
}
|
||||
}
|
||||
return Reward, r
|
||||
}
|
||||
147
src/server/conf/champship/champship_cfg.go
Normal file
147
src/server/conf/champship/champship_cfg.go
Normal file
@ -0,0 +1,147 @@
|
||||
package champshipCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_CHAMPSHIP_SCORE = "ChampshipScore"
|
||||
CFG_CHAMPSHIP_RANK = "ChampshipRank"
|
||||
CFG_CHAMPSHIP_JACKPOT = "ChampshipJackpot"
|
||||
CFG_CHAMPSHIP_GROUP = "ChampshipGroup"
|
||||
CFG_CHAMPSHIP_CONST = "ChampshipConst"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_CHAMPSHIP_SCORE)
|
||||
gamedata.InitCfg(CFG_CHAMPSHIP_RANK)
|
||||
gamedata.InitCfg(CFG_CHAMPSHIP_JACKPOT)
|
||||
gamedata.InitCfg(CFG_CHAMPSHIP_GROUP)
|
||||
gamedata.InitCfg(CFG_CHAMPSHIP_CONST)
|
||||
}
|
||||
|
||||
func GetGroupId(N int) int {
|
||||
data, err := gamedata.GetData(CFG_CHAMPSHIP_GROUP)
|
||||
if err != nil {
|
||||
log.Debug("GetGroupId err:%v, N=%d", err, N)
|
||||
return 1
|
||||
}
|
||||
for k, v := range data {
|
||||
if N >= gamedata.GetIntValue(v, "Min") && N <= gamedata.GetIntValue(v, "Max") {
|
||||
return GoUtil.Int(k)
|
||||
}
|
||||
}
|
||||
return 11
|
||||
}
|
||||
|
||||
func GetChessScore(ChessLv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_CHAMPSHIP_SCORE, ChessLv)
|
||||
if err != nil {
|
||||
log.Debug("GetChessScore err:%v, ChessLv=%d", err, ChessLv)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Score")
|
||||
}
|
||||
|
||||
func GetReward(Reward, Score, activityId, orderFactor int) (int, []*item.Item) {
|
||||
data, err := gamedata.GetData(CFG_CHAMPSHIP_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetReward err:%v, Reward=%d, Score=%d", err, Reward, Score)
|
||||
return Reward, nil
|
||||
}
|
||||
r := make([]*item.Item, 0, len(data))
|
||||
NewReward := Reward
|
||||
for _, v := range data {
|
||||
rewardGroupType := gamedata.GetIntValue(v, "RewardGroupType")
|
||||
if rewardGroupType != activityId {
|
||||
continue
|
||||
}
|
||||
Id := gamedata.GetIntValue(v, "Step")
|
||||
if Reward >= Id {
|
||||
continue
|
||||
}
|
||||
if Score < gamedata.GetIntValue(v, "Total") {
|
||||
continue
|
||||
}
|
||||
Items := item.ParseItem(gamedata.GetValue(v, "Items"))
|
||||
r = item.Merge(r, Items)
|
||||
NewReward = max(NewReward, Id)
|
||||
starReward := gamedata.GetIntValue(v, "StarReward")
|
||||
if starReward > 0 {
|
||||
starnum := int((float64(starReward) * float64(orderFactor) / 500)) * 5
|
||||
if starnum > 0 {
|
||||
r = append(r, item.NewItem(item.ITEM_STAR_ID, starnum))
|
||||
}
|
||||
}
|
||||
}
|
||||
return NewReward, r
|
||||
}
|
||||
|
||||
func GetRewardItems(Reward int) ([]*item.Item, int) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_CHAMPSHIP_JACKPOT, Reward)
|
||||
if err != nil {
|
||||
log.Debug("GetRewardItems err:%v, Reward=%d", err, Reward)
|
||||
return nil, 0
|
||||
}
|
||||
return gamedata.GetItemList(data, "Items"), gamedata.GetIntValue(data, "Score")
|
||||
}
|
||||
|
||||
func GetRewardTotalScore(Reward int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_CHAMPSHIP_JACKPOT, Reward)
|
||||
if err != nil {
|
||||
log.Debug("GetRewardTotalScore err:%v, Reward=%d", err, Reward)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Total")
|
||||
}
|
||||
|
||||
func GetRankReward(Rank, yesterdayActivityId int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_CHAMPSHIP_RANK)
|
||||
if err != nil {
|
||||
log.Debug("GetRankReward err:%v, Rank=%d, yesterdayActivityId=%d", err, Rank, yesterdayActivityId)
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
if Rank >= gamedata.GetIntValue(v, "Min") && Rank <= gamedata.GetIntValue(v, "Max") && yesterdayActivityId == gamedata.GetIntValue(v, "RewardGroupType") {
|
||||
return gamedata.GetItemList(v, "Items")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetMaxRewardId() int {
|
||||
data, err := gamedata.GetData(CFG_CHAMPSHIP_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetMaxRewardId err:%v", err)
|
||||
return 0
|
||||
}
|
||||
MaxId := 0
|
||||
for k := range data {
|
||||
Id := GoUtil.Int(k)
|
||||
if Id > MaxId {
|
||||
MaxId = Id
|
||||
}
|
||||
}
|
||||
return MaxId
|
||||
}
|
||||
|
||||
func GetChampshipActivityId() []int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHAMPSHIP_CONST, "RewardGroupType_const")
|
||||
if err != nil {
|
||||
log.Debug("GetChampshipActivityId err:%v", err)
|
||||
return nil
|
||||
}
|
||||
value := gamedata.GetStringValue(data, "Value")
|
||||
var res []int
|
||||
for _, v := range strings.Split(value, "|") {
|
||||
id := GoUtil.Int(v)
|
||||
if id > 0 {
|
||||
res = append(res, id)
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
@ -1,253 +0,0 @@
|
||||
package chargeCfg
|
||||
|
||||
import (
|
||||
"server/GoUtil"
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_CHARGE = "Charge"
|
||||
CFG_DIAMOND_SHOP = "DiamondShop"
|
||||
CFG_ENERGY_SHOP = "EnergyShop"
|
||||
CFG_SEPCIAL_SHOP = "SpecialShop"
|
||||
CFG_FREE_SHOP = "FreeShop"
|
||||
CFG_CHARGE_CONST = "ChargeConst"
|
||||
CFG_CHARGE_GIFT = "ChargeGift"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_CHARGE)
|
||||
gamedata.InitCfg(CFG_DIAMOND_SHOP)
|
||||
gamedata.InitCfg(CFG_ENERGY_SHOP)
|
||||
gamedata.InitCfg(CFG_SEPCIAL_SHOP)
|
||||
gamedata.InitCfg(CFG_FREE_SHOP)
|
||||
gamedata.InitCfg(CFG_CHARGE_CONST)
|
||||
gamedata.InitCfg(CFG_CHARGE_GIFT)
|
||||
}
|
||||
|
||||
func GetMoneyCharge(ChargeId int) float64 {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetFloatValue(data, "Money")
|
||||
}
|
||||
|
||||
func GetDiamondShopReward(ChargeId int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_DIAMOND_SHOP)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return []*item.Item{item.NewItem(item.ITEM_DIAMOND_ID, gamedata.GetIntValue(v, "Diamond"))}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetEnergyShopId(ChargeId int) int {
|
||||
data, err := gamedata.GetData(CFG_ENERGY_SHOP)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
for k, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return GoUtil.Int(k)
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetEnergyShopReward(ChargeId int, First bool) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_ENERGY_SHOP)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
Energy := gamedata.GetIntValue(v, "Energy")
|
||||
if !First {
|
||||
Energy += gamedata.GetIntValue(v, "FirstCharge")
|
||||
}
|
||||
return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, Energy)}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetSpecialShopReward(ChargeId int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return item.ParseItem(gamedata.GetValue(v, "Items"))
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetSpecialShopType(ChargeId int) int {
|
||||
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return gamedata.GetIntValue(v, "Type")
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetFreeShopReward(ChargeId int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_FREE_SHOP, ChargeId)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
Item := gamedata.GetValue(data, "Items")
|
||||
return item.ParseItem(Item)
|
||||
}
|
||||
|
||||
func GetSpecialShopGrade(Money float64, Type int) int {
|
||||
type grade struct {
|
||||
id int
|
||||
money float64
|
||||
}
|
||||
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
l := make([]grade, 0)
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "Type") != Type {
|
||||
continue
|
||||
}
|
||||
l = append(l, grade{
|
||||
id: gamedata.GetIntValue(v, "Grade"),
|
||||
money: GetMoneyCharge(gamedata.GetIntValue(v, "ChargeId")),
|
||||
})
|
||||
}
|
||||
sort.Slice(l, func(i, j int) bool {
|
||||
return l[i].money < l[j].money
|
||||
})
|
||||
|
||||
for _, v := range l {
|
||||
if Money < v.money {
|
||||
return v.id
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetUnlockShopLv() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "shop_unlock_lv")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetSpecialShopCount() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "special_shop_count")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetAdChargeId() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "ad_charge_id")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetPiggyDuration() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_duration")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetPiggyMaxDia() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_max_diamond")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetPiggyRandDia() (int, int) {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_diamond_rand")
|
||||
if err != nil {
|
||||
return 0, 0
|
||||
}
|
||||
str := gamedata.GetStringValue(data, "Value")
|
||||
strArr := strings.Split(str, ",")
|
||||
if len(strArr) != 2 {
|
||||
return 0, 0
|
||||
}
|
||||
return GoUtil.Int(strArr[0]), GoUtil.Int(strArr[1])
|
||||
}
|
||||
|
||||
func GetPiggyBankChargeId() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_charge_id")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetGiftReward(ChargeId int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return item.ParseItem(gamedata.GetValue(v, "Items"))
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetGiftLimit(ChargeId int) int {
|
||||
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return gamedata.GetIntValue(v, "Count")
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
func GetGiftId(ChargeId int) int {
|
||||
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
for k, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return GoUtil.Int(k)
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetChargeInfo(ChargeId int) (float64, string) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
|
||||
if err != nil {
|
||||
return 0, ""
|
||||
}
|
||||
return gamedata.GetFloatValue(data, "Money"), gamedata.GetStringValue(data, "Unit")
|
||||
}
|
||||
418
src/server/conf/charge/charge_cfg.go
Normal file
418
src/server/conf/charge/charge_cfg.go
Normal file
@ -0,0 +1,418 @@
|
||||
package chargeCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_CHARGE = "Charge"
|
||||
CFG_DIAMOND_SHOP = "DiamondShop" // 钻石商店
|
||||
CFG_ENERGY_SHOP = "EnergyShop" // 体力商店
|
||||
CFG_SEPCIAL_SHOP = "SpecialShop" // 特惠商店
|
||||
CFG_FREE_SHOP = "FreeShop" // 免费商店
|
||||
CFG_CHARGE_CONST = "ChargeConst" // 充值常量配置
|
||||
CFG_CHARGE_GIFT = "ChargeGift" // 充值礼包
|
||||
CFG_CHARGE_WISH = "ChargeWish" // 许愿配置
|
||||
CFG_CHARGE_PETCOIN = "ChargePetCoin" // 宠物币充值配置
|
||||
CFG_CHARGE_AD = "ChargeAD" // 广告充值配置
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_CHARGE)
|
||||
gamedata.InitCfg(CFG_DIAMOND_SHOP)
|
||||
gamedata.InitCfg(CFG_ENERGY_SHOP)
|
||||
gamedata.InitCfg(CFG_SEPCIAL_SHOP)
|
||||
gamedata.InitCfg(CFG_FREE_SHOP)
|
||||
gamedata.InitCfg(CFG_CHARGE_CONST)
|
||||
gamedata.InitCfg(CFG_CHARGE_GIFT)
|
||||
gamedata.InitCfg(CFG_CHARGE_WISH)
|
||||
gamedata.InitCfg(CFG_CHARGE_PETCOIN)
|
||||
gamedata.InitCfg(CFG_CHARGE_AD)
|
||||
}
|
||||
|
||||
func GetADReward(ChargeId int) ([]*item.Item, int) {
|
||||
data, err := gamedata.GetData(CFG_CHARGE_AD)
|
||||
if err != nil {
|
||||
log.Debug("GetADReward err:%v, ChargeId=%d", err, ChargeId)
|
||||
return nil, 0
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return item.ParseItem(gamedata.GetValue(v, "Items")), gamedata.GetIntValue(v, "PetWork")
|
||||
}
|
||||
}
|
||||
return nil, 0
|
||||
}
|
||||
|
||||
func GetWeeklyDiscountDay() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_discount_day")
|
||||
if err != nil {
|
||||
log.Debug("GetWeeklyDiscountDay err:%v", err)
|
||||
return -1
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetMoneyCharge(ChargeId int) float64 {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
|
||||
if err != nil {
|
||||
log.Debug("GetMoneyCharge err:%v, ChargeId=%d", err, ChargeId)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetFloatValue(data, "Money")
|
||||
}
|
||||
|
||||
func GetDiamondShopReward(ChargeId int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_DIAMOND_SHOP)
|
||||
if err != nil {
|
||||
log.Debug("GetDiamondShopReward err:%v, ChargeId=%d", err, ChargeId)
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return []*item.Item{item.NewItem(item.ITEM_DIAMOND_ID, gamedata.GetIntValue(v, "Diamond"))}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetEnergyShopId(ChargeId int) int {
|
||||
data, err := gamedata.GetData(CFG_ENERGY_SHOP)
|
||||
if err != nil {
|
||||
log.Debug("GetEnergyShopId err:%v, ChargeId=%d", err, ChargeId)
|
||||
return 0
|
||||
}
|
||||
for k, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return GoUtil.Int(k)
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetWeeklyInfo(Pos int) (int, int) {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_chess_shop")
|
||||
if err != nil {
|
||||
log.Debug("GetWeeklyInfo err:%v, Pos=%d", err, Pos)
|
||||
return 0, 0
|
||||
}
|
||||
valueData, ok := data["Value"]
|
||||
if !ok {
|
||||
log.Debug("GetWeeklyInfo: Value field not found")
|
||||
return 0, 0
|
||||
}
|
||||
r, ok := valueData.([]interface{})
|
||||
if !ok {
|
||||
log.Debug("GetWeeklyInfo: Value is not []interface{}")
|
||||
return 0, 0
|
||||
}
|
||||
for _, v := range r {
|
||||
v1, ok := v.(map[string]interface{})
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
Id := GoUtil.Int(v1["Id"])
|
||||
if Id == Pos {
|
||||
return GoUtil.Int(v1["Discount"]), GoUtil.Int(v1["Limit"])
|
||||
}
|
||||
}
|
||||
return 0, 0
|
||||
}
|
||||
|
||||
func GetWeeklyInfoAll() map[int]gamedata.WeeklyDiscountInfo {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_chess_shop")
|
||||
if err != nil {
|
||||
log.Debug("GetWeeklyInfoAll err:%v", err)
|
||||
return nil
|
||||
}
|
||||
valueData, ok := data["Value"]
|
||||
if !ok {
|
||||
log.Debug("GetWeeklyInfoAll: Value field not found")
|
||||
return nil
|
||||
}
|
||||
r, ok := valueData.([]interface{})
|
||||
if !ok {
|
||||
log.Debug("GetWeeklyInfoAll: Value is not []interface{}")
|
||||
return nil
|
||||
}
|
||||
res := make(map[int]gamedata.WeeklyDiscountInfo, len(r))
|
||||
for _, v := range r {
|
||||
v1, ok := v.(map[string]interface{})
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
Id := GoUtil.Int(v1["Id"])
|
||||
res[Id] = gamedata.WeeklyDiscountInfo{
|
||||
Id: GoUtil.Int(v1["Id"]),
|
||||
Discount: GoUtil.Int(v1["Discount"]),
|
||||
WeeklyLimit: GoUtil.Int(v1["Limit"]),
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func GetEnergyShopReward(ChargeId int, First bool) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_ENERGY_SHOP)
|
||||
if err != nil {
|
||||
log.Debug("GetEnergyShopReward err:%v, ChargeId=%d", err, ChargeId)
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
Energy := gamedata.GetIntValue(v, "Energy")
|
||||
if !First {
|
||||
Energy += gamedata.GetIntValue(v, "FirstCharge")
|
||||
}
|
||||
return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, Energy)}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetSpecialShopReward(ChargeId int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
|
||||
if err != nil {
|
||||
log.Debug("GetSpecialShopReward err:%v, ChargeId=%d", err, ChargeId)
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return item.ParseItem(gamedata.GetValue(v, "Items"))
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetSpecialShopType(ChargeId int) int {
|
||||
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
|
||||
if err != nil {
|
||||
log.Debug("GetSpecialShopType err:%v, ChargeId=%d", err, ChargeId)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return gamedata.GetIntValue(v, "Type")
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetFreeShopReward(ChargeId int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_FREE_SHOP, ChargeId)
|
||||
if err != nil {
|
||||
log.Debug("GetFreeShopReward err:%v, ChargeId=%d", err, ChargeId)
|
||||
return nil
|
||||
}
|
||||
Item := gamedata.GetValue(data, "Items")
|
||||
return item.ParseItem(Item)
|
||||
}
|
||||
|
||||
func GetSpecialShopGrade(Money float64, Type int) int {
|
||||
type grade struct {
|
||||
id int
|
||||
money float64
|
||||
}
|
||||
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
|
||||
if err != nil {
|
||||
log.Debug("GetSpecialShopGrade err:%v, Money=%.2f, Type=%d", err, Money, Type)
|
||||
return 0
|
||||
}
|
||||
l := make([]grade, 0, len(data))
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "Type") != Type {
|
||||
continue
|
||||
}
|
||||
l = append(l, grade{
|
||||
id: gamedata.GetIntValue(v, "Grade"),
|
||||
money: GetMoneyCharge(gamedata.GetIntValue(v, "ChargeId")),
|
||||
})
|
||||
}
|
||||
sort.Slice(l, func(i, j int) bool {
|
||||
return l[i].money > l[j].money
|
||||
})
|
||||
|
||||
if len(l) == 0 {
|
||||
return 0
|
||||
}
|
||||
maxMoney := 0.0
|
||||
for _, v := range l {
|
||||
if Money >= v.money {
|
||||
maxMoney = max(maxMoney, v.money)
|
||||
}
|
||||
}
|
||||
for _, v := range l {
|
||||
if v.money == maxMoney {
|
||||
return v.id
|
||||
}
|
||||
}
|
||||
return l[0].id
|
||||
}
|
||||
|
||||
func GetUnlockShopLv() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "shop_unlock_lv")
|
||||
if err != nil {
|
||||
log.Debug("GetUnlockShopLv err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetSpecialShopCount() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "special_shop_count")
|
||||
if err != nil {
|
||||
log.Debug("GetSpecialShopCount err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetAdChargeId() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "ad_charge_id")
|
||||
if err != nil {
|
||||
log.Debug("GetAdChargeId err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetPiggyDuration() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_duration")
|
||||
if err != nil {
|
||||
log.Debug("GetPiggyDuration err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetPiggyMaxDia() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_max_diamond")
|
||||
if err != nil {
|
||||
log.Debug("GetPiggyMaxDia err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetPiggyRandDia() (int, int) {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_diamond_rand")
|
||||
if err != nil {
|
||||
log.Debug("GetPiggyRandDia err:%v", err)
|
||||
return 0, 0
|
||||
}
|
||||
str := gamedata.GetStringValue(data, "Value")
|
||||
strArr := strings.Split(str, ",")
|
||||
if len(strArr) != 2 {
|
||||
return 0, 0
|
||||
}
|
||||
return GoUtil.Int(strArr[0]), GoUtil.Int(strArr[1])
|
||||
}
|
||||
|
||||
func GetPiggyBankChargeId() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_charge_id")
|
||||
if err != nil {
|
||||
log.Debug("GetPiggyBankChargeId err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetGiftReward(ChargeId int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
|
||||
if err != nil {
|
||||
log.Debug("GetGiftReward err:%v, ChargeId=%d", err, ChargeId)
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return item.ParseItem(gamedata.GetValue(v, "Items"))
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetGiftLimit(ChargeId int) int {
|
||||
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
|
||||
if err != nil {
|
||||
log.Debug("GetGiftLimit err:%v, ChargeId=%d", err, ChargeId)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return gamedata.GetIntValue(v, "Count")
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
func GetGiftId(ChargeId int) int {
|
||||
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
|
||||
if err != nil {
|
||||
log.Debug("GetGiftId err:%v, ChargeId=%d", err, ChargeId)
|
||||
return 0
|
||||
}
|
||||
for k, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return GoUtil.Int(k)
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetChargeInfo(ChargeId int) (float64, string) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
|
||||
if err != nil {
|
||||
log.Debug("GetChargeInfo err:%v, ChargeId=%d", err, ChargeId)
|
||||
return 0, ""
|
||||
}
|
||||
return gamedata.GetFloatValue(data, "Money"), gamedata.GetStringValue(data, "Unit")
|
||||
}
|
||||
|
||||
func GetProduceName(ChargeId int) string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
|
||||
if err != nil {
|
||||
log.Debug("GetProduceName err:%v, ChargeId=%d", err, ChargeId)
|
||||
return ""
|
||||
}
|
||||
return gamedata.GetStringValue(data, "Remark")
|
||||
}
|
||||
|
||||
func GetWishCount(ItemId int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_CHARGE_WISH, ItemId)
|
||||
if err != nil {
|
||||
log.Debug("GetWishCount err:%v, ItemId=%d", err, ItemId)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Wish")
|
||||
}
|
||||
|
||||
func GetPetCoinShopReward(ChargeId int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_CHARGE_PETCOIN)
|
||||
if err != nil {
|
||||
log.Debug("GetPetCoinShopReward err:%v, ChargeId=%d", err, ChargeId)
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
|
||||
return gamedata.GetItemList(v, "Items")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetWeeklyDiscountStartEnd() (int64, int64) {
|
||||
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_discount_time")
|
||||
if err != nil {
|
||||
log.Debug("GetWeeklyDiscountStartEnd err:%v", err)
|
||||
return 0, 0
|
||||
}
|
||||
str := gamedata.GetStringValue(data, "Value")
|
||||
strArr := strings.Split(str, "|")
|
||||
if len(strArr) != 2 {
|
||||
return 0, 0
|
||||
}
|
||||
return GoUtil.ParseTime(strArr[0]), GoUtil.ParseTime(strArr[1])
|
||||
}
|
||||
67
src/server/conf/collect/collect_cfg.go
Normal file
67
src/server/conf/collect/collect_cfg.go
Normal file
@ -0,0 +1,67 @@
|
||||
package collectCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_COLLECT = "Collect"
|
||||
CFG_COLLECT_JACKPOT = "CollectJackpot"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_COLLECT)
|
||||
gamedata.InitCfg(CFG_COLLECT_JACKPOT)
|
||||
}
|
||||
|
||||
func GetJackpotId() []int {
|
||||
data, err := gamedata.GetData(CFG_COLLECT_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetJackpotId err:%v", err)
|
||||
return nil
|
||||
}
|
||||
ret := make([]int, 0, len(data))
|
||||
for k := range data {
|
||||
ret = append(ret, GoUtil.Int(k))
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func GetJackpotItems(Id int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_COLLECT_JACKPOT, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetJackpotItems err:%v, Id=%d", err, Id)
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Items")
|
||||
}
|
||||
|
||||
func GetRewardNeed(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_COLLECT, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetRewardNeed err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Need")
|
||||
}
|
||||
|
||||
func GetRewardType(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_COLLECT, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetRewardType err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Type")
|
||||
}
|
||||
|
||||
func GetRewardLen() int {
|
||||
data, err := gamedata.GetData(CFG_COLLECT)
|
||||
if err != nil {
|
||||
log.Debug("GetRewardLen err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return len(data)
|
||||
}
|
||||
@ -7,18 +7,19 @@ import (
|
||||
|
||||
var (
|
||||
// log conf
|
||||
LogFlag = log.LstdFlags
|
||||
LogFlag = log.LstdFlags | log.Lmicroseconds
|
||||
|
||||
// gate conf
|
||||
PendingWriteNum = 2000
|
||||
MaxMsgLen uint32 = 16384 // 16KB
|
||||
PendingWriteNum = 2000 // 客户端链接的写入消息队列长度
|
||||
MaxMsgLen uint32 = 65536 // 16KB
|
||||
HTTPTimeout = 10 * time.Second
|
||||
LenMsgLen = 2
|
||||
LittleEndian = false
|
||||
|
||||
// skeleton conf
|
||||
GoLen = 10000
|
||||
TimerDispatcherLen = 10000
|
||||
AsynCallLen = 10000
|
||||
ChanRPCLen = 10000
|
||||
// 增加 goroutine 相关配置,避免 "Too many goroutines" 错误
|
||||
GoLen = 50000 // 从 10000 增加到 50000,控制并发 goroutine 数量
|
||||
TimerDispatcherLen = 50000 // 从 10000 增加到 50000,定时器队列长度
|
||||
AsynCallLen = 50000 // 从 10000 增加到 50000,异步调用队列长度
|
||||
ChanRPCLen = 50000 // 从 10000 增加到 50000,RPC 通道长度
|
||||
)
|
||||
|
||||
@ -1,89 +0,0 @@
|
||||
package dailyTaskCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
DAILY_TASK_CONST = "DailyTaskConst"
|
||||
DAILY_TASK = "DailyTask"
|
||||
DAILY_TASK_ACTIVE = "DailyTaskActive"
|
||||
DAILY_TASK_JACKPOT = "DailyTaskJackpot"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(DAILY_TASK_CONST)
|
||||
gamedata.InitCfg(DAILY_TASK)
|
||||
gamedata.InitCfg(DAILY_TASK_ACTIVE)
|
||||
gamedata.InitCfg(DAILY_TASK_JACKPOT)
|
||||
}
|
||||
|
||||
// 获取任务列表
|
||||
func GetTaskList(Lv int) map[int]string {
|
||||
r := make(map[int]string)
|
||||
data, err := gamedata.GetData(DAILY_TASK)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskList get data nil")
|
||||
return r
|
||||
}
|
||||
for k, v := range data {
|
||||
lv := gamedata.GetIntValue(v, "Lv")
|
||||
if Lv >= lv {
|
||||
k1, _ := strconv.Atoi(k)
|
||||
r[k1] = gamedata.GetStringValue(v, "Task")
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetTaskActiveId() []int {
|
||||
data, err := gamedata.GetData(DAILY_TASK_ACTIVE)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskActiveId get data nil")
|
||||
return []int{}
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for k := range data {
|
||||
Id, _ := strconv.Atoi(k)
|
||||
r = append(r, Id)
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetTaskActiveById(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(DAILY_TASK_ACTIVE, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskActiveById get data nil")
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Num")
|
||||
}
|
||||
|
||||
type Jackpot struct {
|
||||
Items []*item.Item
|
||||
Is_card int
|
||||
}
|
||||
|
||||
func GetTaskWeekJackpot() map[int]Jackpot {
|
||||
r := make(map[int]Jackpot)
|
||||
|
||||
data, err := gamedata.GetData(DAILY_TASK_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskWeekJackpot get data nil")
|
||||
return r
|
||||
}
|
||||
|
||||
for k, v := range data {
|
||||
Id, _ := strconv.Atoi(k)
|
||||
isCard := gamedata.GetIntValue(v, "CardPack")
|
||||
Item := item.ParseItem(gamedata.GetValue(v, "Items"))
|
||||
r[Id] = Jackpot{
|
||||
Items: Item,
|
||||
Is_card: isCard,
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
161
src/server/conf/daily_task/daily_task_cfg.go
Normal file
161
src/server/conf/daily_task/daily_task_cfg.go
Normal file
@ -0,0 +1,161 @@
|
||||
package dailyTaskCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
DAILY_TASK_CONST = "DailyTaskConst"
|
||||
DAILY_TASK = "DailyTask"
|
||||
DAILY_TASK_ACTIVE = "DailyTaskActive"
|
||||
DAILY_TASK_JACKPOT = "DailyTaskJackpot"
|
||||
DAILY_TASK_REWARD = "DailyTaskReward"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(DAILY_TASK_CONST)
|
||||
gamedata.InitCfg(DAILY_TASK)
|
||||
gamedata.InitCfg(DAILY_TASK_ACTIVE)
|
||||
gamedata.InitCfg(DAILY_TASK_JACKPOT)
|
||||
gamedata.InitCfg(DAILY_TASK_REWARD)
|
||||
}
|
||||
|
||||
func GetDailyTaskReward(Id, activityId int) []*item.Item {
|
||||
data, err := gamedata.GetData(DAILY_TASK_REWARD)
|
||||
if err != nil {
|
||||
log.Debug("GetDailyTaskReward err:%v", err)
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
sortId := gamedata.GetIntValue(v, "SortId")
|
||||
rewardGroupType := gamedata.GetIntValue(v, "RewardGroupType")
|
||||
if sortId == Id && rewardGroupType == activityId {
|
||||
items := gamedata.GetItemList(v, "ItemID")
|
||||
petCoinBase := gamedata.GetIntValue(v, "PetCoinBase")
|
||||
if petCoinBase > 0 {
|
||||
items = append(items, &item.Item{
|
||||
Id: item.ITEM_STAR_ID,
|
||||
Num: petCoinBase,
|
||||
})
|
||||
}
|
||||
return items
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetDailyTaskScore(Id, activityId int) int {
|
||||
data, err := gamedata.GetData(DAILY_TASK_REWARD)
|
||||
if err != nil {
|
||||
log.Debug("GetDailyTaskScore err:%v", err)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
sortId := gamedata.GetIntValue(v, "SortId")
|
||||
rewardGroupType := gamedata.GetIntValue(v, "RewardGroupType")
|
||||
if sortId == Id && rewardGroupType == activityId {
|
||||
return gamedata.GetIntValue(v, "ScoreReward")
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetActivityIds() []int {
|
||||
data, err := gamedata.GetDataByKey(DAILY_TASK_CONST, "RewardGroupType_const")
|
||||
if err != nil {
|
||||
log.Debug("GetActivityIds err:%v", err)
|
||||
return nil
|
||||
}
|
||||
str := gamedata.GetStringValue(data, "Value")
|
||||
strArr := strings.Split(str, "|")
|
||||
result := make([]int, 0, len(strArr))
|
||||
for _, v := range strArr {
|
||||
a, _ := strconv.Atoi(v)
|
||||
if a != 0 {
|
||||
result = append(result, a)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// 获取任务列表
|
||||
func GetTaskList(Lv int) map[int]string {
|
||||
data, err := gamedata.GetData(DAILY_TASK)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskList err:%v, Lv=%d", err, Lv)
|
||||
return nil
|
||||
}
|
||||
r := make(map[int]string, len(data))
|
||||
for k, v := range data {
|
||||
lv := gamedata.GetIntValue(v, "Lv")
|
||||
if Lv >= lv {
|
||||
k1, err := strconv.Atoi(k)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskList parse id err:%v, key=%s", err, k)
|
||||
continue
|
||||
}
|
||||
r[k1] = gamedata.GetStringValue(v, "Task")
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetTaskActiveId() []int {
|
||||
data, err := gamedata.GetData(DAILY_TASK_ACTIVE)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskActiveId err:%v", err)
|
||||
return nil
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for k := range data {
|
||||
Id, err := strconv.Atoi(k)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskActiveId parse id err:%v, key=%s", err, k)
|
||||
continue
|
||||
}
|
||||
r = append(r, Id)
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetTaskActiveById(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(DAILY_TASK_ACTIVE, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskActiveById err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Num")
|
||||
}
|
||||
|
||||
type Jackpot struct {
|
||||
Items []*item.Item
|
||||
Is_card int
|
||||
}
|
||||
|
||||
func GetTaskWeekJackpot() map[int]Jackpot {
|
||||
data, err := gamedata.GetData(DAILY_TASK_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskWeekJackpot err:%v", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
r := make(map[int]Jackpot, len(data))
|
||||
for k, v := range data {
|
||||
Id, err := strconv.Atoi(k)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskWeekJackpot parse id err:%v, key=%s", err, k)
|
||||
continue
|
||||
}
|
||||
isCard := gamedata.GetIntValue(v, "CardPack")
|
||||
Item := item.ParseItem(gamedata.GetValue(v, "Items"))
|
||||
r[Id] = Jackpot{
|
||||
Items: Item,
|
||||
Is_card: isCard,
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
@ -1,95 +0,0 @@
|
||||
package decorateCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
DECORATE_COST = "DecorateCost"
|
||||
INDOOR_PROGRESS = "IndoorProgress"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg("DecorateCost")
|
||||
gamedata.InitCfg("IndoorProgress")
|
||||
}
|
||||
|
||||
func GetStarCost(AreaId, SortId int) int {
|
||||
data, err := gamedata.GetData(DECORATE_COST)
|
||||
if err != nil {
|
||||
log.Debug("DecorateCost GetStarCost not found")
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
v1 := v.(map[string]interface{})
|
||||
if gamedata.ParseInt(v1["AreaId"]) == AreaId && gamedata.ParseInt(v1["SortId"]) == SortId {
|
||||
return gamedata.ParseInt(v1["CostCount"])
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetAreaId(id int) int {
|
||||
value, err := gamedata.GetDataByIntKey("DecorateCost", id)
|
||||
if err != nil {
|
||||
log.Debug("DecorateCost GetAreaId id:%v not found", id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.ParseInt(value["AreaId"])
|
||||
}
|
||||
|
||||
func GetNextAreaId(AreaId, SortId int) int {
|
||||
data, err := gamedata.GetData(DECORATE_COST)
|
||||
if err != nil {
|
||||
log.Debug("DecorateCost GetStarCost not found")
|
||||
return 0
|
||||
}
|
||||
for k, v := range data {
|
||||
v1 := v.(map[string]interface{})
|
||||
if gamedata.ParseInt(v1["AreaId"]) == AreaId && gamedata.ParseInt(v1["SortId"]) == SortId {
|
||||
UnionKey, _ := strconv.Atoi(k)
|
||||
nextId := UnionKey + 1
|
||||
AreaId = GetAreaId(nextId)
|
||||
return AreaId
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetAllSortIdByAreaId(AreaId int) []int {
|
||||
data, err := gamedata.GetData(DECORATE_COST)
|
||||
if err != nil {
|
||||
log.Debug("DecorateCost GetAllSortIdByAreaId not found")
|
||||
return nil
|
||||
}
|
||||
var SortIdList []int
|
||||
for _, v := range data {
|
||||
v1 := v.(map[string]interface{})
|
||||
if gamedata.ParseInt(v1["AreaId"]) == AreaId {
|
||||
Sort := gamedata.ParseInt(v1["SortId"])
|
||||
if Sort == 0 {
|
||||
continue
|
||||
}
|
||||
SortIdList = append(SortIdList, Sort)
|
||||
}
|
||||
}
|
||||
return SortIdList
|
||||
}
|
||||
|
||||
func GetProgressReward(Scene, Lv int) []*item.Item {
|
||||
value, err := gamedata.GetData("IndoorProgress")
|
||||
if err != nil {
|
||||
log.Debug("IndoorProgress GetProgressReward not found")
|
||||
return nil
|
||||
}
|
||||
for _, v := range value {
|
||||
v1 := v.(map[string]interface{})
|
||||
if gamedata.ParseInt(v1["Scene"]) == Scene && gamedata.ParseInt(v1["Lv"]) == Lv {
|
||||
return item.ParseItem(v1["Item"])
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
255
src/server/conf/decorate/decorate_cfg.go
Normal file
255
src/server/conf/decorate/decorate_cfg.go
Normal file
@ -0,0 +1,255 @@
|
||||
package decorateCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
DECORATE_COST = "DecorateCost"
|
||||
INDOOR_PROGRESS = "IndoorProgress"
|
||||
DECORATE_CONST = "DecorateConst"
|
||||
DECORATE_AREA = "DecorateArea" // 装饰区域
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(DECORATE_COST)
|
||||
gamedata.InitCfg(INDOOR_PROGRESS)
|
||||
gamedata.InitCfg(DECORATE_CONST)
|
||||
gamedata.InitCfg(DECORATE_AREA)
|
||||
}
|
||||
|
||||
func GetStarCost(AreaId, SortId int) int {
|
||||
data, err := gamedata.GetData(DECORATE_COST)
|
||||
if err != nil {
|
||||
log.Debug("GetStarCost err:%v, AreaId=%d, SortId=%d", err, AreaId, SortId)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "AreaId") == AreaId && gamedata.GetIntValue(v, "SortId") == SortId {
|
||||
return gamedata.GetIntValue(v, "CostCount")
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetStarCostByAreaId(AreaId int) int {
|
||||
data, err := gamedata.GetData(DECORATE_COST)
|
||||
if err != nil {
|
||||
log.Debug("GetStarCost err:%v, AreaId=%d", err, AreaId)
|
||||
return 0
|
||||
}
|
||||
var total int
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "AreaId") == AreaId {
|
||||
total += gamedata.GetIntValue(v, "CostCount")
|
||||
}
|
||||
}
|
||||
return total
|
||||
}
|
||||
|
||||
func GetAreaId(id int) int {
|
||||
value, err := gamedata.GetDataByIntKey("DecorateCost", id)
|
||||
if err != nil {
|
||||
log.Debug("GetAreaId err:%v, id=%d", err, id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(value, "AreaId")
|
||||
}
|
||||
|
||||
func GetNextAreaId(AreaId, SortId int) int {
|
||||
data, err := gamedata.GetData(DECORATE_COST)
|
||||
if err != nil {
|
||||
log.Debug("GetNextAreaId err:%v, AreaId=%d, SortId=%d", err, AreaId, SortId)
|
||||
return 0
|
||||
}
|
||||
for k, v := range data {
|
||||
if gamedata.GetIntValue(v, "AreaId") == AreaId && gamedata.GetIntValue(v, "SortId") == SortId {
|
||||
UnionKey, err := strconv.Atoi(k)
|
||||
if err != nil {
|
||||
log.Debug("GetNextAreaId parse key err:%v, key=%s", err, k)
|
||||
return 0
|
||||
}
|
||||
nextId := UnionKey + 1
|
||||
AreaId = GetAreaId(nextId)
|
||||
return AreaId
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetAllSortIdByAreaId(AreaId int) []int {
|
||||
data, err := gamedata.GetData(DECORATE_COST)
|
||||
if err != nil {
|
||||
log.Debug("GetAllSortIdByAreaId err:%v, AreaId=%d", err, AreaId)
|
||||
return nil
|
||||
}
|
||||
SortIdList := make([]int, 0, len(data)/5)
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "AreaId") == AreaId {
|
||||
Sort := gamedata.GetIntValue(v, "SortId")
|
||||
if Sort == 0 {
|
||||
continue
|
||||
}
|
||||
SortIdList = append(SortIdList, Sort)
|
||||
}
|
||||
}
|
||||
return SortIdList
|
||||
}
|
||||
|
||||
func GetProgressReward(Scene, Lv int) []*item.Item {
|
||||
value, err := gamedata.GetData(INDOOR_PROGRESS)
|
||||
if err != nil {
|
||||
log.Debug("GetProgressReward err:%v, Scene=%d, Lv=%d", err, Scene, Lv)
|
||||
return nil
|
||||
}
|
||||
for _, v := range value {
|
||||
if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == Lv {
|
||||
return gamedata.GetItemList(v, "AreaReward")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetDecoarteReward(Scene int, Lv int) []*item.Item {
|
||||
value, err := gamedata.GetData(INDOOR_PROGRESS)
|
||||
if err != nil {
|
||||
log.Debug("GetDecoarteReward err:%v, Scene=%d, Lv=%d", err, Scene, Lv)
|
||||
return nil
|
||||
}
|
||||
for _, v := range value {
|
||||
if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == Lv {
|
||||
return gamedata.GetItemList(v, "Item")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetAreaReward(AreaId int) []*item.Item {
|
||||
value, err := gamedata.GetDataByIntKey(DECORATE_AREA, AreaId)
|
||||
if err != nil {
|
||||
log.Debug("GetAreaReward err:%v, AreaId=%d", err, AreaId)
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(value, "Items")
|
||||
}
|
||||
|
||||
// 获取一键装饰的解锁等级
|
||||
func GetOneKeyDecorateUnlockLv() int {
|
||||
data, err := gamedata.GetDataByKey(DECORATE_CONST, "OneKey")
|
||||
if err != nil {
|
||||
log.Debug("GetOneKeyDecorateUnlockLv err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
// 获取每次装饰增加的体力值
|
||||
func GetDecorateAddEnergy() int {
|
||||
data, err := gamedata.GetDataByKey(DECORATE_CONST, "AddEnergy")
|
||||
if err != nil {
|
||||
log.Debug("GetDecorateAddEnergy err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetAreaPerPExp(AreaId int) int {
|
||||
data, err := gamedata.GetDataByIntKey(DECORATE_AREA, AreaId)
|
||||
if err != nil {
|
||||
log.Debug("GetAreaPerPExp err:%v, AreaId=%d", err, AreaId)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "PerPExp")
|
||||
}
|
||||
|
||||
func GetDecoratePExp(AreaId, SortId int) int {
|
||||
data, err := gamedata.GetData(DECORATE_COST)
|
||||
if err != nil {
|
||||
log.Debug("GetDecoratePExp err:%v, AreaId=%d, SortId=%d", err, AreaId, SortId)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "AreaId") == AreaId && gamedata.GetIntValue(v, "SortId") == SortId {
|
||||
return gamedata.GetIntValue(v, "PetExp")
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetAllPartId() []int {
|
||||
data, err := gamedata.GetDataByKey(DECORATE_CONST, "AllPartId")
|
||||
if err != nil {
|
||||
log.Debug("GetAllPartId err:%v", err)
|
||||
return nil
|
||||
}
|
||||
str := gamedata.GetStringValue(data, "Value")
|
||||
r1 := strings.Split(str, "|")
|
||||
PartIdList := make([]int, 0, len(r1))
|
||||
for _, v := range r1 {
|
||||
id, err := strconv.Atoi(v)
|
||||
if err != nil {
|
||||
log.Debug("GetAllPartId parse id err:%v, v=%s", err, v)
|
||||
continue
|
||||
}
|
||||
PartIdList = append(PartIdList, id)
|
||||
}
|
||||
return PartIdList
|
||||
}
|
||||
|
||||
func GetIdBySenceAndLv(Sence, Lv int) int {
|
||||
data, err := gamedata.GetData(INDOOR_PROGRESS)
|
||||
if err != nil {
|
||||
log.Debug("GetIdBySenceAndLv err:%v, Sence=%d, Lv=%d", err, Sence, Lv)
|
||||
return 0
|
||||
}
|
||||
for k, v := range data {
|
||||
if gamedata.GetIntValue(v, "Scene") == Sence && gamedata.GetIntValue(v, "Lv") == Lv {
|
||||
id, err := strconv.Atoi(k)
|
||||
if err != nil {
|
||||
log.Debug("GetIdBySenceAndLv parse id err:%v, key=%s", err, k)
|
||||
return 0
|
||||
}
|
||||
return id
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetPartNumByAreaId(AreaId int) map[int]int {
|
||||
data, err := gamedata.GetData(INDOOR_PROGRESS)
|
||||
if err != nil {
|
||||
log.Debug("GetPartNumByAreaId err:%v, AreaId=%d", err, AreaId)
|
||||
return nil
|
||||
}
|
||||
res := make(map[int]int, len(data))
|
||||
for k, v := range data {
|
||||
Sence := gamedata.GetIntValue(v, "Scene")
|
||||
if Sence != AreaId {
|
||||
continue
|
||||
}
|
||||
id, err := strconv.Atoi(k)
|
||||
if err != nil {
|
||||
log.Debug("GetPartNumByAreaId parse id err:%v, key=%s", err, k)
|
||||
continue
|
||||
}
|
||||
PartNum := gamedata.GetIntValue(v, "Part")
|
||||
if PartNum == 0 {
|
||||
continue
|
||||
}
|
||||
res[id] = PartNum
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func GetAreaIdByIndoorId(IndoorId int) int {
|
||||
data, err := gamedata.GetDataByIntKey(INDOOR_PROGRESS, IndoorId)
|
||||
if err != nil {
|
||||
log.Debug("GetAreaIdByIndoorId err:%v, IndoorId=%d", err, IndoorId)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Scene")
|
||||
}
|
||||
53
src/server/conf/emoji/emoji_cfg.go
Normal file
53
src/server/conf/emoji/emoji_cfg.go
Normal file
@ -0,0 +1,53 @@
|
||||
package emojiCfg
|
||||
|
||||
import (
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_EMOJI = "Emoji"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_EMOJI)
|
||||
}
|
||||
|
||||
func GetInitList() []int {
|
||||
data, err := gamedata.GetData(CFG_EMOJI)
|
||||
if err != nil {
|
||||
log.Debug("GetInitList err:%v", err)
|
||||
return nil
|
||||
}
|
||||
ret := make([]int, 0, len(data))
|
||||
for k, v := range data {
|
||||
Init := gamedata.GetIntValue(v, "Init")
|
||||
if Init == 1 {
|
||||
ret = append(ret, GoUtil.Int(k))
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func GetAllList() []int {
|
||||
data, err := gamedata.GetData(CFG_EMOJI)
|
||||
if err != nil {
|
||||
log.Debug("GetAllList err:%v", err)
|
||||
return nil
|
||||
}
|
||||
ret := make([]int, 0, len(data))
|
||||
for k := range data {
|
||||
ret = append(ret, GoUtil.Int(k))
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func GetEmojiName(Id int) string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_EMOJI, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetEmojiName err:%v, Id=%d", err, Id)
|
||||
return ""
|
||||
}
|
||||
return gamedata.GetStringValue(data, "Name")
|
||||
}
|
||||
@ -3,6 +3,7 @@ package endlessCfg
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -15,14 +16,15 @@ func init() {
|
||||
gamedata.InitCfg(CFG_ENDLESS_JACKPOT)
|
||||
}
|
||||
|
||||
func GetDiamond(Money float64) float64 {
|
||||
func GetEnergy(Money float64) float64 {
|
||||
data, err := gamedata.GetData(CFG_ENDLESS)
|
||||
if err != nil {
|
||||
log.Debug("GetEnergy err:%v, Money=%.2f", err, Money)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
if Money == gamedata.GetFloatValue(v, "Money") {
|
||||
return gamedata.GetFloatValue(v, "Diamond")
|
||||
return gamedata.GetFloatValue(v, "Energy")
|
||||
}
|
||||
}
|
||||
return 0
|
||||
@ -31,6 +33,7 @@ func GetDiamond(Money float64) float64 {
|
||||
func NextMoney(Money float64) float64 {
|
||||
data, err := gamedata.GetData(CFG_ENDLESS)
|
||||
if err != nil {
|
||||
log.Debug("NextMoney err:%v, Money=%.2f", err, Money)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
@ -44,6 +47,7 @@ func NextMoney(Money float64) float64 {
|
||||
func GetChargeId(Money float64) int {
|
||||
data, err := gamedata.GetData(CFG_ENDLESS)
|
||||
if err != nil {
|
||||
log.Debug("GetChargeId err:%v, Money=%.2f", err, Money)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
@ -54,27 +58,29 @@ func GetChargeId(Money float64) int {
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetPerDiamond(Id int) float64 {
|
||||
func GetPerEnergy(Id int) float64 {
|
||||
data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetPerEnergy err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
if Id == gamedata.GetIntValue(v, "ItemId") {
|
||||
return gamedata.GetFloatValue(v, "Diamond")
|
||||
return gamedata.GetFloatValue(v, "Energy")
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetItemId(Diamond float64, Type int) []int {
|
||||
func GetItemId(Energy float64, Type, Lv int) []int {
|
||||
data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetItemId err:%v, Energy=%.2f, Type=%d, Lv=%d", err, Energy, Type, Lv)
|
||||
return nil
|
||||
}
|
||||
var ItemId []int
|
||||
ItemId := make([]int, 0, len(data))
|
||||
for _, v := range data {
|
||||
if Diamond >= gamedata.GetFloatValue(v, "Diamond") && Type != gamedata.GetIntValue(v, "Type") && gamedata.GetIntValue(v, "ItemId") != item.ITEM_ENERGY_ID {
|
||||
if Lv >= gamedata.GetIntValue(v, "Lv") && Energy >= gamedata.GetFloatValue(v, "Energy") && Type != gamedata.GetIntValue(v, "Type") && gamedata.GetIntValue(v, "ItemId") != item.ITEM_ENERGY_ID {
|
||||
ItemId = append(ItemId, gamedata.GetIntValue(v, "ItemId"))
|
||||
}
|
||||
}
|
||||
@ -84,6 +90,7 @@ func GetItemId(Diamond float64, Type int) []int {
|
||||
func GetType(ItemId int) int {
|
||||
data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetType err:%v, ItemId=%d", err, ItemId)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
@ -94,14 +101,15 @@ func GetType(ItemId int) int {
|
||||
return 0
|
||||
}
|
||||
|
||||
func GeDiamondByItemId(ItemId int) float64 {
|
||||
func GetEnergyByItemId(ItemId int) float64 {
|
||||
data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetEnergyByItemId err:%v, ItemId=%d", err, ItemId)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
if ItemId == gamedata.GetIntValue(v, "ItemId") {
|
||||
return gamedata.GetFloatValue(v, "Diamond")
|
||||
return gamedata.GetFloatValue(v, "Energy")
|
||||
}
|
||||
}
|
||||
return 0
|
||||
@ -1,42 +0,0 @@
|
||||
package faceCfg
|
||||
|
||||
import (
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_FACE = "Face"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_FACE)
|
||||
}
|
||||
|
||||
func GetInitList() []int {
|
||||
data, err := gamedata.GetData(CFG_FACE)
|
||||
if err != nil {
|
||||
log.Debug("GetInitList err: %v", err)
|
||||
return nil
|
||||
}
|
||||
r := make([]int, 0)
|
||||
for k, v := range data {
|
||||
IsInit := gamedata.GetIntValue(v, "Init")
|
||||
if IsInit == 1 {
|
||||
k, _ := strconv.Atoi(k)
|
||||
r = append(r, k)
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func CheckExist(Id int) bool {
|
||||
data, err := gamedata.GetData(CFG_FACE)
|
||||
if err != nil {
|
||||
log.Debug("CheckExist err: %v", err)
|
||||
return false
|
||||
}
|
||||
_, ok := data[strconv.Itoa(Id)]
|
||||
return ok
|
||||
}
|
||||
74
src/server/conf/face/face_cfg.go
Normal file
74
src/server/conf/face/face_cfg.go
Normal file
@ -0,0 +1,74 @@
|
||||
package faceCfg
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_FACE = "Face"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_FACE)
|
||||
}
|
||||
|
||||
func GetInitList() []int {
|
||||
data, err := gamedata.GetData(CFG_FACE)
|
||||
if err != nil {
|
||||
log.Debug("GetInitList err:%v", err)
|
||||
return nil
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for k, v := range data {
|
||||
IsInit := gamedata.GetIntValue(v, "Init")
|
||||
if IsInit == 1 {
|
||||
id, err := strconv.Atoi(k)
|
||||
if err != nil {
|
||||
log.Debug("GetInitList parse id err:%v, key=%s", err, k)
|
||||
continue
|
||||
}
|
||||
r = append(r, id)
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetRandInitId() int {
|
||||
list := GetInitList()
|
||||
if len(list) == 0 {
|
||||
return 0
|
||||
}
|
||||
index := rand.Intn(len(list))
|
||||
return list[index]
|
||||
}
|
||||
|
||||
func CheckExist(Id int) bool {
|
||||
data, err := gamedata.GetData(CFG_FACE)
|
||||
if err != nil {
|
||||
log.Debug("CheckExist err:%v, Id=%d", err, Id)
|
||||
return false
|
||||
}
|
||||
_, ok := data[strconv.Itoa(Id)]
|
||||
return ok
|
||||
}
|
||||
|
||||
func GetAllId() []int {
|
||||
data, err := gamedata.GetData(CFG_FACE)
|
||||
if err != nil {
|
||||
log.Debug("GetAllId err:%v", err)
|
||||
return nil
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for k := range data {
|
||||
Id, err := strconv.Atoi(k)
|
||||
if err != nil {
|
||||
log.Debug("GetAllId parse id err:%v, key=%s", err, k)
|
||||
continue
|
||||
}
|
||||
r = append(r, Id)
|
||||
}
|
||||
return r
|
||||
}
|
||||
70
src/server/conf/friend/friend_cfg.go
Normal file
70
src/server/conf/friend/friend_cfg.go
Normal file
@ -0,0 +1,70 @@
|
||||
package friendCfg
|
||||
|
||||
import (
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_NPC_FRIENDS = "NPCFriends"
|
||||
CFG_CONST = "FriendConst"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_NPC_FRIENDS)
|
||||
gamedata.InitCfg(CFG_CONST)
|
||||
}
|
||||
|
||||
func IsNpcFriend(Id int) bool {
|
||||
_, err := gamedata.GetDataByIntKey(CFG_NPC_FRIENDS, Id)
|
||||
if err != nil {
|
||||
log.Debug("IsNpcFriend err:%v, Id=%d", err, Id)
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func GetFriendSponsorNum() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_energy_bonus")
|
||||
if err != nil {
|
||||
log.Debug("GetFriendSponsorNum err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetFriendLimitNum() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_limit")
|
||||
if err != nil {
|
||||
log.Debug("GetFriendLimitNum err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetDailyRecommendLimit() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_daily_recommend_limit")
|
||||
if err != nil {
|
||||
log.Debug("GetDailyRecommendLimit err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetApplyListLimit() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_apply_list_limit")
|
||||
if err != nil {
|
||||
log.Debug("GetApplyListLimit err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetDailyGetApplyLimit() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_daily_get_apply_limit")
|
||||
if err != nil {
|
||||
log.Debug("GetDailyGetApplyLimit err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
87
src/server/conf/friend_treasure/friend_treasure_cfg.go
Normal file
87
src/server/conf/friend_treasure/friend_treasure_cfg.go
Normal file
@ -0,0 +1,87 @@
|
||||
package friendTreasureCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_FRIEND_TREASURE_PROB = "FriendTreasureProb"
|
||||
CFG_FRIEND_TREASURE_CHEST = "FriendTreasureChest"
|
||||
CFG_FRIEND_TREASURE_CONST = "FriendTreasureConst"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_FRIEND_TREASURE_PROB)
|
||||
gamedata.InitCfg(CFG_FRIEND_TREASURE_CHEST)
|
||||
gamedata.InitCfg(CFG_FRIEND_TREASURE_CONST)
|
||||
}
|
||||
|
||||
func GetBigReward() []*item.Item {
|
||||
data, err := gamedata.GetDataByKey(CFG_FRIEND_TREASURE_CONST, "big_reward")
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Value")
|
||||
}
|
||||
|
||||
func GetFriendTreasureProb(Num int) map[int]int {
|
||||
data, err := gamedata.GetData(CFG_FRIEND_TREASURE_PROB)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
ProbMap := make(map[int]int)
|
||||
for k, v := range data {
|
||||
Id := GoUtil.Int(k)
|
||||
Prob := gamedata.GetIntValue(v, "Prob")
|
||||
ProbMap[Id] = Prob
|
||||
}
|
||||
AddProb := 0
|
||||
n := 0
|
||||
for k, v := range ProbMap {
|
||||
if k > Num {
|
||||
AddProb += v
|
||||
n++
|
||||
ProbMap[k] = 0
|
||||
}
|
||||
}
|
||||
PerProb := AddProb / n
|
||||
for k, v := range ProbMap {
|
||||
if k <= Num && k != 1 {
|
||||
ProbMap[k] = v + PerProb
|
||||
}
|
||||
}
|
||||
return ProbMap
|
||||
}
|
||||
|
||||
func GetProbAdd(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_FRIEND_TREASURE_PROB, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Add")
|
||||
}
|
||||
|
||||
func GetChestProb() map[int]int {
|
||||
data, err := gamedata.GetData(CFG_FRIEND_TREASURE_CHEST)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
ProbMap := make(map[int]int)
|
||||
for k, v := range data {
|
||||
Id := GoUtil.Int(k)
|
||||
Prob := gamedata.GetIntValue(v, "Prob")
|
||||
ProbMap[Id] = Prob
|
||||
}
|
||||
return ProbMap
|
||||
}
|
||||
|
||||
func GetChestItems(Id int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_FRIEND_TREASURE_CHEST, Id)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return gamedata.GetItemList(data, "Items")
|
||||
}
|
||||
73
src/server/conf/fur/fur_cfg.go
Normal file
73
src/server/conf/fur/fur_cfg.go
Normal file
@ -0,0 +1,73 @@
|
||||
package fur_cfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_FUR_CONST = "FurShopConst"
|
||||
CFG_FUR_SHOP = "FurShop"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_FUR_CONST)
|
||||
gamedata.InitCfg(CFG_FUR_SHOP)
|
||||
}
|
||||
|
||||
func GetFurShopCost(id int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Cost")
|
||||
}
|
||||
|
||||
func GetFurShopFreeTimes() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_FUR_CONST, "free_unlock")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetFurShopTag(id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "TAG")
|
||||
}
|
||||
|
||||
func GetFurShopName(id int) string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return gamedata.GetStringValue(data, "Name")
|
||||
}
|
||||
|
||||
func GetFurShopItem(id int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
itemId := gamedata.GetIntValue(data, "ItemID")
|
||||
if itemId == 0 {
|
||||
return nil
|
||||
}
|
||||
return []*item.Item{
|
||||
{
|
||||
Id: itemId,
|
||||
Num: 1,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func GetFurShopCostNum(id int) int {
|
||||
item := GetFurShopCost(id)
|
||||
if len(item) == 0 {
|
||||
return 0
|
||||
}
|
||||
return item[0].Num
|
||||
}
|
||||
118
src/server/conf/guess_color/guess_color_cfg.go
Normal file
118
src/server/conf/guess_color/guess_color_cfg.go
Normal file
@ -0,0 +1,118 @@
|
||||
package guesscolorCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_GUESS_COLOR_TEMPLATE = "GuessColorTemplate"
|
||||
CFG_GUESS_COLOR_REWARD = "GuessColorReward"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_GUESS_COLOR_TEMPLATE)
|
||||
gamedata.InitCfg(CFG_GUESS_COLOR_REWARD)
|
||||
}
|
||||
|
||||
func GetFirstPass(Id int) map[int]int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetFirstPass err:%v, Id=%d", err, Id)
|
||||
return nil
|
||||
}
|
||||
str := gamedata.GetStringValue(data, "FirstPass")
|
||||
arr := strings.Split(str, "|")
|
||||
ret := make(map[int]int, len(arr))
|
||||
for k, v := range arr {
|
||||
ret[k+1] = GoUtil.Int(v)
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func GetLoseItem(Id int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetLoseItem err:%v, Id=%d", err, Id)
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "ItemCost")
|
||||
}
|
||||
|
||||
func GetFirstItem(Id int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetFirstItem err:%v, Id=%d", err, Id)
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "FirstItem")
|
||||
}
|
||||
|
||||
func GetActivityItemId(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetActivityItemId err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "ItemId")
|
||||
}
|
||||
|
||||
func GetRewardItem(Id int, Type int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_GUESS_COLOR_REWARD)
|
||||
if err != nil {
|
||||
log.Debug("GetRewardItem err:%v, Id=%d, Type=%d", err, Id, Type)
|
||||
return nil
|
||||
}
|
||||
for k, v := range data {
|
||||
min := GoUtil.Int(k)
|
||||
max := gamedata.GetIntValue(v, "Max")
|
||||
if Id >= min && Id <= max {
|
||||
if Type == 1 {
|
||||
return gamedata.GetItemList(v, "Items1")
|
||||
}
|
||||
return gamedata.GetItemList(v, "Items2")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetPassNum(Id int) int {
|
||||
data, err := gamedata.GetData(CFG_GUESS_COLOR_REWARD)
|
||||
if err != nil {
|
||||
log.Debug("GetPassNum err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
for k, v := range data {
|
||||
min := GoUtil.Int(k)
|
||||
max := gamedata.GetIntValue(v, "Max")
|
||||
if Id >= min && Id <= max {
|
||||
return gamedata.GetIntValue(v, "Num")
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetWinTime(Id int) int {
|
||||
data, err := gamedata.GetData(CFG_GUESS_COLOR_REWARD)
|
||||
if err != nil {
|
||||
log.Debug("GetWinTime err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
for k, v := range data {
|
||||
min := GoUtil.Int(k)
|
||||
max := gamedata.GetIntValue(v, "Max")
|
||||
if Id >= min && Id <= max {
|
||||
Type := gamedata.GetIntValue(v, "Type")
|
||||
if Type == 1 {
|
||||
return gamedata.GetIntValue(v, "Win")
|
||||
}
|
||||
str := gamedata.GetStringValue(v, "Win")
|
||||
arr := strings.Split(str, "|")
|
||||
return GoUtil.RandNum(GoUtil.Int(arr[0]), GoUtil.Int(arr[1]))
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
package guildCfg
|
||||
package guidecfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
@ -7,17 +7,17 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
GUILD_REWARD = "GuildReward"
|
||||
GUIDE_REWARD = "GuideReward"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(GUILD_REWARD)
|
||||
gamedata.InitCfg(GUIDE_REWARD)
|
||||
}
|
||||
|
||||
func GetGuildReward(Id int) ([]*item.Item, int) {
|
||||
data, err := gamedata.GetDataByIntKey(GUILD_REWARD, Id)
|
||||
func GetGuideReward(Id int) ([]*item.Item, int) {
|
||||
data, err := gamedata.GetDataByIntKey(GUIDE_REWARD, Id)
|
||||
if err != nil {
|
||||
log.Debug("GuildCfg GetGuildReward Id:%v not found", Id)
|
||||
log.Debug("GetGuideReward err:%v, Id=%d", err, Id)
|
||||
return nil, 0
|
||||
}
|
||||
return item.ParseItem(gamedata.GetValue(data, "Items")), gamedata.GetIntValue(data, "Num")
|
||||
119
src/server/conf/guide_task/guide_task_cfg.go
Normal file
119
src/server/conf/guide_task/guide_task_cfg.go
Normal file
@ -0,0 +1,119 @@
|
||||
package GuideTaskCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
GUIDE_TASK_CONST = "GuideTaskConst"
|
||||
GUIDE_TASK_TASK = "GuideTaskTask"
|
||||
GUIDE_TASK_ACTIVE = "GuideTaskActive"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(GUIDE_TASK_CONST)
|
||||
gamedata.InitCfg(GUIDE_TASK_TASK)
|
||||
gamedata.InitCfg(GUIDE_TASK_ACTIVE)
|
||||
}
|
||||
|
||||
func GetTaskRewardById(Id int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskRewardById err:%v, Id=%d", err, Id)
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Items")
|
||||
}
|
||||
|
||||
func GetTaskById(Id int) string {
|
||||
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskById err:%v, Id=%d", err, Id)
|
||||
return ""
|
||||
}
|
||||
return gamedata.GetStringValue(data, "Task")
|
||||
}
|
||||
|
||||
func GetTaskActive(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskActive err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Active")
|
||||
}
|
||||
func GetUnlock(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetUnlock err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Unlock")
|
||||
}
|
||||
|
||||
func GetActiveReward(Id int) ([]*item.Item, int) {
|
||||
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_ACTIVE, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetActiveReward err:%v, Id=%d", err, Id)
|
||||
return nil, 0
|
||||
}
|
||||
return gamedata.GetItemList(data, "Items"), gamedata.GetIntValue(data, "Active")
|
||||
}
|
||||
func GetActiveReward2(reward []int, Active int) []*item.Item {
|
||||
data, err := gamedata.GetData(GUIDE_TASK_ACTIVE)
|
||||
if err != nil {
|
||||
log.Debug("GetActiveReward2 err:%v, Active=%d", err, Active)
|
||||
return nil
|
||||
}
|
||||
for k, v := range data {
|
||||
active := gamedata.GetIntValue(v, "Active")
|
||||
if active < Active {
|
||||
continue
|
||||
}
|
||||
if GoUtil.InArray(GoUtil.Int(k), reward) {
|
||||
continue
|
||||
}
|
||||
return gamedata.GetItemList(v, "Items")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetUnlockLv() int {
|
||||
data, err := gamedata.GetDataByKey(GUIDE_TASK_CONST, "UnlockLv")
|
||||
if err != nil {
|
||||
log.Debug("GetUnlockLv err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetDays() int {
|
||||
data, err := gamedata.GetDataByKey(GUIDE_TASK_CONST, "Days")
|
||||
if err != nil {
|
||||
log.Debug("GetDays err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetTaskList(Lv int) map[int]string {
|
||||
data, err := gamedata.GetData(GUIDE_TASK_TASK)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskList err:%v, Lv=%d", err, Lv)
|
||||
return nil
|
||||
}
|
||||
r := make(map[int]string, len(data))
|
||||
for k, v := range data {
|
||||
k1, err := strconv.Atoi(k)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskList parse id err:%v, key=%s", err, k)
|
||||
continue
|
||||
}
|
||||
r[k1] = gamedata.GetStringValue(v, "Task")
|
||||
}
|
||||
return r
|
||||
}
|
||||
35
src/server/conf/handbook/handbook_cfg.go
Normal file
35
src/server/conf/handbook/handbook_cfg.go
Normal file
@ -0,0 +1,35 @@
|
||||
package handbookCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_HANDBOOK = "Handbook"
|
||||
CFG_HANDBOOK_CONST = "HandbookConst"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_HANDBOOK)
|
||||
gamedata.InitCfg(CFG_HANDBOOK_CONST)
|
||||
}
|
||||
|
||||
func GetHandbookReward(Type string) []*item.Item {
|
||||
data, err := gamedata.GetDataByKey(CFG_HANDBOOK, Type)
|
||||
if err != nil {
|
||||
log.Debug("GetHandbookReward err:%v, Type=%s", err, Type)
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Items")
|
||||
}
|
||||
|
||||
func GetHandbookCollectReward() []*item.Item {
|
||||
data, err := gamedata.GetDataByKey(CFG_HANDBOOK_CONST, "collect_item")
|
||||
if err != nil {
|
||||
log.Debug("GetHandbookCollectReward err:%v", err)
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Value")
|
||||
}
|
||||
24
src/server/conf/invite/invite_cfg.go
Normal file
24
src/server/conf/invite/invite_cfg.go
Normal file
@ -0,0 +1,24 @@
|
||||
package inviteCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_INVITE = "Invite"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_INVITE)
|
||||
}
|
||||
|
||||
func GetInviteReward(index int) (int, []*item.Item) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_INVITE, index)
|
||||
if err != nil {
|
||||
log.Debug("GetInviteReward err:%v, index=%d", err, index)
|
||||
return 0, nil
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Need"), gamedata.GetItemList(data, "Items")
|
||||
}
|
||||
@ -1,48 +0,0 @@
|
||||
package itemCfg
|
||||
|
||||
import (
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var CFG_NAME = "Item"
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_NAME)
|
||||
}
|
||||
|
||||
func GetItemType(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("ItemCfg GetItemType Id:%v not found", Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.ParseInt(data["IType"])
|
||||
}
|
||||
|
||||
func GetItemEffect(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("ItemCfg GetItemEffect Id:%v not found", Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.ParseInt(data["Effect"])
|
||||
}
|
||||
|
||||
func GetItemEffectList(Id int) []int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("ItemCfg GetItemEffect Id:%v not found", Id)
|
||||
return []int{}
|
||||
}
|
||||
var res []int
|
||||
str := gamedata.GetStringValue(data, "Effect")
|
||||
a := strings.Split(str, ",")
|
||||
for _, v := range a {
|
||||
b, _ := strconv.Atoi(v)
|
||||
res = append(res, b)
|
||||
}
|
||||
return res
|
||||
}
|
||||
64
src/server/conf/item/Item_cfg.go
Normal file
64
src/server/conf/item/Item_cfg.go
Normal file
@ -0,0 +1,64 @@
|
||||
package itemCfg
|
||||
|
||||
import (
|
||||
languageCfg "server/conf/language"
|
||||
"server/gamedata"
|
||||
"server/msg"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var CFG_NAME = "Item"
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_NAME)
|
||||
}
|
||||
|
||||
func GetItemType(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetItemType err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "IType")
|
||||
}
|
||||
|
||||
func GetItemEffect(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetItemEffect err:%v, Id=%d", err, Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Effect")
|
||||
}
|
||||
|
||||
func GetItemEffectList(Id int) []int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetItemEffectList err:%v, Id=%d", err, Id)
|
||||
return nil
|
||||
}
|
||||
str := gamedata.GetStringValue(data, "Effect")
|
||||
a := strings.Split(str, ",")
|
||||
res := make([]int, 0, len(a))
|
||||
for _, v := range a {
|
||||
b, err := strconv.Atoi(v)
|
||||
if err != nil {
|
||||
log.Debug("GetItemEffectList parse err:%v, v=%s", err, v)
|
||||
continue
|
||||
}
|
||||
res = append(res, b)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func GetItemName(Id int) (string, string) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetItemName err:%v, Id=%d", err, Id)
|
||||
return "", ""
|
||||
}
|
||||
name := gamedata.GetStringValue(data, "Name")
|
||||
return languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, name), languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, name)
|
||||
}
|
||||
@ -9,9 +9,12 @@ import (
|
||||
)
|
||||
|
||||
var Server struct {
|
||||
AppID int
|
||||
AppPath string
|
||||
LogLevel string
|
||||
LogPath string
|
||||
WSAddr string
|
||||
RPCAddr string
|
||||
CertFile string
|
||||
KeyFile string
|
||||
TCPAddr string
|
||||
@ -28,6 +31,12 @@ var Server struct {
|
||||
RedisAddr string
|
||||
RedisPort string
|
||||
RedisPwd string
|
||||
RedisDb int
|
||||
|
||||
RedisWriteAddr string // 主写地址(host:port 或 单独 host, 仍兼容旧 RedisAddr/RedisPort)
|
||||
RedisReadAddrs string // 只读地址,逗号分隔(host:port,...)
|
||||
RedisMasterName string // 哨兵模式下的 master 名称
|
||||
RedisConnType string // "Direct" 或 "Sentinel"
|
||||
|
||||
GameName string
|
||||
ServerType string
|
||||
@ -39,13 +48,28 @@ var Server struct {
|
||||
|
||||
ListenAddr string
|
||||
CenterAddr string
|
||||
CenterNode int
|
||||
|
||||
RemoteAddr string
|
||||
RemoteAddr string
|
||||
GameConfPath string
|
||||
TELOGDIR string
|
||||
GoogleVerify bool
|
||||
Partition int
|
||||
KafkaHost string
|
||||
KafkaPort string
|
||||
Version string
|
||||
CountryCode string
|
||||
IdVerify bool
|
||||
}
|
||||
|
||||
func init() {
|
||||
// data, err := ioutil.ReadFile("conf/server.json")
|
||||
file, err := os.Open("conf/server.json")
|
||||
filePath := "conf/server.json"
|
||||
if len(os.Args) == 2 {
|
||||
if os.Args[1] != "" && os.Args[1][0] != '-' {
|
||||
filePath = os.Args[1]
|
||||
}
|
||||
}
|
||||
file, err := os.Open(filePath)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
64
src/server/conf/language/language_cfg.go
Normal file
64
src/server/conf/language/language_cfg.go
Normal file
@ -0,0 +1,64 @@
|
||||
package languageCfg
|
||||
|
||||
import (
|
||||
"server/gamedata"
|
||||
"server/msg"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_LANGUAGE = "LanguageData"
|
||||
CFG_ALLLANGUAGE = "AllLanguage"
|
||||
CFG_ALLLANGUAGE_CLIENT = "AllLanguageClient"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_LANGUAGE)
|
||||
gamedata.InitCfg(CFG_ALLLANGUAGE)
|
||||
gamedata.InitCfg(CFG_ALLLANGUAGE_CLIENT)
|
||||
}
|
||||
|
||||
func GetLanguage(lang msg.LANG_TYPE, key string) string {
|
||||
res := _GetClientLanguage(lang, key)
|
||||
if res != key {
|
||||
return res
|
||||
}
|
||||
return _GetBackendLanguage(lang, key)
|
||||
}
|
||||
|
||||
func _GetClientLanguage(lang msg.LANG_TYPE, key string) string {
|
||||
data, err := gamedata.GetDataByKey(CFG_ALLLANGUAGE_CLIENT, key)
|
||||
if err != nil {
|
||||
return key
|
||||
}
|
||||
switch lang {
|
||||
case msg.LANG_TYPE_LANG_EN:
|
||||
return gamedata.GetStringValue(data, "en_US")
|
||||
case msg.LANG_TYPE_LANG_PTBR:
|
||||
return gamedata.GetStringValue(data, "pt_BR")
|
||||
case msg.LANG_TYPE_LANG_CN:
|
||||
return gamedata.GetStringValue(data, "zh_CN")
|
||||
case msg.LANG_TYPE_LANG_ES_LATAM:
|
||||
return gamedata.GetStringValue(data, "es_LATAM")
|
||||
default:
|
||||
return key
|
||||
}
|
||||
}
|
||||
|
||||
func _GetBackendLanguage(lang msg.LANG_TYPE, key string) string {
|
||||
data, err := gamedata.GetDataByKey(CFG_ALLLANGUAGE, key)
|
||||
if err != nil {
|
||||
return key
|
||||
}
|
||||
switch lang {
|
||||
case msg.LANG_TYPE_LANG_EN:
|
||||
return gamedata.GetStringValue(data, "en_US")
|
||||
case msg.LANG_TYPE_LANG_PTBR:
|
||||
return gamedata.GetStringValue(data, "pt_BR")
|
||||
case msg.LANG_TYPE_LANG_CN:
|
||||
return gamedata.GetStringValue(data, "zh_CN")
|
||||
case msg.LANG_TYPE_LANG_ES_LATAM:
|
||||
return gamedata.GetStringValue(data, "es_LATAM")
|
||||
default:
|
||||
return key
|
||||
}
|
||||
}
|
||||
@ -1,219 +0,0 @@
|
||||
package limitedTimeEventCfg
|
||||
|
||||
import (
|
||||
"server/GoUtil"
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_LIMITED_TIME_EVENT = "LimitedTimeEvent"
|
||||
CFG_LIMITED_TIME_EVENT_METEOR = "LimitedTimeEventMeteor"
|
||||
CFG_LIMITED_TIME_EVENT_CHEST = "LimitedTimeEventChest"
|
||||
CFG_LIMITED_TIME_EVENT_ORDER = "LimitedTimeEventOrder"
|
||||
CFG_LIMITED_TIME_EVENT_SENCE = "LimitedTimeEventSence"
|
||||
CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT = "LimitedTimeEventSenceJackpot"
|
||||
CFG_LIMITED_TIME_EVENT_FAST = "LimitedTimeEventFast"
|
||||
CFG_LIMITED_TIME_EVENT_JACKPOT = "LimitedTimeEventJackpot"
|
||||
CFG_LIMITED_TIME_EVENT_CONST = "LimitedTimeEventConst"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_METEOR)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CHEST)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_ORDER)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_SENCE)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_FAST)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_JACKPOT)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CONST)
|
||||
}
|
||||
|
||||
// 获取限时事件触发列表
|
||||
func GetLimitedTimeEventCfg() []*gamedata.LimitedTimeEventData {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT)
|
||||
if err != nil {
|
||||
log.Debug("GetLimitedTimeEventCfg err:%v", err)
|
||||
return nil
|
||||
}
|
||||
var res []*gamedata.LimitedTimeEventData
|
||||
Day, Hour := GoUtil.GetWeekdayAndHour()
|
||||
for k, v := range data {
|
||||
weekDay := gamedata.GetIntValue(v, "WeekDay")
|
||||
startTime := gamedata.GetIntValue(v, "StartTime")
|
||||
endTime := gamedata.GetIntValue(v, "EndTime")
|
||||
if weekDay == Day && Hour >= startTime && Hour < endTime {
|
||||
Id, _ := strconv.Atoi(k)
|
||||
res = append(res, &gamedata.LimitedTimeEventData{
|
||||
Id: Id,
|
||||
EventId: gamedata.GetIntValue(v, "EventId"),
|
||||
Duration: int64(gamedata.GetIntValue(v, "Duration")),
|
||||
})
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
// 获取流星雨加成
|
||||
func GetMeteorAdd(ChessLv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_METEOR, ChessLv)
|
||||
if err != nil {
|
||||
log.Debug("GetMeteorAdd err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Add")
|
||||
}
|
||||
|
||||
// 获取宝箱雨奖励
|
||||
func GetChestReward(Star int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_CHEST)
|
||||
if err != nil {
|
||||
log.Debug("GetChestReward err:%v", err)
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
Min := gamedata.GetIntValue(v, "Min")
|
||||
Max := gamedata.GetIntValue(v, "Max")
|
||||
if Star >= Min && Star <= Max {
|
||||
return gamedata.GetItemList(v, "Items")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 获取超级订单奖励
|
||||
func GetSuperOrderReward(Star int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_ORDER)
|
||||
if err != nil {
|
||||
log.Debug("GetSuperOrderReward err:%v", err)
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
Min := gamedata.GetIntValue(v, "Min")
|
||||
Max := gamedata.GetIntValue(v, "Max")
|
||||
if Star >= Min && Star <= Max {
|
||||
return gamedata.GetItemList(v, "Items")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 获取场景冲刺奖励
|
||||
func GetSceneDashReward(Sence, Progress int) (int, []*item.Item) {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_SENCE)
|
||||
if err != nil {
|
||||
log.Debug("GetSceneDashReward err:%v", err)
|
||||
return 0, nil
|
||||
}
|
||||
for k, v := range data {
|
||||
if Sence == gamedata.GetIntValue(v, "Sence") && Progress == gamedata.GetIntValue(v, "Progress") {
|
||||
return GoUtil.Int(k), gamedata.GetItemList(v, "Items")
|
||||
}
|
||||
}
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
func GetSenceJackpotProb() map[int]int {
|
||||
r := make(map[int]int)
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetSenceJackpotReward err:%v", err)
|
||||
return nil
|
||||
}
|
||||
for k, v := range data {
|
||||
Id := GoUtil.Int(k)
|
||||
r[Id] = gamedata.GetIntValue(v, "Prob")
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetSenceJackpotReward(Id int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetSenceJackpotReward err:%v", err)
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Items")
|
||||
}
|
||||
|
||||
// 获取连击快手奖励
|
||||
func GetFastProduceReward(Times, Energy int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_FAST)
|
||||
if err != nil {
|
||||
log.Debug("GetSceneDashReward err:%v", err)
|
||||
return nil
|
||||
}
|
||||
for _, v := range data {
|
||||
if Times == gamedata.GetIntValue(v, "Times") && Energy <= gamedata.GetIntValue(v, "Max") && Energy >= gamedata.GetIntValue(v, "Min") {
|
||||
return gamedata.GetItemList(v, "Items")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetProgressMax() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Progress_max")
|
||||
if err != nil {
|
||||
log.Debug("GetProgressMax err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "value")
|
||||
}
|
||||
|
||||
func GetProgressRewardRand(Lv int) map[int]int {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetProgressRewardRand err:%v", err)
|
||||
return nil
|
||||
}
|
||||
r := make(map[int]int)
|
||||
for k, v := range data {
|
||||
if Lv >= gamedata.GetIntValue(v, "Min") && Lv <= gamedata.GetIntValue(v, "Max") {
|
||||
Id := GoUtil.Int(k)
|
||||
r[Id] = gamedata.GetIntValue(v, "Prob")
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetProgressSelectNum(Lv int) int {
|
||||
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Progress_lv_num")
|
||||
if err != nil {
|
||||
log.Debug("GetProgressSelectNum err:%v", err)
|
||||
return 0
|
||||
}
|
||||
Str := gamedata.GetStringValue(data, "value")
|
||||
Strarr := strings.Split(Str, ";")
|
||||
for _, v := range Strarr {
|
||||
a := strings.Split(v, ",")
|
||||
if len(a) != 3 {
|
||||
continue
|
||||
}
|
||||
Min, _ := strconv.Atoi(a[0])
|
||||
Max, _ := strconv.Atoi(a[1])
|
||||
if Lv >= Min && Lv <= Max {
|
||||
Num, _ := strconv.Atoi(a[2])
|
||||
return Num
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetProgressReward(RewardId int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetProgressReward err:%v", err)
|
||||
return nil
|
||||
}
|
||||
for k, v := range data {
|
||||
Id := GoUtil.Int(k)
|
||||
if Id == RewardId {
|
||||
return gamedata.GetItemList(v, "Items")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
456
src/server/conf/limited_time_event/limited_time_event_cfg.go
Normal file
456
src/server/conf/limited_time_event/limited_time_event_cfg.go
Normal file
@ -0,0 +1,456 @@
|
||||
package limitedTimeEventCfg
|
||||
|
||||
import (
|
||||
"math"
|
||||
"server/game/mod/item"
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_LIMITED_TIME_EVENT = "LimitedTimeEvent"
|
||||
CFG_LIMITED_TIME_EVENT_METEOR = "LimitedTimeEventMeteor"
|
||||
CFG_LIMITED_TIME_EVENT_CHEST = "LimitedTimeEventChest"
|
||||
CFG_LIMITED_TIME_EVENT_ORDER = "LimitedTimeEventOrder"
|
||||
CFG_LIMITED_TIME_EVENT_SENCE = "LimitedTimeEventSence"
|
||||
CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT = "LimitedTimeEventSenceJackpot"
|
||||
CFG_LIMITED_TIME_EVENT_FAST = "LimitedTimeEventFast"
|
||||
CFG_LIMITED_TIME_EVENT_JACKPOT = "LimitedTimeEventJackpot"
|
||||
CFG_LIMITED_TIME_EVENT_CHEST_JACKPOT = "LimitedTimeEventChestJackpot"
|
||||
CFG_LIMITED_TIME_EVENT_CONST = "LimitedTimeEventConst"
|
||||
CFG_LIMITED_TIME_EVENT_BONUS = "LimitedTimeEventBonus"
|
||||
CFG_LIMITED_TIME_EVENT_MONEY = "LimitedTimeEventMoney"
|
||||
CFG_LIMITED_TIME_EVENT_LUCKY = "LimitedTimeEventLucky"
|
||||
CFG_LIMTTED_TIME_EVENT_DECORATE_OFF = "LimitedTimeEventDecorateOff"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_METEOR)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CHEST)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_ORDER)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_SENCE)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_FAST)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_JACKPOT)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CONST)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_BONUS)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CHEST_JACKPOT)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_MONEY)
|
||||
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_LUCKY)
|
||||
gamedata.InitCfg(CFG_LIMTTED_TIME_EVENT_DECORATE_OFF)
|
||||
}
|
||||
|
||||
// 获取限时事件触发列表
|
||||
func GetLimitedTimeEventCfg() []*gamedata.LimitedTimeEventData {
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetEventName(Id int) string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetEventName err:%v, Id=%d", err, Id)
|
||||
return ""
|
||||
}
|
||||
return gamedata.GetStringValue(data, "Name")
|
||||
}
|
||||
|
||||
// 获取流星雨加成
|
||||
func GetMeteorAdd(ChessLv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_METEOR, ChessLv)
|
||||
if err != nil {
|
||||
log.Debug("GetMeteorAdd err:%v, ChessLv=%d", err, ChessLv)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Add")
|
||||
}
|
||||
|
||||
// 获取宝箱雨奖励
|
||||
func GetChestReward(Star int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_CHEST)
|
||||
if err != nil {
|
||||
log.Debug("GetChestReward err:%v, Star=%d", err, Star)
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, v := range data {
|
||||
Min := gamedata.GetIntValue(v, "Min")
|
||||
Max := gamedata.GetIntValue(v, "Max")
|
||||
if Star >= Min && Star <= Max {
|
||||
return gamedata.GetItemList(v, "Items")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
// 获取超级订单奖励
|
||||
func GetSuperOrderReward(energy int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_ORDER)
|
||||
if err != nil {
|
||||
log.Debug("GetSuperOrderReward err:%v, energy=%d", err, energy)
|
||||
return nil
|
||||
}
|
||||
star := energy
|
||||
for _, v := range data {
|
||||
Min := gamedata.GetIntValue(v, "Min")
|
||||
Max := gamedata.GetIntValue(v, "Max")
|
||||
if star >= Min && star <= Max {
|
||||
return gamedata.GetItemList(v, "Items")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 获取场景冲刺奖励
|
||||
func GetSceneDashReward(Sence, Progress int) (int, []*item.Item) {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_SENCE)
|
||||
if err != nil {
|
||||
log.Debug("GetSceneDashReward err:%v, Sence=%d, Progress=%d", err, Sence, Progress)
|
||||
return 0, nil
|
||||
}
|
||||
for k, v := range data {
|
||||
if Sence == gamedata.GetIntValue(v, "Sence") && Progress == gamedata.GetIntValue(v, "Progress") {
|
||||
return GoUtil.Int(k), gamedata.GetItemList(v, "Items")
|
||||
}
|
||||
}
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
// 获取场景冲刺奖池
|
||||
func GetSenceJackpotProb() map[int]int {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetSenceJackpotProb err:%v", err)
|
||||
return nil
|
||||
}
|
||||
r := make(map[int]int, len(data))
|
||||
for k, v := range data {
|
||||
Id := GoUtil.Int(k)
|
||||
r[Id] = gamedata.GetIntValue(v, "Prob")
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
// 获取场景冲刺奖励
|
||||
func GetSenceJackpotReward(Id int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetSenceJackpotReward err:%v, Id=%d", err, Id)
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Items")
|
||||
}
|
||||
|
||||
// 获取连击快手奖励
|
||||
func GetFastProduceReward(Energy int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_FAST)
|
||||
if err != nil {
|
||||
log.Debug("GetFastProduceReward err:%v, Energy=%d", err, Energy)
|
||||
return nil
|
||||
}
|
||||
if len(data) == 0 {
|
||||
return nil
|
||||
}
|
||||
// Convert map to slice for sorting
|
||||
type sortData struct {
|
||||
Id string
|
||||
Energy float64
|
||||
}
|
||||
sortedList := make([]sortData, 0, len(data))
|
||||
energy := float64(Energy) / 10.0
|
||||
for k, v := range data {
|
||||
dataEnergy := gamedata.GetFloatValue(v, "EnergyValue")
|
||||
sortedList = append(sortedList, sortData{k, math.Abs(energy - dataEnergy)})
|
||||
}
|
||||
// Sort by Energy in ascending order
|
||||
sort.Slice(sortedList, func(i, j int) bool {
|
||||
return sortedList[i].Energy < sortedList[j].Energy
|
||||
})
|
||||
|
||||
return gamedata.GetItemList(data[sortedList[0].Id], "Items")
|
||||
}
|
||||
|
||||
// 获取连击快手最大次数
|
||||
func GetFastProduceMaxTimes() int {
|
||||
Max := 0
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_FAST)
|
||||
if err != nil {
|
||||
log.Debug("GetFastProduceMaxTimes err:%v", err)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
Max = max(gamedata.GetIntValue(v, "Times"), Max)
|
||||
}
|
||||
return Max
|
||||
}
|
||||
|
||||
// 获取进度最大值
|
||||
func GetProgressMax(Lv, Num int) int {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_BONUS)
|
||||
if err != nil {
|
||||
log.Debug("GetProgressMax err:%v, Lv=%d, Num=%d", err, Lv, Num)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
Min := gamedata.GetIntValue(v, "Min")
|
||||
Max := gamedata.GetIntValue(v, "Max")
|
||||
if Lv >= Min && Lv <= Max {
|
||||
OrderNumStr := gamedata.GetStringValue(v, "OrderNum")
|
||||
OrderNum := GoUtil.SplitInt(OrderNumStr, ",")
|
||||
if Num >= len(OrderNum) {
|
||||
return OrderNum[len(OrderNum)-1]
|
||||
} else {
|
||||
return OrderNum[Num]
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetBonusLv(Lv int) int {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_BONUS)
|
||||
if err != nil {
|
||||
log.Debug("GetBonusLv err:%v, Lv=%d", err, Lv)
|
||||
return 0
|
||||
}
|
||||
for k, v := range data {
|
||||
Min := gamedata.GetIntValue(v, "Min")
|
||||
Max := gamedata.GetIntValue(v, "Max")
|
||||
if Lv >= Min && Lv <= Max {
|
||||
return GoUtil.Int(k)
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// 获取进度奖励随机
|
||||
func GetProgressRewardRand(Lv int) map[int]int {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetProgressRewardRand err:%v, Lv=%d", err, Lv)
|
||||
return nil
|
||||
}
|
||||
r := make(map[int]int, len(data))
|
||||
for k, v := range data {
|
||||
if Lv >= gamedata.GetIntValue(v, "BonusLv") {
|
||||
Id := GoUtil.Int(k)
|
||||
r[Id] = gamedata.GetIntValue(v, "Prob")
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetJackpotIdByType(Type int) int {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetJackpotIdByType err:%v, Type=%d", err, Type)
|
||||
return 0
|
||||
}
|
||||
for k, v := range data {
|
||||
Id := GoUtil.Int(k)
|
||||
if Type == gamedata.GetIntValue(v, "Type") {
|
||||
return Id
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// 获取进度选择数量
|
||||
func GetProgressSelectNum(Lv int) int {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_BONUS)
|
||||
if err != nil {
|
||||
log.Debug("GetProgressSelectNum err:%v, Lv=%d", err, Lv)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
Min := gamedata.GetIntValue(v, "Min")
|
||||
Max := gamedata.GetIntValue(v, "Max")
|
||||
if Lv >= Min && Lv <= Max {
|
||||
return gamedata.GetIntValue(v, "Option")
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// 获取进度奖励
|
||||
func GetProgressReward(RewardId int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetProgressReward err:%v, RewardId=%d", err, RewardId)
|
||||
return nil
|
||||
}
|
||||
for k, v := range data {
|
||||
Id := GoUtil.Int(k)
|
||||
if Id == RewardId {
|
||||
return gamedata.GetItemList(v, "Items")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 获取进度奖励类型
|
||||
func GetProgressRewardType(RewardId int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_JACKPOT, RewardId)
|
||||
if err != nil {
|
||||
log.Debug("GetProgressRewardType err:%v, RewardId=%d", err, RewardId)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Type")
|
||||
}
|
||||
|
||||
func GetUnlockLv() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "unlock_lv")
|
||||
if err != nil {
|
||||
log.Debug("GetUnlockLv err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetCatSaleCD() int64 {
|
||||
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Event_Cooldown_7days")
|
||||
if err != nil {
|
||||
log.Debug("GetCatSaleCD err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return int64(gamedata.GetIntValue(data, "Value"))
|
||||
}
|
||||
|
||||
func GetFirstEvent() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "First_Event")
|
||||
if err != nil {
|
||||
log.Debug("GetFirstEvent err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetFastCD() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Fast_Cd")
|
||||
if err != nil {
|
||||
log.Debug("GetFastCD err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetPaybackDay() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "payback_day")
|
||||
if err != nil {
|
||||
log.Debug("GetPaybackDay err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetHighRollerNeedEnergy() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "High_Roller_Need_Energy")
|
||||
if err != nil {
|
||||
log.Debug("GetHighRollerNeedEnergy err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetThiefProb() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Thief_Prob")
|
||||
if err != nil {
|
||||
log.Debug("GetThiefProb err:%v", err)
|
||||
return 0
|
||||
}
|
||||
value := gamedata.GetStringValue(data, "Value")
|
||||
a1 := strings.Split(value, "|")
|
||||
prob := make(map[int]int, len(a1))
|
||||
for _, v := range a1 {
|
||||
a2 := strings.Split(v, ":")
|
||||
prob[GoUtil.Int(a2[0])] = GoUtil.Int(a2[1])
|
||||
}
|
||||
return GoUtil.RandMap(prob)
|
||||
}
|
||||
|
||||
// 招财猫
|
||||
|
||||
func GetMoneyCat(Id int) (float64, int) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_MONEY, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetMoneyCat err:%v, Id=%d", err, Id)
|
||||
return 0.0, 0
|
||||
}
|
||||
return gamedata.GetFloatValue(data, "Mul"), gamedata.GetIntValue(data, "Cd")
|
||||
}
|
||||
|
||||
func GetMoneyCatMax() int {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_MONEY)
|
||||
if err != nil {
|
||||
log.Debug("GetMoneyCatMax err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return len(data)
|
||||
}
|
||||
|
||||
func GetLuckyCatMaxEarning(Remain int) int {
|
||||
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_LUCKY)
|
||||
if err != nil {
|
||||
log.Debug("GetLuckyCatMaxEarning err:%v, Remain=%d", err, Remain)
|
||||
return 0
|
||||
}
|
||||
type d struct {
|
||||
t int
|
||||
e int
|
||||
}
|
||||
l := make([]d, 0, len(data))
|
||||
for k, v := range data {
|
||||
t := GoUtil.Int(k)
|
||||
e := gamedata.GetIntValue(v, "Earn")
|
||||
l = append(l, d{t, e})
|
||||
}
|
||||
sort.Slice(l, func(i, j int) bool {
|
||||
return l[i].t < l[j].t
|
||||
})
|
||||
for _, v := range l {
|
||||
if Remain <= v.t {
|
||||
return v.e
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetCatTrickEnergy() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "CatTrick_ConsumeEnergy")
|
||||
if err != nil {
|
||||
log.Debug("GetCatTrickEnergy err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetCatTrickDiamond() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "CatTrick_RewardDiamond")
|
||||
if err != nil {
|
||||
log.Debug("GetCatTrickDiamond err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetDecorateOffDiscount(AreaId, StepId int) int {
|
||||
data, err := gamedata.GetData(CFG_LIMTTED_TIME_EVENT_DECORATE_OFF)
|
||||
if err != nil {
|
||||
log.Debug("GetDecorateOffDiscount err:%v, AreaId=%d, StepId=%d", err, AreaId, StepId)
|
||||
return 100
|
||||
}
|
||||
for _, v := range data {
|
||||
StartAreaId := gamedata.GetIntValue(v, "StartArea")
|
||||
EndAreaId := gamedata.GetIntValue(v, "EndArea")
|
||||
StartStepId := gamedata.GetIntValue(v, "StartStep")
|
||||
EndStepId := gamedata.GetIntValue(v, "EndStep")
|
||||
if AreaId >= StartAreaId && AreaId <= EndAreaId && StepId >= StartStepId && StepId <= EndStepId {
|
||||
return gamedata.GetIntValue(v, "Off")
|
||||
}
|
||||
}
|
||||
return 100
|
||||
}
|
||||
112
src/server/conf/mail/mail_cfg.go
Normal file
112
src/server/conf/mail/mail_cfg.go
Normal file
@ -0,0 +1,112 @@
|
||||
package mailCfg
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
languageCfg "server/conf/language"
|
||||
"server/game/mod/item"
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
"server/msg"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_LOGIN_BACK = "LoginBack"
|
||||
CFG_MAIL = "Mail"
|
||||
|
||||
MAIL_RECALL_ID = 12
|
||||
MAIL_CHARGE_SEND_ID = 13
|
||||
MAIL_CHARGE_RECEIVE_ID = 14
|
||||
)
|
||||
|
||||
type TriggerMail struct {
|
||||
Id int
|
||||
Title string
|
||||
SubTitle string
|
||||
Content string
|
||||
EnglistTitle string
|
||||
SubTitleEn string
|
||||
EnglistContent string
|
||||
Items []*item.Item
|
||||
Type int
|
||||
Trigger []string
|
||||
}
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_LOGIN_BACK)
|
||||
gamedata.InitCfg(CFG_MAIL)
|
||||
}
|
||||
|
||||
func GetLoginBack(Id string) (int, int) {
|
||||
data, err := gamedata.GetDataByKey(CFG_LOGIN_BACK, Id)
|
||||
if err != nil {
|
||||
return 0, 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Num1"), gamedata.GetIntValue(data, "Num2")
|
||||
}
|
||||
|
||||
func GetTriggerMail() []*TriggerMail {
|
||||
data, err := gamedata.GetData(CFG_MAIL)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
ret := make([]*TriggerMail, 0)
|
||||
for k, v := range data {
|
||||
T := gamedata.GetStringValue(v, "Trigger")
|
||||
if T == "" {
|
||||
continue
|
||||
}
|
||||
T1 := strings.Split(T, "|")
|
||||
if len(T1) < 4 {
|
||||
continue
|
||||
}
|
||||
data := &TriggerMail{
|
||||
Id: GoUtil.Int(k),
|
||||
Title: gamedata.GetStringValue(v, "Title"),
|
||||
Content: gamedata.GetStringValue(v, "Content"),
|
||||
EnglistTitle: gamedata.GetStringValue(v, "EnglistTitle"),
|
||||
EnglistContent: gamedata.GetStringValue(v, "EnglistContent"),
|
||||
Items: gamedata.GetItemList(v, "Items"),
|
||||
Type: gamedata.GetIntValue(v, "Type"),
|
||||
Trigger: strings.Split(T, "|"),
|
||||
}
|
||||
ret = append(ret, data)
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func GetRecallMail(Title, ItemName, TitleEn, ItemNameEn string) (string, string, string, string) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_MAIL, 12)
|
||||
if err != nil {
|
||||
return "", "", "", ""
|
||||
}
|
||||
mt := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Title"))
|
||||
mc := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Content"))
|
||||
mt_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Title"))
|
||||
mc_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Content"))
|
||||
return fmt.Sprintf(mt, Title), fmt.Sprintf(mc, Title, ItemName), fmt.Sprintf(mt_en, TitleEn), fmt.Sprintf(mc_en, Title, ItemNameEn)
|
||||
}
|
||||
|
||||
func GetChargeSendMail(PlayerName string) (string, string, string, string) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_MAIL, MAIL_CHARGE_SEND_ID)
|
||||
if err != nil {
|
||||
return "", "", "", ""
|
||||
}
|
||||
mt := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Title"))
|
||||
mc := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Content"))
|
||||
mt_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Title"))
|
||||
mc_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Content"))
|
||||
return mt, fmt.Sprintf(mc, PlayerName), mt_en, fmt.Sprintf(mc_en, PlayerName)
|
||||
}
|
||||
|
||||
func GetChargeReceiveMail(PlayerName string, Content string) (string, string, string, string) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_MAIL, MAIL_CHARGE_RECEIVE_ID)
|
||||
if err != nil {
|
||||
return "", "", "", ""
|
||||
}
|
||||
mt := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Title"))
|
||||
mc := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Content"))
|
||||
mt_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Title"))
|
||||
mc_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Content"))
|
||||
return fmt.Sprintf(mt, PlayerName), fmt.Sprintf(mc, Content), fmt.Sprintf(mt_en, PlayerName), fmt.Sprintf(mc_en, Content)
|
||||
}
|
||||
@ -1,188 +0,0 @@
|
||||
package mergeDataCfg
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_NAME = "MergeData"
|
||||
CONST_NAME = "MergeDataConst"
|
||||
|
||||
// 棋子类型
|
||||
CHESS_PRODUCT_MAIN_TYPE = 1 // 主产物
|
||||
CHESS_PRODUCT_SUB_TYPE = 2 // 次产物
|
||||
CHESS_PRODUCT_SUB_EMIT_TYPE = 3 // 次发射器产物
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_NAME)
|
||||
gamedata.InitCfg(CONST_NAME)
|
||||
}
|
||||
|
||||
// 获取单个数据
|
||||
func GetOne(Id int) (*gamedata.MergeDataRecord, error) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("MergeDataCfg GetOne Id:%v not found", Id)
|
||||
return &gamedata.MergeDataRecord{}, errors.New("not found")
|
||||
}
|
||||
return &gamedata.MergeDataRecord{
|
||||
Id: gamedata.ParseInt(data["Id"]),
|
||||
Lv: gamedata.ParseInt(data["Lv"]),
|
||||
MaxLv: gamedata.ParseInt(data["MaxLv"]),
|
||||
SellType: gamedata.ParseString(data["SellType"]),
|
||||
SellNum: gamedata.ParseInt(data["SellNum"]),
|
||||
SellDiamond: gamedata.ParseInt(data["SellDiamond"]),
|
||||
Color: gamedata.ParseString(data["Color"]),
|
||||
Star: gamedata.ParseInt(data["Star"]),
|
||||
Type: gamedata.ParseString(data["Type"]),
|
||||
Emit_Product: gamedata.ParseString(data["Emit_Product"]),
|
||||
CoolTime: gamedata.ParseInt(data["CoolTime"]),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// 根据id获取棋子获得的星星
|
||||
func GetStarById(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("MergeDataCfg GetOne Id:%v not found", Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.ParseInt(data["Star"])
|
||||
}
|
||||
|
||||
// 根据等级和颜色获取棋子id
|
||||
func GetChessIdByLvAndColor(Lv int, Color string) int {
|
||||
if Lv == 0 || Color == "" {
|
||||
return 0
|
||||
}
|
||||
data, err := gamedata.GetData(CFG_NAME)
|
||||
if err != nil {
|
||||
log.Debug("MergeDataCfg GetChessIdByLvAndColor lv:%v Color:%v not found", Lv, Color)
|
||||
return 0
|
||||
}
|
||||
for k, v := range data {
|
||||
lv := gamedata.GetIntValue(v, "Lv")
|
||||
color := gamedata.GetStringValue(v, "Color")
|
||||
if Lv == lv && color == Color {
|
||||
Id, _ := strconv.Atoi(k)
|
||||
return Id
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// 根据Id获取棋子等级
|
||||
func GetLvById(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetLvById GetOne Id:%v not found", Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.ParseInt(data["Lv"])
|
||||
}
|
||||
|
||||
// 根据Id获取棋子最大等级
|
||||
func GetMaxLvById(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetMaxLvById GetOne Id:%v not found", Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.ParseInt(data["MaxLv"])
|
||||
}
|
||||
|
||||
// 根据Id获取棋子类型
|
||||
func GetTypeById(Id int) string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetTypeById GetOne Id:%v not found", Id)
|
||||
return ""
|
||||
}
|
||||
return gamedata.ParseString(data["Type"])
|
||||
}
|
||||
|
||||
// 根据Id获取棋子类型
|
||||
func GetColorById(Id int) string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetColorById GetOne Id:%v not found", Id)
|
||||
return ""
|
||||
}
|
||||
return gamedata.ParseString(data["Color"])
|
||||
}
|
||||
|
||||
// 根据Id获取发射器产出类型
|
||||
func GetEmitProduceType(Id int) []string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetTypeById GetOne Id:%v not found", Id)
|
||||
return []string{}
|
||||
}
|
||||
return strings.Split(gamedata.ParseString(data["Emit_Product"]), ",")
|
||||
}
|
||||
|
||||
// 根据Id获取发射器Id
|
||||
func GetEmitId(Id int) string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetTypeById GetOne Id:%v not found", Id)
|
||||
return ""
|
||||
}
|
||||
return gamedata.ParseString(data["Emit_ID"])
|
||||
}
|
||||
|
||||
// 获取常量
|
||||
func GetConst(Key string) string {
|
||||
data, err := gamedata.GetDataByKey(CONST_NAME, Key)
|
||||
if err != nil {
|
||||
log.Debug("GetConst GetOne Id:%s not found", Key)
|
||||
return ""
|
||||
}
|
||||
return gamedata.ParseString(data["Value"])
|
||||
}
|
||||
|
||||
// 获取常量
|
||||
func GetConstInt(Key string) int {
|
||||
data, err := gamedata.GetDataByKey(CONST_NAME, Key)
|
||||
if err != nil {
|
||||
log.Debug("GetConst GetOne Id:%s not found", Key)
|
||||
return 0
|
||||
}
|
||||
return gamedata.ParseInt(data["Value"])
|
||||
}
|
||||
|
||||
func GetExtraEmitId() map[string]struct{} {
|
||||
Value := GetConst("EmitId_Extra_Order")
|
||||
arr := strings.Split(Value, ",")
|
||||
var r = make(map[string]struct{})
|
||||
for _, v := range arr {
|
||||
r[v] = struct{}{}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetProductType(Chess int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Chess)
|
||||
if err != nil {
|
||||
log.Debug("GetProductType GetOne Id:%v not found", Chess)
|
||||
return 0
|
||||
}
|
||||
return gamedata.ParseInt(data["PType"])
|
||||
}
|
||||
|
||||
func GetChessBagMaxGrid() int {
|
||||
return GetConstInt("chess_bag_max")
|
||||
}
|
||||
|
||||
func GetChessBagBugNum() int {
|
||||
return GetConstInt("chess_bag_buy")
|
||||
}
|
||||
|
||||
func GetChessBagInitNum() int {
|
||||
return GetConstInt("chess_bag_init")
|
||||
}
|
||||
619
src/server/conf/merge_data/merge_data_cfg.go
Normal file
619
src/server/conf/merge_data/merge_data_cfg.go
Normal file
@ -0,0 +1,619 @@
|
||||
package mergeDataCfg
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"server/game/mod/item"
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_NAME = "MergeData"
|
||||
CONST_NAME = "MergeDataConst"
|
||||
CFG_MERGE_EMIT = "MergeDataEmit"
|
||||
|
||||
// 棋子类型
|
||||
CHESS_PRODUCT_MAIN_TYPE = 1 // 主产物
|
||||
CHESS_PRODUCT_SECONDARY_TYPE = 2 // 次产物
|
||||
CHESS_PRODUCT_SUB_TYPE = 3 // 子发射器产物
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_NAME)
|
||||
gamedata.InitCfg(CONST_NAME)
|
||||
gamedata.InitCfg(CFG_MERGE_EMIT)
|
||||
}
|
||||
|
||||
func GetEmitTypeByColor(Color string) string {
|
||||
data, err := gamedata.GetData(CFG_MERGE_EMIT)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
for k, v := range data {
|
||||
ColorList := strings.Split(gamedata.GetStringValue(v, "Order_Type"), ",")
|
||||
if GoUtil.InStringArray(Color, ColorList) {
|
||||
return k
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func GetEmitProduce(EmitType string) []string {
|
||||
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, EmitType)
|
||||
if err != nil {
|
||||
log.Debug("GetEmitProduce GetOne EmitType:%s not found", EmitType)
|
||||
return []string{}
|
||||
}
|
||||
return strings.Split(gamedata.GetStringValue(data, "Product_Type"), ",")
|
||||
}
|
||||
|
||||
func GetEmitOrderProduce(EmitType string) []string {
|
||||
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, EmitType)
|
||||
if err != nil {
|
||||
log.Debug("GetEmitProduce GetOne EmitType:%s not found", EmitType)
|
||||
return []string{}
|
||||
}
|
||||
return strings.Split(gamedata.GetStringValue(data, "Order_Type"), ",")
|
||||
}
|
||||
|
||||
// 获取单个数据
|
||||
func GetOne(Id int) (*gamedata.MergeDataRecord, error) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("MergeDataCfg GetOne Id:%v not found", Id)
|
||||
return &gamedata.MergeDataRecord{}, errors.New("not found")
|
||||
}
|
||||
return &gamedata.MergeDataRecord{
|
||||
Id: gamedata.GetIntValue(data, "Id"),
|
||||
Lv: gamedata.GetIntValue(data, "Lv"),
|
||||
MaxLv: gamedata.GetIntValue(data, "MaxLv"),
|
||||
SellType: gamedata.GetStringValue(data, "SellType"),
|
||||
SellNum: gamedata.GetIntValue(data, "SellNum"),
|
||||
SellDiamond: gamedata.GetIntValue(data, "SellDiamond"),
|
||||
Color: gamedata.GetStringValue(data, "Color"),
|
||||
Star: gamedata.GetIntValue(data, "Star"),
|
||||
Type: gamedata.GetStringValue(data, "Type"),
|
||||
Emit_Product: gamedata.GetStringValue(data, "Emit_Product"),
|
||||
CoolTime: gamedata.GetIntValue(data, "CoolTime"),
|
||||
Emit_Type: gamedata.GetStringValue(data, "Emit_Type"),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// 根据id获取棋子获得的星星
|
||||
func GetStarById(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("MergeDataCfg GetOne Id:%v not found", Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Star")
|
||||
}
|
||||
|
||||
func GetNameById(Id int) string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("MergeDataCfg GetOne Id:%v not found", Id)
|
||||
return ""
|
||||
}
|
||||
return gamedata.GetStringValue(data, "Title")
|
||||
}
|
||||
|
||||
// 根据等级和颜色获取棋子id
|
||||
func GetChessIdByLvAndColor(Lv int, Color string) int {
|
||||
if Lv == 0 || Color == "" {
|
||||
return 0
|
||||
}
|
||||
data, err := gamedata.GetData(CFG_NAME)
|
||||
if err != nil {
|
||||
// log.Debug("MergeDataCfg GetChessIdByLvAndColor lv:%v Color:%v not found", Lv, Color)
|
||||
return 0
|
||||
}
|
||||
for k, v := range data {
|
||||
lv := gamedata.GetIntValue(v, "Lv")
|
||||
color := gamedata.GetStringValue(v, "Color")
|
||||
if Lv == lv && color == Color {
|
||||
Id, _ := strconv.Atoi(k)
|
||||
return Id
|
||||
}
|
||||
}
|
||||
// log.Debug("MergeDataCfg GetChessIdByLvAndColor lv:%v Color:%v not found", Lv, Color)
|
||||
return 0
|
||||
}
|
||||
|
||||
// 根据Id获取棋子等级
|
||||
func GetLvById(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
//log.Debug("GetLvById GetOne Id:%v not found", Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Lv")
|
||||
}
|
||||
|
||||
// 根据Id获取棋子最大等级
|
||||
func GetMaxLvById(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
// log.Debug("GetMaxLvById GetOne Id:%v not found", Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "MaxLv")
|
||||
}
|
||||
|
||||
// 根据Id获取棋子最大等级
|
||||
func GetMaxLvByColor(Color string) int {
|
||||
ChessId := GetChessIdByLvAndColor(1, Color)
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, ChessId)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "MaxLv")
|
||||
}
|
||||
|
||||
// 根据Id获取发射器最小等级
|
||||
func GetEmitMinLvById(Id string) int {
|
||||
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id)
|
||||
if err != nil {
|
||||
// log.Debug("GetEmitMinLvById GetOne Id:%v not found", Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Emit_Min_Lv")
|
||||
}
|
||||
|
||||
// 根据Id获取发射器修正系数
|
||||
func GetEmitRatio(Id string) float64 {
|
||||
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id)
|
||||
if err != nil {
|
||||
// log.Debug("GetEmitRatio GetOne Id:%v not found", Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetFloatValue(data, "Ratio")
|
||||
}
|
||||
|
||||
func GetEmitRetire(Id string) int {
|
||||
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetEmitRetire GetOne Id:%v not found", Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Retire")
|
||||
}
|
||||
|
||||
func GetEmitProductNumByColor(Id string) int {
|
||||
data, err := gamedata.GetData(CFG_MERGE_EMIT)
|
||||
if err != nil {
|
||||
log.Debug("GetEmitProductNumByColor GetOne Id:%v not found", Id)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
ColorList := strings.Split(gamedata.GetStringValue(v, "Product_Type"), ",")
|
||||
if GoUtil.InStringArray(Id, ColorList) {
|
||||
return len(strings.Split(gamedata.GetStringValue(v, "Product_Type"), ","))
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// 根据Id获取棋子类型
|
||||
func GetTypeById(Id int) string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetTypeById GetOne Id:%v not found", Id)
|
||||
return ""
|
||||
}
|
||||
return gamedata.GetStringValue(data, "Type")
|
||||
}
|
||||
|
||||
// 根据Id获取棋子类型
|
||||
func GetColorById(Id int) string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetColorById GetOne Id:%v not found", Id)
|
||||
return ""
|
||||
}
|
||||
return gamedata.GetStringValue(data, "Color")
|
||||
}
|
||||
|
||||
// 根据Id获取棋子类型
|
||||
func GetSellNumById(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetSellNumById GetOne Id:%v not found", Id)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "SellNum")
|
||||
}
|
||||
|
||||
// 根据Id获取发射器产出类型
|
||||
func GetEmitProduceType(Id int) []string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetEmitProduceType GetOne Id:%v not found", Id)
|
||||
return []string{}
|
||||
}
|
||||
|
||||
return strings.Split(gamedata.GetStringValue(data, "Emit_Product"), ",")
|
||||
}
|
||||
|
||||
// 根据Id获取发射器产出类型
|
||||
func GetEmitProduceChessType(Id int) []string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
//log.Debug("GetEmitProduceChessType GetOne Id:%v not found", Id)
|
||||
return []string{}
|
||||
}
|
||||
|
||||
value := gamedata.GetStringValue(data, "Product_Type")
|
||||
if value == "" {
|
||||
return []string{}
|
||||
}
|
||||
return strings.Split(value, ",")
|
||||
}
|
||||
|
||||
// 根据Id获取发射器Id
|
||||
func GetEmitId(Id int) string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
// log.Debug("GetEmitId GetOne Id:%v not found", Id)
|
||||
return ""
|
||||
}
|
||||
|
||||
return gamedata.GetStringValue(data, "Emit_ID")
|
||||
}
|
||||
|
||||
func GetAllId() []int {
|
||||
data, err := gamedata.GetData(CFG_NAME)
|
||||
if err != nil {
|
||||
return []int{}
|
||||
}
|
||||
key := make([]int, 0, len(data))
|
||||
for k := range data {
|
||||
key = append(key, GoUtil.Int(k))
|
||||
}
|
||||
return key
|
||||
}
|
||||
|
||||
func GetEmitType(Id int) string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetEmitType GetOne Id:%v not found", Id)
|
||||
return ""
|
||||
}
|
||||
|
||||
return gamedata.GetStringValue(data, "Emit_Type")
|
||||
}
|
||||
|
||||
func GetEmitN(EmitSeries string) int {
|
||||
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, EmitSeries)
|
||||
if err != nil {
|
||||
log.Debug("GetEmitN GetOne EmitSeries:%v not found", EmitSeries)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "N")
|
||||
}
|
||||
|
||||
// 获取常量
|
||||
func GetConst(Key string) string {
|
||||
data, err := gamedata.GetDataByKey(CONST_NAME, Key)
|
||||
if err != nil {
|
||||
log.Debug("GetConst GetOne Id:%s not found", Key)
|
||||
return ""
|
||||
}
|
||||
|
||||
return gamedata.GetStringValue(data, "Value")
|
||||
}
|
||||
|
||||
// 获取常量
|
||||
func GetConstInt(Key string) int {
|
||||
data, err := gamedata.GetDataByKey(CONST_NAME, Key)
|
||||
if err != nil {
|
||||
log.Debug("GetConst GetOne Id:%s not found", Key)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetExtraEmitId() map[string]struct{} {
|
||||
Value := GetConst("EmitId_Extra_Order")
|
||||
arr := strings.Split(Value, ",")
|
||||
var r = make(map[string]struct{})
|
||||
for _, v := range arr {
|
||||
r[v] = struct{}{}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetChessBagMaxGrid() int {
|
||||
return GetConstInt("chess_bag_max")
|
||||
}
|
||||
|
||||
func GetChessBagBugNum() int {
|
||||
return GetConstInt("chess_bag_buy")
|
||||
}
|
||||
|
||||
func GetChessBagInitNum() int {
|
||||
return GetConstInt("chess_bag_init")
|
||||
}
|
||||
|
||||
func GetSourceChestItem() []*item.Item {
|
||||
data, err := gamedata.GetDataByKey(CONST_NAME, "source_chest_reward")
|
||||
if err != nil {
|
||||
log.Debug("GetSourceChestItem GetOne not found")
|
||||
return nil
|
||||
}
|
||||
|
||||
Str := gamedata.GetStringValue(data, "Value")
|
||||
A1 := strings.Split(Str, "|")
|
||||
var r []*item.Item
|
||||
if len(A1) < 2 {
|
||||
return r
|
||||
}
|
||||
A2 := strings.Split(A1[0], "/")
|
||||
A3 := GoUtil.StringToInt(A2)
|
||||
A4 := GoUtil.RandSlice(A3)
|
||||
r = append(r, item.NewItem(item.ITEM_DIAMOND_ID, A4))
|
||||
|
||||
B2 := strings.Split(A1[1], "/")
|
||||
B3 := GoUtil.StringToInt(B2)
|
||||
B4 := GoUtil.RandSlice(B3)
|
||||
r = append(r, item.NewItem(item.ITEM_ENERGY_ID, B4))
|
||||
return r
|
||||
}
|
||||
|
||||
func GetHighSourceChestItem() []*item.Item {
|
||||
data, err := gamedata.GetDataByKey(CONST_NAME, "high_source_chest_reward")
|
||||
if err != nil {
|
||||
log.Debug("GetHighSourceChestItem GetOne not found")
|
||||
return nil
|
||||
}
|
||||
Str := gamedata.GetStringValue(data, "Value")
|
||||
A1 := strings.Split(Str, "|")
|
||||
var r []*item.Item
|
||||
if len(A1) < 2 {
|
||||
return r
|
||||
}
|
||||
A2 := strings.Split(A1[0], "/")
|
||||
A3 := GoUtil.StringToInt(A2)
|
||||
A4 := GoUtil.RandSlice(A3)
|
||||
r = append(r, item.NewItem(item.ITEM_DIAMOND_ID, A4))
|
||||
|
||||
B2 := strings.Split(A1[1], "/")
|
||||
B3 := GoUtil.StringToInt(B2)
|
||||
B4 := GoUtil.RandSlice(B3)
|
||||
r = append(r, item.NewItem(item.ITEM_ENERGY_ID, B4))
|
||||
return r
|
||||
}
|
||||
|
||||
func GetRetireReward() []*item.Item {
|
||||
data, err := gamedata.GetDataByKey(CONST_NAME, "retire_reward")
|
||||
if err != nil {
|
||||
log.Debug("GetRetireReward GetOne not found")
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Value")
|
||||
}
|
||||
|
||||
func DynamicLevRev(Lv int, EmitId int, Color string) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
|
||||
if err != nil {
|
||||
// log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
|
||||
return Lv
|
||||
}
|
||||
DynamicLv := gamedata.GetStringValue(data, "Dynamic")
|
||||
if DynamicLv == "" {
|
||||
return Lv
|
||||
}
|
||||
Arr := strings.Split(DynamicLv, ",")
|
||||
for _, v := range Arr {
|
||||
Arr2 := strings.Split(v, "=")
|
||||
if len(Arr2) != 2 {
|
||||
continue
|
||||
}
|
||||
if Color == Arr2[0] {
|
||||
NewLv, _ := strconv.Atoi(Arr2[1])
|
||||
return Lv + NewLv
|
||||
}
|
||||
}
|
||||
return Lv
|
||||
}
|
||||
func DynamicLev(Lv int, EmitId int, Color string) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
|
||||
if err != nil {
|
||||
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
|
||||
return Lv
|
||||
}
|
||||
DynamicLv := gamedata.GetStringValue(data, "Dynamic")
|
||||
if DynamicLv == "" {
|
||||
return Lv
|
||||
}
|
||||
Arr := strings.Split(DynamicLv, ",")
|
||||
for _, v := range Arr {
|
||||
Arr2 := strings.Split(v, "=")
|
||||
if len(Arr2) != 2 {
|
||||
continue
|
||||
}
|
||||
if Color == Arr2[0] {
|
||||
NewLv, _ := strconv.Atoi(Arr2[1])
|
||||
return Lv - NewLv
|
||||
}
|
||||
}
|
||||
return Lv
|
||||
}
|
||||
func DynamicLev2(Lv int, EmitId int, Color1 string, Color2 string) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
|
||||
if err != nil {
|
||||
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
|
||||
return Lv
|
||||
}
|
||||
DynamicLv := gamedata.GetStringValue(data, "Dynamic")
|
||||
if DynamicLv == "" {
|
||||
return Lv
|
||||
}
|
||||
Arr := strings.Split(DynamicLv, ",")
|
||||
BaseLv := Lv
|
||||
for _, v := range Arr {
|
||||
Arr2 := strings.Split(v, "=")
|
||||
if len(Arr2) != 2 {
|
||||
continue
|
||||
}
|
||||
if Color1 == Arr2[0] {
|
||||
NewLv, _ := strconv.Atoi(Arr2[1])
|
||||
BaseLv = Lv + NewLv
|
||||
}
|
||||
}
|
||||
for _, v := range Arr {
|
||||
Arr2 := strings.Split(v, "=")
|
||||
if len(Arr2) != 2 {
|
||||
continue
|
||||
}
|
||||
if Color2 == Arr2[0] {
|
||||
NewLv, _ := strconv.Atoi(Arr2[1])
|
||||
return BaseLv - NewLv
|
||||
}
|
||||
}
|
||||
return Lv
|
||||
}
|
||||
|
||||
func DynamicAdjust(EmitId int, Color string, EnergyMul int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
|
||||
if err != nil {
|
||||
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
|
||||
return 0
|
||||
}
|
||||
DynamicLv := ""
|
||||
switch EnergyMul {
|
||||
case 0:
|
||||
DynamicLv = gamedata.GetStringValue(data, "Dynamic")
|
||||
case 1, 2:
|
||||
DynamicLv = gamedata.GetStringValue(data, "Dynamic1")
|
||||
case 3, 4:
|
||||
DynamicLv = gamedata.GetStringValue(data, "Dynamic2")
|
||||
default:
|
||||
DynamicLv = gamedata.GetStringValue(data, "Dynamic3")
|
||||
}
|
||||
|
||||
if DynamicLv == "" {
|
||||
return 0
|
||||
}
|
||||
Arr := strings.Split(DynamicLv, ",")
|
||||
for _, v := range Arr {
|
||||
Arr2 := strings.Split(v, "=")
|
||||
if len(Arr2) != 2 {
|
||||
continue
|
||||
}
|
||||
if Color == Arr2[0] {
|
||||
NewLv, _ := strconv.Atoi(Arr2[1])
|
||||
return NewLv
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetAdjust(EmitId int, Color string, EnergyMul int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
|
||||
if err != nil {
|
||||
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
|
||||
return 0
|
||||
}
|
||||
AdjustLv := ""
|
||||
switch EnergyMul {
|
||||
case 0:
|
||||
AdjustLv = gamedata.GetStringValue(data, "Dynamic")
|
||||
case 1, 2:
|
||||
AdjustLv = gamedata.GetStringValue(data, "Dynamic1")
|
||||
case 3, 4:
|
||||
AdjustLv = gamedata.GetStringValue(data, "Dynamic2")
|
||||
default:
|
||||
AdjustLv = gamedata.GetStringValue(data, "Dynamic3")
|
||||
}
|
||||
if AdjustLv == "" {
|
||||
return 0
|
||||
}
|
||||
Arr := strings.Split(AdjustLv, ",")
|
||||
for _, v := range Arr {
|
||||
Arr2 := strings.Split(v, "=")
|
||||
if len(Arr2) != 2 {
|
||||
continue
|
||||
}
|
||||
if Color == Arr2[0] {
|
||||
NewLv, _ := strconv.Atoi(Arr2[1])
|
||||
return NewLv
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetSellDiamondMul(EmitId int, Color string) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
|
||||
if err != nil {
|
||||
log.Debug("GetSellDiamondMul GetOne EmitId:%v not found", EmitId)
|
||||
return 0
|
||||
}
|
||||
ProductEmit := gamedata.GetStringValue(data, "Emit_Product")
|
||||
if ProductEmit == "" {
|
||||
return 1
|
||||
}
|
||||
Arr := strings.Split(ProductEmit, ",")
|
||||
if Color == Arr[0] {
|
||||
return 1
|
||||
}
|
||||
if !GoUtil.InStringArray(Color, Arr) {
|
||||
return 1
|
||||
}
|
||||
Emit_List := gamedata.GetStringValue(data, "Emit_List")
|
||||
MainProb := getColorProb(Emit_List, Arr[0])
|
||||
SubProb := getColorProb(Emit_List, Color)
|
||||
return int(MainProb / SubProb)
|
||||
}
|
||||
|
||||
func getColorProb(Emit_List string, Color string) float64 {
|
||||
Arr := strings.Split(Emit_List, ",")
|
||||
Prob := 0.0
|
||||
for _, v := range Arr {
|
||||
Arr2 := strings.Split(v, "=")
|
||||
A1 := GoUtil.Int(Arr2[0])
|
||||
A2, _ := strconv.ParseFloat(Arr2[1], 64)
|
||||
A1Color := GetColorById(A1)
|
||||
if A1Color != Color {
|
||||
continue
|
||||
}
|
||||
Prob += A2 * float64(A1%10)
|
||||
}
|
||||
return Prob
|
||||
}
|
||||
|
||||
func GetMergeStar(MergeList []int) int {
|
||||
Star := 0
|
||||
for _, v := range MergeList {
|
||||
Star += GetStarById(v)
|
||||
}
|
||||
return Star
|
||||
}
|
||||
|
||||
func GetAllChessBySeries(Series string) []int {
|
||||
data, err := gamedata.GetData(CFG_NAME)
|
||||
ProductList := GetEmitProduce(Series)
|
||||
if err != nil {
|
||||
return []int{}
|
||||
}
|
||||
var r []int
|
||||
for k, v := range data {
|
||||
Type := gamedata.GetStringValue(v, "Type")
|
||||
if Type == "Emitter" {
|
||||
EmitId := gamedata.GetStringValue(v, "Emit_ID")
|
||||
if EmitId == Series {
|
||||
r = append(r, GoUtil.Int(k))
|
||||
}
|
||||
}
|
||||
if Type == "Product" {
|
||||
Color := gamedata.GetStringValue(v, "Color")
|
||||
if GoUtil.InStringArray(Color, ProductList) {
|
||||
r = append(r, GoUtil.Int(k))
|
||||
}
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
130
src/server/conf/mining/mining_cfg.go
Normal file
130
src/server/conf/mining/mining_cfg.go
Normal file
@ -0,0 +1,130 @@
|
||||
package miningCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_MINING_TEMPLATE = "MiningTemplate"
|
||||
CFG_MINING_JACKPOT = "MiningJackpot"
|
||||
CFG_MINING_GEM = "MiningGem"
|
||||
CFG_MINING_PASS = "MiningPass"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_MINING_TEMPLATE)
|
||||
gamedata.InitCfg(CFG_MINING_JACKPOT)
|
||||
gamedata.InitCfg(CFG_MINING_GEM)
|
||||
gamedata.InitCfg(CFG_MINING_PASS)
|
||||
}
|
||||
|
||||
func GetTemplate(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_MINING_TEMPLATE, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Template")
|
||||
}
|
||||
|
||||
func GetActivityItemId(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_MINING_TEMPLATE, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "ItemId")
|
||||
}
|
||||
|
||||
func GetLoseItem(Id int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_MINING_TEMPLATE, Id)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "ItemCost")
|
||||
}
|
||||
|
||||
func GetStartItemNum(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_MINING_TEMPLATE, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "StartItemNum")
|
||||
}
|
||||
|
||||
func GetPassArea(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_MINING_PASS, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
Area := gamedata.GetStringValue(data, "Area")
|
||||
strArr := strings.Split(Area, "*")
|
||||
a, _ := strconv.Atoi(strArr[0])
|
||||
b, _ := strconv.Atoi(strArr[1])
|
||||
return a * b
|
||||
}
|
||||
|
||||
func GetPassGem(Id int) []int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_MINING_PASS, Id)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
Gem := gamedata.GetStringValue(data, "Gem")
|
||||
strArr := strings.Split(Gem, "|")
|
||||
result := make([]int, 0, len(strArr))
|
||||
for _, v := range strArr {
|
||||
a, _ := strconv.Atoi(v)
|
||||
result = append(result, a)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func GetRandItem() []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_MINING_JACKPOT)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
ProbMap := make(map[int]int)
|
||||
for k, v := range data {
|
||||
Id := GoUtil.Int(k)
|
||||
ProbMap[Id] = gamedata.GetIntValue(v, "Prob")
|
||||
}
|
||||
RandId := GoUtil.RandMap(ProbMap)
|
||||
Info, _ := gamedata.GetDataByIntKey(CFG_MINING_JACKPOT, RandId)
|
||||
return gamedata.GetItemList(Info, "Items")
|
||||
}
|
||||
|
||||
func GetPassItem(Id int, orderFactor int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_MINING_PASS, Id)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
items := gamedata.GetItemList(data, "Items")
|
||||
starReward := gamedata.GetIntValue(data, "StarReward")
|
||||
var starnum int
|
||||
if starReward > 0 {
|
||||
starnum = int((float64(starReward) * float64(orderFactor) / 500)) * 5
|
||||
if starnum > 0 {
|
||||
items = append(items, &item.Item{
|
||||
Id: item.ITEM_STAR_ID,
|
||||
Num: starnum,
|
||||
})
|
||||
}
|
||||
}
|
||||
return items
|
||||
}
|
||||
|
||||
func GetPassItemList(orderFactor int) map[int][]*item.Item {
|
||||
data, err := gamedata.GetData(CFG_MINING_PASS)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
result := make(map[int][]*item.Item)
|
||||
for k := range data {
|
||||
Id := GoUtil.Int(k)
|
||||
result[Id] = GetPassItem(Id, orderFactor)
|
||||
}
|
||||
return result
|
||||
}
|
||||
43
src/server/conf/notification/notification_cfg.go
Normal file
43
src/server/conf/notification/notification_cfg.go
Normal file
@ -0,0 +1,43 @@
|
||||
package notification_cfg
|
||||
|
||||
import "server/gamedata"
|
||||
|
||||
const (
|
||||
CFG_NOTIFICATION = "Notification"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_NOTIFICATION)
|
||||
}
|
||||
|
||||
func GetFriendApplyNotificationCooldown() int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NOTIFICATION, 2)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Cooldown")
|
||||
}
|
||||
|
||||
func GetPetroomGameNotificationCooldown() (int, int) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NOTIFICATION, 1)
|
||||
if err != nil {
|
||||
return 0, 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Cooldown"), gamedata.GetIntValue(data, "DailyLimit")
|
||||
}
|
||||
|
||||
func GetPetroomGameNotificationMsg() (string, string) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NOTIFICATION, 1)
|
||||
if err != nil {
|
||||
return "", ""
|
||||
}
|
||||
return gamedata.GetStringValue(data, "TitleKey"), gamedata.GetStringValue(data, "InfoKey")
|
||||
}
|
||||
|
||||
func GetFriendApplyNotificationMsg() (string, string) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NOTIFICATION, 2)
|
||||
if err != nil {
|
||||
return "", ""
|
||||
}
|
||||
return gamedata.GetStringValue(data, "TitleKey"), gamedata.GetStringValue(data, "InfoKey")
|
||||
}
|
||||
@ -1,38 +0,0 @@
|
||||
package orderCfg
|
||||
|
||||
import (
|
||||
"server/gamedata"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_ORDER_DATA = "OrderData"
|
||||
CFG_ORDER_CHESS_DATA = "OrderChessData"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_ORDER_DATA)
|
||||
gamedata.InitCfg(CFG_ORDER_CHESS_DATA)
|
||||
}
|
||||
|
||||
func GetLvMin(EnergyMul int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_ORDER_DATA, EnergyMul)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "LvMin")
|
||||
}
|
||||
|
||||
func GetLvMax(EnergyMul, N int) int {
|
||||
if v, ok := gamedata.G_AllConfigsJsonData["OrderChessData"]; ok {
|
||||
data := v.GetData()
|
||||
for _, v := range data {
|
||||
dEnergy := gamedata.GetIntValue(v, "EnergyMul")
|
||||
Min := gamedata.GetIntValue(v, "MinN")
|
||||
Max := gamedata.GetIntValue(v, "MaxN")
|
||||
if dEnergy == EnergyMul && N >= Min && N <= Max {
|
||||
return gamedata.GetIntValue(v, "MaxLv")
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
190
src/server/conf/order/order_cfg.go
Normal file
190
src/server/conf/order/order_cfg.go
Normal file
@ -0,0 +1,190 @@
|
||||
package orderCfg
|
||||
|
||||
import (
|
||||
"math"
|
||||
"server/gamedata"
|
||||
"sort"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_ORDER_DATA = "OrderData"
|
||||
CFG_ORDER_CHESS_DATA = "OrderChessData"
|
||||
CFG_ORDER_NUM_DATA = "OrderNumData"
|
||||
CFG_START_ORDER = "StartOrder"
|
||||
CFG_CONST = "OrderConst"
|
||||
CFG_ORDER_SCENE = "OrderScene"
|
||||
CFG_ORDER_K = "OrderK"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_ORDER_DATA)
|
||||
gamedata.InitCfg(CFG_ORDER_CHESS_DATA)
|
||||
gamedata.InitCfg(CFG_ORDER_NUM_DATA)
|
||||
gamedata.InitCfg(CFG_START_ORDER)
|
||||
gamedata.InitCfg(CFG_CONST)
|
||||
gamedata.InitCfg(CFG_ORDER_SCENE)
|
||||
gamedata.InitCfg(CFG_ORDER_K)
|
||||
}
|
||||
|
||||
func GetOrderK(Lv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_ORDER_K, Lv)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
Energy := gamedata.GetIntValue(data, "Energy")
|
||||
K := gamedata.GetFloatValue(data, "K")
|
||||
return int(math.Round(float64(Energy)*K/10) * 10)
|
||||
}
|
||||
|
||||
func GetOrderFactor(Scene int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_ORDER_SCENE, Scene)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Factor")
|
||||
}
|
||||
|
||||
func GetEmitExtraOrder() string {
|
||||
data, err := gamedata.GetDataByKey(CFG_CONST, "EmitId_Extra_Order")
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return gamedata.GetStringValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetLvMin(EnergyMul int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_ORDER_DATA, EnergyMul)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "LvMin")
|
||||
}
|
||||
|
||||
func GetLvMax(EnergyMul, N int) int {
|
||||
data, err := gamedata.GetData(CFG_ORDER_CHESS_DATA)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
dEnergy := gamedata.GetIntValue(v, "EnergyMul")
|
||||
Min := gamedata.GetIntValue(v, "MinN")
|
||||
Max := gamedata.GetIntValue(v, "MaxN")
|
||||
if dEnergy == EnergyMul {
|
||||
if N >= Min && N <= Max {
|
||||
return gamedata.GetIntValue(v, "MaxLv")
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetOrderNum(Level int) int {
|
||||
data, err := gamedata.GetData(CFG_ORDER_NUM_DATA)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
Min := gamedata.GetIntValue(v, "Min")
|
||||
Max := gamedata.GetIntValue(v, "Max")
|
||||
if Level >= Min && Level <= Max {
|
||||
return gamedata.GetIntValue(v, "Num")
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetStartOrderInfo(Id int) (int, int) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_START_ORDER, Id)
|
||||
if err != nil {
|
||||
return -1, -1
|
||||
}
|
||||
return gamedata.GetIntValue(data, "group"), gamedata.GetIntValue(data, "step")
|
||||
}
|
||||
|
||||
func GetStartOrderList() []*gamedata.StartOrderData {
|
||||
data, err := gamedata.GetData(CFG_START_ORDER)
|
||||
if err != nil {
|
||||
return []*gamedata.StartOrderData{}
|
||||
}
|
||||
ret := make([]*gamedata.StartOrderData, 0, len(data))
|
||||
for k, v := range data {
|
||||
OrderId, _ := strconv.Atoi(k)
|
||||
ret = append(ret, &gamedata.StartOrderData{
|
||||
Id: OrderId,
|
||||
MergeList: gamedata.GetIntSliceValue(v, "merge_id_list"),
|
||||
Appear: gamedata.GetStringValue(v, "appear"),
|
||||
Preview: gamedata.GetStringValue(v, "preview"),
|
||||
Items: gamedata.GetItemList(v, "reward"),
|
||||
Group: gamedata.GetIntValue(v, "group"),
|
||||
Step: gamedata.GetIntValue(v, "step"),
|
||||
})
|
||||
}
|
||||
sort.Slice(ret, func(i, j int) bool {
|
||||
return ret[i].Id < ret[j].Id
|
||||
})
|
||||
return ret
|
||||
}
|
||||
|
||||
func GetStartOrderByStep(id int) []*gamedata.StartOrderData {
|
||||
data, err := gamedata.GetData(CFG_START_ORDER)
|
||||
if err != nil {
|
||||
return []*gamedata.StartOrderData{}
|
||||
}
|
||||
ret := make([]*gamedata.StartOrderData, len(data))
|
||||
for k, v := range data {
|
||||
stepVal := gamedata.GetIntValue(v, "step")
|
||||
if int(stepVal) == id {
|
||||
OrderId, _ := strconv.Atoi(k)
|
||||
ret = append(ret, &gamedata.StartOrderData{
|
||||
Id: OrderId,
|
||||
Step: int(stepVal),
|
||||
MergeList: gamedata.GetIntSliceValue(v, "merge_id_list"),
|
||||
})
|
||||
}
|
||||
}
|
||||
sort.Slice(ret, func(i, j int) bool {
|
||||
return ret[i].Id < ret[j].Id
|
||||
})
|
||||
return ret
|
||||
}
|
||||
|
||||
func GetStartOrderById(id int) *gamedata.StartOrderData {
|
||||
data, err := gamedata.GetData(CFG_START_ORDER)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
v, ok := data[strconv.Itoa(id)]
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
stepVal := gamedata.GetIntValue(v, "step")
|
||||
return &gamedata.StartOrderData{
|
||||
Id: id,
|
||||
Step: int(stepVal),
|
||||
MergeList: gamedata.GetIntSliceValue(v, "merge_id_list"),
|
||||
}
|
||||
}
|
||||
|
||||
func GetMaxStep() int {
|
||||
data, err := gamedata.GetData(CFG_START_ORDER)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
max := 0
|
||||
for _, v := range data {
|
||||
stepVal := gamedata.GetIntValue(v, "step")
|
||||
if int(stepVal) > max {
|
||||
max = int(stepVal)
|
||||
}
|
||||
}
|
||||
return max
|
||||
}
|
||||
|
||||
func GetOrderType(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_START_ORDER, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "type")
|
||||
}
|
||||
122
src/server/conf/pass/pass_cfg.go
Normal file
122
src/server/conf/pass/pass_cfg.go
Normal file
@ -0,0 +1,122 @@
|
||||
package passCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
"slices"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_PASS_TEMPLATE = "PassTemplate"
|
||||
CFG_PASS = "Pass"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_PASS_TEMPLATE)
|
||||
gamedata.InitCfg(CFG_PASS)
|
||||
}
|
||||
|
||||
func GetTemplate(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Template")
|
||||
}
|
||||
|
||||
func GetActivityItemId(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "ItemId")
|
||||
}
|
||||
|
||||
func GetLowChargeId(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "LowChargeId")
|
||||
}
|
||||
|
||||
func GetHighChargeId(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "HighChargeId")
|
||||
}
|
||||
|
||||
func GetNewLevel(Template int, Score int, Reward []int) []int {
|
||||
data, err := gamedata.GetData(CFG_PASS)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
NewReward := make([]int, 0, len(data))
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "Template") != Template {
|
||||
continue
|
||||
}
|
||||
LevelScore := gamedata.GetIntValue(v, "TotalScore")
|
||||
Index := gamedata.GetIntValue(v, "Level")
|
||||
if Score >= LevelScore && !slices.Contains(Reward, Index) {
|
||||
NewReward = append(NewReward, Index)
|
||||
}
|
||||
}
|
||||
return NewReward
|
||||
}
|
||||
|
||||
func GetFreeChargeItems(Template int, Reward []int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_PASS)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
Items := make([]*item.Item, 0, len(data))
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "Template") != Template {
|
||||
continue
|
||||
}
|
||||
Index := gamedata.GetIntValue(v, "Level")
|
||||
if slices.Contains(Reward, Index) {
|
||||
Items = append(Items, gamedata.GetItemList(data, "FreeReward")...)
|
||||
}
|
||||
}
|
||||
return Items
|
||||
}
|
||||
|
||||
func GetLowChargeItems(Template int, Reward []int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_PASS)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
Items := make([]*item.Item, 0, len(data))
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "Template") != Template {
|
||||
continue
|
||||
}
|
||||
Index := gamedata.GetIntValue(v, "Level")
|
||||
if slices.Contains(Reward, Index) {
|
||||
Items = append(Items, gamedata.GetItemList(data, "LowReward")...)
|
||||
}
|
||||
}
|
||||
return Items
|
||||
}
|
||||
|
||||
func GetHighChargeItems(Template int, Reward []int) []*item.Item {
|
||||
data, err := gamedata.GetData(CFG_PASS)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
Items := make([]*item.Item, 0, len(data))
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "Template") != Template {
|
||||
continue
|
||||
}
|
||||
Index := gamedata.GetIntValue(v, "Level")
|
||||
if slices.Contains(Reward, Index) {
|
||||
Items = append(Items, gamedata.GetItemList(data, "HighReward")...)
|
||||
}
|
||||
}
|
||||
return Items
|
||||
}
|
||||
722
src/server/conf/playroom/playroom_cfg.go
Normal file
722
src/server/conf/playroom/playroom_cfg.go
Normal file
@ -0,0 +1,722 @@
|
||||
package playroomCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_PLAYROOM_CONST = "PlayroomConst"
|
||||
CFG_PLAYROOM_DECORATE = "PlayroomDecorate"
|
||||
CFG_PLAYROOM_MOOD = "PlayroomMood"
|
||||
CFG_PLAYROOM_PHYSIOLOGY = "PlayroomPhysiology"
|
||||
CFG_PLAYROOM_PHYSIOLOGY_TYPE = "PlayroomPhysiologyType"
|
||||
CFG_PLAYROOM_SHOP = "PlayroomShop"
|
||||
CFG_PLAYROOM_DRESS = "PlayroomDress"
|
||||
CFG_PLAYROOM_AIR = "PlayroomAir"
|
||||
CFG_PLAYROOM_LOCK = "PlayroomLock"
|
||||
CFG_PLAYROOM_DAILYTASK = "PlayroomDailyTask"
|
||||
CFG_PLAYROOM_DAILYTASKREWARD = "PlayroomDailyTaskReward"
|
||||
CFG_PLAYROOM_TASKJACKPOT = "PlayroomTaskJackpot"
|
||||
CFG_PLAYROOM_ORDERITEM = "PlayroomOrderItem" // 订单物品
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_PLAYROOM_CONST)
|
||||
gamedata.InitCfg(CFG_PLAYROOM_DECORATE)
|
||||
gamedata.InitCfg(CFG_PLAYROOM_MOOD)
|
||||
gamedata.InitCfg(CFG_PLAYROOM_PHYSIOLOGY)
|
||||
gamedata.InitCfg(CFG_PLAYROOM_PHYSIOLOGY_TYPE)
|
||||
gamedata.InitCfg(CFG_PLAYROOM_SHOP)
|
||||
gamedata.InitCfg(CFG_PLAYROOM_DRESS)
|
||||
gamedata.InitCfg(CFG_PLAYROOM_AIR)
|
||||
gamedata.InitCfg(CFG_PLAYROOM_LOCK)
|
||||
gamedata.InitCfg(CFG_PLAYROOM_DAILYTASK)
|
||||
gamedata.InitCfg(CFG_PLAYROOM_DAILYTASKREWARD)
|
||||
gamedata.InitCfg(CFG_PLAYROOM_TASKJACKPOT)
|
||||
gamedata.InitCfg(CFG_PLAYROOM_ORDERITEM)
|
||||
}
|
||||
|
||||
func GetShopItem(Id int) (int, []*item.Item, int, int) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_SHOP, Id)
|
||||
if err != nil {
|
||||
return 0, nil, 0, 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "ItemId"), gamedata.GetItemList(data, "Cost"), gamedata.GetIntValue(data, "Discount"), gamedata.GetIntValue(data, "Limit")
|
||||
}
|
||||
|
||||
func GetShopWeeklyLimit() map[int]gamedata.WeeklyDiscountInfo {
|
||||
r := make(map[int]gamedata.WeeklyDiscountInfo)
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_SHOP)
|
||||
if err != nil {
|
||||
return r
|
||||
}
|
||||
for k, v := range data {
|
||||
Id := GoUtil.Int(k)
|
||||
Limit := gamedata.GetIntValue(v, "Limit")
|
||||
if Limit == 0 {
|
||||
continue
|
||||
}
|
||||
r[Id] = gamedata.WeeklyDiscountInfo{
|
||||
Id: Id,
|
||||
Discount: gamedata.GetIntValue(v, "Discount"),
|
||||
WeeklyLimit: Limit,
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetShopWish(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_SHOP, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Wish")
|
||||
}
|
||||
|
||||
func GetUnLockLv() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Lv")
|
||||
if err != nil {
|
||||
return 999
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetGameOutline() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "GameOutline")
|
||||
if err != nil {
|
||||
return 999
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetChipNum() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "ChipNum")
|
||||
if err != nil {
|
||||
return 12
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetOrderStar() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Star")
|
||||
if err != nil {
|
||||
return 1000
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetRewardStar() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "RewardStar")
|
||||
if err != nil {
|
||||
return 1000
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetTriggerCd() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "CD")
|
||||
if err != nil {
|
||||
return 1000
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetFoodItem() []int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Food")
|
||||
if err != nil {
|
||||
return []int{}
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") {
|
||||
if v == "" {
|
||||
continue
|
||||
}
|
||||
Id := GoUtil.Int(v)
|
||||
r = append(r, Id)
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetCleanItem() []int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Clean")
|
||||
if err != nil {
|
||||
return []int{}
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") {
|
||||
if v == "" {
|
||||
continue
|
||||
}
|
||||
Id := GoUtil.Int(v)
|
||||
r = append(r, Id)
|
||||
}
|
||||
return r
|
||||
}
|
||||
func GetToyItem() []int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Toy")
|
||||
if err != nil {
|
||||
return []int{}
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") {
|
||||
if v == "" {
|
||||
continue
|
||||
}
|
||||
Id := GoUtil.Int(v)
|
||||
r = append(r, Id)
|
||||
}
|
||||
return r
|
||||
}
|
||||
func GetDailyItem() []int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Daily")
|
||||
if err != nil {
|
||||
return []int{}
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") {
|
||||
if v == "" {
|
||||
continue
|
||||
}
|
||||
Id := GoUtil.Int(v)
|
||||
r = append(r, Id)
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetPremiumItem() []int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "PremiumItem")
|
||||
if err != nil {
|
||||
return []int{}
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") {
|
||||
if v == "" {
|
||||
continue
|
||||
}
|
||||
Id := GoUtil.Int(v)
|
||||
r = append(r, Id)
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetInteractNum() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "InteractNum")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetInteractUnlock() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "InteractUnlock")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetVisitorItem() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "VisitorItem")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
func GetWorkItem() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "WorkItem")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetWorkChargeId() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "WorkChargeId")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetJackpotNum() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Jackpot")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetInteract(Id, Type int) (int, []*item.Item, int) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_MOOD, Id)
|
||||
if err != nil {
|
||||
return 0, nil, 0
|
||||
}
|
||||
if Type == 1 {
|
||||
return gamedata.GetIntValue(data, "Type"), gamedata.GetItemList(data, "Cost"), gamedata.GetIntValue(data, "Effect")
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Type"), gamedata.GetItemList(data, "Cost2"), gamedata.GetIntValue(data, "Effect")
|
||||
}
|
||||
|
||||
func GetInteractPhysiology(Id int) (int, int) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_MOOD, Id)
|
||||
if err != nil {
|
||||
return 0, 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "PType"), gamedata.GetIntValue(data, "PEffect")
|
||||
}
|
||||
|
||||
func GetInteractPExp(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_MOOD, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "PExp")
|
||||
}
|
||||
|
||||
func GetInitDecorate() []int {
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_DECORATE)
|
||||
if err != nil {
|
||||
return []int{}
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for k, v := range data {
|
||||
if gamedata.GetIntValue(v, "Init") == 1 {
|
||||
r = append(r, GoUtil.Int(k))
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetDecorateList() []int {
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_DECORATE)
|
||||
if err != nil {
|
||||
return []int{}
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for k := range data {
|
||||
r = append(r, GoUtil.Int(k))
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetBuyItem(Id int) ([]*item.Item, []*item.Item) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_MOOD, Id)
|
||||
if err != nil {
|
||||
return nil, nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Cost2"), gamedata.GetItemList(data, "Buy")
|
||||
}
|
||||
|
||||
func GetPhysiologyMax(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_PHYSIOLOGY_TYPE, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Max")
|
||||
}
|
||||
|
||||
func GetPhysiologyDuration(Id int, Num int) int {
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_PHYSIOLOGY)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
Type := gamedata.GetIntValue(v, "Type")
|
||||
if Type != Id {
|
||||
continue
|
||||
}
|
||||
Min := gamedata.GetIntValue(v, "Min")
|
||||
Max := gamedata.GetIntValue(v, "Max")
|
||||
if Num >= Min && Num <= Max {
|
||||
return gamedata.GetIntValue(v, "Per") * 60
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetPhysiologyTypeList() []int {
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_PHYSIOLOGY_TYPE)
|
||||
if err != nil {
|
||||
return []int{}
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for k := range data {
|
||||
r = append(r, GoUtil.Int(k))
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetMoodEffect(Id int) (int, int) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_PHYSIOLOGY_TYPE, Id)
|
||||
if err != nil {
|
||||
return 0, 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "MType"), gamedata.GetIntValue(data, "MEffect")
|
||||
}
|
||||
|
||||
func IsStokeCat(Id int) bool {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "StokeCatId")
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value") == Id
|
||||
}
|
||||
|
||||
func IsTakeCat(Id int) bool {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "TakeCatId")
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
Ids := gamedata.GetIntSliceValue(data, "Value")
|
||||
return GoUtil.InArray(Id, Ids)
|
||||
}
|
||||
|
||||
func GetRoomPointInvite() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "RoomPointInvite")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetRoomPointAdd() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "RoomPointAdd")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func IsPlayCat(Id int) bool {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "PlayCatId")
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
Ids := gamedata.GetIntSliceValue(data, "Value")
|
||||
return GoUtil.InArray(Id, Ids)
|
||||
}
|
||||
|
||||
func GetInitAirList() []int {
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_AIR)
|
||||
if err != nil {
|
||||
return []int{}
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for k, v := range data {
|
||||
if gamedata.GetIntValue(v, "Init") == 1 {
|
||||
r = append(r, GoUtil.Int(k))
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetAirList() []int {
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_AIR)
|
||||
if err != nil {
|
||||
return []int{}
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for k := range data {
|
||||
r = append(r, GoUtil.Int(k))
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetInitDressList() []int {
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_DRESS)
|
||||
if err != nil {
|
||||
return []int{}
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for k, v := range data {
|
||||
if gamedata.GetIntValue(v, "Init") == 1 {
|
||||
r = append(r, GoUtil.Int(k))
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetDressList() []int {
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_DRESS)
|
||||
if err != nil {
|
||||
return []int{}
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for k := range data {
|
||||
r = append(r, GoUtil.Int(k))
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetDressPart(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_DRESS, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "IPart")
|
||||
}
|
||||
|
||||
func GetDressName(Id int) string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_DRESS, Id)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return gamedata.GetStringValue(data, "Name")
|
||||
}
|
||||
|
||||
func GetUnlockNeed(Type int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_LOCK, Type)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Need")
|
||||
}
|
||||
|
||||
func GetUnlockName(Type int) string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_LOCK, Type)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return gamedata.GetStringValue(data, "Name")
|
||||
}
|
||||
|
||||
func GetDailyTask(Type int) map[int]string {
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_DAILYTASK)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
r := make(map[int]string)
|
||||
r1 := make([]int, 0, len(data))
|
||||
r2 := make(map[int]string)
|
||||
for k, v := range data {
|
||||
if gamedata.GetIntValue(v, "Type") == Type {
|
||||
k1 := GoUtil.Int(k)
|
||||
r[k1] = gamedata.GetStringValue(v, "Task")
|
||||
r1 = append(r1, k1)
|
||||
}
|
||||
}
|
||||
daily_group_num := 0
|
||||
switch Type {
|
||||
case 1:
|
||||
daily_group_num = GetPlayroomTaskDailyNum1()
|
||||
case 2:
|
||||
daily_group_num = GetPlayroomTaskDailyNum2()
|
||||
}
|
||||
r3 := GoUtil.RandSliceNum(r1, daily_group_num)
|
||||
for _, v := range r3 {
|
||||
r2[v] = r[v]
|
||||
}
|
||||
return r2
|
||||
}
|
||||
|
||||
func GetDailyTaskType(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_DAILYTASK, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Type")
|
||||
}
|
||||
|
||||
func GetDailyTaskReward(Id int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_DAILYTASKREWARD, Id)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Items")
|
||||
}
|
||||
|
||||
// 获取场景冲刺奖池
|
||||
func GetTaskJackpotProb() map[int]int {
|
||||
r := make(map[int]int)
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_TASKJACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskJackpotProb err:%v", err)
|
||||
return nil
|
||||
}
|
||||
for k, v := range data {
|
||||
Id := GoUtil.Int(k)
|
||||
r[Id] = gamedata.GetIntValue(v, "Prob")
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
// 获取场景冲刺奖励
|
||||
func GetTaskJackpotReward(Id int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_TASKJACKPOT, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetTaskJackpotReward err:%v", err)
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Items")
|
||||
}
|
||||
|
||||
func GetPhysiologyList(MoodType int) []int {
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_PHYSIOLOGY_TYPE)
|
||||
if err != nil {
|
||||
return []int{}
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for k, v := range data {
|
||||
if gamedata.GetIntValue(v, "MType") == MoodType {
|
||||
r = append(r, GoUtil.Int(k))
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetInteractIdBath() []int {
|
||||
return []int{11, 12, 13}
|
||||
}
|
||||
|
||||
func GetOrderItemByGrade(Grade int) map[int][]int {
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_ORDERITEM)
|
||||
if err != nil {
|
||||
log.Debug("GetOrderItemByGrade err:%v", err)
|
||||
return nil
|
||||
}
|
||||
r := make(map[int][]int)
|
||||
for k, v := range data {
|
||||
GradeStr := gamedata.GetStringValue(v, "Grade")
|
||||
GradeList := make([]int, 0)
|
||||
for _, v1 := range strings.Split(GradeStr, ",") {
|
||||
v2 := GoUtil.Int(v1)
|
||||
if v2 > 0 {
|
||||
GradeList = append(GradeList, v2)
|
||||
}
|
||||
}
|
||||
if !GoUtil.InArray(Grade, GradeList) {
|
||||
continue
|
||||
}
|
||||
Id := GoUtil.Int(k)
|
||||
Type := gamedata.GetIntValue(v, "Type")
|
||||
if Type == 0 {
|
||||
continue
|
||||
}
|
||||
if _, ok := r[Type]; !ok {
|
||||
r[Type] = make([]int, 0)
|
||||
}
|
||||
if Id == 0 {
|
||||
log.Debug("GetOrderItemByGrade Id is 0, Type:%v", Type)
|
||||
continue
|
||||
}
|
||||
r[Type] = append(r[Type], Id)
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetOrderItemList() []int {
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_ORDERITEM)
|
||||
if err != nil {
|
||||
log.Debug("GetOrderItemList err:%v", err)
|
||||
return nil
|
||||
}
|
||||
r := make([]int, 0, len(data))
|
||||
for k := range data {
|
||||
Id := GoUtil.Int(k)
|
||||
if Id == 0 {
|
||||
log.Debug("GetOrderItemList Id is 0")
|
||||
continue
|
||||
}
|
||||
r = append(r, Id)
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetPetOrderItemExpByList(ItemList []*item.Item) int {
|
||||
r := 0
|
||||
for _, v := range ItemList {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_ORDERITEM, v.Id)
|
||||
if err != nil {
|
||||
// log.Debug("GetPetOrderItemExpByList err:%v", err)
|
||||
continue
|
||||
}
|
||||
Star := gamedata.GetIntValue(data, "Star")
|
||||
r += Star * v.Num
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetShopItemAdNum(Id int) int {
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_SHOP)
|
||||
if err != nil {
|
||||
log.Debug("GetShopItemAdNum err:%v", err)
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
if gamedata.GetIntValue(v, "ItemId") == Id {
|
||||
return gamedata.GetIntValue(v, "Dailystorage")
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetDecoInfo(Id int) (int, string) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_DECORATE, Id)
|
||||
if err != nil {
|
||||
log.Debug("GetDecoInfo err:%v", err)
|
||||
return 0, ""
|
||||
}
|
||||
Type := gamedata.GetIntValue(data, "TypeEnum")
|
||||
Name := gamedata.GetStringValue(data, "Chinese")
|
||||
return Type, Name
|
||||
}
|
||||
|
||||
func GetDailyTaskListById(Id int) []int {
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_DAILYTASK)
|
||||
if err != nil {
|
||||
log.Debug("GetDailyTaskListById err:%v", err)
|
||||
return nil
|
||||
}
|
||||
Type := GetDailyTaskType(Id)
|
||||
r := make([]int, 0, len(data))
|
||||
for k, v := range data {
|
||||
if gamedata.GetIntValue(v, "Type") == Type {
|
||||
r = append(r, GoUtil.Int(k))
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetItemAddPhysiology(Item map[int]int) int {
|
||||
r := 0
|
||||
data, err := gamedata.GetData(CFG_PLAYROOM_MOOD)
|
||||
if err != nil {
|
||||
log.Debug("GetItemAddPhysiology err")
|
||||
return 0
|
||||
}
|
||||
for _, v := range data {
|
||||
costItem := gamedata.GetItemList(v, "Cost2")
|
||||
if len(costItem) < 1 {
|
||||
continue
|
||||
}
|
||||
if costItem[0].Id == 0 {
|
||||
continue
|
||||
}
|
||||
if val, ok := Item[costItem[0].Id]; ok {
|
||||
r += gamedata.GetIntValue(v, "PEffect") * val
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func GetPlayroomTaskDailyNum1() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "dailytask_groupnum1")
|
||||
if err != nil {
|
||||
log.Debug("GetPlayroomTaskDailyNum1 err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetPlayroomTaskDailyNum2() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "dailytask_groupnum2")
|
||||
if err != nil {
|
||||
log.Debug("GetPlayroomTaskDailyNum2 err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
78
src/server/conf/race/race_cfg.go
Normal file
78
src/server/conf/race/race_cfg.go
Normal file
@ -0,0 +1,78 @@
|
||||
package raceCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_RACE_TEMPLATE = "RaceTemplate"
|
||||
CFG_RACE_PASS = "RacePass"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_RACE_TEMPLATE)
|
||||
gamedata.InitCfg(CFG_RACE_PASS)
|
||||
}
|
||||
|
||||
func GetRaceNum(Pass int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_RACE_PASS, Pass)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Num")
|
||||
}
|
||||
|
||||
func GetRaceNeed(Pass int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_RACE_PASS, Pass)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Need")
|
||||
}
|
||||
|
||||
func GetMaxPass(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_RACE_TEMPLATE, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "PassNum")
|
||||
}
|
||||
func GetActivityItemId(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_RACE_TEMPLATE, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "ItemId")
|
||||
}
|
||||
func GetCD(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_RACE_PASS, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Cd")
|
||||
}
|
||||
|
||||
func GetCoin(Id int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_RACE_TEMPLATE, Id)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "ItemId")
|
||||
}
|
||||
|
||||
func GetExtraReward(Id int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_RACE_PASS, Id)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "ExtraReward")
|
||||
}
|
||||
|
||||
func GetReward(Id int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_RACE_PASS, Id)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return gamedata.GetItemList(data, "Reward")
|
||||
}
|
||||
52
src/server/conf/randname/randname_cfg.go
Normal file
52
src/server/conf/randname/randname_cfg.go
Normal file
@ -0,0 +1,52 @@
|
||||
package randnameCfg
|
||||
|
||||
import (
|
||||
GoUtil "server/game_util"
|
||||
"server/gamedata"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_RAND_NAME = "RandName"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_RAND_NAME)
|
||||
}
|
||||
|
||||
func GetRandName() string {
|
||||
data, _ := gamedata.GetData(CFG_RAND_NAME)
|
||||
Id := GoUtil.RandNum(1, len(data))
|
||||
v, err := gamedata.GetDataByIntKey(CFG_RAND_NAME, Id)
|
||||
if err != nil {
|
||||
return "Lily"
|
||||
}
|
||||
return gamedata.GetStringValue(v, "EnName")
|
||||
}
|
||||
|
||||
func GetRandNames(n int) []string {
|
||||
rs := make([]string, 0)
|
||||
data, err := gamedata.GetData(CFG_RAND_NAME)
|
||||
if err != nil {
|
||||
for i := 0; i < n; i++ {
|
||||
id := strconv.Itoa(i + 1)
|
||||
rs[i] = "Lily" + id
|
||||
}
|
||||
}
|
||||
all := make([]int, len(data))
|
||||
index := 0
|
||||
for k := range data {
|
||||
ik := GoUtil.Int(k)
|
||||
all[index] = ik
|
||||
index++
|
||||
}
|
||||
ids := GoUtil.RandSliceNumNonAdjacent(all, n)
|
||||
for _, v := range ids {
|
||||
v, err := gamedata.GetDataByIntKey(CFG_RAND_NAME, v)
|
||||
if err != nil {
|
||||
rs = append(rs, "Lucy")
|
||||
}
|
||||
rs = append(rs, gamedata.GetStringValue(v, "EnName"))
|
||||
}
|
||||
return rs
|
||||
}
|
||||
@ -1,32 +1,49 @@
|
||||
{
|
||||
"AppID": 0,
|
||||
"LogLevel": "debug",
|
||||
"LogPath": "",
|
||||
"TCPAddr": ":3565",
|
||||
"WSAddr": ":3566",
|
||||
"LogPath": "./log",
|
||||
"TCPAddr": ":3602",
|
||||
"WSAddr": ":3567",
|
||||
"RPCAddr": ":50051",
|
||||
"MySqlAddr": "127.0.0.1",
|
||||
"MySqlPort": "3306",
|
||||
"MySqlUsr": "root",
|
||||
"MySqlPwd": "root",
|
||||
"MySqlPwd": "IOagNEq3C84c-20CmHEin5iODVc=",
|
||||
"MaxConnNum": 20000,
|
||||
"DbName": "Merge_Pet",
|
||||
"DbName": "merge_pet_1",
|
||||
"HttpPort": ":8081",
|
||||
"RemoteAddr":"host.docker.internal:9001",
|
||||
"AppPath": "./app",
|
||||
"TELOGDIR" : "./teLog/",
|
||||
|
||||
"GameName": "pet_home_local",
|
||||
|
||||
"GameName": "Merge_Pet",
|
||||
"GameID": 1,
|
||||
"ServerType":"node",
|
||||
|
||||
"ServerID": 1,
|
||||
"ServerOpenTime": "2018-01-01 00:00:00",
|
||||
"ServerName": "Merge_Pet",
|
||||
"ServerStatus" : 1,
|
||||
"ServerCenter" : 1,
|
||||
"ServerCenter" : 0,
|
||||
"GameConfPath": "D:/Github/pet_home_server/src/server/gamedata/config/",
|
||||
|
||||
"ListenAddr":":9002",
|
||||
"CenterAddr": "127.0.0.1:7000",
|
||||
"RemoteAddr":"127.0.0.1:9002",
|
||||
|
||||
"RedisAddr":"127.0.0.1",
|
||||
"RedisPort" :"6379",
|
||||
"RedisPwd" :"",
|
||||
|
||||
"ListenAddr": ":9001",
|
||||
"CenterAddr": ":3560"
|
||||
"RedisWriteAddr":"127.0.0.1:6379",
|
||||
"RedisReadAddrs":"127.0.0.1:6379",
|
||||
"RedisMasterName":"mymaster",
|
||||
"RedisConnType":"Direct",
|
||||
|
||||
"GoogleVerify":false,
|
||||
"Partition":3,
|
||||
"KafkaHost":"kafka-server",
|
||||
"CountryCode":"004",
|
||||
"KafkaPort":"9092",
|
||||
"Version":"1.0.0",
|
||||
"IdVerify":false
|
||||
}
|
||||
|
||||
@ -29,18 +29,18 @@ func GetSevenLoginReward() []*gamedata.SevenLoginRewardData {
|
||||
var result []*gamedata.SevenLoginRewardData
|
||||
for k, v := range data {
|
||||
Id, _ := strconv.Atoi(k)
|
||||
Diamond := gamedata.GetIntValue(v, "Diamond")
|
||||
Energy := gamedata.GetFloatValue(v, "Energy")
|
||||
RewardNum := gamedata.GetIntValue(v, "RewardNum")
|
||||
result = append(result, &gamedata.SevenLoginRewardData{
|
||||
Id: Id,
|
||||
Diamond: Diamond,
|
||||
Energy: Energy,
|
||||
RewardNum: RewardNum,
|
||||
})
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func GetSevenLoginMonthReward() []*gamedata.SevenLoginRewardData {
|
||||
func GetSevenLoginMonthReward(nowMonth int) []*gamedata.SevenLoginRewardData {
|
||||
data, err := gamedata.GetData(CFG_SEVEN_LOGIN_MONTH)
|
||||
if err != nil {
|
||||
log.Debug("GetSevenLoginReward err:%v", err)
|
||||
@ -48,19 +48,23 @@ func GetSevenLoginMonthReward() []*gamedata.SevenLoginRewardData {
|
||||
}
|
||||
var result []*gamedata.SevenLoginRewardData
|
||||
for k, v := range data {
|
||||
month := gamedata.GetIntValue(v, "Month")
|
||||
if month != nowMonth {
|
||||
continue
|
||||
}
|
||||
Id, _ := strconv.Atoi(k)
|
||||
Diamond := gamedata.GetIntValue(v, "Diamond")
|
||||
Energy := gamedata.GetFloatValue(v, "Energy")
|
||||
RewardNum := gamedata.GetIntValue(v, "RewardNum")
|
||||
result = append(result, &gamedata.SevenLoginRewardData{
|
||||
Id: Id,
|
||||
Diamond: Diamond,
|
||||
Energy: Energy,
|
||||
RewardNum: RewardNum,
|
||||
})
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func GetSevenLoginJackpot(IsMonth int) []*gamedata.SevenLoginJackpotData {
|
||||
func GetSevenLoginJackpot(isMonth, level int) []*gamedata.SevenLoginJackpotData {
|
||||
data, err := gamedata.GetData(CFG_SEVEN_LOGIN_JACKPOT)
|
||||
if err != nil {
|
||||
log.Debug("GetSevenLoginJackpot err:%v", err)
|
||||
@ -69,20 +73,24 @@ func GetSevenLoginJackpot(IsMonth int) []*gamedata.SevenLoginJackpotData {
|
||||
var result []*gamedata.SevenLoginJackpotData
|
||||
for k, v := range data {
|
||||
Id, _ := strconv.Atoi(k)
|
||||
Diamond := gamedata.GetIntValue(v, "Diamond")
|
||||
Energy := gamedata.GetFloatValue(v, "Energy")
|
||||
Type := gamedata.GetIntValue(v, "Type")
|
||||
Month := gamedata.GetIntValue(v, "Month")
|
||||
if IsMonth != Month && IsMonth != 0 {
|
||||
Level := gamedata.GetIntValue(v, "Level")
|
||||
if isMonth != Month && isMonth != 0 {
|
||||
continue
|
||||
}
|
||||
if level < Level && level != 0 {
|
||||
continue
|
||||
}
|
||||
ItemMap := gamedata.GetValue(v, "Item")
|
||||
Items := item.ParseItem(ItemMap)
|
||||
result = append(result, &gamedata.SevenLoginJackpotData{
|
||||
Id: Id,
|
||||
Diamond: Diamond,
|
||||
Items: Items,
|
||||
Type: Type,
|
||||
Month: Month,
|
||||
Id: Id,
|
||||
Energy: Energy,
|
||||
Items: Items,
|
||||
Type: Type,
|
||||
Month: Month,
|
||||
})
|
||||
}
|
||||
return result
|
||||
@ -18,7 +18,7 @@ func GetStartChessList() []int {
|
||||
var ChessList []int
|
||||
for _, v := range data {
|
||||
v1 := v.(map[string]interface{})
|
||||
ChessList = append(ChessList, gamedata.ParseInt(v1["MergeId"]))
|
||||
ChessList = append(ChessList, gamedata.GetIntValue(v1, "MergeId"))
|
||||
}
|
||||
return ChessList
|
||||
}
|
||||
@ -1,85 +0,0 @@
|
||||
package userCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
)
|
||||
|
||||
var CFG_NAME = "UserData"
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_NAME)
|
||||
}
|
||||
|
||||
// 获取用户能量倍数
|
||||
func GetEnergyMulByLv(lv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetEnergyMulByLv lv:%v not found", lv)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "EnergyMul")
|
||||
}
|
||||
|
||||
// 获取七天登录加成
|
||||
func GetSevenloginAdd(Lv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetSevenloginAdd lv:%v not found", Lv)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "SevenLogin")
|
||||
}
|
||||
|
||||
// 获取订单系数
|
||||
func GetOrderNByLv(lv int) (int, error) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetOrderNByLv lv:%v not found", lv)
|
||||
return 0, err
|
||||
}
|
||||
return gamedata.GetIntValue(data, "OrderN"), nil
|
||||
}
|
||||
|
||||
// 获取升级经验
|
||||
func GetLevUpExp(lv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetLevUpExp lv:%v not found", lv)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Exp")
|
||||
}
|
||||
|
||||
// 获取能量回复时间
|
||||
func GetRecover(lv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetRecover lv:%v not found", lv)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Recover")
|
||||
}
|
||||
|
||||
// 获取解锁背包数量
|
||||
func GetUnlockPack(lv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetUnlockPack lv:%v not found", lv)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "UnlockPack")
|
||||
}
|
||||
|
||||
// 获取升级奖励
|
||||
func GetLevUpReward(lv int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetLevUpReward lv:%v not found", lv)
|
||||
return nil
|
||||
}
|
||||
itemMap := gamedata.GetValue(data, "Item")
|
||||
itemList := item.ParseItem(itemMap)
|
||||
return itemList
|
||||
}
|
||||
168
src/server/conf/user/user_cfg.go
Normal file
168
src/server/conf/user/user_cfg.go
Normal file
@ -0,0 +1,168 @@
|
||||
package userCfg
|
||||
|
||||
import (
|
||||
"server/game/mod/item"
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
)
|
||||
|
||||
const (
|
||||
CFG_NAME = "UserData"
|
||||
CFG_NANE_CONST = "UserDataConst"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gamedata.InitCfg(CFG_NAME)
|
||||
gamedata.InitCfg(CFG_NANE_CONST)
|
||||
}
|
||||
|
||||
// 获取用户能量倍数
|
||||
func GetEnergyMulByLv(lv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetEnergyMulByLv lv:%v not found", lv)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "EnergyMul")
|
||||
}
|
||||
|
||||
func GetEnergyMax(Lv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetEnergyMax lv:%v not found", Lv)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "MaxEnergy")
|
||||
}
|
||||
|
||||
// 获取七天登录加成
|
||||
func GetSevenloginAdd(Lv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetSevenloginAdd lv:%v not found", Lv)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "SevenLogin")
|
||||
}
|
||||
|
||||
// 获取订单系数
|
||||
func GetOrderNByLv(lv int) (int, error) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetOrderNByLv lv:%v not found", lv)
|
||||
return 0, err
|
||||
}
|
||||
return gamedata.GetIntValue(data, "OrderN"), nil
|
||||
}
|
||||
|
||||
// 获取升级经验
|
||||
func GetLevUpExp(lv int) (int, int) {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetLevUpExp lv:%v not found", lv)
|
||||
return 0, 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Exp"), gamedata.GetIntValue(data, "PExp")
|
||||
}
|
||||
|
||||
func GetNewLevUpExp(lv int, Exp int, PetExt int) (int, int) {
|
||||
ExpLv := lv
|
||||
PetLv := lv
|
||||
for {
|
||||
data1, err := gamedata.GetDataByIntKey(CFG_NAME, ExpLv)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
ExpNeed := gamedata.GetIntValue(data1, "Exp")
|
||||
if Exp >= ExpNeed {
|
||||
Exp -= ExpNeed
|
||||
ExpLv++
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
for {
|
||||
data2, err := gamedata.GetDataByIntKey(CFG_NAME, PetLv)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
PetNeed := gamedata.GetIntValue(data2, "PExp")
|
||||
if PetExt >= PetNeed {
|
||||
PetExt -= PetNeed
|
||||
PetLv++
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
return ExpLv, PetLv
|
||||
}
|
||||
|
||||
// 获取能量回复时间
|
||||
func GetRecover(lv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetRecover lv:%v not found", lv)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Recover")
|
||||
}
|
||||
|
||||
// 获取解锁背包数量
|
||||
func GetUnlockPack(lv int) int {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetUnlockPack lv:%v not found", lv)
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "UnlockPack")
|
||||
}
|
||||
|
||||
// 获取升级奖励
|
||||
func GetLevUpReward(lv int) []*item.Item {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetLevUpReward lv:%v not found", lv)
|
||||
return nil
|
||||
}
|
||||
itemMap := gamedata.GetValue(data, "Item")
|
||||
itemList := item.ParseItem(itemMap)
|
||||
return itemList
|
||||
}
|
||||
|
||||
func GetUnlock(Lv int) string {
|
||||
data, err := gamedata.GetDataByIntKey(CFG_NAME, Lv)
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetUnlock lv:%v not found", Lv)
|
||||
return ""
|
||||
}
|
||||
s1 := gamedata.GetStringValue(data, "Unlock_1")
|
||||
s2 := gamedata.GetStringValue(data, "Unlock_2")
|
||||
return s1 + "," + s2
|
||||
}
|
||||
|
||||
func GetInitEnergy() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_NANE_CONST, "Energy")
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetInitEnergy not found")
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetInitDiamond() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_NANE_CONST, "Diamond")
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetInitDiamond not found")
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
|
||||
func GetInitStar() int {
|
||||
data, err := gamedata.GetDataByKey(CFG_NANE_CONST, "Star")
|
||||
if err != nil {
|
||||
log.Debug("UserDataCfg GetInitStar not found")
|
||||
return 0
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Value")
|
||||
}
|
||||
@ -56,18 +56,17 @@ type Parser struct {
|
||||
//
|
||||
// Examples
|
||||
//
|
||||
// // Standard parser without descriptors
|
||||
// specParser := NewParser(Minute | Hour | Dom | Month | Dow)
|
||||
// sched, err := specParser.Parse("0 0 15 */3 *")
|
||||
// // Standard parser without descriptors
|
||||
// specParser := NewParser(Minute | Hour | Dom | Month | Dow)
|
||||
// sched, err := specParser.Parse("0 0 15 */3 *")
|
||||
//
|
||||
// // Same as above, just excludes time fields
|
||||
// subsParser := NewParser(Dom | Month | Dow)
|
||||
// sched, err := specParser.Parse("15 */3 *")
|
||||
//
|
||||
// // Same as above, just makes Dow optional
|
||||
// subsParser := NewParser(Dom | Month | DowOptional)
|
||||
// sched, err := specParser.Parse("15 */3")
|
||||
// // Same as above, just excludes time fields
|
||||
// subsParser := NewParser(Dom | Month | Dow)
|
||||
// sched, err := specParser.Parse("15 */3 *")
|
||||
//
|
||||
// // Same as above, just makes Dow optional
|
||||
// subsParser := NewParser(Dom | Month | DowOptional)
|
||||
// sched, err := specParser.Parse("15 */3")
|
||||
func NewParser(options ParseOption) Parser {
|
||||
optionals := 0
|
||||
if options&DowOptional > 0 {
|
||||
@ -193,7 +192,7 @@ func normalizeFields(fields []string, options ParseOption) ([]string, error) {
|
||||
if min < max && len(fields) == min {
|
||||
switch {
|
||||
case options&DowOptional > 0:
|
||||
fields = append(fields, defaults[5]) // TODO: improve access to default
|
||||
fields = append(fields, defaults[5])
|
||||
case options&SecondOptional > 0:
|
||||
fields = append([]string{defaults[0]}, fields...)
|
||||
default:
|
||||
@ -247,7 +246,9 @@ func getField(field string, r bounds) (uint64, error) {
|
||||
}
|
||||
|
||||
// getRange returns the bits indicated by the given expression:
|
||||
// number | number "-" number [ "/" number ]
|
||||
//
|
||||
// number | number "-" number [ "/" number ]
|
||||
//
|
||||
// or error parsing range.
|
||||
func getRange(expr string, r bounds) (uint64, error) {
|
||||
var (
|
||||
|
||||
@ -1,38 +1,129 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
//"database/sql"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"server/GoUtil"
|
||||
"server/MergeConst"
|
||||
"server/conf"
|
||||
GoUtil "server/game_util"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
// "server/game"
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"github.com/jmoiron/sqlx"
|
||||
)
|
||||
|
||||
type user struct {
|
||||
Id int `db:"user_id"`
|
||||
Sex int `db:"sex"`
|
||||
UserName string `db:"username"`
|
||||
Email string `db:"email"`
|
||||
var SqlDb *sqlx.DB
|
||||
var sqlDbMu sync.RWMutex
|
||||
|
||||
// GetDB 线程安全地获取数据库连接
|
||||
func GetDB() *sqlx.DB {
|
||||
sqlDbMu.RLock()
|
||||
defer sqlDbMu.RUnlock()
|
||||
return SqlDb
|
||||
}
|
||||
|
||||
var SqlDb *sqlx.DB
|
||||
// GetDBOrPanic 获取数据库连接,如果为 nil 则记录错误
|
||||
func GetDBOrPanic() *sqlx.DB {
|
||||
db := GetDB()
|
||||
if db == nil {
|
||||
log.Error("Database connection is nil, please check database initialization")
|
||||
}
|
||||
return db
|
||||
}
|
||||
|
||||
// EnsureDB 确保数据库连接可用,如果不可用则返回错误
|
||||
func EnsureDB() (*sqlx.DB, error) {
|
||||
db := GetDB()
|
||||
if db == nil {
|
||||
return nil, fmt.Errorf("database connection is nil")
|
||||
}
|
||||
if err := db.Ping(); err != nil {
|
||||
return nil, fmt.Errorf("database ping failed: %w", err)
|
||||
}
|
||||
return db, nil
|
||||
}
|
||||
|
||||
// 封装创建连接
|
||||
func connectMySQL() (*sqlx.DB, error) {
|
||||
MysqlPwd, _ := GoUtil.Decrypt(conf.Server.MySqlPwd)
|
||||
// 减少超时时间,避免长时间阻塞
|
||||
connect := fmt.Sprintf("%s:%s@(%s:%s)/%s?timeout=10s&readTimeout=15s&writeTimeout=15s&parseTime=true", conf.Server.MySqlUsr, MysqlPwd, conf.Server.MySqlAddr, conf.Server.MySqlPort, conf.Server.DbName)
|
||||
db, err := sqlx.Connect("mysql", connect)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// 增加最大连接数,减少连接等待时间
|
||||
db.SetMaxOpenConns(100)
|
||||
db.SetMaxIdleConns(20)
|
||||
db.SetConnMaxLifetime(30 * time.Minute) // 减少连接生命周期
|
||||
db.SetConnMaxIdleTime(5 * time.Minute) // 减少空闲时间
|
||||
return db, nil
|
||||
}
|
||||
|
||||
func InitDB() {
|
||||
//"用户名:密码@[连接方式](主机名:端口号)/数据库名"
|
||||
connect := fmt.Sprintf("%s:%s@(%s:%s)/%s", conf.Server.MySqlUsr, conf.Server.MySqlPwd, conf.Server.MySqlAddr, conf.Server.MySqlPort, conf.Server.DbName)
|
||||
SqlDb = sqlx.MustConnect("mysql", connect) // 设置连接数据库的参数
|
||||
SqlDb.SetMaxOpenConns(20) // 设置最大打开的连接数
|
||||
db, err := connectMySQL()
|
||||
if err != nil {
|
||||
log.Debug("connect mysql failed: %v", err)
|
||||
return
|
||||
}
|
||||
sqlDbMu.Lock()
|
||||
SqlDb = db
|
||||
sqlDbMu.Unlock()
|
||||
log.Debug("connect mysql success")
|
||||
|
||||
// 定时检测与重连
|
||||
go func() {
|
||||
ticker := time.NewTicker(5 * time.Second) // 改为5秒检测一次,降低频率
|
||||
defer ticker.Stop()
|
||||
for range ticker.C {
|
||||
sqlDbMu.RLock()
|
||||
cur := SqlDb
|
||||
sqlDbMu.RUnlock()
|
||||
|
||||
if cur == nil {
|
||||
log.Debug("mysql connection is nil, start reconnect")
|
||||
ReconnectDB()
|
||||
continue
|
||||
}
|
||||
|
||||
// Ping 操作不持有锁,避免阻塞其他操作
|
||||
if err := cur.Ping(); err != nil {
|
||||
log.Debug("mysql ping failed: %v, start reconnect", err)
|
||||
ReconnectDB()
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
// 自动重连
|
||||
func ReconnectDB() {
|
||||
sqlDbMu.Lock()
|
||||
defer sqlDbMu.Unlock()
|
||||
newDb, err := connectMySQL()
|
||||
if err != nil {
|
||||
log.Debug("mysql reconnect failed: %v", err)
|
||||
return
|
||||
}
|
||||
if SqlDb != nil {
|
||||
_ = SqlDb.Close()
|
||||
}
|
||||
SqlDb = newDb
|
||||
log.Debug("mysql reconnect success")
|
||||
}
|
||||
|
||||
func SeriesTransaction(sqlstrs []string, params [][]any) (err error) {
|
||||
tx, err := SqlDb.Begin()
|
||||
sqlDb := GetDB()
|
||||
if sqlDb == nil {
|
||||
return fmt.Errorf("database connection is nil")
|
||||
}
|
||||
|
||||
tx, err := sqlDb.Begin()
|
||||
if err != nil {
|
||||
log.Debug("Transaction failed, err:%v\n", err)
|
||||
return err
|
||||
@ -60,61 +151,6 @@ func SeriesTransaction(sqlstrs []string, params [][]any) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// 更新数据
|
||||
func FormatUpdateOneAttrRow(u interface{}, tableName string, UpdateAttr string, Exclude string) (err error) {
|
||||
t := reflect.TypeOf(u)
|
||||
len1 := t.Elem().NumField()
|
||||
Fields := make([]string, len1)
|
||||
Values := make([]interface{}, len1)
|
||||
pp := reflect.ValueOf(u)
|
||||
origin := "UPDATE " + tableName + " SET "
|
||||
index := 0
|
||||
var keyValue interface{}
|
||||
for i := 0; i < len1; i++ {
|
||||
field := t.Elem().Field(i)
|
||||
if field.Tag.Get("db") != Exclude {
|
||||
if field.Tag.Get("db") == UpdateAttr {
|
||||
Fields[index] = field.Tag.Get("db") + " = ?"
|
||||
|
||||
ufield := pp.Elem().FieldByName(field.Name)
|
||||
k := ufield.Kind()
|
||||
if k == reflect.String {
|
||||
Values[index] = ufield.String()
|
||||
}
|
||||
if k == reflect.Int32 {
|
||||
Values[index] = ufield.Int()
|
||||
}
|
||||
index++
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
ufield := pp.Elem().FieldByName(field.Name)
|
||||
k := ufield.Kind()
|
||||
if k == reflect.String {
|
||||
keyValue = ufield.String()
|
||||
}
|
||||
if k == reflect.Int32 {
|
||||
keyValue = ufield.Int()
|
||||
}
|
||||
}
|
||||
}
|
||||
Values[index] = keyValue
|
||||
// Values = append(Values, keyValue)
|
||||
origin += strings.Join(Fields, ",")
|
||||
strLen := len(origin)
|
||||
origin = origin[:strLen-1]
|
||||
origin = origin + " WHERE " + Exclude + " = ?"
|
||||
sqlStr := origin
|
||||
_, err = SqlDb.Exec(sqlStr, Values...)
|
||||
if err != nil {
|
||||
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", tableName, sqlStr, err)
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// "UPDATE user SET age = ?, degree = ? WHERE id = ?"
|
||||
func FormatAllMemUpdateDb(u interface{}, tableName string, Exclude string) (err error) {
|
||||
t := reflect.TypeOf(u)
|
||||
@ -145,7 +181,7 @@ func FormatAllMemUpdateDb(u interface{}, tableName string, Exclude string) (err
|
||||
if k == reflect.String {
|
||||
keyValue = ufield.String()
|
||||
}
|
||||
if k == reflect.Int32 || k == reflect.Int {
|
||||
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
|
||||
keyValue = ufield.Int()
|
||||
}
|
||||
}
|
||||
@ -187,6 +223,9 @@ func FormatAllMemInsertDb(u interface{}, tableName string) (insertID int64, err
|
||||
if k == reflect.Int32 {
|
||||
Values[i] = ufield.Int()
|
||||
}
|
||||
if k == reflect.Int64 {
|
||||
Values[i] = ufield.Int()
|
||||
}
|
||||
}
|
||||
for i := range Fields {
|
||||
Fields[i] = "`" + Fields[i] + "`"
|
||||
@ -219,6 +258,28 @@ func GetPlayerBaseInfoFromDbByName(name string) *ResPlayerBaseInfo {
|
||||
return &res
|
||||
}
|
||||
|
||||
func GetPlayerBan(name string) int64 {
|
||||
sqlStr := "SELECT ban FROM t_player_baseinfo WHERE user_name = ?"
|
||||
var ban int64
|
||||
if err := SqlDb.Get(&ban, sqlStr, name); err != nil {
|
||||
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "PlayerBaseInfo", sqlStr, err)
|
||||
return 0
|
||||
}
|
||||
return ban
|
||||
}
|
||||
|
||||
func UpdatePlayerBan(uid int64, ban int64) error {
|
||||
sqlStr := "UPDATE t_player_baseinfo SET ban = ? WHERE dwUin = ?"
|
||||
_, err := SqlDb.Exec(sqlStr, ban, uid)
|
||||
return err
|
||||
}
|
||||
|
||||
func UpdatePlayerBaseInfoName(oldName, newName string) error {
|
||||
sqlStr := "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?"
|
||||
_, err := SqlDb.Exec(sqlStr, newName, oldName)
|
||||
return err
|
||||
}
|
||||
|
||||
func GetPlayerBaseInfoFromDbById(id int32) *ResPlayerBaseInfo {
|
||||
sqlStr := "SELECT * FROM t_player_baseinfo WHERE dwUin = ?"
|
||||
var res ResPlayerBaseInfo
|
||||
@ -233,73 +294,92 @@ func GetAccountInfoFromDb(name string) *Db_Account {
|
||||
sqlStr := "SELECT * FROM t_account WHERE user_name = ?"
|
||||
var res Db_Account
|
||||
if err := SqlDb.Get(&res, sqlStr, name); err != nil {
|
||||
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "account", sqlStr, err)
|
||||
log.Debug("登录的账号不存在:%s", name)
|
||||
return nil
|
||||
}
|
||||
return &res
|
||||
}
|
||||
|
||||
func FormatAllMemLoadDb(u interface{}, tableName string, Exclude string) (err error) {
|
||||
t := reflect.TypeOf(u)
|
||||
len := t.Elem().NumField()
|
||||
Fields := make([]string, len)
|
||||
Values := make([]interface{}, len)
|
||||
pp := reflect.ValueOf(u)
|
||||
origin := "SELECT * FROM " + tableName + " WHERE "
|
||||
index := 0
|
||||
var keyValue interface{}
|
||||
for i := 0; i < len; i++ {
|
||||
field := t.Elem().Field(i)
|
||||
if field.Tag.Get("db") != Exclude {
|
||||
Fields[index] = field.Tag.Get("db") + " = ?"
|
||||
|
||||
ufield := pp.Elem().FieldByName(field.Name)
|
||||
k := ufield.Kind()
|
||||
if k == reflect.String {
|
||||
Values[index] = ufield.String()
|
||||
}
|
||||
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
|
||||
Values[index] = ufield.Int()
|
||||
}
|
||||
index++
|
||||
} else {
|
||||
|
||||
ufield := pp.Elem().FieldByName(field.Name)
|
||||
k := ufield.Kind()
|
||||
if k == reflect.String {
|
||||
keyValue = ufield.String()
|
||||
}
|
||||
if k == reflect.Int32 {
|
||||
keyValue = ufield.Int()
|
||||
}
|
||||
}
|
||||
}
|
||||
Values[index] = keyValue
|
||||
// Values = append(Values, keyValue)
|
||||
origin += strings.Join(Fields, " AND ")
|
||||
sqlStr := origin
|
||||
if err := SqlDb.Get(u, sqlStr, Values...); err != nil {
|
||||
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", tableName, sqlStr, err)
|
||||
func ResetAccountData(oldName, newName string) error {
|
||||
sqlStr := "UPDATE t_account SET user_name = ? WHERE user_name = ?"
|
||||
_, err := SqlDb.Exec(sqlStr, newName, oldName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sqlStr = "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?"
|
||||
_, err = SqlDb.Exec(sqlStr, newName, oldName)
|
||||
return err
|
||||
}
|
||||
|
||||
func MappingAccountData(oldName, newName string) error {
|
||||
sqlStr := "UPDATE t_account SET user_name = ? WHERE user_name = ?"
|
||||
_, err := SqlDb.Exec(sqlStr, "", oldName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sqlStr = "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?"
|
||||
_, err = SqlDb.Exec(sqlStr, "", oldName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sqlStr = "UPDATE t_account SET user_name = ? WHERE user_name = ?"
|
||||
_, err = SqlDb.Exec(sqlStr, oldName, newName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sqlStr = "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?"
|
||||
_, err = SqlDb.Exec(sqlStr, oldName, newName)
|
||||
return err
|
||||
}
|
||||
|
||||
func UpdateAccountInfoToDb(account *Db_Account) (err error) {
|
||||
_, err = SqlDb.Exec("UPDATE t_account SET user_password = ? WHERE user_name = ?", account.UserPassword, account.UserName)
|
||||
return
|
||||
}
|
||||
|
||||
func UpdateAccountInfoName(account *Db_Account, newName string) (err error) {
|
||||
_, err = SqlDb.Exec("UPDATE t_account SET user_name = ? WHERE user_name = ?", newName, account.UserName)
|
||||
return
|
||||
}
|
||||
|
||||
func UpdateAccountInfoDeviceToDb(account *Db_Account) (err error) {
|
||||
_, err = SqlDb.Exec("UPDATE t_account SET device_id = ? WHERE user_name = ?", account.DeviceId, account.UserName)
|
||||
return
|
||||
}
|
||||
|
||||
func GetServerData(d interface{}, Key string) (err error) {
|
||||
sqlDb := GetDB()
|
||||
if sqlDb == nil {
|
||||
return fmt.Errorf("database connection is nil")
|
||||
}
|
||||
sql := "select * from t_server_mod where `key` = ?"
|
||||
err = SqlDb.Get(d, sql, Key)
|
||||
err = sqlDb.Get(d, sql, Key)
|
||||
return
|
||||
}
|
||||
|
||||
func SaveServerData(data *SqlServerModStruct) error {
|
||||
sqlDb := GetDB()
|
||||
if sqlDb == nil {
|
||||
return fmt.Errorf("database connection is nil")
|
||||
}
|
||||
sql := "update t_server_mod set `mData` = ? , `updateTime` = ? where `key` = ?"
|
||||
_, err := SqlDb.Exec(sql, data.ModData, data.UpdataTime, data.Key)
|
||||
_, err := sqlDb.Exec(sql, data.ModData, data.UpdataTime, data.Key)
|
||||
return err
|
||||
}
|
||||
|
||||
func SaveServerDataWithTx(tx *sql.Tx, data *SqlServerModStruct) error {
|
||||
sql := "update t_server_mod set `mData` = ? , `updateTime` = ? where `key` = ?"
|
||||
_, err := tx.Exec(sql, data.ModData, data.UpdataTime, data.Key)
|
||||
return err
|
||||
}
|
||||
|
||||
func InsertServerData(data *SqlServerModStruct) error {
|
||||
sqlDb := GetDB()
|
||||
if sqlDb == nil {
|
||||
return fmt.Errorf("database connection is nil")
|
||||
}
|
||||
sql := "insert into t_server_mod (`mData` , `updateTime` ,`key`) Values (?,?,?)"
|
||||
_, err := SqlDb.Exec(sql, data.ModData, data.UpdataTime, data.Key)
|
||||
_, err := sqlDb.Exec(sql, data.ModData, data.UpdataTime, data.Key)
|
||||
return err
|
||||
}
|
||||
|
||||
@ -327,113 +407,22 @@ func GetPlayerClientData(d interface{}, Key string) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func InsertData(u interface{}, tableName string) (insertID int64, err error) {
|
||||
t := reflect.TypeOf(u)
|
||||
len := t.Elem().NumField()
|
||||
Fields := make([]string, 0)
|
||||
Fields1 := make([]string, 0)
|
||||
Values := make([]interface{}, 0)
|
||||
pp := reflect.ValueOf(u)
|
||||
origin := "INSERT INTO " + tableName + "("
|
||||
for i := 0; i < len; i++ {
|
||||
field := t.Elem().Field(i)
|
||||
if field.Tag.Get("db") == "id" {
|
||||
continue
|
||||
}
|
||||
|
||||
ufield := pp.Elem().FieldByName(field.Name)
|
||||
k := ufield.Kind()
|
||||
if k == reflect.String && ufield.String() == "" {
|
||||
continue
|
||||
}
|
||||
if (k == reflect.Int32 || k == reflect.Int || k == reflect.Int64) && ufield.Int() == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
if k == reflect.String {
|
||||
Values = append(Values, ufield.String())
|
||||
}
|
||||
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
|
||||
Values = append(Values, ufield.Int())
|
||||
}
|
||||
Fields = append(Fields, field.Tag.Get("db"))
|
||||
Fields1 = append(Fields1, "?")
|
||||
}
|
||||
for i := range Fields {
|
||||
Fields[i] = "`" + Fields[i] + "`"
|
||||
}
|
||||
origin += strings.Join(Fields, ",")
|
||||
origin += ") VALUES("
|
||||
origin += strings.Join(Fields1, ",")
|
||||
origin += ")"
|
||||
sqlStr := origin
|
||||
result, err := SqlDb.Exec(sqlStr, Values...)
|
||||
if err != nil {
|
||||
log.Debug("InsertData exec failed, sql : %s ;err:%v\n", sqlStr, err)
|
||||
return
|
||||
}
|
||||
insertID, err = result.LastInsertId()
|
||||
if err != nil {
|
||||
log.Debug("InsertData exec failed, err:%v\n", err)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func UpdateData(u interface{}, tableName string, Exclude string) (err error) {
|
||||
t := reflect.TypeOf(u)
|
||||
len1 := t.Elem().NumField()
|
||||
Fields := make([]string, 0)
|
||||
Values := make([]interface{}, 0)
|
||||
pp := reflect.ValueOf(u)
|
||||
origin := "UPDATE " + tableName + " SET "
|
||||
var ExcludeValue interface{}
|
||||
for i := 0; i < len1; i++ {
|
||||
field := t.Elem().Field(i)
|
||||
ufield := pp.Elem().FieldByName(field.Name)
|
||||
k := ufield.Kind()
|
||||
if field.Tag.Get("db") != Exclude && field.Tag.Get("db") != "id" {
|
||||
|
||||
if k == reflect.String {
|
||||
Values = append(Values, ufield.String())
|
||||
}
|
||||
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
|
||||
Values = append(Values, ufield.Int())
|
||||
}
|
||||
Fields = append(Fields, "`"+field.Tag.Get("db")+"` = ?")
|
||||
}
|
||||
if field.Tag.Get("db") == Exclude {
|
||||
if k == reflect.String {
|
||||
ExcludeValue = ufield.String()
|
||||
}
|
||||
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
|
||||
ExcludeValue = append(Values, ufield.Int())
|
||||
}
|
||||
}
|
||||
}
|
||||
Values = append(Values, ExcludeValue)
|
||||
origin += strings.Join(Fields, ",")
|
||||
origin = origin + " WHERE `" + Exclude + "` = ?"
|
||||
sqlStr := origin
|
||||
|
||||
_, err = SqlDb.Exec(sqlStr, Values...)
|
||||
if err != nil {
|
||||
log.Debug("update failed, sql %s err:%v\n", sqlStr, err)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func GetServerMailData(data *[]*SqlServerMailStruct) error {
|
||||
sql := "select * from system_mail_info"
|
||||
err := SqlDb.Select(data, sql)
|
||||
return err
|
||||
}
|
||||
|
||||
func CreateOrderSn(Uid, ChargeId int, OrderSn, Platform, Channel string, Price float64, Currency string) error {
|
||||
sql := "insert into t_player_charge (`Uid`,`OrderId`, `ProductId`, `Price`,`Currency`, `CreateTime`, `PayPlatform`, `PayChannel`) Values (?,?,?,?,?,?,?,?)"
|
||||
func GetActivityData(data *[]*SqlActivityCfgStruct) error {
|
||||
sql := "select `id`, `type`, `title`, `mail_title`, `mail_content`, `level_limit`, `start_time`, `end_time`, `cfg_buf`, `extra` from t_activity_mod"
|
||||
err := SqlDb.Select(data, sql)
|
||||
return err
|
||||
}
|
||||
|
||||
func CreateOrderSn(Uid, ChargeId int, OrderSn, Platform, Channel string, Price float64, Currency, Extra string) error {
|
||||
sql := "insert into t_player_charge (`Uid`,`OrderId`, `ProductId`, `Price`,`Currency`, `CreateTime`, `PayPlatform`, `PayChannel`, `PayChannelExtra`) Values (?,?,?,?,?,?,?,?,?)"
|
||||
Now := GoUtil.Now()
|
||||
_, err := SqlDb.Exec(sql, Uid, OrderSn, ChargeId, Price, Currency, Now, Platform, Channel)
|
||||
_, err := SqlDb.Exec(sql, Uid, OrderSn, ChargeId, Price, Currency, Now, Platform, Channel, Extra)
|
||||
return err
|
||||
}
|
||||
|
||||
@ -444,8 +433,49 @@ func GetPlayerChargeData(OrderSn string) (*SqlChargeOrderStruct, error) {
|
||||
return data, err
|
||||
}
|
||||
|
||||
func GetPlayerChargeDataList(Uid int) ([]*SqlChargeOrderStruct, error) {
|
||||
sql := "select * from t_player_charge where Uid = ? and PayStatus = ?"
|
||||
data := &[]*SqlChargeOrderStruct{}
|
||||
err := SqlDb.Select(data, sql, Uid, MergeConst.ORDER_STATUS_PAY)
|
||||
return *data, err
|
||||
}
|
||||
|
||||
func GetPlayerPayChannelOrderId(OrderSn string) (*SqlChargeOrderStruct, error) {
|
||||
sql := "select * from t_player_charge where PayChannelOrderId = ?"
|
||||
data := &SqlChargeOrderStruct{}
|
||||
err := SqlDb.Get(data, sql, OrderSn)
|
||||
return data, err
|
||||
}
|
||||
|
||||
func UpdatePlayerChargeData(data *SqlChargeOrderStruct) error {
|
||||
sql := "update t_player_charge set PayTime = ?, PayStatus = ?, PayChannelOrderId = ? where OrderId = ?"
|
||||
_, err := SqlDb.Exec(sql, data.PayTime, data.PayStatus, data.PayChannelOrderId, data.OrderId)
|
||||
return err
|
||||
}
|
||||
|
||||
func SearchPlayer(key string) ([]*ResPlayerBaseInfo, error) {
|
||||
sql := "select * from t_player_baseinfo where nick_name like ? limit 10"
|
||||
data := &[]*ResPlayerBaseInfo{}
|
||||
err := SqlDb.Select(data, sql, "%"+key+"%")
|
||||
return *data, err
|
||||
}
|
||||
|
||||
func GetCommendPlayerFromDb(uid, login int64, level int) ([]int, error) {
|
||||
sqlStr := "SELECT dwUin FROM t_player_baseinfo WHERE dwUin != ? AND logout_time > ? AND level >= ? ORDER BY logout_time DESC LIMIT 1000"
|
||||
var res []int
|
||||
if err := SqlDb.Select(&res, sqlStr, uid, login, level); err != nil {
|
||||
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "PlayerBaseInfo", sqlStr, err)
|
||||
return nil, err
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func GetDebugPlayer(uid int) ([]int, error) {
|
||||
sqlStr := "SELECT dwUin FROM t_player_baseinfo WHERE dwUin != ? ORDER BY login_time DESC LIMIT 1000"
|
||||
var res []int
|
||||
if err := SqlDb.Select(&res, sqlStr, uid); err != nil {
|
||||
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "PlayerBaseInfo", sqlStr, err)
|
||||
return nil, err
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"server/conf"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/redis/go-redis/v9"
|
||||
@ -11,34 +12,118 @@ import (
|
||||
|
||||
var ctx = context.Background()
|
||||
|
||||
var Rdb *redis.Client
|
||||
var RdbWrite *redis.Client
|
||||
var RdbRead *redis.Client
|
||||
|
||||
func InitRedis() {
|
||||
rdb := redis.NewClient(&redis.Options{
|
||||
Addr: conf.Server.RedisAddr + ":" + conf.Server.RedisPort,
|
||||
Password: conf.Server.RedisPwd, // no password set
|
||||
DB: 0,
|
||||
})
|
||||
|
||||
_, err := rdb.Ping(ctx).Result()
|
||||
if err != nil {
|
||||
log.Debug("连接redis出错,错误信息:%v", err)
|
||||
return
|
||||
// helper: 创建单个客户端(addr 可以为 host:port 或 host)
|
||||
func connectClient(addr string) (*redis.Client, error) {
|
||||
if addr == "" {
|
||||
return nil, nil
|
||||
}
|
||||
log.Debug("成功连接redis")
|
||||
Rdb = rdb
|
||||
// 如果没有端口且配置了旧的 RedisPort,则尝试补端口
|
||||
if !strings.Contains(addr, ":") && conf.Server.RedisPort != "" {
|
||||
addr = addr + ":" + conf.Server.RedisPort
|
||||
}
|
||||
rdb := redis.NewClient(&redis.Options{
|
||||
Addr: addr,
|
||||
Password: conf.Server.RedisPwd,
|
||||
DB: conf.Server.RedisDb,
|
||||
})
|
||||
if _, err := rdb.Ping(ctx).Result(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rdb, nil
|
||||
}
|
||||
|
||||
// InitRedis: 初始化读写分离客户端(向后兼容旧配置)
|
||||
func InitRedis() {
|
||||
// 决定写地址:优先使用 RedisWriteAddr,其次使用旧的 RedisAddr:RedisPort
|
||||
writeAddr := conf.Server.RedisWriteAddr
|
||||
if writeAddr == "" {
|
||||
if conf.Server.RedisAddr != "" {
|
||||
writeAddr = conf.Server.RedisAddr
|
||||
if conf.Server.RedisPort != "" && !strings.Contains(writeAddr, ":") {
|
||||
writeAddr = writeAddr + ":" + conf.Server.RedisPort
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 决定读地址:优先使用 RedisReadAddrs(逗号分隔),若为空则回退到写地址
|
||||
readAddrs := conf.Server.RedisReadAddrs
|
||||
if strings.TrimSpace(readAddrs) == "" {
|
||||
readAddrs = writeAddr
|
||||
}
|
||||
|
||||
// 取第一个可用的只读地址(简单实现)
|
||||
var readClient *redis.Client
|
||||
for _, a := range strings.Split(readAddrs, ",") {
|
||||
a = strings.TrimSpace(a)
|
||||
if a == "" {
|
||||
continue
|
||||
}
|
||||
c, err := connectClient(a)
|
||||
if err == nil {
|
||||
readClient = c
|
||||
break
|
||||
}
|
||||
log.Debug("connect read addr %s failed: %v", a, err)
|
||||
}
|
||||
|
||||
// 如果所有只读都不可用,尝试连接写地址作为回退
|
||||
writeClient, err := connectClient(writeAddr)
|
||||
if err != nil {
|
||||
log.Debug("连接redis写节点出错,错误信息:%v", err)
|
||||
// 若读已连上则也作为写回退,否则返回
|
||||
if readClient != nil {
|
||||
RdbWrite = readClient
|
||||
RdbRead = readClient
|
||||
log.Debug("只有只读节点可用,读写共用该节点")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 如果读未连接成功,读回退到写
|
||||
if readClient == nil {
|
||||
readClient = writeClient
|
||||
}
|
||||
|
||||
RdbWrite = writeClient
|
||||
RdbRead = readClient
|
||||
log.Debug("成功初始化 redis(读写分离),写: %v, 读: %v", writeAddr, readAddrs)
|
||||
}
|
||||
|
||||
// 写操作使用 RdbWrite
|
||||
func RedisSetKey(key string, value string, expiration time.Duration) {
|
||||
err := Rdb.Set(ctx, key, value, expiration).Err()
|
||||
if RdbWrite == nil {
|
||||
log.Debug("redis write client is nil")
|
||||
return
|
||||
}
|
||||
err := RdbWrite.Set(ctx, key, value, expiration).Err()
|
||||
if err != nil {
|
||||
log.Debug("redis set failed, err:%v\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
// 获取锁
|
||||
// 新增:写入字节数据,避免 string 转换拷贝
|
||||
func RedisSetKeyBytes(key string, value []byte, expiration time.Duration) {
|
||||
if RdbWrite == nil {
|
||||
log.Debug("redis write client is nil")
|
||||
return
|
||||
}
|
||||
err := RdbWrite.Set(ctx, key, value, expiration).Err()
|
||||
if err != nil {
|
||||
log.Debug("redis set failed, err:%v\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
// 获取锁(写)
|
||||
func RedisLock(key string, value string, expiration time.Duration) bool {
|
||||
ok, err := Rdb.SetNX(ctx, key, value, expiration).Result()
|
||||
if RdbWrite == nil {
|
||||
log.Debug("redis write client is nil")
|
||||
return false
|
||||
}
|
||||
ok, err := RdbWrite.SetNX(ctx, key, value, expiration).Result()
|
||||
if err != nil {
|
||||
log.Debug("redis lock failed, err:%v\n", err)
|
||||
return false
|
||||
@ -46,8 +131,12 @@ func RedisLock(key string, value string, expiration time.Duration) bool {
|
||||
return ok
|
||||
}
|
||||
|
||||
// 释放锁
|
||||
// 释放锁(写)
|
||||
func RedisUnlock(key string, value string) bool {
|
||||
if RdbWrite == nil {
|
||||
log.Debug("redis write client is nil")
|
||||
return false
|
||||
}
|
||||
script := `
|
||||
if redis.call("GET", KEYS[1]) == ARGV[1] then
|
||||
return redis.call("DEL", KEYS[1])
|
||||
@ -55,7 +144,7 @@ func RedisUnlock(key string, value string) bool {
|
||||
return 0
|
||||
end
|
||||
`
|
||||
result, err := Rdb.Eval(ctx, script, []string{key}, value).Result()
|
||||
result, err := RdbWrite.Eval(ctx, script, []string{key}, value).Result()
|
||||
if err != nil {
|
||||
log.Debug("redis unlock failed, err:%v\n", err)
|
||||
return false
|
||||
@ -63,25 +152,134 @@ func RedisUnlock(key string, value string) bool {
|
||||
return result.(int64) == 1
|
||||
}
|
||||
|
||||
// 读操作使用 RdbRead
|
||||
func RedisGetKey(key string) (string, error) {
|
||||
val, err := Rdb.Get(ctx, key).Result()
|
||||
if RdbRead == nil {
|
||||
return "", nil
|
||||
}
|
||||
val, err := RdbRead.Get(ctx, key).Result()
|
||||
if err != nil {
|
||||
log.Debug("redis get failed, err:%v\n", err)
|
||||
return "", err
|
||||
}
|
||||
return val, nil
|
||||
}
|
||||
|
||||
func RedisGetKeyBytes(key string) ([]byte, error) {
|
||||
if RdbRead == nil {
|
||||
return nil, nil
|
||||
}
|
||||
val, err := RdbRead.Get(ctx, key).Bytes()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return val, nil
|
||||
}
|
||||
|
||||
func RedisDelKey(key string) {
|
||||
err := Rdb.Del(ctx, key).Err()
|
||||
if RdbWrite == nil {
|
||||
log.Debug("redis write client is nil")
|
||||
return
|
||||
}
|
||||
err := RdbWrite.Del(ctx, key).Err()
|
||||
if err != nil {
|
||||
log.Debug("redis del failed, err:%v\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
func RedisZAdd(key string, member string, score float64) {
|
||||
err := Rdb.ZAdd(ctx, key, redis.Z{Score: score, Member: member}).Err()
|
||||
if RdbWrite == nil {
|
||||
log.Debug("redis write client is nil")
|
||||
return
|
||||
}
|
||||
err := RdbWrite.ZAdd(ctx, key, redis.Z{Score: score, Member: member}).Err()
|
||||
if err != nil {
|
||||
log.Debug("redis zadd failed, err:%v\n", err)
|
||||
return
|
||||
}
|
||||
const maxRankSize int64 = 10000
|
||||
count, err := RdbWrite.ZCard(ctx, key).Result()
|
||||
if err != nil {
|
||||
log.Debug("redis zcard failed, err:%v\n", err)
|
||||
return
|
||||
}
|
||||
if count > maxRankSize {
|
||||
removeCount := count - maxRankSize
|
||||
err = RdbWrite.ZRemRangeByRank(ctx, key, 0, removeCount-1).Err()
|
||||
if err != nil {
|
||||
log.Debug("redis zremrangebyrank failed, err:%v\n", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func RedisZRangeWithScores(key string, start, stop int64) ([]redis.Z, error) {
|
||||
if RdbRead == nil {
|
||||
return nil, nil
|
||||
}
|
||||
val, err := RdbRead.ZRangeWithScores(ctx, key, start, stop).Result()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return val, nil
|
||||
}
|
||||
|
||||
func RedisZRevRangeWithScores(key string, start, stop int64) ([]redis.Z, error) {
|
||||
if RdbRead == nil {
|
||||
return nil, nil
|
||||
}
|
||||
val, err := RdbRead.ZRevRangeWithScores(ctx, key, start, stop).Result()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return val, nil
|
||||
}
|
||||
|
||||
func RedisZGetByIndexWithScore(key string, index int64) (*redis.Z, error) {
|
||||
if RdbRead == nil {
|
||||
return nil, nil
|
||||
}
|
||||
val, err := RdbRead.ZRangeWithScores(ctx, key, index, index).Result()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(val) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
return &val[0], nil
|
||||
}
|
||||
|
||||
func RedisZRankWithScores(key, member string) (int64, float64, error) {
|
||||
if RdbRead == nil {
|
||||
return 0, 0, nil
|
||||
}
|
||||
val, err := RdbRead.ZRank(ctx, key, member).Result()
|
||||
if err != nil {
|
||||
return 0, 0, err
|
||||
}
|
||||
score, err := RdbRead.ZScore(ctx, key, member).Result()
|
||||
if err != nil {
|
||||
return 0, 0, err
|
||||
}
|
||||
return val, score, nil
|
||||
}
|
||||
|
||||
func RedisZCard(key string) (int64, error) {
|
||||
if RdbRead == nil {
|
||||
return 0, nil
|
||||
}
|
||||
val, err := RdbRead.ZCard(ctx, key).Result()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return val, nil
|
||||
}
|
||||
|
||||
func RedisDel(key string) {
|
||||
if RdbWrite == nil {
|
||||
log.Debug("redis write client is nil")
|
||||
return
|
||||
}
|
||||
err := RdbWrite.Del(ctx, key).Err()
|
||||
if err != nil {
|
||||
log.Debug("redis del failed, err:%v\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
@ -20,10 +20,12 @@ type Db_Account struct {
|
||||
Channel string `db:"channel"`
|
||||
DeviceId string `db:"device_id"`
|
||||
AutoId int `db:"auto_id"`
|
||||
IdName string `db:"id_name"`
|
||||
IdNum string `db:"id_num"`
|
||||
}
|
||||
|
||||
type ResPlayerBaseInfo struct {
|
||||
DwUin int32 `db:"dwUin"`
|
||||
DwUin int64 `db:"dwUin"`
|
||||
Energy int32 `db:"energy"`
|
||||
Star int32 `db:"star"`
|
||||
RecoverTime int32 `db:"recover_time"`
|
||||
@ -35,11 +37,12 @@ type ResPlayerBaseInfo struct {
|
||||
Guild int32 `db:"guild"`
|
||||
PackUnlockCount int32 `db:"pack_unlock_count"`
|
||||
LastPlayTime int32 `db:"last_play_time"`
|
||||
EnergyBuyCount int32 `db:"EnergyBuyCount"`
|
||||
Ban int64 `db:"ban"`
|
||||
UserName string `db:"user_name"`
|
||||
NickName string `db:"nick_name"`
|
||||
LoginTime int32 `db:"login_time"`
|
||||
LogoutTime int32 `db:"logout_time"`
|
||||
Todayolinetime int32 `db:"todayolinetime"`
|
||||
Node int32 `db:"node"`
|
||||
Rolecreatetime int32 `db:"rolecreatetime"`
|
||||
EmitOrderCnt int32 `db:"EmitOrderCnt"`
|
||||
DailyRenewTime int32 `db:"DailyRenewTime"`
|
||||
@ -458,7 +461,7 @@ type SqlAddFriendStruct struct {
|
||||
}
|
||||
|
||||
type SqlModStruct struct {
|
||||
DwUin int32 `db:"dwUin"`
|
||||
DwUin int64 `db:"dwUin"`
|
||||
ModData []byte `db:"mData"`
|
||||
UpdataTime int32 `db:"updateTime"`
|
||||
}
|
||||
@ -471,15 +474,40 @@ type SqlServerModStruct struct {
|
||||
}
|
||||
|
||||
type SqlServerMailStruct struct {
|
||||
Id int `db:"mail_id"`
|
||||
Title string `db:"title"`
|
||||
Content string `db:"content"`
|
||||
Items string `db:"items"`
|
||||
Start_time int64 `db:"start_time"`
|
||||
Register_time int64 `db:"register_time"`
|
||||
End_time int64 `db:"end_time"`
|
||||
Mail_type int `db:"mail_type"`
|
||||
To_uids string `db:"to_uids"`
|
||||
Id int `db:"mail_id"`
|
||||
Title string `db:"title"`
|
||||
Content string `db:"content"`
|
||||
SubTitle string `db:"subTitle"`
|
||||
SubTitleEn string `db:"subTitle_en"`
|
||||
TitleEn string `db:"title_en"`
|
||||
ContentEn string `db:"content_en"`
|
||||
TitlePtBr string `db:"title_ptbr"`
|
||||
SubTitlePtBr string `db:"subTitle_ptbr"`
|
||||
ContentPtBr string `db:"content_ptbr"`
|
||||
TitleEsLatam string `db:"title_es_latam"`
|
||||
SubTitleEsLatam string `db:"subTitle_es_latam"`
|
||||
ContentEsLatam string `db:"content_es_latam"`
|
||||
Items string `db:"items"`
|
||||
Start_time int64 `db:"start_time"`
|
||||
Register_time int64 `db:"register_time"`
|
||||
End_time int64 `db:"end_time"`
|
||||
Mail_type int `db:"mail_type"`
|
||||
Send_type int `db:"send_type"`
|
||||
To_uids string `db:"to_uids"`
|
||||
CreateTime int64 `db:"create_time"`
|
||||
}
|
||||
|
||||
type SqlActivityCfgStruct struct {
|
||||
Id int `db:"id"`
|
||||
Type int `db:"type"`
|
||||
Title string `db:"title"`
|
||||
MailTitle string `db:"mail_title"`
|
||||
MailContent string `db:"mail_content"`
|
||||
Level int `db:"level_limit"`
|
||||
Start_time int64 `db:"start_time"`
|
||||
End_time int64 `db:"end_time"`
|
||||
Cfg []byte `db:"cfg_buf"`
|
||||
Extra string `db:"extra"`
|
||||
}
|
||||
|
||||
type SqlChargeOrderStruct struct {
|
||||
|
||||
41
src/server/ga/log.go
Normal file
41
src/server/ga/log.go
Normal file
@ -0,0 +1,41 @@
|
||||
package ga
|
||||
|
||||
import (
|
||||
galog "github.com/tuyou/galog"
|
||||
)
|
||||
|
||||
const (
|
||||
PROJECT_ID = "20659"
|
||||
CLIENT_ID = "Android_5.00_tyGuest,facebook.googleplay.0-hall20659.googleplay.Meowment"
|
||||
)
|
||||
|
||||
var glogger *galog.GALogger
|
||||
|
||||
func init() {
|
||||
glog, err := galog.NewGALogger("logs", PROJECT_ID, CLIENT_ID, galog.LogTypeTrack)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
glogger = glog
|
||||
}
|
||||
|
||||
func GAlogEvent(event string, userID string, deviceID string, properties map[string]interface{}) {
|
||||
newProperties := make(map[string]interface{})
|
||||
for k, v := range properties {
|
||||
// // JSON encode the value
|
||||
// jsonBytes, err := json.Marshal(v)
|
||||
// if err != nil {
|
||||
// newProperties["proj_"+k] = fmt.Sprintf("%v", v) // 无法解析直接转为字符串
|
||||
// continue
|
||||
// }
|
||||
// newProperties["proj_"+k] = string(jsonBytes)
|
||||
newProperties["proj_"+k] = v
|
||||
}
|
||||
properties = newProperties
|
||||
glogger.
|
||||
GetEntry(event).
|
||||
SetDeviceID(deviceID).
|
||||
SetUserID(userID).
|
||||
SetProperties(properties).
|
||||
Flush()
|
||||
}
|
||||
7
src/server/galog/.gitignore
vendored
Normal file
7
src/server/galog/.gitignore
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
.DS_Store
|
||||
.vscode/
|
||||
.idea/
|
||||
*.log
|
||||
logs/
|
||||
ga_log/
|
||||
asset_log/
|
||||
292
src/server/galog/README.md
Normal file
292
src/server/galog/README.md
Normal file
@ -0,0 +1,292 @@
|
||||
# galog
|
||||
|
||||
galog是一个无三方依赖、支持单CPU最高5wQPS写入的ga-sdk组件,可直接用于GA事实日志和资产日志打点。
|
||||
|
||||
> 说明:默认是异步写入模式,异步队列长度=100,较大QPS时可自行调整,详见参数:
|
||||
> - enableAsync
|
||||
> - defaultAsyncMsgLen
|
||||
|
||||
## Usage
|
||||
|
||||
```golang
|
||||
// ga日志初始化
|
||||
projectID := "20433"
|
||||
clientID := "Android_5.0_tyGuest,weixinPay,tyAccount.alipay.0-hall20433.tuyoo.sdktest"
|
||||
glogger, err := galog.NewGALogger("logs", projectID, clientID, galog.LogTypeTrack)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// ga日志打点调用
|
||||
props := map[string]interface{}{
|
||||
"ip_address": "127.0.0.1",
|
||||
"proj_app_id": "10010",
|
||||
"uuid": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
|
||||
"ts": tt.UnixNano(),
|
||||
}
|
||||
glogger.
|
||||
GetEntry("sdk_s_login_succ").
|
||||
SetDeviceID("device001").
|
||||
SetUserID("10086").
|
||||
SetProperties(props).
|
||||
Flush()
|
||||
```
|
||||
|
||||
```golang
|
||||
// asset日志初始化
|
||||
projectID := "28"
|
||||
clientID := "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz"
|
||||
glogger, err := galog.NewGALogger("logs", projectID, clientID, galog.LogTypeAsset)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// asset日志打点调用
|
||||
asset := galog.AssetProperties{}
|
||||
asset.
|
||||
SetAssetID("13101").
|
||||
SetAssetName("\u9501\u5b9a").
|
||||
SetAssetType("6").
|
||||
SetAssetFinal("2").
|
||||
SetAssetAssociated("3").
|
||||
SetAssetStartTime("0").
|
||||
SetAssetTimeLimit("0").
|
||||
SetAssetSource("").
|
||||
SetKV("uuid", "uuid-v4")
|
||||
|
||||
glogger.
|
||||
GetEntry("asset_increase").
|
||||
SetDeviceID("").
|
||||
SetUserID("10086").
|
||||
SetProperties(asset).
|
||||
Flush()
|
||||
```
|
||||
|
||||
## suger usage
|
||||
|
||||
```golang
|
||||
package chat_log
|
||||
|
||||
import (
|
||||
"log"
|
||||
"strconv"
|
||||
|
||||
"tygit.tuyoo.com/gocomponents/galog"
|
||||
)
|
||||
|
||||
var (
|
||||
slogger *galog.Logger
|
||||
galogger *galog.GALogger
|
||||
|
||||
lerr error
|
||||
)
|
||||
|
||||
// MustInitLoggerOnce 服务启动后初始化一次
|
||||
func MustInitLoggerOnce() {
|
||||
slogger, lerr = galog.NewServerLogger(&galog.ServerLogOptions{
|
||||
LogDir: "run/logs",
|
||||
EnableAsync: true,
|
||||
AsyncQueueSize: 1000,
|
||||
})
|
||||
if lerr != nil {
|
||||
log.Printf("MustInitLoggerOnce err: %s\n", lerr.Error())
|
||||
panic("MustInitLoggerOnce err")
|
||||
}
|
||||
}
|
||||
|
||||
// MustInitGALoggerOnce 服务启动后初始化一次
|
||||
func MustInitGALoggerOnce() {
|
||||
galogger, lerr = galog.NewServerGALogger(&galog.ServerGALogOptions{
|
||||
LogDir: "run/bi",
|
||||
EnableAsync: true,
|
||||
AsyncQueueSize: 1000,
|
||||
ProjectID: ProjectId,
|
||||
ClientID: ClientId,
|
||||
LogType: galog.LogTypeTrack,
|
||||
})
|
||||
if lerr != nil {
|
||||
log.Printf("MustInitGALoggerOnce err: %s\n", lerr.Error())
|
||||
panic("MustInitGALoggerOnce err")
|
||||
}
|
||||
}
|
||||
|
||||
func LogToGANew(eventName, deviceId string, userId int64, prop map[string]interface{}, version string) {
|
||||
lib := map[string]string{
|
||||
"lib_type": "golang",
|
||||
"lib_version": version,
|
||||
}
|
||||
|
||||
galogger.
|
||||
GetEntry(eventName).
|
||||
SetDeviceID(deviceId).
|
||||
SetUserID(strconv.FormatInt(userId, 10)).
|
||||
SetLib(lib).
|
||||
SetProperties(prop).
|
||||
Flush()
|
||||
}
|
||||
```
|
||||
|
||||
## 日志目录结构
|
||||
|
||||
```
|
||||
{logDir}/ga_log/{日志类型}_{hostname}_{年月日}_{小时}.log
|
||||
{logDir}/asset_log/{日志类型}_{hostname}_{年月日}_{小时}.log
|
||||
```
|
||||
|
||||
## Benchmark
|
||||
|
||||
- 测试机:Mac-M1 8c 16G
|
||||
|
||||
- 同步写入模式
|
||||
```
|
||||
goos: darwin
|
||||
goarch: arm64
|
||||
pkg: tygit.tuyoo.com/gocomponents/galog
|
||||
BenchmarkGaLog-8 87565 12831 ns/op 7590 B/op 90 allocs/op
|
||||
BenchmarkAssetLog-8 234127 5832 ns/op 3028 B/op 44 allocs/op
|
||||
PASS
|
||||
ok tygit.tuyoo.com/gocomponents/galog 3.190s
|
||||
|
||||
# 100w行日志文件,写入性能未见明显衰减
|
||||
BenchmarkGaLog-8 89175 12481 ns/op 7590 B/op 90 allocs/op
|
||||
BenchmarkAssetLog-8 195075 5933 ns/op 3028 B/op 44 allocs/op
|
||||
```
|
||||
|
||||
- 异步写入模式(默认)
|
||||
```
|
||||
goos: darwin
|
||||
goarch: arm64
|
||||
pkg: tygit.tuyoo.com/gocomponents/galog
|
||||
BenchmarkGaLog-8 95530 11331 ns/op 7599 B/op 90 allocs/op
|
||||
BenchmarkAssetLog-8 337963 3512 ns/op 3032 B/op 44 allocs/op
|
||||
PASS
|
||||
ok tygit.tuyoo.com/gocomponents/galog 3.040s
|
||||
|
||||
# 120w行日志文件,写入性能未见明显衰减
|
||||
BenchmarkGaLog-8 116559 10450 ns/op 7598 B/op 90 allocs/op
|
||||
BenchmarkAssetLog-8 335670 3512 ns/op 3032 B/op 44 allocs/op
|
||||
```
|
||||
|
||||
## Load Testing
|
||||
|
||||
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o galog examples/hey.go
|
||||
|
||||
- 测试机:sa101-ecs-bj4-pt57-test-wxy
|
||||
- linux服务器配置:2c4G
|
||||
- 测试时间:2024-02-26 17:45 ~ 18:45
|
||||
|
||||
```
|
||||
./galog -n 1000000 -c 2 -q 100
|
||||
```
|
||||
|
||||
| 压测说明 | CPU平台使用率 | 内存使用率 | IO平均使用率 | 进程打开的文件句柄数 |
|
||||
|----- | ----- | ----- | ----- | ----- |
|
||||
| 无任务 | 1% | 52% | 0.08% | 0 |
|
||||
| 并发=2,qps=200 | 1% | 52% | 0.08% | 7 |
|
||||
| 并发=5,qps=5000 | 4% | 52% | 1% | 7 |
|
||||
| 并发=5,qps=50000(队列1000,有阻塞) realqps=5000 | 40% | 52% | 30% | 7 |
|
||||
| 并发=5,qps=50000(队列10000,有阻塞) realqps=6500 | 6% | 52% | 1% | 7 |
|
||||
| 并发=20,qps=50000(队列10000,有阻塞) realqps=18000 | 10% | 52% | 3% | 7 |
|
||||
| 并发=50,qps=50000(队列10000) realqps=50000 | 35% | 52% | 10% | 7 |
|
||||
| 并发=100,qps=100000(队列10000) realqps=90000 | 75% | 52% | 16% | 7 |
|
||||
|
||||
- 压测结果:写入队列=10000,单核支持最高写入QPS约5w,CPU=75%。
|
||||
|
||||
- 监控结果如下:
|
||||

|
||||

|
||||
|
||||
## ga日志格式范式
|
||||
|
||||
```json
|
||||
{
|
||||
"project_id": "20437",
|
||||
"type": "track",
|
||||
"event": "sdk_sword_holder_succ",
|
||||
"event_time": 1708568434744,
|
||||
"device_id": "",
|
||||
"user_id": "908825698",
|
||||
"client_id": "Android_5.1_tyGuest,weixinPay,tyAccount.alipay.0-hall20437.tuyoo.sdkonline",
|
||||
"properties": {
|
||||
"sdk_track_id": "3:6060:636978360:1708568434",
|
||||
"sdk_sub_channel": "fish3d",
|
||||
"country": "中国",
|
||||
"proj_game_id": "",
|
||||
"sdk_error_code": "",
|
||||
"sdk_error_msg": "",
|
||||
"city": "宁德市",
|
||||
"sdk_sword_track_id": "807370ff-ceac-4ee3-b68f-50642ca4953c",
|
||||
"sub_platform_id": "2",
|
||||
"sdk_sword_holder_id": "320",
|
||||
"sdk_sword_version": "v1.1.7",
|
||||
"uuid": "56fdf0f9-9daa-4bf6-be69-88e15f05c36c",
|
||||
"province": "福建省",
|
||||
"sdk_login_channel_type": "",
|
||||
"app_id": "20437",
|
||||
"sdk_s_login_channel_type": "",
|
||||
"sdk_main_channel": "official",
|
||||
"game_id": "20437",
|
||||
"sdk_s_route": "/api/sworder-server/rule/v1/getUserRisk",
|
||||
"sdk_sword_holder_result": "999999",
|
||||
"proj_cloud_id": "3",
|
||||
"proj_app_id": "10010",
|
||||
"ip_address": "59.58.58.18",
|
||||
"sdk_sword_holder_type": "login",
|
||||
"sdk_sword_holder_name": "非信任设备禁止登录",
|
||||
"proj_client_id": "Android_5.505_tyGuest,tyAccount,yidunlogin.weixinPay,alipay,yinlian,jingdong,weixinShare.0-hall28.official.fish3d",
|
||||
"sdk_sword_holder_process": "{\"330\":[\"[330-0]未命中\"]}",
|
||||
"sdk_yidun_device_id": "UuCJztYTtxRETUVUAEaFoCQaw8H2qkWE",
|
||||
"platform_id": "1",
|
||||
"sub_channel_id": "sdkonline",
|
||||
"proj_package_name": "",
|
||||
"channel_id": "tuyoo"
|
||||
},
|
||||
"lib": {
|
||||
"lib_version": "v1.0.0",
|
||||
"lib_type": "go"
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
## asset日志格式范例
|
||||
|
||||
```json
|
||||
{
|
||||
"project_id": "28",
|
||||
"type": "asset",
|
||||
"event": "asset_increase",
|
||||
"event_time": 1706631881042,
|
||||
"device_id": "",
|
||||
"user_id": "928426614",
|
||||
"client_id": "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz",
|
||||
"properties": {
|
||||
"proj_ga_eventId": "STARTUP_QUEST_REWARD_COIN",
|
||||
"proj_asset_value": "2",
|
||||
"proj_asset_final": "2",
|
||||
"proj_chip_type": "6",
|
||||
"proj_asset_id": "13101",
|
||||
"proj_asset_name": "\u9501\u5b9a",
|
||||
"proj_asset_type": "free",
|
||||
"proj_asset_time_limit": "0",
|
||||
"proj_asset_start_time": "0",
|
||||
"proj_asset_source": "",
|
||||
"proj_tuyoo_order_id": "",
|
||||
"game_id": "28",
|
||||
"app_id": "10063",
|
||||
"proj_project_id": "28",
|
||||
"proj_client_id": "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz",
|
||||
"uuid": "77b907688c624076a84ca7b4b29668a5"
|
||||
},
|
||||
"lib": {
|
||||
"lib_version": "v1.0.0",
|
||||
"lib_type": "go"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Changelog
|
||||
|
||||
| 版本 | 修订说明 | 提交人 | 发布时间 |
|
||||
|----- | ----- | ----- | ----- |
|
||||
| v1.0.0 | galog 0依赖、支持异步写入、小时切割日志、ga和asset日志类型 | 田文 | 2024.02.22 |
|
||||
| v1.1.0 | add suger | 田文 | 2025.06.30 |
|
||||
78
src/server/galog/buffer.go
Normal file
78
src/server/galog/buffer.go
Normal file
@ -0,0 +1,78 @@
|
||||
package galog
|
||||
|
||||
import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
var (
|
||||
defaultBufPool = newBufPool()
|
||||
)
|
||||
|
||||
const (
|
||||
_size = 1024
|
||||
_defaultLineEnding = "\n"
|
||||
)
|
||||
|
||||
type BufPool struct {
|
||||
p *sync.Pool
|
||||
}
|
||||
|
||||
func newBufPool() BufPool {
|
||||
return BufPool{p: &sync.Pool{
|
||||
New: func() interface{} {
|
||||
return &Buffer{bs: make([]byte, 0, _size)}
|
||||
},
|
||||
}}
|
||||
}
|
||||
|
||||
// Get retrieves a Buffer from the pool, creating one if necessary.
|
||||
func (p BufPool) Get() *Buffer {
|
||||
buf := p.p.Get().(*Buffer)
|
||||
buf.Reset()
|
||||
buf.pool = p
|
||||
return buf
|
||||
}
|
||||
|
||||
func (p BufPool) put(buf *Buffer) {
|
||||
p.p.Put(buf)
|
||||
}
|
||||
|
||||
// Buffer is a thin wrapper around a byte slice. It's intended to be pooled, so
|
||||
// the only way to construct one is via a Pool.
|
||||
type Buffer struct {
|
||||
bs []byte
|
||||
pool BufPool
|
||||
}
|
||||
|
||||
// AppendByte writes a single byte to the Buffer.
|
||||
func (b *Buffer) AppendByte(v byte) {
|
||||
b.bs = append(b.bs, v)
|
||||
}
|
||||
|
||||
// AppendString writes a string to the Buffer.
|
||||
func (b *Buffer) AppendString(s string) {
|
||||
b.bs = append(b.bs, s...)
|
||||
}
|
||||
|
||||
// Bytes returns a mutable reference to the underlying byte slice.
|
||||
func (b *Buffer) Bytes() []byte {
|
||||
return b.bs
|
||||
}
|
||||
|
||||
// String returns a string copy of the underlying byte slice.
|
||||
func (b *Buffer) String() string {
|
||||
return string(b.bs)
|
||||
}
|
||||
|
||||
// Reset resets the underlying byte slice. Subsequent writes re-use the slice's
|
||||
// backing array.
|
||||
func (b *Buffer) Reset() {
|
||||
b.bs = b.bs[:0]
|
||||
}
|
||||
|
||||
// Free returns the Buffer to its Pool.
|
||||
//
|
||||
// Callers must not retain references to the Buffer after calling Free.
|
||||
func (b *Buffer) Free() {
|
||||
b.pool.put(b)
|
||||
}
|
||||
139
src/server/galog/entry.go
Normal file
139
src/server/galog/entry.go
Normal file
@ -0,0 +1,139 @@
|
||||
package galog
|
||||
|
||||
var (
|
||||
defaultLib = map[string]string{"lib_type": "go", "lib_version": "v1.0.0"}
|
||||
)
|
||||
|
||||
type EntryBean struct {
|
||||
// ProjectID 独立项目ID
|
||||
ProjectID string `json:"project_id"`
|
||||
// LogType 日志类型 默认是track
|
||||
LogType LogType `json:"type"`
|
||||
// Event 事件ID
|
||||
Event string `json:"event"`
|
||||
// EventTime 毫秒级时间
|
||||
EventTime int64 `json:"event_time"`
|
||||
// DeviceID 设备ID
|
||||
DeviceID string `json:"device_id"`
|
||||
// UserID 用户ID
|
||||
UserID string `json:"user_id"`
|
||||
// ClientID clientID
|
||||
ClientID string `json:"client_id"`
|
||||
// Properties 重要额外字段
|
||||
Properties map[string]interface{} `json:"properties"`
|
||||
// Lib 代码库
|
||||
Lib map[string]string `json:"lib"`
|
||||
}
|
||||
|
||||
type Entry struct {
|
||||
logger *GALogger
|
||||
bean *EntryBean
|
||||
}
|
||||
|
||||
func (e *Entry) SetUserID(uid string) *Entry {
|
||||
if uid == "" {
|
||||
uid = "0"
|
||||
}
|
||||
e.bean.UserID = uid
|
||||
return e
|
||||
}
|
||||
|
||||
func (e *Entry) SetDeviceID(did string) *Entry {
|
||||
e.bean.DeviceID = did
|
||||
return e
|
||||
}
|
||||
|
||||
func (e *Entry) SetLib(lib map[string]string) *Entry {
|
||||
e.bean.Lib = lib
|
||||
return e
|
||||
}
|
||||
|
||||
func (e *Entry) SetClientID(cid string) *Entry {
|
||||
e.bean.ClientID = cid
|
||||
return e
|
||||
}
|
||||
|
||||
func (e *Entry) SetProperties(props map[string]interface{}) *Entry {
|
||||
e.bean.Properties = props
|
||||
return e
|
||||
}
|
||||
|
||||
// Flush 日志写入
|
||||
func (e *Entry) Flush() {
|
||||
defer e.logger.putEntry(e)
|
||||
e.logger.biz(e.bean)
|
||||
}
|
||||
|
||||
type AssetProperties map[string]interface{}
|
||||
|
||||
// SetAssetID 资产id
|
||||
func (ap AssetProperties) SetAssetID(assetID string) AssetProperties {
|
||||
ap["proj_asset_id"] = assetID
|
||||
return ap
|
||||
}
|
||||
|
||||
// SetAssetName 资产名称
|
||||
func (ap AssetProperties) SetAssetName(assetName string) AssetProperties {
|
||||
ap["proj_asset_name"] = assetName
|
||||
return ap
|
||||
}
|
||||
|
||||
// SetAssetType 资产付费类型
|
||||
func (ap AssetProperties) SetAssetType(assetType string) AssetProperties {
|
||||
ap["proj_asset_type"] = assetType
|
||||
return ap
|
||||
}
|
||||
|
||||
// SetAssetValue 资产变化数量
|
||||
func (ap AssetProperties) SetAssetValue(assetValue string) AssetProperties {
|
||||
ap["proj_asset_value"] = assetValue
|
||||
return ap
|
||||
}
|
||||
|
||||
// SetAssetFinal 资产变化后的剩余数量
|
||||
func (ap AssetProperties) SetAssetFinal(assetFinal string) AssetProperties {
|
||||
ap["proj_asset_final"] = assetFinal
|
||||
return ap
|
||||
}
|
||||
|
||||
// SetAssetTimeLimit 持续性资产持续时间
|
||||
func (ap AssetProperties) SetAssetTimeLimit(assetTimeLimit string) AssetProperties {
|
||||
ap["proj_asset_time_limit"] = assetTimeLimit
|
||||
return ap
|
||||
}
|
||||
|
||||
// SetAssetStartTime 持续性资产生效时间
|
||||
func (ap AssetProperties) SetAssetStartTime(assetStartTime string) AssetProperties {
|
||||
ap["proj_asset_start_time"] = assetStartTime
|
||||
return ap
|
||||
}
|
||||
|
||||
// SetAssetSource 变化的原因
|
||||
func (ap AssetProperties) SetAssetSource(assetSource string) AssetProperties {
|
||||
ap["proj_asset_source"] = assetSource
|
||||
return ap
|
||||
}
|
||||
|
||||
// SetAssetAssociated 变化关联资产
|
||||
func (ap AssetProperties) SetAssetAssociated(assetAssociated string) AssetProperties {
|
||||
ap["proj_asset_associated"] = assetAssociated
|
||||
return ap
|
||||
}
|
||||
|
||||
// SetTuyooOrderID SDK订单号
|
||||
func (ap AssetProperties) SetTuyooOrderID(tuyooOrderID string) AssetProperties {
|
||||
ap["proj_tuyoo_order_id"] = tuyooOrderID
|
||||
return ap
|
||||
}
|
||||
|
||||
// SetOrderID 游戏服订单号
|
||||
func (ap AssetProperties) SetOrderID(assetOrderID string) AssetProperties {
|
||||
ap["proj_order_id"] = assetOrderID
|
||||
return ap
|
||||
}
|
||||
|
||||
// SetKV 设置自定义字段必须通知到数据组,否则打点失败
|
||||
func (ap AssetProperties) SetKV(k, v string) AssetProperties {
|
||||
ap[k] = v
|
||||
return ap
|
||||
}
|
||||
83
src/server/galog/examples/hey.go
Normal file
83
src/server/galog/examples/hey.go
Normal file
@ -0,0 +1,83 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
"runtime"
|
||||
|
||||
"tygit.tuyoo.com/gocomponents/galog/examples/worker"
|
||||
)
|
||||
|
||||
var (
|
||||
output = flag.String("o", "", "")
|
||||
|
||||
c = flag.Int("c", 50, "")
|
||||
n = flag.Int("n", 200, "")
|
||||
q = flag.Float64("q", 0, "")
|
||||
|
||||
cpus = flag.Int("cpus", runtime.GOMAXPROCS(-1), "")
|
||||
)
|
||||
|
||||
var usage = `Usage: hey [options...] <url>
|
||||
|
||||
Options:
|
||||
-n Number of requests to run. Default is 200.
|
||||
-c Number of workers to run concurrently. Total number of requests cannot
|
||||
be smaller than the concurrency level. Default is 50.
|
||||
-q Rate limit, in queries per second (QPS) per worker. Default is no rate limit.
|
||||
-o Output type. If none provided, a summary is printed.
|
||||
"csv" is the only supported alternative. Dumps the response
|
||||
metrics in comma-separated values format.
|
||||
|
||||
-cpus Number of used cpu cores.
|
||||
(default for current machine is %d cores)
|
||||
`
|
||||
|
||||
func MainHey() {
|
||||
flag.Usage = func() {
|
||||
fmt.Fprintf(os.Stderr, usage, runtime.NumCPU())
|
||||
}
|
||||
|
||||
flag.Parse()
|
||||
|
||||
runtime.GOMAXPROCS(*cpus)
|
||||
num := *n
|
||||
conc := *c
|
||||
q := *q
|
||||
|
||||
if num <= 0 || conc <= 0 {
|
||||
usageAndExit("-n and -c cannot be smaller than 1.")
|
||||
}
|
||||
|
||||
if num < conc {
|
||||
usageAndExit("-n cannot be less than -c.")
|
||||
}
|
||||
|
||||
w := &worker.Work{
|
||||
N: num,
|
||||
C: conc,
|
||||
QPS: q,
|
||||
Output: *output,
|
||||
}
|
||||
w.Init()
|
||||
|
||||
c := make(chan os.Signal, 1)
|
||||
signal.Notify(c, os.Interrupt)
|
||||
go func() {
|
||||
<-c
|
||||
w.Stop()
|
||||
}()
|
||||
w.Run()
|
||||
}
|
||||
|
||||
func usageAndExit(msg string) {
|
||||
if msg != "" {
|
||||
fmt.Fprint(os.Stderr, msg)
|
||||
fmt.Fprintf(os.Stderr, "\n\n")
|
||||
}
|
||||
flag.Usage()
|
||||
fmt.Fprintf(os.Stderr, "\n")
|
||||
os.Exit(1)
|
||||
}
|
||||
107
src/server/galog/examples/main.go
Normal file
107
src/server/galog/examples/main.go
Normal file
@ -0,0 +1,107 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"tygit.tuyoo.com/gocomponents/galog"
|
||||
)
|
||||
|
||||
func main() {
|
||||
log.Println("log ga asset server every 5 seconds.")
|
||||
go logGA()
|
||||
go logAsset()
|
||||
logServer()
|
||||
}
|
||||
|
||||
func logGA() {
|
||||
projectID := "20433"
|
||||
clientID := "Android_5.0_tyGuest,weixinPay,tyAccount.alipay.0-hall20433.tuyoo.sdktest"
|
||||
logger, err := galog.NewServerGALogger(&galog.ServerGALogOptions{
|
||||
ProjectID: projectID,
|
||||
ClientID: clientID,
|
||||
LogDir: "ga_log",
|
||||
LogType: galog.LogTypeTrack,
|
||||
EnableAsync: true,
|
||||
AsyncQueueSize: 1000,
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
t := time.NewTicker(5 * time.Second)
|
||||
|
||||
for tt := range t.C {
|
||||
log.Println("logGA")
|
||||
logger.
|
||||
GetEntry("sdk_s_login_succ").
|
||||
SetDeviceID("device001").
|
||||
SetUserID("10086").
|
||||
SetProperties(map[string]interface{}{
|
||||
"ip_address": "127.0.0.1",
|
||||
"proj_app_id": "10010",
|
||||
"uuid": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
|
||||
"ts": tt.UnixNano(),
|
||||
}).
|
||||
Flush()
|
||||
}
|
||||
}
|
||||
|
||||
func logAsset() {
|
||||
projectID := "28"
|
||||
clientID := "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz"
|
||||
logger, err := galog.NewGALogger(".", projectID, clientID, galog.LogTypeAsset)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
t := time.NewTicker(5 * time.Second)
|
||||
|
||||
asset := galog.AssetProperties{}
|
||||
asset.SetAssetID("13101").
|
||||
SetAssetName("\u9501\u5b9a").
|
||||
SetAssetType("6").
|
||||
SetAssetFinal("2").
|
||||
SetAssetAssociated("3").
|
||||
SetAssetStartTime("0").
|
||||
SetAssetTimeLimit("0").
|
||||
SetAssetSource("").
|
||||
SetKV("uuid", "uuid-v4")
|
||||
|
||||
for tt := range t.C {
|
||||
log.Println("logAssert")
|
||||
_ = tt
|
||||
logger.
|
||||
GetEntry("asset_increase").
|
||||
SetDeviceID("").
|
||||
SetUserID("10086").
|
||||
SetProperties(asset).
|
||||
Flush()
|
||||
}
|
||||
}
|
||||
|
||||
func logServer() {
|
||||
slogger, _ := galog.NewServerLogger(&galog.ServerLogOptions{
|
||||
LogDir: "logs",
|
||||
EnableAsync: true,
|
||||
AsyncQueueSize: 1000,
|
||||
})
|
||||
|
||||
t := time.NewTicker(5 * time.Second)
|
||||
|
||||
for tt := range t.C {
|
||||
log.Println("logServer")
|
||||
_ = tt
|
||||
|
||||
msgMap := map[string]interface{}{
|
||||
"CreateTime": time.Now().UnixNano() / int64(time.Microsecond),
|
||||
"Host": "host",
|
||||
"AppId": "10010",
|
||||
"UserId": "12345",
|
||||
"Level": "Notice",
|
||||
"Entry": "Login",
|
||||
"Func": "HandleLogin",
|
||||
"TraceMsg": "HandlerWSFriApplyList|HandlerWSFriApplyList",
|
||||
"Params": "{\"isoCode\":\"CN\",\"P0\":[3,\"Total: 3, End: 0, \"],\"pf\":\"wx\",\"appVer\":\"1.0\",\"sdkVer\":\"1.0\",\"ip\":\"58.247.195.158\",\"clientId\":\"7abd64bf-3fb6-4fef-a25e-e6562b7fb857\",\"timeZone\":\"Asia/Shanghai\",\"loginMark\":\"\",\"st\":1472}",
|
||||
}
|
||||
slogger.BizErr(msgMap)
|
||||
}
|
||||
}
|
||||
43
src/server/galog/examples/worker/print.go
Normal file
43
src/server/galog/examples/worker/print.go
Normal file
@ -0,0 +1,43 @@
|
||||
package worker
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
func newTemplate(output string) *template.Template {
|
||||
outputTmpl := output
|
||||
switch outputTmpl {
|
||||
case "":
|
||||
outputTmpl = defaultTmpl
|
||||
case "csv":
|
||||
outputTmpl = csvTmpl
|
||||
}
|
||||
return template.Must(template.New("tmpl").Funcs(tmplFuncMap).Parse(outputTmpl))
|
||||
}
|
||||
|
||||
var tmplFuncMap = template.FuncMap{
|
||||
"formatNumber": formatNumber,
|
||||
"formatNumberInt": formatNumberInt,
|
||||
}
|
||||
|
||||
func formatNumber(duration float64) string {
|
||||
return fmt.Sprintf("%4.4f", duration)
|
||||
}
|
||||
|
||||
func formatNumberInt(duration int) string {
|
||||
return fmt.Sprintf("%d", duration)
|
||||
}
|
||||
|
||||
var (
|
||||
defaultTmpl = `
|
||||
Summary:
|
||||
Total: {{ formatNumber .Total.Seconds }} secs
|
||||
Requests/sec: {{ formatNumber .Rps }}
|
||||
|
||||
TotalNumRes: {{ .NumRes }}
|
||||
AvgTotal: {{ .AvgTotal }}
|
||||
`
|
||||
csvTmpl = `{{ $connLats := .ConnLats }}{{ $dnsLats := .DnsLats }}{{ $dnsLats := .DnsLats }}{{ $reqLats := .ReqLats }}{{ $delayLats := .DelayLats }}{{ $resLats := .ResLats }}{{ $statusCodeLats := .StatusCodes }}{{ $offsets := .Offsets}}response-time,DNS+dialup,DNS,Request-write,Response-delay,Response-read,status-code,offset{{ range $i, $v := .Lats }}
|
||||
{{ formatNumber $v }},{{ formatNumber (index $connLats $i) }},{{ formatNumber (index $dnsLats $i) }},{{ formatNumber (index $reqLats $i) }},{{ formatNumber (index $delayLats $i) }},{{ formatNumber (index $resLats $i) }},{{ formatNumberInt (index $statusCodeLats $i) }},{{ formatNumber (index $offsets $i) }}{{ end }}`
|
||||
)
|
||||
94
src/server/galog/examples/worker/report.go
Normal file
94
src/server/galog/examples/worker/report.go
Normal file
@ -0,0 +1,94 @@
|
||||
package worker
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"time"
|
||||
)
|
||||
|
||||
type report struct {
|
||||
avgTotal float64
|
||||
rps float64
|
||||
|
||||
results chan *result
|
||||
done chan bool
|
||||
total time.Duration
|
||||
|
||||
numRes int64
|
||||
output string
|
||||
|
||||
w io.Writer
|
||||
}
|
||||
|
||||
func newReport(w io.Writer, results chan *result, output string, n int) *report {
|
||||
return &report{
|
||||
output: output,
|
||||
results: results,
|
||||
done: make(chan bool, 1),
|
||||
w: w,
|
||||
}
|
||||
}
|
||||
|
||||
func runReporter(r *report) {
|
||||
// Loop will continue until channel is closed
|
||||
for res := range r.results {
|
||||
r.numRes++
|
||||
r.avgTotal += res.duration.Seconds()
|
||||
}
|
||||
// Signal reporter is done.
|
||||
r.done <- true
|
||||
}
|
||||
|
||||
func (r *report) finalize(total time.Duration) {
|
||||
r.total = total
|
||||
r.rps = float64(r.numRes) / r.total.Seconds()
|
||||
r.print()
|
||||
}
|
||||
|
||||
func (r *report) print() {
|
||||
buf := &bytes.Buffer{}
|
||||
if err := newTemplate(r.output).Execute(buf, r.snapshot()); err != nil {
|
||||
log.Println("error:", err.Error())
|
||||
return
|
||||
}
|
||||
r.printf(buf.String())
|
||||
|
||||
r.printf("\n")
|
||||
}
|
||||
|
||||
func (r *report) printf(s string, v ...interface{}) {
|
||||
fmt.Fprintf(r.w, s, v...)
|
||||
}
|
||||
|
||||
func (r *report) snapshot() Report {
|
||||
snapshot := Report{
|
||||
AvgTotal: r.avgTotal,
|
||||
Rps: r.rps,
|
||||
Total: r.total,
|
||||
NumRes: r.numRes,
|
||||
}
|
||||
|
||||
return snapshot
|
||||
}
|
||||
|
||||
type Report struct {
|
||||
AvgTotal float64
|
||||
Rps float64
|
||||
|
||||
Total time.Duration
|
||||
|
||||
NumRes int64
|
||||
}
|
||||
|
||||
type LatencyDistribution struct {
|
||||
Percentage int
|
||||
Latency float64
|
||||
}
|
||||
|
||||
type Bucket struct {
|
||||
Mark float64
|
||||
Count int
|
||||
Frequency float64
|
||||
}
|
||||
176
src/server/galog/examples/worker/worker.go
Normal file
176
src/server/galog/examples/worker/worker.go
Normal file
@ -0,0 +1,176 @@
|
||||
package worker
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"strconv"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"tygit.tuyoo.com/gocomponents/galog"
|
||||
)
|
||||
|
||||
var startTime = time.Now()
|
||||
|
||||
// now returns time.Duration using stdlib time
|
||||
func now() time.Duration { return time.Since(startTime) }
|
||||
|
||||
// Max size of the buffer of result channel.
|
||||
const maxResult = 1000000
|
||||
|
||||
type result struct {
|
||||
offset time.Duration
|
||||
duration time.Duration
|
||||
}
|
||||
|
||||
type Work struct {
|
||||
// N is the total number of requests to make.
|
||||
N int
|
||||
|
||||
// C is the concurrency level, the number of concurrent workers to run.
|
||||
C int
|
||||
|
||||
// Qps is the rate limit in queries per second.
|
||||
QPS float64
|
||||
|
||||
// Output represents the output type. If "csv" is provided, the
|
||||
// output will be dumped as a csv stream.
|
||||
Output string
|
||||
|
||||
// Writer is where results will be written. If nil, results are written to stdout.
|
||||
Writer io.Writer
|
||||
|
||||
initOnce sync.Once
|
||||
results chan *result
|
||||
stopCh chan struct{}
|
||||
start time.Duration
|
||||
|
||||
report *report
|
||||
}
|
||||
|
||||
func (b *Work) writer() io.Writer {
|
||||
if b.Writer == nil {
|
||||
return os.Stdout
|
||||
}
|
||||
return b.Writer
|
||||
}
|
||||
|
||||
// Init initializes internal data-structures
|
||||
func (b *Work) Init() {
|
||||
b.initOnce.Do(func() {
|
||||
b.results = make(chan *result, min(b.C*1000, maxResult))
|
||||
b.stopCh = make(chan struct{}, b.C)
|
||||
b.initLogger()
|
||||
})
|
||||
}
|
||||
|
||||
// Run makes all the requests, prints the summary. It blocks until
|
||||
// all work is done.
|
||||
func (b *Work) Run() {
|
||||
b.Init()
|
||||
b.start = now()
|
||||
b.report = newReport(b.writer(), b.results, b.Output, b.N)
|
||||
// Run the reporter first, it polls the result channel until it is closed.
|
||||
go func() {
|
||||
runReporter(b.report)
|
||||
}()
|
||||
b.runWorkers()
|
||||
b.Finish()
|
||||
}
|
||||
|
||||
func (b *Work) Stop() {
|
||||
// Send stop signal so that workers can stop gracefully.
|
||||
for i := 0; i < b.C; i++ {
|
||||
b.stopCh <- struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Work) Finish() {
|
||||
close(b.results)
|
||||
total := now() - b.start
|
||||
// Wait until the reporter is done.
|
||||
<-b.report.done
|
||||
b.report.finalize(total)
|
||||
}
|
||||
|
||||
var logger *galog.GALogger
|
||||
|
||||
func (b *Work) initLogger() {
|
||||
projectID := "28"
|
||||
clientID := "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz"
|
||||
logger, _ = galog.NewGALogger("logs", projectID, clientID, galog.LogTypeAsset)
|
||||
}
|
||||
|
||||
func (b *Work) doSth() {
|
||||
s := now()
|
||||
|
||||
// doSth here.
|
||||
asset := galog.AssetProperties{}
|
||||
asset.SetAssetID("13101").
|
||||
SetAssetName("\u9501\u5b9a").
|
||||
SetAssetType("6").
|
||||
SetAssetFinal("2").
|
||||
SetAssetAssociated("3").
|
||||
SetAssetStartTime("0").
|
||||
SetAssetTimeLimit("0").
|
||||
SetAssetSource("").
|
||||
SetKV("uuid", strconv.Itoa(int(time.Now().UnixNano())))
|
||||
logger.
|
||||
GetEntry("asset_increase").
|
||||
SetDeviceID("").
|
||||
SetUserID("10086").
|
||||
SetProperties(asset).
|
||||
Flush()
|
||||
|
||||
t := now()
|
||||
finish := t - s
|
||||
b.results <- &result{
|
||||
offset: s,
|
||||
duration: finish,
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Work) runWorker(n int) {
|
||||
var throttle <-chan time.Time
|
||||
if b.QPS > 0 {
|
||||
t := time.NewTicker(time.Duration(1e6/(b.QPS)) * time.Microsecond)
|
||||
throttle = t.C
|
||||
}
|
||||
|
||||
for i := 0; i < n; i++ {
|
||||
// Check if application is stopped. Do not send into a closed channel.
|
||||
select {
|
||||
case <-b.stopCh:
|
||||
return
|
||||
default:
|
||||
if b.QPS > 0 {
|
||||
<-throttle
|
||||
}
|
||||
b.doSth()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Work) runWorkers() {
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(b.C)
|
||||
|
||||
fmt.Printf("==RUN worker==> N:%d C:%d QPS:%v b.N / b.C:%v", b.N, b.C, b.QPS, b.N/b.C)
|
||||
|
||||
// Ignore the case where b.N % b.C != 0.
|
||||
for i := 0; i < b.C; i++ {
|
||||
go func() {
|
||||
b.runWorker(b.N / b.C)
|
||||
wg.Done()
|
||||
}()
|
||||
}
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func min(a, b int) int {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
264
src/server/galog/file.go
Normal file
264
src/server/galog/file.go
Normal file
@ -0,0 +1,264 @@
|
||||
package galog
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type fileLogWriter struct {
|
||||
sync.RWMutex
|
||||
|
||||
Rotate bool `json:"rotate"`
|
||||
Hourly bool `json:"hourly"`
|
||||
|
||||
// The opened file
|
||||
Filename string `json:"filename"`
|
||||
fileWriter *os.File
|
||||
|
||||
// Rotate hourly
|
||||
MaxHours int64 `json:"maxhours"` // 默认不删除日志
|
||||
hourlyOpenDate int
|
||||
hourlyOpenTime time.Time
|
||||
|
||||
// Permissions for log file
|
||||
Perm string `json:"perm"`
|
||||
// Permissions for directory if it is specified in FileName
|
||||
DirPerm string `json:"dirperm"`
|
||||
|
||||
RotatePerm string `json:"rotateperm"`
|
||||
|
||||
fileNameOnly, suffix string // like "project.log", project is fileNameOnly and .log is suffix
|
||||
}
|
||||
|
||||
func newFileWriter() LogProvider {
|
||||
w := &fileLogWriter{
|
||||
Rotate: true, // 开启日志轮转
|
||||
Hourly: true, // 开启日志小时轮转
|
||||
RotatePerm: "0440",
|
||||
Perm: "0660",
|
||||
DirPerm: "0770",
|
||||
}
|
||||
return w
|
||||
}
|
||||
|
||||
// Init file logger with json config.
|
||||
// jsonConfig like:
|
||||
//
|
||||
// {"filename":"logs/glog.log"}
|
||||
func (w *fileLogWriter) Init(config string) error {
|
||||
err := json.Unmarshal([]byte(config), w)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if w.Filename == "" {
|
||||
return errors.New("jsonconfig must have filename")
|
||||
}
|
||||
w.suffix = filepath.Ext(w.Filename)
|
||||
w.fileNameOnly = strings.TrimSuffix(w.Filename, w.suffix)
|
||||
if w.suffix == "" {
|
||||
w.suffix = ".log"
|
||||
}
|
||||
|
||||
err = w.startLogger()
|
||||
return err
|
||||
}
|
||||
|
||||
func (w *fileLogWriter) startLogger() error {
|
||||
file, err := w.createLogFile()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if w.fileWriter != nil {
|
||||
w.fileWriter.Close()
|
||||
}
|
||||
w.fileWriter = file
|
||||
return w.initFd()
|
||||
}
|
||||
|
||||
func (w *fileLogWriter) needRotateHourly(hour int) bool {
|
||||
return w.Hourly && hour != w.hourlyOpenDate
|
||||
}
|
||||
|
||||
func (w *fileLogWriter) createLogFile() (*os.File, error) {
|
||||
perm, err := strconv.ParseInt(w.Perm, 8, 64)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
dirperm, err := strconv.ParseInt(w.DirPerm, 8, 64)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
filepath := path.Dir(w.Filename)
|
||||
os.MkdirAll(filepath, os.FileMode(dirperm))
|
||||
|
||||
fd, err := os.OpenFile(w.Filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.FileMode(perm))
|
||||
if err == nil {
|
||||
os.Chmod(w.Filename, os.FileMode(perm))
|
||||
}
|
||||
return fd, err
|
||||
}
|
||||
|
||||
func (w *fileLogWriter) initFd() error {
|
||||
w.hourlyOpenTime = time.Now()
|
||||
w.hourlyOpenDate = w.hourlyOpenTime.Hour()
|
||||
if w.Hourly {
|
||||
go w.hourlyRotate(w.hourlyOpenTime)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w *fileLogWriter) hourlyRotate(openTime time.Time) {
|
||||
y, m, d := openTime.Add(1 * time.Hour).Date()
|
||||
h := openTime.Add(1 * time.Hour).Hour()
|
||||
nextHour := time.Date(y, m, d, h, 0, 0, 0, openTime.Location())
|
||||
tm := time.NewTimer(time.Duration(nextHour.UnixNano() - openTime.UnixNano() + 100))
|
||||
<-tm.C
|
||||
w.Lock()
|
||||
if w.needRotateHourly(time.Now().Hour()) {
|
||||
if err := w.doRotate(); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err)
|
||||
}
|
||||
}
|
||||
w.Unlock()
|
||||
}
|
||||
|
||||
func (w *fileLogWriter) doRotate() error {
|
||||
fName := ""
|
||||
format := ""
|
||||
var openTime time.Time
|
||||
rotatePerm, err := strconv.ParseInt(w.RotatePerm, 8, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = os.Lstat(w.Filename)
|
||||
if err != nil {
|
||||
goto RESTART_LOGGER
|
||||
}
|
||||
|
||||
if w.Hourly {
|
||||
format = "20060102_15"
|
||||
openTime = w.hourlyOpenTime
|
||||
}
|
||||
|
||||
fName = w.fileNameOnly + fmt.Sprintf("_%s%s", openTime.Format(format), w.suffix)
|
||||
_, err = os.Lstat(fName)
|
||||
|
||||
// return error if the last file checked still existed
|
||||
if err == nil {
|
||||
//return fmt.Errorf("rotate: cannot find free log number to rename %s", w.Filename)
|
||||
}
|
||||
|
||||
w.fileWriter.Close()
|
||||
|
||||
// Rename the file to its new found name
|
||||
// even if occurs error,we MUST guarantee to restart new logger
|
||||
err = os.Rename(w.Filename, fName)
|
||||
if err != nil {
|
||||
goto RESTART_LOGGER
|
||||
}
|
||||
|
||||
err = os.Chmod(fName, os.FileMode(rotatePerm))
|
||||
|
||||
RESTART_LOGGER:
|
||||
|
||||
startLoggerErr := w.startLogger()
|
||||
if w.MaxHours > 0 {
|
||||
go w.deleteOldLog()
|
||||
}
|
||||
|
||||
if startLoggerErr != nil {
|
||||
return fmt.Errorf("rotate startLogger: %s", startLoggerErr)
|
||||
}
|
||||
if err != nil {
|
||||
return fmt.Errorf("rotate: %s", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w *fileLogWriter) deleteOldLog() {
|
||||
dir := filepath.Dir(w.Filename)
|
||||
absolutePath, err := filepath.EvalSymlinks(w.Filename)
|
||||
if err == nil {
|
||||
dir = filepath.Dir(absolutePath)
|
||||
}
|
||||
filepath.Walk(dir, func(path string, info os.FileInfo, err error) (returnErr error) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
fmt.Fprintf(os.Stderr, "Unable to delete old log '%s', error: %v\n", path, r)
|
||||
}
|
||||
}()
|
||||
|
||||
if info == nil {
|
||||
return
|
||||
}
|
||||
if w.Hourly {
|
||||
if !info.IsDir() && info.ModTime().Add(1*time.Hour*time.Duration(w.MaxHours)).Before(time.Now()) {
|
||||
if strings.HasPrefix(filepath.Base(path), filepath.Base(w.fileNameOnly)) &&
|
||||
strings.HasSuffix(filepath.Base(path), w.suffix) {
|
||||
os.Remove(path)
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
})
|
||||
}
|
||||
|
||||
// EncodeMsg encode log msg
|
||||
func (*fileLogWriter) EncodeMsg(lm *LogMsg) []byte {
|
||||
buf := defaultBufPool.Get()
|
||||
buf.AppendString(lm.Msg)
|
||||
buf.AppendString(_defaultLineEnding)
|
||||
msg := buf.Bytes()
|
||||
buf.Free()
|
||||
return msg
|
||||
}
|
||||
|
||||
// WriteMsg write msg to log and rotate
|
||||
func (w *fileLogWriter) WriteMsg(lm *LogMsg) error {
|
||||
h := lm.When.Hour()
|
||||
|
||||
if w.Rotate {
|
||||
w.RLock()
|
||||
if w.needRotateHourly(h) {
|
||||
w.RUnlock()
|
||||
w.Lock()
|
||||
if w.needRotateHourly(h) {
|
||||
if err := w.doRotate(); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err)
|
||||
}
|
||||
}
|
||||
w.Unlock()
|
||||
} else {
|
||||
w.RUnlock()
|
||||
}
|
||||
}
|
||||
|
||||
msg := w.EncodeMsg(lm)
|
||||
_, err := w.fileWriter.Write(msg)
|
||||
return err
|
||||
}
|
||||
|
||||
// Destroy close the file description, close file writer.
|
||||
func (w *fileLogWriter) Destroy() {
|
||||
w.fileWriter.Close()
|
||||
}
|
||||
|
||||
// Flush flushes file logger.
|
||||
func (w *fileLogWriter) Flush() {
|
||||
w.fileWriter.Sync()
|
||||
}
|
||||
|
||||
func init() {
|
||||
Register(AdapterFile, newFileWriter)
|
||||
}
|
||||
99
src/server/galog/galog.go
Normal file
99
src/server/galog/galog.go
Normal file
@ -0,0 +1,99 @@
|
||||
package galog
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type GALogger struct {
|
||||
logger *Logger
|
||||
projectID string
|
||||
clientID string
|
||||
logType LogType
|
||||
entryPool sync.Pool
|
||||
}
|
||||
|
||||
type LogType string
|
||||
|
||||
const (
|
||||
// LogTypeTrack 事实日志
|
||||
LogTypeTrack LogType = "track"
|
||||
// LogTypeAsset 资产日志
|
||||
LogTypeAsset LogType = "asset"
|
||||
)
|
||||
|
||||
const (
|
||||
// enableAsync 启用异步写入模式
|
||||
enableAsync = true
|
||||
// defaultAsyncMsgLen 异步写入模式的队列长度,QPS较大时可调整此值
|
||||
defaultAsyncMsgLen int64 = 100
|
||||
)
|
||||
|
||||
// NewGALogger
|
||||
//
|
||||
// logDir: 日志根目录 logs | /home/tywork
|
||||
// projectID: projectID
|
||||
// clientID: clientID
|
||||
// logType: galog.LogTypeTrack | galog.LogTypeAsset
|
||||
func NewGALogger(logDir, projectID, clientID string, logType LogType) (*GALogger, error) {
|
||||
l := newLogger()
|
||||
hostname, _ := os.Hostname()
|
||||
filepath := fmt.Sprintf("ga_log/ga_%s.log", hostname)
|
||||
if logType == LogTypeAsset {
|
||||
filepath = fmt.Sprintf("asset_log/%s_%s.log", logType, hostname)
|
||||
}
|
||||
configs := fmt.Sprintf(`{"filename":"%s/%s"}`, strings.TrimRight(logDir, "/"), filepath)
|
||||
err := l.setLogger(AdapterFile, configs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if enableAsync {
|
||||
l.Async()
|
||||
}
|
||||
gaLogger := &GALogger{
|
||||
logger: l,
|
||||
projectID: projectID,
|
||||
clientID: clientID,
|
||||
logType: logType,
|
||||
}
|
||||
|
||||
return gaLogger, nil
|
||||
}
|
||||
|
||||
// GetEntry
|
||||
func (gl *GALogger) GetEntry(event string) *Entry {
|
||||
e, ok := gl.entryPool.Get().(*Entry)
|
||||
if ok {
|
||||
e.logger = gl
|
||||
e.bean.ProjectID = gl.projectID
|
||||
e.bean.LogType = gl.logType
|
||||
e.bean.ClientID = gl.clientID
|
||||
e.bean.Event = event
|
||||
e.bean.EventTime = time.Now().UnixMilli()
|
||||
e.bean.Lib = defaultLib
|
||||
return e
|
||||
}
|
||||
return &Entry{
|
||||
logger: gl,
|
||||
bean: &EntryBean{
|
||||
ProjectID: gl.projectID,
|
||||
LogType: gl.logType,
|
||||
ClientID: gl.clientID,
|
||||
Event: event,
|
||||
EventTime: time.Now().UnixMilli(),
|
||||
Lib: defaultLib,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (gl *GALogger) biz(v interface{}) {
|
||||
gl.logger.BizErr(v)
|
||||
}
|
||||
|
||||
func (gl *GALogger) putEntry(entry *Entry) {
|
||||
entry.bean = &EntryBean{}
|
||||
gl.entryPool.Put(entry)
|
||||
}
|
||||
85
src/server/galog/galog_test.go
Normal file
85
src/server/galog/galog_test.go
Normal file
@ -0,0 +1,85 @@
|
||||
package galog
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
gaLogger *GALogger
|
||||
assetLogger *GALogger
|
||||
)
|
||||
|
||||
// go test -bench . -benchmem
|
||||
func init() {
|
||||
gaLogger, _ = NewGALogger("logs", "20433", "Android_5.0_tyGuest,weixinPay,tyAccount.alipay.0-hall20433.tuyoo.sdktest", LogTypeTrack)
|
||||
assetLogger, _ = NewGALogger("logs", "28", "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz", LogTypeAsset)
|
||||
}
|
||||
|
||||
func BenchmarkGaLog(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
props := map[string]interface{}{
|
||||
"ip_address": "127.0.0.1",
|
||||
"proj_app_id": "10010",
|
||||
"uuid": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
|
||||
"ts": time.Now().UnixNano(),
|
||||
"ip_address1": "127.0.0.1",
|
||||
"proj_app_id1": "10010",
|
||||
"uuid1": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
|
||||
"ts1": time.Now().UnixNano(),
|
||||
"ip_address2": "127.0.0.1",
|
||||
"proj_app_id2": "10010",
|
||||
"uuid2": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
|
||||
"ts2": time.Now().UnixNano(),
|
||||
"ip_address3": "127.0.0.1",
|
||||
"proj_app_id3": "10010",
|
||||
"uuid3": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
|
||||
"ts4": time.Now().UnixNano(),
|
||||
"proj_app_id25": "10010",
|
||||
"uuid21": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
|
||||
"ts21": time.Now().UnixNano(),
|
||||
"ip_address31": "127.0.0.1",
|
||||
"proj_app_id31": "10010",
|
||||
"uuid31": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
|
||||
"ts11": time.Now().UnixNano(),
|
||||
"uuid3111": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
|
||||
"ts4111": time.Now().UnixNano(),
|
||||
"proj_app_id21115": "10010",
|
||||
"uuid111": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
|
||||
"ts111": time.Now().UnixNano(),
|
||||
"ip_a11ddress31": "127.0.0.1",
|
||||
"proj1_app_id31": "10010",
|
||||
"uuid131": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
|
||||
"ts1111": time.Now().UnixNano(),
|
||||
}
|
||||
gaLogger.
|
||||
GetEntry("sdk_s_login_succ").
|
||||
SetDeviceID("device001").
|
||||
SetUserID("10086").
|
||||
SetProperties(props).
|
||||
Flush()
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkAssetLog(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
asset := make(AssetProperties)
|
||||
asset.
|
||||
SetAssetID("13101").
|
||||
SetAssetName("\u9501\u5b9a").
|
||||
SetAssetType("6").
|
||||
SetAssetFinal("2").
|
||||
SetAssetAssociated("3").
|
||||
SetAssetStartTime("0").
|
||||
SetAssetTimeLimit("0").
|
||||
SetAssetSource("").
|
||||
SetKV("uuid", "uuid-v4")
|
||||
|
||||
assetLogger.
|
||||
GetEntry("asset_increase").
|
||||
SetDeviceID("").
|
||||
SetUserID("10086").
|
||||
SetProperties(asset).
|
||||
Flush()
|
||||
}
|
||||
}
|
||||
3
src/server/galog/go.mod
Normal file
3
src/server/galog/go.mod
Normal file
@ -0,0 +1,3 @@
|
||||
module tygit.tuyoo.com/gocomponents/galog
|
||||
|
||||
go 1.20
|
||||
BIN
src/server/galog/img/WX20240226-183250@2x.png
Normal file
BIN
src/server/galog/img/WX20240226-183250@2x.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 234 KiB |
BIN
src/server/galog/img/WX20240226-184752@2x.png
Normal file
BIN
src/server/galog/img/WX20240226-184752@2x.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 216 KiB |
261
src/server/galog/log.go
Normal file
261
src/server/galog/log.go
Normal file
@ -0,0 +1,261 @@
|
||||
package galog
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"sync"
|
||||
"time"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
const (
|
||||
AdapterFile = "file"
|
||||
)
|
||||
|
||||
type LogMsg struct {
|
||||
Msg string
|
||||
When time.Time
|
||||
}
|
||||
|
||||
// Logger defines the behavior of a log provider.
|
||||
type LogProvider interface {
|
||||
Init(config string) error
|
||||
WriteMsg(lm *LogMsg) error
|
||||
Destroy()
|
||||
Flush()
|
||||
}
|
||||
|
||||
type newLogProviderFunc func() LogProvider
|
||||
|
||||
var (
|
||||
adapters = make(map[string]newLogProviderFunc)
|
||||
)
|
||||
|
||||
// Register register a new log provider.
|
||||
func Register(name string, log newLogProviderFunc) {
|
||||
if log == nil {
|
||||
panic("logs: Register provide is nil")
|
||||
}
|
||||
if _, dup := adapters[name]; dup {
|
||||
panic("logs: Register called twice for provider " + name)
|
||||
}
|
||||
adapters[name] = log
|
||||
}
|
||||
|
||||
type Logger struct {
|
||||
lock sync.Mutex
|
||||
asynchronous bool
|
||||
wg sync.WaitGroup
|
||||
msgChanLen int64
|
||||
msgChan chan *LogMsg
|
||||
closeChan chan struct{}
|
||||
flushChan chan struct{}
|
||||
outputs []*nameLogger
|
||||
}
|
||||
|
||||
type nameLogger struct {
|
||||
LogProvider
|
||||
name string
|
||||
}
|
||||
|
||||
var logMsgPool *sync.Pool
|
||||
|
||||
// newLogger return a new Logger.
|
||||
func newLogger(channelLens ...int64) *Logger {
|
||||
gl := new(Logger)
|
||||
gl.msgChanLen = append(channelLens, 0)[0]
|
||||
if gl.msgChanLen <= 0 {
|
||||
gl.msgChanLen = defaultAsyncMsgLen
|
||||
}
|
||||
gl.flushChan = make(chan struct{}, 1)
|
||||
gl.closeChan = make(chan struct{}, 1)
|
||||
return gl
|
||||
}
|
||||
|
||||
// Async sets the log to asynchronous and start the goroutine
|
||||
func (gl *Logger) Async(msgLen ...int64) *Logger {
|
||||
gl.lock.Lock()
|
||||
defer gl.lock.Unlock()
|
||||
if gl.asynchronous {
|
||||
return gl
|
||||
}
|
||||
gl.asynchronous = true
|
||||
if len(msgLen) > 0 && msgLen[0] > 0 {
|
||||
gl.msgChanLen = msgLen[0]
|
||||
}
|
||||
gl.msgChan = make(chan *LogMsg, gl.msgChanLen)
|
||||
logMsgPool = &sync.Pool{
|
||||
New: func() interface{} {
|
||||
return &LogMsg{}
|
||||
},
|
||||
}
|
||||
gl.wg.Add(1)
|
||||
go gl.startLogger()
|
||||
return gl
|
||||
}
|
||||
|
||||
// SetLogger provides a given logger adapter into Logger with config string.
|
||||
// config must in in JSON format like {"interval":360}}
|
||||
func (gl *Logger) setLogger(adapterName string, configs ...string) error {
|
||||
config := append(configs, "{}")[0]
|
||||
|
||||
logAdapter, ok := adapters[adapterName]
|
||||
if !ok {
|
||||
return fmt.Errorf("logs: unknown adaptername %q (forgotten Register?)", adapterName)
|
||||
}
|
||||
|
||||
lg := logAdapter()
|
||||
|
||||
err := lg.Init(config)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
gl.outputs = append(gl.outputs, &nameLogger{name: adapterName, LogProvider: lg})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (gl *Logger) writeToLoggers(lm *LogMsg) {
|
||||
for _, l := range gl.outputs {
|
||||
err := l.WriteMsg(lm)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "unable to WriteMsg to adapter:%v,error:%v\n", l.name, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Write implements io.Writer.
|
||||
func (gl *Logger) Write(p []byte) (n int, err error) {
|
||||
if len(p) == 0 {
|
||||
return 0, nil
|
||||
}
|
||||
// writeMsg will always add a '\n' character
|
||||
if p[len(p)-1] == '\n' {
|
||||
p = p[0 : len(p)-1]
|
||||
}
|
||||
lm := &LogMsg{
|
||||
Msg: string(p),
|
||||
When: time.Now(),
|
||||
}
|
||||
|
||||
// set levelLoggerImpl to ensure all log message will be write out
|
||||
err = gl.writeMsg(lm)
|
||||
if err == nil {
|
||||
return len(p), nil
|
||||
}
|
||||
return 0, err
|
||||
}
|
||||
|
||||
func (gl *Logger) writeMsg(lm *LogMsg) error {
|
||||
if gl.asynchronous {
|
||||
logM := logMsgPool.Get().(*LogMsg)
|
||||
logM.Msg = lm.Msg
|
||||
logM.When = lm.When
|
||||
|
||||
if gl.outputs != nil {
|
||||
gl.msgChan <- lm
|
||||
} else {
|
||||
logMsgPool.Put(lm)
|
||||
}
|
||||
} else {
|
||||
gl.writeToLoggers(lm)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (gl *Logger) startLogger() {
|
||||
gameOver := false
|
||||
for {
|
||||
select {
|
||||
case bm, ok := <-gl.msgChan:
|
||||
if ok {
|
||||
gl.writeToLoggers(bm)
|
||||
logMsgPool.Put(bm)
|
||||
}
|
||||
case <-gl.closeChan:
|
||||
gl.flush()
|
||||
for _, l := range gl.outputs {
|
||||
l.Destroy()
|
||||
}
|
||||
gl.outputs = nil
|
||||
gameOver = true
|
||||
gl.wg.Done()
|
||||
case <-gl.flushChan:
|
||||
gl.flush()
|
||||
gl.wg.Done()
|
||||
}
|
||||
if gameOver {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Info Log INFO level message.
|
||||
func (gl *Logger) Info(format string) {
|
||||
lm := &LogMsg{
|
||||
Msg: format,
|
||||
When: time.Now(),
|
||||
}
|
||||
|
||||
gl.writeMsg(lm)
|
||||
}
|
||||
|
||||
// BizErr Log a json-interface
|
||||
func (gl *Logger) BizErr(v interface{}) error {
|
||||
buf, err := json.Marshal(v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
str := *(*string)(unsafe.Pointer(&buf))
|
||||
gl.Info(str)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Flush flush all chan data.
|
||||
func (gl *Logger) Flush() {
|
||||
if gl.asynchronous {
|
||||
gl.flushChan <- struct{}{}
|
||||
gl.wg.Wait()
|
||||
gl.wg.Add(1)
|
||||
return
|
||||
}
|
||||
gl.flush()
|
||||
}
|
||||
|
||||
// Close close logger, flush all chan data and destroy all adapters in Logger.
|
||||
func (gl *Logger) Close() {
|
||||
if gl.asynchronous {
|
||||
gl.closeChan <- struct{}{}
|
||||
gl.wg.Wait()
|
||||
close(gl.msgChan)
|
||||
} else {
|
||||
gl.flush()
|
||||
for _, l := range gl.outputs {
|
||||
l.Destroy()
|
||||
}
|
||||
gl.outputs = nil
|
||||
}
|
||||
close(gl.flushChan)
|
||||
close(gl.closeChan)
|
||||
}
|
||||
|
||||
func (gl *Logger) flush() {
|
||||
if gl.asynchronous {
|
||||
for {
|
||||
if len(gl.msgChan) > 0 {
|
||||
bm, ok := <-gl.msgChan
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
gl.writeToLoggers(bm)
|
||||
logMsgPool.Put(bm)
|
||||
continue
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
for _, l := range gl.outputs {
|
||||
l.Flush()
|
||||
}
|
||||
}
|
||||
122
src/server/galog/suger.go
Normal file
122
src/server/galog/suger.go
Normal file
@ -0,0 +1,122 @@
|
||||
package galog
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type ServerLogOptions struct {
|
||||
// LogDir 日志目录,默认logs
|
||||
LogDir string
|
||||
|
||||
// EnableAsync 是否开启异步写日志,默认开启
|
||||
EnableAsync bool
|
||||
|
||||
// AsyncQueueSize 异步队列大小,默认1000
|
||||
AsyncQueueSize int64
|
||||
}
|
||||
|
||||
// NewServerLogger 业务日志实例,support JSON
|
||||
//
|
||||
// opts.LogDir 日志目录,推荐logs
|
||||
// opts.EnableAsync 是否开启异步写日志,默认开启
|
||||
// opts.AsyncQueueSize 异步队列大小,默认1000
|
||||
// useage: logger.BizErr(map[string]interface{}{"type": "test"})
|
||||
func NewServerLogger(opts *ServerLogOptions) (*Logger, error) {
|
||||
if opts == nil {
|
||||
opts = &ServerLogOptions{
|
||||
LogDir: "logs",
|
||||
EnableAsync: true,
|
||||
AsyncQueueSize: 1000,
|
||||
}
|
||||
}
|
||||
if opts.LogDir == "" {
|
||||
opts.LogDir = "logs"
|
||||
}
|
||||
if opts.EnableAsync && opts.AsyncQueueSize == 0 {
|
||||
opts.AsyncQueueSize = 1000
|
||||
}
|
||||
|
||||
l := newLogger()
|
||||
hostname, _ := os.Hostname()
|
||||
filename := fmt.Sprintf("server_%s.log", hostname)
|
||||
configs := fmt.Sprintf(`{"filename":"%s/%s"}`, strings.TrimRight(opts.LogDir, "/"), filename)
|
||||
err := l.setLogger(AdapterFile, configs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if opts.EnableAsync && opts.AsyncQueueSize > 0 {
|
||||
l.Async(opts.AsyncQueueSize)
|
||||
}
|
||||
return l, nil
|
||||
}
|
||||
|
||||
type ServerGALogOptions struct {
|
||||
// LogDir 日志目录,默认galogs
|
||||
LogDir string
|
||||
|
||||
// EnableAsync 是否开启异步写日志,默认开启
|
||||
EnableAsync bool
|
||||
|
||||
// AsyncQueueSize 异步队列大小,默认1000
|
||||
AsyncQueueSize int64
|
||||
|
||||
// GA侧分配ProjectID
|
||||
ProjectID string
|
||||
|
||||
// GA侧分配ClientID
|
||||
ClientID string
|
||||
|
||||
LogType LogType
|
||||
}
|
||||
|
||||
// NewServerGALogger GA日志实例,support JSON
|
||||
//
|
||||
// opts.ProjectID 项目ID,GA侧分配,必填
|
||||
// opts.ClientID 客户端ID,GA侧分配,必填
|
||||
// opts.LogType 日志类型,默认LogTypeTrack
|
||||
// opts.LogDir 日志目录,默认galogs
|
||||
// opts.EnableAsync 是否开启异步写日志,默认开启
|
||||
// opts.AsyncQueueSize 异步队列大小,默认1000
|
||||
func NewServerGALogger(opts *ServerGALogOptions) (*GALogger, error) {
|
||||
if opts == nil {
|
||||
return nil, errors.New("opts must not be empty")
|
||||
}
|
||||
if opts.EnableAsync && opts.AsyncQueueSize == 0 {
|
||||
opts.AsyncQueueSize = 1000
|
||||
}
|
||||
if opts.LogDir == "" {
|
||||
opts.LogDir = "galogs"
|
||||
}
|
||||
if opts.LogType == "" {
|
||||
opts.LogType = LogTypeTrack
|
||||
}
|
||||
if opts.ProjectID == "" || opts.ClientID == "" {
|
||||
return nil, errors.New("projectID or clientID must not be empty")
|
||||
}
|
||||
|
||||
l := newLogger()
|
||||
hostname, _ := os.Hostname()
|
||||
filename := fmt.Sprintf("ga_%s.log", hostname)
|
||||
if opts.LogType == LogTypeAsset {
|
||||
filename = fmt.Sprintf("asset_%s.log", hostname)
|
||||
}
|
||||
configs := fmt.Sprintf(`{"filename":"%s/%s"}`, strings.TrimRight(opts.LogDir, "/"), filename)
|
||||
err := l.setLogger(AdapterFile, configs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if opts.EnableAsync && opts.AsyncQueueSize > 0 {
|
||||
l.Async(opts.AsyncQueueSize)
|
||||
}
|
||||
gaLogger := &GALogger{
|
||||
logger: l,
|
||||
projectID: opts.ProjectID,
|
||||
clientID: opts.ClientID,
|
||||
logType: opts.LogType,
|
||||
}
|
||||
|
||||
return gaLogger, nil
|
||||
}
|
||||
34
src/server/galog/suger_test.go
Normal file
34
src/server/galog/suger_test.go
Normal file
@ -0,0 +1,34 @@
|
||||
package galog
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
var slogger *Logger
|
||||
|
||||
// go test -bench . -benchmem
|
||||
func init() {
|
||||
slogger, _ = NewServerLogger(&ServerLogOptions{
|
||||
LogDir: "logs",
|
||||
EnableAsync: true,
|
||||
})
|
||||
}
|
||||
|
||||
// BenchmarkServerLog-8 436682 3103 ns/op 1838 B/op 24 allocs/op
|
||||
func BenchmarkServerLog(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
msgMap := map[string]interface{}{
|
||||
"CreateTime": time.Now().UnixNano() / int64(time.Microsecond),
|
||||
"Host": "host",
|
||||
"AppId": "10010",
|
||||
"UserId": "12345",
|
||||
"Level": "Notice",
|
||||
"Entry": "Login",
|
||||
"Func": "HandleLogin",
|
||||
"TraceMsg": "HandlerWSFriApplyList|HandlerWSFriApplyList",
|
||||
"Params": "{\"isoCode\":\"CN\",\"P0\":[3,\"Total: 3, End: 0, \"],\"pf\":\"wx\",\"appVer\":\"1.0\",\"sdkVer\":\"1.0\",\"ip\":\"58.247.195.158\",\"clientId\":\"7abd64bf-3fb6-4fef-a25e-e6562b7fb857\",\"timeZone\":\"Asia/Shanghai\",\"loginMark\":\"\",\"st\":1472}",
|
||||
}
|
||||
slogger.BizErr(msgMap)
|
||||
}
|
||||
}
|
||||
@ -1,785 +0,0 @@
|
||||
package game
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"math/rand"
|
||||
"server/GoUtil"
|
||||
"server/MergeConst"
|
||||
"server/db"
|
||||
"server/msg"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/robfig/cron/v3"
|
||||
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
type ChampshipsManager struct {
|
||||
MStatus int32
|
||||
MChampshipMap map[int32]*db.SqlChampshipsStruct
|
||||
MChampshipPlayerMap map[int32][]*msg.ChampshipsPlayerInfo
|
||||
IsSettle int32
|
||||
IsLoadDB bool
|
||||
MUpdateNotifyList []int32
|
||||
McronSave *cron.Cron
|
||||
McronSaveID cron.EntryID
|
||||
RobotCronID cron.EntryID
|
||||
RobotCronID10s cron.EntryID
|
||||
MPlayerBaseInfoMap map[int32]*db.ResPlayerBaseInfo
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) SaveDataFromDB(Key interface{}) bool {
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) AIGrow1() {
|
||||
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) DeleteOutLineChampship(CurChampshipsId int32) {
|
||||
sqlStr := "DELETE FROM t_championships_data WHERE CurChampshipsId = ?"
|
||||
|
||||
for k, v := range p.MChampshipPlayerMap {
|
||||
if v[0].CurChampshipsId == CurChampshipsId {
|
||||
delete(p.MChampshipPlayerMap, k)
|
||||
}
|
||||
}
|
||||
result, err := db.SqlDb.Exec(sqlStr, CurChampshipsId)
|
||||
if err != nil {
|
||||
fmt.Printf("exec failed, err:%v\n", err)
|
||||
return
|
||||
}
|
||||
affectedRows, err := result.RowsAffected()
|
||||
if err != nil {
|
||||
fmt.Printf("get affected failed, err:%v\n", err)
|
||||
return
|
||||
} else {
|
||||
fmt.Printf("delete t_championships_data affectedRows:%d\n", affectedRows)
|
||||
}
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) DeleteUneffectPlayer(deleteIds []int32) {
|
||||
sqlStr := "DELETE FROM t_player_baseinfo WHERE dwUin = ?"
|
||||
|
||||
for i := 0; i < len(deleteIds); i++ {
|
||||
_, err := db.SqlDb.Exec(sqlStr, deleteIds[i])
|
||||
if err != nil {
|
||||
fmt.Printf("exec failed, err:%v\n", err)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) GetFriendListId(id int32) []int32 {
|
||||
|
||||
sqlStr := "SELECT * FROM t_player_Friend_Data WHERE dwUin = ?"
|
||||
sqlStruck := db.SqlFriendStruct{}
|
||||
ret := []int32{}
|
||||
|
||||
if err := db.SqlDb.Get(&sqlStruck, sqlStr, id); err != nil {
|
||||
fmt.Printf("get data failed, err:%v\n", err)
|
||||
|
||||
} else {
|
||||
if sqlStruck.FriendList != "" {
|
||||
arr := strings.Split(sqlStruck.FriendList, "_")
|
||||
for i := 0; i < len(arr); i++ {
|
||||
id, _ := strconv.ParseInt(arr[i], 10, 32)
|
||||
ret = append(ret, int32(id))
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) NotifyOpenNewChampShip(args []interface{}) {
|
||||
go func() {
|
||||
G_GameLogicPtr.M_SvrGlobal.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId + 1
|
||||
G_GameLogicPtr.M_SvrGlobal.StartChampshipsSvrTime = args[0].(int32)
|
||||
}()
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) OpenNewChampShip(args []interface{}) {
|
||||
|
||||
G_GameLogicPtr.M_SvrGlobal.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId + 1
|
||||
G_GameLogicPtr.M_SvrGlobal.StartChampshipsSvrTime = args[0].(int32)
|
||||
p.MUpdateNotifyList = []int32{}
|
||||
|
||||
sqlStr := "SELECT * FROM t_player_baseinfo"
|
||||
sqlStrucks := []db.ResPlayerBaseInfo{}
|
||||
if err := db.SqlDb.Select(&sqlStrucks, sqlStr); err != nil {
|
||||
fmt.Printf("get data failed, err:%v\n", err)
|
||||
return
|
||||
} else {
|
||||
|
||||
}
|
||||
deleteIds := []int32{}
|
||||
sqlStrucksList := []db.ResPlayerBaseInfo{}
|
||||
for i := 0; i < len(sqlStrucks); i++ {
|
||||
if sqlStrucks[i].UserName == "" {
|
||||
deleteIds = append(deleteIds, sqlStrucks[i].DwUin)
|
||||
} else {
|
||||
sqlStrucksList = append(sqlStrucksList, sqlStrucks[i])
|
||||
}
|
||||
}
|
||||
sqlStrucks = sqlStrucksList
|
||||
p.DeleteUneffectPlayer(deleteIds)
|
||||
|
||||
sort.Slice(sqlStrucks, func(i, j int) bool {
|
||||
if sqlStrucks[i].Level != sqlStrucks[j].Level {
|
||||
return sqlStrucks[i].Level < sqlStrucks[j].Level
|
||||
} else {
|
||||
return sqlStrucks[i].Exp < sqlStrucks[j].Exp
|
||||
}
|
||||
|
||||
})
|
||||
var playerCnt int = 15
|
||||
groups := int(math.Ceil((float64)(len(sqlStrucks)) / float64(playerCnt)))
|
||||
StartRobotUin := 200000
|
||||
p.MStatus = 1
|
||||
rand.Seed(time.Now().Unix())
|
||||
for i := 0; i < groups; i++ {
|
||||
if i < groups-1 {
|
||||
temp := db.SqlChampshipsStruct{}
|
||||
temp.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
|
||||
CSPlayerInfo := []*msg.ChampshipsPlayerInfo{}
|
||||
|
||||
strr := []string{}
|
||||
for j := 0; j < int(playerCnt); j++ {
|
||||
dwUin := sqlStrucks[i*int(playerCnt)+j].DwUin
|
||||
res := strconv.Itoa(int(dwUin)) + "_" + "1" + "_" + "0" + "_" + "0" + "_" + "1" + "_" + strconv.Itoa(int(G_GameLogicPtr.M_SvrGlobal.CurChampshipsId)) + "_0"
|
||||
strr = append(strr, res)
|
||||
playerinfo := &msg.ChampshipsPlayerInfo{}
|
||||
playerinfo.DwUin = dwUin
|
||||
playerinfo.IsGet = 0
|
||||
playerinfo.IsPlayer = 1
|
||||
playerinfo.Score = 0
|
||||
playerinfo.Times = 1
|
||||
playerinfo.AIEnum = 0
|
||||
playerinfo.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
|
||||
CSPlayerInfo = append(CSPlayerInfo, playerinfo)
|
||||
}
|
||||
for j := int(playerCnt); j < 30; j++ {
|
||||
StartRobotUin = StartRobotUin + 1
|
||||
dwUin := StartRobotUin
|
||||
enum := rand.Intn(4) + 1
|
||||
res := strconv.Itoa(int(dwUin)) + "_" + "0" + "_" + "0" + "_" + "0" + "_" + "1" + "_" + strconv.Itoa(int(G_GameLogicPtr.M_SvrGlobal.CurChampshipsId)) + "_" + strconv.Itoa(enum)
|
||||
strr = append(strr, res)
|
||||
playerinfo := &msg.ChampshipsPlayerInfo{}
|
||||
playerinfo.DwUin = int32(dwUin)
|
||||
playerinfo.IsGet = 0
|
||||
playerinfo.IsPlayer = 0
|
||||
playerinfo.Score = 0
|
||||
playerinfo.Times = 1
|
||||
playerinfo.AIEnum = int32(enum)
|
||||
playerinfo.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
|
||||
CSPlayerInfo = append(CSPlayerInfo, playerinfo)
|
||||
}
|
||||
temp.GroupRankData = strings.Join(strr, ";")
|
||||
insertId, _ := db.FormatAllMemInsertDb(&temp, "t_championships_data")
|
||||
|
||||
p.MChampshipPlayerMap[int32(insertId)] = CSPlayerInfo
|
||||
|
||||
for j := 0; j < int(playerCnt); j++ {
|
||||
dwUin := sqlStrucks[i*int(playerCnt)+j].DwUin
|
||||
player, ok := G_GameLogicPtr.M_Players[dwUin]
|
||||
if ok {
|
||||
player.GetIFGameData("PlayerBaseData").(*PlayerBaseData).SetChampshipID(int32(insertId), true)
|
||||
} else {
|
||||
player = G_GameLogicPtr.FindOfflinePlayer(dwUin)
|
||||
if player != nil {
|
||||
player.GetIFGameData("PlayerBaseData").(*PlayerBaseData).SetChampshipID(int32(insertId), false)
|
||||
} else {
|
||||
sqlStrucks[i*int(playerCnt)+j].LastChampGroupID = sqlStrucks[i*int(playerCnt)+j].ChampshipsGroupID
|
||||
sqlStrucks[i*int(playerCnt)+j].ChampshipsGroupID = int32(insertId)
|
||||
db.FormatAllMemUpdateDb(&sqlStrucks[i*int(playerCnt)+j], "t_player_baseinfo", "dwUin")
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
remain := len(sqlStrucks) - (groups-1)*int(playerCnt)
|
||||
cnt := 0
|
||||
strr := []string{}
|
||||
temp := db.SqlChampshipsStruct{}
|
||||
temp.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
|
||||
|
||||
CSPlayerInfo := []*msg.ChampshipsPlayerInfo{}
|
||||
|
||||
for j := 0; j < remain; j++ {
|
||||
dwUin := sqlStrucks[i*int(playerCnt)+j].DwUin
|
||||
res := strconv.Itoa(int(dwUin)) + "_" + "1" + "_" + "0" + "_" + "0" + "_" + "1" + "_" + strconv.Itoa(int(G_GameLogicPtr.M_SvrGlobal.CurChampshipsId)) + "_0"
|
||||
strr = append(strr, res)
|
||||
cnt = cnt + 1
|
||||
playerinfo := &msg.ChampshipsPlayerInfo{}
|
||||
playerinfo.DwUin = dwUin
|
||||
playerinfo.IsGet = 0
|
||||
playerinfo.IsPlayer = 1
|
||||
playerinfo.Score = 0
|
||||
playerinfo.Times = 1
|
||||
playerinfo.AIEnum = 0
|
||||
playerinfo.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
|
||||
CSPlayerInfo = append(CSPlayerInfo, playerinfo)
|
||||
}
|
||||
for j := cnt; j < 30; j++ {
|
||||
StartRobotUin = StartRobotUin + 1
|
||||
dwUin := StartRobotUin
|
||||
enum := rand.Intn(4) + 1
|
||||
res := strconv.Itoa(int(dwUin)) + "_" + "0" + "_" + "0" + "_" + "0" + "_" + "1" + "_" + strconv.Itoa(int(G_GameLogicPtr.M_SvrGlobal.CurChampshipsId)) + "_" + strconv.Itoa(enum)
|
||||
strr = append(strr, res)
|
||||
playerinfo := &msg.ChampshipsPlayerInfo{}
|
||||
playerinfo.DwUin = int32(dwUin)
|
||||
playerinfo.IsGet = 0
|
||||
playerinfo.IsPlayer = 0
|
||||
playerinfo.Score = 0
|
||||
playerinfo.Times = 1
|
||||
playerinfo.AIEnum = int32(enum)
|
||||
playerinfo.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
|
||||
CSPlayerInfo = append(CSPlayerInfo, playerinfo)
|
||||
}
|
||||
temp.GroupRankData = strings.Join(strr, ";")
|
||||
insertId, _ := db.FormatAllMemInsertDb(&temp, "t_championships_data")
|
||||
p.MChampshipPlayerMap[int32(insertId)] = CSPlayerInfo
|
||||
for j := 0; j < remain; j++ {
|
||||
dwUin := sqlStrucks[i*int(playerCnt)+j].DwUin
|
||||
player, ok := G_GameLogicPtr.M_Players[dwUin]
|
||||
if ok {
|
||||
player.GetIFGameData("PlayerBaseData").(*PlayerBaseData).SetChampshipID(int32(insertId), true)
|
||||
} else {
|
||||
player = G_GameLogicPtr.FindOfflinePlayer(dwUin)
|
||||
if player != nil {
|
||||
player.GetIFGameData("PlayerBaseData").(*PlayerBaseData).SetChampshipID(int32(insertId), false)
|
||||
} else {
|
||||
|
||||
sqlStrucks[i*int(playerCnt)+j].LastChampGroupID = sqlStrucks[i*int(playerCnt)+j].ChampshipsGroupID
|
||||
sqlStrucks[i*int(playerCnt)+j].ChampshipsGroupID = int32(insertId)
|
||||
db.FormatAllMemUpdateDb(&sqlStrucks[i*int(playerCnt)+j], "t_player_baseinfo", "dwUin")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
p.IsLoadDB = true
|
||||
|
||||
p.AIScoreGrowth1h()
|
||||
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
|
||||
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) OpenChampShipTimes(args []interface{}) {
|
||||
p.MStatus = 2
|
||||
notify := &msg.NotifyChampshipTimesOpen{}
|
||||
notify.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
|
||||
data, _ := proto.Marshal(notify)
|
||||
G_GameLogicPtr.broadcastInfoAllPlayer("NotifyChampshipTimesOpen", data)
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) CloseChampShipTimes(args []interface{}) {
|
||||
p.MStatus = 1
|
||||
notify := &msg.NotifyChampshipTimesClose{}
|
||||
notify.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
|
||||
data, _ := proto.Marshal(notify)
|
||||
G_GameLogicPtr.broadcastInfoAllPlayer("NotifyChampshipTimesClose", data)
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) Notify_Clock_Tick_Sec(args []interface{}) {
|
||||
timeStamp := args[0].(int64)
|
||||
t := time.Unix(timeStamp, 0).Local()
|
||||
zero := timeStamp - (int64)(t.Hour()*3600+t.Minute()*60+t.Second())
|
||||
OpenTime := zero + MergeConst.G_Champion_Start_Offset
|
||||
OpenTimesTime := zero + MergeConst.G_Champion_Start_Effect_Time
|
||||
CloseTimesTime := zero + MergeConst.G_Champion_Start_Effect_Time + MergeConst.G_Champion_Start_Effect_Durtion
|
||||
DeleteLastTimesTime := zero + MergeConst.G_Champion_settlement_Duration
|
||||
if G_GameLogicPtr.M_SvrGlobal.StartChampshipsSvrTime < int32(OpenTime) { //今日没有开启
|
||||
if timeStamp >= OpenTime { //开启
|
||||
GoUtil.CallEvent(MergeConst.Notify_Champion_Renew, []interface{}{int32(OpenTime)})
|
||||
} else {
|
||||
//开启时间未到
|
||||
if p.MStatus == 1 {
|
||||
GoUtil.CallEvent(MergeConst.Notify_EndChampShip, []interface{}{int32(OpenTime)})
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
if p.MStatus == 0 {
|
||||
p.MStatus = 1
|
||||
}
|
||||
|
||||
if !p.IsLoadDB {
|
||||
p.LoadDbDataByGroupId(G_GameLogicPtr.M_SvrGlobal.CurChampshipsId)
|
||||
if G_GameLogicPtr.M_SvrGlobal.LastChampshipsId > 0 {
|
||||
p.LoadDbDataByGroupId(G_GameLogicPtr.M_SvrGlobal.LastChampshipsId)
|
||||
}
|
||||
p.IsLoadDB = true
|
||||
}
|
||||
}
|
||||
|
||||
if p.MStatus == 1 {
|
||||
if timeStamp >= OpenTimesTime && timeStamp <= CloseTimesTime {
|
||||
GoUtil.CallEvent(MergeConst.Notify_OpenChampShipTimes, []interface{}{int32(OpenTime)})
|
||||
}
|
||||
|
||||
}
|
||||
if p.MStatus == 2 {
|
||||
if timeStamp > CloseTimesTime {
|
||||
GoUtil.CallEvent(MergeConst.Notify_CloseChampShipTimes, []interface{}{int32(OpenTime)})
|
||||
}
|
||||
}
|
||||
if p.IsSettle == 0 {
|
||||
if timeStamp <= DeleteLastTimesTime {
|
||||
p.IsSettle = 1
|
||||
} else {
|
||||
if G_GameLogicPtr.M_SvrGlobal.LastChampshipsId > 0 {
|
||||
p.DeleteOutLineChampship(G_GameLogicPtr.M_SvrGlobal.LastChampshipsId)
|
||||
G_GameLogicPtr.M_SvrGlobal.LastChampshipsId = 0
|
||||
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
|
||||
}
|
||||
}
|
||||
}
|
||||
if p.IsSettle == 1 {
|
||||
if timeStamp > DeleteLastTimesTime {
|
||||
notify := &msg.NotifyChampshipSettleClose{}
|
||||
notify.LastChampshipsId = G_GameLogicPtr.M_SvrGlobal.LastChampshipsId
|
||||
data, _ := proto.Marshal(notify)
|
||||
G_GameLogicPtr.broadcastInfoAllPlayer("NotifyChampshipSettleClose", data)
|
||||
p.IsSettle = 0
|
||||
if G_GameLogicPtr.M_SvrGlobal.LastChampshipsId > 0 {
|
||||
p.DeleteOutLineChampship(G_GameLogicPtr.M_SvrGlobal.LastChampshipsId)
|
||||
G_GameLogicPtr.M_SvrGlobal.LastChampshipsId = 0
|
||||
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) EndChampShip(args []interface{}) {
|
||||
p.MStatus = 0
|
||||
G_GameLogicPtr.M_SvrGlobal.LastChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
|
||||
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
|
||||
|
||||
notify := &msg.NotifyChampshipSettleOpen{}
|
||||
notify.LastChampshipsId = G_GameLogicPtr.M_SvrGlobal.LastChampshipsId
|
||||
data, _ := proto.Marshal(notify)
|
||||
G_GameLogicPtr.broadcastInfoAllPlayer("NotifyChampshipSettleOpen", data)
|
||||
|
||||
notify1 := &msg.NotifyChampshipClose{}
|
||||
notify1.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
|
||||
data1, _ := proto.Marshal(notify1)
|
||||
G_GameLogicPtr.broadcastInfoAllPlayer("NotifyChampshipClose", data1)
|
||||
|
||||
p.NotifyRenewChampshipData()
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) NotifyRenewChampshipData() {
|
||||
for i := 0; i < len(p.MUpdateNotifyList); i++ {
|
||||
groupid := p.MUpdateNotifyList[i]
|
||||
playerlist, ok := p.MChampshipPlayerMap[groupid]
|
||||
if ok {
|
||||
for j := 0; j < len(playerlist); j++ {
|
||||
if playerlist[j].IsPlayer == 1 {
|
||||
dwUin := playerlist[j].DwUin
|
||||
player, ok1 := G_GameLogicPtr.M_Players[dwUin]
|
||||
if ok1 {
|
||||
agent := player.GetAgentByPlayer()
|
||||
notify := &msg.NotifyUpdateChampshipRank{}
|
||||
notify.ChampshipsGroupID = groupid
|
||||
notify.GroupRankDataList = playerlist
|
||||
data, _ := proto.Marshal(notify)
|
||||
G_getGameLogic().PackResInfo(agent, "NotifyUpdateChampshipRank", data)
|
||||
} else {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
p.MUpdateNotifyList = p.MUpdateNotifyList[0:0]
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) ReqChampshipData(player *Player, buf []byte) {
|
||||
req := &msg.ReqChampshipData{}
|
||||
proto.Unmarshal(buf, req)
|
||||
res := &msg.ResChampshipData{}
|
||||
_, ok := p.MChampshipPlayerMap[req.ChampshipsGroupID]
|
||||
if ok {
|
||||
res.GroupRankDataList = p.MChampshipPlayerMap[req.ChampshipsGroupID]
|
||||
}
|
||||
res.ChampshipsGroupID = req.ChampshipsGroupID
|
||||
res.Status = p.MStatus
|
||||
res.IsSettle = p.IsSettle
|
||||
res.EndTime = G_GameLogicPtr.M_SvrGlobal.StartChampshipsSvrTime + MergeConst.G_Champion_Duration
|
||||
res.EndSettleTime = G_GameLogicPtr.M_SvrGlobal.StartChampshipsSvrTime - MergeConst.G_Champion_Start_Offset + MergeConst.G_Champion_Start_Effect_Time + MergeConst.G_Champion_Start_Effect_Durtion
|
||||
agent := player.GetAgentByPlayer()
|
||||
data, _ := proto.Marshal(res)
|
||||
G_getGameLogic().PackResInfo(agent, "ResChampshipData", data)
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) InitManager() {
|
||||
GoUtil.RegisterEvent(MergeConst.Notify_Champion_Renew, p.OpenNewChampShip, p)
|
||||
GoUtil.RegisterEvent(MergeConst.Notify_OpenChampShipTimes, p.OpenChampShipTimes, p)
|
||||
GoUtil.RegisterEvent(MergeConst.Notify_CloseChampShipTimes, p.CloseChampShipTimes, p)
|
||||
GoUtil.RegisterEvent(MergeConst.Notify_EndChampShip, p.EndChampShip, p)
|
||||
GoUtil.RegisterEvent(MergeConst.Notify_Clock_Tick_Sec, p.Notify_Clock_Tick_Sec, p)
|
||||
p.MChampshipMap = make(map[int32]*db.SqlChampshipsStruct)
|
||||
p.MChampshipPlayerMap = make(map[int32][]*msg.ChampshipsPlayerInfo)
|
||||
p.MStatus = 0
|
||||
p.IsSettle = 0
|
||||
p.IsLoadDB = false
|
||||
p.MUpdateNotifyList = []int32{}
|
||||
p.McronSave = cron.New()
|
||||
p.McronSaveID, _ = p.McronSave.AddFunc("@every 70s", func() {
|
||||
p.NotifyRenewChampshipData()
|
||||
})
|
||||
p.RobotCronID, _ = p.McronSave.AddFunc("@every 1h", func() {
|
||||
p.AIScoreGrowth1h()
|
||||
})
|
||||
|
||||
p.RobotCronID10s, _ = p.McronSave.AddFunc("@every 15m", func() {
|
||||
if p.MStatus == 2 {
|
||||
p.RobotIntervalAddScore15m()
|
||||
}
|
||||
})
|
||||
p.McronSave.Start()
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) RobotIntervalAddScore() {
|
||||
seed := time.Now().Unix()
|
||||
rand.Seed(seed)
|
||||
needToUpdateDb := []int32{}
|
||||
for k, v := range p.MChampshipPlayerMap {
|
||||
ishaveRobot := false
|
||||
for i := 0; i < len(v); i++ {
|
||||
if v[i].IsPlayer == 0 {
|
||||
ishaveRobot = true
|
||||
addScore := 3
|
||||
ran := rand.Intn(100) + 1
|
||||
if ran <= 25 {
|
||||
addScore = addScore + 1
|
||||
} else {
|
||||
if ran <= 50 {
|
||||
addScore = addScore + 2
|
||||
}
|
||||
}
|
||||
v[i].Score = v[i].Score + int32(addScore)
|
||||
}
|
||||
}
|
||||
if ishaveRobot {
|
||||
sort.Slice(v, func(i, j int) bool { return v[i].Score > v[j].Score })
|
||||
isAdd := false
|
||||
for i := 0; i < len(p.MUpdateNotifyList); i++ {
|
||||
if p.MUpdateNotifyList[i] == k {
|
||||
isAdd = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !isAdd {
|
||||
p.MUpdateNotifyList = append(p.MUpdateNotifyList, k)
|
||||
}
|
||||
needToUpdateDb = append(needToUpdateDb, k)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
for i := 0; i < len(needToUpdateDb); i++ {
|
||||
p.SaveDbDataByGroupId(needToUpdateDb[i])
|
||||
}
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) GetMinGroupId() int32 {
|
||||
var Min int32 = 0
|
||||
for k := range p.MChampshipPlayerMap {
|
||||
if Min == 0 {
|
||||
Min = k
|
||||
continue
|
||||
}
|
||||
if k < Min {
|
||||
Min = k
|
||||
}
|
||||
}
|
||||
return Min
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) AIScoreGrowth1h() {
|
||||
seed := time.Now().Unix()
|
||||
rand.Seed(seed)
|
||||
needToUpdateDb := []int32{}
|
||||
// MinGroupId := p.GetMinGroupId()
|
||||
for k, v := range p.MChampshipPlayerMap {
|
||||
ishaveRobot := false
|
||||
groupId := 0 //k - MinGroupId + 1
|
||||
for i := 0; i < len(v); i++ {
|
||||
if v[i].IsPlayer == 0 {
|
||||
ishaveRobot = true
|
||||
addScore := 0
|
||||
if v[i].AIEnum == 1 {
|
||||
var num1 float64 = 0.5
|
||||
var num2 float64 = 5.5
|
||||
groupId = rand.Intn(7) + 1
|
||||
addScore = addScore + int(math.Floor(float64(groupId-1)*num1*num2))
|
||||
}
|
||||
if v[i].AIEnum == 2 {
|
||||
addScore = 16
|
||||
|
||||
ran := rand.Intn(100) + 1
|
||||
if ran <= 25 {
|
||||
addScore = addScore + 6
|
||||
} else {
|
||||
if ran <= 50 {
|
||||
addScore = addScore + 10
|
||||
}
|
||||
}
|
||||
}
|
||||
if v[i].AIEnum == 3 {
|
||||
addScore = 16
|
||||
|
||||
ran := rand.Intn(100) + 1
|
||||
if ran <= 25 {
|
||||
addScore = addScore + 10
|
||||
} else {
|
||||
if ran <= 75 {
|
||||
addScore = addScore + 6
|
||||
}
|
||||
}
|
||||
var num1 float64 = 0.5
|
||||
var num2 float64 = 5.5
|
||||
groupId = rand.Intn(7) + 1
|
||||
addScore = addScore + int(math.Floor(float64(groupId-1)*num1*num2))
|
||||
}
|
||||
if v[i].AIEnum == 4 {
|
||||
var num1 float64 = 0.5
|
||||
var num2 float64 = 5.5
|
||||
groupId = rand.Intn(7) + 1
|
||||
addScore = addScore + int(math.Floor(float64(groupId-1)*num1*num2))
|
||||
score := rand.Intn(23)
|
||||
addScore = addScore + score
|
||||
}
|
||||
v[i].Score = v[i].Score + int32(addScore)
|
||||
}
|
||||
}
|
||||
if ishaveRobot {
|
||||
sort.Slice(v, func(i, j int) bool { return v[i].Score > v[j].Score })
|
||||
isAdd := false
|
||||
for i := 0; i < len(p.MUpdateNotifyList); i++ {
|
||||
if p.MUpdateNotifyList[i] == k {
|
||||
isAdd = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !isAdd {
|
||||
p.MUpdateNotifyList = append(p.MUpdateNotifyList, k)
|
||||
}
|
||||
needToUpdateDb = append(needToUpdateDb, k)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
for i := 0; i < len(needToUpdateDb); i++ {
|
||||
p.SaveDbDataByGroupId(needToUpdateDb[i])
|
||||
}
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) RobotIntervalAddScore15m() {
|
||||
seed := time.Now().Unix()
|
||||
rand.Seed(seed)
|
||||
needToUpdateDb := []int32{}
|
||||
for k, v := range p.MChampshipPlayerMap {
|
||||
ishaveRobot := false
|
||||
for i := 0; i < len(v); i++ {
|
||||
if v[i].IsPlayer == 0 {
|
||||
|
||||
addScore := 0
|
||||
if v[i].AIEnum == 1 {
|
||||
|
||||
ran := rand.Intn(100) + 1
|
||||
if ran <= 25 {
|
||||
addScore = addScore + 10
|
||||
} else {
|
||||
if ran <= 75 {
|
||||
addScore = addScore + 6
|
||||
}
|
||||
}
|
||||
ran = rand.Intn(100) + 1
|
||||
if ran <= 25 {
|
||||
addScore = addScore + 5
|
||||
} else {
|
||||
if ran <= 50 {
|
||||
addScore = addScore + 10
|
||||
}
|
||||
}
|
||||
if addScore > 0 {
|
||||
ishaveRobot = true
|
||||
v[i].Score = v[i].Score + int32(addScore)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
if ishaveRobot {
|
||||
sort.Slice(v, func(i, j int) bool { return v[i].Score > v[j].Score })
|
||||
isAdd := false
|
||||
for i := 0; i < len(p.MUpdateNotifyList); i++ {
|
||||
if p.MUpdateNotifyList[i] == k {
|
||||
isAdd = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !isAdd {
|
||||
p.MUpdateNotifyList = append(p.MUpdateNotifyList, k)
|
||||
}
|
||||
needToUpdateDb = append(needToUpdateDb, k)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
for i := 0; i < len(needToUpdateDb); i++ {
|
||||
p.SaveDbDataByGroupId(needToUpdateDb[i])
|
||||
}
|
||||
}
|
||||
func (p *ChampshipsManager) SaveDbDataByGroupId(GroupId int32) {
|
||||
_, ok := p.MChampshipPlayerMap[GroupId]
|
||||
if ok {
|
||||
List := p.MChampshipPlayerMap[GroupId]
|
||||
strr := []string{}
|
||||
for i := 0; i < len(List); i++ {
|
||||
Item := List[i]
|
||||
unit := strconv.Itoa(int(Item.DwUin)) + "_" + strconv.Itoa(int(Item.IsPlayer)) + "_" + strconv.Itoa(int(Item.Score)) + "_" + strconv.Itoa(int(Item.IsGet)) + "_" + strconv.Itoa(int(Item.Times)) + "_" + strconv.Itoa(int(Item.CurChampshipsId)) + "_" + strconv.Itoa(int(Item.AIEnum))
|
||||
strr = append(strr, unit)
|
||||
}
|
||||
data := strings.Join(strr, ";")
|
||||
sqlStruct := &db.SqlChampionshipsStruct{}
|
||||
sqlStruct.ChampshipsGroupID = GroupId
|
||||
sqlStruct.GroupRankData = data
|
||||
sqlStruct.CurChampshipsId = List[0].CurChampshipsId
|
||||
db.FormatAllMemUpdateDb(sqlStruct, "t_championships_data", "ChampshipsGroupID")
|
||||
}
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) LoadDbDataByGroupId(ChampshipsId int32) {
|
||||
|
||||
sqlStr := "SELECT * FROM t_championships_data WHERE CurChampshipsId = ?"
|
||||
|
||||
sqlStruck := []db.SqlChampionshipsStruct{}
|
||||
|
||||
if err := db.SqlDb.Select(&sqlStruck, sqlStr, ChampshipsId); err != nil {
|
||||
fmt.Printf("get data failed, err:%v\n", err)
|
||||
|
||||
} else {
|
||||
for m := 0; m < len(sqlStruck); m++ {
|
||||
units := strings.Split(sqlStruck[m].GroupRankData, ";")
|
||||
list := []*msg.ChampshipsPlayerInfo{}
|
||||
for i := 0; i < len(units); i++ {
|
||||
item := units[i]
|
||||
strr := strings.Split(item, "_")
|
||||
temp := &msg.ChampshipsPlayerInfo{}
|
||||
dwuin, _ := strconv.Atoi(strr[0])
|
||||
temp.DwUin = int32(dwuin)
|
||||
IsPlayer, _ := strconv.Atoi(strr[1])
|
||||
temp.IsPlayer = int32(IsPlayer)
|
||||
Score, _ := strconv.Atoi(strr[2])
|
||||
temp.Score = int32(Score)
|
||||
IsGet, _ := strconv.Atoi(strr[3])
|
||||
temp.IsGet = int32(IsGet)
|
||||
Times, _ := strconv.Atoi(strr[4])
|
||||
temp.Times = int32(Times)
|
||||
CS, _ := strconv.Atoi(strr[5])
|
||||
temp.CurChampshipsId = int32(CS)
|
||||
AI, _ := strconv.Atoi(strr[6])
|
||||
temp.AIEnum = int32(AI)
|
||||
list = append(list, temp)
|
||||
}
|
||||
p.MChampshipPlayerMap[sqlStruck[m].ChampshipsGroupID] = list
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) ReqChampshipAddScore(player *Player, buf []byte) {
|
||||
req := &msg.ReqChampshipAddScore{}
|
||||
proto.Unmarshal(buf, req)
|
||||
res := &msg.ResChampshipAddScore{}
|
||||
|
||||
if p.MStatus == 0 {
|
||||
res.ResultCode = MergeConst.Protocol_Champship_End
|
||||
} else {
|
||||
_, ok := p.MChampshipPlayerMap[req.GroupId]
|
||||
if ok {
|
||||
List := p.MChampshipPlayerMap[req.GroupId]
|
||||
isHave := false
|
||||
for i := 0; i < len(List); i++ {
|
||||
if List[i].DwUin == player.M_DwUin {
|
||||
List[i].Score = List[i].Score + req.AddScore
|
||||
res.ResultCode = 0
|
||||
isHave = true
|
||||
break
|
||||
}
|
||||
}
|
||||
sort.Slice(List, func(i, j int) bool { return List[i].Score > List[j].Score })
|
||||
if !isHave {
|
||||
res.ResultCode = MergeConst.Protocol_Champship_No_Join
|
||||
} else {
|
||||
res.GroupRankDataList = List
|
||||
isAdd := false
|
||||
for i := 0; i < len(p.MUpdateNotifyList); i++ {
|
||||
if p.MUpdateNotifyList[i] == req.GroupId {
|
||||
isAdd = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !isAdd {
|
||||
p.MUpdateNotifyList = append(p.MUpdateNotifyList, req.GroupId)
|
||||
}
|
||||
|
||||
p.SaveDbDataByGroupId(req.GroupId)
|
||||
}
|
||||
} else {
|
||||
res.ResultCode = MergeConst.Protocol_Champship_No_Exsit
|
||||
}
|
||||
}
|
||||
|
||||
res.GroupId = req.GroupId
|
||||
agent := player.GetAgentByPlayer()
|
||||
data, _ := proto.Marshal(res)
|
||||
G_getGameLogic().PackResInfo(agent, "ResChampshipAddScore", data)
|
||||
}
|
||||
|
||||
func (p *ChampshipsManager) ReqChampshipAddTime(player *Player, buf []byte) {
|
||||
req := &msg.ReqChampshipAddTime{}
|
||||
proto.Unmarshal(buf, req)
|
||||
res := &msg.ResChampshipAddTime{}
|
||||
if p.MStatus == 0 {
|
||||
res.ResultCode = MergeConst.Protocol_Champship_End
|
||||
} else {
|
||||
_, ok := p.MChampshipPlayerMap[req.GroupId]
|
||||
if ok {
|
||||
List := p.MChampshipPlayerMap[req.GroupId]
|
||||
isHave := false
|
||||
for i := 0; i < len(List); i++ {
|
||||
if List[i].DwUin == player.M_DwUin {
|
||||
List[i].Times = List[i].Times + req.AddTimes
|
||||
res.ResultCode = 0
|
||||
isHave = true
|
||||
break
|
||||
}
|
||||
}
|
||||
sort.Slice(List, func(i, j int) bool { return List[i].Score > List[j].Score })
|
||||
if !isHave {
|
||||
res.ResultCode = MergeConst.Protocol_Champship_No_Join
|
||||
} else {
|
||||
res.GroupRankDataList = List
|
||||
p.SaveDbDataByGroupId(req.GroupId)
|
||||
}
|
||||
} else {
|
||||
res.ResultCode = MergeConst.Protocol_Champship_No_Exsit
|
||||
}
|
||||
}
|
||||
res.GroupId = req.GroupId
|
||||
|
||||
agent := player.GetAgentByPlayer()
|
||||
data, _ := proto.Marshal(res)
|
||||
G_getGameLogic().PackResInfo(agent, "ResChampshipAddTime", data)
|
||||
}
|
||||
@ -1,48 +0,0 @@
|
||||
package game
|
||||
|
||||
import "server/pkg/github.com/name5566/leaf/log"
|
||||
|
||||
func Charge(p *Player, ChargeId int) {
|
||||
ChargeFire(p, ChargeId) // 充值
|
||||
EndlessFire(p, ChargeId) // 无尽礼包
|
||||
PiggyBankFire(p, ChargeId) // 猪猪银行
|
||||
}
|
||||
|
||||
func PiggyBankFire(p *Player, ChargeId int) {
|
||||
PiggyBankMod := p.PlayMod.getPiggyBankMod()
|
||||
Item := PiggyBankMod.Fire(ChargeId)
|
||||
err := p.HandleItem(Item, "PiggyBank")
|
||||
if err != nil {
|
||||
log.Debug("ChargeFire err : %s", err)
|
||||
}
|
||||
LimitedTimePiggyBankTrigger(p)
|
||||
p.PlayMod.save()
|
||||
p.PushClientRes(PiggyBankMod.BackData())
|
||||
}
|
||||
|
||||
// 处理玩家充值
|
||||
func ChargeFire(p *Player, ChargeId int) {
|
||||
ChargeMod := p.PlayMod.getChargeMod()
|
||||
Item := ChargeMod.Fire(ChargeId)
|
||||
err := p.HandleItem(Item, "Charge")
|
||||
if err != nil {
|
||||
log.Debug("ChargeFire err : %s", err)
|
||||
}
|
||||
p.PlayMod.save()
|
||||
p.PushClientRes(ChargeMod.BackData())
|
||||
}
|
||||
|
||||
// 处理玩家充值
|
||||
func EndlessFire(p *Player, ChargeId int) {
|
||||
EndlessMod := p.PlayMod.getEndlessMod()
|
||||
Item := EndlessMod.Fire(ChargeId)
|
||||
if Item == nil {
|
||||
return
|
||||
}
|
||||
err := p.HandleItem(Item, "Endless")
|
||||
if err != nil {
|
||||
log.Debug("ChargeFire err : %s", err)
|
||||
}
|
||||
p.PlayMod.save()
|
||||
p.PushClientRes(EndlessMod.BackData())
|
||||
}
|
||||
@ -1,115 +0,0 @@
|
||||
package game
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"server/GoUtil"
|
||||
mergeCluster "server/cluster"
|
||||
"server/conf"
|
||||
"server/game/mod/msg"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
)
|
||||
|
||||
type FriendMgr struct {
|
||||
*ServerMod
|
||||
}
|
||||
|
||||
type FirendData struct {
|
||||
List map[int][]*msg.Msg
|
||||
ClusterMsg map[int][]*msg.Msg
|
||||
}
|
||||
|
||||
func (f *FriendMgr) Init() {
|
||||
|
||||
f.key = FRIEND_MGR_KEY
|
||||
f.data = &FirendData{
|
||||
List: make(map[int][]*msg.Msg),
|
||||
ClusterMsg: make(map[int][]*msg.Msg),
|
||||
}
|
||||
// 注册处理函数
|
||||
f.init()
|
||||
f.RegisterHandler(msg.HANDLE_TYPE_APPLY, f.sendToPlayer)
|
||||
f.RegisterHandler(msg.HADNLE_TYPE_AGREE, f.sendToPlayer)
|
||||
f.RegisterHandler(msg.HANDLE_TYPE_DEL, f.sendToPlayer)
|
||||
f.RegisterHandler(msg.HANDLE_TYPE_SYNC, f.sync)
|
||||
|
||||
// 卡牌消息
|
||||
f.RegisterHandler(msg.HANDLE_TYPE_REQ_CARD, f.sendToPlayer)
|
||||
f.RegisterHandler(msg.HANDLE_TYPE_AGREE_CARD, f.sendToPlayer)
|
||||
f.RegisterHandler(msg.HANDLE_TYPE_REG_CARD_REFUSE, f.sendToPlayer)
|
||||
f.RegisterHandler(msg.HANDLE_TYPE_REG_CARD_FINISH, f.sendToPlayer)
|
||||
f.RegisterHandler(msg.HANDLE_TYPE_AGREE_CARD_FAIL, f.sendToPlayer)
|
||||
f.RegisterHandler(msg.HANDLE_TYPE_EX_CARD, f.sendToPlayer)
|
||||
f.RegisterHandler(msg.HANDLE_TYPE_SELECT_EX_CARD, f.sendToPlayer)
|
||||
f.RegisterHandler(msg.HANDLE_TYPE_ARGREE_EX_CARD, f.sendToPlayer)
|
||||
f.RegisterHandler(msg.HANDLE_TYPE_REFUSE_SELECT_CARD, f.sendToPlayer)
|
||||
f.RegisterHandler(msg.HANDLE_TYPE_REFUSE_EX_CARD, f.sendToPlayer)
|
||||
|
||||
}
|
||||
|
||||
func (f *FriendMgr) getData() *FirendData {
|
||||
return f.data.(*FirendData)
|
||||
}
|
||||
|
||||
// 通知玩家
|
||||
func (f *FriendMgr) sendToPlayer(m *msg.Msg) (interface{}, error) {
|
||||
err := sendToPlayer(m)
|
||||
if err != nil {
|
||||
log.Debug("send to player error : %s\n", err)
|
||||
ToServerId := GoUtil.GetServerIdByUid(m.To)
|
||||
if ToServerId != conf.Server.ServerID {
|
||||
f.getData().ClusterMsg[m.To] = append(f.getData().ClusterMsg[m.To], m) // 保存到集群消息
|
||||
} else {
|
||||
f.getData().List[m.To] = append(f.getData().List[m.To], m) // 保存到本地消息
|
||||
}
|
||||
f.update = true
|
||||
return nil, err
|
||||
}
|
||||
log.Debug("send to player success")
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// 同步信息
|
||||
func (f *FriendMgr) sync(m *msg.Msg) (interface{}, error) {
|
||||
data := f.getData().List[m.From]
|
||||
f.getData().List[m.From] = make([]*msg.Msg, 0)
|
||||
return data, nil
|
||||
}
|
||||
|
||||
// 发送消息给玩家
|
||||
func sendToPlayer(m *msg.Msg) error {
|
||||
p := G_GameLogicPtr.GetPlayerByUid(m.To)
|
||||
if p == nil || p.stop {
|
||||
return fmt.Errorf("player %d not online", m.To)
|
||||
}
|
||||
p.SendMsg(m)
|
||||
return nil
|
||||
}
|
||||
|
||||
func FriendMgrSend(m *msg.Msg) error {
|
||||
ToServer := GoUtil.GetServerIdByUid(m.To)
|
||||
if ToServer != conf.Server.ServerID {
|
||||
err := mergeCluster.SendServerMsg(m, ToServer)
|
||||
if err != nil { // 区服不在线
|
||||
G_GameLogicPtr.FriendMgrSend(m)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
G_GameLogicPtr.FriendMgrSend(m)
|
||||
return nil
|
||||
}
|
||||
|
||||
// 集群好友消息同步
|
||||
func ClusterFriendSync(m *msg.Msg) error {
|
||||
log.Debug("ClusterFriendSync")
|
||||
if v, ok := G_GameLogicPtr.FriendMgr.getData().ClusterMsg[m.To]; ok {
|
||||
for _, msg := range v {
|
||||
mergeCluster.SendServerMsg(msg, m.To)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func FriendMgrCall(m *msg.Msg) interface{} {
|
||||
return G_GameLogicPtr.FriendMgrCall(m)
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,66 +0,0 @@
|
||||
package game
|
||||
|
||||
import (
|
||||
"server/game/mod/card"
|
||||
"server/game/mod/item"
|
||||
"server/msg"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
func ReqGmCommand(args []interface{}) error {
|
||||
_, player, buf := ParseArgs(args)
|
||||
detail := &msg.ReqGmCommand{}
|
||||
proto.Unmarshal(buf, detail)
|
||||
arg := strings.Split(detail.Command, " ")
|
||||
switch arg[0] {
|
||||
case "additem":
|
||||
id, _ := strconv.Atoi(arg[1])
|
||||
num, _ := strconv.Atoi(arg[2])
|
||||
player.HandleItem([]*item.Item{item.NewItem(id, num)}, "GM")
|
||||
case "subitem":
|
||||
id, _ := strconv.Atoi(arg[1])
|
||||
num, _ := strconv.Atoi(arg[2])
|
||||
player.HandleItem([]*item.Item{item.NewItem(id, -num)}, "GM")
|
||||
case "reset_order":
|
||||
player.PlayMod.mod_list.Order.Step = 0
|
||||
player.PlayMod.mod_list.Order.InitData()
|
||||
player.PushClientRes(player.PlayMod.mod_list.Order.BackData())
|
||||
case "add_card_star":
|
||||
num, _ := strconv.Atoi(arg[1])
|
||||
player.PlayMod.mod_list.Card.ExchangeStar += num
|
||||
player.PushClientRes(player.PlayMod.mod_list.Card.BackData())
|
||||
case "addexp":
|
||||
num, _ := strconv.Atoi(arg[1])
|
||||
player.GetPlayerBaseMod().AddExp(num)
|
||||
player.PushClientRes(&player.GetPlayerBaseMod().Data)
|
||||
case "setlv":
|
||||
num, _ := strconv.Atoi(arg[1])
|
||||
player.GetPlayerBaseMod().Data.Level = int32(num)
|
||||
player.GetPlayerBaseMod().Data.Exp = 0
|
||||
player.PushClientRes(&player.GetPlayerBaseMod().Data)
|
||||
case "zeroUpdate":
|
||||
player.PlayMod.getVarMod().DailyResetTime = 0
|
||||
player.ZeroUpdate([]interface{}{})
|
||||
case "setSevenLoginActive":
|
||||
num, _ := strconv.Atoi(arg[1])
|
||||
player.PlayMod.getSevenLoginMod().Active = num
|
||||
case "pay":
|
||||
ChargeId, _ := strconv.Atoi(arg[1])
|
||||
Charge(player, ChargeId)
|
||||
case "resetCardReq":
|
||||
CardMod := player.PlayMod.getCardMod()
|
||||
CardMod.ReqFriend = make(map[int]*card.CardInfo)
|
||||
CardMod.ExCard = make(map[int]*card.CardInfo)
|
||||
CardMod.ExTimes = 10
|
||||
CardMod.ReqTimes = 10
|
||||
|
||||
FriendMod := player.PlayMod.getFriendMod()
|
||||
FriendMod.ApplyCard = make(map[int]*card.CardInfo)
|
||||
FriendMod.ExchangeCard = make(map[int]*card.CardInfo)
|
||||
FriendMod.SelectCard = make(map[int]*card.CardInfo)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@ -1,79 +0,0 @@
|
||||
package game
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"server/conf"
|
||||
"server/msg"
|
||||
|
||||
// "server/msg"
|
||||
"encoding/json"
|
||||
"strconv"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
)
|
||||
|
||||
type HttpManager struct {
|
||||
Rounter *mux.Router
|
||||
}
|
||||
|
||||
func (p *HttpManager) InitRounter() {
|
||||
p.Rounter = mux.NewRouter()
|
||||
p.InitFriendRouter()
|
||||
p.InitPlayerProfileInfo()
|
||||
http.ListenAndServe(conf.Server.HttpPort, p.Rounter)
|
||||
}
|
||||
|
||||
func (p *HttpManager) InitFriendRouter() {
|
||||
bs := p.Rounter.PathPrefix("/Friend").Subrouter()
|
||||
bs.HandleFunc("/Add/{SenderId}/{ReceiveId}", p.AddFriend)
|
||||
bs.HandleFunc("/Del/{SenderId}/{ReceiveId}", p.DeleteFriend)
|
||||
}
|
||||
|
||||
func (p *HttpManager) InitPlayerProfileInfo() {
|
||||
bs := p.Rounter.PathPrefix("/Profile").Subrouter()
|
||||
bs.HandleFunc("/GetBrief/{Id}", p.GetPlayerProfileInfo)
|
||||
}
|
||||
|
||||
func (p *HttpManager) GetPlayerProfileInfo(w http.ResponseWriter, r *http.Request) {
|
||||
vars := mux.Vars(r)
|
||||
|
||||
Id, ok := vars["Id"]
|
||||
|
||||
if ok {
|
||||
Uin, _ := strconv.Atoi(Id)
|
||||
data := G_GameLogicPtr.MPlayerProfileManager.HttpReqPlayerBriefProfileData(int32(Uin))
|
||||
test := []*msg.ResPlayerBriefProfileData{data, data}
|
||||
bytes, _ := json.Marshal(test)
|
||||
|
||||
v := []*msg.ResPlayerBriefProfileData{}
|
||||
json.Unmarshal(bytes, &v)
|
||||
|
||||
fmt.Println("bytes Length:" + strconv.Itoa(len(v)))
|
||||
fmt.Println("bytes Length:" + strconv.Itoa(len(v)))
|
||||
w.Write(bytes)
|
||||
}
|
||||
}
|
||||
|
||||
func (p *HttpManager) AddFriend(w http.ResponseWriter, r *http.Request) {
|
||||
vars := mux.Vars(r)
|
||||
SenderId, ok := vars["SenderId"]
|
||||
if ok {
|
||||
fmt.Println("AddFreind SenderId:" + SenderId)
|
||||
}
|
||||
|
||||
ReceiveId, ok1 := vars["ReceiveId"]
|
||||
if ok1 {
|
||||
fmt.Println("AddFreind ReceiveId:" + ReceiveId)
|
||||
}
|
||||
}
|
||||
|
||||
func (p *HttpManager) DeleteFriend(w http.ResponseWriter, r *http.Request) {
|
||||
vars := mux.Vars(r)
|
||||
id, ok := vars["id"]
|
||||
if !ok {
|
||||
fmt.Println("id is missing in parameters")
|
||||
}
|
||||
fmt.Println(`id := `, id)
|
||||
|
||||
}
|
||||
@ -1,242 +0,0 @@
|
||||
package game
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/robfig/cron/v3"
|
||||
"server/GoUtil"
|
||||
"server/MergeConst"
|
||||
"server/db"
|
||||
"server/gamedata"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"server/pkg/github.com/name5566/leaf/timer"
|
||||
)
|
||||
|
||||
type LimitEventPeriod struct {
|
||||
StartCronID cron.EntryID
|
||||
EndTimer *timer.Timer
|
||||
StartTime int32
|
||||
EndTime int32
|
||||
Duration int32
|
||||
CronStr string
|
||||
AddTimes int32
|
||||
}
|
||||
|
||||
func NewLimitEventData(dataName string, dbName string, player *Player) *PlayerLimitData {
|
||||
act := &PlayerLimitData{
|
||||
PlayerData: NewPlayerData(dataName, player),
|
||||
MDbName: dbName,
|
||||
}
|
||||
|
||||
return act
|
||||
}
|
||||
|
||||
func CreateLimiteEventData(ID int32, dataName string, player *Player) PlayerDataModule {
|
||||
var data PlayerDataModule
|
||||
if ID == 1 {
|
||||
data = &PlayerChestRainData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Chest_Rain", player)}
|
||||
}
|
||||
if ID == 2 {
|
||||
data = &PlayerSuperEmiterData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Super_Emiter", player)}
|
||||
}
|
||||
if ID == 3 {
|
||||
data = &PlayerStarRainData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Star_Rain", player)}
|
||||
}
|
||||
if ID == 4 {
|
||||
data = &PlayerHighRollerData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_High_Roller", player)}
|
||||
}
|
||||
if ID == 5 {
|
||||
data = &PlayerSuperOrderData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Super_Order", player)}
|
||||
}
|
||||
if ID == 6 {
|
||||
data = &PlayerSceneSprintData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Scene_Sprint", player)}
|
||||
}
|
||||
if ID == 7 {
|
||||
data = &PlayerCardFestivalData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Card_Festival", player)}
|
||||
}
|
||||
if ID == 8 {
|
||||
data = &PlayerDoubleHitData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Double_Hit", player)}
|
||||
}
|
||||
if ID == 9 {
|
||||
data = &PlayerCardSwapData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Card_Swap", player)}
|
||||
}
|
||||
if ID == 10 {
|
||||
data = &PlayerPetRobberData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Pet_Robber", player)}
|
||||
}
|
||||
|
||||
return data
|
||||
}
|
||||
|
||||
type LimiteEventManager struct {
|
||||
MStatus int32
|
||||
CronList map[int][]string
|
||||
IsSettle int32
|
||||
IsLoadDB bool
|
||||
MUpdateNotifyList []int32
|
||||
McronSave *cron.Cron
|
||||
McronSaveID cron.EntryID
|
||||
RobotCronID cron.EntryID
|
||||
RobotCronID10s cron.EntryID
|
||||
m_MapCronEntryIDs map[int][]*LimitEventPeriod
|
||||
Mdispatr *timer.Dispatcher
|
||||
IsHighRoll bool
|
||||
}
|
||||
|
||||
func (p *LimiteEventManager) GetLimitDataNameById(id int32) string {
|
||||
LimitDataMap := make(map[int32]string)
|
||||
LimitDataMap[1] = "PlayerChestRainData"
|
||||
LimitDataMap[2] = "PlayerSuperEmiterData"
|
||||
LimitDataMap[3] = "PlayerStarRainData"
|
||||
LimitDataMap[4] = "PlayerHighRollerData"
|
||||
LimitDataMap[5] = "PlayerSuperOrderData"
|
||||
LimitDataMap[6] = "PlayerSceneSprintData"
|
||||
LimitDataMap[7] = "PlayerCardFestivalData"
|
||||
LimitDataMap[8] = "PlayerDoubleHitData"
|
||||
LimitDataMap[9] = "PlayerCardSwapData"
|
||||
LimitDataMap[10] = "PlayerPetRobberData"
|
||||
|
||||
return LimitDataMap[id]
|
||||
}
|
||||
|
||||
func (p *LimiteEventManager) SaveDataFromDB(Key interface{}) bool {
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func (p *LimiteEventManager) GetSunDayZero() int64 {
|
||||
timeStamp := time.Now().Unix()
|
||||
t := time.Unix(timeStamp, 0).Local()
|
||||
delta := int(t.Weekday()*3600*24) + t.Hour()*3600 + t.Minute()*60 + t.Second()
|
||||
return int64(timeStamp) - int64(delta)
|
||||
}
|
||||
|
||||
func (p *LimiteEventManager) GetLimitDataStatus(id int) *LimitEventPeriod {
|
||||
timeStamp := time.Now().Unix()
|
||||
keys := p.m_MapCronEntryIDs[id]
|
||||
for i := 0; i < len(keys); i++ {
|
||||
if timeStamp >= int64(keys[i].StartTime) && timeStamp < int64(keys[i].EndTime) {
|
||||
return keys[i]
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *LimiteEventManager) GetIsHighRollerPersion() bool {
|
||||
return p.IsHighRoll
|
||||
}
|
||||
|
||||
// 1.宝箱雨
|
||||
func (p *LimiteEventManager) InitManager() {
|
||||
// 0 11 20 12 *
|
||||
p.IsHighRoll = false
|
||||
p.m_MapCronEntryIDs = map[int][]*LimitEventPeriod{}
|
||||
c := cron.New()
|
||||
LimiteCfg := gamedata.GetConfigByName("LimiteEvent")
|
||||
WeekZero := p.GetSunDayZero()
|
||||
timeStamp := time.Now().Unix()
|
||||
|
||||
p.Mdispatr = timer.NewDispatcher(10)
|
||||
for i := 0; i < LimiteCfg.NumRecord(); i++ {
|
||||
record := LimiteCfg.Record(i).(*gamedata.LimiteEvent)
|
||||
startStrr := record.StartTime
|
||||
starts := strings.Split(startStrr, "|")
|
||||
|
||||
DurStrr := record.Duration
|
||||
Durs := strings.Split(DurStrr, "|")
|
||||
|
||||
AddTimesStrr := record.AddTimes
|
||||
ats := strings.Split(AddTimesStrr, "|")
|
||||
|
||||
p.m_MapCronEntryIDs[record.Id] = []*LimitEventPeriod{}
|
||||
for n := 0; n < len(starts); n++ {
|
||||
LEP := &LimitEventPeriod{}
|
||||
start := starts[n]
|
||||
dur, _ := strconv.Atoi(Durs[n])
|
||||
addt, _ := strconv.Atoi(ats[n])
|
||||
LEP.StartCronID, _ = c.AddFunc(start, func() {
|
||||
fmt.Println("Next: UTC", c.Entry(LEP.StartCronID).Next.Unix())
|
||||
fmt.Println("CronStr:" + LEP.CronStr)
|
||||
cur := int32(time.Now().Unix())
|
||||
LEP.StartTime = int32(cur)
|
||||
LEP.EndTime = int32(cur) + int32(dur)
|
||||
if record.Id == 9 {
|
||||
if G_GameLogicPtr.M_SvrGlobal.LimitCardSwapTime < LEP.StartTime {
|
||||
card4Cfg, str4 := gamedata.GetRandomDifferenceSet(4, G_GameLogicPtr.M_SvrGlobal.Limit4CardExclude)
|
||||
card5Cfg, str5 := gamedata.GetRandomDifferenceSet(5, G_GameLogicPtr.M_SvrGlobal.Limit5CardExclude)
|
||||
G_GameLogicPtr.M_SvrGlobal.Limit4Card = int32(card4Cfg.Id)
|
||||
G_GameLogicPtr.M_SvrGlobal.Limit5Card = int32(card5Cfg.Id)
|
||||
G_GameLogicPtr.M_SvrGlobal.Limit4CardExclude = str4
|
||||
G_GameLogicPtr.M_SvrGlobal.Limit5CardExclude = str5
|
||||
G_GameLogicPtr.M_SvrGlobal.LimitCardSwapTime = LEP.StartTime
|
||||
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
|
||||
}
|
||||
}
|
||||
GoUtil.CallEvent(MergeConst.OpenNewLimitEvent, []interface{}{record.Id, cur, cur + int32(dur), record.Type})
|
||||
if record.Id == 4 {
|
||||
p.IsHighRoll = true
|
||||
}
|
||||
go func() {
|
||||
LeafTimer := p.Mdispatr.AfterFunc(time.Duration(dur)*time.Second, func() {
|
||||
if record.Id == 4 {
|
||||
p.IsHighRoll = false
|
||||
}
|
||||
})
|
||||
LEP.EndTimer = LeafTimer
|
||||
|
||||
(<-p.Mdispatr.ChanTimer).Cb()
|
||||
}()
|
||||
})
|
||||
LEP.Duration = int32(dur)
|
||||
LEP.CronStr = start
|
||||
LEP.AddTimes = int32(addt)
|
||||
p.m_MapCronEntryIDs[record.Id] = append(p.m_MapCronEntryIDs[record.Id], LEP)
|
||||
}
|
||||
}
|
||||
c.Start()
|
||||
for k, v := range p.m_MapCronEntryIDs {
|
||||
// record := LimiteCfg.Index(k).(*gamedata.LimiteEvent)
|
||||
key := k
|
||||
for i := 0; i < len(v); i++ {
|
||||
Schedule := c.Entry(v[i].StartCronID).Schedule
|
||||
Next := Schedule.Next(time.Unix(WeekZero, 0))
|
||||
// fmt.Println("Next.Unix():" + strconv.Itoa(int(Next.Unix())))
|
||||
value := v[i]
|
||||
if timeStamp >= Next.Unix() && timeStamp < Next.Unix()+int64(value.Duration) {
|
||||
fmt.Println("CronStr:" + value.CronStr)
|
||||
if key == 4 {
|
||||
p.IsHighRoll = true
|
||||
}
|
||||
if key == 9 {
|
||||
if G_GameLogicPtr.M_SvrGlobal.LimitCardSwapTime < int32(Next.Unix()) {
|
||||
card4Cfg, str4 := gamedata.GetRandomDifferenceSet(4, G_GameLogicPtr.M_SvrGlobal.Limit4CardExclude)
|
||||
card5Cfg, str5 := gamedata.GetRandomDifferenceSet(5, G_GameLogicPtr.M_SvrGlobal.Limit5CardExclude)
|
||||
G_GameLogicPtr.M_SvrGlobal.Limit4Card = int32(card4Cfg.Id)
|
||||
G_GameLogicPtr.M_SvrGlobal.Limit5Card = int32(card5Cfg.Id)
|
||||
G_GameLogicPtr.M_SvrGlobal.Limit4CardExclude = str4
|
||||
G_GameLogicPtr.M_SvrGlobal.Limit5CardExclude = str5
|
||||
G_GameLogicPtr.M_SvrGlobal.LimitCardSwapTime = int32(Next.Unix())
|
||||
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
|
||||
}
|
||||
}
|
||||
go func() {
|
||||
delta := Next.Unix() + int64(value.Duration) - timeStamp
|
||||
LeafTimer := p.Mdispatr.AfterFunc(time.Duration(delta)*time.Second, func() {
|
||||
if key == 4 {
|
||||
p.IsHighRoll = false
|
||||
}
|
||||
})
|
||||
value.EndTimer = LeafTimer
|
||||
value.StartTime = int32(Next.Unix())
|
||||
value.EndTime = int32(Next.Unix()) + int32(value.Duration)
|
||||
(<-p.Mdispatr.ChanTimer).Cb()
|
||||
}()
|
||||
} else {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,72 +0,0 @@
|
||||
package game
|
||||
|
||||
import (
|
||||
"server/GoUtil"
|
||||
"server/game/mod/limitedTimeEvent"
|
||||
"server/msg"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 限时事件触发器
|
||||
func LimitedTimeEventTrigger(p *Player, AddEventId int) {
|
||||
EndTime, TimeoutEvent, AddEvent := p.PlayMod.getLimitedTimeEventMod().Trigger()
|
||||
remainingTime := GoUtil.NextHourRemain()
|
||||
EndTime = GoUtil.IfTrue(EndTime > 0, min(EndTime, int(remainingTime)), int(remainingTime)).(int)
|
||||
if AddEventId != 0 {
|
||||
AddEvent = append(AddEvent, AddEventId)
|
||||
}
|
||||
if EndTime > 0 {
|
||||
p.CallEvent(time.Duration(EndTime)*time.Second, func() {
|
||||
p.lock.Lock()
|
||||
defer p.lock.Unlock()
|
||||
LimitedTimeEventTrigger(p, 0)
|
||||
p.SendClientRes()
|
||||
}, "LimitedTimeEvent")
|
||||
}
|
||||
|
||||
for _, v := range TimeoutEvent { // 事件到期处理
|
||||
p.PushClientRes(&msg.LimitEventNotify{
|
||||
Id: int32(v),
|
||||
Type: limitedTimeEvent.EVENT_NOTIFY_TYPE_DEL,
|
||||
})
|
||||
switch v {
|
||||
case limitedTimeEvent.EVENT_TYPE_HIGH_ROLLER:
|
||||
MaxEnergyMul := p.GetPlayerBaseMod().GetMaxEnergyMul()
|
||||
p.PlayMod.getBaseMod().ResetEnergyMul(MaxEnergyMul)
|
||||
p.PushClientRes(p.PlayMod.getBaseMod().BackData())
|
||||
case limitedTimeEvent.EVENT_TYPE_SUPER_ORDER:
|
||||
p.PlayMod.getOrderMod().RemoveSuperOrder()
|
||||
p.PushClientRes(p.PlayMod.getOrderMod().BackData())
|
||||
case limitedTimeEvent.EVENT_TYPE_CARD_FESTIVAL:
|
||||
p.PlayMod.getCardMod().ResetCardFestival()
|
||||
}
|
||||
}
|
||||
|
||||
for _, v := range AddEvent { // 增加事件处理
|
||||
switch v {
|
||||
case limitedTimeEvent.EVENT_TYPE_SUPER_ORDER:
|
||||
Emit := p.PlayMod.getChessMod().GetEmitList()
|
||||
Lv := p.GetPlayerBaseMod().GetLevel()
|
||||
p.PlayMod.getOrderMod().CreateSuperOrder(Lv, Emit)
|
||||
p.PushClientRes(p.PlayMod.getOrderMod().BackData())
|
||||
case limitedTimeEvent.EVENT_TYPE_CARD_FESTIVAL:
|
||||
p.PlayMod.getCardMod().CreateCardFestival()
|
||||
}
|
||||
}
|
||||
p.PushClientRes(p.PlayMod.getLimitedTimeEventMod().BackData())
|
||||
p.PlayMod.save()
|
||||
}
|
||||
|
||||
// 限时猪猪存钱罐触发器
|
||||
func LimitedTimePiggyBankTrigger(p *Player) {
|
||||
Remain := p.PlayMod.getPiggyBankMod().TimeOut()
|
||||
if Remain > 0 {
|
||||
p.CallEvent(time.Duration(Remain)*time.Second, func() {
|
||||
p.lock.Lock()
|
||||
defer p.lock.Unlock()
|
||||
p.PlayMod.getPiggyBankMod().TimeOut()
|
||||
p.SendClientRes()
|
||||
}, "PiggyBank")
|
||||
}
|
||||
p.PushClientRes(p.PlayMod.getPiggyBankMod().BackData())
|
||||
}
|
||||
@ -1,77 +0,0 @@
|
||||
package game
|
||||
|
||||
import (
|
||||
"server/db"
|
||||
"server/game/mod/item"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"sync"
|
||||
|
||||
"github.com/robfig/cron/v3"
|
||||
)
|
||||
|
||||
const (
|
||||
Login_log = 1
|
||||
LoginOut_log = 2
|
||||
Event_log = 3
|
||||
)
|
||||
|
||||
type LogMgr struct {
|
||||
L []*Log
|
||||
McronSave *cron.Cron
|
||||
Lock sync.Mutex
|
||||
}
|
||||
|
||||
type Log struct {
|
||||
Uid int32
|
||||
Type int32
|
||||
Event string
|
||||
Items []*item.Item
|
||||
TimeStamp int64
|
||||
}
|
||||
|
||||
func (L *LogMgr) InitManager() {
|
||||
L.McronSave = cron.New()
|
||||
L.L = make([]*Log, 0, 10)
|
||||
L.McronSave.AddFunc("@every 10s", func() {
|
||||
L.Lock.Lock()
|
||||
defer L.Lock.Unlock()
|
||||
for _, v := range L.L {
|
||||
switch v.Type {
|
||||
case Login_log:
|
||||
v.InsertLoginLog()
|
||||
case LoginOut_log:
|
||||
v.InsertLoginLog()
|
||||
case Event_log:
|
||||
v.InsertEventLog()
|
||||
default:
|
||||
log.Debug("unknown log type %d", v.Type)
|
||||
continue
|
||||
}
|
||||
}
|
||||
L.L = L.L[:0]
|
||||
})
|
||||
L.McronSave.Start()
|
||||
}
|
||||
|
||||
func (L *LogMgr) AddLog(logs *Log) {
|
||||
return
|
||||
L.Lock.Lock()
|
||||
defer L.Lock.Unlock()
|
||||
L.L = append(L.L, logs)
|
||||
}
|
||||
|
||||
func (Log *Log) InsertEventLog() {
|
||||
sqlStr := "INSERT INTO t_log_event (dwUin, type, event, timestamp) VALUES (?, ?, ?, ?)"
|
||||
_, err := db.SqlDb.Exec(sqlStr, Log.Uid, Log.Type, Log.Event, Log.TimeStamp)
|
||||
if err != nil {
|
||||
log.Debug("log insert event log error %s", err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func (Log *Log) InsertLoginLog() {
|
||||
sqlStr := "INSERT INTO t_log_login (dwUin, type, event, timestamp) VALUES (?, ?, ?, ?)"
|
||||
_, err := db.SqlDb.Exec(sqlStr, Log.Uid, Log.Type, Log.Event, Log.TimeStamp)
|
||||
if err != nil {
|
||||
log.Debug("log insert event log error %s", err.Error())
|
||||
}
|
||||
}
|
||||
@ -1,72 +0,0 @@
|
||||
package game
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"server/GoUtil"
|
||||
"server/db"
|
||||
"server/game/mod/item"
|
||||
"server/game/mod/msg"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type MailMgr struct {
|
||||
*ServerMod
|
||||
list map[int]*ServerMail
|
||||
}
|
||||
|
||||
type MailData struct {
|
||||
List map[int][]*msg.Msg
|
||||
}
|
||||
|
||||
type ServerMail struct {
|
||||
Id int
|
||||
Title string
|
||||
Content string
|
||||
Items []*item.Item
|
||||
Start_time int64
|
||||
Register_time int64
|
||||
End_time int64
|
||||
Mail_type int
|
||||
To_uids []int
|
||||
}
|
||||
|
||||
func (m *MailMgr) Init() {
|
||||
m.key = MAIL_MGR_KEY
|
||||
m.data = &MailData{
|
||||
List: make(map[int][]*msg.Msg),
|
||||
}
|
||||
m.list = make(map[int]*ServerMail)
|
||||
// 注册处理函数
|
||||
m.init()
|
||||
m.LoadMail()
|
||||
}
|
||||
|
||||
func (r *MailMgr) LoadMail() {
|
||||
// 从数据库加载邮件
|
||||
data := make([]*db.SqlServerMailStruct, 0)
|
||||
db.GetServerMailData(&data)
|
||||
for _, v := range data {
|
||||
Uids := make([]int, 0)
|
||||
UidArr := strings.Split(v.To_uids, ",")
|
||||
for _, v := range UidArr {
|
||||
Uids = append(Uids, GoUtil.Int(v))
|
||||
}
|
||||
var items []interface{}
|
||||
json.Unmarshal([]byte(v.Items), &items)
|
||||
r.list[v.Id] = &ServerMail{
|
||||
Id: v.Id,
|
||||
Title: v.Title,
|
||||
Content: v.Content,
|
||||
Items: item.ParseItem(items),
|
||||
Start_time: v.Start_time,
|
||||
Register_time: v.Register_time,
|
||||
End_time: v.End_time,
|
||||
Mail_type: v.Mail_type,
|
||||
To_uids: Uids,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (r *MailMgr) Sync() {
|
||||
G_GameLogicPtr.NotifyAll(&msg.Msg{Type: msg.HANDLE_TYPE_MAIL, Extra: r.list[1]})
|
||||
}
|
||||
@ -1,9 +0,0 @@
|
||||
package game
|
||||
|
||||
type PlayerSimpleData struct {
|
||||
Uid int
|
||||
Name string
|
||||
Avatar int
|
||||
Level int
|
||||
Face int
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user