mirror of
https://github.com/Mezeporta/Erupe.git
synced 2025-12-13 15:34:38 +01:00
Compare commits
143 Commits
feature/hu
...
feature/re
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
022eaccbba | ||
|
|
9d22e620dc | ||
|
|
c22793e102 | ||
|
|
985efa797c | ||
|
|
e6f693f222 | ||
|
|
e938478107 | ||
|
|
1d01dba380 | ||
|
|
ab7a52caea | ||
|
|
081deba17b | ||
|
|
4c27b99e9a | ||
|
|
892f89eba9 | ||
|
|
78fe5c85ef | ||
|
|
ba3df8d4d1 | ||
|
|
83becc4c84 | ||
|
|
9710f1cc43 | ||
|
|
320ce7d783 | ||
|
|
927f6e9419 | ||
|
|
7815768741 | ||
|
|
c7862f38bf | ||
|
|
615b75d101 | ||
|
|
1edd48f480 | ||
|
|
e94fc6da20 | ||
|
|
e41335b079 | ||
|
|
9c67910bdc | ||
|
|
343333217f | ||
|
|
8e53b6cc63 | ||
|
|
1041cac476 | ||
|
|
b526e66821 | ||
|
|
795028a1ca | ||
|
|
ac40e679fe | ||
|
|
2d9a26df75 | ||
|
|
a7656189a4 | ||
|
|
8ae6cb2e96 | ||
|
|
d3c94a26e8 | ||
|
|
3ba2995afa | ||
|
|
401834008c | ||
|
|
933ed7943d | ||
|
|
d300098838 | ||
|
|
e90cc176ec | ||
|
|
af22707b48 | ||
|
|
82f92e2f24 | ||
|
|
52ae5f56a0 | ||
|
|
62648f6717 | ||
|
|
f5033d1517 | ||
|
|
e0aae07a43 | ||
|
|
0daf7b55d4 | ||
|
|
ad5cd8212a | ||
|
|
8607ff05f9 | ||
|
|
861e53cb7a | ||
|
|
a0f585b3e3 | ||
|
|
b024e3c5f2 | ||
|
|
aa58fe48ed | ||
|
|
4926d0cae2 | ||
|
|
0a664b9fde | ||
|
|
80c5701a9a | ||
|
|
4f67e3de67 | ||
|
|
2999fb14d6 | ||
|
|
c54811729f | ||
|
|
29482521e2 | ||
|
|
1d49e279e3 | ||
|
|
6e6183022d | ||
|
|
9182097411 | ||
|
|
52107be3ff | ||
|
|
1e33ed84c6 | ||
|
|
112dc03acc | ||
|
|
f86845eb14 | ||
|
|
35f34d31db | ||
|
|
1d8eec2280 | ||
|
|
c505686893 | ||
|
|
172b5decf4 | ||
|
|
ecc0e49497 | ||
|
|
fff92b16ed | ||
|
|
fe786617d4 | ||
|
|
8cea6235c8 | ||
|
|
e5f2650871 | ||
|
|
99c965e3b6 | ||
|
|
315449aa33 | ||
|
|
50b21094f2 | ||
|
|
8b65fc7495 | ||
|
|
d4370c66ad | ||
|
|
4e1cef9bf3 | ||
|
|
5924db9b42 | ||
|
|
f17d1db9a7 | ||
|
|
773429ce15 | ||
|
|
0893f75c3f | ||
|
|
eb491093f8 | ||
|
|
1929b8823d | ||
|
|
99ceeb6872 | ||
|
|
69ca0c13ac | ||
|
|
cf91478abb | ||
|
|
1b74b6496e | ||
|
|
23838bdb78 | ||
|
|
86d4ec55cb | ||
|
|
3b443344a2 | ||
|
|
0ac35f8743 | ||
|
|
1afe6860e2 | ||
|
|
b1b4f390f0 | ||
|
|
28e0dafd54 | ||
|
|
10c80322af | ||
|
|
cb275a7a18 | ||
|
|
865ba378ec | ||
|
|
ea13520ca9 | ||
|
|
a92b5b0b93 | ||
|
|
cf3cafa929 | ||
|
|
5a67d689e0 | ||
|
|
fa245e53fb | ||
|
|
b898614ddc | ||
|
|
76fe663ee1 | ||
|
|
4c839440cd | ||
|
|
d0234c85ab | ||
|
|
fa608fa555 | ||
|
|
e6d7b7b9c2 | ||
|
|
5f1d429c12 | ||
|
|
30219b8bcf | ||
|
|
e5257eb6ed | ||
|
|
0922ff4f9c | ||
|
|
5a9c639172 | ||
|
|
953870867e | ||
|
|
fbcd878e72 | ||
|
|
1c6b7ef257 | ||
|
|
caf9fc91ed | ||
|
|
6367789c73 | ||
|
|
501cfc2267 | ||
|
|
a014b0d3b9 | ||
|
|
8792908a66 | ||
|
|
61738b6f23 | ||
|
|
4846a024eb | ||
|
|
b756a02e6e | ||
|
|
78cc2be2c4 | ||
|
|
5b9ec1c983 | ||
|
|
f3a6e72f43 | ||
|
|
81c9b22b11 | ||
|
|
6a23130772 | ||
|
|
d4dddf01dd | ||
|
|
d1a9d5a7d0 | ||
|
|
e38b725662 | ||
|
|
d893059971 | ||
|
|
519238f54d | ||
|
|
319cfcb2f7 | ||
|
|
e5066d4f8b | ||
|
|
7aef17f7d9 | ||
|
|
96ec589651 | ||
|
|
fc5b1ac3b5 |
48
.github/workflows/docker.yml
vendored
48
.github/workflows/docker.yml
vendored
@@ -1,48 +0,0 @@
|
|||||||
name: Create and publish a Docker image
|
|
||||||
|
|
||||||
# Configures this workflow to run every time a tag is created.
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- '*'
|
|
||||||
|
|
||||||
# Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds.
|
|
||||||
env:
|
|
||||||
REGISTRY: ghcr.io
|
|
||||||
IMAGE_NAME: ${{ github.repository }}
|
|
||||||
|
|
||||||
# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.
|
|
||||||
jobs:
|
|
||||||
build-and-push-image:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
# Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
#
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
# Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.
|
|
||||||
- name: Log in to the Container registry
|
|
||||||
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
|
|
||||||
with:
|
|
||||||
registry: ${{ env.REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
# This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels.
|
|
||||||
- name: Extract metadata (tags, labels) for Docker
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
|
|
||||||
with:
|
|
||||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
||||||
# This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages.
|
|
||||||
# It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see "[Usage](https://github.com/docker/build-push-action#usage)" in the README of the `docker/build-push-action` repository.
|
|
||||||
# It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step.
|
|
||||||
- name: Build and push Docker image
|
|
||||||
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
push: true
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
||||||
11
.github/workflows/go.yml
vendored
11
.github/workflows/go.yml
vendored
@@ -1,15 +1,6 @@
|
|||||||
name: Build
|
name: Build
|
||||||
|
|
||||||
on:
|
on: [push]
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- 'common/**'
|
|
||||||
- 'config/**'
|
|
||||||
- 'network/**'
|
|
||||||
- 'server/**'
|
|
||||||
- 'go.mod'
|
|
||||||
- 'go.sum'
|
|
||||||
- 'main.go'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
|||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -6,6 +6,4 @@ vendor/
|
|||||||
savedata/*/
|
savedata/*/
|
||||||
*.exe
|
*.exe
|
||||||
*.lnk
|
*.lnk
|
||||||
*.bat
|
*.bat
|
||||||
/docker/db-data
|
|
||||||
screenshots/*
|
|
||||||
30
AUTHORS.md
30
AUTHORS.md
@@ -1,30 +0,0 @@
|
|||||||
# List of authors who contributed to Erupe
|
|
||||||
|
|
||||||
## Point of current development
|
|
||||||
The project is currently developed under https://github.com/ZeruLight/Erupe
|
|
||||||
|
|
||||||
## History of development
|
|
||||||
Development of this project dates back to 2019, and was developed under various umbrellas over time:
|
|
||||||
* Cappuccino (Fist/Ando/Ellie42) ("The Erupe Developers"), 2019-2020 (https://github.com/Ellie42/Erupe / https://github.com/ricochhet/Erupe-Legacy) (Still active closed source)
|
|
||||||
* Einherjar Team, ????-2022 Feb (There is no git history for this period, this team's work was taken and used as a foundation for future repositories)
|
|
||||||
* Community Edition, 2022 (https://github.com/xl3lackout/Erupe)
|
|
||||||
* sekaiwish Fork, 2022 (https://github.com/sekaiwish/Erupe)
|
|
||||||
* ZeruLight, 2022-2023 (https://github.com/ZeruLight/Erupe)
|
|
||||||
|
|
||||||
## Authorship of the code
|
|
||||||
Authorship is assigned for each commit within the git history, which is stored in these git repos:
|
|
||||||
* https://github.com/ZeruLight/Erupe
|
|
||||||
* https://github.com/Ellie42/Erupe
|
|
||||||
* https://github.com/ricochhet/Erupe-Legacy
|
|
||||||
* https://github.com/xl3lackout/Erupe
|
|
||||||
|
|
||||||
Note the divergence between Ellie42's branch and xl3lackout's where history has been lost.
|
|
||||||
|
|
||||||
Unfortunately, we have no detailed information on the history of Erupe before 2022.
|
|
||||||
If somebody can provide information, please contact us, so that we can make this history available.
|
|
||||||
|
|
||||||
## Exceptions with third-party libraries
|
|
||||||
The third-party libraries have their own way of addressing authorship and the authorship of commits importing/updating
|
|
||||||
a third-party library reflects who did the importing instead of who wrote the code within the commit.
|
|
||||||
|
|
||||||
The authors of third-party libraries are not explicitly mentioned, and usually is possible to obtain from the files belonging to the third-party libraries.
|
|
||||||
14
Dockerfile
14
Dockerfile
@@ -1,14 +0,0 @@
|
|||||||
FROM golang:1.21-alpine3.19
|
|
||||||
|
|
||||||
ENV GO111MODULE=on
|
|
||||||
|
|
||||||
WORKDIR /app/erupe
|
|
||||||
|
|
||||||
COPY go.mod .
|
|
||||||
COPY go.sum .
|
|
||||||
|
|
||||||
RUN go mod download
|
|
||||||
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
CMD [ "go", "run", "." ]
|
|
||||||
141
README.md
141
README.md
@@ -1,18 +1,15 @@
|
|||||||
# Erupe
|
# Erupe
|
||||||
|
|
||||||
## Client Compatibility
|
## Client Compatiblity
|
||||||
### Platforms
|
### Platforms
|
||||||
- PC
|
- PC
|
||||||
- PlayStation 3
|
- PlayStation 3
|
||||||
- PlayStation Vita
|
- PlayStation Vita
|
||||||
- Wii U (Up to Z2)
|
- Wii U (Up to Z2)
|
||||||
### Versions (ClientMode)
|
### Versions
|
||||||
- All versions after HR compression (G10-ZZ) have been tested extensively and have great functionality.
|
- ZZ
|
||||||
- All versions available on Wii U (G3-Z2) have been tested and should have good functionality.
|
- Z2
|
||||||
- The second oldest found version is Forward.4 (FW.4), this version has basic functionality.
|
- Z1
|
||||||
- The oldest found version is Season 6.0 (S6.0), however functionality is very limited.
|
|
||||||
|
|
||||||
If you have an **installed** copy of Monster Hunter Frontier on an old hard drive, **please** get in contact so we can archive it!
|
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
@@ -32,21 +29,119 @@ If you want to modify or compile Erupe yourself, please read on.
|
|||||||
3. Edit [config.json](./config.json) such that the database password matches your PostgreSQL setup.
|
3. Edit [config.json](./config.json) such that the database password matches your PostgreSQL setup.
|
||||||
4. Run `go build` or `go run .` to compile Erupe.
|
4. Run `go build` or `go run .` to compile Erupe.
|
||||||
|
|
||||||
## Docker
|
|
||||||
|
|
||||||
Please see [docker/README.md](./docker/README.md). This is intended for quick installs and development, not for production.
|
|
||||||
|
|
||||||
## Schemas
|
|
||||||
|
|
||||||
We source control the following schemas:
|
|
||||||
- Initialization Schema: This initializes the application database to a specific version (9.1.0).
|
|
||||||
- Update Schemas: These are update files that should be ran on top of the initialization schema.
|
|
||||||
- Patch Schemas: These are for development and should be run after running all initialization and update schema. These get condensed into `Update Schemas` and deleted when updated to a new release.
|
|
||||||
- Bundled Schemas: These are demo reference files to give servers standard set-ups.
|
|
||||||
|
|
||||||
Note: Patch schemas are subject to change! You should only be using them if you are following along with development.
|
|
||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
- [Quest and Scenario Binary Files](https://files.catbox.moe/xf0l7w.7z)
|
- [Quest and Scenario Binary Files](https://files.catbox.moe/xf0l7w.7z)
|
||||||
- [Mezeporta Square Discord](https://discord.gg/DnwcpXM488)
|
- [PewPewDojo Discord](https://discord.gg/CFnzbhQ)
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
This portion of the documentation goes over the `config.json` file.
|
||||||
|
|
||||||
|
### General Configuration
|
||||||
|
|
||||||
|
| Variable | Description | Default | Options |
|
||||||
|
|------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------|-----------|---------------------------------|
|
||||||
|
| Host | The IP or host address the server is running from | 127.0.0.1 | |
|
||||||
|
| BinPath | The bin path folder is where you place files needed for various parts of the game such as scenario and quest files | bin | |
|
||||||
|
| Language | This is the language the server will run in. Only English `en` and Japanese `ja` are available, if you wish to contribute to tranlation, get in touch | en | en/jp |
|
||||||
|
| DisableSoftCrash | | false | |
|
||||||
|
| HideLoginNotice | This hides the notices that appear on login from `LoginNotices` | true | |
|
||||||
|
| LoginNotices | This is where you place notices for users, you can have multiple notices | | |
|
||||||
|
| PatchServerManifest | | | |
|
||||||
|
| PatchServerFile | | | |
|
||||||
|
| ScreenshotAPIURL | This is the URL you want user sreenshots to go to | | |
|
||||||
|
| DeleteOnSaveCorruption | This option deletes a users save from the database if they corrupt it, can be used as punishment for cheaters | false | |
|
||||||
|
| ClientMode | This tells the server what client version it should target | ZZ | Check compatible versions above |
|
||||||
|
| DevMode | This enables DevModeOptions to be configured | true | |
|
||||||
|
|
||||||
|
### `DevModeOptions` Configuraiton
|
||||||
|
|
||||||
|
| Variable | Description | Default | Options |
|
||||||
|
|----------------------|---------------------------------------------------------------------------------------------|----------|----------------------------------|
|
||||||
|
| AutoCreateAccount | This allows users that don't exist to auto create there account from initial login | true | |
|
||||||
|
| CleanDB | This cleans the database down | false | |
|
||||||
|
| MaxLauncherHR | This sets the launcher value to HR7 to allow you to break World HR requirements | false | |
|
||||||
|
| LogInboundMessages | This will allow inbound messages to be logged to stdout | false | |
|
||||||
|
| LogOutboundMessages | This will allow outbound messages to be logged to stdout | false | |
|
||||||
|
| MaxHexdumpLength | This is the maximum amount of hex bytes that will be dumped to stdout | 0 | |
|
||||||
|
| DivaEvent | This overrides the Diva event stage in game | 2 | 0/1/2/3/-1 |
|
||||||
|
| FestaEvent | This overrides the Hunter Festival event stage in game | 2 | 0/1/2/3/-1 |
|
||||||
|
| TournamentEvent | This overrides the Hunter Tournament event stage in game | 2 | 0/1/2/3/-1 |
|
||||||
|
| MezFesEvent | Enables whether the MezFes event & World are active | true | |
|
||||||
|
| MezFesAlt | Switches the multiplayer MezFes event | false | |
|
||||||
|
| DisableTokenCheck | This disables the random token that is generated at login from being checked, very insecure | false | |
|
||||||
|
| QuestDebugTools | Enable various quest debug logs | false | |
|
||||||
|
| EarthStatusOverride | Enables Pallone Fest, Tower and Conquest War events | 0 | 2=Conquest, 11=Pallone, 21=Tower |
|
||||||
|
| EarthIDOverride | A random event ID | 0 | |
|
||||||
|
| EarthMonsterOverride | Sets the ID of the monster targeted in the Conquest War | 0 | |
|
||||||
|
| SaveDumps.Enables | Enables save dumps to a folder that is set at `SaveDumps.OutputDir` | true | |
|
||||||
|
| SaveDumps.OutputDir | The folder that save dumps are saved to | savedata | |
|
||||||
|
|
||||||
|
### `GameplayOptions` Configuraiton
|
||||||
|
|
||||||
|
| Variable | Description | Default | Options |
|
||||||
|
|----------------------|-----------------------------------------------------------------------------|---------|---------|
|
||||||
|
| FeaturedWeapons | Number of Active Feature weapons to generate daily | 0 | |
|
||||||
|
| MaximumNP | Maximum number of NP held by a player | 100000 | |
|
||||||
|
| MaximumRP | Maximum number of RP held by a player | 100000 | |
|
||||||
|
| DisableLoginBoost | Disables the Login Boost system | false | |
|
||||||
|
| DisableBoostTime | Disables the daily NetCafe Boost Time | false | |
|
||||||
|
| BoostTimeDuration | The number of minutes NetCafe Boost Time lasts for | 120 | |
|
||||||
|
| GuildMealDuration | The number of minutes a Guild Meal can be activated for after cooking | 60 | |
|
||||||
|
| BonusQuestAllowance | Number of Bonus Point Quests to allow daily | 3 | |
|
||||||
|
| DailyQuestAllowance | Number of Daily Quests to allow daily | 1 | |
|
||||||
|
| MezfesSoloTickets | Number of solo tickets given weekly | 10 | |
|
||||||
|
| MezfesGroupTickets | Number of group tickets given weekly | 4 | |
|
||||||
|
| GUrgentRate | Adjusts the rate of G Urgent quests spawning | 10 | |
|
||||||
|
| GCPMultiplier | Adjusts the multiplier of GCP rewarded for quest completion | 1.00 | |
|
||||||
|
| GRPMultiplier | Adjusts the multiplier of G Rank Points rewarded for quest completion | 1.00 | |
|
||||||
|
| GSRPMultiplier | Adjusts the multiplier of G Skill Rank Points rewarded for quest completion | 1.00 | |
|
||||||
|
| GZennyMultiplier | Adjusts the multiplier of G Zenny rewarded for quest completion | 1.00 | |
|
||||||
|
| MaterialMultiplier | Adjusts the multiplier of Monster Materials rewarded for quest completion | 1.00 | |
|
||||||
|
| ExtraCarves | Grant n extra chances to carve ALL carcasses | 0 | |
|
||||||
|
| DisableHunterNavi | Disables the Hunter Navi | false | |
|
||||||
|
| EnableHiganjimaEvent | Enables the Higanjima event in the Rasta Bar | false | |
|
||||||
|
| EnableNierEvent | Enables the Nier event in the Rasta Bar | false | |
|
||||||
|
| DisableRoad | Disables the Hunting Road | false | |
|
||||||
|
|
||||||
|
### Discord
|
||||||
|
There is limited Discord capability in Erupe. The feature allows you to replay messages from your server into a channel.
|
||||||
|
This may be either be removed or revamped in a future version.
|
||||||
|
|
||||||
|
### Commands
|
||||||
|
There are several chat commands that can be turned on and off. Most of them are really for admins or debugging purposes.
|
||||||
|
|
||||||
|
| Name | command | Description | Options |
|
||||||
|
|----------|----------------|--------------------------------------------|---------------------|
|
||||||
|
| Rights | !rights VALUE | Sets the rights integer for your account | |
|
||||||
|
| Teleport | !tele X,Y | Teleports user to specific x,y coordinate | |
|
||||||
|
| Reload | !reload | Reloads all users and character objects | |
|
||||||
|
| KeyQuest | !kqf FLAGS | Sets the Key Quest Flag for your character | |
|
||||||
|
| Course | !course OPTION | Enables/Disables a course for your account | HL,EX,Premium,Boost |
|
||||||
|
| PSN | !psn USERNAME | Links the specified PSN to your account | |
|
||||||
|
|
||||||
|
### Ravi Sub Commands
|
||||||
|
| Name | command | Description |
|
||||||
|
|----------|----------------------------------|-------------------------------|
|
||||||
|
| Raviente | !ravi start | Starts Ravi Event |
|
||||||
|
| Raviente | !ravi cm / !ravi checkmultiplier | Checks Ravi Damage Multiplier |
|
||||||
|
| Raviente | !ravi ss | Send Sedation Support |
|
||||||
|
| Raviente | !ravi sr | Send Resurrection Support |
|
||||||
|
| Raviente | !ravi rs | Request Sedation Support |
|
||||||
|
|
||||||
|
|
||||||
|
## World `Entries` config
|
||||||
|
|
||||||
|
| Config Item | Description | Options |
|
||||||
|
|-------------|------------------|------------------------------------------------------------|
|
||||||
|
| Type | Server type. | 1=Normal, 2=Cities, 3=Newbie, 4=Tavern, 5=Return, 6=MezFes |
|
||||||
|
| Season | Server activity. | 0=Green/Breeding, 1=Orange/Warm, 2=Blue/Cold |
|
||||||
|
|
||||||
|
### `Recommend`
|
||||||
|
This sets the types of quest that can be ordered from a world.
|
||||||
|
* 0 = All quests
|
||||||
|
* 1 = Up to 2 star quests
|
||||||
|
* 2 = Up to 4 star quests
|
||||||
|
* 4 = All Quests in HR (Enables G Experience Tab)
|
||||||
|
* 5 = Only G rank quests
|
||||||
|
* 6 = Mini games world there is no place to order quests
|
||||||
|
|||||||
2
bin/quests/__PLACE_YOUR_QUEST_.bin_FILES_HERE__.txt
Normal file
2
bin/quests/__PLACE_YOUR_QUEST_.bin_FILES_HERE__.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
place your quest .bin files here
|
||||||
|
e.g. 22031d0.bin
|
||||||
2372
bin/quests/desktop.ini
Normal file
2372
bin/quests/desktop.ini
Normal file
File diff suppressed because it is too large
Load Diff
391
bundled-schema/FPointItems.sql
Normal file
391
bundled-schema/FPointItems.sql
Normal file
@@ -0,0 +1,391 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
INSERT INTO fpoint_items (item_type, item_id, quantity, fpoints, trade_type) VALUES
|
||||||
|
(7,8895,1,500,0),
|
||||||
|
(7,8891,1,300,0),
|
||||||
|
(7,8892,1,300,0),
|
||||||
|
(7,8893,1,300,0),
|
||||||
|
(7,8894,1,300,0),
|
||||||
|
(7,8890,1,10,0),
|
||||||
|
(7,10354,1,500,0),
|
||||||
|
(7,11983,1,300,0),
|
||||||
|
(7,11984,1,300,0),
|
||||||
|
(7,11985,1,300,0),
|
||||||
|
(7,11986,1,300,0),
|
||||||
|
(7,12524,1,500,0),
|
||||||
|
(7,12470,1,300,0),
|
||||||
|
(7,12471,1,300,0),
|
||||||
|
(7,12472,1,300,0),
|
||||||
|
(7,12473,1,300,0),
|
||||||
|
(7,2158,2,1,0),
|
||||||
|
(7,14548,1,500,0),
|
||||||
|
(7,9509,1,1,0),
|
||||||
|
(7,9510,1,1,0),
|
||||||
|
(7,9511,1,1,0),
|
||||||
|
(7,9512,1,1,0),
|
||||||
|
(7,9513,1,1,0),
|
||||||
|
(7,9514,1,1,0),
|
||||||
|
(7,9515,1,1,0),
|
||||||
|
(7,10753,1,1,0),
|
||||||
|
(7,10754,1,1,0),
|
||||||
|
(7,10755,1,1,0),
|
||||||
|
(7,10756,1,1,0),
|
||||||
|
(7,10757,1,1,0),
|
||||||
|
(7,10758,1,1,0),
|
||||||
|
(7,10759,1,1,0),
|
||||||
|
(7,11296,1,1,0),
|
||||||
|
(7,11297,1,1,0),
|
||||||
|
(7,11298,1,1,0),
|
||||||
|
(7,11299,1,1,0),
|
||||||
|
(7,11300,1,1,0),
|
||||||
|
(7,12386,1,1,0),
|
||||||
|
(7,12387,1,1,0),
|
||||||
|
(7,12388,1,1,0),
|
||||||
|
(7,12389,1,1,0),
|
||||||
|
(7,12390,1,1,0),
|
||||||
|
(7,13034,1,1,0),
|
||||||
|
(7,13035,1,1,0),
|
||||||
|
(7,13036,1,1,0),
|
||||||
|
(7,13037,1,1,0),
|
||||||
|
(7,13038,1,1,0),
|
||||||
|
(7,14179,1,1,0),
|
||||||
|
(7,14180,1,1,0),
|
||||||
|
(7,14181,1,1,0),
|
||||||
|
(7,14182,1,1,0),
|
||||||
|
(7,14183,1,1,0),
|
||||||
|
(7,13422,1,1,0),
|
||||||
|
(7,13423,1,1,0),
|
||||||
|
(7,13424,1,1,0),
|
||||||
|
(7,13425,1,1,0),
|
||||||
|
(7,13426,1,1,0),
|
||||||
|
(7,13427,1,1,0),
|
||||||
|
(7,9796,1,3,0),
|
||||||
|
(7,9700,1,3,0),
|
||||||
|
(7,10380,1,3,0),
|
||||||
|
(7,10810,1,3,0),
|
||||||
|
(7,10811,1,3,0),
|
||||||
|
(7,11436,1,3,0),
|
||||||
|
(7,9509,1,1,0),
|
||||||
|
(7,9510,1,1,0),
|
||||||
|
(7,9511,1,1,0),
|
||||||
|
(7,9512,1,1,0),
|
||||||
|
(7,9513,1,1,0),
|
||||||
|
(7,9514,1,1,0),
|
||||||
|
(7,9515,1,1,0),
|
||||||
|
(7,10753,1,1,0),
|
||||||
|
(7,10754,1,1,0),
|
||||||
|
(7,10755,1,1,0),
|
||||||
|
(7,10756,1,1,0),
|
||||||
|
(7,10757,1,1,0),
|
||||||
|
(7,10758,1,1,0),
|
||||||
|
(7,10759,1,1,0),
|
||||||
|
(7,11296,1,1,0),
|
||||||
|
(7,11297,1,1,0),
|
||||||
|
(7,11298,1,1,0),
|
||||||
|
(7,11299,1,1,0),
|
||||||
|
(7,11300,1,1,0),
|
||||||
|
(7,12509,1,3,0),
|
||||||
|
(7,12386,1,1,0),
|
||||||
|
(7,12387,1,1,0),
|
||||||
|
(7,12388,1,1,0),
|
||||||
|
(7,12389,1,1,0),
|
||||||
|
(7,12390,1,1,0),
|
||||||
|
(7,12872,1,3,0),
|
||||||
|
(7,12873,1,3,0),
|
||||||
|
(7,12840,1,1,0),
|
||||||
|
(7,12841,1,1,0),
|
||||||
|
(7,12874,1,1,0),
|
||||||
|
(7,12875,1,1,0),
|
||||||
|
(7,13191,1,3,0),
|
||||||
|
(7,13177,1,3,0),
|
||||||
|
(7,13326,1,3,0),
|
||||||
|
(7,13034,1,1,0),
|
||||||
|
(7,13035,1,1,0),
|
||||||
|
(7,13036,1,1,0),
|
||||||
|
(7,13037,1,1,0),
|
||||||
|
(7,13038,1,1,0),
|
||||||
|
(7,13178,1,3,0),
|
||||||
|
(7,13453,1,3,0),
|
||||||
|
(7,13449,1,3,0),
|
||||||
|
(7,13450,1,3,0),
|
||||||
|
(7,13404,1,3,0),
|
||||||
|
(7,13422,1,1,0),
|
||||||
|
(7,13423,1,1,0),
|
||||||
|
(7,13424,1,1,0),
|
||||||
|
(7,13425,1,1,0),
|
||||||
|
(7,13426,1,1,0),
|
||||||
|
(7,13427,1,1,0),
|
||||||
|
(7,13791,1,3,0),
|
||||||
|
(7,14006,1,3,0),
|
||||||
|
(7,14031,1,3,0),
|
||||||
|
(7,14032,1,3,0),
|
||||||
|
(7,13960,1,3,0),
|
||||||
|
(7,14029,1,3,0),
|
||||||
|
(7,13956,1,1,0),
|
||||||
|
(7,13958,1,1,0),
|
||||||
|
(7,13957,1,1,0),
|
||||||
|
(7,13959,1,1,0),
|
||||||
|
(7,13790,1,3,0),
|
||||||
|
(7,14005,1,3,0),
|
||||||
|
(7,14010,1,3,0),
|
||||||
|
(7,14009,1,3,0),
|
||||||
|
(7,14008,1,3,0),
|
||||||
|
(7,13965,1,3,0),
|
||||||
|
(7,14028,1,3,0),
|
||||||
|
(7,13963,1,3,0),
|
||||||
|
(7,14026,1,3,0),
|
||||||
|
(7,13964,1,3,0),
|
||||||
|
(7,14027,1,3,0),
|
||||||
|
(7,14069,1,3,0),
|
||||||
|
(7,14124,1,3,0),
|
||||||
|
(7,14065,1,1,0),
|
||||||
|
(7,14066,1,1,0),
|
||||||
|
(7,14067,1,1,0),
|
||||||
|
(7,14068,1,1,0),
|
||||||
|
(7,13962,1,3,0),
|
||||||
|
(7,14125,1,3,0),
|
||||||
|
(7,14089,1,3,0),
|
||||||
|
(7,14090,1,3,0),
|
||||||
|
(7,14091,1,3,0),
|
||||||
|
(7,14092,1,3,0),
|
||||||
|
(7,14194,1,3,0),
|
||||||
|
(7,14191,1,3,0),
|
||||||
|
(7,14198,1,3,0),
|
||||||
|
(7,14197,1,3,0),
|
||||||
|
(7,14179,1,1,0),
|
||||||
|
(7,14180,1,1,0),
|
||||||
|
(7,14181,1,1,0),
|
||||||
|
(7,14182,1,1,0),
|
||||||
|
(7,14183,1,1,0),
|
||||||
|
(7,14196,1,3,0),
|
||||||
|
(7,14195,1,3,0),
|
||||||
|
(7,14193,1,3,0),
|
||||||
|
(7,14192,1,3,0),
|
||||||
|
(7,14407,1,3,0),
|
||||||
|
(7,14414,1,3,0),
|
||||||
|
(7,14406,1,3,0),
|
||||||
|
(7,14413,1,3,0),
|
||||||
|
(7,14416,1,3,0),
|
||||||
|
(7,14549,1,3,0),
|
||||||
|
(7,14550,1,3,0),
|
||||||
|
(7,14502,1,3,0),
|
||||||
|
(7,14507,1,3,0),
|
||||||
|
(7,14501,1,3,0),
|
||||||
|
(7,14506,1,3,0),
|
||||||
|
(7,14500,1,3,0),
|
||||||
|
(7,14505,1,3,0),
|
||||||
|
(7,14498,1,3,0),
|
||||||
|
(7,14659,1,3,0),
|
||||||
|
(7,14660,1,3,0),
|
||||||
|
(7,14657,1,1,0),
|
||||||
|
(7,14658,1,1,0),
|
||||||
|
(7,11420,1,3,0),
|
||||||
|
(7,14704,1,3,0),
|
||||||
|
(7,11288,1,1,0),
|
||||||
|
(7,11289,1,1,0),
|
||||||
|
(7,11290,1,1,0),
|
||||||
|
(7,11291,1,1,0),
|
||||||
|
(7,10750,1,3,0),
|
||||||
|
(7,14705,1,3,0),
|
||||||
|
(7,10633,1,1,0),
|
||||||
|
(7,10634,1,1,0),
|
||||||
|
(7,10635,1,1,0),
|
||||||
|
(7,10636,1,1,0),
|
||||||
|
(7,14662,1,3,0),
|
||||||
|
(7,14663,1,3,0),
|
||||||
|
(7,14665,1,3,0),
|
||||||
|
(7,14666,1,3,0),
|
||||||
|
(7,14667,1,3,0),
|
||||||
|
(7,14668,1,3,0),
|
||||||
|
(7,14669,1,3,0),
|
||||||
|
(7,14670,1,3,0),
|
||||||
|
(7,14671,1,3,0),
|
||||||
|
(7,14672,1,3,0),
|
||||||
|
(7,14673,1,3,0),
|
||||||
|
(7,14674,1,3,0),
|
||||||
|
(7,14675,1,3,0),
|
||||||
|
(7,14676,1,3,0),
|
||||||
|
(7,14677,1,3,0),
|
||||||
|
(7,14678,1,3,0),
|
||||||
|
(7,14679,1,3,0),
|
||||||
|
(7,14680,1,3,0),
|
||||||
|
(7,14681,1,3,0),
|
||||||
|
(7,14682,1,3,0),
|
||||||
|
(7,14683,1,3,0),
|
||||||
|
(7,14684,1,3,0),
|
||||||
|
(7,14685,1,3,0),
|
||||||
|
(7,14686,1,3,0),
|
||||||
|
(7,14687,1,3,0),
|
||||||
|
(7,14688,1,3,0),
|
||||||
|
(7,14689,1,3,0),
|
||||||
|
(7,14690,1,3,0),
|
||||||
|
(7,14691,1,3,0),
|
||||||
|
(7,14692,1,3,0),
|
||||||
|
(7,14693,1,3,0),
|
||||||
|
(7,14694,1,3,0),
|
||||||
|
(7,14695,1,3,0),
|
||||||
|
(7,14696,1,3,0),
|
||||||
|
(7,14697,1,3,0),
|
||||||
|
(7,14698,1,3,0),
|
||||||
|
(7,14699,1,3,0),
|
||||||
|
(7,14700,1,3,0),
|
||||||
|
(7,14314,1,3,0),
|
||||||
|
(7,14503,1,3,0),
|
||||||
|
(7,14510,1,3,0),
|
||||||
|
(7,14904,1,3,0),
|
||||||
|
(7,14906,1,3,0),
|
||||||
|
(7,14910,1,1,0),
|
||||||
|
(7,14912,1,1,0),
|
||||||
|
(7,14905,1,3,0),
|
||||||
|
(7,14907,1,3,0),
|
||||||
|
(7,14911,1,1,0),
|
||||||
|
(7,14909,1,1,0),
|
||||||
|
(7,14855,1,3,0),
|
||||||
|
(7,14894,1,3,0),
|
||||||
|
(7,14913,1,3,0),
|
||||||
|
(7,14914,1,3,0),
|
||||||
|
(7,14891,1,3,0),
|
||||||
|
(7,14895,1,3,0),
|
||||||
|
(7,15027,1,3,0),
|
||||||
|
(7,15028,1,3,0),
|
||||||
|
(7,15026,1,1,0),
|
||||||
|
(7,15025,1,1,0),
|
||||||
|
(7,15024,1,1,0),
|
||||||
|
(7,15023,1,1,0),
|
||||||
|
(7,15064,1,3,0),
|
||||||
|
(7,15065,1,3,0),
|
||||||
|
(7,15030,1,3,0),
|
||||||
|
(7,15031,1,3,0),
|
||||||
|
(7,15062,1,3,0),
|
||||||
|
(7,15063,1,3,0),
|
||||||
|
(7,15066,1,3,0),
|
||||||
|
(7,15067,1,3,0),
|
||||||
|
(7,15061,1,3,0),
|
||||||
|
(7,15060,1,3,0),
|
||||||
|
(7,1227,1,2,0),
|
||||||
|
(7,13176,1,2,0),
|
||||||
|
(7,4360,1,2,0),
|
||||||
|
(7,4358,1,1,0),
|
||||||
|
(7,15118,1,3,0),
|
||||||
|
(7,15119,1,3,0),
|
||||||
|
(7,15113,1,3,0),
|
||||||
|
(7,15114,1,3,0),
|
||||||
|
(7,15115,1,3,0),
|
||||||
|
(7,15116,1,3,0),
|
||||||
|
(7,15220,1,3,0),
|
||||||
|
(7,15221,1,3,0),
|
||||||
|
(7,14126,1,3,0),
|
||||||
|
(7,15222,1,3,0),
|
||||||
|
(7,15223,1,3,0),
|
||||||
|
(7,15224,1,3,0),
|
||||||
|
(7,15225,1,3,0),
|
||||||
|
(7,15524,1,3,0),
|
||||||
|
(7,15525,1,3,0),
|
||||||
|
(7,15507,1,3,0),
|
||||||
|
(7,15508,1,3,0),
|
||||||
|
(7,15285,1,3,0),
|
||||||
|
(7,15286,1,3,0),
|
||||||
|
(7,15281,1,1,0),
|
||||||
|
(7,15282,1,1,0),
|
||||||
|
(7,15283,1,1,0),
|
||||||
|
(7,15284,1,1,0),
|
||||||
|
(7,15776,1,3,0),
|
||||||
|
(7,15777,1,3,0),
|
||||||
|
(7,15774,1,3,0),
|
||||||
|
(7,15775,1,3,0),
|
||||||
|
(7,15823,1,3,0),
|
||||||
|
(7,15824,1,3,0),
|
||||||
|
(7,15343,1,3,0),
|
||||||
|
(7,15342,1,3,0),
|
||||||
|
(7,15341,1,3,0),
|
||||||
|
(7,15340,1,3,0),
|
||||||
|
(7,15339,1,3,0),
|
||||||
|
(7,15338,1,3,0),
|
||||||
|
(7,15337,1,3,0),
|
||||||
|
(7,15336,1,3,0),
|
||||||
|
(7,15335,1,3,0),
|
||||||
|
(7,15334,1,3,0),
|
||||||
|
(7,15333,1,3,0),
|
||||||
|
(7,15332,1,3,0),
|
||||||
|
(7,15331,1,3,0),
|
||||||
|
(7,15330,1,3,0),
|
||||||
|
(7,15329,1,3,0),
|
||||||
|
(7,15328,1,3,0),
|
||||||
|
(7,15327,1,3,0),
|
||||||
|
(7,15326,1,3,0),
|
||||||
|
(7,15325,1,3,0),
|
||||||
|
(7,15324,1,3,0),
|
||||||
|
(7,15323,1,3,0),
|
||||||
|
(7,15322,1,3,0),
|
||||||
|
(7,15321,1,3,0),
|
||||||
|
(7,15314,1,3,0),
|
||||||
|
(7,15312,1,3,0),
|
||||||
|
(7,15311,1,3,0),
|
||||||
|
(7,15306,1,3,0),
|
||||||
|
(7,15307,1,3,0),
|
||||||
|
(7,15308,1,3,0),
|
||||||
|
(7,15309,1,3,0),
|
||||||
|
(7,15310,1,3,0),
|
||||||
|
(7,15305,1,3,0),
|
||||||
|
(7,15304,1,3,0),
|
||||||
|
(7,15303,1,3,0),
|
||||||
|
(7,15302,1,3,0),
|
||||||
|
(7,15301,1,3,0),
|
||||||
|
(7,15300,1,3,0),
|
||||||
|
(7,15299,1,3,0),
|
||||||
|
(7,15298,1,3,0),
|
||||||
|
(7,15297,1,3,0),
|
||||||
|
(7,15296,1,3,0),
|
||||||
|
(7,15295,1,3,0),
|
||||||
|
(7,15293,1,3,0),
|
||||||
|
(7,15294,1,3,0),
|
||||||
|
(7,15292,1,3,0),
|
||||||
|
(7,15291,1,3,0),
|
||||||
|
(7,15290,1,3,0),
|
||||||
|
(7,15289,1,3,0),
|
||||||
|
(7,15315,1,3,0),
|
||||||
|
(7,15316,1,3,0),
|
||||||
|
(7,15317,1,3,0),
|
||||||
|
(7,15318,1,3,0),
|
||||||
|
(7,15319,1,3,0),
|
||||||
|
(7,15320,1,3,0),
|
||||||
|
(7,15819,1,3,0),
|
||||||
|
(7,15820,1,3,0),
|
||||||
|
(7,15821,1,3,0),
|
||||||
|
(7,15822,1,3,0),
|
||||||
|
(7,16450,1,3,0),
|
||||||
|
(7,16451,1,3,0),
|
||||||
|
(7,16459,1,1,0),
|
||||||
|
(7,16460,1,1,0),
|
||||||
|
(7,16461,1,1,0),
|
||||||
|
(7,16462,1,1,0),
|
||||||
|
(7,16463,1,1,0),
|
||||||
|
(7,16464,1,1,0),
|
||||||
|
(7,16465,1,1,0),
|
||||||
|
(7,16466,1,1,0),
|
||||||
|
(7,16467,1,1,0),
|
||||||
|
(7,16468,1,1,0),
|
||||||
|
(7,16469,1,1,0),
|
||||||
|
(7,16470,1,1,0),
|
||||||
|
(7,16471,1,1,0),
|
||||||
|
(7,16472,1,1,0),
|
||||||
|
(7,16454,1,3,0),
|
||||||
|
(7,16455,1,3,0),
|
||||||
|
(7,16442,1,3,0),
|
||||||
|
(7,16443,1,3,0),
|
||||||
|
(7,16342,1,3,0),
|
||||||
|
(7,16343,1,3,0),
|
||||||
|
(7,16444,1,3,0),
|
||||||
|
(7,16445,1,3,0),
|
||||||
|
(7,16344,1,3,0),
|
||||||
|
(7,16345,1,3,0),
|
||||||
|
(7,16352,1,3,0),
|
||||||
|
(7,16353,1,3,0),
|
||||||
|
(7,16446,1,3,0),
|
||||||
|
(7,16447,1,3,0),
|
||||||
|
(7,16448,1,3,0),
|
||||||
|
(7,16449,1,3,0),
|
||||||
|
(7,16348,1,3,0),
|
||||||
|
(7,16349,1,3,0);
|
||||||
|
|
||||||
|
END;
|
||||||
12
bundled-schema/OtherShops.sql
Normal file
12
bundled-schema/OtherShops.sql
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
INSERT INTO public.shop_items
|
||||||
|
(shop_type, shop_id, item_id, cost, quantity, min_hr, min_sr, min_gr, store_level, max_quantity, road_floors, road_fatalis)
|
||||||
|
VALUES
|
||||||
|
(5,5,16516,100,1,0,0,1,0,0,0,0),
|
||||||
|
(5,5,16517,100,1,0,0,1,0,0,0,0),
|
||||||
|
(7,0,13190,10,1,0,0,0,0,0,0,0),
|
||||||
|
(7,0,1662,10,1,0,0,0,0,0,0,0),
|
||||||
|
(7,0,10179,100,1,0,0,0,0,0,0,0);
|
||||||
|
|
||||||
|
END;
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
package mhfcid
|
|
||||||
|
|
||||||
import (
|
|
||||||
"math"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ConvertCID converts a MHF Character ID String to integer
|
|
||||||
//
|
|
||||||
// Banned characters: 0, I, O, S
|
|
||||||
func ConvertCID(ID string) (r uint32) {
|
|
||||||
if len(ID) != 6 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
m := map[rune]uint32{
|
|
||||||
'1': 0,
|
|
||||||
'2': 1,
|
|
||||||
'3': 2,
|
|
||||||
'4': 3,
|
|
||||||
'5': 4,
|
|
||||||
'6': 5,
|
|
||||||
'7': 6,
|
|
||||||
'8': 7,
|
|
||||||
'9': 8,
|
|
||||||
'A': 9,
|
|
||||||
'B': 10,
|
|
||||||
'C': 11,
|
|
||||||
'D': 12,
|
|
||||||
'E': 13,
|
|
||||||
'F': 14,
|
|
||||||
'G': 15,
|
|
||||||
'H': 16,
|
|
||||||
'J': 17,
|
|
||||||
'K': 18,
|
|
||||||
'L': 19,
|
|
||||||
'M': 20,
|
|
||||||
'N': 21,
|
|
||||||
'P': 22,
|
|
||||||
'Q': 23,
|
|
||||||
'R': 24,
|
|
||||||
'T': 25,
|
|
||||||
'U': 26,
|
|
||||||
'V': 27,
|
|
||||||
'W': 28,
|
|
||||||
'X': 29,
|
|
||||||
'Y': 30,
|
|
||||||
'Z': 31,
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, c := range ID {
|
|
||||||
r += m[c] * uint32(math.Pow(32, float64(i)))
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package mhfcourse
|
package mhfcourse
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_config "erupe-ce/config"
|
|
||||||
"math"
|
"math"
|
||||||
"sort"
|
"sort"
|
||||||
"time"
|
"time"
|
||||||
@@ -67,15 +66,12 @@ func CourseExists(ID uint16, c []Course) bool {
|
|||||||
|
|
||||||
// GetCourseStruct returns a slice of Course(s) from a rights integer
|
// GetCourseStruct returns a slice of Course(s) from a rights integer
|
||||||
func GetCourseStruct(rights uint32) ([]Course, uint32) {
|
func GetCourseStruct(rights uint32) ([]Course, uint32) {
|
||||||
var resp []Course
|
resp := []Course{{ID: 1}, {ID: 23}, {ID: 24}}
|
||||||
for _, c := range _config.ErupeConfig.DefaultCourses {
|
|
||||||
resp = append(resp, Course{ID: c})
|
|
||||||
}
|
|
||||||
s := Courses()
|
s := Courses()
|
||||||
sort.Slice(s, func(i, j int) bool {
|
sort.Slice(s, func(i, j int) bool {
|
||||||
return s[i].ID > s[j].ID
|
return s[i].ID > s[j].ID
|
||||||
})
|
})
|
||||||
var normalCafeCourseSet, netcafeCourseSet, hidenCourseSet bool
|
var normalCafeCourseSet, netcafeCourseSet bool
|
||||||
for _, course := range s {
|
for _, course := range s {
|
||||||
if rights-course.Value() < 0x80000000 {
|
if rights-course.Value() < 0x80000000 {
|
||||||
switch course.ID {
|
switch course.ID {
|
||||||
@@ -92,12 +88,6 @@ func GetCourseStruct(rights uint32) ([]Course, uint32) {
|
|||||||
}
|
}
|
||||||
netcafeCourseSet = true
|
netcafeCourseSet = true
|
||||||
resp = append(resp, Course{ID: 30})
|
resp = append(resp, Course{ID: 30})
|
||||||
case 10:
|
|
||||||
if hidenCourseSet {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
hidenCourseSet = true
|
|
||||||
resp = append(resp, Course{ID: 31})
|
|
||||||
}
|
}
|
||||||
course.Expiry = time.Date(2030, 1, 1, 0, 0, 0, 0, time.FixedZone("UTC+9", 9*60*60))
|
course.Expiry = time.Date(2030, 1, 1, 0, 0, 0, 0, time.FixedZone("UTC+9", 9*60*60))
|
||||||
resp = append(resp, course)
|
resp = append(resp, course)
|
||||||
|
|||||||
@@ -1,175 +0,0 @@
|
|||||||
package mhfitem
|
|
||||||
|
|
||||||
import (
|
|
||||||
"erupe-ce/common/byteframe"
|
|
||||||
"erupe-ce/common/token"
|
|
||||||
_config "erupe-ce/config"
|
|
||||||
)
|
|
||||||
|
|
||||||
type MHFItem struct {
|
|
||||||
ItemID uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
type MHFSigilEffect struct {
|
|
||||||
ID uint16
|
|
||||||
Level uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
type MHFSigil struct {
|
|
||||||
Effects []MHFSigilEffect
|
|
||||||
Unk0 uint8
|
|
||||||
Unk1 uint8
|
|
||||||
Unk2 uint8
|
|
||||||
Unk3 uint8
|
|
||||||
}
|
|
||||||
|
|
||||||
type MHFEquipment struct {
|
|
||||||
WarehouseID uint32
|
|
||||||
ItemType uint8
|
|
||||||
Unk0 uint8
|
|
||||||
ItemID uint16
|
|
||||||
Level uint16
|
|
||||||
Decorations []MHFItem
|
|
||||||
Sigils []MHFSigil
|
|
||||||
Unk1 uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
type MHFItemStack struct {
|
|
||||||
WarehouseID uint32
|
|
||||||
Item MHFItem
|
|
||||||
Quantity uint16
|
|
||||||
Unk0 uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
func ReadWarehouseItem(bf *byteframe.ByteFrame) MHFItemStack {
|
|
||||||
var item MHFItemStack
|
|
||||||
item.WarehouseID = bf.ReadUint32()
|
|
||||||
if item.WarehouseID == 0 {
|
|
||||||
item.WarehouseID = token.RNG.Uint32()
|
|
||||||
}
|
|
||||||
item.Item.ItemID = bf.ReadUint16()
|
|
||||||
item.Quantity = bf.ReadUint16()
|
|
||||||
item.Unk0 = bf.ReadUint32()
|
|
||||||
return item
|
|
||||||
}
|
|
||||||
|
|
||||||
func DiffItemStacks(o []MHFItemStack, u []MHFItemStack) []MHFItemStack {
|
|
||||||
// o = old, u = update, f = final
|
|
||||||
var f []MHFItemStack
|
|
||||||
for _, uItem := range u {
|
|
||||||
exists := false
|
|
||||||
for i := range o {
|
|
||||||
if o[i].WarehouseID == uItem.WarehouseID {
|
|
||||||
exists = true
|
|
||||||
o[i].Quantity = uItem.Quantity
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !exists {
|
|
||||||
uItem.WarehouseID = token.RNG.Uint32()
|
|
||||||
f = append(f, uItem)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, oItem := range o {
|
|
||||||
if oItem.Quantity > 0 {
|
|
||||||
f = append(f, oItem)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return f
|
|
||||||
}
|
|
||||||
|
|
||||||
func (is MHFItemStack) ToBytes() []byte {
|
|
||||||
bf := byteframe.NewByteFrame()
|
|
||||||
bf.WriteUint32(is.WarehouseID)
|
|
||||||
bf.WriteUint16(is.Item.ItemID)
|
|
||||||
bf.WriteUint16(is.Quantity)
|
|
||||||
bf.WriteUint32(is.Unk0)
|
|
||||||
return bf.Data()
|
|
||||||
}
|
|
||||||
|
|
||||||
func SerializeWarehouseItems(i []MHFItemStack) []byte {
|
|
||||||
bf := byteframe.NewByteFrame()
|
|
||||||
bf.WriteUint16(uint16(len(i)))
|
|
||||||
bf.WriteUint16(0) // Unused
|
|
||||||
for _, j := range i {
|
|
||||||
bf.WriteBytes(j.ToBytes())
|
|
||||||
}
|
|
||||||
return bf.Data()
|
|
||||||
}
|
|
||||||
|
|
||||||
func ReadWarehouseEquipment(bf *byteframe.ByteFrame) MHFEquipment {
|
|
||||||
var equipment MHFEquipment
|
|
||||||
equipment.Decorations = make([]MHFItem, 3)
|
|
||||||
equipment.Sigils = make([]MHFSigil, 3)
|
|
||||||
for i := 0; i < 3; i++ {
|
|
||||||
equipment.Sigils[i].Effects = make([]MHFSigilEffect, 3)
|
|
||||||
}
|
|
||||||
equipment.WarehouseID = bf.ReadUint32()
|
|
||||||
if equipment.WarehouseID == 0 {
|
|
||||||
equipment.WarehouseID = token.RNG.Uint32()
|
|
||||||
}
|
|
||||||
equipment.ItemType = bf.ReadUint8()
|
|
||||||
equipment.Unk0 = bf.ReadUint8()
|
|
||||||
equipment.ItemID = bf.ReadUint16()
|
|
||||||
equipment.Level = bf.ReadUint16()
|
|
||||||
for i := 0; i < 3; i++ {
|
|
||||||
equipment.Decorations[i].ItemID = bf.ReadUint16()
|
|
||||||
}
|
|
||||||
if _config.ErupeConfig.RealClientMode >= _config.G1 {
|
|
||||||
for i := 0; i < 3; i++ {
|
|
||||||
for j := 0; j < 3; j++ {
|
|
||||||
equipment.Sigils[i].Effects[j].ID = bf.ReadUint16()
|
|
||||||
}
|
|
||||||
for j := 0; j < 3; j++ {
|
|
||||||
equipment.Sigils[i].Effects[j].Level = bf.ReadUint16()
|
|
||||||
}
|
|
||||||
equipment.Sigils[i].Unk0 = bf.ReadUint8()
|
|
||||||
equipment.Sigils[i].Unk1 = bf.ReadUint8()
|
|
||||||
equipment.Sigils[i].Unk2 = bf.ReadUint8()
|
|
||||||
equipment.Sigils[i].Unk3 = bf.ReadUint8()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if _config.ErupeConfig.RealClientMode >= _config.Z1 {
|
|
||||||
equipment.Unk1 = bf.ReadUint16()
|
|
||||||
}
|
|
||||||
return equipment
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e MHFEquipment) ToBytes() []byte {
|
|
||||||
bf := byteframe.NewByteFrame()
|
|
||||||
bf.WriteUint32(e.WarehouseID)
|
|
||||||
bf.WriteUint8(e.ItemType)
|
|
||||||
bf.WriteUint8(e.Unk0)
|
|
||||||
bf.WriteUint16(e.ItemID)
|
|
||||||
bf.WriteUint16(e.Level)
|
|
||||||
for i := 0; i < 3; i++ {
|
|
||||||
bf.WriteUint16(e.Decorations[i].ItemID)
|
|
||||||
}
|
|
||||||
if _config.ErupeConfig.RealClientMode >= _config.G1 {
|
|
||||||
for i := 0; i < 3; i++ {
|
|
||||||
for j := 0; j < 3; j++ {
|
|
||||||
bf.WriteUint16(e.Sigils[i].Effects[j].ID)
|
|
||||||
}
|
|
||||||
for j := 0; j < 3; j++ {
|
|
||||||
bf.WriteUint16(e.Sigils[i].Effects[j].Level)
|
|
||||||
}
|
|
||||||
bf.WriteUint8(e.Sigils[i].Unk0)
|
|
||||||
bf.WriteUint8(e.Sigils[i].Unk1)
|
|
||||||
bf.WriteUint8(e.Sigils[i].Unk2)
|
|
||||||
bf.WriteUint8(e.Sigils[i].Unk3)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if _config.ErupeConfig.RealClientMode >= _config.Z1 {
|
|
||||||
bf.WriteUint16(e.Unk1)
|
|
||||||
}
|
|
||||||
return bf.Data()
|
|
||||||
}
|
|
||||||
|
|
||||||
func SerializeWarehouseEquipment(i []MHFEquipment) []byte {
|
|
||||||
bf := byteframe.NewByteFrame()
|
|
||||||
bf.WriteUint16(uint16(len(i)))
|
|
||||||
bf.WriteUint16(0) // Unused
|
|
||||||
for _, j := range i {
|
|
||||||
bf.WriteBytes(j.ToBytes())
|
|
||||||
}
|
|
||||||
return bf.Data()
|
|
||||||
}
|
|
||||||
@@ -1,366 +0,0 @@
|
|||||||
package mhfmon
|
|
||||||
|
|
||||||
const (
|
|
||||||
Mon0 = iota
|
|
||||||
Rathian
|
|
||||||
Fatalis
|
|
||||||
Kelbi
|
|
||||||
Mosswine
|
|
||||||
Bullfango
|
|
||||||
YianKutKu
|
|
||||||
LaoShanLung
|
|
||||||
Cephadrome
|
|
||||||
Felyne
|
|
||||||
VeggieElder
|
|
||||||
Rathalos
|
|
||||||
Aptonoth
|
|
||||||
Genprey
|
|
||||||
Diablos
|
|
||||||
Khezu
|
|
||||||
Velociprey
|
|
||||||
Gravios
|
|
||||||
Mon18
|
|
||||||
Vespoid
|
|
||||||
Gypceros
|
|
||||||
Plesioth
|
|
||||||
Basarios
|
|
||||||
Melynx
|
|
||||||
Hornetaur
|
|
||||||
Apceros
|
|
||||||
Monoblos
|
|
||||||
Velocidrome
|
|
||||||
Gendrome
|
|
||||||
Mon29
|
|
||||||
Ioprey
|
|
||||||
Iodrome
|
|
||||||
Mon32
|
|
||||||
Kirin
|
|
||||||
Cephalos
|
|
||||||
Giaprey
|
|
||||||
CrimsonFatalis
|
|
||||||
PinkRathian
|
|
||||||
BlueYianKutKu
|
|
||||||
PurpleGypceros
|
|
||||||
YianGaruga
|
|
||||||
SilverRathalos
|
|
||||||
GoldRathian
|
|
||||||
BlackDiablos
|
|
||||||
WhiteMonoblos
|
|
||||||
RedKhezu
|
|
||||||
GreenPlesioth
|
|
||||||
BlackGravios
|
|
||||||
DaimyoHermitaur
|
|
||||||
AzureRathalos
|
|
||||||
AshenLaoShanLung
|
|
||||||
Blangonga
|
|
||||||
Congalala
|
|
||||||
Rajang
|
|
||||||
KushalaDaora
|
|
||||||
ShenGaoren
|
|
||||||
GreatThunderbug
|
|
||||||
Shakalaka
|
|
||||||
YamaTsukami
|
|
||||||
Chameleos
|
|
||||||
RustedKushalaDaora
|
|
||||||
Blango
|
|
||||||
Conga
|
|
||||||
Remobra
|
|
||||||
Lunastra
|
|
||||||
Teostra
|
|
||||||
Hermitaur
|
|
||||||
ShogunCeanataur
|
|
||||||
Bulldrome
|
|
||||||
Anteka
|
|
||||||
Popo
|
|
||||||
WhiteFatalis
|
|
||||||
Mon72
|
|
||||||
Ceanataur
|
|
||||||
Hypnocatrice
|
|
||||||
Lavasioth
|
|
||||||
Tigrex
|
|
||||||
Akantor
|
|
||||||
BrightHypnoc
|
|
||||||
RedLavasioth
|
|
||||||
Espinas
|
|
||||||
BurningEspinas
|
|
||||||
WhiteHypnoc
|
|
||||||
AqraVashimu
|
|
||||||
AqraJebia
|
|
||||||
Berukyurosu
|
|
||||||
Mon86
|
|
||||||
Mon87
|
|
||||||
Mon88
|
|
||||||
Pariapuria
|
|
||||||
PearlEspinas
|
|
||||||
KamuOrugaron
|
|
||||||
NonoOrugaron
|
|
||||||
Raviente
|
|
||||||
Dyuragaua
|
|
||||||
Doragyurosu
|
|
||||||
Gurenzeburu
|
|
||||||
Burukku
|
|
||||||
Erupe
|
|
||||||
Rukodiora
|
|
||||||
Unknown
|
|
||||||
Gogomoa
|
|
||||||
Kokomoa
|
|
||||||
TaikunZamuza
|
|
||||||
Abiorugu
|
|
||||||
Kuarusepusu
|
|
||||||
Odibatorasu
|
|
||||||
Disufiroa
|
|
||||||
Rebidiora
|
|
||||||
Anorupatisu
|
|
||||||
Hyujikiki
|
|
||||||
Midogaron
|
|
||||||
Giaorugu
|
|
||||||
MiRu
|
|
||||||
Farunokku
|
|
||||||
Pokaradon
|
|
||||||
Shantien
|
|
||||||
Pokara
|
|
||||||
Mon118
|
|
||||||
Goruganosu
|
|
||||||
Aruganosu
|
|
||||||
Baruragaru
|
|
||||||
Zerureusu
|
|
||||||
Gougarf
|
|
||||||
Uruki
|
|
||||||
Forokururu
|
|
||||||
Meraginasu
|
|
||||||
Diorex
|
|
||||||
GarubaDaora
|
|
||||||
Inagami
|
|
||||||
Varusaburosu
|
|
||||||
Poborubarumu
|
|
||||||
Block1Duremudira
|
|
||||||
Mon133
|
|
||||||
Mon134
|
|
||||||
Mon135
|
|
||||||
Mon136
|
|
||||||
Mon137
|
|
||||||
Mon138
|
|
||||||
Gureadomosu
|
|
||||||
Harudomerugu
|
|
||||||
Toridcless
|
|
||||||
Gasurabazura
|
|
||||||
Kusubami
|
|
||||||
YamaKurai
|
|
||||||
Block2Duremudira
|
|
||||||
Zinogre
|
|
||||||
Deviljho
|
|
||||||
Brachydios
|
|
||||||
BerserkRaviente
|
|
||||||
ToaTesukatora
|
|
||||||
Barioth
|
|
||||||
Uragaan
|
|
||||||
StygianZinogre
|
|
||||||
Guanzorumu
|
|
||||||
SavageDeviljho
|
|
||||||
Mon156
|
|
||||||
Egyurasu
|
|
||||||
Voljang
|
|
||||||
Nargacuga
|
|
||||||
Keoaruboru
|
|
||||||
Zenaserisu
|
|
||||||
GoreMagala
|
|
||||||
BlinkingNargacuga
|
|
||||||
ShagaruMagala
|
|
||||||
Amatsu
|
|
||||||
Eruzerion
|
|
||||||
MusouDuremudira
|
|
||||||
Mon168
|
|
||||||
Seregios
|
|
||||||
Bogabadorumu
|
|
||||||
Mon171
|
|
||||||
MusouBogabadorumu
|
|
||||||
CostumedUruki
|
|
||||||
MusouZerureusu
|
|
||||||
Rappy
|
|
||||||
KingShakalaka
|
|
||||||
)
|
|
||||||
|
|
||||||
type Monster struct {
|
|
||||||
Name string
|
|
||||||
Large bool
|
|
||||||
}
|
|
||||||
|
|
||||||
var Monsters = []Monster{
|
|
||||||
{"Mon0", false},
|
|
||||||
{"Rathian", true},
|
|
||||||
{"Fatalis", true},
|
|
||||||
{"Kelbi", false},
|
|
||||||
{"Mosswine", false},
|
|
||||||
{"Bullfango", false},
|
|
||||||
{"Yian Kut-Ku", true},
|
|
||||||
{"Lao-Shan Lung", true},
|
|
||||||
{"Cephadrome", true},
|
|
||||||
{"Felyne", false},
|
|
||||||
{"Veggie Elder", false},
|
|
||||||
{"Rathalos", true},
|
|
||||||
{"Aptonoth", false},
|
|
||||||
{"Genprey", false},
|
|
||||||
{"Diablos", true},
|
|
||||||
{"Khezu", true},
|
|
||||||
{"Velociprey", false},
|
|
||||||
{"Gravios", true},
|
|
||||||
{"Mon18", false},
|
|
||||||
{"Vespoid", false},
|
|
||||||
{"Gypceros", true},
|
|
||||||
{"Plesioth", true},
|
|
||||||
{"Basarios", true},
|
|
||||||
{"Melynx", false},
|
|
||||||
{"Hornetaur", false},
|
|
||||||
{"Apceros", false},
|
|
||||||
{"Monoblos", true},
|
|
||||||
{"Velocidrome", true},
|
|
||||||
{"Gendrome", true},
|
|
||||||
{"Mon29", false},
|
|
||||||
{"Ioprey", false},
|
|
||||||
{"Iodrome", true},
|
|
||||||
{"Mon32", false},
|
|
||||||
{"Kirin", true},
|
|
||||||
{"Cephalos", false},
|
|
||||||
{"Giaprey", false},
|
|
||||||
{"Crimson Fatalis", true},
|
|
||||||
{"Pink Rathian", true},
|
|
||||||
{"Blue Yian Kut-Ku", true},
|
|
||||||
{"Purple Gypceros", true},
|
|
||||||
{"Yian Garuga", true},
|
|
||||||
{"Silver Rathalos", true},
|
|
||||||
{"Gold Rathian", true},
|
|
||||||
{"Black Diablos", true},
|
|
||||||
{"White Monoblos", true},
|
|
||||||
{"Red Khezu", true},
|
|
||||||
{"Green Plesioth", true},
|
|
||||||
{"Black Gravios", true},
|
|
||||||
{"Daimyo Hermitaur", true},
|
|
||||||
{"Azure Rathalos", true},
|
|
||||||
{"Ashen Lao-Shan Lung", true},
|
|
||||||
{"Blangonga", true},
|
|
||||||
{"Congalala", true},
|
|
||||||
{"Rajang", true},
|
|
||||||
{"Kushala Daora", true},
|
|
||||||
{"Shen Gaoren", true},
|
|
||||||
{"Great Thunderbug", false},
|
|
||||||
{"Shakalaka", false},
|
|
||||||
{"Yama Tsukami", true},
|
|
||||||
{"Chameleos", true},
|
|
||||||
{"Rusted Kushala Daora", true},
|
|
||||||
{"Blango", false},
|
|
||||||
{"Conga", false},
|
|
||||||
{"Remobra", false},
|
|
||||||
{"Lunastra", true},
|
|
||||||
{"Teostra", true},
|
|
||||||
{"Hermitaur", false},
|
|
||||||
{"Shogun Ceanataur", true},
|
|
||||||
{"Bulldrome", true},
|
|
||||||
{"Anteka", false},
|
|
||||||
{"Popo", false},
|
|
||||||
{"White Fatalis", true},
|
|
||||||
{"Mon72", false},
|
|
||||||
{"Ceanataur", false},
|
|
||||||
{"Hypnocatrice", true},
|
|
||||||
{"Lavasioth", true},
|
|
||||||
{"Tigrex", true},
|
|
||||||
{"Akantor", true},
|
|
||||||
{"Bright Hypnocatrice", true},
|
|
||||||
{"Red Lavasioth", true},
|
|
||||||
{"Espinas", true},
|
|
||||||
{"Burning Espinas", true},
|
|
||||||
{"White Hypnocatrice", true},
|
|
||||||
{"Aqra Vashimu", true},
|
|
||||||
{"Aqra Jebia", true},
|
|
||||||
{"Berukyurosu", true},
|
|
||||||
{"Mon86", false},
|
|
||||||
{"Mon87", false},
|
|
||||||
{"Mon88", false},
|
|
||||||
{"Pariapuria", true},
|
|
||||||
{"Pearl Espinas", true},
|
|
||||||
{"Kamu Orugaron", true},
|
|
||||||
{"Nono Orugaron", true},
|
|
||||||
{"Raviente", true}, // + Violent
|
|
||||||
{"Dyuragaua", true},
|
|
||||||
{"Doragyurosu", true},
|
|
||||||
{"Gurenzeburu", true},
|
|
||||||
{"Burukku", false},
|
|
||||||
{"Erupe", false},
|
|
||||||
{"Rukodiora", true},
|
|
||||||
{"Unknown", true},
|
|
||||||
{"Gogomoa", true},
|
|
||||||
{"Kokomoa", false},
|
|
||||||
{"Taikun Zamuza", true},
|
|
||||||
{"Abiorugu", true},
|
|
||||||
{"Kuarusepusu", true},
|
|
||||||
{"Odibatorasu", true},
|
|
||||||
{"Disufiroa", true},
|
|
||||||
{"Rebidiora", true},
|
|
||||||
{"Anorupatisu", true},
|
|
||||||
{"Hyujikiki", true},
|
|
||||||
{"Midogaron", true},
|
|
||||||
{"Giaorugu", true},
|
|
||||||
{"Mi-Ru", true}, // + Musou
|
|
||||||
{"Farunokku", true},
|
|
||||||
{"Pokaradon", true},
|
|
||||||
{"Shantien", true},
|
|
||||||
{"Pokara", false},
|
|
||||||
{"Mon118", false},
|
|
||||||
{"Goruganosu", true},
|
|
||||||
{"Aruganosu", true},
|
|
||||||
{"Baruragaru", true},
|
|
||||||
{"Zerureusu", true},
|
|
||||||
{"Gougarf", true}, // Both
|
|
||||||
{"Uruki", false},
|
|
||||||
{"Forokururu", true},
|
|
||||||
{"Meraginasu", true},
|
|
||||||
{"Diorex", true},
|
|
||||||
{"Garuba Daora", true},
|
|
||||||
{"Inagami", true},
|
|
||||||
{"Varusablos", true},
|
|
||||||
{"Poborubarumu", true},
|
|
||||||
{"1st Block Duremudira", true},
|
|
||||||
{"Mon133", false},
|
|
||||||
{"Mon134", false},
|
|
||||||
{"Mon135", false},
|
|
||||||
{"Mon136", false},
|
|
||||||
{"Mon137", false},
|
|
||||||
{"Mon138", false},
|
|
||||||
{"Gureadomosu", true},
|
|
||||||
{"Harudomerugu", true},
|
|
||||||
{"Toridcless", true},
|
|
||||||
{"Gasurabazura", true},
|
|
||||||
{"Kusubami", false},
|
|
||||||
{"Yama Kurai", true},
|
|
||||||
{"2nd Block Duremudira", true},
|
|
||||||
{"Zinogre", true},
|
|
||||||
{"Deviljho", true},
|
|
||||||
{"Brachydios", true},
|
|
||||||
{"Berserk Raviente", true},
|
|
||||||
{"Toa Tesukatora", true},
|
|
||||||
{"Barioth", true},
|
|
||||||
{"Uragaan", true},
|
|
||||||
{"Stygian Zinogre", true},
|
|
||||||
{"Guanzorumu", true},
|
|
||||||
{"Savage Deviljho", true}, // + Starving/Heavenly
|
|
||||||
{"Mon156", false},
|
|
||||||
{"Egyurasu", false},
|
|
||||||
{"Voljang", true},
|
|
||||||
{"Nargacuga", true},
|
|
||||||
{"Keoaruboru", true},
|
|
||||||
{"Zenaserisu", true},
|
|
||||||
{"Gore Magala", true},
|
|
||||||
{"Blinking Nargacuga", true},
|
|
||||||
{"Shagaru Magala", true},
|
|
||||||
{"Amatsu", true},
|
|
||||||
{"Eruzerion", true}, // + Musou
|
|
||||||
{"Musou Duremudira", true},
|
|
||||||
{"Mon168", false},
|
|
||||||
{"Seregios", true},
|
|
||||||
{"Bogabadorumu", true},
|
|
||||||
{"Mon171", false},
|
|
||||||
{"Musou Bogabadorumu", true},
|
|
||||||
{"Costumed Uruki", false},
|
|
||||||
{"Musou Zerureusu", true},
|
|
||||||
{"Rappy", false},
|
|
||||||
{"King Shakalaka", false},
|
|
||||||
}
|
|
||||||
@@ -6,12 +6,13 @@ import (
|
|||||||
|
|
||||||
// StringStack is a basic LIFO "stack" for storing strings.
|
// StringStack is a basic LIFO "stack" for storing strings.
|
||||||
type StringStack struct {
|
type StringStack struct {
|
||||||
stack []string
|
Locked bool
|
||||||
|
stack []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new instance of StringStack
|
// New creates a new instance of StringStack
|
||||||
func New() *StringStack {
|
func New() *StringStack {
|
||||||
return &StringStack{}
|
return &StringStack{Locked: false}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set sets up a new StringStack
|
// Set sets up a new StringStack
|
||||||
@@ -19,6 +20,20 @@ func (s *StringStack) Set(v string) {
|
|||||||
s.stack = []string{v}
|
s.stack = []string{v}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Lock freezes the StringStack
|
||||||
|
func (s *StringStack) Lock() {
|
||||||
|
if !s.Locked {
|
||||||
|
s.Locked = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unlock unfreezes the StringStack
|
||||||
|
func (s *StringStack) Unlock() {
|
||||||
|
if s.Locked {
|
||||||
|
s.Locked = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Push pushes a string onto the stack.
|
// Push pushes a string onto the stack.
|
||||||
func (s *StringStack) Push(v string) {
|
func (s *StringStack) Push(v string) {
|
||||||
s.stack = append(s.stack, v)
|
s.stack = append(s.stack, v)
|
||||||
@@ -26,12 +41,11 @@ func (s *StringStack) Push(v string) {
|
|||||||
|
|
||||||
// Pop pops a string from the stack.
|
// Pop pops a string from the stack.
|
||||||
func (s *StringStack) Pop() (string, error) {
|
func (s *StringStack) Pop() (string, error) {
|
||||||
var x string
|
|
||||||
if len(s.stack) == 0 {
|
if len(s.stack) == 0 {
|
||||||
return x, errors.New("no items on stack")
|
return "", errors.New("no items on stack")
|
||||||
}
|
}
|
||||||
|
|
||||||
x = s.stack[len(s.stack)-1]
|
x := s.stack[len(s.stack)-1]
|
||||||
s.stack = s.stack[:len(s.stack)-1]
|
s.stack = s.stack[:len(s.stack)-1]
|
||||||
|
|
||||||
return x, nil
|
return x, nil
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ func CSVRemove(csv string, v int) string {
|
|||||||
func CSVContains(csv string, v int) bool {
|
func CSVContains(csv string, v int) bool {
|
||||||
s := strings.Split(csv, ",")
|
s := strings.Split(csv, ",")
|
||||||
for i := 0; i < len(s); i++ {
|
for i := 0; i < len(s); i++ {
|
||||||
j, _ := strconv.ParseInt(s[i], 10, 32)
|
j, _ := strconv.ParseInt(s[i], 10, 64)
|
||||||
if int(j) == v {
|
if int(j) == v {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -92,7 +92,7 @@ func CSVElems(csv string) []int {
|
|||||||
}
|
}
|
||||||
s := strings.Split(csv, ",")
|
s := strings.Split(csv, ",")
|
||||||
for i := 0; i < len(s); i++ {
|
for i := 0; i < len(s); i++ {
|
||||||
j, _ := strconv.ParseInt(s[i], 10, 32)
|
j, _ := strconv.ParseInt(s[i], 10, 64)
|
||||||
r = append(r, int(j))
|
r = append(r, int(j))
|
||||||
}
|
}
|
||||||
return r
|
return r
|
||||||
|
|||||||
@@ -5,19 +5,18 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var RNG = NewRNG()
|
|
||||||
|
|
||||||
// Generate returns an alphanumeric token of specified length
|
// Generate returns an alphanumeric token of specified length
|
||||||
func Generate(length int) string {
|
func Generate(length int) string {
|
||||||
|
rng := RNG()
|
||||||
var chars = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
|
var chars = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
|
||||||
b := make([]rune, length)
|
b := make([]rune, length)
|
||||||
for i := range b {
|
for i := range b {
|
||||||
b[i] = chars[RNG.Intn(len(chars))]
|
b[i] = chars[rng.Intn(len(chars))]
|
||||||
}
|
}
|
||||||
return string(b)
|
return string(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewRNG returns a new NewRNG generator
|
// RNG returns a new RNG generator
|
||||||
func NewRNG() *rand.Rand {
|
func RNG() *rand.Rand {
|
||||||
return rand.New(rand.NewSource(time.Now().UnixNano()))
|
return rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||||
}
|
}
|
||||||
|
|||||||
127
config.json
127
config.json
@@ -9,95 +9,59 @@
|
|||||||
],
|
],
|
||||||
"PatchServerManifest": "",
|
"PatchServerManifest": "",
|
||||||
"PatchServerFile": "",
|
"PatchServerFile": "",
|
||||||
"Screenshots":{
|
"ScreenshotAPIURL": "",
|
||||||
"Enabled":true,
|
|
||||||
"Host":"127.0.0.1",
|
|
||||||
"Port":8080,
|
|
||||||
"OutputDir":"screenshots",
|
|
||||||
"UploadQuality":100
|
|
||||||
},
|
|
||||||
"DeleteOnSaveCorruption": false,
|
"DeleteOnSaveCorruption": false,
|
||||||
"ClientMode": "ZZ",
|
"ClientMode": "ZZ",
|
||||||
"QuestCacheExpiry": 300,
|
"DevMode": true,
|
||||||
"CommandPrefix": "!",
|
"DevModeOptions": {
|
||||||
"AutoCreateAccount": true,
|
"AutoCreateAccount": true,
|
||||||
"DefaultCourses": [1, 23, 24],
|
|
||||||
"EarthStatus": 0,
|
|
||||||
"EarthID": 0,
|
|
||||||
"EarthMonsters": [0, 0, 0, 0],
|
|
||||||
"SaveDumps": {
|
|
||||||
"Enabled": true,
|
|
||||||
"RawEnabled": false,
|
|
||||||
"OutputDir": "save-backups"
|
|
||||||
},
|
|
||||||
"DebugOptions": {
|
|
||||||
"CleanDB": false,
|
"CleanDB": false,
|
||||||
"MaxLauncherHR": false,
|
"MaxLauncherHR": false,
|
||||||
"LogInboundMessages": false,
|
"LogInboundMessages": true,
|
||||||
"LogOutboundMessages": false,
|
"LogOutboundMessages": true,
|
||||||
"LogMessageData": false,
|
|
||||||
"MaxHexdumpLength": 256,
|
"MaxHexdumpLength": 256,
|
||||||
"DivaOverride": 0,
|
"DivaEvent": 0,
|
||||||
"FestaOverride": -1,
|
"FestaEvent": -1,
|
||||||
"TournamentOverride": 0,
|
"TournamentEvent": 0,
|
||||||
|
"MezFesEvent": true,
|
||||||
|
"MezFesAlt": false,
|
||||||
"DisableTokenCheck": false,
|
"DisableTokenCheck": false,
|
||||||
"QuestTools": false,
|
"QuestDebugTools": false,
|
||||||
"AutoQuestBackport": true,
|
"EarthStatusOverride": 0,
|
||||||
"ProxyPort": 0,
|
"EarthIDOverride": 0,
|
||||||
"CapLink": {
|
"EarthMonsterOverride": 0,
|
||||||
"Values": [51728, 20000, 51729, 1, 20000],
|
"SaveDumps": {
|
||||||
"Key": "",
|
"Enabled": true,
|
||||||
"Host": "",
|
"OutputDir": "save-backups"
|
||||||
"Port": 80
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"GameplayOptions": {
|
"GameplayOptions": {
|
||||||
"MinFeatureWeapons": 0,
|
"FeaturedWeapons": 1,
|
||||||
"MaxFeatureWeapons": 1,
|
|
||||||
"MaximumNP": 100000,
|
"MaximumNP": 100000,
|
||||||
"MaximumRP": 50000,
|
"MaximumRP": 50000,
|
||||||
"MaximumFP": 120000,
|
"MaximumFP": 120000,
|
||||||
"TreasureHuntExpiry": 604800,
|
|
||||||
"DisableLoginBoost": false,
|
"DisableLoginBoost": false,
|
||||||
"DisableBoostTime": false,
|
"DisableBoostTime": false,
|
||||||
"BoostTimeDuration": 7200,
|
"BoostTimeDuration": 120,
|
||||||
"ClanMealDuration": 3600,
|
"GuildMealDuration": 60,
|
||||||
"ClanMemberLimits": [[0, 30], [3, 40], [7, 50], [10, 60]],
|
|
||||||
"BonusQuestAllowance": 3,
|
"BonusQuestAllowance": 3,
|
||||||
"DailyQuestAllowance": 1,
|
"DailyQuestAllowance": 1,
|
||||||
|
"MezfesSoloTickets": 10,
|
||||||
|
"MezfesGroupTickets": 4,
|
||||||
"LowLatencyRaviente": false,
|
"LowLatencyRaviente": false,
|
||||||
"RegularRavienteMaxPlayers": 8,
|
"RegularRavienteMaxPlayers": 8,
|
||||||
"ViolentRavienteMaxPlayers": 8,
|
"ViolentRavienteMaxPlayers": 8,
|
||||||
"BerserkRavienteMaxPlayers": 32,
|
"BerserkRavienteMaxPlayers": 32,
|
||||||
"ExtremeRavienteMaxPlayers": 32,
|
"ExtremeRavienteMaxPlayers": 32,
|
||||||
"SmallBerserkRavienteMaxPlayers": 8,
|
"SmallBerserkRavienteMaxPlayers": 8,
|
||||||
"GUrgentRate": 0.10,
|
"GUrgentRate": 10,
|
||||||
"GCPMultiplier": 1.00,
|
"GCPMultiplier": 1.00,
|
||||||
"HRPMultiplier": 1.00,
|
|
||||||
"HRPMultiplierNC": 1.00,
|
|
||||||
"SRPMultiplier": 1.00,
|
|
||||||
"SRPMultiplierNC": 1.00,
|
|
||||||
"GRPMultiplier": 1.00,
|
"GRPMultiplier": 1.00,
|
||||||
"GRPMultiplierNC": 1.00,
|
|
||||||
"GSRPMultiplier": 1.00,
|
"GSRPMultiplier": 1.00,
|
||||||
"GSRPMultiplierNC": 1.00,
|
|
||||||
"ZennyMultiplier": 1.00,
|
|
||||||
"ZennyMultiplierNC": 1.00,
|
|
||||||
"GZennyMultiplier": 1.00,
|
"GZennyMultiplier": 1.00,
|
||||||
"GZennyMultiplierNC": 1.00,
|
|
||||||
"MaterialMultiplier": 1.00,
|
"MaterialMultiplier": 1.00,
|
||||||
"MaterialMultiplierNC": 1.00,
|
|
||||||
"GMaterialMultiplier": 1.00,
|
|
||||||
"GMaterialMultiplierNC": 1.00,
|
|
||||||
"ExtraCarves": 0,
|
"ExtraCarves": 0,
|
||||||
"ExtraCarvesNC": 0,
|
|
||||||
"GExtraCarves": 0,
|
|
||||||
"GExtraCarvesNC": 0,
|
|
||||||
"DisableHunterNavi": false,
|
"DisableHunterNavi": false,
|
||||||
"MezFesSoloTickets": 5,
|
|
||||||
"MezFesGroupTickets": 1,
|
|
||||||
"MezFesDuration": 172800,
|
|
||||||
"MezFesSwitchMinigame": false,
|
|
||||||
"EnableKaijiEvent": false,
|
"EnableKaijiEvent": false,
|
||||||
"EnableHiganjimaEvent": false,
|
"EnableHiganjimaEvent": false,
|
||||||
"EnableNierEvent": false,
|
"EnableNierEvent": false,
|
||||||
@@ -107,68 +71,37 @@
|
|||||||
"Discord": {
|
"Discord": {
|
||||||
"Enabled": false,
|
"Enabled": false,
|
||||||
"BotToken": "",
|
"BotToken": "",
|
||||||
"RelayChannel": {
|
"RealtimeChannelID": ""
|
||||||
"Enabled": false,
|
|
||||||
"MaxMessageLength": 183,
|
|
||||||
"RelayChannelID": ""
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"Commands": [
|
"Commands": [
|
||||||
{
|
{
|
||||||
"Name": "Help",
|
|
||||||
"Enabled": true,
|
|
||||||
"Description": "Show enabled chat commands",
|
|
||||||
"Prefix": "help"
|
|
||||||
}, {
|
|
||||||
"Name": "Rights",
|
"Name": "Rights",
|
||||||
"Enabled": false,
|
"Enabled": false,
|
||||||
"Description": "Overwrite the Rights value on your account",
|
|
||||||
"Prefix": "rights"
|
"Prefix": "rights"
|
||||||
}, {
|
}, {
|
||||||
"Name": "Raviente",
|
"Name": "Raviente",
|
||||||
"Enabled": true,
|
"Enabled": true,
|
||||||
"Description": "Various Raviente siege commands",
|
|
||||||
"Prefix": "ravi"
|
"Prefix": "ravi"
|
||||||
}, {
|
}, {
|
||||||
"Name": "Teleport",
|
"Name": "Teleport",
|
||||||
"Enabled": false,
|
"Enabled": false,
|
||||||
"Description": "Teleport to specified coordinates",
|
|
||||||
"Prefix": "tele"
|
"Prefix": "tele"
|
||||||
}, {
|
}, {
|
||||||
"Name": "Reload",
|
"Name": "Reload",
|
||||||
"Enabled": true,
|
"Enabled": true,
|
||||||
"Description": "Reload all players in your Land",
|
|
||||||
"Prefix": "reload"
|
"Prefix": "reload"
|
||||||
}, {
|
}, {
|
||||||
"Name": "KeyQuest",
|
"Name": "KeyQuest",
|
||||||
"Enabled": false,
|
"Enabled": false,
|
||||||
"Description": "Overwrite your HR Key Quest progress",
|
|
||||||
"Prefix": "kqf"
|
"Prefix": "kqf"
|
||||||
}, {
|
}, {
|
||||||
"Name": "Course",
|
"Name": "Course",
|
||||||
"Enabled": true,
|
"Enabled": true,
|
||||||
"Description": "Toggle Courses on your account",
|
|
||||||
"Prefix": "course"
|
"Prefix": "course"
|
||||||
}, {
|
}, {
|
||||||
"Name": "PSN",
|
"Name": "PSN",
|
||||||
"Enabled": true,
|
"Enabled": true,
|
||||||
"Description": "Link a PlayStation Network ID to your account",
|
|
||||||
"Prefix": "psn"
|
"Prefix": "psn"
|
||||||
}, {
|
|
||||||
"Name": "Discord",
|
|
||||||
"Enabled": true,
|
|
||||||
"Description": "Generate a token to link your Discord account",
|
|
||||||
"Prefix": "discord"
|
|
||||||
}, {
|
|
||||||
"Name": "Ban",
|
|
||||||
"Enabled": false,
|
|
||||||
"Description": "Ban/Temp Ban a user",
|
|
||||||
"Prefix": "ban"
|
|
||||||
}, {
|
|
||||||
"Name": "Timer",
|
|
||||||
"Enabled": true,
|
|
||||||
"Description": "Toggle the Quest timer",
|
|
||||||
"Prefix": "timer"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"Courses": [
|
"Courses": [
|
||||||
@@ -195,13 +128,9 @@
|
|||||||
"Enabled": true,
|
"Enabled": true,
|
||||||
"Port": 53312
|
"Port": 53312
|
||||||
},
|
},
|
||||||
"API": {
|
"SignV2": {
|
||||||
"Enabled": true,
|
"Enabled": false,
|
||||||
"Port": 8080,
|
"Port": 8080
|
||||||
"PatchServer": "",
|
|
||||||
"Banners": [],
|
|
||||||
"Messages": [],
|
|
||||||
"Links": []
|
|
||||||
},
|
},
|
||||||
"Channel": {
|
"Channel": {
|
||||||
"Enabled": true
|
"Enabled": true
|
||||||
|
|||||||
178
config/config.go
178
config/config.go
@@ -58,7 +58,7 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var versionStrings = []string{"S1.0", "S1.5", "S2.0", "S2.5", "S3.0", "S3.5", "S4.0", "S5.0", "S5.5", "S6.0", "S7.0",
|
var versionStrings = []string{"S1.0", "S1.5", "S2.0", "S2.5", "S3.0", "S3.5", "S4.0", "S5.0", "S5.5", "S6.0", "S7.0",
|
||||||
"S8.0", "S8.5", "S9.0", "S10", "FW.1", "FW.2", "FW.3", "FW.4", "FW.5", "G1", "G2", "G3", "G3.1", "G3.2", "GG", "G5",
|
"S8.0", "S8.5", "S9", "S10", "FW.1", "FW.2", "FW.3", "FW.4", "FW.5", "G1", "G2", "G3", "G3.1", "G3.2", "GG", "G5",
|
||||||
"G5.1", "G5.2", "G6", "G6.1", "G7", "G8", "G8.1", "G9", "G9.1", "G10", "G10.1", "Z1", "Z2", "ZZ"}
|
"G5.1", "G5.2", "G6", "G6.1", "G7", "G8", "G8.1", "G9", "G9.1", "G10", "G10.1", "Z1", "Z2", "ZZ"}
|
||||||
|
|
||||||
func (m Mode) String() string {
|
func (m Mode) String() string {
|
||||||
@@ -75,119 +75,78 @@ type Config struct {
|
|||||||
LoginNotices []string // MHFML string of the login notices displayed
|
LoginNotices []string // MHFML string of the login notices displayed
|
||||||
PatchServerManifest string // Manifest patch server override
|
PatchServerManifest string // Manifest patch server override
|
||||||
PatchServerFile string // File patch server override
|
PatchServerFile string // File patch server override
|
||||||
|
ScreenshotAPIURL string // Destination for screenshots uploaded to BBS
|
||||||
DeleteOnSaveCorruption bool // Attempts to save corrupted data will flag the save for deletion
|
DeleteOnSaveCorruption bool // Attempts to save corrupted data will flag the save for deletion
|
||||||
ClientMode string
|
ClientMode string
|
||||||
RealClientMode Mode
|
RealClientMode Mode
|
||||||
QuestCacheExpiry int // Number of seconds to keep quest data cached
|
DevMode bool
|
||||||
CommandPrefix string // The prefix for commands
|
|
||||||
AutoCreateAccount bool // Automatically create accounts if they don't exist
|
|
||||||
DefaultCourses []uint16
|
|
||||||
EarthStatus int32
|
|
||||||
EarthID int32
|
|
||||||
EarthMonsters []int32
|
|
||||||
SaveDumps SaveDumpOptions
|
|
||||||
Screenshots ScreenshotsOptions
|
|
||||||
|
|
||||||
DebugOptions DebugOptions
|
DevModeOptions DevModeOptions
|
||||||
GameplayOptions GameplayOptions
|
GameplayOptions GameplayOptions
|
||||||
Discord Discord
|
Discord Discord
|
||||||
Commands []Command
|
Commands []Command
|
||||||
Courses []Course
|
Courses []Course
|
||||||
Database Database
|
Database Database
|
||||||
Sign Sign
|
Sign Sign
|
||||||
API API
|
SignV2 SignV2
|
||||||
Channel Channel
|
Channel Channel
|
||||||
Entrance Entrance
|
Entrance Entrance
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DevModeOptions holds various debug/temporary options for use while developing Erupe.
|
||||||
|
type DevModeOptions struct {
|
||||||
|
AutoCreateAccount bool // Automatically create accounts if they don't exist
|
||||||
|
CleanDB bool // Automatically wipes the DB on server reset.
|
||||||
|
MaxLauncherHR bool // Sets the HR returned in the launcher to HR7 so that you can join non-beginner worlds.
|
||||||
|
LogInboundMessages bool // Log all messages sent to the server
|
||||||
|
LogOutboundMessages bool // Log all messages sent to the clients
|
||||||
|
MaxHexdumpLength int // Maximum number of bytes printed when logs are enabled
|
||||||
|
DivaEvent int // Diva Defense event status
|
||||||
|
FestaEvent int // Hunter's Festa event status
|
||||||
|
TournamentEvent int // VS Tournament event status
|
||||||
|
MezFesEvent bool // MezFes status
|
||||||
|
MezFesAlt bool // Swaps out Volpakkun for Tokotoko
|
||||||
|
DisableTokenCheck bool // Disables checking login token exists in the DB (security risk!)
|
||||||
|
QuestDebugTools bool // Enable various quest debug logs
|
||||||
|
EarthStatusOverride int32
|
||||||
|
EarthIDOverride int32
|
||||||
|
EarthMonsterOverride int32
|
||||||
|
SaveDumps SaveDumpOptions
|
||||||
|
}
|
||||||
|
|
||||||
type SaveDumpOptions struct {
|
type SaveDumpOptions struct {
|
||||||
Enabled bool
|
Enabled bool
|
||||||
RawEnabled bool
|
OutputDir string
|
||||||
OutputDir string
|
|
||||||
}
|
|
||||||
|
|
||||||
type ScreenshotsOptions struct {
|
|
||||||
Enabled bool
|
|
||||||
Host string // Destination for screenshots uploaded to BBS
|
|
||||||
Port uint32 // Port for screenshots API
|
|
||||||
OutputDir string
|
|
||||||
UploadQuality int //Determines the upload quality to the server
|
|
||||||
}
|
|
||||||
|
|
||||||
// DebugOptions holds various debug/temporary options for use while developing Erupe.
|
|
||||||
type DebugOptions struct {
|
|
||||||
CleanDB bool // Automatically wipes the DB on server reset.
|
|
||||||
MaxLauncherHR bool // Sets the HR returned in the launcher to HR7 so that you can join non-beginner worlds.
|
|
||||||
LogInboundMessages bool // Log all messages sent to the server
|
|
||||||
LogOutboundMessages bool // Log all messages sent to the clients
|
|
||||||
LogMessageData bool // Log all bytes transferred as a hexdump
|
|
||||||
MaxHexdumpLength int // Maximum number of bytes printed when logs are enabled
|
|
||||||
DivaOverride int // Diva Defense event status
|
|
||||||
FestaOverride int // Hunter's Festa event status
|
|
||||||
TournamentOverride int // VS Tournament event status
|
|
||||||
DisableTokenCheck bool // Disables checking login token exists in the DB (security risk!)
|
|
||||||
QuestTools bool // Enable various quest debug logs
|
|
||||||
AutoQuestBackport bool // Automatically backport quest files
|
|
||||||
ProxyPort uint16 // Forces the game to connect to a channel server proxy
|
|
||||||
CapLink CapLinkOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
type CapLinkOptions struct {
|
|
||||||
Values []uint16
|
|
||||||
Key string
|
|
||||||
Host string
|
|
||||||
Port int
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GameplayOptions has various gameplay modifiers
|
// GameplayOptions has various gameplay modifiers
|
||||||
type GameplayOptions struct {
|
type GameplayOptions struct {
|
||||||
MinFeatureWeapons int // Minimum number of Active Feature weapons to generate daily
|
FeaturedWeapons int // Number of Active Feature weapons to generate daily
|
||||||
MaxFeatureWeapons int // Maximum number of Active Feature weapons to generate daily
|
MaximumNP int // Maximum number of NP held by a player
|
||||||
MaximumNP int // Maximum number of NP held by a player
|
MaximumRP uint16 // Maximum number of RP held by a player
|
||||||
MaximumRP uint16 // Maximum number of RP held by a player
|
MaximumFP uint32 // Maximum number of FP held by a player
|
||||||
MaximumFP uint32 // Maximum number of FP held by a player
|
DisableLoginBoost bool // Disables the Login Boost system
|
||||||
TreasureHuntExpiry uint32 // Seconds until a Clan Treasure Hunt will expire
|
DisableBoostTime bool // Disables the daily NetCafe Boost Time
|
||||||
TreasureHuntPartnyaCooldown uint32 // Seconds until a Partnya can be assigned to another Clan Treasure Hunt
|
BoostTimeDuration int // The number of minutes NetCafe Boost Time lasts for
|
||||||
DisableLoginBoost bool // Disables the Login Boost system
|
GuildMealDuration int // The number of minutes a Guild Meal can be activated for after cooking
|
||||||
DisableBoostTime bool // Disables the daily NetCafe Boost Time
|
BonusQuestAllowance uint32 // Number of Bonus Point Quests to allow daily
|
||||||
BoostTimeDuration int // Second that the NetCafe Boost Time lasts
|
DailyQuestAllowance uint32 // Number of Daily Quests to allow daily
|
||||||
ClanMealDuration int // Second that a Clan Meal can be activated for after cooking
|
MezfesSoloTickets uint32 // Number of solo tickets given weekly
|
||||||
ClanMemberLimits [][]uint8 // Array of maximum Clan Members -> [Rank, Members]
|
MezfesGroupTickets uint32 // Number of group tickets given weekly
|
||||||
BonusQuestAllowance uint32 // Number of Bonus Point Quests to allow daily
|
LowLatencyRaviente bool // Toggles low latency mode for Raviente, can be network intensive
|
||||||
DailyQuestAllowance uint32 // Number of Daily Quests to allow daily
|
|
||||||
LowLatencyRaviente bool // Toggles low latency mode for Raviente, can be network intensive
|
|
||||||
RegularRavienteMaxPlayers uint8
|
RegularRavienteMaxPlayers uint8
|
||||||
ViolentRavienteMaxPlayers uint8
|
ViolentRavienteMaxPlayers uint8
|
||||||
BerserkRavienteMaxPlayers uint8
|
BerserkRavienteMaxPlayers uint8
|
||||||
ExtremeRavienteMaxPlayers uint8
|
ExtremeRavienteMaxPlayers uint8
|
||||||
SmallBerserkRavienteMaxPlayers uint8
|
SmallBerserkRavienteMaxPlayers uint8
|
||||||
GUrgentRate float32 // Adjusts the rate of G Urgent quests spawning
|
GUrgentRate uint16 // Adjusts the rate of G Urgent quests spawning
|
||||||
GCPMultiplier float32 // Adjusts the multiplier of GCP rewarded for quest completion
|
GCPMultiplier float32 // Adjusts the multiplier of GCP rewarded for quest completion
|
||||||
HRPMultiplier float32 // Adjusts the multiplier of Hunter Rank Points rewarded for quest completion
|
|
||||||
HRPMultiplierNC float32 // Adjusts the multiplier of Hunter Rank Points rewarded for quest completion in a NetCafe
|
|
||||||
SRPMultiplier float32 // Adjusts the multiplier of Skill Rank Points rewarded for quest completion
|
|
||||||
SRPMultiplierNC float32 // Adjusts the multiplier of Skill Rank Points rewarded for quest completion in a NetCafe
|
|
||||||
GRPMultiplier float32 // Adjusts the multiplier of G Rank Points rewarded for quest completion
|
GRPMultiplier float32 // Adjusts the multiplier of G Rank Points rewarded for quest completion
|
||||||
GRPMultiplierNC float32 // Adjusts the multiplier of G Rank Points rewarded for quest completion in a NetCafe
|
|
||||||
GSRPMultiplier float32 // Adjusts the multiplier of G Skill Rank Points rewarded for quest completion
|
GSRPMultiplier float32 // Adjusts the multiplier of G Skill Rank Points rewarded for quest completion
|
||||||
GSRPMultiplierNC float32 // Adjusts the multiplier of G Skill Rank Points rewarded for quest completion in a NetCafe
|
|
||||||
ZennyMultiplier float32 // Adjusts the multiplier of Zenny rewarded for quest completion
|
|
||||||
ZennyMultiplierNC float32 // Adjusts the multiplier of Zenny rewarded for quest completion in a NetCafe
|
|
||||||
GZennyMultiplier float32 // Adjusts the multiplier of G Zenny rewarded for quest completion
|
GZennyMultiplier float32 // Adjusts the multiplier of G Zenny rewarded for quest completion
|
||||||
GZennyMultiplierNC float32 // Adjusts the multiplier of G Zenny rewarded for quest completion in a NetCafe
|
|
||||||
MaterialMultiplier float32 // Adjusts the multiplier of Monster Materials rewarded for quest completion
|
MaterialMultiplier float32 // Adjusts the multiplier of Monster Materials rewarded for quest completion
|
||||||
MaterialMultiplierNC float32 // Adjusts the multiplier of Monster Materials rewarded for quest completion in a NetCafe
|
|
||||||
GMaterialMultiplier float32 // Adjusts the multiplier of G Rank Monster Materials rewarded for quest completion
|
|
||||||
GMaterialMultiplierNC float32 // Adjusts the multiplier of G Rank Monster Materials rewarded for quest completion in a NetCafe
|
|
||||||
ExtraCarves uint16 // Grant n extra chances to carve ALL carcasses
|
ExtraCarves uint16 // Grant n extra chances to carve ALL carcasses
|
||||||
ExtraCarvesNC uint16 // Grant n extra chances to carve ALL carcasses in a NetCafe
|
|
||||||
GExtraCarves uint16 // Grant n extra chances to carve ALL G Rank carcasses
|
|
||||||
GExtraCarvesNC uint16 // Grant n extra chances to carve ALL G Rank carcasses in a NetCafe
|
|
||||||
DisableHunterNavi bool // Disables the Hunter Navi
|
DisableHunterNavi bool // Disables the Hunter Navi
|
||||||
MezFesSoloTickets uint32 // Number of solo tickets given weekly
|
|
||||||
MezFesGroupTickets uint32 // Number of group tickets given weekly
|
|
||||||
MezFesDuration int // Seconds that MezFes will last for weekly (from 12AM Mon backwards)
|
|
||||||
MezFesSwitchMinigame bool // Swaps out Volpakkun Together for Tokotoko Partnya
|
|
||||||
EnableKaijiEvent bool // Enables the Kaiji event in the Rasta Bar
|
EnableKaijiEvent bool // Enables the Kaiji event in the Rasta Bar
|
||||||
EnableHiganjimaEvent bool // Enables the Higanjima event in the Rasta Bar
|
EnableHiganjimaEvent bool // Enables the Higanjima event in the Rasta Bar
|
||||||
EnableNierEvent bool // Enables the Nier event in the Rasta Bar
|
EnableNierEvent bool // Enables the Nier event in the Rasta Bar
|
||||||
@@ -197,23 +156,16 @@ type GameplayOptions struct {
|
|||||||
|
|
||||||
// Discord holds the discord integration config.
|
// Discord holds the discord integration config.
|
||||||
type Discord struct {
|
type Discord struct {
|
||||||
Enabled bool
|
Enabled bool
|
||||||
BotToken string
|
BotToken string
|
||||||
RelayChannel DiscordRelay
|
RealtimeChannelID string
|
||||||
}
|
|
||||||
|
|
||||||
type DiscordRelay struct {
|
|
||||||
Enabled bool
|
|
||||||
MaxMessageLength int
|
|
||||||
RelayChannelID string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Command is a channelserver chat command
|
// Command is a channelserver chat command
|
||||||
type Command struct {
|
type Command struct {
|
||||||
Name string
|
Name string
|
||||||
Enabled bool
|
Enabled bool
|
||||||
Description string
|
Prefix string
|
||||||
Prefix string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Course represents a course within MHF
|
// Course represents a course within MHF
|
||||||
@@ -237,32 +189,10 @@ type Sign struct {
|
|||||||
Port int
|
Port int
|
||||||
}
|
}
|
||||||
|
|
||||||
// API holds server config
|
// SignV2 holds the new sign server config
|
||||||
type API struct {
|
type SignV2 struct {
|
||||||
Enabled bool
|
Enabled bool
|
||||||
Port int
|
Port int
|
||||||
PatchServer string
|
|
||||||
Banners []APISignBanner
|
|
||||||
Messages []APISignMessage
|
|
||||||
Links []APISignLink
|
|
||||||
}
|
|
||||||
|
|
||||||
type APISignBanner struct {
|
|
||||||
Src string `json:"src"` // Displayed image URL
|
|
||||||
Link string `json:"link"` // Link accessed on click
|
|
||||||
}
|
|
||||||
|
|
||||||
type APISignMessage struct {
|
|
||||||
Message string `json:"message"` // Displayed message
|
|
||||||
Date int64 `json:"date"` // Displayed date
|
|
||||||
Kind int `json:"kind"` // 0 for 'Default', 1 for 'New'
|
|
||||||
Link string `json:"link"` // Link accessed on click
|
|
||||||
}
|
|
||||||
|
|
||||||
type APISignLink struct {
|
|
||||||
Name string `json:"name"` // Displayed name
|
|
||||||
Icon string `json:"icon"` // Displayed icon. It will be cast as a monochrome color as long as it is transparent.
|
|
||||||
Link string `json:"link"` // Link accessed on click
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Channel struct {
|
type Channel struct {
|
||||||
@@ -361,10 +291,6 @@ func LoadConfig() (*Config, error) {
|
|||||||
c.RealClientMode = ZZ
|
c.RealClientMode = ZZ
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.GameplayOptions.MinFeatureWeapons > c.GameplayOptions.MaxFeatureWeapons {
|
|
||||||
c.GameplayOptions.MinFeatureWeapons = c.GameplayOptions.MaxFeatureWeapons
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,66 +0,0 @@
|
|||||||
# Docker for erupe
|
|
||||||
|
|
||||||
## Building the container
|
|
||||||
Run the following from the route of the soruce folder. In this example we give it the tag of dev to seperate it from any other container verions.
|
|
||||||
```bash
|
|
||||||
docker build . -t erupe:dev
|
|
||||||
```
|
|
||||||
## Running the container in isolation
|
|
||||||
This is just running the container. You can do volume mounts into the container for the `config.json` to tell it to communicate to a database. You will need to do this also for other folders such as `bin` and `savedata`
|
|
||||||
```bash
|
|
||||||
docker run erupe:dev
|
|
||||||
```
|
|
||||||
|
|
||||||
## Docker compose
|
|
||||||
Docker compose allows you to run multiple containers at once. The docker compose in this folder has 3 things set up.
|
|
||||||
- postgres
|
|
||||||
- pg admin (Admin interface to make db changes)
|
|
||||||
- erupe
|
|
||||||
|
|
||||||
We automatically populate the database to the latest version on start. If you you are updating you will need to apply the new schemas manually.
|
|
||||||
|
|
||||||
Before we get started you should make sure the database info matches whats in the docker compose file for the environment variables `POSTGRES_PASSWORD`,`POSTGRES_USER` and `POSTGRES_DB`. You can set the host to be the service name `db`.
|
|
||||||
|
|
||||||
Here is a example of what you would put in the config.json if you was to leave the defaults. It is strongly recommended to change the password.
|
|
||||||
```txt
|
|
||||||
"Database": {
|
|
||||||
"Host": "db",
|
|
||||||
"Port": 5432,
|
|
||||||
"User": "postgres",
|
|
||||||
"Password": "password",
|
|
||||||
"Database": "erupe"
|
|
||||||
},
|
|
||||||
```
|
|
||||||
|
|
||||||
Place this file within ./docker/config.json
|
|
||||||
|
|
||||||
You will need to do the same for your bins place these in ./docker/bin
|
|
||||||
|
|
||||||
# Setting up the web hosted materials
|
|
||||||
Clone the Severs repo into ./docker/Severs
|
|
||||||
|
|
||||||
Make sure your hosts are pointing to where this is hosted
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Turning off the server safely
|
|
||||||
```bash
|
|
||||||
docker-compose stop
|
|
||||||
```
|
|
||||||
|
|
||||||
## Turning off the server destructive
|
|
||||||
```bash
|
|
||||||
docker-compose down
|
|
||||||
```
|
|
||||||
Make sure if you want to delete your data you delete the folders that persisted
|
|
||||||
- ./docker/savedata
|
|
||||||
- ./docker/db-data
|
|
||||||
## Turning on the server again
|
|
||||||
This boots the db pgadmin and the server in a detached state
|
|
||||||
```bash
|
|
||||||
docker-compose up -d
|
|
||||||
```
|
|
||||||
if you want all the logs and you want it to be in an attached state
|
|
||||||
```bash
|
|
||||||
docker-compose up
|
|
||||||
```
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
version: "3.9"
|
|
||||||
# 1. docker-compose up db pgadmin
|
|
||||||
# 2. Use pgadmin to restore db and also apply patch-schema
|
|
||||||
# 3. Configure the config.json example. in docker you can point to the service name for the database i.e db
|
|
||||||
# 4. In seperate terminal docker-compose up server
|
|
||||||
# 5. If all went well happy hunting!
|
|
||||||
services:
|
|
||||||
db:
|
|
||||||
image: postgres
|
|
||||||
environment:
|
|
||||||
# (Make sure these match config.json)
|
|
||||||
- POSTGRES_USER=postgres
|
|
||||||
- POSTGRES_PASSWORD=password
|
|
||||||
- POSTGRES_DB=erupe
|
|
||||||
ports:
|
|
||||||
- "5432:5432"
|
|
||||||
volumes:
|
|
||||||
- ./db-data/:/var/lib/postgresql/data/
|
|
||||||
- ../schemas/:/schemas/
|
|
||||||
- ./init/setup.sh:/docker-entrypoint-initdb.d/setup.sh
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
|
||||||
interval: 5s
|
|
||||||
timeout: 5s
|
|
||||||
retries: 5
|
|
||||||
pgadmin:
|
|
||||||
image: dpage/pgadmin4
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
PGADMIN_DEFAULT_EMAIL: user@pgadmin.com
|
|
||||||
PGADMIN_DEFAULT_PASSWORD: password
|
|
||||||
ports:
|
|
||||||
- "5050:80"
|
|
||||||
depends_on:
|
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
server:
|
|
||||||
depends_on:
|
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
# If using prebuilt container change paths and config
|
|
||||||
build:
|
|
||||||
context: ../
|
|
||||||
volumes:
|
|
||||||
- ../config.json:/app/erupe/config.json
|
|
||||||
- ../bin:/app/erupe/bin
|
|
||||||
- ./savedata:/app/erupe/savedata
|
|
||||||
ports:
|
|
||||||
# (Make sure these match config.json)
|
|
||||||
- "53312:53312" #Sign V1
|
|
||||||
- "8080:8080" #Sign V2
|
|
||||||
- "53310:53310" #Entrance
|
|
||||||
# Channels
|
|
||||||
- "54001:54001"
|
|
||||||
- "54002:54002"
|
|
||||||
- "54003:54003"
|
|
||||||
- "54004:54004"
|
|
||||||
- "54005:54005"
|
|
||||||
- "54006:54006"
|
|
||||||
- "54007:54007"
|
|
||||||
- "54008:54008"
|
|
||||||
web:
|
|
||||||
image: httpd:latest
|
|
||||||
container_name: my-apache-app
|
|
||||||
ports:
|
|
||||||
- '80:80'
|
|
||||||
volumes:
|
|
||||||
- ./Servers:/usr/local/apache2/htdocs
|
|
||||||
depends_on:
|
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
echo "INIT!"
|
|
||||||
pg_restore --username="$POSTGRES_USER" --dbname="$POSTGRES_DB" --verbose /schemas/init.sql
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
echo "Updating!"
|
|
||||||
|
|
||||||
for file in /schemas/update-schema/*
|
|
||||||
do
|
|
||||||
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -1 -f $file
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
echo "Patching!"
|
|
||||||
|
|
||||||
for file in /schemas/patch-schema/*
|
|
||||||
do
|
|
||||||
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -1 -f $file
|
|
||||||
done
|
|
||||||
31
go.mod
31
go.mod
@@ -4,35 +4,32 @@ go 1.21
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/bwmarrin/discordgo v0.27.1
|
github.com/bwmarrin/discordgo v0.27.1
|
||||||
github.com/gorilla/handlers v1.5.2
|
github.com/gorilla/handlers v1.5.1
|
||||||
github.com/gorilla/mux v1.8.1
|
github.com/gorilla/mux v1.8.0
|
||||||
github.com/jmoiron/sqlx v1.3.5
|
github.com/jmoiron/sqlx v1.3.5
|
||||||
github.com/lib/pq v1.10.9
|
github.com/lib/pq v1.10.9
|
||||||
github.com/spf13/viper v1.17.0
|
github.com/spf13/viper v1.16.0
|
||||||
go.uber.org/zap v1.26.0
|
go.uber.org/zap v1.25.0
|
||||||
golang.org/x/crypto v0.17.0
|
golang.org/x/crypto v0.12.0
|
||||||
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa
|
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63
|
||||||
golang.org/x/text v0.14.0
|
golang.org/x/text v0.12.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
github.com/felixge/httpsnoop v1.0.3 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
github.com/fsnotify/fsnotify v1.6.0 // indirect
|
||||||
github.com/gorilla/websocket v1.5.1 // indirect
|
github.com/gorilla/websocket v1.5.0 // indirect
|
||||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||||
github.com/magiconair/properties v1.8.7 // indirect
|
github.com/magiconair/properties v1.8.7 // indirect
|
||||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||||
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
|
github.com/pelletier/go-toml/v2 v2.0.9 // indirect
|
||||||
github.com/sagikazarmark/locafero v0.3.0 // indirect
|
github.com/spf13/afero v1.9.5 // indirect
|
||||||
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
|
||||||
github.com/sourcegraph/conc v0.3.0 // indirect
|
|
||||||
github.com/spf13/afero v1.10.0 // indirect
|
|
||||||
github.com/spf13/cast v1.5.1 // indirect
|
github.com/spf13/cast v1.5.1 // indirect
|
||||||
|
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
github.com/subosito/gotenv v1.6.0 // indirect
|
github.com/subosito/gotenv v1.6.0 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
golang.org/x/net v0.18.0 // indirect
|
golang.org/x/sys v0.11.0 // indirect
|
||||||
golang.org/x/sys v0.15.0 // indirect
|
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
76
go.sum
76
go.sum
@@ -38,6 +38,8 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f
|
|||||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||||
|
github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
|
||||||
|
github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||||
github.com/bwmarrin/discordgo v0.27.1 h1:ib9AIc/dom1E/fSIulrBwnez0CToJE113ZGt4HoliGY=
|
github.com/bwmarrin/discordgo v0.27.1 h1:ib9AIc/dom1E/fSIulrBwnez0CToJE113ZGt4HoliGY=
|
||||||
github.com/bwmarrin/discordgo v0.27.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY=
|
github.com/bwmarrin/discordgo v0.27.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
@@ -49,21 +51,21 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX
|
|||||||
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
|
||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
|
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
|
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||||
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
|
||||||
|
github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||||
github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
|
github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
|
||||||
github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
|
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
|
||||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
|
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
|
||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
@@ -125,13 +127,13 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
|
|||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
|
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
|
||||||
github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE=
|
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
|
||||||
github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w=
|
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
|
||||||
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
|
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
|
||||||
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
|
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
||||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
|
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
|
||||||
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
|
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||||
@@ -160,34 +162,30 @@ github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRU
|
|||||||
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||||
github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
|
github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0=
|
||||||
github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
|
github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
|
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
|
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
|
||||||
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
||||||
github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ=
|
github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM=
|
||||||
github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U=
|
github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ=
|
||||||
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
|
|
||||||
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
|
|
||||||
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
|
|
||||||
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
|
|
||||||
github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY=
|
|
||||||
github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ=
|
|
||||||
github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA=
|
github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA=
|
||||||
github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48=
|
github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48=
|
||||||
|
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
|
||||||
|
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
|
||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
github.com/spf13/viper v1.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI=
|
github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc=
|
||||||
github.com/spf13/viper v1.17.0/go.mod h1:BmMMMLQXSbcHK6KAOiFLz0l5JHrU89OdIRHvsk0+yVI=
|
github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||||
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
@@ -211,8 +209,8 @@ go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
|
|||||||
go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
|
go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
|
||||||
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||||
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
|
go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c=
|
||||||
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
|
go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
@@ -220,8 +218,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
|
|||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
|
golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
|
||||||
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
|
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
@@ -232,8 +230,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
|
|||||||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||||
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ=
|
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ=
|
||||||
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE=
|
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8=
|
||||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
@@ -289,8 +287,6 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v
|
|||||||
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg=
|
|
||||||
golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
@@ -345,8 +341,9 @@ golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
|
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
|
||||||
|
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
@@ -356,8 +353,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|||||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
|
||||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
@@ -501,9 +498,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
|
|||||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
||||||
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
|
|||||||
42
main.go
42
main.go
@@ -10,11 +10,11 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"erupe-ce/server/api"
|
|
||||||
"erupe-ce/server/channelserver"
|
"erupe-ce/server/channelserver"
|
||||||
"erupe-ce/server/discordbot"
|
"erupe-ce/server/discordbot"
|
||||||
"erupe-ce/server/entranceserver"
|
"erupe-ce/server/entranceserver"
|
||||||
"erupe-ce/server/signserver"
|
"erupe-ce/server/signserver"
|
||||||
|
"erupe-ce/server/signv2server"
|
||||||
|
|
||||||
"github.com/jmoiron/sqlx"
|
"github.com/jmoiron/sqlx"
|
||||||
_ "github.com/lib/pq"
|
_ "github.com/lib/pq"
|
||||||
@@ -26,6 +26,7 @@ func cleanDB(db *sqlx.DB) {
|
|||||||
_ = db.MustExec("DELETE FROM guild_characters")
|
_ = db.MustExec("DELETE FROM guild_characters")
|
||||||
_ = db.MustExec("DELETE FROM guilds")
|
_ = db.MustExec("DELETE FROM guilds")
|
||||||
_ = db.MustExec("DELETE FROM characters")
|
_ = db.MustExec("DELETE FROM characters")
|
||||||
|
_ = db.MustExec("DELETE FROM sign_sessions")
|
||||||
_ = db.MustExec("DELETE FROM users")
|
_ = db.MustExec("DELETE FROM users")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,7 +46,11 @@ func main() {
|
|||||||
|
|
||||||
var zapLogger *zap.Logger
|
var zapLogger *zap.Logger
|
||||||
config := _config.ErupeConfig
|
config := _config.ErupeConfig
|
||||||
zapLogger, _ = zap.NewDevelopment()
|
if config.DevMode {
|
||||||
|
zapLogger, _ = zap.NewDevelopment()
|
||||||
|
} else {
|
||||||
|
zapLogger, _ = zap.NewProduction()
|
||||||
|
}
|
||||||
|
|
||||||
defer zapLogger.Sync()
|
defer zapLogger.Sync()
|
||||||
logger := zapLogger.Named("main")
|
logger := zapLogger.Named("main")
|
||||||
@@ -91,12 +96,6 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
discordBot = bot
|
discordBot = bot
|
||||||
|
|
||||||
_, err = discordBot.Session.ApplicationCommandBulkOverwrite(discordBot.Session.State.User.ID, "", discordbot.Commands)
|
|
||||||
if err != nil {
|
|
||||||
preventClose(fmt.Sprintf("Discord: Failed to start, %s", err.Error()))
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.Info("Discord: Started successfully")
|
logger.Info("Discord: Started successfully")
|
||||||
} else {
|
} else {
|
||||||
logger.Info("Discord: Disabled")
|
logger.Info("Discord: Disabled")
|
||||||
@@ -125,14 +124,11 @@ func main() {
|
|||||||
logger.Info("Database: Started successfully")
|
logger.Info("Database: Started successfully")
|
||||||
|
|
||||||
// Clear stale data
|
// Clear stale data
|
||||||
if config.DebugOptions.ProxyPort == 0 {
|
_ = db.MustExec("DELETE FROM sign_sessions")
|
||||||
_ = db.MustExec("DELETE FROM sign_sessions")
|
|
||||||
}
|
|
||||||
_ = db.MustExec("DELETE FROM servers")
|
_ = db.MustExec("DELETE FROM servers")
|
||||||
_ = db.MustExec(`UPDATE guild_characters SET treasure_hunt=NULL`)
|
|
||||||
|
|
||||||
// Clean the DB if the option is on.
|
// Clean the DB if the option is on.
|
||||||
if config.DebugOptions.CleanDB {
|
if config.DevMode && config.DevModeOptions.CleanDB {
|
||||||
logger.Info("Database: Started clearing...")
|
logger.Info("Database: Started clearing...")
|
||||||
cleanDB(db)
|
cleanDB(db)
|
||||||
logger.Info("Database: Finished clearing")
|
logger.Info("Database: Finished clearing")
|
||||||
@@ -181,21 +177,21 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// New Sign server
|
// New Sign server
|
||||||
var ApiServer *api.APIServer
|
var newSignServer *signv2server.Server
|
||||||
if config.API.Enabled {
|
if config.SignV2.Enabled {
|
||||||
ApiServer = api.NewAPIServer(
|
newSignServer = signv2server.NewServer(
|
||||||
&api.Config{
|
&signv2server.Config{
|
||||||
Logger: logger.Named("sign"),
|
Logger: logger.Named("sign"),
|
||||||
ErupeConfig: _config.ErupeConfig,
|
ErupeConfig: _config.ErupeConfig,
|
||||||
DB: db,
|
DB: db,
|
||||||
})
|
})
|
||||||
err = ApiServer.Start()
|
err = newSignServer.Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
preventClose(fmt.Sprintf("API: Failed to start, %s", err.Error()))
|
preventClose(fmt.Sprintf("SignV2: Failed to start, %s", err.Error()))
|
||||||
}
|
}
|
||||||
logger.Info("API: Started successfully")
|
logger.Info("SignV2: Started successfully")
|
||||||
} else {
|
} else {
|
||||||
logger.Info("API: Disabled")
|
logger.Info("SignV2: Disabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
var channels []*channelserver.Server
|
var channels []*channelserver.Server
|
||||||
@@ -273,8 +269,8 @@ func main() {
|
|||||||
signServer.Shutdown()
|
signServer.Shutdown()
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.API.Enabled {
|
if config.SignV2.Enabled {
|
||||||
ApiServer.Shutdown()
|
newSignServer.Shutdown()
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.Entrance.Enabled {
|
if config.Entrance.Enabled {
|
||||||
|
|||||||
10
migrations/000001_initial_db.down.sql
Normal file
10
migrations/000001_initial_db.down.sql
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS sign_sessions;
|
||||||
|
DROP TABLE IF EXISTS characters;
|
||||||
|
DROP TABLE IF EXISTS users;
|
||||||
|
|
||||||
|
DROP DOMAIN IF EXISTS uint8;
|
||||||
|
DROP DOMAIN IF EXISTS uint16;
|
||||||
|
|
||||||
|
END;
|
||||||
36
migrations/000001_initial_db.up.sql
Normal file
36
migrations/000001_initial_db.up.sql
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
CREATE DOMAIN uint8 AS smallint
|
||||||
|
CHECK(VALUE >= 0 AND VALUE <= 255);
|
||||||
|
|
||||||
|
CREATE DOMAIN uint16 AS integer
|
||||||
|
CHECK(VALUE >= 0 AND VALUE <= 65536);
|
||||||
|
|
||||||
|
CREATE TABLE users (
|
||||||
|
id serial NOT NULL PRIMARY KEY,
|
||||||
|
username text UNIQUE NOT NULL,
|
||||||
|
password text NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE characters (
|
||||||
|
id serial NOT NULL PRIMARY KEY,
|
||||||
|
user_id bigint REFERENCES users(id),
|
||||||
|
is_female boolean,
|
||||||
|
is_new_character boolean,
|
||||||
|
small_gr_level uint8,
|
||||||
|
gr_override_mode boolean,
|
||||||
|
name varchar(15),
|
||||||
|
unk_desc_string varchar(31),
|
||||||
|
gr_override_level uint16,
|
||||||
|
gr_override_unk0 uint8,
|
||||||
|
gr_override_unk1 uint8
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE sign_sessions (
|
||||||
|
id serial NOT NULL PRIMARY KEY,
|
||||||
|
user_id bigint REFERENCES users(id),
|
||||||
|
auth_token_num bigint,
|
||||||
|
auth_token_str text
|
||||||
|
);
|
||||||
|
|
||||||
|
END;
|
||||||
8
migrations/000002_alter_characters.down.sql
Normal file
8
migrations/000002_alter_characters.down.sql
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
ALTER TABLE characters
|
||||||
|
DROP COLUMN exp,
|
||||||
|
DROP COLUMN weapon,
|
||||||
|
DROP COLUMN last_login;
|
||||||
|
|
||||||
|
END;
|
||||||
8
migrations/000002_alter_characters.up.sql
Normal file
8
migrations/000002_alter_characters.up.sql
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
ALTER TABLE characters
|
||||||
|
ADD COLUMN exp uint16,
|
||||||
|
ADD COLUMN weapon uint16,
|
||||||
|
ADD COLUMN last_login integer;
|
||||||
|
|
||||||
|
END;
|
||||||
6
migrations/000003_character_savedata.down.sql
Normal file
6
migrations/000003_character_savedata.down.sql
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
ALTER TABLE characters
|
||||||
|
DROP COLUMN savedata;
|
||||||
|
|
||||||
|
END;
|
||||||
6
migrations/000003_character_savedata.up.sql
Normal file
6
migrations/000003_character_savedata.up.sql
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
ALTER TABLE characters
|
||||||
|
ADD COLUMN savedata bytea;
|
||||||
|
|
||||||
|
END;
|
||||||
13
migrations/000004_character_additional.down.sql
Normal file
13
migrations/000004_character_additional.down.sql
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
ALTER TABLE characters
|
||||||
|
DROP COLUMN decomyset,
|
||||||
|
DROP COLUMN hunternavi,
|
||||||
|
DROP COLUMN otomoairou,
|
||||||
|
DROP COLUMN partner,
|
||||||
|
DROP COLUMN platebox,
|
||||||
|
DROP COLUMN platedata,
|
||||||
|
DROP COLUMN platemyset,
|
||||||
|
DROP COLUMN rengokudata;
|
||||||
|
|
||||||
|
END;
|
||||||
13
migrations/000004_character_additional.up.sql
Normal file
13
migrations/000004_character_additional.up.sql
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
ALTER TABLE characters
|
||||||
|
ADD COLUMN decomyset bytea,
|
||||||
|
ADD COLUMN hunternavi bytea,
|
||||||
|
ADD COLUMN otomoairou bytea,
|
||||||
|
ADD COLUMN partner bytea,
|
||||||
|
ADD COLUMN platebox bytea,
|
||||||
|
ADD COLUMN platedata bytea,
|
||||||
|
ADD COLUMN platemyset bytea,
|
||||||
|
ADD COLUMN rengokudata bytea;
|
||||||
|
|
||||||
|
END;
|
||||||
5
migrations/000005_quests.down.sql
Normal file
5
migrations/000005_quests.down.sql
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS questlists;
|
||||||
|
|
||||||
|
END;
|
||||||
8
migrations/000005_quests.up.sql
Normal file
8
migrations/000005_quests.up.sql
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
CREATE TABLE questlists (
|
||||||
|
ind int NOT NULL PRIMARY KEY,
|
||||||
|
questlist bytea
|
||||||
|
);
|
||||||
|
|
||||||
|
END;
|
||||||
6
migrations/000006_mercenary.down.sql
Normal file
6
migrations/000006_mercenary.down.sql
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
ALTER TABLE characters
|
||||||
|
DROP COLUMN savemercenary;
|
||||||
|
|
||||||
|
END;
|
||||||
6
migrations/000006_mercenary.up.sql
Normal file
6
migrations/000006_mercenary.up.sql
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
BEGIN;
|
||||||
|
|
||||||
|
ALTER TABLE characters
|
||||||
|
ADD COLUMN savemercenary bytea;
|
||||||
|
|
||||||
|
END;
|
||||||
@@ -11,8 +11,7 @@ type ChatType uint8
|
|||||||
|
|
||||||
// Chat types
|
// Chat types
|
||||||
const (
|
const (
|
||||||
ChatTypeWorld ChatType = 0
|
ChatTypeLocal ChatType = 1
|
||||||
ChatTypeStage = 1
|
|
||||||
ChatTypeGuild = 2
|
ChatTypeGuild = 2
|
||||||
ChatTypeAlliance = 3
|
ChatTypeAlliance = 3
|
||||||
ChatTypeParty = 4
|
ChatTypeParty = 4
|
||||||
|
|||||||
48
network/binpacket/msg_cast_bin_private_message.go
Normal file
48
network/binpacket/msg_cast_bin_private_message.go
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
package binpacket
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/Andoryuuta/Erupe/network"
|
||||||
|
"github.com/Andoryuuta/byteframe"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ChatTargetType uint16
|
||||||
|
|
||||||
|
const (
|
||||||
|
CHAT_TARGET_PRIVATE = 0x05
|
||||||
|
CHAT_TARGET_PARTY = 0x04
|
||||||
|
)
|
||||||
|
|
||||||
|
type MsgBinTargetedChatMessage struct {
|
||||||
|
// I can't see a reason if this is indeed the number of targets, that
|
||||||
|
// it should use 2 bytes
|
||||||
|
TargetCount uint16
|
||||||
|
TargetCharIDs []uint32
|
||||||
|
TargetType uint16
|
||||||
|
RawDataPayload []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
// Opcode returns the ID associated with this packet type.
|
||||||
|
func (m *MsgBinTargetedChatMessage) Opcode() network.PacketID {
|
||||||
|
return network.MSG_SYS_CAST_BINARY
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MsgBinTargetedChatMessage) Parse(bf *byteframe.ByteFrame) error {
|
||||||
|
m.TargetCount = bf.ReadUint16()
|
||||||
|
i := uint16(0)
|
||||||
|
|
||||||
|
m.TargetCharIDs = make([]uint32, m.TargetCount)
|
||||||
|
|
||||||
|
for ; i < m.TargetCount; i++ {
|
||||||
|
m.TargetCharIDs[i] = bf.ReadUint32()
|
||||||
|
}
|
||||||
|
|
||||||
|
m.TargetType = bf.ReadUint16()
|
||||||
|
m.RawDataPayload = bf.DataFromCurrent()
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build builds a binary packet from the current data.
|
||||||
|
func (m *MsgBinTargetedChatMessage) Build(bf *byteframe.ByteFrame) error {
|
||||||
|
panic("Not implemented")
|
||||||
|
}
|
||||||
@@ -4,10 +4,11 @@ import (
|
|||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"errors"
|
"errors"
|
||||||
_config "erupe-ce/config"
|
_config "erupe-ce/config"
|
||||||
"erupe-ce/network/crypto"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
|
|
||||||
|
"erupe-ce/network/crypto"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CryptConn represents a MHF encrypted two-way connection,
|
// CryptConn represents a MHF encrypted two-way connection,
|
||||||
@@ -66,7 +67,7 @@ func (cc *CryptConn) ReadPacket() ([]byte, error) {
|
|||||||
cc.readKeyRot = uint32(cph.KeyRotDelta) * (cc.readKeyRot + 1)
|
cc.readKeyRot = uint32(cph.KeyRotDelta) * (cc.readKeyRot + 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
out, combinedCheck, check0, check1, check2 := crypto.Crypto(encryptedPacketBody, cc.readKeyRot, false, nil)
|
out, combinedCheck, check0, check1, check2 := crypto.Decrypt(encryptedPacketBody, cc.readKeyRot, nil)
|
||||||
if cph.Check0 != check0 || cph.Check1 != check1 || cph.Check2 != check2 {
|
if cph.Check0 != check0 || cph.Check1 != check1 || cph.Check2 != check2 {
|
||||||
fmt.Printf("got c0 %X, c1 %X, c2 %X\n", check0, check1, check2)
|
fmt.Printf("got c0 %X, c1 %X, c2 %X\n", check0, check1, check2)
|
||||||
fmt.Printf("want c0 %X, c1 %X, c2 %X\n", cph.Check0, cph.Check1, cph.Check2)
|
fmt.Printf("want c0 %X, c1 %X, c2 %X\n", cph.Check0, cph.Check1, cph.Check2)
|
||||||
@@ -76,7 +77,7 @@ func (cc *CryptConn) ReadPacket() ([]byte, error) {
|
|||||||
// Attempt to bruteforce it.
|
// Attempt to bruteforce it.
|
||||||
fmt.Println("Crypto out of sync? Attempting bruteforce")
|
fmt.Println("Crypto out of sync? Attempting bruteforce")
|
||||||
for key := byte(0); key < 255; key++ {
|
for key := byte(0); key < 255; key++ {
|
||||||
out, combinedCheck, check0, check1, check2 = crypto.Crypto(encryptedPacketBody, 0, false, &key)
|
out, combinedCheck, check0, check1, check2 = crypto.Decrypt(encryptedPacketBody, 0, &key)
|
||||||
//fmt.Printf("Key: 0x%X\n%s\n", key, hex.Dump(out))
|
//fmt.Printf("Key: 0x%X\n%s\n", key, hex.Dump(out))
|
||||||
if cph.Check0 == check0 && cph.Check1 == check1 && cph.Check2 == check2 {
|
if cph.Check0 == check0 && cph.Check1 == check1 && cph.Check2 == check2 {
|
||||||
fmt.Printf("Bruceforce successful, override key: 0x%X\n", key)
|
fmt.Printf("Bruceforce successful, override key: 0x%X\n", key)
|
||||||
@@ -105,7 +106,7 @@ func (cc *CryptConn) SendPacket(data []byte) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encrypt the data
|
// Encrypt the data
|
||||||
encData, combinedCheck, check0, check1, check2 := crypto.Crypto(data, cc.sendKeyRot, true, nil)
|
encData, combinedCheck, check0, check1, check2 := crypto.Encrypt(data, cc.sendKeyRot, nil)
|
||||||
|
|
||||||
header := &CryptPacketHeader{}
|
header := &CryptPacketHeader{}
|
||||||
header.Pf0 = byte(((uint(len(encData)) >> 12) & 0xF3) | 3)
|
header.Pf0 = byte(((uint(len(encData)) >> 12) & 0xF3) | 3)
|
||||||
@@ -122,7 +123,9 @@ func (cc *CryptConn) SendPacket(data []byte) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
cc.conn.Write(append(headerBytes, encData...))
|
cc.conn.Write(headerBytes)
|
||||||
|
cc.conn.Write(encData)
|
||||||
|
|
||||||
cc.sentPackets++
|
cc.sentPackets++
|
||||||
cc.prevSendPacketCombinedCheck = combinedCheck
|
cc.prevSendPacketCombinedCheck = combinedCheck
|
||||||
|
|
||||||
|
|||||||
@@ -6,30 +6,46 @@ var (
|
|||||||
_sharedCryptKey = []byte{0xDD, 0xA8, 0x5F, 0x1E, 0x57, 0xAF, 0xC0, 0xCC, 0x43, 0x35, 0x8F, 0xBB, 0x6F, 0xE6, 0xA1, 0xD6, 0x60, 0xB9, 0x1A, 0xAE, 0x20, 0x49, 0x24, 0x81, 0x21, 0xFE, 0x86, 0x2B, 0x98, 0xB7, 0xB3, 0xD2, 0x91, 0x01, 0x3A, 0x4C, 0x65, 0x92, 0x1C, 0xF4, 0xBE, 0xDD, 0xD9, 0x08, 0xE6, 0x81, 0x98, 0x1B, 0x8D, 0x60, 0xF3, 0x6F, 0xA1, 0x47, 0x24, 0xF1, 0x53, 0x45, 0xC8, 0x7B, 0x88, 0x80, 0x4E, 0x36, 0xC3, 0x0D, 0xC9, 0xD6, 0x8B, 0x08, 0x19, 0x0B, 0xA5, 0xC1, 0x11, 0x4C, 0x60, 0xF8, 0x5D, 0xFC, 0x15, 0x68, 0x7E, 0x32, 0xC0, 0x50, 0xAB, 0x64, 0x1F, 0x8A, 0xD4, 0x08, 0x39, 0x7F, 0xC2, 0xFB, 0xBA, 0x6C, 0xF0, 0xE6, 0xB0, 0x31, 0x10, 0xC1, 0xBF, 0x75, 0x43, 0xBB, 0x18, 0x04, 0x0D, 0xD1, 0x97, 0xF7, 0x23, 0x21, 0x83, 0x8B, 0xCA, 0x25, 0x2B, 0xA3, 0x03, 0x13, 0xEA, 0xAE, 0xFE, 0xF0, 0xEB, 0xFD, 0x85, 0x57, 0x53, 0x65, 0x41, 0x2A, 0x40, 0x99, 0xC0, 0x94, 0x65, 0x7E, 0x7C, 0x93, 0x82, 0xB0, 0xB3, 0xE5, 0xC0, 0x21, 0x09, 0x84, 0xD5, 0xEF, 0x9F, 0xD1, 0x7E, 0xDC, 0x4D, 0xF5, 0x7E, 0xCD, 0x45, 0x3C, 0x7F, 0xF5, 0x59, 0x98, 0xC6, 0x55, 0xFC, 0x9F, 0xA3, 0xB7, 0x74, 0xEE, 0x31, 0x98, 0xE6, 0xB7, 0xBE, 0x26, 0xF4, 0x3C, 0x76, 0xF1, 0x23, 0x7E, 0x02, 0x4E, 0x3C, 0xD1, 0xC7, 0x28, 0x23, 0x73, 0xC4, 0xD9, 0x5E, 0x0D, 0xA1, 0x80, 0xA5, 0xAA, 0x26, 0x0A, 0xA3, 0x44, 0x82, 0x74, 0xE6, 0x3C, 0x44, 0x27, 0x51, 0x0D, 0x5F, 0xC7, 0x9C, 0xD6, 0x63, 0x67, 0xA5, 0x27, 0x97, 0x38, 0xFB, 0x2D, 0xD3, 0xD6, 0x60, 0x25, 0x83, 0x4D, 0x37, 0x5B, 0x40, 0x59, 0x11, 0x77, 0x51, 0x11, 0x14, 0x18, 0x07, 0x63, 0xB1, 0x34, 0x3D, 0xB8, 0x60, 0x13, 0xC2, 0xE8, 0x13, 0x82}
|
_sharedCryptKey = []byte{0xDD, 0xA8, 0x5F, 0x1E, 0x57, 0xAF, 0xC0, 0xCC, 0x43, 0x35, 0x8F, 0xBB, 0x6F, 0xE6, 0xA1, 0xD6, 0x60, 0xB9, 0x1A, 0xAE, 0x20, 0x49, 0x24, 0x81, 0x21, 0xFE, 0x86, 0x2B, 0x98, 0xB7, 0xB3, 0xD2, 0x91, 0x01, 0x3A, 0x4C, 0x65, 0x92, 0x1C, 0xF4, 0xBE, 0xDD, 0xD9, 0x08, 0xE6, 0x81, 0x98, 0x1B, 0x8D, 0x60, 0xF3, 0x6F, 0xA1, 0x47, 0x24, 0xF1, 0x53, 0x45, 0xC8, 0x7B, 0x88, 0x80, 0x4E, 0x36, 0xC3, 0x0D, 0xC9, 0xD6, 0x8B, 0x08, 0x19, 0x0B, 0xA5, 0xC1, 0x11, 0x4C, 0x60, 0xF8, 0x5D, 0xFC, 0x15, 0x68, 0x7E, 0x32, 0xC0, 0x50, 0xAB, 0x64, 0x1F, 0x8A, 0xD4, 0x08, 0x39, 0x7F, 0xC2, 0xFB, 0xBA, 0x6C, 0xF0, 0xE6, 0xB0, 0x31, 0x10, 0xC1, 0xBF, 0x75, 0x43, 0xBB, 0x18, 0x04, 0x0D, 0xD1, 0x97, 0xF7, 0x23, 0x21, 0x83, 0x8B, 0xCA, 0x25, 0x2B, 0xA3, 0x03, 0x13, 0xEA, 0xAE, 0xFE, 0xF0, 0xEB, 0xFD, 0x85, 0x57, 0x53, 0x65, 0x41, 0x2A, 0x40, 0x99, 0xC0, 0x94, 0x65, 0x7E, 0x7C, 0x93, 0x82, 0xB0, 0xB3, 0xE5, 0xC0, 0x21, 0x09, 0x84, 0xD5, 0xEF, 0x9F, 0xD1, 0x7E, 0xDC, 0x4D, 0xF5, 0x7E, 0xCD, 0x45, 0x3C, 0x7F, 0xF5, 0x59, 0x98, 0xC6, 0x55, 0xFC, 0x9F, 0xA3, 0xB7, 0x74, 0xEE, 0x31, 0x98, 0xE6, 0xB7, 0xBE, 0x26, 0xF4, 0x3C, 0x76, 0xF1, 0x23, 0x7E, 0x02, 0x4E, 0x3C, 0xD1, 0xC7, 0x28, 0x23, 0x73, 0xC4, 0xD9, 0x5E, 0x0D, 0xA1, 0x80, 0xA5, 0xAA, 0x26, 0x0A, 0xA3, 0x44, 0x82, 0x74, 0xE6, 0x3C, 0x44, 0x27, 0x51, 0x0D, 0x5F, 0xC7, 0x9C, 0xD6, 0x63, 0x67, 0xA5, 0x27, 0x97, 0x38, 0xFB, 0x2D, 0xD3, 0xD6, 0x60, 0x25, 0x83, 0x4D, 0x37, 0x5B, 0x40, 0x59, 0x11, 0x77, 0x51, 0x11, 0x14, 0x18, 0x07, 0x63, 0xB1, 0x34, 0x3D, 0xB8, 0x60, 0x13, 0xC2, 0xE8, 0x13, 0x82}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Crypto is a generalized MHF crypto function that can perform both encryption and decryption,
|
// Encrypt encrypts the given data using MHF's custom encryption+checksum method.
|
||||||
|
// if a overrideByteKey value is supplied (!= nil), it will be used to override the derived/truncated key byte.
|
||||||
|
func Encrypt(data []byte, key uint32, overrideByteKey *byte) (outputData []byte, combinedCheck uint16, check0 uint16, check1 uint16, check2 uint16) {
|
||||||
|
return _generalCrypt(data, key, 0, overrideByteKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decrypt decrypts the given data using MHF's custom decryption+checksum method.
|
||||||
|
// if a overrideByteKey value is supplied (!= nil), it will be used to override the derived/truncated key byte.
|
||||||
|
func Decrypt(data []byte, key uint32, overrideByteKey *byte) (outputData []byte, combinedCheck uint16, check0 uint16, check1 uint16, check2 uint16) {
|
||||||
|
return _generalCrypt(data, key, 1, overrideByteKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
// _generalCrypt is a generalized MHF crypto function that can perform both encryption and decryption,
|
||||||
// these two crypto operations are combined into a single function because they shared most of their logic.
|
// these two crypto operations are combined into a single function because they shared most of their logic.
|
||||||
func Crypto(data []byte, rotKey uint32, encrypt bool, overrideByteKey *byte) ([]byte, uint16, uint16, uint16, uint16) {
|
// encrypt: cryptType==0
|
||||||
|
// decrypt: cryptType==1
|
||||||
|
func _generalCrypt(data []byte, rotKey uint32, cryptType int, overrideByteKey *byte) ([]byte, uint16, uint16, uint16, uint16) {
|
||||||
cryptKeyTruncByte := byte(((rotKey >> 1) % 999983) & 0xFF)
|
cryptKeyTruncByte := byte(((rotKey >> 1) % 999983) & 0xFF)
|
||||||
if overrideByteKey != nil {
|
if overrideByteKey != nil {
|
||||||
cryptKeyTruncByte = *overrideByteKey
|
cryptKeyTruncByte = *overrideByteKey
|
||||||
}
|
}
|
||||||
|
|
||||||
derivedCryptKey := (uint32(len(data)) * (uint32(cryptKeyTruncByte) + 1)) & 0xFFFFFFFF
|
derivedCryptKey := int32((uint32(len(data)) * (uint32(cryptKeyTruncByte) + 1)) & 0xFFFFFFFF)
|
||||||
sharedBufIdx := byte(1)
|
sharedBufIdx := byte(1)
|
||||||
var accumulator0, accumulator1, accumulator2 uint32
|
accumulator0 := uint32(0)
|
||||||
|
accumulator1 := uint32(0)
|
||||||
|
accumulator2 := uint32(0)
|
||||||
|
|
||||||
var outputData []byte
|
var outputData []byte
|
||||||
if encrypt {
|
if cryptType == 0 {
|
||||||
for i := 0; i < len(data); i++ {
|
for i := 0; i < len(data); i++ {
|
||||||
// Do the encryption for this iteration
|
// Do the encryption for this iteration
|
||||||
encKeyIdx := ((derivedCryptKey >> 10) ^ uint32(data[i])) & 0xFF
|
encKeyIdx := int32(((uint32(derivedCryptKey) >> 10) ^ uint32(data[i])) & 0xFF)
|
||||||
derivedCryptKey = 1277*derivedCryptKey + 1277
|
derivedCryptKey = (0x4FD * (derivedCryptKey + 1))
|
||||||
encKeyByte := _encryptKey[encKeyIdx]
|
encKeyByte := _encryptKey[encKeyIdx]
|
||||||
|
|
||||||
// Update the checksum accumulators.
|
// Update the checksum accumulators.
|
||||||
accumulator2 = accumulator2 + (uint32(sharedBufIdx) * uint32(data[i]))
|
accumulator2 = uint32((accumulator2 + (uint32(sharedBufIdx) * uint32(data[i]))) & 0xFFFFFFFF)
|
||||||
accumulator1 = accumulator1 + encKeyIdx
|
accumulator1 = uint32((accumulator1 + uint32(encKeyIdx)) & 0xFFFFFFFF)
|
||||||
accumulator0 = accumulator0 + uint32(encKeyByte)<<(i&7)
|
accumulator0 = uint32((accumulator0 + (uint32(encKeyByte)<<(i&7))&0xFFFFFFFF) & 0xFFFFFFFF)
|
||||||
|
|
||||||
// Append the output.
|
// Append the output.
|
||||||
outputData = append(outputData, _sharedCryptKey[sharedBufIdx]^encKeyByte)
|
outputData = append(outputData, _sharedCryptKey[sharedBufIdx]^encKeyByte)
|
||||||
@@ -37,32 +53,32 @@ func Crypto(data []byte, rotKey uint32, encrypt bool, overrideByteKey *byte) ([]
|
|||||||
// Update the sharedBufIdx for the next iteration.
|
// Update the sharedBufIdx for the next iteration.
|
||||||
sharedBufIdx = data[i]
|
sharedBufIdx = data[i]
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
|
} else if cryptType == 1 {
|
||||||
for i := 0; i < len(data); i++ {
|
for i := 0; i < len(data); i++ {
|
||||||
// Do the decryption for this iteration
|
// Do the decryption for this iteration
|
||||||
oldSharedBufIdx := sharedBufIdx
|
oldSharedBufIdx := sharedBufIdx
|
||||||
tIdx := data[i] ^ _sharedCryptKey[sharedBufIdx]
|
tIdx := data[i] ^ _sharedCryptKey[sharedBufIdx]
|
||||||
decKeyByte := _decryptKey[tIdx]
|
decKeyByte := _decryptKey[tIdx]
|
||||||
sharedBufIdx = byte((derivedCryptKey >> 10) ^ uint32(decKeyByte))
|
sharedBufIdx = byte(((uint32(derivedCryptKey) >> 10) ^ uint32(decKeyByte)) & 0xFF)
|
||||||
|
|
||||||
// Update the checksum accumulators.
|
// Update the checksum accumulators.
|
||||||
accumulator0 = accumulator0 + uint32(tIdx)<<(i&7)
|
accumulator0 = (accumulator0 + ((uint32(tIdx) << (i & 7)) & 0xFFFFFFFF))
|
||||||
accumulator1 = accumulator1 + uint32(decKeyByte)
|
accumulator1 = (accumulator1 + uint32(decKeyByte)) & 0xFFFFFFFF
|
||||||
accumulator2 = accumulator2 + uint32(oldSharedBufIdx)*uint32(sharedBufIdx)
|
accumulator2 = (accumulator2 + ((uint32(oldSharedBufIdx) * uint32(sharedBufIdx)) & 0xFFFFFFFF)) & 0xFFFFFFFF
|
||||||
|
|
||||||
// Append the output.
|
// Append the output.
|
||||||
outputData = append(outputData, sharedBufIdx)
|
outputData = append(outputData, sharedBufIdx)
|
||||||
|
|
||||||
// Update the key pos for next iteration.
|
// Update the key pos for next iteration.
|
||||||
derivedCryptKey = 1277*derivedCryptKey + 1277
|
derivedCryptKey = (0x4FD * (derivedCryptKey + 1))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var check [4]uint16
|
combinedCheck := uint16((accumulator1 + (accumulator0 >> 1) + (accumulator2 >> 2)) & 0xFFFF)
|
||||||
check[0] = uint16(accumulator1 + (accumulator0 >> 1) + (accumulator2 >> 2))
|
check0 := uint16((accumulator0 ^ ((accumulator0 & 0xFFFF0000) >> 16)) & 0xFFFF)
|
||||||
check[1] = uint16(accumulator0 ^ ((accumulator0 & 0xFFFF0000) >> 16))
|
check1 := uint16((accumulator1 ^ ((accumulator1 & 0xFFFF0000) >> 16)) & 0xFFFF)
|
||||||
check[2] = uint16(accumulator1 ^ ((accumulator1 & 0xFFFF0000) >> 16))
|
check2 := uint16((accumulator2 ^ ((accumulator2 & 0xFFFF0000) >> 16)) & 0xFFFF)
|
||||||
check[3] = uint16(accumulator2 ^ ((accumulator2 & 0xFFFF0000) >> 16))
|
|
||||||
|
|
||||||
return outputData, check[0], check[1], check[2], check[3]
|
return outputData, combinedCheck, check0, check1, check2
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ func TestEncrypt(t *testing.T) {
|
|||||||
for k, tt := range tests {
|
for k, tt := range tests {
|
||||||
testname := fmt.Sprintf("encrypt_test_%d", k)
|
testname := fmt.Sprintf("encrypt_test_%d", k)
|
||||||
t.Run(testname, func(t *testing.T) {
|
t.Run(testname, func(t *testing.T) {
|
||||||
out, cc, c0, c1, c2 := Crypto(tt.decryptedData, tt.key, true, nil)
|
out, cc, c0, c1, c2 := Encrypt(tt.decryptedData, tt.key, nil)
|
||||||
if cc != tt.ecc {
|
if cc != tt.ecc {
|
||||||
t.Errorf("got cc 0x%X, want 0x%X", cc, tt.ecc)
|
t.Errorf("got cc 0x%X, want 0x%X", cc, tt.ecc)
|
||||||
} else if c0 != tt.ec0 {
|
} else if c0 != tt.ec0 {
|
||||||
@@ -86,7 +86,7 @@ func TestDecrypt(t *testing.T) {
|
|||||||
for k, tt := range tests {
|
for k, tt := range tests {
|
||||||
testname := fmt.Sprintf("decrypt_test_%d", k)
|
testname := fmt.Sprintf("decrypt_test_%d", k)
|
||||||
t.Run(testname, func(t *testing.T) {
|
t.Run(testname, func(t *testing.T) {
|
||||||
out, cc, c0, c1, c2 := Crypto(tt.decryptedData, tt.key, false, nil)
|
out, cc, c0, c1, c2 := Decrypt(tt.encryptedData, tt.key, nil)
|
||||||
if cc != tt.ecc {
|
if cc != tt.ecc {
|
||||||
t.Errorf("got cc 0x%X, want 0x%X", cc, tt.ecc)
|
t.Errorf("got cc 0x%X, want 0x%X", cc, tt.ecc)
|
||||||
} else if c0 != tt.ec0 {
|
} else if c0 != tt.ec0 {
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import (
|
|||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
"erupe-ce/network/clientctx"
|
||||||
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgHead represents the MSG_HEAD
|
// MsgHead represents the MSG_HEAD
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import (
|
|||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
"erupe-ce/network/clientctx"
|
||||||
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAcceptReadReward represents the MSG_MHF_ACCEPT_READ_REWARD
|
// MsgMhfAcceptReadReward represents the MSG_MHF_ACCEPT_READ_REWARD
|
||||||
|
|||||||
@@ -3,16 +3,16 @@ package mhfpacket
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
|
"erupe-ce/common/byteframe"
|
||||||
"erupe-ce/network"
|
"erupe-ce/network"
|
||||||
"erupe-ce/network/clientctx"
|
"erupe-ce/network/clientctx"
|
||||||
"erupe-ce/common/byteframe"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAcquireDistItem represents the MSG_MHF_ACQUIRE_DIST_ITEM
|
// MsgMhfAcquireDistItem represents the MSG_MHF_ACQUIRE_DIST_ITEM
|
||||||
type MsgMhfAcquireDistItem struct {
|
type MsgMhfAcquireDistItem struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
DistributionType uint8
|
DistributionType uint8
|
||||||
DistributionID uint32
|
DistributionID uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"erupe-ce/common/byteframe"
|
||||||
"erupe-ce/network"
|
"erupe-ce/network"
|
||||||
"erupe-ce/network/clientctx"
|
"erupe-ce/network/clientctx"
|
||||||
"erupe-ce/common/byteframe"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAcquireExchangeShop represents the MSG_MHF_ACQUIRE_EXCHANGE_SHOP
|
// MsgMhfAcquireExchangeShop represents the MSG_MHF_ACQUIRE_EXCHANGE_SHOP
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ type MsgMhfAcquireFesta struct {
|
|||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
FestaID uint32
|
FestaID uint32
|
||||||
GuildID uint32
|
GuildID uint32
|
||||||
Unk uint8
|
Unk uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -26,8 +26,7 @@ func (m *MsgMhfAcquireFesta) Parse(bf *byteframe.ByteFrame, ctx *clientctx.Clien
|
|||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.FestaID = bf.ReadUint32()
|
m.FestaID = bf.ReadUint32()
|
||||||
m.GuildID = bf.ReadUint32()
|
m.GuildID = bf.ReadUint32()
|
||||||
m.Unk = bf.ReadUint8()
|
m.Unk = bf.ReadUint16()
|
||||||
bf.ReadUint8() // Zeroed
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,15 +3,15 @@ package mhfpacket
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
|
"erupe-ce/common/byteframe"
|
||||||
"erupe-ce/network"
|
"erupe-ce/network"
|
||||||
"erupe-ce/network/clientctx"
|
"erupe-ce/network/clientctx"
|
||||||
"erupe-ce/common/byteframe"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAcquireFestaIntermediatePrize represents the MSG_MHF_ACQUIRE_FESTA_INTERMEDIATE_PRIZE
|
// MsgMhfAcquireFestaIntermediatePrize represents the MSG_MHF_ACQUIRE_FESTA_INTERMEDIATE_PRIZE
|
||||||
type MsgMhfAcquireFestaIntermediatePrize struct {
|
type MsgMhfAcquireFestaIntermediatePrize struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
PrizeID uint32
|
PrizeID uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -22,7 +22,7 @@ func (m *MsgMhfAcquireFestaIntermediatePrize) Opcode() network.PacketID {
|
|||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfAcquireFestaIntermediatePrize) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfAcquireFestaIntermediatePrize) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.PrizeID = bf.ReadUint32()
|
m.PrizeID = bf.ReadUint32()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAcquireFestaPersonalPrize represents the MSG_MHF_ACQUIRE_FESTA_PERSONAL_PRIZE
|
// MsgMhfAcquireFestaPersonalPrize represents the MSG_MHF_ACQUIRE_FESTA_PERSONAL_PRIZE
|
||||||
type MsgMhfAcquireFestaPersonalPrize struct {
|
type MsgMhfAcquireFestaPersonalPrize struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
PrizeID uint32
|
PrizeID uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -21,9 +21,9 @@ func (m *MsgMhfAcquireFestaPersonalPrize) Opcode() network.PacketID {
|
|||||||
|
|
||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfAcquireFestaPersonalPrize) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfAcquireFestaPersonalPrize) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.PrizeID = bf.ReadUint32()
|
m.PrizeID = bf.ReadUint32()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build builds a binary packet from the current data.
|
// Build builds a binary packet from the current data.
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAcquireGuildAdventure represents the MSG_MHF_ACQUIRE_GUILD_ADVENTURE
|
// MsgMhfAcquireGuildAdventure represents the MSG_MHF_ACQUIRE_GUILD_ADVENTURE
|
||||||
type MsgMhfAcquireGuildAdventure struct {
|
type MsgMhfAcquireGuildAdventure struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
ID uint32
|
ID uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -21,9 +21,9 @@ func (m *MsgMhfAcquireGuildAdventure) Opcode() network.PacketID {
|
|||||||
|
|
||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfAcquireGuildAdventure) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfAcquireGuildAdventure) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.ID = bf.ReadUint32()
|
m.ID = bf.ReadUint32()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build builds a binary packet from the current data.
|
// Build builds a binary packet from the current data.
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import (
|
|||||||
type MsgMhfAcquireGuildTresure struct {
|
type MsgMhfAcquireGuildTresure struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
HuntID uint32
|
HuntID uint32
|
||||||
Unk bool
|
Unk uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -24,7 +24,7 @@ func (m *MsgMhfAcquireGuildTresure) Opcode() network.PacketID {
|
|||||||
func (m *MsgMhfAcquireGuildTresure) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfAcquireGuildTresure) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.HuntID = bf.ReadUint32()
|
m.HuntID = bf.ReadUint32()
|
||||||
m.Unk = bf.ReadBool()
|
m.Unk = bf.ReadUint8()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAcquireGuildTresureSouvenir represents the MSG_MHF_ACQUIRE_GUILD_TRESURE_SOUVENIR
|
// MsgMhfAcquireGuildTresureSouvenir represents the MSG_MHF_ACQUIRE_GUILD_TRESURE_SOUVENIR
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ import (
|
|||||||
// MsgMhfAcquireMonthlyItem represents the MSG_MHF_ACQUIRE_MONTHLY_ITEM
|
// MsgMhfAcquireMonthlyItem represents the MSG_MHF_ACQUIRE_MONTHLY_ITEM
|
||||||
type MsgMhfAcquireMonthlyItem struct {
|
type MsgMhfAcquireMonthlyItem struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
Unk0 uint8
|
Unk0 uint16
|
||||||
Unk1 uint8
|
Unk1 uint16
|
||||||
Unk2 uint16
|
Unk2 uint32
|
||||||
Unk3 uint32
|
Unk3 uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,11 +25,10 @@ func (m *MsgMhfAcquireMonthlyItem) Opcode() network.PacketID {
|
|||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfAcquireMonthlyItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfAcquireMonthlyItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.Unk0 = bf.ReadUint8()
|
m.Unk0 = bf.ReadUint16()
|
||||||
m.Unk1 = bf.ReadUint8()
|
m.Unk1 = bf.ReadUint16()
|
||||||
m.Unk2 = bf.ReadUint16()
|
m.Unk2 = bf.ReadUint32()
|
||||||
m.Unk3 = bf.ReadUint32()
|
m.Unk3 = bf.ReadUint32()
|
||||||
bf.ReadUint32() // Zeroed
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAcquireMonthlyReward represents the MSG_MHF_ACQUIRE_MONTHLY_REWARD
|
// MsgMhfAcquireMonthlyReward represents the MSG_MHF_ACQUIRE_MONTHLY_REWARD
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ import (
|
|||||||
// MsgMhfAcquireTitle represents the MSG_MHF_ACQUIRE_TITLE
|
// MsgMhfAcquireTitle represents the MSG_MHF_ACQUIRE_TITLE
|
||||||
type MsgMhfAcquireTitle struct {
|
type MsgMhfAcquireTitle struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
TitleIDs []uint16
|
Unk0 uint16
|
||||||
|
Unk1 uint16
|
||||||
|
TitleID uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -22,11 +24,9 @@ func (m *MsgMhfAcquireTitle) Opcode() network.PacketID {
|
|||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfAcquireTitle) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfAcquireTitle) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
titles := int(bf.ReadUint16())
|
m.Unk0 = bf.ReadUint16()
|
||||||
bf.ReadUint16() // Zeroed
|
m.Unk1 = bf.ReadUint16()
|
||||||
for i := 0; i < titles; i++ {
|
m.TitleID = bf.ReadUint16()
|
||||||
m.TitleIDs = append(m.TitleIDs, bf.ReadUint16())
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,30 +1,30 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAcquireUdItem represents the MSG_MHF_ACQUIRE_UD_ITEM
|
// MsgMhfAcquireUdItem represents the MSG_MHF_ACQUIRE_UD_ITEM
|
||||||
type MsgMhfAcquireUdItem struct {
|
type MsgMhfAcquireUdItem struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
Unk0 uint8
|
Unk0 uint8
|
||||||
// from gal
|
// from gal
|
||||||
// daily = 0
|
// daily = 0
|
||||||
// personal = 1
|
// personal = 1
|
||||||
// personal rank = 2
|
// personal rank = 2
|
||||||
// guild rank = 3
|
// guild rank = 3
|
||||||
// gcp = 4
|
// gcp = 4
|
||||||
// from cat
|
// from cat
|
||||||
// treasure achievement = 5
|
// treasure achievement = 5
|
||||||
// personal achievement = 6
|
// personal achievement = 6
|
||||||
// guild achievement = 7
|
// guild achievement = 7
|
||||||
RewardType uint8
|
RewardType uint8
|
||||||
Unk2 uint8 // Number of uint32s to read?
|
Unk2 uint8 // Number of uint32s to read?
|
||||||
Unk3 []byte
|
Unk3 []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -34,13 +34,13 @@ func (m *MsgMhfAcquireUdItem) Opcode() network.PacketID {
|
|||||||
|
|
||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfAcquireUdItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfAcquireUdItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.Unk0 = bf.ReadUint8()
|
m.Unk0 = bf.ReadUint8()
|
||||||
m.RewardType = bf.ReadUint8()
|
m.RewardType = bf.ReadUint8()
|
||||||
m.Unk2 = bf.ReadUint8()
|
m.Unk2 = bf.ReadUint8()
|
||||||
for i := uint8(0); i < m.Unk2; i++ {
|
for i := uint8(0); i < m.Unk2; i++ {
|
||||||
bf.ReadUint32()
|
bf.ReadUint32()
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAddGuildMissionCount represents the MSG_MHF_ADD_GUILD_MISSION_COUNT
|
// MsgMhfAddGuildMissionCount represents the MSG_MHF_ADD_GUILD_MISSION_COUNT
|
||||||
type MsgMhfAddGuildMissionCount struct {
|
type MsgMhfAddGuildMissionCount struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
MissionID uint32
|
MissionID uint32
|
||||||
Count uint32
|
Count uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -22,10 +22,10 @@ func (m *MsgMhfAddGuildMissionCount) Opcode() network.PacketID {
|
|||||||
|
|
||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfAddGuildMissionCount) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfAddGuildMissionCount) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.MissionID = bf.ReadUint32()
|
m.MissionID = bf.ReadUint32()
|
||||||
m.Count = bf.ReadUint32()
|
m.Count = bf.ReadUint32()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build builds a binary packet from the current data.
|
// Build builds a binary packet from the current data.
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAddGuildWeeklyBonusExceptionalUser represents the MSG_MHF_ADD_GUILD_WEEKLY_BONUS_EXCEPTIONAL_USER
|
// MsgMhfAddGuildWeeklyBonusExceptionalUser represents the MSG_MHF_ADD_GUILD_WEEKLY_BONUS_EXCEPTIONAL_USER
|
||||||
type MsgMhfAddGuildWeeklyBonusExceptionalUser struct {
|
type MsgMhfAddGuildWeeklyBonusExceptionalUser struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
NumUsers uint8
|
NumUsers uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -21,9 +21,9 @@ func (m *MsgMhfAddGuildWeeklyBonusExceptionalUser) Opcode() network.PacketID {
|
|||||||
|
|
||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfAddGuildWeeklyBonusExceptionalUser) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfAddGuildWeeklyBonusExceptionalUser) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.NumUsers = bf.ReadUint8()
|
m.NumUsers = bf.ReadUint8()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build builds a binary packet from the current data.
|
// Build builds a binary packet from the current data.
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"erupe-ce/common/byteframe"
|
||||||
"erupe-ce/network"
|
"erupe-ce/network"
|
||||||
"erupe-ce/network/clientctx"
|
"erupe-ce/network/clientctx"
|
||||||
"erupe-ce/common/byteframe"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAddKouryouPoint represents the MSG_MHF_ADD_KOURYOU_POINT
|
// MsgMhfAddKouryouPoint represents the MSG_MHF_ADD_KOURYOU_POINT
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAddRewardSongCount represents the MSG_MHF_ADD_REWARD_SONG_COUNT
|
// MsgMhfAddRewardSongCount represents the MSG_MHF_ADD_REWARD_SONG_COUNT
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAddUdPoint represents the MSG_MHF_ADD_UD_POINT
|
// MsgMhfAddUdPoint represents the MSG_MHF_ADD_UD_POINT
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"erupe-ce/common/byteframe"
|
||||||
"erupe-ce/network"
|
"erupe-ce/network"
|
||||||
"erupe-ce/network/clientctx"
|
"erupe-ce/network/clientctx"
|
||||||
"erupe-ce/common/byteframe"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAddUdTacticsPoint represents the MSG_MHF_ADD_UD_TACTICS_POINT
|
// MsgMhfAddUdTacticsPoint represents the MSG_MHF_ADD_UD_TACTICS_POINT
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ type MsgMhfAnnounce struct {
|
|||||||
IPAddress uint32
|
IPAddress uint32
|
||||||
Port uint16
|
Port uint16
|
||||||
StageID []byte
|
StageID []byte
|
||||||
Data *byteframe.ByteFrame
|
Type uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -31,7 +31,8 @@ func (m *MsgMhfAnnounce) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientCon
|
|||||||
_ = bf.ReadUint8()
|
_ = bf.ReadUint8()
|
||||||
_ = bf.ReadUint8()
|
_ = bf.ReadUint8()
|
||||||
m.StageID = bf.ReadBytes(32)
|
m.StageID = bf.ReadBytes(32)
|
||||||
m.Data = byteframe.NewByteFrameFromBytes(bf.ReadBytes(uint(bf.ReadUint32())))
|
_ = bf.ReadUint32()
|
||||||
|
m.Type = bf.ReadUint8()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfAnswerGuildScout represents the MSG_MHF_ANSWER_GUILD_SCOUT
|
// MsgMhfAnswerGuildScout represents the MSG_MHF_ANSWER_GUILD_SCOUT
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
_config "erupe-ce/config"
|
|
||||||
"erupe-ce/network"
|
"erupe-ce/network"
|
||||||
"erupe-ce/network/clientctx"
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
@@ -27,16 +25,17 @@ func (m *MsgMhfApplyDistItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.Clie
|
|||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.DistributionType = bf.ReadUint8()
|
m.DistributionType = bf.ReadUint8()
|
||||||
m.DistributionID = bf.ReadUint32()
|
m.DistributionID = bf.ReadUint32()
|
||||||
if _config.ErupeConfig.RealClientMode >= _config.G8 {
|
m.Unk2 = bf.ReadUint32()
|
||||||
m.Unk2 = bf.ReadUint32()
|
m.Unk3 = bf.ReadUint32()
|
||||||
}
|
|
||||||
if _config.ErupeConfig.RealClientMode >= _config.G10 {
|
|
||||||
m.Unk3 = bf.ReadUint32()
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build builds a binary packet from the current data.
|
// Build builds a binary packet from the current data.
|
||||||
func (m *MsgMhfApplyDistItem) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfApplyDistItem) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
return errors.New("NOT IMPLEMENTED")
|
bf.WriteUint32(m.AckHandle)
|
||||||
|
bf.WriteUint8(m.DistributionType)
|
||||||
|
bf.WriteUint32(m.DistributionID)
|
||||||
|
bf.WriteUint32(m.Unk2)
|
||||||
|
bf.WriteUint32(m.Unk3)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
"erupe-ce/network"
|
"erupe-ce/network"
|
||||||
"erupe-ce/network/clientctx"
|
"erupe-ce/network/clientctx"
|
||||||
@@ -23,11 +22,11 @@ func (m *MsgMhfArrangeGuildMember) Opcode() network.PacketID {
|
|||||||
func (m *MsgMhfArrangeGuildMember) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfArrangeGuildMember) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.GuildID = bf.ReadUint32()
|
m.GuildID = bf.ReadUint32()
|
||||||
bf.ReadUint8() // Zeroed
|
charCount := bf.ReadUint16()
|
||||||
charCount := int(bf.ReadUint8())
|
|
||||||
m.CharIDs = make([]uint32, charCount)
|
m.CharIDs = make([]uint32, charCount)
|
||||||
|
|
||||||
for i := 0; i < charCount; i++ {
|
for i := uint16(0); i < charCount; i++ {
|
||||||
m.CharIDs[i] = bf.ReadUint32()
|
m.CharIDs[i] = bf.ReadUint32()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,5 +35,13 @@ func (m *MsgMhfArrangeGuildMember) Parse(bf *byteframe.ByteFrame, ctx *clientctx
|
|||||||
|
|
||||||
// Build builds a binary packet from the current data.
|
// Build builds a binary packet from the current data.
|
||||||
func (m *MsgMhfArrangeGuildMember) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfArrangeGuildMember) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
return errors.New("NOT IMPLEMENTED")
|
bf.WriteUint32(m.AckHandle)
|
||||||
|
bf.WriteUint32(m.GuildID)
|
||||||
|
bf.WriteUint16(uint16(len(m.CharIDs)))
|
||||||
|
|
||||||
|
for _, charID := range m.CharIDs {
|
||||||
|
bf.WriteUint32(charID)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfCancelGuildMissionTarget represents the MSG_MHF_CANCEL_GUILD_MISSION_TARGET
|
// MsgMhfCancelGuildMissionTarget represents the MSG_MHF_CANCEL_GUILD_MISSION_TARGET
|
||||||
type MsgMhfCancelGuildMissionTarget struct {
|
type MsgMhfCancelGuildMissionTarget struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
MissionID uint32
|
MissionID uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -21,9 +21,9 @@ func (m *MsgMhfCancelGuildMissionTarget) Opcode() network.PacketID {
|
|||||||
|
|
||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfCancelGuildMissionTarget) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfCancelGuildMissionTarget) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.MissionID = bf.ReadUint32()
|
m.MissionID = bf.ReadUint32()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build builds a binary packet from the current data.
|
// Build builds a binary packet from the current data.
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfCancelGuildScout represents the MSG_MHF_CANCEL_GUILD_SCOUT
|
// MsgMhfCancelGuildScout represents the MSG_MHF_CANCEL_GUILD_SCOUT
|
||||||
|
|||||||
@@ -13,8 +13,7 @@ type MsgMhfChargeFesta struct {
|
|||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
FestaID uint32
|
FestaID uint32
|
||||||
GuildID uint32
|
GuildID uint32
|
||||||
Souls []uint16
|
Souls int
|
||||||
Auto bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -27,10 +26,11 @@ func (m *MsgMhfChargeFesta) Parse(bf *byteframe.ByteFrame, ctx *clientctx.Client
|
|||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.FestaID = bf.ReadUint32()
|
m.FestaID = bf.ReadUint32()
|
||||||
m.GuildID = bf.ReadUint32()
|
m.GuildID = bf.ReadUint32()
|
||||||
|
m.Souls = 0
|
||||||
for i := bf.ReadUint16(); i > 0; i-- {
|
for i := bf.ReadUint16(); i > 0; i-- {
|
||||||
m.Souls = append(m.Souls, bf.ReadUint16())
|
m.Souls += int(bf.ReadUint16())
|
||||||
}
|
}
|
||||||
m.Auto = bf.ReadBool()
|
_ = bf.ReadUint8() // Unk
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfChargeGuildAdventure represents the MSG_MHF_CHARGE_GUILD_ADVENTURE
|
// MsgMhfChargeGuildAdventure represents the MSG_MHF_CHARGE_GUILD_ADVENTURE
|
||||||
type MsgMhfChargeGuildAdventure struct {
|
type MsgMhfChargeGuildAdventure struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
ID uint32
|
ID uint32
|
||||||
Amount uint32
|
Amount uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -22,10 +22,10 @@ func (m *MsgMhfChargeGuildAdventure) Opcode() network.PacketID {
|
|||||||
|
|
||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfChargeGuildAdventure) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfChargeGuildAdventure) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.ID = bf.ReadUint32()
|
m.ID = bf.ReadUint32()
|
||||||
m.Amount = bf.ReadUint32()
|
m.Amount = bf.ReadUint32()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build builds a binary packet from the current data.
|
// Build builds a binary packet from the current data.
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
"erupe-ce/network"
|
"erupe-ce/network"
|
||||||
"erupe-ce/network/clientctx"
|
"erupe-ce/network/clientctx"
|
||||||
@@ -26,5 +25,7 @@ func (m *MsgMhfCheckDailyCafepoint) Parse(bf *byteframe.ByteFrame, ctx *clientct
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *MsgMhfCheckDailyCafepoint) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfCheckDailyCafepoint) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
return errors.New("NOT IMPLEMENTED")
|
bf.WriteUint32(m.AckHandle)
|
||||||
|
bf.WriteUint32(m.Unk)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import (
|
|||||||
type MsgMhfCheckMonthlyItem struct {
|
type MsgMhfCheckMonthlyItem struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
Type uint8
|
Type uint8
|
||||||
|
Unk []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -23,9 +24,7 @@ func (m *MsgMhfCheckMonthlyItem) Opcode() network.PacketID {
|
|||||||
func (m *MsgMhfCheckMonthlyItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfCheckMonthlyItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.Type = bf.ReadUint8()
|
m.Type = bf.ReadUint8()
|
||||||
bf.ReadUint8() // Zeroed
|
m.Unk = bf.ReadBytes(3)
|
||||||
bf.ReadUint8() // Zeroed
|
|
||||||
bf.ReadUint8() // Zeroed
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ type MsgMhfCheckWeeklyStamp struct {
|
|||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
StampType string
|
StampType string
|
||||||
Unk1 bool
|
Unk1 bool
|
||||||
|
Unk2 uint16 // Hardcoded 0 in the binary
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -30,7 +31,7 @@ func (m *MsgMhfCheckWeeklyStamp) Parse(bf *byteframe.ByteFrame, ctx *clientctx.C
|
|||||||
m.StampType = "ex"
|
m.StampType = "ex"
|
||||||
}
|
}
|
||||||
m.Unk1 = bf.ReadBool()
|
m.Unk1 = bf.ReadBool()
|
||||||
bf.ReadUint16() // Zeroed
|
m.Unk2 = bf.ReadUint16()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ import (
|
|||||||
// MsgMhfCreateGuild represents the MSG_MHF_CREATE_GUILD
|
// MsgMhfCreateGuild represents the MSG_MHF_CREATE_GUILD
|
||||||
type MsgMhfCreateGuild struct {
|
type MsgMhfCreateGuild struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
|
Unk0 uint8
|
||||||
|
Unk1 uint8
|
||||||
Name string
|
Name string
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -23,8 +25,9 @@ func (m *MsgMhfCreateGuild) Opcode() network.PacketID {
|
|||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfCreateGuild) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfCreateGuild) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
bf.ReadUint16() // Zeroed
|
m.Unk0 = bf.ReadUint8()
|
||||||
bf.ReadUint16() // Name length
|
m.Unk1 = bf.ReadUint8()
|
||||||
|
_ = bf.ReadUint16() // len
|
||||||
m.Name = stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())
|
m.Name = stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,8 +25,7 @@ func (m *MsgMhfCreateJoint) Opcode() network.PacketID {
|
|||||||
func (m *MsgMhfCreateJoint) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfCreateJoint) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.GuildID = bf.ReadUint32()
|
m.GuildID = bf.ReadUint32()
|
||||||
bf.ReadUint16() // Zeroed
|
_ = bf.ReadUint32() // len
|
||||||
bf.ReadUint16() // Name length
|
|
||||||
m.Name = stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())
|
m.Name = stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfCreateMercenary represents the MSG_MHF_CREATE_MERCENARY
|
// MsgMhfCreateMercenary represents the MSG_MHF_CREATE_MERCENARY
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfDebugPostValue represents the MSG_MHF_DEBUG_POST_VALUE
|
// MsgMhfDebugPostValue represents the MSG_MHF_DEBUG_POST_VALUE
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
"erupe-ce/network"
|
"erupe-ce/network"
|
||||||
"erupe-ce/network/clientctx"
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfDisplayedAchievement represents the MSG_MHF_DISPLAYED_ACHIEVEMENT
|
// MsgMhfDisplayedAchievement represents the MSG_MHF_DISPLAYED_ACHIEVEMENT
|
||||||
type MsgMhfDisplayedAchievement struct{}
|
type MsgMhfDisplayedAchievement struct {
|
||||||
|
Unk0 uint8
|
||||||
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
func (m *MsgMhfDisplayedAchievement) Opcode() network.PacketID {
|
func (m *MsgMhfDisplayedAchievement) Opcode() network.PacketID {
|
||||||
@@ -17,11 +18,12 @@ func (m *MsgMhfDisplayedAchievement) Opcode() network.PacketID {
|
|||||||
|
|
||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfDisplayedAchievement) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfDisplayedAchievement) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
bf.ReadUint8() // Zeroed
|
m.Unk0 = bf.ReadUint8()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build builds a binary packet from the current data.
|
// Build builds a binary packet from the current data.
|
||||||
func (m *MsgMhfDisplayedAchievement) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfDisplayedAchievement) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
return errors.New("NOT IMPLEMENTED")
|
bf.WriteUint8(m.Unk0)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfEnterTournamentQuest represents the MSG_MHF_ENTER_TOURNAMENT_QUEST
|
// MsgMhfEnterTournamentQuest represents the MSG_MHF_ENTER_TOURNAMENT_QUEST
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ func (m *MsgMhfEntryFesta) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientC
|
|||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.FestaID = bf.ReadUint32()
|
m.FestaID = bf.ReadUint32()
|
||||||
m.GuildID = bf.ReadUint32()
|
m.GuildID = bf.ReadUint32()
|
||||||
bf.ReadUint16() // Zeroed
|
_ = bf.ReadUint16() // Always 0
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
_config "erupe-ce/config"
|
|
||||||
"erupe-ce/network"
|
"erupe-ce/network"
|
||||||
"erupe-ce/network/clientctx"
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
@@ -11,10 +9,9 @@ import (
|
|||||||
// MsgMhfEnumerateDistItem represents the MSG_MHF_ENUMERATE_DIST_ITEM
|
// MsgMhfEnumerateDistItem represents the MSG_MHF_ENUMERATE_DIST_ITEM
|
||||||
type MsgMhfEnumerateDistItem struct {
|
type MsgMhfEnumerateDistItem struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
DistType uint8
|
Unk0 uint8
|
||||||
Unk1 uint8
|
Unk1 uint16
|
||||||
Unk2 uint16
|
Unk2 uint16
|
||||||
Unk3 []byte
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -25,16 +22,17 @@ func (m *MsgMhfEnumerateDistItem) Opcode() network.PacketID {
|
|||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfEnumerateDistItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfEnumerateDistItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.DistType = bf.ReadUint8()
|
m.Unk0 = bf.ReadUint8()
|
||||||
m.Unk1 = bf.ReadUint8()
|
m.Unk1 = bf.ReadUint16()
|
||||||
m.Unk2 = bf.ReadUint16() // Maximum? Hardcoded to 256
|
m.Unk2 = bf.ReadUint16()
|
||||||
if _config.ErupeConfig.RealClientMode >= _config.Z1 {
|
|
||||||
m.Unk3 = bf.ReadBytes(uint(bf.ReadUint8()))
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build builds a binary packet from the current data.
|
// Build builds a binary packet from the current data.
|
||||||
func (m *MsgMhfEnumerateDistItem) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfEnumerateDistItem) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
return errors.New("NOT IMPLEMENTED")
|
bf.WriteUint32(m.AckHandle)
|
||||||
|
bf.WriteUint8(m.Unk0)
|
||||||
|
bf.WriteUint16(m.Unk1)
|
||||||
|
bf.WriteUint16(m.Unk2)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
"erupe-ce/network"
|
"erupe-ce/network"
|
||||||
"erupe-ce/network/clientctx"
|
"erupe-ce/network/clientctx"
|
||||||
@@ -10,6 +9,8 @@ import (
|
|||||||
// MsgMhfEnumerateEvent represents the MSG_MHF_ENUMERATE_EVENT
|
// MsgMhfEnumerateEvent represents the MSG_MHF_ENUMERATE_EVENT
|
||||||
type MsgMhfEnumerateEvent struct {
|
type MsgMhfEnumerateEvent struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
|
Unk0 uint16 // Hardcoded 0 in the binary
|
||||||
|
Unk1 uint16 // Hardcoded 0 in the binary
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -20,12 +21,15 @@ func (m *MsgMhfEnumerateEvent) Opcode() network.PacketID {
|
|||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfEnumerateEvent) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfEnumerateEvent) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
bf.ReadUint16() // Zeroed
|
m.Unk0 = bf.ReadUint16()
|
||||||
bf.ReadUint16() // Zeroed
|
m.Unk1 = bf.ReadUint16()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build builds a binary packet from the current data.
|
// Build builds a binary packet from the current data.
|
||||||
func (m *MsgMhfEnumerateEvent) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfEnumerateEvent) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
return errors.New("NOT IMPLEMENTED")
|
bf.WriteUint32(m.AckHandle)
|
||||||
|
bf.WriteUint16(m.Unk0)
|
||||||
|
bf.WriteUint16(m.Unk1)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfEnumerateFestaIntermediatePrize represents the MSG_MHF_ENUMERATE_FESTA_INTERMEDIATE_PRIZE
|
// MsgMhfEnumerateFestaIntermediatePrize represents the MSG_MHF_ENUMERATE_FESTA_INTERMEDIATE_PRIZE
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ func (m *MsgMhfEnumerateFestaMember) Parse(bf *byteframe.ByteFrame, ctx *clientc
|
|||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.FestaID = bf.ReadUint32()
|
m.FestaID = bf.ReadUint32()
|
||||||
m.GuildID = bf.ReadUint32()
|
m.GuildID = bf.ReadUint32()
|
||||||
bf.ReadUint16() // Zeroed
|
_ = bf.ReadUint16() // Hardcoded 0 in the binary.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfEnumerateFestaPersonalPrize represents the MSG_MHF_ENUMERATE_FESTA_PERSONAL_PRIZE
|
// MsgMhfEnumerateFestaPersonalPrize represents the MSG_MHF_ENUMERATE_FESTA_PERSONAL_PRIZE
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ import (
|
|||||||
// MsgMhfEnumerateGuacot represents the MSG_MHF_ENUMERATE_GUACOT
|
// MsgMhfEnumerateGuacot represents the MSG_MHF_ENUMERATE_GUACOT
|
||||||
type MsgMhfEnumerateGuacot struct {
|
type MsgMhfEnumerateGuacot struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
Unk0 uint32
|
Unk0 uint32 // Hardcoded 0 in binary
|
||||||
|
Unk1 uint16 // Hardcoded 0 in binary
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -22,7 +23,7 @@ func (m *MsgMhfEnumerateGuacot) Opcode() network.PacketID {
|
|||||||
func (m *MsgMhfEnumerateGuacot) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfEnumerateGuacot) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.Unk0 = bf.ReadUint32()
|
m.Unk0 = bf.ReadUint32()
|
||||||
bf.ReadUint16() // Zeroed
|
m.Unk1 = bf.ReadUint16()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ package mhfpacket
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"erupe-ce/common/bfutil"
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/common/stringsupport"
|
||||||
"erupe-ce/network"
|
"erupe-ce/network"
|
||||||
"erupe-ce/network/clientctx"
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
@@ -32,8 +34,8 @@ type MsgMhfEnumerateGuild struct {
|
|||||||
Type EnumerateGuildType
|
Type EnumerateGuildType
|
||||||
Page uint8
|
Page uint8
|
||||||
Sorting bool
|
Sorting bool
|
||||||
Data1 *byteframe.ByteFrame
|
Data1 []byte
|
||||||
Data2 *byteframe.ByteFrame
|
Data2 string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -47,12 +49,12 @@ func (m *MsgMhfEnumerateGuild) Parse(bf *byteframe.ByteFrame, ctx *clientctx.Cli
|
|||||||
m.Type = EnumerateGuildType(bf.ReadUint8())
|
m.Type = EnumerateGuildType(bf.ReadUint8())
|
||||||
m.Page = bf.ReadUint8()
|
m.Page = bf.ReadUint8()
|
||||||
m.Sorting = bf.ReadBool()
|
m.Sorting = bf.ReadBool()
|
||||||
bf.ReadUint8() // Zeroed
|
_ = bf.ReadBytes(1)
|
||||||
m.Data1 = byteframe.NewByteFrameFromBytes(bf.ReadBytes(4))
|
m.Data1 = bf.ReadBytes(4)
|
||||||
bf.ReadUint16() // Zeroed
|
_ = bf.ReadBytes(2)
|
||||||
dataLen := uint(bf.ReadUint8())
|
lenData2 := uint(bf.ReadUint8())
|
||||||
bf.ReadUint8() // Zeroed
|
_ = bf.ReadBytes(1)
|
||||||
m.Data2 = byteframe.NewByteFrameFromBytes(bf.ReadBytes(dataLen))
|
m.Data2 = stringsupport.SJISToUTF8(bfutil.UpToNull(bf.ReadBytes(lenData2)))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,8 @@ import (
|
|||||||
// MsgMhfEnumerateGuildItem represents the MSG_MHF_ENUMERATE_GUILD_ITEM
|
// MsgMhfEnumerateGuildItem represents the MSG_MHF_ENUMERATE_GUILD_ITEM
|
||||||
type MsgMhfEnumerateGuildItem struct {
|
type MsgMhfEnumerateGuildItem struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
GuildID uint32
|
GuildId uint32
|
||||||
|
Unk0 uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -22,9 +23,8 @@ func (m *MsgMhfEnumerateGuildItem) Opcode() network.PacketID {
|
|||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfEnumerateGuildItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfEnumerateGuildItem) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.GuildID = bf.ReadUint32()
|
m.GuildId = bf.ReadUint32()
|
||||||
bf.ReadUint8() // Zeroed
|
m.Unk0 = bf.ReadUint16()
|
||||||
bf.ReadUint8() // Zeroed
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
"erupe-ce/network"
|
"erupe-ce/network"
|
||||||
"erupe-ce/network/clientctx"
|
"erupe-ce/network/clientctx"
|
||||||
@@ -9,9 +8,10 @@ import (
|
|||||||
|
|
||||||
// MsgMhfEnumerateGuildMember represents the MSG_MHF_ENUMERATE_GUILD_MEMBER
|
// MsgMhfEnumerateGuildMember represents the MSG_MHF_ENUMERATE_GUILD_MEMBER
|
||||||
type MsgMhfEnumerateGuildMember struct {
|
type MsgMhfEnumerateGuildMember struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
AllianceID uint32
|
Unk0 uint16 // Hardcoded 00 01 in the binary
|
||||||
GuildID uint32
|
Unk1 uint32 // Alliance related
|
||||||
|
GuildID uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -22,14 +22,17 @@ func (m *MsgMhfEnumerateGuildMember) Opcode() network.PacketID {
|
|||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfEnumerateGuildMember) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfEnumerateGuildMember) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
bf.ReadUint8() // Zeroed
|
m.Unk0 = bf.ReadUint16()
|
||||||
bf.ReadUint8() // Always 1
|
m.Unk1 = bf.ReadUint32()
|
||||||
m.AllianceID = bf.ReadUint32()
|
|
||||||
m.GuildID = bf.ReadUint32()
|
m.GuildID = bf.ReadUint32()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build builds a binary packet from the current data.
|
// Build builds a binary packet from the current data.
|
||||||
func (m *MsgMhfEnumerateGuildMember) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfEnumerateGuildMember) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
return errors.New("NOT IMPLEMENTED")
|
bf.WriteUint32(m.AckHandle)
|
||||||
|
bf.WriteUint16(m.Unk0)
|
||||||
|
bf.WriteUint32(m.Unk1)
|
||||||
|
bf.WriteUint32(m.GuildID)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,8 +12,7 @@ import (
|
|||||||
type MsgMhfEnumerateGuildTresure struct {
|
type MsgMhfEnumerateGuildTresure struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
MaxHunts uint16
|
MaxHunts uint16
|
||||||
Unk0 uint16
|
Unk uint32
|
||||||
Unk1 uint16
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -25,8 +24,9 @@ func (m *MsgMhfEnumerateGuildTresure) Opcode() network.PacketID {
|
|||||||
func (m *MsgMhfEnumerateGuildTresure) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfEnumerateGuildTresure) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.MaxHunts = bf.ReadUint16()
|
m.MaxHunts = bf.ReadUint16()
|
||||||
m.Unk0 = bf.ReadUint16()
|
// Changes with MaxHunts
|
||||||
m.Unk1 = bf.ReadUint16()
|
// 0 if MaxHunts = 1, 1 if MaxHunts = 30
|
||||||
|
m.Unk = bf.ReadUint32()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ type MsgMhfEnumerateHouse struct {
|
|||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
CharID uint32
|
CharID uint32
|
||||||
Method uint8
|
Method uint8
|
||||||
|
Unk uint16
|
||||||
Name string
|
Name string
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -27,7 +28,7 @@ func (m *MsgMhfEnumerateHouse) Parse(bf *byteframe.ByteFrame, ctx *clientctx.Cli
|
|||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.CharID = bf.ReadUint32()
|
m.CharID = bf.ReadUint32()
|
||||||
m.Method = bf.ReadUint8()
|
m.Method = bf.ReadUint8()
|
||||||
bf.ReadUint16() // Zeroed
|
m.Unk = bf.ReadUint16()
|
||||||
lenName := bf.ReadUint8()
|
lenName := bf.ReadUint8()
|
||||||
if lenName > 0 {
|
if lenName > 0 {
|
||||||
m.Name = stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())
|
m.Name = stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())
|
||||||
|
|||||||
@@ -10,13 +10,8 @@ import (
|
|||||||
|
|
||||||
// MsgMhfEnumerateInvGuild represents the MSG_MHF_ENUMERATE_INV_GUILD
|
// MsgMhfEnumerateInvGuild represents the MSG_MHF_ENUMERATE_INV_GUILD
|
||||||
type MsgMhfEnumerateInvGuild struct {
|
type MsgMhfEnumerateInvGuild struct {
|
||||||
AckHandle uint32
|
AckHandle uint32
|
||||||
Unk uint32
|
Unk []byte
|
||||||
Operation uint8
|
|
||||||
ActiveHours uint8
|
|
||||||
DaysActive uint8
|
|
||||||
PlayStyle uint8
|
|
||||||
GuildRequest uint8
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
@@ -27,12 +22,7 @@ func (m *MsgMhfEnumerateInvGuild) Opcode() network.PacketID {
|
|||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfEnumerateInvGuild) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfEnumerateInvGuild) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
m.AckHandle = bf.ReadUint32()
|
m.AckHandle = bf.ReadUint32()
|
||||||
m.Unk = bf.ReadUint32()
|
m.Unk = bf.ReadBytes(9)
|
||||||
m.Operation = bf.ReadUint8()
|
|
||||||
m.ActiveHours = bf.ReadUint8()
|
|
||||||
m.DaysActive = bf.ReadUint8()
|
|
||||||
m.PlayStyle = bf.ReadUint8()
|
|
||||||
m.GuildRequest = bf.ReadUint8()
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package mhfpacket
|
package mhfpacket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfEnumerateMercenaryLog represents the MSG_MHF_ENUMERATE_MERCENARY_LOG
|
// MsgMhfEnumerateMercenaryLog represents the MSG_MHF_ENUMERATE_MERCENARY_LOG
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user