From abbce246ac6f58a9cc12ac9d2b53d3db02405264 Mon Sep 17 00:00:00 2001 From: Sergey Yarkov Date: Fri, 14 Aug 2020 19:43:24 +0300 Subject: [PATCH] fixed blips --- client/html/Pricedown.ttf | Bin 0 -> 49280 bytes client/html/app.js | 45 ++++++++++++++++ client/html/index.html | 30 +++++++++++ client/html/style.css | 54 ++++++++++++++++++++ client/index.mjs | 28 ++++++++-- client/modules/blips.mjs | 34 +++++++----- server/modules/copchase.mjs | 41 ++++++++------- server/modules/events/playerConnect.mjs | 12 +++++ server/modules/events/playerDeath.mjs | 5 +- server/modules/events/playerDisconnect.mjs | 8 +-- server/modules/events/playerLeftVehicle.mjs | 4 +- 11 files changed, 215 insertions(+), 46 deletions(-) create mode 100644 client/html/Pricedown.ttf create mode 100644 client/html/app.js create mode 100644 client/html/index.html create mode 100644 client/html/style.css diff --git a/client/html/Pricedown.ttf b/client/html/Pricedown.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b410cba41690f8d79f2175c22f96c466f577fd0b GIT binary patch literal 49280 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 x`+|HT{#E&td=l=T9ha< literal 0 HcmV?d00001 diff --git a/client/html/app.js b/client/html/app.js new file mode 100644 index 0000000..159f9ee --- /dev/null +++ b/client/html/app.js @@ -0,0 +1,45 @@ +class Component { + constructor({ id }) { + this.$el = document.getElementById(id) + } +} + +class DateComponent extends Component { + constructor(id) { + super(id) + this.renderDate() + } + + renderDate() { + setInterval(() => { + const date = new Date() + this.$el.textContent = `${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}` + }) + } +} + +class EngineHealthComponent extends Component { + constructor(id) { + super(id) + } + + renderEngineHealth(engineHealth) { + this.$el.textContent = `engine health: ${engineHealth}` + } + + clearDisplay() { + this.$el.textContent = `` + } +} + + +const dateComponent = new DateComponent({ id: 'date' }) +const engineHealthComponent = new EngineHealthComponent({ id: 'engineHealth' }) + +if ('alt' in window) { + alt.on('display:engineHealth', engineHealth => engineHealthComponent.renderEngineHealth(engineHealth)) + alt.on('displayClear:engineHealth', () => engineHealthComponent.clearDisplay()) + alt.emit('ready') +} else { + engineHealthComponent.$el.textContent = `engine health: 0` +} \ No newline at end of file diff --git a/client/html/index.html b/client/html/index.html new file mode 100644 index 0000000..e5c6e61 --- /dev/null +++ b/client/html/index.html @@ -0,0 +1,30 @@ + + + + + + + Document + + +
+
+
+

+ Copchase server

+
+
+
+ +
+
+
+ +
+ + + \ No newline at end of file diff --git a/client/html/style.css b/client/html/style.css new file mode 100644 index 0000000..1da8e8c --- /dev/null +++ b/client/html/style.css @@ -0,0 +1,54 @@ +@font-face { + font-family: "Pricedown"; + src: url("./Pricedown.ttf") format("truetype"); +} + +* { + box-sizing: border-box; + -moz-user-select: none; + -khtml-user-select: none; + user-select: none; +} + + h1, h2, h3, h4, h5, h6, p { + padding: 0; + margin: 0; + } + +.container { + padding: 25px; + color: #fff; + font-family: 'Pricedown'; +} +.container .container-header { + display: flex; + flex-direction: column; + align-items: flex-end; +} +.container .container-header .container-header__title { + font-size: 38px; +} + +.container .container-header .container-header__title p { + display: flex; + -webkit-text-stroke-width: 1.6px; + -webkit-text-stroke-color: black; +} + +.container .container-header .container-header__title svg { + align-items: center; + margin-right: 15px; + width: 32px; +} + +.container .container-header .container-header__date { + font-size: 18px; + font-family: 'Open Sans'; + margin-top: 5px; + color: #fff; +} + +.container-footer #engineHealth { + color: #fff; + font-size: 28px; +} \ No newline at end of file diff --git a/client/index.mjs b/client/index.mjs index cd4ca55..335aac0 100644 --- a/client/index.mjs +++ b/client/index.mjs @@ -6,6 +6,8 @@ import './ui.mjs' import './modules/blips.mjs' +const webview = new alt.WebView('http://resource/client/html/index.html') + alt.setMsPerGameMinute(30000) alt.onServer('player:death', () => { @@ -32,11 +34,20 @@ alt.onServer('player:delInvincible', () => { }) alt.onServer('vehicle:setInto', (newVehicle) => { - const localPlayer = alt.Player.local.scriptID - - alt.setTimeout(() => { - native.setPedIntoVehicle(localPlayer, newVehicle.scriptID, -1) - }, 400) + let cleared = false; + const interval = alt.setInterval(() => { + const vehicleScriptId = newVehicle.scriptID; + if (vehicleScriptId) { + native.setPedIntoVehicle(alt.Player.local.scriptID, vehicleScriptId, -1); + alt.clearInterval(interval); + cleared = true; + } + }, 10); + alt.setTimeout(() => { + if (!cleared) { + alt.clearInterval(interval); + } + }, 500); }) alt.onServer('admin:setStat', () => { @@ -45,4 +56,11 @@ alt.onServer('admin:setStat', () => { alt.onServer('admin:setInvincible', toggle => { native.setEntityInvincible(alt.Player.local.scriptID, toggle) +}) + + +alt.onServer('webview:load', () => { + webview.on('ready', () => { + + }) }) \ No newline at end of file diff --git a/client/modules/blips.mjs b/client/modules/blips.mjs index 0788f9a..975e67e 100644 --- a/client/modules/blips.mjs +++ b/client/modules/blips.mjs @@ -1,37 +1,43 @@ import * as alt from 'alt' -const blips = {} - alt.everyTick(() => { alt.Player.all.forEach(_player => { - if (blips[_player.id]) { - blips[_player.id].pos = _player.pos + if (!_player.valid) { + return + } + + if (_player.blip && _player.blip !== null) { + _player.blip.pos = _player.getSyncedMeta('pos') } }) }) alt.onServer('player:createBlipPlayers', ({ players, color }) => { players.forEach(_player => { - if (_player.name !== alt.Player.local.name) { - blips[_player.id] = new alt.PointBlip(_player.pos.x, _player.pos.y, _player.pos.z) - blips[_player.id].name = _player.name - blips[_player.id].color = color + if (_player.id === alt.Player.local.id) { + return } + + _player.blip = new alt.PointBlip(_player.pos.x, _player.pos.y, _player.pos.z) + _player.blip.name = _player.name + _player.blip.color = color + _player.blip.shortRange = false; + _player.blip.owner = _player; }) }) alt.onServer('player:deleteBlipPlayers', () => { alt.Player.all.forEach(_player => { - if (blips[_player.id]) { - blips[_player.id].destroy() - blips[_player.id] = null + if (_player.blip) { + _player.blip.destroy() + _player.blip = null } }) }) alt.onServer('player:deleteBlipPlayer', player => { - if (blips[player.id]) { - blips[player.id].destroy() - blips[player.id] = null + if (player.blip) { + player.blip.destroy() + player.blip = null } }) \ No newline at end of file diff --git a/server/modules/copchase.mjs b/server/modules/copchase.mjs index 8329d76..6c69b01 100644 --- a/server/modules/copchase.mjs +++ b/server/modules/copchase.mjs @@ -34,7 +34,6 @@ class Copchase { 'vamos', 'chino', 'moonbeam', - 'elegy2', 'dubsta', 'dominator', 'rebla', @@ -74,14 +73,14 @@ class Copchase { 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 } + { x: 387.006, y: -766.760, z: 28.723 }, + { x: 442.483, y: -1507.068, z: 28.605 }, + { x: 1924.773, y: 3819.125, z: 31.588 } ], police: [ { x: 442.308, y: -1025.066, z: 28.231 }, - { x: 348.865, y: -1966.507, z: 24.133 }, - { x: 2681.454, y: 3457.637, z: 55.228 } + { x: 396.105, y: -1643.973, z: 28.757 }, + { x: 1847.670, y: 3671.854, z: 33.172 } ] } } @@ -99,7 +98,7 @@ class Copchase { } isPlayerInGame(player) { - if(this.players.find(_player => _player.name === player.name) !== undefined) { + if(this.players.find(_player => _player.id === player.id) !== undefined) { send(player, '{EE9A00}[COPCHASE]: {FF0000}Дождитесь окончания игры!') return true } else { @@ -108,7 +107,7 @@ class Copchase { } isPlayerInWaitingRoom(player) { - if(this.waitingPlayers.find(_player => _player.name === player.name) !== undefined) { + if(this.waitingPlayers.find(_player => _player.id === player.id) !== undefined) { return true } else { return false @@ -125,7 +124,7 @@ class Copchase { } selectSuspect() { - this.suspect = this.players[Math.floor(Math.random() * (this.players.length - 1 - 0 + 1) + 0)] + this.suspect = this.players[Math.floor(Math.random() * this.players.length)] } messageToPlayersInGame(message) { @@ -143,7 +142,7 @@ class Copchase { } notifyPolicePlayers(message) { - this.players.forEach(_player => _player.name !== this.suspect.name ? alt.emitClient(_player, 'player:notify', message) : false) + this.players.forEach(_player => _player.id !== this.suspect.id ? alt.emitClient(_player, 'player:notify', message) : false) } notifySuspectPlayer(message) { @@ -157,17 +156,13 @@ class Copchase { return new Promise((resolve, reject) => { this.players.forEach(_player => { - if (_player.name === this.suspect.name) { + if (_player.id === this.suspect.id) { _player.pos = suspectPosition setTimeout(() => _player.health = 200, 300) _player.dimension = this.dimension _player.model = skins[Math.floor(Math.random() * (430 - 1 - 422) + 422)] alt.emitClient(_player, 'player:delInvincible') alt.emitClient(_player, 'player:showMidsizedMessage', '~r~Вы саспект!', 'Уйдите от полицейских.', 5000) - this.players.forEach(_player => _player.name === this.suspect.name - ? alt.emitClient(_player, 'player:createBlipPlayers', { players: this.players, color: 38 }) - : alt.emitClient(_player, 'player:createBlipPlayers', { players: this.players, color: 1 }) - ) } else { posX = posX + 3 _player.pos = { @@ -182,6 +177,14 @@ class Copchase { _player.giveWeapon('0x3656C8C1', 100, true) alt.emitClient(_player, 'player:delInvincible') alt.emitClient(_player, 'player:showMidsizedMessage', `~w~Саспект: ~r~${this.suspect.name}`, 'Нейтрализуйте саспекта.', 5000) + alt.emitClient(_player, 'player:createBlipPlayers', { + players: this.players.filter(player => player.id !== this.suspect.id), + color: 38 + }) // create friendly blips + alt.emitClient(_player, 'player:createBlipPlayers', { + players: this.players.filter(player => player.id === this.suspect.id), + color: 1 + }) // create suspec blip } }) @@ -191,7 +194,7 @@ class Copchase { spawnCars() { this.players.forEach(_player => { - if (_player.name === this.suspect.name) { + if (_player.id === this.suspect.id) { const carSuspect = new alt.Vehicle( this.suspectCars[Math.floor(Math.random() * (this.suspectCars.length - 1 - 0) + 0)], _player.pos.x, _player.pos.y, _player.pos.z, @@ -288,7 +291,7 @@ class Copchase { if (winner === 'police') { this.players.forEach(_player => { - if (_player.name !== this.suspect.name) { + if (_player.id !== this.suspect.id) { alt.emitClient(_player, 'player:showMidsizedMessage', '~g~Вы выиграли', 'Саспект был нейтрализован.') } }) @@ -297,7 +300,7 @@ class Copchase { if (winner === 'suspect') { this.players.forEach(_player => { - if (_player.name === this.suspect.name) { + if (_player.id === this.suspect.id) { alt.emitClient(_player, 'player:showMidsizedMessage', '~g~Вы выиграли', 'Вы успешно ушли от полиции.') } else { alt.emitClient(_player, 'player:showMidsizedMessage', '~r~Вы проиграли', 'Саспект скрылся.') @@ -317,7 +320,7 @@ const copchase = new Copchase({ maxPlayers: 11, minPlayers: 2, timeRemaining: 10, - timeToStart: 4 + timeToStart: 5 }) export { diff --git a/server/modules/events/playerConnect.mjs b/server/modules/events/playerConnect.mjs index 3983f1f..8976a54 100644 --- a/server/modules/events/playerConnect.mjs +++ b/server/modules/events/playerConnect.mjs @@ -14,6 +14,18 @@ alt.on('playerConnect', (player) => { player.spawn(config.spawn.x, config.spawn.y,config.spawn.z) player.dimension = 0 + alt.emitClient(player, 'webview:load') alt.emitClient(player, 'player:setInvincible') alt.emitClient(player, 'player:notify', '~g~Добро пожаловать на сервер!') }) + +// sync +alt.setInterval(() => { + alt.Player.all.forEach(_player => { + if (!_player.valid) { + return + } + + _player.setSyncedMeta('pos', _player.pos) + }) +}, 100) \ No newline at end of file diff --git a/server/modules/events/playerDeath.mjs b/server/modules/events/playerDeath.mjs index cab8711..3a9b45f 100644 --- a/server/modules/events/playerDeath.mjs +++ b/server/modules/events/playerDeath.mjs @@ -11,9 +11,9 @@ alt.on('playerDeath', (player) => { }) if (copchase.isStarted) { - if (player.name === copchase.suspect.name) copchase.stopGame({ winner: 'police' }) + if (player.id === copchase.suspect.id) copchase.stopGame({ winner: 'police' }) - const policemanIndex = copchase.players.findIndex(_player => _player.name === player.name && _player.name !== copchase.suspect.name) + const policemanIndex = copchase.players.findIndex(_player => _player.id === player.id && _player.id !== copchase.suspect.id) if (policemanIndex !== -1) copchase.players.splice(policemanIndex, 1) if (copchase.players.length <= 1 && copchase.suspect !== null) copchase.stopGame({ winner: 'suspect' }) } @@ -23,5 +23,6 @@ alt.on('playerDeath', (player) => { player.dimension = 0 player.removeAllWeapons() alt.emitClient(player, 'player:setInvincible') + alt.emitClient(player, 'player:deleteBlipPlayers') }, 5000) }) \ No newline at end of file diff --git a/server/modules/events/playerDisconnect.mjs b/server/modules/events/playerDisconnect.mjs index edbfcf9..710715a 100644 --- a/server/modules/events/playerDisconnect.mjs +++ b/server/modules/events/playerDisconnect.mjs @@ -6,18 +6,18 @@ alt.on('playerDisconnect', (player) => { broadcast(`{EE9A00}[SERVER]: {1CD8FD}😭 ${player.name} {FFF}покинул нас`) if (copchase.isPlayerInWaitingRoom(player)) { - const disconnectedPlayerIndex = copchase.waitingPlayers.findIndex(_player => _player.name === player.name) + const disconnectedPlayerIndex = copchase.waitingPlayers.findIndex(_player => _player.id === player.id) copchase.waitingPlayers.splice(disconnectedPlayerIndex, 1) } if (copchase.isStarted) { - if (player.name === copchase.suspect.name) { - const suspectIndex = copchase.players.findIndex(_player => _player.name === copchase.suspect.name) + if (player.id === copchase.suspect.id) { + const suspectIndex = copchase.players.findIndex(_player => _player.id === copchase.suspect.id) copchase.players.splice(suspectIndex, 1) copchase.stopGame({ winner: 'police' }) } - const policemanIndex = copchase.players.findIndex(_player => _player.name === player.name && _player.name !== copchase.suspect.name) + const policemanIndex = copchase.players.findIndex(_player => _player.id === player.id && _player.id !== copchase.suspect.id) if (policemanIndex !== -1) copchase.players.splice(policemanIndex, 1) if (copchase.players.length <= 1 && copchase.suspect !== null) copchase.stopGame({ winner: 'suspect' }) diff --git a/server/modules/events/playerLeftVehicle.mjs b/server/modules/events/playerLeftVehicle.mjs index ab47dc8..2b4da4a 100644 --- a/server/modules/events/playerLeftVehicle.mjs +++ b/server/modules/events/playerLeftVehicle.mjs @@ -2,11 +2,11 @@ import alt from 'alt-server' import { copchase } from '../copchase.mjs' alt.on('playerLeftVehicle', player => { - if (copchase.isStarted && player.name === copchase.suspect.name) { + if (copchase.isStarted && player.id === copchase.suspect.id) { player.giveWeapon('0x1B06D571', 25, true); copchase.players.forEach(_player => { - if (_player.name !== copchase.suspect.name) { + if (_player.id !== copchase.suspect.id) { _player.giveWeapon('0x1B06D571', 50, true); } })