Compare commits
65 Commits
Author | SHA1 | Date | |
---|---|---|---|
ab48db0206 | |||
![]() |
eaa67d7c97 | ||
8d8a20b755 | |||
0273fa9520 | |||
![]() |
873c9a37ee | ||
b5597ce5f8 | |||
55b82bbc3a | |||
84c5673b76 | |||
d0e38b6ec8 | |||
58ec5f101e | |||
d5673b1887 | |||
ef199d64dd | |||
b7468d4f7e | |||
fe47ba73e4 | |||
62e0ed28ee | |||
e7916876d0 | |||
55567f1933 | |||
53b8933952 | |||
f30a7fcf2a | |||
99dacdf004 | |||
![]() |
1e7bcd732c | ||
![]() |
d38f165464 | ||
![]() |
daa0bd72e9 | ||
![]() |
53f63934b1 | ||
![]() |
b2d0d28946 | ||
![]() |
0a8d4bb38c | ||
6da2b47013 | |||
06c326507e | |||
64a4edf178 | |||
67baea9f2c | |||
fbca6b98f5 | |||
9c72778720 | |||
bababdc366 | |||
2aad26f273 | |||
7175a6c7b6 | |||
47ed596664 | |||
a57d5781d6 | |||
6ccd5381fc | |||
97928b1d47 | |||
6df0b69568 | |||
84ce5f6804 | |||
3387658793 | |||
96438eb969 | |||
771f6708f1 | |||
19759b99e2 | |||
a273c2607d | |||
5fd2af5f59 | |||
4cdbf18761 | |||
05fe3103c3 | |||
32febe3c41 | |||
4ff4e092a9 | |||
fd12729528 | |||
431a429926 | |||
d804cdc3bd | |||
bec774b38c | |||
de4b7ff714 | |||
f729eebe51 | |||
54fd79c924 | |||
cb8b9d52b3 | |||
0c3e79a7cd | |||
5dffb9edea | |||
46c85f41a3 | |||
c6ff45af5c | |||
c1bc9cf7cc | |||
bf4b6954ea |
33
.editorconfig
Normal file
33
.editorconfig
Normal file
@ -0,0 +1,33 @@
|
||||
root = true
|
||||
|
||||
# Global
|
||||
[*]
|
||||
indent_style = unset
|
||||
indent_size = 4
|
||||
tab_width = 4
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = unset
|
||||
|
||||
# Unreal Engine 3 / Source
|
||||
[*.uc]
|
||||
indent_style = tab
|
||||
|
||||
[*.{uci,upkg}]
|
||||
|
||||
# Unreal Engine 3 / i18n
|
||||
[*.{chn,cht,cze,dan,deu,dut,esl,esn,fra,frc,hun,int,ita,jpn,kor,pol,por,ptb,rus,tur,ukr}]
|
||||
charset = utf-16le
|
||||
|
||||
# Other
|
||||
[*.md]
|
||||
indent_style = space
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.yml]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.{txt,cfg,conf}]
|
||||
indent_style = tab
|
8
.github/issue_template.md
vendored
8
.github/issue_template.md
vendored
@ -1,8 +0,0 @@
|
||||
### Details
|
||||
Tell us exactly what happens, every single detail that you can think of
|
||||
|
||||
### Screenshots
|
||||
Provide a screenshot of the issue so we can debug it's not a user issue
|
||||
|
||||
### Steps to reproduce
|
||||
Tell us how to reproduce the problem, step by step
|
116
.github/workflows/mega-linter.yml
vendored
Normal file
116
.github/workflows/mega-linter.yml
vendored
Normal file
@ -0,0 +1,116 @@
|
||||
---
|
||||
name: MegaLinter
|
||||
|
||||
permissions: read-all
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
|
||||
env:
|
||||
APPLY_FIXES: none
|
||||
APPLY_FIXES_EVENT: pull_request
|
||||
APPLY_FIXES_MODE: commit
|
||||
FILTER_REGEX_EXCLUDE: (mega-linter.yml)
|
||||
DISABLE: SPELL
|
||||
DISABLE_ERRORS_LINTERS: MARKDOWN_MARKDOWN_LINK_CHECK
|
||||
EDITORCONFIG_EDITORCONFIG_CHECKER_FILTER_REGEX_EXCLUDE: 'xVoteAnnouncer.upk'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.ref }}-${{ github.workflow }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
megalinter:
|
||||
name: MegaLinter
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
||||
with:
|
||||
token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: MegaLinter
|
||||
uses: oxsecurity/megalinter@7e042c726c68415475b05a65a686c612120a1232
|
||||
id: ml
|
||||
env:
|
||||
VALIDATE_ALL_CODEBASE: true
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Archive production artifacts
|
||||
uses: actions/upload-artifact@c7d193f32edcb7bfad88892161225aeda64e9392
|
||||
if: success() || failure()
|
||||
with:
|
||||
name: MegaLinter reports
|
||||
path: |
|
||||
megalinter-reports
|
||||
mega-linter.log
|
||||
|
||||
- name: Set APPLY_FIXES_IF var
|
||||
run: |
|
||||
printf 'APPLY_FIXES_IF=%s\n' "${{
|
||||
steps.ml.outputs.has_updated_sources == 1 &&
|
||||
(
|
||||
env.APPLY_FIXES_EVENT == 'all' ||
|
||||
env.APPLY_FIXES_EVENT == github.event_name
|
||||
) &&
|
||||
(
|
||||
github.event_name == 'push' ||
|
||||
github.event.pull_request.head.repo.full_name == github.repository
|
||||
)
|
||||
}}" >> "${GITHUB_ENV}"
|
||||
|
||||
- name: Set APPLY_FIXES_IF_* vars
|
||||
run: |
|
||||
printf 'APPLY_FIXES_IF_PR=%s\n' "${{
|
||||
env.APPLY_FIXES_IF == 'true' &&
|
||||
env.APPLY_FIXES_MODE == 'pull_request'
|
||||
}}" >> "${GITHUB_ENV}"
|
||||
printf 'APPLY_FIXES_IF_COMMIT=%s\n' "${{
|
||||
env.APPLY_FIXES_IF == 'true' &&
|
||||
env.APPLY_FIXES_MODE == 'commit' &&
|
||||
(!contains(fromJSON('["refs/heads/main", "refs/heads/master"]'), github.ref))
|
||||
}}" >> "${GITHUB_ENV}"
|
||||
|
||||
- name: Create Pull Request with applied fixes
|
||||
uses: peter-evans/create-pull-request@153407881ec5c347639a548ade7d8ad1d6740e38
|
||||
id: cpr
|
||||
if: env.APPLY_FIXES_IF_PR == 'true'
|
||||
with:
|
||||
token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }}
|
||||
commit-message: "[MegaLinter] Apply linters automatic fixes"
|
||||
title: "[MegaLinter] Apply linters automatic fixes"
|
||||
labels: bot
|
||||
|
||||
- name: Create PR output
|
||||
if: env.APPLY_FIXES_IF_PR == 'true'
|
||||
run: |
|
||||
echo "PR Number - ${{ steps.cpr.outputs.pull-request-number }}"
|
||||
echo "PR URL - ${{ steps.cpr.outputs.pull-request-url }}"
|
||||
|
||||
- name: Prepare commit
|
||||
if: env.APPLY_FIXES_IF_COMMIT == 'true'
|
||||
run: sudo chown -Rc $UID .git/
|
||||
|
||||
- name: Commit and push applied linter fixes
|
||||
uses: stefanzweifel/git-auto-commit-action@8756aa072ef5b4a080af5dc8fef36c5d586e521d
|
||||
if: env.APPLY_FIXES_IF_COMMIT == 'true'
|
||||
with:
|
||||
branch: >-
|
||||
${{
|
||||
github.event.pull_request.head.ref ||
|
||||
github.head_ref ||
|
||||
github.ref
|
||||
}}
|
||||
commit_message: "[MegaLinter] Apply linters fixes"
|
||||
commit_user_name: "github-actions"
|
||||
commit_user_email: "github-actions[bot]@users.noreply.github.com"
|
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
*.psd
|
||||
/ignore
|
BIN
Localization/CHN/ServerExt.chn
Normal file
BIN
Localization/CHN/ServerExt.chn
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,5 +1,7 @@
|
||||
[img]https://raw.githubusercontent.com/GenZmeY/KF2-Server-Extension/master/PublicationContent/mutbanner.png[/img]
|
||||
|
||||
[img]https://img.shields.io/static/v1?logo=GitHub&labelColor=gray&color=blue&logoColor=white&label=&message=Open Source[/img] [img]https://img.shields.io/github/license/GenZmeY/KF2-Server-Extension[/img] [img]https://img.shields.io/steam/downloads/2085786712[/img] [img]https://img.shields.io/steam/favorites/2085786712[/img] [url=https://steamcommunity.com/sharedfiles/filedetails/changelog/2085786712] [img]https://img.shields.io/steam/update-date/2085786712[/img] [img]https://img.shields.io/github/v/tag/GenZmeY/KF2-Server-Extension[/img][/url]
|
||||
|
||||
[h1]Description:[/h1]
|
||||
[i]This mod replaces current perk system in Killing Floor 2 with a serverside perk progression with RPG elements, which let you buy individual stats and traits.
|
||||
|
||||
@ -19,21 +21,27 @@ This is a further development of the ServerExt mutator from [url=https://steamco
|
||||
[/list]
|
||||
The full changelog is available [url=https://steamcommunity.com/sharedfiles/filedetails/changelog/2085786712]here[/url].
|
||||
|
||||
[h1]Usage (single player):[/h1]
|
||||
1. Subscribe to this mutator;
|
||||
2. Start KF2;
|
||||
3. Open console (`) and input:
|
||||
[h1]Usage (single player)[/h1]
|
||||
[olist]
|
||||
[*]Subscribe to this mutator;
|
||||
[*]Start KF2;
|
||||
[*]Open console (`) and input:
|
||||
[code]open KF-BioticsLab?Mutator=ServerExtMut.ServerExtMut[/code]
|
||||
(You can add some options or replace KF-BioticsLab with the map you want)
|
||||
[/olist]
|
||||
|
||||
[h1]Usage (server):[/h1]
|
||||
[b]Note:[/b] If you don't understand what is written here, read the article [url=https://wiki.killingfloor2.com/index.php?title=Dedicated_Server_(Killing_Floor_2)][u]Dedicated Server (KF2 wiki)[/u][/url] before following these instructions.
|
||||
|
||||
1. Open your PCServer-KFEngine.ini / LinuxServer-KFEngine.ini;
|
||||
2. Add the following string to the [b][OnlineSubsystemSteamworks.KFWorkshopSteamworks][/b] section:
|
||||
[code]ServerSubscribedWorkshopItems=2085786712[/code]
|
||||
3. Start the server and wait while the mutator is downloading;
|
||||
4. Add [b]?Mutator=ServerExtMut.ServerExtMut[/b] above to launchup URL and restart server.
|
||||
[h1]Usage (server)[/h1]
|
||||
[b]Note:[/b] [i]If you don't understand what is written here, read the article [url=https://wiki.killingfloor2.com/index.php?title=Dedicated_Server_(Killing_Floor_2)][u]Dedicated Server (KF2 wiki)[/u][/url] before following these instructions.[/i]
|
||||
[olist]
|
||||
[*]Open your [b]PCServer-KFEngine.ini[/b] / [b]LinuxServer-KFEngine.ini[/b];
|
||||
[*]Find the [b][IpDrv.TcpNetDriver][/b] section and make sure that there is a line (add if not):
|
||||
[b]DownloadManagers=OnlineSubsystemSteamworks.SteamWorkshopDownload[/b]
|
||||
❗️ If there are several [b]DownloadManagers=[/b] then the line above should be the first ❗️
|
||||
[*]Add the following string to the [b][OnlineSubsystemSteamworks.KFWorkshopSteamworks][/b] section (create one if it doesn't exist):
|
||||
[b]ServerSubscribedWorkshopItems=2085786712[/b]
|
||||
[*]Start the server and wait while the mutator is downloading;
|
||||
[*]Add mutator to server start parameters: [b]?Mutator=ServerExtMut.ServerExtMut[/b] and restart the server.
|
||||
[/olist]
|
||||
|
||||
[h1]Mutator setup[/h1]
|
||||
[url=https://steamcommunity.com/workshop/filedetails/discussion/2085786712/4241773359646835902/][u]Look here[/u][/url]
|
||||
@ -68,6 +76,25 @@ C:\Users\<YOUR_USERNAME>\Documents\My Games\KillingFloor2\KFGame\Localization\
|
||||
Check all folders and delete all ServerExt.* files you find.
|
||||
4. Re-subscribe to this mod and try again.
|
||||
|
||||
[h1]If configs are not created[/h1]
|
||||
[olist]
|
||||
[*]Create the missing configs manually, then add the following content to them ([u]only for configs that you created manually[/u]):
|
||||
|
||||
[*]Put in [b]KFServerExtMut.ini[/b] this:
|
||||
[b][ServerExtMut.ServerExtMut]
|
||||
SettingsInit=0[/b]
|
||||
|
||||
[*]Put in [b]KFxMapVote.ini[/b] this:
|
||||
[b][ServerExtMut.xVotingHandler]
|
||||
ConfigVersion=0[/b]
|
||||
|
||||
[*]Put in [b]KFServerExt.ini[/b] this: [url=https://gist.githubusercontent.com/GenZmeY/616b6f845f9829c93976f42f6c48505a/raw/1a8c8409d61a2908d5c854ced0932b8ed43a7f51/KFServerExt-Default.ini]<github gist>[/url] [b](*)[/b]
|
||||
|
||||
[*]Start the game/server along with the ServerExt, then check the configs - content should be generated.
|
||||
[/olist]
|
||||
|
||||
[b](*)[/b]Thanks to [url=https://steamcommunity.com/profiles/76561198105638699]Cloud[/url] for this file and instructions!
|
||||
|
||||
[h1]Bug reports[/h1]
|
||||
If you find a bug, please create a new issue here:
|
||||
[u]https://github.com/GenZmeY/KF2-Server-Extension/issues[/u]
|
||||
@ -79,7 +106,7 @@ ServerExt supports localization now!
|
||||
|
||||
If you have a desire to help translate ServerExt into other languages, you can read how to do it in this thread: [u][url=https://steamcommunity.com/workshop/filedetails/discussion/2085786712/2942494909176752884]Localization[/url][/u]
|
||||
|
||||
[h1]Credits:[/h1]
|
||||
[h1]Credits[/h1]
|
||||
[url=https://steamcommunity.com/profiles/76561197975509070]Marco[/url]
|
||||
[url=https://steamcommunity.com/profiles/76561197997881512]ForrestMarkX[/url]
|
||||
[url=https://steamcommunity.com/profiles/76561198143883210]inklesspen[/url]
|
||||
@ -88,13 +115,14 @@ If you have a desire to help translate ServerExt into other languages, you can r
|
||||
[url=https://steamcommunity.com/profiles/76561198004271210]Scaredkid93[/url]
|
||||
[url=https://www.deviantart.com/cottonvalent]CottonValent[/url][b](*)[/b]
|
||||
|
||||
[b]Translators:[/b]
|
||||
[b]Translators[/b]
|
||||
[url=https://steamcommunity.com/profiles/76561198001617867]GenZmeY[/url] - Russian [RUS];
|
||||
[url=https://steamcommunity.com/profiles/76561197967822972]MilkTeaFox[/url] - Traditional Chinese [CHT];
|
||||
[url=https://steamcommunity.com/profiles/76561198930643117]あさぴっぴ1020[/url] - Japanese [JPN];
|
||||
[url=https://steamcommunity.com/profiles/76561198080866131]Jason Voorehes [/url] - Spanish [ESN];
|
||||
[url=https://steamcommunity.com/profiles/76561198200630473/]小曦曦[/url] - Simplified Chinese [CHN];
|
||||
|
||||
[h1]Sources:[/h1]
|
||||
[u]https://github.com/GenZmeY/KF2-Server-Extension[/u] [b](GNU GPLv3)[/b]
|
||||
[h1]Sources[/h1]
|
||||
[url=https://github.com/GenZmeY/KF2-Server-Extension]https://github.com/GenZmeY/KF2-Server-Extension[/url] [b](GNU GPLv3)[/b]
|
||||
|
||||
[b](*)[/b] CottonValent - is the artist who created gorgeous cat on the preview (I don’t know why he is here, it happened).
|
65
README.md
65
README.md
@ -1,22 +1,22 @@
|
||||
[](https://steamcommunity.com/sharedfiles/filedetails/?id=2085786712)
|
||||
# Server Extension
|
||||
|
||||
[](https://steamcommunity.com/sharedfiles/filedetails/?id=2085786712)
|
||||
|
||||
[](https://steamcommunity.com/sharedfiles/filedetails/?id=2085786712)
|
||||
[](https://steamcommunity.com/sharedfiles/filedetails/?id=2085786712)
|
||||
[](https://steamcommunity.com/sharedfiles/filedetails/?id=2085786712)
|
||||
[](https://steamcommunity.com/sharedfiles/filedetails/?id=2085786712)
|
||||
[](https://steamcommunity.com/sharedfiles/filedetails/?id=2085786712)
|
||||
[](https://github.com/GenZmeY/KF2-Server-Extension/actions/workflows/mega-linter.yml)
|
||||
[](https://github.com/GenZmeY/KF2-Server-Extension/tags)
|
||||
[](https://docs.unrealengine.com/udk/Three/WebHome.html)
|
||||
[](LICENSE)
|
||||
|
||||
[](https://github.com/GenZmeY/KF2-Server-Extension/graphs/contributors)
|
||||
|
||||
***
|
||||
|
||||
*This mod replaces current perk system in [Killing Floor 2](https://en.wikipedia.org/wiki/Killing_Floor_2) with a serverside perk progression with RPG elements, which let you buy individual stats and traits.*
|
||||
|
||||
*This is a further development of the ServerExt mutator from [Marco](https://forums.tripwireinteractive.com/index.php?threads/mutator-server-extension-mod.109463) and [Forrest Mark X](https://github.com/ForrestMarkX/KF2-Server-Extension).*
|
||||
|
||||
# Features
|
||||
## Features
|
||||
- RPG elements (traits and stats);
|
||||
- New menu system;
|
||||
- Scoreboard that supports unlimited playercount on server;
|
||||
@ -33,7 +33,7 @@ The full changelog is available on [steam workshop](https://steamcommunity.com/s
|
||||
|
||||
**Note:** If you want to build/test/brew/publish a mutator without git-bash and/or scripts, follow [these instructions](https://tripwireinteractive.atlassian.net/wiki/spaces/KF2SW/pages/26247172/KF2+Code+Modding+How-to) instead of what is described here.
|
||||
|
||||
# Build
|
||||
## Build
|
||||
1. Install [Killing Floor 2](https://store.steampowered.com/app/232090/Killing_Floor_2/), Killing Floor 2 - SDK and [git for windows](https://git-scm.com/download/win);
|
||||
2. open git-bash and go to any folder where you want to store ServerExt sources:
|
||||
`cd <ANY_FOLDER_YOU_WANT>`
|
||||
@ -46,43 +46,27 @@ The full changelog is available on [steam workshop](https://steamcommunity.com/s
|
||||
5. The compiled files will be here:
|
||||
`C:\Users\<USERNAME>\Documents\My Games\KillingFloor2\KFGame\Unpublished\BrewedPC\Script\`
|
||||
|
||||
# Testing
|
||||
Open git-bash in the ServerExt source folder and run command:
|
||||
`./tools/builder -t`
|
||||
(or `./tools/builder -ct` if you haven't compiled the mutator yet)
|
||||
|
||||
A local single-user test will be launched with parameters from `test.cfg` (edit this file if you want to test mutator with different parameters).
|
||||
|
||||
# Using and configuring ServerExt
|
||||
## Using and configuring ServerExt
|
||||
A detailed manual is available on the [mod page](https://steamcommunity.com/sharedfiles/filedetails/?id=2085786712) in the steam workshop.
|
||||
|
||||
# Publication in steam workshop
|
||||
1. Modify the publish files if necessary, they are in the `PublicationContent`:
|
||||
> description.txt
|
||||
> preview.png
|
||||
> tags.txt
|
||||
> title.txt
|
||||
|
||||
2. Run this command in the source folder: `./tools/builder -cbu`
|
||||
|
||||
# Contributing
|
||||
## Contributing
|
||||
**Participation is welcome!**
|
||||
|
||||
## Bug reports
|
||||
### Bug reports
|
||||
If you find a bug, go to the [issue page](https://github.com/GenZmeY/KF2-Server-Extension/issues) and check if there is a description of your bug. If not, create a new issue.
|
||||
Describe what the bug looks like and how we can reproduce it.
|
||||
Attach screenshots if you think it might help.
|
||||
|
||||
If it's a crash issue, be sure to include the `Launch.log` and `Launch_2.log` files. You can find them here:
|
||||
If it's a crash issue, be sure to include the `Launch.log` file. You can find them here:
|
||||
`C:\Users\<USERNAME>\Documents\My Games\KillingFloor2\KFGame\Logs\`
|
||||
Please note that these files are overwritten every time you start the game/server. Therefore, you must take these files immediately after the game crashes in order not to lose information.
|
||||
|
||||
## Localization
|
||||
### Localization
|
||||
The mutator supports localization and you can help translate it into other languages.
|
||||
It does not require any special knowledge or programming skills, so you just need to know the language into which you will translate.
|
||||
Here's a quick guide on how to do it: [localization guide](https://steamcommunity.com/workshop/filedetails/discussion/2085786712/2942494909176752884)
|
||||
|
||||
## Contribute code
|
||||
### Contribute code
|
||||
You can help improve ServerExt by fixing bugs and adding new features.
|
||||
Before making a pull request, make sure that:
|
||||
1. Your code is working correctly.
|
||||
@ -91,10 +75,27 @@ Before making a pull request, make sure that:
|
||||
In the description of the pull request, describe the changes you made.
|
||||
|
||||
|
||||
# License
|
||||
[GNU GPLv3](LICENSE)
|
||||
## Contributors
|
||||
[](https://github.com/GenZmeY/KF2-Server-Extension/graphs/contributors)
|
||||
|
||||
[Marco](https://steamcommunity.com/profiles/76561197975509070)
|
||||
[ForrestMarkX](https://steamcommunity.com/profiles/76561197997881512)
|
||||
[inklesspen](https://steamcommunity.com/profiles/76561198143883210)
|
||||
[GenZmeY](https://steamcommunity.com/profiles/76561198001617867)
|
||||
[secret](https://steamcommunity.com/profiles/76561198042219365)
|
||||
[Scaredkid93](https://steamcommunity.com/profiles/76561198004271210)
|
||||
|
||||
**Translators:**
|
||||
[GenZmeY](https://steamcommunity.com/profiles/76561198001617867) - Russian [RUS];
|
||||
[MilkTeaFox](https://steamcommunity.com/profiles/76561197967822972) - Traditional Chinese [CHT];
|
||||
[あさぴっぴ1020](https://steamcommunity.com/profiles/76561198930643117) - Japanese [JPN];
|
||||
[Jason Voorehes ](https://steamcommunity.com/profiles/76561198080866131) - Spanish [ESN];
|
||||
[小曦曦](https://steamcommunity.com/profiles/76561198200630473) - Simplified Chinese [CHN].
|
||||
|
||||
## License
|
||||
[](LICENSE)
|
||||
|
||||
***
|
||||
|
||||
**Note about the banner:**
|
||||
The cat in the picture is [meowbin](https://www.deviantart.com/cottonvalent/gallery/48815375/creepy-cat). And [Cotton Valent](https://www.deviantart.com/cottonvalent) is the artist who designed and painted this magnificent cat.
|
||||
The cat in the picture is [meowbin](https://twitter.com/meawbinneko). And [Cotton Valent](https://twitter.com/horrormove) is the artist who designed and painted this magnificent cat.
|
||||
|
@ -46,4 +46,5 @@ final function SaveData(FMyCustomChar R)
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -2,7 +2,7 @@ class ExtDT_Ballistic_9mm extends KFDT_Ballistic_9mm
|
||||
abstract
|
||||
hidedropdown;
|
||||
|
||||
DefaultProperties
|
||||
defaultproperties
|
||||
{
|
||||
ModifierPerkList(0) = class'KFPerk_Sharpshooter'
|
||||
ModifierPerkList(1) = class'KFPerk_Gunslinger'
|
||||
|
@ -2,7 +2,7 @@ class ExtDT_Ballistic_Pistol_Medic extends KFDT_Ballistic_Pistol_Medic
|
||||
abstract
|
||||
hidedropdown;
|
||||
|
||||
DefaultProperties
|
||||
defaultproperties
|
||||
{
|
||||
ModifierPerkList(0) = class'KFPerk_Sharpshooter'
|
||||
ModifierPerkList(1) = class'KFPerk_Gunslinger'
|
||||
|
@ -18,10 +18,6 @@ static final function name GetUnlockedEmote(int ItemId, ExtPlayerController PC)
|
||||
if (PRI == None)
|
||||
return Anim;
|
||||
|
||||
/*
|
||||
if (InStr(string(Anim), "Deluxe") != INDEX_NONE && PRI.AdminType == 255)
|
||||
return 'NONE';
|
||||
*/
|
||||
else return Anim;
|
||||
}
|
||||
|
||||
|
@ -5,6 +5,7 @@ protected function SpecialCringeEffectsfor (Actor Victim, float VictimDist)
|
||||
return;
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
28
ServerExt/Classes/ExtHUD_ObjectiveConatiner.uc
Normal file
28
ServerExt/Classes/ExtHUD_ObjectiveConatiner.uc
Normal file
@ -0,0 +1,28 @@
|
||||
class ExtHUD_ObjectiveConatiner extends KFGFxHUD_ObjectiveConatiner;
|
||||
|
||||
simulated function SetActive(bool bActive)
|
||||
{
|
||||
if (bActive)
|
||||
{
|
||||
Super.SetActive(bActive);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVisible(bActive);
|
||||
CurrentObjectiveInterface = none;
|
||||
|
||||
// Fix:
|
||||
// ScriptWarning: Accessed None
|
||||
// KFGFxHUD_ObjectiveConatiner Transient.ExtMoviePlayer_HUD_0:KFGFxHUD_ObjectiveConatiner_0
|
||||
// Function KFGame.KFGFxHUD_ObjectiveConatiner:SetActive:01D9
|
||||
if (GetObject("objectiveNumberMC") != None)
|
||||
{
|
||||
GetObject("objectiveNumberMC").SetVisible(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
|
||||
}
|
@ -29,6 +29,7 @@ function UpdateGrenades()
|
||||
}
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -44,4 +44,5 @@ function UpdatePlayerInfo(optional bool bForceUpdate)
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -86,6 +86,7 @@ simulated function SetWeaponGroupList(out array<KFWeapon> WeaponList, byte Group
|
||||
SetWeaponList(DataProvider, GroupIndex);
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -2,7 +2,6 @@ class ExtMenu_Gear extends KFGFxObject_Menu;
|
||||
|
||||
var ExtPlayerReplicationInfo ExtPRI;
|
||||
|
||||
// var KFGFxObject_TraderItems TraderItems;
|
||||
var KFGFxGearContainer_PerksSelection PerkSelectionContainer;
|
||||
var KFCharacterInfo_Human CurrentCharInfo;
|
||||
var string CharInfoPath;
|
||||
@ -19,7 +18,6 @@ function InitializeMenu(KFGFxMoviePlayer_Manager InManager)
|
||||
LocalizeText();
|
||||
EmoteList = class'ExtEmoteList'.static.GetEmoteArray();
|
||||
InitCharacterMenu();
|
||||
// TraderItems = KFGameReplicationInfo(GetPC().WorldInfo.GRI).TraderItems;
|
||||
}
|
||||
|
||||
function InitCharacterMenu()
|
||||
@ -69,7 +67,6 @@ function OnOpen()
|
||||
return;
|
||||
|
||||
CheckForCustomizationPawn(PC);
|
||||
//GetGameViewportClient().HandleInputAxis = OnAxisModified;
|
||||
|
||||
if (PC.PlayerReplicationInfo.bReadyToPlay && PC.WorldInfo.GRI.bMatchHasBegun)
|
||||
{
|
||||
|
@ -62,4 +62,5 @@ function Callback_Equip(int ItemDefinition)
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -93,6 +93,20 @@ final function ShowKillMessageX(PlayerReplicationInfo PRI1, PlayerReplicationInf
|
||||
}
|
||||
}
|
||||
|
||||
function UpdateObjectiveActive()
|
||||
{
|
||||
// Fix:
|
||||
// ScriptWarning: Accessed None 'KFGRI'
|
||||
// ExtMoviePlayer_HUD Transient.ExtMoviePlayer_HUD_0
|
||||
// Function KFGame.KFGFxMoviePlayer_HUD:UpdateObjectiveActive:00B7
|
||||
if (GetPC() == None || KFGameReplicationInfo(GetPC().WorldInfo.GRI) == None)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Super.UpdateObjectiveActive();
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
WidgetBindings.Remove((WidgetName="SpectatorInfoWidget",WidgetClass=class'KFGFxHUD_SpectatorInfo'))
|
||||
@ -103,4 +117,6 @@ defaultproperties
|
||||
WidgetBindings.Add((WidgetName="PlayerBackpackWidget",WidgetClass=class'ExtHUD_PlayerBackpack'))
|
||||
WidgetBindings.Remove((WidgetName="WeaponSelectContainer",WidgetClass=class'KFGFxHUD_WeaponSelectWidget'))
|
||||
WidgetBindings.Add((WidgetName="WeaponSelectContainer",WidgetClass=class'ExtHUD_WeaponSelectWidget'))
|
||||
WidgetBindings.Remove((WidgetName="ObjectiveContainer",WidgetClass=class'KFGFxHUD_ObjectiveConatiner'))
|
||||
WidgetBindings.Add((WidgetName="ObjectiveContainer",WidgetClass=class'ExtHUD_ObjectiveConatiner'))
|
||||
}
|
@ -111,6 +111,22 @@ function OnMenuOpen(name WidgetPath, KFGFxObject_Menu Widget)
|
||||
PerksMenu.ActionScriptVoid("closeContainer");
|
||||
}
|
||||
|
||||
event OnClose()
|
||||
{
|
||||
// Fix:
|
||||
// ScriptWarning: Accessed None 'CurrentBackgroundMovie'
|
||||
// ExtMoviePlayer_Manager KF-BIOTICSLAB.TheWorld:PersistentLevel.ExtPlayerController_0.ExtMoviePlayer_Manager_0
|
||||
// Function KFGame.KFGFxMoviePlayer_Manager:OnClose:0039
|
||||
if (CurrentBackgroundMovie != None)
|
||||
{
|
||||
Super.OnClose();
|
||||
}
|
||||
else
|
||||
{
|
||||
CloseMenus();
|
||||
}
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
InGamePartyWidgetClass=class'ExtWidget_PartyInGame'
|
||||
|
@ -98,7 +98,6 @@ function AttachWeaponByItemDefinition(int ItemDefinition)
|
||||
|
||||
//setweapon skin
|
||||
WeaponAttachment.SetWeaponSkin(ItemDefinition);
|
||||
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
|
@ -7,4 +7,5 @@ static simulated event bool IsABoss()
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -7,7 +7,6 @@ Class ExtPerkManager extends KFPerk;
|
||||
enum EReplicateState
|
||||
{
|
||||
REP_CustomCharacters,
|
||||
REP_CustomInventory,
|
||||
REP_PerkClasses,
|
||||
REP_Done
|
||||
};
|
||||
@ -451,14 +450,6 @@ function ReplicateTimer()
|
||||
++RepIndex;
|
||||
}
|
||||
break;
|
||||
case REP_CustomInventory: // Replicate custom trader inventory
|
||||
if (!PRIOwner.OnRepNextItem(PRIOwner,RepIndex))
|
||||
{
|
||||
RepIndex = 0;
|
||||
++RepState;
|
||||
}
|
||||
else ++RepIndex;
|
||||
break;
|
||||
case REP_PerkClasses: // Open up all actor channel connections.
|
||||
if (RepIndex>=UserPerks.Length)
|
||||
{
|
||||
|
@ -97,10 +97,13 @@ function CheckPerk()
|
||||
if (KFPlayerReplicationInfo(PlayerReplicationInfo)!=None)
|
||||
{
|
||||
KFPlayerReplicationInfo(PlayerReplicationInfo).NetPerkIndex = 0;
|
||||
if (ActivePerkManager.CurrentPerk != None)
|
||||
{
|
||||
KFPlayerReplicationInfo(PlayerReplicationInfo).CurrentPerkClass = ActivePerkManager.CurrentPerk.BasePerk;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
reliable client function AddAdminCmd(string S)
|
||||
{
|
||||
|
@ -18,29 +18,26 @@ struct FMyCustomChar // Now without constant.
|
||||
}
|
||||
};
|
||||
|
||||
// For custom trader inventory.
|
||||
struct FCustomTraderItem
|
||||
{
|
||||
var class<KFWeaponDefinition> WeaponDef;
|
||||
var class<KFWeapon> WeaponClass;
|
||||
};
|
||||
|
||||
var bool bIsMuted,bInitialPT,bIsDev,bHiddenUser,bClientUseCustom,bClientFirstChar,bClientCharListDone,bClientInitChars;
|
||||
|
||||
enum E_AdminType
|
||||
{
|
||||
AT_Global,
|
||||
AT_Admin,
|
||||
AT_Mod,
|
||||
AT_TMem,
|
||||
AT_VIP,
|
||||
AT_Booster,
|
||||
AT_Player
|
||||
};
|
||||
|
||||
var E_AdminType AdminType;
|
||||
|
||||
var int RespawnCounter;
|
||||
var byte AdminType;
|
||||
var class<Ext_PerkBase> ECurrentPerk;
|
||||
var Ext_PerkBase FCurrentPerk;
|
||||
var int ECurrentPerkLevel,ECurrentPerkPrestige;
|
||||
var ExtPerkManager PerkManager;
|
||||
/* AdminTypes:
|
||||
0 - Super Admin (server owner)
|
||||
1 - Admin
|
||||
2 - Moderator
|
||||
3 - Trusted member
|
||||
4 - VIP
|
||||
*/
|
||||
|
||||
var string TaggedPlayerName;
|
||||
var repnotify string NameTag;
|
||||
var repnotify byte RepLevelProgress;
|
||||
@ -54,10 +51,6 @@ var repnotify FMyCustomChar CustomCharacter;
|
||||
var transient array<ExtCharDataInfo> SaveDataObjects;
|
||||
var transient ExtPlayerReplicationInfo LocalOwnerPRI; // Local playercontroller owner PRI
|
||||
|
||||
// Custom trader inventory
|
||||
var KFGFxObject_TraderItems CustomList;
|
||||
var array<FCustomTraderItem> CustomItems;
|
||||
|
||||
// Supplier data:
|
||||
var transient struct FSupplierData
|
||||
{
|
||||
@ -233,118 +226,28 @@ function UnsetPT()
|
||||
bInitialPT = false;
|
||||
}
|
||||
|
||||
Delegate bool OnRepNextItem(ExtPlayerReplicationInfo PRI, int RepIndex)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
simulated reliable client function ClientAddTraderItem(int Index, FCustomTraderItem Item)
|
||||
{
|
||||
// Make sure to not execute on server.
|
||||
if (WorldInfo.NetMode!=NM_Client && (PlayerController(Owner)==None || LocalPlayer(PlayerController(Owner).Player)==None))
|
||||
return;
|
||||
|
||||
if (CustomList==None)
|
||||
{
|
||||
CustomList = CreateNewList();
|
||||
RecheckGRI();
|
||||
}
|
||||
CustomItems.AddItem(Item);
|
||||
SetWeaponInfo(false,Index,Item,CustomList);
|
||||
}
|
||||
|
||||
simulated static final function KFGFxObject_TraderItems CreateNewList()
|
||||
{
|
||||
local KFGFxObject_TraderItems L;
|
||||
|
||||
L = new class'KFGFxObject_TraderItems';
|
||||
L.SaleItems = L.Default.SaleItems;
|
||||
L.ArmorPrice = L.Default.ArmorPrice;
|
||||
L.GrenadePrice = L.Default.GrenadePrice;
|
||||
|
||||
return L;
|
||||
}
|
||||
|
||||
simulated static final function SetWeaponInfo(bool bDedicated, int Index, FCustomTraderItem Item, KFGFxObject_TraderItems List)
|
||||
{
|
||||
local array<STraderItemWeaponStats> S;
|
||||
local int i;
|
||||
|
||||
if (List.SaleItems.Length<=Index)
|
||||
List.SaleItems.Length = Index+1;
|
||||
|
||||
List.SaleItems[Index].WeaponDef = Item.WeaponDef;
|
||||
List.SaleItems[Index].ClassName = Item.WeaponClass.Name;
|
||||
if (class<KFWeap_DualBase>(Item.WeaponClass)!=None && class<KFWeap_DualBase>(Item.WeaponClass).Default.SingleClass!=None)
|
||||
List.SaleItems[Index].SingleClassName = class<KFWeap_DualBase>(Item.WeaponClass).Default.SingleClass.Name;
|
||||
else List.SaleItems[Index].SingleClassName = '';
|
||||
List.SaleItems[Index].DualClassName = Item.WeaponClass.Default.DualClass!=None ? Item.WeaponClass.Default.DualClass.Name : '';
|
||||
List.SaleItems[Index].AssociatedPerkClasses = Item.WeaponClass.Static.GetAssociatedPerkClasses();
|
||||
List.SaleItems[Index].MaxSpareAmmo = Item.WeaponClass.Default.SpareAmmoCapacity[0];
|
||||
List.SaleItems[Index].MagazineCapacity = Item.WeaponClass.Default.MagazineCapacity[0];
|
||||
List.SaleItems[Index].InitialSpareMags = Item.WeaponClass.Default.InitialSpareMags[0];
|
||||
List.SaleItems[Index].MaxSecondaryAmmo = Item.WeaponClass.Default.MagazineCapacity[1] * Item.WeaponClass.Default.SpareAmmoCapacity[1];
|
||||
List.SaleItems[Index].BlocksRequired = Item.WeaponClass.Default.InventorySize;
|
||||
List.SaleItems[Index].ItemID = Index;
|
||||
|
||||
List.SaleItems[Index].InitialSecondaryAmmo = Item.WeaponClass.Default.InitialSpareMags[1];
|
||||
List.SaleItems[Index].WeaponUpgradeDmgMultiplier[0] = 1.0;
|
||||
for (i = 0;i<Min(Item.WeaponClass.Default.WeaponUpgrades.Length, 5);i++)
|
||||
{
|
||||
List.SaleItems[Index].WeaponUpgradeWeight[i+1] = Item.WeaponClass.Static.GetUpgradeStatAdd(EWUS_Weight, i+1);
|
||||
List.SaleItems[Index].WeaponUpgradeDmgMultiplier[i+1] = Item.WeaponClass.Static.GetUpgradeStatScale(EWUS_Damage0, i+1);
|
||||
}
|
||||
|
||||
if (!bDedicated)
|
||||
{
|
||||
List.SaleItems[Index].SecondaryAmmoImagePath = Item.WeaponClass.Default.SecondaryAmmoTexture!=None ? PathName(Item.WeaponClass.Default.SecondaryAmmoTexture) : "UI_SecondaryAmmo_TEX.GasTank";
|
||||
List.SaleItems[Index].TraderFilter = Item.WeaponClass.Static.GetTraderFilter();
|
||||
List.SaleItems[Index].InventoryGroup = Item.WeaponClass.Default.InventoryGroup;
|
||||
List.SaleItems[Index].GroupPriority = Item.WeaponClass.Default.GroupPriority;
|
||||
Item.WeaponClass.Static.SetTraderWeaponStats(S);
|
||||
List.SaleItems[Index].WeaponStats = S;
|
||||
}
|
||||
}
|
||||
|
||||
simulated function RecheckGRI()
|
||||
{
|
||||
local ExtPlayerController PC;
|
||||
|
||||
if (KFGameReplicationInfo(WorldInfo.GRI)==None)
|
||||
SetTimer(0.1,false,'RecheckGRI');
|
||||
else
|
||||
{
|
||||
KFGameReplicationInfo(WorldInfo.GRI).TraderItems = CustomList;
|
||||
foreach LocalPlayerControllers(class'ExtPlayerController',PC)
|
||||
{
|
||||
if (PC.PurchaseHelper!=None)
|
||||
{
|
||||
PC.PurchaseHelper.TraderItems = CustomList;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
simulated final function bool ShowAdminName()
|
||||
{
|
||||
return (bAdmin || AdminType<255);
|
||||
return (bAdmin || AdminType < AT_Player);
|
||||
}
|
||||
|
||||
simulated function string GetAdminName()
|
||||
{
|
||||
switch (AdminType)
|
||||
{
|
||||
case 0:
|
||||
case AT_Global:
|
||||
return "Super Admin";
|
||||
case 1:
|
||||
case 255:
|
||||
case AT_Admin:
|
||||
case AT_Player: // TODO: Admin is the same as player? WTF? #1
|
||||
return "Admin";
|
||||
case 2:
|
||||
case AT_Mod:
|
||||
return "Mod";
|
||||
case 3:
|
||||
case AT_TMem:
|
||||
return "Trusted Member";
|
||||
case 4:
|
||||
case AT_VIP:
|
||||
return "VIP";
|
||||
case AT_Booster:
|
||||
return "Booster";
|
||||
}
|
||||
}
|
||||
|
||||
@ -352,17 +255,19 @@ simulated function string GetAdminNameAbr()
|
||||
{
|
||||
switch (AdminType)
|
||||
{
|
||||
case 0:
|
||||
case AT_Global:
|
||||
return "S";
|
||||
case 1:
|
||||
case 255:
|
||||
case AT_Admin:
|
||||
case AT_Player: // TODO: Admin is the same as player? WTF? #2
|
||||
return "A";
|
||||
case 2:
|
||||
case AT_Mod:
|
||||
return "M";
|
||||
case 3:
|
||||
case AT_TMem:
|
||||
return "T";
|
||||
case 4:
|
||||
case AT_VIP:
|
||||
return "V";
|
||||
case AT_Booster:
|
||||
return "B";
|
||||
}
|
||||
}
|
||||
|
||||
@ -370,17 +275,19 @@ simulated function string GetAdminColor()
|
||||
{
|
||||
switch (AdminType)
|
||||
{
|
||||
case 0:
|
||||
case AT_Global:
|
||||
return "FF6600";
|
||||
case 1:
|
||||
case 255:
|
||||
case AT_Admin:
|
||||
case AT_Player: // TODO: Admin is the same as player? WTF? #3
|
||||
return "40FFFF";
|
||||
case 2:
|
||||
case AT_Mod:
|
||||
return "FF33FF";
|
||||
case 3:
|
||||
case AT_TMem:
|
||||
return "FF0000";
|
||||
case 4:
|
||||
case AT_VIP:
|
||||
return "FFD700";
|
||||
case AT_Booster:
|
||||
return "32A852";
|
||||
}
|
||||
}
|
||||
|
||||
@ -388,17 +295,19 @@ simulated function color GetAdminColorC()
|
||||
{
|
||||
switch (AdminType)
|
||||
{
|
||||
case 0:
|
||||
case AT_Global:
|
||||
return MakeColor(255,102,0,255);
|
||||
case 1:
|
||||
case 255:
|
||||
case AT_Admin:
|
||||
case AT_Player: // TODO: Admin is the same as player? WTF? #4
|
||||
return MakeColor(64,255,255,255);
|
||||
case 2:
|
||||
case AT_Mod:
|
||||
return MakeColor(255,51,255,255);
|
||||
case 3:
|
||||
case AT_TMem:
|
||||
return MakeColor(255,0,0,255);
|
||||
case 4:
|
||||
case AT_VIP:
|
||||
return MakeColor(255,215,0,255);
|
||||
case AT_Booster:
|
||||
return MakeColor(50,168,82,255);
|
||||
}
|
||||
}
|
||||
|
||||
@ -804,22 +713,25 @@ event BeginState(Name N)
|
||||
switch (N)
|
||||
{
|
||||
case 'Global':
|
||||
AdminType = 0;
|
||||
AdminType = AT_Global;
|
||||
break;
|
||||
case 'Admin':
|
||||
AdminType = 1;
|
||||
AdminType = AT_Admin;
|
||||
break;
|
||||
case 'Mod':
|
||||
AdminType = 2;
|
||||
AdminType = AT_Mod;
|
||||
break;
|
||||
case 'TMem':
|
||||
AdminType = 3;
|
||||
AdminType = AT_TMem;
|
||||
break;
|
||||
case 'VIP':
|
||||
AdminType = 4;
|
||||
AdminType = AT_VIP;
|
||||
break;
|
||||
case 'Booster':
|
||||
AdminType = AT_Booster;
|
||||
break;
|
||||
case 'User':
|
||||
AdminType = 255;
|
||||
AdminType = AT_Player;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -827,6 +739,6 @@ event BeginState(Name N)
|
||||
defaultproperties
|
||||
{
|
||||
RespawnCounter=-1
|
||||
AdminType=255
|
||||
AdminType=AT_Player
|
||||
TaggedPlayerName="Player"
|
||||
}
|
@ -45,6 +45,7 @@ function PlayAnimation()
|
||||
}
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -5,7 +5,7 @@ function SpawnProjectileShield()
|
||||
return;
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
defaultproperties
|
||||
{
|
||||
ExplosionActorClass=class'ExtExplosion_SirenScream'
|
||||
|
||||
|
@ -52,4 +52,5 @@ function SetPerkList()
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
class ExtWeapDef_9mm extends KFWeapDef_9mm
|
||||
abstract;
|
||||
|
||||
DefaultProperties
|
||||
defaultproperties
|
||||
{
|
||||
// Set free ammo
|
||||
AmmoPricePerMag=0
|
||||
|
@ -1,7 +1,7 @@
|
||||
class ExtWeapDef_MedicPistol extends KFWeapDef_MedicPistol
|
||||
abstract;
|
||||
|
||||
DefaultProperties
|
||||
defaultproperties
|
||||
{
|
||||
// Unsellable weapon
|
||||
BuyPrice=0
|
||||
|
@ -1347,5 +1347,4 @@ defaultproperties
|
||||
Skins.Add((Id=5303, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet17_MAT.sports_aa12.Vault_Sports_AA12_1P_Mint_MIC"), MIC_3P="WEP_SkinSet17_MAT.sports_aa12.Vault_Sports_AA12_3P_Mint_MIC", MIC_Pickup="WEP_SkinSet17_MAT.sports_aa12.Vault_Sports_AA12_3P_Pickup_MIC"))
|
||||
Skins.Add((Id=5302, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet17_MAT.sports_aa12.Vault_Sports_AA12_1P_FieldTested_MIC"), MIC_3P="WEP_SkinSet17_MAT.sports_aa12.Vault_Sports_AA12_3P_FieldTested_MIC", MIC_Pickup="WEP_SkinSet17_MAT.sports_aa12.Vault_Sports_AA12_3P_Pickup_MIC"))
|
||||
Skins.Add((Id=5301, Weapondef=class'KFWeapDef_AA12', MIC_1P=("WEP_SkinSet17_MAT.sports_aa12.Vault_Sports_AA12_1P_BattleScarred_MIC"), MIC_3P="WEP_SkinSet17_MAT.sports_aa12.Vault_Sports_AA12_3P_BattleScarred_MIC", MIC_Pickup="WEP_SkinSet17_MAT.sports_aa12.Vault_Sports_AA12_3P_Pickup_MIC"))
|
||||
|
||||
}
|
@ -77,6 +77,6 @@ function GFxObject RefreshSlot(int SlotIndex, KFPlayerReplicationInfo KFPRI)
|
||||
return PlayerInfoObject;
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
defaultproperties
|
||||
{
|
||||
}
|
||||
|
@ -69,7 +69,12 @@ Begin:
|
||||
|
||||
// See if we are close to our owner
|
||||
RecheckOwner:
|
||||
OwnerPawn = Ext_T_MonsterPRI(PlayerReplicationInfo)!=None ? Ext_T_MonsterPRI(PlayerReplicationInfo).OwnerController.Pawn : None;
|
||||
OwnerPawn = None;
|
||||
if (Ext_T_MonsterPRI(PlayerReplicationInfo) != None
|
||||
&& Ext_T_MonsterPRI(PlayerReplicationInfo).OwnerController != None)
|
||||
{
|
||||
OwnerPawn = Ext_T_MonsterPRI(PlayerReplicationInfo).OwnerController.Pawn;
|
||||
}
|
||||
if (OwnerPawn != None)
|
||||
{
|
||||
if (Enemy!=None && LineOfSightTo(OwnerPawn) && LineOfSightTo(Enemy)) // We have sight to our owner and can see enemy, go for it!
|
||||
@ -151,6 +156,6 @@ RecheckOwner:
|
||||
Goto('Begin');
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
defaultproperties
|
||||
{
|
||||
}
|
@ -7,9 +7,10 @@ function SpecialMoveStarted(bool bForced, Name PrevMove)
|
||||
|
||||
function SpecialMoveEnded(Name PrevMove, Name NextMove)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
defaultproperties
|
||||
{
|
||||
Handle=KFSM_Taunt
|
||||
bDisableMovement=true
|
||||
|
@ -1171,10 +1171,10 @@ simulated function float ApplyEffect(name Type, float Value, float Progress)
|
||||
Modifiers[1] = 1.f + (Value*Progress);
|
||||
break;
|
||||
case 'Recoil':
|
||||
Modifiers[2] = 1.f / (1.f+Value*Progress);
|
||||
Modifiers[2] = 1.f - (Value*Progress);
|
||||
break;
|
||||
case 'Spread':
|
||||
Modifiers[3] = 1.f / (1.f+Value*Progress);
|
||||
Modifiers[3] = 1.f - (Value*Progress);
|
||||
break;
|
||||
case 'Rate':
|
||||
Modifiers[4] = 1.f / (1.f+Value*Progress);
|
||||
@ -1191,8 +1191,8 @@ simulated function float ApplyEffect(name Type, float Value, float Progress)
|
||||
}
|
||||
break;
|
||||
case 'KnockDown':
|
||||
Modifiers[7] = FMin(1.f + (Value*Progress),2.f);
|
||||
return (Modifiers[7]-1.f);
|
||||
Modifiers[7] = 1.f + (Value*Progress);
|
||||
break;
|
||||
case 'Welder':
|
||||
Modifiers[8] = 1.f + (Value*Progress);
|
||||
break;
|
||||
@ -1556,8 +1556,8 @@ defaultproperties
|
||||
|
||||
DefPerkStats(0)=(MaxValue=50,CostPerValue=1,StatType="Speed",Progress=0.4)
|
||||
DefPerkStats(1)=(MaxValue=1000,CostPerValue=1,StatType="Damage",Progress=0.5)
|
||||
DefPerkStats(2)=(MaxValue=90,CostPerValue=1,StatType="Recoil",Progress=1)
|
||||
DefPerkStats(3)=(MaxValue=80,CostPerValue=1,StatType="Spread",Progress=0.75)
|
||||
DefPerkStats(2)=(MaxValue=100,CostPerValue=1,StatType="Recoil",Progress=1)
|
||||
DefPerkStats(3)=(MaxValue=100,CostPerValue=1,StatType="Spread",Progress=1)
|
||||
DefPerkStats(4)=(MaxValue=1000,CostPerValue=1,StatType="Rate",Progress=0.5)
|
||||
DefPerkStats(5)=(MaxValue=1000,CostPerValue=1,StatType="Reload",Progress=0.5)
|
||||
DefPerkStats(6)=(MaxValue=150,CostPerValue=1,StatType="Health",Progress=1)
|
||||
|
@ -1,5 +1,48 @@
|
||||
Class Ext_PerkFirebug extends Ext_PerkBase;
|
||||
|
||||
var bool bUseInferno,bUsePyromaniac,bUseGroundFire,bUseHeatWave;
|
||||
|
||||
replication
|
||||
{
|
||||
// Things the server should send to the client.
|
||||
if (true)
|
||||
bUseInferno,bUsePyromaniac,bUseGroundFire,bUseHeatWave;
|
||||
}
|
||||
|
||||
simulated final private function bool IsInfernoActive()
|
||||
{
|
||||
return bUseInferno && WorldInfo.TimeDilation < 1.f;
|
||||
}
|
||||
|
||||
simulated function bool GetIsUberAmmoActive(KFWeapon KFW)
|
||||
{
|
||||
return bUsePyromaniac && IsWeaponOnPerk(KFW) && WorldInfo.TimeDilation < 1.f;
|
||||
}
|
||||
|
||||
simulated function float GetZedTimeModifier(KFWeapon W)
|
||||
{
|
||||
local name StateName;
|
||||
|
||||
if (bUsePyromaniac && IsWeaponOnPerk(W))
|
||||
{
|
||||
StateName = W.GetStateName();
|
||||
if (BasePerk.Default.ZedTimeModifyingStates.Find(StateName) != INDEX_NONE || StateName == 'Reloading')
|
||||
return 1.f;
|
||||
}
|
||||
|
||||
return 0.f;
|
||||
}
|
||||
|
||||
simulated final private function bool IsGroundFireActive()
|
||||
{
|
||||
return bUseGroundFire;
|
||||
}
|
||||
|
||||
simulated final private function bool IsHeatWaveActive()
|
||||
{
|
||||
return bUseHeatWave;
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
PerkIcon=Texture2D'UI_PerkIcons_TEX.UI_PerkIcon_Firebug'
|
||||
@ -7,6 +50,10 @@ defaultproperties
|
||||
DefTraitList.Add(class'Ext_TraitNapalm')
|
||||
DefTraitList.Add(class'Ext_TraitFireExplode')
|
||||
DefTraitList.Add(class'Ext_TraitFireRange')
|
||||
DefTraitList.Add(class'Ext_TraitInferno')
|
||||
DefTraitList.Add(class'Ext_TraitPyromaniac')
|
||||
DefTraitList.Add(class'Ext_TraitGroundFire')
|
||||
DefTraitList.Add(class'Ext_TraitHeatWave')
|
||||
BasePerk=class'KFPerk_Firebug'
|
||||
|
||||
PrimaryMelee=class'KFWeap_Knife_Firebug'
|
||||
|
@ -2,4 +2,5 @@ class Ext_TGroupMonster extends Ext_TGroupBase;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -33,4 +33,5 @@ static final function byte GetMaxLimit(Ext_PerkBase Perk)
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -2,4 +2,5 @@ class Ext_TGroupZEDTime extends Ext_TGroupBase;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -8,6 +8,8 @@ var bool bTeleporting,bIsDelayed;
|
||||
|
||||
function bool CanResPlayer(KFPawn_Human Other, byte Level)
|
||||
{
|
||||
local Actor SpawnPoint;
|
||||
|
||||
if (bTeleporting)
|
||||
{
|
||||
if (LastDied!=None)
|
||||
@ -23,11 +25,17 @@ function bool CanResPlayer(KFPawn_Human Other, byte Level)
|
||||
else if (Level==1 && Rand(2)==0)
|
||||
return false;
|
||||
|
||||
LastDied = Other;
|
||||
bTeleporting = true;
|
||||
if (SpawnPointer==None)
|
||||
SpawnPointer = class'ExtSpawnPointHelper'.Static.FindHelper(WorldInfo);
|
||||
ResPoint = SpawnPointer.PickBestSpawn().Location;
|
||||
|
||||
SpawnPoint = SpawnPointer.PickBestSpawn();
|
||||
if (SpawnPoint == None)
|
||||
return false;
|
||||
|
||||
LastDied = Other;
|
||||
bTeleporting = true;
|
||||
|
||||
ResPoint = SpawnPoint.Location;
|
||||
LastDied.FindSpot(vect(36,36,86),ResPoint);
|
||||
if (VSizeSq(LastDied.Location-ResPoint)<1.f) // Prevent division by zero errors in future.
|
||||
ResPoint.Z+=5;
|
||||
|
@ -24,4 +24,5 @@ function Timer()
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -194,7 +194,7 @@ simulated function Destroyed()
|
||||
}
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
defaultproperties
|
||||
{
|
||||
InteractionIndex=IMT_ReceiveAmmo
|
||||
RemoteRole=ROLE_SimulatedProxy
|
||||
|
@ -8,4 +8,5 @@ var class<Ext_TraitBase> TraitClass;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -15,7 +15,7 @@ static function bool MeetsRequirements(byte Lvl, Ext_PerkBase Perk)
|
||||
{
|
||||
local int i;
|
||||
|
||||
if (Perk.CurrentLevel<Default.MinLevel || Perk.CurrentPrestige<3)
|
||||
if (Perk.CurrentLevel<Default.MinLevel || Perk.CurrentPrestige<1)
|
||||
return false;
|
||||
|
||||
if (Lvl==0)
|
||||
|
16
ServerExt/Classes/Ext_TraitGroundFire.uc
Normal file
16
ServerExt/Classes/Ext_TraitGroundFire.uc
Normal file
@ -0,0 +1,16 @@
|
||||
Class Ext_TraitGroundFire extends Ext_TraitBase;
|
||||
|
||||
static function TraitActivate(Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data)
|
||||
{
|
||||
Ext_PerkFirebug(Perk).bUseGroundFire = true;
|
||||
}
|
||||
|
||||
static function TraitDeActivate(Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data)
|
||||
{
|
||||
Ext_PerkFirebug(Perk).bUseGroundFire = false;
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
DefLevelCosts(0)=50
|
||||
}
|
16
ServerExt/Classes/Ext_TraitHeatWave.uc
Normal file
16
ServerExt/Classes/Ext_TraitHeatWave.uc
Normal file
@ -0,0 +1,16 @@
|
||||
Class Ext_TraitHeatWave extends Ext_TraitBase;
|
||||
|
||||
static function TraitActivate(Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data)
|
||||
{
|
||||
Ext_PerkFirebug(Perk).bUseHeatWave = true;
|
||||
}
|
||||
|
||||
static function TraitDeActivate(Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data)
|
||||
{
|
||||
Ext_PerkFirebug(Perk).bUseHeatWave = false;
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
DefLevelCosts(0)=50
|
||||
}
|
31
ServerExt/Classes/Ext_TraitInferno.uc
Normal file
31
ServerExt/Classes/Ext_TraitInferno.uc
Normal file
@ -0,0 +1,31 @@
|
||||
Class Ext_TraitInferno extends Ext_TraitBase;
|
||||
|
||||
var localized string GroupDescription;
|
||||
|
||||
function string GetPerkDescription()
|
||||
{
|
||||
local string S;
|
||||
|
||||
S = Super.GetPerkDescription();
|
||||
S $= "|"$GroupDescription;
|
||||
return S;
|
||||
}
|
||||
|
||||
static function TraitActivate(Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data)
|
||||
{
|
||||
Ext_PerkFirebug(Perk).bUseInferno = true;
|
||||
}
|
||||
|
||||
static function TraitDeActivate(Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data)
|
||||
{
|
||||
Ext_PerkFirebug(Perk).bUseInferno = false;
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
SupportedPerk=class'Ext_PerkFirebug'
|
||||
TraitGroup=class'Ext_TGroupZEDTime'
|
||||
NumLevels=1
|
||||
DefLevelCosts(0)=50
|
||||
//DefMinLevel=65
|
||||
}
|
31
ServerExt/Classes/Ext_TraitPyromaniac.uc
Normal file
31
ServerExt/Classes/Ext_TraitPyromaniac.uc
Normal file
@ -0,0 +1,31 @@
|
||||
Class Ext_TraitPyromaniac extends Ext_TraitBase;
|
||||
|
||||
var localized string GroupDescription;
|
||||
|
||||
function string GetPerkDescription()
|
||||
{
|
||||
local string S;
|
||||
|
||||
S = Super.GetPerkDescription();
|
||||
S $= "|"$GroupDescription;
|
||||
return S;
|
||||
}
|
||||
|
||||
static function TraitActivate(Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data)
|
||||
{
|
||||
Ext_PerkFirebug(Perk).bUsePyromaniac = true;
|
||||
}
|
||||
|
||||
static function TraitDeActivate(Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data)
|
||||
{
|
||||
Ext_PerkFirebug(Perk).bUsePyromaniac = false;
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
SupportedPerk=class'Ext_PerkFirebug'
|
||||
TraitGroup=class'Ext_TGroupZEDTime'
|
||||
NumLevels=1
|
||||
DefLevelCosts(0)=50
|
||||
//DefMinLevel=65
|
||||
}
|
@ -4,17 +4,17 @@ var() Texture2D SupplyIcon;
|
||||
|
||||
static function ApplyEffectOn(KFPawn_Human Player, Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data)
|
||||
{
|
||||
Ext_TraitSupplyData(Data).SpawnSupplier(Player);
|
||||
if (Data != None) Ext_TraitSupplyData(Data).SpawnSupplier(Player);
|
||||
}
|
||||
|
||||
static function CancelEffectOn(KFPawn_Human Player, Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data)
|
||||
{
|
||||
Ext_TraitSupplyData(Data).RemoveSupplier();
|
||||
if (Data != None) Ext_TraitSupplyData(Data).RemoveSupplier();
|
||||
}
|
||||
|
||||
static function PlayerDied(Ext_PerkBase Perk, byte Level, optional Ext_TraitDataStore Data)
|
||||
{
|
||||
Ext_TraitSupplyData(Data).RemoveSupplier();
|
||||
if (Data != None) Ext_TraitSupplyData(Data).RemoveSupplier();
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
|
@ -59,4 +59,5 @@ function PreClientTravel(string PendingURL, ETravelType TravelType, bool bIsSeam
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -298,7 +298,7 @@ event PostRender()
|
||||
EPRI = ExtPlayerReplicationInfo(KFPlayerOwner.PlayerReplicationInfo);
|
||||
else if (EPRI.RespawnCounter>0)
|
||||
DrawRespawnCounter();
|
||||
bMeAdmin = (EPRI!=None && EPRI.AdminType<=1);
|
||||
bMeAdmin = (EPRI != None && EPRI.AdminType <= AT_Admin);
|
||||
if (KillMessages.Length>0)
|
||||
RenderKillMsg();
|
||||
if (DeathMessages.Length>0)
|
||||
|
@ -53,4 +53,5 @@ function DrawMenu()
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -90,4 +90,5 @@ function HandleMouseClick(bool bRight);
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -56,4 +56,5 @@ function PreDraw()
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -1,928 +0,0 @@
|
||||
//====================================================================
|
||||
// HTML Text box, written by Marco
|
||||
// Simply call SetContents to change window contents.
|
||||
// Only callback available is for LaunchKFURL.
|
||||
// ====================================================================
|
||||
class KFGUI_HTMLTextBox extends KFGUI_MultiComponent;
|
||||
|
||||
struct FTextLine
|
||||
{
|
||||
var string Text,URL;
|
||||
var color Color,ALColor;
|
||||
var Font Font;
|
||||
var float FontScale;
|
||||
var byte Align,FontSize;
|
||||
var int X,Y,XS,YS,Tab,TOffset;
|
||||
var byte LineSkips;
|
||||
var array<int> ImgList;
|
||||
var bool bHasURL,bSplit;
|
||||
};
|
||||
var array<FTextLine> Lines;
|
||||
|
||||
struct FImageEntry
|
||||
{
|
||||
var Surface Img;
|
||||
var int X,Y,XS,YS,YOffset,XOffset;
|
||||
var byte Align,Style;
|
||||
};
|
||||
var array<FImageEntry> Images;
|
||||
|
||||
var FImageEntry BgImage;
|
||||
var float OldXSize,OldYSize;
|
||||
var int YSize,HoverOverLinkLine,OldHoverLine;
|
||||
var() Color BGColor,WhiteColor,BlueColor,RedColor;
|
||||
var KFGUI_ScrollBarV MyScrollBar;
|
||||
var string TitleString;
|
||||
var int CurTab;
|
||||
var byte DefaultFontSize;
|
||||
var bool bNeedsInit,bHasSplitLines,bNeedScrollbar;
|
||||
|
||||
function InitMenu()
|
||||
{
|
||||
Super.InitMenu();
|
||||
|
||||
MyScrollBar = KFGUI_ScrollBarV(FindComponentID('Scrollbar'));
|
||||
}
|
||||
|
||||
final function int AddText( string Input, color TextColor, byte TextAlign, byte FontSize, out byte NumSkips )
|
||||
{
|
||||
local int i;
|
||||
|
||||
i = Lines.Length;
|
||||
Lines.Length = i+1;
|
||||
Lines[i].Text = Input;
|
||||
Lines[i].Color = TextColor;
|
||||
Lines[i].Align = TextAlign;
|
||||
Lines[i].FontSize = FontSize;
|
||||
Lines[i].LineSkips = NumSkips;
|
||||
Lines[i].Tab = CurTab;
|
||||
NumSkips = 0;
|
||||
return i;
|
||||
}
|
||||
final function string ParseLinkType( string URL )
|
||||
{
|
||||
if( InStr(URL,"//")>0 )
|
||||
return URL;
|
||||
if( Left(URL,4)~="ftp." )
|
||||
return "ftp://"$URL;
|
||||
return "http://"$URL;
|
||||
}
|
||||
final function AddImage( string Input )
|
||||
{
|
||||
local string Temp;
|
||||
local byte Align,Sty;
|
||||
local Material M;
|
||||
local int X,Y,XS,YS,i,j,z;
|
||||
|
||||
Align = 3;
|
||||
Temp = GetOption(Input, "ALIGN=");
|
||||
if (Temp != "")
|
||||
{
|
||||
switch( Caps(Temp) )
|
||||
{
|
||||
case "LEFT":
|
||||
case "0":
|
||||
Align = 0;
|
||||
break;
|
||||
case "CENTER":
|
||||
case "1":
|
||||
Align = 1;
|
||||
break;
|
||||
case "RIGHT":
|
||||
case "2":
|
||||
Align = 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
Temp = GetOption(Input, "STYLE=");
|
||||
if (Temp != "")
|
||||
{
|
||||
switch( Caps(Temp) )
|
||||
{
|
||||
case "NORMAL":
|
||||
case "0":
|
||||
Sty = 0;
|
||||
break;
|
||||
case "STRETCH":
|
||||
case "1":
|
||||
Sty = 1;
|
||||
break;
|
||||
case "TILEDX":
|
||||
case "2":
|
||||
Sty = 2;
|
||||
break;
|
||||
case "TILEDY":
|
||||
case "3":
|
||||
Sty = 3;
|
||||
break;
|
||||
case "TILED":
|
||||
case "4":
|
||||
Sty = 4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
Temp = GetOption(Input, "SRC=");
|
||||
if (Temp != "")
|
||||
M = Surface(DynamicLoadObject(Temp,Class'Surface'));
|
||||
if( M==None )
|
||||
M = class'Canvas'.Default.DefaultTexture;
|
||||
X = int(GetOption(Input, "VSPACE="));
|
||||
Y = int(GetOption(Input, "HSPACE="));
|
||||
XS = int(GetOption(Input, "WIDTH="));
|
||||
YS = int(GetOption(Input, "HEIGHT="));
|
||||
|
||||
if( XS==0 )
|
||||
XS = M.GetSurfaceWidth();
|
||||
if( YS==0 )
|
||||
YS = M.GetSurfaceHeight();
|
||||
|
||||
i = Images.Length;
|
||||
Images.Length = i+1;
|
||||
Images[i].Img = M;
|
||||
Images[i].XOffset = X;
|
||||
Images[i].YOffset = Y;
|
||||
Images[i].XS = XS;
|
||||
Images[i].YS = YS;
|
||||
Images[i].Style = Sty;
|
||||
Images[i].Align = Align;
|
||||
j = Lines.Length-1;
|
||||
z = Lines[j].ImgList.Length;
|
||||
Lines[j].ImgList.Length = z+1;
|
||||
Lines[j].ImgList[z] = i;
|
||||
}
|
||||
final function SetContents( string Input )
|
||||
{
|
||||
local string LeftText,HTML,RightText,Output,Temp,Link;
|
||||
local int Index;
|
||||
local color TextColor,LinkColor,ALinkColor,OrgTextColor;
|
||||
local byte Alignment,FontScaler,NextLineSkips;
|
||||
|
||||
CurTab = 0;
|
||||
BGColor.A = 0;
|
||||
BgImage.Img = None;
|
||||
Lines.Length = 0;
|
||||
Images.Length = 0;
|
||||
TitleString = "";
|
||||
bHasSplitLines = false;
|
||||
bNeedsInit = true;
|
||||
|
||||
// First remove new liners
|
||||
Input = Repl(Input, Chr(13)$Chr(10), "");
|
||||
Input = Repl(Input, Chr(13), "");
|
||||
Input = Repl(Input, Chr(10), "");
|
||||
Input = Repl(Input, Chr(9), " ");
|
||||
Input = Repl(Input, "\\n", "<BR>");
|
||||
|
||||
TextColor = WhiteColor;
|
||||
OrgTextColor = WhiteColor;
|
||||
LinkColor = BlueColor;
|
||||
ALinkColor = RedColor;
|
||||
FontScaler = 3;
|
||||
DefaultFontSize = 3;
|
||||
Index = -1;
|
||||
|
||||
while (Input != "")
|
||||
{
|
||||
ParseHTML(Input, LeftText, HTML, RightText);
|
||||
|
||||
switch (GetTag(HTML))
|
||||
{
|
||||
// multiline HTML tags
|
||||
case "P":
|
||||
Output $= LeftText;
|
||||
if( Output!="" )
|
||||
{
|
||||
Index = AddText(Output,TextColor,Alignment,FontScaler,NextLineSkips);
|
||||
NextLineSkips = 2;
|
||||
Output = "";
|
||||
}
|
||||
else ++NextLineSkips;
|
||||
break;
|
||||
case "BR":
|
||||
Output $= LeftText;
|
||||
if( Output!="" )
|
||||
{
|
||||
Index = AddText(Output,TextColor,Alignment,FontScaler,NextLineSkips);
|
||||
NextLineSkips = 1;
|
||||
Output = "";
|
||||
}
|
||||
else ++NextLineSkips;
|
||||
break;
|
||||
case "BODY":
|
||||
Temp = GetOption(HTML, "BGCOLOR=");
|
||||
if (Temp != "")
|
||||
BGColor = ParseColor(Temp);
|
||||
|
||||
Temp = GetOption(HTML, "LINK=");
|
||||
if (Temp != "")
|
||||
LinkColor = ParseColor(Temp);
|
||||
|
||||
Temp = GetOption(HTML, "ALINK=");
|
||||
if (Temp != "")
|
||||
ALinkColor = ParseColor(Temp);
|
||||
|
||||
Temp = GetOption(HTML, "TEXT=");
|
||||
if (Temp != "")
|
||||
{
|
||||
TextColor = ParseColor(Temp);
|
||||
OrgTextColor = TextColor;
|
||||
}
|
||||
|
||||
Temp = GetOption(HTML, "SIZE=");
|
||||
if (Temp != "")
|
||||
{
|
||||
FontScaler = int(Temp);
|
||||
DefaultFontSize = FontScaler;
|
||||
}
|
||||
|
||||
Temp = GetOption(Input, "IMG=");
|
||||
if (Temp != "")
|
||||
{
|
||||
if( BGColor.A==0 )
|
||||
BGColor = Class'Hud'.Default.WhiteColor;
|
||||
BgImage.Img = Surface(DynamicLoadObject(Temp,Class'Surface'));
|
||||
if( BgImage.Img==None )
|
||||
BgImage.Img = Class'Canvas'.Default.DefaultTexture;
|
||||
BgImage.X = BgImage.Img.GetSurfaceWidth();
|
||||
BgImage.Y = BgImage.Img.GetSurfaceHeight();
|
||||
switch( Caps(GetOption(Input, "IMGSTYLE=")) )
|
||||
{
|
||||
case "TILED":
|
||||
BgImage.XS = BgImage.X;
|
||||
BgImage.YS = BgImage.Y;
|
||||
BgImage.Style = 1;
|
||||
Temp = GetOption(Input, "TILEX=");
|
||||
if (Temp != "")
|
||||
BgImage.XS = int(Temp);
|
||||
Temp = GetOption(Input, "TILEY=");
|
||||
if (Temp != "")
|
||||
BgImage.YS = int(Temp);
|
||||
break;
|
||||
case "FITX":
|
||||
BgImage.Style = 2;
|
||||
break;
|
||||
case "FITY":
|
||||
BgImage.Style = 3;
|
||||
break;
|
||||
default: // FIT
|
||||
BgImage.Style = 0;
|
||||
}
|
||||
BgImage.Align = 0;
|
||||
if( GetOption(Input, "IMGLOCK=")=="0" )
|
||||
BgImage.Align = 1;
|
||||
}
|
||||
Output $= LeftText;
|
||||
break;
|
||||
case "CENTER":
|
||||
Output $= LeftText;
|
||||
if ( Output!="" )
|
||||
{
|
||||
Index = AddText(Output,TextColor,Alignment,FontScaler,NextLineSkips);
|
||||
Output = "";
|
||||
}
|
||||
NextLineSkips = Max(NextLineSkips,1);
|
||||
Alignment = 1;
|
||||
break;
|
||||
case "RIGHT":
|
||||
Output $= LeftText;
|
||||
if ( Output!="" )
|
||||
{
|
||||
Index = AddText(Output,TextColor,Alignment,FontScaler,NextLineSkips);
|
||||
Output = "";
|
||||
}
|
||||
NextLineSkips = Max(NextLineSkips,1);
|
||||
Alignment = 2;
|
||||
break;
|
||||
case "/CENTER":
|
||||
case "/RIGHT":
|
||||
Index = AddText(Output $ LeftText,TextColor,Alignment,FontScaler,NextLineSkips);
|
||||
++NextLineSkips;
|
||||
Alignment = 0;
|
||||
Output = "";
|
||||
break;
|
||||
// Inline HTML tags
|
||||
case "H1":
|
||||
Output $= LeftText;
|
||||
if ( Output!="" )
|
||||
{
|
||||
Index = AddText(Output,TextColor,Alignment,FontScaler,NextLineSkips);
|
||||
Output = "";
|
||||
}
|
||||
NextLineSkips = Max(NextLineSkips,1);
|
||||
FontScaler = 5;
|
||||
Alignment = 1;
|
||||
break;
|
||||
case "/H1":
|
||||
Index = AddText(Output $ LeftText,TextColor,Alignment,FontScaler,NextLineSkips);
|
||||
++NextLineSkips;
|
||||
Output = "";
|
||||
FontScaler = DefaultFontSize;
|
||||
Alignment = 0;
|
||||
break;
|
||||
case "FONT":
|
||||
Output $= LeftText;
|
||||
if( Output!="" )
|
||||
{
|
||||
Index = AddText(Output,TextColor,Alignment,FontScaler,NextLineSkips);
|
||||
Output = "";
|
||||
}
|
||||
Temp = GetOption(HTML, "COLOR=");
|
||||
if (Temp != "")
|
||||
TextColor = ParseColor(Temp);
|
||||
Temp = GetOption(HTML, "SIZE=");
|
||||
if (Temp != "")
|
||||
FontScaler = int(Temp);
|
||||
break;
|
||||
case "/FONT":
|
||||
Output $= LeftText;
|
||||
if( Output!="" )
|
||||
{
|
||||
Index = AddText(Output,TextColor,Alignment,FontScaler,NextLineSkips);
|
||||
Output = "";
|
||||
}
|
||||
TextColor = OrgTextColor;
|
||||
FontScaler = DefaultFontSize;
|
||||
break;
|
||||
case "TAB":
|
||||
Output $= LeftText;
|
||||
if( Output!="" )
|
||||
{
|
||||
Index = AddText(Output,TextColor,Alignment,FontScaler,NextLineSkips);
|
||||
Output = "";
|
||||
}
|
||||
CurTab = int(GetOption(HTML, "X="));
|
||||
break;
|
||||
case "/TAB":
|
||||
Output $= LeftText;
|
||||
if( Output!="" )
|
||||
{
|
||||
Index = AddText(Output,TextColor,Alignment,FontScaler,NextLineSkips);
|
||||
Output = "";
|
||||
}
|
||||
CurTab = 0;
|
||||
break;
|
||||
case "TITLE":
|
||||
Output $= LeftText;
|
||||
break;
|
||||
case "/TITLE":
|
||||
TitleString = LeftText;
|
||||
break;
|
||||
case "A":
|
||||
Output $= LeftText;
|
||||
if( Output!="" )
|
||||
{
|
||||
Index = AddText(Output,TextColor,Alignment,FontScaler,NextLineSkips);
|
||||
Output = "";
|
||||
}
|
||||
Link = GetOption(HTML, "HREF=");
|
||||
break;
|
||||
case "/A":
|
||||
Output $= LeftText;
|
||||
Index = AddText(Output,LinkColor,Alignment,FontScaler,NextLineSkips);
|
||||
Lines[Index].ALColor = ALinkColor;
|
||||
Lines[Index].bHasURL = true;
|
||||
if( Link=="" )
|
||||
Lines[Index].URL = ParseLinkType(Output);
|
||||
else Lines[Index].URL = ParseLinkType(Link);
|
||||
Output = "";
|
||||
FontScaler = DefaultFontSize;
|
||||
Alignment = 0;
|
||||
break;
|
||||
case "IMG":
|
||||
Output $= LeftText;
|
||||
if( Output!="" || NextLineSkips>0 )
|
||||
AddText(Output,TextColor,Alignment,FontScaler,NextLineSkips);
|
||||
Output = "";
|
||||
AddImage(HTML);
|
||||
break;
|
||||
default:
|
||||
Output = Output $ LeftText;
|
||||
break;
|
||||
}
|
||||
Input = RightText;
|
||||
}
|
||||
AddText(Output,TextColor,Alignment,FontScaler,NextLineSkips);
|
||||
}
|
||||
|
||||
// Get the next HTML tag, the text before it and everthing after it.
|
||||
final function ParseHTML(string Input, out string LeftText, out string HTML, out string RightText)
|
||||
{
|
||||
local int i;
|
||||
|
||||
i = InStr(Input, "<");
|
||||
if (i == -1)
|
||||
{
|
||||
LeftText = Input;
|
||||
HTML = "";
|
||||
RightText = "";
|
||||
return;
|
||||
}
|
||||
|
||||
LeftText = Left(Input, i);
|
||||
HTML = Mid(Input, i);
|
||||
|
||||
i = InStr(HTML, ">");
|
||||
if (i == -1)
|
||||
{
|
||||
RightText = "";
|
||||
return;
|
||||
}
|
||||
|
||||
RightText = Mid(HTML, i+1);
|
||||
HTML = Left(HTML, i+1);
|
||||
}
|
||||
final function string GetTag(string HTML)
|
||||
{
|
||||
local int i;
|
||||
|
||||
if (HTML == "")
|
||||
return "";
|
||||
|
||||
HTML = Mid(HTML, 1); // lose <
|
||||
|
||||
i = FirstMatching(InStr(HTML, ">"), InStr(HTML, " "));
|
||||
if (i == -1)
|
||||
return Caps(HTML);
|
||||
else
|
||||
return Caps(Left(HTML, i));
|
||||
}
|
||||
final function string GetOption(string HTML, string Option)
|
||||
{
|
||||
local int i, j;
|
||||
local string s;
|
||||
|
||||
i = InStr(Caps(HTML), Caps(Option));
|
||||
|
||||
if (i == 1 || Mid(HTML, i-1, 1) == " ")
|
||||
{
|
||||
s = Mid(HTML, i+Len(Option));
|
||||
j = FirstMatching(InStr(s, ">"), InStr(s, " "));
|
||||
s = Left(s, j);
|
||||
|
||||
if (Left(s, 1) == "\"")
|
||||
s = Mid(s, 1);
|
||||
|
||||
if (Right(s, 1) == "\"")
|
||||
s = Left(s, Len(s) - 1);
|
||||
|
||||
return s;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
final function int FirstMatching(int i, int j)
|
||||
{
|
||||
if (i == -1)
|
||||
return j;
|
||||
if (j == -1)
|
||||
return i;
|
||||
return Min(i, j);
|
||||
}
|
||||
final function Color ParseColor(string S)
|
||||
{
|
||||
local Color C;
|
||||
local int i;
|
||||
|
||||
S = Caps(S);
|
||||
if (Left(S, 1) == "#")
|
||||
{
|
||||
C.R = (GetHexDigit(Mid(S, 1, 1)) << 4) + GetHexDigit(Mid(S, 2, 1));
|
||||
C.G = (GetHexDigit(Mid(S, 3, 1)) << 4) + GetHexDigit(Mid(S, 4, 1));
|
||||
C.B = (GetHexDigit(Mid(S, 5, 1)) << 4) + GetHexDigit(Mid(S, 6, 1));
|
||||
}
|
||||
else if (Left(S, 4) == "RGB(")
|
||||
{
|
||||
S = Mid(S, 4);
|
||||
i = InStr(S,",");
|
||||
C.R = int(Left(S,i));
|
||||
S = Mid(S,i+1);
|
||||
i = InStr(S,",");
|
||||
C.G = int(Left(S,i));
|
||||
C.B = int(Mid(S,i+1));
|
||||
}
|
||||
else
|
||||
{
|
||||
switch( S )
|
||||
{
|
||||
case "RED":
|
||||
C.R = 255;
|
||||
C.G = 0;
|
||||
C.B = 0;
|
||||
break;
|
||||
case "BLUE":
|
||||
C.R = 0;
|
||||
C.G = 0;
|
||||
C.B = 255;
|
||||
break;
|
||||
case "GREEN":
|
||||
C.R = 0;
|
||||
C.G = 255;
|
||||
C.B = 0;
|
||||
break;
|
||||
case "YELLOW":
|
||||
C.R = 255;
|
||||
C.G = 255;
|
||||
C.B = 0;
|
||||
break;
|
||||
case "BLACK":
|
||||
C.R = 0;
|
||||
C.G = 0;
|
||||
C.B = 0;
|
||||
break;
|
||||
default: // WHITE
|
||||
C.R = 255;
|
||||
C.G = 255;
|
||||
C.B = 255;
|
||||
}
|
||||
}
|
||||
C.A = 255;
|
||||
|
||||
return C;
|
||||
}
|
||||
final function byte GetHexDigit(string D)
|
||||
{
|
||||
local byte i;
|
||||
|
||||
i = Asc(D);
|
||||
if( i>=48 && i<=57 ) // i>='0' && i<='9'
|
||||
return (i-48); // i-'0'
|
||||
return Min(i-55,15); // i-('A'-10)
|
||||
}
|
||||
|
||||
final function SplitLine( int iLine, int iOffset )
|
||||
{
|
||||
local int i;
|
||||
local string S;
|
||||
|
||||
++iLine;
|
||||
Lines.Insert(iLine,1);
|
||||
S = Lines[iLine-1].Text;
|
||||
for( i=iOffset; i<Len(S); ++i )
|
||||
if( Mid(S,i,1)!=" " )
|
||||
break;
|
||||
Lines[iLine].Text = Mid(S,i);
|
||||
Lines[iLine-1].Text = Left(S,iOffset);
|
||||
Lines[iLine].URL = Lines[iLine-1].URL;
|
||||
Lines[iLine].Color = Lines[iLine-1].Color;
|
||||
Lines[iLine].ALColor = Lines[iLine-1].ALColor;
|
||||
Lines[iLine].Align = Lines[iLine-1].Align;
|
||||
Lines[iLine].FontSize = Lines[iLine-1].FontSize;
|
||||
Lines[iLine].Tab = Lines[iLine-1].Tab;
|
||||
Lines[iLine].LineSkips = 1;
|
||||
Lines[iLine].bHasURL = Lines[iLine-1].bHasURL;
|
||||
Lines[iLine].bSplit = true;
|
||||
bHasSplitLines = true;
|
||||
}
|
||||
final protected function InitHTMLArea()
|
||||
{
|
||||
local float XS,YS;
|
||||
local int i,j,X,Y,iStart,BestHeight,FontSize,PrevY,Remain,iLastWord,iLen,z,ImgHeight;
|
||||
|
||||
// Used to detect resolution changes when text needs realignment.
|
||||
OldXSize = CompPos[2];
|
||||
OldYSize = CompPos[3];
|
||||
|
||||
// Merge splitted lines again
|
||||
if( bHasSplitLines )
|
||||
{
|
||||
bHasSplitLines = false;
|
||||
for( i=1; i<Lines.Length; ++i )
|
||||
{
|
||||
if( Lines[i].bSplit )
|
||||
{
|
||||
Lines[i-1].Text @= Lines[i].Text;
|
||||
Lines.Remove(i--,1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Setup background image scaling
|
||||
if( BgImage.Img!=None )
|
||||
{
|
||||
switch( BgImage.Style )
|
||||
{
|
||||
case 1: // Tiled
|
||||
if( BgImage.X==BgImage.XS )
|
||||
BgImage.XOffset = Canvas.ClipX;
|
||||
else
|
||||
{
|
||||
XS = Canvas.ClipX / float(BgImage.XS) * float(BgImage.X);
|
||||
BgImage.XOffset = XS;
|
||||
}
|
||||
if( BgImage.Y==BgImage.YS )
|
||||
BgImage.YOffset = Canvas.ClipY;
|
||||
else
|
||||
{
|
||||
XS = Canvas.ClipY / float(BgImage.YS) * float(BgImage.Y);
|
||||
BgImage.YOffset = XS;
|
||||
}
|
||||
break;
|
||||
case 2: // Fit X
|
||||
XS = Canvas.ClipY * (Canvas.ClipX / float(BgImage.X));
|
||||
BgImage.YS = XS;
|
||||
break;
|
||||
case 3: // Fit Y
|
||||
XS = Canvas.ClipX * (Canvas.ClipY / float(BgImage.Y));
|
||||
BgImage.XS = XS;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
FontSize = Owner.CurrentStyle.DefaultFontSize;
|
||||
|
||||
Canvas.SetPos(0,0);
|
||||
if( Lines.Length>0 )
|
||||
{
|
||||
while( true )
|
||||
{
|
||||
if( i>=Lines.Length || (i>0 && Lines[i].LineSkips>0) )
|
||||
{
|
||||
for( j=iStart; j<i; ++j )
|
||||
{
|
||||
switch( Lines[j].Align )
|
||||
{
|
||||
case 0: // Left
|
||||
Lines[j].X = Lines[j].TOffset;
|
||||
break;
|
||||
case 1: // Center
|
||||
Lines[j].X = (Canvas.ClipX-X+Lines[j].TOffset)/2;
|
||||
break;
|
||||
case 2: // Right
|
||||
Lines[j].X = Canvas.ClipX-X+Lines[j].TOffset;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( i>=Lines.Length )
|
||||
break;
|
||||
X = 0;
|
||||
iStart = i;
|
||||
PrevY = BestHeight;
|
||||
BestHeight = 0;
|
||||
}
|
||||
if( Lines[i].FontSize>=247 )
|
||||
Lines[i].Font = Owner.CurrentStyle.PickFont(Max(Lines[i].FontSize-247,0),Lines[i].FontScale);
|
||||
else Lines[i].Font = Owner.CurrentStyle.PickFont(Max(FontSize+Lines[i].FontSize,0),Lines[i].FontScale);
|
||||
Canvas.Font = Lines[i].Font;
|
||||
if( Lines[i].Text=="" )
|
||||
{
|
||||
Canvas.TextSize("ABC",XS,YS,Lines[i].FontScale,Lines[i].FontScale);
|
||||
XS = 0;
|
||||
}
|
||||
else Canvas.TextSize(Lines[i].Text,XS,YS,Lines[i].FontScale,Lines[i].FontScale);
|
||||
if( Lines[i].LineSkips>0 )
|
||||
{
|
||||
if( PrevY==0 )
|
||||
PrevY = YS;
|
||||
Y+=(PrevY*Lines[i].LineSkips);
|
||||
}
|
||||
X = Max(X,Lines[i].Tab);
|
||||
Lines[i].TOffset = X;
|
||||
Lines[i].Y = Y;
|
||||
Lines[i].YS = YS;
|
||||
BestHeight = Max(BestHeight,YS);
|
||||
if( (X+XS)>Canvas.ClipX )
|
||||
{
|
||||
// Split to next row.
|
||||
Remain = Canvas.ClipX-X;
|
||||
iLastWord = 0;
|
||||
iLen = Len(Lines[i].Text);
|
||||
for( j=1; j<iLen; ++j )
|
||||
{
|
||||
Canvas.TextSize(Left(Lines[i].Text,j),XS,YS,Lines[i].FontScale,Lines[i].FontScale);
|
||||
if( Remain<XS )
|
||||
{
|
||||
if( iLastWord==0 ) // Must cut off a word now.
|
||||
SplitLine(i,Max(j-1,0));
|
||||
else SplitLine(i,iLastWord);
|
||||
break;
|
||||
}
|
||||
if( Mid(Lines[i].Text,j,1)==" " )
|
||||
iLastWord = j+1;
|
||||
}
|
||||
Canvas.TextSize(Lines[i].Text,XS,YS,Lines[i].FontScale,Lines[i].FontScale);
|
||||
}
|
||||
Lines[i].XS = XS;
|
||||
X+=XS;
|
||||
|
||||
for( j=0; j<Lines[i].ImgList.Length; ++j )
|
||||
{
|
||||
z = Lines[i].ImgList[j];
|
||||
if( Images[z].Align==3 )
|
||||
Images[z].X = X+Images[z].XOffset;
|
||||
else Images[z].X = Images[z].XOffset;
|
||||
Images[z].Y = Y+Images[z].YOffset;
|
||||
ImgHeight = Max(ImgHeight,Images[z].Y+Images[z].YS);
|
||||
}
|
||||
++i;
|
||||
}
|
||||
YSize = Max(Y+BestHeight,ImgHeight);
|
||||
}
|
||||
else YSize = 0;
|
||||
|
||||
bNeedScrollbar = (YSize>Canvas.ClipY);
|
||||
if( bNeedScrollbar )
|
||||
{
|
||||
MyScrollBar.SetDisabled(false);
|
||||
MyScrollBar.UpdateScrollSize(0,YSize,Canvas.ClipY,512);
|
||||
}
|
||||
else MyScrollBar.SetDisabled(true);
|
||||
}
|
||||
simulated final function DrawTileStretchedClipped( Surface M, float XS, float YS )
|
||||
{
|
||||
Canvas.CurX += Canvas.OrgX;
|
||||
Canvas.CurY += Canvas.OrgY;
|
||||
if( Canvas.CurX<Canvas.OrgX )
|
||||
{
|
||||
XS-=(Canvas.OrgX-Canvas.CurX);
|
||||
Canvas.CurX = Canvas.OrgX;
|
||||
}
|
||||
if( Canvas.CurY<Canvas.OrgY )
|
||||
{
|
||||
YS-=(Canvas.OrgY-Canvas.CurY);
|
||||
Canvas.CurY = Canvas.OrgY;
|
||||
}
|
||||
if( (Canvas.CurX+XS)>Canvas.ClipX )
|
||||
XS = (Canvas.ClipX-Canvas.CurX);
|
||||
if( (Canvas.CurY+YS)>Canvas.ClipY )
|
||||
YS = (Canvas.ClipY-Canvas.CurY);
|
||||
if( Texture(M)!=None )
|
||||
Canvas.DrawTileStretched(Texture(M),XS,YS);
|
||||
}
|
||||
function DrawMenu()
|
||||
{
|
||||
local float YS;
|
||||
local int i,YOffset,MX,MY;
|
||||
local bool bMouseOnClient;
|
||||
|
||||
if( bNeedsInit || OldXSize!=CompPos[2] || OldYSize!=CompPos[3] )
|
||||
{
|
||||
bNeedsInit = false;
|
||||
InitHTMLArea();
|
||||
}
|
||||
if( bNeedScrollbar )
|
||||
YOffset = MyScrollBar.CurrentScroll;
|
||||
|
||||
if( BGColor.A>0 )
|
||||
{
|
||||
C.SetPos(0,0);
|
||||
C.DrawColor = BGColor;
|
||||
|
||||
if( BgImage.Img!=None )
|
||||
{
|
||||
if( BgImage.Align==1 ) // not locked on screen.
|
||||
MX = YOffset;
|
||||
switch( BgImage.Style )
|
||||
{
|
||||
case 0: // Stretched to fit
|
||||
C.DrawTileClipped(BgImage.Img,C.ClipX,C.ClipY,0,MX,BgImage.X,BgImage.Y);
|
||||
break;
|
||||
case 1: // Tiled
|
||||
C.DrawTileClipped(BgImage.Img,C.ClipX,C.ClipY,0,MX,BgImage.XOffset,BgImage.YOffset);
|
||||
break;
|
||||
case 2: // Fit X
|
||||
C.DrawTileClipped(BgImage.Img,C.ClipX,C.ClipY,0,MX,BgImage.X,BgImage.YS);
|
||||
break;
|
||||
case 3: // Fit Y
|
||||
C.DrawTileClipped(BgImage.Img,C.ClipX,C.ClipY,0,MX,BgImage.XS,BgImage.Y);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else C.DrawTile(Texture'WhiteTexture',C.ClipX,C.ClipY,0,0,1,1);
|
||||
}
|
||||
MX = Controller.MouseX-C.OrgX;
|
||||
MY = Controller.MouseY-C.OrgY;
|
||||
bMouseOnClient = (MX>=0 && MX<=C.ClipX && MY>=0 && MY<=C.ClipY);
|
||||
HoverOverLinkLine = -1;
|
||||
MY+=YOffset;
|
||||
|
||||
C.DrawColor = Class'HUD'.Default.WhiteColor;
|
||||
for( i=0; i<Images.Length; ++i )
|
||||
{
|
||||
C.CurY = Images[i].Y-YOffset;
|
||||
if( (C.CurY+Images[i].YS)<0 || C.CurY>C.ClipY )
|
||||
continue;
|
||||
switch( Images[i].Align )
|
||||
{
|
||||
case 0: // Left
|
||||
case 3: // Unaligned, postition after text.
|
||||
C.CurX = 0;
|
||||
break;
|
||||
case 1: // Center
|
||||
C.CurX = (C.ClipX-Images[i].XS)/2;
|
||||
break;
|
||||
case 1: // Right
|
||||
C.CurX = C.ClipX-Images[i].XS;
|
||||
break;
|
||||
}
|
||||
C.CurX += Images[i].X;
|
||||
switch( Images[i].Style )
|
||||
{
|
||||
case 1: // Stretched
|
||||
DrawTileStretchedClipped(C,Images[i].Img,Images[i].XS,Images[i].YS);
|
||||
break;
|
||||
case 2: // Tiled on X axis
|
||||
C.DrawTileClipped(Images[i].Img,Images[i].XS,Images[i].YS,0,0,Images[i].XS,Images[i].Img.MaterialVSize());
|
||||
break;
|
||||
case 3: // Tiled on Y axis
|
||||
C.DrawTileClipped(Images[i].Img,Images[i].XS,Images[i].YS,0,0,Images[i].Img.MaterialUSize(),Images[i].YS);
|
||||
break;
|
||||
case 4: // Fully tiled
|
||||
C.DrawTileClipped(Images[i].Img,Images[i].XS,Images[i].YS,0,0,Images[i].XS,Images[i].YS);
|
||||
break;
|
||||
default: // Normal
|
||||
C.DrawTileClipped(Images[i].Img,Images[i].XS,Images[i].YS,0,0,Images[i].Img.MaterialUSize(),Images[i].Img.MaterialVSize());
|
||||
}
|
||||
}
|
||||
|
||||
for( i=0; i<Lines.Length; ++i )
|
||||
{
|
||||
C.SetPos(Lines[i].X,Lines[i].Y-YOffset);
|
||||
if( (C.CurY+Lines[i].YS)<0 || Lines[i].Text=="" )
|
||||
continue;
|
||||
if( C.CurY>C.ClipY )
|
||||
break;
|
||||
|
||||
// Check if mouse hovers over URL
|
||||
if( bMouseOnClient && Lines[i].bHasURL && MX>=Lines[i].X && MX<=(Lines[i].X+Lines[i].XS)
|
||||
&& MY>=Lines[i].Y && MY<=(Lines[i].Y+Lines[i].YS) )
|
||||
{
|
||||
HoverOverLinkLine = i;
|
||||
bMouseOnClient = false; // No need to check on rest anymore.
|
||||
C.DrawColor = Lines[i].ALColor;
|
||||
}
|
||||
else C.DrawColor = Lines[i].Color;
|
||||
|
||||
C.Font = Lines[i].Font;
|
||||
C.DrawTextClipped(Lines[i].Text);
|
||||
if( Lines[i].bHasURL )
|
||||
{
|
||||
YS = Max(Lines[i].YS/15,1);
|
||||
C.SetPos(Lines[i].X,Lines[i].Y+Lines[i].YS-(YS*2)-YOffset);
|
||||
if( C.CurY<C.ClipY )
|
||||
C.DrawTileClipped(Texture'WhiteTexture',Lines[i].XS,YS,0,0,1,1);
|
||||
}
|
||||
}
|
||||
|
||||
if( OldHoverLine!=HoverOverLinkLine )
|
||||
{
|
||||
OldHoverLine = HoverOverLinkLine;
|
||||
if( HoverOverLinkLine>=0 )
|
||||
{
|
||||
Controller.PlayInterfaceSound(CS_Hover);
|
||||
SetToolTipText(Lines[HoverOverLinkLine].URL);
|
||||
}
|
||||
else SetToolTipText("");
|
||||
}
|
||||
}
|
||||
|
||||
function bool LaunchURL(GUIComponent Sender)
|
||||
{
|
||||
if( HoverOverLinkLine>=0 )
|
||||
{
|
||||
if( Left(Lines[HoverOverLinkLine].URL,8)~="kfurl://" )
|
||||
LaunchKFURL(Mid(Lines[HoverOverLinkLine].URL,8));
|
||||
else if( Left(Lines[HoverOverLinkLine].URL,5)~="kf://" )
|
||||
ChangeGameURL(Mid(Lines[HoverOverLinkLine].URL,5));
|
||||
else LaunchURLPage(Lines[HoverOverLinkLine].URL);
|
||||
}
|
||||
}
|
||||
|
||||
delegate LaunchKFURL( string URL );
|
||||
delegate ChangeGameURL( string URL )
|
||||
{
|
||||
Class'SRLevelCleanup'.Static.AddSafeCleanup(PlayerOwner(),URL);
|
||||
}
|
||||
delegate LaunchURLPage( string URL )
|
||||
{
|
||||
PlayerOwner().Player.Console.DelayedConsoleCommand("START "$URL);
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
bNeedsInit=true
|
||||
|
||||
PropagateVisibility=true
|
||||
OnDraw=RenderHTMLText
|
||||
OnClick=LaunchURL
|
||||
Begin Object Class=GUIVertScrollBar Name=TheScrollbar
|
||||
bBoundToParent=true
|
||||
bScaleToParent=true
|
||||
WinWidth=0.03
|
||||
WinLeft=0.97
|
||||
WinTop=0.0
|
||||
WinHeight=1.0
|
||||
bVisible=true
|
||||
PropagateVisibility=true
|
||||
OnPreDraw=TheScrollbar.GripPreDraw
|
||||
End Object
|
||||
MyScrollBar=TheScrollbar
|
||||
StyleName="NoBackground"
|
||||
bAcceptsInput=True
|
||||
Begin Object Class=GUIToolTip Name=GUIListBoxBaseToolTip
|
||||
ExpirationSeconds=0
|
||||
End Object
|
||||
ToolTip=GUIListBoxBaseToolTip
|
||||
|
||||
WhiteColor=(R=255,G=255,B=255,A=255)
|
||||
BlueColor=(R=0,G=0,B=255,A=255)
|
||||
RedColor=(R=255,G=0,B=0,A=255)
|
||||
}
|
@ -64,4 +64,5 @@ function DrawMenu()
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -2,4 +2,5 @@ Class KFGUI_ScrollBarH extends KFGUI_ScrollBarBase;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -49,4 +49,5 @@ function DrawMenu()
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -64,4 +64,5 @@ function PreDraw()
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -68,4 +68,5 @@ final function RenderProgress()
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -2,4 +2,5 @@ Class SRPerkManager extends ExtPerkManager;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -125,7 +125,7 @@ function DrawMenu()
|
||||
if (KFGRI==None)
|
||||
return;
|
||||
}
|
||||
bMeAdmin = (PC.WorldInfo.NetMode!=NM_Client || (ExtPlayerReplicationInfo(PC.PlayerReplicationInfo)!=None && ExtPlayerReplicationInfo(PC.PlayerReplicationInfo).AdminType<=1));
|
||||
bMeAdmin = (PC.WorldInfo.NetMode!=NM_Client || (ExtPlayerReplicationInfo(PC.PlayerReplicationInfo) != None && ExtPlayerReplicationInfo(PC.PlayerReplicationInfo).AdminType <= AT_Admin));
|
||||
|
||||
// Sort player list.
|
||||
for (i=(KFGRI.PRIArray.Length-1); i>0; --i)
|
||||
|
@ -257,4 +257,5 @@ function SetSaveVersion(int Num)
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
17
ServerExtMut/Classes/KFGI_Access.uc
Normal file
17
ServerExtMut/Classes/KFGI_Access.uc
Normal file
@ -0,0 +1,17 @@
|
||||
class KFGI_Access extends Object
|
||||
within KFGameInfo;
|
||||
|
||||
// Bypass protected modifier for these lists
|
||||
|
||||
function bool IsCustomZed(class<KFPawn_Monster> KFPM)
|
||||
{
|
||||
if (AIClassList.Find(KFPM) != INDEX_NONE) return false;
|
||||
if (NonSpawnAIClassList.Find(KFPM) != INDEX_NONE) return false;
|
||||
if (AIBossClassList.Find(KFPM) != INDEX_NONE) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
@ -26,7 +26,7 @@ struct FSavedInvEntry
|
||||
};
|
||||
var array<FSavedInvEntry> PlayerInv;
|
||||
|
||||
var config array<string> PerkClasses,CustomChars,AdminCommands,CustomItems,BonusGameSongs,BonusGameFX;
|
||||
var config array<string> PerkClasses,CustomChars,AdminCommands,BonusGameSongs,BonusGameFX;
|
||||
var config array<CFGCustomZedXP> CustomZedXP;
|
||||
var array< class<Ext_PerkBase> > LoadedPerks;
|
||||
var array<FCustomCharEntry> CustomCharList;
|
||||
@ -44,9 +44,6 @@ var transient class<DamageType> LastKillDamageType;
|
||||
var SoundCue BonusGameCue;
|
||||
var Object BonusGameFXObj;
|
||||
|
||||
var array<FCustomTraderItem> CustomItemList;
|
||||
var KFGFxObject_TraderItems CustomTrader;
|
||||
|
||||
const SettingsTagVer=14;
|
||||
var KFGameReplicationInfo KF;
|
||||
var config int SettingsInit;
|
||||
@ -58,10 +55,8 @@ var int LastWaveNum,NumWaveSwitches;
|
||||
var ExtSpawnPointHelper SpawnPointer;
|
||||
var bool bRespawnCheck,bSpecialSpawn,bGameHasEnded,bIsPostGame;
|
||||
var config bool bKillMessages,bDamageMessages,bEnableMapVote,bNoAdminCommands,bNoWebAdmin,bNoBoomstickJumping,bDumpXMLStats,bRagdollFromFall,bRagdollFromMomentum,bRagdollFromBackhit,bAddCountryTags,bThrowAllWeaponsOnDeath;
|
||||
var config bool bServerPerksMode;
|
||||
var config bool bDontUseOriginalWeaponry;
|
||||
var config bool bAllowStandartPistolUpgrade;
|
||||
var config bool bDisableCustomTrader;
|
||||
|
||||
var KFGI_Access KFGIA;
|
||||
|
||||
//Custom XP lightly array
|
||||
struct CustomZedXPStruct
|
||||
@ -102,6 +97,7 @@ function PostBeginPlay()
|
||||
class'OnlineSubsystem'.Static.StringToUniqueNetId(DevList[i],Id);
|
||||
DevNetID[i] = Id;
|
||||
}
|
||||
|
||||
ServerStatLoader = new (None) class'ExtPlayerStat';
|
||||
WorldInfo.Game.HUDType = class'KFExtendedHUD';
|
||||
WorldInfo.Game.PlayerControllerClass = class'ExtPlayerController';
|
||||
@ -110,12 +106,7 @@ function PostBeginPlay()
|
||||
KFGameInfo(WorldInfo.Game).CustomizationPawnClass = class'ExtPawn_Customization';
|
||||
KFGameInfo(WorldInfo.Game).KFGFxManagerClass = class'ExtMoviePlayer_Manager';
|
||||
|
||||
// trader things
|
||||
if (!bDisableCustomTrader && CustomTrader==None)
|
||||
{
|
||||
CustomTrader = class'ExtPlayerReplicationInfo'.Static.CreateNewList();
|
||||
SetTimer(0.001, false, 'EditTraiderItems');
|
||||
}
|
||||
KFGIA = new(KFGameInfo(WorldInfo.Game)) class'KFGI_Access';
|
||||
|
||||
if (ServerMOTD=="")
|
||||
ServerMOTD = "Message of the Day";
|
||||
@ -173,11 +164,6 @@ function PostBeginPlay()
|
||||
if (SettingsInit<9)
|
||||
MaxTopPlayers = 50;
|
||||
|
||||
if (SettingsInit < 13)
|
||||
{
|
||||
bAllowStandartPistolUpgrade = True;
|
||||
bDisableCustomTrader = False;
|
||||
}
|
||||
if (SettingsInit < 14)
|
||||
{
|
||||
bThrowAllWeaponsOnDeath = False;
|
||||
@ -289,96 +275,6 @@ function UpdateCustomZedXPArray()
|
||||
}
|
||||
}
|
||||
|
||||
// function CheckPickupFactories()
|
||||
// {
|
||||
// local KFPickupFactory_Item ItemFactory;
|
||||
|
||||
// // Disable 9mm and medpistol in all PickupFactories
|
||||
// foreach AllActors(class'KFPickupFactory_Item', ItemFactory)
|
||||
// {
|
||||
// for (i=0;i<ItemFactory.ItemPickups.Length;i++)
|
||||
// {
|
||||
// if (ItemFactory.ItemPickups[i].ItemClass == class'KFGameContent.KFWeap_Pistol_9mm'
|
||||
// || ItemFactory.ItemPickups[i].ItemClass == class'KFGameContent.KFWeap_Pistol_Medic')
|
||||
// {
|
||||
// ItemFactory.ItemPickups.Remove(i, 1);
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
function EditTraiderItems()
|
||||
{
|
||||
local int i;
|
||||
local KFGFxObject_TraderItems Trad;
|
||||
|
||||
if (!bDontUseOriginalWeaponry)
|
||||
{
|
||||
Trad = KFGameReplicationInfo(WorldInfo.GRI).TraderItems;
|
||||
// Remove dual 9mm, 9mm, medpistol
|
||||
for (i=0;i<Trad.SaleItems.Length;i++)
|
||||
{
|
||||
if (string(Trad.SaleItems[i].ClassName) ~= "KFWeap_Pistol_Dual9mm"
|
||||
|| string(Trad.SaleItems[i].ClassName) ~= "KFWeap_Pistol_Medic"
|
||||
|| string(Trad.SaleItems[i].ClassName) ~= "KFWeap_Pistol_9mm")
|
||||
{
|
||||
// Remove pistols
|
||||
continue;
|
||||
}
|
||||
|
||||
// Adding original weapon
|
||||
AddCIToTraderEx(Trad.SaleItems[i].WeaponDef);
|
||||
}
|
||||
}
|
||||
|
||||
// Reinfo and resorting items
|
||||
// MyKFGI.MyKFGRI.TraderItems.SetItemsInfo(MyKFGI.MyKFGRI.TraderItems.SaleItems);
|
||||
// MyKFGI.MyKFGRI.TraderItems.SortItemsInfo(MyKFGI.MyKFGRI.TraderItems.SaleItems);
|
||||
|
||||
if (bAllowStandartPistolUpgrade)
|
||||
{
|
||||
// Add custom 9mm for upgrades
|
||||
AddCIToTrader("ServerExt.ExtWeapDef_9mm");
|
||||
|
||||
// Add custom medpistol for upgrades
|
||||
AddCIToTrader("ServerExt.ExtWeapDef_MedicPistol");
|
||||
}
|
||||
|
||||
// Add custom items from WebAdmin
|
||||
for (i=0; i<CustomItems.Length; ++i)
|
||||
{
|
||||
AddCIToTrader(CustomItems[i]);
|
||||
}
|
||||
InitGRIList();
|
||||
}
|
||||
|
||||
function AddCIToTrader(string weapdef)
|
||||
{
|
||||
local FCustomTraderItem CI;
|
||||
CI.WeaponDef = class<KFWeaponDefinition>(DynamicLoadObject(weapdef,class'Class'));
|
||||
if (CI.WeaponDef == None)
|
||||
return;
|
||||
CI.WeaponClass = class<KFWeapon>(DynamicLoadObject(CI.WeaponDef.Default.WeaponClassPath,class'Class'));
|
||||
if (CI.WeaponClass == None)
|
||||
return;
|
||||
CustomItemList.AddItem(CI);
|
||||
class'ExtPlayerReplicationInfo'.Static.SetWeaponInfo(WorldInfo.NetMode==NM_DedicatedServer,CustomTrader.SaleItems.Length,CI,CustomTrader);
|
||||
}
|
||||
|
||||
function AddCIToTraderEx(class<KFWeaponDefinition> weapdef)
|
||||
{
|
||||
local FCustomTraderItem CI;
|
||||
CI.WeaponDef = weapdef;
|
||||
if (CI.WeaponDef == None)
|
||||
return;
|
||||
CI.WeaponClass = class<KFWeapon>(DynamicLoadObject(CI.WeaponDef.Default.WeaponClassPath,class'Class'));
|
||||
if (CI.WeaponClass == None)
|
||||
return;
|
||||
CustomItemList.AddItem(CI);
|
||||
class'ExtPlayerReplicationInfo'.Static.SetWeaponInfo(WorldInfo.NetMode==NM_DedicatedServer,CustomTrader.SaleItems.Length,CI,CustomTrader);
|
||||
}
|
||||
|
||||
static final function string GetStatFile(const out UniqueNetId UID)
|
||||
{
|
||||
return Repl(Default.StatFileDir,"%s","U_"$class'OnlineSubsystem'.Static.UniqueNetIdToString(UID));
|
||||
@ -394,21 +290,6 @@ final function bool IsDev(const out UniqueNetId UID)
|
||||
return false;
|
||||
}
|
||||
|
||||
function InitGRIList()
|
||||
{
|
||||
local ExtPlayerController PC;
|
||||
|
||||
KFGameReplicationInfo(WorldInfo.GRI).TraderItems = CustomTrader;
|
||||
|
||||
// Must sync up local client.
|
||||
if (WorldInfo.NetMode==NM_StandAlone)
|
||||
{
|
||||
foreach LocalPlayerControllers(class'ExtPlayerController',PC)
|
||||
if (PC.PurchaseHelper!=None)
|
||||
PC.PurchaseHelper.TraderItems = CustomTrader;
|
||||
}
|
||||
}
|
||||
|
||||
function CheckWave()
|
||||
{
|
||||
if (KF==None)
|
||||
@ -527,46 +408,49 @@ function bool IsFromMod(Object O)
|
||||
return true;
|
||||
}
|
||||
|
||||
function bool HasModsInDamageInfo(DamageInfo DI)
|
||||
{
|
||||
local class<Actor> DamageCauser;
|
||||
local class<KFDamageType> DamageType;
|
||||
|
||||
foreach DI.DamageCausers(DamageCauser)
|
||||
if (IsFromMod(DamageCauser))
|
||||
return true;
|
||||
|
||||
foreach DI.DamageTypes(DamageType)
|
||||
if (IsFromMod(DamageType))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function CustomXP(Controller Killer, Controller Killed)
|
||||
{
|
||||
local KFPlayerController KFPC;
|
||||
local KFPawn_Monster KFM;
|
||||
local int i, j;
|
||||
local int i;
|
||||
local KFPlayerReplicationInfo DamagerKFPRI;
|
||||
local float XP;
|
||||
local KFPerk InstigatorPerk;
|
||||
local bool cont;
|
||||
local DamageInfo DamageInfo;
|
||||
local class<KFPerk> DamagePerk;
|
||||
|
||||
KFM = KFPawn_Monster(Killed.Pawn);
|
||||
for (i = 0; i < KFM.DamageHistory.Length; i++)
|
||||
foreach KFM.DamageHistory(DamageInfo)
|
||||
{
|
||||
DamagerKFPRI = KFPlayerReplicationInfo(KFM.DamageHistory[i].DamagerPRI);
|
||||
if (DamagerKFPRI != None)
|
||||
{
|
||||
// Check that no mods are used in this kill
|
||||
cont = true;
|
||||
for (j=0; j < KFM.DamageHistory[i].DamageCausers.Length; j++)
|
||||
{
|
||||
if (IsFromMod(KFM.DamageHistory[i].DamageCausers[j]) || IsFromMod(KFM.DamageHistory[i].DamageTypes[j]))
|
||||
{
|
||||
cont = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (cont && !IsFromMod(KFM))
|
||||
{
|
||||
// No mods - exit the loop, the game will add experience by itself
|
||||
continue;
|
||||
}
|
||||
DamagerKFPRI = KFPlayerReplicationInfo(DamageInfo.DamagerPRI);
|
||||
if (DamagerKFPRI == None) continue;
|
||||
|
||||
// if no mods - exit the loop, the game will add experience by itself
|
||||
if (!HasModsInDamageInfo(DamageInfo) && !KFGIA.IsCustomZed(KFM.class)) continue;
|
||||
|
||||
// Distribute experience points
|
||||
KFPC = KFPlayerController(DamagerKFPRI.Owner);
|
||||
if (KFPC != none)
|
||||
if (KFPC == None) continue;
|
||||
|
||||
i = CustomZedXPArray.Find('zedclass', KFM.Class);
|
||||
if (i != INDEX_NONE)
|
||||
{
|
||||
j = CustomZedXPArray.Find('zedclass', KFM.Class);
|
||||
if(j != -1)
|
||||
{
|
||||
XP = CustomZedXPArray[j].XPValues[MyKFGI.GameDifficulty];
|
||||
XP = CustomZedXPArray[i].XPValues[MyKFGI.GameDifficulty];
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -576,19 +460,17 @@ function CustomXP(Controller Killer, Controller Killed)
|
||||
InstigatorPerk = KFPC.GetPerk();
|
||||
|
||||
// Special for survivalist - he gets experience for everything
|
||||
// And for TF2Sentry - he has no perk in DamageHistory
|
||||
if (InstigatorPerk.ShouldGetAllTheXP() || KFM.DamageHistory[i].DamagePerks.Length == 0)
|
||||
// and for TF2Sentry - it has no perk in DamageHistory
|
||||
if (InstigatorPerk.ShouldGetAllTheXP() || DamageInfo.DamagePerks.Length == 0)
|
||||
{
|
||||
KFPC.OnPlayerXPAdded(XP, InstigatorPerk.Class);
|
||||
continue;
|
||||
}
|
||||
|
||||
XP /= KFM.DamageHistory[i].DamagePerks.Length;
|
||||
for (j = 0; j < KFM.DamageHistory[i].DamagePerks.Length; j++)
|
||||
XP /= DamageInfo.DamagePerks.Length;
|
||||
foreach DamageInfo.DamagePerks(DamagePerk)
|
||||
{
|
||||
KFPC.OnPlayerXPAdded(FCeil(XP), KFM.DamageHistory[i].DamagePerks[j]);
|
||||
}
|
||||
}
|
||||
KFPC.OnPlayerXPAdded(FCeil(XP), DamagePerk);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -596,28 +478,34 @@ function CustomXP(Controller Killer, Controller Killed)
|
||||
function ScoreKill(Controller Killer, Controller Killed)
|
||||
{
|
||||
local KFPlayerController KFPC;
|
||||
local ExtPlayerController ExtPC;
|
||||
local ExtPerkManager KillersPerk;
|
||||
local KFPawn_Monster KFPM;
|
||||
|
||||
if (bRespawnCheck && Killed.bIsPlayer)
|
||||
CheckRespawn(Killed);
|
||||
|
||||
if (KFPawn_Monster(Killed.Pawn) != None && Killed.GetTeamNum() != 0 && Killer.bIsPlayer && Killer.GetTeamNum() == 0)
|
||||
KFPM = KFPawn_Monster(Killed.Pawn);
|
||||
if (KFPM != None && Killed.GetTeamNum() != 0
|
||||
&& Killer != None && Killer.bIsPlayer && Killer.GetTeamNum() == 0)
|
||||
{
|
||||
if (ExtPlayerController(Killer)!=None && ExtPlayerController(Killer).ActivePerkManager!=None)
|
||||
ExtPlayerController(Killer).ActivePerkManager.PlayerKilled(KFPawn_Monster(Killed.Pawn),LastKillDamageType);
|
||||
ExtPC = ExtPlayerController(Killer);
|
||||
if (ExtPC != None && ExtPC.ActivePerkManager != None)
|
||||
ExtPC.ActivePerkManager.PlayerKilled(KFPM, LastKillDamageType);
|
||||
|
||||
if (bKillMessages && Killer.PlayerReplicationInfo != None)
|
||||
BroadcastKillMessage(Killed.Pawn, Killer);
|
||||
|
||||
CustomXP(Killer, Killed);
|
||||
}
|
||||
|
||||
if (MyKFGI != None && MyKFGI.IsZedTimeActive() && KFPawn_Monster(Killed.Pawn) != None)
|
||||
if (MyKFGI != None && MyKFGI.IsZedTimeActive() && KFPM != None)
|
||||
{
|
||||
KFPC = KFPlayerController(Killer);
|
||||
if (KFPC != none)
|
||||
if (KFPC != None)
|
||||
{
|
||||
KillersPerk = ExtPerkManager(KFPC.GetPerk());
|
||||
if (MyKFGI.ZedTimeRemaining > 0.f && KillersPerk != none && KillersPerk.GetZedTimeExtensions( KFPC.GetLevel() ) > MyKFGI.ZedTimeExtensionsUsed)
|
||||
if (MyKFGI.ZedTimeRemaining > 0.f && KillersPerk != None && KillersPerk.GetZedTimeExtensions(KFPC.GetLevel() ) > MyKFGI.ZedTimeExtensionsUsed)
|
||||
{
|
||||
MyKFGI.DramaticEvent(1.0);
|
||||
MyKFGI.ZedTimeExtensionsUsed++;
|
||||
@ -625,8 +513,10 @@ function ScoreKill(Controller Killer, Controller Killed)
|
||||
}
|
||||
}
|
||||
|
||||
if (ExtPlayerController(Killed) != None)
|
||||
CheckPerkChange(ExtPlayerController(Killed));
|
||||
ExtPC = ExtPlayerController(Killed);
|
||||
if (ExtPC != None)
|
||||
CheckPerkChange(ExtPC);
|
||||
|
||||
if (NextMutator != None)
|
||||
NextMutator.ScoreKill(Killer, Killed);
|
||||
}
|
||||
@ -764,7 +654,7 @@ function NetDamage(int OriginalDamage, out int Damage, Pawn Injured, Controller
|
||||
HackSetHistory(KFPawn(Injured),Injured,Ext_T_MonsterPRI(InstigatedBy.PlayerReplicationInfo).OwnerController,Damage,HitLocation);
|
||||
}
|
||||
}
|
||||
else if (KFPawn(InstigatedBy.Pawn).GetTeamNum() != KFPawn(Injured).GetTeamNum())
|
||||
else if (InstigatedBy.Pawn != None && KFPawn(InstigatedBy.Pawn).GetTeamNum() != KFPawn(Injured).GetTeamNum())
|
||||
{
|
||||
Momentum = vect(0,0,0);
|
||||
Damage = 0;
|
||||
@ -868,8 +758,6 @@ function NotifyLogin(Controller NewPlayer)
|
||||
if (bAddCountryTags && NetConnection(PlayerController(NewPlayer).Player)!=None)
|
||||
ExtPlayerReplicationInfo(NewPlayer.PlayerReplicationInfo).SetPlayerNameTag(class'CtryDatabase'.Static.GetClientCountryStr(PlayerController(NewPlayer).GetPlayerNetworkAddress()));
|
||||
ExtPlayerReplicationInfo(NewPlayer.PlayerReplicationInfo).bIsDev = IsDev(NewPlayer.PlayerReplicationInfo.UniqueId);
|
||||
if (WorldInfo.NetMode!=NM_StandAlone)
|
||||
ExtPlayerReplicationInfo(NewPlayer.PlayerReplicationInfo).OnRepNextItem = GetNextItem;
|
||||
if (BonusGameCue!=None || BonusGameFXObj!=None)
|
||||
ExtPlayerController(NewPlayer).ClientSetBonus(BonusGameCue,BonusGameFXObj);
|
||||
if (bRespawnCheck)
|
||||
@ -1505,7 +1393,7 @@ final function InitCustomChars(ExtPlayerReplicationInfo PRI)
|
||||
|
||||
final function bool HasPrivs(ExtPlayerReplicationInfo P)
|
||||
{
|
||||
return WorldInfo.NetMode==NM_StandAlone || (P!=None && P.ShowAdminName() && (P.AdminType<=1 || P.AdminType==255));
|
||||
return WorldInfo.NetMode==NM_StandAlone || (P != None && P.ShowAdminName() && (P.AdminType <= AT_Admin || P.AdminType == AT_Player));
|
||||
}
|
||||
|
||||
function AdminCommand(ExtPlayerController PC, int PlayerID, int Action)
|
||||
@ -1690,14 +1578,6 @@ function PlayerChangeSpec(ExtPlayerController PC, bool bSpectator)
|
||||
}
|
||||
}
|
||||
|
||||
function bool GetNextItem(ExtPlayerReplicationInfo PRI, int RepIndex)
|
||||
{
|
||||
if (RepIndex>=CustomItemList.Length)
|
||||
return false;
|
||||
PRI.ClientAddTraderItem(RepIndex,CustomItemList[RepIndex]);
|
||||
return true;
|
||||
}
|
||||
|
||||
function InitWebAdmin(ExtWebAdmin_UI UI)
|
||||
{
|
||||
local int i;
|
||||
@ -1747,12 +1627,6 @@ function string WebAdminGetValue(name PropName, int ElementIndex)
|
||||
return string(MaxTopPlayers);
|
||||
case 'MinUnloadPerkLevel':
|
||||
return string(MinUnloadPerkLevel);
|
||||
case 'bDontUseOriginalWeaponry':
|
||||
return string(bDontUseOriginalWeaponry);
|
||||
case 'bDisableCustomTrader':
|
||||
return string(bDisableCustomTrader);
|
||||
case 'bAllowStandartPistolUpgrade':
|
||||
return string(bAllowStandartPistolUpgrade);
|
||||
case 'UnloadPerkExpCost':
|
||||
return string(UnloadPerkExpCost);
|
||||
case 'PerkClasses':
|
||||
@ -1761,8 +1635,6 @@ function string WebAdminGetValue(name PropName, int ElementIndex)
|
||||
return (ElementIndex==-1 ? string(CustomChars.Length) : CustomChars[ElementIndex]);
|
||||
case 'AdminCommands':
|
||||
return (ElementIndex==-1 ? string(AdminCommands.Length) : AdminCommands[ElementIndex]);
|
||||
case 'CustomItems':
|
||||
return (ElementIndex==-1 ? string(CustomItems.Length) : CustomItems[ElementIndex]);
|
||||
case 'ServerMOTD':
|
||||
return Repl(ServerMOTD,"|",Chr(10));
|
||||
case 'BonusGameSongs':
|
||||
@ -1824,12 +1696,6 @@ function WebAdminSetValue(name PropName, int ElementIndex, string Value)
|
||||
bRagdollFromMomentum = bool(Value); break;
|
||||
case 'bRagdollFromBackhit':
|
||||
bRagdollFromBackhit = bool(Value); break;
|
||||
case 'bDontUseOriginalWeaponry':
|
||||
bDontUseOriginalWeaponry = bool(Value); break;
|
||||
case 'bDisableCustomTrader':
|
||||
bDisableCustomTrader = bool(Value); break;
|
||||
case 'bAllowStandartPistolUpgrade':
|
||||
bAllowStandartPistolUpgrade = bool(Value); break;
|
||||
case 'bAddCountryTags':
|
||||
bAddCountryTags = bool(Value); break;
|
||||
case 'MaxTopPlayers':
|
||||
@ -1842,8 +1708,6 @@ function WebAdminSetValue(name PropName, int ElementIndex, string Value)
|
||||
UpdateArray(CustomChars,ElementIndex,Value); break;
|
||||
case 'AdminCommands':
|
||||
UpdateArray(AdminCommands,ElementIndex,Value); break;
|
||||
case 'CustomItems':
|
||||
UpdateArray(CustomItems,ElementIndex,Value); break;
|
||||
case 'BonusGameSongs':
|
||||
UpdateArray(BonusGameSongs,ElementIndex,Value); break;
|
||||
case 'BonusGameFX':
|
||||
@ -1858,6 +1722,8 @@ function WebAdminSetValue(name PropName, int ElementIndex, string Value)
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
GroupNames.Add("ServerExt")
|
||||
|
||||
// Main devs
|
||||
DevList.Add("0x0110000100E8984E") // Marco
|
||||
DevList.Add("0x01100001023DF8A8") // ForrestMarkX
|
||||
@ -1892,9 +1758,4 @@ defaultproperties
|
||||
WebConfigs.Add((PropType=3,PropName="ServerMOTD",UIName="MOTD",UIDesc="Message of the Day"))
|
||||
WebConfigs.Add((PropType=2,PropName="BonusGameSongs",UIName="Bonus Game Songs",UIDesc="List of custom musics to play during level change pong game.",NumElements=-1))
|
||||
WebConfigs.Add((PropType=2,PropName="BonusGameFX",UIName="Bonus Game FX",UIDesc="List of custom FX to play on pong game.",NumElements=-1))
|
||||
|
||||
WebConfigs.Add((PropType=1,PropName="bDisableCustomTrader",UIName="Disable custom trader",UIDesc="Warning! That option will disable all settings below"))
|
||||
WebConfigs.Add((PropType=2,PropName="CustomItems",UIName="Custom Inventory",UIDesc="List of custom inventory to add to trader (must be KFWeaponDefinition class).",NumElements=-1))
|
||||
WebConfigs.Add((PropType=1,PropName="bDontUseOriginalWeaponry",UIName="Disable original weapons",UIDesc="Allows to buy default weapons"))
|
||||
WebConfigs.Add((PropType=1,PropName="bAllowStandartPistolUpgrade",UIName="Standard pistol upgrades",UIDesc="Allows to upgrade standard pistol"))
|
||||
}
|
||||
|
@ -34,4 +34,5 @@ event AllowBroadcastLocalizedTeam(int TeamIndex, actor Sender, class<LocalMessag
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
||||
}
|
16
build.cfg
16
build.cfg
@ -1,16 +0,0 @@
|
||||
# Build parameters
|
||||
|
||||
# If True - compresses the mutator when compiling
|
||||
# Scripts will be stored in binary form
|
||||
# (reduces the size of the output file)
|
||||
StripSource="True"
|
||||
|
||||
# Mutators to be compiled
|
||||
# Specify them with a space as a separator,
|
||||
# Mutators will be compiled in the specified order
|
||||
PackageBuildOrder="ServerExt ServerExtMut"
|
||||
|
||||
# Mutators that will be uploaded to the workshop
|
||||
# Specify them with a space as a separator,
|
||||
# The order doesn't matter
|
||||
PackageUpload="ServerExt ServerExtMut"
|
61
builder.cfg
Normal file
61
builder.cfg
Normal file
@ -0,0 +1,61 @@
|
||||
### Build parameters ###
|
||||
|
||||
# If True - compresses the mutator when compiling
|
||||
# Scripts will be stored in binary form
|
||||
# (reduces the size of the output file)
|
||||
StripSource="True"
|
||||
|
||||
# Mutators to be compiled
|
||||
# Specify them with a space as a separator,
|
||||
# Mutators will be compiled in the specified order
|
||||
PackageBuildOrder="ServerExt ServerExtMut"
|
||||
|
||||
|
||||
### Brew parameters ###
|
||||
|
||||
# Packages you want to brew using @peelz's patched KFEditor.
|
||||
# Useful for cases where regular brew doesn't put *.upk inside the package.
|
||||
# Specify them with a space as a separator,
|
||||
# The order doesn't matter
|
||||
PackagePeelzBrew=""
|
||||
|
||||
|
||||
### Steam Workshop upload parameters ###
|
||||
|
||||
# Mutators that will be uploaded to the workshop
|
||||
# Specify them with a space as a separator,
|
||||
# The order doesn't matter
|
||||
PackageUpload="ServerExt ServerExtMut"
|
||||
|
||||
|
||||
### Test parameters ###
|
||||
|
||||
# Map:
|
||||
Map="KF-Nuked"
|
||||
|
||||
# Game:
|
||||
# Survival: KFGameContent.KFGameInfo_Survival
|
||||
# WeeklyOutbreak: KFGameContent.KFGameInfo_WeeklySurvival
|
||||
# Endless: KFGameContent.KFGameInfo_Endless
|
||||
# Objective: KFGameContent.KFGameInfo_Objective
|
||||
# Versus: KFGameContent.KFGameInfo_VersusSurvival
|
||||
Game="KFGameContent.KFGameInfo_Survival"
|
||||
|
||||
# Difficulty:
|
||||
# Normal: 0
|
||||
# Hard: 1
|
||||
# Suicide: 2
|
||||
# Hell: 3
|
||||
Difficulty="0"
|
||||
|
||||
# GameLength:
|
||||
# 4 waves: 0
|
||||
# 7 waves: 1
|
||||
# 10 waves: 2
|
||||
GameLength="0"
|
||||
|
||||
# Mutators
|
||||
Mutators="ServerExtMut.ServerExtMut"
|
||||
|
||||
# Additional parameters
|
||||
Args=""
|
31
test.cfg
31
test.cfg
@ -1,31 +0,0 @@
|
||||
# Test parameters
|
||||
|
||||
# Map:
|
||||
Map="KF-Nuked"
|
||||
|
||||
# Game:
|
||||
# Survival: KFGameContent.KFGameInfo_Survival
|
||||
# WeeklyOutbreak: KFGameContent.KFGameInfo_WeeklySurvival
|
||||
# Endless: KFGameContent.KFGameInfo_Endless
|
||||
# Objective: KFGameContent.KFGameInfo_Objective
|
||||
# Versus: KFGameContent.KFGameInfo_VersusSurvival
|
||||
Game="KFGameContent.KFGameInfo_Survival"
|
||||
|
||||
# Difficulty:
|
||||
# Normal: 0
|
||||
# Hard: 1
|
||||
# Suicide: 2
|
||||
# Hell: 3
|
||||
Difficulty="0"
|
||||
|
||||
# GameLength:
|
||||
# 4 waves: 0
|
||||
# 7 waves: 1
|
||||
# 10 waves: 2
|
||||
GameLength="0"
|
||||
|
||||
# Mutators
|
||||
Mutators="ServerExtMut.ServerExtMut"
|
||||
|
||||
# Additional parameters
|
||||
Args=""
|
2
tools
2
tools
@ -1 +1 @@
|
||||
Subproject commit 48b3a87401e97915659b76a7eda915b09c815af8
|
||||
Subproject commit fb458ac61f7e6c6426b8dff366dd5e7499e0d95f
|
Loading…
x
Reference in New Issue
Block a user