Compare commits

..

236 commits

Author SHA1 Message Date
Li
c40c965d7e Fix 2player for real 2025-01-06 15:43:36 +13:00
Li
de6a626f10 fix build yml 2025-01-06 15:15:45 +13:00
Li
76eb2d8391 Fix 2player 2025-01-06 15:13:18 +13:00
Li
535408981a Fix 2Player? 2025-01-06 15:11:24 +13:00
random()
2f7d32a13b
Update README.md 2024-05-28 23:56:35 -06:00
random()
18012c0948
cleanup the github actions a bit 2024-05-28 21:42:28 -06:00
Li
154f5e0149 Remove Windows ARM version 2023-11-25 13:18:36 +13:00
Li
08ead748bb Update to .NET 8.0 2023-11-25 13:10:25 +13:00
Li
78bef4b271 Fix not being able to turn off noclip 2023-04-05 17:37:45 +12:00
Li
7d82f83f64 Update SQLConnector to latest version, idk maybe will fix not being able to connect for some reason. 2023-04-05 16:45:07 +12:00
Li
b7f864963e
.net 7.0 is in visual studio stable now 2023-02-02 01:16:21 -08:00
Li
239f12cdc1 Fix datetime format in HISPd 2022-11-27 11:29:04 +13:00
Li
245f2d3e48 Fix Server shutdown 2022-11-27 11:19:41 +13:00
Li
7ed10a6bca update horseisledata 2022-11-26 22:58:41 +13:00
Li
9e69492e46 Improve command system, add HELP command, 2022-11-26 22:57:46 +13:00
Li
a2782fd35e Fix MACOS MPN00BS Copy 2022-11-24 14:17:22 +13:00
Li
3ffd813109 Fix crashing 2022-11-20 15:55:20 +13:00
Li
d630abb66a Some improvements .. 2022-11-20 15:33:36 +13:00
Li
1909950409 Fix build 2022-11-20 15:06:37 +13:00
Li
574596b4e0 Cleanup substrings, fix more of em 2022-11-20 15:03:15 +13:00
Li
a9a5ef65b0 Fix packetStr.SubString lengths; to make up for the fact received packets no longer terminate in \0 2022-11-20 14:01:54 +13:00
Li
b665061308 Dont process XML policy request as a hi1 packet. 2022-11-20 12:49:07 +13:00
Li
f716fedec5 Fix connecting on XMLSocket- 2022-11-20 12:47:18 +13:00
Li
44ada661d7 Patch out allow-from-domain cross origin stuff 2022-11-19 03:08:47 +13:00
Li
baf7d56f47 Patch to allow for connecting to offical servers with MPN00BS 2022-11-18 23:22:43 +13:00
Li
66dddad437 Add copy/paste 2022-11-18 22:51:52 +13:00
Li
be228de5ea Update MPN00BS 2022-11-18 20:09:43 +13:00
Li
7fcaf412df Fix build 2022-11-18 19:51:25 +13:00
Li
458748e6b0 Improve WebSocket performance 2022-11-18 19:45:17 +13:00
Li
eefc2b926d Remove \0 from packet unless XmlSocket 2022-11-18 18:21:03 +13:00
Li
3ed0120b9b blah 2022-11-17 14:59:46 +13:00
Li
29e5ab8093 Update HISP 2022-11-17 13:32:47 +13:00
Li
d73cd92c52 Fully implement websocket transport 2022-11-17 11:56:22 +13:00
Li
9c6c719c1a oop dont forget to remove this 2022-11-17 02:56:25 +13:00
Li
b9e3949b14 Improve websocket code. 2022-11-17 02:52:30 +13:00
Li
e74f66a439 Add Multiple transports system, begin work on WebSockets 2022-11-16 01:59:32 +13:00
Li
e869a23463 Delete pubxml.user 2022-11-15 04:29:05 +13:00
Li
645dd3ecf4 Revert tile debug 2022-11-15 04:28:36 +13:00
Li
2b6db887ed Fix tile id thingy again 2022-11-15 04:15:13 +13:00
Li
6613b0cb87 Fix tile debug feature 2022-11-15 04:11:06 +13:00
Li
ed12e9ad12 fix tile debug feature 2022-11-15 04:10:32 +13:00
Li
393dc147da Add silly tile debug feature 2022-11-15 04:07:40 +13:00
Li
7f635d5fdd a 2022-11-15 00:54:26 +13:00
Li
eaf1db1ee1 Begin work on Unit Tests 2022-11-14 23:09:22 +13:00
Li
cf7605c6c9 HISP 2022-11-12 12:11:46 +13:00
Li
be3a9fbd02 Re-add trimming stuff 2022-11-11 20:16:55 +13:00
Li
f15b37fd08 Fix socket thingy 2022-11-11 19:49:26 +13:00
Li
37cba8c859 fix linux PlatformNotSupported_AcceptSocket 2022-11-11 19:31:18 +13:00
Li
8c22cd1c8a f 2022-11-11 19:20:31 +13:00
Li
266407c3c4 Fix resources 2022-11-11 19:12:16 +13:00
Li
e9fdf1ff6f Try fix crash handler 2022-11-11 19:07:07 +13:00
Li
a7c5048f14 Fix trim / publish 2022-11-11 05:04:53 +13:00
Li
9e62fc8415 try nativeaot again 2022-11-11 04:19:01 +13:00
Li
bd2ba81b01 use 7.0 release 2022-11-11 02:36:58 +13:00
Li
13154729e2 Merge branch 'master' of https://github.com/islehorse/HISP 2022-11-11 02:33:53 +13:00
Li
6e2f8e7483 Build with .NET 7.0 release 2022-11-11 02:33:44 +13:00
Li
4c13134c8f
Update README.md 2022-11-03 23:55:41 +13:00
Li
73498c6a59
Update README.md 2022-11-03 23:48:24 +13:00
Li
221953b90f
Update README.md 2022-11-03 23:48:01 +13:00
Li
b3f0b37bf4
Update README.md 2022-11-03 23:45:31 +13:00
Li
0d32212095
Add more info to readme. 2022-11-03 23:44:47 +13:00
Li
c0bde9f864 Change to errorprint 2022-10-26 22:47:26 +13:00
Li
4c09390ac8 CONTINUE, NOT RETURN!!! 2022-10-26 22:45:22 +13:00
Li
3e3d840ce6 Fix Quotation Marks 2022-10-04 16:03:25 +13:00
Li
663106ca34 add macos MPNoobs build task 2022-10-04 15:59:42 +13:00
Li
a50d052c2a Revert "update build.yml"
This reverts commit 78e08c2e63.
2022-10-04 15:51:00 +13:00
Li
284cbf7e55 macos port but it actually works? 2022-10-04 15:40:09 +13:00
Li
78e08c2e63 update build.yml 2022-10-04 15:38:01 +13:00
Li
44f1d1bd79 MacOS port 2022-10-04 15:34:09 +13:00
Li
d5e7c97633 Update ServerStarter.cs 2022-10-04 15:14:45 +13:00
Li
f38f6320f4 Add macos flashplayer . 2022-10-04 15:08:59 +13:00
Li
99c9221f4b Continue, NOT RETURN! - fix the issue where no one can join at all: 2022-09-05 16:36:28 +12:00
Li
4b48db6b2a Fix crash when player leaves 2022-09-05 15:13:14 +12:00
Li
ed721b362e Move to v1.8 2022-09-05 15:05:21 +12:00
Li
825d3b4740 Change Util.cs to Helper.cs, and move ThreadSafeList to HISP.Util namespace. 2022-09-05 14:56:28 +12:00
Li
c36eda289a Remove all MemoryStreams from PacketBuilder, use Byte[] and List<Byte> only. 2022-09-05 14:55:16 +12:00
Li
3bea266b3e apparently dotnet script is borked on github actions, yay microsoft 2022-09-01 17:31:16 +12:00
Li
647a6f21af Add quotes 2022-09-01 17:22:49 +12:00
Li
fea71443b1 use dotnet (space) script 2022-09-01 17:05:54 +12:00
Li
892a8de202 Force older .NET version 2022-09-01 17:01:36 +12:00
Li
61dfd8db9a use dnscript 2022-09-01 16:44:11 +12:00
Li
0f0e092461 use dotnet-script 2022-09-01 16:40:45 +12:00
Li
c253722964 Add back HISPd AssemblyInfo.cs 2022-09-01 16:20:11 +12:00
Li
a003f5b98d Move to csx 2022-09-01 16:15:17 +12:00
Li
27c79a28a3 Super verbose 2022-09-01 08:59:23 +12:00
Li
05bafee922 Merge branch 'master' of https://github.com/islehorse/HISP 2022-09-01 08:50:50 +12:00
Li
e5bfea34f2 Update hisp 2022-09-01 08:50:42 +12:00
Li
c40ddce684
Update README.md 2022-08-31 23:01:44 +12:00
Li
248344f800 Make RandomId Thread Safe 2022-08-31 20:38:08 +12:00
Li
f739c99c87 Merge branch 'master' of https://github.com/islehorse/HISP 2022-08-31 20:31:18 +12:00
Li
40c34ac030 Add Thread-Safe Lists, and make all list access thread-safe 2022-08-31 20:31:07 +12:00
Li
c4ddc75da8
Update README.md 2022-07-29 13:42:21 +12:00
Li
65dec46a29
Update README.md 2022-07-29 13:41:38 +12:00
Li
900fe0d48a Fix CHMOD 2022-07-25 21:50:13 +12:00
Li
9294ec11a7 Update MPN00BS 2022-07-25 21:45:21 +12:00
Li
f12e930538 Update HISP 2022-07-25 21:13:10 +12:00
Li
9ddcd37d41 Add chmod to running flash 2022-07-25 21:09:38 +12:00
Li
dd423a4734 Update linux 2022-07-25 21:03:03 +12:00
Li
8efb10f3b5 Update gitignore 2022-07-25 20:16:19 +12:00
Li
d61de09704 Merge branch 'master' of https://github.com/islehorse/HISP 2022-07-25 20:15:48 +12:00
Li
c18acdba51 Make flashplayer 777 2022-07-25 19:52:05 +12:00
Li
a6a04f2cc4 Update gitignore 2022-07-25 19:27:54 +12:00
Li
dec54112fd Set permissions 2022-07-25 19:17:30 +12:00
Li
8297c56f21 Port N00BS to linux 2022-07-25 19:16:21 +12:00
Li
64fed1c6c4 Update thingy 2022-07-25 14:36:13 +12:00
Li
dd7efc17e5 update n00bs 2022-07-25 14:29:23 +12:00
Li
9d50f23067 Update N00BS 2022-07-25 14:17:26 +12:00
Li
e0aff19845 Nevermind 2022-07-22 19:37:48 +12:00
Li
ea96f347fa nevermind guess the exe doesnt customize right on linux 2022-07-22 19:36:50 +12:00
Li
2c062f4b67 Remove n00bs originnal from sln 2022-07-22 19:20:18 +12:00
Li
4c6288245a Build windows version on linux 2022-07-22 19:18:04 +12:00
Li
d0d95963af Remove server.properties lol 2022-07-22 18:58:21 +12:00
Li
b83960d872 Finish MPN00Bs 2022-07-22 18:57:53 +12:00
Li
b439ad1511 Update MPN00BS 2022-07-22 01:51:31 +12:00
Li
c32d1740e3 Add registration form to MPN00BS 2022-07-20 18:48:05 +12:00
Li
cdc136dcd4 Add Multiplatform HISP-NOOBS 2022-07-19 16:40:51 +12:00
Li
b3df338715 Fix N00BS 2022-07-19 12:33:44 +12:00
Li
0c299729dd remove shutdown call 2022-07-18 00:50:23 +12:00
Li
cc3cec4c8a Fix windows ARM 64 2022-07-18 00:40:37 +12:00
Li
0b8bed32cf fix linux 2022-07-18 00:29:16 +12:00
Li
3e70ac1c6a Fix linux build 2022-07-18 00:16:50 +12:00
Li
5e42d80109 remove installer project 2022-07-18 00:11:46 +12:00
Li
118182777d Fix N00BS 2022-07-18 00:10:57 +12:00
Li
39acd7f7eb Revert NativeAOT becuase MS broke it 2022-07-18 00:09:57 +12:00
Li
41a6038527 change sqllite libary 2022-07-17 23:45:12 +12:00
Li
6627ca5dc4 Update dependancies 2022-07-17 23:01:47 +12:00
Li
6a34745a5f add some debug print 2022-07-17 22:34:26 +12:00
Li
81589ed20a aaa 2022-07-17 22:01:00 +12:00
Li
ec7275a290 remove extra optiomization 2022-07-17 21:59:14 +12:00
Li
693acfdbe6 arm 2022-07-17 21:31:47 +12:00
Li
813e826716 please fuckin work 2022-07-17 21:24:28 +12:00
Li
d1617fe4f9 fix cross compile 2022-07-17 21:14:16 +12:00
Li
e3fa54f9e6 update 2022-07-17 21:05:33 +12:00
Li
6f3883fa37 update buildyml 2022-07-17 21:02:23 +12:00
Li
59270700ef update 2022-07-17 20:32:40 +12:00
Li
22f5c91599 Fix arm cross compile 2022-07-17 20:31:22 +12:00
Li
7f3c7ba845 add aarch64 linker 2022-07-17 20:17:09 +12:00
Li
e6a7d379b9 l 2022-07-17 19:59:04 +12:00
Li
5de29987af Linux arm64 2022-07-17 19:40:17 +12:00
Li
132ab34097 Fix MACOS 2022-07-17 19:14:13 +12:00
Li
69f1a98ff5 Lets change it up a litle 2022-07-17 19:12:09 +12:00
Li
3657da97f5 uod bui 2022-07-17 18:52:10 +12:00
Li
b961b50308 Remove debug info 2022-07-17 18:33:13 +12:00
Li
ca25d54589 come on! 2022-07-17 17:45:38 +12:00
Li
ab769afaf1 Fix copy? 2022-07-17 17:39:28 +12:00
Li
62905cce9a native ARM64 linux: 2022-07-17 17:32:32 +12:00
Li
7fe1d79158 . 2022-07-17 17:19:48 +12:00
Li
fb5693e986 update build.yml again 2022-07-17 17:18:45 +12:00
Li
b30f195080 Working dirs are ass 2022-07-17 17:12:35 +12:00
Li
114ba568b7 No i mean x64 2022-07-17 17:08:50 +12:00
Li
35dd2fc132 Need root >_< 2022-07-17 17:05:17 +12:00
Li
906cc5a0f0 Trees 2022-07-17 16:56:40 +12:00
Li
f32abd1b58 add some trees 2022-07-17 16:52:53 +12:00
Li
e66d1f9298 update build.yml 2022-07-17 16:49:00 +12:00
Li
88d2945065 Need root >_< 2022-07-17 16:44:55 +12:00
Li
f294a83368 Update build.yml 2022-07-17 16:43:30 +12:00
Li
0394d5fb9f Update build.yml 2022-07-17 16:39:07 +12:00
Li
1e90588664 Update build 2022-07-17 16:23:46 +12:00
Li
1bfb69e568 Update line endingsin prebuild 2022-07-17 16:19:17 +12:00
Li
c51103cda8 Update thingy 2022-07-17 16:16:30 +12:00
Li
7fb2673de0 Update build script 2022-07-17 16:05:49 +12:00
Li
03035cd5fb Fix compile on linux 2022-07-17 16:02:23 +12:00
Li
162dcba4a0 Update line endingsin prebuild 2022-07-17 15:58:30 +12:00
Li
d94595d4f0 Update line endings 2022-07-17 15:57:34 +12:00
Li
42ce640d3b update actions for ll test 2022-07-17 15:51:38 +12:00
Li
b05753f14b Update permissions 2022-07-17 15:47:59 +12:00
Li
5aa3e1228e Upd 2022-07-17 15:45:01 +12:00
Li
f2d36bd73a update prebuild again 2022-07-17 15:43:13 +12:00
Li
e554d41c94 Update prebuild script 2022-07-17 15:39:25 +12:00
Li
e0fe30cca7 Update Build.yml 2022-07-17 15:31:52 +12:00
Li
46b9805712 Update Build.yml 2022-07-17 15:27:37 +12:00
Li
c9d2e84b8a Update Actions 2022-07-17 15:21:25 +12:00
Li
c703d5b7f7 Test 2022-07-17 15:10:39 +12:00
Li
a501f5886c
Update build.yml 2022-06-23 01:22:53 +12:00
Li
afbd41a681 actually upload arm64 2022-06-22 23:00:44 +12:00
Li
0270b1e035 fix upload 2022-06-22 22:29:29 +12:00
Li
092e1a58bb actually upload arm64 2022-06-22 22:27:04 +12:00
Li
a375c7d871 Merge branch 'master' of https://github.com/islehorse/HISP 2022-06-22 22:24:08 +12:00
Li
020d642bc5 upd 2022-06-22 22:23:42 +12:00
Li
6826565cfd
Native build arm64 2022-06-22 22:11:25 +12:00
Li
b5d65a583b this is dumb 2022-06-21 17:48:06 +12:00
Li
64443e9cf0 Add hisp n00bs build 2022-06-21 17:36:56 +12:00
Li
c325d29062 update build process 2022-06-21 16:21:11 +12:00
Li
0330193545
Try 2022-06-21 15:45:42 +12:00
Li
3bbbf25537
change platformtarget 2022-06-21 15:34:54 +12:00
Li
f9ef53339d
native build x86 2022-06-21 15:17:50 +12:00
Li
2de85889d3
test 2022-06-19 23:04:50 +12:00
Li
3a3da520c5 Update prebuild script 2022-06-18 10:32:23 +12:00
Li
287325dd55 i hate yml 2022-06-18 03:07:47 +12:00
Li
59a592aeb5 Ugh 2022-06-18 03:06:48 +12:00
Li
f54ac90f3d Try native build again 2022-06-18 03:04:52 +12:00
Li
65e7e9b3a5 Test native compilation 2022-06-18 01:35:58 +12:00
Li
1afe643047 Fix warnings 2022-06-18 01:15:15 +12:00
Li
2df39d75fd
Update build.yml 2022-06-18 00:58:45 +12:00
Li
ca39f783b9 add graceful exit on SIGKILL/SIGTERM 2022-06-18 00:52:51 +12:00
Li
e42b0bf782 Add DataFixerUpper 2022-06-18 00:35:52 +12:00
Li
3105689753 Merge branch 'master' of https://github.com/islehorse/HISP 2022-06-17 23:11:34 +12:00
Li
53b03ff430 Update prebuild.py 2022-06-17 23:09:26 +12:00
Li
9b5acd57a2
Update README.md 2022-06-14 23:18:06 +12:00
Li
32a0747230 Update horseisleweb 2022-06-14 22:54:58 +12:00
Li
79616a2595 Add email validation 2022-06-14 19:53:29 +12:00
Li
6a3343adeb Update horseisleweb 2022-06-14 16:02:32 +12:00
Li
95f83cd547 Add new migrate script 2022-05-21 13:16:02 +12:00
Li
219c9fa95a Add system.threading 2022-05-08 17:42:07 +12:00
Li
dd99e49ef7 Fix %MESSAGE 2022-05-08 17:36:15 +12:00
Li
f8d8e8f28d Fix %CALL HORSE% 2022-05-08 17:22:58 +12:00
Li
479b539b44 Fix %CALL HORSE 2022-05-08 17:17:00 +12:00
Li
4fd4fcb652 Increment horseisledata to latest 2022-05-08 17:05:32 +12:00
Li
158429d306 Remove goto 2022-05-08 17:02:48 +12:00
Li
02d32f46a8 add help text" 2022-05-08 16:55:40 +12:00
Li
f14355bae8 Add %% command." 2022-05-08 16:25:53 +12:00
Li
9c97cdccb4 Fix postrm 2022-05-08 15:27:35 +12:00
Li
80a64635a3 Update python build script!! 2022-05-08 14:37:47 +12:00
Li
a8aaddb18b fix debian 2022-05-08 14:36:36 +12:00
Li
f9e1a7b755 Update python build script!! 2022-05-08 13:44:46 +12:00
Li
35c51946e4 Update to v1.7 2022-05-08 13:37:13 +12:00
Li
8dd4cdb6d0 Update made automatically due to pressing build 2022-05-08 13:16:32 +12:00
Li
5d9648429a Update made automatically due to pressing build 2022-05-08 13:14:24 +12:00
Li
89fcf97724 Update made automatically due to pressing build 2022-05-08 13:13:57 +12:00
Li
76da976e68 Update made automatically due to pressing build 2022-05-08 13:13:14 +12:00
Li
aed289e5d5 Update made automatically due to pressing build 2022-05-08 13:10:16 +12:00
Li
7efb878f63 Update made automatically due to pressing build 2022-05-08 13:09:56 +12:00
Li
5d787e169b Update made automatically due to pressing build 2022-05-08 12:54:49 +12:00
Li
58f081df7a Update made automatically due to pressing build 2022-05-08 12:54:18 +12:00
Li
ed55fa5f84 Update made automatically due to pressing build 2022-05-08 12:53:14 +12:00
Li
efeb3de36e Update made automatically due to pressing build 2022-05-08 12:52:23 +12:00
Li
05c67eefbd Update made automatically due to pressing build 2022-05-08 12:51:39 +12:00
Li
3567ad604f Update made automatically due to pressing build 2022-05-08 12:36:36 +12:00
Li
d179e4db01 Update made automatically due to pressing build 2022-05-08 12:34:14 +12:00
Li
5b599d7845 Update made automatically due to pressing build 2022-05-08 12:33:55 +12:00
Li
f611776023 Update made automatically due to pressing build 2022-05-08 12:32:09 +12:00
Li
0e84faa0c1 Update made automatically due to pressing build 2022-05-08 12:31:45 +12:00
Li
dd0f43bf87 Update made automatically due to pressing build 2022-05-08 12:31:02 +12:00
Li
f261ea3b88 Update made automatically due to pressing build 2022-05-08 12:30:40 +12:00
Li
bf4d5f5005 add build script 2022-05-08 12:21:33 +12:00
Li
063c267755 increment version in deb package 2022-05-07 13:33:36 +12:00
363 changed files with 27000 additions and 162323 deletions

374
.github/workflows/build.yml vendored Normal file → Executable file
View file

