mirror of
https://github.com/sergeyyarkov/ragemp-copchase-mod.git
synced 2026-10-11 10:29:03 +03:00
working version
This commit is contained in:
commit
8141cb7708
BIN
client_packages/.listcache
Normal file
BIN
client_packages/.listcache
Normal file
Binary file not shown.
92
client_packages/copchase/index.js
Normal file
92
client_packages/copchase/index.js
Normal file
@ -0,0 +1,92 @@
|
||||
require('./ui/index') // setup nativeui
|
||||
|
||||
mp.gui.cursor.visible = false;
|
||||
|
||||
let freeze = true
|
||||
let showHud = false
|
||||
|
||||
//mp.game.ui.displayHud(showHud);
|
||||
mp.voiceChat.muted = false
|
||||
|
||||
mp.events.add('render', () => {
|
||||
|
||||
// Default ui
|
||||
|
||||
mp.game.graphics.drawText("copchase server", [0.9, 0.005], {
|
||||
font: 2,
|
||||
color: [255, 255, 255, 1000],
|
||||
scale: [0.8, 0.8],
|
||||
outline: true
|
||||
})
|
||||
mp.game.graphics.drawText("RageMP v1.1", [0.947, 0.050], {
|
||||
font: 4,
|
||||
color: [255, 255, 255, 1000],
|
||||
scale: [0.5, 0.5],
|
||||
outline: true
|
||||
})
|
||||
mp.game.graphics.drawText(`${new Date().getHours()}:${new Date().getMinutes()}:${new Date().getSeconds()}`, [0.24, 0.95], {
|
||||
font: 4,
|
||||
color: [255, 255, 255, 1000],
|
||||
scale: [0.6, 0.6],
|
||||
outline: true
|
||||
})
|
||||
if (mp.players.local.vehicle) {
|
||||
mp.game.graphics.drawText(`Engine health: ${mp.players.local.vehicle.getEngineHealth().toFixed()}`, [0.54, 0.95], {
|
||||
font: 7,
|
||||
color: [255, 255, 255, 1000],
|
||||
scale: [0.6, 0.6],
|
||||
outline: true
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
mp.events.add('setCarHealth', () => {
|
||||
if (mp.players.local.vehicle.getEngineHealth().toFixed() <= 500) {
|
||||
return false
|
||||
}
|
||||
|
||||
mp.players.local.vehicle.setEngineHealth(500)
|
||||
})
|
||||
|
||||
|
||||
/*
|
||||
Admin events
|
||||
*/
|
||||
|
||||
mp.events.add('onGodMode', (player, godmode) => player.setInvincible(godmode))
|
||||
|
||||
/*
|
||||
Player events
|
||||
*/
|
||||
|
||||
mp.events.add("playerDeath", (player, reason, killer) => {
|
||||
mp.game.graphics.startScreenEffect("DeathFailNeutralIn", 3000, false)
|
||||
mp.game.gameplay.setFadeOutAfterDeath(false)
|
||||
mp.game.ui.displayHud(true)
|
||||
mp.game.ui.resetHudComponentValues(0)
|
||||
})
|
||||
|
||||
mp.game.ui.displayHud(true)
|
||||
|
||||
mp.events.add('setInv', (player) => player.setInvincible(true))
|
||||
mp.events.add('delInv', (player) => player.setInvincible(false))
|
||||
|
||||
mp.events.add("playerJoin", (player, message) => {
|
||||
player.freezePosition(freeze)
|
||||
mp.events.callRemote('onPlayerDamage')
|
||||
mp.gui.chat.push(message)
|
||||
})
|
||||
|
||||
mp.events.add('login', player => {
|
||||
player.freezePosition(!freeze)
|
||||
//mp.game.ui.displayHud(!showHud)
|
||||
})
|
||||
|
||||
// mp.keys.bind(0x58, true, function() {
|
||||
// mp.events.callRemote("voiceEnable", [mp.players.local]);
|
||||
// mp.players.local.voiceVolume = 1.0
|
||||
// })
|
||||
|
||||
// mp.keys.bind(0x58, false, function() {
|
||||
// mp.events.callRemote("voiceDisable", [mp.players.local]);
|
||||
// })
|
||||
11
client_packages/copchase/package.json
Normal file
11
client_packages/copchase/package.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "copchase",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC"
|
||||
}
|
||||
1
client_packages/index.js
Normal file
1
client_packages/index.js
Normal file
@ -0,0 +1 @@
|
||||
require('./copchase/index')
|
||||
1
client_packages/nativeui/index.js
Normal file
1
client_packages/nativeui/index.js
Normal file
File diff suppressed because one or more lines are too long
1104
client_packages/ui/index.js
Normal file
1104
client_packages/ui/index.js
Normal file
File diff suppressed because it is too large
Load Diff
44
packages/copchase/api/index.js
Normal file
44
packages/copchase/api/index.js
Normal file
@ -0,0 +1,44 @@
|
||||
const copchaseConfig = require('../copchase-config')
|
||||
|
||||
class API {
|
||||
constructor(players) {
|
||||
this.players = players
|
||||
this.authenticatedPlayers = []
|
||||
this.blips = {}
|
||||
}
|
||||
|
||||
authenticatedPlayers() {
|
||||
return this.authenticatedPlayers
|
||||
}
|
||||
|
||||
addAuthPlayer(player) {
|
||||
this.authenticatedPlayers.push({
|
||||
id: player.id,
|
||||
name: player.name
|
||||
})
|
||||
}
|
||||
|
||||
delAuthPlayer(player) {
|
||||
const index = this.authenticatedPlayers.findIndex(_player => _player.name === player.name)
|
||||
|
||||
if (index != -1) this.authenticatedPlayers.splice(index, 1)
|
||||
}
|
||||
|
||||
isPlayerLoggedIn(player) {
|
||||
if (this.authenticatedPlayers.find(_player => _player.name === player.name)) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
isPlayerAdmin(candidate) {
|
||||
if (copchaseConfig.admins.find(admin => candidate.name === admin.name)) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = API
|
||||
258
packages/copchase/commands/admin/admin.js
Normal file
258
packages/copchase/commands/admin/admin.js
Normal file
@ -0,0 +1,258 @@
|
||||
const copchaseConfig = require('../../copchase-config')
|
||||
require('../../events/skin')
|
||||
|
||||
module.exports = ({ api }) => {
|
||||
mp.events.addCommand('skin', (player, model) => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
if (model >= 722 || !model || isNaN(model)) player.outputChatBox('!{orange}[SERVER]: !{white}/skin [0-722]')
|
||||
|
||||
player.model = ped.skin[model]
|
||||
})
|
||||
/*
|
||||
Check if player admin
|
||||
!auth
|
||||
*/
|
||||
|
||||
mp.events.addCommand('admin', (player) => {
|
||||
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
player.call('onShowAdminPanel')
|
||||
})
|
||||
|
||||
/*
|
||||
Ban player
|
||||
*/
|
||||
|
||||
mp.events.addCommand('ban', (player, target) => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
let newTarget = mp.players.at(target);
|
||||
|
||||
if(!target || isNaN(target)) return player.outputChatBox("!{orange}[SERVER]: /ban [id игрока]");
|
||||
if(newTarget === undefined) return player.outputChatBox("!{orange}[SERVER]: !{red}Игрока с таким ID не найдено.")
|
||||
newTarget.outputChatBox("!{orange}[SERVER]: !{red}Вы были заблокированы на этом сервере.");
|
||||
newTarget.ban('Заблокирован!');
|
||||
})
|
||||
|
||||
/*
|
||||
Teleport to location
|
||||
*/
|
||||
|
||||
mp.events.addCommand('to', (player, location) => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
const findLocation = Object.keys(copchaseConfig.locations).find(_location => _location === location)
|
||||
|
||||
if (findLocation === undefined) {
|
||||
player.outputChatBox('!{orange}[SERVER]: !{red}Локация не найдена')
|
||||
return false
|
||||
}
|
||||
|
||||
player.position = copchaseConfig.locations[location]
|
||||
})
|
||||
|
||||
/*
|
||||
Teleport to player
|
||||
*/
|
||||
|
||||
mp.events.addCommand('tp', (player, target) => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
let newTarget = mp.players.at(target);
|
||||
|
||||
if(!target || isNaN(target)) return player.outputChatBox("!{orange}[SERVER]: !{white}/tp [id игрока]");
|
||||
if(newTarget === undefined) return player.outputChatBox("!{orange}[SERVER]: !{red}Игрока с таким ID не найдено.")
|
||||
|
||||
player.position = newTarget.position
|
||||
})
|
||||
|
||||
/*
|
||||
Teleport to player to admin
|
||||
*/
|
||||
|
||||
mp.events.addCommand('gethere', (player, target) => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
let newTarget = mp.players.at(target);
|
||||
|
||||
if(!target || isNaN(target)) return player.outputChatBox("!{orange}[SERVER]: !{white}/gethere [id игрока]");
|
||||
if(newTarget === undefined) return player.outputChatBox("!{orange}[SERVER]: !{red}Игрока с таким ID не найдено.")
|
||||
|
||||
newTarget.spawn(player.position)
|
||||
})
|
||||
|
||||
/*
|
||||
Kick player
|
||||
*/
|
||||
|
||||
mp.events.addCommand('kick', (player, target) => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
let newTarget = mp.players.at(target);
|
||||
if(!target || isNaN(target)) return player.outputChatBox("!{orange}[SERVER]: !{white}/kick [id игрока]");
|
||||
if (newTarget === undefined) return player.outputChatBox("!{orange}[SERVER]: !{red}Игрока с таким ID не найдено.")
|
||||
|
||||
mp.players.forEach(_player => _player.outputChatBox(`!{orange}[SERVER]: !{white}Игрок !{1CD8FD}${newTarget.name} !{white}был кикнут с сервера`))
|
||||
newTarget.notify('Вы были кикнуты с сервера')
|
||||
setTimeout(() => newTarget.kick('Кикнут.'), 300)
|
||||
});
|
||||
|
||||
/*
|
||||
Get position
|
||||
!auth
|
||||
*/
|
||||
|
||||
mp.events.addCommand('pos', player => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
player.outputChatBox(`Pos: ${player.position}`)
|
||||
})
|
||||
|
||||
/*
|
||||
Create car on Spawn
|
||||
*/
|
||||
|
||||
mp.events.addCommand('car', (player, carRef) => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
if (carRef === undefined) {
|
||||
player.outputChatBox('!{orange}[SERVER]: !{white}/car [reference машины]')
|
||||
return false
|
||||
}
|
||||
|
||||
const car = mp.vehicles.new(mp.joaat(carRef), player.position)
|
||||
|
||||
car.setColor(0, 0, 0)
|
||||
car.numberPlate = 'ADMIN'
|
||||
car.dimension = player.dimension
|
||||
|
||||
setTimeout(() => player.putIntoVehicle(car, 0), 200)
|
||||
})
|
||||
|
||||
mp.events.addCommand('carHealth', (player, string, health) => {
|
||||
if(player.vehicle) {
|
||||
if(!string) {
|
||||
return player.outputChatBox("!{orange}[SERVER]: !{white}/carHealth [value]");
|
||||
}
|
||||
player.eval(`mp.players.local.vehicle.setEngineHealth(${health})`)
|
||||
} else {
|
||||
return player.outputChatBox("!{orange}[SERVER]: !{red}Вы должны находться в машине!");
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
Kill player by id
|
||||
*/
|
||||
|
||||
mp.events.addCommand('kill', (player, target) => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
let newTarget = mp.players.at(target);
|
||||
if(!target || isNaN(target)) return player.outputChatBox("/kill [id игрока]");
|
||||
if (newTarget === undefined) {
|
||||
return player.outputChatBox("!{red}Игрока с таким ID не найдено.")
|
||||
}
|
||||
|
||||
newTarget.health = 0
|
||||
newTarget.outputChatBox(`!{orange}Вы были убиты администратором: !{gold}${player.name}`)
|
||||
})
|
||||
|
||||
mp.events.addCommand('weather', (player, weather) => {
|
||||
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
if (weather === undefined) return player.outputChatBox(`!{orange}[SERVER]: !{white}/weather [name]`)
|
||||
|
||||
mp.world.weather = weather.toLowerCase()
|
||||
})
|
||||
}
|
||||
159
packages/copchase/commands/player/player.js
Normal file
159
packages/copchase/commands/player/player.js
Normal file
@ -0,0 +1,159 @@
|
||||
const bcrypt = require('bcryptjs')
|
||||
const { Player } = require('../../models/index')
|
||||
const copchaseConfig = require('../../copchase-config')
|
||||
|
||||
module.exports = ({ api, copchase }) => {
|
||||
|
||||
/*
|
||||
Show Online
|
||||
!auth
|
||||
*/
|
||||
|
||||
mp.events.addCommand('online', player => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
player.outputChatBox(`!{orange}[SERVER]: !{white}Онлайн сейчас: !{1CD8FD}${mp.players.length}`)
|
||||
})
|
||||
|
||||
/*
|
||||
Register Player
|
||||
!auth
|
||||
*/
|
||||
|
||||
mp.events.addCommand('reg', (player, message) => {
|
||||
const candidate = api.players.filter(_player => _player.name === player.name)
|
||||
|
||||
if (candidate.length > 0) {
|
||||
player.outputChatBox(copchaseConfig.messages.accountRegistered)
|
||||
return false
|
||||
}
|
||||
|
||||
if (api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.authenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (message === undefined) {
|
||||
player.outputChatBox('!{orange}[SERVER]: !{red}Введите пароль для регистрации')
|
||||
return false
|
||||
}
|
||||
|
||||
const passwords = message.split(' ')
|
||||
|
||||
if (passwords[0] === passwords[1]) {
|
||||
try {
|
||||
if (candidate.length <= 0) {
|
||||
|
||||
player.outputChatBox('!{orange}[SERVER]: !{white}Регистируем аккаунт...')
|
||||
const newPlayer = new Player({
|
||||
name: player.name,
|
||||
password: bcrypt.hashSync(message.split(' ')[0], bcrypt.genSaltSync(10))
|
||||
})
|
||||
|
||||
newPlayer.save().then((data) => api.players.push(data))
|
||||
|
||||
player.notify('~g~Аккаунт зарегистрирован!')
|
||||
player.outputChatBox(`!{orange}[SERVER]: !{white}/login [пароль] !{green}для авторизации.`)
|
||||
console.log(`Игрок с ником ${player.name} зарегистрировался!`)
|
||||
} else {
|
||||
player.notify('~r~Вы уже зарегистрированы!')
|
||||
}
|
||||
} catch (error) {
|
||||
player.notify('~r~Произошла ошибка!')
|
||||
}
|
||||
} else {
|
||||
player.notify('~r~Пароли не совпадают!')
|
||||
}
|
||||
})
|
||||
|
||||
/*
|
||||
Login Player
|
||||
!auth
|
||||
*/
|
||||
|
||||
mp.events.addCommand('login', (player, message) => {
|
||||
if (api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.authenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
const candidatePassword = message
|
||||
const currentPlayer = api.players.filter(currentPlayer => currentPlayer.name === player.name)
|
||||
|
||||
if (currentPlayer.length <= 0) {
|
||||
player.notify('~r~Вы еще не зарегистрировали аккаунт!')
|
||||
return false
|
||||
}
|
||||
|
||||
if (message === undefined) {
|
||||
player.notify('~r~Введите пароль!')
|
||||
return false
|
||||
}
|
||||
|
||||
bcrypt.compare(candidatePassword, currentPlayer[0].password, function(err, res) {
|
||||
if (err){
|
||||
player.notify('~r~Произошла ошибка при авторизации!')
|
||||
}
|
||||
|
||||
if (res) {
|
||||
player.notify('~g~Вы авторизовались!')
|
||||
player.call('login', [player]) // выключить фриз
|
||||
|
||||
api.addAuthPlayer(player)
|
||||
console.log(api.authenticatedPlayers)
|
||||
} else {
|
||||
player.notify('~r~Неверный пароль!')
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
/*
|
||||
Spawn
|
||||
!auth
|
||||
*/
|
||||
|
||||
mp.events.addCommand('spawn', player => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (copchase.isPlayerInWaitingRoom(player)) return false
|
||||
if (copchase.isPlayerInGame(player)) return false
|
||||
|
||||
player.dimension = 0
|
||||
player.position = copchaseConfig.spawn
|
||||
})
|
||||
|
||||
mp.events.addCommand('copchase', player => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (copchase.isPlayerInWaitingRoom(player)) return false
|
||||
if (copchase.isPlayerInGame(player)) return false
|
||||
|
||||
player.dimension = copchase.waitingRoomDimension
|
||||
player.position = copchaseConfig.waitingRoom
|
||||
|
||||
copchase.addPlayerToWaitingRoom(player) // добавить игрока в комнату ожидания
|
||||
player.call('setInv', [player])
|
||||
|
||||
if (copchase.isStarted && copchase.players.length > 0) {
|
||||
return player.outputChatBox('!{orange}[SERVER]: !{blue}Игра уже начата! Ожидание игроков...')
|
||||
}
|
||||
|
||||
if (copchase.waitingPlayers.length < copchase.minPlayers) {
|
||||
return player.outputChatBox('!{orange}[SERVER]: !{blue}Ожидание игроков...')
|
||||
}
|
||||
|
||||
copchase.startGame()
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
25
packages/copchase/copchase-config.js
Normal file
25
packages/copchase/copchase-config.js
Normal file
@ -0,0 +1,25 @@
|
||||
module.exports = {
|
||||
spawn: { x: -425.446, y: 1123.767, z: 325.854 },
|
||||
waitingRoom: { x: 135.901, y: -749.107, z: 258.152 },
|
||||
locations: {
|
||||
airport: { x: -1329.613, y: -3038.4901286875747, z: 13.938 },
|
||||
spawn: { x: 135.901, y: -749.107, z: 258.152 },
|
||||
fibroof: { x:150.126, y:-754.591, z:262.865 },
|
||||
policestation: { x:436.491, y: -982.172, z: 30.699 },
|
||||
epsilon: { x:-695.025, y: 82.955, z: 55.855},
|
||||
yankton: { x: 5331.8583, y: -5181.8349609375, z: 82.77088928222656 }
|
||||
},
|
||||
admins: [
|
||||
{ name: 'kinguinmlg' },
|
||||
{ name: 'Dynya' },
|
||||
{ name: 'Dynya1' },
|
||||
{ name: 'ch3ks1' }
|
||||
],
|
||||
messages: {
|
||||
register: '!{orange}[SERVER]: !{green}Регистрация: !{white}/reg [пароль] [пароль]',
|
||||
accountRegistered: '!{orange}[SERVER]: !{red}Аккаунт уже зарегистрирован!',
|
||||
authenticated: '!{orange}[SERVER]: !{red}Вы уже авторизованы!',
|
||||
notAuthenticated: '!{orange}[SERVER]: !{red}Авторизуйтесь!',
|
||||
notAvailable: '!{orange}[SERVER]: !{red}Вам недоступна эта команда'
|
||||
}
|
||||
}
|
||||
290
packages/copchase/copchase.js
Normal file
290
packages/copchase/copchase.js
Normal file
@ -0,0 +1,290 @@
|
||||
const copchaseConfig = require('./copchase-config')
|
||||
|
||||
class Copchase {
|
||||
constructor({ dimension, waitingRoomDimension, minPlayers, maxPlayers, timeRemaining, timeToStart }) {
|
||||
this.dimension = dimension
|
||||
this.waitingRoomDimension = waitingRoomDimension
|
||||
this.minPlayers = minPlayers
|
||||
this.maxPlayers = maxPlayers
|
||||
this.timeRemaining = timeRemaining
|
||||
this.timeRemainingInterval = null
|
||||
this.timeToStart = timeToStart
|
||||
this.isStarted = false
|
||||
this.suspectCars = [
|
||||
'asea',
|
||||
'bison',
|
||||
'bobcatxl',
|
||||
'burrito',
|
||||
'emperor',
|
||||
'emperor2',
|
||||
'ardent',
|
||||
'ingot',
|
||||
'journey',
|
||||
'clique',
|
||||
'vamos',
|
||||
'tulip',
|
||||
'stafford',
|
||||
'cheburek',
|
||||
'streiter',
|
||||
'nebula',
|
||||
'hellion',
|
||||
'gauntlet4'
|
||||
]
|
||||
this.weather = [
|
||||
'EXTRASUNNY',
|
||||
'CLEAR',
|
||||
'CLOUDS',
|
||||
'SMOG',
|
||||
'FOGGY',
|
||||
'OVERCAST',
|
||||
'RAIN',
|
||||
'THUNDER',
|
||||
'CLEARING',
|
||||
'NEUTRAL',
|
||||
'SNOW',
|
||||
'BLIZZARD',
|
||||
'SNOWLIGHT',
|
||||
'XMAS',
|
||||
'HALLOWEEN'
|
||||
]
|
||||
this.players = []
|
||||
this.waitingPlayers = []
|
||||
this.cars = []
|
||||
this.blips = {}
|
||||
this.suspect = null
|
||||
this.positions = {
|
||||
suspect: [
|
||||
{ x: 395.185, y: -999.645, z: 28.755 },
|
||||
{ x: 404.691, y: -1907.0604, z: 24.723 },
|
||||
{ x: 2619.436, y: 3374.145, z: 55.619 }
|
||||
],
|
||||
police: [
|
||||
{ x: 442.308, y: -1025.066, z: 28.231 },
|
||||
{ x: 348.865, y: -1966.507, z:24.133 },
|
||||
{ x: 2678.454, y: 3459.637, z: 55.340 }
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
pushWaitingPlayersToGame(waitingPlayers) {
|
||||
waitingPlayers.forEach(_player => this.players.push(_player))
|
||||
this.waitingPlayers = []
|
||||
}
|
||||
|
||||
messageToWaitingPlayers(message) {
|
||||
this.waitingPlayers.forEach(_player => _player.outputChatBox(message))
|
||||
}
|
||||
|
||||
messageToPlayersInGame(message) {
|
||||
this.players.forEach(_player => _player.outputChatBox(message))
|
||||
}
|
||||
|
||||
notifyPolicePlayers(message) {
|
||||
this.players.forEach(_player => _player.name !== this.suspect.name ? _player.notify(message) : false)
|
||||
}
|
||||
|
||||
notifySuspectPlayer(message) {
|
||||
this.suspect.notify(message)
|
||||
}
|
||||
|
||||
addPlayerToWaitingRoom(player) {
|
||||
this.waitingPlayers.push(player)
|
||||
}
|
||||
|
||||
setDefaultState() {
|
||||
this.timeRemainingInterval = null
|
||||
this.isStarted = false
|
||||
this.suspect = null
|
||||
this.players = []
|
||||
this.waitingPlayers = []
|
||||
this.blips = {}
|
||||
|
||||
setTimeout(() => {
|
||||
this.cars.forEach(car => car.destroy())
|
||||
this.cars = []
|
||||
}, 3000)
|
||||
}
|
||||
|
||||
isPlayerInGame(player) {
|
||||
if(this.players.find(_player => _player.name === player.name) !== undefined) {
|
||||
player.outputChatBox('!{orange}[COPCHASE]: !{red}Дождитесь окончания игры!')
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
isPlayerInWaitingRoom(player) {
|
||||
if(this.waitingPlayers.find(_player => _player.name === player.name) !== undefined) {
|
||||
player.outputChatBox('!{orange}[COPCHASE]: !{red}Вы уже в комнате ожидания!')
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
selectSuspect() {
|
||||
this.suspect = this.players[Math.floor(Math.random() * (this.players.length - 1 - 0 + 1) + 0)]
|
||||
}
|
||||
|
||||
startGame() {
|
||||
let timeToStart = this.timeToStart
|
||||
const interval = setInterval(() => {
|
||||
timeToStart = timeToStart - 1
|
||||
|
||||
if (timeToStart <= 0) {
|
||||
this.isStarted = true
|
||||
|
||||
this.pushWaitingPlayersToGame(this.waitingPlayers)
|
||||
this.selectSuspect()
|
||||
|
||||
this.messageToPlayersInGame(`!{orange}[COPCHASE]: !{blue}Игра началась!`)
|
||||
this.messageToPlayersInGame(`!{orange}[COPCHASE]: !{white}Саспект: !{red}${this.suspect.name}`)
|
||||
this.notifyPolicePlayers(`~w~ Остановите саспекта!`)
|
||||
this.notifySuspectPlayer(`~w~ Уйдите от полицейских!`)
|
||||
|
||||
|
||||
// spawn cars and players
|
||||
this.spawnPlayers().then(() => {
|
||||
setTimeout(() => this.spawnCars(), 1000)
|
||||
})
|
||||
|
||||
setInterval(() => {
|
||||
this.players.forEach((player, id) => {
|
||||
if (this.blips[player.id] && player.health > 0) {
|
||||
this.blips[player.id].position = player.position;
|
||||
}
|
||||
})
|
||||
}, 1000)
|
||||
|
||||
mp.world.weather = this.weather[Math.floor(Math.random() * (this.weather.length - 1 - 0) + 0)]
|
||||
|
||||
let timeRemaining = this.timeRemaining
|
||||
this.timeRemainingInterval = setInterval(() => {
|
||||
timeRemaining = timeRemaining - 1
|
||||
if (timeRemaining !== 0) {
|
||||
this.messageToPlayersInGame(`!{orange}[COPCHASE]: !{white}Время до окончания: !{blue}${timeRemaining} !{white}мин.`)
|
||||
}
|
||||
|
||||
if (timeRemaining <= 0) {
|
||||
this.stopGame('suspect')
|
||||
|
||||
clearInterval(this.timeRemainingInterval)
|
||||
return true
|
||||
}
|
||||
}, 60000)
|
||||
|
||||
clearInterval(interval)
|
||||
return true
|
||||
}
|
||||
|
||||
this.messageToWaitingPlayers(`!{orange}[COPCHASE]: !{blue}Игра начнется через: !{white}${timeToStart}`)
|
||||
}, 1000)
|
||||
}
|
||||
|
||||
stopGame(type) {
|
||||
|
||||
clearInterval(this.timeRemainingInterval)
|
||||
|
||||
this.players.forEach(_player => {
|
||||
if (this.blips[_player.id]) {
|
||||
this.blips[_player.id].destroy();
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
_player.dimension = 0
|
||||
_player.health = 100
|
||||
_player.position = copchaseConfig.spawn
|
||||
_player.removeAllWeapons()
|
||||
_player.call('setInv', [_player])
|
||||
}, 3000)
|
||||
})
|
||||
|
||||
this.setDefaultState()
|
||||
|
||||
if (type === 'police') {
|
||||
mp.players.forEach(_player => {
|
||||
_player.outputChatBox(`!{orange}[COPCHASE]: !{blue}Игра закончилась. Полиция выиграла!`)
|
||||
_player.outputChatBox(`!{orange}[COPCHASE]: !{white}/copchase !{blue} для повторной игры`)
|
||||
})
|
||||
|
||||
console.log(`[COPCHASE]: Игра закончилась! Полиция выиграла!`)
|
||||
}
|
||||
|
||||
if (type === 'suspect') {
|
||||
mp.players.forEach(_player => {
|
||||
_player.outputChatBox(`!{orange}[COPCHASE]: !{blue}Игра закончилась. Саспект выиграл!`)
|
||||
_player.outputChatBox(`!{orange}[COPCHASE]: !{blue}/copchase !{white} для повторной игры`)
|
||||
})
|
||||
|
||||
console.log(`[COPCHASE]: Игра закончилась! Саспект выиграл!`)
|
||||
}
|
||||
}
|
||||
|
||||
spawnPlayers() {
|
||||
let suspectRandomNumber = Math.floor(Math.random() * this.positions.suspect.length)
|
||||
let suspectPosition = this.positions.suspect[suspectRandomNumber]
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
this.players.forEach(_player => {
|
||||
if (_player.name === this.suspect.name) {
|
||||
_player.position = suspectPosition
|
||||
_player.dimension = this.dimension
|
||||
_player.model = ped.skin[Math.floor(Math.random() * (435 - 432) + 432)]
|
||||
_player.call('delInv', [_player])
|
||||
|
||||
this.blips[_player.id] = mp.blips.new(1, suspectPosition)
|
||||
this.blips[_player.id].name = _player.name
|
||||
this.blips[_player.id].dimension = this.dimension
|
||||
this.blips[_player.id].color = 1
|
||||
} else {
|
||||
_player.position = {
|
||||
x: this.positions.police[suspectRandomNumber].x + 2,
|
||||
y: this.positions.police[suspectRandomNumber].y,
|
||||
z: this.positions.police[suspectRandomNumber].z
|
||||
}
|
||||
_player.heading = 260
|
||||
_player.dimension = this.dimension
|
||||
_player.model = ped.skin[625]
|
||||
_player.call('delInv', [_player])
|
||||
_player.giveWeapon(mp.joaat('weapon_stungun'), 99999)
|
||||
|
||||
this.blips[_player.id] = mp.blips.new(1, suspectPosition)
|
||||
this.blips[_player.id].name = _player.name
|
||||
this.blips[_player.id].dimension = this.dimension
|
||||
this.blips[_player.id].color = 38
|
||||
}
|
||||
})
|
||||
|
||||
resolve()
|
||||
})
|
||||
}
|
||||
|
||||
spawnCars() {
|
||||
this.players.forEach(_player => {
|
||||
if (_player.name === this.suspect.name) {
|
||||
const carSuspect = mp.vehicles.new(mp.joaat(this.suspectCars[Math.floor(Math.random() * (this.suspectCars.length - 1 - 0) + 0)]), _player.position, {
|
||||
dimension: this.dimension
|
||||
})
|
||||
|
||||
carSuspect.setColor(0, 0, 0)
|
||||
carSuspect.numberPlate = 'suspect'
|
||||
_player.putIntoVehicle(carSuspect, 0)
|
||||
|
||||
this.cars.push(carSuspect)
|
||||
} else {
|
||||
const carPolice = mp.vehicles.new(mp.joaat('police3'), _player.position, {
|
||||
dimension: this.dimension
|
||||
})
|
||||
|
||||
carPolice.setColor(0, 0, 0)
|
||||
carPolice.numberPlate = 'police'
|
||||
_player.putIntoVehicle(carPolice, 0)
|
||||
|
||||
this.cars.push(carPolice)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Copchase
|
||||
153
packages/copchase/events/admin/admin.js
Normal file
153
packages/copchase/events/admin/admin.js
Normal file
@ -0,0 +1,153 @@
|
||||
const copchaseConfig = require('../../copchase-config')
|
||||
|
||||
module.exports = ({ api }) => {
|
||||
mp.events.add('[ui:showAdminPanel]', player => {
|
||||
if (api.isPlayerLoggedIn(player) && api.isPlayerAdmin(player)) player.call('onShowAdminPanel')
|
||||
})
|
||||
mp.events.add('[ui:kickPlayer]', (player, targetName) => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
const target = mp.players.toArray().find(_player => _player.name === targetName)
|
||||
|
||||
if (target === undefined) return player.outputChatBox("!{orange}[SERVER]: !{red}Игрока с таким ID не найдено.")
|
||||
|
||||
mp.players.forEach(_player => _player.outputChatBox(`!{orange}[SERVER]: !{white}Игрок !{1CD8FD}${target.name} !{white}был кикнут с сервера`))
|
||||
target.notify('Вы были кикнуты с сервера')
|
||||
setTimeout(() => target.kick('Кикнут.'), 300)
|
||||
|
||||
player.call('updatePlayers')
|
||||
})
|
||||
mp.events.add('[ui:banPlayer]', (player, targetName) => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
const target = mp.players.toArray().find(_player => _player.name === targetName)
|
||||
|
||||
if (target === undefined) return player.outputChatBox("!{orange}[SERVER]: !{red}Игрока с таким ID не найдено.")
|
||||
|
||||
mp.players.forEach(_player => _player.outputChatBox(`!{orange}[SERVER]: !{white}Игрок !{1CD8FD}${target.name} !{white}был заблокирован`))
|
||||
target.notify('Вы были заблокированы на этом сервере')
|
||||
setTimeout(() => target.ban('Заблокирован.'), 300)
|
||||
})
|
||||
mp.events.add('[ui:killPlayer]', (player, targetName) => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
const target = mp.players.toArray().find(_player => _player.name === targetName)
|
||||
|
||||
if (target === undefined) return player.outputChatBox("!{orange}[SERVER]: !{red}Игрока с таким ID не найдено.")
|
||||
|
||||
target.notify('Вы были убиты администратором сервера')
|
||||
target.health = 0
|
||||
})
|
||||
mp.events.add('[ui:teleportToPlayer]', (player, targetName) => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
const target = mp.players.toArray().find(_player => _player.name === targetName)
|
||||
|
||||
if (target === undefined) return player.outputChatBox("!{orange}[SERVER]: !{red}Игрока с таким ID не найдено.")
|
||||
|
||||
player.notify(`Вы телепортировались к игроку ${target.name}`)
|
||||
player.position = target.position
|
||||
})
|
||||
mp.events.add('[ui:teleportToMe]', (player, targetName) => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
if (!api.isPlayerAdmin(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAvailable)
|
||||
return false
|
||||
}
|
||||
|
||||
const target = mp.players.toArray().find(_player => _player.name === targetName)
|
||||
|
||||
if (target === undefined) return player.outputChatBox("!{orange}[SERVER]: !{red}Игрока с таким ID не найдено.")
|
||||
|
||||
player.notify(`Игрок ${target.name} был телепортирован к вам`)
|
||||
target.notify(`Вы были телепортированы администратором`)
|
||||
|
||||
target.position = player.position
|
||||
})
|
||||
mp.events.add('[ui:spawnCar]', (player, carRef) => {
|
||||
if (api.isPlayerLoggedIn(player) && api.isPlayerAdmin(player)) {
|
||||
|
||||
const car = mp.vehicles.new(mp.joaat(carRef), player.position)
|
||||
|
||||
car.setColor(0, 0, 0)
|
||||
car.numberPlate = 'ADMIN'
|
||||
car.dimension = player.dimension
|
||||
|
||||
setTimeout(() => player.putIntoVehicle(car, 0), 200)
|
||||
}
|
||||
})
|
||||
|
||||
mp.events.add('[ui:teleportToLocation]', (player, location) => {
|
||||
if (api.isPlayerLoggedIn(player) && api.isPlayerAdmin(player)) {
|
||||
const findLocation = Object.keys(copchaseConfig.locations).find(_location => _location === location)
|
||||
|
||||
if (findLocation === undefined) {
|
||||
player.outputChatBox('!{orange}[SERVER]: !{red}Локация не найдена')
|
||||
return false
|
||||
}
|
||||
|
||||
player.position = copchaseConfig.locations[location]
|
||||
}
|
||||
})
|
||||
|
||||
mp.events.add('[ui:godMode]', (player, godmode) => {
|
||||
if (api.isPlayerLoggedIn(player) && api.isPlayerAdmin(player)) {
|
||||
player.call('onGodMode', [player, godmode])
|
||||
godmode ? player.notify(`Режим неуязвимости: вкл`) : player.notify(`Режим неуязвимости: выкл`)
|
||||
}
|
||||
})
|
||||
|
||||
mp.events.add('[ui:getHealth]', player => {
|
||||
if (api.isPlayerLoggedIn(player) && api.isPlayerAdmin(player)) {
|
||||
player.health = 100
|
||||
player.notify(`Ваше здоровье было восстановлено!`)
|
||||
}
|
||||
})
|
||||
|
||||
mp.events.add('[ui:giveWeapon]', (player, weaponRef) => {
|
||||
if (api.isPlayerLoggedIn(player) && api.isPlayerAdmin(player)) {
|
||||
if (weaponRef === 'parachute') {
|
||||
player.giveWeapon(mp.joaat(`gadget_${weaponRef}`), 99999)
|
||||
return false
|
||||
}
|
||||
|
||||
player.giveWeapon(mp.joaat(`weapon_${weaponRef}`), 99999)
|
||||
}
|
||||
})
|
||||
}
|
||||
164
packages/copchase/events/player/player.js
Normal file
164
packages/copchase/events/player/player.js
Normal file
@ -0,0 +1,164 @@
|
||||
const copchaseConfig = require('../../copchase-config');
|
||||
|
||||
const { getDistance } = require('../../helpers/getDistance')
|
||||
|
||||
module.exports = ({ api, copchase }) => {
|
||||
const putIntoVehicleKey = Symbol('putIntoVehicle');
|
||||
|
||||
mp.events.add('entityCreated', entity => {
|
||||
if (entity.type !== 'player') {
|
||||
return;
|
||||
}
|
||||
|
||||
entity[putIntoVehicleKey] = entity.putIntoVehicle;
|
||||
entity.putIntoVehicle = (vehicle, seat) => {
|
||||
setTimeout(() => {
|
||||
entity[putIntoVehicleKey](vehicle, seat);
|
||||
}, 400);
|
||||
};
|
||||
})
|
||||
|
||||
mp.events.add("playerExitVehicle", (player, vehicle, seat) => {
|
||||
|
||||
if (copchase.isStarted && player.name === copchase.suspect.name) {
|
||||
player.giveWeapon(mp.joaat('weapon_pistol'), 25);
|
||||
|
||||
copchase.players.forEach(_player => {
|
||||
if (_player.name !== copchase.suspect.name) {
|
||||
_player.giveWeapon(mp.joaat('weapon_pistol'), 50);
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
mp.events.add('playerEnterVehicle', (player, vehicle, seat) => {
|
||||
if (copchase.isStarted && player.name === copchase.suspect.name && seat === 0) {
|
||||
player.call('setCarHealth')
|
||||
}
|
||||
|
||||
return false
|
||||
})
|
||||
|
||||
/*
|
||||
Player has been joined to the server
|
||||
*/
|
||||
|
||||
mp.events.add('playerJoin', player => {
|
||||
const candidate = api.players.filter(_player => _player.name === player.name)
|
||||
|
||||
console.log(`[SERVER]: ${player.name} присоеденился к серверу!`);
|
||||
mp.players.forEach(_player => _player.outputChatBox(`!{orange}[SERVER]: !{1CD8FD}✋ [${player.id}: ${player.name}] !{white}присоеденился`))
|
||||
|
||||
player.spawn(copchaseConfig.spawn)
|
||||
player.dimension = 0
|
||||
player.model = ped.skin[Math.floor(Math.random() * (722 - 35) + 35)]
|
||||
|
||||
|
||||
candidate <= 0
|
||||
? player.call('playerJoin', [player, copchaseConfig.messages.register])
|
||||
: player.call('playerJoin', [player, `!{orange}[SERVER]: !{white}/login [пароль] !{green}для авторизации`])
|
||||
})
|
||||
|
||||
mp.events.add("playerQuit", player => {
|
||||
if (copchase.isStarted) {
|
||||
if (player.name === copchase.suspect.name) copchase.stopGame('police')
|
||||
|
||||
const policemanIndex = copchase.players.findIndex(_player => _player.name === player.name && _player.name !== copchase.suspect.name)
|
||||
|
||||
if (policemanIndex !== -1) copchase.players.splice(policemanIndex, 1)
|
||||
if (copchase.players.length <= 1 && copchase.suspect !== null) copchase.stopGame('suspect')
|
||||
}
|
||||
|
||||
api.delAuthPlayer(player) // удаляем игрока из массива с авторизованными игроками
|
||||
console.log(`[SERVER]: игрок ${player.name} отсоеденился`)
|
||||
console.log(api.authenticatedPlayers)
|
||||
mp.players.forEach(_player => _player.outputChatBox(`!{orange}[SERVER]: !{1CD8FD}[${player.name}] !{white}покинул нас`))
|
||||
})
|
||||
|
||||
/*
|
||||
When player send message to the chat
|
||||
*/
|
||||
mp.events.add("playerChat", (player, message) => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
mp.players.forEach(_player => _player.outputChatBox(`!{orange}[${player.id}]: !{1CD8FD}${player.name} !{white}${message}`))
|
||||
})
|
||||
|
||||
/*
|
||||
Unknown command in chat
|
||||
*/
|
||||
|
||||
mp.events.add('playerCommand', (player, command) => {
|
||||
if (player.health <= 0) return false
|
||||
player.outputChatBox(`!{orange}[SERVER]: !{red}Команды "${command}" не существует`)
|
||||
player.outputChatBox(`!{orange}[SERVER]: !{red}Нажмите !{1CD8FD}H !{red}для помощи`)
|
||||
})
|
||||
|
||||
mp.events.add('onPlayerDamage', (player) => {
|
||||
if (copchase.isStarted) {
|
||||
return false
|
||||
}
|
||||
|
||||
player.call('setInv', [player])
|
||||
})
|
||||
/*
|
||||
On Player death
|
||||
*/
|
||||
|
||||
mp.events.add('playerDeath', player => {
|
||||
if (copchase.isStarted) {
|
||||
if (player.name === copchase.suspect.name) copchase.stopGame('police')
|
||||
|
||||
const policemanIndex = copchase.players.findIndex(_player => _player.name === player.name && _player.name !== copchase.suspect.name)
|
||||
|
||||
if (policemanIndex !== -1) copchase.players.splice(policemanIndex, 1)
|
||||
if (copchase.players.length <= 1 && copchase.suspect !== null) copchase.stopGame('suspect')
|
||||
}
|
||||
|
||||
player.removeAllWeapons()
|
||||
|
||||
mp.players.forEach(_player => _player.notify(`Игрок ${player.name} погиб`))
|
||||
|
||||
setTimeout(() => {
|
||||
// player.health = 100
|
||||
// player.position = copchaseConfig.spawn
|
||||
player.spawn(copchaseConfig.spawn)
|
||||
player.dimension = 0
|
||||
player.call('setInv', [player])
|
||||
}, 3000)
|
||||
})
|
||||
|
||||
mp.events.add('voiceEnable', player => {
|
||||
mp.players.forEach(_player => {
|
||||
let distance = getDistance(_player.position, player.position)
|
||||
if(player == _player) return false;
|
||||
|
||||
if (distance <= 10) {
|
||||
player.enableVoiceTo(_player);
|
||||
console.log(`${player.name} что-то говорит`)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
mp.events.add('voiceDisable', player => {
|
||||
mp.players.forEach(_player => {
|
||||
if(player == _player) return false;
|
||||
|
||||
player.disableVoiceTo(_player);
|
||||
console.log(`${player.name} перестал говорить`)
|
||||
})
|
||||
})
|
||||
|
||||
mp.events.add('[ui:showHelpPanel]', player => {
|
||||
if (!api.isPlayerLoggedIn(player)) {
|
||||
player.outputChatBox(copchaseConfig.messages.notAuthenticated)
|
||||
return false
|
||||
}
|
||||
|
||||
player.call('onShowHelpPanel')
|
||||
})
|
||||
}
|
||||
|
||||
725
packages/copchase/events/skin.js
Normal file
725
packages/copchase/events/skin.js
Normal file
@ -0,0 +1,725 @@
|
||||
global.ped = {
|
||||
skin: mp.joaat(["A_C_Boar",
|
||||
"A_C_Chickenhawk",
|
||||
"A_C_Chimp",
|
||||
"A_C_Chop",
|
||||
"A_C_Cormorant",
|
||||
"A_C_Cow",
|
||||
"A_C_Coyote",
|
||||
"A_C_Crow",
|
||||
"A_C_Deer",
|
||||
"A_C_Fish",
|
||||
"A_C_Hen",
|
||||
"A_C_Husky",
|
||||
"A_C_MtLion",
|
||||
"A_C_ig",
|
||||
"A_C_igeon",
|
||||
"A_C_Rat",
|
||||
"A_C_Retriever",
|
||||
"A_C_Rhesus",
|
||||
"A_C_Rottweiler",
|
||||
"A_C_Seagull",
|
||||
"A_C_SharkTiger",
|
||||
"A_C_shepherd",
|
||||
"A_F_M_Beach_01",
|
||||
"A_F_M_BevHills_01",
|
||||
"A_F_M_BevHills_02",
|
||||
"A_F_M_BodyBuild_01",
|
||||
"A_F_M_Business_02",
|
||||
"A_F_M_Downtown_01",
|
||||
"A_F_M_EastSA_01",
|
||||
"A_F_M_EastSA_02",
|
||||
"A_F_M_FatBla_01",
|
||||
"A_F_M_FatCult_01",
|
||||
"A_F_M_FatWhite_01",
|
||||
"A_F_M_KTown_01",
|
||||
"A_F_M_KTown_02",
|
||||
"A_F_M_rolHost_01",
|
||||
"A_F_M_Salton_01",
|
||||
"A_F_M_SkidRow_01",
|
||||
"A_F_M_SouCent_01",
|
||||
"A_F_M_SouCent_02",
|
||||
"A_F_M_SouCentMC_01",
|
||||
"A_F_M_Tourist_01",
|
||||
"A_F_M_Tramp_01",
|
||||
"A_F_M_TrampBeac_01",
|
||||
"A_F_O_DesStreet_01",
|
||||
"A_F_O_GenStreet_01",
|
||||
"A_F_O_Indian_01",
|
||||
"A_F_O_KTown_01",
|
||||
"A_F_O_Salton_01",
|
||||
"A_F_O_SouCent_01",
|
||||
"A_F_O_SouCent_02",
|
||||
"A_F_Y_Beach_01",
|
||||
"A_F_Y_BevHills_01",
|
||||
"A_F_Y_BevHills_02",
|
||||
"A_F_Y_BevHills_03",
|
||||
"A_F_Y_BevHills_04",
|
||||
"A_F_Y_Business_01",
|
||||
"A_F_Y_Business_02",
|
||||
"A_F_Y_Business_03",
|
||||
"A_F_Y_Business_04",
|
||||
"A_F_Y_EastSA_01",
|
||||
"A_F_Y_EastSA_02",
|
||||
"A_F_Y_EastSA_03",
|
||||
"A_F_Y_Epsilon_01",
|
||||
"A_F_Y_Fitness_01",
|
||||
"A_F_Y_Fitness_02",
|
||||
"A_F_Y_GenAsian01",
|
||||
"A_F_Y_GenHot_01",
|
||||
"A_F_Y_Golfer_01",
|
||||
"A_F_Y_Hiker_01",
|
||||
"A_F_Y_Hippie_01",
|
||||
"A_F_Y_Hipster_01",
|
||||
"A_F_Y_Hipster_02",
|
||||
"A_F_Y_Hipster_03",
|
||||
"A_F_Y_Hipster_04",
|
||||
"A_F_Y_Indian_01",
|
||||
"A_F_Y_Juggalo_01",
|
||||
"A_F_Y_Runner_01",
|
||||
"A_F_Y_RurMeth_01",
|
||||
"A_F_Y_SCDressy_01",
|
||||
"A_F_Y_SilverHip_01",
|
||||
"A_F_Y_Skater_01",
|
||||
"A_F_Y_Skivill_02",
|
||||
"A_F_Y_SouCent_01",
|
||||
"A_F_Y_SouCent_02",
|
||||
"A_F_Y_SouCent_03",
|
||||
"A_F_Y_Streetlady",
|
||||
"A_F_Y_Tennis_01",
|
||||
"A_F_Y_Topless_01",
|
||||
"A_F_Y_Tourist_01",
|
||||
"A_F_Y_Tourist_02",
|
||||
"A_F_Y_Vinewood_01",
|
||||
"A_F_Y_Vinewood_02",
|
||||
"A_F_Y_Vinewood_03",
|
||||
"A_F_Y_Vinewood_04",
|
||||
"A_F_Y_Yoga_01",
|
||||
"A_M_M_ACult_01",
|
||||
"A_M_M_AfriAmer_01",
|
||||
"A_M_M_Beach_01",
|
||||
"A_M_M_Beach_02",
|
||||
"A_M_M_BevHills_01",
|
||||
"A_M_M_BevHills_02",
|
||||
"A_M_M_Business_01",
|
||||
"A_M_M_DesBeg_01",
|
||||
"A_M_M_DesRebel_02",
|
||||
"A_M_M_DesRebel_04",
|
||||
"A_M_M_EastSA_01",
|
||||
"A_M_M_EastSA_02",
|
||||
"A_M_M_Farmer_01",
|
||||
"A_M_M_FatLatin_01",
|
||||
"A_M_M_GenFat_01",
|
||||
"A_M_M_GenFat_02",
|
||||
"A_M_M_Golfer_01",
|
||||
"A_M_M_HasJew_01",
|
||||
"A_M_M_Hillbilly_01",
|
||||
"A_M_M_Hillbilly_02",
|
||||
"A_M_M_Indian_01",
|
||||
"A_M_M_KTown_01",
|
||||
"A_M_M_Malibu_01",
|
||||
"A_M_M_MexCntry_01",
|
||||
"A_M_M_MexLabor_01",
|
||||
"A_M_M_OG_Boss_01",
|
||||
"A_M_M_aparazzi_01",
|
||||
"A_M_M_olynesian_01",
|
||||
"A_M_M_rolHost_01",
|
||||
"A_M_M_RurMeth_01",
|
||||
"A_M_M_Salton_01",
|
||||
"A_M_M_Salton_02",
|
||||
"A_M_M_Salton_03",
|
||||
"A_M_M_Salton_04",
|
||||
"A_M_M_Skater_01",
|
||||
"A_M_M_Skidrow_01",
|
||||
"A_M_M_SkiVill_07",
|
||||
"A_M_M_SoCenLat_01",
|
||||
"A_M_M_SouCent_01",
|
||||
"A_M_M_SouCent_02",
|
||||
"A_M_M_SouCent_03",
|
||||
"A_M_M_SouCent_04",
|
||||
"A_M_M_StLat_02",
|
||||
"A_M_M_Tennis_01",
|
||||
"A_M_M_Tourist_01",
|
||||
"A_M_M_Tramp_01",
|
||||
"A_M_M_TrampBeac_01",
|
||||
"A_M_M_TranVest_01",
|
||||
"A_M_M_TranVest_02",
|
||||
"A_M_O_ACult_01",
|
||||
"A_M_O_ACult_02",
|
||||
"A_M_O_Beach_01",
|
||||
"A_M_O_DesStreet_01",
|
||||
"A_M_O_GenStreet_01",
|
||||
"A_M_O_KTown_01",
|
||||
"A_M_O_Salton_01",
|
||||
"A_M_O_SouCent_01",
|
||||
"A_M_O_SouCent_02",
|
||||
"A_M_O_SouCent_03",
|
||||
"A_M_O_Tramp_01",
|
||||
"A_M_Y_ACult_01",
|
||||
"A_M_Y_ACult_02",
|
||||
"A_M_Y_Beach_01",
|
||||
"A_M_Y_Beach_02",
|
||||
"A_M_Y_Beach_03",
|
||||
"A_M_Y_BeachVesp_01",
|
||||
"A_M_Y_BeachVesp_02",
|
||||
"A_M_Y_BevHills_01",
|
||||
"A_M_Y_BevHills_02",
|
||||
"A_M_Y_BreakDance_01",
|
||||
"A_M_Y_BusiCas_01",
|
||||
"A_M_Y_Business_01",
|
||||
"A_M_Y_Business_02",
|
||||
"A_M_Y_Business_03",
|
||||
"A_M_Y_Cyclist_01",
|
||||
"A_M_Y_DesRebel_01",
|
||||
"A_M_Y_DesStreet_01",
|
||||
"A_M_Y_DHill_01",
|
||||
"A_M_Y_Downtown_01",
|
||||
"A_M_Y_EastSA_01",
|
||||
"A_M_Y_EastSA_02",
|
||||
"A_M_Y_Epsilon_01",
|
||||
"A_M_Y_Epsilon_02",
|
||||
"A_M_Y_Gay_01",
|
||||
"A_M_Y_Gay_02",
|
||||
"A_M_Y_GenStreet_01",
|
||||
"A_M_Y_GenStreet_02",
|
||||
"A_M_Y_Golfer_01",
|
||||
"A_M_Y_HasJew_01",
|
||||
"A_M_Y_Hiker_01",
|
||||
"A_M_Y_Hippy_01",
|
||||
"A_M_Y_Hipster_01",
|
||||
"A_M_Y_Hipster_02",
|
||||
"A_M_Y_Hipster_03",
|
||||
"A_M_Y_Indian_01",
|
||||
"A_M_Y_Jetski_01",
|
||||
"A_M_Y_Juggalo_01",
|
||||
"A_M_Y_KTown_01",
|
||||
"A_M_Y_KTown_02",
|
||||
"A_M_Y_Latino_01",
|
||||
"A_M_Y_MethHead_01",
|
||||
"A_M_Y_MexThug_01",
|
||||
"A_M_Y_MotoX_01",
|
||||
"A_M_Y_MotoX_02",
|
||||
"A_M_Y_MusclBeac_01",
|
||||
"A_M_Y_MusclBeac_02",
|
||||
"A_M_Y_olynesian_01",
|
||||
"A_M_Y_RoadCyc_01",
|
||||
"A_M_Y_Runner_01",
|
||||
"A_M_Y_Runner_02",
|
||||
"A_M_Y_Salton_01",
|
||||
"A_M_Y_Skater_01",
|
||||
"A_M_Y_Skater_02",
|
||||
"A_M_Y_SouCent_01",
|
||||
"A_M_Y_SouCent_02",
|
||||
"A_M_Y_SouCent_03",
|
||||
"A_M_Y_SouCent_04",
|
||||
"A_M_Y_StBla_01",
|
||||
"A_M_Y_StBla_02",
|
||||
"A_M_Y_StLat_01",
|
||||
"A_M_Y_StWhi_01",
|
||||
"A_M_Y_StWhi_02",
|
||||
"A_M_Y_Sunbathe_01",
|
||||
"A_M_Y_Surfer_01",
|
||||
"A_M_Y_VinDouche_01",
|
||||
"A_M_Y_Vinewood_01",
|
||||
"A_M_Y_Vinewood_02",
|
||||
"A_M_Y_Vinewood_03",
|
||||
"A_M_Y_Vinewood_04",
|
||||
"A_M_Y_Yoga_01",
|
||||
"comp_eds_helmets_moped",
|
||||
"comp_eds_helmets_motox",
|
||||
"comp_eds_helmets_shorty",
|
||||
"comp_eds_helmets_sports",
|
||||
"comp_eds_marine",
|
||||
"CS_AmandaTownley",
|
||||
"CS_Andreas",
|
||||
"CS_ashley",
|
||||
"CS_Bankman",
|
||||
"CS_Barry",
|
||||
"CS_Beverly",
|
||||
"CS_Brad",
|
||||
"CS_BradCadaver",
|
||||
"CS_Carbuyer",
|
||||
"CS_Casey",
|
||||
"CS_ChengSr",
|
||||
"CS_ChrisFormage",
|
||||
"CS_Clay",
|
||||
"CS_Dale",
|
||||
"CS_DaveNorton",
|
||||
"CS_debra",
|
||||
"CS_denise",
|
||||
"CS_Devin",
|
||||
"CS_Dom",
|
||||
"CS_Dreyfuss",
|
||||
"CS_DrFriedlander",
|
||||
"CS_Fabien",
|
||||
"CS_fabien",
|
||||
"CS_FBISuit_01",
|
||||
"CS_Floyd",
|
||||
"CS_Guadalope",
|
||||
"CS_gurk",
|
||||
"CS_Hunter",
|
||||
"CS_Janet",
|
||||
"CS_JewelAss",
|
||||
"CS_JimmyBoston",
|
||||
"CS_JimmyDiSanto",
|
||||
"CS_JoeMinuteMan",
|
||||
"CS_JohnnyKlebitz",
|
||||
"CS_Josef",
|
||||
"CS_Josh",
|
||||
"CS_LamarDavis",
|
||||
"CS_Lazlow",
|
||||
"CS_LesterCrest",
|
||||
"CS_LifeInvad_01",
|
||||
"CS_Magenta",
|
||||
"CS_Manuel",
|
||||
"CS_Marnie",
|
||||
"CS_MartinMadrazo",
|
||||
"CS_MaryAnn",
|
||||
"CS_Michelle",
|
||||
"CS_Milton",
|
||||
"CS_Molly",
|
||||
"CS_MovPremF_01",
|
||||
"CS_MovPremMale",
|
||||
"CS_MRK",
|
||||
"CS_MRS_Thornhill",
|
||||
"CS_MrsPhillips",
|
||||
"CS_Natalia",
|
||||
"CS_NervousRon",
|
||||
"CS_Nigel",
|
||||
"CS_Old_Man1A",
|
||||
"CS_Old_Man2",
|
||||
"CS_Omega",
|
||||
"CS_Orleans",
|
||||
"CS_aper",
|
||||
"CS_atricia",
|
||||
"CS_riest",
|
||||
"CS_rolSec_02",
|
||||
"CS_RussianDrunk",
|
||||
"CS_SiemonYetarian",
|
||||
"CS_Solomon",
|
||||
"CS_SteveHains",
|
||||
"CS_Stretch",
|
||||
"CS_Tanisha",
|
||||
"CS_TaoCheng",
|
||||
"CS_TaosTranslator",
|
||||
"CS_TennisCoach",
|
||||
"CS_Terry",
|
||||
"CS_Tom",
|
||||
"CS_TomEpsilon",
|
||||
"CS_TracyDiSanto",
|
||||
"CS_Wade",
|
||||
"CS_Zimbor",
|
||||
"CSB_Abigail",
|
||||
"CSB_Anita",
|
||||
"CSB_Anton",
|
||||
"CSB_BallasOG",
|
||||
"CSB_Bride",
|
||||
"CSB_BurgerDrug",
|
||||
"CSB_Car3guy1",
|
||||
"CSB_Car3guy2",
|
||||
"CSB_Chef",
|
||||
"CSB_Chin_goon",
|
||||
"CSB_Cletus",
|
||||
"CSB_Cop",
|
||||
"CSB_Customer",
|
||||
"CSB_Denise_friend",
|
||||
"CSB_FOS_rep",
|
||||
"CSB_G",
|
||||
"CSB_Groom",
|
||||
"CSB_Grove_str_dlr",
|
||||
"CSB_Hao",
|
||||
"CSB_Hugh",
|
||||
"CSB_Imran",
|
||||
"CSB_Janitor",
|
||||
"CSB_Maude",
|
||||
"CSB_MWeather",
|
||||
"CSB_Ortega",
|
||||
"CSB_Oscar",
|
||||
"CSB_ornDudes",
|
||||
"CSB_rologueDriver",
|
||||
"CSB_rolSec",
|
||||
"CSB_Ramp_Gang",
|
||||
"CSB_Ramp_hic",
|
||||
"CSB_Ramp_hipster",
|
||||
"CSB_Ramp_Marine",
|
||||
"CSB_Ramp_Mex",
|
||||
"CSB_Reporter",
|
||||
"CSB_RoccoPelosi",
|
||||
"CSB_Screen_Writer",
|
||||
"CSB_Stripper_01",
|
||||
"CSB_Stripper_02",
|
||||
"CSB_Tonya",
|
||||
"CSB_TrafficWarden",
|
||||
"G_F_Y_ballas_01",
|
||||
"G_F_Y_Families_01",
|
||||
"G_F_Y_Lost_01",
|
||||
"G_F_Y_Vagos_01",
|
||||
"G_M_M_AlpHench_01",
|
||||
"G_M_M_AlpHench_02",
|
||||
"G_M_M_ArmBoss_01",
|
||||
"G_M_M_ArmGoon_01",
|
||||
"G_M_M_ArmLieut_01",
|
||||
"G_M_M_ChemWork_01",
|
||||
"G_M_M_ChiBoss_01",
|
||||
"G_M_M_ChiCold_01",
|
||||
"G_M_M_ChiGoon_01",
|
||||
"G_M_M_ChiGoon_02",
|
||||
"G_M_M_KorBoss_01",
|
||||
"G_M_M_MexBoss_01",
|
||||
"G_M_M_MexBoss_02",
|
||||
"G_M_O_DesOfficer",
|
||||
"G_M_Y_AlpHeli_01",
|
||||
"G_M_Y_ArmGoon_02",
|
||||
"G_M_Y_Azteca_01",
|
||||
"G_M_Y_BallaEast_01",
|
||||
"G_M_Y_BallaOrig_01",
|
||||
"G_M_Y_BallaSout_01",
|
||||
"G_M_Y_Black01",
|
||||
"G_M_Y_Const_01",
|
||||
"G_M_Y_DesArmy_01",
|
||||
"G_M_Y_DesArmy_02",
|
||||
"G_M_Y_DesArmy_05",
|
||||
"G_M_Y_DesHench_02",
|
||||
"G_M_Y_DesHench_03",
|
||||
"G_M_Y_DesMilit_03",
|
||||
"G_M_Y_FamCA_01",
|
||||
"G_M_Y_FamDNF_01",
|
||||
"G_M_Y_FamFor_01",
|
||||
"G_M_Y_Famfor_01",
|
||||
"G_M_Y_Korean_01",
|
||||
"G_M_Y_Korean_02",
|
||||
"G_M_Y_KorLieut_01",
|
||||
"G_M_Y_Latino01",
|
||||
"G_M_Y_Lost_01",
|
||||
"G_M_Y_Lost_02",
|
||||
"G_M_Y_Lost_03",
|
||||
"G_M_Y_MexGang_01",
|
||||
"G_M_Y_MexGoon_01",
|
||||
"G_M_Y_MexGoon_02",
|
||||
"G_M_Y_MexGoon_03",
|
||||
"G_M_Y_oloGoon_01",
|
||||
"G_M_Y_oloGoon_02",
|
||||
"G_M_Y_SalvaBoss_01",
|
||||
"G_M_Y_SalvaGoon_01",
|
||||
"G_M_Y_SalvaGoon_02",
|
||||
"G_M_Y_SalvaGoon_03",
|
||||
"G_M_Y_SciHench_01",
|
||||
"G_M_Y_ScuHench_02",
|
||||
"G_M_Y_SpaceHench_01",
|
||||
"G_M_Y_SPACHENCH_02",
|
||||
"G_M_Y_StrPunk_01",
|
||||
"G_M_Y_StrPunk_02",
|
||||
"G_M_Y_SubHench_01",
|
||||
"G_M_Y_White01",
|
||||
"HC_Driver",
|
||||
"HC_Gunman",
|
||||
"HC_Hacker",
|
||||
"IG_Abigail",
|
||||
"IG_AmandaTownley",
|
||||
"IG_Andreas",
|
||||
"IG_Ashley",
|
||||
"IG_BallasOG",
|
||||
"IG_Bankman",
|
||||
"IG_Barry",
|
||||
"IG_BestMen",
|
||||
"IG_Beverly",
|
||||
"IG_Brad",
|
||||
"IG_Bride",
|
||||
"IG_Car3guy1",
|
||||
"IG_Car3guy2",
|
||||
"IG_Casey",
|
||||
"IG_Chef",
|
||||
"IG_ChengSr",
|
||||
"IG_ChrisFormage",
|
||||
"IG_Clay",
|
||||
"IG_ClayPain",
|
||||
"IG_Cletus",
|
||||
"IG_Dale",
|
||||
"IG_DaveNorton",
|
||||
"IG_Denise",
|
||||
"IG_Devin",
|
||||
"IG_Dom",
|
||||
"IG_Dreyfuss",
|
||||
"IG_DrFriedlander",
|
||||
"IG_Fabien",
|
||||
"IG_FBISuit_01",
|
||||
"IG_Floyd",
|
||||
"IG_Groom",
|
||||
"IG_Hao",
|
||||
"IG_Hunter",
|
||||
"IG_Janet",
|
||||
"IG_JAY_Norris",
|
||||
"IG_JewelAss",
|
||||
"IG_JimmyBoston",
|
||||
"IG_JimmyDiSanto",
|
||||
"IG_JoeMinuteMan",
|
||||
"IG_JohnnyKlebitz",
|
||||
"IG_Josef",
|
||||
"IG_Josh",
|
||||
"IG_KerryMcIntosh",
|
||||
"IG_LamarDavis",
|
||||
"IG_Lazlow",
|
||||
"IG_LesterCrest",
|
||||
"IG_LifeInvad_01",
|
||||
"IG_LifeInvad_02",
|
||||
"IG_Magenta",
|
||||
"IG_Manuel",
|
||||
"IG_Marnie",
|
||||
"IG_MaryAnn",
|
||||
"IG_Maude",
|
||||
"IG_Michelle",
|
||||
"IG_Milton",
|
||||
"IG_Molly",
|
||||
"IG_MRK",
|
||||
"IG_MRS_Thornhill",
|
||||
"IG_MrsPhillips",
|
||||
"IG_Natalia",
|
||||
"IG_NervousRon",
|
||||
"IG_Nigel",
|
||||
"IG_Old_Man1A",
|
||||
"IG_Old_Man2",
|
||||
"IG_Omega",
|
||||
"IG_ONeil",
|
||||
"IG_Orleans",
|
||||
"IG_Ortega",
|
||||
"IG_aper",
|
||||
"IG_atricia",
|
||||
"IG_riest",
|
||||
"IG_rolSec_02",
|
||||
"IG_Ramp_Gang",
|
||||
"IG_Ramp_Hic",
|
||||
"IG_Ramp_Hipster",
|
||||
"IG_Ramp_Mex",
|
||||
"IG_RoccoPelosi",
|
||||
"IG_RussianDrunk",
|
||||
"IG_Screen_Writer",
|
||||
"IG_SiemonYetarian",
|
||||
"IG_Solomon",
|
||||
"IG_SteveHains",
|
||||
"IG_Stretch",
|
||||
"IG_Talina",
|
||||
"IG_Tanisha",
|
||||
"IG_TaoCheng",
|
||||
"IG_TaosTranslator",
|
||||
"IG_TennisCoach",
|
||||
"IG_Terry",
|
||||
"IG_TomEpsilon",
|
||||
"IG_Tonya",
|
||||
"IG_TracyDiSanto",
|
||||
"IG_TrafficWarden",
|
||||
"IG_TylerDix",
|
||||
"IG_Wade",
|
||||
"IG_Zimbor",
|
||||
"MP_F_Cop_01",
|
||||
"MP_F_DeadHooker",
|
||||
"MP_F_Freemode_01",
|
||||
"MP_F_Misty_01",
|
||||
"MP_F_StripperLite",
|
||||
"MP_G_F_Mexican_01",
|
||||
"MP_G_F_Vagos_01",
|
||||
"MP_G_M_Black_01",
|
||||
"MP_G_M_Mexican_01",
|
||||
"MP_G_M_ros_01",
|
||||
"MP_G_M_Vagos_01",
|
||||
"MP_HeadTargets",
|
||||
"MP_M_Claude_01",
|
||||
"MP_M_Cop_01",
|
||||
"MP_M_ExArmy_01",
|
||||
"MP_M_FamDD_01",
|
||||
"MP_M_FIBSec_01",
|
||||
"MP_M_Freemode_01",
|
||||
"MP_M_Marston_01",
|
||||
"MP_M_Niko_01",
|
||||
"MP_M_ShopKeep_01",
|
||||
"MP_S_M_Armoured_01",
|
||||
"player",
|
||||
"Player_One",
|
||||
"Player_Two",
|
||||
"Player_Zero",
|
||||
"S_F_M_Fembarber",
|
||||
"S_F_M_Maid_01",
|
||||
"S_F_M_MAID_02",
|
||||
"S_F_M_Shop_HIGH",
|
||||
"S_F_M_SweatShop_01",
|
||||
"S_F_Y_AirHostess_01",
|
||||
"S_F_Y_Bartender_01",
|
||||
"S_F_Y_Baywatch_01",
|
||||
"S_F_Y_Cop_01",
|
||||
"S_F_Y_Factory_01",
|
||||
"S_F_Y_Hooker_01",
|
||||
"S_F_Y_Hooker_02",
|
||||
"S_F_Y_Hooker_03",
|
||||
"S_F_Y_Migrant_01",
|
||||
"S_F_Y_MovPrem_01",
|
||||
"S_F_Y_Ranger_01",
|
||||
"S_F_Y_Scrubs_01",
|
||||
"S_F_Y_Sheriff_01",
|
||||
"S_F_Y_Shop_LOW",
|
||||
"S_F_Y_Shop_MID",
|
||||
"S_F_Y_Snowcop_01",
|
||||
"S_F_Y_Stripper_01",
|
||||
"S_F_Y_Stripper_02",
|
||||
"S_F_Y_StripperLite",
|
||||
"S_F_Y_SweatShop_01",
|
||||
"S_M_M_Alpstall",
|
||||
"S_M_M_AmmuCountry",
|
||||
"S_M_M_Armoured_01",
|
||||
"S_M_M_Armoured_02",
|
||||
"S_M_M_AutoShop_01",
|
||||
"S_M_M_AutoShop_02",
|
||||
"S_M_M_Bouncer_01",
|
||||
"S_M_M_ChemSec_01",
|
||||
"S_M_M_CIASec_01",
|
||||
"S_M_M_CntryBar_01",
|
||||
"S_M_M_DockWork_01",
|
||||
"S_M_M_Doctor_01",
|
||||
"S_M_M_FIBOffice_01",
|
||||
"S_M_M_FIBOffice_02",
|
||||
"S_M_M_Gaffer_01",
|
||||
"S_M_M_Gardener_01",
|
||||
"S_M_M_GenTransport",
|
||||
"S_M_M_HairDress_01",
|
||||
"S_M_M_HighSec_01",
|
||||
"S_M_M_HighSec_02",
|
||||
"S_M_M_INTWork",
|
||||
"S_M_M_Janitor",
|
||||
"S_M_M_LatHandy_01",
|
||||
"S_M_M_LifeInvad_01",
|
||||
"S_M_M_Linecook",
|
||||
"S_M_M_LSMetro_01",
|
||||
"S_M_M_Mariachi_01",
|
||||
"S_M_M_Marine_01",
|
||||
"S_M_M_Marine_02",
|
||||
"S_M_M_Migrant_01",
|
||||
"S_M_M_MovAlien_01",
|
||||
"S_M_M_MovPrem_01",
|
||||
"S_M_M_MovSpace_01",
|
||||
"S_M_M_aramedic_01",
|
||||
"S_M_M_ilot_01",
|
||||
"S_M_M_ilot_02",
|
||||
"S_M_M_ostal_01",
|
||||
"S_M_M_ostal_02",
|
||||
"S_M_M_risGuard_01",
|
||||
"S_M_M_Scientist_01",
|
||||
"S_M_M_Security_01",
|
||||
"S_M_M_SnowCop_01",
|
||||
"S_M_M_StrPerf_01",
|
||||
"S_M_M_StrPreach_01",
|
||||
"S_M_M_StrVend_01",
|
||||
"S_M_M_Trucker_01",
|
||||
"S_M_M_UPS_01",
|
||||
"S_M_M_UPS_02",
|
||||
"S_M_O_Busker_01",
|
||||
"S_M_O_Snowcop_01",
|
||||
"S_M_Y_AirWorker",
|
||||
"S_M_Y_AmmuCity_01",
|
||||
"S_M_Y_ArmyMech_01",
|
||||
"S_M_Y_Autopsy_01",
|
||||
"S_M_Y_Barman_01",
|
||||
"S_M_Y_BayWatch_01",
|
||||
"S_M_Y_BlackOps_01",
|
||||
"S_M_Y_BlackOps_02",
|
||||
"S_M_Y_BusBoy_01",
|
||||
"S_M_Y_Chef_01",
|
||||
"S_M_Y_Clown_01",
|
||||
"S_M_Y_Construct_01",
|
||||
"S_M_Y_Construct_02",
|
||||
"S_M_Y_Cop_01",
|
||||
"S_M_Y_Dealer_01",
|
||||
"S_M_Y_DevinSec_01",
|
||||
"S_M_Y_DockWork_01",
|
||||
"S_M_Y_Doorman_01",
|
||||
"S_M_Y_DWService_01",
|
||||
"S_M_Y_DWService_02",
|
||||
"S_M_Y_Factory_01",
|
||||
"S_M_Y_Fireman_01",
|
||||
"S_M_Y_Garbage",
|
||||
"S_M_Y_Grip_01",
|
||||
"S_M_Y_HwayCop_01",
|
||||
"S_M_Y_Marine_01",
|
||||
"S_M_Y_Marine_02",
|
||||
"S_M_Y_Marine_03",
|
||||
"S_M_Y_Mime",
|
||||
"S_M_Y_estCont_01",
|
||||
"S_M_Y_ilot_01",
|
||||
"S_M_Y_risMuscl_01",
|
||||
"S_M_Y_risoner_01",
|
||||
"S_M_Y_Ranger_01",
|
||||
"S_M_Y_Robber_01",
|
||||
"S_M_Y_Scrubs_01",
|
||||
"S_M_Y_Sheriff_01",
|
||||
"S_M_Y_Shop_MASK",
|
||||
"S_M_Y_StrVend_01",
|
||||
"S_M_Y_Swat_01",
|
||||
"S_M_Y_USCG_01",
|
||||
"S_M_Y_Valet_01",
|
||||
"S_M_Y_Waiter_01",
|
||||
"S_M_Y_WinClean_01",
|
||||
"S_M_Y_XMech_01",
|
||||
"S_M_Y_XMech_02",
|
||||
"slod_human",
|
||||
"slod_large_quadped",
|
||||
"slod_small_quadped",
|
||||
"strm_eds_mpShare",
|
||||
"strm_eds_mpTattRTs",
|
||||
"U_F_M_Corpse_01",
|
||||
"U_F_M_Miranda",
|
||||
"U_F_M_roMourn_01",
|
||||
"U_F_O_MovieStar",
|
||||
"U_F_O_rolHost_01",
|
||||
"U_F_Y_BikerChic",
|
||||
"U_F_Y_COMJane",
|
||||
"U_F_Y_corpse_01",
|
||||
"U_F_Y_corpse_02",
|
||||
"U_F_Y_HotPosh_01",
|
||||
"U_F_Y_JewelAss_01",
|
||||
"U_F_Y_Mistress",
|
||||
"U_F_Y_oppyMich",
|
||||
"U_F_Y_rincess",
|
||||
"U_F_Y_SpyActress",
|
||||
"U_M_M_Aldinapoli",
|
||||
"U_M_M_BankMan",
|
||||
"U_M_M_BikeHire_01",
|
||||
"U_M_M_FIBArchitect",
|
||||
"U_M_M_FilmDirector",
|
||||
"U_M_M_GlenStank_01",
|
||||
"U_M_M_Griff_01",
|
||||
"U_M_M_Jesus_01",
|
||||
"U_M_M_JewelSec_01",
|
||||
"U_M_M_JewelThief",
|
||||
"U_M_M_MarkFost",
|
||||
"U_M_M_artyTarget",
|
||||
"U_M_M_rolSec_01",
|
||||
"U_M_M_roMourn_01",
|
||||
"U_M_M_RivalPap",
|
||||
"U_M_M_SpyActor",
|
||||
"U_M_M_WillyFist",
|
||||
"U_M_O_FinGuru_01",
|
||||
"U_M_O_TapHillBilly",
|
||||
"U_M_O_Tramp_01",
|
||||
"U_M_Y_Abner",
|
||||
"U_M_Y_AntonB",
|
||||
"U_M_Y_BabyD",
|
||||
"U_M_Y_Baygor",
|
||||
"U_M_Y_BurgerDrug_01",
|
||||
"U_M_Y_Chip",
|
||||
"U_M_Y_Cyclist_01",
|
||||
"U_M_Y_FIBMugger_01",
|
||||
"U_M_Y_Guido_01",
|
||||
"U_M_Y_GunVend_01",
|
||||
"U_M_Y_Hippie_01",
|
||||
"U_M_Y_ImpoRage",
|
||||
"U_M_Y_Justin",
|
||||
"U_M_Y_Mani",
|
||||
"U_M_Y_MilitaryBum",
|
||||
"U_M_Y_aparazzi",
|
||||
"U_M_Y_arty_01",
|
||||
"U_M_Y_ogo_01",
|
||||
"U_M_Y_risoner_01",
|
||||
"U_M_Y_rolDriver_01",
|
||||
"U_M_Y_RSRanger_01",
|
||||
"U_M_Y_SBike",
|
||||
"U_M_Y_StagGrm_01",
|
||||
"U_M_Y_Tattoo_01",
|
||||
"U_M_Y_Zombie_01"])
|
||||
}
|
||||
5
packages/copchase/helpers/getDistance.js
Normal file
5
packages/copchase/helpers/getDistance.js
Normal file
@ -0,0 +1,5 @@
|
||||
const getDistance = function (v1, v2){
|
||||
return Math.abs(Math.sqrt(Math.pow((v2.x - v1.x),2) + Math.pow((v2.y - v1.y), 2)));
|
||||
}
|
||||
|
||||
module.exports = { getDistance }
|
||||
47
packages/copchase/index.js
Normal file
47
packages/copchase/index.js
Normal file
@ -0,0 +1,47 @@
|
||||
const mongoose = require('mongoose')
|
||||
const { Player } = require('./models')
|
||||
const API = require('./api')
|
||||
const Copchase = require('./copchase')
|
||||
|
||||
const startServer = async () => {
|
||||
|
||||
try {
|
||||
await mongoose.connect('mongodb+srv://sergeyyarkov:1234@cluster0.erqpg.mongodb.net/copchase-db?retryWrites=true&w=majority', {
|
||||
useNewUrlParser: true,
|
||||
useUnifiedTopology: true,
|
||||
useFindAndModify: false,
|
||||
})
|
||||
|
||||
console.log('Database connected!')
|
||||
|
||||
const players = await Player.find({})
|
||||
const api = new API(players)
|
||||
const copchase = new Copchase({
|
||||
dimension: 10,
|
||||
waitingRoomDimension: 5,
|
||||
maxPlayers: 11,
|
||||
minPlayers: 1,
|
||||
timeRemaining: 10,
|
||||
timeToStart: 3
|
||||
})
|
||||
|
||||
/*
|
||||
Commands
|
||||
*/
|
||||
|
||||
require('./commands/admin/admin')({ api })
|
||||
require('./commands/player/player')({ api, copchase })
|
||||
|
||||
/*
|
||||
Events
|
||||
*/
|
||||
|
||||
require('./events/admin/admin')({ api })
|
||||
require('./events/player/player')({ api, copchase })
|
||||
|
||||
} catch (error) {
|
||||
console.log('Error!', error)
|
||||
}
|
||||
}
|
||||
|
||||
startServer()
|
||||
8
packages/copchase/models/Player.js
Normal file
8
packages/copchase/models/Player.js
Normal file
@ -0,0 +1,8 @@
|
||||
const mongoose = require('mongoose')
|
||||
|
||||
const playerSchema = mongoose.Schema({
|
||||
name: String,
|
||||
password: String
|
||||
})
|
||||
|
||||
module.exports = mongoose.model('Player', playerSchema)
|
||||
5
packages/copchase/models/index.js
Normal file
5
packages/copchase/models/index.js
Normal file
@ -0,0 +1,5 @@
|
||||
const Player = require('./Player')
|
||||
|
||||
module.exports = {
|
||||
Player
|
||||
}
|
||||
3341
packages/copchase/package-lock.json
generated
Normal file
3341
packages/copchase/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
20
packages/copchase/package.json
Normal file
20
packages/copchase/package.json
Normal file
@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "copchase",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"bcryptjs": "^2.4.3",
|
||||
"install": "^0.13.0",
|
||||
"mongoose": "^5.9.26",
|
||||
"npm": "^6.14.7",
|
||||
"or": "^0.2.0"
|
||||
},
|
||||
"devDependencies": {},
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC"
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user