Compare commits

...
6 Commits
Author SHA1 Message Date
REDL Agent e946c8d9cc gameconfig: расширенные лимиты GTA V из оригинальной сборки (+ pausemenu) — без него клиент вылетал на 133 паках 2026-08-19 04:01:58 +00:00
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
67 changed files with 8535 additions and 101162 deletions
+21 -29
View File
@@ -1,29 +1,21 @@
.DS_Store .DS_Store
node_modules node_modules
/dist /dist
src/configs/newDonateShop/roulette.js
src/configs/newDonateShop/items.js # local env files
src/configs/newDonateShop/rarityPrices.js .env.local
src/configs/newDonateShop/primeAccount.js .env.*.local
src/configs/newDonateShop/coinkits.js
src/configs/gameMakeWeapon/ # Log files
src/configs/gameMetalPlant/ npm-debug.log*
src/configs/GameMetalPlant/ yarn-debug.log*
yarn-error.log*
# local env files
.env.local # Editor directories and files
.env.*.local .idea
.vscode
# Log files *.suo
npm-debug.log* *.ntvs*
yarn-debug.log* *.njsproj
yarn-error.log* *.sln
*.sw?
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
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-weight: 400;
font-style: normal; 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"/> <dialog-menu-overlay v-if="dialogMenuShow"/>
<TimerTemo v-if="timeTemo > 0" :time="timeTemo" :length="lengthTemo"/> <TimerTemo v-if="timeTemo > 0" :time="timeTemo" :length="lengthTemo"/>
<LoadScreen v-if="loadScreen"/> <LoadScreen v-if="loadScreen"/>
<MenuPicker/> <MenuPicker v-if="isDev"/>
<!-- <DevConsole v-if="console.show"/> --> <!-- <DevConsole v-if="console.show"/> -->
</div> </div>
</template> </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, namespaced: true,
state: { state: {
local: null, local: null,
apiURL: "https://play.just-rp.com/api/localize/", //https://play.just-rp.com/api/localize/ apiURL: "https://web-whistler-626.redl.app/api/localize/", //https://web-whistler-626.redl.app/api/localize/
listUrl: "https://play.just-rp.com/api/localize/list", listUrl: "https://web-whistler-626.redl.app/api/localize/list",
langs:{ langs:{
list:null, list:null,
cur: 'no' cur: 'no'
+1 -1
View File
@@ -5,7 +5,7 @@ export default {
sounds, sounds,
loaded:{}, loaded:{},
current: "", current: "",
host: "https://play.just-rp.com/sounds" host: "https://web-whistler-626.redl.app/sounds"
}, },
mutations: { mutations: {
play(state, {name, volume = 1, loop = false}){ play(state, {name, volume = 1, loop = false}){
@@ -4,7 +4,7 @@
class="animations-list__item" class="animations-list__item"
v-for="item in currentAnimations.array" v-for="item in currentAnimations.array"
:key="item.id" :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)" @click="saveAnim(item)"
> >
<div class="info"> <div class="info">
+2 -1
View File
@@ -63,7 +63,8 @@ export default {
position: relative; position: relative;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: flex-start;
padding: 0 4rem 0 4rem;
} }
&__line-left { &__line-left {
position: relative; position: relative;
@@ -94,12 +94,14 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.tab { .tab {
display: flex; display: flex;
gap: 7.3rem;
&__side { &__side {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
color: #FFFFFF; color: #FFFFFF;
margin: 0 7.3rem 0 0; margin: 0;
.title { .title {
font-family: 'Oswald', sans-serif;
font-size: 7.5rem; font-size: 7.5rem;
line-height: 7rem; line-height: 7rem;
font-weight: bold; font-weight: bold;
@@ -110,13 +110,15 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.tab { .tab {
display: flex; display: flex;
gap: 6rem;
&__side { &__side {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
color: #FFFFFF; color: #FFFFFF;
.title { .title {
font-family: 'Oswald', sans-serif;
font-size: 6rem; font-size: 6rem;
line-height: 5rem; line-height: 5.4rem;
font-weight: bold; font-weight: bold;
width: 25rem; width: 25rem;
margin: 0 0 0.5rem 0; margin: 0 0 0.5rem 0;
+4 -3
View File
@@ -64,9 +64,10 @@ export default {
position: relative; position: relative;
margin: 0 0 1.9rem 0; margin: 0 0 1.9rem 0;
.title { .title {
font-size: 8.5rem; font-family: 'Oswald', sans-serif;
line-height: 8rem; font-size: 7rem;
font-weight: bold; line-height: 8.5rem;
font-weight: 600;
text-transform: uppercase; text-transform: uppercase;
color: #FFFFFF; color: #FFFFFF;
width: 36.1rem; width: 36.1rem;
+3 -1
View File
@@ -111,13 +111,15 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.tab { .tab {
display: flex; display: flex;
gap: 6rem;
&__side { &__side {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
color: #ffffff; color: #ffffff;
.title { .title {
font-family: 'Oswald', sans-serif;
font-size: 6rem; font-size: 6rem;
line-height: 5rem; line-height: 5.4rem;
font-weight: bold; font-weight: bold;
width: 25rem; width: 25rem;
margin: 0 0 0.5rem 0; margin: 0 0 0.5rem 0;
+3 -1
View File
@@ -65,14 +65,16 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.container { .container {
display: flex; display: flex;
gap: 6rem;
width: fit-content; width: fit-content;
} }
.about { .about {
color: #fff; color: #fff;
width: 25rem; width: 25rem;
&__title { &__title {
font-family: 'Oswald', sans-serif;
font-size: 6rem; font-size: 6rem;
line-height: 5rem; line-height: 5.4rem;
font-weight: bold; font-weight: bold;
} }
&__text { &__text {
@@ -128,7 +128,7 @@ export default {
width: 7rem; width: 7rem;
min-width: 7rem; min-width: 7rem;
padding-right: 1rem; 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; padding-bottom: 8rem;
margin: 2rem 1rem 0 0; margin: 2rem 1rem 0 0;
&-info{ &-info{
@@ -163,7 +163,7 @@ export default {
flex-direction: column; flex-direction: column;
padding-bottom: 1.5rem; padding-bottom: 1.5rem;
margin-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; z-index: 1;
&-item{ &-item{
width: 100%; width: 100%;
@@ -177,7 +177,7 @@ export default {
font-weight: bold; font-weight: bold;
font-size: .9rem; font-size: .9rem;
text-transform: uppercase; text-transform: uppercase;
border-radius: 1px; border-radius: 0.05rem;
transition: .3s; transition: .3s;
&.active{ &.active{
background-color: #B6D300; background-color: #B6D300;
@@ -103,13 +103,13 @@ export default {
position: relative; position: relative;
background: url(/img/optionsMenu/referalsTab/bg.png) no-repeat top -1rem center; background: url(/img/optionsMenu/referalsTab/bg.png) no-repeat top -1rem center;
background-size: auto 57rem ; background-size: auto 57rem ;
//border: 1px solid #fff; //border: 0.05rem solid #fff;
color: #fff; color: #fff;
padding-top: 2rem; padding-top: 2rem;
&-side{ &-side{
width: 26rem; width: 26rem;
//height: 48rem; //height: 48rem;
//border: 1px solid #fff; //border: 0.05rem solid #fff;
} }
&-title{ &-title{
position: relative; position: relative;
@@ -156,7 +156,7 @@ export default {
} }
&-progress{ &-progress{
width: 100%; width: 100%;
//border: 1px solid #fff; //border: 0.05rem solid #fff;
height: 32rem; height: 32rem;
margin-top: 1rem; margin-top: 1rem;
overflow-y: scroll; overflow-y: scroll;
@@ -118,36 +118,36 @@ export default {
.reports-layout { .reports-layout {
display: grid; display: grid;
grid-template-columns: 300px 1fr; grid-template-columns: 15rem 1fr;
gap: 24px; gap: 1.2rem;
height: 600px; height: 30rem;
} }
.reports-info { .reports-info {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 16px; gap: 0.8rem;
} }
.wide-btn { .wide-btn {
width: 100%; width: 100%;
padding: 12px; padding: 0.6rem;
font-size: 14px; font-size: 0.7rem;
} }
.rating-card { .rating-card {
.stars-container { .stars-container {
display: flex; display: flex;
gap: 8px; gap: 0.4rem;
margin-top: 12px; margin-top: 0.6rem;
i { i {
font-size: 24px; font-size: 1.2rem;
color: rgba(255, 255, 255, 0.1); color: rgba(255, 255, 255, 0.1);
cursor: pointer; cursor: pointer;
transition: var(--transition); transition: var(--transition);
&.active { &.active {
color: #ffc107; 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; display: flex;
flex-direction: column; flex-direction: column;
background: rgba(0, 0, 0, 0.2); background: rgba(0, 0, 0, 0.2);
border-radius: 16px; border-radius: 0.8rem;
border: 1px solid var(--border-color); border: 0.05rem solid var(--border-color);
overflow: hidden; overflow: hidden;
} }
.messages-container { .messages-container {
flex: 1; flex: 1;
padding: 20px; padding: 1rem;
overflow-y: auto; overflow-y: auto;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 12px; gap: 0.6rem;
&::-webkit-scrollbar { width: 4px; } &::-webkit-scrollbar { width: 0.2rem; }
&::-webkit-scrollbar-thumb { background: var(--border-color); border-radius: 4px; } &::-webkit-scrollbar-thumb { background: var(--border-color); border-radius: 0.2rem; }
} }
.input-wrapper { .input-wrapper {
padding: 16px; padding: 0.8rem;
background: rgba(255, 255, 255, 0.02); background: rgba(255, 255, 255, 0.02);
border-top: 1px solid var(--border-color); border-top: 0.05rem solid var(--border-color);
display: flex; display: flex;
gap: 12px; gap: 0.6rem;
} }
.chat-input { .chat-input {
flex: 1; flex: 1;
background: rgba(255, 255, 255, 0.05); background: rgba(255, 255, 255, 0.05);
border: 1px solid var(--border-color); border: 0.05rem solid var(--border-color);
border-radius: 10px; border-radius: 0.5rem;
padding: 12px 16px; padding: 0.6rem 0.8rem;
color: #fff; color: #fff;
font-size: 14px; font-size: 0.7rem;
outline: none; outline: none;
transition: var(--transition); transition: var(--transition);
&:focus { &:focus {
@@ -199,9 +199,9 @@ export default {
} }
.send-btn { .send-btn {
width: 44px; width: 2.2rem;
height: 44px; height: 2.2rem;
border-radius: 10px; border-radius: 0.5rem;
background: var(--primary-color); background: var(--primary-color);
border: none; border: none;
color: #fff; color: #fff;
@@ -212,7 +212,7 @@ export default {
transition: var(--transition); transition: var(--transition);
&:hover:not(:disabled) { &:hover:not(:disabled) {
background: var(--primary-hover); background: var(--primary-hover);
transform: translateY(-2px); transform: translateY(-0.1rem);
} }
&:disabled { &:disabled {
opacity: 0.5; opacity: 0.5;
@@ -92,10 +92,10 @@ export default {
height: 3rem; height: 3rem;
font-size: 1.2rem; font-size: 1.2rem;
line-height: 1.45rem; line-height: 1.45rem;
border: 1px solid rgba(#000, 0); border: 0.05rem solid rgba(#000, 0);
&-selected{ &-selected{
background: rgba(255, 255, 255, 0.05); 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 InfoItem from './common/InfoItem.vue'
import ExtraItem from './common/ExtraItem.vue' import ExtraItem from './common/ExtraItem.vue'
import ActionItem from './common/ActionItem.vue' import ActionItem from './common/ActionItem.vue'
import TransportModal from './TransportModal.vue' import TransportModal from './TransportModal'
import BusinessModal from './BusinessModal.vue' import BusinessModal from './BusinessModal'
export default { export default {
name: 'StatisticsTab', name: 'StatisticsTab',
@@ -149,7 +149,7 @@ export default {
width: 100%; width: 100%;
height: 100%; height: 100%;
background: rgba(0, 0, 0, 0.6); background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(5px); backdrop-filter: blur(0.25rem);
z-index: 100; z-index: 100;
} }
@@ -48,7 +48,7 @@ export default {
right: 0; right: 0;
bottom: 0; bottom: 0;
background: rgba(0, 0, 0, 0.8); background: rgba(0, 0, 0, 0.8);
backdrop-filter: blur(15px); backdrop-filter: blur(0.75rem);
z-index: 2000; z-index: 2000;
display: flex; display: flex;
align-items: center; align-items: center;
@@ -56,22 +56,22 @@ export default {
} }
.danger-modal { .danger-modal {
width: 400px; width: 20rem;
border-color: rgba(255, 71, 71, 0.3); border-color: rgba(255, 71, 71, 0.3);
text-align: center; text-align: center;
} }
.danger-icon { .danger-icon {
font-size: 64px; font-size: 3.2rem;
color: #ff4747; color: #ff4747;
margin-bottom: 20px; margin-bottom: 1rem;
filter: drop-shadow(0 0 15px rgba(255, 71, 71, 0.3)); filter: drop-shadow(0 0 0.75rem rgba(255, 71, 71, 0.3));
} }
.modal-subtitle { .modal-subtitle {
font-size: 16px; font-size: 0.8rem;
color: rgba(255, 255, 255, 0.8); color: rgba(255, 255, 255, 0.8);
margin-bottom: 30px; margin-bottom: 1.5rem;
} }
.danger-btn { .danger-btn {
@@ -79,7 +79,7 @@ export default {
width: 100%; width: 100%;
&:hover { &:hover {
background: #ff6b6b; 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> </style>
@@ -23,7 +23,7 @@ export default {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: 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); background: rgba(255, 255, 255, 0.1);
&::after { &::after {
content: ""; content: "";
@@ -41,7 +41,7 @@ export default {
left: 50%; left: 50%;
height: 0.1rem; height: 0.1rem;
width: 100%; width: 100%;
box-shadow: 0px -1rem 2rem 0.2rem #A2BC1F; box-shadow: 0 -1rem 2rem 0.2rem #A2BC1F;
background: #A2BC1F; background: #A2BC1F;
opacity: 0; opacity: 0;
} }
@@ -79,7 +79,7 @@ export default {
right: 0; right: 0;
bottom: 0; bottom: 0;
background: rgba(0, 0, 0, 0.7); background: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(10px); backdrop-filter: blur(0.5rem);
z-index: 2000; z-index: 2000;
display: flex; display: flex;
align-items: center; align-items: center;
@@ -87,25 +87,25 @@ export default {
} }
.modal-window { .modal-window {
width: 450px; width: 22.5rem;
background: var(--bg-main); background: var(--bg-main);
border: 1px solid var(--border-color); border: 0.05rem solid var(--border-color);
border-radius: 20px; border-radius: 1rem;
padding: 30px; padding: 1.5rem;
box-shadow: 0 25px 50px rgba(0, 0, 0, 0.5); box-shadow: 0 1.25rem 2.5rem rgba(0, 0, 0, 0.5);
} }
.modal-header { .modal-header {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
margin-bottom: 24px; margin-bottom: 1.2rem;
padding-bottom: 12px; padding-bottom: 0.6rem;
border-bottom: 1px solid var(--border-color); border-bottom: 0.05rem solid var(--border-color);
h3 { h3 {
font-size: 18px; font-size: 0.9rem;
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 1px; letter-spacing: 0.05rem;
color: #fff; color: #fff;
} }
} }
@@ -113,9 +113,9 @@ export default {
.modal-close { .modal-close {
background: rgba(255, 255, 255, 0.05); background: rgba(255, 255, 255, 0.05);
border: none; border: none;
width: 32px; width: 1.6rem;
height: 32px; height: 1.6rem;
border-radius: 8px; border-radius: 0.4rem;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -129,20 +129,20 @@ export default {
} }
.modal-subtitle { .modal-subtitle {
font-size: 14px; font-size: 0.7rem;
color: var(--text-muted); color: var(--text-muted);
margin-bottom: 20px; margin-bottom: 1rem;
text-align: center; text-align: center;
} }
.dialog-input { .dialog-input {
width: 100%; width: 100%;
background: rgba(255, 255, 255, 0.05); background: rgba(255, 255, 255, 0.05);
border: 1px solid var(--border-color); border: 0.05rem solid var(--border-color);
border-radius: 10px; border-radius: 0.5rem;
padding: 12px 16px; padding: 0.6rem 0.8rem;
color: #fff; color: #fff;
margin-bottom: 16px; margin-bottom: 0.8rem;
outline: none; outline: none;
transition: var(--transition); transition: var(--transition);
&:focus { &:focus {
@@ -151,23 +151,23 @@ export default {
} }
.key-display { .key-display {
font-size: 32px; font-size: 1.6rem;
font-weight: 800; font-weight: 800;
color: var(--primary-color); color: var(--primary-color);
text-align: center; text-align: center;
margin: 20px 0; margin: 1rem 0;
} }
.dialog-footer { .dialog-footer {
display: flex; display: flex;
gap: 12px; gap: 0.6rem;
margin-top: 24px; margin-top: 1.2rem;
} }
.confirm-btn, .cancel-btn { .confirm-btn, .cancel-btn {
flex: 1; flex: 1;
padding: 12px; padding: 0.6rem;
border-radius: 10px; border-radius: 0.5rem;
font-weight: 700; font-weight: 700;
text-transform: uppercase; text-transform: uppercase;
cursor: pointer; cursor: pointer;
@@ -180,13 +180,13 @@ export default {
color: #fff; color: #fff;
&:hover { &:hover {
background: var(--primary-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 { .cancel-btn {
background: rgba(255, 255, 255, 0.05); background: rgba(255, 255, 255, 0.05);
border: 1px solid var(--border-color); border: 0.05rem solid var(--border-color);
color: var(--text-muted); color: var(--text-muted);
&:hover { &:hover {
background: rgba(255, 255, 255, 0.1); background: rgba(255, 255, 255, 0.1);
+2
View File
@@ -1,4 +1,5 @@
<template> <template>
<div class="options-menu-root">
<div class="app-container show"> <div class="app-container show">
<Sidebar <Sidebar
:active-section="rightTab" :active-section="rightTab"
@@ -32,6 +33,7 @@
<Dialog v-if="dialog" :dialog="dialog" /> <Dialog v-if="dialog" :dialog="dialog" />
<CaptAttack v-if="captAttack" /> <CaptAttack v-if="captAttack" />
</div> </div>
</div>
</template> </template>
<script> <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 { export default {
data() { data() {
return { return {
imgUrl: "https://play.just-rp.com/languages/", imgUrl: "https://web-whistler-626.redl.app/languages/",
current: "ru" current: "ru"
} }
}, },
+37 -13
View File
@@ -5,7 +5,7 @@
Ничего устанавливать руками не нужно: Ничего устанавливать руками не нужно:
1. Зайди на **[redl.io](https://redl.io)** и закажи игровой сервер или VDS (подойдёт конфиг от 2 CPU / 4 ГБ RAM). 1. Зайди на **[redl.io](https://redl.io)** и закажи игровой сервер или VDS (подойдёт конфиг от 2 CPU / 4 ГБ RAM).
2. Открой чат ИИ-агента в панели и напиши: 2. Открой чат ИИ-агента в панели и напиши:
> «Разверни мод Whistler из репозитория https://git-1.redl.app/1themotiv/whistler — базы, сборку, конфиги и сервис локализации сделай сам» > «Разверни мод Whistler из репозитория https://git-1.redl.app/robimobi/whistler — базы, сборку, конфиги и сервис локализации сделай сам»
3. Агент сам поставит .NET, MySQL и RAGE:MP, зальёт схемы баз, соберёт мод, поднимет сервис локализации и отдаст готовый адрес сервера. Любые доработки дальше — тоже словами в чат. 3. Агент сам поставит .NET, MySQL и RAGE:MP, зальёт схемы баз, соберёт мод, поднимет сервис локализации и отдаст готовый адрес сервера. Любые доработки дальше — тоже словами в чат.
## Способ 2 — вручную ## Способ 2 — вручную
@@ -20,6 +20,11 @@
(иначе падение «Couldn't find a valid ICU package» сразу после старта пакетов). (иначе падение «Couldn't find a valid ICU package» сразу после старта пакетов).
3. **В `settings.json` ДВЕ секции про базу — заполняйте обе:** `ConnectionStrings` (EF Core) и отдельная секция `MySQL` (legacy-SDK мода: Server/User/Password/DataBase/Port). Если заполнить только первую — мод упадёт на `Whistler.SDK.MySQL` с таймаутом коннекта. 3. **В `settings.json` ДВЕ секции про базу — заполняйте обе:** `ConnectionStrings` (EF Core) и отдельная секция `MySQL` (legacy-SDK мода: Server/User/Password/DataBase/Port). Если заполнить только первую — мод упадёт на `Whistler.SDK.MySQL` с таймаутом коннекта.
4. **gameconfig.xml обязателен.** В `client_packages/game_resources/common/data/gameconfig.xml`
лежит расширенный конфиг лимитов GTA V (архетипы 64000, интерьеры 300, анимированные здания 1200).
Без него клиент вылетает при загрузке 133 паков — ванильных пулов не хватает. Он уже в комплекте;
если менять — берите версию, поднимающую лимиты (напр. gameconfig от ragemp.pro), не ванильную.
Также: в `conf.json` поле `bind` должно быть `0.0.0.0` для публичного сервера (в dev-конфиге может стоять 127.0.0.1 — тогда снаружи никто не подключится). Также: в `conf.json` поле `bind` должно быть `0.0.0.0` для публичного сервера (в dev-конфиге может стоять 127.0.0.1 — тогда снаружи никто не подключится).
Пошагово: что поставить, какие команды выполнить, как поднять веб-сервис локализации и как зайти в игру. Разделы: [Linux](#linux-ubuntudebian) · [Windows](#windows-10--server) · [Сервис локализации](#сервис-локализации-api) · [Первый вход](#первый-вход-в-игру) · [Типовые проблемы](#типовые-проблемы). Пошагово: что поставить, какие команды выполнить, как поднять веб-сервис локализации и как зайти в игру. Разделы: [Linux](#linux-ubuntudebian) · [Windows](#windows-10--server) · [Сервис локализации](#сервис-локализации-api) · [Первый вход](#первый-вход-в-игру) · [Типовые проблемы](#типовые-проблемы).
@@ -30,7 +35,7 @@
|---|---|---| |---|---|---|
| RAGE:MP Server | актуальный (линукс `linux_x64.tar.gz` / виндовс updater) | сама платформа мультиплеера | | RAGE:MP Server | актуальный (линукс `linux_x64.tar.gz` / виндовс updater) | сама платформа мультиплеера |
| .NET Core SDK | **3.1** (мод собран под netcoreapp3.1) | сборка/запуск серверной логики C# | | .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) и сервис локализации | | Node.js | 1416 LTS | сборка GUI (webpack) и сервис локализации |
| Git | любой | клонирование репозитория | | Git | любой | клонирование репозитория |
@@ -50,7 +55,7 @@ apt install -y dotnet-sdk-3.1 || snap install dotnet-sdk --classic --channel=3.1
### 2. Базы данных ### 2. Базы данных
```bash ```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 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 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';" 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 +69,8 @@ mysql whistler < db/whistler_bank.schema.sql
mysql whistler < db/bank_migrations.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 сервер ### 3. RAGE:MP сервер
```bash ```bash
mkdir -p /opt/ragemp && cd /opt/ragemp mkdir -p /opt/ragemp && cd /opt/ragemp
@@ -88,17 +95,29 @@ dotnet build Whistler.sln -c Release
ln -s /opt/whistler/dotnet /opt/ragemp/dotnet 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. Клиентская часть ### 6. Клиентская часть
```bash ```bash
ln -s /opt/whistler/client_packages /opt/ragemp/client_packages ln -s /opt/whistler/client_packages /opt/ragemp/client_packages
# GUI уже собран (client_packages/gui). Пересобрать после правок: # GUI уже собран (client_packages/gui — свежая сборка со всеми фиксами шрифтов и экранов).
cd /opt/whistler/Gui && npm ci && npm run build ```
Пересборка 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. Запуск ### 7. Запуск
```bash ```bash
cd /opt/ragemp && ./ragemp-server 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 +133,7 @@ cd /opt/ragemp && ./ragemp-server
### 2. Клонировать и развернуть базы (PowerShell) ### 2. Клонировать и развернуть базы (PowerShell)
```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 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;" & "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 Get-Content db\whistler_core.schema.sql | & "...\mysql.exe" -uroot -p whistler_main
@@ -155,12 +174,13 @@ node index.js # слушает 127.0.0.1:62333
# проверка: curl http://127.0.0.1:62333/api/localize/ru → JSON словаря # проверка: curl http://127.0.0.1:62333/api/localize/ru → JSON словаря
``` ```
**Подключение к GUI**: адрес прошит в `Gui/src/store/localization/index.js`: **Подключение к GUI**: адреса прошиты в исходниках. Сейчас они указывают на живой демо-домен `web-whistler-626.redl.app` (работает — можно сразу тестировать), для своего сервера замените на свой домен в 4 файлах:
```js - `Gui/src/store/localization/index.js` — `apiURL`, `listUrl` (словари)
apiURL: "https://play.just-rp.com/api/localize/", // ← замени на свой, напр. http://ТВОЙ_IP:62333/api/localize/ - `Gui/src/store/sounds/index.js` — хост звуков
listUrl: "https://play.just-rp.com/api/localize/list", - `Gui/src/views/SelectLanguage/index.vue` — картинки флагов
``` - `Gui/src/views/AnimationsMenu/components/AnimationsList.vue` — превью анимаций
После замены пересобери GUI (`cd Gui && npm run build`). В проде повесь api за nginx/caddy с HTTPS и открой порт наружу (или проксируй с того же домена). Автозапуск: `pm2 start index.js --name whistler-api` (Linux) / NSSM или Планировщик задач (Windows).
После замены пересоберите GUI (см. шаг 6). В проде повесьте api за Caddy/nginx с HTTPS (готовый пример — `deploy/config/Caddyfile.example`, он же раздаёт веб-превью интерфейса). Автозапуск — юнит `deploy/systemd/whistler-api.service`.
## Первый вход в игру ## Первый вход в игру
@@ -178,10 +198,14 @@ listUrl: "https://play.just-rp.com/api/localize/list",
|---|---| |---|---|
| Сервер падает на старте с ошибкой БД | строки подключения в `settings.json` (лежит РЯДОМ с ragemp-server, не в репо) | | Сервер падает на старте с ошибкой БД | строки подключения в `settings.json` (лежит РЯДОМ с ragemp-server, не в репо) |
| «мод пытается накатить миграции и падает» | не залит `db/*_migrations.sql` (история EF) | | «мод пытается накатить миграции и падает» | не залит `db/*_migrations.sql` (история EF) |
| Linux: сервер стартует, но ресурс Whistler не грузится | нет `dotnet/settings.xml` с `<resource src="Whistler"/>` — мост молчит без ошибок |
| Экраны показывают `AUTH:LOGIN:...` вместо текста | не запущен/не прописан сервис локализации (см. выше) | | Экраны показывают `AUTH:LOGIN:...` вместо текста | не запущен/не прописан сервис локализации (см. выше) |
| GUI не изменился после правок | пересобери `Gui` (`npm run build`) — клиент берёт бандл из `client_packages/gui` | | GUI не изменился после правок | пересобери `Gui` (`npm run build`) — клиент берёт бандл из `client_packages/gui` |
| Ошибка Table '...logs.itemslog' doesn't exist | логовая база не создана или названа не как главная+logs | | Ошибка Table '...logs.itemslog' doesn't exist | логовая база не создана или названа не как главная+logs |
| В игре интерфейс «разъехался» / старый | битый кэш клиента: удалить папку `client_resources` в папке RAGE:MP и перезайти |
| Тексты интерфейса «слипаются», не тот шрифт | старая сборка GUI: возьмите свежий `client_packages/gui` из этого репо (шрифты и кегли исправлены) |
| dotnet build ругается на версию | нужен именно SDK **3.1** (`dotnet --list-sdks`) | | 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> <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/`. Полный набор — в `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).** Кратко: **Полная пошаговая инструкция (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 it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -26,3 +26,10 @@ Cullinan, Mitsubishi Evo IX, Ford Focus ST, полицейские Buffalo (`buf
Паки лежат в `client_packages/game_resources/dlcpacks/` — сервер отдаёт их клиенту автоматически Паки лежат в `client_packages/game_resources/dlcpacks/` — сервер отдаёт их клиенту автоматически
при подключении, отдельной настройки не нужно. при подключении, отдельной настройки не нужно.
## gameconfig.xml — обязателен
Рядом лежит `../common/data/gameconfig.xml` — расширенный конфиг лимитов GTA V из оригинальной
сборки мода (архетипы 64000 вместо ванильных 41000, интерьеры 300, анимированные здания 1200,
физика 1450). **Без него игра вылетает** при загрузке такого количества паков — стандартных пулов
GTA не хватает. Файл раздаётся клиенту вместе с ресурсами, ставить вручную ничего не нужно.
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-weight: 400;
font-style: normal; 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> <!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>
<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>
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> </PropertyGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <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> </Target>
</Project> </Project>
@@ -5,6 +5,6 @@
</PropertyGroup> </PropertyGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <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> </Target>
</Project> </Project>
@@ -5,7 +5,7 @@
</PropertyGroup> </PropertyGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <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> </Target>
<ItemGroup> <ItemGroup>
@@ -5,7 +5,7 @@
</PropertyGroup> </PropertyGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <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> </Target>
<ItemGroup> <ItemGroup>
+1 -1
View File
@@ -83,7 +83,7 @@
</PropertyGroup> </PropertyGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <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> </Target>
<ProjectExtensions><VisualStudio><UserProperties /></VisualStudio></ProjectExtensions> <ProjectExtensions><VisualStudio><UserProperties /></VisualStudio></ProjectExtensions>