@ -8,10 +8,8 @@ defaults:
working-directory: ./HorseIsleServer working-directory: ./HorseIsleServer
jobs: jobs:
build: build-linux:
runs-on: ubuntu-latest
runs-on: windows-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
with: with:
@ -23,201 +21,271 @@ jobs:
- name: Setup .NET - name: Setup .NET
uses: actions/setup-dotnet@v1 uses: actions/setup-dotnet@v1
with: with:
dotnet-version: 7.0.x dotnet-version: 8.0.x
include-prerelease: true include-prerelease: false
- name: Install utils
run: |
sudo apt update
sudo apt install -y clang zlib1g-dev dos2unix
dotnet tool install -g dotnet-script
- name: Setup WSL - name: Restore dependencies
uses: Vampire/setup-wsl@v1.2.0 run: |
dotnet restore LibHISP
dotnet restore HISPd
# linux x64
- name: Build linux-x64
continue-on-error: false
run: |
cd HISPd
dotnet publish -p:PublishProfile=Linux64.pubxml
cd ..
cd MPN00BS
dotnet publish -p:PublishProfile=Linux64.pubxml
cd ..
# linux arm
- name: Build linux-arm
continue-on-error: false
run: |
cd HISPd
dotnet publish -p:PublishProfile=LinuxARM.pubxml
cd ..
# linux arm64
- name: Build linux-arm64
continue-on-error: false
run: |
cd HISPd
dotnet publish -p:PublishProfile=LinuxARM64.pubxml
cd ..
- name: Build deb package
continue-on-error: false
run: |
mkdir /tmp/debpkg
mkdir /tmp/debpkg/Debian64
mkdir /tmp/debpkg/Debian64/etc
mkdir /tmp/debpkg/Debian64/usr
mkdir /tmp/debpkg/Debian64/etc/hisp
mkdir /tmp/debpkg/Debian64/etc/hisp/gamedata
mkdir /tmp/debpkg/Debian64/etc/systemd
mkdir /tmp/debpkg/Debian64/etc/systemd/system
mkdir /tmp/debpkg/Debian64/usr/bin
mkdir /tmp/debpkg/Debian64/usr/lib
mkdir /tmp/debpkg/Debian64/DEBIAN
cp LibHISP/Resources/server.properties /tmp/debpkg/Debian64/etc/hisp/server.properties
cp LibHISP/Resources/default_cross_domain.xml /tmp/debpkg/Debian64/etc/hisp/CrossDomainPolicy.xml
cp -r HISPd/Resources/DEBIAN/* /tmp/debpkg/Debian64/DEBIAN
cp -r HISPd/bin/x64/Linux/net8.0/linux-x64/publish/gamedata/* /tmp/debpkg/Debian64/etc/hisp/gamedata
cp HISPd/bin/x64/Linux/net8.0/linux-x64/publish/libe_sqlite3.so /tmp/debpkg/Debian64/usr/lib/libe_sqlite3.so
cp HISPd/bin/x64/Linux/net8.0/linux-x64/publish/HI1.MAP /tmp/debpkg/Debian64/etc/hisp/HI1.MAP
cp HISPd/bin/x64/Linux/net8.0/linux-x64/publish/HISPd /tmp/debpkg/Debian64/usr/bin/HISPd
cp HISPd/Resources/HISP.service /tmp/debpkg/Debian64/etc/systemd/system/HISP.service
cat /tmp/debpkg/Debian64/DEBIAN/control
dos2unix /tmp/debpkg/Debian64/DEBIAN/conffiles
dos2unix /tmp/debpkg/Debian64/DEBIAN/control
dos2unix /tmp/debpkg/Debian64/DEBIAN/postinst
dos2unix /tmp/debpkg/Debian64/DEBIAN/postrm
dos2unix /tmp/debpkg/Debian64/DEBIAN/prerm
dos2unix /tmp/debpkg/Debian64/etc/systemd/system/HISP.service
chmod 755 -R /tmp/debpkg/Debian64
chmod +x /tmp/debpkg/Debian64/usr/bin/HISPd
mkdir debpackage
dpkg-deb --build /tmp/debpkg/Debian64
mv /tmp/debpkg/Debian64.deb debpackage/HISP-Debian-AMD64.deb
# Upload LINUX
- name: Upload linux-x64
uses: actions/upload-artifact@v4
with:
name: HISP-Linux64
path: HorseIsleServer/HISPd/bin/x64/Linux/net8.0/linux-x64/publish/
- name: Upload linux-x64-noobs
uses: actions/upload-artifact@v4
with:
name: HISP-Linux64-Noobs
path: HorseIsleServer/MPN00BS/bin/x64/Linux/net8.0/linux-x64/publish/
- name: Upload linux-arm
uses: actions/upload-artifact@v4
with:
name: HISP-LinuxARM
path: HorseIsleServer/HISPd/bin/ARM/Linux/net8.0/linux-arm/publish/
- name: Upload linux-arm64
uses: actions/upload-artifact@v4
with:
name: HISP-LinuxARM64
path: HorseIsleServer/HISPd/bin/ARM64/Linux/net8.0/linux-arm64/publish/
- name: Upload deb package
uses: actions/upload-artifact@v4
with:
name: HISP-DebianPackage
path: HorseIsleServer/debpackage
build-win:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Git Submodule update
run: git submodule update --init --recursive
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: 8.0.x
include-prerelease: false
- name: Install utils
run: dotnet tool install -g dotnet-script
- name: Restore dependencies - name: Restore dependencies
run: dotnet restore run: dotnet restore
# x64 build
- name: Build win-x64 - name: Build win-x64
continue-on-error: false continue-on-error: false
run: | run: |
cd HISPd
dotnet publish -p:PublishProfile=Win64.pubxml dotnet publish -p:PublishProfile=Win64.pubxml
cd ..
cd MPN00BS
dotnet publish -p:PublishProfile=Win64.pubxml
cd ..
- name: Build win-x86 - name: Build win-x86
continue-on-error: false continue-on-error: false
run: | run: |
cd HISPd
dotnet publish -p:PublishProfile=Win32.pubxml dotnet publish -p:PublishProfile=Win32.pubxml
cd ..
cd MPN00BS
dotnet publish -p:PublishProfile=Win32.pubxml
cd ..
- name: Build win-arm # arm64 build
continue-on-error: false
run: |
dotnet publish -p:PublishProfile=WinARM.pubxml
- name: Build win-arm64 - name: Build win-arm64
continue-on-error: false continue-on-error: false
run: | run: |
cd HISPd
dotnet publish -p:PublishProfile=WinARM64.pubxml dotnet publish -p:PublishProfile=WinARM64.pubxml
cd ..
# Upload WINDOWS
- name: Upload win-x64
uses: actions/upload-artifact@v4
with:
name: HISP-Win64
path: HorseIsleServer/HISPd/bin/x64/Windows/net8.0/win-x64/publish/
- name: Build linux-x64 - name: Upload win-x86
continue-on-error: false uses: actions/upload-artifact@v4
run: | with:
dotnet publish -p:PublishProfile=Linux64.pubxml name: HISP-Win32
path: HorseIsleServer/HISPd/bin/x86/Windows/net8.0/win-x86/publish/
- name: Build linux-arm
continue-on-error: false - name: Upload win-arm64
run: | uses: actions/upload-artifact@v4
dotnet publish -p:PublishProfile=LinuxARM.pubxml with:
name: HISP-WinARM64
path: HorseIsleServer/HISPd/bin/arm64/Windows/net8.0/win-arm64/publish/
- name: Upload win-x86-noobs
uses: actions/upload-artifact@v4
with:
name: HISP-Win32-Noobs
path: HorseIsleServer/MPN00BS/bin/x86/Windows/net8.0/win-x86/publish/
- name: Upload win-x64-noobs
uses: actions/upload-artifact@v4
with:
name: HISP-Win64-Noobs
path: HorseIsleServer/MPN00BS/bin/x64/Windows/net8.0/win-x64/publish/
build-mac:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Build linux-arm64 - name: Git Submodule update
continue-on-error: false run: git submodule update --init --recursive
run: |
dotnet publish -p:PublishProfile=LinuxARM64.pubxml
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: 8.0.x
include-prerelease: false
- name: Install utils
run: dotnet tool install -g dotnet-script
- name: Restore dependencies
run: |
dotnet restore LibHISP
dotnet restore HISPd
- name: Build mac-x64 - name: Build mac-x64
continue-on-error: false continue-on-error: false
run: | run: |
cd HISPd
dotnet publish -p:PublishProfile=Osx64.pubxml dotnet publish -p:PublishProfile=Osx64.pubxml
cd ..
cd MPN00BS
dotnet publish -p:PublishProfile=Osx64.pubxml
cd ..
- name: Build mac-arm64 - name: Build mac-arm64
continue-on-error: false continue-on-error: false
run: | run: |
cd HISPd
dotnet publish -p:PublishProfile=OsxARM64.pubxml dotnet publish -p:PublishProfile=OsxARM64.pubxml
cd ..
- name: Build deb package
continue-on-error: false
shell: wsl-bash -u root {0}
run: |
apt update
apt install -y dos2unix
mkdir /mnt/fucking-windows
mount -t tmpfs -o size=800M tmpfs /mnt/fucking-windows
mkdir /mnt/fucking-windows/Debian64
mkdir /mnt/fucking-windows/Debian64/etc
mkdir /mnt/fucking-windows/Debian64/usr
mkdir /mnt/fucking-windows/Debian64/etc/hisp
mkdir /mnt/fucking-windows/Debian64/etc/hisp/gamedata
mkdir /mnt/fucking-windows/Debian64/etc/systemd
mkdir /mnt/fucking-windows/Debian64/etc/systemd/system
mkdir /mnt/fucking-windows/Debian64/usr/bin
mkdir /mnt/fucking-windows/Debian64/usr/lib
mkdir /mnt/fucking-windows/Debian64/DEBIAN
cp LibHISP/Resources/server.properties /mnt/fucking-windows/Debian64/etc/hisp/server.properties
cp LibHISP/Resources/default_cross_domain.xml /mnt/fucking-windows/Debian64/etc/hisp/CrossDomainPolicy.xml
cp -r HISPd/Resources/DEBIAN/* /mnt/fucking-windows/Debian64/DEBIAN
cp -r HISPd/bin/x64/Linux/net7.0/linux-x64/publish/gamedata/* /mnt/fucking-windows/Debian64/etc/hisp/gamedata
cp HISPd/bin/x64/Linux/net7.0/linux-x64/publish/libe_sqlite3.so /mnt/fucking-windows/Debian64/usr/lib/libe_sqlite3.so
cp HISPd/bin/x64/Linux/net7.0/linux-x64/publish/HI1.MAP /mnt/fucking-windows/Debian64/etc/hisp/HI1.MAP
cp HISPd/bin/x64/Linux/net7.0/linux-x64/publish/HISPd /mnt/fucking-windows/Debian64/usr/bin/HISPd
cp HISPd/Resources/HISP.service /mnt/fucking-windows/Debian64/etc/systemd/system/HISP.service
dos2unix /mnt/fucking-windows/Debian64/DEBIAN/conffiles
dos2unix /mnt/fucking-windows/Debian64/DEBIAN/control
dos2unix /mnt/fucking-windows/Debian64/DEBIAN/postinst
dos2unix /mnt/fucking-windows/Debian64/DEBIAN/postrm
dos2unix /mnt/fucking-windows/Debian64/DEBIAN/prerm
dos2unix /mnt/fucking-windows/Debian64/etc/systemd/system/HISP.service
chmod 755 -R /mnt/fucking-windows/Debian64
chmod +x /mnt/fucking-windows/Debian64/usr/bin/HISPd
mkdir debpackage
dpkg-deb --build /mnt/fucking-windows/Debian64
mv /mnt/fucking-windows/Debian64.deb debpackage/HISP-Debian-AMD64.deb
# - name: Build android-arm
# continue-on-error: false
# run: |
# dotnet publish -p:PublishProfile=AndroidARM.pubxml
# - name: Build android-arm64
# continue-on-error: false
# run: |
# dotnet publish -p:PublishProfile=AndroidARM64.pubxm
- name: Upload win-x64
uses: actions/upload-artifact@v2
with:
name: HISP-Win64
path: HorseIsleServer\HISPd\bin\x64\Windows\net7.0\win-x64\publish\
- name: Upload win-x86
uses: actions/upload-artifact@v2
with:
name: HISP-Win32
path: HorseIsleServer\HISPd\bin\x86\Windows\net7.0\win-x86\publish\
- name: Upload win-arm
uses: actions/upload-artifact@v2
with:
name: HISP-WinARM
path: HorseIsleServer\HISPd\bin\arm\Windows\net7.0\windows-arm\publish\
- name: Upload win-arm64
uses: actions/upload-artifact@v2
with:
name: HISP-WinARM64
path: HorseIsleServer\HISPd\bin\arm64\Windows\net7.0\windows-arm64\publish\
- name: Upload win-x86-noobs
uses: actions/upload-artifact@v2
with:
name: HISP-Win32-Noobs
path: HorseIsleServer\N00BS\bin\x86\Windows\net7.0\win-x86\publish\
- name: Upload win-x64-noobs
uses: actions/upload-artifact@v2
with:
name: HISP-Win64-Noobs
path: HorseIsleServer\N00BS\bin\x64\Windows\net7.0\win-x64\publish\
- name: Upload linux-x64
uses: actions/upload-artifact@v2
with:
name: HISP-Linux64
path: HorseIsleServer/HISPd/bin/x64/Linux/net7.0/linux-x64/publish/
- name: Upload linux-arm
uses: actions/upload-artifact@v2
with:
name: HISP-LinuxARM
path: HorseIsleServer/HISPd/bin/ARM/Linux/net7.0/linux-arm/publish/
- name: Upload linux-arm64
uses: actions/upload-artifact@v2
with:
name: HISP-LinuxARM64
path: HorseIsleServer/HISPd/bin/ARM64/Linux/net7.0/linux-arm64/publish/
- name: Upload mac-x64 - name: Upload mac-x64
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v4
with: with:
name: HISP-Mac64 name: HISP-Mac64
path: HorseIsleServer/HISPd/bin/x64/MacOS/net7.0/osx-x64/publish/ path: HorseIsleServer/HISPd/bin/x64/MacOS/net8.0/osx-x64/publish/
- name: Upload mac-arm64 - name: Upload mac-arm64
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v4
with: with:
name: HISP-MacARM64 name: HISP-MacARM64
path: HorseIsleServer/HISPd/bin/arm64/MacOS/net7.0/osx-arm64/publish/ path: HorseIsleServer/HISPd/bin/arm64/MacOS/net8.0/osx-arm64/publish/
- name: Upload deb package - name: Upload mac-x64-noobs
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v4
with: with:
name: HISP-DebianPackage name: HISP-Mac-Noobs
path: HorseIsleServer/debpackage path: HorseIsleServer/MPN00BS/bin/x64/MacOS/net8.0/osx-x64/publish/
build-web:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Git Submodule update
run: git submodule update --init --recursive
# - name: Upload android-arm # UPLOAD WEB
# uses: actions/upload-artifact@v2
# with:
# name: HISP-AndroidARM
# path: HorseIsleServer/HISPd/bin/arm/Android/net7.0/android-arm/publish/
# - name: Upload android-arm64
# uses: actions/upload-artifact@v2
# with:
# name: HISP-AndroidARM64
# path: HorseIsleServer/HISPd/bin/arm64/Android/net7.0/android-arm64/publish/
- name: Upload Website (master) - name: Upload Website (master)
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v4
with: with:
name: HISP-Web-Master name: HISP-Web-Master
path: HorseIsleWeb/master-site path: HorseIsleWeb/master-site
- name: Upload Website (game) - name: Upload Website (game)
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v4
with: with:
name: HISP-Web-Game name: HISP-Web-Game
path: HorseIsleWeb/game-site path: HorseIsleWeb/game-site

19
.gitignore vendored
View file

@ -3,19 +3,32 @@
*/.vs/* */.vs/*
*.log *.log
*.suo *.suo
*.csproj.user
*.pubxml.user
*.user
*.idb
*Thumbs.db
*.DS_Store
HorseIsleServer/N00BS/obj/* HorseIsleServer/N00BS/obj/*
HorseIsleServer/N00BS/bin/* HorseIsleServer/N00BS/bin/*
HorseIsleServer/N00BS/flash.dll.idb
HorseIsleServer/MPN00BS/obj/*
HorseIsleServer/MPN00BS/bin/*
HorseIsleServer/HISPd/obj/* HorseIsleServer/HISPd/obj/*
HorseIsleServer/HISPd/bin/* HorseIsleServer/HISPd/bin/*
HorseIsleServer/Installer/Windows/* HorseIsleServer/HISPtests/obj/*
HorseIsleServer/HISPtests/bin/*
HorseIsleServer/LibHISP/obj/* HorseIsleServer/LibHISP/obj/*
HorseIsleServer/LibHISP/bin/* HorseIsleServer/LibHISP/bin/*
HorseIsleServer/LibHISP/Resources/Versioning/* HorseIsleServer/LibHISP/Resources/Versioning/*
HorseIsleServer/.vs/* HorseIsleServer/Installer/Windows/*
HorseIsleServer/.vs/*

0
.gitmodules vendored Normal file → Executable file
View file

0
.mailmap Normal file → Executable file
View file

@ -1 +1 @@
Subproject commit 330ad13400e4abd52bef118ab10097b3d13bccb3 Subproject commit e9c09c77cd0dd99eb12e16b679478fb0e3742b55

280
HorseIsleServer/HISP.sln Normal file → Executable file
View file

@ -7,9 +7,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibHISP", "LibHISP\LibHISP.
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HISPd", "HISPd\HISPd.csproj", "{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HISPd", "HISPd\HISPd.csproj", "{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "N00BS", "N00BS\N00BS.csproj", "{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MPN00BS", "MPN00BS\MPN00BS.csproj", "{72EF95FC-03DB-4E61-A696-E0095DD42A4E}"
EndProject EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Installer", "Installer\Installer.vdproj", "{D330A197-67D4-42B0-8906-54264AF95EC1}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HISPtests", "HISPtests\HISPtests.csproj", "{689FB972-1612-440E-817D-BE290F655AA8}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -50,8 +50,8 @@ Global
Windows|x86 = Windows|x86 Windows|x86 = Windows|x86
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Android|Any CPU.ActiveCfg = Linux|Any CPU {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Android|Any CPU.ActiveCfg = Android|Any CPU
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Android|Any CPU.Build.0 = Linux|Any CPU {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Android|Any CPU.Build.0 = Android|Any CPU
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Android|ARM.ActiveCfg = Android|ARM {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Android|ARM.ActiveCfg = Android|ARM
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Android|ARM.Build.0 = Android|ARM {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Android|ARM.Build.0 = Android|ARM
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Android|ARM64.ActiveCfg = Android|ARM64 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Android|ARM64.ActiveCfg = Android|ARM64
@ -77,6 +77,7 @@ Global
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.iOS|ARM64.ActiveCfg = iOS|ARM64 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.iOS|ARM64.ActiveCfg = iOS|ARM64
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.iOS|ARM64.Build.0 = iOS|ARM64 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.iOS|ARM64.Build.0 = iOS|ARM64
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.iOS|x64.ActiveCfg = iOS|x64 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.iOS|x64.ActiveCfg = iOS|x64
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.iOS|x64.Build.0 = iOS|x64
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.iOS|x86.ActiveCfg = iOS|x86 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.iOS|x86.ActiveCfg = iOS|x86
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Linux|Any CPU.ActiveCfg = Linux|Any CPU {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Linux|Any CPU.ActiveCfg = Linux|Any CPU
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Linux|Any CPU.Build.0 = Linux|Any CPU {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Linux|Any CPU.Build.0 = Linux|Any CPU
@ -106,10 +107,10 @@ Global
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|ARM64.Build.0 = Windows|ARM64 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|ARM64.Build.0 = Windows|ARM64
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|x64.ActiveCfg = Windows|x64 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|x64.ActiveCfg = Windows|x64
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|x64.Build.0 = Windows|x64 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|x64.Build.0 = Windows|x64
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|x86.ActiveCfg = Debug|x86 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|x86.ActiveCfg = Windows|x86
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|x86.Build.0 = Debug|x86 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|x86.Build.0 = Windows|x86
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|Any CPU.ActiveCfg = Windows|x64 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|Any CPU.ActiveCfg = Windows|Any CPU
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|Any CPU.Build.0 = Windows|x64 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|Any CPU.Build.0 = Windows|Any CPU
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|ARM.ActiveCfg = Windows|ARM {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|ARM.ActiveCfg = Windows|ARM
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|ARM.Build.0 = Windows|ARM {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|ARM.Build.0 = Windows|ARM
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|ARM64.ActiveCfg = Windows|ARM64 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|ARM64.ActiveCfg = Windows|ARM64
@ -118,8 +119,8 @@ Global
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|x64.Build.0 = Windows|x64 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|x64.Build.0 = Windows|x64
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|x86.ActiveCfg = Windows|x86 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|x86.ActiveCfg = Windows|x86
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|x86.Build.0 = Windows|x86 {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|x86.Build.0 = Windows|x86
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Android|Any CPU.ActiveCfg = Debug|Any CPU {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Android|Any CPU.ActiveCfg = Android|Any CPU
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Android|Any CPU.Build.0 = Debug|Any CPU {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Android|Any CPU.Build.0 = Android|Any CPU
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Android|ARM.ActiveCfg = Android|ARM {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Android|ARM.ActiveCfg = Android|ARM
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Android|ARM.Build.0 = Android|ARM {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Android|ARM.Build.0 = Android|ARM
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Android|ARM64.ActiveCfg = Android|ARM64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Android|ARM64.ActiveCfg = Android|ARM64
@ -145,9 +146,10 @@ Global
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.iOS|ARM64.ActiveCfg = iOS|ARM64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.iOS|ARM64.ActiveCfg = iOS|ARM64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.iOS|ARM64.Build.0 = iOS|ARM64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.iOS|ARM64.Build.0 = iOS|ARM64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.iOS|x64.ActiveCfg = iOS|x64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.iOS|x64.ActiveCfg = iOS|x64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.iOS|x64.Build.0 = iOS|x64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.iOS|x86.ActiveCfg = iOS|x86 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.iOS|x86.ActiveCfg = iOS|x86
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Linux|Any CPU.ActiveCfg = Debug|Any CPU {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Linux|Any CPU.ActiveCfg = Linux|Any CPU
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Linux|Any CPU.Build.0 = Debug|Any CPU {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Linux|Any CPU.Build.0 = Linux|Any CPU
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Linux|ARM.ActiveCfg = Linux|ARM {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Linux|ARM.ActiveCfg = Linux|ARM
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Linux|ARM.Build.0 = Linux|ARM {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Linux|ARM.Build.0 = Linux|ARM
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Linux|ARM64.ActiveCfg = Linux|ARM64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Linux|ARM64.ActiveCfg = Linux|ARM64
@ -166,116 +168,166 @@ Global
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.MacOS|x64.Build.0 = MacOS|x64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.MacOS|x64.Build.0 = MacOS|x64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.MacOS|x86.ActiveCfg = MacOS|x86 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.MacOS|x86.ActiveCfg = MacOS|x86
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.MacOS|x86.Build.0 = MacOS|x86 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.MacOS|x86.Build.0 = MacOS|x86
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|Any CPU.ActiveCfg = Linux|Any CPU {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|Any CPU.ActiveCfg = Windows|Any CPU
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|Any CPU.Build.0 = Linux|Any CPU {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|Any CPU.Build.0 = Windows|Any CPU
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|ARM.ActiveCfg = Debug|ARM {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|ARM.ActiveCfg = Windows|ARM
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|ARM.Build.0 = Debug|ARM {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|ARM.Build.0 = Windows|ARM
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|ARM64.ActiveCfg = Debug|ARM64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|ARM64.ActiveCfg = Windows|ARM64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|ARM64.Build.0 = Debug|ARM64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|ARM64.Build.0 = Windows|ARM64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|x64.ActiveCfg = Windows|x64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|x64.ActiveCfg = Windows|x64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|x64.Build.0 = Windows|x64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|x64.Build.0 = Windows|x64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|x86.ActiveCfg = Debug|x86 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|x86.ActiveCfg = Windows|x86
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|x86.Build.0 = Debug|x86 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|x86.Build.0 = Windows|x86
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|Any CPU.ActiveCfg = Debug|x64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|Any CPU.ActiveCfg = Windows|Any CPU
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|Any CPU.Build.0 = Debug|x64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|Any CPU.Build.0 = Windows|Any CPU
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|ARM.ActiveCfg = Windows|Any CPU {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|ARM.ActiveCfg = Windows|ARM
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|ARM.Build.0 = Windows|Any CPU {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|ARM.Build.0 = Windows|ARM
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|ARM64.ActiveCfg = Windows|ARM64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|ARM64.ActiveCfg = Windows|ARM64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|ARM64.Build.0 = Windows|ARM64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|ARM64.Build.0 = Windows|ARM64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|x64.ActiveCfg = Windows|x64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|x64.ActiveCfg = Windows|x64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|x64.Build.0 = Windows|x64 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|x64.Build.0 = Windows|x64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|x86.ActiveCfg = Windows|x86 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|x86.ActiveCfg = Windows|x86
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|x86.Build.0 = Windows|x86 {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|x86.Build.0 = Windows|x86
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Android|Any CPU.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Android|Any CPU.ActiveCfg = Android|Any CPU
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Android|Any CPU.Build.0 = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Android|Any CPU.Build.0 = Android|Any CPU
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Android|ARM.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Android|ARM.ActiveCfg = Android|ARM
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Android|ARM64.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Android|ARM.Build.0 = Android|ARM
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Android|x64.ActiveCfg = Windows|x64 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Android|ARM64.ActiveCfg = Android|ARM64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Android|x86.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Android|ARM64.Build.0 = Android|ARM64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Android|x64.ActiveCfg = Android|x64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Debug|Any CPU.Build.0 = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Android|x64.Build.0 = Android|x64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Debug|ARM.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Android|x86.ActiveCfg = Android|x86
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Debug|ARM64.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Android|x86.Build.0 = Android|x86
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Debug|x64.ActiveCfg = Debug|x64 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Debug|x64.Build.0 = Debug|x64 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Debug|x86.ActiveCfg = Debug|x86 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Debug|ARM.ActiveCfg = Debug|ARM
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Debug|x86.Build.0 = Debug|x86 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Debug|ARM.Build.0 = Debug|ARM
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.iOS|Any CPU.ActiveCfg = Windows|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Debug|ARM64.ActiveCfg = Debug|ARM64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.iOS|ARM.ActiveCfg = Windows|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Debug|ARM64.Build.0 = Debug|ARM64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.iOS|ARM64.ActiveCfg = Windows|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Debug|x64.ActiveCfg = Debug|x64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.iOS|x64.ActiveCfg = Debug|x64 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Debug|x64.Build.0 = Debug|x64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.iOS|x86.ActiveCfg = Windows|x86 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Debug|x86.ActiveCfg = Debug|x86
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Linux|Any CPU.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Debug|x86.Build.0 = Debug|x86
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Linux|Any CPU.Build.0 = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.iOS|Any CPU.ActiveCfg = iOS|Any CPU
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Linux|ARM.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.iOS|Any CPU.Build.0 = iOS|Any CPU
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Linux|ARM64.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.iOS|ARM.ActiveCfg = iOS|ARM
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Linux|x64.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.iOS|ARM.Build.0 = iOS|ARM
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Linux|x86.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.iOS|ARM64.ActiveCfg = iOS|ARM64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.MacOS|Any CPU.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.iOS|ARM64.Build.0 = iOS|ARM64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.MacOS|ARM.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.iOS|x64.ActiveCfg = iOS|x64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.MacOS|ARM64.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.iOS|x64.Build.0 = iOS|x64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.MacOS|x64.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.iOS|x86.ActiveCfg = iOS|x86
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.MacOS|x86.ActiveCfg = Debug|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.iOS|x86.Build.0 = iOS|x86
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|Any CPU.ActiveCfg = Windows|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Linux|Any CPU.ActiveCfg = Linux|Any CPU
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|Any CPU.Build.0 = Windows|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Linux|Any CPU.Build.0 = Linux|Any CPU
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|ARM.ActiveCfg = Windows|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Linux|ARM.ActiveCfg = Linux|ARM
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|ARM.Build.0 = Windows|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Linux|ARM.Build.0 = Linux|ARM
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|ARM64.ActiveCfg = Windows|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Linux|ARM64.ActiveCfg = Linux|ARM64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|ARM64.Build.0 = Windows|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Linux|ARM64.Build.0 = Linux|ARM64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|x64.ActiveCfg = Debug|x64 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Linux|x64.ActiveCfg = Linux|x64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|x64.Build.0 = Debug|x64 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Linux|x64.Build.0 = Linux|x64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|x86.ActiveCfg = Debug|x86 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Linux|x86.ActiveCfg = Linux|x86
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|x86.Build.0 = Debug|x86 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Linux|x86.Build.0 = Linux|x86
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Windows|Any CPU.ActiveCfg = Debug|x64 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.MacOS|Any CPU.ActiveCfg = MacOS|Any CPU
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Windows|Any CPU.Build.0 = Debug|x64 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.MacOS|Any CPU.Build.0 = MacOS|Any CPU
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Windows|ARM.ActiveCfg = Windows|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.MacOS|ARM.ActiveCfg = MacOS|ARM
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Windows|ARM64.ActiveCfg = Windows|Any CPU {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.MacOS|ARM.Build.0 = MacOS|ARM
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Windows|x64.ActiveCfg = Windows|x64 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.MacOS|ARM64.ActiveCfg = MacOS|ARM64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Windows|x64.Build.0 = Windows|x64 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.MacOS|ARM64.Build.0 = MacOS|ARM64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Windows|x86.ActiveCfg = Windows|x86 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.MacOS|x64.ActiveCfg = MacOS|x64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Windows|x86.Build.0 = Windows|x86 {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.MacOS|x64.Build.0 = MacOS|x64
{D330A197-67D4-42B0-8906-54264AF95EC1}.Android|Any CPU.ActiveCfg = Debug {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.MacOS|x86.ActiveCfg = MacOS|x86
{D330A197-67D4-42B0-8906-54264AF95EC1}.Android|ARM.ActiveCfg = Windows {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.MacOS|x86.Build.0 = MacOS|x86
{D330A197-67D4-42B0-8906-54264AF95EC1}.Android|ARM64.ActiveCfg = Windows {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Release|Any CPU.ActiveCfg = Windows|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.Android|x64.ActiveCfg = Windows {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Release|Any CPU.Build.0 = Windows|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.Android|x86.ActiveCfg = Windows {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Release|ARM.ActiveCfg = Windows|ARM
{D330A197-67D4-42B0-8906-54264AF95EC1}.Debug|Any CPU.ActiveCfg = Windows {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Release|ARM.Build.0 = Windows|ARM
{D330A197-67D4-42B0-8906-54264AF95EC1}.Debug|ARM.ActiveCfg = Windows {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Release|ARM64.ActiveCfg = Windows|ARM64
{D330A197-67D4-42B0-8906-54264AF95EC1}.Debug|ARM64.ActiveCfg = Windows {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Release|ARM64.Build.0 = Windows|ARM64
{D330A197-67D4-42B0-8906-54264AF95EC1}.Debug|x64.ActiveCfg = Windows {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Release|x64.ActiveCfg = Windows|x64
{D330A197-67D4-42B0-8906-54264AF95EC1}.Debug|x86.ActiveCfg = Windows {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Release|x64.Build.0 = Windows|x64
{D330A197-67D4-42B0-8906-54264AF95EC1}.iOS|Any CPU.ActiveCfg = Windows {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Release|x86.ActiveCfg = Windows|x86
{D330A197-67D4-42B0-8906-54264AF95EC1}.iOS|ARM.ActiveCfg = Windows {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Release|x86.Build.0 = Windows|x86
{D330A197-67D4-42B0-8906-54264AF95EC1}.iOS|ARM64.ActiveCfg = Windows {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Windows|Any CPU.ActiveCfg = Windows|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.iOS|x64.ActiveCfg = Windows {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Windows|Any CPU.Build.0 = Windows|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.iOS|x86.ActiveCfg = Windows {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Windows|ARM.ActiveCfg = Windows|ARM
{D330A197-67D4-42B0-8906-54264AF95EC1}.Linux|Any CPU.ActiveCfg = Debug {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Windows|ARM.Build.0 = Windows|ARM
{D330A197-67D4-42B0-8906-54264AF95EC1}.Linux|ARM.ActiveCfg = Debug {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Windows|ARM64.ActiveCfg = Windows|ARM64
{D330A197-67D4-42B0-8906-54264AF95EC1}.Linux|ARM64.ActiveCfg = Debug {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Windows|ARM64.Build.0 = Windows|ARM64
{D330A197-67D4-42B0-8906-54264AF95EC1}.Linux|x64.ActiveCfg = Debug {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Windows|x64.ActiveCfg = Windows|x64
{D330A197-67D4-42B0-8906-54264AF95EC1}.Linux|x86.ActiveCfg = Debug {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Windows|x64.Build.0 = Windows|x64
{D330A197-67D4-42B0-8906-54264AF95EC1}.MacOS|Any CPU.ActiveCfg = Debug {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Windows|x86.ActiveCfg = Windows|x86
{D330A197-67D4-42B0-8906-54264AF95EC1}.MacOS|ARM.ActiveCfg = Debug {72EF95FC-03DB-4E61-A696-E0095DD42A4E}.Windows|x86.Build.0 = Windows|x86
{D330A197-67D4-42B0-8906-54264AF95EC1}.MacOS|ARM64.ActiveCfg = Debug {689FB972-1612-440E-817D-BE290F655AA8}.Android|Any CPU.ActiveCfg = Debug|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.MacOS|x64.ActiveCfg = Debug {689FB972-1612-440E-817D-BE290F655AA8}.Android|Any CPU.Build.0 = Debug|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.MacOS|x86.ActiveCfg = Debug {689FB972-1612-440E-817D-BE290F655AA8}.Android|ARM.ActiveCfg = Debug|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.Release|Any CPU.ActiveCfg = Release {689FB972-1612-440E-817D-BE290F655AA8}.Android|ARM.Build.0 = Debug|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.Release|Any CPU.Build.0 = Release {689FB972-1612-440E-817D-BE290F655AA8}.Android|ARM64.ActiveCfg = Debug|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.Release|ARM.ActiveCfg = Release {689FB972-1612-440E-817D-BE290F655AA8}.Android|ARM64.Build.0 = Debug|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.Release|ARM.Build.0 = Release {689FB972-1612-440E-817D-BE290F655AA8}.Android|x64.ActiveCfg = Debug|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.Release|ARM64.ActiveCfg = Release {689FB972-1612-440E-817D-BE290F655AA8}.Android|x64.Build.0 = Debug|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.Release|ARM64.Build.0 = Release {689FB972-1612-440E-817D-BE290F655AA8}.Android|x86.ActiveCfg = Debug|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.Release|x64.ActiveCfg = Release {689FB972-1612-440E-817D-BE290F655AA8}.Android|x86.Build.0 = Debug|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.Release|x64.Build.0 = Release {689FB972-1612-440E-817D-BE290F655AA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.Release|x86.ActiveCfg = Release {689FB972-1612-440E-817D-BE290F655AA8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D330A197-67D4-42B0-8906-54264AF95EC1}.Release|x86.Build.0 = Release {689FB972-1612-440E-817D-BE290F655AA8}.Debug|ARM.ActiveCfg = Debug|ARM
{D330A197-67D4-42B0-8906-54264AF95EC1}.Windows|Any CPU.ActiveCfg = Debug {689FB972-1612-440E-817D-BE290F655AA8}.Debug|ARM.Build.0 = Debug|ARM
{D330A197-67D4-42B0-8906-54264AF95EC1}.Windows|ARM.ActiveCfg = Windows {689FB972-1612-440E-817D-BE290F655AA8}.Debug|ARM64.ActiveCfg = Debug|ARM64
{D330A197-67D4-42B0-8906-54264AF95EC1}.Windows|ARM64.ActiveCfg = Release {689FB972-1612-440E-817D-BE290F655AA8}.Debug|ARM64.Build.0 = Debug|ARM64
{D330A197-67D4-42B0-8906-54264AF95EC1}.Windows|x64.ActiveCfg = Windows {689FB972-1612-440E-817D-BE290F655AA8}.Debug|x64.ActiveCfg = Debug|x64
{D330A197-67D4-42B0-8906-54264AF95EC1}.Windows|x64.Build.0 = Windows {689FB972-1612-440E-817D-BE290F655AA8}.Debug|x64.Build.0 = Debug|x64
{D330A197-67D4-42B0-8906-54264AF95EC1}.Windows|x86.ActiveCfg = Windows {689FB972-1612-440E-817D-BE290F655AA8}.Debug|x86.ActiveCfg = Debug|x86
{D330A197-67D4-42B0-8906-54264AF95EC1}.Windows|x86.Build.0 = Windows {689FB972-1612-440E-817D-BE290F655AA8}.Debug|x86.Build.0 = Debug|x86
{689FB972-1612-440E-817D-BE290F655AA8}.iOS|Any CPU.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.iOS|Any CPU.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.iOS|ARM.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.iOS|ARM.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.iOS|ARM64.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.iOS|ARM64.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.iOS|x64.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.iOS|x64.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.iOS|x86.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.iOS|x86.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Linux|Any CPU.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Linux|Any CPU.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Linux|ARM.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Linux|ARM.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Linux|ARM64.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Linux|ARM64.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Linux|x64.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Linux|x64.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Linux|x86.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Linux|x86.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.MacOS|Any CPU.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.MacOS|Any CPU.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.MacOS|ARM.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.MacOS|ARM.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.MacOS|ARM64.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.MacOS|ARM64.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.MacOS|x64.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.MacOS|x64.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.MacOS|x86.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.MacOS|x86.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Release|Any CPU.Build.0 = Release|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Release|ARM.ActiveCfg = Release|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Release|ARM.Build.0 = Release|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Release|ARM64.ActiveCfg = Release|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Release|ARM64.Build.0 = Release|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Release|x64.ActiveCfg = Release|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Release|x64.Build.0 = Release|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Release|x86.ActiveCfg = Release|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Release|x86.Build.0 = Release|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Windows|Any CPU.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Windows|Any CPU.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Windows|ARM.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Windows|ARM.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Windows|ARM64.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Windows|ARM64.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Windows|x64.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Windows|x64.Build.0 = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Windows|x86.ActiveCfg = Debug|Any CPU
{689FB972-1612-440E-817D-BE290F655AA8}.Windows|x86.Build.0 = Debug|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

136
HorseIsleServer/HISPd/HISPd.csproj Normal file → Executable file
View file

@ -27,7 +27,7 @@
<GenerateBindingRedirectsOutputType>false</GenerateBindingRedirectsOutputType> <GenerateBindingRedirectsOutputType>false</GenerateBindingRedirectsOutputType>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo> <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<NoWin32Manifest>true</NoWin32Manifest> <NoWin32Manifest>true</NoWin32Manifest>
<ApplicationIcon>icon.ico</ApplicationIcon> <ApplicationIcon>icon.ico</ApplicationIcon>
@ -41,39 +41,45 @@
<PackageProjectUrl>https://islehorse.com</PackageProjectUrl> <PackageProjectUrl>https://islehorse.com</PackageProjectUrl>
<RepositoryUrl>https://github.com/islehorse/HISP</RepositoryUrl> <RepositoryUrl>https://github.com/islehorse/HISP</RepositoryUrl>
<RepositoryType>git</RepositoryType> <RepositoryType>git</RepositoryType>
<WarningLevel>3</WarningLevel>
<NoWarn>1701;1702;2026;IL2026</NoWarn>
</PropertyGroup>
<PropertyGroup>
<TrimMode>partial</TrimMode>
<EnableTrimAnalyzer>false</EnableTrimAnalyzer>
<TrimmerRemoveSymbols>true</TrimmerRemoveSymbols>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Windows|x86'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Windows|x86'">
<RuntimeIdentifier>win-x86</RuntimeIdentifier> <RuntimeIdentifier>win-x86</RuntimeIdentifier>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<Platforms>x86</Platforms>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<DefineConstants>OS_WINDOWS;ARCH_X86</DefineConstants> <DefineConstants>OS_WINDOWS;ARCH_X86</DefineConstants>
<WarningLevel>3</WarningLevel> <DebugType>none</DebugType>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Windows|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Windows|x64'">
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <RuntimeIdentifier>win-x64</RuntimeIdentifier>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<Platforms>x64</Platforms>
<PlatformTarget>x64</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
<DefineConstants>OS_WINDOWS;ARCH_X86_64</DefineConstants> <DefineConstants>OS_WINDOWS;ARCH_X86_64</DefineConstants>
<WarningLevel>3</WarningLevel> <DebugType>none</DebugType>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Windows|ARM'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Windows|ARM'">
<RuntimeIdentifier>win-arm</RuntimeIdentifier> <RuntimeIdentifier>win-arm</RuntimeIdentifier>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<PlatformTarget>ARM</PlatformTarget> <PlatformTarget>ARM</PlatformTarget>
<DefineConstants>OS_WINDOWS;ARCH_ARM</DefineConstants> <DefineConstants>OS_WINDOWS;ARCH_ARM</DefineConstants>
<WarningLevel>3</WarningLevel> <DebugType>none</DebugType>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Windows|ARM64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Windows|ARM64'">
<RuntimeIdentifier>win-arm64</RuntimeIdentifier> <RuntimeIdentifier>win-arm64</RuntimeIdentifier>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<PlatformTarget>ARM64</PlatformTarget> <PlatformTarget>ARM64</PlatformTarget>
<DefineConstants>OS_WINDOWS;ARCH_ARM64</DefineConstants> <DefineConstants>OS_WINDOWS;ARCH_ARM64</DefineConstants>
<WarningLevel>3</WarningLevel> <DebugType>none</DebugType>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup> </PropertyGroup>
@ -83,15 +89,15 @@
<PlatformTarget>ARM</PlatformTarget> <PlatformTarget>ARM</PlatformTarget>
<DefineConstants>OS_ANDROID;ARCH_ARM</DefineConstants> <DefineConstants>OS_ANDROID;ARCH_ARM</DefineConstants>
<WarningLevel>3</WarningLevel> <WarningLevel>3</WarningLevel>
<NoWarn>1701;1702;2026</NoWarn> <NoWarn></NoWarn>
<DebugType>none</DebugType>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Android|ARM64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Android|ARM64'">
<RuntimeIdentifier>android-arm64</RuntimeIdentifier> <RuntimeIdentifier>android-arm64</RuntimeIdentifier>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<PlatformTarget>ARM64</PlatformTarget> <PlatformTarget>ARM64</PlatformTarget>
<DefineConstants>OS_ANDROID;ARCH_ARM64</DefineConstants> <DefineConstants>OS_ANDROID;ARCH_ARM64</DefineConstants>
<WarningLevel>3</WarningLevel> <DebugType>none</DebugType>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Linux|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Linux|x64'">
@ -99,24 +105,21 @@
<Optimize>true</Optimize> <Optimize>true</Optimize>
<PlatformTarget>x64</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
<DefineConstants>OS_LINUX;ARCH_X86_64</DefineConstants> <DefineConstants>OS_LINUX;ARCH_X86_64</DefineConstants>
<WarningLevel>3</WarningLevel> <DebugType>none</DebugType>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Linux|ARM'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Linux|ARM'">
<RuntimeIdentifier>linux-arm</RuntimeIdentifier> <RuntimeIdentifier>linux-arm</RuntimeIdentifier>
<PlatformTarget>ARM</PlatformTarget> <PlatformTarget>ARM</PlatformTarget>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<DefineConstants>OS_LINUX;ARCH_ARM</DefineConstants> <DefineConstants>OS_LINUX;ARCH_ARM</DefineConstants>
<WarningLevel>3</WarningLevel> <DebugType>none</DebugType>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Linux|ARM64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Linux|ARM64'">
<RuntimeIdentifier>linux-arm64</RuntimeIdentifier> <RuntimeIdentifier>linux-arm64</RuntimeIdentifier>
<PlatformTarget>ARM64</PlatformTarget> <PlatformTarget>ARM64</PlatformTarget>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<DefineConstants>OS_LINUX;ARCH_ARM64</DefineConstants> <DefineConstants>OS_LINUX;ARCH_ARM64</DefineConstants>
<WarningLevel>3</WarningLevel> <DebugType>none</DebugType>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MacOS|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MacOS|x64'">
@ -124,15 +127,13 @@
<Optimize>true</Optimize> <Optimize>true</Optimize>
<PlatformTarget>x64</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
<DefineConstants>OS_MACOS;ARCH_X86_64</DefineConstants> <DefineConstants>OS_MACOS;ARCH_X86_64</DefineConstants>
<WarningLevel>3</WarningLevel> <DebugType>none</DebugType>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MacOS|ARM64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MacOS|ARM64'">
<RuntimeIdentifier>osx-arm64</RuntimeIdentifier> <RuntimeIdentifier>osx-arm64</RuntimeIdentifier>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<DefineConstants>OS_MACOS;ARCH_ARM64</DefineConstants> <DefineConstants>OS_MACOS;ARCH_ARM64</DefineConstants>
<WarningLevel>3</WarningLevel> <DebugType>none</DebugType>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='iOS|ARM'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='iOS|ARM'">
@ -140,12 +141,14 @@
<Optimize>true</Optimize> <Optimize>true</Optimize>
<PlatformTarget>ARM</PlatformTarget> <PlatformTarget>ARM</PlatformTarget>
<DefineConstants>OS_IOS;ARCH_ARM</DefineConstants> <DefineConstants>OS_IOS;ARCH_ARM</DefineConstants>
<DebugType>none</DebugType>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='iOS|ARM64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='iOS|ARM64'">
<RuntimeIdentifier>ios-arm64</RuntimeIdentifier> <RuntimeIdentifier>ios-arm64</RuntimeIdentifier>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<PlatformTarget>ARM64</PlatformTarget> <PlatformTarget>ARM64</PlatformTarget>
<DefineConstants>OS_IOS;ARCH_ARM64</DefineConstants> <DefineConstants>OS_IOS;ARCH_ARM64</DefineConstants>
<DebugType>none</DebugType>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='All|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='All|AnyCPU'">
@ -155,93 +158,12 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'"> <PropertyGroup Condition="'$(Configuration)'=='Debug'">
<PlatformTarget>ARM</PlatformTarget>
<Optimize>False</Optimize> <Optimize>False</Optimize>
<DefineConstants>DEBUG;TRACE;OS_DEBUG;ARCH_ARM</DefineConstants> <DefineConstants>DEBUG;TRACE;OS_DEBUG</DefineConstants>
<WarningLevel>3</WarningLevel> <DebugType>full</DebugType>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
<PlatformTarget>ARM64</PlatformTarget>
<Optimize>False</Optimize>
<DefineConstants>DEBUG;TRACE;OS_DEBUG;ARCH_ARM64</DefineConstants>
<WarningLevel>3</WarningLevel>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Optimize>False</Optimize>
<DefineConstants>DEBUG;TRACE;OS_DEBUG;ARCH_X86_64</DefineConstants>
<WarningLevel>3</WarningLevel>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'">
<Optimize>False</Optimize>
<DefineConstants>DEBUG;TRACE;OS_DEBUG;ARCH_X86</DefineConstants>
<WarningLevel>3</WarningLevel>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MacOS|x86'">
<Optimize>True</Optimize>
<DefineConstants>OS_MACOS;ARCH_X86</DefineConstants>
<WarningLevel>3</WarningLevel>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Linux|x86'">
<Optimize>True</Optimize>
<DefineConstants>OS_LINUX;ARCH_X86</DefineConstants>
<WarningLevel>3</WarningLevel>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Linux|AnyCPU'">
<Optimize>False</Optimize>
<DefineConstants>OS_LINUX;ARCH_ANYCPU</DefineConstants>
<WarningLevel>3</WarningLevel>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Windows|AnyCPU'">
<Optimize>False</Optimize>
<DefineConstants>OS_WINDOWS;ARCH_ANYCPU</DefineConstants>
<WarningLevel>3</WarningLevel>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MacOS|AnyCPU'">
<Optimize>False</Optimize>
<DefineConstants>OS_MACOS;ARCH_ANYCPU</DefineConstants>
<WarningLevel>3</WarningLevel>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MacOS|ARM'">
<Optimize>True</Optimize>
<DefineConstants>OS_MACOS;ARCH_ARM</DefineConstants>
<WarningLevel>3</WarningLevel>
<NoWarn>1701;1702;2026</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<WarningLevel>3</WarningLevel>
<NoWarn>1701;1702;2026</NoWarn>
<Optimize>False</Optimize>
</PropertyGroup>
</Project> </Project>

117
HorseIsleServer/HISPd/Program.cs Normal file → Executable file
View file

@ -3,7 +3,6 @@ using HISP.Server;
using System; using System;
using System.IO; using System.IO;
using System.Threading; using System.Threading;
using System.Threading.Tasks;
namespace HISP.Cli namespace HISP.Cli
{ {
@ -12,7 +11,7 @@ namespace HISP.Cli
private static StreamWriter sw = null; private static StreamWriter sw = null;
private static FileStream fs = null; private static FileStream fs = null;
private static string logFile; private static string logFile;
private static EventWaitHandle shutdownHandle; private static EventWaitHandle shutdownHandle = null;
public static bool ShuttingDown = false; public static bool ShuttingDown = false;
public static string BaseDir; public static string BaseDir;
@ -45,41 +44,95 @@ namespace HISP.Cli
public static void OnShutdown() public static void OnShutdown()
{ {
shutdownHandle.Set(); try
{
if (sw != null)
{
sw.Flush();
sw.Close();
sw.Dispose();
sw = null;
}
}
catch (Exception) { };
try
{
if (fs != null)
{
fs.Flush();
fs.Close();
fs.Dispose();
fs = null;
}
}
catch (Exception) { };
if(shutdownHandle != null)
shutdownHandle.Set();
} }
private static string formatMessage(string type, string text, bool console)
{
#if OS_WINDOWS
string newline = "\r\n";
#else
string newline = "\n";
#endif
string msg = DateTime.Now.ToString("MM-dd-yyyy HH:mm:ss") + ": [" + type + "] ";
if (console && text.Length > (Console.WindowWidth - msg.Length) - newline.Length)
text = text.Substring(0, (Console.WindowWidth - msg.Length) - newline.Length);
return msg + text + newline;
}
public static void LogToFile(bool error, string type,string text) public static void LogToFile(bool error, string type,string text)
{ {
sw.WriteLineAsync(text + sw.NewLine); sw.WriteLine(formatMessage(type, text, false));
if (error)
sw.Flush();
} }
public static void LogStdout(bool error, string type, string text) public static void LogStdout(bool error, string type, string text)
{ {
if (error) if (type == "CRASH")
Console.Error.WriteAsync("[" + type + "] " + text + Console.Error.NewLine); LogToFile(error, type, text);
else try
Console.Out.WriteAsync("[" + type + "] " + text + Console.Out.NewLine); {
if (error)
Console.Error.WriteAsync(formatMessage(type, text, true));
else
Console.Out.WriteAsync(formatMessage(type, text, true));
}
catch (Exception) { };
} }
public static void Main(string[] args) public static void Main(string[] args)
{ {
string BaseDir = Directory.GetCurrentDirectory(); AppDomain.CurrentDomain.ProcessExit += ProcessQuitHandler;
Logger.SetCallback(LogStdout);
string HispConfVar = Environment.GetEnvironmentVariable("HISP_CONF_FILE"); string baseDir = Directory.GetCurrentDirectory();
string HispLogVar = Environment.GetEnvironmentVariable("HISP_LOG_FILE"); Logger.SetCallback(LogStdout);
string HispBaseDir = Environment.GetEnvironmentVariable("HISP_BASE_DIR"); Entry.SetShutdownCallback(OnShutdown);
string hispConfVar = Environment.GetEnvironmentVariable("HISP_CONF_FILE");
string hispLogVar = Environment.GetEnvironmentVariable("HISP_LOG_FILE");
string hispBaseDir = Environment.GetEnvironmentVariable("HISP_BASE_DIR");
foreach (string arg in args) foreach (string arg in args)
{ {
switch (arg) switch (arg)
{ {
case "--install-service": case "--install-service":
#if OS_LINUX #if OS_LINUX
File.WriteAllBytes("/etc/systemd/system/HISP.service", Resources.HISPService); File.WriteAllBytes("/etc/systemd/system/HISP.service", Resources.HISPService);
LogStdout(false, "INFO", "Crreated Service! enable it with \"sudo systemctl enable HISP\""); LogStdout(false, "INFO", "Crreated Service! enable it with \"sudo systemctl enable HISP\"");
#else #else
LogStdout(true, "ERROR", "Installing as a service unsupported on this platform"); LogStdout(true, "ERROR", "Installing as a service unsupported on this platform");
#endif #endif
break; break;
default: default:
if (arg.Contains("=")) if (arg.Contains("="))
@ -97,8 +150,8 @@ namespace HISP.Cli
Logger.SetCallback(LogToFile); Logger.SetCallback(LogToFile);
break; break;
case "--base-directory": case "--base-directory":
BaseDir = argu[1]; baseDir = argu[1];
Directory.SetCurrentDirectory(BaseDir); Directory.SetCurrentDirectory(baseDir);
break; break;
default: default:
continue; continue;
@ -109,28 +162,36 @@ namespace HISP.Cli
} }
} }
if (HispConfVar != null) if (hispConfVar != null)
{ {
ConfigReader.ConfigurationFileName = HispConfVar; ConfigReader.ConfigurationFileName = hispConfVar;
} }
if (HispLogVar != null) if (hispLogVar != null)
{ {
LogFile = HispLogVar; LogFile = hispLogVar;
Logger.SetCallback(LogToFile); Logger.SetCallback(LogToFile);
} }
else
if (HispBaseDir != null)
{ {
BaseDir = HispBaseDir; LogFile = Path.Combine(baseDir, "crash.log");
Directory.SetCurrentDirectory(BaseDir); }
if (hispBaseDir != null)
{
baseDir = hispBaseDir;
Directory.SetCurrentDirectory(baseDir);
} }
Entry.SetShutdownCallback(OnShutdown);
Entry.Start(); Entry.Start();
shutdownHandle = new EventWaitHandle(false, EventResetMode.ManualReset); shutdownHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
shutdownHandle.WaitOne(); shutdownHandle.WaitOne();
} }
private static void ProcessQuitHandler(object sender, EventArgs e)
{
GameServer.ShutdownServer("HISPd process quitting.");
}
} }
} }

70
HorseIsleServer/HISPd/Properties/AssemblyInfo.cs Normal file → Executable file
View file

@ -1,35 +1,35 @@
using System.Reflection; using System.Reflection;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information // set of attributes. Change these attribute values to modify the information
// associated with an assembly. // associated with an assembly.
[assembly: AssemblyTitle("HISPd")] [assembly: AssemblyTitle("HISPd")]
[assembly: AssemblyDescription("Server Emulator for \"Horse Isle\"")] [assembly: AssemblyDescription("Server Emulator for \"Horse Isle\"")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("SilicaAndPina")] [assembly: AssemblyCompany("Li")]
[assembly: AssemblyProduct("HISPd")] [assembly: AssemblyProduct("HISP")]
[assembly: AssemblyCopyright("Public Domain © 2022")] [assembly: AssemblyCopyright("Public Domain <EFBFBD> 2022")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible // Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from // to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type. // COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)] [assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM // The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("57264c6b-1461-41d6-9304-3890cf6c8390")] [assembly: Guid("57264c6b-1461-41d6-9304-3890cf6c8390")]
// Version information for an assembly consists of the following four values: // Version information for an assembly consists of the following four values:
// //
// Major Version // Major Version
// Minor Version // Minor Version
// Build Number // Build Number
// Revision // Revision
// //
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.3.0.0")] [assembly: AssemblyVersion("1.8.73.0")]
[assembly: AssemblyFileVersion("1.3.0.0")] [assembly: AssemblyFileVersion("1.8.73.0")]

View file

@ -6,9 +6,9 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Android</Configuration> <Configuration>Android</Configuration>
<Platform>ARM</Platform> <Platform>ARM</Platform>
<PublishDir>bin\arm\Android\net7.0\android-arm\publish\</PublishDir> <PublishDir>bin\arm\Android\net8.0\android-arm\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>android-arm</RuntimeIdentifier> <RuntimeIdentifier>android-arm</RuntimeIdentifier>
<SelfContained>True</SelfContained> <SelfContained>True</SelfContained>
<UseAppHost>True</UseAppHost> <UseAppHost>True</UseAppHost>

View file

@ -6,9 +6,9 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Android</Configuration> <Configuration>Android</Configuration>
<Platform>ARM64</Platform> <Platform>ARM64</Platform>
<PublishDir>bin\arm64\Android\net7.0\android-arm64\publish\</PublishDir> <PublishDir>bin\arm64\Android\net8.0\android-arm64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>android-arm64</RuntimeIdentifier> <RuntimeIdentifier>android-arm64</RuntimeIdentifier>
<SelfContained>True</SelfContained> <SelfContained>True</SelfContained>
<UseAppHost>True</UseAppHost> <UseAppHost>True</UseAppHost>

View file

@ -6,9 +6,9 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Linux</Configuration> <Configuration>Linux</Configuration>
<Platform>x64</Platform> <Platform>x64</Platform>
<PublishDir>bin\x64\Linux\net7.0\linux-x64\publish\</PublishDir> <PublishDir>bin\x64\Linux\net8.0\linux-x64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier> <RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<SelfContained>True</SelfContained> <SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile> <PublishSingleFile>True</PublishSingleFile>

View file

@ -6,9 +6,9 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Linux</Configuration> <Configuration>Linux</Configuration>
<Platform>ARM</Platform> <Platform>ARM</Platform>
<PublishDir>bin\ARM\Linux\net7.0\linux-arm\publish\</PublishDir> <PublishDir>bin\ARM\Linux\net8.0\linux-arm\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>linux-arm</RuntimeIdentifier> <RuntimeIdentifier>linux-arm</RuntimeIdentifier>
<SelfContained>True</SelfContained> <SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile> <PublishSingleFile>True</PublishSingleFile>

View file

@ -6,9 +6,9 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Linux</Configuration> <Configuration>Linux</Configuration>
<Platform>ARM64</Platform> <Platform>ARM64</Platform>
<PublishDir>bin\ARM64\Linux\net7.0\linux-arm64\publish\</PublishDir> <PublishDir>bin\ARM64\Linux\net8.0\linux-arm64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>linux-arm64</RuntimeIdentifier> <RuntimeIdentifier>linux-arm64</RuntimeIdentifier>
<SelfContained>True</SelfContained> <SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile> <PublishSingleFile>True</PublishSingleFile>

View file

@ -6,9 +6,9 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>MacOS</Configuration> <Configuration>MacOS</Configuration>
<Platform>x64</Platform> <Platform>x64</Platform>
<PublishDir>bin\x64\MacOS\net7.0\osx-x64\publish\</PublishDir> <PublishDir>bin\x64\MacOS\net8.0\osx-x64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>osx-x64</RuntimeIdentifier> <RuntimeIdentifier>osx-x64</RuntimeIdentifier>
<SelfContained>True</SelfContained> <SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile> <PublishSingleFile>True</PublishSingleFile>

View file

@ -6,9 +6,9 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>MacOS</Configuration> <Configuration>MacOS</Configuration>
<Platform>ARM64</Platform> <Platform>ARM64</Platform>
<PublishDir>bin\arm64\MacOS\net7.0\osx-arm64\publish\</PublishDir> <PublishDir>bin\arm64\MacOS\net8.0\osx-arm64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>osx-arm64</RuntimeIdentifier> <RuntimeIdentifier>osx-arm64</RuntimeIdentifier>
<SelfContained>True</SelfContained> <SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile> <PublishSingleFile>True</PublishSingleFile>

View file

@ -6,9 +6,9 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Windows</Configuration> <Configuration>Windows</Configuration>
<Platform>x86</Platform> <Platform>x86</Platform>
<PublishDir>bin\x86\Windows\net7.0\win-x86\publish\</PublishDir> <PublishDir>bin\x86\Windows\net8.0\win-x86\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>win-x86</RuntimeIdentifier> <RuntimeIdentifier>win-x86</RuntimeIdentifier>
<SelfContained>True</SelfContained> <SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile> <PublishSingleFile>True</PublishSingleFile>

View file

@ -6,14 +6,14 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Windows</Configuration> <Configuration>Windows</Configuration>
<Platform>x64</Platform> <Platform>x64</Platform>
<PublishDir>bin\x64\Windows\net7.0\win-x64\publish\</PublishDir> <PublishDir>bin\x64\Windows\net8.0\win-x64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>True</SelfContained> <SelfContained>True</SelfContained>
<PublishTrimmed>True</PublishTrimmed>
<PublishSingleFile>True</PublishSingleFile> <PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun> <PublishReadyToRun>True</PublishReadyToRun>
<PublishTrimmed>True</PublishTrimmed>
<DefineConstants>OS_WINDOWS;ARCH_X86_64</DefineConstants> <DefineConstants>OS_WINDOWS;ARCH_X86_64</DefineConstants>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View file

@ -6,9 +6,9 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Windows</Configuration> <Configuration>Windows</Configuration>
<Platform>ARM</Platform> <Platform>ARM</Platform>
<PublishDir>bin\arm\Windows\net7.0\windows-arm\publish\</PublishDir> <PublishDir>bin\arm\Windows\net8.0\win-arm\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>win-arm</RuntimeIdentifier> <RuntimeIdentifier>win-arm</RuntimeIdentifier>
<SelfContained>True</SelfContained> <SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile> <PublishSingleFile>True</PublishSingleFile>

View file

@ -6,9 +6,9 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Windows</Configuration> <Configuration>Windows</Configuration>
<Platform>ARM64</Platform> <Platform>ARM64</Platform>
<PublishDir>bin\arm64\Windows\net7.0\windows-arm64\publish\</PublishDir> <PublishDir>bin\arm64\Windows\net8.0\win-arm64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>win-arm64</RuntimeIdentifier> <RuntimeIdentifier>win-arm64</RuntimeIdentifier>
<SelfContained>True</SelfContained> <SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile> <PublishSingleFile>True</PublishSingleFile>

View file

@ -6,9 +6,9 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>iOS</Configuration> <Configuration>iOS</Configuration>
<Platform>ARM</Platform> <Platform>ARM</Platform>
<PublishDir>bin\arm\iOS\net7.0\ios-arm\publish\</PublishDir> <PublishDir>bin\arm\iOS\net8.0\ios-arm\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>ios-arm</RuntimeIdentifier> <RuntimeIdentifier>ios-arm</RuntimeIdentifier>
<SelfContained>True</SelfContained> <SelfContained>True</SelfContained>
<PublishSingleFile>False</PublishSingleFile> <PublishSingleFile>False</PublishSingleFile>

View file

@ -6,9 +6,9 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>iOS</Configuration> <Configuration>iOS</Configuration>
<Platform>ARM64</Platform> <Platform>ARM64</Platform>
<PublishDir>bin\arm64\iOS\net7.0\ios-arm64\publish\</PublishDir> <PublishDir>bin\arm64\iOS\net8.0\ios-arm64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>ios-arm64</RuntimeIdentifier> <RuntimeIdentifier>ios-arm64</RuntimeIdentifier>
<SelfContained>True</SelfContained> <SelfContained>True</SelfContained>
<PublishSingleFile>False</PublishSingleFile> <PublishSingleFile>False</PublishSingleFile>

0
HorseIsleServer/HISPd/Properties/Resources.Designer.cs generated Normal file → Executable file
View file

0
HorseIsleServer/HISPd/Properties/Resources.resx Normal file → Executable file
View file

0
HorseIsleServer/HISPd/Properties/launchSettings.json Normal file → Executable file
View file

0
HorseIsleServer/HISPd/Resources/DEBIAN/conffiles Normal file → Executable file
View file

14
HorseIsleServer/HISPd/Resources/DEBIAN/control Normal file → Executable file
View file

@ -1,7 +1,7 @@
Package: hisp Package: hisp
Version: 1.6.1 Version: 1.8.73
Depends: coreutils,systemd,mariadb-server,libsqlite3-dev Depends: coreutils,systemd,mariadb-server,libsqlite3-dev,zlib1g-dev,libicu-dev,libkrb5-dev
Maintainer: Li Maintainer: Li
Homepage: https://islehorse.com Homepage: https://islehorse.com
Architecture: amd64 Architecture: amd64
Description: Open Source Implementation of the flash game "Horse Isle" server. Description: Open Source Implementation of the server for flash game "Horse Isle".

0
HorseIsleServer/HISPd/Resources/DEBIAN/copyright Normal file → Executable file
View file

3
HorseIsleServer/HISPd/Resources/DEBIAN/postinst Normal file → Executable file
View file

@ -1,7 +1,10 @@
#!/bin/sh #!/bin/sh
useradd -r horseisle useradd -r horseisle
mkdir -p /etc/hisp
mkdir -p /var/log/hisp
chown -R horseisle:horseisle /etc/hisp chown -R horseisle:horseisle /etc/hisp
chown -R horseisle:horseisle /var/log/hisp
systemctl enable HISP.service systemctl enable HISP.service
systemctl start HISP systemctl start HISP

1
HorseIsleServer/HISPd/Resources/DEBIAN/postrm Normal file → Executable file
View file

@ -1,2 +1 @@
#!/bin/sh #!/bin/sh
userdel horseisle

0
HorseIsleServer/HISPd/Resources/DEBIAN/prerm Normal file → Executable file
View file

6
HorseIsleServer/HISPd/Resources/HISP.service Normal file → Executable file
View file

@ -16,8 +16,8 @@ Type=simple
ProtectSystem=full ProtectSystem=full
PrivateDevices=true PrivateDevices=true
StandardError=syslog+console StandardError=journal+console
StandardOutput=syslog+console StandardOutput=journal+console
User=horseisle User=horseisle
Group=horseisle Group=horseisle
@ -25,7 +25,7 @@ Group=horseisle
WorkingDirectory=/etc/hisp WorkingDirectory=/etc/hisp
ExecStart=/usr/bin/HISPd ExecStart=/usr/bin/HISPd
Environment=USER=horseisle HOME=/etc/hisp HISP_BASE_DIR=/etc/hisp HISP_CONF_FILE=/etc/hisp/server.properties Environment=USER=horseisle HOME=/etc/hisp HISP_BASE_DIR=/etc/hisp HISP_CONF_FILE=/etc/hisp/server.properties HISP_LOG_FILE=/var/log/hisp/hisp.log
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target

0
HorseIsleServer/HISPd/icon.ico Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View file

@ -0,0 +1,169 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<RootNamespace>HISP.Tests</RootNamespace>
<LangVersion>10.0</LangVersion>
<Platforms>x64;x86;ARM;ARM64;AnyCPU</Platforms>
<Configurations>Debug;Windows;Linux;MacOS;Android;iOS</Configurations>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\LibHISP\LibHISP.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<Generator>PublicResXFileCodeGenerator</Generator>
</EmbeddedResource>
</ItemGroup>
<PropertyGroup>
<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>false</GenerateBindingRedirectsOutputType>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<NoWin32Manifest>true</NoWin32Manifest>
<ApplicationIcon>icon.ico</ApplicationIcon>
<StartupObject>HISP.Tests.Program</StartupObject>
<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
<DebugType>embedded</DebugType>
<ProduceReferenceAssembly>False</ProduceReferenceAssembly>
<AnalysisLevel>none</AnalysisLevel>
<EnableNETAnalyzers>False</EnableNETAnalyzers>
<Copyright>Public Domain, 2022</Copyright>
<PackageProjectUrl>https://islehorse.com</PackageProjectUrl>
<RepositoryUrl>https://github.com/islehorse/HISP</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<WarningLevel>3</WarningLevel>
<NoWarn>1701;1702;2026;IL2026</NoWarn>
</PropertyGroup>
<PropertyGroup>
<TrimMode>partial</TrimMode>
<EnableTrimAnalyzer>false</EnableTrimAnalyzer>
<TrimmerRemoveSymbols>true</TrimmerRemoveSymbols>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Windows|x86'">
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
<Optimize>true</Optimize>
<Platforms>x86</Platforms>
<PlatformTarget>x86</PlatformTarget>
<DefineConstants>OS_WINDOWS;ARCH_X86</DefineConstants>
<DebugType>none</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Windows|x64'">
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<Optimize>true</Optimize>
<Platforms>x64</Platforms>
<PlatformTarget>x64</PlatformTarget>
<DefineConstants>OS_WINDOWS;ARCH_X86_64</DefineConstants>
<DebugType>none</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Windows|ARM'">
<RuntimeIdentifier>win-arm</RuntimeIdentifier>
<Optimize>true</Optimize>
<PlatformTarget>ARM</PlatformTarget>
<DefineConstants>OS_WINDOWS;ARCH_ARM</DefineConstants>
<DebugType>none</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Windows|ARM64'">
<RuntimeIdentifier>win-arm64</RuntimeIdentifier>
<Optimize>true</Optimize>
<PlatformTarget>ARM64</PlatformTarget>
<DefineConstants>OS_WINDOWS;ARCH_ARM64</DefineConstants>
<DebugType>none</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Android|ARM'">
<RuntimeIdentifier>android-arm</RuntimeIdentifier>
<Optimize>true</Optimize>
<PlatformTarget>ARM</PlatformTarget>
<DefineConstants>OS_ANDROID;ARCH_ARM</DefineConstants>
<WarningLevel>3</WarningLevel>
<NoWarn></NoWarn>
<DebugType>none</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Android|ARM64'">
<RuntimeIdentifier>android-arm64</RuntimeIdentifier>
<Optimize>true</Optimize>
<PlatformTarget>ARM64</PlatformTarget>
<DefineConstants>OS_ANDROID;ARCH_ARM64</DefineConstants>
<DebugType>none</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Linux|x64'">
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<Optimize>true</Optimize>
<PlatformTarget>x64</PlatformTarget>
<DefineConstants>OS_LINUX;ARCH_X86_64</DefineConstants>
<DebugType>none</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Linux|ARM'">
<RuntimeIdentifier>linux-arm</RuntimeIdentifier>
<PlatformTarget>ARM</PlatformTarget>
<Optimize>true</Optimize>
<DefineConstants>OS_LINUX;ARCH_ARM</DefineConstants>
<DebugType>none</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Linux|ARM64'">
<RuntimeIdentifier>linux-arm64</RuntimeIdentifier>
<PlatformTarget>ARM64</PlatformTarget>
<Optimize>true</Optimize>
<DefineConstants>OS_LINUX;ARCH_ARM64</DefineConstants>
<DebugType>none</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MacOS|x64'">
<RuntimeIdentifier>osx-x64</RuntimeIdentifier>
<Optimize>true</Optimize>
<PlatformTarget>x64</PlatformTarget>
<DefineConstants>OS_MACOS;ARCH_X86_64</DefineConstants>
<DebugType>none</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MacOS|ARM64'">
<RuntimeIdentifier>osx-arm64</RuntimeIdentifier>
<Optimize>true</Optimize>
<DefineConstants>OS_MACOS;ARCH_ARM64</DefineConstants>
<DebugType>none</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='iOS|ARM'">
<RuntimeIdentifier>ios-arm</RuntimeIdentifier>
<Optimize>true</Optimize>
<PlatformTarget>ARM</PlatformTarget>
<DefineConstants>OS_IOS;ARCH_ARM</DefineConstants>
<DebugType>none</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='iOS|ARM64'">
<RuntimeIdentifier>ios-arm64</RuntimeIdentifier>
<Optimize>true</Optimize>
<PlatformTarget>ARM64</PlatformTarget>
<DefineConstants>OS_IOS;ARCH_ARM64</DefineConstants>
<DebugType>none</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='All|AnyCPU'">
<RuntimeIdentifiers>win-x86;win-x64;win-arm;win-arm64;linux-x64;linux-arm;linux-arm64;osx-x64;osx-arm64</RuntimeIdentifiers>
<Optimize>True</Optimize>
<DefineConstants>OS_ALL;ARCH_ANYCPU</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
<Optimize>False</Optimize>
<DefineConstants>DEBUG;TRACE;OS_DEBUG</DefineConstants>
<DebugType>full</DebugType>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,20 @@
using HISP.Server;
using HISP.Tests.UnitTests;
using System;
using System.Threading.Tasks;
namespace HISP.Tests
{
public static class Program
{
public static async Task Main(string[] args)
{
ServerStartTest.RunServerStartTest();
AuthenticationTest.RunAuthenticationTest();
await UserTest.RunUserTest();
PacketTest.RunPacketTest();
}
}
}

View file

@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("HISPd")]
[assembly: AssemblyDescription("Server Emulator for \"Horse Isle\"")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Li")]
[assembly: AssemblyProduct("HISP")]
[assembly: AssemblyCopyright("Public Domain <20> 2022")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("57264c6b-1461-41d6-9304-3890cf6c8390")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.8.30.0")]
[assembly: AssemblyFileVersion("1.8.30.0")]

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0">
<PropertyGroup>
<Configuration>Android</Configuration>
<Platform>ARM</Platform>
<PublishDir>bin\arm\Android\net8.0\android-arm\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>android-arm</RuntimeIdentifier>
<SelfContained>True</SelfContained>
<UseAppHost>True</UseAppHost>
<PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun>
<PublishTrimmed>True</PublishTrimmed>
<DefineConstants>OS_ANDROID;ARCH_ARM</DefineConstants>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0">
<PropertyGroup>
<Configuration>Android</Configuration>
<Platform>ARM64</Platform>
<PublishDir>bin\arm64\Android\net8.0\android-arm64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>android-arm64</RuntimeIdentifier>
<SelfContained>True</SelfContained>
<UseAppHost>True</UseAppHost>
<PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun>
<PublishTrimmed>True</PublishTrimmed>
<DefineConstants>OS_ANDROID;ARCH_ARM64</DefineConstants>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0">
<PropertyGroup>
<Configuration>Linux</Configuration>
<Platform>x64</Platform>
<PublishDir>bin\x64\Linux\net8.0\linux-x64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun>
<PublishTrimmed>True</PublishTrimmed>
<DefineConstants>OS_LINUX;ARCH_X86_64</DefineConstants>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0">
<PropertyGroup>
<Configuration>Linux</Configuration>
<Platform>ARM</Platform>
<PublishDir>bin\ARM\Linux\net8.0\linux-arm\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>linux-arm</RuntimeIdentifier>
<SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun>
<PublishTrimmed>True</PublishTrimmed>
<DefineConstants>OS_LINUX;ARCH_ARM</DefineConstants>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0">
<PropertyGroup>
<Configuration>Linux</Configuration>
<Platform>ARM64</Platform>
<PublishDir>bin\ARM64\Linux\net8.0\linux-arm64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>linux-arm64</RuntimeIdentifier>
<SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun>
<PublishTrimmed>True</PublishTrimmed>
<DefineConstants>OS_LINUX;ARCH_ARM64</DefineConstants>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0">
<PropertyGroup>
<Configuration>MacOS</Configuration>
<Platform>x64</Platform>
<PublishDir>bin\x64\MacOS\net8.0\osx-x64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>osx-x64</RuntimeIdentifier>
<SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun>
<PublishTrimmed>True</PublishTrimmed>
<DefineConstants>OS_MACOS;ARCH_X86_64</DefineConstants>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0">
<PropertyGroup>
<Configuration>MacOS</Configuration>
<Platform>ARM64</Platform>
<PublishDir>bin\arm64\MacOS\net8.0\osx-arm64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>osx-arm64</RuntimeIdentifier>
<SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun>
<PublishTrimmed>True</PublishTrimmed>
<DefineConstants>OS_MACOS;ARCH_ARM64</DefineConstants>
</PropertyGroup>
</Project>

View file

@ -2,18 +2,18 @@
<!-- <!--
https://go.microsoft.com/fwlink/?LinkID=208121. https://go.microsoft.com/fwlink/?LinkID=208121.
--> -->
<Project ToolsVersion="4.0"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<Configuration>Windows</Configuration> <Configuration>Windows</Configuration>
<Platform>x86</Platform> <Platform>x86</Platform>
<PublishDir>bin\x86\Windows\net7.0\win-x86\publish\</PublishDir> <PublishDir>bin\x86\Windows\net8.0\win-x86\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net7.0-windows</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>win-x86</RuntimeIdentifier> <RuntimeIdentifier>win-x86</RuntimeIdentifier>
<SelfContained>True</SelfContained> <SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile> <PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun> <PublishReadyToRun>True</PublishReadyToRun>
<!-- <PublishTrimmed>True</PublishTrimmed> --> <PublishTrimmed>True</PublishTrimmed>
<DefineConstants>OS_WINDOWS;ARCH_X86</DefineConstants> <DefineConstants>OS_WINDOWS;ARCH_X86</DefineConstants>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View file

@ -6,14 +6,14 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup> <PropertyGroup>
<Configuration>Windows</Configuration> <Configuration>Windows</Configuration>
<Platform>x64</Platform> <Platform>x64</Platform>
<PublishDir>bin\x64\Windows\net7.0\win-x64\publish\</PublishDir> <PublishDir>bin\x64\Windows\net8.0\win-x64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol> <PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net7.0-windows</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>True</SelfContained> <SelfContained>True</SelfContained>
<PublishTrimmed>True</PublishTrimmed>
<PublishSingleFile>True</PublishSingleFile> <PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun> <PublishReadyToRun>True</PublishReadyToRun>
<!-- <PublishTrimmed>True</PublishTrimmed> --> <DefineConstants>OS_WINDOWS;ARCH_X86_64</DefineConstants>
<DefineConstants>OS_WINDOWS;ARCH_X86_64</DefineConstants>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration>Windows</Configuration>
<Platform>ARM</Platform>
<PublishDir>bin\arm\Windows\net8.0\win-arm\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>win-arm</RuntimeIdentifier>
<SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun>
<PublishTrimmed>True</PublishTrimmed>
<DefineConstants>OS_WINDOWS;ARCH_ARM</DefineConstants>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration>Windows</Configuration>
<Platform>ARM64</Platform>
<PublishDir>bin\arm64\Windows\net8.0\win-arm64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>win-arm64</RuntimeIdentifier>
<SelfContained>True</SelfContained>
<PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun>
<PublishTrimmed>True</PublishTrimmed>
<DefineConstants>OS_WINDOWS;ARCH_ARM64</DefineConstants>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0">
<PropertyGroup>
<Configuration>iOS</Configuration>
<Platform>ARM</Platform>
<PublishDir>bin\arm\iOS\net8.0\ios-arm\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>ios-arm</RuntimeIdentifier>
<SelfContained>True</SelfContained>
<PublishSingleFile>False</PublishSingleFile>
<PublishReadyToRun>False</PublishReadyToRun>
<PublishTrimmed>True</PublishTrimmed>
<DefineConstants>OS_IOS;ARCH_ARM</DefineConstants>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0">
<PropertyGroup>
<Configuration>iOS</Configuration>
<Platform>ARM64</Platform>
<PublishDir>bin\arm64\iOS\net8.0\ios-arm64\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>ios-arm64</RuntimeIdentifier>
<SelfContained>True</SelfContained>
<PublishSingleFile>False</PublishSingleFile>
<PublishReadyToRun>False</PublishReadyToRun>
<PublishTrimmed>True</PublishTrimmed>
<DefineConstants>OS_IOS;ARCH_ARM64</DefineConstants>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,74 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace HISP.Tests.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
public class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HISP.Tests.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to {
/// &quot;2PlayerClose&quot;: &quot;UFgA&quot;,
/// &quot;BirdMap_OutsideMapTop&quot;: &quot;dgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ [rest of string was truncated]&quot;;.
/// </summary>
public static string PacketTestDataSet {
get {
return ResourceManager.GetString("PacketTestDataSet", resourceCulture);
}
}
}
}

View file

@ -1,120 +1,124 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<root> <root>
<!-- <!--
Microsoft ResX Schema Microsoft ResX Schema
Version 2.0 Version 2.0
The primary goals of this format is to allow a simple XML format The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes various data types are done through the TypeConverter classes
associated with the data types. associated with the data types.
Example: Example:
... ado.net/XML headers & schema ... ... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader> <resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value> <value>[base64 mime encoded serialized .NET Framework object]</value>
</data> </data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment> <comment>This is a comment</comment>
</data> </data>
There are any number of "resheader" rows that contain simple There are any number of "resheader" rows that contain simple
name/value pairs. name/value pairs.
Each data row contains a name, and value. The row also contains a Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture. text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the Classes that don't support this are serialized and stored with the
mimetype set. mimetype set.
The mimetype is used for serialized objects, and tells the The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly: extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below. read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64 mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64 mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64 mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter : using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
--> -->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true"> <xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType> <xsd:complexType>
<xsd:choice maxOccurs="unbounded"> <xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata"> <xsd:element name="metadata">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" /> <xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" /> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="assembly"> <xsd:element name="assembly">
<xsd:complexType> <xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="data"> <xsd:element name="data">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" /> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="resheader"> <xsd:element name="resheader">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" /> <xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
</xsd:choice> </xsd:choice>
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
</xsd:schema> </xsd:schema>
<resheader name="resmimetype"> <resheader name="resmimetype">
<value>text/microsoft-resx</value> <value>text/microsoft-resx</value>
</resheader> </resheader>
<resheader name="version"> <resheader name="version">
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="PacketTestDataSet" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\PacketTestDataSet.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
</root> </root>

View file

@ -1,6 +1,6 @@
{ {
"profiles": { "profiles": {
"N00BS": { "HISPtests": {
"commandName": "Project" "commandName": "Project"
} }
} }

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HISP.Tests
{
public class ResultLogger
{
public static void LogTestStatus(bool successful, string testname, string message)
{
if (successful)
{
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Out.Write("[ " + testname + " ] ");
Console.ForegroundColor = ConsoleColor.Green;
Console.Out.WriteLine("* " + message + " *");
}
else
{
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Error.Write("[ " + testname + " ] ");
Console.ForegroundColor = ConsoleColor.Red;
Console.Error.WriteLine("* " + message + " *");
}
}
public static void LogTestResult(bool successful, string testname, string message, string expected)
{
if (successful)
{
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Out.Write("[ " + testname + " ] ");
Console.ForegroundColor = ConsoleColor.Green;
Console.Out.WriteLine("* " + message + " == " + expected + " *");
}
else
{
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Error.Write("[ " + testname + " ] ");
Console.ForegroundColor = ConsoleColor.Red;
Console.Error.WriteLine("* " + message + " != " + expected + " *");
}
}
}
}

View file

@ -0,0 +1,59 @@
using HISP.Security;
using HISP.Util;
using System.Collections.Generic;
namespace HISP.Tests.UnitTests
{
public class AuthenticationTest
{
private const string ALLOWED_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
public static bool Test(string testName, object value, object valueComp)
{
bool result = value.Equals(valueComp);
if (result)
ResultLogger.LogTestStatus(true, "AUTH_TEST " + testName, "Success.");
else
ResultLogger.LogTestResult(false, "AUTH_TEST " + testName, value.ToString(), valueComp.ToString());
return result;
}
public static bool RunAuthenticationTest()
{
List<bool> results = new List<bool>();
// Test Login Encrypt/Decrypt
for(int i = 0; i <= 100; i++)
{
string rngStr = Helper.RandomString(ALLOWED_CHARS);
string cipherText = Authentication.EncryptLogin(rngStr);
string plainText = Authentication.DecryptLogin(cipherText);
results.Add(Test("LoginEncryptDecrypt" + i.ToString(), plainText, rngStr));
}
string username = Helper.RandomString(ALLOWED_CHARS);
string password = Helper.RandomString(ALLOWED_CHARS);
string wrongPassword = Helper.RandomString(ALLOWED_CHARS);
string wrongUsername = Helper.RandomString(ALLOWED_CHARS);
Authentication.CreateAccount(username, password, "DEMIGIRL", true, true);
// Test Login function
results.Add(Test("CorrectUsernameAndPassword", Authentication.CheckPassword(username, password), true));
results.Add(Test("CorrectUsernameWrongPassword", Authentication.CheckPassword(username, wrongPassword), false));
results.Add(Test("WrongPasswordAndUsername", Authentication.CheckPassword(wrongUsername, wrongPassword), false));
results.Add(Test("WrongUsernameCorrectPassword", Authentication.CheckPassword(wrongUsername, password), false));
foreach (bool result in results)
if (!result)
return false;
return true;
}
}
}

View file

@ -0,0 +1,416 @@
//#define GENERATE
using HISP.Tests.Properties;
using HISP.Game.SwfModules;
using HISP.Game;
using HISP.Server;
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace HISP.Tests.UnitTests
{
public class PacketTest
{
private static Dictionary<string, string> knownGoodPackets = new Dictionary<string, string>();
public static bool Test(string name, byte[] packet)
{
#if GENERATE
knownGoodPackets.Add(name, Convert.ToBase64String(packet));
return true;
#else
string goodPacketStr = null;
knownGoodPackets.TryGetValue(name, out goodPacketStr);
byte[] goodPacket = Convert.FromBase64String(goodPacketStr);
if(!goodPacket.SequenceEqual(packet))
{
ResultLogger.LogTestResult(false, "PACKET_TEST "+name, BitConverter.ToString(packet).Replace("-", ""), goodPacket.ToString().Replace("-", ""));
return false;
}
else
{
ResultLogger.LogTestStatus(true, "PACKET_TEST " + name, "Success.");
return true;
}
#endif
}
public static bool RunPacketTest()
{
#if !GENERATE
JObject jobj = JsonConvert.DeserializeObject(Resources.PacketTestDataSet) as JObject;
knownGoodPackets = jobj.ToObject<Dictionary<string, string>>();
#endif
List<bool> results = new List<bool>();
results.Add(Test("2PlayerClose", PacketBuilder.Create2PlayerClose()));
// Test Map
results.Add(Test("BirdMap_OutsideMapTop", PacketBuilder.CreateBirdMap(-100, -800)));
results.Add(Test("BirdMap_OutsideMapBottom", PacketBuilder.CreateBirdMap(Map.Height+100, Map.Width+600)));
results.Add(Test("BirdMap_InsideMap", PacketBuilder.CreateBirdMap(100, 200)));
// Test Brickpoet
results.Add(Test("BrickPoetList", PacketBuilder.CreateBrickPoetList(Brickpoet.GetPoetryRoom(1))));
results.Add(Test("BrickPoetMove", PacketBuilder.CreateBrickPoetMove(Brickpoet.GetPoetryPeice(Brickpoet.GetPoetryRoom(1), 30))));
// Test Chat
results.Add(Test("ChatBottomLeft", PacketBuilder.CreateChat("Trans Rights", PacketBuilder.CHAT_BOTTOM_LEFT)));
results.Add(Test("ChatBottomRight", PacketBuilder.CreateChat("Are Human", PacketBuilder.CHAT_BOTTOM_RIGHT)));
results.Add(Test("ChatDmRight", PacketBuilder.CreateChat("Rights", PacketBuilder.CHAT_DM_RIGHT)));
results.Add(Test("ChatMotd", PacketBuilder.CreateMotd("Enbies are valid!")));
// Test Drawing Room
results.Add(Test("DrawingRoomUpdate", PacketBuilder.CreateDrawingUpdate("C959|64^67|66^73|68^79|69^87")));
// Test Dressup Room
results.Add(Test("DressupRoomPeiceLoad", PacketBuilder.CreateDressupRoomPeiceLoad(Dressup.GetDressupRoom(2).DressupPeices)));
results.Add(Test("DressupRoomPeiceMove", PacketBuilder.CreateDressupRoomPeiceMove(11, 14.4, 2.4, true)));
// Test SwfModule Forwarding
results.Add(Test("ForwardedSwfModule_516152", PacketBuilder.CreateForwardedSwfModule(new byte[] { 0x51, 0x61, 0x52 })));
results.Add(Test("ForwardedSwfModule_AF8D91C8", PacketBuilder.CreateForwardedSwfModule(new byte[] { 0xAF, 0x8D, 0x91, 0xC8 })));
// Test KeepAlive
results.Add(Test("KeepAlive", PacketBuilder.CreateKeepAlive()));
// Test KickMessage
results.Add(Test("KickMessage", PacketBuilder.CreateKickMessage("Transphobia")));
// Test Login
results.Add(Test("LoginSuccess", PacketBuilder.CreateLogin(true)));
results.Add(Test("LoginFail", PacketBuilder.CreateLogin(false)));
results.Add(Test("LoginFail_ReasonBanned", PacketBuilder.CreateLogin(false, "You are banned.")));
// Test Meta
results.Add(Test("CreateMeta", PacketBuilder.CreateMeta("^R1Trans Rights^X^Z")));
// Test Money, PlayerCount, Mail
results.Add(Test("MoneyPlayerCountAndMail", PacketBuilder.CreateMoneyPlayerCountAndMail(100, 1, 40)));
// Test Movement
results.Add(Test("Movement_DirectionUpMoveUpInsideMapWalk", PacketBuilder.CreateMovement(100, 131, 10, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionUpMoveDownInsideMapWalk", PacketBuilder.CreateMovement(123, 170, 12, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionUpMoveLeftInsideMapWalk", PacketBuilder.CreateMovement(210, 156, 14, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionUpMoveRightInsideMapWalk", PacketBuilder.CreateMovement(51, 53, 16, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionUpMoveUpdateInsideMapWalk", PacketBuilder.CreateMovement(90, 150, 1, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionUpMoveEscapeInsideMapWalk", PacketBuilder.CreateMovement(87, 43, 7, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_ESCAPE, true)));
results.Add(Test("Movement_DirectionDownMoveUpInsideMapWalk", PacketBuilder.CreateMovement(100, 131, 10, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionDownMoveDownInsideMapWalk", PacketBuilder.CreateMovement(123, 170, 12, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionDownMoveLeftInsideMapWalk", PacketBuilder.CreateMovement(210, 156, 14, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionDownMoveRightInsideMapWalk", PacketBuilder.CreateMovement(51, 53, 16, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionDownMoveUpdateInsideMapWalk", PacketBuilder.CreateMovement(90, 150, 1, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionDownMoveEscapeInsideMapWalk", PacketBuilder.CreateMovement(87, 43, 7, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_ESCAPE, true)));
results.Add(Test("Movement_DirectionLeftMoveUpInsideMapWalk", PacketBuilder.CreateMovement(100, 131, 10, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionLeftMoveDownInsideMapWalk", PacketBuilder.CreateMovement(123, 170, 12, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionLeftMoveLeftInsideMapWalk", PacketBuilder.CreateMovement(210, 156, 14, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionLeftMoveRightInsideMapWalk", PacketBuilder.CreateMovement(51, 53, 16, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionLeftMoveUpdateInsideMapWalk", PacketBuilder.CreateMovement(90, 150, 1, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionLeftMoveEscapeInsideMapWalk", PacketBuilder.CreateMovement(87, 43, 7, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_ESCAPE, true)));
results.Add(Test("Movement_DirectionRightMoveUpInsideMapWalk", PacketBuilder.CreateMovement(100, 131, 10, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionRightMoveDownInsideMapWalk", PacketBuilder.CreateMovement(123, 170, 12, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionRightMoveLeftInsideMapWalk", PacketBuilder.CreateMovement(210, 156, 14, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionRightMoveRightInsideMapWalk", PacketBuilder.CreateMovement(51, 53, 16, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionRightMoveUpdateInsideMapWalk", PacketBuilder.CreateMovement(90, 150, 1, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionRightMoveEscapeInsideMapWalk", PacketBuilder.CreateMovement(87, 43, 7, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_ESCAPE, true)));
results.Add(Test("Movement_DirectionTeleportMoveUpInsideMapWalk", PacketBuilder.CreateMovement(100, 131, 10, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionTeleportMoveDownInsideMapWalk", PacketBuilder.CreateMovement(123, 170, 12, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionTeleportMoveLeftInsideMapWalk", PacketBuilder.CreateMovement(210, 156, 14, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionTeleportMoveRightInsideMapWalk", PacketBuilder.CreateMovement(51, 53, 16, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionTeleportMoveUpdateInsideMapWalk", PacketBuilder.CreateMovement(90, 150, 1, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionTeleportMoveEscapeInsideMapWalk", PacketBuilder.CreateMovement(87, 43, 7, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_ESCAPE, true)));
results.Add(Test("Movement_DirectionNoneMoveUpInsideMapWalk", PacketBuilder.CreateMovement(100, 131, 10, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionNoneMoveDownInsideMapWalk", PacketBuilder.CreateMovement(123, 170, 12, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionNoneMoveLeftInsideMapWalk", PacketBuilder.CreateMovement(210, 156, 14, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionNoneMoveRightInsideMapWalk", PacketBuilder.CreateMovement(51, 53, 16, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionNoneMoveUpdateInsideMapWalk", PacketBuilder.CreateMovement(90, 150, 1, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionNoneMoveEscapeInsideMapWalk", PacketBuilder.CreateMovement(87, 43, 7, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_ESCAPE, true)));
// walk = false
results.Add(Test("Movement_DirectionUpMoveUpInsideMap", PacketBuilder.CreateMovement(100, 131, 10, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionUpMoveDownInsideMap", PacketBuilder.CreateMovement(123, 170, 12, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionUpMoveLeftInsideMap", PacketBuilder.CreateMovement(210, 156, 14, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionUpMoveRightInsideMap", PacketBuilder.CreateMovement(51, 53, 16, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionUpMoveUpdateInsideMap", PacketBuilder.CreateMovement(90, 150, 1, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionUpMoveEscapeInsideMap", PacketBuilder.CreateMovement(87, 43, 7, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_ESCAPE, false)));
results.Add(Test("Movement_DirectionDownMoveUpInsideMap", PacketBuilder.CreateMovement(100, 131, 10, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionDownMoveDownInsideMap", PacketBuilder.CreateMovement(123, 170, 12, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionDownMoveLeftInsideMap", PacketBuilder.CreateMovement(210, 156, 14, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionDownMoveRightInsideMap", PacketBuilder.CreateMovement(51, 53, 16, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionDownMoveUpdateInsideMap", PacketBuilder.CreateMovement(90, 150, 1, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionDownMoveEscapeInsideMap", PacketBuilder.CreateMovement(87, 43, 7, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_ESCAPE, false)));
results.Add(Test("Movement_DirectionLeftMoveUpInsideMap", PacketBuilder.CreateMovement(100, 131, 10, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionLeftMoveDownInsideMap", PacketBuilder.CreateMovement(123, 170, 12, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionLeftMoveLeftInsideMap", PacketBuilder.CreateMovement(210, 156, 14, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionLeftMoveRightInsideMap", PacketBuilder.CreateMovement(51, 53, 16, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionLeftMoveUpdateInsideMap", PacketBuilder.CreateMovement(90, 150, 1, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionLeftMoveEscapeInsideMap", PacketBuilder.CreateMovement(87, 43, 7, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_ESCAPE, false)));
results.Add(Test("Movement_DirectionRightMoveUpInsideMap", PacketBuilder.CreateMovement(100, 131, 10, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionRightMoveDownInsideMap", PacketBuilder.CreateMovement(123, 170, 12, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionRightMoveLeftInsideMap", PacketBuilder.CreateMovement(210, 156, 14, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionRightMoveRightInsideMap", PacketBuilder.CreateMovement(51, 53, 16, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionRightMoveUpdateInsideMap", PacketBuilder.CreateMovement(90, 150, 1, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionRightMoveEscapeInsideMap", PacketBuilder.CreateMovement(87, 43, 7, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_ESCAPE, false)));
results.Add(Test("Movement_DirectionTeleportMoveUpInsideMap", PacketBuilder.CreateMovement(100, 131, 10, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionTeleportMoveDownInsideMap", PacketBuilder.CreateMovement(123, 170, 12, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionTeleportMoveLeftInsideMap", PacketBuilder.CreateMovement(210, 156, 14, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionTeleportMoveRightInsideMap", PacketBuilder.CreateMovement(51, 53, 16, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionTeleportMoveUpdateInsideMap", PacketBuilder.CreateMovement(90, 150, 1, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionTeleportMoveEscapeInsideMap", PacketBuilder.CreateMovement(87, 43, 7, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_ESCAPE, false)));
results.Add(Test("Movement_DirectionNoneMoveUpInsideMap", PacketBuilder.CreateMovement(100, 131, 10, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionNoneMoveDownInsideMap", PacketBuilder.CreateMovement(123, 170, 12, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionNoneMoveLeftInsideMap", PacketBuilder.CreateMovement(210, 156, 14, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionNoneMoveRightInsideMap", PacketBuilder.CreateMovement(51, 53, 16, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionNoneMoveUpdateInsideMap", PacketBuilder.CreateMovement(90, 150, 1, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionNoneMoveEscapeInsideMap", PacketBuilder.CreateMovement(87, 43, 7, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_ESCAPE, false)));
/*
* Test Outside Map (From Top)
*/
results.Add(Test("Movement_DirectionUpMoveUpOutsideMapTopWalk", PacketBuilder.CreateMovement(-100, -131, 10, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionUpMoveDownOutsideMapTopWalk", PacketBuilder.CreateMovement(-123, -170, 12, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionUpMoveLeftOutsideMapTopWalk", PacketBuilder.CreateMovement(-210, -156, 14, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionUpMoveRightOutsideMapTopWalk", PacketBuilder.CreateMovement(-51, -53, 16, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionUpMoveUpdateOutsideMapTopWalk", PacketBuilder.CreateMovement(-90, -150, 1, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionUpMoveEscapeOutsideMapTopWalk", PacketBuilder.CreateMovement(-87, -43, 7, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_ESCAPE, true)));
results.Add(Test("Movement_DirectionDownMoveUpOutsideMapTopWalk", PacketBuilder.CreateMovement(-100, -131, 10, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionDownMoveDownOutsideMapTopWalk", PacketBuilder.CreateMovement(-123, -170, 12, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionDownMoveLeftOutsideMapTopWalk", PacketBuilder.CreateMovement(-210, -156, 14, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionDownMoveRightOutsideMapTopWalk", PacketBuilder.CreateMovement(-51, -53, 16, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionDownMoveUpdateOutsideMapTopWalk", PacketBuilder.CreateMovement(-90, -150, 1, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionDownMoveEscapeOutsideMapTopWalk", PacketBuilder.CreateMovement(-87, -43, 7, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_ESCAPE, true)));
results.Add(Test("Movement_DirectionLeftMoveUpOutsideMapTopWalk", PacketBuilder.CreateMovement(-100, -131, 10, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionLeftMoveDownOutsideMapTopWalk", PacketBuilder.CreateMovement(-123, -170, 12, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionLeftMoveLeftOutsideMapTopWalk", PacketBuilder.CreateMovement(-210, -156, 14, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionLeftMoveRightOutsideMapTopWalk", PacketBuilder.CreateMovement(-51, -53, 16, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionLeftMoveUpdateOutsideMapTopWalk", PacketBuilder.CreateMovement(-90, -150, 1, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionLeftMoveEscapeOutsideMapTopWalk", PacketBuilder.CreateMovement(-87, -43, 7, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_ESCAPE, true)));
results.Add(Test("Movement_DirectionRightMoveUpOutsideMapTopWalk", PacketBuilder.CreateMovement(-100, -131, 10, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionRightMoveDownOutsideMapTopWalk", PacketBuilder.CreateMovement(-123, -170, 12, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionRightMoveLeftOutsideMapTopWalk", PacketBuilder.CreateMovement(-210, -156, 14, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionRightMoveRightOutsideMapTopWalk", PacketBuilder.CreateMovement(-51, -53, 16, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionRightMoveUpdateOutsideMapTopWalk", PacketBuilder.CreateMovement(-90, -150, 1, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionRightMoveEscapeOutsideMapTopWalk", PacketBuilder.CreateMovement(-87, -43, 7, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_ESCAPE, true)));
results.Add(Test("Movement_DirectionTeleportMoveUpOutsideMapTopWalk", PacketBuilder.CreateMovement(-100, -131, 10, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionTeleportMoveDownOutsideMapTopWalk", PacketBuilder.CreateMovement(-123, -170, 12, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionTeleportMoveLeftOutsideMapTopWalk", PacketBuilder.CreateMovement(-210, -156, 14, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionTeleportMoveRightOutsideMapTopWalk", PacketBuilder.CreateMovement(-51, -53, 16, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionTeleportMoveUpdateOutsideMapTopWalk", PacketBuilder.CreateMovement(-90, -150, 1, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionTeleportMoveEscapeOutsideMapTopWalk", PacketBuilder.CreateMovement(-87, -43, 7, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_ESCAPE, true)));
results.Add(Test("Movement_DirectionNoneMoveUpOutsideMapTopWalk", PacketBuilder.CreateMovement(-100, -131, 10, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionNoneMoveDownOutsideMapTopWalk", PacketBuilder.CreateMovement(-123, -170, 12, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionNoneMoveLeftOutsideMapTopWalk", PacketBuilder.CreateMovement(-210, -156, 14, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionNoneMoveRightOutsideMapTopWalk", PacketBuilder.CreateMovement(-51, -53, 16, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionNoneMoveUpdateOutsideMapTopWalk", PacketBuilder.CreateMovement(-90, -150, 1, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionNoneMoveEscapeOutsideMapTopWalk", PacketBuilder.CreateMovement(-87, -43, 7, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_ESCAPE, true)));
// walk = false
results.Add(Test("Movement_DirectionUpMoveUpOutsideMapTop", PacketBuilder.CreateMovement(-100, -131, 10, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionUpMoveDownOutsideMapTop", PacketBuilder.CreateMovement(-123, -170, 12, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionUpMoveLeftOutsideMapTop", PacketBuilder.CreateMovement(-210, -156, 14, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionUpMoveRightOutsideMapTop", PacketBuilder.CreateMovement(-51, -53, 16, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionUpMoveUpdateOutsideMapTop", PacketBuilder.CreateMovement(-90, -150, 1, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionUpMoveEscapeOutsideMapTop", PacketBuilder.CreateMovement(-87, -43, 7, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_ESCAPE, false)));
results.Add(Test("Movement_DirectionDownMoveUpOutsideMapTop", PacketBuilder.CreateMovement(-100, -131, 10, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionDownMoveDownOutsideMapTop", PacketBuilder.CreateMovement(-123, -170, 12, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionDownMoveLeftOutsideMapTop", PacketBuilder.CreateMovement(-210, -156, 14, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionDownMoveRightOutsideMapTop", PacketBuilder.CreateMovement(-51, -53, 16, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionDownMoveUpdateOutsideMapTop", PacketBuilder.CreateMovement(-90, -150, 1, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionDownMoveEscapeOutsideMapTop", PacketBuilder.CreateMovement(-87, -43, 7, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_ESCAPE, false)));
results.Add(Test("Movement_DirectionLeftMoveUpOutsideMapTop", PacketBuilder.CreateMovement(-100, -131, 10, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionLeftMoveDownOutsideMapTop", PacketBuilder.CreateMovement(-123, -170, 12, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionLeftMoveLeftOutsideMapTop", PacketBuilder.CreateMovement(-210, -156, 14, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionLeftMoveRightOutsideMapTop", PacketBuilder.CreateMovement(-51, -53, 16, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionLeftMoveUpdateOutsideMapTop", PacketBuilder.CreateMovement(-90, -150, 1, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionLeftMoveEscapeOutsideMapTop", PacketBuilder.CreateMovement(-87, -43, 7, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_ESCAPE, false)));
results.Add(Test("Movement_DirectionRightMoveUpOutsideMapTop", PacketBuilder.CreateMovement(-100, -131, 10, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionRightMoveDownOutsideMapTop", PacketBuilder.CreateMovement(-123, -170, 12, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionRightMoveLeftOutsideMapTop", PacketBuilder.CreateMovement(-210, -156, 14, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionRightMoveRightOutsideMapTop", PacketBuilder.CreateMovement(-51, -53, 16, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionRightMoveUpdateOutsideMapTop", PacketBuilder.CreateMovement(-90, -150, 1, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionRightMoveEscapeOutsideMapTop", PacketBuilder.CreateMovement(-87, -43, 7, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_ESCAPE, false)));
results.Add(Test("Movement_DirectionTeleportMoveUpOutsideMapTop", PacketBuilder.CreateMovement(-100, -131, 10, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionTeleportMoveDownOutsideMapTop", PacketBuilder.CreateMovement(-123, -170, 12, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionTeleportMoveLeftOutsideMapTop", PacketBuilder.CreateMovement(-210, -156, 14, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionTeleportMoveRightOutsideMapTop", PacketBuilder.CreateMovement(-51, -53, 16, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionTeleportMoveUpdateOutsideMapTop", PacketBuilder.CreateMovement(-90, -150, 1, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionTeleportMoveEscapeOutsideMapTop", PacketBuilder.CreateMovement(-87, -43, 7, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_ESCAPE, false)));
results.Add(Test("Movement_DirectionNoneMoveUpOutsideMapTop", PacketBuilder.CreateMovement(-100, -131, 10, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionNoneMoveDownOutsideMapTop", PacketBuilder.CreateMovement(-123, -170, 12, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionNoneMoveLeftOutsideMapTop", PacketBuilder.CreateMovement(-210, -156, 14, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionNoneMoveRightOutsideMapTop", PacketBuilder.CreateMovement(-51, -53, 16, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionNoneMoveUpdateOutsideMapTop", PacketBuilder.CreateMovement(-90, -150, 1, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionNoneMoveEscapeOutsideMapTop", PacketBuilder.CreateMovement(-87, -43, 7, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_ESCAPE, false)));
/*
* Test Outside Map (From Bottom)
*/
results.Add(Test("Movement_DirectionUpMoveUpOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+100, Map.Height+131, 10, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionUpMoveDownOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+123, Map.Height+170, 12, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionUpMoveLeftOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+210, Map.Height+156, 14, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionUpMoveRightOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+51, Map.Height+53, 16, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionUpMoveUpdateOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+90, Map.Height+150, 1, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionUpMoveEscapeOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+87, Map.Height+43, 7, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_ESCAPE, true)));
results.Add(Test("Movement_DirectionDownMoveUpOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+100, Map.Height+131, 10, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionDownMoveDownOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+123, Map.Height+170, 12, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionDownMoveLeftOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+210, Map.Height+156, 14, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionDownMoveRightOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+51, Map.Height+53, 16, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionDownMoveUpdateOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+90, Map.Height+150, 1, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionDownMoveEscapeOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+87, Map.Height+43, 7, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_ESCAPE, true)));
results.Add(Test("Movement_DirectionLeftMoveUpOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+100, Map.Height+131, 10, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionLeftMoveDownOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+123, Map.Height+170, 12, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionLeftMoveLeftOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+210, Map.Height+156, 14, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionLeftMoveRightOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+51, Map.Height+53, 16, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionLeftMoveUpdateOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+90, Map.Height+150, 1, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionLeftMoveEscapeOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+87, Map.Height+43, 7, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_ESCAPE, true)));
results.Add(Test("Movement_DirectionRightMoveUpOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+100, Map.Height+131, 10, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionRightMoveDownOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+123, Map.Height+170, 12, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionRightMoveLeftOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+210, Map.Height+156, 14, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionRightMoveRightOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+51, Map.Height+53, 16, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionRightMoveUpdateOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+90, Map.Height+150, 1, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionRightMoveEscapeOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+87, Map.Height+43, 7, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_ESCAPE, true)));
results.Add(Test("Movement_DirectionTeleportMoveUpOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+100, Map.Height+131, 10, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionTeleportMoveDownOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+123, Map.Height+170, 12, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionTeleportMoveLeftOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+210, Map.Height+156, 14, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionTeleportMoveRightOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+51, Map.Height+53, 16, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionTeleportMoveUpdateOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+90, Map.Height+150, 1, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionTeleportMoveEscapeOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+87, Map.Height+43, 7, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_ESCAPE, true)));
results.Add(Test("Movement_DirectionNoneMoveUpOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+100, Map.Height+131, 10, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_UP, true)));
results.Add(Test("Movement_DirectionNoneMoveDownOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+123, Map.Height+170, 12, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_DOWN, true)));
results.Add(Test("Movement_DirectionNoneMoveLeftOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+210, Map.Height+156, 14, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_LEFT, true)));
results.Add(Test("Movement_DirectionNoneMoveRightOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+51, Map.Height+53, 16, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_RIGHT, true)));
results.Add(Test("Movement_DirectionNoneMoveUpdateOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+90, Map.Height+150, 1, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_UPDATE, true)));
results.Add(Test("Movement_DirectionNoneMoveEscapeOutsideMapBottomWalk", PacketBuilder.CreateMovement(Map.Width+87, Map.Height+43, 7, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_ESCAPE, true)));
// walk = false
results.Add(Test("Movement_DirectionUpMoveUpOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+100, Map.Height+131, 10, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionUpMoveDownOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+123, Map.Height+170, 12, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionUpMoveLeftOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+210, Map.Height+156, 14, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionUpMoveRightOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+51, Map.Height+53, 16, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionUpMoveUpdateOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+90, Map.Height+150, 1, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionUpMoveEscapeOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+87, Map.Height+43, 7, PacketBuilder.DIRECTION_UP, PacketBuilder.MOVE_ESCAPE, false)));
results.Add(Test("Movement_DirectionDownMoveUpOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+100, Map.Height+131, 10, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionDownMoveDownOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+123, Map.Height+170, 12, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionDownMoveLeftOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+210, Map.Height+156, 14, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionDownMoveRightOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+51, Map.Height+53, 16, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionDownMoveUpdateOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+90, Map.Height+150, 1, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionDownMoveEscapeOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+87, Map.Height+43, 7, PacketBuilder.DIRECTION_DOWN, PacketBuilder.MOVE_ESCAPE, false)));
results.Add(Test("Movement_DirectionLeftMoveUpOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+100, Map.Height+131, 10, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionLeftMoveDownOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+123, Map.Height+170, 12, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionLeftMoveLeftOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+210, Map.Height+156, 14, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionLeftMoveRightOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+51, Map.Height+53, 16, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionLeftMoveUpdateOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+90, Map.Height+150, 1, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionLeftMoveEscapeOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+87, Map.Height+43, 7, PacketBuilder.DIRECTION_LEFT, PacketBuilder.MOVE_ESCAPE, false)));
results.Add(Test("Movement_DirectionRightMoveUpOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+100, Map.Height+131, 10, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionRightMoveDownOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+123, Map.Height+170, 12, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionRightMoveLeftOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+210, Map.Height+156, 14, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionRightMoveRightOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+51, Map.Height+53, 16, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionRightMoveUpdateOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+90, Map.Height+150, 1, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionRightMoveEscapeOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+87, Map.Height+43, 7, PacketBuilder.DIRECTION_RIGHT, PacketBuilder.MOVE_ESCAPE, false)));
results.Add(Test("Movement_DirectionTeleportMoveUpOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+100, Map.Height+131, 10, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionTeleportMoveDownOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+123, Map.Height+170, 12, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionTeleportMoveLeftOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+210, Map.Height+156, 14, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionTeleportMoveRightOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+51, Map.Height+53, 16, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionTeleportMoveUpdateOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+90, Map.Height+150, 1, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionTeleportMoveEscapeOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+87, Map.Height+43, 7, PacketBuilder.DIRECTION_TELEPORT, PacketBuilder.MOVE_ESCAPE, false)));
results.Add(Test("Movement_DirectionNoneMoveUpOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+100, Map.Height+131, 10, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_UP, false)));
results.Add(Test("Movement_DirectionNoneMoveDownOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+123, Map.Height+170, 12, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_DOWN, false)));
results.Add(Test("Movement_DirectionNoneMoveLeftOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+210, Map.Height+156, 14, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_LEFT, false)));
results.Add(Test("Movement_DirectionNoneMoveRightOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+51, Map.Height+53, 16, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_RIGHT, false)));
results.Add(Test("Movement_DirectionNoneMoveUpdateOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+90, Map.Height+150, 1, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_UPDATE, false)));
results.Add(Test("Movement_DirectionNoneMoveEscapeOutsideMapBottom", PacketBuilder.CreateMovement(Map.Width+87, Map.Height+43, 7, PacketBuilder.DIRECTION_NONE, PacketBuilder.MOVE_ESCAPE, false)));
// Test Place Data Packet
results.Add(Test("PlaceData", PacketBuilder.CreatePlaceData(World.Isles.ToArray(), World.Towns.ToArray(), World.Areas.ToArray())));
// Test Player Update
results.Add(Test("PlayerInfoUpdateOrCreate", PacketBuilder.CreatePlayerInfoUpdateOrCreate(100, 200, PacketBuilder.DIRECTION_UP, 10, "Li")));
results.Add(Test("PlayerLeave", PacketBuilder.CreatePlayerLeave("Li")));
// Test PlaySound Packet
results.Add(Test("PlaySound", PacketBuilder.CreatePlaySound("PM")));
// Test Profile Page
results.Add(Test("ProfilePage", PacketBuilder.CreateProfilePage("TRANS RIGHTS ARE HUMAN RIGHTS")));
// Test SecCode
results.Add(Test("SecCode_AdminMod", PacketBuilder.CreateSecCode(new byte[] { 0x31, 0x52, 0x22 }, 0x34, true, true)));
results.Add(Test("SecCode_Admin", PacketBuilder.CreateSecCode(new byte[] { 0x54, 0x32, 0x24 }, 0x34, true, false)));
results.Add(Test("SecCode_Mod", PacketBuilder.CreateSecCode(new byte[] { 0x22, 0x12, 0x12 }, 0x34, false, true)));
results.Add(Test("SecCode_User", PacketBuilder.CreateSecCode(new byte[] { 0x12, 0x32, 0x14 }, 0x34, false, false)));
// Test SwfModule
results.Add(Test("SwfModule_Force", PacketBuilder.CreateSwfModule("test.swf", PacketBuilder.PACKET_SWF_MODULE_FORCE)));
results.Add(Test("SwfModule_Gentle", PacketBuilder.CreateSwfModule("test.swf", PacketBuilder.PACKET_SWF_MODULE_GENTLE)));
results.Add(Test("SwfModule_Cutscene", PacketBuilder.CreateSwfModule("test.swf", PacketBuilder.PACKET_SWF_MODULE_CUTSCENE)));
// Test TileClickInfo
results.Add(Test("TileClickInfo", PacketBuilder.CreateTileClickInfo("Trans Rights Are Human Rights")));
// Test TileOverlayFlags
//results.Add(Test("TileOverlayFlags", PacketBuilder.CreateTileOverlayFlags(new int[] { 1, 2, 3, 1, 2, 3, 1, 2, 3 })));
// Test TimeAndWeatherUpdate
results.Add(Test("TimeAndWeatherUpdate", PacketBuilder.CreateTimeAndWeatherUpdate(10, 4, 541, "SUNNY")));
results.Add(Test("WeatherUpdate", PacketBuilder.CreateWeatherUpdate("CLOUD")));
#if GENERATE
string resultsStr = JsonConvert.SerializeObject(knownGoodPackets, Formatting.Indented);
File.WriteAllText("test.json", resultsStr);
#endif
foreach(bool result in results)
{
if (result == false)
return false;
}
return true;
}
}
}

View file

@ -0,0 +1,40 @@
using HISP.Server;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HISP.Tests.UnitTests
{
public class ServerStartTest
{
public static void OnShutdown()
{
ResultLogger.LogTestStatus(false, "START_SERVER", "OnShutdown called");
}
public static void LogStdout(bool error, string type, string text)
{
if (type == "CRASH")
ResultLogger.LogTestStatus(false, "START_SERVER", text);
}
public static bool RunServerStartTest()
{
try
{
Logger.SetCallback(LogStdout);
Entry.SetShutdownCallback(OnShutdown);
Entry.Start();
ResultLogger.LogTestStatus(true, "START_SERVER_TEST", "Success.");
return true;
}
catch (Exception e)
{
ResultLogger.LogTestStatus(false, "START_SERVER_TEST", e.Message);
return false;
}
}
}
}

View file

@ -0,0 +1,248 @@
using HISP.Game;
using HISP.Game.Horse;
using HISP.Game.Items;
using HISP.Player;
using HISP.Security;
using HISP.Server;
using HISP.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace HISP.Tests.UnitTests
{
public class UserTest
{
private const string ALLOWED_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
private static byte[] createLoginPacket(string username, string password)
{
byte[] loginInformation = Encoding.UTF8.GetBytes("91|" + Authentication.EncryptLogin(username) + "|" + Authentication.EncryptLogin(password) + "|");
byte[] loginPacket = new byte[1 * 3 + loginInformation.Length];
loginPacket[0] = PacketBuilder.PACKET_LOGIN;
loginPacket[loginPacket.Length - 2] = PacketBuilder.PACKET_CLIENT_TERMINATOR;
loginPacket[loginPacket.Length - 1] = 0;
Array.ConstrainedCopy(loginInformation, 0, loginPacket, 1, loginInformation.Length);
return loginPacket;
}
private static byte[] createUserInfoPacket()
{
byte[] packet = new byte[] { PacketBuilder.PACKET_LOGIN, PacketBuilder.PACKET_CLIENT_TERMINATOR, 0};
return packet;
}
public static bool Test(string testName, object value, object valueComp)
{
bool result = value.Equals(valueComp);
if (result)
ResultLogger.LogTestStatus(true, "USER_TEST "+testName, "Success.");
else
ResultLogger.LogTestResult(false, "USER_TEST " + testName, value.ToString(), valueComp.ToString());
return result;
}
private static async Task<byte[]> receiveAsync(Socket s)
{
byte[] buffer = new byte[s.Available];
await s.ReceiveAsync(buffer);
return buffer;
}
public static async Task<bool> RunUserTest()
{
List<bool> results = new List<bool>();
string username = Helper.RandomString(ALLOWED_CHARS);
string password = Helper.RandomString(ALLOWED_CHARS);
int userId = Authentication.CreateAccount(username, password, "GENDERFLUID", true, true);
// Connect to running server via TCP;
using (Socket hispServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
// This is already a pretty good unit test; confirming we can actually login to the game,
try
{
await hispServer.ConnectAsync("127.0.0.1", ConfigReader.Port);
// Login to the game;
await hispServer.SendAsync(createLoginPacket(username, password));
await receiveAsync(hispServer);
await hispServer.SendAsync(createUserInfoPacket());
await receiveAsync(hispServer);
ResultLogger.LogTestStatus(true, "GAME_LOGIN_TEST", "Success.");
}
catch (Exception e)
{
ResultLogger.LogTestStatus(false, "GAME_LOGIN_TEST", e.Message);
return false;
}
// While were here; lets do a bunch of tests on HISPs "User" object.
User user = GameServer.GetUserById(userId);
// Test Maximums
user.SetMoney(Int32.MaxValue);
user.AddMoney(1000);
results.Add(Test("MoneyOverflow", user.Money, Int32.MaxValue));
user.Hunger = 8000;
results.Add(Test("HungerMaximumEnforcement", user.Hunger, 1000));
user.Hunger = -8000;
results.Add(Test("HungerMinimumEnforcement", user.Hunger, 0));
user.Thirst = 8000;
results.Add(Test("ThirstMaximumEnforcement", user.Thirst, 1000));
user.Thirst = -8000;
results.Add(Test("ThirstMinimumEnforcement", user.Thirst, 0));
user.Tiredness = 8000;
results.Add(Test("TirednessMaximumEnforcement", user.Tiredness, 1000));
user.Tiredness = -8000;
results.Add(Test("TirednessMinimumEnforcement", user.Tiredness, 0));
user.BankMoney = 9999999999.9999;
user.BankMoney += 1000.0;
results.Add(Test("BankMoneyMaximumEnforcement", user.BankMoney, 9999999999.9999));
user.BankInterest = 9999999999.9999;
user.BankInterest += 1000.0;
results.Add(Test("BankInterestMaximumEnforcement", user.BankInterest, 9999999999.9999));
// Test Gender Setting
user.Gender = "GENDERFLUID";
results.Add(Test("GenderedPronounsTestTheir", user.GetPronouns(true), Messages.PronounNeutralTheir));
results.Add(Test("GenderedPronounsTestThey", user.GetPronouns(false), Messages.PronounNeutralThey));
user.Gender = "MALE";
results.Add(Test("GenderedPronounsTestHis", user.GetPronouns(true), Messages.PronounMaleHis));
results.Add(Test("GenderedPronounsTestHe", user.GetPronouns(false), Messages.PronounMaleHe));
user.Gender = "FEMALE";
results.Add(Test("GenderedPronounsTestHer", user.GetPronouns(true), Messages.PronounFemaleHer));
results.Add(Test("GenderedPronounsTestShe", user.GetPronouns(false), Messages.PronounFemaleShe));
// Test icon
results.Add(Test("IconTestAdmin", user.GetPlayerListIcon(), Messages.AdminIcon));
user.Administrator = false;
results.Add(Test("IconTestModerator", user.GetPlayerListIcon(), Messages.ModeratorIcon));
user.Moderator = false;
results.Add(Test("IconTestNew", user.GetPlayerListIcon(), Messages.NewUserIcon));
user.NewPlayer = false;
results.Add(Test("IconTestNone", user.GetPlayerListIcon(), -1));
user.SubscribedUntil = DateTime.UtcNow.AddMonths(1);
user.Subscribed = true;
results.Add(Test("IconTest1Month", user.GetPlayerListIcon(), Messages.MonthSubscriptionIcon));
user.SubscribedUntil = DateTime.UtcNow.AddMonths(3);
results.Add(Test("IconTest3Month", user.GetPlayerListIcon(), Messages.ThreeMonthSubscripitionIcon));
user.SubscribedUntil = DateTime.UtcNow.AddYears(1).AddMonths(3);
results.Add(Test("IconTest1Year", user.GetPlayerListIcon(), Messages.YearSubscriptionIcon));
// SecCode
user.SecCodeSeeds[0] = 0x34;
user.SecCodeSeeds[1] = 0x39;
user.SecCodeSeeds[2] = 0x2a;
user.SecCodeInc = 0x3e;
byte[] expectedSecCodeResult = { 0x55, 0x3C, 0x4B, 0x58 };
byte[] gotSecCode = user.GenerateSecCode();
results.Add(Test("GenerateSecCode", gotSecCode.SequenceEqual(expectedSecCodeResult), true));
// Check max horses count
user.Subscribed = false;
results.Add(Test("UnsubbedMaxHorses", user.MaxHorses, 7));
user.Subscribed = true;
results.Add(Test("SubbedMaxHorses", user.MaxHorses, 11));
HorseInstance horse = new HorseInstance(HorseInfo.GetBreedById(170));
horse.BasicStats.Thirst = 0;
horse.BasicStats.Hunger = 0;
int horseId = horse.RandomId;
user.HorseInventory.AddHorse(horse);
/*
* Test Ranches
*/
// Give player ranch id 10
Ranch.GetRanchById(37).OwnerId = user.Id;
// Check ranch is now owned by that player, and propagates to user object.
results.Add(Test("GiveRanchTest", user.OwnedRanch.Id, 37));
results.Add(Test("HaveDorothyShoes", user.Inventory.HasItemId(Item.DorothyShoes), true));
// Ranch upgrade test
foreach(Ranch.RanchUpgrade upgrade in Ranch.RanchUpgrade.RanchUpgrades)
{
int id = upgrade.Id;
user.OwnedRanch.UpgradedLevel = id;
}
// Test swf
results.Add(Test("RanchSwfMine", user.OwnedRanch.GetSwf(true), "ranchviewer.swf?H=10&B1=11&B2=&B3=&B4=&B5=&B6=&B7=&B8=&B9=&B10=&B11=&B12=&B13=&B14=&B15=&B16=&MINE=1"));
results.Add(Test("RanchSwf", user.OwnedRanch.GetSwf(false), "ranchviewer.swf?H=10&B1=11&B2=&B3=&B4=&B5=&B6=&B7=&B8=&B9=&B10=&B11=&B12=&B13=&B14=&B15=&B16="));
// Test Ranch Building Functionality
// Test Barn
user.OwnedRanch.SetBuilding(0, Ranch.RanchBuilding.GetRanchBuildingById(1)); // Barn
results.Add(Test("RanchBarnMaxHorses", user.MaxHorses, 11 + 4));
// Test Water Well
user.OwnedRanch.SetBuilding(0, Ranch.RanchBuilding.GetRanchBuildingById(2)); // Water Well
user.Teleport(user.OwnedRanch.X, user.OwnedRanch.Y);
results.Add(Test("RanchWaterWellWatering", user.HorseInventory.GetHorseById(horseId).BasicStats.Thirst, 1000));
// Test Grain Silo
user.OwnedRanch.SetBuilding(0, Ranch.RanchBuilding.GetRanchBuildingById(3)); // Grain Silo
user.Teleport(user.OwnedRanch.X, user.OwnedRanch.Y);
results.Add(Test("RanchGrainSiloFeeding", user.HorseInventory.GetHorseById(horseId).BasicStats.Hunger, 1000));
// Set building id 0 to a big barn
user.OwnedRanch.SetBuilding(0, Ranch.RanchBuilding.GetRanchBuildingById(10)); // Big Barn
results.Add(Test("RanchBigBarnMaxHorses", user.MaxHorses, 11 + 8));
// Set building id 0 to a gold barn
user.OwnedRanch.SetBuilding(0, Ranch.RanchBuilding.GetRanchBuildingById(11)); // Gold Barn
results.Add(Test("RanchGoldBarnMaxHorses", user.MaxHorses, 11 + 12));
foreach (bool result in results)
if (!result)
return false;
return true;
}
}
}
}

View file

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View file

@ -1,748 +0,0 @@
"DeployProject"
{
"VSVersion" = "3:800"
"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
"IsWebType" = "8:FALSE"
"ProjectName" = "8:Installer"
"LanguageId" = "3:1033"
"CodePage" = "3:1252"
"UILanguageId" = "3:1033"
"SccProjectName" = "8:"
"SccLocalPath" = "8:"
"SccAuxPath" = "8:"
"SccProvider" = "8:"
"Hierarchy"
{
"Entry"
{
"MsmKey" = "8:_7686E608D62344A3B6FD5C91755693AA"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_C3608492E4D74B8683DE9CB3B3DE5D8A"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
}
"Configurations"
{
"Windows"
{
"DisplayName" = "8:Windows"
"IsDebugOnly" = "11:FALSE"
"IsReleaseOnly" = "11:TRUE"
"OutputFilename" = "8:Windows\\HISP-N00BS.msi"
"PackageFilesAs" = "3:2"
"PackageFileSize" = "3:-2147483648"
"CabType" = "3:1"
"Compression" = "3:3"
"SignOutput" = "11:FALSE"
"CertificateFile" = "8:"
"PrivateKeyFile" = "8:"
"TimeStampServer" = "8:"
"InstallerBootstrapper" = "3:2"
"BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
{
"Enabled" = "11:TRUE"
"PromptEnabled" = "11:TRUE"
"PrerequisitesLocation" = "2:1"
"Url" = "8:"
"ComponentsUrl" = "8:"
"Items"
{
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.7.2"
{
"Name" = "8:Microsoft .NET Framework 4.7.2 (x86 and x64)"
"ProductCode" = "8:.NETFramework,Version=v4.7.2"
}
}
}
}
}
"Deployable"
{
"CustomAction"
{
}
"DefaultFeature"
{
"Name" = "8:DefaultFeature"
"Title" = "8:"
"Description" = "8:"
}
"ExternalPersistence"
{
"LaunchCondition"
{
"{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_5202EFE80DEE4723BF89431D6D801282"
{
"Name" = "8:.NET Core"
"Message" = "8:[VSDNETCOREMSG]"
"AllowLaterVersions" = "11:FALSE"
"InstallUrl" = "8:https://dotnet.microsoft.com/download/dotnet-core/[NetCoreVerMajorDotMinor]"
"IsNETCore" = "11:TRUE"
"Architecture" = "2:0"
"Runtime" = "2:0"
}
}
}
"File"
{
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_C3608492E4D74B8683DE9CB3B3DE5D8A"
{
"SourcePath" = "8:..\\N00BS\\icon.ico"
"TargetName" = "8:icon.ico"
"Tag" = "8:"
"Folder" = "8:_E3419B32123541589220537FB1154298"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
}
"FileType"
{
}
"Folder"
{
"{1525181F-901A-416C-8A58-119130FE478E}:_2BED5EC5191147F4815904695DFB5319"
{
"Name" = "8:#1916"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:DesktopFolder"
"Folders"
{
}
}
"{1525181F-901A-416C-8A58-119130FE478E}:_3B89F894B58B4F149DD0DBE5EC931BA2"
{
"Name" = "8:#1919"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:ProgramMenuFolder"
"Folders"
{
}
}
"{3C67513D-01DD-4637-8A68-80971EB9504F}:_E3419B32123541589220537FB1154298"
{
"DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]"
"Name" = "8:#1925"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:TARGETDIR"
"Folders"
{
}
}
}
"LaunchCondition"
{
}
"Locator"
{
}
"MsiBootstrapper"
{
"LangId" = "3:1033"
"RequiresElevation" = "11:FALSE"
}
"Product"
{
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:HISP-N00BS"
"ProductCode" = "8:{99C89A9F-08DD-46A7-93D3-A1097FF01E9D}"
"PackageCode" = "8:{150AB74C-78D9-4115-8BD0-ADE380F0C993}"
"UpgradeCode" = "8:{FAD2FB5F-7B7C-4293-BF2D-09384146449E}"
"AspNetVersion" = "8:2.0.50727.0"
"RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:TRUE"
"DetectNewerInstalledVersion" = "11:FALSE"
"InstallAllUsers" = "11:TRUE"
"ProductVersion" = "8:1.3.2"
"Manufacturer" = "8:IsleHorse"
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:"
"Title" = "8:HISP N00BS INSTALLER"
"Subject" = "8:"
"ARPCONTACT" = "8:SilicaAndPina"
"Keywords" = "8:"
"ARPCOMMENTS" = "8:Horse Isle Server Emulator (N00BS Package)"
"ARPURLINFOABOUT" = "8:islehorse.com"
"ARPPRODUCTICON" = "8:_C3608492E4D74B8683DE9CB3B3DE5D8A"
"ARPIconIndex" = "3:0"
"SearchPath" = "8:"
"UseSystemSearchPath" = "11:TRUE"
"TargetPlatform" = "3:0"
"PreBuildEvent" = "8:"
"PostBuildEvent" = "8:"
"RunPostBuildEvent" = "3:0"
}
"Registry"
{
"HKLM"
{
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_64C38CA6346B449692BF6B4AA592D702"
{
"Name" = "8:Software"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_AC38AB208C084DF4BA565F75F0BE4432"
{
"Name" = "8:[Manufacturer]"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
}
"Values"
{
}
}
}
"Values"
{
}
}
}
}
"HKCU"
{
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_A730B92ABA6442DA8A8DE8F8B12B006C"
{
"Name" = "8:Software"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_1DE78BC22BE74532BD96E9D0C76B8456"
{
"Name" = "8:[Manufacturer]"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
}
"Values"
{
}
}
}
"Values"
{
}
}
}
}
"HKCR"
{
"Keys"
{
}
}
"HKU"
{
"Keys"
{
}
}
"HKPU"
{
"Keys"
{
}
}
}
"Sequences"
{
}
"Shortcut"
{
"{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_2D6B5B28608E4FE5BD5E9AE8F9799C42"
{
"Name" = "8:HISP-N00BS"
"Arguments" = "8:"
"Description" = "8:"
"ShowCmd" = "3:1"
"IconIndex" = "3:0"
"Transitive" = "11:FALSE"
"Target" = "8:_7686E608D62344A3B6FD5C91755693AA"
"Folder" = "8:_3B89F894B58B4F149DD0DBE5EC931BA2"
"WorkingFolder" = "8:_E3419B32123541589220537FB1154298"
"Icon" = "8:_C3608492E4D74B8683DE9CB3B3DE5D8A"
"Feature" = "8:"
}
"{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_E1442F9672E44E8ABE7FF8CE91B674A0"
{
"Name" = "8:HISP-N00BS"
"Arguments" = "8:"
"Description" = "8:"
"ShowCmd" = "3:1"
"IconIndex" = "3:0"
"Transitive" = "11:FALSE"
"Target" = "8:_7686E608D62344A3B6FD5C91755693AA"
"Folder" = "8:_2BED5EC5191147F4815904695DFB5319"
"WorkingFolder" = "8:_E3419B32123541589220537FB1154298"
"Icon" = "8:_C3608492E4D74B8683DE9CB3B3DE5D8A"
"Feature" = "8:"
}
}
"UserInterface"
{
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_07CE736F4DA7413AAEC990B2E3F8E5E6"
{
"Name" = "8:#1900"
"Sequence" = "3:2"
"Attributes" = "3:1"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_090F0EE34745459F9686C050B2C11242"
{
"Sequence" = "3:200"
"DisplayName" = "8:Installation Folder"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_3DAE3EEA3A0D49A2BF44023DFA46DD1F"
{
"Sequence" = "3:300"
"DisplayName" = "8:Confirm Installation"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7E134743D03E4D2BAB1A4EFBBCFFB85A"
{
"Sequence" = "3:100"
"DisplayName" = "8:Welcome"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"CopyrightWarning"
{
"Name" = "8:CopyrightWarning"
"DisplayName" = "8:#1002"
"Description" = "8:#1102"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1202"
"DefaultValue" = "8:#1202"
"UsePlugInResources" = "11:TRUE"
}
"Welcome"
{
"Name" = "8:Welcome"
"DisplayName" = "8:#1003"
"Description" = "8:#1103"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1203"
"DefaultValue" = "8:#1203"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_1005C5ECDBA6463C8F26D022ADF2B15B"
{
"UseDynamicProperties" = "11:FALSE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_1B5CC2AD42AB4B8A871994A5BDA4AF2E"
{
"Name" = "8:#1901"
"Sequence" = "3:1"
"Attributes" = "3:2"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_13902A19FA564BEB9B78FA7710553B5D"
{
"Sequence" = "3:100"
"DisplayName" = "8:Progress"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"ShowProgress"
{
"Name" = "8:ShowProgress"
"DisplayName" = "8:#1009"
"Description" = "8:#1109"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_2D7F530E4D9144F7A17E26C070A09A38"
{
"Name" = "8:#1901"
"Sequence" = "3:2"
"Attributes" = "3:2"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_669ADC1422094131A197F6A6C9DBFF21"
{
"Sequence" = "3:100"
"DisplayName" = "8:Progress"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"ShowProgress"
{
"Name" = "8:ShowProgress"
"DisplayName" = "8:#1009"
"Description" = "8:#1109"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_34E02BE2018C46BBBBBFAD4ED87A477C"
{
"UseDynamicProperties" = "11:FALSE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_6CBD4A41E51D4CA3B91CA1BDB8AC6624"
{
"Name" = "8:#1902"
"Sequence" = "3:1"
"Attributes" = "3:3"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_01032F7BADD4495B95310569E9419B49"
{
"Sequence" = "3:100"
"DisplayName" = "8:Finished"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"UpdateText"
{
"Name" = "8:UpdateText"
"DisplayName" = "8:#1058"
"Description" = "8:#1158"
"Type" = "3:15"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1258"
"DefaultValue" = "8:#1258"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_A4FECCFE0E0A48748DB3E442DAEC4BDD"
{
"Name" = "8:#1902"
"Sequence" = "3:2"
"Attributes" = "3:3"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_4DACC92277D2418AA749B1DED80D4118"
{
"Sequence" = "3:100"
"DisplayName" = "8:Finished"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_EEB71AB6095340A5925C86FF3F54F56B"
{
"Name" = "8:#1900"
"Sequence" = "3:1"
"Attributes" = "3:1"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_812C2FA3E5F945D2B42F27AE98132D86"
{
"Sequence" = "3:300"
"DisplayName" = "8:Confirm Installation"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_82627D6985A9465F9963EA555AE205F1"
{
"Sequence" = "3:100"
"DisplayName" = "8:Welcome"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"CopyrightWarning"
{
"Name" = "8:CopyrightWarning"
"DisplayName" = "8:#1002"
"Description" = "8:#1102"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1202"
"DefaultValue" = "8:#1202"
"UsePlugInResources" = "11:TRUE"
}
"Welcome"
{
"Name" = "8:Welcome"
"DisplayName" = "8:#1003"
"Description" = "8:#1103"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1203"
"DefaultValue" = "8:#1203"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_FF55283F2CDE4642916803852163C654"
{
"Sequence" = "3:200"
"DisplayName" = "8:Installation Folder"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"InstallAllUsersVisible"
{
"Name" = "8:InstallAllUsersVisible"
"DisplayName" = "8:#1059"
"Description" = "8:#1159"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
}
"MergeModule"
{
}
"ProjectOutput"
{
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_7686E608D62344A3B6FD5C91755693AA"
{
"SourcePath" = "8:..\\N00BS\\obj\\x86\\Windows\\net7.0-windows\\win-x86\\apphost.exe"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_E3419B32123541589220537FB1154298"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
"ProjectOutputGroupRegister" = "3:1"
"OutputConfiguration" = "8:"
"OutputGroupCanonicalName" = "8:PublishItems"
"OutputProjectGuid" = "8:{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}"
"ShowKeyOutput" = "11:TRUE"
"PublishProfilePath" = "8:Properties\\PublishProfiles\\Win32.pubxml"
"ExcludeFilters"
{
}
}
}
}
}

3
HorseIsleServer/LibHISP/Game/AbuseReport.cs Normal file → Executable file
View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using HISP.Server;
using System.Collections.Generic;
namespace HISP.Game namespace HISP.Game
{ {
public class AbuseReport public class AbuseReport

24
HorseIsleServer/LibHISP/Game/Arena.cs Normal file → Executable file
View file

@ -2,7 +2,7 @@
using HISP.Player; using HISP.Player;
using HISP.Security; using HISP.Security;
using HISP.Server; using HISP.Server;
using HISP.Util;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -14,7 +14,7 @@ namespace HISP.Game
{ {
private static List<Arena> arenas = new List<Arena>(); private static List<Arena> arenas = new List<Arena>();
private List<ArenaEntry> entries; private ThreadSafeList<ArenaEntry> entries;
private Timer arenaTimeout; private Timer arenaTimeout;
public static int[] ExpRewards; public static int[] ExpRewards;
public int Id; public int Id;
@ -59,7 +59,7 @@ namespace HISP.Game
Slots = slots; Slots = slots;
Timeout = timeOut; Timeout = timeOut;
arenas.Add(this); arenas.Add(this);
entries = new List<ArenaEntry>(); entries = new ThreadSafeList<ArenaEntry>();
} }
public bool HaveAllPlayersCompleted() public bool HaveAllPlayersCompleted()
@ -201,10 +201,10 @@ namespace HISP.Game
break; break;
} }
byte[] startingUpEventPacket = PacketBuilder.CreateChat(message, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] startingUpEventPacket = PacketBuilder.CreateChat(message, PacketBuilder.CHAT_BOTTOM_RIGHT);
byte[] swfModulePacket = PacketBuilder.CreateSwfModulePacket(swf, PacketBuilder.PACKET_SWF_CUTSCENE); byte[] swfModulePacket = PacketBuilder.CreateSwfModule(swf, PacketBuilder.PACKET_SWF_MODULE_CUTSCENE);
Logger.DebugPrint(entry.EnteredUser.Username + " Loading swf: " + swf); Logger.DebugPrint(entry.EnteredUser.Username + " Loading swf: " + swf);
entry.EnteredUser.LoggedinClient.SendPacket(swfModulePacket); entry.EnteredUser.Client.SendPacket(swfModulePacket);
entry.EnteredUser.LoggedinClient.SendPacket(startingUpEventPacket); entry.EnteredUser.Client.SendPacket(startingUpEventPacket);
} }
arenaTimeout = new Timer(new TimerCallback(arenaTimedOut), null, Timeout * 60 * 1000, Timeout * 60 * 1000); arenaTimeout = new Timer(new TimerCallback(arenaTimedOut), null, Timeout * 60 * 1000, Timeout * 60 * 1000);
@ -275,7 +275,7 @@ namespace HISP.Game
try try
{ {
byte[] arenaResults = PacketBuilder.CreateChat(chatMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] arenaResults = PacketBuilder.CreateChat(chatMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
entry.EnteredUser.LoggedinClient.SendPacket(arenaResults); entry.EnteredUser.Client.SendPacket(arenaResults);
int expReward = expRewards[place]; int expReward = expRewards[place];
@ -289,7 +289,7 @@ namespace HISP.Game
byte[] youWinMessage = PacketBuilder.CreateChat(Messages.FormatArenaYouWinMessage(prize, expReward), PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] youWinMessage = PacketBuilder.CreateChat(Messages.FormatArenaYouWinMessage(prize, expReward), PacketBuilder.CHAT_BOTTOM_RIGHT);
entry.EnteredUser.LoggedinClient.SendPacket(youWinMessage); entry.EnteredUser.Client.SendPacket(youWinMessage);
// Awards: // Awards:
@ -327,7 +327,7 @@ namespace HISP.Game
entry.EnteredUser.Awards.AddAward(Award.GetAwardById(32)); // Perseverance entry.EnteredUser.Awards.AddAward(Award.GetAwardById(32)); // Perseverance
byte[] youDONTWinMessage = PacketBuilder.CreateChat(Messages.FormatArenaOnlyWinnerWinsMessage(expReward), PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] youDONTWinMessage = PacketBuilder.CreateChat(Messages.FormatArenaOnlyWinnerWinsMessage(expReward), PacketBuilder.CHAT_BOTTOM_RIGHT);
entry.EnteredUser.LoggedinClient.SendPacket(youDONTWinMessage); entry.EnteredUser.Client.SendPacket(youDONTWinMessage);
} }
place++; place++;
} }
@ -361,8 +361,8 @@ namespace HISP.Game
if (Entries.Length + 1 > Slots) if (Entries.Length + 1 > Slots)
{ {
byte[] enterFailed = PacketBuilder.CreateChat(Messages.ArenaFullErrorMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] enterFailed = PacketBuilder.CreateChat(Messages.ArenaFullErrorMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
user.LoggedinClient.SendPacket(enterFailed); user.Client.SendPacket(enterFailed);
GameServer.UpdateArea(user.LoggedinClient); GameServer.UpdateArea(user.Client);
return; return;
} }
} }
@ -378,7 +378,7 @@ namespace HISP.Game
user.TakeMoney(EntryCost); user.TakeMoney(EntryCost);
byte[] enteredIntoCompetition = PacketBuilder.CreateChat(Messages.ArenaEnteredInto, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] enteredIntoCompetition = PacketBuilder.CreateChat(Messages.ArenaEnteredInto, PacketBuilder.CHAT_BOTTOM_RIGHT);
user.LoggedinClient.SendPacket(enteredIntoCompetition); user.Client.SendPacket(enteredIntoCompetition);
GameServer.UpdateAreaForAll(user.X, user.Y, true); GameServer.UpdateAreaForAll(user.X, user.Y, true);
return; return;

0
HorseIsleServer/LibHISP/Game/Book.cs Normal file → Executable file
View file

View file

@ -1,94 +1,94 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using HISP.Player; using HISP.Player;
using HISP.Server; using HISP.Server;
namespace HISP.Game.Chat namespace HISP.Game.Chat
{ {
public class Chat public class ChatMsg
{ {
public struct Correction public struct Correction
{ {
public string FilteredWord; public string FilteredWord;
public string ReplacedWord; public string ReplacedWord;
} }
public struct Reason public struct Reason
{ {
public string Name; public string Name;
public string Message; public string Message;
} }
public struct Filter public struct Filter
{ {
public string FilteredWord; public string FilteredWord;
public Reason Reason; public Reason Reason;
public bool MatchAll; public bool MatchAll;
} }
public enum ChatChannel public enum ChatChannel
{ {
All = 0x14, All = 0x14,
Ads = 0x1D, Ads = 0x1D,
Near = 0x15, Near = 0x15,
Buddies = 0x17, Buddies = 0x17,
Here = 0x18, Here = 0x18,
Isle = 0x1A, Isle = 0x1A,
Dm = 0x16, Dm = 0x16,
Mod = 0x1c, Mod = 0x1c,
Admin = 0x1b Admin = 0x1b
} }
public static string PrivateMessageSound; public static string PrivateMessageSound;
private static List<Filter> filteredWords = new List<Filter>(); private static List<Filter> filteredWords = new List<Filter>();
private static List<Correction> correctedWords = new List<Correction>(); private static List<Correction> correctedWords = new List<Correction>();
private static List<Reason> reasons = new List<Reason>(); private static List<Reason> reasons = new List<Reason>();
public static void AddFilter(Filter filter) public static void AddFilter(Filter filter)
{ {
filteredWords.Add(filter); filteredWords.Add(filter);
} }
public static void AddCorrection(Correction correction) public static void AddCorrection(Correction correction)
{ {
correctedWords.Add(correction); correctedWords.Add(correction);
} }
public static void AddReason(Reason reason) public static void AddReason(Reason reason)
{ {
reasons.Add(reason); reasons.Add(reason);
} }
public static Filter[] FilteredWords public static Filter[] FilteredWords
{ {
get get
{ {
return filteredWords.ToArray(); return filteredWords.ToArray();
} }
} }
public static Correction[] CorrectedWords public static Correction[] CorrectedWords
{ {
get get
{ {
return correctedWords.ToArray(); return correctedWords.ToArray();
} }
} }
public static Reason[] Reasons public static Reason[] Reasons
{ {
get get
{ {
return reasons.ToArray(); return reasons.ToArray();
} }
} }
public static bool ProcessCommand(User user, string message) public static bool ProcessCommand(User user, string message)
{ {
if (message.Length < 1) if (message.Length < 1)
return false; return false;
string parsedMessage = message; string parsedMessage = message;
parsedMessage = parsedMessage.Trim(); parsedMessage = parsedMessage.Trim();
char cLetter = parsedMessage[0]; char cLetter = parsedMessage[0];
parsedMessage = parsedMessage.Substring(1).Trim(); parsedMessage = parsedMessage.Substring(1).Trim();
@ -102,408 +102,408 @@ namespace HISP.Game.Chat
if (parsedMessage.ToUpper(CultureInfo.InvariantCulture).StartsWith(cmd.CmdName)) if (parsedMessage.ToUpper(CultureInfo.InvariantCulture).StartsWith(cmd.CmdName))
{ {
string[] args = parsedMessage.Substring(cmd.CmdName.Length).Trim().Split(' '); string[] args = parsedMessage.Substring(cmd.CmdName.Length).Trim().Split(' ');
return cmd.CmdCallback(messageToGive, args, user); return cmd.Execute(messageToGive, args, user);
} }
} }
} }
return false; return false;
} }
public static Object FilterMessage(string message) // Handles chat filtering and violation stuffs public static Object FilterMessage(string message) // Handles chat filtering and violation stuffs
{ {
if (!ConfigReader.BadWords) // Freedom of Speech Mode if (!ConfigReader.EnableSwearFilter) // Freedom of Speech Mode
return null; return null;
string[] wordsSaid; string[] wordsSaid;
if (message.Contains(' ')) if (message.Contains(' '))
wordsSaid = message.Split(' '); wordsSaid = message.Split(' ');
else else
wordsSaid = new string[] { message }; wordsSaid = new string[] { message };
foreach(Filter filter in FilteredWords) foreach(Filter filter in FilteredWords)
{ {
if (!filter.MatchAll) if (!filter.MatchAll)
{ {
foreach (string word in wordsSaid) foreach (string word in wordsSaid)
{ {
if (word.ToLower() == filter.FilteredWord.ToLower()) if (word.ToLower() == filter.FilteredWord.ToLower())
return filter.Reason; return filter.Reason;
} }
} }
else else
{ {
if (message.ToLower().Contains(filter.FilteredWord)) if (message.ToLower().Contains(filter.FilteredWord))
return filter.Reason; return filter.Reason;
} }
} }
return null; return null;
} }
public static byte GetSide(ChatChannel channel) public static byte GetSide(ChatChannel channel)
{ {
switch (channel) switch (channel)
{ {
case ChatChannel.All: case ChatChannel.All:
case ChatChannel.Ads: case ChatChannel.Ads:
case ChatChannel.Isle: case ChatChannel.Isle:
return PacketBuilder.CHAT_BOTTOM_LEFT; return PacketBuilder.CHAT_BOTTOM_LEFT;
case ChatChannel.Buddies: case ChatChannel.Buddies:
case ChatChannel.Here: case ChatChannel.Here:
case ChatChannel.Admin: case ChatChannel.Admin:
case ChatChannel.Mod: case ChatChannel.Mod:
return PacketBuilder.CHAT_BOTTOM_RIGHT; return PacketBuilder.CHAT_BOTTOM_RIGHT;
case ChatChannel.Dm: case ChatChannel.Dm:
return PacketBuilder.CHAT_DM_RIGHT; return PacketBuilder.CHAT_DM_RIGHT;
default: default:
Logger.ErrorPrint("unknown channel: " + (byte)channel); Logger.ErrorPrint("unknown channel: " + (byte)channel);
return PacketBuilder.CHAT_BOTTOM_LEFT; return PacketBuilder.CHAT_BOTTOM_LEFT;
} }
} }
public static string GetDmRecipiant(string message) public static string GetDmRecipiant(string message)
{ {
if(message.Contains('|')) if(message.Contains('|'))
{ {
string recipiantName = message.Split('|')[0]; string recipiantName = message.Split('|')[0];
return recipiantName; return recipiantName;
} }
else else
{ {
return null; return null;
} }
} }
public static string GetDmMessage(string message) public static string GetDmMessage(string message)
{ {
if (message.Contains('|')) if (message.Contains('|'))
{ {
string messageStr = message.Split('|')[1]; string messageStr = message.Split('|')[1];
return messageStr; return messageStr;
} }
else else
{ {
return message; return message;
} }
} }
public static GameClient[] GetRecipiants(User user, ChatChannel channel, string to=null) public static GameClient[] GetRecipiants(User user, ChatChannel channel, string to=null)
{ {
if (channel == ChatChannel.All) if (channel == ChatChannel.All)
{ {
List<GameClient> recipiants = new List<GameClient>(); List<GameClient> recipiants = new List<GameClient>();
foreach (GameClient client in GameClient.ConnectedClients) foreach (GameClient client in GameClient.ConnectedClients)
{ {
if (client.LoggedIn) if (client.LoggedIn)
if (!client.LoggedinUser.MuteGlobal && !client.LoggedinUser.MuteAll) if (!client.User.MuteGlobal && !client.User.MuteAll)
if (client.LoggedinUser.Id != user.Id) if (client.User.Id != user.Id)
if(!client.LoggedinUser.MutePlayer.IsUserMuted(user)) if(!client.User.MutePlayer.IsUserMuted(user))
recipiants.Add(client); recipiants.Add(client);
} }
return recipiants.ToArray(); return recipiants.ToArray();
} }
if(channel == ChatChannel.Ads) if(channel == ChatChannel.Ads)
{ {
List<GameClient> recipiants = new List<GameClient>(); List<GameClient> recipiants = new List<GameClient>();
foreach (GameClient client in GameClient.ConnectedClients) foreach (GameClient client in GameClient.ConnectedClients)
{ {
if (client.LoggedIn) if (client.LoggedIn)
if (!client.LoggedinUser.MuteAds && !client.LoggedinUser.MuteAll) if (!client.User.MuteAds && !client.User.MuteAll)
if (client.LoggedinUser.Id != user.Id) if (client.User.Id != user.Id)
if (!client.LoggedinUser.MutePlayer.IsUserMuted(user)) if (!client.User.MutePlayer.IsUserMuted(user))
recipiants.Add(client); recipiants.Add(client);
} }
return recipiants.ToArray(); return recipiants.ToArray();
} }
if(channel == ChatChannel.Buddies) if(channel == ChatChannel.Buddies)
{ {
List<GameClient> recipiants = new List<GameClient>(); List<GameClient> recipiants = new List<GameClient>();
foreach (GameClient client in GameClient.ConnectedClients) foreach (GameClient client in GameClient.ConnectedClients)
{ {
if (client.LoggedIn) if (client.LoggedIn)
if (!client.LoggedinUser.MuteBuddy && !client.LoggedinUser.MuteAll) if (!client.User.MuteBuddy && !client.User.MuteAll)
if (client.LoggedinUser.Id != user.Id) if (client.User.Id != user.Id)
if (client.LoggedinUser.Friends.List.Contains(user.Id)) if (client.User.Friends.List.Contains(user.Id))
if (!client.LoggedinUser.MutePlayer.IsUserMuted(user)) if (!client.User.MutePlayer.IsUserMuted(user))
recipiants.Add(client); recipiants.Add(client);
} }
return recipiants.ToArray(); return recipiants.ToArray();
} }
if (channel == ChatChannel.Isle) if (channel == ChatChannel.Isle)
{ {
List<GameClient> recipiants = new List<GameClient>(); List<GameClient> recipiants = new List<GameClient>();
if(World.InIsle(user.X,user.Y)) if(World.InIsle(user.X,user.Y))
{ {
User[] usersInSile = GameServer.GetUsersInIsle(World.GetIsle(user.X, user.Y), true, false); User[] usersInSile = GameServer.GetUsersInIsle(World.GetIsle(user.X, user.Y), true, false);
foreach (User userInIsle in usersInSile) foreach (User userInIsle in usersInSile)
{ {
if (user.Id != userInIsle.Id) if (user.Id != userInIsle.Id)
if(!userInIsle.MuteAll && !userInIsle.MuteIsland) if(!userInIsle.MuteAll && !userInIsle.MuteIsland)
if(!userInIsle.MutePlayer.IsUserMuted(user)) if(!userInIsle.MutePlayer.IsUserMuted(user))
recipiants.Add(userInIsle.LoggedinClient); recipiants.Add(userInIsle.Client);
} }
return recipiants.ToArray(); return recipiants.ToArray();
} }
else else
{ {
return new GameClient[0]; return new GameClient[0];
} }
} }
if (channel == ChatChannel.Here) if (channel == ChatChannel.Here)
{ {
List<GameClient> recipiants = new List<GameClient>(); List<GameClient> recipiants = new List<GameClient>();
User[] usersHere = GameServer.GetUsersAt(user.X, user.Y, true, false); User[] usersHere = GameServer.GetUsersAt(user.X, user.Y, true, false);
foreach (User userHere in usersHere) foreach (User userHere in usersHere)
{ {
if (user.Id != userHere.Id) if (user.Id != userHere.Id)
if (!userHere.MuteAll && !userHere.MuteHere) if (!userHere.MuteAll && !userHere.MuteHere)
if (!userHere.MutePlayer.IsUserMuted(user)) if (!userHere.MutePlayer.IsUserMuted(user))
recipiants.Add(userHere.LoggedinClient); recipiants.Add(userHere.Client);
} }
return recipiants.ToArray(); return recipiants.ToArray();
} }
if (channel == ChatChannel.Near) if (channel == ChatChannel.Near)
{ {
List<GameClient> recipiants = new List<GameClient>(); List<GameClient> recipiants = new List<GameClient>();
User[] nearbyUsers = GameServer.GetNearbyUsers(user.X, user.Y, true, false); User[] nearbyUsers = GameServer.GetNearbyUsers(user.X, user.Y, true, false);
foreach (User nearbyUser in nearbyUsers) foreach (User nearbyUser in nearbyUsers)
{ {
if (user.Id != nearbyUser.Id) if (user.Id != nearbyUser.Id)
if (!nearbyUser.MuteAll && !nearbyUser.MuteNear) if (!nearbyUser.MuteAll && !nearbyUser.MuteNear)
if (!nearbyUser.MutePlayer.IsUserMuted(user)) if (!nearbyUser.MutePlayer.IsUserMuted(user))
recipiants.Add(nearbyUser.LoggedinClient); recipiants.Add(nearbyUser.Client);
} }
return recipiants.ToArray(); return recipiants.ToArray();
} }
if (channel == ChatChannel.Mod) if (channel == ChatChannel.Mod)
{ {
if (!user.Moderator && !user.Administrator) // No mod chat for non-mods! if (!user.Moderator && !user.Administrator) // No mod chat for non-mods!
{ {
Logger.WarnPrint(user.Username + " attempted to send in MOD chat, without being a MOD."); Logger.WarnPrint(user.Username + " attempted to send in MOD chat, without being a MOD.");
return new GameClient[0]; return new GameClient[0];
} }
List<GameClient> recipiants = new List<GameClient>(); List<GameClient> recipiants = new List<GameClient>();
foreach (GameClient client in GameClient.ConnectedClients) foreach (GameClient client in GameClient.ConnectedClients)
{ {
if (client.LoggedIn) if (client.LoggedIn)
if (client.LoggedinUser.Moderator) if (client.User.Moderator)
if (client.LoggedinUser.Id != user.Id) if (client.User.Id != user.Id)
recipiants.Add(client); recipiants.Add(client);
} }
return recipiants.ToArray(); return recipiants.ToArray();
} }
if(channel == ChatChannel.Admin) if(channel == ChatChannel.Admin)
{ {
if (!user.Administrator) // No admin chat for non-admins! if (!user.Administrator) // No admin chat for non-admins!
{ {
Logger.WarnPrint(user.Username + " attempted to send in ADMIN chat, without being an ADMIN."); Logger.WarnPrint(user.Username + " attempted to send in ADMIN chat, without being an ADMIN.");
return new GameClient[0]; return new GameClient[0];
} }
List<GameClient> recipiants = new List<GameClient>(); List<GameClient> recipiants = new List<GameClient>();
foreach (GameClient client in GameClient.ConnectedClients) foreach (GameClient client in GameClient.ConnectedClients)
{ {
if (client.LoggedIn) if (client.LoggedIn)
if (client.LoggedinUser.Administrator) if (client.User.Administrator)
if (client.LoggedinUser.Id != user.Id) if (client.User.Id != user.Id)
recipiants.Add(client); recipiants.Add(client);
} }
return recipiants.ToArray(); return recipiants.ToArray();
} }
if(channel == ChatChannel.Dm) if(channel == ChatChannel.Dm)
{ {
if (to != null && to != "") if (to != null && to != "")
{ {
List<GameClient> recipiants = new List<GameClient>(); List<GameClient> recipiants = new List<GameClient>();
foreach (GameClient client in GameClient.ConnectedClients) foreach (GameClient client in GameClient.ConnectedClients)
{ {
if (client.LoggedIn) if (client.LoggedIn)
{ {
if (!client.LoggedinUser.MutePrivateMessage && !client.LoggedinUser.MuteAll) if (!client.User.MutePrivateMessage && !client.User.MuteAll)
{ {
if (client.LoggedinUser.Username.ToLower().StartsWith(to.ToLower())) if (client.User.Username.ToLower().StartsWith(to.ToLower()))
{ {
recipiants.Add(client); recipiants.Add(client);
break; break;
} }
} }
} }
} }
return recipiants.ToArray(); return recipiants.ToArray();
} }
else else
{ {
Logger.ErrorPrint("Channel is " + channel + " (DM) BUT no 'to' Paramater was specfied"); Logger.ErrorPrint("Channel is " + channel + " (DM) BUT no 'to' Paramater was specfied");
return new GameClient[0]; return new GameClient[0];
} }
} }
Logger.ErrorPrint(user.Username + " Sent message in unknown channel: " + (byte)channel); Logger.ErrorPrint(user.Username + " Sent message in unknown channel: " + (byte)channel);
return new GameClient[0]; // No recipiants return new GameClient[0]; // No recipiants
} }
public static string DoCorrections(string message) public static string DoCorrections(string message)
{ {
if (!ConfigReader.DoCorrections) if (!ConfigReader.EnableCorrections)
return message; return message;
foreach(Correction correct in CorrectedWords) foreach(Correction correct in CorrectedWords)
message = message.Replace(correct.FilteredWord, correct.ReplacedWord); message = message.Replace(correct.FilteredWord, correct.ReplacedWord);
return message.Trim(); return message.Trim();
} }
public static string EscapeMessage(string message) public static string EscapeMessage(string message)
{ {
return message.Replace("<", "&lt;"); return message.Replace("<", "&lt;");
} }
public static string FormatChatForOthers(User user, ChatChannel channel, string message, bool autoReply=false) public static string FormatChatForOthers(User user, ChatChannel channel, string message, bool autoReply=false)
{ {
switch (channel) switch (channel)
{ {
case ChatChannel.All: case ChatChannel.All:
if (user.Moderator || user.Administrator) if (user.Moderator || user.Administrator)
return Messages.FormatGlobalChatMessageForMod(user.Username, message); return Messages.FormatGlobalChatMessageForMod(user.Username, message);
else else
return Messages.FormatGlobalChatMessage(user.Username, message); return Messages.FormatGlobalChatMessage(user.Username, message);
case ChatChannel.Ads: case ChatChannel.Ads:
return Messages.FormatAdsChatMessage(user.Username, message); return Messages.FormatAdsChatMessage(user.Username, message);
case ChatChannel.Buddies: case ChatChannel.Buddies:
return Messages.FormatBuddyChatMessage(user.Username, message); return Messages.FormatBuddyChatMessage(user.Username, message);
case ChatChannel.Dm: case ChatChannel.Dm:
string badge = ""; string badge = "";
if (user.Moderator || user.Administrator) if (user.Moderator || user.Administrator)
badge += Messages.DmModBadge; badge += Messages.DmModBadge;
if (autoReply) if (autoReply)
badge += Messages.DmAutoResponse; badge += Messages.DmAutoResponse;
return Messages.FormatDirectMessage(user.Username, message, badge); return Messages.FormatDirectMessage(user.Username, message, badge);
case ChatChannel.Near: case ChatChannel.Near:
return Messages.FormatNearbyChatMessage(user.Username, message); return Messages.FormatNearbyChatMessage(user.Username, message);
case ChatChannel.Isle: case ChatChannel.Isle:
return Messages.FormatIsleChatMessage(user.Username, message); return Messages.FormatIsleChatMessage(user.Username, message);
case ChatChannel.Here: case ChatChannel.Here:
return Messages.FormatHereChatMessage(user.Username, message); return Messages.FormatHereChatMessage(user.Username, message);
case ChatChannel.Mod: case ChatChannel.Mod:
if (user.Moderator || user.Administrator) if (user.Moderator || user.Administrator)
return Messages.FormatModChatMessage(user.Username, message); return Messages.FormatModChatMessage(user.Username, message);
else else
{ {
Logger.HackerPrint(user.Username + " Tried to send in mod chat without being a moderator. (Hack/Code Attempt)"); Logger.HackerPrint(user.Username + " Tried to send in mod chat without being a moderator. (Hack/Code Attempt)");
return ""; return "";
} }
case ChatChannel.Admin: case ChatChannel.Admin:
if (user.Administrator) if (user.Administrator)
return Messages.FormatAdminChatMessage(user.Username, message); return Messages.FormatAdminChatMessage(user.Username, message);
else else
{ {
Logger.HackerPrint(user.Username + " Tried to send in mod chat without being a moderator. (Hack/Code Attempt)"); Logger.HackerPrint(user.Username + " Tried to send in mod chat without being a moderator. (Hack/Code Attempt)");
return ""; return "";
} }
default: default:
Logger.ErrorPrint(user.Username + " is trying to end a message in unknown channel " + channel.ToString("X")); Logger.ErrorPrint(user.Username + " is trying to end a message in unknown channel " + channel.ToString("X"));
return "not implemented yet :("; return "not implemented yet :(";
} }
} }
public static string FormatChatForSender(User user, ChatChannel channel, string message, string dmRecipiant=null, bool autoReply=false) public static string FormatChatForSender(User user, ChatChannel channel, string message, string dmRecipiant=null, bool autoReply=false)
{ {
switch (channel) switch (channel)
{ {
case ChatChannel.All: case ChatChannel.All:
if (user.Moderator || user.Administrator) if (user.Moderator || user.Administrator)
return Messages.FormatGlobalChatMessageForMod(user.Username, message); return Messages.FormatGlobalChatMessageForMod(user.Username, message);
else else
return Messages.FormatGlobalChatMessage(user.Username, message); return Messages.FormatGlobalChatMessage(user.Username, message);
case ChatChannel.Ads: case ChatChannel.Ads:
int numbListening = GameServer.GetNumberOfPlayersListeningToAdsChat(); // vry specific function ik int numbListening = GameServer.GetNumberOfPlayersListeningToAdsChat(); // vry specific function ik
return Messages.FormatAdsChatForSender(numbListening-1, user.Username, message); return Messages.FormatAdsChatForSender(numbListening-1, user.Username, message);
case ChatChannel.Buddies: case ChatChannel.Buddies:
return Messages.FormatBuddyChatMessageForSender(GameServer.GetNumberOfBuddiesOnline(user), user.Username, message); return Messages.FormatBuddyChatMessageForSender(GameServer.GetNumberOfBuddiesOnline(user), user.Username, message);
case ChatChannel.Isle: case ChatChannel.Isle:
int inIsle = 0; int inIsle = 0;
if (World.InIsle(user.X, user.Y)) if (World.InIsle(user.X, user.Y))
inIsle = GameServer.GetUsersInIsle(World.GetIsle(user.X, user.Y), false, false).Length -1; inIsle = GameServer.GetUsersInIsle(World.GetIsle(user.X, user.Y), false, false).Length -1;
return Messages.FormatIsleChatMessageForSender(inIsle, user.Username, message); return Messages.FormatIsleChatMessageForSender(inIsle, user.Username, message);
case ChatChannel.Here: case ChatChannel.Here:
int usersHere = GameServer.GetUsersAt(user.X, user.Y, false, false).Length -1; int usersHere = GameServer.GetUsersAt(user.X, user.Y, false, false).Length -1;
return Messages.FormatHereChatMessageForSender(usersHere, user.Username, message); return Messages.FormatHereChatMessageForSender(usersHere, user.Username, message);
case ChatChannel.Near: case ChatChannel.Near:
int nearbyUsers = GameServer.GetNearbyUsers(user.X, user.Y, false, false).Length -1; int nearbyUsers = GameServer.GetNearbyUsers(user.X, user.Y, false, false).Length -1;
return Messages.FormatNearChatMessageForSender(nearbyUsers, user.Username, message); return Messages.FormatNearChatMessageForSender(nearbyUsers, user.Username, message);
case ChatChannel.Mod: case ChatChannel.Mod:
int modsOnline = GameServer.GetNumberOfModsOnline() - 1; int modsOnline = GameServer.GetNumberOfModsOnline() - 1;
return Messages.FormatModChatForSender(modsOnline, user.Username, message); return Messages.FormatModChatForSender(modsOnline, user.Username, message);
case ChatChannel.Admin: case ChatChannel.Admin:
int adminsOnline = GameServer.GetNumberOfAdminsOnline() - 1; int adminsOnline = GameServer.GetNumberOfAdminsOnline() - 1;
return Messages.FormatAdminChatForSender(adminsOnline, user.Username, message); return Messages.FormatAdminChatForSender(adminsOnline, user.Username, message);
case ChatChannel.Dm: case ChatChannel.Dm:
string badge = ""; string badge = "";
if (user.Moderator || user.Administrator) if (user.Moderator || user.Administrator)
badge += Messages.DmModBadge; badge += Messages.DmModBadge;
if (autoReply) if (autoReply)
badge += Messages.DmAutoResponse; badge += Messages.DmAutoResponse;
return Messages.FormatDirectChatMessageForSender(user.Username, dmRecipiant, message, badge); return Messages.FormatDirectChatMessageForSender(user.Username, dmRecipiant, message, badge);
default: default:
Logger.ErrorPrint(user.Username + " is trying to end a message in unknown channel " + channel.ToString("X")); Logger.ErrorPrint(user.Username + " is trying to end a message in unknown channel " + channel.ToString("X"));
return "not implemented yet :("; return "not implemented yet :(";
} }
} }
public static string NonViolationChecks(User user, string message) public static string NonViolationChecks(User user, string message)
{ {
if(!ConfigReader.DoNonViolations) if(!ConfigReader.EnableNonViolations)
return null; return null;
// Check if contains password. // Check if contains password.
if (message.ToLower().Contains(user.Password.ToLower())) if (message.ToLower().Contains(user.Password.ToLower()))
return Messages.PasswordNotice; return Messages.PasswordNotice;
// Check if ALL CAPS // Check if ALL CAPS
string[] wordsSaid; string[] wordsSaid;
if (message.Contains(' ')) if (message.Contains(' '))
wordsSaid = message.Split(' '); wordsSaid = message.Split(' ');
else else
wordsSaid = new string[] { message }; wordsSaid = new string[] { message };
foreach (string word in wordsSaid) foreach (string word in wordsSaid)
{ {
string lettersOnly = ""; string lettersOnly = "";
foreach(char c in word) foreach(char c in word)
{ {
if((byte)c >= (byte)'A' && (byte)c <= (byte)'z') // is letter if((byte)c >= (byte)'A' && (byte)c <= (byte)'z') // is letter
{ {
lettersOnly += c; lettersOnly += c;
} }
} }
if (lettersOnly.ToUpper() == lettersOnly && lettersOnly.Length >= 5) if (lettersOnly.ToUpper() == lettersOnly && lettersOnly.Length >= 5)
return Messages.CapsNotice; return Messages.CapsNotice;
} }
return null; return null;
} }
public static Reason GetReason(string name) public static Reason GetReason(string name)
{ {
foreach (Reason reason in Reasons) foreach (Reason reason in Reasons)
if (reason.Name == name) if (reason.Name == name)
return reason; return reason;
throw new KeyNotFoundException("Reason " + name + " not found."); throw new KeyNotFoundException("Reason " + name + " not found.");
} }
} }
} }

2111
HorseIsleServer/LibHISP/Game/Chat/Command.cs Normal file → Executable file

File diff suppressed because it is too large Load diff

36
HorseIsleServer/LibHISP/Game/Chat/CommandRegister.cs Normal file → Executable file
View file

@ -15,17 +15,43 @@ namespace HISP.Game.Chat
return registeredComamnds.ToArray(); return registeredComamnds.ToArray();
} }
} }
private Func<string, string[], User, bool> commandCallback;
public bool CmdRequiresAdmin;
public bool CmdRequiresMod;
public char CmdLetter; public char CmdLetter;
public string CmdName; public string CmdName;
public Func<string,string[],User, bool> CmdCallback; public string CmdUsage;
public CommandRegister(char cmdLetter, string cmdName, Func<string, string[], User, bool> cmdCallback) public CommandRegister(char cmdLetter, string cmdName, string cmdUsage, Func<string, string[], User, bool> cmdCallback, bool cmdRequiresAdmin, bool cmdRequiresMod)
{ {
CmdLetter = cmdLetter; this.CmdLetter = cmdLetter;
CmdName = cmdName.ToUpper(CultureInfo.InvariantCulture); this.CmdName = cmdName.ToUpper(CultureInfo.InvariantCulture).Trim();
CmdCallback = cmdCallback; this.CmdUsage = cmdUsage;
this.CmdRequiresMod = cmdRequiresMod;
this.CmdRequiresAdmin = cmdRequiresAdmin;
this.commandCallback = cmdCallback;
registeredComamnds.Add(this); registeredComamnds.Add(this);
} }
public bool HasPermission(User user)
{
if (CmdRequiresAdmin && !(user.Administrator))
return false;
if (CmdRequiresMod && !(user.Moderator || user.Administrator))
return false;
return true;
}
public bool Execute(string message, string[] args, User user)
{
if(HasPermission(user))
return commandCallback(message, args, user);
return false;
}
} }
} }

0
HorseIsleServer/LibHISP/Game/Chat/SocialType.cs Normal file → Executable file
View file

View file

@ -54,16 +54,16 @@ namespace HISP.Game.Events
int totalTypes = 0; int totalTypes = 0;
foreach (int itemId in Item.TradingCards) foreach (int itemId in Item.TradingCards)
if (client.LoggedinUser.Inventory.HasItemId(itemId)) if (client.User.Inventory.HasItemId(itemId))
totalCards += client.LoggedinUser.Inventory.GetItemByItemId(itemId).ItemInstances.Length; totalCards += client.User.Inventory.GetItemByItemId(itemId).ItemInstances.Length;
if (client.LoggedinUser.Inventory.HasItemId(Item.ColtTradingCard)) if (client.User.Inventory.HasItemId(Item.ColtTradingCard))
totalTypes++; totalTypes++;
if (client.LoggedinUser.Inventory.HasItemId(Item.FillyTradingCard)) if (client.User.Inventory.HasItemId(Item.FillyTradingCard))
totalTypes++; totalTypes++;
if (client.LoggedinUser.Inventory.HasItemId(Item.MareTradingCard)) if (client.User.Inventory.HasItemId(Item.MareTradingCard))
totalTypes++; totalTypes++;
if (client.LoggedinUser.Inventory.HasItemId(Item.StallionTradingCard)) if (client.User.Inventory.HasItemId(Item.StallionTradingCard))
totalTypes++; totalTypes++;
if(totalCards > 4) if(totalCards > 4)
@ -93,12 +93,12 @@ namespace HISP.Game.Events
} }
else if (totalTypes == 4) else if (totalTypes == 4)
{ {
client.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.IsleCardsGameWin).Count++; client.User.TrackedItems.GetTrackedItem(Tracking.TrackableItem.IsleCardsGameWin).Count++;
byte[] wonIsleCardGame = PacketBuilder.CreateChat(Messages.EventWonIsleTradingGame, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] wonIsleCardGame = PacketBuilder.CreateChat(Messages.EventWonIsleTradingGame, PacketBuilder.CHAT_BOTTOM_RIGHT);
client.SendPacket(wonIsleCardGame); client.SendPacket(wonIsleCardGame);
client.LoggedinUser.AddMoney(25000); client.User.AddMoney(25000);
} }

13
HorseIsleServer/LibHISP/Game/Events/ModsRevenge.cs Normal file → Executable file
View file

@ -1,6 +1,7 @@
using HISP.Game.Items; using HISP.Game.Items;
using HISP.Player; using HISP.Player;
using HISP.Server; using HISP.Server;
using HISP.Util;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
@ -13,7 +14,7 @@ namespace HISP.Game.Events
public ThrowTracker(User thrower) public ThrowTracker(User thrower)
{ {
Thrower = thrower; Thrower = thrower;
thrownAt = new List<User>(); thrownAt = new ThreadSafeList<User>();
} }
public void AddThrownAt(User user) public void AddThrownAt(User user)
@ -21,7 +22,7 @@ namespace HISP.Game.Events
thrownAt.Add(user); thrownAt.Add(user);
} }
public User Thrower; public User Thrower;
private List<User> thrownAt; private ThreadSafeList<User> thrownAt;
public User[] ThrownAt public User[] ThrownAt
{ {
get get
@ -33,7 +34,7 @@ namespace HISP.Game.Events
public bool Active = false; public bool Active = false;
public const int REVENGE_TIMEOUT = 10; public const int REVENGE_TIMEOUT = 10;
private List<ThrowTracker> trackedThrows; private ThreadSafeList<ThrowTracker> trackedThrows;
private Timer revengeTimeout; private Timer revengeTimeout;
public ThrowTracker[] TrackedThrows public ThrowTracker[] TrackedThrows
{ {
@ -45,7 +46,7 @@ namespace HISP.Game.Events
public ModsRevenge() public ModsRevenge()
{ {
trackedThrows = new List<ThrowTracker>(); trackedThrows = new ThreadSafeList<ThrowTracker>();
Active = false; Active = false;
} }
@ -147,8 +148,8 @@ namespace HISP.Game.Events
thrower.AddMoney(50); thrower.AddMoney(50);
throwAt.AddMoney(500); throwAt.AddMoney(500);
thrower.LoggedinClient.SendPacket(youEarned); thrower.Client.SendPacket(youEarned);
throwAt.LoggedinClient.SendPacket(otherEarned); throwAt.Client.SendPacket(otherEarned);
throwCounter.AddThrownAt(throwAt); throwCounter.AddThrownAt(throwAt);
} }

2
HorseIsleServer/LibHISP/Game/Events/RandomEvent.cs Normal file → Executable file
View file

@ -59,7 +59,7 @@ namespace HISP.Game.Events
string msg = Messages.FormatRandomEvent(rngEvent.Text, moneyEarned, horseName); string msg = Messages.FormatRandomEvent(rngEvent.Text, moneyEarned, horseName);
byte[] chatPacket = PacketBuilder.CreateChat(Messages.RandomEventPrefix + msg, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] chatPacket = PacketBuilder.CreateChat(Messages.RandomEventPrefix + msg, PacketBuilder.CHAT_BOTTOM_RIGHT);
user.LoggedinClient.SendPacket(chatPacket); user.Client.SendPacket(chatPacket);
return; return;
} }

17
HorseIsleServer/LibHISP/Game/Events/RealTimeQuiz.cs Normal file → Executable file
View file

@ -1,5 +1,6 @@
using HISP.Player; using HISP.Player;
using HISP.Server; using HISP.Server;
using HISP.Util;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
@ -46,8 +47,8 @@ namespace HISP.Game.Events
if (this.Quit) if (this.Quit)
return; return;
byte[] realTimeQuizQuestion = PacketBuilder.CreateMetaPacket(Meta.BuildRealTimeQuiz(this)); byte[] realTimeQuizQuestion = PacketBuilder.CreateMeta(Meta.BuildRealTimeQuiz(this));
this.UserInstance.LoggedinClient.SendPacket(realTimeQuizQuestion); this.UserInstance.Client.SendPacket(realTimeQuizQuestion);
} }
public void CheckAnswer(string answer) public void CheckAnswer(string answer)
@ -97,11 +98,11 @@ namespace HISP.Game.Events
return participents.ToArray(); return participents.ToArray();
} }
} }
private List<Participent> participents; private ThreadSafeList<Participent> participents;
public RealTimeQuiz() public RealTimeQuiz()
{ {
participents = new List<Participent>(); participents = new ThreadSafeList<Participent>();
Questions = new QuizQuestion[8]; Questions = new QuizQuestion[8];
for(int i = 0; i < 8; i++) for(int i = 0; i < 8; i++)
{ {
@ -159,7 +160,7 @@ namespace HISP.Game.Events
Participent partcipent = getParticipent(user.Id); Participent partcipent = getParticipent(user.Id);
partcipent.Quit = true; partcipent.Quit = true;
user.InRealTimeQuiz = false; user.InRealTimeQuiz = false;
GameServer.UpdateArea(user.LoggedinClient); GameServer.UpdateArea(user.Client);
} }
catch (KeyNotFoundException) { }; catch (KeyNotFoundException) { };
} }
@ -218,7 +219,7 @@ namespace HISP.Game.Events
participent.UserInstance.InRealTimeQuiz = false; participent.UserInstance.InRealTimeQuiz = false;
GameServer.UpdateArea(participent.UserInstance.LoggedinClient); GameServer.UpdateArea(participent.UserInstance.Client);
int money = 0; int money = 0;
@ -237,12 +238,12 @@ namespace HISP.Game.Events
if (participent.Won) if (participent.Won)
{ {
byte[] wonBonusMessage = PacketBuilder.CreateChat(Messages.FormatEventRealTimeQuizWinBonus(money), PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] wonBonusMessage = PacketBuilder.CreateChat(Messages.FormatEventRealTimeQuizWinBonus(money), PacketBuilder.CHAT_BOTTOM_RIGHT);
participent.UserInstance.LoggedinClient.SendPacket(wonBonusMessage); participent.UserInstance.Client.SendPacket(wonBonusMessage);
} }
else else
{ {
byte[] bonusMessage = PacketBuilder.CreateChat(Messages.FormatEventRealTimeQuizBonus(money), PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] bonusMessage = PacketBuilder.CreateChat(Messages.FormatEventRealTimeQuizBonus(money), PacketBuilder.CHAT_BOTTOM_RIGHT);
participent.UserInstance.LoggedinClient.SendPacket(bonusMessage); participent.UserInstance.Client.SendPacket(bonusMessage);
} }
participent.UserInstance.AddMoney(money); participent.UserInstance.AddMoney(money);

4
HorseIsleServer/LibHISP/Game/Events/RealTimeRiddle.cs Normal file → Executable file
View file

@ -59,7 +59,7 @@ namespace HISP.Game.Events
if (Database.HasPlayerCompletedRealTimeRiddle(RiddleId, winner.Id)) if (Database.HasPlayerCompletedRealTimeRiddle(RiddleId, winner.Id))
{ {
byte[] alreadyWonRiddleMessage = PacketBuilder.CreateChat(Messages.EventAlreadySovledRealTimeRiddle, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] alreadyWonRiddleMessage = PacketBuilder.CreateChat(Messages.EventAlreadySovledRealTimeRiddle, PacketBuilder.CHAT_BOTTOM_RIGHT);
winner.LoggedinClient.SendPacket(alreadyWonRiddleMessage); winner.Client.SendPacket(alreadyWonRiddleMessage);
return; return;
} }
@ -81,7 +81,7 @@ namespace HISP.Game.Events
foreach (GameClient client in GameClient.ConnectedClients) foreach (GameClient client in GameClient.ConnectedClients)
{ {
if (client.LoggedIn) if (client.LoggedIn)
if (client.LoggedinUser.Id != winner.Id) if (client.User.Id != winner.Id)
client.SendPacket(riddleWonMessage); client.SendPacket(riddleWonMessage);
else else
client.SendPacket(riddleYouWonMessage); client.SendPacket(riddleYouWonMessage);

View file

View file

@ -80,7 +80,7 @@ namespace HISP.Game.Events
{ {
byte[] youWinMsg = PacketBuilder.CreateChat(Messages.EventWonWaterBallonGame, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] youWinMsg = PacketBuilder.CreateChat(Messages.EventWonWaterBallonGame, PacketBuilder.CHAT_BOTTOM_RIGHT);
winner.UserHit.AddMoney(20000); winner.UserHit.AddMoney(20000);
winner.UserHit.LoggedinClient.SendPacket(youWinMsg); winner.UserHit.Client.SendPacket(youWinMsg);
winner.UserHit.TrackedItems.GetTrackedItem(Tracking.TrackableItem.WaterbaloonGameWin).Count++; winner.UserHit.TrackedItems.GetTrackedItem(Tracking.TrackableItem.WaterbaloonGameWin).Count++;
} }

0
HorseIsleServer/LibHISP/Game/GameExceptions.cs Normal file → Executable file
View file

0
HorseIsleServer/LibHISP/Game/Horse/HorseInfo.cs Normal file → Executable file
View file

0
HorseIsleServer/LibHISP/Game/Horse/HorseInstance.cs Normal file → Executable file
View file

0
HorseIsleServer/LibHISP/Game/Horse/Leaser.cs Normal file → Executable file
View file

3
HorseIsleServer/LibHISP/Game/Horse/WildHorse.cs Normal file → Executable file
View file

@ -1,5 +1,6 @@
using HISP.Player; using HISP.Player;
using HISP.Server; using HISP.Server;
using HISP.Util;
using System.Collections.Generic; using System.Collections.Generic;
namespace HISP.Game.Horse namespace HISP.Game.Horse
{ {
@ -181,7 +182,7 @@ namespace HISP.Game.Horse
Despawn(this); Despawn(this);
} }
private static List<WildHorse> wildHorses = new List<WildHorse>(); private static ThreadSafeList<WildHorse> wildHorses = new ThreadSafeList<WildHorse>();
public static WildHorse[] WildHorses public static WildHorse[] WildHorses
{ {
get get

View file

@ -1,6 +1,7 @@
using HISP.Game.Horse; using HISP.Game.Horse;
using HISP.Player; using HISP.Player;
using HISP.Server; using HISP.Server;
using HISP.Util;
using System.Collections.Generic; using System.Collections.Generic;
namespace HISP.Game.Inventory namespace HISP.Game.Inventory
@ -8,7 +9,7 @@ namespace HISP.Game.Inventory
public class HorseInventory public class HorseInventory
{ {
private User baseUser; private User baseUser;
private List<HorseInstance> horsesList = new List<HorseInstance>(); private ThreadSafeList<HorseInstance> horsesList = new ThreadSafeList<HorseInstance>();
public HorseInstance[] HorseList public HorseInstance[] HorseList
{ {
get get

0
HorseIsleServer/LibHISP/Game/Inventory/IInventory.cs Normal file → Executable file
View file

11
HorseIsleServer/LibHISP/Game/Inventory/InventoryItem.cs Normal file → Executable file
View file

@ -1,21 +1,20 @@
using System; using HISP.Game.Items;
using System.Collections.Generic; using HISP.Util;
using HISP.Game.Items;
namespace HISP.Game.Inventory namespace HISP.Game.Inventory
{ {
public class InventoryItem public class InventoryItem
{ {
public InventoryItem() public InventoryItem()
{ {
itemInstances = new List<ItemInstance>(); itemInstances = new ThreadSafeList<ItemInstance>();
Infinite = false; Infinite = false;
ItemId = 0; ItemId = 0;
} }
public int ItemId; public int ItemId;
public bool Infinite; public bool Infinite;
private List<ItemInstance> itemInstances; private ThreadSafeList<ItemInstance> itemInstances;
public void RemoveItem(ItemInstance itm) public void RemoveItem(ItemInstance itm)
{ {
itemInstances.Remove(itm); itemInstances.Remove(itm);

View file

@ -4,19 +4,20 @@ using System.Linq;
using HISP.Player; using HISP.Player;
using HISP.Server; using HISP.Server;
using HISP.Game.Items; using HISP.Game.Items;
using HISP.Util;
namespace HISP.Game.Inventory namespace HISP.Game.Inventory
{ {
public class PlayerInventory : IInventory public class PlayerInventory : IInventory
{ {
public User BaseUser; public User BaseUser;
private List<InventoryItem> inventoryItems; private ThreadSafeList<InventoryItem> inventoryItems;
public PlayerInventory(User forUser) public PlayerInventory(User forUser)
{ {
inventoryItems = new List<InventoryItem>(); inventoryItems = new ThreadSafeList<InventoryItem>();
BaseUser = forUser; BaseUser = forUser;
ItemInstance[] instances = Database.GetPlayerInventory(BaseUser.Id).ToArray(); ItemInstance[] instances = Database.GetPlayerInventory(BaseUser.Id).ToArray();

View file

@ -4,13 +4,14 @@ using HISP.Game.Items;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using HISP.Util;
namespace HISP.Game.Inventory namespace HISP.Game.Inventory
{ {
public class ShopInventory : IInventory public class ShopInventory : IInventory
{ {
private Shop baseShop; private Shop baseShop;
private List<InventoryItem> inventoryItems; private ThreadSafeList<InventoryItem> inventoryItems;
public int Count public int Count
{ {
get get
@ -21,7 +22,7 @@ namespace HISP.Game.Inventory
public ShopInventory(Shop shopkeeper) public ShopInventory(Shop shopkeeper)
{ {
baseShop = shopkeeper; baseShop = shopkeeper;
inventoryItems = new List<InventoryItem>(); inventoryItems = new ThreadSafeList<InventoryItem>();
} }
private void addItem(ItemInstance item, bool addToDatabase) private void addItem(ItemInstance item, bool addToDatabase)

0
HorseIsleServer/LibHISP/Game/Items/DroppedItems.cs Normal file → Executable file
View file

6
HorseIsleServer/LibHISP/Game/Items/Item.cs Normal file → Executable file
View file

@ -150,7 +150,7 @@ namespace HISP.Game.Items
if (isle.Name == "Prison Isle") if (isle.Name == "Prison Isle")
{ {
byte[] dontWorkHere = PacketBuilder.CreateChat(Messages.RanchDorothyShoesPrisonIsleMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] dontWorkHere = PacketBuilder.CreateChat(Messages.RanchDorothyShoesPrisonIsleMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
user.LoggedinClient.SendPacket(dontWorkHere); user.Client.SendPacket(dontWorkHere);
return; return;
} }
} }
@ -162,14 +162,14 @@ namespace HISP.Game.Items
return; return;
} }
byte[] noPlaceLIke127001 = PacketBuilder.CreateChat(Messages.RanchDorothyShoesMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] noPlaceLIke127001 = PacketBuilder.CreateChat(Messages.RanchDorothyShoesMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
user.LoggedinClient.SendPacket(noPlaceLIke127001); user.Client.SendPacket(noPlaceLIke127001);
user.Teleport(user.OwnedRanch.X, user.OwnedRanch.Y); user.Teleport(user.OwnedRanch.X, user.OwnedRanch.Y);
} }
else if (itm.ItemId == Item.Telescope) else if (itm.ItemId == Item.Telescope)
{ {
byte[] birdMap = PacketBuilder.CreateBirdMap(user.X, user.Y); byte[] birdMap = PacketBuilder.CreateBirdMap(user.X, user.Y);
user.LoggedinClient.SendPacket(birdMap); user.Client.SendPacket(birdMap);
} }
else else
{ {

0
HorseIsleServer/LibHISP/Game/Items/ItemInstance.cs Normal file → Executable file
View file

7
HorseIsleServer/LibHISP/Game/Items/Tack.cs Normal file → Executable file
View file

@ -4,7 +4,8 @@ using System.Collections.Generic;
using System.Text; using System.Text;
using HISP.Server; using HISP.Server;
using HISP.Util;
namespace HISP.Game.Items namespace HISP.Game.Items
{ {
public class Tack public class Tack
@ -122,13 +123,13 @@ namespace HISP.Game.Items
try try
{ {
TackSet set = GetSetByName(Util.CapitalizeFirstLetter(itemInfo.EmbedSwf)); TackSet set = GetSetByName(Helper.CapitalizeFirstLetter(itemInfo.EmbedSwf));
set.Add(itemInfo); set.Add(itemInfo);
} }
catch(KeyNotFoundException) catch(KeyNotFoundException)
{ {
TackSet tackSet = new TackSet(); TackSet tackSet = new TackSet();
tackSet.SetName = Util.CapitalizeFirstLetter(itemInfo.EmbedSwf); tackSet.SetName = Helper.CapitalizeFirstLetter(itemInfo.EmbedSwf);
tackSet.Add(itemInfo); tackSet.Add(itemInfo);
tackSets.Add(tackSet); tackSets.Add(tackSet);
} }

27
HorseIsleServer/LibHISP/Game/Map.cs Normal file → Executable file
View file

@ -12,7 +12,14 @@ namespace HISP.Game
public string Type; public string Type;
} }
public static int[] OverlayTileDepth; public struct TileDepth
{
public bool ShowPlayer;
public bool Passable;
}
public static TileDepth[] OverlayTileDepth;
public static TerrainTile[] TerrainTiles;
public static int Width; public static int Width;
public static int Height; public static int Height;
@ -20,8 +27,6 @@ namespace HISP.Game
public static byte[] MapData; public static byte[] MapData;
public static byte[] oMapData; public static byte[] oMapData;
public static TerrainTile[] TerrainTiles;
public static int NewUserStartX; public static int NewUserStartX;
public static int NewUserStartY; public static int NewUserStartY;
@ -75,19 +80,9 @@ namespace HISP.Game
if (World.InIsle(x, y)) if (World.InIsle(x, y))
tileset = World.GetIsle(x, y).Tileset; tileset = World.GetIsle(x, y).Tileset;
otileId = otileId + 64 * tileset; otileId = otileId + 64 * tileset;
} }
bool overlayPassable = OverlayTileDepth[otileId].Passable;
int tileDepth = OverlayTileDepth[otileId];
bool overlayPassable = false;
if (tileDepth == 0)
overlayPassable = false;
if (tileDepth == 1)
overlayPassable = false;
if (tileDepth == 2)
overlayPassable = true;
if (tileDepth == 3)
overlayPassable = true;
if ((!terrainPassable && overlayPassable) && otileId == 0) if ((!terrainPassable && overlayPassable) && otileId == 0)
return false; return false;

6080
HorseIsleServer/LibHISP/Game/Messages.cs Normal file → Executable file

File diff suppressed because it is too large Load diff

23
HorseIsleServer/LibHISP/Game/Meta.cs Normal file → Executable file
View file

@ -11,6 +11,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Drawing; using System.Drawing;
using HISP.Util;
namespace HISP.Game namespace HISP.Game
{ {
@ -1153,9 +1154,9 @@ namespace HISP.Game
{ {
if (client.LoggedIn) if (client.LoggedIn)
{ {
if (client.LoggedinUser.Stealth) if (client.User.Stealth)
continue; continue;
onlineUsers.Add(client.LoggedinUser); onlineUsers.Add(client.User);
} }
} }
@ -1188,17 +1189,17 @@ namespace HISP.Game
{ {
if (client.LoggedIn) if (client.LoggedIn)
{ {
if (client.LoggedinUser.Stealth) if (client.User.Stealth)
continue; continue;
bool isYou = (client.LoggedinUser.Id == currentUser.Id); bool isYou = (client.User.Id == currentUser.Id);
int icon = client.LoggedinUser.GetPlayerListIcon(); int icon = client.User.GetPlayerListIcon();
string iconFormat = ""; string iconFormat = "";
if (icon != -1) if (icon != -1)
iconFormat = Messages.FormatIconFormat(icon); iconFormat = Messages.FormatIconFormat(icon);
message += Messages.FormatPlayerEntry(iconFormat, client.LoggedinUser.Username, client.LoggedinUser.Id, Convert.ToInt32(Math.Round((DateTime.UtcNow - client.LoggedinUser.LoginTime).TotalMinutes)), client.LoggedinUser.X, client.LoggedinUser.Y, client.LoggedinUser.Idle, currentUser.MutePlayer.IsUserMuted(client.LoggedinUser), isYou); message += Messages.FormatPlayerEntry(iconFormat, client.User.Username, client.User.Id, Convert.ToInt32(Math.Round((DateTime.UtcNow - client.User.LoginTime).TotalMinutes)), client.User.X, client.User.Y, client.User.Idle, currentUser.MutePlayer.IsUserMuted(client.User), isYou);
} }
} }
@ -1240,7 +1241,7 @@ namespace HISP.Game
continue; continue;
string username = Database.GetUsername(id); string username = Database.GetUsername(id);
int minutes = Convert.ToInt32(Math.Round(DateTime.UtcNow.Subtract(Util.UnixTimeStampToDateTime(Database.GetPlayerLastLogin(id))).TotalMinutes)); int minutes = Convert.ToInt32(Math.Round(DateTime.UtcNow.Subtract(Helper.UnixTimeStampToDateTime(Database.GetPlayerLastLogin(id))).TotalMinutes));
message += Messages.FormatOfflineBuddyEntry(username, id, minutes); message += Messages.FormatOfflineBuddyEntry(username, id, minutes);
} }
@ -1733,8 +1734,8 @@ namespace HISP.Game
bool mine = (ranch.OwnerId == user.Id); bool mine = (ranch.OwnerId == user.Id);
string swfModule = ranch.GetSwf(mine); string swfModule = ranch.GetSwf(mine);
byte[] moduleSwf = PacketBuilder.CreateSwfModulePacket(swfModule, PacketBuilder.PACKET_SWF_MODULE_FORCE); byte[] moduleSwf = PacketBuilder.CreateSwfModule(swfModule, PacketBuilder.PACKET_SWF_MODULE_FORCE);
user.LoggedinClient.SendPacket(moduleSwf); user.Client.SendPacket(moduleSwf);
if (mine) // This is My DS. if (mine) // This is My DS.
{ {
@ -2104,7 +2105,7 @@ namespace HISP.Game
} }
public static string BuildMailLetter(Mailbox.Mail mailMessage, int itemRandomId) public static string BuildMailLetter(Mailbox.Mail mailMessage, int itemRandomId)
{ {
DateTime time = Util.UnixTimeStampToDateTime(mailMessage.Timestamp); DateTime time = Helper.UnixTimeStampToDateTime(mailMessage.Timestamp);
string amOrPm = "am"; string amOrPm = "am";
string[] months = new string[] { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; string[] months = new string[] { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
string minutes = time.Minute.ToString(); string minutes = time.Minute.ToString();
@ -2580,7 +2581,7 @@ namespace HISP.Game
{ {
string message = Messages.FormatPawneerOrderSelectGender(color, breed.Name); string message = Messages.FormatPawneerOrderSelectGender(color, breed.Name);
foreach (string gender in breed.GenderTypes()) foreach (string gender in breed.GenderTypes())
message += Messages.FormatPawneerOrderGenderEntry(Util.CapitalizeFirstLetter(gender), gender); message += Messages.FormatPawneerOrderGenderEntry(Helper.CapitalizeFirstLetter(gender), gender);
message += Messages.BackToMap; message += Messages.BackToMap;
message += Messages.MetaTerminator; message += Messages.MetaTerminator;
return message; return message;

7
HorseIsleServer/LibHISP/Game/Multiroom.cs Normal file → Executable file
View file

@ -1,5 +1,6 @@
using HISP.Player; using HISP.Player;
using HISP.Server; using HISP.Server;
using HISP.Util;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -8,7 +9,7 @@ namespace HISP.Game
public class Multiroom public class Multiroom
{ {
private static List<Multiroom> multirooms = new List<Multiroom>(); private static List<Multiroom> multirooms = new List<Multiroom>();
private List<User> joinedUsers = new List<User>(); private ThreadSafeList<User> joinedUsers = new ThreadSafeList<User>();
public int x; public int x;
public int y; public int y;
@ -83,7 +84,7 @@ namespace HISP.Game
if (joinedUser.Id != user.Id) if (joinedUser.Id != user.Id)
if(!TwoPlayer.IsPlayerInGame(joinedUser)) if(!TwoPlayer.IsPlayerInGame(joinedUser))
if(!joinedUser.MajorPriority) if(!joinedUser.MajorPriority)
GameServer.UpdateArea(joinedUser.LoggedinClient); GameServer.UpdateArea(joinedUser.Client);
} }
} }
@ -100,7 +101,7 @@ namespace HISP.Game
foreach (User joinedUser in JoinedUsers) foreach (User joinedUser in JoinedUsers)
if (!TwoPlayer.IsPlayerInGame(joinedUser)) if (!TwoPlayer.IsPlayerInGame(joinedUser))
if (!joinedUser.MajorPriority) if (!joinedUser.MajorPriority)
GameServer.UpdateArea(joinedUser.LoggedinClient); GameServer.UpdateArea(joinedUser.Client);
} }
} }

0
HorseIsleServer/LibHISP/Game/Npc.cs Normal file → Executable file
View file

14
HorseIsleServer/LibHISP/Game/Quest.cs Normal file → Executable file
View file

@ -238,7 +238,7 @@ namespace HISP.Game
if (quest.SuccessMessage != null) if (quest.SuccessMessage != null)
{ {
byte[] ChatPacket = PacketBuilder.CreateChat(quest.SuccessMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] ChatPacket = PacketBuilder.CreateChat(quest.SuccessMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
user.LoggedinClient.SendPacket(ChatPacket); user.Client.SendPacket(ChatPacket);
} }
if (quest.SuccessNpcChat != null) if (quest.SuccessNpcChat != null)
@ -246,7 +246,7 @@ namespace HISP.Game
if (!npcActivation) if (!npcActivation)
{ {
byte[] ChatPacket = PacketBuilder.CreateChat(quest.SuccessNpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] ChatPacket = PacketBuilder.CreateChat(quest.SuccessNpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT);
user.LoggedinClient.SendPacket(ChatPacket); user.Client.SendPacket(ChatPacket);
} }
} }
@ -264,8 +264,8 @@ namespace HISP.Game
// Is cloud isles quest? // Is cloud isles quest?
if (quest.Id == CloudIslesQuest) if (quest.Id == CloudIslesQuest)
{ {
byte[] swfLoadPacket = PacketBuilder.CreateSwfModulePacket("ballooncutscene", PacketBuilder.PACKET_SWF_CUTSCENE); byte[] swfLoadPacket = PacketBuilder.CreateSwfModule("ballooncutscene", PacketBuilder.PACKET_SWF_MODULE_CUTSCENE);
user.LoggedinClient.SendPacket(swfLoadPacket); user.Client.SendPacket(swfLoadPacket);
} }
return res; return res;
@ -290,7 +290,7 @@ namespace HISP.Game
if (!npcActivation) if (!npcActivation)
{ {
byte[] ChatPacket = PacketBuilder.CreateChat(quest.FailNpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] ChatPacket = PacketBuilder.CreateChat(quest.FailNpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT);
user.LoggedinClient.SendPacket(ChatPacket); user.Client.SendPacket(ChatPacket);
} }
else else
{ {
@ -371,7 +371,7 @@ namespace HISP.Game
if(result.NpcChat != null) if(result.NpcChat != null)
{ {
byte[] ChatPacket = PacketBuilder.CreateChat(result.NpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] ChatPacket = PacketBuilder.CreateChat(result.NpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT);
user.LoggedinClient.SendPacket(ChatPacket); user.Client.SendPacket(ChatPacket);
} }
return true; return true;
} }
@ -383,7 +383,7 @@ namespace HISP.Game
if (result.NpcChat != null) if (result.NpcChat != null)
{ {
byte[] ChatPacket = PacketBuilder.CreateChat(result.NpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] ChatPacket = PacketBuilder.CreateChat(result.NpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT);
user.LoggedinClient.SendPacket(ChatPacket); user.Client.SendPacket(ChatPacket);
} }
return true; return true;
} }

988
HorseIsleServer/LibHISP/Game/Ranch.cs Normal file → Executable file
View file

@ -1,488 +1,500 @@
using HISP.Game.Inventory; using HISP.Game.Inventory;
using HISP.Game.Items; using HISP.Game.Items;
using HISP.Player; using HISP.Player;
using HISP.Server; using HISP.Server;
using System; using HISP.Util;
using System.Collections.Generic; using System;
using System.Collections.Generic;
namespace HISP.Game
{ namespace HISP.Game
public class Ranch {
{ public class Ranch
public class RanchUpgrade {
{ public class RanchUpgrade
public static List<RanchUpgrade> RanchUpgrades = new List<RanchUpgrade>(); {
public int Id; public static List<RanchUpgrade> RanchUpgrades = new List<RanchUpgrade>();
public int Cost; public int Id;
public string Title; public int Cost;
public string Description; public string Title;
public int Limit; public string Description;
public int Limit;
public static bool RanchUpgradeExists(int id)
{ public static bool RanchUpgradeExists(int id)
foreach (RanchUpgrade rachUpgrade in RanchUpgrades) {
{ foreach (RanchUpgrade rachUpgrade in RanchUpgrades)
if (rachUpgrade.Id == id) {
return true; if (rachUpgrade.Id == id)
} return true;
return false; }
} return false;
public static RanchUpgrade GetRanchUpgradeById(int id) }
{ public static RanchUpgrade GetRanchUpgradeById(int id)
foreach (RanchUpgrade rachUpgrade in RanchUpgrades) {
{ foreach (RanchUpgrade ranchUpgrade in RanchUpgrades)
if (rachUpgrade.Id == id) {
return rachUpgrade; if (ranchUpgrade.Id == id)
} return ranchUpgrade;
throw new KeyNotFoundException("No ranch found."); }
} throw new KeyNotFoundException("No ranch found.");
} }
public class RanchBuilding }
{ public class RanchBuilding
public static List<RanchBuilding> RanchBuildings = new List<RanchBuilding>(); {
public int Id; public static List<RanchBuilding> RanchBuildings = new List<RanchBuilding>();
public int Cost; public int Id;
public string Title; public int Cost;
public string Description; public string Title;
public string Description;
public static bool RanchBuildingExists(int id)
{ public static bool RanchBuildingExists(int id)
foreach (RanchBuilding ranchBuilding in RanchBuildings) {
{ foreach (RanchBuilding ranchBuilding in RanchBuildings)
if (ranchBuilding.Id == id) {
return true; if (ranchBuilding.Id == id)
} return true;
return false; }
} return false;
public static RanchBuilding GetRanchBuildingById(int id) }
{ public static RanchBuilding GetRanchBuildingById(int id)
foreach(RanchBuilding ranchBuilding in RanchBuildings) {
{ foreach(RanchBuilding ranchBuilding in RanchBuildings)
if (ranchBuilding.Id == id) {
return ranchBuilding; if (ranchBuilding.Id == id)
} return ranchBuilding;
throw new KeyNotFoundException("No ranch found."); }
} throw new KeyNotFoundException("No ranch found.");
}
public int GetTeardownPrice()
{ public int GetTeardownPrice()
return Convert.ToInt32(Math.Round((float)this.Cost / (100 / 35.0))); {
} return Convert.ToInt32(Math.Round((float)this.Cost / (100 / 35.0)));
} }
public static List<Ranch> Ranches = new List<Ranch>(); }
public static List<Ranch> Ranches = new List<Ranch>();
public int X;
public int Y; public int X;
public int Id; public int Y;
public int Value; public int Id;
public int Value;
private int ownerId;
private int upgradedLevel; private int ownerId;
private int investedMoney; private int upgradedLevel;
private string title; private int investedMoney;
private string description; private string title;
private string description;
public int GetSellPrice()
{ public int GetSellPrice()
return Convert.ToInt32(Math.Round((double)this.InvestedMoney / (100 / 75.0))); {
} return Convert.ToInt32(Math.Round((double)this.InvestedMoney / (100 / 75.0)));
private void removeDorothyShoes(int Id) }
{ private void removeDorothyShoes(int Id)
if (Id == -1) {
return; if (Id == -1)
return;
if(GameServer.IsUserOnline(Id))
{ if(GameServer.IsUserOnline(Id))
User user = GameServer.GetUserById(Id); {
user.OwnedRanch = null; User user = GameServer.GetUserById(Id);
InventoryItem items = user.Inventory.GetItemByItemId(Item.DorothyShoes); user.OwnedRanch = null;
foreach (ItemInstance itm in items.ItemInstances) InventoryItem items = user.Inventory.GetItemByItemId(Item.DorothyShoes);
{ foreach (ItemInstance itm in items.ItemInstances)
user.Inventory.Remove(itm); {
} user.Inventory.Remove(itm);
} }
else }
{ else
Database.RemoveAllItemTypesFromPlayerInventory(this.Id, Item.DorothyShoes); {
} Database.RemoveAllItemTypesFromPlayerInventory(this.Id, Item.DorothyShoes);
}
}
}
private void deleteRanch()
{ private void deleteRanch()
Database.DeleteRanchOwner(this.Id); {
removeDorothyShoes(this.ownerId); Database.DeleteRanchOwner(this.Id);
resetRanch(); removeDorothyShoes(this.ownerId);
} resetRanch();
private void resetRanch() }
{ private void resetRanch()
title = ""; {
description = ""; title = "";
investedMoney = 0; description = "";
upgradedLevel = 0; investedMoney = 0;
ownerId = -1; upgradedLevel = 0;
for (int i = 0; i < 16; i++) ownerId = -1;
buildings[i] = null; for (int i = 0; i < 16; i++)
} buildings[i] = null;
public int OwnerId }
{ public int OwnerId
get {
{ get
if(ownerId != -1) {
{ if(ownerId != -1)
if (ConfigReader.AllUsersSubbed || Database.IsUserAdmin(ownerId)) {
return ownerId; if (ConfigReader.AllUsersSubbed || Database.GetUserAdmin(ownerId))
return ownerId;
int subExp = Database.GetUserSubscriptionExpireDate(ownerId);
DateTime expTime = Util.UnixTimeStampToDateTime(subExp); int subExp = Database.GetUserSubscriptionExpireDate(ownerId);
if ((DateTime.UtcNow.Date - expTime.Date).Days >= 30) DateTime expTime = Helper.UnixTimeStampToDateTime(subExp);
{ if ((DateTime.UtcNow.Date - expTime.Date).Days >= 30)
int price = GetSellPrice(); {
try int price = GetSellPrice();
{ try
checked {
{ checked
Database.SetPlayerMoney(Database.GetPlayerMoney(ownerId) + price, ownerId); {
} Database.SetPlayerMoney(Database.GetPlayerMoney(ownerId) + price, ownerId);
} }
catch (OverflowException) }
{ catch (OverflowException)
Database.SetPlayerMoney(2147483647, ownerId);; {
} Database.SetPlayerMoney(2147483647, ownerId);;
}
Database.AddMessageToQueue(ownerId, Messages.FormatRanchForcefullySoldMessage(price));
deleteRanch(); Database.AddMessageToQueue(ownerId, Messages.FormatRanchForcefullySoldMessage(price));
return -1; deleteRanch();
} return -1;
}
}
return ownerId; }
return ownerId;
}
set }
{ set
if (value == -1) {
{ if (value == -1)
deleteRanch(); {
} deleteRanch();
else }
{ else
if(Database.IsRanchOwned(this.Id)) {
{ if (Database.IsRanchOwned(this.Id))
Database.SetRanchOwner(this.Id, ownerId); {
removeDorothyShoes(ownerId); Database.SetRanchOwner(this.Id, ownerId);
} removeDorothyShoes(ownerId);
else }
{ else
resetRanch(); {
Database.AddRanch(this.Id, value, "", "", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); resetRanch();
} Database.AddRanch(this.Id, value, "", "", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
} }
}
ownerId = value;
} if (GameServer.IsUserOnline(value))
} {
User user = GameServer.GetUserById(value);
public int UpgradedLevel user.OwnedRanch = this;
{ user.Inventory.AddIgnoringFull(new ItemInstance(Item.DorothyShoes));
get }
{ else
return upgradedLevel; {
} Database.AddItemToInventory(value, new ItemInstance(Item.DorothyShoes));
set }
{
upgradedLevel = value; ownerId = value;
Database.SetRanchUpgradeLevel(Id, value); }
} }
}
public int InvestedMoney public int UpgradedLevel
{ {
get get
{ {
return investedMoney; return upgradedLevel;
} }
set set
{ {
investedMoney = value; upgradedLevel = value;
Database.SetRanchInvestment(Id, value); Database.SetRanchUpgradeLevel(Id, value);
} }
} }
public string Title public int InvestedMoney
{ {
get get
{ {
return title; return investedMoney;
} }
set set
{ {
title = value.Trim(); investedMoney = value;
Database.SetRanchTitle(Id, title); Database.SetRanchInvestment(Id, value);
} }
} }
public string Description public string Title
{ {
get get
{ {
return description; return title;
} }
set set
{ {
description = value.Trim(); title = value.Trim();
Database.SetRanchDescription(Id, value); Database.SetRanchTitle(Id, title);
} }
} }
public string Description
{
private RanchBuilding[] buildings = new RanchBuilding[16]; get
public int GetBuildingCount(int buildingId) {
{ return description;
int count = 0; }
foreach(RanchBuilding building in buildings) set
{ {
if(building != null) description = value.Trim();
if (building.Id == buildingId) Database.SetRanchDescription(Id, value);
count++; }
} }
return count;
}
private void updateBuildings() private RanchBuilding[] buildings = new RanchBuilding[16];
{ public int GetBuildingCount(int buildingId)
if (buildings[0] != null) {
Database.SetRanchBuilding1(this.Id, buildings[0].Id); int count = 0;
else foreach(RanchBuilding building in buildings)
Database.SetRanchBuilding1(this.Id, 0); {
if (buildings[1] != null) if(building != null)
Database.SetRanchBuilding2(this.Id, buildings[1].Id); if (building.Id == buildingId)
else count++;
Database.SetRanchBuilding2(this.Id, 0); }
if (buildings[2] != null) return count;
Database.SetRanchBuilding3(this.Id, buildings[2].Id); }
else private void updateBuildings()
Database.SetRanchBuilding3(this.Id, 0); {
if (buildings[3] != null) if (buildings[0] != null)
Database.SetRanchBuilding4(this.Id, buildings[3].Id); Database.SetRanchBuilding1(this.Id, buildings[0].Id);
else else
Database.SetRanchBuilding4(this.Id, 0); Database.SetRanchBuilding1(this.Id, 0);
if (buildings[4] != null) if (buildings[1] != null)
Database.SetRanchBuilding5(this.Id, buildings[4].Id); Database.SetRanchBuilding2(this.Id, buildings[1].Id);
else else
Database.SetRanchBuilding5(this.Id, 0); Database.SetRanchBuilding2(this.Id, 0);
if (buildings[5] != null) if (buildings[2] != null)
Database.SetRanchBuilding6(this.Id, buildings[5].Id); Database.SetRanchBuilding3(this.Id, buildings[2].Id);
else else
Database.SetRanchBuilding6(this.Id, 0); Database.SetRanchBuilding3(this.Id, 0);
if (buildings[6] != null) if (buildings[3] != null)
Database.SetRanchBuilding7(this.Id, buildings[6].Id); Database.SetRanchBuilding4(this.Id, buildings[3].Id);
else else
Database.SetRanchBuilding7(this.Id, 0); Database.SetRanchBuilding4(this.Id, 0);
if (buildings[7] != null) if (buildings[4] != null)
Database.SetRanchBuilding8(this.Id, buildings[7].Id); Database.SetRanchBuilding5(this.Id, buildings[4].Id);
else else
Database.SetRanchBuilding8(this.Id, 0); Database.SetRanchBuilding5(this.Id, 0);
if (buildings[8] != null) if (buildings[5] != null)
Database.SetRanchBuilding9(this.Id, buildings[8].Id); Database.SetRanchBuilding6(this.Id, buildings[5].Id);
else else
Database.SetRanchBuilding9(this.Id, 0); Database.SetRanchBuilding6(this.Id, 0);
if (buildings[9] != null) if (buildings[6] != null)
Database.SetRanchBuilding10(this.Id, buildings[9].Id); Database.SetRanchBuilding7(this.Id, buildings[6].Id);
else else
Database.SetRanchBuilding10(this.Id, 0); Database.SetRanchBuilding7(this.Id, 0);
if (buildings[10] != null) if (buildings[7] != null)
Database.SetRanchBuilding11(this.Id, buildings[10].Id); Database.SetRanchBuilding8(this.Id, buildings[7].Id);
else else
Database.SetRanchBuilding11(this.Id, 0); Database.SetRanchBuilding8(this.Id, 0);
if (buildings[11] != null) if (buildings[8] != null)
Database.SetRanchBuilding12(this.Id, buildings[11].Id); Database.SetRanchBuilding9(this.Id, buildings[8].Id);
else else
Database.SetRanchBuilding12(this.Id, 0); Database.SetRanchBuilding9(this.Id, 0);
if (buildings[12] != null) if (buildings[9] != null)
Database.SetRanchBuilding13(this.Id, buildings[12].Id); Database.SetRanchBuilding10(this.Id, buildings[9].Id);
else else
Database.SetRanchBuilding13(this.Id, 0); Database.SetRanchBuilding10(this.Id, 0);
if (buildings[13] != null) if (buildings[10] != null)
Database.SetRanchBuilding14(this.Id, buildings[13].Id); Database.SetRanchBuilding11(this.Id, buildings[10].Id);
else else
Database.SetRanchBuilding14(this.Id, 0); Database.SetRanchBuilding11(this.Id, 0);
if (buildings[14] != null) if (buildings[11] != null)
Database.SetRanchBuilding15(this.Id, buildings[14].Id); Database.SetRanchBuilding12(this.Id, buildings[11].Id);
else else
Database.SetRanchBuilding15(this.Id, 0); Database.SetRanchBuilding12(this.Id, 0);
if (buildings[15] != null) if (buildings[12] != null)
Database.SetRanchBuilding16(this.Id, buildings[15].Id); Database.SetRanchBuilding13(this.Id, buildings[12].Id);
else else
Database.SetRanchBuilding16(this.Id, 0); Database.SetRanchBuilding13(this.Id, 0);
} if (buildings[13] != null)
public RanchBuilding GetBuilding(int buildingId) Database.SetRanchBuilding14(this.Id, buildings[13].Id);
{ else
if (buildingId < 0) Database.SetRanchBuilding14(this.Id, 0);
return null; if (buildings[14] != null)
Database.SetRanchBuilding15(this.Id, buildings[14].Id);
if (buildingId >= buildings.Length) else
return null; Database.SetRanchBuilding15(this.Id, 0);
if (buildings[15] != null)
return buildings[buildingId]; Database.SetRanchBuilding16(this.Id, buildings[15].Id);
} else
public void SetBuilding(int buildingId, RanchBuilding value) Database.SetRanchBuilding16(this.Id, 0);
{ }
buildings[buildingId] = value; public RanchBuilding GetBuilding(int buildingId)
updateBuildings(); {
} if (buildingId < 0)
return null;
public string GetSwf(bool mine) if (buildingId >= buildings.Length)
{ return null;
string swf = "ranchviewer.swf?H=" + (upgradedLevel+1).ToString();
for(int i = 0; i < buildings.Length; i++) return buildings[buildingId];
{ }
swf += "&B" + (i+1).ToString() + "="; public void SetBuilding(int buildingId, RanchBuilding value)
if (buildings[i] != null) {
{ buildings[buildingId] = value;
swf += buildings[i].Id.ToString(); updateBuildings();
} }
}
if (mine)
swf += "&MINE=1"; public string GetSwf(bool mine)
return swf; {
} string swf = "ranchviewer.swf?H=" + (upgradedLevel+1).ToString();
for(int i = 0; i < buildings.Length; i++)
{
public Ranch(int x, int y, int id, int value) swf += "&B" + (i+1).ToString() + "=";
{ if (buildings[i] != null)
X = x; {
Y = y; swf += buildings[i].Id.ToString();
Id = id; }
Value = value; }
title = ""; if (mine)
description = ""; swf += "&MINE=1";
upgradedLevel = 0; return swf;
ownerId = -1; }
investedMoney = 0;
for (int i = 0; i < 16; i++)
buildings[i] = null; public Ranch(int x, int y, int id, int value)
bool owned = Database.IsRanchOwned(id); {
if (owned) X = x;
{ Y = y;
upgradedLevel = Database.GetRanchUpgradeLevel(id); Id = id;
title = Database.GetRanchTitle(id); Value = value;
description = Database.GetRanchDescription(id); title = "";
ownerId = Database.GetRanchOwner(id); description = "";
int b1 = Database.GetRanchBuilding1(id); upgradedLevel = 0;
int b2 = Database.GetRanchBuilding2(id); ownerId = -1;
int b3 = Database.GetRanchBuilding3(id); investedMoney = 0;
int b4 = Database.GetRanchBuilding4(id); for (int i = 0; i < 16; i++)
int b5 = Database.GetRanchBuilding5(id); buildings[i] = null;
int b6 = Database.GetRanchBuilding6(id); bool owned = Database.IsRanchOwned(id);
int b7 = Database.GetRanchBuilding7(id); if (owned)
int b8 = Database.GetRanchBuilding8(id); {
int b9 = Database.GetRanchBuilding9(id); upgradedLevel = Database.GetRanchUpgradeLevel(id);
int b10 = Database.GetRanchBuilding10(id); title = Database.GetRanchTitle(id);
int b11 = Database.GetRanchBuilding11(id); description = Database.GetRanchDescription(id);
int b12 = Database.GetRanchBuilding12(id); ownerId = Database.GetRanchOwner(id);
int b13 = Database.GetRanchBuilding13(id); int b1 = Database.GetRanchBuilding1(id);
int b14 = Database.GetRanchBuilding14(id); int b2 = Database.GetRanchBuilding2(id);
int b15 = Database.GetRanchBuilding15(id); int b3 = Database.GetRanchBuilding3(id);
int b16 = Database.GetRanchBuilding16(id); int b4 = Database.GetRanchBuilding4(id);
int b5 = Database.GetRanchBuilding5(id);
if (RanchBuilding.RanchBuildingExists(b1)) int b6 = Database.GetRanchBuilding6(id);
buildings[0] = RanchBuilding.GetRanchBuildingById(b1); int b7 = Database.GetRanchBuilding7(id);
if (RanchBuilding.RanchBuildingExists(b2)) int b8 = Database.GetRanchBuilding8(id);
buildings[1] = RanchBuilding.GetRanchBuildingById(b2); int b9 = Database.GetRanchBuilding9(id);
if (RanchBuilding.RanchBuildingExists(b3)) int b10 = Database.GetRanchBuilding10(id);
buildings[2] = RanchBuilding.GetRanchBuildingById(b3); int b11 = Database.GetRanchBuilding11(id);
if (RanchBuilding.RanchBuildingExists(b4)) int b12 = Database.GetRanchBuilding12(id);
buildings[3] = RanchBuilding.GetRanchBuildingById(b4); int b13 = Database.GetRanchBuilding13(id);
if (RanchBuilding.RanchBuildingExists(b5)) int b14 = Database.GetRanchBuilding14(id);
buildings[4] = RanchBuilding.GetRanchBuildingById(b5); int b15 = Database.GetRanchBuilding15(id);
if (RanchBuilding.RanchBuildingExists(b6)) int b16 = Database.GetRanchBuilding16(id);
buildings[5] = RanchBuilding.GetRanchBuildingById(b6);
if (RanchBuilding.RanchBuildingExists(b7)) if (RanchBuilding.RanchBuildingExists(b1))
buildings[6] = RanchBuilding.GetRanchBuildingById(b7); buildings[0] = RanchBuilding.GetRanchBuildingById(b1);
if (RanchBuilding.RanchBuildingExists(b8)) if (RanchBuilding.RanchBuildingExists(b2))
buildings[7] = RanchBuilding.GetRanchBuildingById(b8); buildings[1] = RanchBuilding.GetRanchBuildingById(b2);
if (RanchBuilding.RanchBuildingExists(b9)) if (RanchBuilding.RanchBuildingExists(b3))
buildings[8] = RanchBuilding.GetRanchBuildingById(b9); buildings[2] = RanchBuilding.GetRanchBuildingById(b3);
if (RanchBuilding.RanchBuildingExists(b10)) if (RanchBuilding.RanchBuildingExists(b4))
buildings[9] = RanchBuilding.GetRanchBuildingById(b10); buildings[3] = RanchBuilding.GetRanchBuildingById(b4);
if (RanchBuilding.RanchBuildingExists(b11)) if (RanchBuilding.RanchBuildingExists(b5))
buildings[10] = RanchBuilding.GetRanchBuildingById(b11); buildings[4] = RanchBuilding.GetRanchBuildingById(b5);
if (RanchBuilding.RanchBuildingExists(b12)) if (RanchBuilding.RanchBuildingExists(b6))
buildings[11] = RanchBuilding.GetRanchBuildingById(b12); buildings[5] = RanchBuilding.GetRanchBuildingById(b6);
if (RanchBuilding.RanchBuildingExists(b13)) if (RanchBuilding.RanchBuildingExists(b7))
buildings[12] = RanchBuilding.GetRanchBuildingById(b13); buildings[6] = RanchBuilding.GetRanchBuildingById(b7);
if (RanchBuilding.RanchBuildingExists(b14)) if (RanchBuilding.RanchBuildingExists(b8))
buildings[13] = RanchBuilding.GetRanchBuildingById(b14); buildings[7] = RanchBuilding.GetRanchBuildingById(b8);
if (RanchBuilding.RanchBuildingExists(b15)) if (RanchBuilding.RanchBuildingExists(b9))
buildings[14] = RanchBuilding.GetRanchBuildingById(b15); buildings[8] = RanchBuilding.GetRanchBuildingById(b9);
if (RanchBuilding.RanchBuildingExists(b16)) if (RanchBuilding.RanchBuildingExists(b10))
buildings[15] = RanchBuilding.GetRanchBuildingById(b16); buildings[9] = RanchBuilding.GetRanchBuildingById(b10);
if (RanchBuilding.RanchBuildingExists(b11))
buildings[10] = RanchBuilding.GetRanchBuildingById(b11);
InvestedMoney = Database.GetRanchInvestment(id); if (RanchBuilding.RanchBuildingExists(b12))
} buildings[11] = RanchBuilding.GetRanchBuildingById(b12);
} if (RanchBuilding.RanchBuildingExists(b13))
buildings[12] = RanchBuilding.GetRanchBuildingById(b13);
public RanchUpgrade GetRanchUpgrade() if (RanchBuilding.RanchBuildingExists(b14))
{ buildings[13] = RanchBuilding.GetRanchBuildingById(b14);
return RanchUpgrade.GetRanchUpgradeById(this.upgradedLevel + 1); if (RanchBuilding.RanchBuildingExists(b15))
} buildings[14] = RanchBuilding.GetRanchBuildingById(b15);
public static bool IsRanchHere(int x, int y) if (RanchBuilding.RanchBuildingExists(b16))
{ buildings[15] = RanchBuilding.GetRanchBuildingById(b16);
foreach (Ranch ranch in Ranches)
{
if (ranch.X == x && ranch.Y == y) InvestedMoney = Database.GetRanchInvestment(id);
return true; }
} }
return false;
} public RanchUpgrade GetRanchUpgrade()
public static bool RanchExists(int ranchId) {
{ return RanchUpgrade.GetRanchUpgradeById(this.upgradedLevel + 1);
foreach (Ranch ranch in Ranches) }
{ public static bool IsRanchHere(int x, int y)
if (ranch.Id == ranchId) {
return true; foreach (Ranch ranch in Ranches)
} {
return false; if (ranch.X == x && ranch.Y == y)
} return true;
public static Ranch GetRanchById(int ranchId) }
{ return false;
foreach (Ranch ranch in Ranches) }
{ public static bool RanchExists(int ranchId)
if (ranch.Id == ranchId) {
return ranch; foreach (Ranch ranch in Ranches)
} {
throw new KeyNotFoundException("No Ranch with id " + ranchId); if (ranch.Id == ranchId)
} return true;
public static Ranch GetRanchAt(int x, int y) }
{ return false;
foreach(Ranch ranch in Ranches) }
{ public static Ranch GetRanchById(int ranchId)
if (ranch.X == x && ranch.Y == y) {
return ranch; foreach (Ranch ranch in Ranches)
} {
throw new KeyNotFoundException("No Ranch found at x" + x + " y" + y); if (ranch.Id == ranchId)
} return ranch;
}
public static bool IsRanchOwned(int playerId) throw new KeyNotFoundException("No Ranch with id " + ranchId);
{ }
foreach (Ranch ranch in Ranches) public static Ranch GetRanchAt(int x, int y)
{ {
if (ranch.OwnerId == playerId) foreach(Ranch ranch in Ranches)
{ {
return true; if (ranch.X == x && ranch.Y == y)
} return ranch;
} }
return false; throw new KeyNotFoundException("No Ranch found at x" + x + " y" + y);
} }
public static Ranch GetRanchOwnedBy(int playerId)
{ public static bool GetOwnedRanch(int playerId)
foreach(Ranch ranch in Ranches) {
{ foreach (Ranch ranch in Ranches)
if(ranch.OwnerId == playerId) {
{ if (ranch.OwnerId == playerId)
return ranch; {
} return true;
} }
throw new KeyNotFoundException("Player " + playerId + " does not own a ranch."); }
} return false;
} }
} public static Ranch GetRanchOwnedBy(int playerId)
{
foreach(Ranch ranch in Ranches)
{
if(ranch.OwnerId == playerId)
{
return ranch;
}
}
throw new KeyNotFoundException("Player " + playerId + " does not own a ranch.");
}
}
}

4
HorseIsleServer/LibHISP/Game/Riddler.cs Normal file → Executable file
View file

@ -32,7 +32,7 @@ namespace HISP.Game
Database.CompleteRiddle(this.Id, user.Id); Database.CompleteRiddle(this.Id, user.Id);
byte[] riddleAnswerCorrectPacket = PacketBuilder.CreateChat(Messages.FormatRiddlerAnswerCorrect(this.Reason), PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] riddleAnswerCorrectPacket = PacketBuilder.CreateChat(Messages.FormatRiddlerAnswerCorrect(this.Reason), PacketBuilder.CHAT_BOTTOM_RIGHT);
user.LoggedinClient.SendPacket(riddleAnswerCorrectPacket); user.Client.SendPacket(riddleAnswerCorrectPacket);
user.AddMoney(10000); user.AddMoney(10000);
if(HasCompletedAllRiddles(user)) if(HasCompletedAllRiddles(user))
@ -42,7 +42,7 @@ namespace HISP.Game
public void AnswerFail(User user) public void AnswerFail(User user)
{ {
byte[] riddleIncorrect = PacketBuilder.CreateChat(Messages.RiddlerIncorrectAnswer, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] riddleIncorrect = PacketBuilder.CreateChat(Messages.RiddlerIncorrectAnswer, PacketBuilder.CHAT_BOTTOM_RIGHT);
user.LoggedinClient.SendPacket(riddleIncorrect); user.Client.SendPacket(riddleIncorrect);
} }
public bool CheckAnswer(User user, string txt) public bool CheckAnswer(User user, string txt)

27
HorseIsleServer/LibHISP/Game/Services/Auction.cs Normal file → Executable file
View file

@ -2,13 +2,14 @@
using HISP.Player; using HISP.Player;
using HISP.Security; using HISP.Security;
using HISP.Server; using HISP.Server;
using HISP.Util;
using System.Collections.Generic; using System.Collections.Generic;
namespace HISP.Game.Services namespace HISP.Game.Services
{ {
public class Auction public class Auction
{ {
private static List<Auction> auctionRooms = new List<Auction>(); private static ThreadSafeList<Auction> auctionRooms = new ThreadSafeList<Auction>();
public static Auction[] AuctionRooms public static Auction[] AuctionRooms
{ {
get get
@ -20,7 +21,7 @@ namespace HISP.Game.Services
public Auction(int id) public Auction(int id)
{ {
RoomId = id; RoomId = id;
auctionEntries = new List<AuctionEntry>(); auctionEntries = new ThreadSafeList<AuctionEntry>();
Database.LoadAuctionRoom(this, RoomId); Database.LoadAuctionRoom(this, RoomId);
} }
@ -37,7 +38,7 @@ namespace HISP.Game.Services
if(BidUser.HorseInventory.HorseList.Length >= BidUser.MaxHorses) if(BidUser.HorseInventory.HorseList.Length >= BidUser.MaxHorses)
{ {
byte[] tooManyHorses = PacketBuilder.CreateChat(Messages.AuctionYouHaveTooManyHorses, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] tooManyHorses = PacketBuilder.CreateChat(Messages.AuctionYouHaveTooManyHorses, PacketBuilder.CHAT_BOTTOM_RIGHT);
BidUser.LoggedinClient.SendPacket(tooManyHorses); BidUser.Client.SendPacket(tooManyHorses);
return; return;
} }
@ -46,7 +47,7 @@ namespace HISP.Game.Services
if(BidAmount >= MAX_BID) if(BidAmount >= MAX_BID)
{ {
byte[] maxBidReached = PacketBuilder.CreateChat(Messages.AuctionBidMax, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] maxBidReached = PacketBuilder.CreateChat(Messages.AuctionBidMax, PacketBuilder.CHAT_BOTTOM_RIGHT);
BidUser.LoggedinClient.SendPacket(maxBidReached); BidUser.Client.SendPacket(maxBidReached);
return; return;
} }
@ -55,7 +56,7 @@ namespace HISP.Game.Services
{ {
byte[] cantAffordBid = PacketBuilder.CreateChat(Messages.AuctionCantAffordBid, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] cantAffordBid = PacketBuilder.CreateChat(Messages.AuctionCantAffordBid, PacketBuilder.CHAT_BOTTOM_RIGHT);
BidUser.LoggedinClient.SendPacket(cantAffordBid); BidUser.Client.SendPacket(cantAffordBid);
return; return;
} }
@ -77,7 +78,7 @@ namespace HISP.Game.Services
if(entry.RandomId != AuctionItem.RandomId && entry.HighestBidder == BidUser.Id) if(entry.RandomId != AuctionItem.RandomId && entry.HighestBidder == BidUser.Id)
{ {
byte[] cantWinTooMuch = PacketBuilder.CreateChat(Messages.AuctionOnlyOneWinningBidAllowed, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] cantWinTooMuch = PacketBuilder.CreateChat(Messages.AuctionOnlyOneWinningBidAllowed, PacketBuilder.CHAT_BOTTOM_RIGHT);
BidUser.LoggedinClient.SendPacket(cantWinTooMuch); BidUser.Client.SendPacket(cantWinTooMuch);
return; return;
} }
} }
@ -91,7 +92,7 @@ namespace HISP.Game.Services
{ {
User oldBidder = GameServer.GetUserById(AuctionItem.HighestBidder); User oldBidder = GameServer.GetUserById(AuctionItem.HighestBidder);
byte[] outbidMessage = PacketBuilder.CreateChat(Messages.FormatAuctionYourOutbidBy(BidUser.Username, AuctionItem.HighestBid), PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] outbidMessage = PacketBuilder.CreateChat(Messages.FormatAuctionYourOutbidBy(BidUser.Username, AuctionItem.HighestBid), PacketBuilder.CHAT_BOTTOM_RIGHT);
oldBidder.LoggedinClient.SendPacket(outbidMessage); oldBidder.Client.SendPacket(outbidMessage);
} }
} }
@ -104,7 +105,7 @@ namespace HISP.Game.Services
} }
byte[] bidPlacedMsg = PacketBuilder.CreateChat(yourBidRaisedTo, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] bidPlacedMsg = PacketBuilder.CreateChat(yourBidRaisedTo, PacketBuilder.CHAT_BOTTOM_RIGHT);
BidUser.LoggedinClient.SendPacket(bidPlacedMsg); BidUser.Client.SendPacket(bidPlacedMsg);
} }
@ -122,7 +123,7 @@ namespace HISP.Game.Services
public HorseInstance Horse; public HorseInstance Horse;
public int OwnerId; public int OwnerId;
private List<AuctionBid> bidders = new List<AuctionBid>(); private ThreadSafeList<AuctionBid> bidders = new ThreadSafeList<AuctionBid>();
public AuctionBid[] Bidders public AuctionBid[] Bidders
{ {
get get
@ -151,7 +152,7 @@ namespace HISP.Game.Services
User auctionRunner = GameServer.GetUserById(highestBidder); User auctionRunner = GameServer.GetUserById(highestBidder);
auctionRunner.HorseInventory.UnHide(Horse.RandomId); auctionRunner.HorseInventory.UnHide(Horse.RandomId);
byte[] notSold = PacketBuilder.CreateChat(Messages.AuctionNoHorseBrought, PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] notSold = PacketBuilder.CreateChat(Messages.AuctionNoHorseBrought, PacketBuilder.CHAT_BOTTOM_RIGHT);
auctionRunner.LoggedinClient.SendPacket(notSold); auctionRunner.Client.SendPacket(notSold);
} }
return; return;
} }
@ -161,7 +162,7 @@ namespace HISP.Game.Services
{ {
User userWon = GameServer.GetUserById(highestBidder); User userWon = GameServer.GetUserById(highestBidder);
byte[] wonAuction = PacketBuilder.CreateChat(Messages.FormatAuctionBroughtHorse(highestBid), PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] wonAuction = PacketBuilder.CreateChat(Messages.FormatAuctionBroughtHorse(highestBid), PacketBuilder.CHAT_BOTTOM_RIGHT);
userWon.LoggedinClient.SendPacket(wonAuction); userWon.Client.SendPacket(wonAuction);
userWon.TakeMoney(highestBid); userWon.TakeMoney(highestBid);
userWon.HorseInventory.AddHorse(Horse, false); userWon.HorseInventory.AddHorse(Horse, false);
} }
@ -174,7 +175,7 @@ namespace HISP.Game.Services
{ {
User userSold = GameServer.GetUserById(OwnerId); User userSold = GameServer.GetUserById(OwnerId);
byte[] horseSold = PacketBuilder.CreateChat(Messages.FormatAuctionHorseSold(highestBid), PacketBuilder.CHAT_BOTTOM_RIGHT); byte[] horseSold = PacketBuilder.CreateChat(Messages.FormatAuctionHorseSold(highestBid), PacketBuilder.CHAT_BOTTOM_RIGHT);
userSold.LoggedinClient.SendPacket(horseSold); userSold.Client.SendPacket(horseSold);
userSold.AddMoney(highestBid); userSold.AddMoney(highestBid);
userSold.HorseInventory.DeleteHorse(Horse, false); userSold.HorseInventory.DeleteHorse(Horse, false);
} }
@ -297,7 +298,7 @@ namespace HISP.Game.Services
auctionEntries.Add(entry); auctionEntries.Add(entry);
} }
private List<AuctionEntry> auctionEntries; private ThreadSafeList<AuctionEntry> auctionEntries;
public int RoomId; public int RoomId;
public AuctionEntry[] AuctionEntries public AuctionEntry[] AuctionEntries

0
HorseIsleServer/LibHISP/Game/Services/Barn.cs Normal file → Executable file
View file

0
HorseIsleServer/LibHISP/Game/Services/Farrier.cs Normal file → Executable file
View file

0
HorseIsleServer/LibHISP/Game/Services/Groomer.cs Normal file → Executable file
View file

Some files were not shown because too many files have changed in this diff Show more