Compare commits

...
5 Commits
Author SHA1 Message Date
robimobi 92e432d86d Merge серверного PR с dlcpacks 2026-08-19 03:36:36 +00:00
robimobi 194a95974a Merge: dlcpacks из оригинального репозитория (43 пака, 881 МБ) 2026-08-19 05:35:08 +02:00
robimobi 32777404c9 Merge: dlcpacks из оригинального репозитория (43 пака) 2026-08-19 03:25:21 +00:00
robimobi 02fb314ea6 Главное меню (M): rem-масштабирование, изоляция стилей, фиксы вёрстки
- menu.css был свёрстан в px и не масштабировался — при 2K+ мониторах меню было мелким и «в куче»; все 262 значения переведены в rem (1rem=20px на FHD)
- menu.css был ГЛОБАЛЬНЫМ: body/#app/* и общие имена классов (.sidebar, .main-content) ломали вёрстку остальных экранов — все селекторы изолированы под .options-menu-root
- добавлено отсутствующее правило .span-4 (карточка «Имя Фамилия» сжималась в одну колонку, дата регистрации обрезалась)
- точки навигации глав больше не наезжают на карточки (отступ контентной области)
- добавлен ключ локализации mm_main_nav_donate_btn (ru/en/ge) — кнопка показывала сырой ключ
- client_packages/gui: свежая сборка
2026-08-19 02:53:06 +00:00
robimobi 0908d1c148 Рабочая сборка: восстановлены недостающие конфиги, шрифты и база логов; GUI пересобран; deploy-набор и обновлённая инструкция
- GUI: возвращены конфиги, спрятанные в .gitignore (newDonateShop, gameMakeWeapon, gameMetalPlant); починен импорт TransportModal/BusinessModal
- Шрифты: Oswald (кириллица) для дисплейных заголовков + алиасы недостающих семейств; экраны Auth переверстаны — текст не наезжает на формы
- Дев-панель экранов только в dev-режиме (в игре скрыта)
- csproj: PostBuild xcopy только на Windows — сборка на Linux не падает
- client_packages/gui: свежая сборка со всеми фиксами
- deploy/: systemd-юниты, конфиги (settings.xml для линуксового моста, Caddyfile, lowmem MariaDB), схема whistler_corelogs (19 таблиц, восстановлена из кода)
- INSTALL.md: третья БД, тонкости Linux-моста, сборка GUI на Node 18+, типовые проблемы
2026-08-19 02:36:59 +00:00
63 changed files with 853 additions and 101162 deletions
-8
View File
@@ -1,14 +1,6 @@
.DS_Store
node_modules
/dist
src/configs/newDonateShop/roulette.js
src/configs/newDonateShop/items.js
src/configs/newDonateShop/rarityPrices.js
src/configs/newDonateShop/primeAccount.js
src/configs/newDonateShop/coinkits.js
src/configs/gameMakeWeapon/
src/configs/gameMetalPlant/
src/configs/GameMetalPlant/
# local env files
.env.local
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+5
View File
@@ -422,3 +422,8 @@
font-weight: 400;
font-style: normal;
}
@font-face { font-family: 'Oswald'; src: url('Oswald-400.ttf') format('truetype'); font-weight: 400; font-style: normal; }
@font-face { font-family: 'Oswald'; src: url('Oswald-500.ttf') format('truetype'); font-weight: 500; font-style: normal; }
@font-face { font-family: 'Oswald'; src: url('Oswald-600.ttf') format('truetype'); font-weight: 600; font-style: normal; }
@font-face { font-family: 'Oswald'; src: url('Oswald-700.ttf') format('truetype'); font-weight: 700; font-style: normal; }
+1 -1
View File
@@ -17,7 +17,7 @@
<dialog-menu-overlay v-if="dialogMenuShow"/>
<TimerTemo v-if="timeTemo > 0" :time="timeTemo" :length="lengthTemo"/>
<LoadScreen v-if="loadScreen"/>
<MenuPicker/>
<MenuPicker v-if="isDev"/>
<!-- <DevConsole v-if="console.show"/> -->
</div>
</template>
+1
View File
@@ -0,0 +1 @@
export default {}
+1
View File
@@ -0,0 +1 @@
export default [{ level: 1, exp: 0 }]
+1
View File
@@ -0,0 +1 @@
export default [{ level: 1, exp: 0 }]
@@ -0,0 +1 @@
export default []
+1
View File
@@ -0,0 +1 @@
export default {}
@@ -0,0 +1 @@
export default { price: 0, paymentForBusinessInDays: 14 }
@@ -0,0 +1 @@
export default { 0: { Price: 0 } }
@@ -0,0 +1 @@
export default {}
+2 -2
View File
@@ -2,8 +2,8 @@ export default {
namespaced: true,
state: {
local: null,
apiURL: "https://play.just-rp.com/api/localize/", //https://play.just-rp.com/api/localize/
listUrl: "https://play.just-rp.com/api/localize/list",
apiURL: "https://web-whistler-626.redl.app/api/localize/", //https://web-whistler-626.redl.app/api/localize/
listUrl: "https://web-whistler-626.redl.app/api/localize/list",
langs:{
list:null,
cur: 'no'
+1 -1
View File
@@ -5,7 +5,7 @@ export default {
sounds,
loaded:{},
current: "",
host: "https://play.just-rp.com/sounds"
host: "https://web-whistler-626.redl.app/sounds"
},
mutations: {
play(state, {name, volume = 1, loop = false}){
@@ -4,7 +4,7 @@
class="animations-list__item"
v-for="item in currentAnimations.array"
:key="item.id"
v-bind:style="{ 'background-image': 'url(https://play.just-rp.com/animations/items/' + item.key + '.gif)' }"
v-bind:style="{ 'background-image': 'url(https://web-whistler-626.redl.app/animations/items/' + item.key + '.gif)' }"
@click="saveAnim(item)"
>
<div class="info">
+2 -1
View File
@@ -63,7 +63,8 @@ export default {
position: relative;
display: flex;
align-items: center;
justify-content: center;
justify-content: flex-start;
padding: 0 4rem 0 4rem;
}
&__line-left {
position: relative;
@@ -94,12 +94,14 @@ export default {
<style lang="scss" scoped>
.tab {
display: flex;
gap: 7.3rem;
&__side {
display: flex;
flex-direction: column;
color: #FFFFFF;
margin: 0 7.3rem 0 0;
margin: 0;
.title {
font-family: 'Oswald', sans-serif;
font-size: 7.5rem;
line-height: 7rem;
font-weight: bold;
@@ -110,13 +110,15 @@ export default {
<style lang="scss" scoped>
.tab {
display: flex;
gap: 6rem;
&__side {
display: flex;
flex-direction: column;
color: #FFFFFF;
.title {
font-family: 'Oswald', sans-serif;
font-size: 6rem;
line-height: 5rem;
line-height: 5.4rem;
font-weight: bold;
width: 25rem;
margin: 0 0 0.5rem 0;
+4 -3
View File
@@ -64,9 +64,10 @@ export default {
position: relative;
margin: 0 0 1.9rem 0;
.title {
font-size: 8.5rem;
line-height: 8rem;
font-weight: bold;
font-family: 'Oswald', sans-serif;
font-size: 7rem;
line-height: 8.5rem;
font-weight: 600;
text-transform: uppercase;
color: #FFFFFF;
width: 36.1rem;
+3 -1
View File
@@ -111,13 +111,15 @@ export default {
<style lang="scss" scoped>
.tab {
display: flex;
gap: 6rem;
&__side {
display: flex;
flex-direction: column;
color: #ffffff;
.title {
font-family: 'Oswald', sans-serif;
font-size: 6rem;
line-height: 5rem;
line-height: 5.4rem;
font-weight: bold;
width: 25rem;
margin: 0 0 0.5rem 0;
+3 -1
View File
@@ -65,14 +65,16 @@ export default {
<style lang="scss" scoped>
.container {
display: flex;
gap: 6rem;
width: fit-content;
}
.about {
color: #fff;
width: 25rem;
&__title {
font-family: 'Oswald', sans-serif;
font-size: 6rem;
line-height: 5rem;
line-height: 5.4rem;
font-weight: bold;
}
&__text {
@@ -128,7 +128,7 @@ export default {
width: 7rem;
min-width: 7rem;
padding-right: 1rem;
border-right: 1px solid rgba(255, 255, 255, 0.2);
border-right: 0.05rem solid rgba(255, 255, 255, 0.2);
padding-bottom: 8rem;
margin: 2rem 1rem 0 0;
&-info{
@@ -163,7 +163,7 @@ export default {
flex-direction: column;
padding-bottom: 1.5rem;
margin-bottom: 1.5rem;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
border-bottom: 0.05rem solid rgba(255, 255, 255, 0.1);
z-index: 1;
&-item{
width: 100%;
@@ -177,7 +177,7 @@ export default {
font-weight: bold;
font-size: .9rem;
text-transform: uppercase;
border-radius: 1px;
border-radius: 0.05rem;
transition: .3s;
&.active{
background-color: #B6D300;
@@ -103,13 +103,13 @@ export default {
position: relative;
background: url(/img/optionsMenu/referalsTab/bg.png) no-repeat top -1rem center;
background-size: auto 57rem ;
//border: 1px solid #fff;
//border: 0.05rem solid #fff;
color: #fff;
padding-top: 2rem;
&-side{
width: 26rem;
//height: 48rem;
//border: 1px solid #fff;
//border: 0.05rem solid #fff;
}
&-title{
position: relative;
@@ -156,7 +156,7 @@ export default {
}
&-progress{
width: 100%;
//border: 1px solid #fff;
//border: 0.05rem solid #fff;
height: 32rem;
margin-top: 1rem;
overflow-y: scroll;
@@ -118,36 +118,36 @@ export default {
.reports-layout {
display: grid;
grid-template-columns: 300px 1fr;
gap: 24px;
height: 600px;
grid-template-columns: 15rem 1fr;
gap: 1.2rem;
height: 30rem;
}
.reports-info {
display: flex;
flex-direction: column;
gap: 16px;
gap: 0.8rem;
}
.wide-btn {
width: 100%;
padding: 12px;
font-size: 14px;
padding: 0.6rem;
font-size: 0.7rem;
}
.rating-card {
.stars-container {
display: flex;
gap: 8px;
margin-top: 12px;
gap: 0.4rem;
margin-top: 0.6rem;
i {
font-size: 24px;
font-size: 1.2rem;
color: rgba(255, 255, 255, 0.1);
cursor: pointer;
transition: var(--transition);
&.active {
color: #ffc107;
text-shadow: 0 0 10px rgba(255, 193, 7, 0.4);
text-shadow: 0 0 0.5rem rgba(255, 193, 7, 0.4);
}
}
}
@@ -157,39 +157,39 @@ export default {
display: flex;
flex-direction: column;
background: rgba(0, 0, 0, 0.2);
border-radius: 16px;
border: 1px solid var(--border-color);
border-radius: 0.8rem;
border: 0.05rem solid var(--border-color);
overflow: hidden;
}
.messages-container {
flex: 1;
padding: 20px;
padding: 1rem;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 12px;
gap: 0.6rem;
&::-webkit-scrollbar { width: 4px; }
&::-webkit-scrollbar-thumb { background: var(--border-color); border-radius: 4px; }
&::-webkit-scrollbar { width: 0.2rem; }
&::-webkit-scrollbar-thumb { background: var(--border-color); border-radius: 0.2rem; }
}
.input-wrapper {
padding: 16px;
padding: 0.8rem;
background: rgba(255, 255, 255, 0.02);
border-top: 1px solid var(--border-color);
border-top: 0.05rem solid var(--border-color);
display: flex;
gap: 12px;
gap: 0.6rem;
}
.chat-input {
flex: 1;
background: rgba(255, 255, 255, 0.05);
border: 1px solid var(--border-color);
border-radius: 10px;
padding: 12px 16px;
border: 0.05rem solid var(--border-color);
border-radius: 0.5rem;
padding: 0.6rem 0.8rem;
color: #fff;
font-size: 14px;
font-size: 0.7rem;
outline: none;
transition: var(--transition);
&:focus {
@@ -199,9 +199,9 @@ export default {
}
.send-btn {
width: 44px;
height: 44px;
border-radius: 10px;
width: 2.2rem;
height: 2.2rem;
border-radius: 0.5rem;
background: var(--primary-color);
border: none;
color: #fff;
@@ -212,7 +212,7 @@ export default {
transition: var(--transition);
&:hover:not(:disabled) {
background: var(--primary-hover);
transform: translateY(-2px);
transform: translateY(-0.1rem);
}
&:disabled {
opacity: 0.5;
@@ -92,10 +92,10 @@ export default {
height: 3rem;
font-size: 1.2rem;
line-height: 1.45rem;
border: 1px solid rgba(#000, 0);
border: 0.05rem solid rgba(#000, 0);
&-selected{
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border: 0.05rem solid rgba(255, 255, 255, 0.1);
}
}
}
@@ -72,8 +72,8 @@ import { mapState, mapGetters } from 'vuex'
import InfoItem from './common/InfoItem.vue'
import ExtraItem from './common/ExtraItem.vue'
import ActionItem from './common/ActionItem.vue'
import TransportModal from './TransportModal.vue'
import BusinessModal from './BusinessModal.vue'
import TransportModal from './TransportModal'
import BusinessModal from './BusinessModal'
export default {
name: 'StatisticsTab',
@@ -149,7 +149,7 @@ export default {
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(5px);
backdrop-filter: blur(0.25rem);
z-index: 100;
}
@@ -48,7 +48,7 @@ export default {
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.8);
backdrop-filter: blur(15px);
backdrop-filter: blur(0.75rem);
z-index: 2000;
display: flex;
align-items: center;
@@ -56,22 +56,22 @@ export default {
}
.danger-modal {
width: 400px;
width: 20rem;
border-color: rgba(255, 71, 71, 0.3);
text-align: center;
}
.danger-icon {
font-size: 64px;
font-size: 3.2rem;
color: #ff4747;
margin-bottom: 20px;
filter: drop-shadow(0 0 15px rgba(255, 71, 71, 0.3));
margin-bottom: 1rem;
filter: drop-shadow(0 0 0.75rem rgba(255, 71, 71, 0.3));
}
.modal-subtitle {
font-size: 16px;
font-size: 0.8rem;
color: rgba(255, 255, 255, 0.8);
margin-bottom: 30px;
margin-bottom: 1.5rem;
}
.danger-btn {
@@ -79,7 +79,7 @@ export default {
width: 100%;
&:hover {
background: #ff6b6b;
box-shadow: 0 4px 20px rgba(255, 71, 71, 0.4);
box-shadow: 0 0.2rem 1rem rgba(255, 71, 71, 0.4);
}
}
</style>
@@ -23,7 +23,7 @@ export default {
display: flex;
justify-content: center;
align-items: center;
border: 1px solid rgba(255, 255, 255, 0.1);
border: 0.05rem solid rgba(255, 255, 255, 0.1);
background: rgba(255, 255, 255, 0.1);
&::after {
content: "";
@@ -41,7 +41,7 @@ export default {
left: 50%;
height: 0.1rem;
width: 100%;
box-shadow: 0px -1rem 2rem 0.2rem #A2BC1F;
box-shadow: 0 -1rem 2rem 0.2rem #A2BC1F;
background: #A2BC1F;
opacity: 0;
}
@@ -79,7 +79,7 @@ export default {
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(10px);
backdrop-filter: blur(0.5rem);
z-index: 2000;
display: flex;
align-items: center;
@@ -87,25 +87,25 @@ export default {
}
.modal-window {
width: 450px;
width: 22.5rem;
background: var(--bg-main);
border: 1px solid var(--border-color);
border-radius: 20px;
padding: 30px;
box-shadow: 0 25px 50px rgba(0, 0, 0, 0.5);
border: 0.05rem solid var(--border-color);
border-radius: 1rem;
padding: 1.5rem;
box-shadow: 0 1.25rem 2.5rem rgba(0, 0, 0, 0.5);
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24px;
padding-bottom: 12px;
border-bottom: 1px solid var(--border-color);
margin-bottom: 1.2rem;
padding-bottom: 0.6rem;
border-bottom: 0.05rem solid var(--border-color);
h3 {
font-size: 18px;
font-size: 0.9rem;
text-transform: uppercase;
letter-spacing: 1px;
letter-spacing: 0.05rem;
color: #fff;
}
}
@@ -113,9 +113,9 @@ export default {
.modal-close {
background: rgba(255, 255, 255, 0.05);
border: none;
width: 32px;
height: 32px;
border-radius: 8px;
width: 1.6rem;
height: 1.6rem;
border-radius: 0.4rem;
display: flex;
align-items: center;
justify-content: center;
@@ -129,20 +129,20 @@ export default {
}
.modal-subtitle {
font-size: 14px;
font-size: 0.7rem;
color: var(--text-muted);
margin-bottom: 20px;
margin-bottom: 1rem;
text-align: center;
}
.dialog-input {
width: 100%;
background: rgba(255, 255, 255, 0.05);
border: 1px solid var(--border-color);
border-radius: 10px;
padding: 12px 16px;
border: 0.05rem solid var(--border-color);
border-radius: 0.5rem;
padding: 0.6rem 0.8rem;
color: #fff;
margin-bottom: 16px;
margin-bottom: 0.8rem;
outline: none;
transition: var(--transition);
&:focus {
@@ -151,23 +151,23 @@ export default {
}
.key-display {
font-size: 32px;
font-size: 1.6rem;
font-weight: 800;
color: var(--primary-color);
text-align: center;
margin: 20px 0;
margin: 1rem 0;
}
.dialog-footer {
display: flex;
gap: 12px;
margin-top: 24px;
gap: 0.6rem;
margin-top: 1.2rem;
}
.confirm-btn, .cancel-btn {
flex: 1;
padding: 12px;
border-radius: 10px;
padding: 0.6rem;
border-radius: 0.5rem;
font-weight: 700;
text-transform: uppercase;
cursor: pointer;
@@ -180,13 +180,13 @@ export default {
color: #fff;
&:hover {
background: var(--primary-hover);
box-shadow: 0 4px 15px rgba(109, 85, 166, 0.4);
box-shadow: 0 0.2rem 0.75rem rgba(109, 85, 166, 0.4);
}
}
.cancel-btn {
background: rgba(255, 255, 255, 0.05);
border: 1px solid var(--border-color);
border: 0.05rem solid var(--border-color);
color: var(--text-muted);
&:hover {
background: rgba(255, 255, 255, 0.1);
+2
View File
@@ -1,4 +1,5 @@
<template>
<div class="options-menu-root">
<div class="app-container show">
<Sidebar
:active-section="rightTab"
@@ -32,6 +33,7 @@
<Dialog v-if="dialog" :dialog="dialog" />
<CaptAttack v-if="captAttack" />
</div>
</div>
</template>
<script>
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -31,7 +31,7 @@ import { mapActions, mapGetters, mapState } from 'vuex';
export default {
data() {
return {
imgUrl: "https://play.just-rp.com/languages/",
imgUrl: "https://web-whistler-626.redl.app/languages/",
current: "ru"
}
},
+32 -13
View File
@@ -5,7 +5,7 @@
Ничего устанавливать руками не нужно:
1. Зайди на **[redl.io](https://redl.io)** и закажи игровой сервер или VDS (подойдёт конфиг от 2 CPU / 4 ГБ RAM).
2. Открой чат ИИ-агента в панели и напиши:
> «Разверни мод Whistler из репозитория https://git-1.redl.app/1themotiv/whistler — базы, сборку, конфиги и сервис локализации сделай сам»
> «Разверни мод Whistler из репозитория https://git-1.redl.app/robimobi/whistler — базы, сборку, конфиги и сервис локализации сделай сам»
3. Агент сам поставит .NET, MySQL и RAGE:MP, зальёт схемы баз, соберёт мод, поднимет сервис локализации и отдаст готовый адрес сервера. Любые доработки дальше — тоже словами в чат.
## Способ 2 — вручную
@@ -30,7 +30,7 @@
|---|---|---|
| RAGE:MP Server | актуальный (линукс `linux_x64.tar.gz` / виндовс updater) | сама платформа мультиплеера |
| .NET Core SDK | **3.1** (мод собран под netcoreapp3.1) | сборка/запуск серверной логики C# |
| MySQL / MariaDB | 8.0+ / 10.5+ | две базы (главная + банковская) |
| MySQL / MariaDB | 8.0+ / 10.5+ | четыре базы (главная, логи, core, банковская) |
| Node.js | 1416 LTS | сборка GUI (webpack) и сервис локализации |
| Git | любой | клонирование репозитория |
@@ -50,7 +50,7 @@ apt install -y dotnet-sdk-3.1 || snap install dotnet-sdk --classic --channel=3.1
### 2. Базы данных
```bash
git clone https://git-1.redl.app/1themotiv/whistler.git /opt/whistler
git clone https://git-1.redl.app/robimobi/whistler.git /opt/whistler
cd /opt/whistler
mysql -e "CREATE DATABASE whistler_main CHARACTER SET utf8mb4; CREATE DATABASE whistler_mainlogs CHARACTER SET utf8mb4; CREATE DATABASE whistler_maincore CHARACTER SET utf8mb4; CREATE DATABASE whistler CHARACTER SET utf8mb4;"
mysql -e "CREATE USER 'whistler'@'localhost' IDENTIFIED BY 'ПРИДУМАЙ_ПАРОЛЬ'; GRANT ALL ON `whistler_main%`.* TO 'whistler'@'localhost'; GRANT ALL ON whistler.* TO 'whistler'@'localhost';"
@@ -64,6 +64,8 @@ mysql whistler < db/whistler_bank.schema.sql
mysql whistler < db/bank_migrations.sql
```
> На машине с 2 ГБ RAM дополнительно ужмите MariaDB: `cp deploy/config/99-lowmem.cnf /etc/mysql/mariadb.conf.d/ && systemctl restart mariadb`
### 3. RAGE:MP сервер
```bash
mkdir -p /opt/ragemp && cd /opt/ragemp
@@ -88,17 +90,29 @@ dotnet build Whistler.sln -c Release
ln -s /opt/whistler/dotnet /opt/ragemp/dotnet
```
**Важно для Linux (проверено на реальном развёртывании):**
- Линуксовый мост RAGE:MP **молча не грузит ресурс**, пока он не объявлен в `dotnet/settings.xml` рядом с рантаймом: скопируйте `deploy/config/settings.xml` (внутри `<resource src="Whistler" />`).
- `settings.json` кладётся рядом с `ragemp-server` (шаблон — `settings.example.json` в корне репо), про мост и ICU — см. «Три вещи» выше.
### 6. Клиентская часть
```bash
ln -s /opt/whistler/client_packages /opt/ragemp/client_packages
# GUI уже собран (client_packages/gui). Пересобрать после правок:
cd /opt/whistler/Gui && npm ci && npm run build
# GUI уже собран (client_packages/gui — свежая сборка со всеми фиксами шрифтов и экранов).
```
Пересборка GUI после своих правок (Node 18/20):
```bash
cd /opt/whistler/Gui
npm ci --legacy-peer-deps # в lock-файле есть конфликты peer deps
NODE_OPTIONS=--openssl-legacy-provider npm run build # старый webpack на новом Node
```
### 7. Запуск
```bash
cd /opt/ragemp && ./ragemp-server
# в проде: под systemd/screen; лог смотри в server.out
# в проде под systemd: готовые юниты в deploy/systemd/
cp /opt/whistler/deploy/systemd/*.service /etc/systemd/system/
systemctl daemon-reload && systemctl enable --now whistler-api ragemp
```
---
@@ -114,7 +128,7 @@ cd /opt/ragemp && ./ragemp-server
### 2. Клонировать и развернуть базы (PowerShell)
```powershell
git clone https://git-1.redl.app/1themotiv/whistler.git C:\whistler
git clone https://git-1.redl.app/robimobi/whistler.git C:\whistler
cd C:\whistler
& "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" -uroot -p -e "CREATE DATABASE whistler_main CHARACTER SET utf8mb4; CREATE DATABASE whistler_mainlogs CHARACTER SET utf8mb4; CREATE DATABASE whistler_maincore CHARACTER SET utf8mb4; CREATE DATABASE whistler CHARACTER SET utf8mb4;"
Get-Content db\whistler_core.schema.sql | & "...\mysql.exe" -uroot -p whistler_main
@@ -155,12 +169,13 @@ node index.js # слушает 127.0.0.1:62333
# проверка: curl http://127.0.0.1:62333/api/localize/ru → JSON словаря
```
**Подключение к GUI**: адрес прошит в `Gui/src/store/localization/index.js`:
```js
apiURL: "https://play.just-rp.com/api/localize/", // ← замени на свой, напр. http://ТВОЙ_IP:62333/api/localize/
listUrl: "https://play.just-rp.com/api/localize/list",
```
После замены пересобери GUI (`cd Gui && npm run build`). В проде повесь api за nginx/caddy с HTTPS и открой порт наружу (или проксируй с того же домена). Автозапуск: `pm2 start index.js --name whistler-api` (Linux) / NSSM или Планировщик задач (Windows).
**Подключение к GUI**: адреса прошиты в исходниках. Сейчас они указывают на живой демо-домен `web-whistler-626.redl.app` (работает — можно сразу тестировать), для своего сервера замените на свой домен в 4 файлах:
- `Gui/src/store/localization/index.js` — `apiURL`, `listUrl` (словари)
- `Gui/src/store/sounds/index.js` — хост звуков
- `Gui/src/views/SelectLanguage/index.vue` — картинки флагов
- `Gui/src/views/AnimationsMenu/components/AnimationsList.vue` — превью анимаций
После замены пересоберите GUI (см. шаг 6). В проде повесьте api за Caddy/nginx с HTTPS (готовый пример — `deploy/config/Caddyfile.example`, он же раздаёт веб-превью интерфейса). Автозапуск — юнит `deploy/systemd/whistler-api.service`.
## Первый вход в игру
@@ -178,10 +193,14 @@ listUrl: "https://play.just-rp.com/api/localize/list",
|---|---|
| Сервер падает на старте с ошибкой БД | строки подключения в `settings.json` (лежит РЯДОМ с ragemp-server, не в репо) |
| «мод пытается накатить миграции и падает» | не залит `db/*_migrations.sql` (история EF) |
| Linux: сервер стартует, но ресурс Whistler не грузится | нет `dotnet/settings.xml` с `<resource src="Whistler"/>` — мост молчит без ошибок |
| Экраны показывают `AUTH:LOGIN:...` вместо текста | не запущен/не прописан сервис локализации (см. выше) |
| GUI не изменился после правок | пересобери `Gui` (`npm run build`) — клиент берёт бандл из `client_packages/gui` |
| Ошибка Table '...logs.itemslog' doesn't exist | логовая база не создана или названа не как главная+logs |
| В игре интерфейс «разъехался» / старый | битый кэш клиента: удалить папку `client_resources` в папке RAGE:MP и перезайти |
| Тексты интерфейса «слипаются», не тот шрифт | старая сборка GUI: возьмите свежий `client_packages/gui` из этого репо (шрифты и кегли исправлены) |
| dotnet build ругается на версию | нужен именно SDK **3.1** (`dotnet --list-sdks`) |
| npm ci падает по peer deps / сборка по OpenSSL | `npm ci --legacy-peer-deps` и `NODE_OPTIONS=--openssl-legacy-provider` (см. шаг 6) |
---
<p align="center">Powered by <a href="https://redl.io"><b>REDL.IO</b></a> — AI Game Hosting: сервер + ИИ-агент, который устанавливает моды за тебя</p>
+21
View File
@@ -86,6 +86,27 @@ db/ — ЧИСТЫЕ схемы обеих баз MySQL + истор
Полный набор — в `docs/screenshots/`.
## Обновление 2026-08 — рабочая сборка ✅
Проект доведён до состояния «клонировал → развернул → играешь» (проверено живым развёртыванием на VDS):
**Восстановлено недостающее** (без этого проект не собирался/не запускался):
- Конфиги GUI, которые авторы прятали в `.gitignore`: `newDonateShop/{items,roulette,coinkits,rarityPrices,primeAccount}.js`, `gameMakeWeapon/{levels,guns}.js`, `gameMetalPlant/levels.js` — добавлены рабочие версии, `.gitignore` почищен.
- База игровых логов (19 таблиц) — схемы не было в дампах, восстановлена из кода: `db/whistler_logs.schema.sql` (копия — `deploy/sql/`); именование баз — см. INSTALL.md.
- Шрифты: в репо не было ни одного `@font-face` для семейств, которые требует дизайн (`Russian`, `Qanelas`, `Bebas Neue Pro`…) — интерфейс рендерился Times New Roman и разъезжался. Добавлены Inter/Oswald/Noto и алиасы в `Gui/public/fonts/font.css`. Для кириллических заголовков — **Oswald** (у Bebas Neue кириллицы нет).
- Починен импорт `TransportModal`/`BusinessModal` в статистике (сборка падала).
**Исправлено**:
- Экраны Auth (вход/регистрация/восстановление/приветствие): узкий дисплейный шрифт, размеры и отступы — текст больше не наезжает на формы.
- Дев-панель выбора экранов показывается только в dev-режиме (в игре её больше нет).
- `*.csproj`: PostBuild-шаги (`xcopy`) выполняются только на Windows — на Linux сборка больше не падает.
- `client_packages/gui` — свежая сборка со всеми фиксами (можно не пересобирать).
**Добавлено для развёртывания** — папка `deploy/`:
- `systemd/` — юниты `ragemp.service` и `whistler-api.service`
- `config/``conf.json`, `settings.xml` (обязателен для линуксового моста!), `Caddyfile.example`, `99-lowmem.cnf` для машин с 2 ГБ RAM
- `sql/` — схема базы логов
## Как запустить
**Полная пошаговая инструкция (Linux + Windows + сервис локализации): [INSTALL.md](INSTALL.md).** Кратко:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
.range-slider{display:inline-block;padding:0 10px;height:20px;width:130px}.range-slider.disabled{opacity:.5}.range-slider-inner{display:inline-block;position:relative;height:100%;width:100%}.range-slider-fill,.range-slider-rail{display:block;position:absolute;top:50%;left:0;height:4px;border-radius:2px;transform:translateY(-50%)}.range-slider-rail{width:100%;background-color:#e2e2e2}.range-slider-fill{background-color:#21fb92}.range-slider-knob{display:block;position:absolute;top:50%;left:0;box-sizing:border-box;height:20px;width:20px;border:1px solid #f5f5f5;border-radius:50%;background-color:#fff;box-shadow:1px 1px rgba(0,0,0,.2);transform:translate(-50%,-50%);cursor:pointer}.range-slider-hidden{display:none}.vue-recycle-scroller{position:relative}.vue-recycle-scroller.direction-vertical:not(.page-mode){overflow-y:auto}.vue-recycle-scroller.direction-horizontal:not(.page-mode){overflow-x:auto}.vue-recycle-scroller.direction-horizontal{display:-webkit-box;display:-ms-flexbox;display:flex}.vue-recycle-scroller__slot{-webkit-box-flex:1;-ms-flex:auto 0 0px;flex:auto 0 0}.vue-recycle-scroller__item-wrapper{-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;position:relative}.vue-recycle-scroller.ready .vue-recycle-scroller__item-view{position:absolute;top:0;left:0;will-change:transform}.vue-recycle-scroller.direction-vertical .vue-recycle-scroller__item-wrapper{width:100%}.vue-recycle-scroller.direction-horizontal .vue-recycle-scroller__item-wrapper{height:100%}.vue-recycle-scroller.ready.direction-vertical .vue-recycle-scroller__item-view{width:100%}.vue-recycle-scroller.ready.direction-horizontal .vue-recycle-scroller__item-view{height:100%}.resize-observer[data-v-b329ee4c]{border:none;background-color:transparent;opacity:0}.resize-observer[data-v-b329ee4c],.resize-observer[data-v-b329ee4c] object{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;pointer-events:none;display:block;overflow:hidden}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+5
View File
@@ -422,3 +422,8 @@
font-weight: 400;
font-style: normal;
}
@font-face { font-family: 'Oswald'; src: url('Oswald-400.ttf') format('truetype'); font-weight: 400; font-style: normal; }
@font-face { font-family: 'Oswald'; src: url('Oswald-500.ttf') format('truetype'); font-weight: 500; font-style: normal; }
@font-face { font-family: 'Oswald'; src: url('Oswald-600.ttf') format('truetype'); font-weight: 600; font-style: normal; }
@font-face { font-family: 'Oswald'; src: url('Oswald-700.ttf') format('truetype'); font-weight: 700; font-style: normal; }
+1 -14
View File
@@ -1,14 +1 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="stylesheet" href="./fonts/font.css">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<title></title>
<link href="/js/app.js" rel="preload" as="script"><link href="/js/chunk-vendors.js" rel="preload" as="script"></head>
<body>
<div id="app"></div>
<script type="text/javascript" src="/js/chunk-vendors.js"></script><script type="text/javascript" src="/js/app.js"></script></body>
</html>
<!DOCTYPE html><html lang=ru><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=stylesheet href=./fonts/font.css><link href=https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css rel=stylesheet><title></title><link href=/css/app.css rel=preload as=style><link href=/css/chunk-vendors.css rel=preload as=style><link href=/js/app.js rel=preload as=script><link href=/js/chunk-vendors.js rel=preload as=script><link href=/css/chunk-vendors.css rel=stylesheet><link href=/css/app.css rel=stylesheet></head><body><div id=app></div><script src=/js/chunk-vendors.js></script><script src=/js/app.js></script></body></html>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+6
View File
@@ -0,0 +1,6 @@
# MariaDB для машин с 2GB RAM — положить в /etc/mysql/mariadb.conf.d/
[mysqld]
innodb_buffer_pool_size = 64M
key_buffer_size = 8M
max_connections = 40
performance_schema = OFF
+12
View File
@@ -0,0 +1,12 @@
# Веб-превью GUI + проксирование API локализации (опционально).
# Замените домен на свой. Порт 80 должен быть открыт — через него Caddy получает сертификат.
your-domain.example.com {
encode gzip
handle /api/localize/* {
reverse_proxy 127.0.0.1:62333
}
handle {
root * /opt/whistler-web
file_server
}
}
+16
View File
@@ -0,0 +1,16 @@
{
"language": "ru",
"maxplayers": 100,
"name": "MY SERVER",
"stream-distance": 300,
"announce": false,
"csharp": "enabled",
"port": 22005,
"voice-chat": true,
"voice-chat-sample-rate": 48000,
"http-threads": 16,
"api-threading-debugging": false,
"server-side-weapons-only-mode": true,
"allow-cef-debugging": false
}
+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<resource src="Whistler" />
<acl_enabled>true</acl_enabled>
<log_console>true</log_console>
<log_chat>true</log_chat>
</config>
+276
View File
@@ -0,0 +1,276 @@
/*M!999999\- enable the sandbox mode */
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `adminlog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `adminlog` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`time` text DEFAULT NULL,
`admin` text DEFAULT NULL,
`action` text DEFAULT NULL,
`player` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `arrestlog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `arrestlog` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`time` text DEFAULT NULL,
`player` text DEFAULT NULL,
`target` text DEFAULT NULL,
`reason` text DEFAULT NULL,
`stars` text DEFAULT NULL,
`pnick` text DEFAULT NULL,
`tnick` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `banlog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `banlog` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`time` text DEFAULT NULL,
`admin` text DEFAULT NULL,
`player` text DEFAULT NULL,
`until` text DEFAULT NULL,
`reason` text DEFAULT NULL,
`ishard` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `boxlog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `boxlog` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`time` text DEFAULT NULL,
`boxId` text DEFAULT NULL,
`uuid` text DEFAULT NULL,
`item` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `casinologs`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `casinologs` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`operation` text DEFAULT NULL,
`money` text DEFAULT NULL,
`playername` text DEFAULT NULL,
`datetime` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `chatlogs`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `chatlogs` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`uuid` text DEFAULT NULL,
`typechat` text DEFAULT NULL,
`message` text DEFAULT NULL,
`datetime` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `connlog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `connlog` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`in` text DEFAULT NULL,
`out` text DEFAULT NULL,
`uuid` text DEFAULT NULL,
`sclub` text DEFAULT NULL,
`hwid` text DEFAULT NULL,
`ip` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `deletelog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `deletelog` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`time` text DEFAULT NULL,
`uuid` text DEFAULT NULL,
`name` text DEFAULT NULL,
`account` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `donateroulettelog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `donateroulettelog` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`time` text DEFAULT NULL,
`name` text DEFAULT NULL,
`uuid` text DEFAULT NULL,
`droprarity` text DEFAULT NULL,
`droptype` text DEFAULT NULL,
`dropvalue` text DEFAULT NULL,
`isfree` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `donateshoplog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `donateshoplog` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`time` text DEFAULT NULL,
`uuid` text DEFAULT NULL,
`price` text DEFAULT NULL,
`typeproduct` text DEFAULT NULL,
`product` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `fractionmoney`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `fractionmoney` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`fractionId` text DEFAULT NULL,
`operation` text DEFAULT NULL,
`sum` text DEFAULT NULL,
`date` text DEFAULT NULL,
`description` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `idlog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `idlog` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`in` text DEFAULT NULL,
`out` text DEFAULT NULL,
`uuid` text DEFAULT NULL,
`id` text DEFAULT NULL,
`name` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `itemslog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `itemslog` (
`time` text DEFAULT NULL,
`id` bigint(20) NOT NULL DEFAULT 0,
`from` text DEFAULT NULL,
`to` text DEFAULT NULL,
`type` text DEFAULT NULL,
`amount` text DEFAULT NULL,
`data` text DEFAULT NULL,
`action` text DEFAULT NULL,
`player` text DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `killog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `killog` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`killer` text DEFAULT NULL,
`target` text DEFAULT NULL,
`clientweapon` text DEFAULT NULL,
`serverweapon` text DEFAULT NULL,
`distance` text DEFAULT NULL,
`date` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `moneylog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `moneylog` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`time` text DEFAULT NULL,
`from` text DEFAULT NULL,
`to` text DEFAULT NULL,
`amount` text DEFAULT NULL,
`comment` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `namelog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `namelog` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`time` text DEFAULT NULL,
`uuid` text DEFAULT NULL,
`old` text DEFAULT NULL,
`new` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `newmoneylog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `newmoneylog` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`time` text DEFAULT NULL,
`fromtype` text DEFAULT NULL,
`from` text DEFAULT NULL,
`totype` text DEFAULT NULL,
`to` text DEFAULT NULL,
`amount` text DEFAULT NULL,
`tax` text DEFAULT NULL,
`comment` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `ticketlog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `ticketlog` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`time` text DEFAULT NULL,
`player` text DEFAULT NULL,
`target` text DEFAULT NULL,
`sum` text DEFAULT NULL,
`reason` text DEFAULT NULL,
`pnick` text DEFAULT NULL,
`tnick` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `votelog`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8mb4 */;
CREATE TABLE `votelog` (
`_rid` bigint(20) NOT NULL AUTO_INCREMENT,
`election` text DEFAULT NULL,
`login` text DEFAULT NULL,
`votefor` text DEFAULT NULL,
`time` text DEFAULT NULL,
PRIMARY KEY (`_rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+16
View File
@@ -0,0 +1,16 @@
[Unit]
Description=RAGE:MP server (Whistler)
After=network.target mariadb.service whistler-api.service
Wants=mariadb.service
[Service]
WorkingDirectory=/opt/ragemp
ExecStart=/opt/ragemp/ragemp-server
Restart=always
RestartSec=5
LimitNOFILE=65535
Environment=DOTNET_ROOT=/usr/share/dotnet
Environment=DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
[Install]
WantedBy=multi-user.target
+12
View File
@@ -0,0 +1,12 @@
[Unit]
Description=Whistler localization API
After=network.target
[Service]
WorkingDirectory=/opt/whistler/api
ExecStart=/usr/bin/node /opt/whistler/api/index.js
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
@@ -5,6 +5,6 @@
</PropertyGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="xcopy &quot;$(OutDir)*.dll&quot; &quot;\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;xcopy &quot;$(OutDir)*.pdb&quot; &quot;\Whistler\*.*&quot; /Q /D /Y" />
<Exec Condition="'$(OS)' == 'Windows_NT'" Command="xcopy &quot;$(OutDir)*.dll&quot; &quot;\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;xcopy &quot;$(OutDir)*.pdb&quot; &quot;\Whistler\*.*&quot; /Q /D /Y" />
</Target>
</Project>
@@ -5,6 +5,6 @@
</PropertyGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="xcopy &quot;$(OutDir)*.dll&quot; &quot;\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;xcopy &quot;$(OutDir)*.pdb&quot; &quot;\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;" />
<Exec Condition="'$(OS)' == 'Windows_NT'" Command="xcopy &quot;$(OutDir)*.dll&quot; &quot;\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;xcopy &quot;$(OutDir)*.pdb&quot; &quot;\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;" />
</Target>
</Project>
@@ -5,7 +5,7 @@
</PropertyGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="xcopy &quot;$(OutDir)*.dll&quot; &quot;\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;xcopy &quot;$(OutDir)*.pdb&quot; &quot;\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;" />
<Exec Condition="'$(OS)' == 'Windows_NT'" Command="xcopy &quot;$(OutDir)*.dll&quot; &quot;\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;xcopy &quot;$(OutDir)*.pdb&quot; &quot;\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;" />
</Target>
<ItemGroup>
@@ -5,7 +5,7 @@
</PropertyGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="xcopy &quot;$(OutDir)*.dll&quot; &quot;\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;xcopy &quot;$(OutDir)*.pdb&quot; &quot;\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;" />
<Exec Condition="'$(OS)' == 'Windows_NT'" Command="xcopy &quot;$(OutDir)*.dll&quot; &quot;\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;xcopy &quot;$(OutDir)*.pdb&quot; &quot;\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;" />
</Target>
<ItemGroup>
+1 -1
View File
@@ -83,7 +83,7 @@
</PropertyGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="xcopy &quot;$(OutDir)*.dll&quot; &quot;..\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;xcopy &quot;$(OutDir)*.pdb&quot; &quot;..\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;xcopy &quot;meta.xml&quot; &quot;..\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;xcopy &quot;..\Whistler\*&quot; &quot;..\Whistler\*.*&quot; /Q /D /Y" />
<Exec Condition="'$(OS)' == 'Windows_NT'" Command="xcopy &quot;$(OutDir)*.dll&quot; &quot;..\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;xcopy &quot;$(OutDir)*.pdb&quot; &quot;..\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;xcopy &quot;meta.xml&quot; &quot;..\Whistler\*.*&quot; /Q /D /Y&#xD;&#xA;xcopy &quot;..\Whistler\*&quot; &quot;..\Whistler\*.*&quot; /Q /D /Y" />
</Target>
<ProjectExtensions><VisualStudio><UserProperties /></VisualStudio></ProjectExtensions>