update README, add sample files for localhosting

This commit is contained in:
Robert Paciorek 2024-02-13 10:10:20 +00:00
parent b7720af330
commit e3d18df86e
7 changed files with 849 additions and 28 deletions

View File

@ -1,33 +1,69 @@
# SoD-Off - School of Dragons, Offline # SoD-Off - 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, SoD-Off was born. Currently, it is an (almost) complete implementation of the API server for SoD (and some other JS games).
It allows you to run SoD offline as well as host private online servers.
We provide also MMO server implementation for SoD (https://github.com/SoDOff-Project/sodoff-mmo).
We recommend using it even in offline mode, as some aspects of the single-player game depend on the MMO connection.
## Discord ## Discord
[![Discord Banner](https://discordapp.com/api/guilds/1124405524679643318/widget.png?style=banner2)](https://discord.gg/bqHtMRbhM3) [![Discord Banner](https://discordapp.com/api/guilds/1124405524679643318/widget.png?style=banner2)](https://discord.gg/bqHtMRbhM3)
## Licence
SoD-Off is open source, distributed under [AGPL](LICENSE) license.
This license does not cover resources obtained from the game or from responses of original api distributed with the API server, especially:
`missions.xml`, `items.xml`, `allranks.xml` and `store.xml` files from `src/Resources` directory and files inside `src/assets` directory.
## Getting started ## Getting started
For the first time setup, run the following command: You need dotnet 6.0 SDK to build api server from sources. To do this (and start server) just run:
``` ```
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. ### Modify client
To play game you need to modify game client to use `http://localhost:5001/.com/DWADragonsUnity/` instead `http://media.jumpstart.com/DWADragonsUnity/` for getting main XML config file (`DWADragonsMain.xml`).
You can do this editing `DOMain_Data/resources.assets` in hex-editor and replace those URLs.
### Server configuration
Most configuration of server is set in `appsettings.json`. See `"// ..."` keys in this file for options description.
#### supported clients
Each version of supported client need own file `assets/DWADragonsUnity/{PLATFORM}/{VERSION}/DWADragonsMain.xml`.
By default (can be changed in `appsettings.json`) files for version 2.5.0 and newer will be automatically encrypted (in accordance with the client's expectations).
Sample file for `{PLATFORM} = WIN`, `{VERSION} = 3.31.0` is provided.
It assumes that the server address is `localhost:5000` (for api) and `localhost:5000` (for assets). When running a public server, the addresses must be adjusted.
#### asset server
Multiple options of asset server can be customized. Most important of them is `ProviderURL` indicating the source of assets downloading in `partial` mode.
By default it's set to archive.org. Please do not abuse this server (especially do not disable `UseCache` option and do not get rid of `asset-cache` dir content).
#### listening address/port
By default server listening on all IPv4 and IPv6 addresses on ports 5000 (api) and 5001 (assets).
This can be changed in `appsettings.json`, but it can also requires changes in `DWADragonsMain.xml` and in clients (on change assets server address)
### Server side modding
Server support server side modding like adding new items, adding them to store without modification server source.
For details see [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 +77,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 api server - allow set 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 api server - allow set 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 builtin asset server",
"Enabled": true,
"// ListenIP": "listening ip address for asset server, default * -> all IPv4 and IPv6 addresses",
"ListenIP": "*",
"// Port": "listening port number for asset server (should be different than for serer api)",
"Port": 5001,
"// URLPrefix": "extra prefix in url, is omitted while getting path from requested URL ... if set to .com then request to http://localhost/.com/abc will return assets/abc file",
"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": "regexp matched against URL local part -> if match returned file will be encrypted on fly using 3DES with AutoEncryptKey as 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 you only have Low, it will return Low instead of downloading (partial mode) or error 404 (full mode)",
"SubstituteMissingLocalAssets": true,
"// UseCache": "when true store downloading in partial mode assets in assets-cache for use on next 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:5003/.com/DWADragonsUnity/WIN/{Version}/Mid/</RootURL>
<ContentDataURL>http://localhost:5003/.com/DWADragonsUnity/WIN/{Version}/Mid/contentdata</ContentDataURL>
<DataURL>http://localhost:5003/.com/DWADragonsUnity/WIN/{Version}/Mid/data</DataURL>
<SceneURL>http://localhost:5003/.com/DWADragonsUnity/WIN/{Version}/Mid/scene</SceneURL>
<SharedDataURL>http://localhost:5003/.com/DWADragonsUnity/WIN/{Version}/Mid/shareddata</SharedDataURL>
<SoundURL>http://localhost:5003/.com/DWADragonsUnity/WIN/{Version}/Mid/sound</SoundURL>
<MoviesURL>http://localhost:5003/.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 installations
Place mods as directory inside `src/mods`.
The mod directory must contain `manifest.xml` file in the first directory tree level.
For example: `src/mods/MyFirstMod/manifest.xml`
## `manifest.xml` syntax
Root node for `manifest.xml` is `<sodoffmod>`. It can contain child nodes:
* `<items>` - item database manipulation
* `<store>` - store database manipulation (not implemented yet)
* ...
### item database manipulation
`<items>` may contain may `<item>` child nodes. Each of them define one item modification. Modification type can be specified by `action` attribute, supported values:
* `add` - add new item
* default when no `action` attribute
* `remove` - remove item
* `replace` - replace item definition for existed item id
`<item>` node may contains subnodes:
* `<id>` - specify item id
* if not used item id will be read from item definition in `<data>`
* `<storeID>` - specify store id to add item to them
* can occur multiple times
* if not used item will be not added to any store
* `<data>` - item definition (syntax like `<I>` node in [src/Resources/items.xml](../Resources/items.xml))
* can be committed in `remove` action`
#### Example
* remove Toothless ticket item (item id `8034`)
* add Night Furry Egg item (item id `29999`) and add it to store (store id `92`, for store description see comment in [src/Resources/store.xml](../Resources/store.xml).
* item id (for new items) should be unique to avoid mod collision, recommended format to use: `prefix * 10000 + private_id`, where:
* `prefix` must be grater than 2 to avoid collision with original game and official SoDOff items
* `prefix` is unique mod author prefix (see SoDOff discord for details)
* `private_id` is for digit number (0-9999) to free use by the this author
* for example for `prefix = 789` and `private_id = 13` item id will be `7890013`
```
<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>29999</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>29999</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>29999</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>29999</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>
```