Update 19.11.2022
2
FiveM
13
HTML/gcphone/.babelrc
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"presets": [
|
||||||
|
["env", { "modules": false }],
|
||||||
|
"stage-2"
|
||||||
|
],
|
||||||
|
"plugins": ["transform-runtime"],
|
||||||
|
"env": {
|
||||||
|
"test": {
|
||||||
|
"presets": ["env", "stage-2"],
|
||||||
|
"plugins": [ "istanbul" ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
HTML/gcphone/.editorconfig
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
2
HTML/gcphone/.eslintignore
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
build/*.js
|
||||||
|
config/*.js
|
||||||
27
HTML/gcphone/.eslintrc.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
// http://eslint.org/docs/user-guide/configuring
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
parser: 'babel-eslint',
|
||||||
|
parserOptions: {
|
||||||
|
sourceType: 'module'
|
||||||
|
},
|
||||||
|
env: {
|
||||||
|
browser: true,
|
||||||
|
},
|
||||||
|
// https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style
|
||||||
|
extends: 'standard',
|
||||||
|
// required to lint *.vue files
|
||||||
|
plugins: [
|
||||||
|
'html'
|
||||||
|
],
|
||||||
|
// add your custom rules here
|
||||||
|
'rules': {
|
||||||
|
// allow paren-less arrow functions
|
||||||
|
'arrow-parens': 0,
|
||||||
|
// allow async-await
|
||||||
|
'generator-star-spacing': 0,
|
||||||
|
// allow debugger during development
|
||||||
|
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0
|
||||||
|
}
|
||||||
|
}
|
||||||
1
HTML/gcphone/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/node_modules
|
||||||
5
HTML/gcphone/.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
27
HTML/gcphone/.idea/codeStyles/Project.xml
generated
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
|
<code_scheme name="Project" version="173">
|
||||||
|
<JSCodeStyleSettings version="0">
|
||||||
|
<option name="USE_SEMICOLON_AFTER_STATEMENT" value="false" />
|
||||||
|
<option name="FORCE_SEMICOLON_STYLE" value="true" />
|
||||||
|
<option name="SPACE_BEFORE_GENERATOR_MULT" value="true" />
|
||||||
|
<option name="USE_DOUBLE_QUOTES" value="false" />
|
||||||
|
<option name="FORCE_QUOTE_STYlE" value="true" />
|
||||||
|
<option name="ENFORCE_TRAILING_COMMA" value="Remove" />
|
||||||
|
</JSCodeStyleSettings>
|
||||||
|
<codeStyleSettings language="JavaScript">
|
||||||
|
<option name="BLOCK_COMMENT_ADD_SPACE" value="true" />
|
||||||
|
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
|
||||||
|
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
|
||||||
|
<option name="ALIGN_MULTILINE_FOR" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_METHOD_PARENTHESES" value="true" />
|
||||||
|
<option name="IF_BRACE_FORCE" value="1" />
|
||||||
|
<option name="DOWHILE_BRACE_FORCE" value="1" />
|
||||||
|
<option name="WHILE_BRACE_FORCE" value="1" />
|
||||||
|
<option name="FOR_BRACE_FORCE" value="1" />
|
||||||
|
<indentOptions>
|
||||||
|
<option name="INDENT_SIZE" value="2" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="2" />
|
||||||
|
</indentOptions>
|
||||||
|
</codeStyleSettings>
|
||||||
|
</code_scheme>
|
||||||
|
</component>
|
||||||
5
HTML/gcphone/.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
|
<state>
|
||||||
|
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
||||||
|
</state>
|
||||||
|
</component>
|
||||||
6
HTML/gcphone/.idea/dictionaries
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectDictionaryState">
|
||||||
|
<dictionary name="leon" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
7
HTML/gcphone/.idea/discord.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="DiscordProjectSettings">
|
||||||
|
<option name="show" value="PROJECT_FILES" />
|
||||||
|
<option name="description" value="" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
12
HTML/gcphone/.idea/gcphone.iml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="WEB_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
6
HTML/gcphone/.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||||
|
</profile>
|
||||||
|
</component>
|
||||||
8
HTML/gcphone/.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/gcphone.iml" filepath="$PROJECT_DIR$/.idea/gcphone.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
HTML/gcphone/.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
8
HTML/gcphone/.postcssrc.js
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
// https://github.com/michael-ciniawsky/postcss-load-config
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
"plugins": {
|
||||||
|
// to edit target browsers: use "browserlist" field in package.json
|
||||||
|
"autoprefixer": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
78
HTML/gcphone/README.md
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# src_htmlphone
|
||||||
|
|
||||||
|
> A Vue.js project
|
||||||
|
>
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## Build Setup
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
# install dependencies
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# serve with hot reload at localhost:8080
|
||||||
|
npm run dev
|
||||||
|
|
||||||
|
# build for production with minification
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# build for production and view the bundle analyzer report
|
||||||
|
npm run build --report
|
||||||
|
```
|
||||||
|
|
||||||
|
For detailed explanation on how things work, checkout the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
|
||||||
|
|
||||||
|
**Functions**
|
||||||
|
``` bash
|
||||||
|
Contact list
|
||||||
|
Send SMS
|
||||||
|
Calls
|
||||||
|
Anonymous calls
|
||||||
|
Bank application with bank transfers
|
||||||
|
Reddit app
|
||||||
|
Bag Application
|
||||||
|
Notes application
|
||||||
|
Selection of ringtones
|
||||||
|
Fixed bug numeric keyboard script
|
||||||
|
Added different cases for iphone 11
|
||||||
|
Added new background images
|
||||||
|
Renewed the complete aesthetics of the gcphone as well as its dimensions
|
||||||
|
```
|
||||||
|
**Instructions for use**
|
||||||
|
``` bash
|
||||||
|
To put the gcphone to work on your server you must follow these steps
|
||||||
|
|
||||||
|
1º Copy all the files from the resources folder and add them to the folder called gcphone on your server
|
||||||
|
|
||||||
|
2º For the bank application to work, you need the script on your NewBanking server, since it uses this script
|
||||||
|
|
||||||
|
3º In order to make use of sending messages to public services, you must have the following script on your server and configure it for operation
|
||||||
|
|
||||||
|
4º If once the gcphone is inserted, it does not load the images, try to delete the cache of the server and your FiveM and it will be ready for operation
|
||||||
|
```
|
||||||
|
**Requirements**
|
||||||
|
``` bash
|
||||||
|
Official website esx_addons_gcphone -> https://github.com/N3MTV/gcphone/tree/master/resources/esx_addons_gcphone
|
||||||
|
Official website new_banking -> https://github.com/NewWayRP/new_banking
|
||||||
|
Credits
|
||||||
|
|
||||||
|
ElBichop (Owner gcphone v3) https://www.linkedin.com/in/manuel-jim%C3%A9nez-l%C3%B3pez-205420158/
|
||||||
|
|
||||||
|
Paty Blue (Designer) @psasfer
|
||||||
|
|
||||||
|
Original GCPhone by Gannon https://github.com/N3MTV/gcphone
|
||||||
|
|
||||||
|
License
|
||||||
|
GNU v3
|
||||||
|
|
||||||
|
Manuel (ElBichop)
|
||||||
|
```
|
||||||
BIN
HTML/gcphone/build.rar
Normal file
35
HTML/gcphone/build/build.js
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
require('./check-versions')()
|
||||||
|
|
||||||
|
process.env.NODE_ENV = 'production'
|
||||||
|
|
||||||
|
var ora = require('ora')
|
||||||
|
var rm = require('rimraf')
|
||||||
|
var path = require('path')
|
||||||
|
var chalk = require('chalk')
|
||||||
|
var webpack = require('webpack')
|
||||||
|
var config = require('../config')
|
||||||
|
var webpackConfig = require('./webpack.prod.conf')
|
||||||
|
|
||||||
|
var spinner = ora('building for production...')
|
||||||
|
spinner.start()
|
||||||
|
|
||||||
|
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
|
||||||
|
if (err) throw err
|
||||||
|
webpack(webpackConfig, function (err, stats) {
|
||||||
|
spinner.stop()
|
||||||
|
if (err) throw err
|
||||||
|
process.stdout.write(stats.toString({
|
||||||
|
colors: true,
|
||||||
|
modules: false,
|
||||||
|
children: false,
|
||||||
|
chunks: false,
|
||||||
|
chunkModules: false
|
||||||
|
}) + '\n\n')
|
||||||
|
|
||||||
|
console.log(chalk.cyan(' Build complete.\n'))
|
||||||
|
console.log(chalk.yellow(
|
||||||
|
' Tip: built files are meant to be served over an HTTP server.\n' +
|
||||||
|
' Opening index.html over file:// won\'t work.\n'
|
||||||
|
))
|
||||||
|
})
|
||||||
|
})
|
||||||
48
HTML/gcphone/build/check-versions.js
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
var chalk = require('chalk')
|
||||||
|
var semver = require('semver')
|
||||||
|
var packageConfig = require('../package.json')
|
||||||
|
var shell = require('shelljs')
|
||||||
|
function exec (cmd) {
|
||||||
|
return require('child_process').execSync(cmd).toString().trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
var versionRequirements = [
|
||||||
|
{
|
||||||
|
name: 'node',
|
||||||
|
currentVersion: semver.clean(process.version),
|
||||||
|
versionRequirement: packageConfig.engines.node
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
if (shell.which('npm')) {
|
||||||
|
versionRequirements.push({
|
||||||
|
name: 'npm',
|
||||||
|
currentVersion: exec('npm --version'),
|
||||||
|
versionRequirement: packageConfig.engines.npm
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = function () {
|
||||||
|
var warnings = []
|
||||||
|
for (var i = 0; i < versionRequirements.length; i++) {
|
||||||
|
var mod = versionRequirements[i]
|
||||||
|
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
|
||||||
|
warnings.push(mod.name + ': ' +
|
||||||
|
chalk.red(mod.currentVersion) + ' should be ' +
|
||||||
|
chalk.green(mod.versionRequirement)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (warnings.length) {
|
||||||
|
console.log('')
|
||||||
|
console.log(chalk.yellow('To use this template, you must update following to modules:'))
|
||||||
|
console.log()
|
||||||
|
for (var i = 0; i < warnings.length; i++) {
|
||||||
|
var warning = warnings[i]
|
||||||
|
console.log(' ' + warning)
|
||||||
|
}
|
||||||
|
console.log()
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
9
HTML/gcphone/build/dev-client.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* eslint-disable */
|
||||||
|
require('eventsource-polyfill')
|
||||||
|
var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
|
||||||
|
|
||||||
|
hotClient.subscribe(function (event) {
|
||||||
|
if (event.action === 'reload') {
|
||||||
|
window.location.reload()
|
||||||
|
}
|
||||||
|
})
|
||||||
90
HTML/gcphone/build/dev-server.js
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
require('./check-versions')()
|
||||||
|
|
||||||
|
var config = require('../config')
|
||||||
|
if (!process.env.NODE_ENV) {
|
||||||
|
process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
|
||||||
|
}
|
||||||
|
|
||||||
|
var opn = require('opn')
|
||||||
|
var path = require('path')
|
||||||
|
var express = require('express')
|
||||||
|
var webpack = require('webpack')
|
||||||
|
var proxyMiddleware = require('http-proxy-middleware')
|
||||||
|
var webpackConfig = require('./webpack.dev.conf')
|
||||||
|
|
||||||
|
// default port where dev server listens for incoming traffic
|
||||||
|
var port = process.env.PORT || config.dev.port
|
||||||
|
// automatically open browser, if not set will be false
|
||||||
|
var autoOpenBrowser = !!config.dev.autoOpenBrowser
|
||||||
|
// Define HTTP proxies to your custom API backend
|
||||||
|
// https://github.com/chimurai/http-proxy-middleware
|
||||||
|
var proxyTable = config.dev.proxyTable
|
||||||
|
|
||||||
|
var app = express()
|
||||||
|
var compiler = webpack(webpackConfig)
|
||||||
|
|
||||||
|
var devMiddleware = require('webpack-dev-middleware')(compiler, {
|
||||||
|
publicPath: webpackConfig.output.publicPath,
|
||||||
|
quiet: true
|
||||||
|
})
|
||||||
|
|
||||||
|
var hotMiddleware = require('webpack-hot-middleware')(compiler, {
|
||||||
|
log: () => {}
|
||||||
|
})
|
||||||
|
// force page reload when html-webpack-plugin template changes
|
||||||
|
compiler.plugin('compilation', function (compilation) {
|
||||||
|
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
|
||||||
|
hotMiddleware.publish({ action: 'reload' })
|
||||||
|
cb()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// proxy api requests
|
||||||
|
Object.keys(proxyTable).forEach(function (context) {
|
||||||
|
var options = proxyTable[context]
|
||||||
|
if (typeof options === 'string') {
|
||||||
|
options = { target: options }
|
||||||
|
}
|
||||||
|
app.use(proxyMiddleware(options.filter || context, options))
|
||||||
|
})
|
||||||
|
|
||||||
|
// handle fallback for HTML5 history API
|
||||||
|
app.use(require('connect-history-api-fallback')())
|
||||||
|
|
||||||
|
// serve webpack bundle output
|
||||||
|
app.use(devMiddleware)
|
||||||
|
|
||||||
|
// enable hot-reload and state-preserving
|
||||||
|
// compilation error display
|
||||||
|
app.use(hotMiddleware)
|
||||||
|
|
||||||
|
// serve pure static assets
|
||||||
|
var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
|
||||||
|
|
||||||
|
app.use(staticPath, express.static('./static'))
|
||||||
|
app.use('/html/static/', express.static('./html/static'))
|
||||||
|
var uri = 'http://localhost:' + port
|
||||||
|
|
||||||
|
var _resolve
|
||||||
|
var readyPromise = new Promise(resolve => {
|
||||||
|
_resolve = resolve
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log('> Starting dev server...')
|
||||||
|
devMiddleware.waitUntilValid(() => {
|
||||||
|
console.log('> Listening at ' + uri + '\n')
|
||||||
|
// when env is testing, don't need open it
|
||||||
|
if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
|
||||||
|
opn(uri)
|
||||||
|
}
|
||||||
|
_resolve()
|
||||||
|
})
|
||||||
|
|
||||||
|
var server = app.listen(port)
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
ready: readyPromise,
|
||||||
|
close: () => {
|
||||||
|
server.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
71
HTML/gcphone/build/utils.js
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
var path = require('path')
|
||||||
|
var config = require('../config')
|
||||||
|
var ExtractTextPlugin = require('extract-text-webpack-plugin')
|
||||||
|
|
||||||
|
exports.assetsPath = function (_path) {
|
||||||
|
var assetsSubDirectory = process.env.NODE_ENV === 'production'
|
||||||
|
? config.build.assetsSubDirectory
|
||||||
|
: config.dev.assetsSubDirectory
|
||||||
|
return path.posix.join(assetsSubDirectory, _path)
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.cssLoaders = function (options) {
|
||||||
|
options = options || {}
|
||||||
|
|
||||||
|
var cssLoader = {
|
||||||
|
loader: 'css-loader',
|
||||||
|
options: {
|
||||||
|
minimize: process.env.NODE_ENV === 'production',
|
||||||
|
sourceMap: options.sourceMap
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate loader string to be used with extract text plugin
|
||||||
|
function generateLoaders (loader, loaderOptions) {
|
||||||
|
var loaders = [cssLoader]
|
||||||
|
if (loader) {
|
||||||
|
loaders.push({
|
||||||
|
loader: loader + '-loader',
|
||||||
|
options: Object.assign({}, loaderOptions, {
|
||||||
|
sourceMap: options.sourceMap
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract CSS when that option is specified
|
||||||
|
// (which is the case during production build)
|
||||||
|
if (options.extract) {
|
||||||
|
return ExtractTextPlugin.extract({
|
||||||
|
use: loaders,
|
||||||
|
fallback: 'vue-style-loader'
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
return ['vue-style-loader'].concat(loaders)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
|
||||||
|
return {
|
||||||
|
css: generateLoaders(),
|
||||||
|
postcss: generateLoaders(),
|
||||||
|
less: generateLoaders('less'),
|
||||||
|
sass: generateLoaders('sass', { indentedSyntax: true }),
|
||||||
|
scss: generateLoaders('sass'),
|
||||||
|
stylus: generateLoaders('stylus'),
|
||||||
|
styl: generateLoaders('stylus')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate loaders for standalone style files (outside of .vue)
|
||||||
|
exports.styleLoaders = function (options) {
|
||||||
|
var output = []
|
||||||
|
var loaders = exports.cssLoaders(options)
|
||||||
|
for (var extension in loaders) {
|
||||||
|
var loader = loaders[extension]
|
||||||
|
output.push({
|
||||||
|
test: new RegExp('\\.' + extension + '$'),
|
||||||
|
use: loader
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return output
|
||||||
|
}
|
||||||
12
HTML/gcphone/build/vue-loader.conf.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
var utils = require('./utils')
|
||||||
|
var config = require('../config')
|
||||||
|
var isProduction = process.env.NODE_ENV === 'production'
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
loaders: utils.cssLoaders({
|
||||||
|
sourceMap: isProduction
|
||||||
|
? config.build.productionSourceMap
|
||||||
|
: config.dev.cssSourceMap,
|
||||||
|
extract: isProduction
|
||||||
|
})
|
||||||
|
}
|
||||||
67
HTML/gcphone/build/webpack.base.conf.js
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
var path = require('path')
|
||||||
|
var utils = require('./utils')
|
||||||
|
var config = require('../config')
|
||||||
|
var vueLoaderConfig = require('./vue-loader.conf')
|
||||||
|
|
||||||
|
function resolve (dir) {
|
||||||
|
return path.join(__dirname, '..', dir)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
entry: {
|
||||||
|
app: './src/main.js'
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
path: config.build.assetsRoot,
|
||||||
|
filename: '[name].js',
|
||||||
|
publicPath: process.env.NODE_ENV === 'production'
|
||||||
|
? config.build.assetsPublicPath
|
||||||
|
: config.dev.assetsPublicPath
|
||||||
|
},
|
||||||
|
resolve: {
|
||||||
|
extensions: ['.js', '.vue', '.json'],
|
||||||
|
alias: {
|
||||||
|
'vue$': 'vue/dist/vue.esm.js',
|
||||||
|
'@': resolve('src')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
test: /\.(js|vue)$/,
|
||||||
|
loader: 'eslint-loader',
|
||||||
|
enforce: 'pre',
|
||||||
|
include: [resolve('src'), resolve('test')],
|
||||||
|
options: {
|
||||||
|
formatter: require('eslint-friendly-formatter')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.vue$/,
|
||||||
|
loader: 'vue-loader',
|
||||||
|
options: vueLoaderConfig
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.js$/,
|
||||||
|
loader: 'babel-loader',
|
||||||
|
include: [resolve('src'), resolve('test')]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
|
||||||
|
loader: 'url-loader',
|
||||||
|
options: {
|
||||||
|
limit: 10000,
|
||||||
|
name: utils.assetsPath('img/[name].[ext]')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
|
||||||
|
loader: 'url-loader',
|
||||||
|
options: {
|
||||||
|
limit: 10000,
|
||||||
|
name: utils.assetsPath('fonts/[name].[ext]')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
35
HTML/gcphone/build/webpack.dev.conf.js
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
var utils = require('./utils')
|
||||||
|
var webpack = require('webpack')
|
||||||
|
var config = require('../config')
|
||||||
|
var merge = require('webpack-merge')
|
||||||
|
var baseWebpackConfig = require('./webpack.base.conf')
|
||||||
|
var HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||||
|
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
|
||||||
|
|
||||||
|
// add hot-reload related code to entry chunks
|
||||||
|
Object.keys(baseWebpackConfig.entry).forEach(function (name) {
|
||||||
|
baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
|
||||||
|
})
|
||||||
|
|
||||||
|
module.exports = merge(baseWebpackConfig, {
|
||||||
|
module: {
|
||||||
|
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
|
||||||
|
},
|
||||||
|
// cheap-module-eval-source-map is faster for development
|
||||||
|
devtool: '#cheap-module-eval-source-map',
|
||||||
|
plugins: [
|
||||||
|
new webpack.DefinePlugin({
|
||||||
|
'process.env': config.dev.env
|
||||||
|
}),
|
||||||
|
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage
|
||||||
|
new webpack.HotModuleReplacementPlugin(),
|
||||||
|
new webpack.NoEmitOnErrorsPlugin(),
|
||||||
|
// https://github.com/ampedandwired/html-webpack-plugin
|
||||||
|
new HtmlWebpackPlugin({
|
||||||
|
filename: 'index.html',
|
||||||
|
template: 'index.html',
|
||||||
|
inject: true
|
||||||
|
}),
|
||||||
|
new FriendlyErrorsPlugin()
|
||||||
|
]
|
||||||
|
})
|
||||||
120
HTML/gcphone/build/webpack.prod.conf.js
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
var path = require('path')
|
||||||
|
var utils = require('./utils')
|
||||||
|
var webpack = require('webpack')
|
||||||
|
var config = require('../config')
|
||||||
|
var merge = require('webpack-merge')
|
||||||
|
var baseWebpackConfig = require('./webpack.base.conf')
|
||||||
|
var CopyWebpackPlugin = require('copy-webpack-plugin')
|
||||||
|
var HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||||
|
var ExtractTextPlugin = require('extract-text-webpack-plugin')
|
||||||
|
var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
|
||||||
|
|
||||||
|
var env = config.build.env
|
||||||
|
|
||||||
|
var webpackConfig = merge(baseWebpackConfig, {
|
||||||
|
module: {
|
||||||
|
rules: utils.styleLoaders({
|
||||||
|
sourceMap: config.build.productionSourceMap,
|
||||||
|
extract: true
|
||||||
|
})
|
||||||
|
},
|
||||||
|
devtool: config.build.productionSourceMap ? '#source-map' : false,
|
||||||
|
output: {
|
||||||
|
path: config.build.assetsRoot,
|
||||||
|
filename: utils.assetsPath('js/[name].js'),
|
||||||
|
chunkFilename: utils.assetsPath('js/[id].js')
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
// http://vuejs.github.io/vue-loader/en/workflow/production.html
|
||||||
|
new webpack.DefinePlugin({
|
||||||
|
'process.env': env
|
||||||
|
}),
|
||||||
|
new webpack.optimize.UglifyJsPlugin({
|
||||||
|
compress: {
|
||||||
|
warnings: false
|
||||||
|
},
|
||||||
|
sourceMap: false
|
||||||
|
}),
|
||||||
|
// extract css into its own file
|
||||||
|
new ExtractTextPlugin({
|
||||||
|
filename: utils.assetsPath('css/[name].css')
|
||||||
|
}),
|
||||||
|
// Compress extracted CSS. We are using this plugin so that possible
|
||||||
|
// duplicated CSS from different components can be deduped.
|
||||||
|
new OptimizeCSSPlugin({
|
||||||
|
cssProcessorOptions: {
|
||||||
|
safe: true
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
// generate dist index.html with correct asset hash for caching.
|
||||||
|
// you can customize output by editing /index.html
|
||||||
|
// see https://github.com/ampedandwired/html-webpack-plugin
|
||||||
|
new HtmlWebpackPlugin({
|
||||||
|
filename: config.build.index,
|
||||||
|
template: 'index.html',
|
||||||
|
inject: true,
|
||||||
|
minify: {
|
||||||
|
removeComments: true,
|
||||||
|
collapseWhitespace: true,
|
||||||
|
removeAttributeQuotes: true
|
||||||
|
// more options:
|
||||||
|
// https://github.com/kangax/html-minifier#options-quick-reference
|
||||||
|
},
|
||||||
|
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
|
||||||
|
chunksSortMode: 'dependency'
|
||||||
|
}),
|
||||||
|
// split vendor js into its own file
|
||||||
|
new webpack.optimize.CommonsChunkPlugin({
|
||||||
|
name: 'vendor',
|
||||||
|
minChunks: function (module, count) {
|
||||||
|
// any required modules inside node_modules are extracted to vendor
|
||||||
|
return (
|
||||||
|
module.resource &&
|
||||||
|
/\.js$/.test(module.resource) &&
|
||||||
|
module.resource.indexOf(
|
||||||
|
path.join(__dirname, '../node_modules')
|
||||||
|
) === 0
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
// extract webpack runtime and module manifest to its own file in order to
|
||||||
|
// prevent vendor hash from being updated whenever app bundle is updated
|
||||||
|
new webpack.optimize.CommonsChunkPlugin({
|
||||||
|
name: 'manifest',
|
||||||
|
chunks: ['vendor']
|
||||||
|
}),
|
||||||
|
// copy custom static assets
|
||||||
|
new CopyWebpackPlugin([
|
||||||
|
{
|
||||||
|
from: path.resolve(__dirname, '../static'),
|
||||||
|
to: config.build.assetsSubDirectory,
|
||||||
|
ignore: ['.*']
|
||||||
|
}
|
||||||
|
])
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
if (config.build.productionGzip) {
|
||||||
|
var CompressionWebpackPlugin = require('compression-webpack-plugin')
|
||||||
|
|
||||||
|
webpackConfig.plugins.push(
|
||||||
|
new CompressionWebpackPlugin({
|
||||||
|
asset: '[path].gz[query]',
|
||||||
|
algorithm: 'gzip',
|
||||||
|
test: new RegExp(
|
||||||
|
'\\.(' +
|
||||||
|
config.build.productionGzipExtensions.join('|') +
|
||||||
|
')$'
|
||||||
|
),
|
||||||
|
threshold: 10240,
|
||||||
|
minRatio: 0.8
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.build.bundleAnalyzerReport) {
|
||||||
|
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
|
||||||
|
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = webpackConfig
|
||||||
6
HTML/gcphone/config/dev.env.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
var merge = require('webpack-merge')
|
||||||
|
var prodEnv = require('./prod.env')
|
||||||
|
|
||||||
|
module.exports = merge(prodEnv, {
|
||||||
|
NODE_ENV: '"development"'
|
||||||
|
})
|
||||||
38
HTML/gcphone/config/index.js
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
// see http://vuejs-templates.github.io/webpack for documentation.
|
||||||
|
var path = require('path')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
build: {
|
||||||
|
env: require('./prod.env'),
|
||||||
|
index: path.resolve(__dirname, '../resources/gcphone/html/index.html'),
|
||||||
|
assetsRoot: path.resolve(__dirname, '../resources/gcphone/html'),
|
||||||
|
assetsSubDirectory: 'static',
|
||||||
|
assetsPublicPath: '/html/',
|
||||||
|
productionSourceMap: false,
|
||||||
|
// Gzip off by default as many popular static hosts such as
|
||||||
|
// Surge or Netlify already gzip all static assets for you.
|
||||||
|
// Before setting to `true`, make sure to:
|
||||||
|
// npm install --save-dev compression-webpack-plugin
|
||||||
|
productionGzip: false,
|
||||||
|
productionGzipExtensions: ['js', 'css'],
|
||||||
|
// Run the build command with an extra argument to
|
||||||
|
// View the bundle analyzer report after build finishes:
|
||||||
|
// `npm run build --report`
|
||||||
|
// Set to `true` or `false` to always turn it on or off
|
||||||
|
bundleAnalyzerReport: process.env.npm_config_report
|
||||||
|
},
|
||||||
|
dev: {
|
||||||
|
env: require('./dev.env'),
|
||||||
|
port: 8080,
|
||||||
|
autoOpenBrowser: true,
|
||||||
|
assetsSubDirectory: 'html/static',
|
||||||
|
assetsPublicPath: '/',
|
||||||
|
proxyTable: {},
|
||||||
|
// CSS Sourcemaps off by default because relative paths are "buggy"
|
||||||
|
// with this option, according to the CSS-Loader README
|
||||||
|
// (https://github.com/webpack/css-loader#sourcemaps)
|
||||||
|
// In our experience, they generally work as expected,
|
||||||
|
// just be aware of this issue when enabling this option.
|
||||||
|
cssSourceMap: false
|
||||||
|
}
|
||||||
|
}
|
||||||
3
HTML/gcphone/config/prod.env.js
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
module.exports = {
|
||||||
|
NODE_ENV: '"production"'
|
||||||
|
}
|
||||||
15
HTML/gcphone/index.html
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<!--
|
||||||
|
<video id="video" style="position: absolute;top:0;left: 0;background-color: blue;" width="600", height="800"></video>
|
||||||
|
-->
|
||||||
|
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
|
||||||
|
<script src="nui://game/ui/jquery.js" type="text/javascript"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
23222
HTML/gcphone/package-lock.json
generated
Normal file
74
HTML/gcphone/package.json
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
{
|
||||||
|
"name": "src_htmlphone",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "A Vue.js project",
|
||||||
|
"author": "Jonathan <gannon.hlw@gmail.com>",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"dev": "node build/dev-server.js",
|
||||||
|
"start": "node build/dev-server.js",
|
||||||
|
"build": "node build/build.js",
|
||||||
|
"lint": "eslint --ext .js,.vue src"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"babel-preset-es2017": "^6.24.1",
|
||||||
|
"node-sass": "^8.0.0",
|
||||||
|
"sass-loader": "^6.0.7",
|
||||||
|
"vue": "^2.5.16",
|
||||||
|
"vue-router": "^2.8.1",
|
||||||
|
"vue-timeago": "^3.4.4",
|
||||||
|
"vuex": "^3.0.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"autoprefixer": "^6.7.2",
|
||||||
|
"babel-core": "^6.26.3",
|
||||||
|
"babel-eslint": "^7.1.1",
|
||||||
|
"babel-loader": "^6.2.10",
|
||||||
|
"babel-plugin-transform-runtime": "^6.22.0",
|
||||||
|
"babel-preset-env": "^1.7.0",
|
||||||
|
"babel-preset-stage-2": "^6.22.0",
|
||||||
|
"babel-register": "^6.22.0",
|
||||||
|
"chalk": "^1.1.3",
|
||||||
|
"connect-history-api-fallback": "^1.5.0",
|
||||||
|
"copy-webpack-plugin": "^4.5.1",
|
||||||
|
"css-loader": "^0.28.11",
|
||||||
|
"eslint": "^3.19.0",
|
||||||
|
"eslint-config-standard": "^6.2.1",
|
||||||
|
"eslint-friendly-formatter": "^2.0.7",
|
||||||
|
"eslint-loader": "^1.7.1",
|
||||||
|
"eslint-plugin-html": "^2.0.0",
|
||||||
|
"eslint-plugin-promise": "^3.8.0",
|
||||||
|
"eslint-plugin-standard": "^2.0.1",
|
||||||
|
"eventsource-polyfill": "^0.9.6",
|
||||||
|
"express": "^4.16.3",
|
||||||
|
"extract-text-webpack-plugin": "^2.0.0",
|
||||||
|
"file-loader": "^0.11.1",
|
||||||
|
"friendly-errors-webpack-plugin": "^1.7.0",
|
||||||
|
"html-webpack-plugin": "^2.28.0",
|
||||||
|
"http-proxy-middleware": "^0.17.3",
|
||||||
|
"opn": "^4.0.2",
|
||||||
|
"optimize-css-assets-webpack-plugin": "^1.3.0",
|
||||||
|
"ora": "^1.4.0",
|
||||||
|
"rimraf": "^2.6.2",
|
||||||
|
"semver": "^5.5.0",
|
||||||
|
"shelljs": "^0.7.6",
|
||||||
|
"url-loader": "^0.5.8",
|
||||||
|
"vue-loader": "^12.1.0",
|
||||||
|
"vue-style-loader": "^3.1.2",
|
||||||
|
"vue-template-compiler": "^2.5.16",
|
||||||
|
"webpack": "^2.6.1",
|
||||||
|
"webpack-bundle-analyzer": "^2.13.1",
|
||||||
|
"webpack-dev-middleware": "^1.12.2",
|
||||||
|
"webpack-hot-middleware": "^2.22.2",
|
||||||
|
"webpack-merge": "^4.1.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 4.0.0",
|
||||||
|
"npm": ">= 3.0.0"
|
||||||
|
},
|
||||||
|
"browserslist": [
|
||||||
|
"> 1%",
|
||||||
|
"last 2 versions",
|
||||||
|
"not ie <= 8"
|
||||||
|
]
|
||||||
|
}
|
||||||
2
HTML/gcphone/resources/esx_addons_gcphone/.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# Auto detect text files and perform LF normalization
|
||||||
|
* text=auto
|
||||||
35
HTML/gcphone/resources/esx_addons_gcphone/client.lua
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
RegisterNetEvent('esx_addons_gcphone:call')
|
||||||
|
AddEventHandler('esx_addons_gcphone:call', function(data)
|
||||||
|
local playerPed = GetPlayerPed(-1)
|
||||||
|
local coords = GetEntityCoords(playerPed)
|
||||||
|
local message = data.message
|
||||||
|
local number = data.number
|
||||||
|
if message == nil then
|
||||||
|
DisplayOnscreenKeyboard(1, "FMMC_MPM_NA", "", "", "", "", "", 200)
|
||||||
|
while (UpdateOnscreenKeyboard() == 0) do
|
||||||
|
DisableAllControlActions(0);
|
||||||
|
Wait(0);
|
||||||
|
end
|
||||||
|
if (GetOnscreenKeyboardResult()) then
|
||||||
|
message = GetOnscreenKeyboardResult()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if message ~= nil and message ~= "" then
|
||||||
|
TriggerServerEvent('esx_addons_gcphone:startCall', number, message, {
|
||||||
|
x = coords.x,
|
||||||
|
y = coords.y,
|
||||||
|
z = coords.z
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent('esx_addons_gcphone:call_taxi')
|
||||||
|
AddEventHandler('esx_addons_gcphone:call_taxi', function(data)
|
||||||
|
local playerPed = GetPlayerPed(-1)
|
||||||
|
local coords = GetEntityCoords(playerPed)
|
||||||
|
TriggerServerEvent('esx_phone:send', '555-5555', "Eine Person benötigt ein Taxi", false, {
|
||||||
|
x = coords.x,
|
||||||
|
y = coords.y,
|
||||||
|
z = coords.z
|
||||||
|
})
|
||||||
|
end)
|
||||||
22
HTML/gcphone/resources/esx_addons_gcphone/fxmanifest.lua
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
fx_version 'adamant'
|
||||||
|
|
||||||
|
game 'gta5'
|
||||||
|
|
||||||
|
client_script 'client.lua'
|
||||||
|
|
||||||
|
server_script {
|
||||||
|
'@mysql-async/lib/MySQL.lua',
|
||||||
|
'server.lua'
|
||||||
|
}
|
||||||
|
|
||||||
|
-- {
|
||||||
|
-- "display": "Police",
|
||||||
|
-- "subMenu": [
|
||||||
|
-- {
|
||||||
|
-- "title": "Envoyer un message",
|
||||||
|
-- "eventName": "esx_addons_gcphone:call",
|
||||||
|
-- "type": {
|
||||||
|
-- "number": "police"
|
||||||
|
-- }}
|
||||||
|
-- ]
|
||||||
|
-- }
|
||||||
162
HTML/gcphone/resources/esx_addons_gcphone/server.lua
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
ESX = nil
|
||||||
|
-- local PhoneNumbers = {}
|
||||||
|
|
||||||
|
local PhoneNumbers = {
|
||||||
|
['912'] = {
|
||||||
|
type = "ambulance",
|
||||||
|
sources = {}
|
||||||
|
},
|
||||||
|
['911'] = {
|
||||||
|
type = "police",
|
||||||
|
sources = {}
|
||||||
|
},
|
||||||
|
['555-5555'] = {
|
||||||
|
type = "taxi",
|
||||||
|
sources = {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TriggerEvent('esx:getSharedObject', function(obj)
|
||||||
|
ESX = obj
|
||||||
|
end)
|
||||||
|
|
||||||
|
function notifyAlertSMS (number, alert, listSrc)
|
||||||
|
if PhoneNumbers[number] ~= nil then
|
||||||
|
local mess = '#' .. alert.numero .. ' : ' .. alert.message
|
||||||
|
if alert.coords ~= nil then
|
||||||
|
mess = mess .. ' ' .. alert.coords.x .. ', ' .. alert.coords.y
|
||||||
|
end
|
||||||
|
for k, _ in pairs(listSrc) do
|
||||||
|
getPhoneNumber(tonumber(k), function (n)
|
||||||
|
if n ~= nil then
|
||||||
|
TriggerEvent('gcPhone:_internalAddMessage', number, n, mess, 0, function (smsMess)
|
||||||
|
TriggerClientEvent("gcPhone:receiveMessage", tonumber(k), smsMess, alert.numero)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
AddEventHandler('esx_phone:registerNumber', function(number, type, sharePos, hasDispatch, hideNumber, hidePosIfAnon)
|
||||||
|
print('= INFO = Enregistrement du telephone ' .. number .. ' => ' .. type)
|
||||||
|
local hideNumber = hideNumber or false
|
||||||
|
local hidePosIfAnon = hidePosIfAnon or false
|
||||||
|
|
||||||
|
PhoneNumbers[number] = {
|
||||||
|
type = type,
|
||||||
|
sources = {},
|
||||||
|
alerts = {}
|
||||||
|
}
|
||||||
|
end)
|
||||||
|
|
||||||
|
function checkJob(current)
|
||||||
|
if current == 'ambulance' then current = '912' end
|
||||||
|
if current == 'police' then current = '911' end
|
||||||
|
if current == 'taxi' then current = '555-5555' end
|
||||||
|
|
||||||
|
return current;
|
||||||
|
end
|
||||||
|
|
||||||
|
AddEventHandler('esx:setJob', function(source, job, lastJob)
|
||||||
|
local current = checkJob(job.name);
|
||||||
|
local last = checkJob(lastJob.name);
|
||||||
|
|
||||||
|
if PhoneNumbers[last] ~= nil then
|
||||||
|
TriggerEvent('esx_addons_gcphone:removeSource', last, source)
|
||||||
|
end
|
||||||
|
|
||||||
|
if PhoneNumbers[current] ~= nil then
|
||||||
|
TriggerEvent('esx_addons_gcphone:addSource', current, source)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
AddEventHandler('esx_addons_gcphone:addSource', function(number, source)
|
||||||
|
PhoneNumbers[number].sources[tostring(source)] = true
|
||||||
|
end)
|
||||||
|
|
||||||
|
AddEventHandler('esx_addons_gcphone:removeSource', function(number, source)
|
||||||
|
PhoneNumbers[number].sources[tostring(source)] = nil
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterServerEvent('gcPhone:sendMessage')
|
||||||
|
AddEventHandler('gcPhone:sendMessage', function(number, message)
|
||||||
|
local sourcePlayer = tonumber(source)
|
||||||
|
if PhoneNumbers[number] ~= nil then
|
||||||
|
getPhoneNumber(source, function (phone)
|
||||||
|
notifyAlertSMS(number, {
|
||||||
|
message = message,
|
||||||
|
numero = phone,
|
||||||
|
}, PhoneNumbers[number].sources)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterServerEvent('esx_addons_gcphone:startCall')
|
||||||
|
AddEventHandler('esx_addons_gcphone:startCall', function (number, message, coords)
|
||||||
|
local source = source
|
||||||
|
if PhoneNumbers[number] ~= nil then
|
||||||
|
getPhoneNumber(source, function (phone)
|
||||||
|
notifyAlertSMS(number, {
|
||||||
|
message = message,
|
||||||
|
coords = coords,
|
||||||
|
numero = phone,
|
||||||
|
}, PhoneNumbers[number].sources)
|
||||||
|
end)
|
||||||
|
else
|
||||||
|
print('= WARNING = Appels sur un service non enregistre => numero : ' .. number)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
AddEventHandler('esx:playerLoaded', function(source)
|
||||||
|
local xPlayer = ESX.GetPlayerFromId(source)
|
||||||
|
|
||||||
|
MySQL.Async.fetchAll('SELECT * FROM users WHERE identifier = @identifier',{
|
||||||
|
['@identifier'] = xPlayer.identifier
|
||||||
|
}, function(result)
|
||||||
|
|
||||||
|
local phoneNumber = result[1].phone_number
|
||||||
|
xPlayer.set('phoneNumber', phoneNumber)
|
||||||
|
|
||||||
|
local job = checkJob(xPlayer.job.name);
|
||||||
|
if PhoneNumbers[job] ~= nil then
|
||||||
|
TriggerEvent('esx_addons_gcphone:addSource', job, source)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
AddEventHandler('esx:playerDropped', function(source)
|
||||||
|
local source = source
|
||||||
|
local xPlayer = ESX.GetPlayerFromId(source)
|
||||||
|
if PhoneNumbers[xPlayer.job.name] ~= nil then
|
||||||
|
TriggerEvent('esx_addons_gcphone:removeSource', xPlayer.job.name, source)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
function getPhoneNumber (source, callback)
|
||||||
|
local xPlayer = ESX.GetPlayerFromId(source)
|
||||||
|
if xPlayer == nil then
|
||||||
|
callback(nil)
|
||||||
|
end
|
||||||
|
MySQL.Async.fetchAll('SELECT * FROM users WHERE identifier = @identifier',{
|
||||||
|
['@identifier'] = xPlayer.identifier
|
||||||
|
}, function(result)
|
||||||
|
callback(result[1].phone_number)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
RegisterServerEvent('esx_phone:send')
|
||||||
|
AddEventHandler('esx_phone:send', function(number, message, _, coords)
|
||||||
|
local source = source
|
||||||
|
if PhoneNumbers[number] ~= nil then
|
||||||
|
getPhoneNumber(source, function (phone)
|
||||||
|
notifyAlertSMS(number, {
|
||||||
|
message = message,
|
||||||
|
coords = coords,
|
||||||
|
numero = phone,
|
||||||
|
}, PhoneNumbers[number].sources)
|
||||||
|
end)
|
||||||
|
else
|
||||||
|
-- print('esx_phone:send | Appels sur un service non enregistre => numero : ' .. number)
|
||||||
|
end
|
||||||
|
end)
|
||||||
66
HTML/gcphone/resources/gcphone/base.sql
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
-- --------------------------------------------------------
|
||||||
|
-- Hôte : 127.0.0.1
|
||||||
|
-- Version du serveur: 10.3.7-MariaDB - mariadb.org binary distribution
|
||||||
|
-- SE du serveur: Win64
|
||||||
|
-- HeidiSQL Version: 9.5.0.5196
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||||
|
/*!40101 SET NAMES utf8 */;
|
||||||
|
/*!50503 SET NAMES utf8mb4 */;
|
||||||
|
/*!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' */;
|
||||||
|
|
||||||
|
USE `es_extended`;
|
||||||
|
|
||||||
|
ALTER TABLE `users` ADD COLUMN `phone_number` VARCHAR(10) NULL;
|
||||||
|
|
||||||
|
|
||||||
|
-- Export de la structure de la table gtarp. phone_app_chat
|
||||||
|
CREATE TABLE IF NOT EXISTS `phone_app_chat` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`channel` varchar(20) NOT NULL,
|
||||||
|
`message` varchar(255) NOT NULL,
|
||||||
|
`time` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- Les données exportées n'étaient pas sélectionnées.
|
||||||
|
-- Export de la structure de la table gtarp. phone_calls
|
||||||
|
CREATE TABLE IF NOT EXISTS `phone_calls` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`owner` varchar(10) NOT NULL COMMENT 'Num tel proprio',
|
||||||
|
`num` varchar(10) NOT NULL COMMENT 'Num reférence du contact',
|
||||||
|
`incoming` int(11) NOT NULL COMMENT 'Défini si on est à l''origine de l''appels',
|
||||||
|
`time` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||||
|
`accepts` int(11) NOT NULL COMMENT 'Appels accepter ou pas',
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=122 DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- Les données exportées n'étaient pas sélectionnées.
|
||||||
|
-- Export de la structure de la table gtarp. phone_messages
|
||||||
|
CREATE TABLE IF NOT EXISTS `phone_messages` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`transmitter` varchar(10) NOT NULL,
|
||||||
|
`receiver` varchar(10) NOT NULL,
|
||||||
|
`message` varchar(255) NOT NULL DEFAULT '0',
|
||||||
|
`time` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||||
|
`isRead` int(11) NOT NULL DEFAULT 0,
|
||||||
|
`owner` int(11) NOT NULL DEFAULT 0,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=MyISAM AUTO_INCREMENT=106 DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- Les données exportées n'étaient pas sélectionnées.
|
||||||
|
-- Export de la structure de la table gtarp. phone_users_contacts
|
||||||
|
CREATE TABLE IF NOT EXISTS `phone_users_contacts` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`identifier` varchar(60) CHARACTER SET utf8mb4 DEFAULT NULL,
|
||||||
|
`number` varchar(10) CHARACTER SET utf8mb4 DEFAULT NULL,
|
||||||
|
`display` varchar(64) CHARACTER SET utf8mb4 NOT NULL DEFAULT '-1',
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
-- Les données exportées n'étaient pas sélectionnées.
|
||||||
|
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
|
||||||
|
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
|
||||||
|
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||||
153
HTML/gcphone/resources/gcphone/client/animation.lua
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
--====================================================================================
|
||||||
|
-- #Author: Jonathan D @ Gannon
|
||||||
|
--====================================================================================
|
||||||
|
|
||||||
|
local myPedId = nil
|
||||||
|
|
||||||
|
local phoneProp = 0
|
||||||
|
local phoneModel = -1038739674
|
||||||
|
-- OR "prop_npc_phone"
|
||||||
|
-- OR "prop_npc_phone_02"
|
||||||
|
-- OR "prop_cs_phone_01"
|
||||||
|
|
||||||
|
local currentStatus = 'out'
|
||||||
|
local lastDict = nil
|
||||||
|
local lastAnim = nil
|
||||||
|
local lastIsFreeze = false
|
||||||
|
|
||||||
|
local ANIMS = {
|
||||||
|
['cellphone@'] = {
|
||||||
|
['out'] = {
|
||||||
|
['text'] = 'cellphone_text_in',
|
||||||
|
['call'] = 'cellphone_call_listen_base',
|
||||||
|
},
|
||||||
|
['text'] = {
|
||||||
|
['out'] = 'cellphone_text_out',
|
||||||
|
['text'] = 'cellphone_text_in',
|
||||||
|
['call'] = 'cellphone_text_to_call',
|
||||||
|
},
|
||||||
|
['call'] = {
|
||||||
|
['out'] = 'cellphone_call_out',
|
||||||
|
['text'] = 'cellphone_call_to_text',
|
||||||
|
['call'] = 'cellphone_text_to_call',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
['anim@cellphone@in_car@ps'] = {
|
||||||
|
['out'] = {
|
||||||
|
['text'] = 'cellphone_text_in',
|
||||||
|
['call'] = 'cellphone_call_in',
|
||||||
|
},
|
||||||
|
['text'] = {
|
||||||
|
['out'] = 'cellphone_text_out',
|
||||||
|
['text'] = 'cellphone_text_in',
|
||||||
|
['call'] = 'cellphone_text_to_call',
|
||||||
|
},
|
||||||
|
['call'] = {
|
||||||
|
['out'] = 'cellphone_horizontal_exit',
|
||||||
|
['text'] = 'cellphone_call_to_text',
|
||||||
|
['call'] = 'cellphone_text_to_call',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function newPhoneProp()
|
||||||
|
deletePhone()
|
||||||
|
RequestModel(phoneModel)
|
||||||
|
while not HasModelLoaded(phoneModel) do
|
||||||
|
Citizen.Wait(1)
|
||||||
|
end
|
||||||
|
phoneProp = CreateObject(phoneModel, 1.0, 1.0, 1.0, 1, 1, 0)
|
||||||
|
local bone = GetPedBoneIndex(myPedId, 28422)
|
||||||
|
AttachEntityToEntity(phoneProp, myPedId, bone, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1, 1, 0, 0, 2, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
function deletePhone ()
|
||||||
|
if phoneProp ~= 0 then
|
||||||
|
Citizen.InvokeNative(0xAE3CBE5BF394C9C9 , Citizen.PointerValueIntInitialized(phoneProp))
|
||||||
|
phoneProp = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
|
out || text || Call ||
|
||||||
|
--]]
|
||||||
|
function PhonePlayAnim (status, freeze, force)
|
||||||
|
if currentStatus == status and force ~= true then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
myPedId = GetPlayerPed(-1)
|
||||||
|
local freeze = freeze or false
|
||||||
|
|
||||||
|
local dict = "cellphone@"
|
||||||
|
if IsPedInAnyVehicle(myPedId, false) then
|
||||||
|
dict = "anim@cellphone@in_car@ps"
|
||||||
|
end
|
||||||
|
loadAnimDict(dict)
|
||||||
|
|
||||||
|
local anim = ANIMS[dict][currentStatus][status]
|
||||||
|
if currentStatus ~= 'out' then
|
||||||
|
StopAnimTask(myPedId, lastDict, lastAnim, 1.0)
|
||||||
|
end
|
||||||
|
local flag = 50
|
||||||
|
if freeze == true then
|
||||||
|
flag = 14
|
||||||
|
end
|
||||||
|
TaskPlayAnim(myPedId, dict, anim, 3.0, -1, -1, flag, 0, false, false, false)
|
||||||
|
|
||||||
|
if status ~= 'out' and currentStatus == 'out' then
|
||||||
|
Citizen.Wait(380)
|
||||||
|
newPhoneProp()
|
||||||
|
end
|
||||||
|
|
||||||
|
lastDict = dict
|
||||||
|
lastAnim = anim
|
||||||
|
lastIsFreeze = freeze
|
||||||
|
currentStatus = status
|
||||||
|
|
||||||
|
if status == 'out' then
|
||||||
|
Citizen.Wait(180)
|
||||||
|
deletePhone()
|
||||||
|
StopAnimTask(myPedId, lastDict, lastAnim, 1.0)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function PhonePlayOut ()
|
||||||
|
PhonePlayAnim('out')
|
||||||
|
end
|
||||||
|
|
||||||
|
function PhonePlayText ()
|
||||||
|
PhonePlayAnim('text')
|
||||||
|
end
|
||||||
|
|
||||||
|
function PhonePlayCall (freeze)
|
||||||
|
PhonePlayAnim('call', freeze)
|
||||||
|
end
|
||||||
|
|
||||||
|
function PhonePlayIn ()
|
||||||
|
if currentStatus == 'out' then
|
||||||
|
PhonePlayText()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function loadAnimDict(dict)
|
||||||
|
RequestAnimDict(dict)
|
||||||
|
while not HasAnimDictLoaded(dict) do
|
||||||
|
Citizen.Wait(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Citizen.CreateThread(function ()
|
||||||
|
-- Citizen.Wait(200)
|
||||||
|
-- PhonePlayCall()
|
||||||
|
-- Citizen.Wait(2000)
|
||||||
|
-- PhonePlayOut()
|
||||||
|
-- Citizen.Wait(2000)
|
||||||
|
|
||||||
|
-- PhonePlayText()
|
||||||
|
-- Citizen.Wait(2000)
|
||||||
|
-- PhonePlayCall()
|
||||||
|
-- Citizen.Wait(2000)
|
||||||
|
-- PhonePlayOut()
|
||||||
|
-- end)
|
||||||
17
HTML/gcphone/resources/gcphone/client/app_tchat.lua
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
RegisterNetEvent("gcPhone:tchat_receive")
|
||||||
|
AddEventHandler("gcPhone:tchat_receive", function(message)
|
||||||
|
SendNUIMessage({event = 'tchat_receive', message = message})
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:tchat_channel")
|
||||||
|
AddEventHandler("gcPhone:tchat_channel", function(channel, messages)
|
||||||
|
SendNUIMessage({event = 'tchat_channel', messages = messages})
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNUICallback('tchat_addMessage', function(data, cb)
|
||||||
|
TriggerServerEvent('gcPhone:tchat_addMessage', data.channel, data.message)
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNUICallback('tchat_getChannel', function(data, cb)
|
||||||
|
TriggerServerEvent('gcPhone:tchat_channel', data.channel)
|
||||||
|
end)
|
||||||
67
HTML/gcphone/resources/gcphone/client/bank.lua
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
--====================================================================================
|
||||||
|
-- # Discord XenKnighT#7085
|
||||||
|
--====================================================================================
|
||||||
|
|
||||||
|
--[[
|
||||||
|
Appeller SendNUIMessage({event = 'updateBankbalance', banking = xxxx})
|
||||||
|
à la connection & à chaque changement du compte
|
||||||
|
--]]
|
||||||
|
|
||||||
|
-- ES / ESX Implementation
|
||||||
|
inMenu = true
|
||||||
|
local bank = 0
|
||||||
|
local firstname = ''
|
||||||
|
function setBankBalance (value)
|
||||||
|
bank = value
|
||||||
|
SendNUIMessage({event = 'updateBankbalance', banking = bank})
|
||||||
|
end
|
||||||
|
|
||||||
|
RegisterNetEvent('esx:playerLoaded')
|
||||||
|
AddEventHandler('esx:playerLoaded', function(playerData)
|
||||||
|
local accounts = playerData.accounts or {}
|
||||||
|
for index, account in ipairs(accounts) do
|
||||||
|
if account.name == 'bank' then
|
||||||
|
setBankBalance(account.money)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent('esx:setAccountMoney')
|
||||||
|
AddEventHandler('esx:setAccountMoney', function(account)
|
||||||
|
if account.name == 'bank' then
|
||||||
|
setBankBalance(account.money)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("es:addedBank")
|
||||||
|
AddEventHandler("es:addedBank", function(m)
|
||||||
|
setBankBalance(bank + m)
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("es:removedBank")
|
||||||
|
AddEventHandler("es:removedBank", function(m)
|
||||||
|
setBankBalance(bank - m)
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent('es:displayBank')
|
||||||
|
AddEventHandler('es:displayBank', function(bank)
|
||||||
|
setBankBalance(bank)
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--===============================================
|
||||||
|
--== Transfer Event ==
|
||||||
|
--===============================================
|
||||||
|
AddEventHandler('gcphone:bankTransfer', function(data)
|
||||||
|
TriggerServerEvent('bank:transfer', data.id, data.amount)
|
||||||
|
TriggerServerEvent('bank:balance')
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
761
HTML/gcphone/resources/gcphone/client/client.lua
Normal file
@@ -0,0 +1,761 @@
|
|||||||
|
--====================================================================================
|
||||||
|
-- #Author: Jonathan D @ Gannon
|
||||||
|
--====================================================================================
|
||||||
|
|
||||||
|
-- Configuration
|
||||||
|
local KeyToucheCloseEvent = {
|
||||||
|
{ code = 172, event = 'ArrowUp' },
|
||||||
|
{ code = 173, event = 'ArrowDown' },
|
||||||
|
{ code = 174, event = 'ArrowLeft' },
|
||||||
|
{ code = 175, event = 'ArrowRight' },
|
||||||
|
{ code = 176, event = 'Enter' },
|
||||||
|
{ code = 177, event = 'Backspace' },
|
||||||
|
}
|
||||||
|
|
||||||
|
local menuIsOpen = false
|
||||||
|
local contacts = {}
|
||||||
|
local messages = {}
|
||||||
|
local myPhoneNumber = ''
|
||||||
|
local isDead = false
|
||||||
|
local USE_RTC = false
|
||||||
|
local useMouse = false
|
||||||
|
local ignoreFocus = false
|
||||||
|
local takePhoto = false
|
||||||
|
local hasFocus = false
|
||||||
|
local TokoVoipID = nil
|
||||||
|
|
||||||
|
local PhoneInCall = {}
|
||||||
|
local currentPlaySound = false
|
||||||
|
local soundDistanceMax = 8.0
|
||||||
|
|
||||||
|
|
||||||
|
--====================================================================================
|
||||||
|
-- Check si le joueurs poséde un téléphone
|
||||||
|
-- Callback true or false
|
||||||
|
--====================================================================================
|
||||||
|
function hasPhone (cb)
|
||||||
|
cb(true)
|
||||||
|
end
|
||||||
|
--====================================================================================
|
||||||
|
-- Que faire si le joueurs veut ouvrir sont téléphone n'est qu'il en a pas ?
|
||||||
|
--====================================================================================
|
||||||
|
function ShowNoPhoneWarning ()
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
|
Ouverture du téphone lié a un item
|
||||||
|
Un solution ESC basé sur la solution donnée par HalCroves
|
||||||
|
https://forum.fivem.net/t/tutorial-for-gcphone-with-call-and-job-message-other/177904
|
||||||
|
]]--
|
||||||
|
|
||||||
|
ESX = nil
|
||||||
|
|
||||||
|
Citizen.CreateThread(function()
|
||||||
|
while ESX == nil do
|
||||||
|
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
|
||||||
|
Citizen.Wait(0)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
--[[
|
||||||
|
function hasPhone (cb)
|
||||||
|
if (ESX == nil) then return cb(0) end
|
||||||
|
ESX.TriggerServerCallback('gcphone:getItemAmount', function(qtty)
|
||||||
|
cb(qtty > 0)
|
||||||
|
end, 'phone')
|
||||||
|
end
|
||||||
|
function ShowNoPhoneWarning ()
|
||||||
|
if (ESX == nil) then return end
|
||||||
|
ESX.ShowNotification("Vous n'avez pas de ~r~téléphone~s~")
|
||||||
|
end --]]
|
||||||
|
|
||||||
|
AddEventHandler('esx:onPlayerDeath', function()
|
||||||
|
if menuIsOpen then
|
||||||
|
menuIsOpen = false
|
||||||
|
TriggerEvent('gcPhone:setMenuStatus', false)
|
||||||
|
SendNUIMessage({show = false})
|
||||||
|
PhonePlayOut()
|
||||||
|
SetBigmapActive(0,0)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
AddEventHandler('esx:playerLoaded', function()
|
||||||
|
TriggerServerEvent('gcPhone:allUpdate')
|
||||||
|
end)
|
||||||
|
|
||||||
|
--====================================================================================
|
||||||
|
--
|
||||||
|
--====================================================================================
|
||||||
|
Citizen.CreateThread(function()
|
||||||
|
while true do
|
||||||
|
Citizen.Wait(0)
|
||||||
|
if not menuIsOpen and isDead then
|
||||||
|
DisableControlAction(0, 288, true)
|
||||||
|
end
|
||||||
|
if takePhoto ~= true then
|
||||||
|
if IsControlJustPressed(1, Config.KeyOpenClose) then
|
||||||
|
hasPhone(function (hasPhone)
|
||||||
|
if hasPhone == true then
|
||||||
|
TooglePhone()
|
||||||
|
else
|
||||||
|
ShowNoPhoneWarning()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
if menuIsOpen == true then
|
||||||
|
for _, value in ipairs(KeyToucheCloseEvent) do
|
||||||
|
if IsControlJustPressed(1, value.code) then
|
||||||
|
SendNUIMessage({keyUp = value.event})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if useMouse == true and hasFocus == ignoreFocus then
|
||||||
|
local nuiFocus = not hasFocus
|
||||||
|
SetNuiFocus(nuiFocus, nuiFocus)
|
||||||
|
hasFocus = nuiFocus
|
||||||
|
elseif useMouse == false and hasFocus == true then
|
||||||
|
SetNuiFocus(false, false)
|
||||||
|
hasFocus = false
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if hasFocus == true then
|
||||||
|
SetNuiFocus(false, false)
|
||||||
|
hasFocus = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--====================================================================================
|
||||||
|
-- Active ou Deactive une application (appName => config.json)
|
||||||
|
--====================================================================================
|
||||||
|
RegisterNetEvent('gcPhone:setEnableApp')
|
||||||
|
AddEventHandler('gcPhone:setEnableApp', function(appName, enable)
|
||||||
|
SendNUIMessage({event = 'setEnableApp', appName = appName, enable = enable })
|
||||||
|
end)
|
||||||
|
|
||||||
|
--====================================================================================
|
||||||
|
-- Gestion des appels fixe
|
||||||
|
--====================================================================================
|
||||||
|
function startFixeCall (fixeNumber)
|
||||||
|
local number = ''
|
||||||
|
DisplayOnscreenKeyboard(1, "FMMC_MPM_NA", "", "", "", "", "", 10)
|
||||||
|
while (UpdateOnscreenKeyboard() == 0) do
|
||||||
|
DisableAllControlActions(0);
|
||||||
|
Wait(0);
|
||||||
|
end
|
||||||
|
if (GetOnscreenKeyboardResult()) then
|
||||||
|
number = GetOnscreenKeyboardResult()
|
||||||
|
end
|
||||||
|
if number ~= '' then
|
||||||
|
TriggerEvent('gcphone:autoCall', number, {
|
||||||
|
useNumber = fixeNumber
|
||||||
|
})
|
||||||
|
PhonePlayCall(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function TakeAppel (infoCall)
|
||||||
|
TriggerEvent('gcphone:autoAcceptCall', infoCall)
|
||||||
|
end
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:notifyFixePhoneChange")
|
||||||
|
AddEventHandler("gcPhone:notifyFixePhoneChange", function(_PhoneInCall)
|
||||||
|
PhoneInCall = _PhoneInCall
|
||||||
|
end)
|
||||||
|
|
||||||
|
--[[
|
||||||
|
Affiche les imformations quant le joueurs est proche d'un fixe
|
||||||
|
--]]
|
||||||
|
function showFixePhoneHelper (coords)
|
||||||
|
for number, data in pairs(Config.FixePhone) do
|
||||||
|
local dist = GetDistanceBetweenCoords(
|
||||||
|
data.coords.x, data.coords.y, data.coords.z,
|
||||||
|
coords.x, coords.y, coords.z, 1)
|
||||||
|
if dist <= 2.5 then
|
||||||
|
SetTextComponentFormat("STRING")
|
||||||
|
AddTextComponentString(_U('use_fixed', data.name, number))
|
||||||
|
DisplayHelpTextFromStringLabel(0, 0, 0, -1)
|
||||||
|
if IsControlJustPressed(1, Config.KeyTakeCall) then
|
||||||
|
startFixeCall(number)
|
||||||
|
end
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
RegisterNetEvent('gcPhone:register_FixePhone')
|
||||||
|
AddEventHandler('gcPhone:register_FixePhone', function(phone_number, data)
|
||||||
|
Config.FixePhone[phone_number] = data
|
||||||
|
end)
|
||||||
|
|
||||||
|
local registeredPhones = {}
|
||||||
|
Citizen.CreateThread(function()
|
||||||
|
if not Config.AutoFindFixePhones then return end
|
||||||
|
while not ESX do Citizen.Wait(0) end
|
||||||
|
while true do
|
||||||
|
local playerPed = GetPlayerPed(-1)
|
||||||
|
local coords = GetEntityCoords(playerPed)
|
||||||
|
for _, key in pairs({'p_phonebox_01b_s', 'p_phonebox_02_s', 'prop_phonebox_01a', 'prop_phonebox_01b', 'prop_phonebox_01c', 'prop_phonebox_02', 'prop_phonebox_03', 'prop_phonebox_04'}) do
|
||||||
|
local closestPhone = GetClosestObjectOfType(coords.x, coords.y, coords.z, 25.0, key, false)
|
||||||
|
if closestPhone ~= 0 and not registeredPhones[closestPhone] then
|
||||||
|
local phoneCoords = GetEntityCoords(closestPhone)
|
||||||
|
number = ('0%.2s-%.2s%.2s'):format(math.abs(phoneCoords.x*100), math.abs(phoneCoords.y * 100), math.abs(phoneCoords.z *100))
|
||||||
|
if not Config.FixePhone[number] then
|
||||||
|
TriggerServerEvent('gcPhone:register_FixePhone', number, phoneCoords)
|
||||||
|
end
|
||||||
|
registeredPhones[closestPhone] = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
Citizen.Wait(1000)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
Citizen.CreateThread(function ()
|
||||||
|
local mod = 0
|
||||||
|
while true do
|
||||||
|
local playerPed = PlayerPedId()
|
||||||
|
local coords = GetEntityCoords(playerPed)
|
||||||
|
local inRangeToActivePhone = false
|
||||||
|
local inRangedist = 0
|
||||||
|
for i, _ in pairs(PhoneInCall) do
|
||||||
|
local dist = GetDistanceBetweenCoords(
|
||||||
|
PhoneInCall[i].coords.x, PhoneInCall[i].coords.y, PhoneInCall[i].coords.z,
|
||||||
|
coords.x, coords.y, coords.z, 1)
|
||||||
|
if (dist <= soundDistanceMax) then
|
||||||
|
DrawMarker(1, PhoneInCall[i].coords.x, PhoneInCall[i].coords.y, PhoneInCall[i].coords.z,
|
||||||
|
0,0,0, 0,0,0, 0.1,0.1,0.1, 0,255,0,255, 0,0,0,0,0,0,0)
|
||||||
|
inRangeToActivePhone = true
|
||||||
|
inRangedist = dist
|
||||||
|
if (dist <= 1.5) then
|
||||||
|
SetTextComponentFormat("STRING")
|
||||||
|
AddTextComponentString(_U('key_answer'))
|
||||||
|
DisplayHelpTextFromStringLabel(0, 0, 1, -1)
|
||||||
|
if IsControlJustPressed(1, Config.KeyTakeCall) then
|
||||||
|
PhonePlayCall(true)
|
||||||
|
TakeAppel(PhoneInCall[i])
|
||||||
|
PhoneInCall = {}
|
||||||
|
StopSoundJS('ring2.ogg')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if inRangeToActivePhone == false then
|
||||||
|
showFixePhoneHelper(coords)
|
||||||
|
end
|
||||||
|
if inRangeToActivePhone == true and currentPlaySound == false then
|
||||||
|
PlaySoundJS('ring2.ogg', 0.2 + (inRangedist - soundDistanceMax) / -soundDistanceMax * 0.8 )
|
||||||
|
currentPlaySound = true
|
||||||
|
elseif inRangeToActivePhone == true then
|
||||||
|
mod = mod + 1
|
||||||
|
if (mod == 15) then
|
||||||
|
mod = 0
|
||||||
|
SetSoundVolumeJS('ring2.ogg', 0.2 + (inRangedist - soundDistanceMax) / -soundDistanceMax * 0.8 )
|
||||||
|
end
|
||||||
|
elseif inRangeToActivePhone == false and currentPlaySound == true then
|
||||||
|
currentPlaySound = false
|
||||||
|
StopSoundJS('ring2.ogg')
|
||||||
|
end
|
||||||
|
Citizen.Wait(0)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
function PlaySoundJS (sound, volume)
|
||||||
|
SendNUIMessage({ event = 'playSound', sound = sound, volume = volume })
|
||||||
|
end
|
||||||
|
|
||||||
|
function SetSoundVolumeJS (sound, volume)
|
||||||
|
SendNUIMessage({ event = 'setSoundVolume', sound = sound, volume = volume})
|
||||||
|
end
|
||||||
|
|
||||||
|
function StopSoundJS (sound)
|
||||||
|
SendNUIMessage({ event = 'stopSound', sound = sound})
|
||||||
|
end
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:forceOpenPhone")
|
||||||
|
AddEventHandler("gcPhone:forceOpenPhone", function(_myPhoneNumber)
|
||||||
|
if menuIsOpen == false then
|
||||||
|
TooglePhone()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
--====================================================================================
|
||||||
|
-- Events
|
||||||
|
--====================================================================================
|
||||||
|
RegisterNetEvent("gcPhone:myPhoneNumber")
|
||||||
|
AddEventHandler("gcPhone:myPhoneNumber", function(_myPhoneNumber)
|
||||||
|
myPhoneNumber = _myPhoneNumber
|
||||||
|
SendNUIMessage({event = 'updateMyPhoneNumber', myPhoneNumber = myPhoneNumber})
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:contactList")
|
||||||
|
AddEventHandler("gcPhone:contactList", function(_contacts)
|
||||||
|
SendNUIMessage({event = 'updateContacts', contacts = _contacts})
|
||||||
|
contacts = _contacts
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:allMessage")
|
||||||
|
AddEventHandler("gcPhone:allMessage", function(allmessages)
|
||||||
|
SendNUIMessage({event = 'updateMessages', messages = allmessages})
|
||||||
|
messages = allmessages
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:getBourse")
|
||||||
|
AddEventHandler("gcPhone:getBourse", function(bourse)
|
||||||
|
SendNUIMessage({event = 'updateBourse', bourse = bourse})
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:receiveMessage")
|
||||||
|
AddEventHandler("gcPhone:receiveMessage", function(message, number)
|
||||||
|
-- SendNUIMessage({event = 'updateMessages', messages = messages})
|
||||||
|
if tostring(number) == tostring(myPhoneNumber) then return end
|
||||||
|
|
||||||
|
SendNUIMessage({event = 'newMessage', message = message})
|
||||||
|
table.insert(messages, message)
|
||||||
|
if message.owner == 0 then
|
||||||
|
local text = _U('new_message')
|
||||||
|
if Config.ShowNumberNotification == true then
|
||||||
|
text = _U('new_message_from', message.transmitter)
|
||||||
|
for _,contact in pairs(contacts) do
|
||||||
|
if contact.number == message.transmitter then
|
||||||
|
text = _U('new_message_transmitter', contact.display)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
SetNotificationTextEntry("STRING")
|
||||||
|
AddTextComponentString(text)
|
||||||
|
DrawNotification(false, false)
|
||||||
|
PlaySound(-1, "Menu_Accept", "Phone_SoundSet_Default", 0, 0, 1)
|
||||||
|
--[[ Citizen.Wait(300)
|
||||||
|
PlaySound(-1, "Menu_Accept", "Phone_SoundSet_Default", 0, 0, 1)
|
||||||
|
Citizen.Wait(300)
|
||||||
|
PlaySound(-1, "Menu_Accept", "Phone_SoundSet_Default", 0, 0, 1) ]]
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
--====================================================================================
|
||||||
|
-- Function client | Contacts
|
||||||
|
--====================================================================================
|
||||||
|
function addContact(display, num)
|
||||||
|
TriggerServerEvent('gcPhone:addContact', display, num)
|
||||||
|
end
|
||||||
|
|
||||||
|
function deleteContact(num)
|
||||||
|
TriggerServerEvent('gcPhone:deleteContact', num)
|
||||||
|
end
|
||||||
|
--====================================================================================
|
||||||
|
-- Function client | Messages
|
||||||
|
--====================================================================================
|
||||||
|
function sendMessage(num, message)
|
||||||
|
TriggerServerEvent('gcPhone:sendMessage', num, message)
|
||||||
|
end
|
||||||
|
|
||||||
|
function deleteMessage(msgId)
|
||||||
|
TriggerServerEvent('gcPhone:deleteMessage', msgId)
|
||||||
|
for k, v in ipairs(messages) do
|
||||||
|
if v.id == msgId then
|
||||||
|
table.remove(messages, k)
|
||||||
|
SendNUIMessage({event = 'updateMessages', messages = messages})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function deleteMessageContact(num)
|
||||||
|
TriggerServerEvent('gcPhone:deleteMessageNumber', num)
|
||||||
|
end
|
||||||
|
|
||||||
|
function deleteAllMessage()
|
||||||
|
TriggerServerEvent('gcPhone:deleteAllMessage')
|
||||||
|
end
|
||||||
|
|
||||||
|
function setReadMessageNumber(num)
|
||||||
|
TriggerServerEvent('gcPhone:setReadMessageNumber', num)
|
||||||
|
for k, v in ipairs(messages) do
|
||||||
|
if v.transmitter == num then
|
||||||
|
v.isRead = 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function requestAllMessages()
|
||||||
|
TriggerServerEvent('gcPhone:requestAllMessages')
|
||||||
|
end
|
||||||
|
|
||||||
|
function requestAllContact()
|
||||||
|
TriggerServerEvent('gcPhone:requestAllContact')
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--====================================================================================
|
||||||
|
-- Function client | Appels
|
||||||
|
--====================================================================================
|
||||||
|
local aminCall = false
|
||||||
|
local inCall = false
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:waitingCall")
|
||||||
|
AddEventHandler("gcPhone:waitingCall", function(infoCall, initiator)
|
||||||
|
SendNUIMessage({event = 'waitingCall', infoCall = infoCall, initiator = initiator})
|
||||||
|
if initiator == true then
|
||||||
|
PhonePlayCall()
|
||||||
|
if menuIsOpen == false then
|
||||||
|
TooglePhone()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:acceptCall")
|
||||||
|
AddEventHandler("gcPhone:acceptCall", function(infoCall, initiator)
|
||||||
|
if inCall == false and USE_RTC == false then
|
||||||
|
inCall = true
|
||||||
|
if Config.UseMumbleVoIP then
|
||||||
|
exports["mumble-voip"]:SetCallChannel(infoCall.id+1)
|
||||||
|
elseif Config.UseTokoVoIP then
|
||||||
|
exports.tokovoip_script:addPlayerToRadio(infoCall.id + 120)
|
||||||
|
TokoVoipID = infoCall.id + 120
|
||||||
|
else
|
||||||
|
NetworkSetVoiceChannel(infoCall.id + 1)
|
||||||
|
NetworkSetTalkerProximity(0.0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if menuIsOpen == false then
|
||||||
|
TooglePhone()
|
||||||
|
end
|
||||||
|
PhonePlayCall()
|
||||||
|
SendNUIMessage({event = 'acceptCall', infoCall = infoCall, initiator = initiator})
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:rejectCall")
|
||||||
|
AddEventHandler("gcPhone:rejectCall", function(infoCall)
|
||||||
|
if inCall == true then
|
||||||
|
inCall = false
|
||||||
|
if Config.UseMumbleVoIP then
|
||||||
|
exports["mumble-voip"]:SetCallChannel(0)
|
||||||
|
elseif Config.UseTokoVoIP then
|
||||||
|
exports.tokovoip_script:removePlayerFromRadio(TokoVoipID)
|
||||||
|
TokoVoipID = nil
|
||||||
|
else
|
||||||
|
Citizen.InvokeNative(0xE036A705F989E049)
|
||||||
|
NetworkSetTalkerProximity(2.5)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
PhonePlayText()
|
||||||
|
SendNUIMessage({event = 'rejectCall', infoCall = infoCall})
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:historiqueCall")
|
||||||
|
AddEventHandler("gcPhone:historiqueCall", function(historique)
|
||||||
|
SendNUIMessage({event = 'historiqueCall', historique = historique})
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
function startCall (phone_number, rtcOffer, extraData)
|
||||||
|
if rtcOffer == nil then
|
||||||
|
rtcOffer = ''
|
||||||
|
end
|
||||||
|
TriggerServerEvent('gcPhone:startCall', phone_number, rtcOffer, extraData)
|
||||||
|
end
|
||||||
|
|
||||||
|
function acceptCall (infoCall, rtcAnswer)
|
||||||
|
TriggerServerEvent('gcPhone:acceptCall', infoCall, rtcAnswer)
|
||||||
|
end
|
||||||
|
|
||||||
|
function rejectCall(infoCall)
|
||||||
|
TriggerServerEvent('gcPhone:rejectCall', infoCall)
|
||||||
|
end
|
||||||
|
|
||||||
|
function ignoreCall(infoCall)
|
||||||
|
TriggerServerEvent('gcPhone:ignoreCall', infoCall)
|
||||||
|
end
|
||||||
|
|
||||||
|
function requestHistoriqueCall()
|
||||||
|
TriggerServerEvent('gcPhone:getHistoriqueCall')
|
||||||
|
end
|
||||||
|
|
||||||
|
function appelsDeleteHistorique (num)
|
||||||
|
TriggerServerEvent('gcPhone:appelsDeleteHistorique', num)
|
||||||
|
end
|
||||||
|
|
||||||
|
function appelsDeleteAllHistorique ()
|
||||||
|
TriggerServerEvent('gcPhone:appelsDeleteAllHistorique')
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--====================================================================================
|
||||||
|
-- Event NUI - Appels
|
||||||
|
--====================================================================================
|
||||||
|
|
||||||
|
RegisterNUICallback('startCall', function (data, cb)
|
||||||
|
startCall(data.numero, data.rtcOffer, data.extraData)
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNUICallback('acceptCall', function (data, cb)
|
||||||
|
acceptCall(data.infoCall, data.rtcAnswer)
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('rejectCall', function (data, cb)
|
||||||
|
rejectCall(data.infoCall)
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNUICallback('ignoreCall', function (data, cb)
|
||||||
|
ignoreCall(data.infoCall)
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNUICallback('notififyUseRTC', function (use, cb)
|
||||||
|
USE_RTC = use
|
||||||
|
if USE_RTC == true and inCall == true then
|
||||||
|
inCall = false
|
||||||
|
Citizen.InvokeNative(0xE036A705F989E049)
|
||||||
|
if Config.UseTokoVoIP then
|
||||||
|
exports.tokovoip_script:removePlayerFromRadio(TokoVoipID)
|
||||||
|
TokoVoipID = nil
|
||||||
|
else
|
||||||
|
NetworkSetTalkerProximity(2.5)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
RegisterNUICallback('onCandidates', function (data, cb)
|
||||||
|
TriggerServerEvent('gcPhone:candidates', data.id, data.candidates)
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:candidates")
|
||||||
|
AddEventHandler("gcPhone:candidates", function(candidates)
|
||||||
|
SendNUIMessage({event = 'candidatesAvailable', candidates = candidates})
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
RegisterNetEvent('gcphone:autoCall')
|
||||||
|
AddEventHandler('gcphone:autoCall', function(number, extraData)
|
||||||
|
if number ~= nil then
|
||||||
|
SendNUIMessage({ event = "autoStartCall", number = number, extraData = extraData})
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent('gcphone:autoCallNumber')
|
||||||
|
AddEventHandler('gcphone:autoCallNumber', function(data)
|
||||||
|
TriggerEvent('gcphone:autoCall', data.number)
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent('gcphone:autoAcceptCall')
|
||||||
|
AddEventHandler('gcphone:autoAcceptCall', function(infoCall)
|
||||||
|
SendNUIMessage({ event = "autoAcceptCall", infoCall = infoCall})
|
||||||
|
end)
|
||||||
|
|
||||||
|
--====================================================================================
|
||||||
|
-- Gestion des evenements NUI
|
||||||
|
--====================================================================================
|
||||||
|
RegisterNUICallback('log', function(data, cb)
|
||||||
|
print(data)
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('focus', function(data, cb)
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('blur', function(data, cb)
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('reponseText', function(data, cb)
|
||||||
|
local limit = data.limit or 255
|
||||||
|
local text = data.text or ''
|
||||||
|
|
||||||
|
DisplayOnscreenKeyboard(1, "FMMC_MPM_NA", "", text, "", "", "", limit)
|
||||||
|
while (UpdateOnscreenKeyboard() == 0) do
|
||||||
|
DisableAllControlActions(0);
|
||||||
|
Wait(0);
|
||||||
|
end
|
||||||
|
if (GetOnscreenKeyboardResult()) then
|
||||||
|
text = GetOnscreenKeyboardResult()
|
||||||
|
end
|
||||||
|
cb(json.encode({text = text}))
|
||||||
|
end)
|
||||||
|
--====================================================================================
|
||||||
|
-- Event - Messages
|
||||||
|
--====================================================================================
|
||||||
|
RegisterNUICallback('getMessages', function(data, cb)
|
||||||
|
cb(json.encode(messages))
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('sendMessage', function(data, cb)
|
||||||
|
if data.message == '%pos%' then
|
||||||
|
local myPos = GetEntityCoords(PlayerPedId())
|
||||||
|
data.message = 'GPS: ' .. myPos.x .. ', ' .. myPos.y
|
||||||
|
end
|
||||||
|
TriggerServerEvent('gcPhone:sendMessage', data.phoneNumber, data.message)
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('deleteMessage', function(data, cb)
|
||||||
|
deleteMessage(data.id)
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('deleteMessageNumber', function (data, cb)
|
||||||
|
deleteMessageContact(data.number)
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('deleteAllMessage', function (data, cb)
|
||||||
|
deleteAllMessage()
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('setReadMessageNumber', function (data, cb)
|
||||||
|
setReadMessageNumber(data.number)
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
--====================================================================================
|
||||||
|
-- Event - Contacts
|
||||||
|
--====================================================================================
|
||||||
|
RegisterNUICallback('addContact', function(data, cb)
|
||||||
|
TriggerServerEvent('gcPhone:addContact', data.display, data.phoneNumber)
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('updateContact', function(data, cb)
|
||||||
|
TriggerServerEvent('gcPhone:updateContact', data.id, data.display, data.phoneNumber)
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('deleteContact', function(data, cb)
|
||||||
|
TriggerServerEvent('gcPhone:deleteContact', data.id)
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('getContacts', function(data, cb)
|
||||||
|
cb(json.encode(contacts))
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('setGPS', function(data, cb)
|
||||||
|
SetNewWaypoint(tonumber(data.x), tonumber(data.y))
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Add security for event (leuit#0100)
|
||||||
|
RegisterNUICallback('callEvent', function(data, cb)
|
||||||
|
local eventName = data.eventName or ''
|
||||||
|
if string.match(eventName, 'gcphone') then
|
||||||
|
if data.data ~= nil then
|
||||||
|
TriggerEvent(data.eventName, data.data)
|
||||||
|
else
|
||||||
|
TriggerEvent(data.eventName)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
print('Event not allowed')
|
||||||
|
end
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('useMouse', function(um, cb)
|
||||||
|
useMouse = um
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('deleteALL', function(data, cb)
|
||||||
|
TriggerServerEvent('gcPhone:deleteALL')
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function TooglePhone()
|
||||||
|
menuIsOpen = not menuIsOpen
|
||||||
|
SendNUIMessage({show = menuIsOpen})
|
||||||
|
if menuIsOpen == true then
|
||||||
|
PhonePlayIn()
|
||||||
|
TriggerEvent('gcPhone:setMenuStatus', true)
|
||||||
|
SetBigmapActive(1,0)
|
||||||
|
else
|
||||||
|
PhonePlayOut()
|
||||||
|
TriggerEvent('gcPhone:setMenuStatus', false)
|
||||||
|
SetBigmapActive(0,0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RegisterNUICallback('faketakePhoto', function(data, cb)
|
||||||
|
menuIsOpen = false
|
||||||
|
TriggerEvent('gcPhone:setMenuStatus', false)
|
||||||
|
SendNUIMessage({show = false})
|
||||||
|
cb()
|
||||||
|
TriggerEvent('camera:open')
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNUICallback('closePhone', function(data, cb)
|
||||||
|
menuIsOpen = false
|
||||||
|
TriggerEvent('gcPhone:setMenuStatus', false)
|
||||||
|
SendNUIMessage({show = false})
|
||||||
|
PhonePlayOut()
|
||||||
|
SetBigmapActive(0,0)
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------
|
||||||
|
---------- GESTION APPEL ---------
|
||||||
|
----------------------------------
|
||||||
|
RegisterNUICallback('appelsDeleteHistorique', function (data, cb)
|
||||||
|
appelsDeleteHistorique(data.numero)
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('appelsDeleteAllHistorique', function (data, cb)
|
||||||
|
appelsDeleteAllHistorique(data.infoCall)
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------
|
||||||
|
---------- GESTION VIA WEBRTC ----
|
||||||
|
----------------------------------
|
||||||
|
AddEventHandler('onClientResourceStart', function(res)
|
||||||
|
DoScreenFadeIn(300)
|
||||||
|
if res == "gcphone" then
|
||||||
|
TriggerServerEvent('gcPhone:allUpdate')
|
||||||
|
-- Try again in 2 minutes (Recovers bugged phone numbers)
|
||||||
|
Citizen.Wait(120000)
|
||||||
|
TriggerServerEvent('gcPhone:allUpdate')
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
RegisterNUICallback('setIgnoreFocus', function (data, cb)
|
||||||
|
ignoreFocus = data.ignoreFocus
|
||||||
|
cb()
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNUICallback('takePhoto', function(data, cb)
|
||||||
|
CreateMobilePhone(1)
|
||||||
|
CellCamActivate(true, true)
|
||||||
|
takePhoto = true
|
||||||
|
Citizen.Wait(0)
|
||||||
|
if hasFocus == true then
|
||||||
|
SetNuiFocus(false, false)
|
||||||
|
hasFocus = false
|
||||||
|
end
|
||||||
|
while takePhoto do
|
||||||
|
Citizen.Wait(0)
|
||||||
|
|
||||||
|
if IsControlJustPressed(1, 27) then -- Toogle Mode
|
||||||
|
frontCam = not frontCam
|
||||||
|
CellFrontCamActivate(frontCam)
|
||||||
|
elseif IsControlJustPressed(1, 177) then -- CANCEL
|
||||||
|
DestroyMobilePhone()
|
||||||
|
CellCamActivate(false, false)
|
||||||
|
cb(json.encode({ url = nil }))
|
||||||
|
takePhoto = false
|
||||||
|
break
|
||||||
|
elseif IsControlJustPressed(1, 176) then -- TAKE.. PIC
|
||||||
|
exports['screenshot-basic']:requestScreenshotUpload(data.url, data.field, function(data)
|
||||||
|
local resp = json.decode(data)
|
||||||
|
DestroyMobilePhone()
|
||||||
|
CellCamActivate(false, false)
|
||||||
|
cb(json.encode({ url = resp.url }))
|
||||||
|
end)
|
||||||
|
takePhoto = false
|
||||||
|
end
|
||||||
|
HideHudComponentThisFrame(7)
|
||||||
|
HideHudComponentThisFrame(8)
|
||||||
|
HideHudComponentThisFrame(9)
|
||||||
|
HideHudComponentThisFrame(6)
|
||||||
|
HideHudComponentThisFrame(19)
|
||||||
|
HideHudAndRadarThisFrame()
|
||||||
|
end
|
||||||
|
Citizen.Wait(1000)
|
||||||
|
PhonePlayAnim('text', false, true)
|
||||||
|
end)
|
||||||
57
HTML/gcphone/resources/gcphone/client/photo.lua
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
-- Author: Xinerki (https://forum.fivem.net/t/release-cellphone-camera/43599)
|
||||||
|
|
||||||
|
phone = false
|
||||||
|
phoneId = 0
|
||||||
|
|
||||||
|
RegisterNetEvent('camera:open')
|
||||||
|
AddEventHandler('camera:open', function()
|
||||||
|
CreateMobilePhone(1)
|
||||||
|
CellCamActivate(true, true)
|
||||||
|
phone = true
|
||||||
|
PhonePlayOut()
|
||||||
|
end)
|
||||||
|
|
||||||
|
frontCam = false
|
||||||
|
|
||||||
|
function CellFrontCamActivate(activate)
|
||||||
|
return Citizen.InvokeNative(0x2491A93618B7D838, activate)
|
||||||
|
end
|
||||||
|
|
||||||
|
Citizen.CreateThread(function()
|
||||||
|
DestroyMobilePhone()
|
||||||
|
while true do
|
||||||
|
Citizen.Wait(0)
|
||||||
|
|
||||||
|
if IsControlJustPressed(1, 177) and phone == true then -- CLOSE PHONE
|
||||||
|
DestroyMobilePhone()
|
||||||
|
phone = false
|
||||||
|
CellCamActivate(false, false)
|
||||||
|
if firstTime == true then
|
||||||
|
firstTime = false
|
||||||
|
Citizen.Wait(2500)
|
||||||
|
displayDoneMission = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if IsControlJustPressed(1, 27) and phone == true then -- SELFIE MODE
|
||||||
|
frontCam = not frontCam
|
||||||
|
CellFrontCamActivate(frontCam)
|
||||||
|
end
|
||||||
|
|
||||||
|
if phone == true then
|
||||||
|
HideHudComponentThisFrame(7)
|
||||||
|
HideHudComponentThisFrame(8)
|
||||||
|
HideHudComponentThisFrame(9)
|
||||||
|
HideHudComponentThisFrame(6)
|
||||||
|
HideHudComponentThisFrame(19)
|
||||||
|
HideHudAndRadarThisFrame()
|
||||||
|
end
|
||||||
|
|
||||||
|
ren = GetMobilePhoneRenderId()
|
||||||
|
SetTextRenderId(ren)
|
||||||
|
|
||||||
|
-- Everything rendered inside here will appear on your phone.
|
||||||
|
|
||||||
|
SetTextRenderId(1) -- NOTE: 1 is default
|
||||||
|
end
|
||||||
|
end)
|
||||||
82
HTML/gcphone/resources/gcphone/client/twitter.lua
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
--====================================================================================
|
||||||
|
-- #Author: Jonathan D @ Gannon
|
||||||
|
--====================================================================================
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:twitter_getTweets")
|
||||||
|
AddEventHandler("gcPhone:twitter_getTweets", function(tweets)
|
||||||
|
SendNUIMessage({event = 'twitter_tweets', tweets = tweets})
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:twitter_getFavoriteTweets")
|
||||||
|
AddEventHandler("gcPhone:twitter_getFavoriteTweets", function(tweets)
|
||||||
|
SendNUIMessage({event = 'twitter_favoritetweets', tweets = tweets})
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:twitter_newTweets")
|
||||||
|
AddEventHandler("gcPhone:twitter_newTweets", function(tweet)
|
||||||
|
SendNUIMessage({event = 'twitter_newTweet', tweet = tweet})
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:twitter_updateTweetLikes")
|
||||||
|
AddEventHandler("gcPhone:twitter_updateTweetLikes", function(tweetId, likes)
|
||||||
|
SendNUIMessage({event = 'twitter_updateTweetLikes', tweetId = tweetId, likes = likes})
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:twitter_setAccount")
|
||||||
|
AddEventHandler("gcPhone:twitter_setAccount", function(username, password, avatarUrl)
|
||||||
|
SendNUIMessage({event = 'twitter_setAccount', username = username, password = password, avatarUrl = avatarUrl})
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:twitter_createAccount")
|
||||||
|
AddEventHandler("gcPhone:twitter_createAccount", function(account)
|
||||||
|
SendNUIMessage({event = 'twitter_createAccount', account = account})
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:twitter_showError")
|
||||||
|
AddEventHandler("gcPhone:twitter_showError", function(title, message)
|
||||||
|
SendNUIMessage({event = 'twitter_showError', message = message, title = title})
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:twitter_showSuccess")
|
||||||
|
AddEventHandler("gcPhone:twitter_showSuccess", function(title, message)
|
||||||
|
SendNUIMessage({event = 'twitter_showSuccess', message = message, title = title})
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent("gcPhone:twitter_setTweetLikes")
|
||||||
|
AddEventHandler("gcPhone:twitter_setTweetLikes", function(tweetId, isLikes)
|
||||||
|
SendNUIMessage({event = 'twitter_setTweetLikes', tweetId = tweetId, isLikes = isLikes})
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
RegisterNUICallback('twitter_login', function(data, cb)
|
||||||
|
TriggerServerEvent('gcPhone:twitter_login', data.username, data.password)
|
||||||
|
end)
|
||||||
|
RegisterNUICallback('twitter_changePassword', function(data, cb)
|
||||||
|
TriggerServerEvent('gcPhone:twitter_changePassword', data.username, data.password, data.newPassword)
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
RegisterNUICallback('twitter_createAccount', function(data, cb)
|
||||||
|
TriggerServerEvent('gcPhone:twitter_createAccount', data.username, data.password, data.avatarUrl)
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNUICallback('twitter_getTweets', function(data, cb)
|
||||||
|
TriggerServerEvent('gcPhone:twitter_getTweets', data.username, data.password)
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNUICallback('twitter_getFavoriteTweets', function(data, cb)
|
||||||
|
TriggerServerEvent('gcPhone:twitter_getFavoriteTweets', data.username, data.password)
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNUICallback('twitter_postTweet', function(data, cb)
|
||||||
|
TriggerServerEvent('gcPhone:twitter_postTweets', data.username or '', data.password or '', data.message)
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNUICallback('twitter_toggleLikeTweet', function(data, cb)
|
||||||
|
TriggerServerEvent('gcPhone:twitter_toogleLikeTweet', data.username or '', data.password or '', data.tweetId)
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNUICallback('twitter_setAvatarUrl', function(data, cb)
|
||||||
|
TriggerServerEvent('gcPhone:twitter_setAvatarUrl', data.username or '', data.password or '', data.avatarUrl)
|
||||||
|
end)
|
||||||
27
HTML/gcphone/resources/gcphone/config.lua
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
Config = {}
|
||||||
|
|
||||||
|
-- Script locale (only .Lua)
|
||||||
|
Config.Locale = 'en'
|
||||||
|
|
||||||
|
Config.AutoFindFixePhones = true -- Automatically add pay phones as they are found by their models.
|
||||||
|
|
||||||
|
Config.FixePhone = {
|
||||||
|
-- Mission Row
|
||||||
|
['911'] = {
|
||||||
|
name = _U('mission_row'),
|
||||||
|
coords = { x = 441.2, y = -979.7, z = 30.58 }
|
||||||
|
},
|
||||||
|
|
||||||
|
-- ['372-9663'] = {
|
||||||
|
-- name = _U('phone_booth'),
|
||||||
|
-- coords = { x = 372.305, y = -966.373, z = 28.413 }
|
||||||
|
-- },
|
||||||
|
}
|
||||||
|
|
||||||
|
Config.KeyOpenClose = 288 -- F1
|
||||||
|
Config.KeyTakeCall = 38 -- E
|
||||||
|
|
||||||
|
Config.UseMumbleVoIP = true -- Use Frazzle's Mumble-VoIP Resource (Recomended!) https://github.com/FrazzIe/mumble-voip
|
||||||
|
Config.UseTokoVoIP = false
|
||||||
|
|
||||||
|
Config.ShowNumberNotification = false -- Show Number or Contact Name when you receive new SMS
|
||||||
99
HTML/gcphone/resources/gcphone/fxmanifest.lua
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
fx_version 'bodacious'
|
||||||
|
|
||||||
|
game 'gta5'
|
||||||
|
|
||||||
|
ui_page 'html/index.html'
|
||||||
|
|
||||||
|
files {
|
||||||
|
'html/index.html',
|
||||||
|
'html/static/css/app.css',
|
||||||
|
'html/static/js/app.js',
|
||||||
|
'html/static/js/manifest.js',
|
||||||
|
'html/static/js/vendor.js',
|
||||||
|
|
||||||
|
'html/static/config/config.json',
|
||||||
|
|
||||||
|
-- Coque
|
||||||
|
'html/static/img/coque/blue.png',
|
||||||
|
'html/static/img/coque/s8.png',
|
||||||
|
'html/static/img/coque/red.png',
|
||||||
|
'html/static/img/coque/grey.png',
|
||||||
|
'html/static/img/coque/pink.png',
|
||||||
|
'html/static/img/coque/no_cover.png',
|
||||||
|
|
||||||
|
|
||||||
|
-- Background
|
||||||
|
'html/static/img/background/back001.jpg',
|
||||||
|
'html/static/img/background/back002.jpg',
|
||||||
|
'html/static/img/background/back003.jpg',
|
||||||
|
'html/static/img/background/color.jpg',
|
||||||
|
'html/static/img/background/humo.jpg',
|
||||||
|
'html/static/img/background/iluminacion.jpg',
|
||||||
|
'html/static/img/background/neon.jpg',
|
||||||
|
'html/static/img/background/oscuridad.jpg',
|
||||||
|
'html/static/img/background/paisajes.jpg',
|
||||||
|
'html/static/img/background/playa.jpg',
|
||||||
|
'html/static/img/background/tokio.jpg',
|
||||||
|
|
||||||
|
'html/static/img/icons_app/call.png',
|
||||||
|
'html/static/img/icons_app/contacts.png',
|
||||||
|
'html/static/img/icons_app/ff.png',
|
||||||
|
'html/static/img/icons_app/itunes.svg',
|
||||||
|
'html/static/img/icons_app/lsfd.png',
|
||||||
|
'html/static/img/icons_app/sms.png',
|
||||||
|
'html/static/img/icons_app/settings.png',
|
||||||
|
'html/static/img/icons_app/menu.png',
|
||||||
|
'html/static/img/icons_app/bourse1.png',
|
||||||
|
'html/static/img/icons_app/tchat.png',
|
||||||
|
'html/static/img/icons_app/photo.png',
|
||||||
|
'html/static/img/icons_app/policia.png',
|
||||||
|
'html/static/img/icons_app/reddit.png',
|
||||||
|
'html/static/img/icons_app/notes.png',
|
||||||
|
'html/static/img/icons_app/banco.png',
|
||||||
|
'html/static/img/icons_app/wifi.png',
|
||||||
|
'html/static/img/icons_app/9gag.png',
|
||||||
|
'html/static/img/icons_app/twitter.png',
|
||||||
|
'html/static/img/icons_app/borrado.png',
|
||||||
|
|
||||||
|
'html/static/img/app_bank/fleeca_tar.png',
|
||||||
|
'html/static/img/app_bank/tarjetas.png',
|
||||||
|
|
||||||
|
'html/static/img/app_tchat/reddit.png',
|
||||||
|
|
||||||
|
'html/static/img/twitter/bird.png',
|
||||||
|
'html/static/img/twitter/default_profile.png',
|
||||||
|
'html/static/sound/Twitter_Sound_Effect.ogg',
|
||||||
|
|
||||||
|
'html/static/img/courbure.png',
|
||||||
|
'html/static/fonts/fontawesome-webfont.eot',
|
||||||
|
'html/static/fonts/fontawesome-webfont.ttf',
|
||||||
|
'html/static/fonts/fontawesome-webfont.woff',
|
||||||
|
'html/static/fonts/fontawesome-webfont.woff2',
|
||||||
|
|
||||||
|
'html/static/sound/*.ogg',
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
client_script {
|
||||||
|
"@es_extended/locale.lua",
|
||||||
|
"locales/en.lua",
|
||||||
|
"locales/es.lua",
|
||||||
|
"config.lua",
|
||||||
|
"client/animation.lua",
|
||||||
|
"client/client.lua",
|
||||||
|
"client/photo.lua",
|
||||||
|
"client/app_tchat.lua",
|
||||||
|
"client/bank.lua",
|
||||||
|
"client/twitter.lua"
|
||||||
|
}
|
||||||
|
|
||||||
|
server_script {
|
||||||
|
"@mysql-async/lib/MySQL.lua",
|
||||||
|
"@es_extended/locale.lua",
|
||||||
|
"locales/en.lua",
|
||||||
|
"locales/es.lua",
|
||||||
|
"config.lua",
|
||||||
|
"server/server.lua",
|
||||||
|
"server/app_tchat.lua",
|
||||||
|
"server/twitter.lua",
|
||||||
|
}
|
||||||
1
HTML/gcphone/resources/gcphone/html/index.html
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<!DOCTYPE html><html><head><meta charset=utf-8><link rel=stylesheet href=https://use.fontawesome.com/releases/v5.8.1/css/all.css integrity=sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf crossorigin=anonymous><link href=/html/static/css/app.css rel=stylesheet></head><body><div id=app></div><script src=https://code.jquery.com/jquery-3.2.1.min.js></script><script src=nui://game/ui/jquery.js type=text/javascript></script><script type=text/javascript src=/html/static/js/manifest.js></script><script type=text/javascript src=/html/static/js/vendor.js></script><script type=text/javascript src=/html/static/js/app.js></script></body></html>
|
||||||
1088
HTML/gcphone/resources/gcphone/html/static/config/config.json
Normal file
4
HTML/gcphone/resources/gcphone/html/static/css/app.css
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 379 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 190 KiB |
|
After Width: | Height: | Size: 93 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 214 KiB |
|
After Width: | Height: | Size: 302 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 491 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 872 KiB |
|
After Width: | Height: | Size: 796 KiB |
|
After Width: | Height: | Size: 431 KiB |
BIN
HTML/gcphone/resources/gcphone/html/static/img/coque/base.png
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
HTML/gcphone/resources/gcphone/html/static/img/coque/base.xcf
Normal file
BIN
HTML/gcphone/resources/gcphone/html/static/img/coque/blue.png
Normal file
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 90 KiB |
BIN
HTML/gcphone/resources/gcphone/html/static/img/coque/grey.png
Normal file
|
After Width: | Height: | Size: 150 KiB |
|
After Width: | Height: | Size: 74 KiB |
BIN
HTML/gcphone/resources/gcphone/html/static/img/coque/pink.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
HTML/gcphone/resources/gcphone/html/static/img/coque/red.png
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
HTML/gcphone/resources/gcphone/html/static/img/coque/s8.png
Normal file
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 434 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 7.7 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 117 KiB |
BIN
HTML/gcphone/resources/gcphone/html/static/img/icons_app/ff.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
HTML/gcphone/resources/gcphone/html/static/img/icons_app/ff1.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 101 KiB |
|
After Width: | Height: | Size: 90 KiB |
@@ -0,0 +1,36 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<svg enable-background="new 36.471 38.394 437.749 439.6" height="439.6" viewBox="36.471 38.394 437.749 439.6" width="437.749" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<linearGradient id="a" gradientTransform="matrix(.6278 .7783 -.7783 .6278 295.9889 -102.6574)" gradientUnits="userSpaceOnUse" x1="43.3452" x2="467.3457" y1="258.1934" y2="258.1934">
|
||||||
|
<stop offset="0" stop-color="#fff"/>
|
||||||
|
<stop offset=".5368" stop-color="#eee"/>
|
||||||
|
<stop offset="1" stop-color="#e5e5e5"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="b" gradientTransform="matrix(.6278 .7783 -.7783 .6278 295.9889 -102.6574)" gradientUnits="userSpaceOnUse" x1="35.8452" x2="474.8457" y1="258.1934" y2="258.1934">
|
||||||
|
<stop offset="0" stop-color="#ff5e4e"/>
|
||||||
|
<stop offset=".1505" stop-color="#ff5c6d"/>
|
||||||
|
<stop offset=".1694" stop-color="#ff5e73"/>
|
||||||
|
<stop offset=".2476" stop-color="#ff6385"/>
|
||||||
|
<stop offset=".3026" stop-color="#ff658c"/>
|
||||||
|
<stop offset=".3685" stop-color="#e4729f"/>
|
||||||
|
<stop offset=".4329" stop-color="#d17cad"/>
|
||||||
|
<stop offset=".4772" stop-color="#ca7fb2"/>
|
||||||
|
<stop offset=".5528" stop-color="#9d6cff"/>
|
||||||
|
<stop offset=".5934" stop-color="#9870ff" stop-opacity=".9882"/>
|
||||||
|
<stop offset=".6432" stop-color="#897afe" stop-opacity=".9725"/>
|
||||||
|
<stop offset=".6979" stop-color="#708cfe" stop-opacity=".9529"/>
|
||||||
|
<stop offset=".7556" stop-color="#4da4fd" stop-opacity=".9333"/>
|
||||||
|
<stop offset=".8022" stop-color="#2cbcfc" stop-opacity=".9176"/>
|
||||||
|
<stop offset="1" stop-color="#00c7ff"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="c" gradientUnits="userSpaceOnUse" x1="128.63179295" x2="384.0201395" y1="90.89488104" y2="422.37177288">
|
||||||
|
<stop offset="0" stop-color="#ff5e4e"/>
|
||||||
|
<stop offset=".249" stop-color="#ff5c6d"/>
|
||||||
|
<stop offset=".3765" stop-color="#ff658c"/>
|
||||||
|
<stop offset=".497" stop-color="#ca7fb2"/>
|
||||||
|
<stop offset=".6267" stop-color="#9d6cff"/>
|
||||||
|
<stop offset=".7628" stop-color="#2cbcfc" stop-opacity=".9176"/>
|
||||||
|
<stop offset="1" stop-color="#00c7ff"/>
|
||||||
|
</linearGradient>
|
||||||
|
<path d="m131.94 430.507c-94.767-68.476-116.341-201.133-48.188-296.3 68.149-95.165 200.227-116.803 294.996-48.327 94.767 68.473 116.342 201.13 48.193 296.3-68.154 95.165-200.228 116.803-295.001 48.327z" fill="url(#a)" stroke="url(#b)" stroke-miterlimit="10" stroke-width="15"/>
|
||||||
|
<path d="m330.626 359.353c13.384-3.925 22.834-13.445 26.701-26.892l1.141-3.952.15-106.015c.111-79.393.004-106.509-.437-107.989-.464-1.569-1.2-2.885-2.163-3.925-1.417-.873-3.12-1.333-5.05-1.33-1.33 0-5.951.641-10.261 1.425-19.069 3.472-131.468 25.858-133.388 26.568-2.97 1.098-5.912 3.707-7.308 6.476l-1.183 2.346c0 0-.559 166.171-1.42 168.041-1.309 2.847-4.216 5.544-6.896 6.403-1.27.409-6.289 1.535-11.161 2.503-22.552 4.488-30.927 7.721-38.012 14.677-4.024 3.949-7.004 9.341-8.292 14.998-1.232 5.408-.82 13.5.935 18.421 1.839 5.146 4.799 9.541 8.669 12.999 3.518 2.711 7.671 4.729 12.34 5.927 10.323 2.643 29.65-.297 39.53-6.012 4.132-2.391 9.447-7.403 12.211-11.526 1.096-1.633 2.74-4.917 3.661-7.304 3.218-8.358 3.319-157.221 3.73-159.096.698-3.182 2.873-5.511 5.87-6.302 2.701-.709 110.93-22.107 113.977-22.534 2.68-.372 5.21.491 6.592 2.193.82.44 1.512 1.033 1.997 1.763.879 1.309.932 3.897 1.063 51.028.15 54.247.217 52.975-2.732 56.399-2.146 2.489-4.822 3.454-15.823 5.698-16.737 3.417-22.464 5.04-28.875 8.167-8.003 3.911-12.448 8.194-15.883 15.308-2.429 5.033-3.336 8.805-3.329 13.813.014 8.959 3.105 15.956 10.075 22.807.643.631 1.273 1.218 1.909 1.77 3.511 2.715 7.092 4.352 11.594 5.389 6.79 1.563 20.61.534 30.068-2.242z" fill="url(#c)"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.6 KiB |