Archived
Private
Public Access
1
0

Update 19.11.2022

This commit is contained in:
2022-11-19 14:12:22 +01:00
parent 08ddca2211
commit 771f58073f
322 changed files with 50685 additions and 2 deletions

2
FiveM

Submodule FiveM updated: b4e5d26ee1...ef7104fd35

13
HTML/gcphone/.babelrc Normal file
View File

@@ -0,0 +1,13 @@
{
"presets": [
["env", { "modules": false }],
"stage-2"
],
"plugins": ["transform-runtime"],
"env": {
"test": {
"presets": ["env", "stage-2"],
"plugins": [ "istanbul" ]
}
}
}

View 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

View File

@@ -0,0 +1,2 @@
build/*.js
config/*.js

27
HTML/gcphone/.eslintrc.js Normal file
View 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
View File

@@ -0,0 +1 @@
/node_modules

5
HTML/gcphone/.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,5 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/

View 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>

View 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
View 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
View 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
View 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>

View 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
View 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
View 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>

View 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
View File

@@ -0,0 +1,78 @@
# src_htmlphone
> A Vue.js project
>
![image](https://user-images.githubusercontent.com/33089217/115770796-6ee36c80-a3ad-11eb-93ee-e1329c6deb2d.png)
![image](https://user-images.githubusercontent.com/33089217/115770764-625f1400-a3ad-11eb-82db-87a3607a0d7a.png)
![image](https://user-images.githubusercontent.com/33089217/115770807-71de5d00-a3ad-11eb-868b-2fd7b4170682.png)
![image](https://user-images.githubusercontent.com/33089217/115770826-79056b00-a3ad-11eb-88d3-1f9ac2fb42f5.png)
![image](https://user-images.githubusercontent.com/33089217/115770835-7c98f200-a3ad-11eb-96f7-d22c7817ac88.png)
![image](https://user-images.githubusercontent.com/33089217/115770846-7f93e280-a3ad-11eb-9b12-47ff88a17614.png)
![image](https://user-images.githubusercontent.com/33089217/115770853-828ed300-a3ad-11eb-83c9-d95cc99d7e29.png)
![image](https://user-images.githubusercontent.com/33089217/115770857-84589680-a3ad-11eb-9257-bebc20c44746.png)
## 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

Binary file not shown.

View 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'
))
})
})

View 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)
}
}

View 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()
}
})

View 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()
}
}

View 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
}

View 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
})
}

View 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]')
}
}
]
}
}

View 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()
]
})

View 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

View File

@@ -0,0 +1,6 @@
var merge = require('webpack-merge')
var prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"'
})

View 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
}
}

View File

@@ -0,0 +1,3 @@
module.exports = {
NODE_ENV: '"production"'
}

15
HTML/gcphone/index.html Normal file
View 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

File diff suppressed because it is too large Load Diff

74
HTML/gcphone/package.json Normal file
View 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"
]
}

View File

@@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto

View 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)

View 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"
-- }}
-- ]
-- }

View 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)

View 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 */;

View 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)

View 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)

View 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)

View 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)

View 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)

View 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)

View 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

View 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",
}

View 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>

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 872 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 796 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

View File

@@ -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

Some files were not shown because too many files have changed in this diff Show More