update README, add sample files for localhosting (#2)

* update README, add sample files for localhosting

* fix port number in sample DWADragonsMain.xml

* update readme

* update itemid schema info

* update appsettings comments

---------

Co-authored-by: Spirtix <michal.prazak1@gmail.com>
This commit is contained in:
rpaciorek 2024-02-25 16:55:00 +00:00 committed by GitHub
parent 97503cc389
commit 4662bbd629
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 848 additions and 32 deletions

View File

@ -1,33 +1,64 @@
# SoD-Off - School of Dragons, Offline # SoDOff - School of Dragons, Offline
On 7th June, 2023, School of Dragons announced they were "sunsetting" the game, and turning the servers off on the 30th of June. On 7th June 2023, School of Dragons announced they were "sunsetting" the game, and turning the servers off on the 30th of June.
At that time, SoDOff was born. Currently, it is an almost complete implementation of the School of Dragons API server (and some other JS games).
It allows you to run SoD offline as well as host private online servers.
## Discord We also provide MMO server implementation for SoD (https://github.com/SoDOff-Project/sodoff-mmo).
[![Discord Banner](https://discordapp.com/api/guilds/1124405524679643318/widget.png?style=banner2)](https://discord.gg/bqHtMRbhM3) It is recommended to use the MMO server even when offline, as some aspects of the single player game depend on MMO.
## License
SoDOff is open source, distributed under the [AGPL](LICENSE) license.
This license does not cover resources obtained from the game or from responses of the original API distributed with the API server, especially:
`missions.xml`, `items.xml`, `allranks.xml` and `store.xml` files from the `src/Resources` directory and files inside the `src/assets` directory.
## Getting started ## Getting started
For the first time setup, run the following command: To build the API server from sources, you'll need the dotnet 6.0 SDK. Simply run the following command to build and start the server:
``` ```
dotnet restore
```
Then run the server as follows:
```
# run mitmproxy to redirect requests to the app
mitmproxy -s mitm-redirect.py
# run the server
dotnet run --project src/sodoff.csproj dotnet run --project src/sodoff.csproj
``` ```
Then run School of Dragons. ### Modifying the Client
To play the game you need to modify the game client to use `http://localhost:5001/.com/DWADragonsUnity/` instead of `http://media.jumpstart.com/DWADragonsUnity/`.
You can do this by editing `DOMain_Data/resources.assets` in a hex-editor and swapping the URLs.
### Server Configuration
Most of the server configuration is stored in `appsettings.json`. Check out the "// ..." keys in there for descriptions of different options.
#### Supported Clients
For each supported client version, there must be a corresponding file located at `assets/DWADragonsUnity/{PLATFORM}/{VERSION}/DWADragonsMain.xml`.
By default (modifiable in appsettings.json), files for version 2.5.0 and newer will be automatically encrypted to meet the client's requirements.
A sample file is provided for `{PLATFORM} = WIN`, `{VERSION} = 3.31.0`.
It assumes that the server address are `localhost:5000` (API) and `localhost:5001` (assets).
#### Asset Server
Various settings for the asset server are customizable, with the key one being `ProviderURL`, which specifies the source for downloading assets in `partial` mode. By default, it's configured to use archive.org
Please do not abuse the archive.org server, do not disable the `UseCache` option and do not delete the contents of the `asset-cache` directory.
#### Listening address/port
By default, the server listens on all IPv4 and IPv6 addresses on ports 5000 (API) and 5001 (assets).
You can tweak this in `appsettings.json`, but it might also mean adjusting `DWADragonsMain.xml` and updating clients to reflect the changes in the asset server address.
### Server Side Modding
The server supports server side modifications, which includes adding new items and putting them in the store without having to modify the server source code.
For more information, check out [src/mods/README-MODDING.md](src/mods/README-MODDING.md).
## Status ## Status
### What works ### What works
Almost everything:
- register/login - register/login
- create profile - create profile
- list profiles - list profiles
@ -41,6 +72,14 @@ Then run School of Dragons.
- minigames - minigames
- MMO (using sodoff-mmo) - MMO (using sodoff-mmo)
### What doesn't work
- play as Guest
- friends
- clans
- in-game messaging system (Terrible Mail)
### Methods ### Methods
#### Fully implemented #### Fully implemented

View File

@ -1,15 +0,0 @@
{
"Kestrel": {
"EndPoints": {
"Http": {
"Url": "http://localhost:5000"
}
}
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -0,0 +1,37 @@
{
"Kestrel": {
"EndPoints": {
"Http": {
"Url": "Listening URL for the API server - allows setting the listening IP address and port number -> http://ip.ip.ip.ip:port/ or http://[ip::ip]:port/"
}
}
},
"AssetServer": {
"Enabled": true,
"ListenIP": ,
"Port": ",
"URLPrefix": "",
"Mode":
"ProviderURL":
"AutoEncryptRegexp":
"AutoEncryptKey": ,
"SubstituteMissingLocalAssets": ,
"UseCache":
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
"AssetServer": {
"Enabled": true,
"Port": 881, //Only for the asset server
"URLPrefix": "a.com", //
"Mode": "partial", //
"ProviderURL": "https://media.sodoff.spirtix.com/", //
"SubstituteMissingLocalAssets": true //
}

View File

@ -2,10 +2,43 @@
"Kestrel": { "Kestrel": {
"EndPoints": { "EndPoints": {
"Http": { "Http": {
"Url": "http://localhost:5000" "// Url": "Listening URL for the API server - allows setting the listening IP address and port number -> http://ip.ip.ip.ip:port/ or http://[ip::ip]:port/",
"Url": "http://*:5000"
} }
} }
}, },
"AssetServer": {
"// Enabled": "Set to false to disable the built-in asset server",
"Enabled": true,
"// ListenIP": "Listening IP address for the asset server, default is '*' which represents all IPv4 and IPv6 addresses",
"ListenIP": "*",
"// Port": "Listening port number for the asset server. Should be different than for the server API",
"Port": 5001,
"// URLPrefix": "Extra prefix in the URL; omitted while retrieving the path from the requested URL. For example, if set to '.com', then a request to http://localhost/.com/abc will return the 'abc' file from the assets folder",
"URLPrefix": ".com",
"// Mode": "Two modes: full - everything is local, partial - downloads assets from ProviderURL if not found locally",
"Mode": "partial",
"// ProviderURL": "Proxy URL used in partial mode",
"ProviderURL": "https://web.archive.org/web/20230713000000id_/https://media.jumpstart.com/",
"// AutoEncryptRegexp": "Regular expression matched against the URL local part. If there's a match, the returned file will be encrypted on-the-fly using 3DES with AutoEncryptKey as the key",
"AutoEncryptRegexp": "/(2\\.[5-9]|2\\.[1-9][0-9]|3\\.[0-9]+)\\.[0-9]/DWADragonsMain.xml$",
"// AutoEncryptKey": "3DES key for encrypted files",
"AutoEncryptKey": "C92EC1AA-54CD-4D0C-A8D5-403FCCF1C0BD",
"// SubstituteMissingLocalAssets": "When true, if the game requests a High asset and only Low is available, it will return Low instead of downloading (partial mode) or error 404 (full mode)",
"SubstituteMissingLocalAssets": true,
"// UseCache": "When true, downloading assets in partial mode will be stored in assets-cache for use in subsequent requests",
"UseCache": true
},
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {
"Default": "Information", "Default": "Information",

View File

@ -0,0 +1,222 @@
<?xml version="1.0" encoding="utf-8"?>
<ProductConfig>
<!-- API SERVER CONFIG -->
<ContentServerURL>http://localhost:5000/ContentWebService.asmx/</ContentServerURL>
<ContentServerV2URL>http://localhost:5000/V2/ContentWebService.asmx/</ContentServerV2URL>
<ContentServerV3URL>http://localhost:5000/v3/ContentWebService.asmx/</ContentServerV3URL>
<ContentServerV4URL>http://localhost:5000/V4/ContentWebService.asmx/</ContentServerV4URL>
<TrackServerURL>http://localhost:5000/ContentWebService.asmx/</TrackServerURL>
<ItemStoreServerURL>http://localhost:5000/ItemStoreWebService.asmx/</ItemStoreServerURL>
<AchievementServerURL>http://localhost:5000/AchievementWebService.asmx/</AchievementServerURL>
<AchievementServerV2URL>http://localhost:5000/V2/AchievementWebService.asmx/</AchievementServerV2URL>
<MembershipServerURL>http://localhost:5000/MembershipWebService.asmx/</MembershipServerURL>
<AuthenticationServerURL>http://localhost:5000/AuthenticationWebService.asmx/</AuthenticationServerURL>
<AuthenticationServerV3URL>http://localhost:5000/v3/AuthenticationWebService.asmx/</AuthenticationServerV3URL>
<RegistrationServerV3URL>http://localhost:5000/v3/RegistrationWebService.asmx/</RegistrationServerV3URL>
<RegistrationServerV4URL>http://localhost:5000/V4/RegistrationWebService.asmx/</RegistrationServerV4URL>
<UserServerURL>http://localhost:5000/ProfileWebService.asmx/</UserServerURL>
<ConfigurationServerURL>http://localhost:5000/ConfigurationWebService.asmx/</ConfigurationServerURL>
<RatingServerV2URL>http://localhost:5000/V2/Ratingwebservice.asmx/</RatingServerV2URL>
<ChallengeServerURL>http://localhost:5000/ChallengeWebService.asmx/</ChallengeServerURL>
<MessagingServerURL>http://localhost:5000/MessagingWebService.asmx/</MessagingServerURL>
<!-- not implemented - social system -->
<GroupServerURL>http://localhost:5000/GroupWebService.asmx/</GroupServerURL>
<GroupServerV2URL>http://localhost:5000/V2/GroupWebService.asmx/</GroupServerV2URL>
<MessageServerURL>http://localhost:5000/MessageWebService.asmx/</MessageServerURL>
<MessageServerV2URL>http://localhost:5000/v2/MessageWebService.asmx/</MessageServerV2URL>
<MessageServerV3URL>http://localhost:5000/v3/MessageWebService.asmx/</MessageServerV3URL>
<InviteServerV2URL>http://localhost:5000/v2/InviteFriendWebService.asmx/</InviteServerV2URL>
<ChatServerURL>http://localhost:5000/ChatWebService.asmx/</ChatServerURL>
<!-- unused -->
<AnalyticsServerURL>http://localhost/AnalyticsWebService.asmx/</AnalyticsServerURL>
<MissionServerURL>http://localhost/MissionWebService.asmx/</MissionServerURL>
<AvatarWebServiceURL>http://localhost/AvatarWebService.asmx/</AvatarWebServiceURL>
<RatingServerURL>http://localhost/RatingWebService.asmx/</RatingServerURL>
<ScoreServerURL>http://localhost/ScoreWebService.asmx/</ScoreServerURL>
<MobileStoreURL>http://localhost/MobileStoreWebService.asmx/</MobileStoreURL>
<SubscriptionServerURL>http://localhost/SubscriptionWebService.asmx/</SubscriptionServerURL>
<PaymentServerURL>http://localhost/PaymentWebService.asmx/</PaymentServerURL>
<PaymentServerV2URL>http://localhost/V2/PaymentWebService.asmx/</PaymentServerV2URL>
<PrizeCodeServerURL>http://localhost/PrizeCodeWebService.asmx/</PrizeCodeServerURL>
<PrizeCodeServerV2URL>http://localhost/Common/V2/PrizeCodeWebService.asmx/</PrizeCodeServerV2URL>
<CalendarServerURL>http://localhost/ContentServer/CalendarWebService.asmx/</CalendarServerURL>
<PushNotificationURL>http://localhost/RegistrationWebService.asmx/</PushNotificationURL>
<LocaleServerURL>http://localhost/LocaleService.asmx/</LocaleServerURL>
<LocaleServerV2URL>http://localhost/V2/LocaleWebService.asmx/</LocaleServerV2URL>
<TokenExpiredURL>http://localhost/launch.aspx</TokenExpiredURL>
<!-- SMARTFOX SERVER CONFIG -->
<MMOServer>localhost</MMOServer>
<MMOServerPort>9933</MMOServerPort>
<MMOServerVersion>S2X</MMOServerVersion>
<MMOIdleTimeout>240</MMOIdleTimeout>
<MMODebug>false</MMODebug>
<MMOHttpPort>8080</MMOHttpPort>
<MMOUseBlueBox>false</MMOUseBlueBox>
<MMOBlueBoxPollingRate>500</MMOBlueBoxPollingRate>
<MMOUDPPollingRate>500</MMOUDPPollingRate>
<ZoneInfoUpdateInterval>300000</ZoneInfoUpdateInterval>
<!-- ASSET SERVER CONFIGURATION -->
<RootURL>http://localhost:5001/.com/DWADragonsUnity/WIN/{Version}/Mid/</RootURL>
<ContentDataURL>http://localhost:5001/.com/DWADragonsUnity/WIN/{Version}/Mid/contentdata</ContentDataURL>
<DataURL>http://localhost:5001/.com/DWADragonsUnity/WIN/{Version}/Mid/data</DataURL>
<SceneURL>http://localhost:5001/.com/DWADragonsUnity/WIN/{Version}/Mid/scene</SceneURL>
<SharedDataURL>http://localhost:5001/.com/DWADragonsUnity/WIN/{Version}/Mid/shareddata</SharedDataURL>
<SoundURL>http://localhost:5001/.com/DWADragonsUnity/WIN/{Version}/Mid/sound</SoundURL>
<MoviesURL>http://localhost:5001/.com/DWADragonsUnity/WIN/{Version}/Mid/movies</MoviesURL>
<LocalRootURL>.</LocalRootURL>
<LocalContentDataURL>./contentdata</LocalContentDataURL>
<LocalDataURL>./data</LocalDataURL>
<LocalSceneURL>./scene</LocalSceneURL>
<LocalSharedDataURL>./shareddata</LocalSharedDataURL>
<LocalSoundURL>./sound</LocalSoundURL>
<LocalMoviesURL>./movies</LocalMoviesURL>
<AppURL>.</AppURL>
<Token></Token>
<LogEventServer>127.0.0.1</LogEventServer>
<ConsolePassword>6c955c0b5efd67396e950f56542e86b6</ConsolePassword>
<UnityCacheSize>2000000000</UnityCacheSize>
<Manifests>dwavatar</Manifests>
<EnablePlayfab>false</EnablePlayfab>
<TokenExpiredText>
<Text>Your Viking is now idle. Click on the OK button to reconnect.</Text>
<ID>42286</ID>
</TokenExpiredText>
<LoginFromOtherLocationText>
<Text>You have been logged out because you have signed in from another computer or device.</Text>
<ID>9000</ID>
</LoginFromOtherLocationText>
<DisconnectText>
<Text>Your Viking is now idle. Click on the OK button to reconnect.</Text>
<ID>9001</ID>
</DisconnectText>
<DisconnectTitleText>
<Text>Notification</Text>
<ID>10674</ID>
</DisconnectTitleText>
<ProductRuleFailedText>
<Text>Download failed, please retry! Possible invalid DES secret in client!</Text>
<ID>42287</ID>
</ProductRuleFailedText>
<PlatformSettings Name="default">
<MaxMMOData DefaultMaxMMO="50" DefaultMaxFullMMO="50" />
<GraphicsSettings>
<Texture>
<Default>Mid</Default>
<Available>Low,Mid,High</Available>
</Texture>
<Shadow>
<Default>High</Default>
<Available>Off,Low,Mid,High</Available>
</Shadow>
<Effects>
<Default>Low</Default>
<Available>Off,Low,Mid,High</Available>
</Effects>
</GraphicsSettings>
<DownloadTextureSize>128</DownloadTextureSize>
</PlatformSettings>
<Locale>
<ID>en-US</ID>
</Locale>
<Locale>
<ID>es-MX</ID>
<Variant>es</Variant>
<Variant>es-ES</Variant>
<Variant>es-LA</Variant>
<Variant>es-US</Variant>
<Variant>es_ES</Variant>
<Variant>es_LA</Variant>
<Variant>es_MX</Variant>
<Variant>es_US</Variant>
<Variant>spanish</Variant>
</Locale>
<Locale>
<ID>pt-BR</ID>
<Variant>pt</Variant>
<Variant>pt-PT</Variant>
<Variant>pt_BR</Variant>
<Variant>pt_PT</Variant>
<Variant>brazilian</Variant>
</Locale>
<Locale>
<ID>zh-CN</ID>
<Variant>zh</Variant>
<Variant>zh-Hans</Variant>
<Variant>zh_CN</Variant>
<Variant>zh_Hans</Variant>
<Variant>schinese</Variant>
</Locale>
<Locale>
<ID>de-DE</ID>
<Variant>de</Variant>
<Variant>de-CH</Variant>
<Variant>de_DE</Variant>
<Variant>de_CH</Variant>
<Variant>german</Variant>
</Locale>
<Locale>
<ID>fr-CA</ID>
<Variant>fr</Variant>
<Variant>fr-FR</Variant>
<Variant>fr-CH</Variant>
<Variant>fr_CA</Variant>
<Variant>fr_FR</Variant>
<Variant>fr_CH</Variant>
<Variant>french</Variant>
</Locale>
<Locale>
<ID>ko-KR</ID>
<Variant>ko</Variant>
<Variant>ko_KR</Variant>
<Variant>koreana</Variant>
</Locale>
<Locale>
<ID>ru-RU</ID>
<Variant>ru</Variant>
<Variant>ru_RU</Variant>
<Variant>russian</Variant>
</Locale>
<Locale>
<ID>th-TH</ID>
<Variant>th</Variant>
<Variant>th-TH</Variant>
<Variant>th_TH</Variant>
</Locale>
<Locale>
<ID>ar-EG</ID>
<Variant>ar</Variant>
<Variant>ar-DZ</Variant>
<Variant>ar-BH</Variant>
<Variant>ar-IQ</Variant>
<Variant>ar-JO</Variant>
<Variant>ar-KW</Variant>
<Variant>ar-LB</Variant>
<Variant>ar-LY</Variant>
<Variant>ar-MA</Variant>
<Variant>ar-OM</Variant>
<Variant>ar-QA</Variant>
<Variant>ar-SA</Variant>
<Variant>ar-SY</Variant>
<Variant>ar-TN</Variant>
<Variant>ar-AE</Variant>
<Variant>ar-YE</Variant>
</Locale>
</ProductConfig>

408
src/assets/ServerDown.xml Normal file
View File

@ -0,0 +1,408 @@
<?xml version="1.0" encoding="utf-8"?>
<ServerDown>
<Down>false</Down>
<CudosDown>true</CudosDown>
<Message>
<ProductGroupID>11</ProductGroupID>
<Locale>en-US</Locale>
<Title>Update</Title>
<!-->For Unplanned Maintenance <-->
<!--><Text><![CDATA[
Alert! Weve encountered an unexpected weather delay! Our servers have been covered to protect them. Check back soon.
]]>
</Text> -->
<!-->For Planned Maintenance <-->
<Text><![CDATA[
The SoDOff server is down because the emulator is being updated. Check back in a few minutes.
]]>
</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>en-US</Locale>
<Title>Update</Title>
<!-->For Unplanned Maintenance <-->
<!--><Text><![CDATA[
Oh no, looks like the Terrible Terrors are at it again! We hid our servers to protect them. Check back soon.
]]>
</Text> -->
<!-->For Planned Maintenance <-->
<Text><![CDATA[
The SoDOff server is down because the emulator is being updated. Check back in a few minutes.
]]>
</Text>
</Message>
<Message>
<ProductGroupID>1</ProductGroupID>
<Locale>en-US</Locale>
<Title>Update</Title>
<!-->For Unplanned Maintenance <-->
<!--><Text><![CDATA[
Alert! Weve encountered an unexpected weather delay! Our servers have been covered to protect them. Check back soon.
]]>
</Text><-->
<!-->For Planned Maintenance <-->
<Text><![CDATA[
The SoDOff server is down because the emulator is being updated. Check back in a few minutes.
]]>
</Text>
</Message>
<Message>
<ProductGroupID>17</ProductGroupID>
<Locale>en-US</Locale>
<Title>Update</Title>
<!-->For Unplanned Maintenance <-->
<!--><Text><![CDATA[
Alert! Weve encountered an unexpected weather delay! Our servers have been covered to protect them. Check back soon.
]]>
</Text><-->
<!-->For Planned Maintenance <-->
<Text><![CDATA[
The SoDOff server is down because the emulator is being updated. Check back in a few minutes.
]]>
</Text>
</Message>
<Message>
<ProductGroupID>15</ProductGroupID>
<Locale>en-US</Locale>
<Title>Update</Title>
<!-->For Unplanned Maintenance <-->
<!--><Text><![CDATA[
Message from Aurrick: I broke the servers but don't worry. I'm stealing new ones. Back soon!
]]>
</Text><-->
<!-->For Planned Maintenance <-->
<Text><![CDATA[
The SoDOff server is down because the emulator is being updated. Check back in a few minutes.
]]>
</Text>
</Message>
<Message>
<ProductGroupID>14</ProductGroupID>
<Locale>en-US</Locale>
<Title>Update</Title>
<!-->For Unplanned Maintenance <-->
<!--><Text><![CDATA[
Oh no, looks like the Shadow Punks have attacked the server! We hid our servers to protect them. Check back soon.
]]>
</Text><-->
<!-->For Planned Maintenance <-->
<Text><![CDATA[
The SoDOff server is down because the emulator is being updated. Check back in a few minutes.
]]>
</Text>
</Message>
<Message>
<ProductGroupID>12</ProductGroupID>
<Locale>en-US</Locale>
<Title>Update</Title>
<!-->For Unplanned Maintenance <-->
<!--><Text><![CDATA[
Oh no! It looks like Dave is at it again with his Medusa Serum! We hid our servers to protect them. Check back soon!
]]>
</Text><-->
<!-->For Planned Maintenance <-->
<Text><![CDATA[
The SoDOff server is down because the emulator is being updated. Check back in a few minutes.
]]>
</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>es-MX</Locale>
<Title>Update</Title>
<!-->For Unplanned Maintenance <-->
<!--><Text><![CDATA[
¡Oh no, parece que el Terrible Terror está haciendo desastres otra vez! Escondimos nuestros servidores para protegerlos.¡Regresa pronto!
]]>
</Text><-->
<!-->For Planned Maintenance <-->
<Text><![CDATA[
The SoDOff server is down because the emulator is being updated. Check back in a few minutes.
]]>
</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>pt-BR</Locale>
<Title>Update</Title>
<!-->For Unplanned Maintenance <-->
<!--><Text><![CDATA[
Essa não! Pelo jeito, os Terrible Terrors estão aprontando novamente! Escondemos nossos servidores para protegê-los. Volte em breve!
]]>
</Text><-->
<!-->For Planned Maintenance <-->
<Text><![CDATA[
The SoDOff server is down because the emulator is being updated. Check back in a few minutes.
]]>
</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>zh-CN</Locale>
<Title>Update</Title>
<!-->For Unplanned Maintenance <-->
<!--><Text><![CDATA[
恐怖龙又搞事啦!我们把服务器都藏起来,进行保护。回见喽!
]]>
</Text><-->
<!-->For Planned Maintenance <-->
<Text><![CDATA[
The SoDOff server is down because the emulator is being updated. Check back in a few minutes.
]]>
</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>fr-CA</Locale>
<Title>Update</Title>
<!-->For Unplanned Maintenance <-->
<!--><Text><![CDATA[
Oh no, looks like the Terrible Terrors are at it again! We hid our servers to protect them. Check back soon!
]]>
</Text><-->
<!-->For Planned Maintenance <-->
<Text><![CDATA[
The SoDOff server is down because the emulator is being updated. Check back in a few minutes.
]]>
</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>de-DE</Locale>
<Title>Update</Title>
<!-->For Unplanned Maintenance <-->
<!--><Text><![CDATA[
Oh no, looks like the Terrible Terrors are at it again! We hid our servers to protect them. Check back soon.
]]>
</Text><-->
<!-->For Planned Maintenance <-->
<Text><![CDATA[
The SoDOff server is down because the emulator is being updated. Check back in a few minutes.
]]>
</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>ko-KR</Locale>
<Title>Update</Title>
<!-->For Unplanned Maintenance <-->
<!--><Text><![CDATA[
Oh no, looks like the Terrible Terrors are at it again! We hid our servers to protect them. Check back soon.
]]>
</Text><-->
<!-->For Planned Maintenance <-->
<Text><![CDATA[
The SoDOff server is down because the emulator is being updated. Check back in a few minutes.
]]>
</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>ru-RU</Locale>
<Title>Update</Title>
<!-->For Unplanned Maintenance <-->
<!--><Text><![CDATA[
Oh no, looks like the Terrible Terrors are at it again! We hid our servers to protect them. Check back soon.
]]>
</Text><-->
<!-->For Planned Maintenance <-->
<Text><![CDATA[
The SoDOff server is down because the emulator is being updated. Check back in a few minutes.
]]>
</Text>
</Message>
<Message>
<ProductGroupID>10</ProductGroupID>
<Locale>en-US</Locale>
<!-->For Unplanned Maintenance <-->
<!--><Text>Alert! Weve encountered an unexpected weather delay! Our servers have been covered to protect them. Check back soon.</Text><-->
<!-->For Planned Maintenance <-->
<Title>Update</Title>
<Text>The SoDOff server is down because the emulator is being updated. Check back in a few minutes.</Text>
</Message>
<Scheduled>
<!-- Date format needs to be MM/dd/yyyy hh:mm AM/PM PST TimeZone-->
<StartTime>07/30/2023 11:59 PM</StartTime>
<EndTime>12/31/2035 12:00 AM</EndTime>
<ModifiedTime>05/30/2023 10:48 AM</ModifiedTime>
<Message>
<ProductGroupID>12</ProductGroupID>
<Locale>en-US</Locale>
<Title>NOTICE</Title>
<Text>Welcome back dragon rider!
Welcome to SoDOff Experimental Server!
SoDOff is a School of Dragons server emulator. The emulator is in very early stages of development, many features are currently missing. Things can and WILL break!
Please note that we are not associated with JumpStart or DreamWorks.
- The SoDOff Team</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>en-US</Locale>
<Title>NOTICE</Title>
<Text>Welcome back dragon rider!
Welcome to SoDOff Experimental Server!
SoDOff is a School of Dragons server emulator. The emulator is in very early stages of development, many features are currently missing. Things can and WILL break!
Please note that we are not associated with JumpStart or DreamWorks.
- The SoDOff Team
</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>de-DE</Locale>
<Title>NOTIZ</Title>
<Text>Welcome back dragon rider!
Welcome to SoDOff Experimental Server!
SoDOff is a School of Dragons server emulator. The emulator is in very early stages of development, many features are currently missing. Things can and WILL break!
Please note that we are not associated with JumpStart or DreamWorks.
- The SoDOff Team
</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>es-MX</Locale>
<Title>Apagado de Servidores</Title>
<Text>Welcome back dragon rider!
Welcome to SoDOff Experimental Server!
SoDOff is a School of Dragons server emulator. The emulator is in very early stages of development, many features are currently missing. Things can and WILL break!
Please note that we are not associated with JumpStart or DreamWorks.
- The SoDOff Team
</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>fr-CA</Locale>
<Title>Arrêt des serveurs</Title>
<Text>Welcome back dragon rider!
Welcome to SoDOff Experimental Server!
SoDOff is a School of Dragons server emulator. The emulator is in very early stages of development, many features are currently missing. Things can and WILL break!
Please note that we are not associated with JumpStart or DreamWorks.
- The SoDOff Team
</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>ko-KR</Locale>
<Title>서버 셧다운</Title>
<Text>Welcome back dragon rider!
Welcome to SoDOff Experimental Server!
SoDOff is a School of Dragons server emulator. The emulator is in very early stages of development, many features are currently missing. Things can and WILL break!
Please note that we are not associated with JumpStart or DreamWorks.
- The SoDOff Team
</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>pt-BR</Locale>
<Title>Desligamento dos servidores</Title>
<Text>Welcome back dragon rider!
Welcome to SoDOff Experimental Server!
SoDOff is a School of Dragons server emulator. The emulator is in very early stages of development, many features are currently missing. Things can and WILL break!
Please note that we are not associated with JumpStart or DreamWorks.
- The SoDOff Team</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>ru-RU</Locale>
<Title>Выключение серверов</Title>
<Text>Welcome back dragon rider!
Welcome to SoDOff Experimental Server!
SoDOff is a School of Dragons server emulator. The emulator is in very early stages of development, many features are currently missing. Things can and WILL break!
Please note that we are not associated with JumpStart or DreamWorks.
- The SoDOff Team</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>th-TH</Locale>
<Title>การปิดเซิร์ฟเวอร์</Title>
<Text>Welcome back dragon rider!
Welcome to SoDOff Experimental Server!
SoDOff is a School of Dragons server emulator. The emulator is in very early stages of development, many features are currently missing. Things can and WILL break!
Please note that we are not associated with JumpStart or DreamWorks.
- The SoDOff Team</Text>
</Message>
<Message>
<ProductGroupID>9</ProductGroupID>
<Locale>zh-CN</Locale>
<Title>服务器关闭</Title>
<Text>Welcome back dragon rider!
Welcome to SoDOff Experimental Server!
SoDOff is a School of Dragons server emulator. The emulator is in very early stages of development, many features are currently missing. Things can and WILL break!
Please note that we are not associated with JumpStart or DreamWorks.
- The SoDOff Team</Text>
</Message>
<NoticeBeforeInDays>300</NoticeBeforeInDays>
<DisplayCount>-1</DisplayCount>
</Scheduled>
</ServerDown>

View File

@ -0,0 +1,92 @@
# Server Side Modding
## Mod Installation
Place mods as individual directories inside `src/mods`.
Each mod folder must contain a `manifest.xml` file at its top directory level.
For example: `src/mods/MyFirstMod/manifest.xml`
## `manifest.xml` syntax
The root node in `manifest.xml` is `<sodoffmod>`. It can include the following child nodes:
* `<items>` - item database manipulation
* `<store>` - store database manipulation (not implemented yet)
* ...
### Item Database Manipulation
`<items>` may contain `<item>` child nodes. Each of them defines one item modification. The modification type can be specified by the `action` attribute. The supported values are:
* `add` - add new item
* default if the `action` attribute is not present
* `remove` - remove item
* `replace` - replace item definition for an existed item ID
`<item>` may contain the following subnodes:
* `<id>` - item ID
* if not used, the item ID will be retrieved from the item definition within `<data>`
* `<storeID>` - specifies the store ID to which the item will be added
* can be used multiple times
* if not used, the item will not be added to any store
* `<data>` - item definition (syntax like the `<I>` node in [src/Resources/items.xml](../Resources/items.xml))
* can be omitted in the `remove` action
#### Example
* remove the Toothless ticket item (item ID `8034`)
* add a Night Furry Egg item (item ID `99999`) and add it to store (store ID `92`, for store description see comment in [src/Resources/store.xml](../Resources/store.xml))
* The item ID for new items should be unique to prevent mod collisions. The recommended format is: `prefix * 100000 + private_id`, where:
* `prefix` must be grater than 0 to avoid collision with the original game and official SoDOff items
* `prefix` is a unique mod author prefix
* `private_id` ranges from 0 to 99999 and is available for unrestricted use by the author
* for instance, if `prefix = 789` and `private_id = 123`, the item ID would be `78900123`
```
<sodoffmod>
<items>
<item action="remove">
<id>8034</id>
</item>
<item>
<storeID>92</storeID>
<data>
<an>RS_DATA/DragonEgg.unity3d/PfEggDevilishDervish</an>
<at>
<k>PetTypeID</k>
<v>17</v>
<id>99999</id>
</at>
<c>
<cid>456</cid>
<cn>Dragons Dragon Egg</cn>
<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
<id>99999</id>
</c>
<c>
<cid>550</cid>
<cn>Strike Class Eggs</cn>
<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
<id>99999</id>
</c>
<ct>0</ct>
<ct2>250</ct2>
<cp>0</cp>
<d>Tame the cunning and mischievous Night Furry in your stables</d>
<icn>RS_DATA/DragonEgg.unity3d/IcoEggDevilishDervish</icn>
<im>-1</im>
<id>99999</id>
<itn>Night Furry Egg</itn>
<l>false</l>
<s>false</s>
<as>false</as>
<sf>10</sf>
<u>-1</u>
<rf>0</rf>
<rtid>0</rtid>
</data>
</item>
</items>
</sodoffmod>
```