Merge branch 'develop' into 'master'
Ab in master damit See merge request log-gtav/reallife-gamemode!22
This commit is contained in:
124
.editorconfig
Normal file
124
.editorconfig
Normal file
@@ -0,0 +1,124 @@
|
||||
# Informationen zu EDITORCONFIG-Dateien finden Sie unter https://aka.ms/editorconfigdocs
|
||||
###############################
|
||||
# Core EditorConfig Options #
|
||||
###############################
|
||||
root = true
|
||||
# All files
|
||||
[*]
|
||||
indent_style = space
|
||||
# Code files
|
||||
[*.{cs,csx,vb,vbx}]
|
||||
indent_size = 2
|
||||
insert_final_newline = true
|
||||
charset = utf-8-bom
|
||||
###############################
|
||||
# .NET Coding Conventions #
|
||||
###############################
|
||||
[*.{cs,vb}]
|
||||
# Organize usings
|
||||
dotnet_sort_system_directives_first = true
|
||||
# this. preferences
|
||||
dotnet_style_qualification_for_field = true:warn
|
||||
dotnet_style_qualification_for_property = true:warn
|
||||
dotnet_style_qualification_for_method = true:warn
|
||||
dotnet_style_qualification_for_event = true:warn
|
||||
# Language keywords vs BCL types preferences
|
||||
dotnet_style_predefined_type_for_locals_parameters_members = true:silent
|
||||
dotnet_style_predefined_type_for_member_access = true:silent
|
||||
# Parentheses preferences
|
||||
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
|
||||
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
|
||||
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
|
||||
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
|
||||
# Modifier preferences
|
||||
dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
|
||||
dotnet_style_readonly_field = true:suggestion
|
||||
# Expression-level preferences
|
||||
dotnet_style_object_initializer = true:suggestion
|
||||
dotnet_style_collection_initializer = true:suggestion
|
||||
dotnet_style_explicit_tuple_names = true:suggestion
|
||||
dotnet_style_null_propagation = true:suggestion
|
||||
dotnet_style_coalesce_expression = true:suggestion
|
||||
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:silent
|
||||
dotnet_prefer_inferred_tuple_names = true:suggestion
|
||||
dotnet_prefer_inferred_anonymous_type_member_names = true:suggestion
|
||||
dotnet_style_prefer_auto_properties = true:silent
|
||||
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
|
||||
dotnet_style_prefer_conditional_expression_over_return = true:silent
|
||||
###############################
|
||||
# Naming Conventions #
|
||||
###############################
|
||||
# Style Definitions
|
||||
dotnet_naming_style.pascal_case_style.capitalization = pascal_case
|
||||
# Use PascalCase for constant fields
|
||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
|
||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
|
||||
dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
|
||||
dotnet_naming_symbols.constant_fields.applicable_kinds = field
|
||||
dotnet_naming_symbols.constant_fields.applicable_accessibilities = *
|
||||
dotnet_naming_symbols.constant_fields.required_modifiers = const
|
||||
###############################
|
||||
# C# Coding Conventions #
|
||||
###############################
|
||||
[*.cs]
|
||||
# var preferences
|
||||
csharp_style_var_for_built_in_types = false:silent
|
||||
csharp_style_var_when_type_is_apparent = false:silent
|
||||
csharp_style_var_elsewhere = false:silent
|
||||
# Expression-bodied members
|
||||
csharp_style_expression_bodied_methods = false:silent
|
||||
csharp_style_expression_bodied_constructors = false:silent
|
||||
csharp_style_expression_bodied_operators = false:silent
|
||||
csharp_style_expression_bodied_properties = true:silent
|
||||
csharp_style_expression_bodied_indexers = true:silent
|
||||
csharp_style_expression_bodied_accessors = true:silent
|
||||
# Pattern matching preferences
|
||||
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
|
||||
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
|
||||
# Null-checking preferences
|
||||
csharp_style_throw_expression = true:suggestion
|
||||
csharp_style_conditional_delegate_call = true:suggestion
|
||||
# Modifier preferences
|
||||
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
|
||||
# Expression-level preferences
|
||||
csharp_prefer_braces = true:silent
|
||||
csharp_style_deconstructed_variable_declaration = true:suggestion
|
||||
csharp_prefer_simple_default_expression = true:suggestion
|
||||
csharp_style_pattern_local_over_anonymous_function = true:suggestion
|
||||
csharp_style_inlined_variable_declaration = true:suggestion
|
||||
###############################
|
||||
# C# Formatting Rules #
|
||||
###############################
|
||||
# New line preferences
|
||||
csharp_new_line_before_open_brace = all
|
||||
csharp_new_line_before_else = true
|
||||
csharp_new_line_before_catch = true
|
||||
csharp_new_line_before_finally = true
|
||||
csharp_new_line_before_members_in_object_initializers = true
|
||||
csharp_new_line_before_members_in_anonymous_types = true
|
||||
csharp_new_line_between_query_expression_clauses = true
|
||||
# Indentation preferences
|
||||
csharp_indent_case_contents = true
|
||||
csharp_indent_switch_labels = true
|
||||
csharp_indent_labels = flush_left
|
||||
# Space preferences
|
||||
csharp_space_after_cast = false
|
||||
csharp_space_after_keywords_in_control_flow_statements = true
|
||||
csharp_space_between_method_call_parameter_list_parentheses = false
|
||||
csharp_space_between_method_declaration_parameter_list_parentheses = false
|
||||
csharp_space_between_parentheses = false
|
||||
csharp_space_before_colon_in_inheritance_clause = true
|
||||
csharp_space_after_colon_in_inheritance_clause = true
|
||||
csharp_space_around_binary_operators = before_and_after
|
||||
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
|
||||
csharp_space_between_method_call_name_and_opening_parenthesis = false
|
||||
csharp_space_between_method_call_empty_parameter_list_parentheses = false
|
||||
# Wrapping preferences
|
||||
csharp_preserve_single_line_statements = true
|
||||
csharp_preserve_single_line_blocks = true
|
||||
###############################
|
||||
# VB Coding Conventions #
|
||||
###############################
|
||||
[*.vb]
|
||||
# Modifier preferences
|
||||
visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion
|
||||
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
*.rpf filter=lfs diff=lfs merge=lfs -text
|
||||
* text=auto
|
||||
344
.gitignore
vendored
Normal file
344
.gitignore
vendored
Normal file
@@ -0,0 +1,344 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUNIT
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# JustCode is a .NET coding add-in
|
||||
.JustCode
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# JetBrains Rider
|
||||
.idea/
|
||||
*.sln.iml
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
launchSettings.json
|
||||
|
||||
tmp/
|
||||
index.js
|
||||
|
||||
# post build config
|
||||
postbuild.config.xml
|
||||
|
||||
!ReallifeGamemode.Server.Log/
|
||||
42
.gitlab-ci.yml
Normal file
42
.gitlab-ci.yml
Normal file
@@ -0,0 +1,42 @@
|
||||
stages:
|
||||
- build
|
||||
|
||||
before_script:
|
||||
- "git lfs install"
|
||||
- "git lfs pull"
|
||||
- "git submodule sync --recursive"
|
||||
- "git submodule update --init --recursive"
|
||||
|
||||
build:develop:
|
||||
stage: build
|
||||
only:
|
||||
- develop@log-gtav/reallife-gamemode
|
||||
script:
|
||||
- "dotnet restore"
|
||||
- "../gm_dev_database_password.sh"
|
||||
- "cd ReallifeGamemode.Server/"
|
||||
- "dotnet build -c Release"
|
||||
- "cd ../ReallifeGamemode.Client/"
|
||||
- "npm ci"
|
||||
- "npm run build:server"
|
||||
- "cd ../ReallifeGamemode.DataService"
|
||||
- "dotnet publish -c Release -r linux-x64"
|
||||
- "cd ../"
|
||||
- "sudo ../gm_dev_copy_build_files.sh"
|
||||
|
||||
build:master:
|
||||
stage: build
|
||||
only:
|
||||
- web
|
||||
script:
|
||||
- "dotnet restore"
|
||||
- "../gm_live_database_password.sh"
|
||||
- "cd ReallifeGamemode.Server/"
|
||||
- "dotnet build -c Release"
|
||||
- "cd ../ReallifeGamemode.Client/"
|
||||
- "npm ci"
|
||||
- "npm run build:server"
|
||||
- "cd ../ReallifeGamemode.DataService"
|
||||
- "dotnet publish -c Release -r linux-x64"
|
||||
- "cd ../"
|
||||
- "sudo ../gm_live_copy_build_files.sh"
|
||||
4
.gitmodules
vendored
Normal file
4
.gitmodules
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
[submodule "ReallifeGamemode.Client/libs/NativeUI"]
|
||||
path = ReallifeGamemode.Client/libs/NativeUI
|
||||
url = https://github.com/sprayzcs/RAGEMP-NativeUI.git
|
||||
branch = es6-exports
|
||||
BIN
Import/Bootstrapper.dll
Normal file
BIN
Import/Bootstrapper.dll
Normal file
Binary file not shown.
224
Import/Bootstrapper.xml
Normal file
224
Import/Bootstrapper.xml
Normal file
@@ -0,0 +1,224 @@
|
||||
<?xml version="1.0"?>
|
||||
<doc>
|
||||
<assembly>
|
||||
<name>Bootstrapper</name>
|
||||
</assembly>
|
||||
<members>
|
||||
<member name="T:GTANetworkAPI.CancelEventArgs">
|
||||
<summary>
|
||||
Used to cancel events.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.ResourceStart">
|
||||
<summary>
|
||||
Event has no parameters.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.ResourceStop">
|
||||
<summary>
|
||||
Event has no parameters.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.ResourceStartEx">
|
||||
<summary>
|
||||
Event Params: <see cref="T:System.String"/> resourceName
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.ResourceStopEx">
|
||||
<summary>
|
||||
Event Params: <see cref="T:System.String"/> resourceName
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.MapChange">
|
||||
<summary>
|
||||
Event Params: <see cref="T:System.String"/> mapName, <see cref="T:GTANetworkAPI.XmlGroup"/> map
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.ChatMessage">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Client"/> client, <see cref="T:System.String"/> message
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.Update">
|
||||
<summary>
|
||||
Event has no parameters.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.EntityCreated">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Entity"/> entity
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.EntityDeleted">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Entity"/> entity
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.EntityModelChange">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.NetHandle"/> entity, <see cref="T:System.UInt32"/> oldModel
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerConnected">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Client"/> client
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.IncomingConnection">
|
||||
<summary>
|
||||
Event Params: <see cref="T:System.String"/> ip, <see cref="T:System.String"/> serial, <see cref="T:System.String"/> rgscName, <see cref="T:System.UInt64"/> rgscId, <see cref="T:GTANetworkAPI.CancelEventArgs"/> cancel
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerDisconnected">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Client"/> client
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerSpawn">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Client"/> client
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerDeath">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Client"/> client, <see cref="T:GTANetworkAPI.Client"/> killer, <see cref="T:System.UInt32"/> reason
|
||||
<para>Death reason can be of either <see cref="T:GTANetworkAPI.WeaponHash"/> or <see cref="T:GTANetworkAPI.DeathReason"/></para>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerDamage">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Client"/> client, <see cref="T:System.Single"/> healthLoss, <see cref="T:System.Single"/> armorLoss
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerPickup">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Client"/> client, <see cref="T:GTANetworkAPI.Pickup"/> pickup
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerWeaponSwitch">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Client"/> client, <see cref="T:GTANetworkAPI.WeaponHash"/> oldWeaponHash, <see cref="T:GTANetworkAPI.WeaponHash"/> newWeaponHash
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerDetonateStickies">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Client"/> client
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerEnterCheckpoint">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Checkpoint"/> checkpoint, <see cref="T:GTANetworkAPI.Client"/> client
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerExitCheckpoint">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Checkpoint"/> checkpoint, <see cref="T:GTANetworkAPI.Client"/> client
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerEnterColshape">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.ColShape"/> colShape, <see cref="T:GTANetworkAPI.Client"/> client
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerExitColshape">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.ColShape"/> colShape, <see cref="T:GTANetworkAPI.Client"/> client
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerEnterVehicleAttempt">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Client"/> client, <see cref="T:GTANetworkAPI.Vehicle"/> vehicle, <see cref="T:System.SByte"/> seatID
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerExitVehicleAttempt">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Client"/> client, <see cref="T:GTANetworkAPI.Vehicle"/> vehicle
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerEnterVehicle">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Client"/> client, <see cref="T:GTANetworkAPI.Vehicle"/> vehicle, <see cref="T:System.SByte"/> seatID
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.PlayerExitVehicle">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Client"/> client, <see cref="T:GTANetworkAPI.Vehicle"/> vehicle
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.VehicleDamage">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Vehicle"/> vehicle, <see cref="T:System.Single"/> bodyHealthLoss, <see cref="T:System.Single"/> engineHealthLoss
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.VehicleDeath">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Vehicle"/> vehicle
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.VehicleHornToggle">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Vehicle"/> vehicle
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.VehicleSirenToggle">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Vehicle"/> vehicle, <see cref="T:System.Boolean"/> oldValue
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.VehicleDoorBreak">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Vehicle"/> vehicle, <see cref="T:System.Int32"/> index
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.VehicleWindowSmash">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Vehicle"/> vehicle, <see cref="T:System.Int32"/> index
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.VehicleTyreBurst">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Vehicle"/> vehicle, <see cref="T:System.Int32"/> index
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.VehicleTrailerChange">
|
||||
<summary>
|
||||
Event Params: <see cref="T:GTANetworkAPI.Vehicle"/> vehicle, <see cref="T:GTANetworkAPI.Vehicle"/> trailer
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.FirstChanceException">
|
||||
<summary>
|
||||
<para>Occurs when an exception is thrown in managed code, before the runtime searches
|
||||
the call stack for an exception handler in the application domain.</para>
|
||||
<para>Event Params: <see cref="T:System.Exception"/> exception</para>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.UnhandledException">
|
||||
<summary>
|
||||
Occurs when an exception is not caught.
|
||||
Event Params: <see cref="T:System.Exception"/> exception
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:GTANetworkAPI.Event.Invalid">
|
||||
<summary>
|
||||
An invalid event for internal usage
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:GTANetworkAPI.Entity.op_Equality(GTANetworkAPI.Entity,GTANetworkAPI.Entity)">
|
||||
public static bool operator ==(Entity left, Entity right) => left?.Value == right?.Value;
|
||||
public static bool operator !=(Entity left, Entity right) => left?.Value != right?.Value;
|
||||
</member>
|
||||
<member name="M:GTANetworkMethods.ClientEvent.TriggerClientEventInRange(GTANetworkAPI.Vector3,System.Single,System.String,System.Object[])">
|
||||
GTANetworkInternals.RemoteEventResponseHandler.Push((int)player.Value, requestId, callback.Method, callback.Target);
|
||||
</member>
|
||||
<member name="M:GTANetworkMethods.IPlayer.SetPlayerEyeColor(GTANetworkAPI.Client,System.Byte)">
|
||||
void SetPlayerDefaultClothes(Client player);
|
||||
</member>
|
||||
<member name="M:GTANetworkMethods.Task.Run(System.Action,System.Int64)">
|
||||
<summary>
|
||||
Runs thread-safe API code on main thread.
|
||||
</summary>
|
||||
<param name="task"></param>
|
||||
<param name="delayTime">should be in ms (milliseconds)</param>
|
||||
</member>
|
||||
</members>
|
||||
</doc>
|
||||
BIN
Import/Newtonsoft.Json.dll
Normal file
BIN
Import/Newtonsoft.Json.dll
Normal file
Binary file not shown.
BIN
Import/bridge.dll backup
Normal file
BIN
Import/bridge.dll backup
Normal file
Binary file not shown.
BIN
Import/rage-sharp.dll
Normal file
BIN
Import/rage-sharp.dll
Normal file
Binary file not shown.
BIN
Import/rage-sharp.dll backup
Normal file
BIN
Import/rage-sharp.dll backup
Normal file
Binary file not shown.
108
ReallifeGamemode.Client/Business/cardealer.ts
Normal file
108
ReallifeGamemode.Client/Business/cardealer.ts
Normal file
@@ -0,0 +1,108 @@
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const UIMenuSliderItem = NativeUI.UIMenuSliderItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
const ListItem = NativeUI.ListItem;
|
||||
var screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
|
||||
import moneyFormat from '../moneyformat';
|
||||
|
||||
export default function carDealer(globalData: IGlobalData) {
|
||||
|
||||
var shopMenu: NativeUI.Menu;
|
||||
|
||||
mp.events.add("entityStreamIn", (entity: EntityMp) => {
|
||||
if (!entity.isAVehicle()) return;
|
||||
var labelId = entity.getVariable("shopVehicleTextLabel");
|
||||
if (labelId === undefined) return;
|
||||
var label: TextLabelMp = mp.labels.atRemoteId(labelId);
|
||||
setShopVehicleTextLabel(entity as VehicleMp, label);
|
||||
});
|
||||
|
||||
mp.events.addDataHandler("shopVehicleTextLabel", (entity: EntityMp, labelId: number) => {
|
||||
var label = mp.labels.atRemoteId(labelId);
|
||||
var veh = entity as VehicleMp;
|
||||
setShopVehicleTextLabel(entity as VehicleMp, label);
|
||||
});
|
||||
|
||||
function setShopVehicleTextLabel(entity: VehicleMp, label: TextLabelMp) {
|
||||
if (label.text.indexOf("SHOPVEHICLE") === -1) return;
|
||||
var realName = mp.game.ui.getLabelText(mp.game.vehicle.getDisplayNameFromVehicleModel(entity.model))
|
||||
var text = label.text.replace("SHOPVEHICLE", realName);
|
||||
label.text = text;
|
||||
|
||||
entity.freezePosition(true);
|
||||
}
|
||||
|
||||
|
||||
mp.events.add('ShopVehicle_OpenMenu', (businessName, price, availableOptions: string[]) => {
|
||||
var veh = mp.players.local.vehicle;
|
||||
if (!veh) return;
|
||||
mp.gui.chat.show(false);
|
||||
shopMenu = new Menu("Fahrzeugkauf", "Kaufe ein neues Fahrzeug", new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
globalData.InMenu = true;
|
||||
|
||||
var carItem = new UIMenuItem("Fahrzeugname");
|
||||
carItem.SetRightLabel(mp.game.ui.getLabelText(mp.game.vehicle.getDisplayNameFromVehicleModel(veh.model)));
|
||||
shopMenu.AddItem(carItem);
|
||||
|
||||
var shopItem = new UIMenuItem("Shop");
|
||||
shopItem.SetRightLabel(businessName);
|
||||
shopMenu.AddItem(shopItem);
|
||||
|
||||
var priceItem = new UIMenuItem("Preis");
|
||||
priceItem.SetRightLabel("~g~$~s~ " + moneyFormat(price));
|
||||
shopMenu.AddItem(priceItem);
|
||||
|
||||
var targetsCollection = new ItemsCollection(availableOptions);
|
||||
var targetItem = new UIMenuListItem("Kaufen f<>r", "W<>hle den Besitzer aus", targetsCollection);
|
||||
shopMenu.AddItem(targetItem);
|
||||
|
||||
shopMenu.ListChange.on((item, index) => {
|
||||
if (item == targetItem) {
|
||||
switch (targetItem.SelectedValue) {
|
||||
case 'Spieler':
|
||||
priceItem.SetRightLabel("~g~$~s~ " + moneyFormat(price));
|
||||
break;
|
||||
case 'Fraktion':
|
||||
priceItem.SetRightLabel("~g~$~s~ " + moneyFormat(price * 3));
|
||||
break;
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
var saveItem = new UIMenuItem("Kaufen");
|
||||
saveItem.BackColor = new Color(0, 100, 0);
|
||||
saveItem.HighlightedBackColor = new Color(0, 150, 0);
|
||||
shopMenu.AddItem(saveItem);
|
||||
|
||||
var cancelItem = new UIMenuItem("Abbrechen");
|
||||
cancelItem.BackColor = new Color(213, 0, 0);
|
||||
cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
shopMenu.AddItem(cancelItem);
|
||||
|
||||
shopMenu.ItemSelect.on((item, index) => {
|
||||
if (item === cancelItem) {
|
||||
shopMenu.Close();
|
||||
} else if (item === saveItem) {
|
||||
mp.events.callRemote("VehShop_BuyVehicle", targetItem.SelectedValue);
|
||||
shopMenu.Close();
|
||||
}
|
||||
});
|
||||
|
||||
shopMenu.MenuClose.on(() => {
|
||||
mp.gui.chat.show(true);
|
||||
mp.players.local.taskLeaveVehicle(veh.handle, 0);
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
|
||||
shopMenu.Open();
|
||||
});
|
||||
}
|
||||
154
ReallifeGamemode.Client/Business/main.ts
Normal file
154
ReallifeGamemode.Client/Business/main.ts
Normal file
@@ -0,0 +1,154 @@
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const UIMenuSliderItem = NativeUI.UIMenuSliderItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
const ListItem = NativeUI.ListItem;
|
||||
var screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
|
||||
import InputHelper from '../inputhelper';
|
||||
|
||||
export default function business(globalData: IGlobalData) {
|
||||
|
||||
var keyBound = false;
|
||||
|
||||
var closeMenu = false;
|
||||
|
||||
var mainMenu: NativeUI.Menu;
|
||||
|
||||
var businessData: any;
|
||||
var businessState: number;
|
||||
|
||||
mp.events.add('SERVER:Business_ShowMenuHelp', (bizName, bizMoney) => {
|
||||
/*mp.game.ui.setTextComponentFormat('STRING');
|
||||
mp.game.ui.addTextComponentSubstringPlayerName('Drücke ~INPUT_CONTEXT~, um das Businessmenü zu öffnen');
|
||||
mp.game.ui.displayHelpTextFromStringLabel(0, true, true, -1);
|
||||
*/
|
||||
mp.events.call("renderHelpTextOnScreen", "~s~Drücke ~g~E~s~ um das ~b~Businessmenü ~s~zu öffnen")
|
||||
mp.keys.bind(0x45, false, keyPressHandler);
|
||||
keyBound = true;
|
||||
});
|
||||
|
||||
mp.events.add('SERVER:Business_SetData', (data, state: number) => {
|
||||
businessData = JSON.parse(data);
|
||||
businessState = state;
|
||||
});
|
||||
|
||||
mp.events.add('SERVER:Business_RemoveHelp', (unbind) => {
|
||||
mp.game.ui.clearHelp(true);
|
||||
mp.gui.chat.show(true);
|
||||
|
||||
if (keyBound && unbind) {
|
||||
if (mainMenu) mainMenu.Close();
|
||||
|
||||
mp.keys.unbind(0x45, false, keyPressHandler);
|
||||
keyBound = false;
|
||||
}
|
||||
});
|
||||
|
||||
function keyPressHandler() {
|
||||
mp.events.call('SERVER:Business_RemoveHelp', false);
|
||||
|
||||
if (globalData.InChat || globalData.InInput || globalData.InMenu) return;
|
||||
|
||||
globalData.InMenu = true;
|
||||
|
||||
mainMenu = new Menu("Businessverwaltung", businessData.Name, new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
var bankAccountItem: NativeUI.UIMenuItem;
|
||||
|
||||
var buyItem: NativeUI.UIMenuItem;
|
||||
|
||||
var sellItem: NativeUI.UIMenuItem;
|
||||
|
||||
//var partnerItem = new UIMenuItem("Inteilhaber", "Verwalte den Inteilhaber");
|
||||
//partnerItem.SetRightLabel("Niemand");
|
||||
//mainMenu.AddItem(partnerItem);
|
||||
|
||||
if (businessState == 1) { // Besitzer
|
||||
bankAccountItem = new UIMenuItem("Businesskasse", "Verwalte die Businesskasse");
|
||||
bankAccountItem.SetRightLabel("~s~" + businessData.Balance);
|
||||
mainMenu.AddItem(bankAccountItem);
|
||||
|
||||
var bankMenu = new Menu("Bankkonto", businessData.Name, new Point(0, screenRes.y / 3), null, null);
|
||||
bankMenu.Visible = false;
|
||||
|
||||
var infoItem = new UIMenuItem("Aktueller Kontostand");
|
||||
infoItem.SetRightLabel("~s~" + businessData.Balance);
|
||||
bankMenu.AddItem(infoItem);
|
||||
|
||||
var depositItem = new UIMenuItem("Einzahlen", "Zahle Geld auf die Businesskasse ein");
|
||||
bankMenu.AddItem(depositItem);
|
||||
|
||||
var withdrawItem = new UIMenuItem("Auszahlen", "Zahle Geld von der Businesskasse aus");
|
||||
bankMenu.AddItem(withdrawItem);
|
||||
|
||||
sellItem = new UIMenuItem("Business verkaufen");
|
||||
mainMenu.AddItem(sellItem);
|
||||
|
||||
bankMenu.ItemSelect.on((item, index) => {
|
||||
if (item === depositItem) {
|
||||
globalData.InInput = true;
|
||||
var depositInput = new InputHelper("Wie viel Geld möchtest du auf deine Businesskasse einzahlen?", globalData);
|
||||
depositInput.show();
|
||||
depositInput.getValue((data) => {
|
||||
var amount = parseInt(data);
|
||||
if (isNaN(amount)) {
|
||||
mp.game.graphics.notify('~r~Du musst eine Nummer eingeben!');
|
||||
return;
|
||||
}
|
||||
|
||||
globalData.InInput = false;
|
||||
mp.events.callRemote('Business_DepositMoney', amount);
|
||||
|
||||
mainMenu.Close();
|
||||
});
|
||||
} else if (item === withdrawItem) {
|
||||
globalData.InInput = true;
|
||||
var withdrawInput = new InputHelper("Wie viel Geld möchtest du von deiner Businesskasse abheben?", globalData);
|
||||
withdrawInput.show();
|
||||
withdrawInput.getValue((data) => {
|
||||
var amount = parseInt(data);
|
||||
if (isNaN(amount)) {
|
||||
mp.game.graphics.notify('~r~Du musst eine Nummer eingeben!');
|
||||
return;
|
||||
}
|
||||
globalData.InInput = false;
|
||||
mp.events.callRemote('Business_WithdrawMoney', amount);
|
||||
|
||||
mainMenu.Close();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
mainMenu.BindMenuToItem(bankMenu, bankAccountItem);
|
||||
} else if (businessState == 0) { // Kein Besitzer
|
||||
buyItem = new UIMenuItem("Kaufen", businessData.Price);
|
||||
mainMenu.AddItem(buyItem);
|
||||
} else if (businessState == -1) {
|
||||
mp.game.graphics.notify("Hier gibt es nichts zu sehen");
|
||||
}
|
||||
|
||||
mainMenu.ItemSelect.on((item, index) => {
|
||||
if (item === buyItem) {
|
||||
mainMenu.Close();
|
||||
mp.events.callRemote("CLIENT:Business_BuyBusiness");
|
||||
} else if (item === sellItem) {
|
||||
mainMenu.Close();
|
||||
mp.events.callRemote("CLIENT:Business_SellBusiness");
|
||||
}
|
||||
});
|
||||
|
||||
mainMenu.Open();
|
||||
|
||||
mainMenu.MenuClose.on(() => {
|
||||
mp.events.call('SERVER:Business_RemoveHelp', false);
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
141
ReallifeGamemode.Client/CharCreator/data.ts
Normal file
141
ReallifeGamemode.Client/CharCreator/data.ts
Normal file
@@ -0,0 +1,141 @@
|
||||
const fathers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 42, 43, 44];
|
||||
const mothers = [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 45];
|
||||
const fatherNames = ["Benjamin", "Daniel", "Joshua", "Noah", "Andrew", "Juan", "Alex", "Isaac", "Evan", "Ethan", "Vincent", "Angel", "Diego", "Adrian", "Gabriel", "Michael", "Santiago", "Kevin", "Louis", "Samuel", "Anthony", "Claude", "Niko", "John"];
|
||||
const motherNames = ["Hannah", "Aubrey", "Jasmine", "Gisele", "Amelia", "Isabella", "Zoe", "Ava", "Camila", "Violet", "Sophia", "Evelyn", "Nicole", "Ashley", "Gracie", "Brianna", "Natalie", "Olivia", "Elizabeth", "Charlotte", "Emma", "Misty"];
|
||||
const featureNames = ["Nose Width", "Nose Bottom Height", "Nose Tip Length", "Nose Bridge Depth", "Nose Tip Height", "Nose Broken", "Brow Height", "Brow Depth", "Cheekbone Height", "Cheekbone Width", "Cheek Depth", "Eye Size", "Lip Thickness", "Jaw Width", "Jaw Shape", "Chin Height", "Chin Depth", "Chin Width", "Chin Indent", "Neck Width"];
|
||||
const appearanceNames = ["Blemishes", "Facial Hair", "Eyebrows", "Ageing", "Makeup", "Blush", "Complexion", "Sun Damage", "Lipstick", "Moles & Freckles", "Chest Hair"];
|
||||
|
||||
const appearanceItemNames = [
|
||||
// blemishes
|
||||
["None", "Measles", "Pimples", "Spots", "Break Out", "Blackheads", "Build Up", "Pustules", "Zits", "Full Acne", "Acne", "Cheek Rash", "Face Rash", "Picker", "Puberty", "Eyesore", "Chin Rash", "Two Face", "T Zone", "Greasy", "Marked", "Acne Scarring", "Full Acne Scarring", "Cold Sores", "Impetigo"],
|
||||
// facial hair
|
||||
["None", "Light Stubble", "Balbo", "Circle Beard", "Goatee", "Chin", "Chin Fuzz", "Pencil Chin Strap", "Scruffy", "Musketeer", "Mustache", "Trimmed Beard", "Stubble", "Thin Circle Beard", "Horseshoe", "Pencil and 'Chops", "Chin Strap Beard", "Balbo and Sideburns", "Mutton Chops", "Scruffy Beard", "Curly", "Curly & Deep Stranger", "Handlebar", "Faustic", "Otto & Patch", "Otto & Full Stranger", "Light Franz", "The Hampstead", "The Ambrose", "Lincoln Curtain"],
|
||||
// eyebrows
|
||||
["None", "Balanced", "Fashion", "Cleopatra", "Quizzical", "Femme", "Seductive", "Pinched", "Chola", "Triomphe", "Carefree", "Curvaceous", "Rodent", "Double Tram", "Thin", "Penciled", "Mother Plucker", "Straight and Narrow", "Natural", "Fuzzy", "Unkempt", "Caterpillar", "Regular", "Mediterranean", "Groomed", "Bushels", "Feathered", "Prickly", "Monobrow", "Winged", "Triple Tram", "Arched Tram", "Cutouts", "Fade Away", "Solo Tram"],
|
||||
// ageing
|
||||
["None", "Crow's Feet", "First Signs", "Middle Aged", "Worry Lines", "Depression", "Distinguished", "Aged", "Weathered", "Wrinkled", "Sagging", "Tough Life", "Vintage", "Retired", "Junkie", "Geriatric"],
|
||||
// makeup
|
||||
["None", "Smoky Black", "Bronze", "Soft Gray", "Retro Glam", "Natural Look", "Cat Eyes", "Chola", "Vamp", "Vinewood Glamour", "Bubblegum", "Aqua Dream", "Pin Up", "Purple Passion", "Smoky Cat Eye", "Smoldering Ruby", "Pop Princess"],
|
||||
// blush
|
||||
["None", "Full", "Angled", "Round", "Horizontal", "High", "Sweetheart", "Eighties"],
|
||||
// complexion
|
||||
["None", "Rosy Cheeks", "Stubble Rash", "Hot Flush", "Sunburn", "Bruised", "Alchoholic", "Patchy", "Totem", "Blood Vessels", "Damaged", "Pale", "Ghostly"],
|
||||
// sun damage
|
||||
["None", "Uneven", "Sandpaper", "Patchy", "Rough", "Leathery", "Textured", "Coarse", "Rugged", "Creased", "Cracked", "Gritty"],
|
||||
// lipstick
|
||||
["None", "Color Matte", "Color Gloss", "Lined Matte", "Lined Gloss", "Heavy Lined Matte", "Heavy Lined Gloss", "Lined Nude Matte", "Liner Nude Gloss", "Smudged", "Geisha"],
|
||||
// freckles
|
||||
["None", "Cherub", "All Over", "Irregular", "Dot Dash", "Over the Bridge", "Baby Doll", "Pixie", "Sun Kissed", "Beauty Marks", "Line Up", "Modelesque", "Occasional", "Speckled", "Rain Drops", "Double Dip", "One Sided", "Pairs", "Growth"],
|
||||
// chest hair
|
||||
["None", "Natural", "The Strip", "The Tree", "Hairy", "Grisly", "Ape", "Groomed Ape", "Bikini", "Lightning Bolt", "Reverse Lightning", "Love Heart", "Chestache", "Happy Face", "Skull", "Snail Trail", "Slug and Nips", "Hairy Arms"]
|
||||
];
|
||||
|
||||
const hairList = [
|
||||
// male
|
||||
[
|
||||
{ID: 0, Name: "Close Shave", Collection: "mpbeach_overlays", Overlay: "FM_Hair_Fuzz"},
|
||||
{ID: 1, Name: "Buzzcut", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_001"},
|
||||
{ID: 2, Name: "Faux Hawk", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_002"},
|
||||
{ID: 3, Name: "Hipster", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_003"},
|
||||
{ID: 4, Name: "Side Parting", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_004"},
|
||||
{ID: 5, Name: "Shorter Cut", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_005"},
|
||||
{ID: 6, Name: "Biker", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_006"},
|
||||
{ID: 7, Name: "Ponytail", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_007"},
|
||||
{ID: 8, Name: "Cornrows", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_008"},
|
||||
{ID: 9, Name: "Slicked", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_009"},
|
||||
{ID: 10, Name: "Short Brushed", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_013"},
|
||||
{ID: 11, Name: "Spikey", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_002"},
|
||||
{ID: 12, Name: "Caesar", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_011"},
|
||||
{ID: 13, Name: "Chopped", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_012"},
|
||||
{ID: 14, Name: "Dreads", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_014"},
|
||||
{ID: 15, Name: "Long Hair", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_015"},
|
||||
{ID: 16, Name: "Shaggy Curls", Collection: "multiplayer_overlays", Overlay: "NGBea_M_Hair_000"},
|
||||
{ID: 17, Name: "Surfer Dude", Collection: "multiplayer_overlays", Overlay: "NGBea_M_Hair_001"},
|
||||
{ID: 18, Name: "Short Side Part", Collection: "multiplayer_overlays", Overlay: "NGBus_M_Hair_000"},
|
||||
{ID: 19, Name: "High Slicked Sides", Collection: "multiplayer_overlays", Overlay: "NGBus_M_Hair_001"},
|
||||
{ID: 20, Name: "Long Slicked", Collection: "multiplayer_overlays", Overlay: "NGHip_M_Hair_000"},
|
||||
{ID: 21, Name: "Hipster Youth", Collection: "multiplayer_overlays", Overlay: "NGHip_M_Hair_001"},
|
||||
{ID: 22, Name: "Mullet", Collection: "multiplayer_overlays", Overlay: "NGInd_M_Hair_000"},
|
||||
{ID: 24, Name: "Classic Cornrows", Collection: "mplowrider_overlays", Overlay: "LR_M_Hair_000"},
|
||||
{ID: 25, Name: "Palm Cornrows", Collection: "mplowrider_overlays", Overlay: "LR_M_Hair_001"},
|
||||
{ID: 26, Name: "Lightning Cornrows", Collection: "mplowrider_overlays", Overlay: "LR_M_Hair_002"},
|
||||
{ID: 27, Name: "Whipped Cornrows", Collection: "mplowrider_overlays", Overlay: "LR_M_Hair_003"},
|
||||
{ID: 28, Name: "Zig Zag Cornrows", Collection: "mplowrider2_overlays", Overlay: "LR_M_Hair_004"},
|
||||
{ID: 29, Name: "Snail Cornrows", Collection: "mplowrider2_overlays", Overlay: "LR_M_Hair_005"},
|
||||
{ID: 30, Name: "Hightop", Collection: "mplowrider2_overlays", Overlay: "LR_M_Hair_006"},
|
||||
{ID: 31, Name: "Loose Swept Back", Collection: "mpbiker_overlays", Overlay: "MP_Biker_Hair_000_M"},
|
||||
{ID: 32, Name: "Undercut Swept Back", Collection: "mpbiker_overlays", Overlay: "MP_Biker_Hair_001_M"},
|
||||
{ID: 33, Name: "Undercut Swept Side", Collection: "mpbiker_overlays", Overlay: "MP_Biker_Hair_002_M"},
|
||||
{ID: 34, Name: "Spiked Mohawk", Collection: "mpbiker_overlays", Overlay: "MP_Biker_Hair_003_M"},
|
||||
{ID: 35, Name: "Mod", Collection: "mpbiker_overlays", Overlay: "MP_Biker_Hair_004_M"},
|
||||
{ID: 36, Name: "Layered Mod", Collection: "mpbiker_overlays", Overlay: "MP_Biker_Hair_005_M"},
|
||||
{ID: 72, Name: "Flattop", Collection: "mpgunrunning_overlays", Overlay: "MP_Gunrunning_Hair_M_000_M"},
|
||||
{ID: 73, Name: "Military Buzzcut", Collection: "mpgunrunning_overlays", Overlay: "MP_Gunrunning_Hair_M_001_M"}
|
||||
],
|
||||
// female
|
||||
[
|
||||
{ID: 0, Name: "Close Shave", Collection: "mpbeach_overlays", Overlay: "FM_Hair_Fuzz"},
|
||||
{ID: 1, Name: "Short", Collection: "multiplayer_overlays", Overlay: "NG_F_Hair_001"},
|
||||
{ID: 2, Name: "Layered Bob", Collection: "multiplayer_overlays", Overlay: "NG_F_Hair_002"},
|
||||
{ID: 3, Name: "Pigtails", Collection: "multiplayer_overlays", Overlay: "NG_F_Hair_003"},
|
||||
{ID: 4, Name: "Ponytail", Collection: "multiplayer_overlays", Overlay: "NG_F_Hair_004"},
|
||||
{ID: 5, Name: "Braided Mohawk", Collection: "multiplayer_overlays", Overlay: "NG_F_Hair_005"},
|
||||
{ID: 6, Name: "Braids", Collection: "multiplayer_overlays", Overlay: "NG_F_Hair_006"},
|
||||
{ID: 7, Name: "Bob", Collection: "multiplayer_overlays", Overlay: "NG_F_Hair_007"},
|
||||
{ID: 8, Name: "Faux Hawk", Collection: "multiplayer_overlays", Overlay: "NG_F_Hair_008"},
|
||||
{ID: 9, Name: "French Twist", Collection: "multiplayer_overlays", Overlay: "NG_F_Hair_009"},
|
||||
{ID: 10, Name: "Long Bob", Collection: "multiplayer_overlays", Overlay: "NG_F_Hair_010"},
|
||||
{ID: 11, Name: "Loose Tied", Collection: "multiplayer_overlays", Overlay: "NG_F_Hair_011"},
|
||||
{ID: 12, Name: "Pixie", Collection: "multiplayer_overlays", Overlay: "NG_F_Hair_012"},
|
||||
{ID: 13, Name: "Shaved Bangs", Collection: "multiplayer_overlays", Overlay: "NG_F_Hair_013"},
|
||||
{ID: 14, Name: "Top Knot", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_014"},
|
||||
{ID: 15, Name: "Wavy Bob", Collection: "multiplayer_overlays", Overlay: "NG_M_Hair_015"},
|
||||
{ID: 16, Name: "Messy Bun", Collection: "multiplayer_overlays", Overlay: "NGBea_F_Hair_000"},
|
||||
{ID: 17, Name: "Pin Up Girl", Collection: "multiplayer_overlays", Overlay: "NGBea_F_Hair_001"},
|
||||
{ID: 18, Name: "Tight Bun", Collection: "multiplayer_overlays", Overlay: "NG_F_Hair_007"},
|
||||
{ID: 19, Name: "Twisted Bob", Collection: "multiplayer_overlays", Overlay: "NGBus_F_Hair_000"},
|
||||
{ID: 20, Name: "Flapper Bob", Collection: "multiplayer_overlays", Overlay: "NGBus_F_Hair_001"},
|
||||
{ID: 21, Name: "Big Bangs", Collection: "multiplayer_overlays", Overlay: "NGBea_F_Hair_001"},
|
||||
{ID: 22, Name: "Braided Top Knot", Collection: "multiplayer_overlays", Overlay: "NGHip_F_Hair_000"},
|
||||
{ID: 23, Name: "Mullet", Collection: "multiplayer_overlays", Overlay: "NGInd_F_Hair_000"},
|
||||
{ID: 25, Name: "Pinched Cornrows", Collection: "mplowrider_overlays", Overlay: "LR_F_Hair_000"},
|
||||
{ID: 26, Name: "Leaf Cornrows", Collection: "mplowrider_overlays", Overlay: "LR_F_Hair_001"},
|
||||
{ID: 27, Name: "Zig Zag Cornrows", Collection: "mplowrider_overlays", Overlay: "LR_F_Hair_002"},
|
||||
{ID: 28, Name: "Pigtail Bangs", Collection: "mplowrider2_overlays", Overlay: "LR_F_Hair_003"},
|
||||
{ID: 29, Name: "Wave Braids", Collection: "mplowrider2_overlays", Overlay: "LR_F_Hair_003"},
|
||||
{ID: 30, Name: "Coil Braids", Collection: "mplowrider2_overlays", Overlay: "LR_F_Hair_004"},
|
||||
{ID: 31, Name: "Rolled Quiff", Collection: "mplowrider2_overlays", Overlay: "LR_F_Hair_006"},
|
||||
{ID: 32, Name: "Loose Swept Back", Collection: "mpbiker_overlays", Overlay: "MP_Biker_Hair_000_F"},
|
||||
{ID: 33, Name: "Undercut Swept Back", Collection: "mpbiker_overlays", Overlay: "MP_Biker_Hair_001_F"},
|
||||
{ID: 34, Name: "Undercut Swept Side", Collection: "mpbiker_overlays", Overlay: "MP_Biker_Hair_002_F"},
|
||||
{ID: 35, Name: "Spiked Mohawk", Collection: "mpbiker_overlays", Overlay: "MP_Biker_Hair_003_F"},
|
||||
{ID: 36, Name: "Bandana and Braid", Collection: "multiplayer_overlays", Overlay: "NG_F_Hair_003"},
|
||||
{ID: 37, Name: "Layered Mod", Collection: "mpbiker_overlays", Overlay: "MP_Biker_Hair_006_F"},
|
||||
{ID: 38, Name: "Skinbyrd", Collection: "mpbiker_overlays", Overlay: "MP_Biker_Hair_004_F"},
|
||||
{ID: 76, Name: "Neat Bun", Collection: "mpgunrunning_overlays", Overlay: "MP_Gunrunning_Hair_F_000_F"},
|
||||
{ID: 77, Name: "Short Bob", Collection: "mpgunrunning_overlays", Overlay: "MP_Gunrunning_Hair_F_001_F"}
|
||||
]
|
||||
];
|
||||
|
||||
const eyeColors = ["Green", "Emerald", "Light Blue", "Ocean Blue", "Light Brown", "Dark Brown", "Hazel", "Dark Gray", "Light Gray", "Pink", "Yellow", "Purple", "Blackout", "Shades of Gray", "Tequila Sunrise", "Atomic", "Warp", "ECola", "Space Ranger", "Ying Yang", "Bullseye", "Lizard", "Dragon", "Extra Terrestrial", "Goat", "Smiley", "Possessed", "Demon", "Infected", "Alien", "Undead", "Zombie"];
|
||||
|
||||
const maxHairColor = 64;
|
||||
const maxEyeColor = 32;
|
||||
const maxBlushColor = 27;
|
||||
const maxLipstickColor = 32;
|
||||
|
||||
export {
|
||||
fathers,
|
||||
mothers,
|
||||
fatherNames,
|
||||
motherNames,
|
||||
featureNames,
|
||||
appearanceNames,
|
||||
appearanceItemNames,
|
||||
hairList,
|
||||
eyeColors,
|
||||
maxHairColor,
|
||||
maxEyeColor,
|
||||
maxBlushColor,
|
||||
maxLipstickColor
|
||||
};
|
||||
576
ReallifeGamemode.Client/CharCreator/main.ts
Normal file
576
ReallifeGamemode.Client/CharCreator/main.ts
Normal file
@@ -0,0 +1,576 @@
|
||||
// shitcode will be better in the future
|
||||
// , \u00dc, \u00fc
|
||||
// , \u00c4, \u00e4
|
||||
// , \u00d6, \u00f6
|
||||
// \u00df
|
||||
|
||||
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
import * as Data from './data';
|
||||
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
var screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
|
||||
const creatorCoords = {
|
||||
camera: new mp.Vector3(402.8664, -997.5515, -98.5),
|
||||
cameraLookAt: new mp.Vector3(402.8664, -996.4108, -98.5)
|
||||
};
|
||||
|
||||
const localPlayer = mp.players.local;
|
||||
|
||||
export default function charCreator(globalData: IGlobalData) {
|
||||
|
||||
var creatorHairMenu;
|
||||
|
||||
function getRandomInt(min, max) {
|
||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||||
}
|
||||
|
||||
function colorForOverlayIdx(index) {
|
||||
let color;
|
||||
|
||||
switch (index) {
|
||||
case 1:
|
||||
color = beardColorItem.Index;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
color = eyebrowColorItem.Index;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
color = blushColorItem.Index;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
color = lipstickColorItem.Index;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
color = chestHairColorItem.Index;
|
||||
break;
|
||||
|
||||
default:
|
||||
color = 0;
|
||||
}
|
||||
|
||||
return color;
|
||||
}
|
||||
|
||||
function updateParents() {
|
||||
localPlayer.setHeadBlendData(
|
||||
// shape
|
||||
Data.mothers[motherItem.Index],
|
||||
Data.fathers[fatherItem.Index],
|
||||
0,
|
||||
|
||||
// skin
|
||||
Data.mothers[motherItem.Index],
|
||||
Data.fathers[fatherItem.Index],
|
||||
0,
|
||||
|
||||
// mixes
|
||||
similarityItem.Index * 0.01,
|
||||
skinSimilarityItem.Index * 0.01,
|
||||
0.0,
|
||||
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
function updateFaceFeature(index) {
|
||||
localPlayer.setFaceFeature(index, parseFloat(featureItems[index].SelectedValue));
|
||||
}
|
||||
|
||||
function updateAppearance(index) {
|
||||
let overlayID = (appearanceItems[index].Index === 0) ? 255 : appearanceItems[index].Index - 1;
|
||||
localPlayer.setHeadOverlay(index, overlayID, appearanceOpacityItems[index].Index * 0.01, colorForOverlayIdx(index), 0);
|
||||
}
|
||||
|
||||
function updateHairAndColors() {
|
||||
localPlayer.setComponentVariation(2, Data.hairList[currentGender][hairItem.Index].ID, 0, 2);
|
||||
localPlayer.setHairColor(hairColorItem.Index, hairHighlightItem.Index);
|
||||
localPlayer.setEyeColor(eyeColorItem.Index);
|
||||
localPlayer.setHeadOverlayColor(1, 1, beardColorItem.Index, 0);
|
||||
localPlayer.setHeadOverlayColor(2, 1, eyebrowColorItem.Index, 0);
|
||||
localPlayer.setHeadOverlayColor(5, 2, blushColorItem.Index, 0);
|
||||
localPlayer.setHeadOverlayColor(8, 2, lipstickColorItem.Index, 0);
|
||||
localPlayer.setHeadOverlayColor(10, 1, chestHairColorItem.Index, 0);
|
||||
}
|
||||
|
||||
function applyCreatorOutfit() {
|
||||
if (currentGender === 0) {
|
||||
localPlayer.setDefaultComponentVariation();
|
||||
localPlayer.setComponentVariation(3, 15, 0, 2);
|
||||
localPlayer.setComponentVariation(4, 21, 0, 2);
|
||||
localPlayer.setComponentVariation(6, 34, 0, 2);
|
||||
localPlayer.setComponentVariation(8, 15, 0, 2);
|
||||
localPlayer.setComponentVariation(11, 15, 0, 2);
|
||||
} else {
|
||||
localPlayer.setDefaultComponentVariation();
|
||||
localPlayer.setComponentVariation(3, 15, 0, 2);
|
||||
localPlayer.setComponentVariation(4, 10, 0, 2);
|
||||
localPlayer.setComponentVariation(6, 35, 0, 2);
|
||||
localPlayer.setComponentVariation(8, 15, 0, 2);
|
||||
localPlayer.setComponentVariation(11, 15, 0, 2);
|
||||
}
|
||||
}
|
||||
|
||||
function fillHairMenu() {
|
||||
hairItem = new UIMenuListItem("Haar", "Deine Haare", new ItemsCollection(Data.hairList[currentGender].map(h => h.Name)));
|
||||
creatorHairMenu.AddItem(hairItem);
|
||||
|
||||
hairColorItem = new UIMenuListItem("Haarfarbe", "Deine Haarfarbe", new ItemsCollection(hairColors));
|
||||
creatorHairMenu.AddItem(hairColorItem);
|
||||
|
||||
hairHighlightItem = new UIMenuListItem("Haarstr\u00e4hnen", "Farbe deiner Haarstr\u00e4hnen", new ItemsCollection(hairColors));
|
||||
creatorHairMenu.AddItem(hairHighlightItem);
|
||||
|
||||
eyebrowColorItem = new UIMenuListItem("Augenbrauen Farbe", "Farbe deiner Augenbrauen", new ItemsCollection(hairColors));
|
||||
creatorHairMenu.AddItem(eyebrowColorItem);
|
||||
|
||||
beardColorItem = new UIMenuListItem("Farbe der Gesichtsbehaarung", "Farbe deiner Gesichtsbehaarung", new ItemsCollection(hairColors));
|
||||
creatorHairMenu.AddItem(beardColorItem);
|
||||
|
||||
eyeColorItem = new UIMenuListItem("Augenfarbe", "Farbe deiner Augen", new ItemsCollection(Data.eyeColors));
|
||||
creatorHairMenu.AddItem(eyeColorItem);
|
||||
|
||||
blushColorItem = new UIMenuListItem("Rouge", "Farbe des Rouges.", new ItemsCollection(blushColors));
|
||||
creatorHairMenu.AddItem(blushColorItem);
|
||||
|
||||
lipstickColorItem = new UIMenuListItem("Lippenstift Farbe", "Farbe deines Lippenstifts.", new ItemsCollection(lipstickColors));
|
||||
creatorHairMenu.AddItem(lipstickColorItem);
|
||||
|
||||
chestHairColorItem = new UIMenuListItem("Farbe der Brustbehaarung", "Farbe deiner Brustbehaarung", new ItemsCollection(hairColors));
|
||||
creatorHairMenu.AddItem(chestHairColorItem);
|
||||
|
||||
creatorHairMenu.AddItem(new UIMenuItem("Zuf\u00e4llig", "~r~Zuf\u00e4lliges Haar & Farben"));
|
||||
creatorHairMenu.AddItem(new UIMenuItem("Zur\u00fccksetzen", "~r~Zur\u00fccksetzen von Haar & Farben"));
|
||||
}
|
||||
|
||||
function resetParentsMenu(refresh = false) {
|
||||
fatherItem.Index = 0;
|
||||
motherItem.Index = 0;
|
||||
similarityItem.Index = (currentGender === 0) ? 100 : 0;
|
||||
skinSimilarityItem.Index = (currentGender === 0) ? 100 : 0;
|
||||
|
||||
updateParents();
|
||||
if (refresh) creatorParentsMenu.RefreshIndex();
|
||||
}
|
||||
|
||||
function resetFeaturesMenu(refresh = false) {
|
||||
for (let i = 0; i < Data.featureNames.length; i++) {
|
||||
featureItems[i].Index = 100;
|
||||
updateFaceFeature(i);
|
||||
}
|
||||
|
||||
if (refresh) creatorFeaturesMenu.RefreshIndex();
|
||||
}
|
||||
|
||||
function resetAppearanceMenu(refresh = false) {
|
||||
for (let i = 0; i < Data.appearanceNames.length; i++) {
|
||||
appearanceItems[i].Index = 0;
|
||||
appearanceOpacityItems[i].Index = 100;
|
||||
updateAppearance(i);
|
||||
}
|
||||
|
||||
if (refresh) creatorAppearanceMenu.RefreshIndex();
|
||||
}
|
||||
|
||||
function resetHairAndColorsMenu(refresh = false) {
|
||||
hairItem.Index = 0;
|
||||
hairColorItem.Index = 0;
|
||||
hairHighlightItem.Index = 0;
|
||||
eyebrowColorItem.Index = 0;
|
||||
beardColorItem.Index = 0;
|
||||
eyeColorItem.Index = 0;
|
||||
blushColorItem.Index = 0;
|
||||
lipstickColorItem.Index = 0;
|
||||
chestHairColorItem.Index = 0;
|
||||
updateHairAndColors();
|
||||
|
||||
if (refresh) creatorHairMenu.RefreshIndex();
|
||||
}
|
||||
|
||||
let currentGender = 0;
|
||||
let creatorMenus: NativeUI.Menu[] = [];
|
||||
let creatorCamera: CameraMp;
|
||||
|
||||
// color arrays
|
||||
let hairColors = [];
|
||||
for (let i = 0; i < Data.maxHairColor; i++) hairColors.push(i.toString());
|
||||
|
||||
let blushColors = [];
|
||||
for (let i = 0; i < Data.maxBlushColor; i++) blushColors.push(i.toString());
|
||||
|
||||
let lipstickColors = [];
|
||||
for (let i = 0; i < Data.maxLipstickColor; i++) lipstickColors.push(i.toString());
|
||||
|
||||
// CREATOR MAIN
|
||||
let creatorMainMenu = new Menu("Charaktererstellung", "", new Point(0, screenRes.y / 3), null, null);
|
||||
let genderItem = new UIMenuListItem("Geschlecht", "~r~Dies setzt deine Einstellungen zur\u00fcck.", new ItemsCollection(["M\u00e4nnlich", "Weiblich"]));
|
||||
creatorMainMenu.AddItem(genderItem);
|
||||
creatorMainMenu.AddItem(new UIMenuItem("Eltern", "Eltern des Charakters."));
|
||||
creatorMainMenu.AddItem(new UIMenuItem("Gesichtsz\u00fcge", "Gesichtsz\u00fcge des Charakters."));
|
||||
creatorMainMenu.AddItem(new UIMenuItem("Aussehen", "Aussehen des Charakters."));
|
||||
creatorMainMenu.AddItem(new UIMenuItem("Haar & Farben", "Haare & Farben deines Charakters."));
|
||||
|
||||
let angles = [];
|
||||
for (let i = -180.0; i <= 180.0; i += 5.0) angles.push(i.toFixed(1));
|
||||
let angleItem = new UIMenuListItem("Drehung", "", new ItemsCollection(angles));
|
||||
creatorMainMenu.AddItem(angleItem);
|
||||
|
||||
let saveItem = new UIMenuItem("Erstellen", "Erstellt deinen Charakter.");
|
||||
saveItem.BackColor = new Color(13, 71, 161);
|
||||
saveItem.HighlightedBackColor = new Color(25, 118, 210);
|
||||
creatorMainMenu.AddItem(saveItem);
|
||||
|
||||
//let cancelItem = new UIMenuItem("Abbrechen", "Setzt alle \u00c4nderungen zur\u00fcck.");
|
||||
//cancelItem.BackColor = new Color(213, 0, 0);
|
||||
//cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
//creatorMainMenu.AddItem(cancelItem);
|
||||
|
||||
creatorMainMenu.ListChange.on((item, listIndex) => {
|
||||
if (item === genderItem) {
|
||||
currentGender = listIndex;
|
||||
mp.events.callRemote("creator_GenderChange", listIndex);
|
||||
|
||||
setTimeout(() => {
|
||||
localPlayer.clearTasksImmediately();
|
||||
applyCreatorOutfit();
|
||||
angleItem.Index = 0;
|
||||
resetParentsMenu(true);
|
||||
resetFeaturesMenu(true);
|
||||
resetAppearanceMenu(true);
|
||||
|
||||
creatorHairMenu.Clear();
|
||||
fillHairMenu();
|
||||
creatorHairMenu.RefreshIndex();
|
||||
}, 200);
|
||||
} else if (item === angleItem) {
|
||||
localPlayer.setHeading(parseFloat(angleItem.SelectedValue));
|
||||
localPlayer.clearTasksImmediately();
|
||||
}
|
||||
});
|
||||
|
||||
creatorMainMenu.ItemSelect.on((item, index) => {
|
||||
switch (index) {
|
||||
case 1:
|
||||
creatorMainMenu.Visible = false;
|
||||
creatorParentsMenu.Visible = true;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
creatorMainMenu.Visible = false;
|
||||
creatorFeaturesMenu.Visible = true;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
creatorMainMenu.Visible = false;
|
||||
creatorAppearanceMenu.Visible = true;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
creatorMainMenu.Visible = false;
|
||||
creatorHairMenu.Visible = true;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
let parentData = {
|
||||
Father: Data.fathers[fatherItem.Index],
|
||||
Mother: Data.mothers[motherItem.Index],
|
||||
Similarity: similarityItem.Index * 0.01,
|
||||
SkinSimilarity: skinSimilarityItem.Index * 0.01
|
||||
};
|
||||
|
||||
let featureData = [];
|
||||
for (let i = 0; i < featureItems.length; i++) featureData.push(parseFloat(featureItems[i].SelectedValue));
|
||||
|
||||
let appearanceData = [];
|
||||
for (let i = 0; i < appearanceItems.length; i++) appearanceData.push({ Value: ((appearanceItems[i].Index === 0) ? 255 : appearanceItems[i].Index - 1), Opacity: appearanceOpacityItems[i].Index * 0.01 });
|
||||
|
||||
let hairAndColors = [
|
||||
Data.hairList[currentGender][hairItem.Index].ID,
|
||||
hairColorItem.Index,
|
||||
hairHighlightItem.Index,
|
||||
eyebrowColorItem.Index,
|
||||
beardColorItem.Index,
|
||||
eyeColorItem.Index,
|
||||
blushColorItem.Index,
|
||||
lipstickColorItem.Index,
|
||||
chestHairColorItem.Index
|
||||
];
|
||||
for (let i = 0; i < creatorMenus.length; i++) creatorMenus[i].Visible = false;
|
||||
mp.gui.chat.show(true);
|
||||
mp.game.ui.displayRadar(true);
|
||||
mp.game.ui.displayHud(true);
|
||||
localPlayer.freezePosition(false);
|
||||
localPlayer.setDefaultComponentVariation();
|
||||
localPlayer.setComponentVariation(2, Data.hairList[currentGender][hairItem.Index].ID, 0, 2);
|
||||
mp.game.cam.renderScriptCams(false, false, 0, true, false);
|
||||
mp.events.callRemote("creatorSave", currentGender, JSON.stringify(parentData), JSON.stringify(featureData), JSON.stringify(appearanceData), JSON.stringify(hairAndColors));
|
||||
break;
|
||||
|
||||
case 7:
|
||||
mp.events.callRemote("creator_Leave");
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
creatorMainMenu.MenuClose.on(() => {
|
||||
mp.events.callRemote("creator_Leave");
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
|
||||
creatorMainMenu.Visible = false;
|
||||
creatorMenus.push(creatorMainMenu);
|
||||
// CREATOR MAIN END
|
||||
|
||||
// CREATOR PARENTS
|
||||
let similarities = [];
|
||||
for (let i = 0; i <= 100; i++) similarities.push(i + "%");
|
||||
|
||||
let creatorParentsMenu = new Menu("Eltern", "", new Point(0, screenRes.y / 3), null, null);
|
||||
let fatherItem = new UIMenuListItem("Vater", "Dem Charakter sein Vadda.", new ItemsCollection(Data.fatherNames));
|
||||
let motherItem = new UIMenuListItem("Mutter", "Dem Charakter seine Mudda.", new ItemsCollection(Data.motherNames));
|
||||
let similarityItem = new UIMenuListItem("\u00c4hnlichkeit", "\u00c4hnlichkeit zu den Eltern.\n(niedriger = feminin, h\u00f6her = maskulin)", new ItemsCollection(similarities));
|
||||
let skinSimilarityItem = new UIMenuListItem("Hautfarbe", "Hautfarben \u00c4hnlichkeit zu den Eltern.\n(niedriger = Mutter, h\u00f6her = Vater)", new ItemsCollection(similarities));
|
||||
creatorParentsMenu.AddItem(fatherItem);
|
||||
creatorParentsMenu.AddItem(motherItem);
|
||||
creatorParentsMenu.AddItem(similarityItem);
|
||||
creatorParentsMenu.AddItem(skinSimilarityItem);
|
||||
creatorParentsMenu.AddItem(new UIMenuItem("Zuf\u00e4llig", "~r~Zuf\u00e4llige Eltern."));
|
||||
creatorParentsMenu.AddItem(new UIMenuItem("Zur\u00fccksetzen", "~r~Setzt die Eltern zur\u00fcck. :'("));
|
||||
|
||||
creatorParentsMenu.ItemSelect.on((item, index) => {
|
||||
switch (item.Text) {
|
||||
case "Zuf\u00e4llig":
|
||||
fatherItem.Index = getRandomInt(0, Data.fathers.length - 1);
|
||||
motherItem.Index = getRandomInt(0, Data.mothers.length - 1);
|
||||
similarityItem.Index = getRandomInt(0, 100);
|
||||
skinSimilarityItem.Index = getRandomInt(0, 100);
|
||||
updateParents();
|
||||
break;
|
||||
|
||||
case "Zur\u00fccksetzen":
|
||||
resetParentsMenu();
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
creatorParentsMenu.ListChange.on((item, listIndex) => {
|
||||
updateParents();
|
||||
});
|
||||
|
||||
creatorParentsMenu.ParentMenu = creatorMainMenu;
|
||||
creatorParentsMenu.Visible = false;
|
||||
creatorMenus.push(creatorParentsMenu);
|
||||
// CREATOR PARENTS END
|
||||
|
||||
// CREATOR FEATURES
|
||||
let featureItems = [];
|
||||
let features = [];
|
||||
for (let i = -1.0; i <= 1.01; i += 0.01) features.push(i.toFixed(2));
|
||||
|
||||
let creatorFeaturesMenu = new Menu("Gesichtsz\u00fcge", "", new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
for (let i = 0; i < Data.featureNames.length; i++) {
|
||||
let tempFeatureItem = new UIMenuListItem(Data.featureNames[i], "", new ItemsCollection(features));
|
||||
tempFeatureItem.Index = 100;
|
||||
featureItems.push(tempFeatureItem);
|
||||
creatorFeaturesMenu.AddItem(tempFeatureItem);
|
||||
}
|
||||
|
||||
creatorFeaturesMenu.AddItem(new UIMenuItem("Zuf\u00e4llig", "~r~Zuf\u00e4llige Gesichtsz\u00fcge."));
|
||||
creatorFeaturesMenu.AddItem(new UIMenuItem("Zur\u00fccksetzen", "~r~Setzt Gesichtsz\u00fcge zur\u00fcck."));
|
||||
|
||||
creatorFeaturesMenu.ItemSelect.on((item, index) => {
|
||||
switch (item.Text) {
|
||||
case "Zuf\u00e4llig":
|
||||
for (let i = 0; i < Data.featureNames.length; i++) {
|
||||
featureItems[i].Index = getRandomInt(0, 200);
|
||||
updateFaceFeature(i);
|
||||
}
|
||||
break;
|
||||
|
||||
case "Zur\u00fccksetzen":
|
||||
resetFeaturesMenu();
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
creatorFeaturesMenu.ListChange.on((item, listIndex) => {
|
||||
updateFaceFeature(featureItems.indexOf(item));
|
||||
});
|
||||
|
||||
creatorFeaturesMenu.ParentMenu = creatorMainMenu;
|
||||
creatorFeaturesMenu.Visible = false;
|
||||
creatorMenus.push(creatorFeaturesMenu);
|
||||
// CREATOR FEATURES END
|
||||
|
||||
// CREATOR APPEARANCE
|
||||
let appearanceItems = [];
|
||||
let appearanceOpacityItems = [];
|
||||
let opacities = [];
|
||||
for (let i = 0; i <= 100; i++) opacities.push(i + "%");
|
||||
|
||||
let creatorAppearanceMenu = new Menu("Aussehen", "", new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
for (let i = 0; i < Data.appearanceNames.length; i++) {
|
||||
let items = [];
|
||||
for (let j = 0, max = mp.game.ped.getNumHeadOverlayValues(i); j <= max; j++) items.push(Data.appearanceItemNames[i][j] === undefined ? j.toString() : Data.appearanceItemNames[i][j]);
|
||||
|
||||
let tempAppearanceItem = new UIMenuListItem(Data.appearanceNames[i], "", new ItemsCollection(items));
|
||||
appearanceItems.push(tempAppearanceItem);
|
||||
creatorAppearanceMenu.AddItem(tempAppearanceItem);
|
||||
|
||||
let tempAppearanceOpacityItem = new UIMenuListItem(Data.appearanceNames[i] + " Transparenz", "", new ItemsCollection(opacities));
|
||||
tempAppearanceOpacityItem.Index = 100;
|
||||
appearanceOpacityItems.push(tempAppearanceOpacityItem);
|
||||
creatorAppearanceMenu.AddItem(tempAppearanceOpacityItem);
|
||||
}
|
||||
|
||||
creatorAppearanceMenu.AddItem(new UIMenuItem("Zuf\u00e4llig", "~r~Zuf\u00e4lliges Aussehen."));
|
||||
creatorAppearanceMenu.AddItem(new UIMenuItem("Zur\u00fccksetzen", "~r~Setzt das Aussehen zur\u00fcck."));
|
||||
|
||||
creatorAppearanceMenu.ItemSelect.on((item, index) => {
|
||||
switch (item.Text) {
|
||||
case "Zuf\u00e4llig":
|
||||
for (let i = 0; i < Data.appearanceNames.length; i++) {
|
||||
appearanceItems[i].Index = getRandomInt(0, mp.game.ped.getNumHeadOverlayValues(i) - 1);
|
||||
appearanceOpacityItems[i].Index = getRandomInt(0, 100);
|
||||
updateAppearance(i);
|
||||
}
|
||||
break;
|
||||
|
||||
case "Zur\u00fccksetzen":
|
||||
resetAppearanceMenu();
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
creatorAppearanceMenu.ListChange.on((item, listIndex) => {
|
||||
let idx = (creatorAppearanceMenu.CurrentSelection % 2 === 0) ? (creatorAppearanceMenu.CurrentSelection / 2) : Math.floor(creatorAppearanceMenu.CurrentSelection / 2);
|
||||
updateAppearance(idx);
|
||||
});
|
||||
|
||||
creatorAppearanceMenu.ParentMenu = creatorMainMenu;
|
||||
creatorAppearanceMenu.Visible = false;
|
||||
creatorMenus.push(creatorAppearanceMenu);
|
||||
// CREATOR APPEARANCE END
|
||||
|
||||
// CREATOR HAIR & COLORS
|
||||
let hairItem;
|
||||
let hairColorItem;
|
||||
let hairHighlightItem;
|
||||
let eyebrowColorItem;
|
||||
let beardColorItem;
|
||||
let eyeColorItem;
|
||||
let blushColorItem;
|
||||
let lipstickColorItem;
|
||||
let chestHairColorItem;
|
||||
|
||||
creatorHairMenu = new Menu("Haar & Farben", "", new Point(0, screenRes.y / 3), null, null);
|
||||
fillHairMenu();
|
||||
|
||||
creatorHairMenu.ItemSelect.on((item, index) => {
|
||||
switch (item.Text) {
|
||||
case "Zuf\u00e4llig":
|
||||
hairItem.Index = getRandomInt(0, Data.hairList[currentGender].length - 1);
|
||||
hairColorItem.Index = getRandomInt(0, Data.maxHairColor);
|
||||
hairHighlightItem.Index = getRandomInt(0, Data.maxHairColor);
|
||||
eyebrowColorItem.Index = getRandomInt(0, Data.maxHairColor);
|
||||
beardColorItem.Index = getRandomInt(0, Data.maxHairColor);
|
||||
eyeColorItem.Index = getRandomInt(0, Data.maxEyeColor);
|
||||
blushColorItem.Index = getRandomInt(0, Data.maxBlushColor);
|
||||
lipstickColorItem.Index = getRandomInt(0, Data.maxLipstickColor);
|
||||
chestHairColorItem.Index = getRandomInt(0, Data.maxHairColor);
|
||||
updateHairAndColors();
|
||||
break;
|
||||
|
||||
case "Zur\u00fccksetzen":
|
||||
resetHairAndColorsMenu();
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
creatorHairMenu.ListChange.on((item, listIndex) => {
|
||||
if (item === hairItem) {
|
||||
let hairStyle = Data.hairList[currentGender][listIndex];
|
||||
localPlayer.setComponentVariation(2, hairStyle.ID, 0, 2);
|
||||
} else {
|
||||
switch (creatorHairMenu.CurrentSelection) {
|
||||
case 1: // hair color
|
||||
localPlayer.setHairColor(listIndex, hairHighlightItem.Index);
|
||||
break;
|
||||
|
||||
case 2: // hair highlight color
|
||||
localPlayer.setHairColor(hairColorItem.Index, listIndex);
|
||||
break;
|
||||
|
||||
case 3: // eyebrow color
|
||||
localPlayer.setHeadOverlayColor(2, 1, listIndex, 0);
|
||||
break;
|
||||
|
||||
case 4: // facial hair color
|
||||
localPlayer.setHeadOverlayColor(1, 1, listIndex, 0);
|
||||
break;
|
||||
|
||||
case 5: // eye color
|
||||
localPlayer.setEyeColor(listIndex);
|
||||
break;
|
||||
|
||||
case 6: // blush color
|
||||
localPlayer.setHeadOverlayColor(5, 2, listIndex, 0);
|
||||
break;
|
||||
|
||||
case 7: // lipstick color
|
||||
localPlayer.setHeadOverlayColor(8, 2, listIndex, 0);
|
||||
break;
|
||||
|
||||
case 8: // chest hair color
|
||||
localPlayer.setHeadOverlayColor(10, 1, listIndex, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
creatorHairMenu.ParentMenu = creatorMainMenu;
|
||||
creatorHairMenu.Visible = false;
|
||||
creatorMenus.push(creatorHairMenu);
|
||||
// CREATOR HAIR & COLORS END
|
||||
|
||||
// EVENTS
|
||||
mp.events.add("toggleCreator", () => {
|
||||
if (creatorCamera === undefined) {
|
||||
creatorCamera = mp.cameras.new("creatorCamera", creatorCoords.camera, new mp.Vector3(0, 0, 0), 45);
|
||||
creatorCamera.pointAtCoord(creatorCoords.cameraLookAt.x, creatorCoords.cameraLookAt.y, creatorCoords.cameraLookAt.z);
|
||||
creatorCamera.setActive(true);
|
||||
|
||||
globalData.InMenu = true;
|
||||
|
||||
creatorMainMenu.Visible = true;
|
||||
mp.gui.chat.show(false);
|
||||
mp.game.ui.displayRadar(false);
|
||||
mp.game.ui.displayHud(false);
|
||||
localPlayer.clearTasksImmediately();
|
||||
localPlayer.freezePosition(true);
|
||||
mp.game.cam.renderScriptCams(true, false, 0, true, false);
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("sendToServer", (characterData) => {
|
||||
mp.events.callRemote("creatorSave", characterData);
|
||||
});
|
||||
|
||||
creatorMenus.forEach(menu => {
|
||||
menu.Visible = false;
|
||||
})
|
||||
}
|
||||
7
ReallifeGamemode.Client/DoorManager/doormanager.ts
Normal file
7
ReallifeGamemode.Client/DoorManager/doormanager.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
export default function doorManager() {
|
||||
mp.events.add('changeDoorState', (doorHash, x, y, z, locked, p5, p6, p7) => {
|
||||
locked === 1 ? locked = true : locked = false;
|
||||
|
||||
mp.game.object.doorControl(doorHash, x, y, z, locked, p5, p6, p7);
|
||||
});
|
||||
}
|
||||
44
ReallifeGamemode.Client/FactionManagement/main.ts
Normal file
44
ReallifeGamemode.Client/FactionManagement/main.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Faction Manager Main (main.js)
|
||||
* @author hydrant
|
||||
* @copyright (c) 2008 - 2018 Life of German
|
||||
*/
|
||||
|
||||
export default function factionManagement() {
|
||||
|
||||
var manageFactionRanksBrowser = null;
|
||||
var rankData = null;
|
||||
|
||||
mp.events.add('manageFactionRanks', (ranks) => {
|
||||
if (manageFactionRanksBrowser !== null) return;
|
||||
manageFactionRanksBrowser = mp.browsers.new('package://assets/html/factionmanagement/ranks/index.html');
|
||||
|
||||
mp.gui.chat.activate(false);
|
||||
rankData = JSON.parse(ranks);
|
||||
});
|
||||
|
||||
mp.events.add('onManageFactionRanksLoaded', () => {
|
||||
if (manageFactionRanksBrowser !== null) {
|
||||
manageFactionRanksBrowser.execute(`setFactionName('${rankData.FactionName}')`);
|
||||
manageFactionRanksBrowser.execute(`loadData(` + JSON.stringify(rankData.Ranks) + `)`);
|
||||
mp.gui.cursor.show(true, true);
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add('saveFactionRankData', function (data) {
|
||||
if (manageFactionRanksBrowser !== null) {
|
||||
manageFactionRanksBrowser.destroy();
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.activate(true);
|
||||
|
||||
var obj: FactionRanks = {
|
||||
factionId: rankData.FactionId,
|
||||
ranks: JSON.parse(data)
|
||||
};
|
||||
|
||||
mp.events.callRemote('OnFactionRanksEdit', JSON.stringify(obj));
|
||||
|
||||
manageFactionRanksBrowser = null;
|
||||
}
|
||||
});
|
||||
}
|
||||
1145
ReallifeGamemode.Client/Gui/Inventory/inventory.ts
Normal file
1145
ReallifeGamemode.Client/Gui/Inventory/inventory.ts
Normal file
File diff suppressed because it is too large
Load Diff
61
ReallifeGamemode.Client/Gui/ahelp.ts
Normal file
61
ReallifeGamemode.Client/Gui/ahelp.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Gui ahelp
|
||||
* @author MichaPlays
|
||||
* @copyright (c) 2008 - 2021 Life of German
|
||||
*/
|
||||
|
||||
export default function ahelp(globalData: IGlobalData): void {
|
||||
|
||||
var ahelpBrowser: BrowserMp = null;
|
||||
|
||||
mp.events.add("showAhelp", () => {
|
||||
|
||||
if (ahelpBrowser !== null) {
|
||||
ahelpBrowser.destroy();
|
||||
ahelpBrowser = null;
|
||||
globalData.InInput = false;
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.activate(true);
|
||||
}
|
||||
else if (!globalData.InInput) {
|
||||
globalData.InInput = true;
|
||||
ahelpBrowser = mp.browsers.new('package://assets/html/helpcommand/ahelp.html');
|
||||
mp.gui.chat.activate(false);
|
||||
mp.gui.cursor.show(true, true);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("removeAhelp", () => {
|
||||
|
||||
if (ahelpBrowser == null) {
|
||||
return;
|
||||
}
|
||||
else if (globalData.InInput) {
|
||||
ahelpBrowser.destroy();
|
||||
ahelpBrowser = null;
|
||||
globalData.InInput = false;
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.activate(true);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("showShelp", () => {
|
||||
|
||||
if (ahelpBrowser !== null) {
|
||||
ahelpBrowser.destroy();
|
||||
ahelpBrowser = null;
|
||||
globalData.InInput = false;
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.activate(true);
|
||||
}
|
||||
else if (!globalData.InInput) {
|
||||
globalData.InInput = true;
|
||||
ahelpBrowser = mp.browsers.new('package://assets/html/helpcommand/shelp.html');
|
||||
mp.gui.chat.activate(false);
|
||||
mp.gui.cursor.show(true, true);
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
53
ReallifeGamemode.Client/Gui/blips.ts
Normal file
53
ReallifeGamemode.Client/Gui/blips.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
const Natives = {
|
||||
SET_BLIP_CATEGORY: RageEnums.Natives.Ui.SET_BLIP_CATEGORY,
|
||||
SHOW_HEADING_INDICATOR_ON_BLIP: RageEnums.Natives.Ui.SHOW_HEADING_INDICATOR_ON_BLIP,
|
||||
SET_BLIP_AS_SHORT_RANGE: RageEnums.Natives.Ui.SET_BLIP_AS_SHORT_RANGE,
|
||||
SET_BLIP_DISPLAY: RageEnums.Natives.Ui.SET_BLIP_DISPLAY
|
||||
};
|
||||
|
||||
export default function playerBlips() {
|
||||
|
||||
/* mp.events.add("entityStreamIn", (entity) => {
|
||||
if (entity.type === "player") {
|
||||
|
||||
var entityMp = <EntityMp>entity;
|
||||
|
||||
mp.gui.chat.push("Player recieved: Yes");
|
||||
|
||||
let color = parseInt(entity.getVariable("blipColor"));
|
||||
|
||||
mp.gui.chat.push("Color : " + color);
|
||||
|
||||
entity.createBlip(1);
|
||||
|
||||
mp.gui.chat.push(parseInt(entity.blip) == 0 ? "Blip was not created" : "Blip was created");
|
||||
|
||||
mp.gui.chat.push("entity.blip is actually " + entity.blip);
|
||||
var blip = mp.blips.at(entity.blip);
|
||||
|
||||
blip.dimension = entityMp.dimension;
|
||||
|
||||
mp.gui.chat.push("1 -" + blip.getAlpha() + " 2- " + blip.doesExist() + " 3-" + blip.dimension + " 4-" + entityMp.dimension);
|
||||
|
||||
entity.setBlipColor(isNaN(color) ? 0 : color);
|
||||
|
||||
mp.game.invoke(Natives.SET_BLIP_CATEGORY, entity.blip, 7);
|
||||
mp.game.invoke(Natives.SHOW_HEADING_INDICATOR_ON_BLIP, entity.blip, true);
|
||||
mp.game.invoke(Natives.SET_BLIP_AS_SHORT_RANGE, entity.blip, true);
|
||||
//mp.game.invoke(Natives.SET_BLIP_DISPLAY, entity.blip, 8);
|
||||
|
||||
}
|
||||
});
|
||||
*/
|
||||
|
||||
|
||||
|
||||
mp.events.addDataHandler("blipColor", (entity, value) => {
|
||||
if (entity.type === "player") {
|
||||
mp.gui.chat.push("Setting Blip color...");
|
||||
let color = parseInt(value);
|
||||
entity.setBlipColor(isNaN(color) ? 0 : color);
|
||||
mp.gui.chat.push("Player blip color was set.");
|
||||
}
|
||||
});
|
||||
}
|
||||
110
ReallifeGamemode.Client/Gui/cityhall.ts
Normal file
110
ReallifeGamemode.Client/Gui/cityhall.ts
Normal file
@@ -0,0 +1,110 @@
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
var screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
import InputHelper from '../inputhelper';
|
||||
|
||||
export default function (globalData: IGlobalData) {
|
||||
|
||||
var keyBound = false;
|
||||
var menu: NativeUI.Menu = null;
|
||||
var joblist: string[] = [];
|
||||
|
||||
mp.events.add("SERVER:CityHall_ShowHelpText", (joblista) => {
|
||||
/*mp.game.ui.setTextComponentFormat('STRING');
|
||||
mp.game.ui.addTextComponentSubstringPlayerName('Drücke ~INPUT_CONTEXT~, um das Stadthallen-Menü zu öffnen');
|
||||
mp.game.ui.displayHelpTextFromStringLabel(0, true, true, -1);
|
||||
*/
|
||||
mp.events.call("renderHelpTextOnScreen", "~s~Drücke ~g~E~s~ um das ~b~Stadthallen-Menü ~s~zu öffnen")
|
||||
joblist = JSON.parse(joblista);
|
||||
|
||||
if (!keyBound) {
|
||||
keyBound = true;
|
||||
mp.keys.bind(0x45, false, keyPressHandler);
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("SERVER:CityHall_ClearHelpText", () => {
|
||||
mp.game.ui.clearHelp(false);
|
||||
if (menu) menu.Close(true);
|
||||
if (keyBound) {
|
||||
mp.keys.unbind(0x45, false, keyPressHandler);
|
||||
keyBound = false;
|
||||
}
|
||||
});
|
||||
|
||||
function keyPressHandler(): void {
|
||||
if (globalData.InChat || globalData.InMenu) return;
|
||||
menu = new Menu("Stadthalle", "", new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
globalData.InMenu = true;
|
||||
mp.gui.chat.show(false);
|
||||
|
||||
var jobItem = new UIMenuItem("Jobs", "Jobcenter");
|
||||
menu.AddItem(jobItem);
|
||||
|
||||
var jobMenu = new Menu("Jobcenter", "Suche dir einen neuen Job aus", new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
for (var i = 0; i < joblist.length; i++) {
|
||||
var job = joblist[i];
|
||||
jobMenu.AddItem(new UIMenuItem(job));
|
||||
}
|
||||
|
||||
var cancelJobItem = new UIMenuItem("Job kuendigen");
|
||||
cancelJobItem.BackColor = new Color(213, 0, 0);
|
||||
cancelJobItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
jobMenu.AddItem(cancelJobItem);
|
||||
|
||||
menu.BindMenuToItem(jobMenu, jobItem);
|
||||
|
||||
jobMenu.ItemSelect.on((item: NativeUI.UIMenuItem, index: number) => {
|
||||
if (item === cancelJobItem) { // Job kündigen
|
||||
mp.events.callRemote("CLIENT:JobCenter_CancelJob");
|
||||
} else {
|
||||
mp.events.callRemote("CLIENT:JobCenter_AcceptJob", index + 1);
|
||||
}
|
||||
|
||||
menu.Close(true);
|
||||
});
|
||||
|
||||
jobMenu.Visible = false;
|
||||
|
||||
var groupCreateItem = new UIMenuItem("Gruppe erstellen", "Erstelle eine neue Gruppe");
|
||||
groupCreateItem.SetRightLabel("~g~50.000$");
|
||||
menu.AddItem(groupCreateItem);
|
||||
|
||||
var cancelItem = new UIMenuItem("Schließen");
|
||||
cancelItem.BackColor = new Color(213, 0, 0);
|
||||
cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
menu.AddItem(cancelItem);
|
||||
|
||||
menu.Open();
|
||||
|
||||
menu.ItemSelect.on((item: NativeUI.UIMenuItem, index) => {
|
||||
if (item === groupCreateItem) { // Gruppe
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Wie soll die Gruppe heißen?", globalData);
|
||||
input.show();
|
||||
input.getValue((name: string) => {
|
||||
mp.events.callRemote("CLIENT:CityHall_CreateGroup", name);
|
||||
menu.Close(true);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
} else if (item === cancelItem) {
|
||||
menu.Close();
|
||||
}
|
||||
});
|
||||
|
||||
menu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
mp.gui.chat.show(true);
|
||||
});
|
||||
}
|
||||
}
|
||||
110
ReallifeGamemode.Client/Gui/deathscreen.ts
Normal file
110
ReallifeGamemode.Client/Gui/deathscreen.ts
Normal file
@@ -0,0 +1,110 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Gui Infobox infobox.js
|
||||
* @author VegaZ
|
||||
* @copyright (c) 2008 - 2018 Life of German
|
||||
*/
|
||||
|
||||
export default function deathScreen() {
|
||||
|
||||
var playerName;
|
||||
var playerId;
|
||||
var playerMoney;
|
||||
var dutyMedics = 0;
|
||||
|
||||
var isDeath = false;
|
||||
var deathTime;
|
||||
var respawnTime;
|
||||
var deathSeconds;
|
||||
var fade;
|
||||
var deathDate: Date;
|
||||
var taskTimeout = false;
|
||||
const maxDeathTime = 30;
|
||||
const medicJobTime = maxDeathTime * -1;
|
||||
|
||||
mp.game.gameplay.setFadeOutAfterDeath(false);
|
||||
|
||||
mp.events.add("startDeathTimer", (isAdmin) => {
|
||||
if (isDeath === false) {
|
||||
isDeath = true;
|
||||
if (isAdmin) {
|
||||
mp.gui.chat.activate(true);
|
||||
}
|
||||
else {
|
||||
mp.gui.chat.activate(false);
|
||||
}
|
||||
mp.game.audio.playSoundFrontend(-1, "Bed", "WastedSounds", true);
|
||||
deathDate = new Date();
|
||||
respawnTime = Math.floor(deathDate.getTime() / 1000 + maxDeathTime);
|
||||
fade = 255 - maxDeathTime;
|
||||
mp.game.graphics.requestStreamedTextureDict("Mptattoos", true);
|
||||
taskTimeout = false;
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("onPlayerRevived", () => {
|
||||
isDeath = false;
|
||||
mp.gui.chat.activate(true);
|
||||
mp.game.gameplay.setFadeOutAfterDeath(false);
|
||||
mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("Mptattoos");
|
||||
});
|
||||
|
||||
mp.events.add("respawnDeathPlayer", () => {
|
||||
isDeath = false;
|
||||
mp.gui.chat.activate(true);
|
||||
mp.game.gameplay.setFadeOutAfterDeath(false);
|
||||
mp.events.callRemote('RespawnPlayerAtHospital');
|
||||
mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("Mptattoos");
|
||||
});
|
||||
|
||||
mp.events.add("updateDutyMedics", (count) => {
|
||||
dutyMedics = count;
|
||||
});
|
||||
|
||||
mp.events.add("render", () => {
|
||||
var currentDate = new Date();
|
||||
|
||||
if (isDeath === true) {
|
||||
|
||||
var medicString;
|
||||
if (dutyMedics > 0) {
|
||||
medicString = "Das L.S.E.D. wurde benachrichtigt\nDerzeit";
|
||||
if (dutyMedics === 1) {
|
||||
medicString += "befindet sich ~g~" + dutyMedics + " Mitglied";
|
||||
} else {
|
||||
medicString += "befinden sich ~g~" + dutyMedics + " Mitglieder";
|
||||
}
|
||||
medicString += " ~s~im Dienst";
|
||||
} else {
|
||||
medicString = "Derzeit befinden sich ~r~keine Einsatzkräfte ~s~im Dienst";
|
||||
}
|
||||
|
||||
deathSeconds = respawnTime - Math.floor(currentDate.getTime() / 1000);
|
||||
var alpha = fade + Math.floor(currentDate.getTime() / 1000 - deathDate.getTime() / 1000);
|
||||
if (deathSeconds >= 0) {
|
||||
mp.game.graphics.set2dLayer(2);
|
||||
mp.game.graphics.drawSprite("Mptattoos", "clearout", 0.625, 0.5, 0.1, 0.1, 0, 255, 255, 255, 236);
|
||||
mp.game.graphics.drawText("Respawn in: ~y~" + deathSeconds, [0.5, 0.5],
|
||||
{
|
||||
font: 7,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.8, 0.8],
|
||||
outline: true,
|
||||
centre: false
|
||||
});
|
||||
mp.game.graphics.drawText(medicString, [0.5, 0.945],
|
||||
{
|
||||
font: 4,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.4, 0.4],
|
||||
outline: true,
|
||||
centre: false
|
||||
});
|
||||
mp.game.graphics.set2dLayer(1);
|
||||
mp.game.graphics.drawRect(0.5, 0.5, 1, 1, 0, 0, 0, alpha);
|
||||
|
||||
} else {
|
||||
mp.events.call("respawnDeathPlayer");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
39
ReallifeGamemode.Client/Gui/drivingschool.ts
Normal file
39
ReallifeGamemode.Client/Gui/drivingschool.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Gui Introduction
|
||||
* @author CroniX kopiert von MichaPlays
|
||||
* @copyright (c) 2008 - 2021 Life of German
|
||||
*/
|
||||
|
||||
export default function Introduction(globalData: IGlobalData): void {
|
||||
|
||||
var DrivingSchoolBrowser: BrowserMp = null;
|
||||
|
||||
mp.events.add("showDrivingSchool", () => {
|
||||
if (DrivingSchoolBrowser !== null) {
|
||||
DrivingSchoolBrowser.destroy();
|
||||
DrivingSchoolBrowser = null;
|
||||
globalData.InInput = false;
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.activate(true);
|
||||
}
|
||||
else if (!globalData.InInput) {
|
||||
globalData.InInput = true;
|
||||
DrivingSchoolBrowser = mp.browsers.new('package://assets/html/School/DrivingSchool.html');
|
||||
mp.gui.chat.activate(false);
|
||||
mp.gui.cursor.show(true, true);
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("removeDrivingSchool", () => {
|
||||
if (DrivingSchoolBrowser == null) {
|
||||
return;
|
||||
}
|
||||
else if (globalData.InInput) {
|
||||
DrivingSchoolBrowser.destroy();
|
||||
DrivingSchoolBrowser = null;
|
||||
globalData.InInput = false;
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.activate(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
74
ReallifeGamemode.Client/Gui/handmoney.ts
Normal file
74
ReallifeGamemode.Client/Gui/handmoney.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
import moneyFormat from '../moneyformat';
|
||||
|
||||
export default function handMoney(globalData: IGlobalData) {
|
||||
var currentMoney = null;
|
||||
var showMoneyChange = null;
|
||||
var difference;
|
||||
|
||||
mp.events.add("SERVER:SET_HANDMONEY", (amount) => {
|
||||
difference = currentMoney - amount;
|
||||
if (difference != 0 && currentMoney != null) {
|
||||
showMoneyChange = 600;
|
||||
}
|
||||
currentMoney = amount;
|
||||
});
|
||||
|
||||
mp.events.add("render", () => {
|
||||
if (globalData.HideGui) return;
|
||||
if (currentMoney != null) {
|
||||
var numberFormat = moneyFormat(Math.abs(currentMoney));
|
||||
if (currentMoney >= 0) {
|
||||
mp.game.graphics.drawText("$" + numberFormat, [0.95, 0.1],
|
||||
{
|
||||
font: 7,
|
||||
color: [115, 186, 131, 255],
|
||||
scale: [0.65, 0.65],
|
||||
outline: false,
|
||||
centre: true,
|
||||
})
|
||||
}
|
||||
else {
|
||||
mp.game.graphics.drawText("-$" + numberFormat, [0.95, 0.1],
|
||||
{
|
||||
font: 7,
|
||||
color: [255, 0, 45, 255],
|
||||
scale: [0.65, 0.65],
|
||||
outline: false,
|
||||
centre: true,
|
||||
})
|
||||
}
|
||||
if (showMoneyChange > 0) {
|
||||
showMoneyChange--;
|
||||
if (difference > 0) {
|
||||
|
||||
var alpha = 255;
|
||||
if (showMoneyChange <= 70) {
|
||||
alpha = (showMoneyChange * (255 / 70)) | 0;
|
||||
}
|
||||
var differenceText = moneyFormat(Math.abs(difference));
|
||||
mp.game.graphics.drawText("-$" + differenceText, [0.95, 0.145], {
|
||||
font: 7,
|
||||
color: [255, 0, 45, alpha],
|
||||
scale: [0.65, 0.65],
|
||||
outline: false,
|
||||
centre: true
|
||||
})
|
||||
|
||||
} else {
|
||||
var alpha = 255;
|
||||
if (showMoneyChange <= 70) {
|
||||
alpha = (showMoneyChange * (255 / 70)) | 0;
|
||||
}
|
||||
var differenceText = moneyFormat(Math.abs(difference));
|
||||
mp.game.graphics.drawText("+$" + differenceText, [0.95, 0.145], {
|
||||
font: 7,
|
||||
color: [115, 186, 131, alpha],
|
||||
scale: [0.65, 0.65],
|
||||
outline: false,
|
||||
centre: true
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
39
ReallifeGamemode.Client/Gui/helptext.ts
Normal file
39
ReallifeGamemode.Client/Gui/helptext.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
var renderedText = null;
|
||||
var textTime = null;
|
||||
var render = false;
|
||||
var textString;
|
||||
var stringLength = null;
|
||||
var boxWidth;
|
||||
|
||||
function ClearText() {
|
||||
render = false;
|
||||
clearInterval(textTime);
|
||||
textTime = null;
|
||||
}
|
||||
|
||||
mp.events.add('render', () => {
|
||||
if (render) {
|
||||
|
||||
mp.game.graphics.drawRect(0.5, 0, boxWidth, 0.07, 0, 0, 0, 183);
|
||||
renderedText = mp.game.graphics.drawText(textString, [0.5, 0], {
|
||||
font: 4,
|
||||
centre: true,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.5, 0.5],
|
||||
outline: true
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
mp.events.add('renderHelpTextOnScreen', (msg) => {
|
||||
if (textTime != null) {
|
||||
clearInterval(textTime);
|
||||
textTime = null;
|
||||
}
|
||||
textString = msg;
|
||||
stringLength = textString.length;
|
||||
boxWidth = stringLength * 0.004 + 0.002;
|
||||
render = true;
|
||||
textTime = setInterval(ClearText, 7000)
|
||||
});
|
||||
167
ReallifeGamemode.Client/Gui/house.ts
Normal file
167
ReallifeGamemode.Client/Gui/house.ts
Normal file
@@ -0,0 +1,167 @@
|
||||
import { Menu, Point, UIMenuItem, Color } from '../libs/NativeUI';
|
||||
import moneyFormat from '../moneyformat';
|
||||
import InputHelper from '../inputhelper';
|
||||
import game from '..';
|
||||
import { Key } from '../game';
|
||||
|
||||
var houseMenu: Menu;
|
||||
var houseData: any;
|
||||
var houseState: number;
|
||||
var screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
|
||||
game.events.add("SERVER:ShowHouseMenu", () => {
|
||||
|
||||
//game.ui.setHelpText('Drücke ~INPUT_CONTEXT~, um das Hausmenü öffnen');
|
||||
mp.events.call("renderHelpTextOnScreen", "~s~Drücke ~g~E~s~ um das ~b~Hausmenü ~s~öffnen");
|
||||
game.events.bindKey(Key.E, false, keyPressHandler);
|
||||
});
|
||||
|
||||
game.events.add("SERVER:SetHouseData", (dataStr, state) => {
|
||||
houseData = JSON.parse(dataStr);
|
||||
houseState = state;
|
||||
});
|
||||
|
||||
function keyPressHandler() {
|
||||
if (game.ui.inMenu || game.ui.inChat) return;
|
||||
game.ui.clearHelpText();
|
||||
|
||||
var subTitle = houseData.Type;
|
||||
if (houseData.OwnerName) {
|
||||
subTitle += " von " + houseData.OwnerName;
|
||||
}
|
||||
|
||||
houseMenu = new Menu("Hausverwaltung", subTitle, new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
game.ui.inMenu = true;
|
||||
|
||||
var rentInItem: UIMenuItem;
|
||||
var cancelOwnRentalItem: UIMenuItem;
|
||||
|
||||
var buyHouseItem: UIMenuItem;
|
||||
|
||||
var setRentalFeeItem: UIMenuItem;
|
||||
var cancelRentalsItem: UIMenuItem;
|
||||
var sellHouseItem: UIMenuItem;
|
||||
var withdrawBankItem: UIMenuItem;
|
||||
|
||||
var houseRentals = houseData.Rentals.length;
|
||||
|
||||
if (houseState === -1) { // Keine Beziehung zum Haus
|
||||
rentInItem = new UIMenuItem("Einmieten", "Miete dich in das Haus ein");
|
||||
rentInItem.SetRightLabel(moneyFormat(houseData.RentalFee.toString(), 0) + "$");
|
||||
houseMenu.AddItem(rentInItem);
|
||||
} else if (houseState === 0) { // Haus hat keinen Eigentümer
|
||||
buyHouseItem = new UIMenuItem("Haus kaufen", "Kaufe das Haus");
|
||||
buyHouseItem.SetRightLabel(moneyFormat(houseData.Price, 0) + "$");
|
||||
houseMenu.AddItem(buyHouseItem);
|
||||
} else if (houseState === 1) { // Hausbesitzer
|
||||
setRentalFeeItem = new UIMenuItem("Miete setzen", "Setze den Mietpreis");
|
||||
setRentalFeeItem.SetRightLabel(moneyFormat(houseData.RentalFee, 0) + "$");
|
||||
houseMenu.AddItem(setRentalFeeItem);
|
||||
|
||||
if (houseRentals > 0) {
|
||||
cancelRentalsItem = new UIMenuItem("Mieter", "Liste deine Mieter auf");
|
||||
cancelRentalsItem.SetRightLabel(houseRentals.toString());
|
||||
houseMenu.AddItem(cancelRentalsItem);
|
||||
|
||||
var cancelRentalsMenu = new Menu("Mieter", "Kündige einen Mieter", new Point(0, screenRes.y / 3), null, null);
|
||||
cancelRentalsMenu.Visible = false;
|
||||
|
||||
houseData.Rentals.forEach(rental => {
|
||||
var item = new UIMenuItem(rental, "");
|
||||
item.SetRightLabel("Kündigen");
|
||||
cancelRentalsMenu.AddItem(item);
|
||||
});
|
||||
|
||||
cancelRentalsMenu.ItemSelect.on((item: UIMenuItem, index: number) => {
|
||||
game.events.callServer("House_CancelUserRental", item.Text);
|
||||
houseRentals--;
|
||||
cancelRentalsItem.SetRightLabel(houseRentals.toString());
|
||||
if (houseRentals === 0) {
|
||||
cancelRentalsMenu.Visible = false;
|
||||
houseMenu.Visible = true;
|
||||
houseMenu.RemoveItem(cancelRentalsItem);
|
||||
}
|
||||
|
||||
cancelRentalsMenu.RemoveItem(item);
|
||||
});
|
||||
|
||||
houseMenu.BindMenuToItem(cancelRentalsMenu, cancelRentalsItem);
|
||||
}
|
||||
|
||||
withdrawBankItem = new UIMenuItem("Konto", "Hebe Geld vom Konto ab");
|
||||
withdrawBankItem.SetRightLabel(moneyFormat(houseData.Balance) + "$");
|
||||
houseMenu.AddItem(withdrawBankItem);
|
||||
|
||||
sellHouseItem = new UIMenuItem("Haus verkaufen");
|
||||
houseMenu.AddItem(sellHouseItem);
|
||||
|
||||
|
||||
} else if (houseState === 2) {
|
||||
cancelOwnRentalItem = new UIMenuItem("Mietvertrag kündigen", "Ziehe aus der Wohnung aus");
|
||||
houseMenu.AddItem(cancelOwnRentalItem);
|
||||
}
|
||||
|
||||
var cancelItem = new UIMenuItem("Abbrechen");
|
||||
cancelItem.BackColor = new Color(213, 0, 0);
|
||||
cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
houseMenu.AddItem(cancelItem);
|
||||
|
||||
houseMenu.Open();
|
||||
|
||||
houseMenu.ItemSelect.on((item, index) => {
|
||||
if (item === cancelItem) {
|
||||
houseMenu.Close();
|
||||
} else if (item === buyHouseItem) {
|
||||
game.events.callServer("House_BuyHouse");
|
||||
houseMenu.Close();
|
||||
} else if (item === setRentalFeeItem) {
|
||||
var rentalFeeInput = new InputHelper("Wie hoch soll die Miete sein?");
|
||||
rentalFeeInput.show();
|
||||
rentalFeeInput.getValue(data => {
|
||||
if (isNaN(data)) {
|
||||
return;
|
||||
}
|
||||
|
||||
var rentalFee = parseInt(data);
|
||||
|
||||
game.events.callServer("House_SetRentalFee", rentalFee);
|
||||
houseMenu.Close();
|
||||
});
|
||||
} else if (item === rentInItem) {
|
||||
game.events.callServer("House_RentInHouse");
|
||||
houseMenu.Close();
|
||||
} else if (item === cancelOwnRentalItem) {
|
||||
game.events.callServer("House_CancelOwnRental");
|
||||
houseMenu.Close();
|
||||
} else if (item === sellHouseItem) {
|
||||
game.events.callServer("House_SellHouse");
|
||||
houseMenu.Close();
|
||||
} else if (item == withdrawBankItem) {
|
||||
var input = new InputHelper("Wie viel Geld möchtest du abheben?");
|
||||
input.show();
|
||||
input.getValue(data => {
|
||||
if (isNaN(data)) {
|
||||
return;
|
||||
}
|
||||
|
||||
var withdrawAmount = parseInt(data);
|
||||
|
||||
game.events.callServer("House_WithdrawMoney", withdrawAmount);
|
||||
houseMenu.Close();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
houseMenu.MenuClose.on(() => {
|
||||
game.ui.inMenu = false;
|
||||
});
|
||||
}
|
||||
|
||||
game.events.add("SERVER:CloseHouseMenu", () => {
|
||||
game.ui.clearHelpText();
|
||||
if (houseMenu != null) {
|
||||
houseMenu.Close();
|
||||
}
|
||||
game.events.unbindKey(Key.E, false, keyPressHandler);
|
||||
});
|
||||
343
ReallifeGamemode.Client/Gui/infobox.ts
Normal file
343
ReallifeGamemode.Client/Gui/infobox.ts
Normal file
@@ -0,0 +1,343 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Gui Infobox infobox.js
|
||||
* @author VegaZ
|
||||
* @copyright (c) 2008 - 2018 Life of German
|
||||
*/
|
||||
|
||||
import moneyFormat from "../moneyformat";
|
||||
|
||||
export default function (globalData: IGlobalData): void {
|
||||
var currentdate;
|
||||
var dateString;
|
||||
var timeString;
|
||||
|
||||
var draw = false;
|
||||
var editMode = false;
|
||||
var adutyMode = false;
|
||||
var dutyMode = false;
|
||||
let jailTime = 0;
|
||||
let att_score = 0;
|
||||
let def_score = 0;
|
||||
let gangwarTimer = 0;
|
||||
let att = null;
|
||||
let def = null;
|
||||
let countdown = 0;
|
||||
var cdTimestamp;
|
||||
var countdownText;
|
||||
var blackScreenMode = false;
|
||||
|
||||
let posX = 0.92;
|
||||
let posY = 0.45;
|
||||
let width = 0.1;
|
||||
let height = 0.2;
|
||||
let colorR = 0;
|
||||
let colorG = 0;
|
||||
let colorB = 0;
|
||||
let colorA = 72;
|
||||
|
||||
var day;
|
||||
var month;
|
||||
var year;
|
||||
var hour;
|
||||
var minute;
|
||||
var second;
|
||||
|
||||
var nDay;
|
||||
var nMonth;
|
||||
var nHour;
|
||||
var nMinute;
|
||||
var nSecond;
|
||||
|
||||
var playerName;
|
||||
var playerId;
|
||||
var playerMoney;
|
||||
|
||||
mp.events.add("draw", (pName, pId) => {
|
||||
playerName = pName;
|
||||
playerId = pId;
|
||||
draw = true;
|
||||
});
|
||||
|
||||
mp.events.add('toggleADutyMode', (toggle) => {
|
||||
adutyMode = toggle;
|
||||
});
|
||||
|
||||
mp.events.add("toggleEditMode", (toggle) => {
|
||||
editMode = toggle;
|
||||
});
|
||||
|
||||
mp.events.add("toggleDutyMode", (toggle) => {
|
||||
dutyMode = toggle;
|
||||
});
|
||||
|
||||
mp.events.add("toggleBlackScreen", (toggle) => {
|
||||
blackScreenMode = toggle;
|
||||
});
|
||||
|
||||
mp.events.add("jailTime", (time) => {
|
||||
jailTime = JSON.parse(time);
|
||||
});
|
||||
|
||||
mp.events.add("GangwarScore", (attacker, defender, attscore, defscore, gwTimer) => {
|
||||
att = attacker;
|
||||
def = defender;
|
||||
att_score = attscore;
|
||||
def_score = defscore;
|
||||
gangwarTimer = gwTimer;
|
||||
});
|
||||
|
||||
mp.events.add("countdown", (timer, text) => {
|
||||
countdown = timer;
|
||||
cdTimestamp = Date.now();
|
||||
countdownText = text;
|
||||
});
|
||||
|
||||
|
||||
mp.events.add("toggleUi", (show) => {
|
||||
if (show === false) {
|
||||
draw = false;
|
||||
mp.game.ui.displayRadar(false);
|
||||
mp.game.ui.displayHud(false);
|
||||
mp.gui.chat.show(false);
|
||||
globalData.HideGui = true;
|
||||
} else {
|
||||
draw = true;
|
||||
mp.game.ui.displayRadar(true);
|
||||
mp.game.ui.displayHud(true);
|
||||
mp.gui.chat.show(true);
|
||||
globalData.HideGui = false;
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("updateMoney", (money) => {
|
||||
playerMoney = moneyFormat(money);
|
||||
});
|
||||
|
||||
mp.events.add("render", () => {
|
||||
|
||||
if (draw === true) {
|
||||
currentdate = new Date();
|
||||
|
||||
day = currentdate.getDate();
|
||||
month = currentdate.getMonth();
|
||||
year = currentdate.getFullYear();
|
||||
|
||||
hour = currentdate.getHours();
|
||||
minute = currentdate.getMinutes();
|
||||
second = currentdate.getSeconds();
|
||||
|
||||
if (day < 10) {
|
||||
nDay = "0" + day;
|
||||
} else nDay = day;
|
||||
|
||||
if (hour < 10) {
|
||||
nHour = "0" + hour;
|
||||
} else nHour = hour;
|
||||
|
||||
if (minute < 10) {
|
||||
nMinute = "0" + minute;
|
||||
} else nMinute = minute;
|
||||
|
||||
if (second < 10) {
|
||||
nSecond = "0" + second;
|
||||
} else nSecond = second;
|
||||
|
||||
switch (month) {
|
||||
case 0:
|
||||
nMonth = "Jan.";
|
||||
break;
|
||||
case 1:
|
||||
nMonth = "Feb.";
|
||||
break;
|
||||
case 2:
|
||||
nMonth = "Mär.";
|
||||
break;
|
||||
case 3:
|
||||
nMonth = "Apr.";
|
||||
break;
|
||||
case 4:
|
||||
nMonth = "Mai";
|
||||
break;
|
||||
case 5:
|
||||
nMonth = "Jun.";
|
||||
break;
|
||||
case 6:
|
||||
nMonth = "Jul.";
|
||||
break;
|
||||
case 7:
|
||||
nMonth = "Aug.";
|
||||
break;
|
||||
case 8:
|
||||
nMonth = "Sep.";
|
||||
break;
|
||||
case 9:
|
||||
nMonth = "Okt.";
|
||||
break;
|
||||
case 10:
|
||||
nMonth = "Nov.";
|
||||
break;
|
||||
case 11:
|
||||
nMonth = "Dez.";
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
|
||||
dateString = nDay + ". " + nMonth + " " + year;
|
||||
timeString = nHour + ":" + nMinute + ":" + nSecond + " Uhr";
|
||||
|
||||
mp.game.graphics.requestStreamedTextureDict("digitaloverlay", true);
|
||||
//static
|
||||
//mp.game.graphics.drawSprite("digitaloverlay", "static1", posX, posY, width, height, 0, 0, 255, 0, 88);
|
||||
mp.game.graphics.drawRect(posX, posY, width, height, colorR, colorG, colorB, colorA);
|
||||
mp.game.graphics.drawText(playerName + " (" + playerId + ")", [0.92, 0.351],
|
||||
{
|
||||
font: 4,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.5, 0.5],
|
||||
outline: true,
|
||||
centre: false
|
||||
})
|
||||
|
||||
mp.game.graphics.drawText(dateString + "\n" + timeString, [0.938, 0.381],
|
||||
{
|
||||
font: 4,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.5, 0.5],
|
||||
outline: true,
|
||||
centre: false
|
||||
})
|
||||
|
||||
mp.game.graphics.drawText("~g~$~s~" + playerMoney, [0.938, 0.441],
|
||||
{
|
||||
font: 4,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.5, 0.5],
|
||||
outline: true,
|
||||
centre: false
|
||||
})
|
||||
mp.game.graphics.drawText("~r~Datum: ", [0.89, 0.381],
|
||||
{
|
||||
font: 4,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.5, 0.5],
|
||||
outline: true,
|
||||
centre: false
|
||||
})
|
||||
mp.game.graphics.drawText("~r~Uhrzeit: ", [0.891, 0.411],
|
||||
{
|
||||
font: 4,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.5, 0.5],
|
||||
outline: true,
|
||||
centre: false
|
||||
})
|
||||
mp.game.graphics.drawText("~y~Bank: ", [0.887, 0.441],
|
||||
{
|
||||
font: 4,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.5, 0.5],
|
||||
outline: true,
|
||||
centre: false
|
||||
})
|
||||
|
||||
if (jailTime > 0) {
|
||||
mp.game.graphics.drawText("~y~Knast: ", [0.889, 0.52],
|
||||
{
|
||||
font: 4,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.5, 0.5],
|
||||
outline: true,
|
||||
centre: false
|
||||
})
|
||||
mp.game.graphics.drawText("ca. ~r~" + jailTime + "~w~ Min", [0.935, 0.52],
|
||||
{
|
||||
font: 4,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.5, 0.5],
|
||||
outline: true,
|
||||
centre: false
|
||||
})
|
||||
}
|
||||
|
||||
if (att_score >= 1 && def_score < 200) {
|
||||
|
||||
let gangwarTimerDraw = (Math.floor(gangwarTimer / 60) + 1);
|
||||
if (gangwarTimerDraw > 15 || Number.isNaN(gangwarTimerDraw)) {
|
||||
gangwarTimerDraw = 15;
|
||||
}
|
||||
|
||||
mp.game.graphics.drawText("~y~" + def + " " + def_score + " : " + att_score + " " + att + " " + "\nRestzeit: " + gangwarTimerDraw + " Minuten", [0.07, 0.54],
|
||||
{
|
||||
font: 4,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.5, 0.5],
|
||||
outline: true,
|
||||
centre: false
|
||||
})
|
||||
mp.game.graphics.drawText("~w~Gangwar", [0.07, 0.500],
|
||||
{
|
||||
font: 1,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.5, 0.5],
|
||||
outline: true,
|
||||
centre: false
|
||||
})
|
||||
mp.game.graphics.drawRect(0.0, 0.555, 0.3, 0.11, 0, 0, 0, 70)
|
||||
}
|
||||
|
||||
}
|
||||
if (editMode === true) {
|
||||
mp.game.graphics.drawText("~r~EDIT-MODE AKTIV", [0.5, 0],
|
||||
{
|
||||
font: 4,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.7, 0.7],
|
||||
outline: true,
|
||||
centre: false
|
||||
})
|
||||
}
|
||||
if (adutyMode === true) {
|
||||
mp.game.graphics.drawText("~r~SUPPORT", [0.92, 0.6],
|
||||
{
|
||||
font: 2,
|
||||
color: [0, 255, 255, 255],
|
||||
scale: [0.7, 0.7],
|
||||
outline: true,
|
||||
centre: false
|
||||
})
|
||||
}
|
||||
if (dutyMode === true) {
|
||||
mp.game.graphics.drawText("~r~Duty", [0.92, 0.55],
|
||||
{
|
||||
font: 2,
|
||||
color: [64, 224, 208, 255],
|
||||
scale: [0.7, 0.7],
|
||||
outline: true,
|
||||
centre: false
|
||||
})
|
||||
}
|
||||
|
||||
if (countdown > 0) {
|
||||
var now = Date.now();
|
||||
var diff = Math.trunc((now - cdTimestamp) / 1000);
|
||||
var out = countdown - diff;
|
||||
if (out < 0) {
|
||||
countdown = 0
|
||||
} else {
|
||||
mp.game.graphics.drawText("~y~" + countdownText + ": " + out + "", [0.5, 0.8],
|
||||
{
|
||||
font: 7,
|
||||
color: [64, 224, 208, 255],
|
||||
scale: [1.5, 1.5],
|
||||
outline: true,
|
||||
centre: false
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
if (blackScreenMode == true) {
|
||||
mp.game.graphics.drawRect(0, 0, 10000, 100000, 0, 0, 0, 255);
|
||||
}
|
||||
});
|
||||
}
|
||||
28
ReallifeGamemode.Client/Gui/interiors.ts
Normal file
28
ReallifeGamemode.Client/Gui/interiors.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import game from "..";
|
||||
import { Key } from "../game";
|
||||
|
||||
var interiorId = -1;
|
||||
var enterExit = undefined;
|
||||
var helpText;
|
||||
|
||||
game.events.add('SERVER:InteriorManager_ClearHelpText', () => {
|
||||
game.ui.clearHelpText();
|
||||
|
||||
enterExit = undefined;
|
||||
game.events.unbindKey(Key.E, false, keyPressHandler);
|
||||
});
|
||||
|
||||
game.events.add('SERVER:InteriorManager_ShowHelpText', (interior, intId, entEx) => {
|
||||
//game.ui.setHelpText('Drücke ~INPUT_CONTEXT~, um ~b~' + interior + ' ~s~zu ' + (entEx === 0 ? 'betreten' : 'verlassen'));
|
||||
helpText = "~s~Drücke ~g~E~s~ um ~b~" + interior + " ~s~zu " + (entEx === 0 ? "betreten" : "verlassen");
|
||||
mp.events.call("renderHelpTextOnScreen", helpText)
|
||||
interiorId = intId;
|
||||
enterExit = entEx;
|
||||
|
||||
game.events.bindKey(Key.E, false, keyPressHandler);
|
||||
});
|
||||
|
||||
function keyPressHandler() {
|
||||
if (game.ui.inChat) return;
|
||||
game.events.callServer('InteriorManager_UseTeleport', [interiorId, enterExit]);
|
||||
}
|
||||
44
ReallifeGamemode.Client/Gui/introduction.ts
Normal file
44
ReallifeGamemode.Client/Gui/introduction.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Gui Introduction
|
||||
* @author MichaPlays
|
||||
* @copyright (c) 2008 - 2021 Life of German
|
||||
*/
|
||||
|
||||
export default function Introduction(globalData: IGlobalData): void {
|
||||
|
||||
var IntroductionBrowser: BrowserMp = null;
|
||||
|
||||
mp.events.add("showIntroduction", () => {
|
||||
|
||||
if (IntroductionBrowser !== null) {
|
||||
IntroductionBrowser.destroy();
|
||||
IntroductionBrowser = null;
|
||||
globalData.InInput = false;
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.activate(true);
|
||||
}
|
||||
else if (!globalData.InInput) {
|
||||
globalData.InInput = true;
|
||||
IntroductionBrowser = mp.browsers.new('package://assets/html/Introduction/Introduction.html');
|
||||
mp.gui.chat.activate(false);
|
||||
mp.gui.cursor.show(true, true);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("removeIntroduction", () => {
|
||||
|
||||
if (IntroductionBrowser == null) {
|
||||
return;
|
||||
}
|
||||
else if (globalData.InInput) {
|
||||
IntroductionBrowser.destroy();
|
||||
IntroductionBrowser = null;
|
||||
globalData.InInput = false;
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.activate(true);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
34
ReallifeGamemode.Client/Gui/licenses.ts
Normal file
34
ReallifeGamemode.Client/Gui/licenses.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import { isNull } from "util";
|
||||
|
||||
|
||||
export default function licenses(globalData: IGlobalData): void {
|
||||
|
||||
var licenseBrowser: BrowserMp = null;
|
||||
var licenseTimer;
|
||||
var globalName;
|
||||
var globalInfo;
|
||||
|
||||
mp.events.add("ShowLicenses", (name, info) => {
|
||||
if (licenseBrowser == null) {
|
||||
licenseBrowser = mp.browsers.new('package://assets/html/licenses/scheine.html');
|
||||
globalName = name;
|
||||
globalInfo = info;
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("CEF:LicenseLoaded", () => {
|
||||
licenseBrowser.execute(`add_licenses('${JSON.stringify(globalInfo)}');`);
|
||||
licenseBrowser.execute(`add_licensesholder('${JSON.stringify(globalName)}');`);
|
||||
licenseTimer = setInterval(DestroyLicenses, 7000);
|
||||
});
|
||||
|
||||
|
||||
function DestroyLicenses() {
|
||||
licenseBrowser.destroy()
|
||||
licenseBrowser = null;
|
||||
clearInterval(licenseTimer);
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_EndShow");
|
||||
}
|
||||
|
||||
}
|
||||
62
ReallifeGamemode.Client/Gui/nametags.ts
Normal file
62
ReallifeGamemode.Client/Gui/nametags.ts
Normal file
@@ -0,0 +1,62 @@
|
||||
const maxDistance = 25 * 25;
|
||||
const width = 0.03;
|
||||
const height = 0.0065;
|
||||
const border = 0.001;
|
||||
const color = [73, 137, 0, 255];
|
||||
var faction;
|
||||
|
||||
export default function customNametags() {
|
||||
|
||||
mp.nametags.enabled = false;
|
||||
|
||||
mp.events.add('render', (nametags) => {
|
||||
const graphics = mp.game.graphics;
|
||||
const screenRes = graphics.getScreenResolution(0, 0);
|
||||
|
||||
nametags.forEach(nametag => {
|
||||
let [player, x, y, distance] = nametag;
|
||||
|
||||
if (distance <= maxDistance) {
|
||||
let scale = distance / maxDistance;
|
||||
if (scale < 0.6) scale = 0.6;
|
||||
|
||||
var health = player.getHealth() / 100;
|
||||
//health = health < 100 ? 0 : (health - 100) / 100;
|
||||
|
||||
var armour = player.getArmour() / 100;
|
||||
|
||||
y -= scale * (0.005 * (screenRes.y / 1080));
|
||||
|
||||
mp.game.graphics.drawText(player.name + " (" + player.remoteId + ")", [x, y],
|
||||
{
|
||||
font: 4,
|
||||
color: [255, 255, 255, 255], //Grove //Ballas 171 0 207 //PD 0 95 190 //FIB 0 0 170 LSED 147 0 0 NR 0 166 133 Trucker 255 162 Support 0 255 255 Zivilist 255 255 255
|
||||
scale: [0.4, 0.4],
|
||||
outline: true,
|
||||
centre: false
|
||||
});
|
||||
|
||||
if (true /*mp.game.player.isPlayerFreeAimingAtEntity(player.handle)*/) {
|
||||
let y2 = y + 0.042;
|
||||
|
||||
if (armour > 0) {
|
||||
graphics.drawRect(x, y2, width + border * 2, height + border * 2, 0 , 0, 0, 200);
|
||||
graphics.drawRect(x, y2, width, height, 150, 150, 150, 255);
|
||||
graphics.drawRect(x - width / 2 * (1 - health), y2, width * health, height, 200, 0, 0, 200);
|
||||
|
||||
var x2 = x + width / 2 + border / 2;
|
||||
|
||||
graphics.drawRect(x, y2 + height, width + border * 2, height + border * 2, 0, 0, 0, 200);
|
||||
graphics.drawRect(x, y2 + height, width, height, 200, 200, 200, 255);
|
||||
graphics.drawRect(x - width / 2 * (1 - armour), y2 + height, width * armour, height, 255, 255, 255, 200);
|
||||
}
|
||||
else {
|
||||
graphics.drawRect(x, y2, width + border * 2, height + border * 2, 0, 0, 0, 200);
|
||||
graphics.drawRect(x, y2, width, height, 150, 150, 150, 255);
|
||||
graphics.drawRect(x - width / 2 * (1 - health), y2, width * health, height, 200, 0, 0, 200);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
45
ReallifeGamemode.Client/Gui/playerlist.ts
Normal file
45
ReallifeGamemode.Client/Gui/playerlist.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Gui Playerlist playerlist.js
|
||||
* @author VegaZ. Siga.
|
||||
* @copyright (c) 2008 - 2018 Life of German
|
||||
*/
|
||||
|
||||
export default function playerList(globalData: IGlobalData): void {
|
||||
|
||||
var playerlistBrowser: BrowserMp = null;
|
||||
var pList;
|
||||
|
||||
mp.events.add("showPlayerlist", (playersJson) => {
|
||||
|
||||
if (playerlistBrowser !== null) {
|
||||
playerlistBrowser.destroy();
|
||||
playerlistBrowser = null;
|
||||
globalData.InInput = false;
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.activate(true);
|
||||
}
|
||||
else if (!globalData.InInput) {
|
||||
globalData.InInput = true;
|
||||
playerlistBrowser = mp.browsers.new('package://assets/html/Playerlist/Tabliste.html');
|
||||
mp.gui.chat.activate(false);
|
||||
mp.gui.cursor.show(true, true);
|
||||
pList = JSON.parse(playersJson);
|
||||
pList.forEach((player) => {
|
||||
playerlistBrowser.execute(`ad_row('${JSON.stringify(player.Id)}','${JSON.stringify(player.Name)}',${JSON.stringify(player.FactionName)},'${JSON.stringify(player.Ping)}');`);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("CEF:fetchPlayerList", () => {
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
//function getTable() {
|
||||
// var table = "";
|
||||
// pList.forEach((player) => {
|
||||
// var tableRow = "<tr><td>" + player.Id + "</td><td>" + player.Name + "</td><td>" + player.Ping + "</td>";
|
||||
// table = table + tableRow;
|
||||
// })
|
||||
// return document.write(table);
|
||||
//}
|
||||
42
ReallifeGamemode.Client/Gui/policedepartment.ts
Normal file
42
ReallifeGamemode.Client/Gui/policedepartment.ts
Normal file
@@ -0,0 +1,42 @@
|
||||
import game from "..";
|
||||
import { Key } from "../game";
|
||||
import { Menu, Point, UIMenuItem } from "../libs/NativeUI";
|
||||
import { createMenuItem } from "../util";
|
||||
import moneyformat from "../moneyformat";
|
||||
var screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
var menu: Menu = new Menu("Polizeirevier", "Die Hilfestelle der Polizei", new Point(0, screenRes.y / 3));
|
||||
|
||||
menu.AddItem(createMenuItem("Waffenschein kaufen", "Erwerbe einen Waffenschein", (item) => {
|
||||
item.SetRightLabel("$" + moneyformat(5000));
|
||||
}));
|
||||
|
||||
menu.Close();
|
||||
|
||||
menu.ItemSelect.on((item, index: number) => {
|
||||
game.events.callServer("PoliceDepartment_MenuSelect", index);
|
||||
menu.Close();
|
||||
});
|
||||
|
||||
menu.MenuClose.on(() => {
|
||||
game.ui.inMenu = false;
|
||||
});
|
||||
|
||||
game.events.add("SERVER:PoliceDepartment_EnterColShape", () => {
|
||||
//game.ui.setHelpText("Drücke ~INPUT_CONTEXT~, um das Menü des Polizeireviers zu öffnen");
|
||||
|
||||
mp.events.call("renderHelpTextOnScreen", "~s~Drücke ~g~E~s~ um das Menü des ~b~Polizeireviers ~s~zu öffnen")
|
||||
game.events.bindKey(Key.E, false, keyPressHandler);
|
||||
});
|
||||
|
||||
game.events.add("SERVER:PoliceDepartment_ExitColShape", () => {
|
||||
game.ui.clearHelpText();
|
||||
game.events.unbindKey(Key.E, false, keyPressHandler);
|
||||
|
||||
menu.Close();
|
||||
});
|
||||
|
||||
function keyPressHandler() {
|
||||
game.ui.clearHelpText();
|
||||
game.ui.inMenu = true;
|
||||
menu.Open();
|
||||
}
|
||||
106
ReallifeGamemode.Client/Gui/taximeter.ts
Normal file
106
ReallifeGamemode.Client/Gui/taximeter.ts
Normal file
@@ -0,0 +1,106 @@
|
||||
import InputHelper from '../inputhelper';
|
||||
|
||||
let browser: BrowserMp;
|
||||
let price: Number;
|
||||
|
||||
let lastkilometer: Number = 0;
|
||||
let lastPrice: Number = 0;
|
||||
let totalPrice: Number = 0;
|
||||
var myVar;
|
||||
export default function taximeterInput(globalData: IGlobalData) {
|
||||
var customerBrowser: boolean = false;
|
||||
|
||||
var price1_browser = 0;
|
||||
var km_browser = 0;
|
||||
|
||||
mp.events.add("CLIENT:setFarePrice", () => {
|
||||
/*
|
||||
var textBox = new InputHelper("Setzen Sie ihre Fahrtkosten [2 - 50 $/km]", globalData);
|
||||
textBox.show();
|
||||
textBox.getValue((data) => {
|
||||
var amount = parseInt(data);
|
||||
if (isNaN(amount)) {
|
||||
mp.game.graphics.notify('~r~Du musst eine Nummer eingeben!');
|
||||
return;
|
||||
}
|
||||
price = amount;
|
||||
mp.events.callRemote("SERVER:setFare", amount);
|
||||
});
|
||||
}
|
||||
*/
|
||||
mp.events.callRemote("SERVER:setFare", 60);
|
||||
price = 60;
|
||||
});
|
||||
|
||||
mp.events.add("CLIENT:startFare", () => {
|
||||
browser = mp.browsers.new('package://assets/html/taximeter/index.html');
|
||||
});
|
||||
|
||||
mp.events.add('CLIENT:stopFare', () => {
|
||||
if (browser) {
|
||||
browser.destroy();
|
||||
browser = null;
|
||||
}
|
||||
globalData.InInput = false;
|
||||
});
|
||||
|
||||
function myTimer() {
|
||||
if (totalPrice == lastPrice) return;
|
||||
let payPrice = +totalPrice - +lastPrice;
|
||||
lastPrice = totalPrice;
|
||||
mp.events.callRemote("SERVER:payFare", payPrice, lastkilometer);
|
||||
}
|
||||
|
||||
mp.events.add("CEF:updateLastPrice", (price, lastkilometer1) => {
|
||||
totalPrice = price
|
||||
lastkilometer = lastkilometer1;
|
||||
});
|
||||
|
||||
|
||||
mp.events.add("CEF:Taxi_CefLoaded", () => {
|
||||
if (!customerBrowser) {
|
||||
browser.execute(`setFarePrice('${price}');`)
|
||||
myVar = setInterval(myTimer, 100);
|
||||
} else {
|
||||
browser.execute(`setFarePrice('${price1_browser}');`);
|
||||
browser.execute(`updateKilometer('${km_browser}')`);
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("CLIENT:startCustomerFare", (price1, km) => {
|
||||
price1_browser = price1;
|
||||
km_browser = km;
|
||||
|
||||
browser = mp.browsers.new('package://assets/html/taximeter/index.html');
|
||||
});
|
||||
|
||||
mp.events.add("CLIENT:updateFare", (km) => {
|
||||
if (browser) {
|
||||
browser.execute(`updateKilometer('${JSON.parse(km)}')`);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
mp.events.add("CLIENT:cancelFareCustomer", () => { //for Customer
|
||||
if (browser) {
|
||||
browser.destroy();
|
||||
browser = null;
|
||||
}
|
||||
|
||||
mp.events.callRemote("SERVER:cancelFareCustomer", lastPrice);
|
||||
});
|
||||
|
||||
mp.events.add("CLIENT:cancelFare", () => { //for Taxidriver
|
||||
if (browser) {
|
||||
browser.destroy();
|
||||
browser = null;
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("CLIENT:resetFareClock", () => { //for Taxidriver
|
||||
if (browser) {
|
||||
clearInterval(myVar);
|
||||
browser.execute(`setFarePrice('${price}');`)
|
||||
}
|
||||
});
|
||||
}
|
||||
44
ReallifeGamemode.Client/Gui/userhelp.ts
Normal file
44
ReallifeGamemode.Client/Gui/userhelp.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Gui Introduction
|
||||
* @author MichaPlays
|
||||
* @copyright (c) 2008 - 2021 Life of German
|
||||
*/
|
||||
|
||||
export default function userhelp(globalData: IGlobalData): void {
|
||||
|
||||
var userhelpBrowser: BrowserMp = null;
|
||||
|
||||
mp.events.add("showUserhelp", () => {
|
||||
|
||||
if (userhelpBrowser !== null) {
|
||||
userhelpBrowser.destroy();
|
||||
userhelpBrowser = null;
|
||||
globalData.InInput = false;
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.activate(true);
|
||||
}
|
||||
else if (!globalData.InInput) {
|
||||
globalData.InInput = true;
|
||||
userhelpBrowser = mp.browsers.new('package://assets/html/helpcommand/userhelp.html');
|
||||
mp.gui.chat.activate(false);
|
||||
mp.gui.cursor.show(true, true);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("removeUserhelp", () => {
|
||||
|
||||
if (userhelpBrowser == null) {
|
||||
return;
|
||||
}
|
||||
else if (globalData.InInput) {
|
||||
userhelpBrowser.destroy();
|
||||
userhelpBrowser = null;
|
||||
globalData.InInput = false;
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.activate(true);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
106
ReallifeGamemode.Client/Gui/vehiclemenu/main.ts
Normal file
106
ReallifeGamemode.Client/Gui/vehiclemenu/main.ts
Normal file
@@ -0,0 +1,106 @@
|
||||
import * as NativeUI from '../../libs/NativeUI';
|
||||
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
var screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
|
||||
export default function vehicleMenu(globalData: IGlobalData) {
|
||||
let menuBrowser: BrowserMp = null;
|
||||
|
||||
mp.events.add('ToggleVehicleMenu', () => {
|
||||
if (menuBrowser !== null) {
|
||||
menuBrowser.destroy();
|
||||
menuBrowser = null;
|
||||
mp.gui.chat.show(true);
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.game.graphics.stopScreenEffect("FocusIn");
|
||||
mp.game.graphics.startScreenEffect("FocusOut", 0, false);
|
||||
return;
|
||||
}
|
||||
|
||||
mp.game.graphics.stopScreenEffect("FocusOut");
|
||||
mp.game.graphics.startScreenEffect("FocusIn", 0, false);
|
||||
menuBrowser = mp.browsers.new("package://assets/html/vehiclemenu/index.html");
|
||||
mp.gui.chat.show(false);
|
||||
mp.gui.cursor.show(true, true);
|
||||
});
|
||||
|
||||
mp.events.add('doAction', (action) => {
|
||||
mp.events.call('ToggleVehicleMenu');
|
||||
|
||||
switch (action) {
|
||||
case 8: // Motor
|
||||
mp.events.callRemote("VehicleMenu_ToggleEngine");
|
||||
break;
|
||||
case 5: // Auf -/ Abschließen
|
||||
mp.events.callRemote("VehicleMenu_LockCar");
|
||||
break;
|
||||
case 3: // Türen
|
||||
showDoorsMenu();
|
||||
break;
|
||||
case 7: // Parken
|
||||
mp.events.callRemote("CLIENT:VehicleMenu_ParkCar");
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
function showDoorsMenu() {
|
||||
globalData.InMenu = true;
|
||||
|
||||
var doorMenu = new Menu("Türen", "Türen verwalten", new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
doorMenu.AddItem(new UIMenuListItem("Tür", "Welche Tür darf's sein?", new ItemsCollection([
|
||||
" Fahrertür",
|
||||
" Beifahrertür",
|
||||
"Hinten links",
|
||||
"Hinten rechts",
|
||||
"Motorhaube",
|
||||
"Kofferraum"
|
||||
])));
|
||||
|
||||
doorMenu.AddItem(new UIMenuItem("Alle öffnen", "Öffnet alle Türen"));
|
||||
doorMenu.AddItem(new UIMenuItem("Alle schließen", "Schließt alle Türen"));
|
||||
|
||||
doorMenu.ItemSelect.on((item, index) => {
|
||||
if (index === 0) {
|
||||
var doorId = -1;
|
||||
switch (item.SelectedItem.DisplayText) {
|
||||
case " Fahrertür":
|
||||
doorId = 0;
|
||||
break;
|
||||
case " Beifahrertür":
|
||||
doorId = 1;
|
||||
break;
|
||||
case "Hinten links":
|
||||
doorId = 2;
|
||||
break;
|
||||
case "Hinten rechts":
|
||||
doorId = 3;
|
||||
break;
|
||||
case "Motorhaube":
|
||||
doorId = 4;
|
||||
break;
|
||||
case "Kofferraum":
|
||||
doorId = 5;
|
||||
break;
|
||||
}
|
||||
if (doorId !== -1) {
|
||||
mp.events.callRemote("VehicleMenu_ToggleSingleDoor", doorId);
|
||||
}
|
||||
} else if (index === 1) {
|
||||
mp.events.callRemote("VehicleMenu_OpenAllDoors");
|
||||
} else if (index === 2) {
|
||||
mp.events.callRemote("VehicleMenu_CloseAllDoors");
|
||||
}
|
||||
});
|
||||
|
||||
doorMenu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
|
||||
doorMenu.Open();
|
||||
}
|
||||
}
|
||||
7
ReallifeGamemode.Client/Gui/wanteds.ts
Normal file
7
ReallifeGamemode.Client/Gui/wanteds.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
export default function wanteds(globalData: IGlobalData) {
|
||||
var browser = mp.browsers.new("package://assets/html/wanteds/index.html");
|
||||
|
||||
mp.events.add("SERVER:SetWanteds", (count: number) => {
|
||||
browser.execute(`setWanteds(${count});`);
|
||||
});
|
||||
}
|
||||
107
ReallifeGamemode.Client/Interaction/ItemShop.ts
Normal file
107
ReallifeGamemode.Client/Interaction/ItemShop.ts
Normal file
@@ -0,0 +1,107 @@
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
|
||||
const UIMenu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
|
||||
export default function itemShopList(globalData: IGlobalData) {
|
||||
|
||||
|
||||
const localPlayer = mp.players.local;
|
||||
var playerPos;
|
||||
var myVar;
|
||||
|
||||
let mainMenu = null;
|
||||
let items = [];
|
||||
let currentMenuIdx = -1;
|
||||
let menuTransition = false; // workaround for ItemSelect event being called twice between menu transitions
|
||||
|
||||
|
||||
|
||||
function addItems(data) {
|
||||
|
||||
// Fill it
|
||||
|
||||
for (const item of data) {
|
||||
|
||||
const tempItem = new UIMenuItem(item.Name, "");
|
||||
|
||||
tempItem.SetRightLabel(`${item.Price > 0 ? `$${item.Price}` : "FREE"}`);
|
||||
|
||||
mainMenu.AddItem(tempItem);
|
||||
|
||||
items.push(item);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function myTimer() {
|
||||
let dist = mp.game.gameplay.getDistanceBetweenCoords(localPlayer.position.x, localPlayer.position.y, 0, playerPos.x, playerPos.y, 0, false);
|
||||
if (dist > 3) {
|
||||
clearInterval(myVar);
|
||||
if (mainMenu && mainMenu.Visible) mainMenu.Close();
|
||||
}
|
||||
}
|
||||
|
||||
mp.events.add("itemMenu:updateData", (jsonData) => {
|
||||
if (!globalData.InMenu) {
|
||||
globalData.InMenu = true;
|
||||
playerPos = localPlayer.position;
|
||||
var data = JSON.parse(jsonData);
|
||||
|
||||
// Default menu banner
|
||||
|
||||
const bannerSprite = {
|
||||
library: "shopui_title_conveniencestore",
|
||||
texture: "shopui_title_conveniencestore"
|
||||
};
|
||||
|
||||
// Hide the chat
|
||||
mp.gui.chat.show(false);
|
||||
|
||||
// Reset some variables
|
||||
currentMenuIdx = -1;
|
||||
menuTransition = false;
|
||||
|
||||
|
||||
// Create a new main menu
|
||||
mainMenu = new UIMenu("", "CHOOSE A ITEM", new Point(0, 0), bannerSprite.library, bannerSprite.texture);
|
||||
mainMenu.Visible = true;
|
||||
|
||||
// Add items
|
||||
addItems(data);
|
||||
|
||||
myVar = setInterval(myTimer, 100);
|
||||
|
||||
// Main menu events
|
||||
mainMenu.ItemSelect.on((selectedItem, itemIndex) => {
|
||||
const nextItem = items[itemIndex];
|
||||
mp.events.callRemote("SERVER:BuyItems", nextItem.Name);
|
||||
|
||||
});
|
||||
|
||||
mainMenu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
mp.gui.chat.show(true);
|
||||
|
||||
currentMenuIdx = -1;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("itemMenu:close", () => {
|
||||
if (mainMenu && mainMenu.Visible) mainMenu.Close();
|
||||
});
|
||||
|
||||
mp.events.add("itemMenu:Error", () => {
|
||||
mp.game.audio.playSoundFrontend(1, "Hack_Failed", "DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS", true);
|
||||
});
|
||||
}
|
||||
253
ReallifeGamemode.Client/Interaction/bankmenu.ts
Normal file
253
ReallifeGamemode.Client/Interaction/bankmenu.ts
Normal file
@@ -0,0 +1,253 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Managers Interaction (InteractionManager.cs)
|
||||
* @author MichaPlays
|
||||
* @copyright (c) 2008 - 2018 Life of German
|
||||
*/
|
||||
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
import InputHelper from '../inputhelper';
|
||||
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
|
||||
let screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
let saveItem = new UIMenuItem("Bestätigen", "");
|
||||
saveItem.BackColor = new Color(13, 71, 161);
|
||||
saveItem.HighlightedBackColor = new Color(25, 118, 210);
|
||||
|
||||
let cancelItem = new UIMenuItem("Schließen", "");
|
||||
cancelItem.BackColor = new Color(213, 0, 0);
|
||||
cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
|
||||
export default function bankMenuHandle(globalData: IGlobalData) {
|
||||
|
||||
var factionBankmenu: NativeUI.Menu;
|
||||
var bankmenu: NativeUI.Menu;
|
||||
|
||||
|
||||
var paymentItem = new UIMenuItem("Überweisen", "Spieler Geld überweisen (+5% Steuern)");
|
||||
|
||||
var payInItem = new UIMenuItem("Einzahlen", "Geld einzahlen");
|
||||
|
||||
var payOutItem = new UIMenuItem("Auszahlen", "Geld auszahlen");
|
||||
|
||||
var factionPaymentItem = new UIMenuItem("Überweisen", "Spieler Geld überweisen (+5% Steuern)");
|
||||
|
||||
var factionPayInItem = new UIMenuItem("Einzahlen", "Geld auf die Fraktionskasse zahlen");
|
||||
|
||||
var factionPayOutItem = new UIMenuItem("Überweisen", "Geld von der Fraktionskasse abheben");
|
||||
|
||||
var factionBankBalance = new UIMenuItem("Kontostand", "");
|
||||
|
||||
var paymentname: string;
|
||||
|
||||
var factionname: string;
|
||||
|
||||
mp.events.add('showBankMenu', () => {
|
||||
if (!globalData.InMenu) {
|
||||
|
||||
globalData.InMenu = true;
|
||||
|
||||
bankmenu = new Menu("Bank", "", new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
bankmenu.AddItem(payInItem);
|
||||
bankmenu.AddItem(payOutItem);
|
||||
bankmenu.AddItem(paymentItem);
|
||||
bankmenu.AddItem(cancelItem);
|
||||
bankmenu.Visible = true;
|
||||
|
||||
bankmenu.ItemSelect.on((item) => {
|
||||
if (item.Text === "Einzahlen") {
|
||||
mp.gui.chat.activate(true);
|
||||
mp.gui.cursor.show(true, true);
|
||||
globalData.InMenu = false;
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Wie viel möchtest du einzahlen?", globalData);
|
||||
input.show();
|
||||
input.getValue(amount => {
|
||||
mp.events.callRemote("CLIENT:payIn", amount);
|
||||
mp.gui.cursor.show(false, false);
|
||||
bankmenu.Close(true);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
}else if (item.Text === "Auszahlen") {
|
||||
mp.gui.chat.activate(true);
|
||||
mp.gui.cursor.show(true, true);
|
||||
globalData.InMenu = false;
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Wie viel möchtest du Auszahlen?", globalData);
|
||||
input.show();
|
||||
input.getValue(amount => {
|
||||
mp.events.callRemote("CLIENT:payOut", amount);
|
||||
mp.gui.cursor.show(false, false);
|
||||
bankmenu.Close(true);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
} else if (item.Text === "Überweisen" ) {
|
||||
mp.gui.chat.activate(true);
|
||||
mp.gui.cursor.show(true, true);
|
||||
globalData.InMenu = false;
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Wem möchtest du Geld überweisen? (Name/ID)", globalData);
|
||||
input.show();
|
||||
input.getValue(name => {
|
||||
mp.events.call("CLIENT:bank_name", name);
|
||||
mp.gui.cursor.show(false, false);
|
||||
bankmenu.Close(true);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
|
||||
} else if (item.Text === "Schließen") {
|
||||
mp.gui.cursor.show(false, false);
|
||||
bankmenu.Close(true);
|
||||
globalData.InInput = false;
|
||||
}
|
||||
});
|
||||
|
||||
bankmenu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add('removeBankmenu', () => {
|
||||
mp.gui.cursor.show(false, false);
|
||||
bankmenu.Close(true);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
|
||||
mp.events.add("CLIENT:bank_name", (name) => {
|
||||
paymentname = name;
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Wie viel möchtest du Überweisen??", globalData);
|
||||
mp.gui.cursor.show(true, true);
|
||||
input.show();
|
||||
input.getValue(amount => {
|
||||
mp.events.callRemote("CLIENT:payment", JSON.stringify(paymentname), amount);
|
||||
mp.gui.cursor.show(false, false);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
mp.events.add('removeFactionBankmenu', () => {
|
||||
mp.gui.cursor.show(false, false);
|
||||
factionBankmenu.Close(true);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
|
||||
|
||||
|
||||
mp.events.add('showFactionBankMenu', (factionMoney) => {
|
||||
if (!globalData.InMenu) {
|
||||
|
||||
globalData.InMenu = true;
|
||||
|
||||
factionBankmenu = new Menu("Fraktionskasse", "", new Point(0, screenRes.y / 3), null, null);
|
||||
factionBankmenu.AddItem(factionBankBalance);
|
||||
factionBankBalance.SetRightLabel("$" + factionMoney);
|
||||
factionBankmenu.AddItem(factionPayInItem);
|
||||
factionBankmenu.AddItem(cancelItem);
|
||||
factionBankmenu.Visible = true;
|
||||
|
||||
factionBankmenu.ItemSelect.on((item) => {
|
||||
if (item.Text === "Einzahlen") {
|
||||
mp.gui.chat.activate(true);
|
||||
mp.gui.cursor.show(true, true);
|
||||
globalData.InMenu = false;
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Wie viel möchtest du einzahlen?", globalData);
|
||||
input.show();
|
||||
input.getValue(amount => {
|
||||
mp.events.callRemote("CLIENT:factionPayIn", amount);
|
||||
mp.gui.cursor.show(false, false);
|
||||
factionBankmenu.Close(true);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
}else if (item.Text === "Schließen") {
|
||||
mp.gui.cursor.show(false, false);
|
||||
factionBankmenu.Close(true);
|
||||
globalData.InInput = false;
|
||||
}
|
||||
});
|
||||
|
||||
factionBankmenu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add('showFactionBankMenuLeader', (factionMoney) => {
|
||||
if (!globalData.InMenu) {
|
||||
|
||||
globalData.InMenu = true;
|
||||
|
||||
factionBankmenu = new Menu("Fraktionskasse", "", new Point(0, screenRes.y / 3), null, null);
|
||||
factionBankmenu.AddItem(factionBankBalance);
|
||||
factionBankBalance.SetRightLabel("$" + factionMoney);
|
||||
factionBankmenu.AddItem(factionPayInItem);
|
||||
factionBankmenu.AddItem(factionPaymentItem);
|
||||
factionBankmenu.AddItem(cancelItem);
|
||||
factionBankmenu.Visible = true;
|
||||
|
||||
factionBankmenu.ItemSelect.on((item) => {
|
||||
if (item.Text === "Einzahlen") {
|
||||
mp.gui.chat.activate(true);
|
||||
mp.gui.cursor.show(true, true);
|
||||
globalData.InMenu = false;
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Wie viel möchtest du einzahlen?", globalData);
|
||||
input.show();
|
||||
input.getValue(amount => {
|
||||
mp.events.callRemote("CLIENT:factionPayIn", amount);
|
||||
mp.gui.cursor.show(false, false);
|
||||
factionBankmenu.Close(true);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
}else if (item.Text === "Überweisen") {
|
||||
mp.gui.chat.activate(true);
|
||||
mp.gui.cursor.show(true, true);
|
||||
globalData.InMenu = false;
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Wem möchtest du Geld überweisen? (Name/ID)", globalData);
|
||||
input.show();
|
||||
input.getValue(name => {
|
||||
mp.events.call("CLIENT:bank_factionname", name);
|
||||
mp.gui.cursor.show(false, false);
|
||||
factionBankmenu.Close(true);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
}else if (item.Text === "Schließen") {
|
||||
mp.gui.cursor.show(false, false);
|
||||
factionBankmenu.Close(true);
|
||||
globalData.InInput = false;
|
||||
}
|
||||
});
|
||||
|
||||
factionBankmenu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("CLIENT:bank_factionname", (name) => {
|
||||
paymentname = name;
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Wie viel möchtest du Überweisen?", globalData);
|
||||
mp.gui.cursor.show(true, true);
|
||||
input.show();
|
||||
input.getValue(amount => {
|
||||
mp.events.callRemote("CLIENT:factionPayment", JSON.stringify(paymentname), amount);
|
||||
mp.gui.cursor.show(false, false);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
420
ReallifeGamemode.Client/Interaction/clothes/ClotheShop.ts
Normal file
420
ReallifeGamemode.Client/Interaction/clothes/ClotheShop.ts
Normal file
@@ -0,0 +1,420 @@
|
||||
import * as NativeUI from '../../libs/NativeUI';
|
||||
import maleTops from "./male_tops.json";
|
||||
import maleShoes from "./male_shoes.json";
|
||||
import maleLegs from "./male_legs.json";
|
||||
import maleUndershirts from "./male_undershirts.json";
|
||||
import maleAccessoires from "./male_accessories.json";
|
||||
import male_combination from "./male_torso_top_combination.json";
|
||||
|
||||
import femaleTops from "./female_tops.json";
|
||||
import femaleShoes from "./female_shoes.json";
|
||||
import femaleLegs from "./female_legs.json";
|
||||
import femaleUndershirts from "./female_undershirts.json";
|
||||
import femaleAccessoires from "./female_accessories.json";
|
||||
import female_combination from "./female_torso_top_combination.json";
|
||||
|
||||
const UIMenu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
|
||||
|
||||
export default function clotheShopList(globalData: IGlobalData) {
|
||||
const categoryTitles = {
|
||||
clothes: {
|
||||
1: "Masks",
|
||||
2: "Hair Styles",
|
||||
3: "Torsos",
|
||||
4: "Legs",
|
||||
5: "Bags and Parachutes",
|
||||
6: "Shoes",
|
||||
7: "Accessories",
|
||||
8: "Undershirts",
|
||||
9: "Body Armors",
|
||||
10: "Decals",
|
||||
11: "Tops"
|
||||
},
|
||||
|
||||
props: {
|
||||
0: "Hats",
|
||||
1: "Glasses",
|
||||
2: "Ears",
|
||||
6: "Watches",
|
||||
7: "Bracelets"
|
||||
}
|
||||
};
|
||||
|
||||
const localPlayer = mp.players.local;
|
||||
var playerPos;
|
||||
var myVar;
|
||||
|
||||
let mainMenu = null;
|
||||
let categoryMenus = [];
|
||||
let clothingData = [];
|
||||
let currentMenuIdx = -1;
|
||||
let menuTransition = false; // workaround for ItemSelect event being called twice between menu transitions
|
||||
let lastClothing = null;
|
||||
|
||||
function getClothingName(key, ClotheId, gender) {
|
||||
var textures = []
|
||||
var comb;
|
||||
var tops;
|
||||
var undersh;
|
||||
var shoes;
|
||||
var legs;
|
||||
var acces;
|
||||
|
||||
if (!gender) {
|
||||
comb = male_combination;
|
||||
tops = maleTops;
|
||||
undersh = maleUndershirts;
|
||||
shoes = maleShoes;
|
||||
legs = maleLegs;
|
||||
acces = maleAccessoires;
|
||||
} else {
|
||||
comb = female_combination;
|
||||
tops = femaleTops;
|
||||
undersh = femaleUndershirts;
|
||||
shoes = femaleShoes;
|
||||
legs = femaleLegs;
|
||||
acces = femaleAccessoires;
|
||||
}
|
||||
|
||||
switch (key) {
|
||||
case 11:
|
||||
for (var i = 0; i < Object.keys(tops[ClotheId]).length; i++) {
|
||||
|
||||
|
||||
if (tops[ClotheId][i].Localized != "NULL") {
|
||||
for (var x = 0; x < Object.keys(comb.combination).length; x++) {
|
||||
if (comb.combination[x].Top == ClotheId) {
|
||||
for (var y = 0; y < Object.keys(undersh[comb.combination[x].Undershirt]).length; y++) {
|
||||
if (undersh[comb.combination[x].Undershirt][y].Localized != "NULL") {
|
||||
const newData = {
|
||||
id: i,
|
||||
data: [tops[ClotheId][i]],
|
||||
torso: [comb.combination[x].Torso],
|
||||
undershirt: [comb.combination[x].Undershirt, undersh[comb.combination[x].Undershirt][y], y]
|
||||
}
|
||||
textures.push(newData);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
for (var i = 0; i < Object.keys(shoes[ClotheId]).length; i++) {
|
||||
if (shoes[ClotheId][i].Localized != "NULL") {
|
||||
const newData = {
|
||||
id: i,
|
||||
data: [shoes[ClotheId][i]]
|
||||
}
|
||||
textures.push(newData);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
for (var i = 0; i < Object.keys(legs[ClotheId]).length; i++) {
|
||||
if (legs[ClotheId][i].Localized != "NULL") {
|
||||
const newData = {
|
||||
id: i,
|
||||
data: [legs[ClotheId][i]]
|
||||
}
|
||||
textures.push(newData);
|
||||
}
|
||||
}
|
||||
break;
|
||||
/*
|
||||
case 7:
|
||||
for (var i = 0; i < Object.keys(acces[ClotheId]).length; i++) {
|
||||
if (acces[ClotheId][i].Localized != "NULL") {
|
||||
const newData = {
|
||||
id: i,
|
||||
data: [acces[ClotheId][i]]
|
||||
}
|
||||
textures.push(newData);
|
||||
}
|
||||
}
|
||||
break;
|
||||
*/
|
||||
}
|
||||
return textures;
|
||||
}
|
||||
|
||||
function addClothingItems(type, bannerSprite, key, value, gender) {
|
||||
var categoryMenu;
|
||||
var cloth = [];
|
||||
var tx = [];
|
||||
|
||||
if (Object.keys(categoryMenus).length > 0) {
|
||||
for (var i = 0; i < categoryMenus.length; i++) {
|
||||
if (categoryMenus[i].slotIdx == key) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
mainMenu.AddItem(new UIMenuItem(categoryTitles[type][key], `${type === "props" ? "Prop category." : "Clothing category."}`));
|
||||
// Create category menu
|
||||
categoryMenu = new UIMenu("", categoryTitles[type][key].toUpperCase(), new Point(0, 0), bannerSprite.library, bannerSprite.texture);
|
||||
categoryMenu.Visible = false;
|
||||
} else {
|
||||
mainMenu.AddItem(new UIMenuItem(categoryTitles[type][key], `${type === "props" ? "Prop category." : "Clothing category."}`));
|
||||
// Create category menu
|
||||
categoryMenu = new UIMenu("", categoryTitles[type][key].toUpperCase(), new Point(0, 0), bannerSprite.library, bannerSprite.texture);
|
||||
categoryMenu.Visible = false;
|
||||
}
|
||||
|
||||
mainMenu.Item
|
||||
|
||||
// Fill it
|
||||
|
||||
for (const item of value) {
|
||||
if (item.ComponentId == key) {
|
||||
var txData = getClothingName(key, item.ClotheId, gender);
|
||||
|
||||
for (const x of txData) {
|
||||
var itemDescription = (key === 11 ? mp.game.ui.getLabelText(x.undershirt[1].GXT) : "Clothing item.");
|
||||
//var itemDescription = (key === 11 ? x.undershirt[1].GXT + " - " + x.id: "Clothing item.");
|
||||
if (itemDescription == "NULL") {
|
||||
itemDescription = "Clothing item.";
|
||||
}
|
||||
const tempItem = new UIMenuItem(mp.game.ui.getLabelText(x.data[0].GXT), itemDescription);
|
||||
//const tempItem = new UIMenuItem(x.data[0].GXT + " - " + x.id , itemDescription);
|
||||
|
||||
tempItem.SetRightLabel(`${item.Price > 0 ? `$${item.Price}` : "FREE"}`);
|
||||
|
||||
categoryMenu.AddItem(tempItem);
|
||||
|
||||
cloth.push(item);
|
||||
tx.push(x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
categoryMenus.push({
|
||||
menu: categoryMenu,
|
||||
type: type,
|
||||
slotIdx: Number(key),
|
||||
item: cloth,
|
||||
texture: tx
|
||||
});
|
||||
}
|
||||
|
||||
function submenuItemChangeHandler(newIndex) {
|
||||
const currentMenu = categoryMenus[currentMenuIdx];
|
||||
const currentItem = currentMenu.item[newIndex];
|
||||
const currentTexture = currentMenu.texture[newIndex].id;
|
||||
//const currentItem = clothingData[currentMenu.type][currentMenu.slotIdx][newIndex];
|
||||
|
||||
if (currentMenu.slotIdx == 11) {
|
||||
const currentTorso = currentMenu.texture[newIndex].torso[0];
|
||||
const currentUndershirt = currentMenu.texture[newIndex].undershirt;
|
||||
mp.players.local.setComponentVariation(3, currentTorso, 0, 2); //set Torso
|
||||
mp.players.local.setComponentVariation(8, currentUndershirt[0], currentUndershirt[2], 2); //set Undershirt
|
||||
mp.players.local.setComponentVariation(currentMenu.slotIdx, currentItem.ClotheId, currentTexture, 2); //set Top
|
||||
} else {
|
||||
mp.players.local.setComponentVariation(currentMenu.slotIdx, currentItem.ClotheId, currentTexture, 2);
|
||||
}
|
||||
|
||||
/*
|
||||
case "props":
|
||||
if (currentItem.drawable === -1) {
|
||||
localPlayer.clearProp(currentMenu.slotIdx);
|
||||
} else {
|
||||
localPlayer.setPropIndex(currentMenu.slotIdx, currentItem.drawable, currentItem.texture, true);
|
||||
}
|
||||
break;
|
||||
*/
|
||||
}
|
||||
|
||||
function resetPreview() {
|
||||
if (lastClothing) {
|
||||
switch (lastClothing.type) {
|
||||
case "clothes":
|
||||
if (lastClothing.slotIdx == 11) {
|
||||
localPlayer.setComponentVariation(3, lastClothing.torso, 0, 2);
|
||||
localPlayer.setComponentVariation(8, lastClothing.undershirt[0], lastClothing.undershirt[1], 2);
|
||||
localPlayer.setComponentVariation(lastClothing.slotIdx, lastClothing.drawable, lastClothing.texture, 2);
|
||||
} else {
|
||||
localPlayer.setComponentVariation(lastClothing.slotIdx, lastClothing.drawable, lastClothing.texture, 2);
|
||||
}
|
||||
break;
|
||||
|
||||
case "props":
|
||||
if (lastClothing.drawable === -1) {
|
||||
localPlayer.clearProp(lastClothing.slotIdx);
|
||||
} else {
|
||||
localPlayer.setPropIndex(lastClothing.slotIdx, lastClothing.drawable, lastClothing.texture, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
lastClothing = null;
|
||||
}
|
||||
}
|
||||
|
||||
function myTimer() {
|
||||
let dist = mp.game.gameplay.getDistanceBetweenCoords(localPlayer.position.x, localPlayer.position.y, 0, playerPos.x, playerPos.y, 0, false);
|
||||
if (dist > 3) {
|
||||
clearInterval(myVar);
|
||||
resetPreview();
|
||||
if (currentMenuIdx !== -1) categoryMenus[currentMenuIdx].menu.Close();
|
||||
if (mainMenu && mainMenu.Visible) mainMenu.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
mp.events.add("clothesMenu:updateData", (jsonBannerSprite, jsonData, gender) => {
|
||||
if (!globalData.InMenu) {
|
||||
globalData.InMenu = true;
|
||||
playerPos = localPlayer.position;
|
||||
var bannerSprite = JSON.parse(jsonBannerSprite);
|
||||
var data = JSON.parse(jsonData);
|
||||
|
||||
// Default menu banner
|
||||
if (bannerSprite == null) {
|
||||
bannerSprite = {
|
||||
library: "commonmenu",
|
||||
texture: "interaction_bgd"
|
||||
};
|
||||
} else if (bannerSprite == 1) {
|
||||
bannerSprite = {
|
||||
library: "shopui_title_lowendfashion",
|
||||
texture: "shopui_title_lowendfashion"
|
||||
};
|
||||
} else if (bannerSprite == 2) {
|
||||
bannerSprite = {
|
||||
library: "shopui_title_midfashion",
|
||||
texture: "shopui_title_midfashion"
|
||||
};
|
||||
} else if (bannerSprite == 3) {
|
||||
bannerSprite = {
|
||||
library: "shopui_title_highendfashion",
|
||||
texture: "shopui_title_highendfashion"
|
||||
};
|
||||
}
|
||||
// Hide the chat
|
||||
mp.gui.chat.show(false);
|
||||
|
||||
// Reset some variables
|
||||
categoryMenus = [];
|
||||
currentMenuIdx = -1;
|
||||
menuTransition = false;
|
||||
lastClothing = null;
|
||||
|
||||
// Create a new main menu
|
||||
mainMenu = new UIMenu("", "SELECT A CATEGORY", new Point(0, 0), bannerSprite.library, bannerSprite.texture);
|
||||
mainMenu.Visible = true;
|
||||
|
||||
// Update clothingData
|
||||
clothingData = data;
|
||||
|
||||
// Add clothes
|
||||
|
||||
addClothingItems("clothes", bannerSprite, 11, data[0], gender);
|
||||
addClothingItems("clothes", bannerSprite, 4, data[1], gender);
|
||||
addClothingItems("clothes", bannerSprite, 6, data[2], gender);
|
||||
//addClothingItems("clothes", bannerSprite, 7, data[3], gender);
|
||||
myVar = setInterval(myTimer, 100);
|
||||
// Add props
|
||||
// for (const [key, value] of Object.entries(clothingData.props)) addClothingItems("props", bannerSprite, key, value);
|
||||
|
||||
// Submenu events
|
||||
for (const item of categoryMenus) {
|
||||
// Preview hovering item
|
||||
item.menu.IndexChange.on(submenuItemChangeHandler);
|
||||
|
||||
// Buy hovering item
|
||||
item.menu.ItemSelect.on((selectedItem, itemIndex) => {
|
||||
if (menuTransition) {
|
||||
menuTransition = false;
|
||||
return;
|
||||
}
|
||||
|
||||
const currentMenu = categoryMenus[currentMenuIdx];
|
||||
const currentItem = currentMenu.item[itemIndex];
|
||||
const currentTexture = currentMenu.texture[itemIndex].id;
|
||||
if (currentMenu.slotIdx == 11) {
|
||||
const currentTorso = currentMenu.texture[itemIndex].torso[0];
|
||||
const currentUndershirt = currentMenu.texture[itemIndex].undershirt;
|
||||
var serverData = [currentMenu.slotIdx, currentTexture, currentItem.ClotheId, currentTorso, currentUndershirt[0], currentUndershirt[2], currentItem.Price];
|
||||
if (lastClothing.drawable == currentItem.ClotheId && lastClothing.texture == currentTexture && lastClothing.undershirt[0] == currentUndershirt[0] && lastClothing.undershirt[1] == currentUndershirt[2]) {
|
||||
mp.game.audio.playSoundFrontend(1, "Hack_Failed", "DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS", true);
|
||||
} else {
|
||||
mp.events.callRemote("SERVER:BuyCharacterClothes", "clothe", JSON.stringify(serverData));
|
||||
}
|
||||
} else {
|
||||
var serverData = [currentMenu.slotIdx, currentTexture, currentItem.ClotheId, -1, -1, -1, currentItem.Price];
|
||||
if (lastClothing.drawable == currentItem.ClotheId && lastClothing.texture == currentTexture) {
|
||||
mp.game.audio.playSoundFrontend(1, "Hack_Failed", "DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS", true);
|
||||
} else {
|
||||
mp.events.callRemote("SERVER:BuyCharacterClothes", "clothe", JSON.stringify(serverData));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Reset preview when player backs out of category menu
|
||||
item.menu.MenuClose.on(() => {
|
||||
resetPreview();
|
||||
|
||||
currentMenuIdx = -1;
|
||||
mainMenu.Visible = true;
|
||||
});
|
||||
}
|
||||
|
||||
// Main menu events
|
||||
mainMenu.ItemSelect.on((selectedItem, itemIndex) => {
|
||||
const nextMenu = categoryMenus[itemIndex];
|
||||
const slot = Number(nextMenu.slotIdx);
|
||||
|
||||
lastClothing = {
|
||||
type: nextMenu.type,
|
||||
slotIdx: slot,
|
||||
drawable: (nextMenu.type === "props" ? localPlayer.getPropIndex(slot) : localPlayer.getDrawableVariation(slot)),
|
||||
texture: (nextMenu.type === "props" ? localPlayer.getPropTextureIndex(slot) : localPlayer.getTextureVariation(slot)),
|
||||
undershirt: [localPlayer.getDrawableVariation(8), localPlayer.getTextureVariation(8)],
|
||||
torso: localPlayer.getDrawableVariation(3)
|
||||
};
|
||||
|
||||
currentMenuIdx = itemIndex;
|
||||
mainMenu.Visible = false;
|
||||
nextMenu.menu.Visible = true;
|
||||
menuTransition = true;
|
||||
|
||||
submenuItemChangeHandler(nextMenu.menu.CurrentSelection);
|
||||
});
|
||||
|
||||
mainMenu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
mp.gui.chat.show(true);
|
||||
|
||||
currentMenuIdx = -1;
|
||||
lastClothing = null;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("clothesMenu:updateLast", (drawable, texture, undershirt, undershirtTexture, torso) => {
|
||||
if (lastClothing) {
|
||||
lastClothing.drawable = drawable;
|
||||
lastClothing.texture = texture;
|
||||
lastClothing.undershirt[0] = undershirt;
|
||||
lastClothing.undershirt[1] = undershirtTexture;
|
||||
lastClothing.torso = torso;
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("clothesMenu:close", () => {
|
||||
if (currentMenuIdx !== -1) categoryMenus[currentMenuIdx].menu.Close();
|
||||
if (mainMenu && mainMenu.Visible) mainMenu.Close();
|
||||
});
|
||||
|
||||
mp.events.add("clothesMenu:Error", () => {
|
||||
mp.game.audio.playSoundFrontend(1, "Hack_Failed", "DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS", true);
|
||||
});
|
||||
}
|
||||
1516
ReallifeGamemode.Client/Interaction/clothes/female_accessories.json
Normal file
1516
ReallifeGamemode.Client/Interaction/clothes/female_accessories.json
Normal file
File diff suppressed because it is too large
Load Diff
5270
ReallifeGamemode.Client/Interaction/clothes/female_legs.json
Normal file
5270
ReallifeGamemode.Client/Interaction/clothes/female_legs.json
Normal file
File diff suppressed because it is too large
Load Diff
4258
ReallifeGamemode.Client/Interaction/clothes/female_shoes.json
Normal file
4258
ReallifeGamemode.Client/Interaction/clothes/female_shoes.json
Normal file
File diff suppressed because it is too large
Load Diff
15224
ReallifeGamemode.Client/Interaction/clothes/female_tops.json
Normal file
15224
ReallifeGamemode.Client/Interaction/clothes/female_tops.json
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
5146
ReallifeGamemode.Client/Interaction/clothes/female_torsos.json
Normal file
5146
ReallifeGamemode.Client/Interaction/clothes/female_torsos.json
Normal file
File diff suppressed because it is too large
Load Diff
9332
ReallifeGamemode.Client/Interaction/clothes/female_undershirts.json
Normal file
9332
ReallifeGamemode.Client/Interaction/clothes/female_undershirts.json
Normal file
File diff suppressed because it is too large
Load Diff
2358
ReallifeGamemode.Client/Interaction/clothes/male_accessories.json
Normal file
2358
ReallifeGamemode.Client/Interaction/clothes/male_accessories.json
Normal file
File diff suppressed because it is too large
Load Diff
5136
ReallifeGamemode.Client/Interaction/clothes/male_legs.json
Normal file
5136
ReallifeGamemode.Client/Interaction/clothes/male_legs.json
Normal file
File diff suppressed because it is too large
Load Diff
4254
ReallifeGamemode.Client/Interaction/clothes/male_shoes.json
Normal file
4254
ReallifeGamemode.Client/Interaction/clothes/male_shoes.json
Normal file
File diff suppressed because it is too large
Load Diff
14114
ReallifeGamemode.Client/Interaction/clothes/male_tops.json
Normal file
14114
ReallifeGamemode.Client/Interaction/clothes/male_tops.json
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
4120
ReallifeGamemode.Client/Interaction/clothes/male_torsos.json
Normal file
4120
ReallifeGamemode.Client/Interaction/clothes/male_torsos.json
Normal file
File diff suppressed because it is too large
Load Diff
7148
ReallifeGamemode.Client/Interaction/clothes/male_undershirts.json
Normal file
7148
ReallifeGamemode.Client/Interaction/clothes/male_undershirts.json
Normal file
File diff suppressed because it is too large
Load Diff
5586
ReallifeGamemode.Client/Interaction/clothes/masks.json
Normal file
5586
ReallifeGamemode.Client/Interaction/clothes/masks.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,104 @@
|
||||
{
|
||||
"0": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2F_RW_0_0",
|
||||
"Localized": "Gold Snake Cuff"
|
||||
}
|
||||
},
|
||||
"1": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2F_RW_1_0",
|
||||
"Localized": "Gold Diamond Cuff"
|
||||
}
|
||||
},
|
||||
"2": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2F_RW_2_0",
|
||||
"Localized": "Gold Plain Cuff"
|
||||
}
|
||||
},
|
||||
"3": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2F_RW_3_0",
|
||||
"Localized": "Gold Le Chien Cuff"
|
||||
}
|
||||
},
|
||||
"4": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2F_RW_4_0",
|
||||
"Localized": "Gold Detail Cuff"
|
||||
}
|
||||
},
|
||||
"5": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2F_RW_5_0",
|
||||
"Localized": "Gold Swirl Cuff"
|
||||
}
|
||||
},
|
||||
"6": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2F_RW_6_0",
|
||||
"Localized": "Gold Textured Cuff"
|
||||
}
|
||||
},
|
||||
"7": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PRW_0_0",
|
||||
"Localized": "Light Wrist Chain (R)"
|
||||
}
|
||||
},
|
||||
"8": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PRW_1_0",
|
||||
"Localized": "Chunky Wrist Chain (R)"
|
||||
}
|
||||
},
|
||||
"9": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PRW_2_0",
|
||||
"Localized": "Square Wrist Chain (R)"
|
||||
}
|
||||
},
|
||||
"10": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PRW_3_0",
|
||||
"Localized": "Skull Wrist Chain (R)"
|
||||
}
|
||||
},
|
||||
"11": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PRW_4_0",
|
||||
"Localized": "Tread Wrist Chain (R)"
|
||||
}
|
||||
},
|
||||
"12": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PRW_5_0",
|
||||
"Localized": "Gear Wrist Chains (R)"
|
||||
}
|
||||
},
|
||||
"13": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PRW_6_0",
|
||||
"Localized": "Spiked Gauntlet (R)"
|
||||
}
|
||||
},
|
||||
"14": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PRW_7_0",
|
||||
"Localized": "Black Gauntlet (R)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_BIF_PRW_7_1",
|
||||
"Localized": "Chocolate Gauntlet (R)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_BIF_PRW_7_2",
|
||||
"Localized": "Tan Gauntlet (R)"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_BIF_PRW_7_3",
|
||||
"Localized": "Ox Blood Gauntlet (R)"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,230 @@
|
||||
{
|
||||
"0": {
|
||||
"0": {
|
||||
"GXT": "CLO_HST_E_0_0",
|
||||
"Localized": "Gray Earpiece"
|
||||
}
|
||||
},
|
||||
"1": {
|
||||
"0": {
|
||||
"GXT": "CLO_HST_E_1_0",
|
||||
"Localized": "Red Earpiece"
|
||||
}
|
||||
},
|
||||
"2": {
|
||||
"0": {
|
||||
"GXT": "CLO_HST_E_2_0",
|
||||
"Localized": "LCD Earpiece"
|
||||
}
|
||||
},
|
||||
"3": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXF_E_0_0",
|
||||
"Localized": "Platinum Pendulums"
|
||||
}
|
||||
},
|
||||
"4": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXF_E_1_0",
|
||||
"Localized": "Gold Pendulums"
|
||||
}
|
||||
},
|
||||
"5": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXF_E_2_0",
|
||||
"Localized": "Gold Diamond Rounds"
|
||||
}
|
||||
},
|
||||
"6": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXF_E_3_0",
|
||||
"Localized": "Gold Diamond Drops"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXF_E_3_1",
|
||||
"Localized": "Platinum Diamond Drops"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXF_E_3_2",
|
||||
"Localized": "Black Gold Diamond Drops"
|
||||
}
|
||||
},
|
||||
"7": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXF_E_4_0",
|
||||
"Localized": "Gold Waterfalls"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXF_E_4_1",
|
||||
"Localized": "Platinum Waterfalls"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXF_E_4_2",
|
||||
"Localized": "Black Gold Waterfalls"
|
||||
}
|
||||
},
|
||||
"8": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXF_E_5_0",
|
||||
"Localized": "Gold Totems"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXF_E_5_1",
|
||||
"Localized": "Black Gold Totems"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXF_E_5_2",
|
||||
"Localized": "Platinum Totems"
|
||||
}
|
||||
},
|
||||
"9": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXF_E_6_0",
|
||||
"Localized": "Gold Diamond Chains"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXF_E_6_1",
|
||||
"Localized": "Platinum Diamond Chains"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXF_E_6_2",
|
||||
"Localized": "Black Gold Diamond Chains"
|
||||
}
|
||||
},
|
||||
"10": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXF_E_7_0",
|
||||
"Localized": "Gold Emerald Chains"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXF_E_7_1",
|
||||
"Localized": "Platinum Emerald Chains"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXF_E_7_2",
|
||||
"Localized": "Black Gold Emerald Chains"
|
||||
}
|
||||
},
|
||||
"11": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXF_E_8_0",
|
||||
"Localized": "Gold Sun Drops"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXF_E_8_1",
|
||||
"Localized": "Platinum Sun Drops"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXF_E_8_2",
|
||||
"Localized": "Black Gold Sun Drops"
|
||||
}
|
||||
},
|
||||
"12": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXF_E_9_0",
|
||||
"Localized": "Platinum Diamond Studs"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXF_E_9_1",
|
||||
"Localized": "Gold Diamond Studs"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXF_E_9_2",
|
||||
"Localized": "Black Gold Diamond Studs"
|
||||
}
|
||||
},
|
||||
"13": {
|
||||
"0": {
|
||||
"GXT": "CLO_S1F_E_0_0",
|
||||
"Localized": "Assault Hoops"
|
||||
}
|
||||
},
|
||||
"14": {
|
||||
"0": {
|
||||
"GXT": "CLO_S1F_E_1_0",
|
||||
"Localized": "Chunky Hoops"
|
||||
}
|
||||
},
|
||||
"15": {
|
||||
"0": {
|
||||
"GXT": "CLO_S1F_E_2_0",
|
||||
"Localized": "Classic Hoops"
|
||||
}
|
||||
},
|
||||
"16": {
|
||||
"0": {
|
||||
"GXT": "CLO_S2F_E_0_0",
|
||||
"Localized": "FU Hoops"
|
||||
}
|
||||
},
|
||||
"17": {
|
||||
"0": {
|
||||
"GXT": "CLO_S2F_E_1_0",
|
||||
"Localized": "Screw You Hoops"
|
||||
}
|
||||
},
|
||||
"18": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWF_PE_0_0",
|
||||
"Localized": "Gold Fame or Shame Mics"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWF_PE_0_1",
|
||||
"Localized": "Silver Fame or Shame Mics"
|
||||
}
|
||||
},
|
||||
"19": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWF_PE_1_0",
|
||||
"Localized": "Clubs Earrings"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWF_PE_1_1",
|
||||
"Localized": "Diamonds Earrings"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWF_PE_1_2",
|
||||
"Localized": "Hearts Earrings"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWF_PE_1_3",
|
||||
"Localized": "Spades Earrings"
|
||||
}
|
||||
},
|
||||
"20": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWF_PE_2_0",
|
||||
"Localized": "White Dice Earrings"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWF_PE_2_1",
|
||||
"Localized": "Red Dice Earrings"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWF_PE_2_2",
|
||||
"Localized": "Tan Dice Earrings"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWF_PE_2_3",
|
||||
"Localized": "Gray Dice Earrings"
|
||||
}
|
||||
},
|
||||
"21": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWF_PE_3_0",
|
||||
"Localized": "Black Chips Earrings"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWF_PE_3_1",
|
||||
"Localized": "Yellow Chips Earrings"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWF_PE_3_2",
|
||||
"Localized": "Red Chips Earrings"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWF_PE_3_3",
|
||||
"Localized": "Pink Chips Earrings"
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
5846
ReallifeGamemode.Client/Interaction/clothes/props_female_hats.json
Normal file
5846
ReallifeGamemode.Client/Interaction/clothes/props_female_hats.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,488 @@
|
||||
{
|
||||
"0": {
|
||||
"0": {
|
||||
"GXT": "NO_LABEL",
|
||||
"Localized": "NULL"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "NO_LABEL",
|
||||
"Localized": "NULL"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "NO_LABEL",
|
||||
"Localized": "NULL"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "NO_LABEL",
|
||||
"Localized": "NULL"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "W_FMF_0_4",
|
||||
"Localized": "Pewter Watch"
|
||||
}
|
||||
},
|
||||
"1": {
|
||||
"0": {
|
||||
"GXT": "NO_LABEL",
|
||||
"Localized": "NULL"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "NO_LABEL",
|
||||
"Localized": "NULL"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "NO_LABEL",
|
||||
"Localized": "NULL"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "NO_LABEL",
|
||||
"Localized": "NULL"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "NO_LABEL",
|
||||
"Localized": "NULL"
|
||||
}
|
||||
},
|
||||
"2": {
|
||||
"0": {
|
||||
"GXT": "CLO_BUSF_W0_0",
|
||||
"Localized": "Gold Fashion"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_BUSF_W0_1",
|
||||
"Localized": "Silver Fashion"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_BUSF_W0_2",
|
||||
"Localized": "Copper Fashion"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_BUSF_W0_3",
|
||||
"Localized": "Black Fashion"
|
||||
}
|
||||
},
|
||||
"3": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXF_LW_0_0",
|
||||
"Localized": "Gold CaCa Di Lusso"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXF_LW_0_1",
|
||||
"Localized": "Silver CaCa Di Lusso"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXF_LW_0_2",
|
||||
"Localized": "Pink Gold CaCa Di Lusso"
|
||||
}
|
||||
},
|
||||
"4": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXF_LW_1_0",
|
||||
"Localized": "Silver Didier Sachs Mignon"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXF_LW_1_1",
|
||||
"Localized": "Pink Gold Didier Sachs Mignon"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXF_LW_1_2",
|
||||
"Localized": "Gold Didier Sachs Mignon"
|
||||
}
|
||||
},
|
||||
"5": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXF_LW_5_0",
|
||||
"Localized": "Gold iFruit Link"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXF_LW_5_1",
|
||||
"Localized": "Silver iFruit Link"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXF_LW_5_2",
|
||||
"Localized": "Pink Gold iFruit Link"
|
||||
}
|
||||
},
|
||||
"6": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXF_LW_6_0",
|
||||
"Localized": "White iFruit Tech"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXF_LW_6_1",
|
||||
"Localized": "Pink iFruit Tech"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXF_LW_6_2",
|
||||
"Localized": "PRB iFruit Tech"
|
||||
}
|
||||
},
|
||||
"7": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2F_LW_2_0",
|
||||
"Localized": "Gold Le Chien Marquise"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2F_LW_2_1",
|
||||
"Localized": "Silver Le Chien Marquise"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2F_LW_2_2",
|
||||
"Localized": "Pink Gold Le Chien Marquise"
|
||||
}
|
||||
},
|
||||
"8": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2F_LW_3_0",
|
||||
"Localized": "Gray Fufu Jeunesse"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2F_LW_3_1",
|
||||
"Localized": "Black Fufu Jeunesse"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2F_LW_3_2",
|
||||
"Localized": "Blue Fufu Jeunesse"
|
||||
}
|
||||
},
|
||||
"9": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2F_LW_4_0",
|
||||
"Localized": "Silver Anna Rex Prestige"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2F_LW_4_1",
|
||||
"Localized": "Gold Anna Rex Prestige"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2F_LW_4_2",
|
||||
"Localized": "Carbon Anna Rex Prestige"
|
||||
}
|
||||
},
|
||||
"10": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2F_LW_7_0",
|
||||
"Localized": "Lime iFruit Snap"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2F_LW_7_1",
|
||||
"Localized": "White iFruit Snap"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2F_LW_7_2",
|
||||
"Localized": "Neon iFruit Snap"
|
||||
}
|
||||
},
|
||||
"11": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PW_0_0",
|
||||
"Localized": "Light Wrist Chain (L)"
|
||||
}
|
||||
},
|
||||
"12": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PW_1_0",
|
||||
"Localized": "Chunky Wrist Chain (L)"
|
||||
}
|
||||
},
|
||||
"13": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PW_2_0",
|
||||
"Localized": "Square Wrist Chain (L)"
|
||||
}
|
||||
},
|
||||
"14": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PW_3_0",
|
||||
"Localized": "Skull Wrist Chain (L)"
|
||||
}
|
||||
},
|
||||
"15": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PW_4_0",
|
||||
"Localized": "Tread Wrist Chain (L)"
|
||||
}
|
||||
},
|
||||
"16": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PW_5_0",
|
||||
"Localized": "Gear Wrist Chains (L)"
|
||||
}
|
||||
},
|
||||
"17": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PW_6_0",
|
||||
"Localized": "Spiked Gauntlet (L)"
|
||||
}
|
||||
},
|
||||
"18": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIF_PW_7_0",
|
||||
"Localized": "Black Gauntlet (L)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_BIF_PW_7_1",
|
||||
"Localized": "Chocolate Gauntlet (L)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_BIF_PW_7_2",
|
||||
"Localized": "Tan Gauntlet (L)"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_BIF_PW_7_3",
|
||||
"Localized": "Ox Blood Gauntlet (L)"
|
||||
}
|
||||
},
|
||||
"19": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWF_PW_0_0",
|
||||
"Localized": "Gold Enduring Watch"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWF_PW_0_1",
|
||||
"Localized": "Silver Enduring Watch"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWF_PW_0_2",
|
||||
"Localized": "Black Enduring Watch"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWF_PW_0_3",
|
||||
"Localized": "Deck Enduring Watch"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWF_PW_0_4",
|
||||
"Localized": "Royal Enduring Watch"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWF_PW_0_5",
|
||||
"Localized": "Roulette Enduring Watch"
|
||||
}
|
||||
},
|
||||
"20": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWF_PW_1_0",
|
||||
"Localized": "Gold Kronos Tempo"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWF_PW_1_1",
|
||||
"Localized": "Silver Kronos Tempo"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWF_PW_1_2",
|
||||
"Localized": "Black Kronos Tempo"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWF_PW_1_3",
|
||||
"Localized": "Gold Fifty Kronos Tempo"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWF_PW_1_4",
|
||||
"Localized": "Gold Roulette Kronos Tempo"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWF_PW_1_5",
|
||||
"Localized": "Baroque Kronos Tempo"
|
||||
}
|
||||
},
|
||||
"21": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWF_PW_2_0",
|
||||
"Localized": "Gold Kronos Pulse"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWF_PW_2_1",
|
||||
"Localized": "Silver Kronos Pulse"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWF_PW_2_2",
|
||||
"Localized": "Black Kronos Pulse"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWF_PW_2_3",
|
||||
"Localized": "Silver Fifty Kronos Pulse"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWF_PW_2_4",
|
||||
"Localized": "Silver Roulette Kronos Pulse"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWF_PW_2_5",
|
||||
"Localized": "Spade Kronos Pulse"
|
||||
},
|
||||
"6": {
|
||||
"GXT": "CLO_VWF_PW_2_6",
|
||||
"Localized": "Red Fame or Shame Kronos"
|
||||
},
|
||||
"7": {
|
||||
"GXT": "CLO_VWF_PW_2_7",
|
||||
"Localized": "Green Fame or Shame Kronos"
|
||||
},
|
||||
"8": {
|
||||
"GXT": "CLO_VWF_PW_2_8",
|
||||
"Localized": "Blue Fame or Shame Kronos"
|
||||
},
|
||||
"9": {
|
||||
"GXT": "CLO_VWF_PW_2_9",
|
||||
"Localized": "Black Fame or Shame Kronos"
|
||||
}
|
||||
},
|
||||
"22": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWF_PW_3_0",
|
||||
"Localized": "Gold Kronos Ära"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWF_PW_3_1",
|
||||
"Localized": "Silver Kronos Ära"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWF_PW_3_2",
|
||||
"Localized": "Black Kronos Ära"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWF_PW_3_3",
|
||||
"Localized": "Gold Fifty Kronos Ära"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWF_PW_3_4",
|
||||
"Localized": "Tan Spade Kronos Ära"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWF_PW_3_5",
|
||||
"Localized": "Brown Spade Kronos Ära"
|
||||
}
|
||||
},
|
||||
"23": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWF_PW_4_0",
|
||||
"Localized": "Gold Ceaseless"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWF_PW_4_1",
|
||||
"Localized": "Silver Ceaseless"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWF_PW_4_2",
|
||||
"Localized": "Black Ceaseless"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWF_PW_4_3",
|
||||
"Localized": "Spade Ceaseless"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWF_PW_4_4",
|
||||
"Localized": "Mixed Metals Ceaseless"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWF_PW_4_5",
|
||||
"Localized": "Roulette Ceaseless"
|
||||
}
|
||||
},
|
||||
"24": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWF_PW_5_0",
|
||||
"Localized": "Silver Crowex Époque"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWF_PW_5_1",
|
||||
"Localized": "Gold Crowex Époque"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWF_PW_5_2",
|
||||
"Localized": "Black Crowex Époque"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWF_PW_5_3",
|
||||
"Localized": "Wheel Crowex Époque"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWF_PW_5_4",
|
||||
"Localized": "Suits Crowex Époque"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWF_PW_5_5",
|
||||
"Localized": "Roulette Crowex Époque"
|
||||
}
|
||||
},
|
||||
"25": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWF_PW_6_0",
|
||||
"Localized": "Gold Kronos Quad"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWF_PW_6_1",
|
||||
"Localized": "Silver Kronos Quad"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWF_PW_6_2",
|
||||
"Localized": "Black Kronos Quad"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWF_PW_6_3",
|
||||
"Localized": "Roulette Kronos Quad"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWF_PW_6_4",
|
||||
"Localized": "Fifty Kronos Quad"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWF_PW_6_5",
|
||||
"Localized": "Suits Kronos Quad"
|
||||
}
|
||||
},
|
||||
"26": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWF_PW_7_0",
|
||||
"Localized": "Silver Crowex Rond"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWF_PW_7_1",
|
||||
"Localized": "Gold Crowex Rond"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWF_PW_7_2",
|
||||
"Localized": "Black Crowex Rond"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWF_PW_7_3",
|
||||
"Localized": "Spade Crowex Rond"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWF_PW_7_4",
|
||||
"Localized": "Royalty Crowex Rond"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWF_PW_7_5",
|
||||
"Localized": "Dice Crowex Rond"
|
||||
}
|
||||
},
|
||||
"27": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWF_PW_8_0",
|
||||
"Localized": "Silver SASS Wrist Piece"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWF_PW_8_1",
|
||||
"Localized": "Gold SASS Wrist Piece"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWF_PW_8_2",
|
||||
"Localized": "Black SASS Wrist Piece"
|
||||
}
|
||||
},
|
||||
"28": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWF_PW_9_0",
|
||||
"Localized": "Silver SASS Bracelet"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWF_PW_9_1",
|
||||
"Localized": "Gold SASS Bracelet"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWF_PW_9_2",
|
||||
"Localized": "Black SASS Bracelet"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
{
|
||||
"0": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PRW_0_0",
|
||||
"Localized": "Light Wrist Chain (R)"
|
||||
}
|
||||
},
|
||||
"1": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PRW_1_0",
|
||||
"Localized": "Chunky Wrist Chain (R)"
|
||||
}
|
||||
},
|
||||
"2": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PRW_2_0",
|
||||
"Localized": "Square Wrist Chain (R)"
|
||||
}
|
||||
},
|
||||
"3": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PRW_3_0",
|
||||
"Localized": "Skull Wrist Chain (R)"
|
||||
}
|
||||
},
|
||||
"4": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PRW_4_0",
|
||||
"Localized": "Tread Wrist Chain (R)"
|
||||
}
|
||||
},
|
||||
"5": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PRW_5_0",
|
||||
"Localized": "Gear Wrist Chains (R)"
|
||||
}
|
||||
},
|
||||
"6": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PRW_6_0",
|
||||
"Localized": "Spiked Gauntlet (R)"
|
||||
}
|
||||
},
|
||||
"7": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PRW_7_0",
|
||||
"Localized": "Black Gauntlet (R)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_BIM_PRW_7_1",
|
||||
"Localized": "Chocolate Gauntlet (R)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_BIM_PRW_7_2",
|
||||
"Localized": "Tan Gauntlet (R)"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_BIM_PRW_7_3",
|
||||
"Localized": "Ox Blood Gauntlet (R)"
|
||||
}
|
||||
}
|
||||
}
|
||||
540
ReallifeGamemode.Client/Interaction/clothes/props_male_ears.json
Normal file
540
ReallifeGamemode.Client/Interaction/clothes/props_male_ears.json
Normal file
@@ -0,0 +1,540 @@
|
||||
{
|
||||
"0": {
|
||||
"0": {
|
||||
"GXT": "CLO_HST_E_0_0",
|
||||
"Localized": "Gray Earpiece"
|
||||
}
|
||||
},
|
||||
"1": {
|
||||
"0": {
|
||||
"GXT": "CLO_HST_E_1_0",
|
||||
"Localized": "Red Earpiece"
|
||||
}
|
||||
},
|
||||
"2": {
|
||||
"0": {
|
||||
"GXT": "CLO_HST_E_2_0",
|
||||
"Localized": "LCD Earpiece"
|
||||
}
|
||||
},
|
||||
"3": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_0_0",
|
||||
"Localized": "Gold Angled Hoop (L)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_0_1",
|
||||
"Localized": "Black Angled Hoop (L)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_E_0_2",
|
||||
"Localized": "Platinum Angled Hoop (L)"
|
||||
}
|
||||
},
|
||||
"4": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_1_0",
|
||||
"Localized": "Gold Angled Hoop (R)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_1_1",
|
||||
"Localized": "Black Angled Hoop (R)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_E_1_2",
|
||||
"Localized": "Platinum Angled Hoop (R)"
|
||||
}
|
||||
},
|
||||
"5": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_2_0",
|
||||
"Localized": "Gold Angled Hoops"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_2_1",
|
||||
"Localized": "Black Angled Hoops"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_E_2_2",
|
||||
"Localized": "Platinum Angled Hoops"
|
||||
}
|
||||
},
|
||||
"6": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_3_0",
|
||||
"Localized": "Gold Circle Stud (L)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_3_1",
|
||||
"Localized": "Platinum Circle Stud (L)"
|
||||
}
|
||||
},
|
||||
"7": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_4_0",
|
||||
"Localized": "Gold Circle Stud (R)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_4_1",
|
||||
"Localized": "Platinum Circle Stud (R)"
|
||||
}
|
||||
},
|
||||
"8": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_5_0",
|
||||
"Localized": "Gold Circle Studs"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_5_1",
|
||||
"Localized": "Platinum Circle Studs"
|
||||
}
|
||||
},
|
||||
"9": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_6_0",
|
||||
"Localized": "Gold Diamond Stud (L)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_6_1",
|
||||
"Localized": "Black Diamond Stud (L)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_E_6_2",
|
||||
"Localized": "Platinum Diamond Stud (L)"
|
||||
}
|
||||
},
|
||||
"10": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_7_0",
|
||||
"Localized": "Gold Diamond Stud (R)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_7_1",
|
||||
"Localized": "Black Diamond Stud (R)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_E_7_2",
|
||||
"Localized": "Platinum Diamond Stud (R)"
|
||||
}
|
||||
},
|
||||
"11": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_8_0",
|
||||
"Localized": "Gold Diamond Studs"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_8_1",
|
||||
"Localized": "Black Diamond Studs"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_E_8_2",
|
||||
"Localized": "Platinum Diamond Studs"
|
||||
}
|
||||
},
|
||||
"12": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_9_0",
|
||||
"Localized": "Gold Pillow Stud (L)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_9_1",
|
||||
"Localized": "Black Pillow Stud (L)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_E_9_2",
|
||||
"Localized": "Platinum Pillow Stud (L)"
|
||||
}
|
||||
},
|
||||
"13": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_10_0",
|
||||
"Localized": "Gold Pillow Stud (R)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_10_1",
|
||||
"Localized": "Black Pillow Stud (R)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_E_10_2",
|
||||
"Localized": "Platinum Pillow Stud (R)"
|
||||
}
|
||||
},
|
||||
"14": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_11_0",
|
||||
"Localized": "Gold Pillow Studs"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_11_1",
|
||||
"Localized": "Black Pillow Studs"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_E_11_2",
|
||||
"Localized": "Platinum Pillow Studs"
|
||||
}
|
||||
},
|
||||
"15": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_12_0",
|
||||
"Localized": "Gold Gem Stud (L)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_12_1",
|
||||
"Localized": "Black Gem Stud (L)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_E_12_2",
|
||||
"Localized": "Platinum Gem Stud (L)"
|
||||
}
|
||||
},
|
||||
"16": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_13_0",
|
||||
"Localized": "Gold Gem Stud (R)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_13_1",
|
||||
"Localized": "Black Gem Stud (R)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_E_13_2",
|
||||
"Localized": "Platinum Gem Stud (R)"
|
||||
}
|
||||
},
|
||||
"17": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_14_0",
|
||||
"Localized": "Gold Gem Studs"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_14_1",
|
||||
"Localized": "Black Gem Studs"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_E_14_2",
|
||||
"Localized": "Platinum Gem Studs"
|
||||
}
|
||||
},
|
||||
"18": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_24_0",
|
||||
"Localized": "Gold Illusion Square Stud (L)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_24_1",
|
||||
"Localized": "Gold Grid Square Stud (L)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_E_24_2",
|
||||
"Localized": "Gold Noir Square Stud (L)"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_LXM_E_24_3",
|
||||
"Localized": "Platinum Grid Square Stud (L)"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_LXM_E_24_4",
|
||||
"Localized": "Platinum Noir Square Stud (L)"
|
||||
}
|
||||
},
|
||||
"19": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_25_0",
|
||||
"Localized": "Gold Illusion Square Stud (R)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_25_1",
|
||||
"Localized": "Gold Grid Square Stud (R)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_E_25_2",
|
||||
"Localized": "Gold Noir Square Stud (R)"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_LXM_E_25_3",
|
||||
"Localized": "Platinum Grid Square Stud (R)"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_LXM_E_25_4",
|
||||
"Localized": "Platinum Noir Square Stud (R)"
|
||||
}
|
||||
},
|
||||
"20": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_E_26_0",
|
||||
"Localized": "Gold Illusion Square Studs"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_E_26_1",
|
||||
"Localized": "Gold Grid Square Studs"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_E_26_2",
|
||||
"Localized": "Gold Noir Square Studs"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_LXM_E_26_3",
|
||||
"Localized": "Platinum Grid Square Studs"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_LXM_E_26_4",
|
||||
"Localized": "Platinum Noir Square Studs"
|
||||
}
|
||||
},
|
||||
"21": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_E_15_0",
|
||||
"Localized": "Gold SN Stud (L)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_E_15_1",
|
||||
"Localized": "Platinum SN Stud (L)"
|
||||
}
|
||||
},
|
||||
"22": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_E_16_0",
|
||||
"Localized": "Gold SN Stud (R)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_E_16_1",
|
||||
"Localized": "Platinum SN Stud (R)"
|
||||
}
|
||||
},
|
||||
"23": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_E_17_0",
|
||||
"Localized": "Gold SN Studs"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_E_17_1",
|
||||
"Localized": "Platinum SN Studs"
|
||||
}
|
||||
},
|
||||
"24": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_E_18_0",
|
||||
"Localized": "Silver Skull Stud (L)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_E_18_1",
|
||||
"Localized": "Gold Skull Stud (L)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2M_E_18_2",
|
||||
"Localized": "Black Skull Stud (L)"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_L2M_E_18_3",
|
||||
"Localized": "Platinum Skull Stud (L)"
|
||||
}
|
||||
},
|
||||
"25": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_E_19_0",
|
||||
"Localized": "Silver Skull Stud (R)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_E_19_1",
|
||||
"Localized": "Gold Skull Stud (R)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2M_E_19_2",
|
||||
"Localized": "Black Skull Stud (R)"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_L2M_E_19_3",
|
||||
"Localized": "Platinum Skull Stud (R)"
|
||||
}
|
||||
},
|
||||
"26": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_E_20_0",
|
||||
"Localized": "Silver Skull Studs"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_E_20_1",
|
||||
"Localized": "Gold Skull Studs"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2M_E_20_2",
|
||||
"Localized": "Black Skull Studs"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_L2M_E_20_3",
|
||||
"Localized": "Platinum Skull Studs"
|
||||
}
|
||||
},
|
||||
"27": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_E_21_0",
|
||||
"Localized": "Platinum Spike Stud (L)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_E_21_1",
|
||||
"Localized": "Gold Spike Stud (L)"
|
||||
}
|
||||
},
|
||||
"28": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_E_22_0",
|
||||
"Localized": "Platinum Spike Stud (R)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_E_22_1",
|
||||
"Localized": "Gold Spike Stud (R)"
|
||||
}
|
||||
},
|
||||
"29": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_E_23_0",
|
||||
"Localized": "Platinum Spike Studs"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_E_23_1",
|
||||
"Localized": "Gold Spike Studs"
|
||||
}
|
||||
},
|
||||
"30": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_E_27_0",
|
||||
"Localized": "Gold Onyx Stud (L)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_E_27_1",
|
||||
"Localized": "Black Onyx Stud (L)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2M_E_27_2",
|
||||
"Localized": "Platinum Onyx Stud (L)"
|
||||
}
|
||||
},
|
||||
"31": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_E_28_0",
|
||||
"Localized": "Gold Onyx Stud (R)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_E_28_1",
|
||||
"Localized": "Black Onyx Stud (R)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2M_E_28_2",
|
||||
"Localized": "Platinum Onyx Stud (R)"
|
||||
}
|
||||
},
|
||||
"32": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_E_29_0",
|
||||
"Localized": "Gold Onyx Studs"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_E_29_1",
|
||||
"Localized": "Black Onyx Studs"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2M_E_29_2",
|
||||
"Localized": "Platinum Onyx Studs"
|
||||
}
|
||||
},
|
||||
"33": {
|
||||
"0": {
|
||||
"GXT": "NO_LABEL",
|
||||
"Localized": "NULL"
|
||||
}
|
||||
},
|
||||
"34": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_E_30_0",
|
||||
"Localized": "Platinum SN Bullion Stud (L)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_E_30_1",
|
||||
"Localized": "Gold SN Bullion Stud (L)"
|
||||
}
|
||||
},
|
||||
"35": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_E_31_0",
|
||||
"Localized": "Platinum SN Bullion Stud (R)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_E_31_1",
|
||||
"Localized": "Gold SN Bullion Stud (R)"
|
||||
}
|
||||
},
|
||||
"36": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_E_32_0",
|
||||
"Localized": "Platinum SN Bullion Studs"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_E_32_1",
|
||||
"Localized": "Gold SN Bullion Studs"
|
||||
}
|
||||
},
|
||||
"37": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWM_PE_0_0",
|
||||
"Localized": "Gold Fame or Shame Mics"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWM_PE_0_1",
|
||||
"Localized": "Silver Fame or Shame Mics"
|
||||
}
|
||||
},
|
||||
"38": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWM_PE_1_0",
|
||||
"Localized": "Clubs Earrings"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWM_PE_1_1",
|
||||
"Localized": "Diamonds Earrings"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWM_PE_1_2",
|
||||
"Localized": "Hearts Earrings"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWM_PE_1_3",
|
||||
"Localized": "Spades Earrings"
|
||||
}
|
||||
},
|
||||
"39": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWM_PE_2_0",
|
||||
"Localized": "White Dice Earrings"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWM_PE_2_1",
|
||||
"Localized": "Red Dice Earrings"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWM_PE_2_2",
|
||||
"Localized": "Tan Dice Earrings"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWM_PE_2_3",
|
||||
"Localized": "Gray Dice Earrings"
|
||||
}
|
||||
},
|
||||
"40": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWM_PE_3_0",
|
||||
"Localized": "Black Chips Earrings"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWM_PE_3_1",
|
||||
"Localized": "Yellow Chips Earrings"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWM_PE_3_2",
|
||||
"Localized": "Red Chips Earrings"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWM_PE_3_3",
|
||||
"Localized": "Pink Chips Earrings"
|
||||
}
|
||||
}
|
||||
}
|
||||
1274
ReallifeGamemode.Client/Interaction/clothes/props_male_glasses.json
Normal file
1274
ReallifeGamemode.Client/Interaction/clothes/props_male_glasses.json
Normal file
File diff suppressed because it is too large
Load Diff
5860
ReallifeGamemode.Client/Interaction/clothes/props_male_hats.json
Normal file
5860
ReallifeGamemode.Client/Interaction/clothes/props_male_hats.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,662 @@
|
||||
{
|
||||
"0": {
|
||||
"0": {
|
||||
"GXT": "W_FMM_0_0",
|
||||
"Localized": "Deep Sea Watch"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "W_FMM_0_1",
|
||||
"Localized": "Gold Watch"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "W_FMM_0_2",
|
||||
"Localized": "Silver Watch"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "W_FMM_0_3",
|
||||
"Localized": "Black Watch"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "W_FMM_0_4",
|
||||
"Localized": "Gold Faced Silver Watch"
|
||||
}
|
||||
},
|
||||
"1": {
|
||||
"0": {
|
||||
"GXT": "W_FMM_1_0",
|
||||
"Localized": "White LED, Black Strap"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "W_FMM_1_1",
|
||||
"Localized": "Red LED, White Strap"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "W_FMM_1_2",
|
||||
"Localized": "Red LED, Brown Strap"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "W_FMM_1_3",
|
||||
"Localized": "White LED, Tan Strap"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "W_FMM_1_4",
|
||||
"Localized": "Yellow LED"
|
||||
}
|
||||
},
|
||||
"2": {
|
||||
"0": {
|
||||
"GXT": "W_FMM_2_0",
|
||||
"Localized": "Black Sports"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "W_FMM_2_1",
|
||||
"Localized": "Red Sports"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "W_FMM_2_2",
|
||||
"Localized": "White Sports"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "W_FMM_2_3",
|
||||
"Localized": "Yellow Sports"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "W_FMM_2_4",
|
||||
"Localized": "Blue Sports"
|
||||
}
|
||||
},
|
||||
"3": {
|
||||
"0": {
|
||||
"GXT": "CLO_BBM_W_1_0",
|
||||
"Localized": "Pendulus Sport Black Sports"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_BBM_W_1_1",
|
||||
"Localized": "Pfister Design Red Sports"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_BBM_W_1_2",
|
||||
"Localized": "White Sports"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_BBM_W_1_3",
|
||||
"Localized": "Yellow Sports"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_BBM_W_1_4",
|
||||
"Localized": "Blue Sports"
|
||||
}
|
||||
},
|
||||
"4": {
|
||||
"0": {
|
||||
"GXT": "CLO_BUSM_W0_0",
|
||||
"Localized": "Gold Watch"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_BUSM_W0_1",
|
||||
"Localized": "Silver Watch"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_BUSM_W0_2",
|
||||
"Localized": "Black Watch"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_BUSM_W0_3",
|
||||
"Localized": "White Gold Watch"
|
||||
}
|
||||
},
|
||||
"5": {
|
||||
"0": {
|
||||
"GXT": "CLO_HP_W_0_0",
|
||||
"Localized": "Red LED, White Strap"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_HP_W_0_1",
|
||||
"Localized": "Red LED, Brown Strap"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_HP_W_0_2",
|
||||
"Localized": "White LED, Gold Strap"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_HP_W_0_3",
|
||||
"Localized": "Yellow LED, Yellow Strap"
|
||||
}
|
||||
},
|
||||
"6": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_W_0_0",
|
||||
"Localized": "Pink Gold Kronos Quantum"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_W_0_1",
|
||||
"Localized": "Silver Kronos Quantum"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_W_0_2",
|
||||
"Localized": "Carbon Kronos Quantum"
|
||||
}
|
||||
},
|
||||
"7": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_W_1_0",
|
||||
"Localized": "Platinum Gaulle Retro Hex"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_W_1_1",
|
||||
"Localized": "Carbon Gaulle Retro Hex"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_W_1_2",
|
||||
"Localized": "Gold Gaulle Retro Hex"
|
||||
}
|
||||
},
|
||||
"8": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_W_2_0",
|
||||
"Localized": "Gold Covgari Supernova"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_W_2_1",
|
||||
"Localized": "Carbon Covgari Supernova"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_W_2_2",
|
||||
"Localized": "Pink Gold Covgari Supernova"
|
||||
}
|
||||
},
|
||||
"9": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_W_3_0",
|
||||
"Localized": "Platinum Pendulus Galaxis"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_W_3_1",
|
||||
"Localized": "Carbon Pendulus Galaxis"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_W_3_2",
|
||||
"Localized": "Gold Pendulus Galaxis"
|
||||
}
|
||||
},
|
||||
"10": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_W_4_0",
|
||||
"Localized": "Silver Crowex Chromosphere"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_W_4_1",
|
||||
"Localized": "Gold Crowex Chromosphere"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_W_4_2",
|
||||
"Localized": "Carbon Crowex Chromosphere"
|
||||
}
|
||||
},
|
||||
"11": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_W_5_0",
|
||||
"Localized": "Pink Gold Vangelico Geomeister"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_W_5_1",
|
||||
"Localized": "Silver Vangelico Geomeister"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_W_5_2",
|
||||
"Localized": "Gold Vangelico Geomeister"
|
||||
}
|
||||
},
|
||||
"12": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_W_13_0",
|
||||
"Localized": "Gold iFruit Link"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_W_13_1",
|
||||
"Localized": "Silver iFruit Link"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_W_13_2",
|
||||
"Localized": "Pink Gold iFruit Link"
|
||||
}
|
||||
},
|
||||
"13": {
|
||||
"0": {
|
||||
"GXT": "CLO_LXM_W_14_0",
|
||||
"Localized": "Carbon iFruit Tech"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_LXM_W_14_1",
|
||||
"Localized": "Lime iFruit Tech"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_LXM_W_14_2",
|
||||
"Localized": "PRB iFruit Tech"
|
||||
}
|
||||
},
|
||||
"14": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_W_6_0",
|
||||
"Localized": "Silver Covgari Explorer"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_W_6_1",
|
||||
"Localized": "Pink Gold Covgari Explorer"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2M_W_6_2",
|
||||
"Localized": "Gold Covgari Explorer"
|
||||
}
|
||||
},
|
||||
"15": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_W_7_0",
|
||||
"Localized": "Silver Pendulus Gravity"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_W_7_1",
|
||||
"Localized": "Gold Pendulus Gravity"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2M_W_7_2",
|
||||
"Localized": "Platinum Pendulus Gravity"
|
||||
}
|
||||
},
|
||||
"16": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_W_8_0",
|
||||
"Localized": "Gold Covgari Universe"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_W_8_1",
|
||||
"Localized": "Silver Covgari Universe"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2M_W_8_2",
|
||||
"Localized": "Steel Covgari Universe"
|
||||
}
|
||||
},
|
||||
"17": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_W_9_0",
|
||||
"Localized": "Copper Gaulle Destiny"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_W_9_1",
|
||||
"Localized": "Vintage Gaulle Destiny"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2M_W_9_2",
|
||||
"Localized": "Silver Gaulle Destiny"
|
||||
}
|
||||
},
|
||||
"18": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_W_10_0",
|
||||
"Localized": "Carbon Medici Radial"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_W_10_1",
|
||||
"Localized": "Silver Medici Radial"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2M_W_10_2",
|
||||
"Localized": "Steel Medici Radial"
|
||||
}
|
||||
},
|
||||
"19": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_W_11_0",
|
||||
"Localized": "Silver Pendulus Timestar"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_W_11_1",
|
||||
"Localized": "Gold Pendulus Timestar"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2M_W_11_2",
|
||||
"Localized": "Carbon Pendulus Timestar"
|
||||
}
|
||||
},
|
||||
"20": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_W_12_0",
|
||||
"Localized": "Carbon Kronos Submariner"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_W_12_1",
|
||||
"Localized": "Red Kronos Submariner"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2M_W_12_2",
|
||||
"Localized": "Yellow Kronos Submariner"
|
||||
}
|
||||
},
|
||||
"21": {
|
||||
"0": {
|
||||
"GXT": "CLO_L2M_W_15_0",
|
||||
"Localized": "Red iFruit Snap"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_L2M_W_15_1",
|
||||
"Localized": "Blue iFruit Snap"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_L2M_W_15_2",
|
||||
"Localized": "Mint iFruit Snap"
|
||||
}
|
||||
},
|
||||
"22": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PW_0_0",
|
||||
"Localized": "Light Wrist Chain (L)"
|
||||
}
|
||||
},
|
||||
"23": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PW_1_0",
|
||||
"Localized": "Chunky Wrist Chain (L)"
|
||||
}
|
||||
},
|
||||
"24": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PW_2_0",
|
||||
"Localized": "Square Wrist Chain (L)"
|
||||
}
|
||||
},
|
||||
"25": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PW_3_0",
|
||||
"Localized": "Skull Wrist Chain (L)"
|
||||
}
|
||||
},
|
||||
"26": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PW_4_0",
|
||||
"Localized": "Tread Wrist Chain (L)"
|
||||
}
|
||||
},
|
||||
"27": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PW_5_0",
|
||||
"Localized": "Gear Wrist Chains (L)"
|
||||
}
|
||||
},
|
||||
"28": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PW_6_0",
|
||||
"Localized": "Spiked Gauntlet (L)"
|
||||
}
|
||||
},
|
||||
"29": {
|
||||
"0": {
|
||||
"GXT": "CLO_BIM_PW_7_0",
|
||||
"Localized": "Black Gauntlet (L)"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_BIM_PW_7_1",
|
||||
"Localized": "Chocolate Gauntlet (L)"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_BIM_PW_7_2",
|
||||
"Localized": "Tan Gauntlet (L)"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_BIM_PW_7_3",
|
||||
"Localized": "Ox Blood Gauntlet (L)"
|
||||
}
|
||||
},
|
||||
"30": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWM_PW_0_0",
|
||||
"Localized": "Gold Enduring Watch"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWM_PW_0_1",
|
||||
"Localized": "Silver Enduring Watch"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWM_PW_0_2",
|
||||
"Localized": "Black Enduring Watch"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWM_PW_0_3",
|
||||
"Localized": "Deck Enduring Watch"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWM_PW_0_4",
|
||||
"Localized": "Royal Enduring Watch"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWM_PW_0_5",
|
||||
"Localized": "Roulette Enduring Watch"
|
||||
}
|
||||
},
|
||||
"31": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWM_PW_1_0",
|
||||
"Localized": "Gold Kronos Tempo"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWM_PW_1_1",
|
||||
"Localized": "Silver Kronos Tempo"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWM_PW_1_2",
|
||||
"Localized": "Black Kronos Tempo"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWM_PW_1_3",
|
||||
"Localized": "Gold Fifty Kronos Tempo"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWM_PW_1_4",
|
||||
"Localized": "Gold Roulette Kronos Tempo"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWM_PW_1_5",
|
||||
"Localized": "Baroque Kronos Tempo"
|
||||
}
|
||||
},
|
||||
"32": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWM_PW_2_0",
|
||||
"Localized": "Gold Kronos Pulse"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWM_PW_2_1",
|
||||
"Localized": "Silver Kronos Pulse"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWM_PW_2_2",
|
||||
"Localized": "Black Kronos Pulse"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWM_PW_2_3",
|
||||
"Localized": "Silver Fifty Kronos Pulse"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWM_PW_2_4",
|
||||
"Localized": "Silver Roulette Kronos Pulse"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWM_PW_2_5",
|
||||
"Localized": "Spade Kronos Pulse"
|
||||
},
|
||||
"6": {
|
||||
"GXT": "CLO_VWM_PW_2_6",
|
||||
"Localized": "Red Fame or Shame Kronos"
|
||||
},
|
||||
"7": {
|
||||
"GXT": "CLO_VWM_PW_2_7",
|
||||
"Localized": "Green Fame or Shame Kronos"
|
||||
},
|
||||
"8": {
|
||||
"GXT": "CLO_VWM_PW_2_8",
|
||||
"Localized": "Blue Fame or Shame Kronos"
|
||||
},
|
||||
"9": {
|
||||
"GXT": "CLO_VWM_PW_2_9",
|
||||
"Localized": "Black Fame or Shame Kronos"
|
||||
}
|
||||
},
|
||||
"33": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWM_PW_3_0",
|
||||
"Localized": "Gold Kronos Ära"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWM_PW_3_1",
|
||||
"Localized": "Silver Kronos Ära"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWM_PW_3_2",
|
||||
"Localized": "Black Kronos Ära"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWM_PW_3_3",
|
||||
"Localized": "Gold Fifty Kronos Ära"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWM_PW_3_4",
|
||||
"Localized": "Tan Spade Kronos Ära"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWM_PW_3_5",
|
||||
"Localized": "Brown Spade Kronos Ära"
|
||||
}
|
||||
},
|
||||
"34": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWM_PW_4_0",
|
||||
"Localized": "Gold Ceaseless"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWM_PW_4_1",
|
||||
"Localized": "Silver Ceaseless"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWM_PW_4_2",
|
||||
"Localized": "Black Ceaseless"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWM_PW_4_3",
|
||||
"Localized": "Spade Ceaseless"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWM_PW_4_4",
|
||||
"Localized": "Mixed Metals Ceaseless"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWM_PW_4_5",
|
||||
"Localized": "Roulette Ceaseless"
|
||||
}
|
||||
},
|
||||
"35": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWM_PW_5_0",
|
||||
"Localized": "Silver Crowex Époque"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWM_PW_5_1",
|
||||
"Localized": "Gold Crowex Époque"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWM_PW_5_2",
|
||||
"Localized": "Black Crowex Époque"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWM_PW_5_3",
|
||||
"Localized": "Wheel Crowex Époque"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWM_PW_5_4",
|
||||
"Localized": "Suits Crowex Époque"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWM_PW_5_5",
|
||||
"Localized": "Roulette Crowex Époque"
|
||||
}
|
||||
},
|
||||
"36": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWM_PW_6_0",
|
||||
"Localized": "Gold Kronos Quad"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWM_PW_6_1",
|
||||
"Localized": "Silver Kronos Quad"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWM_PW_6_2",
|
||||
"Localized": "Black Kronos Quad"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWM_PW_6_3",
|
||||
"Localized": "Roulette Kronos Quad"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWM_PW_6_4",
|
||||
"Localized": "Fifty Kronos Quad"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWM_PW_6_5",
|
||||
"Localized": "Suits Kronos Quad"
|
||||
}
|
||||
},
|
||||
"37": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWM_PW_7_0",
|
||||
"Localized": "Silver Crowex Rond"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWM_PW_7_1",
|
||||
"Localized": "Gold Crowex Rond"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWM_PW_7_2",
|
||||
"Localized": "Black Crowex Rond"
|
||||
},
|
||||
"3": {
|
||||
"GXT": "CLO_VWM_PW_7_3",
|
||||
"Localized": "Spade Crowex Rond"
|
||||
},
|
||||
"4": {
|
||||
"GXT": "CLO_VWM_PW_7_4",
|
||||
"Localized": "Royalty Crowex Rond"
|
||||
},
|
||||
"5": {
|
||||
"GXT": "CLO_VWM_PW_7_5",
|
||||
"Localized": "Dice Crowex Rond"
|
||||
}
|
||||
},
|
||||
"38": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWM_PW_8_0",
|
||||
"Localized": "Silver SASS Wrist Piece"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWM_PW_8_1",
|
||||
"Localized": "Gold SASS Wrist Piece"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWM_PW_8_2",
|
||||
"Localized": "Black SASS Wrist Piece"
|
||||
}
|
||||
},
|
||||
"39": {
|
||||
"0": {
|
||||
"GXT": "CLO_VWM_PW_9_0",
|
||||
"Localized": "Silver SASS Bracelet"
|
||||
},
|
||||
"1": {
|
||||
"GXT": "CLO_VWM_PW_9_1",
|
||||
"Localized": "Gold SASS Bracelet"
|
||||
},
|
||||
"2": {
|
||||
"GXT": "CLO_VWM_PW_9_2",
|
||||
"Localized": "Black SASS Bracelet"
|
||||
}
|
||||
}
|
||||
}
|
||||
74
ReallifeGamemode.Client/Interaction/drivingschool.ts
Normal file
74
ReallifeGamemode.Client/Interaction/drivingschool.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
|
||||
let screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
let saveItem = new UIMenuItem("Bestätigen", "");
|
||||
saveItem.BackColor = new Color(13, 71, 161);
|
||||
saveItem.HighlightedBackColor = new Color(25, 118, 210);
|
||||
|
||||
let cancelItem = new UIMenuItem("Abbrechen", "");
|
||||
cancelItem.BackColor = new Color(213, 0, 0);
|
||||
cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
|
||||
export default function drivingSchoolList(globalData: IGlobalData) {
|
||||
|
||||
var drivingMenu: NativeUI.Menu;
|
||||
|
||||
|
||||
var stage = "";
|
||||
|
||||
|
||||
//Weapon Menu
|
||||
|
||||
mp.events.add('showDrivingSchoolSelector', () => {
|
||||
if (!globalData.InMenu) {
|
||||
|
||||
globalData.InMenu = true;
|
||||
|
||||
drivingMenu = new Menu("Fahrschule", "", new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
|
||||
drivingMenu.AddItem(new UIMenuListItem("Prüfung", "", new ItemsCollection(["Auto", "Motorrad"])));
|
||||
|
||||
drivingMenu.AddItem(saveItem);
|
||||
drivingMenu.AddItem(cancelItem);
|
||||
drivingMenu.Visible = true;
|
||||
|
||||
drivingMenu.ListChange.on((item, index) => {
|
||||
switch (item.Text) {
|
||||
case "Prüfung":
|
||||
stage = String(item.SelectedItem.DisplayText);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
drivingMenu.ItemSelect.on((item) => {
|
||||
if (item.Text === "Bestätigen") {
|
||||
if (stage == "Auto") {
|
||||
mp.events.callRemote("startDrivingSchool");
|
||||
} else if (stage == "Motorrad") {
|
||||
mp.events.callRemote("startBikeSchool");
|
||||
}
|
||||
|
||||
drivingMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
} else if (item.Text === "Abbrechen") {
|
||||
drivingMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
}
|
||||
});
|
||||
|
||||
drivingMenu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
68
ReallifeGamemode.Client/Interaction/elevator.ts
Normal file
68
ReallifeGamemode.Client/Interaction/elevator.ts
Normal file
@@ -0,0 +1,68 @@
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
|
||||
let screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
let saveItem = new UIMenuItem("Bestätigen", "");
|
||||
saveItem.BackColor = new Color(13, 71, 161);
|
||||
saveItem.HighlightedBackColor = new Color(25, 118, 210);
|
||||
|
||||
let cancelItem = new UIMenuItem("Abbrechen", "");
|
||||
cancelItem.BackColor = new Color(213, 0, 0);
|
||||
cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
|
||||
export default function elevatorList(globalData: IGlobalData) {
|
||||
var elevatorMenu: NativeUI.Menu;
|
||||
|
||||
var stages;
|
||||
|
||||
var stage = "";
|
||||
|
||||
//Weapon Menu
|
||||
|
||||
mp.events.add('showElevatorMenu', (stagesArr) => {
|
||||
if (!globalData.InMenu) {
|
||||
globalData.InMenu = true;
|
||||
|
||||
stages = JSON.parse(stagesArr);
|
||||
|
||||
elevatorMenu = new Menu("Aufzug", "", new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
elevatorMenu.AddItem(new UIMenuListItem("Stock", "", new ItemsCollection(stages)));
|
||||
|
||||
elevatorMenu.AddItem(saveItem);
|
||||
elevatorMenu.AddItem(cancelItem);
|
||||
elevatorMenu.Visible = true;
|
||||
|
||||
elevatorMenu.ListChange.on((item, index) => {
|
||||
switch (item.Text) {
|
||||
case "Stock":
|
||||
stage = String(item.SelectedItem.DisplayText);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
elevatorMenu.ItemSelect.on((item) => {
|
||||
if (item.Text === "Bestätigen") {
|
||||
mp.events.callRemote("sendClientToStage", stage);
|
||||
elevatorMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
} else if (item.Text === "Abbrechen") {
|
||||
elevatorMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
}
|
||||
});
|
||||
|
||||
elevatorMenu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
557
ReallifeGamemode.Client/Interaction/factioninteraction.ts
Normal file
557
ReallifeGamemode.Client/Interaction/factioninteraction.ts
Normal file
@@ -0,0 +1,557 @@
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
import InputHelper from '../inputhelper';
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
|
||||
export default function factionInteraction(globalData: IGlobalData) {
|
||||
var screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
var player = mp.players.local;
|
||||
var tasks;
|
||||
var deathSeconds;
|
||||
var initTasks;
|
||||
var newTasks;
|
||||
var sorting = 0;
|
||||
var firstSorting = true;
|
||||
var activeTask = null;
|
||||
var activeCheckpoint;
|
||||
var taskStart;
|
||||
var taskFinish;
|
||||
var taskRange;
|
||||
var ambulanceImagePos;
|
||||
var rangeLeft;
|
||||
var sortText;
|
||||
var deadRespawned = false;
|
||||
var timeLeft = 0;
|
||||
var deathTime;
|
||||
|
||||
var ticketName: string;
|
||||
var pointsName: string;
|
||||
|
||||
var factionInteractionMenu;
|
||||
var healTaskMenuMedic;
|
||||
var reviveTaskMenuMedic;
|
||||
var insDate;
|
||||
/*mp.events.add("updateFactionBlips", (type, taskList) => {
|
||||
|
||||
});
|
||||
});*/
|
||||
mp.events.add("showFactionInteractionLSPD", (userFactionId, isDuty, userFactionName, isFactionLeader) => {
|
||||
//LSPD
|
||||
let ticketTaskMenuLSPD;
|
||||
let pointsTaskMenuLSPD;
|
||||
let wantedsMenuLSPD
|
||||
if (userFactionId == 1 || userFactionId == 3) {
|
||||
if (isDuty) {
|
||||
mp.gui.chat.activate(false);
|
||||
globalData.InMenu = true;
|
||||
|
||||
factionInteractionMenu = new Menu("Fraktionsinteraktion", userFactionName, new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
ticketTaskMenuLSPD = new UIMenuItem("Ticket ausstellen", "Einem Spieler ein Strafticket ausstellen.");
|
||||
factionInteractionMenu.AddItem(ticketTaskMenuLSPD);
|
||||
|
||||
pointsTaskMenuLSPD = new UIMenuItem("Strafpunkte verteilen", "Einem Spieler Strafpunkte verteilen.");
|
||||
factionInteractionMenu.AddItem(pointsTaskMenuLSPD);
|
||||
|
||||
wantedsMenuLSPD = new UIMenuItem("Verbrecher Liste");
|
||||
factionInteractionMenu.AddItem(wantedsMenuLSPD);
|
||||
|
||||
/*TaskMenuLSPD = new UIMenuItem("");
|
||||
TaskMenuLSPD.SetRightLabel("");
|
||||
factionInteractionMenu.AddItem(TaskMenuLSPD);*/ //weiteres
|
||||
|
||||
|
||||
|
||||
let cancelItem = new UIMenuItem("Schlie\u00dfen", "Schlie\u00dft die Fraktionsinteraktion.");
|
||||
cancelItem.BackColor = new Color(213, 0, 0);
|
||||
cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
factionInteractionMenu.AddItem(cancelItem);
|
||||
|
||||
factionInteractionMenu.Visible = true;
|
||||
|
||||
factionInteractionMenu.ItemSelect.on((item) => {
|
||||
switch (item) {
|
||||
case cancelItem:
|
||||
factionInteractionMenu.Visible = false;
|
||||
mp.gui.chat.activate(true);
|
||||
globalData.InMenu = false;
|
||||
break;
|
||||
|
||||
case ticketTaskMenuLSPD:
|
||||
factionInteractionMenu.Visible = false;
|
||||
mp.gui.chat.activate(true);
|
||||
mp.gui.cursor.show(true, true);
|
||||
globalData.InMenu = false;
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Welchem Spieler möchtest du ein Ticket geben (Name / ID)?", globalData);
|
||||
input.show();
|
||||
input.getValue(name => {
|
||||
mp.events.call("CLIENT:InteractionMenu_LSPD_Ticket", name);
|
||||
mp.gui.cursor.show(false, false);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
break;
|
||||
case pointsTaskMenuLSPD:
|
||||
factionInteractionMenu.Visible = false;
|
||||
mp.gui.chat.activate(true);
|
||||
mp.gui.cursor.show(true, true);
|
||||
globalData.InMenu = false;
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Welchem Spieler möchtest du Strafpunkte geben (Name / ID)?", globalData);
|
||||
input.show();
|
||||
input.getValue(name => {
|
||||
mp.events.call("CLIENT:InteractionMenu_LSPD_Points", name);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
break
|
||||
case wantedsMenuLSPD:
|
||||
factionInteractionMenu.Visible = false;
|
||||
mp.gui.chat.activate(true);
|
||||
globalData.InMenu = false;
|
||||
mp.events.callRemote("CLIENT:wantedlist");
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
factionInteractionMenu.MenuClose.on(() => {
|
||||
mp.gui.chat.activate(true);
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
mp.events.add("CLIENT:InteractionMenu_LSPD_Ticket", (name) => {
|
||||
ticketName = name;
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Wie hoch soll der Ticketbetrag sein ?", globalData);
|
||||
mp.gui.cursor.show(true, true);
|
||||
input.show();
|
||||
input.getValue(amount => {
|
||||
globalData.InInput = false;
|
||||
mp.events.call("CLIENT:InteractionMenu_LSPD_Ticket2", amount);
|
||||
mp.gui.cursor.show(false, false);
|
||||
});
|
||||
});
|
||||
|
||||
mp.events.add("CLIENT:InteractionMenu_LSPD_Ticket2", (ticketPrice) => {
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Um welches Vergehen handelt es sich ?", globalData);
|
||||
mp.gui.cursor.show(true, true);
|
||||
input.show();
|
||||
input.getValue(ticketReason => {
|
||||
globalData.InInput = false;
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_LSPD_Ticket3", JSON.stringify(ticketName), ticketPrice, JSON.stringify(ticketReason));
|
||||
mp.gui.cursor.show(false, false);
|
||||
});
|
||||
});
|
||||
|
||||
mp.events.add("CLIENT:InteractionMenu_LSPD_Points", (name) => {
|
||||
pointsName = name;
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Wieviele Punkte werden vergeben ?", globalData);
|
||||
mp.gui.cursor.show(true, true);
|
||||
input.show();
|
||||
input.getValue(amount => {
|
||||
globalData.InInput = false;
|
||||
mp.events.call("CLIENT:InteractionMenu_LSPD_Points2", amount);
|
||||
mp.gui.cursor.show(false, false);
|
||||
});
|
||||
});
|
||||
|
||||
mp.events.add("CLIENT:InteractionMenu_LSPD_Points2", (pointsAmount) => {
|
||||
var input = new InputHelper("Um welches Vergehen handelt es sich ?", globalData);
|
||||
mp.gui.cursor.show(true, true);
|
||||
input.show();
|
||||
input.getValue(pointsReason => {
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_LSPD_Points3", JSON.stringify(pointsName), JSON.stringify(pointsAmount), JSON.stringify(pointsReason));
|
||||
mp.gui.cursor.show(false, false);
|
||||
});
|
||||
});
|
||||
|
||||
var wantedlistBrowser: BrowserMp = null;
|
||||
var wList;
|
||||
|
||||
mp.events.add("showWantedlist", (playersJson) => {
|
||||
|
||||
if (wantedlistBrowser !== null) {
|
||||
wantedlistBrowser.destroy();
|
||||
wantedlistBrowser = null;
|
||||
globalData.InInput = false;
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.activate(true);
|
||||
}
|
||||
else if (!globalData.InInput) {
|
||||
globalData.InInput = true;
|
||||
wantedlistBrowser = mp.browsers.new('package://assets/html/Wantedlist/wanteds.html');
|
||||
mp.gui.chat.activate(false);
|
||||
mp.gui.cursor.show(true, true);
|
||||
wList = JSON.parse(playersJson);
|
||||
wList.forEach((player) => {
|
||||
wantedlistBrowser.execute(`ad_row('${JSON.stringify(player.Id)}','${JSON.stringify(player.Name)}','${JSON.stringify(player.wanted)}');`);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("removeWantedlist", () => {
|
||||
|
||||
if (wantedlistBrowser == null) {
|
||||
return;
|
||||
}
|
||||
else if (globalData.InInput) {
|
||||
wantedlistBrowser.destroy();
|
||||
wantedlistBrowser = null;
|
||||
globalData.InInput = false;
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.activate(true);
|
||||
}
|
||||
});
|
||||
|
||||
//Medic
|
||||
|
||||
mp.events.add("showFactionInteractionMedic", (userFactionId, isDuty, userFactionName, isFactionLeader, reviveTaskCountMedic, healTaskCountMedic, fireTaskCountMedic) => {
|
||||
mp.gui.chat.activate(false);
|
||||
globalData.InMenu = true;
|
||||
|
||||
|
||||
var rPM = ((reviveTaskCountMedic === "0") ? "~r~" : "~g~");
|
||||
var hPM = ((healTaskCountMedic === "0") ? "~r~" : "~g~");
|
||||
var fPM = ((fireTaskCountMedic === "0") ? "~r~" : "~g~");
|
||||
|
||||
factionInteractionMenu = new Menu("Fraktionsinteraktion", userFactionName, new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
//Medic
|
||||
let reviveTaskMenuMedic;
|
||||
let healTaskMenuMedic;
|
||||
let fireTaskMenuMedic;
|
||||
|
||||
if (userFactionId == 2) {
|
||||
if (isDuty) {
|
||||
reviveTaskMenuMedic = new UIMenuItem("Reviveauftr\u00e4ge");
|
||||
reviveTaskMenuMedic.SetRightLabel(rPM + reviveTaskCountMedic)
|
||||
factionInteractionMenu.AddItem(reviveTaskMenuMedic);
|
||||
|
||||
healTaskMenuMedic = new UIMenuItem("Healauftr\u00e4ge");
|
||||
healTaskMenuMedic.SetRightLabel(hPM + healTaskCountMedic)
|
||||
factionInteractionMenu.AddItem(healTaskMenuMedic);
|
||||
|
||||
/*fireTaskMenuMedic = new UIMenuItem("Feuerauftr\u00e4ge"); //wenn die funktion dafür vorhanden ist wird das wieder eingebunden
|
||||
fireTaskMenuMedic.SetRightLabel(fPM + fireTaskCountMedic);
|
||||
factionInteractionMenu.AddItem(fireTaskMenuMedic);
|
||||
*/
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
let cancelItem = new UIMenuItem("Schlie\u00dfen", "Schlie\u00dft die Fraktionsinteraktion.");
|
||||
cancelItem.BackColor = new Color(213, 0, 0);
|
||||
cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
factionInteractionMenu.AddItem(cancelItem);
|
||||
|
||||
factionInteractionMenu.Visible = true;
|
||||
|
||||
factionInteractionMenu.ItemSelect.on((item) => {
|
||||
switch (item) {
|
||||
case cancelItem:
|
||||
factionInteractionMenu.Visible = false;
|
||||
mp.gui.chat.activate(true);
|
||||
globalData.InMenu = false;
|
||||
break;
|
||||
case reviveTaskMenuMedic:
|
||||
mp.events.callRemote("loadMedicTasks", 0)
|
||||
factionInteractionMenu.Close();
|
||||
mp.gui.chat.activate(true);
|
||||
globalData.InMenu = false;
|
||||
break;
|
||||
case healTaskMenuMedic:
|
||||
mp.events.callRemote("loadMedicTasks", 1)
|
||||
factionInteractionMenu.Close();
|
||||
mp.gui.chat.activate(true);
|
||||
globalData.InMenu = false;
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
factionInteractionMenu.MenuClose.on(() => {
|
||||
mp.gui.chat.activate(true);
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
mp.events.add("showMedicTasks", (type, taskList, deathTimes) => {
|
||||
|
||||
tasks = JSON.parse(taskList);
|
||||
deathSeconds = JSON.parse(deathTimes);
|
||||
if (sorting === 0) {
|
||||
initTasks = tasks;
|
||||
}
|
||||
|
||||
mp.events.call("sortFactionTasks", false);
|
||||
|
||||
mp.gui.chat.activate(false);
|
||||
globalData.InMenu = true;
|
||||
switch (type) {
|
||||
case 0:
|
||||
reviveTaskMenuMedic = new Menu("Revives", "\u00c4lteste zu erst", new Point(0, screenRes.y / 3), null, null);
|
||||
let aTask;
|
||||
for (var i = 0; i < tasks.length; i++) {
|
||||
if (tasks[i].MedicName === "none") {
|
||||
aTask = new UIMenuItem("~g~" + tasks[i].Victim);
|
||||
} else {
|
||||
aTask = new UIMenuItem("~r~" + tasks[i].Victim);
|
||||
}
|
||||
|
||||
aTask.SetRightLabel(mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, tasks[i].Position.x, tasks[i].Position.y, tasks[i].Position.z, true).toFixed(2).toString() + " ~g~m");
|
||||
reviveTaskMenuMedic.AddItem(aTask);
|
||||
}
|
||||
|
||||
let backItem = new UIMenuItem("Zur\u00fcck", "Zur\u00fcck zur Fraktionsinteraktion.");
|
||||
backItem.BackColor = new Color(213, 0, 0);
|
||||
backItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
reviveTaskMenuMedic.AddItem(backItem);
|
||||
|
||||
reviveTaskMenuMedic.ItemSelect.on((item, index) => {
|
||||
if (item === backItem) {
|
||||
reviveTaskMenuMedic.Close();
|
||||
factionInteractionMenu.Visible = true;
|
||||
} else {
|
||||
if (tasks[index].MedicName === "none") {
|
||||
mp.game.graphics.requestStreamedTextureDict("medicimages", true);
|
||||
mp.events.callRemote("updateMedicTask", 0, index);
|
||||
mp.game.ui.setNewWaypoint(tasks[index].Position.x, tasks[index].Position.y);
|
||||
activeCheckpoint = mp.checkpoints.new(1, new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 2), 3.0,
|
||||
{
|
||||
direction: new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 5),
|
||||
color: [255, 0, 0, 150],
|
||||
visible: true,
|
||||
dimension: 0
|
||||
});
|
||||
reviveTaskMenuMedic.Close();
|
||||
deathTime = deathSeconds[index];
|
||||
mp.gui.chat.activate(true);
|
||||
globalData.InMenu = false;
|
||||
ambulanceImagePos = 0.325
|
||||
taskStart = player.position;
|
||||
taskFinish = tasks[index].Position;
|
||||
taskRange = mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z, true);
|
||||
activeTask = tasks[index];
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
reviveTaskMenuMedic.Open();
|
||||
|
||||
reviveTaskMenuMedic.MenuClose.on(() => {
|
||||
reviveTaskMenuMedic.Visible = false;
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
break;
|
||||
case 1:
|
||||
healTaskMenuMedic = new Menu("Heal", "\u00c4lteste zu erst", new Point(0, screenRes.y / 3), null, null);
|
||||
let aTask1;
|
||||
for (var i = 0; i < tasks.length; i++) {
|
||||
if (tasks[i].MedicName === "none") {
|
||||
aTask1 = new UIMenuItem("~g~" + tasks[i].Victim);
|
||||
} else {
|
||||
aTask1 = new UIMenuItem("~r~" + tasks[i].Victim);
|
||||
}
|
||||
|
||||
aTask1.SetRightLabel(mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, tasks[i].Position.x, tasks[i].Position.y, tasks[i].Position.z, true).toFixed(2).toString() + " ~g~m");
|
||||
healTaskMenuMedic.AddItem(aTask1);
|
||||
}
|
||||
|
||||
let backItem1 = new UIMenuItem("Zur\u00fcck", "Zur\u00fcck zur Fraktionsinteraktion.");
|
||||
backItem1.BackColor = new Color(213, 0, 0);
|
||||
backItem1.HighlightedBackColor = new Color(229, 57, 53);
|
||||
healTaskMenuMedic.AddItem(backItem1);
|
||||
|
||||
healTaskMenuMedic.ItemSelect.on((item, index) => {
|
||||
if (item === backItem1) {
|
||||
healTaskMenuMedic.Close();
|
||||
factionInteractionMenu.Visible = true;
|
||||
} else {
|
||||
if (tasks[index].MedicName === "none") {
|
||||
mp.game.graphics.requestStreamedTextureDict("medicimages", true);
|
||||
mp.events.callRemote("updateMedicTask", 1, index);
|
||||
mp.game.ui.setNewWaypoint(tasks[index].Position.x, tasks[index].Position.y);
|
||||
activeCheckpoint = mp.checkpoints.new(1, new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 2), 3.0,
|
||||
{
|
||||
direction: new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 5),
|
||||
color: [255, 0, 0, 150],
|
||||
visible: true,
|
||||
dimension: 0
|
||||
});
|
||||
healTaskMenuMedic.Close();
|
||||
mp.gui.chat.activate(true);
|
||||
globalData.InMenu = false;
|
||||
ambulanceImagePos = 0.325
|
||||
taskStart = player.position;
|
||||
taskFinish = tasks[index].Position;
|
||||
taskRange = mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z, true);
|
||||
activeTask = tasks[index];
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
healTaskMenuMedic.Open();
|
||||
|
||||
healTaskMenuMedic.MenuClose.on(() => {
|
||||
healTaskMenuMedic.Visible = false;
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
case 2:
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("sortFactionTasks", (sortByKey) => {
|
||||
if (firstSorting) {
|
||||
sortText = "Nach Uhrzeit";
|
||||
firstSorting = false;
|
||||
//mp.gui.chat.push("Init Sort");
|
||||
return;
|
||||
} else {
|
||||
if (sortByKey) {
|
||||
if (sorting < 1) {
|
||||
sorting++;
|
||||
} else {
|
||||
sorting = 0;
|
||||
}
|
||||
|
||||
switch (sorting) {
|
||||
case 0: //Standartsortierung
|
||||
|
||||
reviveTaskMenuMedic.Close();
|
||||
factionInteractionMenu.Close();
|
||||
sortText = "Nach Uhrzeit";
|
||||
mp.events.call("showMedicTasks", 0, JSON.stringify(initTasks));
|
||||
break;
|
||||
|
||||
case 1: //Sortierung nach Metern (aufsteigend)
|
||||
for (var d = 0; d < tasks.length; d++) {
|
||||
for (var e = 0; e < tasks.length - 1; e++) {
|
||||
if (getDistance1(e) > getDistance2(e + 1)) {
|
||||
var tempTask = tasks[e];
|
||||
tasks[e] = tasks[e + 1];
|
||||
tasks[e + 1] = tempTask;
|
||||
mp.gui.chat.push("SWITCH");
|
||||
}
|
||||
}
|
||||
}
|
||||
reviveTaskMenuMedic.Close();
|
||||
factionInteractionMenu.Close();
|
||||
sortText = "Entfernung aufsteigend";
|
||||
mp.events.call("showMedicTasks", 0, JSON.stringify(tasks));
|
||||
break;
|
||||
|
||||
//case 2: //Sortierung nach Metern (absteigend)
|
||||
// mp.gui.chat.push("Sorting 2");
|
||||
// sortText = "Entfernung absteigend";
|
||||
// break;
|
||||
//case 3: //Sortierung nach Zeit (aufsteigend)
|
||||
// mp.gui.chat.push("Sorting 3");
|
||||
// sortText = "Restzeit aufsteigend";
|
||||
// break;
|
||||
//case 4: //Sortierung nach Zeit (absteigend)
|
||||
// mp.gui.chat.push("Sorting 4");
|
||||
// sortText = "Restzeit absteigend";
|
||||
// break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function getDistance1(index) {
|
||||
return mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, newTasks[index].Position.x, newTasks[index].Position.y, newTasks[index].Position.z, true).toFixed(2);
|
||||
}
|
||||
function getDistance2(index) {
|
||||
return mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, newTasks[index].Position.x, newTasks[index].Position.y, newTasks[index].Position.z, true).toFixed(2);
|
||||
}
|
||||
|
||||
mp.events.add("cutMedicEarnings", () => {
|
||||
deadRespawned = true;
|
||||
});
|
||||
|
||||
mp.events.add("destroyMedicTaskCheckpoint", () => {
|
||||
activeCheckpoint.destroy();
|
||||
activeTask = null;
|
||||
timeLeft = 0;
|
||||
mp.events.callRemote("MedicTaskTimeout");
|
||||
});
|
||||
|
||||
mp.events.add('playerEnterCheckpoint', (activeCheckpoint) => {
|
||||
if (deadRespawned == true) {
|
||||
activeCheckpoint.destroy();
|
||||
mp.events.callRemote("PayCutMedicEarnings");
|
||||
activeTask = null;
|
||||
deadRespawned = false;
|
||||
timeLeft = 0;
|
||||
} else if (activeTask.Type == 1){
|
||||
activeCheckpoint.destroy();
|
||||
mp.events.callRemote("delHealTaskAsMedic", activeTask.Victim);
|
||||
activeTask = null;
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add('render', () => {
|
||||
if (activeTask) {
|
||||
rangeLeft = mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, taskFinish.x, taskFinish.y, taskFinish.z, true).toFixed(2);
|
||||
if (rangeLeft > 1.9) {
|
||||
ambulanceImagePos = 0.655 - (mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, taskFinish.x, taskFinish.y, taskFinish.z, true) / taskRange * 0.35);
|
||||
mp.game.graphics.drawRect(0.5, 0.945, 0.35, 0.025, 150, 0, 0, 200);
|
||||
mp.game.graphics.drawText(rangeLeft.toString() + "m", [0.5, 0.93], {
|
||||
font: 0,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.35, 0.35],
|
||||
outline: true,
|
||||
centre: true
|
||||
});
|
||||
if (taskRange < rangeLeft) ambulanceImagePos = 0.3;
|
||||
mp.game.graphics.drawSprite("medicimages", "finish", 0.655, 0.898, 0.04, 0.07, 0, 255, 255, 255, 255);
|
||||
if (player.isInAnyVehicle(false)) {
|
||||
mp.game.graphics.drawSprite("medicimages", "ambulance", ambulanceImagePos + 0.01, 0.915, 0.04, 0.07, 0, 255, 255, 255, 255);
|
||||
} else {
|
||||
mp.game.graphics.drawSprite("medicimages", "running", ambulanceImagePos + 0.02, 0.915, 0.02, 0.035, 0, 255, 0, 0, 255);
|
||||
}
|
||||
}
|
||||
|
||||
var currentDate = new Date();
|
||||
|
||||
if (deadRespawned == false) {
|
||||
timeLeft = Math.round(Math.abs(Math.floor(currentDate.getTime() / 1000) - deathTime - 30));
|
||||
if (timeLeft < 1) mp.events.call("cutMedicEarnings");
|
||||
} else {
|
||||
timeLeft = Math.round(Math.abs(Math.floor(currentDate.getTime() / 1000) - deathTime - 60));
|
||||
if (timeLeft < 1) mp.events.call("destroyMedicTaskCheckpoint");
|
||||
}
|
||||
|
||||
/*DEBUG TIMER für die Zeit die man noch hat zur Wiederbelebung
|
||||
if (deadRespawned == false) {
|
||||
mp.game.graphics.drawText(timeLeft.toString() + "s ", [0.5, 0.88], {
|
||||
font: 7,
|
||||
color: [60, 179, 113, 255],
|
||||
scale: [0.3, 0.3],
|
||||
outline: true,
|
||||
centre: true
|
||||
});
|
||||
} else {
|
||||
{
|
||||
mp.game.graphics.drawText(timeLeft.toString() + "s", [0.5, 0.88], {
|
||||
font: 7,
|
||||
color: [255, 203, 145, 255],
|
||||
scale: [0.3, 0.3],
|
||||
outline: true,
|
||||
centre: true
|
||||
});
|
||||
}
|
||||
} */
|
||||
}
|
||||
});
|
||||
}
|
||||
1288
ReallifeGamemode.Client/Interaction/friseur/female_hair.json
Normal file
1288
ReallifeGamemode.Client/Interaction/friseur/female_hair.json
Normal file
File diff suppressed because it is too large
Load Diff
355
ReallifeGamemode.Client/Interaction/friseur/friseur.ts
Normal file
355
ReallifeGamemode.Client/Interaction/friseur/friseur.ts
Normal file
@@ -0,0 +1,355 @@
|
||||
import * as NativeUI from '../../libs/NativeUI';
|
||||
import maleHair from "./male_hair.json";
|
||||
import femaleHair from "./female_hair.json";
|
||||
import main from '../../Jobs/main';
|
||||
|
||||
const UIMenu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
const maxHairColor = 64;
|
||||
|
||||
export default function friseurShopList(globalData: IGlobalData) {
|
||||
const categoryTitles = {
|
||||
clothes: {
|
||||
1: "Masks",
|
||||
2: "Frisur",
|
||||
3: "Torsos",
|
||||
4: "Legs",
|
||||
5: "Bags and Parachutes",
|
||||
6: "Shoes",
|
||||
7: "Accessories",
|
||||
8: "Undershirts",
|
||||
9: "Body Armors",
|
||||
10: "Decals",
|
||||
11: "Tops"
|
||||
},
|
||||
|
||||
props: {
|
||||
0: "Hats",
|
||||
1: "Glasses",
|
||||
2: "Ears",
|
||||
6: "Watches",
|
||||
7: "Bracelets"
|
||||
}
|
||||
};
|
||||
|
||||
const localPlayer = mp.players.local;
|
||||
var playerPos;
|
||||
var myVar;
|
||||
|
||||
let mainMenu = null;
|
||||
let categoryMenus = [];
|
||||
let clothingData = [];
|
||||
let currentMenuIdx = -1;
|
||||
let menuTransition = false; // workaround for ItemSelect event being called twice between menu transitions
|
||||
let lastClothing = null;
|
||||
|
||||
function getClothingName(key, ClotheId, gender) {
|
||||
var textures = []
|
||||
|
||||
var hair;
|
||||
|
||||
if (!gender) {
|
||||
hair = maleHair;
|
||||
} else {
|
||||
hair = femaleHair;
|
||||
}
|
||||
|
||||
switch (key) {
|
||||
case 2:
|
||||
for (var i = 0; i < Object.keys(hair[ClotheId]).length; i++) {
|
||||
if (hair[ClotheId][i].Localized != "NULL") {
|
||||
const newData = {
|
||||
id: i,
|
||||
data: [hair[ClotheId][i]]
|
||||
}
|
||||
textures.push(newData);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
return textures;
|
||||
}
|
||||
|
||||
function addClothingItems(type, bannerSprite, key, value, gender) {
|
||||
var categoryMenu;
|
||||
var cloth = [];
|
||||
var tx = [];
|
||||
|
||||
if (Object.keys(categoryMenus).length > 0) {
|
||||
for (var i = 0; i < categoryMenus.length; i++) {
|
||||
if (categoryMenus[i].slotIdx == key) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
mainMenu.AddItem(new UIMenuItem(categoryTitles[type][key]));
|
||||
// Create category menu
|
||||
categoryMenu = new UIMenu("", categoryTitles[type][key].toUpperCase(), new Point(0, 0), bannerSprite.library, bannerSprite.texture);
|
||||
categoryMenu.Visible = false;
|
||||
} else {
|
||||
mainMenu.AddItem(new UIMenuItem(categoryTitles[type][key]));
|
||||
// Create category menu
|
||||
categoryMenu = new UIMenu("", categoryTitles[type][key].toUpperCase(), new Point(0, 0), bannerSprite.library, bannerSprite.texture);
|
||||
categoryMenu.Visible = false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
mainMenu.Item
|
||||
|
||||
// Fill it
|
||||
|
||||
for (const item of value) {
|
||||
if (item.ComponentId == key) {
|
||||
var txData = getClothingName(key, item.ClotheId, gender);
|
||||
|
||||
for (const x of txData) {
|
||||
//var itemDescription = (key === 11 ? mp.game.ui.getLabelText(x.undershirt[1].GXT) : "Clothing item.");
|
||||
var itemDescription = (key === 11 ? x.undershirt[1].GXT + " - " + x.id : "Clothing item.");
|
||||
if (itemDescription == "NULL") {
|
||||
itemDescription = "Clothing item.";
|
||||
}
|
||||
const tempItem = new UIMenuItem(mp.game.ui.getLabelText(x.data[0].GXT));
|
||||
//const tempItem = new UIMenuItem(x.data[0].GXT + " - " + x.id, itemDescription);
|
||||
|
||||
tempItem.SetRightLabel(`${item.Price > 0 ? `$${item.Price}` : "FREE"}`);
|
||||
|
||||
categoryMenu.AddItem(tempItem);
|
||||
|
||||
cloth.push(item);
|
||||
tx.push(x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
categoryMenus.push({
|
||||
menu: categoryMenu,
|
||||
type: type,
|
||||
slotIdx: Number(key),
|
||||
item: cloth,
|
||||
texture: tx
|
||||
});
|
||||
}
|
||||
|
||||
function submenuItemChangeHandler(newIndex) {
|
||||
const currentMenu = categoryMenus[currentMenuIdx];
|
||||
const currentItem = currentMenu.item[newIndex];
|
||||
const currentTexture = currentMenu.texture[newIndex].id;
|
||||
//const currentItem = clothingData[currentMenu.type][currentMenu.slotIdx][newIndex];
|
||||
|
||||
|
||||
mp.players.local.setComponentVariation(currentMenu.slotIdx, currentItem.ClotheId, currentTexture, 2);
|
||||
|
||||
|
||||
/*
|
||||
case "props":
|
||||
if (currentItem.drawable === -1) {
|
||||
localPlayer.clearProp(currentMenu.slotIdx);
|
||||
} else {
|
||||
localPlayer.setPropIndex(currentMenu.slotIdx, currentItem.drawable, currentItem.texture, true);
|
||||
}
|
||||
break;
|
||||
*/
|
||||
}
|
||||
|
||||
function resetPreview() {
|
||||
if (lastClothing) {
|
||||
switch (lastClothing.type) {
|
||||
case "clothes":
|
||||
localPlayer.setComponentVariation(lastClothing.slotIdx, lastClothing.drawable, lastClothing.texture, 2);
|
||||
|
||||
break;
|
||||
|
||||
case "props":
|
||||
if (lastClothing.drawable === -1) {
|
||||
localPlayer.clearProp(lastClothing.slotIdx);
|
||||
} else {
|
||||
localPlayer.setPropIndex(lastClothing.slotIdx, lastClothing.drawable, lastClothing.texture, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
lastClothing = null;
|
||||
}
|
||||
}
|
||||
|
||||
function myTimer() {
|
||||
let dist = mp.game.gameplay.getDistanceBetweenCoords(localPlayer.position.x, localPlayer.position.y, 0, playerPos.x, playerPos.y, 0, false);
|
||||
if (dist > 3) {
|
||||
clearInterval(myVar);
|
||||
resetPreview();
|
||||
if (currentMenuIdx !== -1) categoryMenus[currentMenuIdx].menu.Close();
|
||||
if (mainMenu && mainMenu.Visible) mainMenu.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
mp.events.add("FriseurMenu:updateData", (jsonBannerSprite, jsonData, gender) => {
|
||||
if (!globalData.InMenu) {
|
||||
globalData.InMenu = true;
|
||||
playerPos = localPlayer.position;
|
||||
var bannerSprite = JSON.parse(jsonBannerSprite);
|
||||
var data = JSON.parse(jsonData);
|
||||
|
||||
// Default menu banner
|
||||
if (bannerSprite == null) {
|
||||
bannerSprite = {
|
||||
library: "commonmenu",
|
||||
texture: "interaction_bgd"
|
||||
};
|
||||
} else if (bannerSprite == 10) {
|
||||
bannerSprite = {
|
||||
library: "shopui_title_barber",
|
||||
texture: "shopui_title_barber"
|
||||
};
|
||||
}
|
||||
// Hide the chat
|
||||
mp.gui.chat.show(false);
|
||||
|
||||
// Reset some variables
|
||||
categoryMenus = [];
|
||||
currentMenuIdx = -1;
|
||||
menuTransition = false;
|
||||
lastClothing = null;
|
||||
|
||||
// Create a new main menu
|
||||
mainMenu = new UIMenu("", "Wähle deine Frisur", new Point(0, 0), bannerSprite.library, bannerSprite.texture);
|
||||
mainMenu.Visible = true;
|
||||
|
||||
// Update clothingData
|
||||
clothingData = data;
|
||||
|
||||
// Add clothes
|
||||
|
||||
addClothingItems("clothes", bannerSprite, 2, data[0], gender);
|
||||
myVar = setInterval(myTimer, 100);
|
||||
// Add props
|
||||
// for (const [key, value] of Object.entries(clothingData.props)) addClothingItems("props", bannerSprite, key, value);
|
||||
|
||||
let hairColorItem;
|
||||
let hairHighlightItem;
|
||||
var creatorHairMenu;
|
||||
let hairColors = [];
|
||||
for (let i = 0; i < maxHairColor; i++) hairColors.push(i.toString());
|
||||
|
||||
|
||||
hairColorItem = new UIMenuListItem("Haarfarbe", "Deine Haarfarbe", new ItemsCollection(hairColors));
|
||||
mainMenu.AddItem(hairColorItem);
|
||||
/* hairHighlightItem = new UIMenuListItem("Haarstr\u00e4hnen", "Farbe deiner Haarstr\u00e4hnen", new ItemsCollection(hairColors));
|
||||
mainMenu.AddItem(hairHighlightItem);
|
||||
*/ //Wird später hinzugefügt
|
||||
mainMenu.ListChange.on((item, listIndex) => {
|
||||
switch (mainMenu.CurrentSelection) {
|
||||
case 1: // hair color
|
||||
localPlayer.setHairColor(listIndex, 0);
|
||||
break;
|
||||
|
||||
/* case 2: // hair highlight color
|
||||
localPlayer.setHairColor(hairColorItem.Index, listIndex);
|
||||
break;
|
||||
*/
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// Submenu events
|
||||
for (const item of categoryMenus) {
|
||||
// Preview hovering item
|
||||
item.menu.IndexChange.on(submenuItemChangeHandler);
|
||||
|
||||
// Buy hovering item
|
||||
item.menu.ItemSelect.on((item: NativeUI.UIMenuItem, itemIndex) => {
|
||||
if (menuTransition) {
|
||||
menuTransition = false;
|
||||
return;
|
||||
}
|
||||
|
||||
const currentMenu = categoryMenus[currentMenuIdx];
|
||||
const currentItem = currentMenu.item[itemIndex];
|
||||
const currentTexture = currentMenu.texture[itemIndex].id;
|
||||
|
||||
var serverData = [currentMenu.slotIdx, currentTexture, currentItem.ClotheId, -1, -1, -1, currentItem.Price];
|
||||
if (lastClothing.drawable == currentItem.ClotheId && lastClothing.texture == currentTexture) {
|
||||
mp.game.audio.playSoundFrontend(1, "Hack_Failed", "DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS", true);
|
||||
} else {
|
||||
mp.events.callRemote("SERVER:BuyCharacterClothes", "clothe", JSON.stringify(serverData), currentItem.CloteID);
|
||||
mp.events.call("friseurMenu:close");
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
// Reset preview when player backs out of category menu
|
||||
item.menu.MenuClose.on(() => {
|
||||
|
||||
|
||||
currentMenuIdx = -1;
|
||||
mainMenu.Visible = true;
|
||||
if (mainMenu.Visible = true) {
|
||||
resetPreview();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Main menu events
|
||||
mainMenu.ItemSelect.on((selectedItem, itemIndex) => {
|
||||
if (selectedItem === hairColorItem) {
|
||||
mp.events.callRemote("SERVER:BuyHairColor", hairColorItem.SelectedValue);
|
||||
mainMenu.Close(true);
|
||||
globalData.InMenu = false;
|
||||
|
||||
}
|
||||
else if (selectedItem === hairHighlightItem) {
|
||||
mp.events.callRemote("CLIENT:BuyHairlightColor", hairHighlightItem.SelectedValue);
|
||||
mainMenu.Close(true);
|
||||
globalData.InMenu = false;
|
||||
} else {
|
||||
|
||||
const nextMenu = categoryMenus[itemIndex];
|
||||
const slot = Number(nextMenu.slotIdx);
|
||||
|
||||
lastClothing = {
|
||||
type: nextMenu.type,
|
||||
slotIdx: slot,
|
||||
drawable: (nextMenu.type === "props" ? localPlayer.getPropIndex(slot) : localPlayer.getDrawableVariation(slot)),
|
||||
texture: (nextMenu.type === "props" ? localPlayer.getPropTextureIndex(slot) : localPlayer.getTextureVariation(slot)),
|
||||
undershirt: [localPlayer.getDrawableVariation(8), localPlayer.getTextureVariation(8)],
|
||||
torso: localPlayer.getDrawableVariation(3)
|
||||
};
|
||||
|
||||
|
||||
currentMenuIdx = itemIndex;
|
||||
mainMenu.Visible = false;
|
||||
nextMenu.menu.Visible = true;
|
||||
menuTransition = true;
|
||||
|
||||
submenuItemChangeHandler(nextMenu.menu.CurrentSelection);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
mainMenu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
mp.gui.chat.show(true);
|
||||
|
||||
currentMenuIdx = -1;
|
||||
lastClothing = null;
|
||||
});
|
||||
}
|
||||
});
|
||||
mp.events.add("friseurMenu:close", () => {
|
||||
if (currentMenuIdx !== -1) categoryMenus[currentMenuIdx].menu.Close();
|
||||
if (mainMenu && mainMenu.Visible) mainMenu.Close();
|
||||
});
|
||||
|
||||
mp.events.add("frieseurMenu:Error", () => {
|
||||
mp.game.audio.playSoundFrontend(1, "Hack_Failed", "DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS", true);
|
||||
});
|
||||
}
|
||||
1220
ReallifeGamemode.Client/Interaction/friseur/male_hair.json
Normal file
1220
ReallifeGamemode.Client/Interaction/friseur/male_hair.json
Normal file
File diff suppressed because it is too large
Load Diff
547
ReallifeGamemode.Client/Interaction/interactionmenu.ts
Normal file
547
ReallifeGamemode.Client/Interaction/interactionmenu.ts
Normal file
@@ -0,0 +1,547 @@
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
import InputHelper from '../inputhelper';
|
||||
import moneyFormat from '../moneyformat';
|
||||
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
let screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
import { getStreetName, getZoneName } from '../streetnames';
|
||||
|
||||
export default function (globalData: IGlobalData) {
|
||||
|
||||
var menuClose = false;
|
||||
|
||||
var accountItem = new UIMenuItem("Account", "Account Informationen");
|
||||
|
||||
var serviceItem = new UIMenuItem("Service rufen", "Rufe einen Dienstleister an");
|
||||
|
||||
var factionItem = new UIMenuItem("Fraktion", "Fraktionsfahrzeug finden");
|
||||
|
||||
var factionleaderItem = new UIMenuItem("Fraktion", "Verwalte deine Fraktion");
|
||||
|
||||
var groupItem = new UIMenuItem("Gruppe", "Verwalte deine Gruppe");
|
||||
|
||||
var paycheckItem = new UIMenuItem("Gehaltsscheck", "Schaue dir deinen Verdienst der letzten Stunde an");
|
||||
|
||||
var licenseItem = new UIMenuItem("Lizenzen", "Lizenzen Informationen");
|
||||
|
||||
var vehiclesItem = new UIMenuItem("Fahrzeuge", "Zeige deine Fahrzeuge an");
|
||||
|
||||
var HouseItem = new UIMenuItem("Haus", "Finde dein Haus");
|
||||
|
||||
var ticketItem = new UIMenuItem("Strafticket", "Strafticket annehmen/ablehnen");
|
||||
|
||||
var payName: string;
|
||||
|
||||
var groupRank = null;
|
||||
|
||||
mp.events.add("SERVER:InteractionMenu_OpenMenu", (accountDataJson: string, factionleader: string, faction: string, group: string, factionInvite: boolean, groupInvite: boolean, ticket_boolean: boolean, ticket_amount, house: boolean) => {
|
||||
|
||||
|
||||
var accountData: AccountData = JSON.parse(accountDataJson);
|
||||
//var ticket_amount = JSON.parse(ticket_amountJson);
|
||||
|
||||
var menu = getInteractionMenu();
|
||||
|
||||
var serviceMenu = getServicesMenu(menu);
|
||||
menu.AddItem(serviceItem);
|
||||
menu.BindMenuToItem(serviceMenu, serviceItem);
|
||||
|
||||
menu.AddItem(accountItem);
|
||||
menu.BindMenuToItem(getAccountMenu(accountData), accountItem);
|
||||
|
||||
menu.AddItem(licenseItem);
|
||||
menu.BindMenuToItem(getLicenseMenu(accountData, accountData.licenses, menu), licenseItem);
|
||||
|
||||
groupRank = accountData.groupRank;
|
||||
|
||||
var vehicles = accountData.vehicles;
|
||||
if (vehicles.length > 0) {
|
||||
menu.AddItem(vehiclesItem);
|
||||
menu.BindMenuToItem(getVehiclesMenu(vehicles, "CLIENT:InteractionMenu_PlayerVehicleInteraction", true, menu), vehiclesItem);
|
||||
}
|
||||
|
||||
if (faction && !factionleader) {
|
||||
factionItem.SetRightLabel(faction);
|
||||
menu.AddItem(factionItem);
|
||||
menu.BindMenuToItem(getFactionMenu(faction, accountData.factionVehicles, accountData.stateFaction, menu), factionItem);
|
||||
}
|
||||
if (faction && factionleader) {
|
||||
factionleaderItem.SetRightLabel(factionleader);
|
||||
menu.AddItem(factionleaderItem);
|
||||
menu.BindMenuToItem(getFactionLeaderMenu(faction, accountData.factionVehicles, accountData.stateFaction, menu), factionleaderItem);
|
||||
}
|
||||
|
||||
if (group) {
|
||||
groupItem.SetRightLabel(group);
|
||||
menu.AddItem(groupItem);
|
||||
menu.BindMenuToItem(getGroupMenu(group, menu), groupItem);
|
||||
}
|
||||
menu.AddItem(HouseItem);
|
||||
|
||||
|
||||
|
||||
|
||||
if (accountData.paycheck) {
|
||||
var p = accountData.paycheck;
|
||||
var paycheckMenu = new Menu("Gehaltsscheck", "Dein Verdienst der letzten Stunde", new Point(0, screenRes.y / 3), null, null);
|
||||
paycheckMenu.Visible = false;
|
||||
|
||||
var item: NativeUI.UIMenuItem = new UIMenuItem("Lohn");
|
||||
item.SetRightLabel("~g~+ $" + moneyFormat(p.wage));
|
||||
paycheckMenu.AddItem(item);
|
||||
|
||||
item = new UIMenuItem("Sonstige Einkünfte");
|
||||
item.SetRightLabel("~g~+ $" + moneyFormat(Number(p.otheramount.toFixed(2))));
|
||||
paycheckMenu.AddItem(item);
|
||||
|
||||
item = new UIMenuItem("Finanzhilfe");
|
||||
item.SetRightLabel("~g~+ $" + moneyFormat(Number(p.financialHelp.toFixed(2))));
|
||||
paycheckMenu.AddItem(item);
|
||||
|
||||
if (p.factionMoney) {
|
||||
item = new UIMenuItem("Fraktionsgeld");
|
||||
item.SetRightLabel("~g~+ $" + moneyFormat(Number(p.factionMoney.toFixed(2))));
|
||||
paycheckMenu.AddItem(item);
|
||||
}
|
||||
|
||||
item = new UIMenuItem("Fahrzeugsteuer");
|
||||
item.SetRightLabel("~r~- $" + moneyFormat(Number(p.vehicleTaxation.toFixed(2))));
|
||||
paycheckMenu.AddItem(item);
|
||||
|
||||
item = new UIMenuItem("Grundsteuer");
|
||||
item.SetRightLabel("~r~- $" + moneyFormat(Number(p.propertyTaxation.toFixed(2))));
|
||||
paycheckMenu.AddItem(item);
|
||||
|
||||
item = new UIMenuItem("Mietkosten");
|
||||
item.SetRightLabel("~r~- $" + moneyFormat(Number(p.rentalFees.toFixed(2))));
|
||||
paycheckMenu.AddItem(item);
|
||||
|
||||
item = new UIMenuItem("Krankenkasse");
|
||||
item.SetRightLabel("~r~- $" + moneyFormat(Number(p.healthInsurance.toFixed(2))));
|
||||
paycheckMenu.AddItem(item);
|
||||
|
||||
item = new UIMenuItem("Einkommensteuer");
|
||||
|
||||
item.SetRightLabel(moneyFormat(Number((p.financialInterest * 100).toFixed(3))) + "%");
|
||||
paycheckMenu.AddItem(item);
|
||||
|
||||
menu.AddItem(paycheckItem);
|
||||
menu.BindMenuToItem(paycheckMenu, paycheckItem);
|
||||
}
|
||||
|
||||
var payItem = new UIMenuItem("Geld geben");
|
||||
menu.AddItem(payItem);
|
||||
|
||||
var nextPaydayItem = new UIMenuItem("Nächster PayDay");
|
||||
nextPaydayItem.SetRightLabel(`${accountData.nextPayday} Minuten`);
|
||||
menu.AddItem(nextPaydayItem);
|
||||
|
||||
if (ticket_boolean == true) {
|
||||
menu.AddItem(ticketItem);
|
||||
menu.BindMenuToItem(getTicketMenu(ticket_amount, menu), ticketItem);
|
||||
}
|
||||
|
||||
var items: Array<string> = new Array<string>();
|
||||
if (factionInvite) items.push("Fraktion");
|
||||
if (groupInvite) items.push("Gruppe");
|
||||
var acceptItem: NativeUI.UIMenuListItem;
|
||||
|
||||
if (items.length !== 0) {
|
||||
acceptItem = new UIMenuListItem("Einladung annehmen", "", new ItemsCollection(items));
|
||||
menu.AddItem(acceptItem);
|
||||
}
|
||||
|
||||
menu.Open();
|
||||
globalData.InMenu = true;
|
||||
mp.gui.chat.show(false);
|
||||
menu.ItemSelect.on((item: NativeUI.UIMenuItem, index: number) => {
|
||||
if (item === acceptItem) {
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_AcceptInvite", acceptItem.SelectedValue);
|
||||
menu.Close(true);
|
||||
globalData.InMenu = false;
|
||||
} else if (item === payItem) {
|
||||
mp.gui.chat.activate(true);
|
||||
mp.gui.cursor.show(true, true);
|
||||
globalData.InMenu = false;
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Welchem Spieler möchtest du Geld geben (Name / ID)?", globalData);
|
||||
input.show();
|
||||
input.getValue(name => {
|
||||
mp.events.call("CLIENT:InteractionMenu_Pay_Name", name);
|
||||
mp.gui.cursor.show(false, false);
|
||||
menu.Close(true);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
} else if (item == HouseItem) {
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_FindHouse");
|
||||
mp.gui.cursor.show(false, false);
|
||||
menu.Close(true);
|
||||
globalData.InInput = false;
|
||||
}
|
||||
});
|
||||
|
||||
menu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
mp.gui.chat.show(true);
|
||||
})
|
||||
});
|
||||
|
||||
function getInteractionMenu(): NativeUI.Menu {
|
||||
return new Menu("Hauptmenü", "Interaktionen | " + mp.players.local.name, new Point(0, screenRes.y / 3), null, null);
|
||||
}
|
||||
|
||||
function getAccountMenu(data: AccountData): NativeUI.Menu {
|
||||
var accountMenu = new NativeUI.Menu("Account", mp.players.local.name, new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
var menuItem = new UIMenuItem("Fraktion");
|
||||
menuItem.SetRightLabel(data.faction);
|
||||
accountMenu.AddItem(menuItem);
|
||||
|
||||
if (data.faction != "Zivilist") {
|
||||
menuItem = new UIMenuItem("Fraktionsrang");
|
||||
menuItem.SetRightLabel(data.factionRank);
|
||||
accountMenu.AddItem(menuItem);
|
||||
}
|
||||
|
||||
menuItem = new UIMenuItem("Job");
|
||||
menuItem.SetRightLabel(data.job);
|
||||
accountMenu.AddItem(menuItem);
|
||||
|
||||
if (data.group != null) {
|
||||
menuItem = new UIMenuItem("Gruppe");
|
||||
menuItem.SetRightLabel(data.group);
|
||||
accountMenu.AddItem(menuItem);
|
||||
menuItem = new UIMenuItem("Gruppenrang");
|
||||
menuItem.SetRightLabel(data.groupRank);
|
||||
accountMenu.AddItem(menuItem);
|
||||
}
|
||||
|
||||
menuItem = new UIMenuItem("Registrierungsdatum");
|
||||
menuItem.SetRightLabel(data.regDate);
|
||||
accountMenu.AddItem(menuItem);
|
||||
|
||||
menuItem = new UIMenuItem("Adminrang");
|
||||
menuItem.SetRightLabel(data.adminLevel);
|
||||
accountMenu.AddItem(menuItem);
|
||||
|
||||
accountMenu.Visible = false;
|
||||
return accountMenu;
|
||||
}
|
||||
|
||||
function getLicenseMenu(accdata: AccountData, data: Licenses, parentMenu: NativeUI.Menu, ): NativeUI.Menu {
|
||||
var licenseMenu = new NativeUI.Menu("Lizenzen", mp.players.local.name, new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
var menuItem = new UIMenuItem("Auto Führerschein");
|
||||
if (data.drivingLicenseCar == false) {
|
||||
menuItem.SetRightLabel("~r~nicht erhalten");
|
||||
} else if (data.drivingLicenseCar == true) {
|
||||
menuItem.SetRightLabel("~g~erhalten");
|
||||
}
|
||||
licenseMenu.AddItem(menuItem);
|
||||
|
||||
menuItem = new UIMenuItem("Motorrad Führerschein");
|
||||
if (data.drivingLicenseBike == false) {
|
||||
menuItem.SetRightLabel("~r~nicht erhalten");
|
||||
} else if (data.drivingLicenseBike == true) {
|
||||
menuItem.SetRightLabel("~g~erhalten");
|
||||
}
|
||||
licenseMenu.AddItem(menuItem);
|
||||
|
||||
menuItem = new UIMenuItem("Flugschein Flugzeug");
|
||||
if (data.flightLicensePlane == false) {
|
||||
menuItem.SetRightLabel("~r~nicht erhalten");
|
||||
} else if (data.flightLicensePlane == true) {
|
||||
menuItem.SetRightLabel("~g~erhalten");
|
||||
}
|
||||
licenseMenu.AddItem(menuItem);
|
||||
|
||||
menuItem = new UIMenuItem("Waffenschein");
|
||||
if (data.weaponLicense == false) {
|
||||
menuItem.SetRightLabel("~r~nicht erhalten");
|
||||
} else if (data.weaponLicense == true) {
|
||||
menuItem.SetRightLabel("~g~erhalten");
|
||||
}
|
||||
licenseMenu.AddItem(menuItem);
|
||||
|
||||
menuItem = new UIMenuItem("Strafpunkte");
|
||||
if (accdata.points == 0) {
|
||||
menuItem.SetRightLabel("~g~" + accdata.points);
|
||||
}
|
||||
else if (accdata.points >= 1 && accdata.points <= 5) {
|
||||
menuItem.SetRightLabel("~y~" + accdata.points);
|
||||
}
|
||||
if (accdata.points > 5) {
|
||||
menuItem.SetRightLabel("~r~" + accdata.points);
|
||||
}
|
||||
licenseMenu.AddItem(menuItem);
|
||||
|
||||
var showItem = new UIMenuItem("Lizenzen an Spieler zeigen");
|
||||
licenseMenu.AddItem(showItem);
|
||||
|
||||
licenseMenu.Visible = false;
|
||||
|
||||
licenseMenu.ItemSelect.on((item, index) => {
|
||||
if (item === showItem) {
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Welchen Spieler möchtest du deine Lizenzen zeigen (Name / ID)?", globalData);
|
||||
input.show();
|
||||
input.getValue(name => {
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_Show", "License", name);
|
||||
parentMenu.Close(true);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
return licenseMenu;
|
||||
}
|
||||
|
||||
function getFactionMenu(faction: string, vehData: VehicleData[], stateFaction: boolean, parentMenu: NativeUI.Menu): NativeUI.Menu {
|
||||
|
||||
var factionMenu = new NativeUI.Menu("Fraktion", faction, new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
|
||||
factionMenu.Visible = false;
|
||||
|
||||
if (vehData.length > 0) {
|
||||
var factionVehicleItem = new UIMenuItem("Fahrzeuge Finden", "Finden");
|
||||
factionMenu.AddItem(factionVehicleItem);
|
||||
factionMenu.BindMenuToItem(getVehiclesMenuFaction(vehData, "CLIENT:InteractionMenu_FactionVehicleInteraction", !stateFaction, parentMenu), factionVehicleItem);
|
||||
}
|
||||
|
||||
return factionMenu;
|
||||
}
|
||||
function getFactionLeaderMenu(faction: string, vehData: VehicleData[], stateFaction: boolean, parentMenu: NativeUI.Menu): NativeUI.Menu {
|
||||
|
||||
var factionMenu = new NativeUI.Menu("Fraktion", faction, new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
factionMenu.AddItem(new UIMenuItem("Spieler einladen"));
|
||||
factionMenu.AddItem(new UIMenuItem("Spieler rauswerfen"));
|
||||
factionMenu.Visible = false;
|
||||
mp.gui.chat.show(false);
|
||||
if (vehData.length > 0) {
|
||||
var factionVehicleItem = new UIMenuItem("Fahrzeuge", "Finden oder Verkaufen");
|
||||
factionMenu.AddItem(factionVehicleItem);
|
||||
factionMenu.BindMenuToItem(getVehiclesMenu(vehData, "CLIENT:InteractionMenu_FactionVehicleInteraction", !stateFaction, parentMenu), factionVehicleItem);
|
||||
}
|
||||
|
||||
|
||||
factionMenu.ItemSelect.on((item, index) => {
|
||||
if (index === 0) { // Inviten
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Welchen Spieler möchtest du inviten (Name / ID)?", globalData);
|
||||
input.show();
|
||||
input.getValue(name => {
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_Invite", "Fraktion", name);
|
||||
factionMenu.Close();
|
||||
globalData.InInput = false;
|
||||
});
|
||||
} else if (index === 1) { // Uninviten
|
||||
globalData.InInput == true;
|
||||
var input = new InputHelper("Welchen Spieler möchtest du uninviten (Name / ID)?", globalData);
|
||||
input.show();
|
||||
input.getValue(name => {
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_Uninvite", "Fraktion", name);
|
||||
factionMenu.Close();
|
||||
globalData.InInput = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return factionMenu;
|
||||
}
|
||||
|
||||
function getGroupMenu(group: string, parentMenu: NativeUI.Menu): NativeUI.Menu {
|
||||
var groupMenu = new NativeUI.Menu("Gruppe", group, new Point(0, screenRes.y / 3), null, null);
|
||||
if (groupRank == "Manager" || groupRank == "Besitzer") groupMenu.AddItem(new UIMenuItem("Spieler einladen"));
|
||||
if (groupRank == "Manager" || groupRank == "Besitzer") groupMenu.AddItem(new UIMenuItem("Spieler rauswerfen"));
|
||||
//groupMenu.AddItem(new UIMenuItem("Mitglieder anzeigen"));
|
||||
if (groupRank == "Besitzer") groupMenu.AddItem(new UIMenuItem("Leiter bestimmen"));
|
||||
groupMenu.AddItem(new UIMenuItem("Gruppe verlassen"));
|
||||
if (groupRank == "Besitzer") groupMenu.AddItem(new UIMenuItem("~r~Gruppe löschen"));
|
||||
groupMenu.Visible = false;
|
||||
mp.gui.chat.show(false);
|
||||
groupMenu.ItemSelect.on((item, index) => {
|
||||
switch (index) {
|
||||
case 0: //Spieler inviten
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Welchen Spieler möchtest du inviten (Name / ID)?", globalData);
|
||||
input.show();
|
||||
input.getValue(name => {
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_Invite", "Gruppe", name);
|
||||
parentMenu.Close();
|
||||
globalData.InInput = false;
|
||||
});
|
||||
break;
|
||||
|
||||
case 1: //Spieler uninviten
|
||||
globalData.InInput == true;
|
||||
var input = new InputHelper("Welchen Spieler möchtest du uninviten (Name / ID)?", globalData);
|
||||
input.show();
|
||||
input.getValue(name => {
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_Uninvite", "Gruppe", name);
|
||||
parentMenu.Close();
|
||||
globalData.InInput = false;
|
||||
});
|
||||
break;
|
||||
|
||||
case 2: //Gruppenmitglieder anzeigen
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_MemberList", "Gruppe");
|
||||
break;
|
||||
|
||||
case 3: //Neuen (zusätzlichen) Gruppenleiter bestimmen
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Welchen Spieler soll Manager werden (Name)? ", globalData);
|
||||
input.show();
|
||||
input.getValue(name => {
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_MakeLeader", "Gruppe", name);
|
||||
parentMenu.Close();
|
||||
globalData.InInput = false;
|
||||
});
|
||||
break;
|
||||
|
||||
case 4: //Gruppe verlassen (bestimmt zufällig neuen Leiter)
|
||||
groupMenu.Close();
|
||||
mp.gui.chat.show(true);
|
||||
globalData.InMenu = false;
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_LeaveGroup", "Gruppe");
|
||||
break;
|
||||
|
||||
case 5: //Gruppe löschen (als Leiter)
|
||||
groupMenu.Close();
|
||||
mp.gui.chat.show(true);
|
||||
globalData.InMenu = false;
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_DeleteGroup", "Gruppe");
|
||||
break;
|
||||
}
|
||||
|
||||
});
|
||||
return groupMenu;
|
||||
}
|
||||
|
||||
function getServicesMenu(parentMenu: NativeUI.Menu): NativeUI.Menu {
|
||||
var servicesMenu = new Menu("Services", "Rufe einen Service", new Point(0, screenRes.y / 3), null, null);
|
||||
servicesMenu.AddItem(new UIMenuItem("Taxi rufen", "Rufe ein Taxi zu deiner Position"));
|
||||
var saniItem = new UIMenuItem("Sanitäter rufen", "Rufe einen Sanitäter zu deiner Position.");
|
||||
servicesMenu.AddItem(saniItem);
|
||||
servicesMenu.Visible = false;
|
||||
|
||||
servicesMenu.ItemSelect.on((item, index) => {
|
||||
if (index === 0) { // Taxi
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_CallService_Taxi", getStreetName(), getZoneName());
|
||||
|
||||
}
|
||||
else if (index === 1) { // Sanitäter
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_CallService_Sani");
|
||||
|
||||
}
|
||||
parentMenu.Close(true);
|
||||
});
|
||||
|
||||
return servicesMenu;
|
||||
}
|
||||
|
||||
function getVehiclesMenu(vehicles: VehicleData[], eventName: string, allowSell: boolean, parentMenu: NativeUI.Menu): NativeUI.Menu {
|
||||
var desc = "Finden";
|
||||
if (allowSell) {
|
||||
desc += " oder Verkaufen";
|
||||
}
|
||||
|
||||
var menu = new Menu("Fahrzeuge", desc, new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
var items: string[] = ["Finden", "Verkaufen"];
|
||||
|
||||
var collection = new ItemsCollection(items);
|
||||
|
||||
vehicles.forEach(veh => {
|
||||
var name: string = mp.game.ui.getLabelText(mp.game.vehicle.getDisplayNameFromVehicleModel(veh.Model));
|
||||
|
||||
var item = new UIMenuListItem(`${veh.Id.toString().padEnd(5)} | ${name}`, "", collection, null, { id: veh.Id });
|
||||
|
||||
menu.AddItem(item);
|
||||
});
|
||||
|
||||
menu.ItemSelect.on((item: NativeUI.UIMenuListItem, index: number) => {
|
||||
var id = item.Data.id;
|
||||
var selection = item.SelectedValue;
|
||||
|
||||
mp.events.callRemote(eventName, id, selection);
|
||||
|
||||
parentMenu.Close(true);
|
||||
});
|
||||
|
||||
return menu;
|
||||
}
|
||||
function getVehiclesMenuFaction(vehicles: VehicleData[], eventName: string, allowSell: boolean, parentMenu: NativeUI.Menu): NativeUI.Menu {
|
||||
var desc = "Finden";
|
||||
|
||||
|
||||
var menu = new Menu("Fahrzeuge", desc, new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
var items: string[] = ["Finden"];
|
||||
|
||||
var collection = new ItemsCollection(items);
|
||||
|
||||
vehicles.forEach(veh => {
|
||||
var name: string = mp.game.ui.getLabelText(mp.game.vehicle.getDisplayNameFromVehicleModel(veh.Model));
|
||||
|
||||
var item = new UIMenuListItem(`${veh.Id.toString().padEnd(5)} | ${name}`, "", collection, null, { id: veh.Id });
|
||||
|
||||
menu.AddItem(item);
|
||||
});
|
||||
|
||||
menu.ItemSelect.on((item: NativeUI.UIMenuListItem, index: number) => {
|
||||
var id = item.Data.id;
|
||||
var selection = item.SelectedValue;
|
||||
|
||||
mp.events.callRemote(eventName, id, selection);
|
||||
|
||||
parentMenu.Close(true);
|
||||
});
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
function getTicketMenu(ticket_amount: number, parentMenu: NativeUI.Menu): NativeUI.Menu {
|
||||
var ticketMenu = new NativeUI.Menu("Ticket", `Ticket in Höhe von ${ticket_amount}$`, new Point(0, screenRes.y / 3), null, null);
|
||||
ticketMenu.AddItem(new UIMenuItem("Ticket annehmen"));
|
||||
ticketMenu.AddItem(new UIMenuItem("Ticket ablehnen"));
|
||||
ticketMenu.Visible = false;
|
||||
|
||||
ticketMenu.ItemSelect.on((item, index) => {
|
||||
if (index === 0) // Ticket annehmen
|
||||
{
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_Ticket", "Angenommen", ticket_amount);
|
||||
parentMenu.Close(true);
|
||||
}
|
||||
else if (index === 1) // Ticket ablehnen
|
||||
{
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_Ticket", "Abgelehnt", ticket_amount);
|
||||
parentMenu.Close(true);
|
||||
}
|
||||
});
|
||||
|
||||
return ticketMenu;
|
||||
}
|
||||
|
||||
mp.events.add("CLIENT:InteractionMenu_Pay_Name", (name) => {
|
||||
payName = name;
|
||||
globalData.InInput = true;
|
||||
var input = new InputHelper("Wie viel?", globalData);
|
||||
mp.gui.cursor.show(true, true);
|
||||
input.show();
|
||||
input.getValue(amount => {
|
||||
mp.events.callRemote("CLIENT:InteractionMenu_Pay", JSON.stringify(payName), amount);
|
||||
mp.gui.cursor.show(false, false);
|
||||
globalData.InInput = false;
|
||||
});
|
||||
});
|
||||
}
|
||||
290
ReallifeGamemode.Client/Interaction/playerinteraction.ts
Normal file
290
ReallifeGamemode.Client/Interaction/playerinteraction.ts
Normal file
@@ -0,0 +1,290 @@
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
|
||||
const { x: screenX, y: screenY } = mp.game.graphics.getScreenActiveResolution(0, 0);
|
||||
let rxC = 0.5;
|
||||
let ryC = 0.4;
|
||||
let rWidth = 0.4;
|
||||
let sX = (screenX * 0.1 / 1000);
|
||||
let sY = (screenY * 0.1 / 1000);
|
||||
let eX = sX - 0.1;
|
||||
let eY = sY - 0.1;
|
||||
let sizeMul = 0.08;
|
||||
let yMul = 1.8;
|
||||
|
||||
export default function playerInteraction(globalData: IGlobalData) {
|
||||
|
||||
var nearbyPlayers = [];
|
||||
let screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
var tradeRequest;
|
||||
var tradeRequester;
|
||||
var timerBarSize = 0.5;
|
||||
var tradeTimeLeft;
|
||||
var tradeTime;
|
||||
var tradeTimeEnd;
|
||||
var tradeSelection = "none";
|
||||
var tradeSelectHover = "none";
|
||||
var acceptColor = 100;
|
||||
var declineColor = 100;
|
||||
|
||||
var hoverItem;
|
||||
|
||||
var tempSlot2;
|
||||
|
||||
var receivedTradePrize;
|
||||
var receivedTradeItems = [[]];
|
||||
var receivedTradeGrid = [];
|
||||
receivedTradeGrid[0] = [0.3375, 0.5]
|
||||
receivedTradeGrid[1] = [0.4195, 0.5]
|
||||
receivedTradeGrid[2] = [0.5015, 0.5]
|
||||
receivedTradeGrid[3] = [0.5835, 0.5]
|
||||
receivedTradeGrid[4] = [0.6655, 0.5]
|
||||
|
||||
mp.events.add("showPlayerInteraction", (nearPlayerArr) => {
|
||||
mp.gui.chat.activate(false);
|
||||
nearbyPlayers = JSON.parse(nearPlayerArr);
|
||||
globalData.InMenu = true;
|
||||
let playerInteractionMenu = new Menu("Spielerinteraktion", "", new Point(0, screenRes.y / 3), null, null);
|
||||
let playerSelect = new UIMenuListItem("Mit", "~y~W\u00e4hle den Spieler aus.", new ItemsCollection(nearbyPlayers));
|
||||
playerInteractionMenu.AddItem(playerSelect);
|
||||
playerInteractionMenu.AddItem(new UIMenuItem("Handeln", "Sende dem Spieler eine Handlungsanfrage"));
|
||||
|
||||
let cancelItem = new UIMenuItem("Schlie\u00dfen", "Schlie\u00dft die Spielerinteraktion");
|
||||
cancelItem.BackColor = new Color(213, 0, 0);
|
||||
cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
playerInteractionMenu.AddItem(cancelItem);
|
||||
|
||||
playerInteractionMenu.Visible = true;
|
||||
|
||||
playerInteractionMenu.ItemSelect.on((item) => {
|
||||
if (item.Text === "Handeln") {
|
||||
mp.events.callRemote("openTradeInventory", playerSelect.SelectedValue);
|
||||
playerInteractionMenu.Visible = false;
|
||||
mp.gui.chat.activate(true);
|
||||
globalData.InMenu = false;
|
||||
} else if (item.Text === "Schlie\u00dfen") {
|
||||
playerInteractionMenu.Visible = false;
|
||||
mp.gui.chat.activate(true);
|
||||
globalData.InMenu = false;
|
||||
}
|
||||
});
|
||||
|
||||
playerInteractionMenu.MenuClose.on(() => {
|
||||
mp.gui.chat.activate(true);
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
});
|
||||
|
||||
mp.events.add("showTradeRequest", (tradeRequesterName, tradeItemsArr, tradePrizeSent) => {
|
||||
receivedTradeItems = tradeItemsArr;
|
||||
receivedTradePrize = tradePrizeSent;
|
||||
mp.gui.cursor.show(true, true);
|
||||
tradeRequester = tradeRequesterName;
|
||||
tradeRequest = true;
|
||||
tradeTime = new Date().getTime();
|
||||
tradeTimeEnd = tradeTime + 30000;
|
||||
});
|
||||
|
||||
mp.events.add("render", () => {
|
||||
if (tradeRequest) {
|
||||
var pos = mp.gui.cursor.position;
|
||||
var actualTime = new Date().getTime();
|
||||
|
||||
tradeTimeLeft = (tradeTimeEnd - actualTime) / 1000;
|
||||
|
||||
mp.game.graphics.set2dLayer(1);
|
||||
mp.game.graphics.drawRect(0.5, 0.5, 0.5, 0.3, 255, 255, 255, 200);
|
||||
|
||||
mp.game.graphics.drawText("Handelsanfrage von ~y~" + tradeRequester + " ~s~ für ~g~" + receivedTradePrize + "$", [0.5, 0.5 - 0.13], {
|
||||
font: 7,
|
||||
color: [112, 128, 144, 254],
|
||||
scale: [0.7, 0.7],
|
||||
outline: true,
|
||||
centre: false
|
||||
});
|
||||
|
||||
mp.game.graphics.set2dLayer(2);
|
||||
for (var slots = 0; slots < receivedTradeGrid.length; slots++) {
|
||||
mp.game.graphics.drawRect(receivedTradeGrid[slots][0], receivedTradeGrid[slots][1], sizeMul, sizeMul * yMul, 112, 128, 144, 254);
|
||||
mp.game.graphics.drawText((tempSlot2 = slots + 1).toString(), [receivedTradeGrid[slots][0] - (sizeMul / 2) + 0.006, receivedTradeGrid[slots][1] - (sizeMul / 2 * yMul)], {
|
||||
font: 7,
|
||||
color: [69, 255, 0, 254],
|
||||
scale: [0.3, 0.3],
|
||||
outline: true,
|
||||
centre: false
|
||||
});
|
||||
}
|
||||
|
||||
mp.game.graphics.set2dLayer(3);
|
||||
//SPRITES + ITEMANZAHL
|
||||
if (receivedTradeItems.length !== 0) {
|
||||
for (var currentItem = 0; currentItem < receivedTradeItems.length; currentItem++) {
|
||||
if (receivedTradeItems[currentItem][4] !== "-1") {
|
||||
mp.game.graphics.drawSprite("itemimages", receivedTradeItems[currentItem][0].toLowerCase(), receivedTradeGrid[receivedTradeItems[currentItem][4] - 1][0], receivedTradeGrid[receivedTradeItems[currentItem][4] - 1][1], rWidth / 8, rWidth / 5, 0, 255, 255, 255, 255);
|
||||
mp.game.graphics.drawText("(~y~" + receivedTradeItems[currentItem][3] + "~s~)", [receivedTradeGrid[receivedTradeItems[currentItem][4] - 1][0] + (sizeMul / 2) - 0.008, receivedTradeGrid[receivedTradeItems[currentItem][4] - 1][1] + 0.05], {
|
||||
font: 0,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.25, 0.25],
|
||||
outline: true,
|
||||
centre: false
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
mp.game.graphics.set2dLayer(4);
|
||||
isMouseOverButton(pos[0], pos[1]);
|
||||
mp.game.graphics.drawRect(0.5 - 0.07, 0.5 + 0.1, 0.06, 0.04, 100, acceptColor, 100, 250);
|
||||
mp.game.graphics.drawRect(0.5 + 0.07, 0.5 + 0.1, 0.06, 0.04, declineColor, 100, 100, 250);
|
||||
|
||||
mp.game.graphics.set2dLayer(5);
|
||||
mp.game.graphics.drawText("~g~Annehmen", [0.5 - 0.07, 0.5 + 0.08], {
|
||||
font: 4,
|
||||
color: [112, 128, 144, 254],
|
||||
scale: [0.6, 0.6],
|
||||
outline: true,
|
||||
centre: false
|
||||
});
|
||||
mp.game.graphics.drawText("~r~Ablehnen", [0.5 + 0.07, 0.5 + 0.08], {
|
||||
font: 4,
|
||||
color: [112, 128, 144, 254],
|
||||
scale: [0.6, 0.6],
|
||||
outline: true,
|
||||
centre: false
|
||||
});
|
||||
|
||||
mp.game.graphics.set2dLayer(6);
|
||||
if (isMouseOverTradeItem(pos[0], pos[1])) {
|
||||
mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220);
|
||||
|
||||
var hoverItemP = [receivedTradeItems[hoverItem][0], receivedTradeItems[hoverItem][1], receivedTradeItems[hoverItem][2], receivedTradeItems[hoverItem][3]];
|
||||
|
||||
//NAME
|
||||
mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], {
|
||||
font: 4,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.4, 0.4],
|
||||
outline: true,
|
||||
centre: false
|
||||
});
|
||||
|
||||
//BESCHREIBUNG
|
||||
mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], {
|
||||
font: 4,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.35, 0.35],
|
||||
outline: true,
|
||||
centre: false
|
||||
});
|
||||
|
||||
//EINZELGEWICHT
|
||||
mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], {
|
||||
font: 4,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.35, 0.35],
|
||||
outline: true,
|
||||
centre: false
|
||||
});
|
||||
}
|
||||
|
||||
mp.game.graphics.set2dLayer(7);
|
||||
|
||||
timerBarSize = tradeTimeLeft / 30 * 0.5;
|
||||
if (tradeTimeLeft > 0) {
|
||||
mp.game.graphics.drawText(tradeTimeLeft.toFixed(0), [0.5, 0.5 + 0.1312], {
|
||||
font: 7,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.35, 0.35],
|
||||
outline: true,
|
||||
centre: false
|
||||
});
|
||||
mp.game.graphics.drawRect(0.5, 0.5 + 0.1412, timerBarSize, 0.018, 255, 0, 0, 250);
|
||||
} else {
|
||||
tradeSelection = "timeup";
|
||||
mp.events.callRemote('tradeDecision', tradeSelection, JSON.stringify(receivedTradeItems), tradeRequester);
|
||||
tradeRequest = false;
|
||||
mp.gui.cursor.show(false, false);
|
||||
}
|
||||
}
|
||||
});
|
||||
function isMouseOverButton(cX, cY) {
|
||||
|
||||
if (tradeRequest) {
|
||||
var x = cX / screenX;
|
||||
var y = cY / screenY;
|
||||
|
||||
if (x > 0.5 - 0.07 - 0.03 && x < 0.5 - 0.07 + 0.03 && y > 0.5 + 0.1 - 0.02 && y < 0.5 + 0.1 + 0.02) {
|
||||
acceptColor = 255;
|
||||
tradeSelectHover = "accept";
|
||||
return true;
|
||||
} else if (x > 0.5 + 0.07 - 0.03 && x < 0.5 + 0.07 + 0.03 && y > 0.5 + 0.1 - 0.02 && y < 0.5 + 0.1 + 0.02) {
|
||||
declineColor = 255;
|
||||
tradeSelectHover = "decline";
|
||||
return true;
|
||||
} else {
|
||||
acceptColor = 100;
|
||||
declineColor = 100;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function isMouseOverTradeItem(cX, cY) {
|
||||
|
||||
if (tradeRequest) {
|
||||
|
||||
var x = cX / screenX;
|
||||
var y = cY / screenY;
|
||||
var a;
|
||||
var b;
|
||||
var c;
|
||||
|
||||
for (var s = 0; s < 5; s++) {
|
||||
a = receivedTradeGrid[s][0] - x;
|
||||
b = receivedTradeGrid[s][1] - y;
|
||||
c = Math.sqrt(a * a + b * b);
|
||||
|
||||
var invSlot = (s + 1);
|
||||
|
||||
if (c < sizeMul / 2) {
|
||||
for (var i = 0; i < receivedTradeItems.length; i++) {
|
||||
if (parseInt(receivedTradeItems[i][4]) === invSlot) {
|
||||
hoverItem = i;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mp.events.add('click', (x, y, upOrDown, leftOrRight, relativeX, relativeY, worldPosition, hitEntity) => {
|
||||
|
||||
var cX = x / screenX;
|
||||
var cY = y / screenY;
|
||||
|
||||
if (tradeRequest) {
|
||||
//LINKE MAUSTASTE
|
||||
//RUNTER
|
||||
if (upOrDown === "down" && leftOrRight === "left") {
|
||||
if (isMouseOverButton(x, y)) {
|
||||
if (tradeSelectHover === "accept") {
|
||||
tradeSelection = "accept";
|
||||
} else if (tradeSelectHover === "decline") {
|
||||
tradeSelection = "decline";
|
||||
}
|
||||
mp.events.callRemote('tradeDecision', tradeSelection, JSON.stringify(receivedTradeItems), tradeRequester, receivedTradePrize);
|
||||
tradeRequest = false;
|
||||
receivedTradePrize = null;
|
||||
mp.gui.cursor.show(false, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
45
ReallifeGamemode.Client/Interaction/worldinteraction.ts
Normal file
45
ReallifeGamemode.Client/Interaction/worldinteraction.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
import { GlobalData } from "..";
|
||||
|
||||
export default function worldInteraction() {
|
||||
var atmBrowser: BrowserMp;
|
||||
var inAtm = false;
|
||||
|
||||
//INTERACT: ATM
|
||||
mp.events.add("SERVER:ShowAtmUi", (atmId) => {
|
||||
if (inAtm == false) {
|
||||
inAtm = true;
|
||||
mp.gui.cursor.show(true, true);
|
||||
mp.gui.chat.show(false);
|
||||
mp.game.ui.displayHud(false);
|
||||
mp.game.ui.displayRadar(false);
|
||||
GlobalData.InInput = true;
|
||||
atmBrowser = mp.browsers.new("package://assets/html/atm/index.html");
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("CEF:closeATM", () => {
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.show(true);
|
||||
mp.game.ui.displayHud(true);
|
||||
mp.game.ui.displayRadar(true);
|
||||
inAtm = false;
|
||||
GlobalData.InInput = false;
|
||||
|
||||
atmBrowser.destroy();
|
||||
});
|
||||
|
||||
mp.events.add("CEF:atmAction", (site, inputField1, inputField2) => {
|
||||
|
||||
mp.events.callRemote("CLIENT:ATM_MANAGER:ATM_ACTION", site, inputField1, inputField2);
|
||||
});
|
||||
|
||||
mp.events.add("SERVER:WORLD_INTERACTION:ATM_ERROR", (errorId, p2) => {
|
||||
switch (errorId) {
|
||||
|
||||
//Nicht genügend BALANCE im ATM
|
||||
case 0:
|
||||
atmBrowser.execute(`noBalance();`);
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
67
ReallifeGamemode.Client/Jobs/BusRouteSelect.ts
Normal file
67
ReallifeGamemode.Client/Jobs/BusRouteSelect.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
|
||||
let screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
|
||||
let sendItem = new UIMenuItem("Starten", "Route starten");
|
||||
sendItem.BackColor = new Color(13, 71, 161);
|
||||
sendItem.HighlightedBackColor = new Color(25, 118, 210);
|
||||
|
||||
let cancelItem = new UIMenuItem("Abbrechen", "");
|
||||
cancelItem.BackColor = new Color(213, 0, 0);
|
||||
cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
|
||||
|
||||
export default function busRouteList(globalData: IGlobalData) {
|
||||
|
||||
var routeMenu: NativeUI.Menu;
|
||||
var routeTexts;
|
||||
var routeText;
|
||||
|
||||
mp.events.add('showBusRouteMenu', (listRoutes) => {
|
||||
if (!globalData.InMenu) {
|
||||
|
||||
globalData.InMenu = true;
|
||||
routeTexts = JSON.parse(listRoutes);
|
||||
|
||||
routeMenu = new Menu("Bus Job", "", new Point(0, screenRes.y / 3), null, null);
|
||||
routeMenu.AddItem(new UIMenuListItem("Route", "", new ItemsCollection(routeTexts)));
|
||||
|
||||
routeMenu.AddItem(sendItem);
|
||||
routeMenu.AddItem(cancelItem);
|
||||
routeMenu.Visible = true;
|
||||
routeText = "Kurz 1";
|
||||
|
||||
routeMenu.ListChange.on((item, index) => {
|
||||
switch (item.Text) {
|
||||
case "Route":
|
||||
routeText = String(item.SelectedItem.DisplayText);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
routeMenu.ItemSelect.on((item) => {
|
||||
if (item.Text === "Starten") {
|
||||
mp.events.callRemote("startBusRoute", routeText);
|
||||
routeMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
} else if (item.Text === "Abbrechen") {
|
||||
routeMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
}
|
||||
});
|
||||
|
||||
routeMenu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
67
ReallifeGamemode.Client/Jobs/PilotRouteSelect.ts
Normal file
67
ReallifeGamemode.Client/Jobs/PilotRouteSelect.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
|
||||
let screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
|
||||
let sendItem = new UIMenuItem("Starten", "Route starten");
|
||||
sendItem.BackColor = new Color(13, 71, 161);
|
||||
sendItem.HighlightedBackColor = new Color(25, 118, 210);
|
||||
|
||||
let cancelItem = new UIMenuItem("Abbrechen", "");
|
||||
cancelItem.BackColor = new Color(213, 0, 0);
|
||||
cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
|
||||
|
||||
export default function PilotRouteList(globalData: IGlobalData) {
|
||||
|
||||
var routeMenu: NativeUI.Menu;
|
||||
var routeTexts;
|
||||
var routeText;
|
||||
|
||||
mp.events.add('showPilotRouteMenu', (listRoutes) => {
|
||||
if (!globalData.InMenu) {
|
||||
|
||||
globalData.InMenu = true;
|
||||
routeTexts = JSON.parse(listRoutes);
|
||||
|
||||
routeMenu = new Menu("Pilot Job", "", new Point(0, screenRes.y / 3), null, null);
|
||||
routeMenu.AddItem(new UIMenuListItem("Route", "", new ItemsCollection(routeTexts)));
|
||||
|
||||
routeMenu.AddItem(sendItem);
|
||||
routeMenu.AddItem(cancelItem);
|
||||
routeMenu.Visible = true;
|
||||
routeText = "Route 1";
|
||||
|
||||
routeMenu.ListChange.on((item, index) => {
|
||||
switch (item.Text) {
|
||||
case "Route":
|
||||
routeText = String(item.SelectedItem.DisplayText);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
routeMenu.ItemSelect.on((item) => {
|
||||
if (item.Text === "Starten") {
|
||||
mp.events.callRemote("startPilotRoute", routeText);
|
||||
routeMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
} else if (item.Text === "Abbrechen") {
|
||||
routeMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
}
|
||||
});
|
||||
|
||||
routeMenu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
167
ReallifeGamemode.Client/Jobs/RefuseCollector.ts
Normal file
167
ReallifeGamemode.Client/Jobs/RefuseCollector.ts
Normal file
@@ -0,0 +1,167 @@
|
||||
export default function RefuseCollector() {
|
||||
var State = false;
|
||||
var Traegt = false;
|
||||
var HintenVoll = false;
|
||||
|
||||
var BlipTonneHinten = null;
|
||||
var CheckpointTonneHinten = null;
|
||||
var ShapeTonneHinten = null;
|
||||
var BlipTonneBase = null;
|
||||
var CheckpointTonneBase = null;
|
||||
var ShapeTonneBase = null;
|
||||
var vehicle = null;
|
||||
|
||||
var interval = null;
|
||||
|
||||
var BlipTonne = [];
|
||||
var ShapeTonne = [];
|
||||
|
||||
mp.events.add('SERVER:MuellmannStatusTrue', () => {
|
||||
State = true;
|
||||
});
|
||||
|
||||
mp.events.add('SERVER:MuellmannStatusFalse', () => {
|
||||
State = false;
|
||||
});
|
||||
|
||||
mp.events.add('SERVER:MuellmannBCSErstellen', (jsonPosArr, veh) => {
|
||||
let posArr = JSON.parse(jsonPosArr);
|
||||
vehicle = veh;
|
||||
for (var i = 0; i < posArr.length; i++) {
|
||||
let pos = new mp.Vector3(posArr[i].x, posArr[i].y, posArr[i].z - 1)
|
||||
BlipTonne.push(mp.blips.new(1, pos, { name: 'Mülltonne', color: 45, shortRange: false }));
|
||||
BlipTonne[i].setFlashTimer(2000);
|
||||
ShapeTonne.push(mp.colshapes.newSphere(posArr[i].x, posArr[i].y, posArr[i].z + 0.5, 1.75));
|
||||
}
|
||||
|
||||
BlipTonneBase = mp.blips.new(1, new mp.Vector3(-442.3999, -1701.5234, 18.933002 - 1), { name: 'Recylinganlage', color: 5, shortRange: false });
|
||||
CheckpointTonneBase = mp.markers.new(1, new mp.Vector3(-442.3999, -1701.5234, 18.933002 - 1), 10, { direction: new mp.Vector3(-235.5747, -1685.475, 32.7207), color: [255, 255, 0, 150], visible: true, dimension: 0 });
|
||||
ShapeTonneBase = mp.colshapes.newSphere(-442.3999, -1701.5234, 18.933002 - 1, 10);
|
||||
});
|
||||
mp.events.add('SERVER:MuellmannBCSEntfernen', () => {
|
||||
for (var i = 0; i < BlipTonne.length; i++) {
|
||||
if (BlipTonne[i] == null) continue;
|
||||
BlipTonne[i].destroy();
|
||||
ShapeTonne[i].destroy();
|
||||
}
|
||||
BlipTonne = [];
|
||||
ShapeTonne = [];
|
||||
|
||||
if (BlipTonneHinten) BlipTonneHinten.destroy();
|
||||
BlipTonneHinten = null;
|
||||
if (CheckpointTonneHinten) CheckpointTonneHinten.destroy();
|
||||
CheckpointTonneHinten = null;
|
||||
if (ShapeTonneHinten) ShapeTonneHinten.destroy();
|
||||
ShapeTonneHinten = null;
|
||||
if (BlipTonneBase) BlipTonneBase.destroy();
|
||||
BlipTonneBase = null;
|
||||
if (CheckpointTonneBase) CheckpointTonneBase.destroy();
|
||||
CheckpointTonneBase = null;
|
||||
if (ShapeTonneBase) ShapeTonneBase.destroy();
|
||||
ShapeTonneBase = null;
|
||||
Traegt = false;
|
||||
});
|
||||
|
||||
mp.events.add("playerEnterColshape", (Shape, player) => {
|
||||
//mp.events.callRemote('CLIENT:ImShape', JSON.stringify(Shape));
|
||||
for (var i = 0; i < ShapeTonne.length; i++) {
|
||||
if (Shape != ShapeTonne[i]) continue;
|
||||
if (!mp.players.local.vehicle) {
|
||||
if (!Traegt) {
|
||||
if (!HintenVoll) {
|
||||
mp.events.callRemote('CLIENT:MuellmannImShape', i);
|
||||
Traegt = true;
|
||||
BlipTonne[i].destroy();
|
||||
BlipTonne[i] = null;
|
||||
ShapeTonne[i].destroy();
|
||||
ShapeTonne[i] = null;
|
||||
|
||||
interval = setInterval(function () { createMarker(); }, 2);
|
||||
}
|
||||
else {
|
||||
mp.gui.chat.push("Der Müllwagen ist bereits voll! Fahre zur Base und lade ab!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
mp.gui.chat.push(`Du trägst bereits einen Müllsack!`);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
mp.events.call("renderTextOnScreen", "Steige aus dem Müllwagen aus um den Müllsack zu entnehmen.");
|
||||
}
|
||||
}
|
||||
if (Shape == ShapeTonneHinten) {
|
||||
if (Traegt) {
|
||||
Traegt = false;
|
||||
mp.events.callRemote('CLIENT:MuellmannAddSack');
|
||||
|
||||
clearInterval(interval);
|
||||
|
||||
if (BlipTonneHinten) BlipTonneHinten.destroy();
|
||||
BlipTonneHinten = null;
|
||||
if (CheckpointTonneHinten) CheckpointTonneHinten.destroy();
|
||||
CheckpointTonneHinten = null;
|
||||
if (ShapeTonneHinten) ShapeTonneHinten.destroy();
|
||||
ShapeTonneHinten = null;
|
||||
}
|
||||
}
|
||||
else if (Shape == ShapeTonneBase) {
|
||||
BlipTonneBase.setRoute(false);
|
||||
mp.events.callRemote('CLIENT:MuellmannBaseSack');
|
||||
HintenVoll = false;
|
||||
}
|
||||
});
|
||||
mp.events.add("MuellmannUpdateColshape", (index) => {
|
||||
if (BlipTonne[index] != null)
|
||||
BlipTonne[index].destroy();
|
||||
BlipTonne[index] = null;
|
||||
if (ShapeTonne[index] != null)
|
||||
ShapeTonne[index].destroy();
|
||||
ShapeTonne[index] = null;
|
||||
});
|
||||
|
||||
mp.events.add("SERVER:MuellmannZuBase", () => {
|
||||
BlipTonneBase.setRoute(true);
|
||||
BlipTonneBase.setRouteColour(5);
|
||||
HintenVoll = true;
|
||||
});
|
||||
|
||||
function createMarker() {
|
||||
if (vehicle != null) {
|
||||
var boneIndex2 = vehicle.getBoneIndexByName("platelight");
|
||||
var boneIndex1 = vehicle.getBoneIndexByName("chassis_dummy");
|
||||
|
||||
let posPlate = vehicle.getWorldPositionOfBone(boneIndex2);
|
||||
let posCentre = vehicle.getWorldPositionOfBone(boneIndex1);
|
||||
|
||||
let plateVec = new mp.Vector3(posPlate.x, posPlate.y, posPlate.z);
|
||||
let lightVec = new mp.Vector3(posCentre.x, posCentre.y, posCentre.z);
|
||||
|
||||
let posPL = lightVec.subtract(plateVec);
|
||||
|
||||
let temp = new mp.Vector3(posPL.x * -1, posPL.y * -1, posPL.z * -1)
|
||||
|
||||
let length = Math.sqrt((temp.x * temp.x) + (temp.y * temp.y) + (temp.z * temp.z));
|
||||
|
||||
let x = temp.x / length;
|
||||
let y = temp.y / length;
|
||||
let z = temp.z / length;
|
||||
|
||||
temp = new mp.Vector3(x, y, z - 1);
|
||||
|
||||
let pos = plateVec.add(temp);
|
||||
|
||||
if (BlipTonneHinten) BlipTonneHinten.destroy();
|
||||
BlipTonneHinten = null;
|
||||
if (CheckpointTonneHinten) CheckpointTonneHinten.destroy();
|
||||
CheckpointTonneHinten = null;
|
||||
if (ShapeTonneHinten) ShapeTonneHinten.destroy();
|
||||
ShapeTonneHinten = null;
|
||||
BlipTonneHinten = mp.blips.new(318, pos, { name: 'Müllmann', color: 24, shortRange: false });
|
||||
CheckpointTonneHinten = mp.markers.new(1, pos, 1, { direction: new mp.Vector3(-235.5747, -1685.475, 32.7207), color: [0, 255, 0, 255], visible: true, dimension: 0 });
|
||||
ShapeTonneHinten = mp.colshapes.newSphere(pos.x, pos.y, pos.z, 2);
|
||||
}
|
||||
};
|
||||
}
|
||||
68
ReallifeGamemode.Client/Jobs/main.ts
Normal file
68
ReallifeGamemode.Client/Jobs/main.ts
Normal file
@@ -0,0 +1,68 @@
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
|
||||
export default function (globalData: IGlobalData) {
|
||||
|
||||
mp.events.add("SERVER:Job_ShowJobMenu", (jobName: string, data: any) => {
|
||||
if (globalData.InMenu) return;
|
||||
|
||||
var menu = new NativeUI.Menu("Job", jobName, new NativeUI.Point(50, 50), null, null);
|
||||
menu.AddItem(new NativeUI.UIMenuItem("Job starten"));
|
||||
menu.AddItem(new NativeUI.UIMenuItem("Job beenden"));
|
||||
|
||||
globalData.InMenu = true;
|
||||
|
||||
data = JSON.parse(data);
|
||||
|
||||
if (data) {
|
||||
if (data.Id === 1) { // Taxi Driver
|
||||
var status = data.Status;
|
||||
if (data.JobData.TaxiCalls && status === 0) { // Spieler hat keinen aktiven Auftrag
|
||||
var calls = data.JobData.TaxiCalls;
|
||||
var taxiCallsItem = new NativeUI.UIMenuItem("Taxi Aufträge");
|
||||
var taxiCallsCount = calls.length;
|
||||
taxiCallsItem.SetRightLabel(taxiCallsCount.toString());
|
||||
menu.AddItem(taxiCallsItem);
|
||||
|
||||
if (taxiCallsCount > 0) {
|
||||
var taxiCallsMenu = new NativeUI.Menu("Taxi-Aufträge", "Wähle einen Auftrag aus", new NativeUI.Point(50, 50), null, null);
|
||||
calls.forEach(call => {
|
||||
var item = new NativeUI.UIMenuItem(call.Name);
|
||||
item.SetRightLabel(call.Distance.toString() + "m");
|
||||
taxiCallsMenu.AddItem(item);
|
||||
});
|
||||
taxiCallsMenu.Visible = false;
|
||||
menu.BindMenuToItem(taxiCallsMenu, taxiCallsItem);
|
||||
|
||||
taxiCallsMenu.ItemSelect.on((item: NativeUI.UIMenuItem, index: number) => {
|
||||
mp.events.callRemote("CLIENT:JobManager_TaxiJob_AcceptCall", item.Text);
|
||||
menu.Close(true);
|
||||
});
|
||||
}
|
||||
} else if (status === 1) { // Spieler hat aktiven Auftrag
|
||||
var cancelTaxiContractItem = new NativeUI.UIMenuItem("Taxi-Auftrag abbrechen");
|
||||
cancelTaxiContractItem.SetRightLabel(data.JobData.Name);
|
||||
menu.AddItem(cancelTaxiContractItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
menu.ItemSelect.on((item: NativeUI.UIMenuItem, index: number) => {
|
||||
if (index === 0) { // Job starten
|
||||
mp.events.callRemote("CLIENT:Job_StartJob");
|
||||
} else if (index === 1) { // Job stoppen
|
||||
mp.events.callRemote("CLIENT:Job_StopJob");
|
||||
mp.events.callRemote("CLIENT:stopFare");
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
menu.Close(true);
|
||||
});
|
||||
|
||||
menu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
|
||||
menu.Open();
|
||||
});
|
||||
|
||||
}
|
||||
69
ReallifeGamemode.Client/Login/main.ts
Normal file
69
ReallifeGamemode.Client/Login/main.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Login Main main.js
|
||||
* @author VegaZ, hydrant
|
||||
* @copyright (c) 2008 - 2018 Life of German
|
||||
*/
|
||||
|
||||
export default function (globalData: IGlobalData): void {
|
||||
var loginBrowser: BrowserMp;
|
||||
var loginCam: CameraMp = mp.cameras.new('login', new mp.Vector3(-1883.736, -781.4911, 78.27616), new mp.Vector3(3.185999, 0, -79.59519), 40);
|
||||
|
||||
var localPlayer: PlayerMp = mp.players.local;
|
||||
|
||||
var disableLightMode: boolean = false;
|
||||
|
||||
mp.events.add('SERVER:Login_ShowBrowser', (registered, disableLight) => {
|
||||
mp.gui.cursor.show(true, true);
|
||||
mp.gui.chat.show(false);
|
||||
mp.game.ui.displayHud(false);
|
||||
mp.game.ui.displayRadar(false);
|
||||
|
||||
disableLightMode = disableLight;
|
||||
|
||||
var url = registered ? "package://assets/html/login/login.html" : "package://assets/html/login/register.html";
|
||||
loginBrowser = mp.browsers.new(url);
|
||||
|
||||
loginCam.setActive(true);
|
||||
mp.game.cam.renderScriptCams(true, false, 0, true, false);
|
||||
});
|
||||
|
||||
mp.events.add('SERVER:Login_Error', (error: string) => {
|
||||
if (loginBrowser) {
|
||||
loginBrowser.execute(`showError("${error}");`);
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add('CEF:Login_RequestPlayerName', () => {
|
||||
if (loginBrowser) {
|
||||
if (disableLightMode) {
|
||||
loginBrowser.execute("disableLightMode();");
|
||||
}
|
||||
|
||||
loginBrowser.execute(`setPlayerName("${localPlayer.name}");`);
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add('CEF:Login_LoginRequest', (password: string) => {
|
||||
mp.events.callRemote('CLIENT:Login_LoginRequest', password);
|
||||
});
|
||||
|
||||
mp.events.add('CEF:Login_RegisterRequest', (password: string) => {
|
||||
mp.events.callRemote('CLIENT:Login_RegisterRequest', password);
|
||||
});
|
||||
|
||||
mp.events.add('SERVER:Login_Success', () => {
|
||||
if (loginBrowser) {
|
||||
loginBrowser.destroy();
|
||||
}
|
||||
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.show(true);
|
||||
mp.game.ui.displayHud(true);
|
||||
mp.game.ui.displayRadar(true);
|
||||
|
||||
globalData.LoggedIn = true;
|
||||
|
||||
loginCam.setActive(false);
|
||||
mp.game.cam.renderScriptCams(false, false, 0, true, false);
|
||||
});
|
||||
}
|
||||
768
ReallifeGamemode.Client/Ped/PedCreator.ts
Normal file
768
ReallifeGamemode.Client/Ped/PedCreator.ts
Normal file
@@ -0,0 +1,768 @@
|
||||
export default function PedCreator() {
|
||||
// Update 04/03/2020, Ped count [739]
|
||||
var PedHashes = {
|
||||
a_c_boar: 0xCE5FF074,
|
||||
a_c_cat_01: 0x573201B8,
|
||||
a_c_chickenhawk: 0xAAB71F62,
|
||||
a_c_chimp: 0xA8683715,
|
||||
a_c_chop: 0x14EC17EA,
|
||||
a_c_cormorant: 0x56E29962,
|
||||
a_c_cow: 0xFCFA9E1E,
|
||||
a_c_coyote: 0x644AC75E,
|
||||
a_c_crow: 0x18012A9F,
|
||||
a_c_deer: 0xD86B5A95,
|
||||
a_c_dolphin: 0x8BBAB455,
|
||||
a_c_fish: 0x2FD800B7,
|
||||
a_c_hen: 0x6AF51FAF,
|
||||
a_c_humpback: 0x471BE4B2,
|
||||
a_c_husky: 0x4E8F95A2,
|
||||
a_c_killerwhale: 0x8D8AC8B9,
|
||||
a_c_mtlion: 0x1250D7BA,
|
||||
a_c_pig: 0xB11BAB56,
|
||||
a_c_pigeon: 0x06A20728,
|
||||
a_c_poodle: 0x431D501C,
|
||||
a_c_pug: 0x6D362854,
|
||||
a_c_rabbit_01: 0xDFB55C81,
|
||||
a_c_rat: 0xC3B52966,
|
||||
a_c_retriever: 0x349F33E1,
|
||||
a_c_rhesus: 0xC2D06F53,
|
||||
a_c_rottweiler: 0x9563221D,
|
||||
a_c_seagull: 0xD3939DFD,
|
||||
a_c_sharkhammer: 0x3C831724,
|
||||
a_c_sharktiger: 0x06C3F072,
|
||||
a_c_shepherd: 0x431FC24C,
|
||||
a_c_stingray: 0xA148614D,
|
||||
a_c_westy: 0xAD7844BB,
|
||||
a_f_m_beach_01: 0x303638A7,
|
||||
a_f_m_bevhills_01: 0xBE086EFD,
|
||||
a_f_m_bevhills_02: 0xA039335F,
|
||||
a_f_m_bodybuild_01: 0x3BD99114,
|
||||
a_f_m_business_02: 0x1FC37DBC,
|
||||
a_f_m_downtown_01: 0x654AD86E,
|
||||
a_f_m_eastsa_01: 0x9D3DCB7A,
|
||||
a_f_m_eastsa_02: 0x63C8D891,
|
||||
a_f_m_fatbla_01: 0xFAB48BCB,
|
||||
a_f_m_fatcult_01: 0xB5CF80E4,
|
||||
a_f_m_fatwhite_01: 0x38BAD33B,
|
||||
a_f_m_ktown_01: 0x52C824DE,
|
||||
a_f_m_ktown_02: 0x41018151,
|
||||
a_f_m_prolhost_01: 0x169BD1E1,
|
||||
a_f_m_salton_01: 0xDE0E0969,
|
||||
a_f_m_skidrow_01: 0xB097523B,
|
||||
a_f_m_soucent_01: 0x745855A1,
|
||||
a_f_m_soucent_02: 0xF322D338,
|
||||
a_f_m_soucentmc_01: 0xCDE955D2,
|
||||
a_f_m_tourist_01: 0x505603B9,
|
||||
a_f_m_tramp_01: 0x48F96F5B,
|
||||
a_f_m_trampbeac_01: 0x8CA0C266,
|
||||
a_f_o_genstreet_01: 0x61C81C85,
|
||||
a_f_o_indian_01: 0xBAD7BB80,
|
||||
a_f_o_ktown_01: 0x47CF5E96,
|
||||
a_f_o_salton_01: 0xCCFF7D8A,
|
||||
a_f_o_soucent_01: 0x3DFA1830,
|
||||
a_f_o_soucent_02: 0xA56DE716,
|
||||
a_f_y_beach_01: 0xC79F6928,
|
||||
a_f_y_bevhills_01: 0x445AC854,
|
||||
a_f_y_bevhills_02: 0x5C2CF7F8,
|
||||
a_f_y_bevhills_03: 0x20C8012F,
|
||||
a_f_y_bevhills_04: 0x36DF2D5D,
|
||||
a_f_y_business_01: 0x2799EFD8,
|
||||
a_f_y_business_02: 0x31430342,
|
||||
a_f_y_business_03: 0xAE86FDB4,
|
||||
a_f_y_business_04: 0xB7C61032,
|
||||
a_f_y_eastsa_01: 0xF5B0079D,
|
||||
a_f_y_eastsa_02: 0x0438A4AE,
|
||||
a_f_y_eastsa_03: 0x51C03FA4,
|
||||
a_f_y_epsilon_01: 0x689C2A80,
|
||||
a_f_y_femaleagent: 0x50610C43,
|
||||
a_f_y_fitness_01: 0x457C64FB,
|
||||
a_f_y_fitness_02: 0x13C4818C,
|
||||
a_f_y_genhot_01: 0x2F4AEC3E,
|
||||
a_f_y_golfer_01: 0x7DD8FB58,
|
||||
a_f_y_hiker_01: 0x30830813,
|
||||
a_f_y_hippie_01: 0x1475B827,
|
||||
a_f_y_hipster_01: 0x8247D331,
|
||||
a_f_y_hipster_02: 0x97F5FE8D,
|
||||
a_f_y_hipster_03: 0xA5BA9A16,
|
||||
a_f_y_hipster_04: 0x199881DC,
|
||||
a_f_y_indian_01: 0x092D9CC1,
|
||||
a_f_y_juggalo_01: 0xDB134533,
|
||||
a_f_y_runner_01: 0xC7496729,
|
||||
a_f_y_rurmeth_01: 0x3F789426,
|
||||
a_f_y_scdressy_01: 0xDB5EC400,
|
||||
a_f_y_skater_01: 0x695FE666,
|
||||
a_f_y_soucent_01: 0x2C641D7A,
|
||||
a_f_y_soucent_02: 0x5A8EF9CF,
|
||||
a_f_y_soucent_03: 0x87B25415,
|
||||
a_f_y_tennis_01: 0x550C79C6,
|
||||
a_f_y_topless_01: 0x9CF26183,
|
||||
a_f_y_tourist_01: 0x563B8570,
|
||||
a_f_y_tourist_02: 0x9123FB40,
|
||||
a_f_y_vinewood_01: 0x19F41F65,
|
||||
a_f_y_vinewood_02: 0xDAB6A0EB,
|
||||
a_f_y_vinewood_03: 0x379DDAB8,
|
||||
a_f_y_vinewood_04: 0xFAE46146,
|
||||
a_f_y_yoga_01: 0xC41B062E,
|
||||
a_m_m_acult_01: 0x5442C66B,
|
||||
a_m_m_afriamer_01: 0xD172497E,
|
||||
a_m_m_beach_01: 0x403DB4FD,
|
||||
a_m_m_beach_02: 0x787FA588,
|
||||
a_m_m_bevhills_01: 0x54DBEE1F,
|
||||
a_m_m_bevhills_02: 0x3FB5C3D3,
|
||||
a_m_m_business_01: 0x7E6A64B7,
|
||||
a_m_m_eastsa_01: 0xF9A6F53F,
|
||||
a_m_m_eastsa_02: 0x07DD91AC,
|
||||
a_m_m_farmer_01: 0x94562DD7,
|
||||
a_m_m_fatlatin_01: 0x61D201B3,
|
||||
a_m_m_genfat_01: 0x06DD569F,
|
||||
a_m_m_genfat_02: 0x13AEF042,
|
||||
a_m_m_golfer_01: 0xA9EB0E42,
|
||||
a_m_m_hasjew_01: 0x6BD9B68C,
|
||||
a_m_m_hillbilly_01: 0x6C9B2849,
|
||||
a_m_m_hillbilly_02: 0x7B0E452F,
|
||||
a_m_m_indian_01: 0xDDCAAA2C,
|
||||
a_m_m_ktown_01: 0xD15D7E71,
|
||||
a_m_m_malibu_01: 0x2FDE6EB7,
|
||||
a_m_m_mexcntry_01: 0xDD817EAD,
|
||||
a_m_m_mexlabor_01: 0xB25D16B2,
|
||||
a_m_m_og_boss_01: 0x681BD012,
|
||||
a_m_m_paparazzi_01: 0xECCA8C15,
|
||||
a_m_m_polynesian_01: 0xA9D9B69E,
|
||||
a_m_m_prolhost_01: 0x9712C38F,
|
||||
a_m_m_rurmeth_01: 0x3BAD4184,
|
||||
a_m_m_salton_01: 0x4F2E038A,
|
||||
a_m_m_salton_02: 0x60F4A717,
|
||||
a_m_m_salton_03: 0xB28C4A45,
|
||||
a_m_m_salton_04: 0x964511B7,
|
||||
a_m_m_skater_01: 0xD9D7588C,
|
||||
a_m_m_skidrow_01: 0x01EEA6BD,
|
||||
a_m_m_socenlat_01: 0x0B8D69E3,
|
||||
a_m_m_soucent_01: 0x6857C9B7,
|
||||
a_m_m_soucent_02: 0x9F6D37E1,
|
||||
a_m_m_soucent_03: 0x8BD990BA,
|
||||
a_m_m_soucent_04: 0xC2FBFEFE,
|
||||
a_m_m_stlat_02: 0xC2A87702,
|
||||
a_m_m_tennis_01: 0x546A5344,
|
||||
a_m_m_tourist_01: 0xC89F0184,
|
||||
a_m_m_tramp_01: 0x1EC93FD0,
|
||||
a_m_m_trampbeac_01: 0x53B57EB0,
|
||||
a_m_m_tranvest_01: 0xE0E69974,
|
||||
a_m_m_tranvest_02: 0xF70EC5C4,
|
||||
a_m_o_acult_01: 0x55446010,
|
||||
a_m_o_acult_02: 0x4BA14CCA,
|
||||
a_m_o_beach_01: 0x8427D398,
|
||||
a_m_o_genstreet_01: 0xAD54E7A8,
|
||||
a_m_o_ktown_01: 0x1536D95A,
|
||||
a_m_o_salton_01: 0x20208E4D,
|
||||
a_m_o_soucent_01: 0x2AD8921B,
|
||||
a_m_o_soucent_02: 0x4086BD77,
|
||||
a_m_o_soucent_03: 0x0E32D8D0,
|
||||
a_m_o_tramp_01: 0x174D4245,
|
||||
a_m_y_acult_01: 0xB564882B,
|
||||
a_m_y_acult_02: 0x80E59F2E,
|
||||
a_m_y_beach_01: 0xD1FEB884,
|
||||
a_m_y_beach_02: 0x23C7DC11,
|
||||
a_m_y_beach_03: 0xE7A963D9,
|
||||
a_m_y_beachvesp_01: 0x7E0961B8,
|
||||
a_m_y_beachvesp_02: 0xCA56FA52,
|
||||
a_m_y_bevhills_01: 0x76284640,
|
||||
a_m_y_bevhills_02: 0x668BA707,
|
||||
a_m_y_breakdance_01: 0x379F9596,
|
||||
a_m_y_busicas_01: 0x9AD32FE9,
|
||||
a_m_y_business_01: 0xC99F21C4,
|
||||
a_m_y_business_02: 0xB3B3F5E6,
|
||||
a_m_y_business_03: 0xA1435105,
|
||||
a_m_y_cyclist_01: 0xFDC653C7,
|
||||
a_m_y_dhill_01: 0xFF3E88AB,
|
||||
a_m_y_downtown_01: 0x2DADF4AA,
|
||||
a_m_y_eastsa_01: 0xA4471173,
|
||||
a_m_y_eastsa_02: 0x168775F6,
|
||||
a_m_y_epsilon_01: 0x77D41A3E,
|
||||
a_m_y_epsilon_02: 0xAA82FF9B,
|
||||
a_m_y_gay_01: 0xD1CCE036,
|
||||
a_m_y_gay_02: 0xA5720781,
|
||||
a_m_y_genstreet_01: 0x9877EF71,
|
||||
a_m_y_genstreet_02: 0x3521A8D2,
|
||||
a_m_y_golfer_01: 0xD71FE131,
|
||||
a_m_y_hasjew_01: 0xE16D8F01,
|
||||
a_m_y_hiker_01: 0x50F73C0C,
|
||||
a_m_y_hippy_01: 0x7D03E617,
|
||||
a_m_y_hipster_01: 0x2307A353,
|
||||
a_m_y_hipster_02: 0x14D506EE,
|
||||
a_m_y_hipster_03: 0x4E4179C6,
|
||||
a_m_y_indian_01: 0x2A22FBCE,
|
||||
a_m_y_jetski_01: 0x2DB7EEF3,
|
||||
a_m_y_juggalo_01: 0x91CA3E2C,
|
||||
a_m_y_ktown_01: 0x1AF6542C,
|
||||
a_m_y_ktown_02: 0x297FF13F,
|
||||
a_m_y_latino_01: 0x132C1A8E,
|
||||
a_m_y_methhead_01: 0x696BE0A9,
|
||||
a_m_y_mexthug_01: 0x3053E555,
|
||||
a_m_y_motox_01: 0x64FDEA7D,
|
||||
a_m_y_motox_02: 0x77AC8FDA,
|
||||
a_m_y_musclbeac_01: 0x4B652906,
|
||||
a_m_y_musclbeac_02: 0xC923247C,
|
||||
a_m_y_polynesian_01: 0x8384FC9F,
|
||||
a_m_y_roadcyc_01: 0xF561A4C6,
|
||||
a_m_y_runner_01: 0x25305EEE,
|
||||
a_m_y_runner_02: 0x843D9D0F,
|
||||
a_m_y_salton_01: 0xD7606C30,
|
||||
a_m_y_skater_01: 0xC1C46677,
|
||||
a_m_y_skater_02: 0xAFFAC2E4,
|
||||
a_m_y_soucent_01: 0xE716BDCB,
|
||||
a_m_y_soucent_02: 0xACA3C8CA,
|
||||
a_m_y_soucent_03: 0xC3F0F764,
|
||||
a_m_y_soucent_04: 0x8A3703F1,
|
||||
a_m_y_stbla_01: 0xCF92ADE9,
|
||||
a_m_y_stbla_02: 0x98C7404F,
|
||||
a_m_y_stlat_01: 0x8674D5FC,
|
||||
a_m_y_stwhi_01: 0x2418C430,
|
||||
a_m_y_stwhi_02: 0x36C6E98C,
|
||||
a_m_y_sunbathe_01: 0xB7292F0C,
|
||||
a_m_y_surfer_01: 0xEAC2C7EE,
|
||||
a_m_y_vindouche_01: 0xC19377E7,
|
||||
a_m_y_vinewood_01: 0x4B64199D,
|
||||
a_m_y_vinewood_02: 0x5D15BD00,
|
||||
a_m_y_vinewood_03: 0x1FDF4294,
|
||||
a_m_y_vinewood_04: 0x31C9E669,
|
||||
a_m_y_yoga_01: 0xAB0A7155,
|
||||
cs_amandatownley: 0x95EF18E3,
|
||||
cs_andreas: 0xE7565327,
|
||||
cs_ashley: 0x26C3D079,
|
||||
cs_bankman: 0x9760192E,
|
||||
cs_barry: 0x69591CF7,
|
||||
cs_beverly: 0xB46EC356,
|
||||
cs_brad: 0xEFE5AFE6,
|
||||
cs_bradcadaver: 0x7228AF60,
|
||||
cs_carbuyer: 0x8CCE790F,
|
||||
cs_casey: 0xEA969C40,
|
||||
cs_chengsr: 0x30DB9D7B,
|
||||
cs_chrisformage: 0xC1F380E6,
|
||||
cs_clay: 0xDBCB9834,
|
||||
cs_dale: 0x0CE81655,
|
||||
cs_davenorton: 0x8587248C,
|
||||
cs_debra: 0xECD04FE9,
|
||||
cs_denise: 0x6F802738,
|
||||
cs_devin: 0x2F016D02,
|
||||
cs_dom: 0x4772AF42,
|
||||
cs_dreyfuss: 0x3C60A153,
|
||||
cs_drfriedlander: 0xA3A35C2F,
|
||||
cs_fabien: 0x47035EC1,
|
||||
cs_fbisuit_01: 0x585C0B52,
|
||||
cs_floyd: 0x062547E7,
|
||||
cs_guadalope: 0x0F9513F1,
|
||||
cs_gurk: 0xC314F727,
|
||||
cs_hunter: 0x5B44892C,
|
||||
cs_janet: 0x3034F9E2,
|
||||
cs_jewelass: 0x4440A804,
|
||||
cs_jimmyboston: 0x039677BD,
|
||||
cs_jimmydisanto: 0xB8CC92B4,
|
||||
cs_joeminuteman: 0xF09D5E29,
|
||||
cs_johnnyklebitz: 0xFA8AB881,
|
||||
cs_josef: 0x459762CA,
|
||||
cs_josh: 0x450EEF9D,
|
||||
cs_karen_daniels: 0x4BAF381C,
|
||||
cs_lamardavis: 0x45463A0D,
|
||||
cs_lazlow: 0x38951A1B,
|
||||
cs_lestercrest: 0xB594F5C3,
|
||||
cs_lifeinvad_01: 0x72551375,
|
||||
cs_magenta: 0x5816C61A,
|
||||
cs_manuel: 0xFBB374CA,
|
||||
cs_marnie: 0x574DE134,
|
||||
cs_martinmadrazo: 0x43595670,
|
||||
cs_maryann: 0x0998C7AD,
|
||||
cs_michelle: 0x70AEB9C8,
|
||||
cs_milton: 0xB76A330F,
|
||||
cs_molly: 0x45918E44,
|
||||
cs_movpremf_01: 0x4BBA84D9,
|
||||
cs_movpremmale: 0x8D67EE7D,
|
||||
cs_mrk: 0xC3CC9A75,
|
||||
cs_mrs_thornhill: 0x4F921E6E,
|
||||
cs_mrsphillips: 0xCBFDA3CF,
|
||||
cs_natalia: 0x4EFEB1F0,
|
||||
cs_nervousron: 0x7896DA94,
|
||||
cs_nigel: 0xE1479C0B,
|
||||
cs_old_man1a: 0x1EEC7BDC,
|
||||
cs_old_man2: 0x98F9E770,
|
||||
cs_omega: 0x8B70B405,
|
||||
cs_orleans: 0xAD340F5A,
|
||||
cs_paper: 0x6B38B8F8,
|
||||
cs_patricia: 0xDF8B1301,
|
||||
cs_priest: 0x4D6DE57E,
|
||||
cs_prolsec_02: 0x1E9314A2,
|
||||
cs_russiandrunk: 0x46521A32,
|
||||
cs_siemonyetarian: 0xC0937202,
|
||||
cs_solomon: 0xF6D1E04E,
|
||||
cs_stevehains: 0xA4E0A1FE,
|
||||
cs_stretch: 0x893D6805,
|
||||
cs_tanisha: 0x42FE5370,
|
||||
cs_taocheng: 0x8864083D,
|
||||
cs_taostranslator: 0x53536529,
|
||||
cs_tenniscoach: 0x5C26040A,
|
||||
cs_terry: 0x3A5201C5,
|
||||
cs_tom: 0x69E8ABC3,
|
||||
cs_tomepsilon: 0x8C0FD4E2,
|
||||
cs_tracydisanto: 0x0609B130,
|
||||
cs_wade: 0xD266D9D6,
|
||||
cs_zimbor: 0xEAACAAF0,
|
||||
csb_abigail: 0x89768941,
|
||||
csb_agent: 0xD770C9B4,
|
||||
csb_anita: 0x0703F106,
|
||||
csb_anton: 0xA5C787B6,
|
||||
csb_ballasog: 0xABEF0004,
|
||||
csb_bride: 0x82BF7EA1,
|
||||
csb_burgerdrug: 0x8CDCC057,
|
||||
csb_car3guy1: 0x04430687,
|
||||
csb_car3guy2: 0x1383A508,
|
||||
csb_chef: 0xA347CA8A,
|
||||
csb_chef2: 0xAE5BE23A,
|
||||
csb_chin_goon: 0xA8C22996,
|
||||
csb_cletus: 0xCAE9E5D5,
|
||||
csb_cop: 0x9AB35F63,
|
||||
csb_customer: 0xA44F6F8B,
|
||||
csb_denise_friend: 0xB58D2529,
|
||||
csb_fos_rep: 0x1BCC157B,
|
||||
csb_g: 0xA28E71D7,
|
||||
csb_groom: 0x7AAB19D2,
|
||||
csb_grove_str_dlr: 0xE8594E22,
|
||||
csb_hao: 0xEC9E8F1C,
|
||||
csb_hugh: 0x6F139B54,
|
||||
csb_imran: 0xE3420BDB,
|
||||
csb_jackhowitzer: 0x44BC7BB1,
|
||||
csb_janitor: 0xC2005A40,
|
||||
csb_maude: 0xBCC475CB,
|
||||
csb_money: 0x989DFD9A,
|
||||
csb_mp_agent14: 0x6DBBFC8B,
|
||||
csb_mweather: 0x613E626C,
|
||||
csb_ortega: 0xC0DB04CF,
|
||||
csb_oscar: 0xF41F399B,
|
||||
csb_paige: 0x5B1FA0C3,
|
||||
csb_popov: 0x617D89E2,
|
||||
csb_porndudes: 0x2F4AFE35,
|
||||
csb_prologuedriver: 0xF00B49DB,
|
||||
csb_prolsec: 0x7FA2F024,
|
||||
csb_ramp_gang: 0xC2800DBE,
|
||||
csb_ramp_hic: 0x858C94B8,
|
||||
csb_ramp_hipster: 0x21F58BB4,
|
||||
csb_ramp_marine: 0x616C97B9,
|
||||
csb_ramp_mex: 0xF64ED7D0,
|
||||
csb_rashcosvki: 0x188099A9,
|
||||
csb_reporter: 0x2E420A24,
|
||||
csb_roccopelosi: 0xAA64168C,
|
||||
csb_screen_writer: 0x8BE12CEC,
|
||||
csb_stripper_01: 0xAEEA76B5,
|
||||
csb_stripper_02: 0x81441B71,
|
||||
csb_tonya: 0x6343DD19,
|
||||
csb_trafficwarden: 0xDE2937F3,
|
||||
csb_undercover: 0xEF785A6A,
|
||||
csb_vagspeak: 0x48FF4CA9,
|
||||
g_f_importexport_01: 0x84A1B11A,
|
||||
g_f_y_ballas_01: 0x158C439C,
|
||||
g_f_y_families_01: 0x4E0CE5D3,
|
||||
g_f_y_lost_01: 0xFD5537DE,
|
||||
g_f_y_vagos_01: 0x5AA42C21,
|
||||
g_m_importexport_01: 0xBCA2CCEA,
|
||||
g_m_m_armboss_01: 0xF1E823A2,
|
||||
g_m_m_armgoon_01: 0xFDA94268,
|
||||
g_m_m_armlieut_01: 0xE7714013,
|
||||
g_m_m_chemwork_01: 0xF6157D8F,
|
||||
g_m_m_chiboss_01: 0xB9DD0300,
|
||||
g_m_m_chicold_01: 0x106D9A99,
|
||||
g_m_m_chigoon_01: 0x7E4F763F,
|
||||
g_m_m_chigoon_02: 0xFF71F826,
|
||||
g_m_m_korboss_01: 0x352A026F,
|
||||
g_m_m_mexboss_01: 0x5761F4AD,
|
||||
g_m_m_mexboss_02: 0x4914D813,
|
||||
g_m_y_armgoon_02: 0xC54E878A,
|
||||
g_m_y_azteca_01: 0x68709618,
|
||||
g_m_y_ballaeast_01: 0xF42EE883,
|
||||
g_m_y_ballaorig_01: 0x231AF63F,
|
||||
g_m_y_ballasout_01: 0x23B88069,
|
||||
g_m_y_famca_01: 0xE83B93B7,
|
||||
g_m_y_famdnf_01: 0xDB729238,
|
||||
g_m_y_famfor_01: 0x84302B09,
|
||||
g_m_y_korean_01: 0x247502A9,
|
||||
g_m_y_korean_02: 0x8FEDD989,
|
||||
g_m_y_korlieut_01: 0x7CCBE17A,
|
||||
g_m_y_lost_01: 0x4F46D607,
|
||||
g_m_y_lost_02: 0x3D843282,
|
||||
g_m_y_lost_03: 0x32B11CDC,
|
||||
g_m_y_mexgang_01: 0xBDDD5546,
|
||||
g_m_y_mexgoon_01: 0x26EF3426,
|
||||
g_m_y_mexgoon_02: 0x31A3498E,
|
||||
g_m_y_mexgoon_03: 0x964D12DC,
|
||||
g_m_y_pologoon_01: 0x4F3FBA06,
|
||||
g_m_y_pologoon_02: 0xA2E86156,
|
||||
g_m_y_salvaboss_01: 0x905CE0CA,
|
||||
g_m_y_salvagoon_01: 0x278C8CB7,
|
||||
g_m_y_salvagoon_02: 0x3273A285,
|
||||
g_m_y_salvagoon_03: 0x03B8C510,
|
||||
g_m_y_strpunk_01: 0xFD1C49BB,
|
||||
g_m_y_strpunk_02: 0x0DA1EAC6,
|
||||
hc_driver: 0x3B474ADF,
|
||||
hc_gunman: 0x0B881AEE,
|
||||
hc_hacker: 0x99BB00F8,
|
||||
ig_abigail: 0x400AEC41,
|
||||
ig_agent: 0x246AF208,
|
||||
ig_amandatownley: 0x6D1E15F7,
|
||||
ig_andreas: 0x47E4EEA0,
|
||||
ig_ashley: 0x7EF440DB,
|
||||
ig_avon: 0xFCE270C2,
|
||||
ig_ballasog: 0xA70B4A92,
|
||||
ig_bankman: 0x909D9E7F,
|
||||
ig_barry: 0x2F8845A3,
|
||||
ig_benny: 0xC4B715D2,
|
||||
ig_bestmen: 0x5746CD96,
|
||||
ig_beverly: 0xBDA21E5C,
|
||||
ig_brad: 0xBDBB4922,
|
||||
ig_bride: 0x6162EC47,
|
||||
ig_car3guy1: 0x84F9E937,
|
||||
ig_car3guy2: 0x75C34ACA,
|
||||
ig_casey: 0xE0FA2554,
|
||||
ig_chef: 0x49EADBF6,
|
||||
ig_chef2: 0x85889AC3,
|
||||
ig_chengsr: 0xAAE4EA7B,
|
||||
ig_chrisformage: 0x286E54A7,
|
||||
ig_clay: 0x6CCFE08A,
|
||||
ig_claypain: 0x9D0087A8,
|
||||
ig_cletus: 0xE6631195,
|
||||
ig_dale: 0x467415E9,
|
||||
ig_davenorton: 0x15CD4C33,
|
||||
ig_denise: 0x820B33BD,
|
||||
ig_devin: 0x7461A0B0,
|
||||
ig_dom: 0x9C2DB088,
|
||||
ig_dreyfuss: 0xDA890932,
|
||||
ig_drfriedlander: 0xCBFC0DF5,
|
||||
ig_fabien: 0xD090C350,
|
||||
ig_fbisuit_01: 0x3AE4A33B,
|
||||
ig_floyd: 0xB1B196B2,
|
||||
ig_g: 0x841BA933,
|
||||
ig_groom: 0xFECE8B85,
|
||||
ig_hao: 0x65978363,
|
||||
ig_hunter: 0xCE1324DE,
|
||||
ig_janet: 0x0D6D9C49,
|
||||
ig_jay_norris: 0x7A32EE74,
|
||||
ig_jewelass: 0x0F5D26BB,
|
||||
ig_jimmyboston: 0xEDA0082D,
|
||||
ig_jimmydisanto: 0x570462B9,
|
||||
ig_joeminuteman: 0xBE204C9B,
|
||||
ig_johnnyklebitz: 0x87CA80AE,
|
||||
ig_josef: 0xE11A9FB4,
|
||||
ig_josh: 0x799E9EEE,
|
||||
ig_karen_daniels: 0xEB51D959,
|
||||
ig_kerrymcintosh: 0x5B3BD90D,
|
||||
ig_lamardavis: 0x65B93076,
|
||||
ig_lazlow: 0xDFE443E5,
|
||||
ig_lestercrest_2: 0x6E42FD26,
|
||||
ig_lestercrest: 0x4DA6E849,
|
||||
ig_lifeinvad_01: 0x5389A93C,
|
||||
ig_lifeinvad_02: 0x27BD51D4,
|
||||
ig_magenta: 0xFCDC910A,
|
||||
ig_malc: 0xF1BCA919,
|
||||
ig_manuel: 0xFD418E10,
|
||||
ig_marnie: 0x188232D0,
|
||||
ig_maryann: 0xA36F9806,
|
||||
ig_maude: 0x3BE8287E,
|
||||
ig_michelle: 0xBF9672F4,
|
||||
ig_milton: 0xCB3059B2,
|
||||
ig_molly: 0xAF03DDE1,
|
||||
ig_money: 0x37FACDA6,
|
||||
ig_mp_agent14: 0xFBF98469,
|
||||
ig_mrk: 0xEDDCAB6D,
|
||||
ig_mrs_thornhill: 0x1E04A96B,
|
||||
ig_mrsphillips: 0x3862EEA8,
|
||||
ig_natalia: 0xDE17DD3B,
|
||||
ig_nervousron: 0xBD006AF1,
|
||||
ig_nigel: 0xC8B7167D,
|
||||
ig_old_man1a: 0x719D27F4,
|
||||
ig_old_man2: 0xEF154C47,
|
||||
ig_omega: 0x60E6A7D8,
|
||||
ig_oneil: 0x2DC6D3E7,
|
||||
ig_orleans: 0x61D4C771,
|
||||
ig_ortega: 0x26A562B7,
|
||||
ig_paige: 0x154FCF3F,
|
||||
ig_paper: 0x999B00C6,
|
||||
ig_patricia: 0xC56E118C,
|
||||
ig_popov: 0x267630FE,
|
||||
ig_priest: 0x6437E77D,
|
||||
ig_prolsec_02: 0x27B3AD75,
|
||||
ig_ramp_gang: 0xE52E126C,
|
||||
ig_ramp_hic: 0x45753032,
|
||||
ig_ramp_hipster: 0xDEEF9F6E,
|
||||
ig_ramp_mex: 0xE6AC74A4,
|
||||
ig_rashcosvki: 0x380C4DE6,
|
||||
ig_roccopelosi: 0xD5BA52FF,
|
||||
ig_russiandrunk: 0x3D0A5EB1,
|
||||
ig_screen_writer: 0xFFE63677,
|
||||
ig_siemonyetarian: 0x4C7B2F05,
|
||||
ig_solomon: 0x86BDFE26,
|
||||
ig_stevehains: 0x382121C8,
|
||||
ig_stretch: 0x36984358,
|
||||
ig_talina: 0xE793C8E8,
|
||||
ig_tanisha: 0x0D810489,
|
||||
ig_taocheng: 0xDC5C5EA5,
|
||||
ig_taostranslator: 0x7C851464,
|
||||
ig_tenniscoach: 0xA23B5F57,
|
||||
ig_terry: 0x67000B94,
|
||||
ig_tomepsilon: 0xCD777AAA,
|
||||
ig_tonya: 0xCAC85344,
|
||||
ig_tracydisanto: 0xDE352A35,
|
||||
ig_trafficwarden: 0x5719786D,
|
||||
ig_tylerdix: 0x5265F707,
|
||||
ig_vagspeak: 0xF9FD068C,
|
||||
ig_wade: 0x92991B72,
|
||||
ig_zimbor: 0x0B34D6F5,
|
||||
mp_f_boatstaff_01: 0x3293B9CE,
|
||||
mp_f_cardesign_01: 0x242C34A7,
|
||||
mp_f_chbar_01: 0xC3F6E385,
|
||||
mp_f_cocaine_01: 0x4B657AF8,
|
||||
mp_f_counterfeit_01: 0xB788F1F5,
|
||||
mp_f_deadhooker: 0x73DEA88B,
|
||||
mp_f_execpa_01: 0x432CA064,
|
||||
mp_f_execpa_02: 0x5972CCF0,
|
||||
mp_f_forgery_01: 0x781A3CF8,
|
||||
mp_f_freemode_01: 0x9C9EFFD8,
|
||||
mp_f_helistaff_01: 0x19B6FF06,
|
||||
mp_f_meth_01: 0xD2B27EC1,
|
||||
mp_f_misty_01: 0xD128FF9D,
|
||||
mp_f_stripperlite: 0x2970A494,
|
||||
mp_f_weed_01: 0xB26573A3,
|
||||
mp_g_m_pros_01: 0x6C9DD7C9,
|
||||
mp_m_avongoon: 0x9C13CB95,
|
||||
mp_m_boatstaff_01: 0xC85F0A88,
|
||||
mp_m_bogdangoon: 0x4D5696F7,
|
||||
mp_m_claude_01: 0xC0F371B7,
|
||||
mp_m_cocaine_01: 0x56D38F95,
|
||||
mp_m_counterfeit_01: 0x9855C974,
|
||||
mp_m_exarmy_01: 0x45348DBB,
|
||||
mp_m_execpa_01: 0x3E8417BC,
|
||||
mp_m_famdd_01: 0x33A464E5,
|
||||
mp_m_fibsec_01: 0x5CDEF405,
|
||||
mp_m_forgery_01: 0x613E709B,
|
||||
mp_m_freemode_01: 0x705E61F2,
|
||||
mp_m_g_vagfun_01: 0xC4A617BD,
|
||||
mp_m_marston_01: 0x38430167,
|
||||
mp_m_meth_01: 0xEDB42F3F,
|
||||
mp_m_niko_01: 0xEEDACFC9,
|
||||
mp_m_securoguard_01: 0xDA2C984E,
|
||||
mp_m_shopkeep_01: 0x18CE57D0,
|
||||
mp_m_waremech_01: 0xF7A74139,
|
||||
mp_m_weapexp_01: 0x36EA5B09,
|
||||
mp_m_weapwork_01: 0x4186506E,
|
||||
mp_m_weed_01: 0x917ED459,
|
||||
mp_s_m_armoured_01: 0xCDEF5408,
|
||||
player_one: 0x9B22DBAF,
|
||||
player_two: 0x9B810FA2,
|
||||
player_zero: 0x0D7114C9,
|
||||
s_f_m_fembarber: 0x163B875B,
|
||||
s_f_m_maid_01: 0xE093C5C6,
|
||||
s_f_m_shop_high: 0xAE47E4B0,
|
||||
s_f_m_sweatshop_01: 0x312B5BC0,
|
||||
s_f_y_airhostess_01: 0x5D71A46F,
|
||||
s_f_y_bartender_01: 0x780C01BD,
|
||||
s_f_y_baywatch_01: 0x4A8E5536,
|
||||
s_f_y_cop_01: 0x15F8700D,
|
||||
s_f_y_factory_01: 0x69F46BF3,
|
||||
s_f_y_hooker_01: 0x028ABF95,
|
||||
s_f_y_hooker_02: 0x14C3E407,
|
||||
s_f_y_hooker_03: 0x031640AC,
|
||||
s_f_y_migrant_01: 0xD55B2BF5,
|
||||
s_f_y_movprem_01: 0x2300C816,
|
||||
s_f_y_ranger_01: 0x9FC7F637,
|
||||
s_f_y_scrubs_01: 0xAB594AB6,
|
||||
s_f_y_sheriff_01: 0x4161D042,
|
||||
s_f_y_shop_low: 0xA96E2604,
|
||||
s_f_y_shop_mid: 0x3EECBA5D,
|
||||
s_f_y_stripper_01: 0x52580019,
|
||||
s_f_y_stripper_02: 0x6E0FB794,
|
||||
s_f_y_stripperlite: 0x5C14EDFA,
|
||||
s_f_y_sweatshop_01: 0x8502B6B2,
|
||||
s_m_m_ammucountry: 0x0DE9A30A,
|
||||
s_m_m_armoured_01: 0x95C76ECD,
|
||||
s_m_m_armoured_02: 0x63858A4A,
|
||||
s_m_m_autoshop_01: 0x040EABE3,
|
||||
s_m_m_autoshop_02: 0xF06B849D,
|
||||
s_m_m_bouncer_01: 0x9FD4292D,
|
||||
s_m_m_ccrew_01: 0xC9E5F56B,
|
||||
s_m_m_chemsec_01: 0x2EFEAFD5,
|
||||
s_m_m_ciasec_01: 0x625D6958,
|
||||
s_m_m_cntrybar_01: 0x1A021B83,
|
||||
s_m_m_dockwork_01: 0x14D7B4E0,
|
||||
s_m_m_doctor_01: 0xD47303AC,
|
||||
s_m_m_fiboffice_01: 0xEDBC7546,
|
||||
s_m_m_fiboffice_02: 0x26F067AD,
|
||||
s_m_m_fibsec_01: 0x7B8B434B,
|
||||
s_m_m_gaffer_01: 0xA956BD9E,
|
||||
s_m_m_gardener_01: 0x49EA5685,
|
||||
s_m_m_gentransport: 0x1880ED06,
|
||||
s_m_m_hairdress_01: 0x418DFF92,
|
||||
s_m_m_highsec_01: 0xF161D212,
|
||||
s_m_m_highsec_02: 0x2930C1AB,
|
||||
s_m_m_janitor: 0xA96BD9EC,
|
||||
s_m_m_lathandy_01: 0x9E80D2CE,
|
||||
s_m_m_lifeinvad_01: 0xDE0077FD,
|
||||
s_m_m_linecook: 0xDB9C0997,
|
||||
s_m_m_lsmetro_01: 0x765AAAE4,
|
||||
s_m_m_mariachi_01: 0x7EA4FFA6,
|
||||
s_m_m_marine_01: 0xF2DAA2ED,
|
||||
s_m_m_marine_02: 0xF0259D83,
|
||||
s_m_m_migrant_01: 0xED0CE4C6,
|
||||
s_m_m_movalien_01: 0x64611296,
|
||||
s_m_m_movprem_01: 0xD85E6D28,
|
||||
s_m_m_movspace_01: 0xE7B31432,
|
||||
s_m_m_paramedic_01: 0xB353629E,
|
||||
s_m_m_pilot_01: 0xE75B4B1C,
|
||||
s_m_m_pilot_02: 0xF63DE8E1,
|
||||
s_m_m_postal_01: 0x62599034,
|
||||
s_m_m_postal_02: 0x7367324F,
|
||||
s_m_m_prisguard_01: 0x56C96FC6,
|
||||
s_m_m_scientist_01: 0x4117D39B,
|
||||
s_m_m_security_01: 0xD768B228,
|
||||
s_m_m_snowcop_01: 0x1AE8BB58,
|
||||
s_m_m_strperf_01: 0x795AC7A8,
|
||||
s_m_m_strpreach_01: 0x1C0077FB,
|
||||
s_m_m_strvend_01: 0xCE9113A9,
|
||||
s_m_m_trucker_01: 0x59511A6C,
|
||||
s_m_m_ups_01: 0x9FC37F22,
|
||||
s_m_m_ups_02: 0xD0BDE116,
|
||||
s_m_o_busker_01: 0xAD9EF1BB,
|
||||
s_m_y_airworker: 0x62018559,
|
||||
s_m_y_ammucity_01: 0x9E08633D,
|
||||
s_m_y_armymech_01: 0x62CC28E2,
|
||||
s_m_y_autopsy_01: 0xB2273D4E,
|
||||
s_m_y_barman_01: 0xE5A11106,
|
||||
s_m_y_baywatch_01: 0x0B4A6862,
|
||||
s_m_y_blackops_01: 0xB3F3EE34,
|
||||
s_m_y_blackops_02: 0x7A05FA59,
|
||||
s_m_y_blackops_03: 0x5076A73B,
|
||||
s_m_y_busboy_01: 0xD8F9CD47,
|
||||
s_m_y_chef_01: 0x0F977CEB,
|
||||
s_m_y_clown_01: 0x04498DDE,
|
||||
s_m_y_construct_01: 0xD7DA9E99,
|
||||
s_m_y_construct_02: 0xC5FEFADE,
|
||||
s_m_y_cop_01: 0x5E3DA4A4,
|
||||
s_m_y_dealer_01: 0xE497BBEF,
|
||||
s_m_y_devinsec_01: 0x9B557274,
|
||||
s_m_y_dockwork_01: 0x867639D1,
|
||||
s_m_y_doorman_01: 0x22911304,
|
||||
s_m_y_dwservice_01: 0x75D30A91,
|
||||
s_m_y_dwservice_02: 0xF5908A06,
|
||||
s_m_y_factory_01: 0x4163A158,
|
||||
s_m_y_fireman_01: 0xB6B1EDA8,
|
||||
s_m_y_garbage: 0xEE75A00F,
|
||||
s_m_y_grip_01: 0x309E7DEA,
|
||||
s_m_y_hwaycop_01: 0x739B1EF5,
|
||||
s_m_y_marine_01: 0x65793043,
|
||||
s_m_y_marine_02: 0x58D696FE,
|
||||
s_m_y_marine_03: 0x72C0CAD2,
|
||||
s_m_y_mime: 0x3CDCA742,
|
||||
s_m_y_pestcont_01: 0x48114518,
|
||||
s_m_y_pilot_01: 0xAB300C07,
|
||||
s_m_y_prismuscl_01: 0x5F2113A1,
|
||||
s_m_y_prisoner_01: 0xB1BB9B59,
|
||||
s_m_y_ranger_01: 0xEF7135AE,
|
||||
s_m_y_robber_01: 0xC05E1399,
|
||||
s_m_y_sheriff_01: 0xB144F9B9,
|
||||
s_m_y_shop_mask: 0x6E122C06,
|
||||
s_m_y_strvend_01: 0x927F2323,
|
||||
s_m_y_swat_01: 0x8D8F1B10,
|
||||
s_m_y_uscg_01: 0xCA0050E9,
|
||||
s_m_y_valet_01: 0x3B96F23E,
|
||||
s_m_y_waiter_01: 0xAD4C724C,
|
||||
s_m_y_winclean_01: 0x550D8D9D,
|
||||
s_m_y_xmech_01: 0x441405EC,
|
||||
s_m_y_xmech_02_mp: 0x69147A0D,
|
||||
s_m_y_xmech_02: 0xBE20FA04,
|
||||
u_f_m_corpse_01: 0x2E140314,
|
||||
u_f_m_drowned_01: 0xD7F37609,
|
||||
u_f_m_miranda: 0x414FA27B,
|
||||
u_f_m_promourn_01: 0xA20899E7,
|
||||
u_f_o_moviestar: 0x35578634,
|
||||
u_f_o_prolhost_01: 0xC512DD23,
|
||||
u_f_y_bikerchic: 0xFA389D4F,
|
||||
u_f_y_comjane: 0xB6AA85CE,
|
||||
u_f_y_corpse_01: 0x9C70109D,
|
||||
u_f_y_corpse_02: 0x0D9C72F8,
|
||||
u_f_y_hotposh_01: 0x969B6DFE,
|
||||
u_f_y_jewelass_01: 0xF0D4BE2E,
|
||||
u_f_y_mistress: 0x5DCA2528,
|
||||
u_f_y_poppymich: 0x23E9A09E,
|
||||
u_f_y_princess: 0xD2E3A284,
|
||||
u_f_y_spyactress: 0x5B81D86C,
|
||||
u_m_m_aldinapoli: 0xF0EC56E2,
|
||||
u_m_m_bankman: 0xC306D6F5,
|
||||
u_m_m_bikehire_01: 0x76474545,
|
||||
u_m_m_doa_01: 0x621E6BFD,
|
||||
u_m_m_edtoh: 0x2A797197,
|
||||
u_m_m_fibarchitect: 0x342333D3,
|
||||
u_m_m_filmdirector: 0x2B6E1BB6,
|
||||
u_m_m_glenstank_01: 0x45BB1666,
|
||||
u_m_m_griff_01: 0xC454BCBB,
|
||||
u_m_m_jesus_01: 0xCE2CB751,
|
||||
u_m_m_jewelsec_01: 0xACCCBDB6,
|
||||
u_m_m_jewelthief: 0xE6CC3CDC,
|
||||
u_m_m_markfost: 0x1C95CB0B,
|
||||
u_m_m_partytarget: 0x81F74DE7,
|
||||
u_m_m_prolsec_01: 0x709220C7,
|
||||
u_m_m_promourn_01: 0xCE96030B,
|
||||
u_m_m_rivalpap: 0x60D5D6DA,
|
||||
u_m_m_spyactor: 0xAC0EA5D8,
|
||||
u_m_m_streetart_01: 0x6C19E962,
|
||||
u_m_m_willyfist: 0x90769A8F,
|
||||
u_m_o_filmnoir: 0x2BACC2DB,
|
||||
u_m_o_finguru_01: 0x46E39E63,
|
||||
u_m_o_taphillbilly: 0x9A1E5E52,
|
||||
u_m_o_tramp_01: 0x6A8F1F9B,
|
||||
u_m_y_abner: 0xF0AC2626,
|
||||
u_m_y_antonb: 0xCF623A2C,
|
||||
u_m_y_babyd: 0xDA116E7E,
|
||||
u_m_y_baygor: 0x5244247D,
|
||||
u_m_y_burgerdrug_01: 0x8B7D3766,
|
||||
u_m_y_chip: 0x24604B2B,
|
||||
u_m_y_corpse_01: 0x94C2A03F,
|
||||
u_m_y_cyclist_01: 0x2D0EFCEB,
|
||||
u_m_y_fibmugger_01: 0x85B9C668,
|
||||
u_m_y_guido_01: 0xC6B49A2F,
|
||||
u_m_y_gunvend_01: 0xB3229752,
|
||||
u_m_y_hippie_01: 0xF041880B,
|
||||
u_m_y_imporage: 0x348065F5,
|
||||
u_m_y_juggernaut_01: 0x90EF5134,
|
||||
u_m_y_justin: 0x7DC3908F,
|
||||
u_m_y_mani: 0xC8BB1E52,
|
||||
u_m_y_militarybum: 0x4705974A,
|
||||
u_m_y_paparazzi: 0x5048B328,
|
||||
u_m_y_party_01: 0x36E70600,
|
||||
u_m_y_pogo_01: 0xDC59940D,
|
||||
u_m_y_prisoner_01: 0x7B9B4BC0,
|
||||
u_m_y_proldriver_01: 0x855E36A3,
|
||||
u_m_y_rsranger_01: 0x3C438CD2,
|
||||
u_m_y_sbike: 0x6AF4185D,
|
||||
u_m_y_staggrm_01: 0x9194CE03,
|
||||
u_m_y_tattoo_01: 0x94AE2B8C,
|
||||
u_m_y_zombie_01: 0xAC4B4506,
|
||||
}
|
||||
var CreatedPeds = [];
|
||||
mp.events.add("SERVER:CreateStaticPeds", (jsonVector3s, jsonHeadings, jsonCharHashes, jsonDimension) => {
|
||||
var vector3s = JSON.parse(jsonVector3s);
|
||||
var headings = JSON.parse(jsonHeadings);
|
||||
var charHashes = JSON.parse(jsonCharHashes);
|
||||
var dimension = JSON.parse(jsonDimension);
|
||||
for (var i = 0; i < vector3s.length; i++) {
|
||||
let p = mp.peds.new(Number(charHashes[i]), vector3s[i], headings[i], dimension[i]);
|
||||
p.freezePosition(true);
|
||||
p.setInvincible(true);
|
||||
p.setCollision(false, false);
|
||||
CreatedPeds.push(p);
|
||||
}
|
||||
});
|
||||
mp.events.add('entityStreamIn', (entity: EntityMp) => {
|
||||
CreatedPeds.forEach(function (p) {
|
||||
if (entity == p) {
|
||||
|
||||
p.freezePosition(true);
|
||||
p.setInvincible(true);
|
||||
p.setCollision(false, false);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
71
ReallifeGamemode.Client/Player/criminalrelease.ts
Normal file
71
ReallifeGamemode.Client/Player/criminalrelease.ts
Normal file
@@ -0,0 +1,71 @@
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
|
||||
let screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
let saveItem = new UIMenuItem("Entlassen", "Setze den Gefangenen auf freiem Fuß");
|
||||
saveItem.BackColor = new Color(13, 71, 161);
|
||||
saveItem.HighlightedBackColor = new Color(25, 118, 210);
|
||||
|
||||
let cancelItem = new UIMenuItem("Abbrechen", "");
|
||||
cancelItem.BackColor = new Color(213, 0, 0);
|
||||
cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
|
||||
export default function jailList(globalData: IGlobalData) {
|
||||
|
||||
var jailMenu: NativeUI.Menu;
|
||||
|
||||
var prisoners;
|
||||
|
||||
var prisoner = "";
|
||||
|
||||
|
||||
//Weapon Menu
|
||||
|
||||
mp.events.add('showJailMenu', (prisonersArr) => {
|
||||
if (!globalData.InMenu) {
|
||||
|
||||
globalData.InMenu = true;
|
||||
|
||||
prisoners = JSON.parse(prisonersArr);
|
||||
|
||||
jailMenu = new Menu("Gefängnis PC", "", new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
jailMenu.AddItem(new UIMenuListItem("Gefangener", "", new ItemsCollection(prisoners)));
|
||||
|
||||
jailMenu.AddItem(saveItem);
|
||||
jailMenu.AddItem(cancelItem);
|
||||
jailMenu.Visible = true;
|
||||
|
||||
jailMenu.ListChange.on((item, index) => {
|
||||
switch (item.Text) {
|
||||
case "Gefangener":
|
||||
prisoner = String(item.SelectedItem.DisplayText);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
jailMenu.ItemSelect.on((item) => {
|
||||
if (item.Text === "Entlassen") {
|
||||
mp.events.callRemote("setPrisonerFree", prisoner);
|
||||
jailMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
} else if (item.Text === "Abbrechen") {
|
||||
jailMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
}
|
||||
});
|
||||
|
||||
jailMenu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
110
ReallifeGamemode.Client/Player/dutycloth.ts
Normal file
110
ReallifeGamemode.Client/Player/dutycloth.ts
Normal file
@@ -0,0 +1,110 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Player DutyClothes dutyclothes.js
|
||||
* @author VegaZ
|
||||
* @copyright (c) 2008 - 2018 Life of German
|
||||
*/
|
||||
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
|
||||
let screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
let saveItem = new UIMenuItem("Speichern", "Speichert deine Dienstkleidung");
|
||||
saveItem.BackColor = new Color(13, 71, 161);
|
||||
saveItem.HighlightedBackColor = new Color(25, 118, 210);
|
||||
|
||||
let cancelItem = new UIMenuItem("Abbrechen", "");
|
||||
cancelItem.BackColor = new Color(213, 0, 0);
|
||||
cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
|
||||
export default function dutyCloth(globalData: IGlobalData) {
|
||||
|
||||
var dutyMenu: NativeUI.Menu;
|
||||
|
||||
var hats;
|
||||
var tops;
|
||||
var legs;
|
||||
var shoes;
|
||||
|
||||
var hat = -1;
|
||||
var top = 0;
|
||||
var leg = 0;
|
||||
var shoe = 0;
|
||||
|
||||
//Cloth Menu
|
||||
|
||||
mp.events.add('showDutyClothMenu', (hatsArr, topsArr, legsArr, shoesArr) => {
|
||||
if (!globalData.InMenu) {
|
||||
|
||||
globalData.InMenu = true;
|
||||
|
||||
hats = hatsArr;
|
||||
tops = topsArr;
|
||||
legs = legsArr;
|
||||
shoes = shoesArr;
|
||||
|
||||
dutyMenu = new Menu("Dienstkleidung", "Stelle deine Dienstkleidung zusammen", new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
dutyMenu.AddItem(new UIMenuListItem("Accessoire", "", new ItemsCollection(hats)));
|
||||
dutyMenu.AddItem(new UIMenuListItem("Top", "", new ItemsCollection(tops)));
|
||||
dutyMenu.AddItem(new UIMenuListItem("Hose", "", new ItemsCollection(legs)));
|
||||
dutyMenu.AddItem(new UIMenuListItem("Schuhe", "", new ItemsCollection(shoes)));
|
||||
dutyMenu.AddItem(saveItem);
|
||||
dutyMenu.AddItem(cancelItem);
|
||||
dutyMenu.Visible = true;
|
||||
|
||||
dutyMenu.ListChange.on((item, index) => {
|
||||
switch (item.Text) {
|
||||
case "Accessoire":
|
||||
if (item.SelectedItem.DisplayText === "Keinen") {
|
||||
hat = -1;
|
||||
} else {
|
||||
hat = parseInt(item.SelectedItem.DisplayText);
|
||||
}
|
||||
mp.events.callRemote("updateDutyProp", 0, hat);
|
||||
break;
|
||||
case "Top":
|
||||
top = parseInt(item.SelectedItem.DisplayText);
|
||||
mp.events.callRemote("updateDutyCloth", 11, top);
|
||||
break;
|
||||
case "Hose":
|
||||
leg = parseInt(item.SelectedItem.DisplayText);
|
||||
mp.events.callRemote("updateDutyCloth", 4, leg);
|
||||
break;
|
||||
case "Schuhe":
|
||||
shoe = parseInt(item.SelectedItem.DisplayText);
|
||||
mp.events.callRemote("updateDutyCloth", 6, shoe);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
dutyMenu.ItemSelect.on((item) => {
|
||||
if (item.Text === "Speichern") {
|
||||
var slotType = [1, 0, 0, 0];
|
||||
var slotId = [0, 11, 4, 6];
|
||||
var clothId = [hat, top, leg, shoe];
|
||||
mp.events.callRemote("saveCharacterCloth", JSON.stringify(slotType), JSON.stringify(slotId), JSON.stringify(clothId));
|
||||
dutyMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
} else if (item.Text === "Abbrechen") {
|
||||
dutyMenu.Close();
|
||||
mp.events.callRemote("defaultCharacterCloth");
|
||||
globalData.InMenu = false;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
dutyMenu.MenuClose.on(() => {
|
||||
mp.events.callRemote("defaultCharacterCloth");
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
131
ReallifeGamemode.Client/Player/freecam.ts
Normal file
131
ReallifeGamemode.Client/Player/freecam.ts
Normal file
@@ -0,0 +1,131 @@
|
||||
export default function () {
|
||||
var getNormalizedVector = function (vector) {
|
||||
var mag = Math.sqrt(
|
||||
vector.x * vector.x + vector.y * vector.y + vector.z * vector.z
|
||||
);
|
||||
vector.x = vector.x / mag;
|
||||
vector.y = vector.y / mag;
|
||||
vector.z = vector.z / mag;
|
||||
return vector;
|
||||
};
|
||||
var getCrossProduct = function (v1, v2) {
|
||||
var vector = new mp.Vector3(0, 0, 0);
|
||||
vector.x = v1.y * v2.z - v1.z * v2.y;
|
||||
vector.y = v1.z * v2.x - v1.x * v2.z;
|
||||
vector.z = v1.x * v2.y - v1.y * v2.x;
|
||||
return vector;
|
||||
};
|
||||
var bindVirtualKeys = {
|
||||
F2: 0x71
|
||||
};
|
||||
var bindASCIIKeys = {
|
||||
Q: 69,
|
||||
E: 81,
|
||||
LCtrl: 17,
|
||||
Shift: 16
|
||||
};
|
||||
mp.game.graphics.notify('~r~NoClip ~w~by ~b~Morbo');
|
||||
var isNoClip = false;
|
||||
var noClipCamera;
|
||||
var shiftModifier = false;
|
||||
var controlModifier = false;
|
||||
var localPlayer = mp.players.local;
|
||||
mp.keys.bind(bindVirtualKeys.F2, true, function () {
|
||||
isNoClip = !isNoClip;
|
||||
mp.game.ui.displayRadar(!isNoClip);
|
||||
if (isNoClip) {
|
||||
startNoClip();
|
||||
} else {
|
||||
stopNoClip();
|
||||
}
|
||||
});
|
||||
function startNoClip() {
|
||||
mp.game.graphics.notify('NoClip ~g~activated');
|
||||
var camPos = new mp.Vector3(
|
||||
localPlayer.position.x,
|
||||
localPlayer.position.y,
|
||||
localPlayer.position.z
|
||||
);
|
||||
var camRot = mp.game.cam.getGameplayCamRot(2);
|
||||
noClipCamera = mp.cameras.new('default', camPos, camRot, 45);
|
||||
noClipCamera.setActive(true);
|
||||
mp.game.cam.renderScriptCams(true, false, 0, true, false);
|
||||
localPlayer.freezePosition(true);
|
||||
localPlayer.setInvincible(true);
|
||||
localPlayer.setVisible(false, false);
|
||||
localPlayer.setCollision(false, false);
|
||||
}
|
||||
function stopNoClip() {
|
||||
mp.game.graphics.notify('NoClip ~r~disabled');
|
||||
if (noClipCamera) {
|
||||
localPlayer.position = noClipCamera.getCoord();
|
||||
localPlayer.setHeading(noClipCamera.getRot(2).z);
|
||||
noClipCamera.destroy(true);
|
||||
noClipCamera = null;
|
||||
}
|
||||
mp.game.cam.renderScriptCams(false, false, 0, true, false);
|
||||
localPlayer.freezePosition(false);
|
||||
localPlayer.setInvincible(false);
|
||||
localPlayer.setVisible(true, false);
|
||||
localPlayer.setCollision(true, false);
|
||||
}
|
||||
mp.events.add('render', function () {
|
||||
if (!noClipCamera || mp.gui.cursor.visible) {
|
||||
return;
|
||||
}
|
||||
controlModifier = mp.keys.isDown(bindASCIIKeys.LCtrl);
|
||||
shiftModifier = mp.keys.isDown(bindASCIIKeys.Shift);
|
||||
var rot = noClipCamera.getRot(2);
|
||||
var fastMult = 1;
|
||||
var slowMult = 1;
|
||||
if (shiftModifier) {
|
||||
fastMult = 3;
|
||||
} else if (controlModifier) {
|
||||
slowMult = 0.5;
|
||||
}
|
||||
var rightAxisX = mp.game.controls.getDisabledControlNormal(0, 220);
|
||||
var rightAxisY = mp.game.controls.getDisabledControlNormal(0, 221);
|
||||
var leftAxisX = mp.game.controls.getDisabledControlNormal(0, 218);
|
||||
var leftAxisY = mp.game.controls.getDisabledControlNormal(0, 219);
|
||||
var pos = noClipCamera.getCoord();
|
||||
var rr = noClipCamera.getDirection();
|
||||
var vector = new mp.Vector3(0, 0, 0);
|
||||
vector.x = rr.x * leftAxisY * fastMult * slowMult;
|
||||
vector.y = rr.y * leftAxisY * fastMult * slowMult;
|
||||
vector.z = rr.z * leftAxisY * fastMult * slowMult;
|
||||
var upVector = new mp.Vector3(0, 0, 1);
|
||||
var rightVector = getCrossProduct(
|
||||
getNormalizedVector(rr),
|
||||
getNormalizedVector(upVector)
|
||||
);
|
||||
rightVector.x *= leftAxisX * 0.5;
|
||||
rightVector.y *= leftAxisX * 0.5;
|
||||
rightVector.z *= leftAxisX * 0.5;
|
||||
var upMovement = 0.0;
|
||||
if (mp.keys.isDown(bindASCIIKeys.Q)) {
|
||||
upMovement = 0.5;
|
||||
}
|
||||
var downMovement = 0.0;
|
||||
if (mp.keys.isDown(bindASCIIKeys.E)) {
|
||||
downMovement = 0.5;
|
||||
}
|
||||
mp.players.local.position = new mp.Vector3(
|
||||
pos.x + vector.x + 1,
|
||||
pos.y + vector.y + 1,
|
||||
pos.z + vector.z + 1
|
||||
);
|
||||
mp.players.local.heading = rr.z;
|
||||
noClipCamera.setCoord(
|
||||
pos.x - vector.x + rightVector.x,
|
||||
pos.y - vector.y + rightVector.y,
|
||||
pos.z - vector.z + rightVector.z + upMovement - downMovement
|
||||
);
|
||||
noClipCamera.setRot(
|
||||
rot.x + rightAxisY * -5.0,
|
||||
0.0,
|
||||
rot.z + rightAxisX * -5.0,
|
||||
2
|
||||
);
|
||||
});
|
||||
|
||||
}
|
||||
153
ReallifeGamemode.Client/Player/keys.ts
Normal file
153
ReallifeGamemode.Client/Player/keys.ts
Normal file
@@ -0,0 +1,153 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Player Keys keys.js
|
||||
* @author VegaZ
|
||||
* @copyright (c) 2008 - 2018 Life of German
|
||||
*/
|
||||
|
||||
//https://docs.microsoft.com/de-de/windows/desktop/inputdev/virtual-key-codes
|
||||
|
||||
|
||||
const player = mp.players.local;
|
||||
|
||||
export default function keys(globalData: IGlobalData) {
|
||||
|
||||
var showInventory = false;
|
||||
var showGui = true;
|
||||
var showInv = false;
|
||||
|
||||
//ENTER
|
||||
mp.keys.bind(0x0D, false, function () {
|
||||
if (globalData.InChat) {
|
||||
globalData.InChat = false;
|
||||
}
|
||||
});
|
||||
|
||||
//LEFT ARROW (Interaktion mit anderen Spielern)
|
||||
mp.keys.bind(0x25, false, function () {
|
||||
if (!globalData.InChat && !showInv && !globalData.InMenu) {
|
||||
mp.events.callRemote("keyPress:LEFT_ARROW");
|
||||
}
|
||||
});
|
||||
|
||||
//UP ARROW (Interaktion mit Spielwelt)
|
||||
mp.keys.bind(0x26, false, function () {
|
||||
if (!globalData.InChat && !showInv && !globalData.InMenu) {
|
||||
mp.events.callRemote("keyPress:UP_ARROW");
|
||||
}
|
||||
});
|
||||
|
||||
//RIGHT ARROW (Fraktionsinteraktion)
|
||||
mp.keys.bind(0x27, false, function () {
|
||||
if (!globalData.InChat && !showInv && !globalData.InMenu) {
|
||||
mp.events.callRemote("keyPress:RIGHT_ARROW");
|
||||
}
|
||||
});
|
||||
|
||||
//F7 //Unshowalles
|
||||
mp.keys.bind(0x76, false, function () {
|
||||
if (showGui === true) {
|
||||
showGui = false;
|
||||
mp.events.call("toggleUi", false);
|
||||
} else {
|
||||
showGui = true;
|
||||
mp.events.call("toggleUi", true);
|
||||
}
|
||||
});
|
||||
|
||||
//NUM2 //Save Blips in Edit Mode
|
||||
mp.keys.bind(0x62, false, function () {
|
||||
if (!globalData.InChat) {
|
||||
mp.events.callRemote("keyPress:NUM2");
|
||||
}
|
||||
});
|
||||
|
||||
//NUM5 //Fraktionsinteraktion (Tasks sortieren)
|
||||
//mp.keys.bind(0x65, false, function () {
|
||||
// if (!globalData.InChat && globalData.Interaction) {
|
||||
// mp.events.call("sortFactionTasks", true);
|
||||
// }
|
||||
//});
|
||||
|
||||
//E
|
||||
mp.keys.bind(0x45, false, function () {
|
||||
if (!globalData.InChat && !globalData.InMenu) {
|
||||
mp.events.callRemote("keyPress:E");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
//I //Inventar
|
||||
mp.keys.bind(0x49, false, function () {
|
||||
if (!globalData.InChat && !globalData.InTuning && !globalData.InMenu) {
|
||||
if (showInv === false) {
|
||||
showInv = true;
|
||||
} else {
|
||||
showInv = false;
|
||||
}
|
||||
mp.events.callRemote("keyPress:I");
|
||||
}
|
||||
});
|
||||
|
||||
//O //Spielerliste
|
||||
mp.keys.bind(0x4F, true, function () {
|
||||
if (!globalData.InChat && !globalData.InMenu && !globalData.InTuning && !showInv) {
|
||||
mp.events.callRemote("keyPress:O");
|
||||
//mp.events.call("showPlayerlist");
|
||||
}
|
||||
});
|
||||
|
||||
//K //Dienstkleidung
|
||||
mp.keys.bind(0x4B, false, function () {
|
||||
if (!globalData.InChat) {
|
||||
mp.events.callRemote("keyPress:K");
|
||||
}
|
||||
});
|
||||
|
||||
//L //Türen auf / zuschließen
|
||||
mp.keys.bind(0x4C, false, function () {
|
||||
if (!globalData.InChat) {
|
||||
mp.events.callRemote("keyPress:L");
|
||||
}
|
||||
});
|
||||
|
||||
//M (Interaktionsmenü)
|
||||
mp.keys.bind(0x4D, false, function () {
|
||||
if (!globalData.InChat && !showInv && !globalData.InMenu && !globalData.InInput && !globalData.InTuning) {
|
||||
mp.events.callRemote("keyPress:M");
|
||||
}
|
||||
});
|
||||
|
||||
//N //Motor Starten
|
||||
mp.keys.bind(0x4E, false, function () {
|
||||
if (!globalData.InChat) {
|
||||
if (!player.vehicle) return;
|
||||
if (player.vehicle.getSpeed() > 5) return;
|
||||
mp.events.callRemote("keyPress:N");
|
||||
}
|
||||
});
|
||||
|
||||
//T
|
||||
mp.keys.bind(0x54, false, function () {
|
||||
if (!globalData.InChat) {
|
||||
globalData.InChat = true;
|
||||
}
|
||||
});
|
||||
|
||||
//X // Fahrzeug Verwaltung - Menü
|
||||
mp.keys.bind(0x58, false, function () {
|
||||
if (!globalData.InChat) {
|
||||
mp.events.callRemote("keyPress:X");
|
||||
}
|
||||
});
|
||||
|
||||
//J // Job Starten
|
||||
mp.keys.bind(0x4A, false, () => {
|
||||
if (!globalData.InChat && !globalData.InInput && !globalData.InMenu && globalData.LoggedIn) {
|
||||
mp.events.callRemote("CLIENT:JobManager_ShowJobMenu");
|
||||
}
|
||||
});
|
||||
|
||||
mp.keys.bind(0x7A, false, () => {
|
||||
mp.gui.takeScreenshot(new Date().toLocaleDateString(), 1, 100, 80);
|
||||
});
|
||||
}
|
||||
10
ReallifeGamemode.Client/Player/quit.ts
Normal file
10
ReallifeGamemode.Client/Player/quit.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Player Quit quit.js
|
||||
* @author hydrant
|
||||
* @copyright (c) 2008 - 2018 Life of German
|
||||
*/
|
||||
export default function quitHandler() {
|
||||
mp.events.add('playerQuit', (player, exitType, reason) => {
|
||||
mp.game.ui.clearHelp(true);
|
||||
});
|
||||
}
|
||||
173
ReallifeGamemode.Client/Player/reportmenu.ts
Normal file
173
ReallifeGamemode.Client/Player/reportmenu.ts
Normal file
@@ -0,0 +1,173 @@
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
import jailList from './criminalrelease';
|
||||
import InputHelper from '../inputhelper';
|
||||
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
|
||||
let screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
|
||||
let deleteItem = new UIMenuItem("Entfernen", "Entfernt das Ticket aus der Liste");
|
||||
deleteItem.BackColor = new Color(42, 46, 49);
|
||||
let saveItem = new UIMenuItem("Annehmen", "Starte direkten Chat mit dem User");
|
||||
saveItem.BackColor = new Color(13, 71, 161);
|
||||
saveItem.HighlightedBackColor = new Color(25, 118, 210);
|
||||
|
||||
let sendItem = new UIMenuItem("Absenden", "Sende Report an alle Admins");
|
||||
sendItem.BackColor = new Color(13, 71, 161);
|
||||
sendItem.HighlightedBackColor = new Color(25, 118, 210);
|
||||
|
||||
let cancelItem = new UIMenuItem("Abbrechen", "");
|
||||
cancelItem.BackColor = new Color(213, 0, 0);
|
||||
cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
|
||||
export default function reportList(globalData: IGlobalData) {
|
||||
|
||||
var reportMenu: NativeUI.Menu;
|
||||
|
||||
var users;
|
||||
var reportTexts;
|
||||
|
||||
var user = "";
|
||||
var reportText = "";
|
||||
|
||||
|
||||
//Weapon Menu
|
||||
|
||||
mp.events.add('showReportMenu', (userTickets, TicketsArr) => {
|
||||
if (!globalData.InMenu) {
|
||||
|
||||
globalData.InMenu = true;
|
||||
|
||||
users = JSON.parse(userTickets);
|
||||
reportTexts = JSON.parse(userTickets);
|
||||
|
||||
reportMenu = new Menu("Offene Tickets", "", new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
reportMenu.AddItem(new UIMenuListItem("Ticket", "", new ItemsCollection(reportTexts)));
|
||||
|
||||
reportMenu.AddItem(deleteItem);
|
||||
reportMenu.AddItem(saveItem);
|
||||
reportMenu.AddItem(cancelItem);
|
||||
reportMenu.Visible = true;
|
||||
|
||||
user = users[0];
|
||||
|
||||
reportMenu.ListChange.on((item, index) => {
|
||||
switch (item.Text) {
|
||||
case "Ticket":
|
||||
user = String(item.SelectedItem.DisplayText);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
reportMenu.ItemSelect.on((item) => {
|
||||
if (item.Text === "Annehmen") {
|
||||
mp.events.callRemote("acceptReport", user);
|
||||
reportMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
} else if (item.Text === "Abbrechen") {
|
||||
reportMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
} else if (item.Text === "Entfernen") {
|
||||
mp.events.callRemote("deleteReport", user);
|
||||
reportMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
}
|
||||
});
|
||||
|
||||
reportMenu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add('showReportType', () => {
|
||||
if (!globalData.InMenu) {
|
||||
|
||||
var type;
|
||||
|
||||
globalData.InMenu = true;
|
||||
|
||||
var types = ["Quick Report", "Ticket Report"];
|
||||
|
||||
reportMenu = new Menu("QuickReport/Ticket", "", new Point(0, screenRes.y / 3), null, null);
|
||||
var typesItem = new UIMenuListItem("Typ", "", new ItemsCollection(types));
|
||||
reportMenu.AddItem(typesItem);
|
||||
|
||||
reportMenu.AddItem(sendItem);
|
||||
reportMenu.AddItem(cancelItem);
|
||||
reportMenu.Visible = true;
|
||||
|
||||
reportMenu.ItemSelect.on((item) => {
|
||||
if (item.Text === "Absenden") {
|
||||
globalData.InInput = true;
|
||||
var ticketContentBox = new InputHelper("Worin besteht dein Anliegen?", globalData);
|
||||
ticketContentBox.show();
|
||||
ticketContentBox.getValue(data => {
|
||||
|
||||
var type = typesItem.SelectedItem.DisplayText;
|
||||
|
||||
var content = JSON.stringify(data);
|
||||
|
||||
//mp.gui.chat.push(content);
|
||||
//mp.gui.chat.push(type);
|
||||
|
||||
mp.events.callRemote("requestReport", type, content);
|
||||
mp.events.call("SERVER:CloseReportMenu");
|
||||
reportMenu.Close();
|
||||
});
|
||||
|
||||
|
||||
globalData.InMenu = false;
|
||||
} else if (item.Text === "Abbrechen") {
|
||||
reportMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
}
|
||||
});
|
||||
|
||||
reportMenu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
var textBoxBrowser: BrowserMp;
|
||||
var loginCam: CameraMp = mp.cameras.new('login', new mp.Vector3(-1883.736, -781.4911, 78.27616), new mp.Vector3(3.185999, 0, -79.59519), 40);
|
||||
|
||||
var localPlayer: PlayerMp = mp.players.local;
|
||||
|
||||
mp.events.add('textbox', () => {
|
||||
mp.gui.cursor.show(true, true);
|
||||
mp.gui.chat.show(false);
|
||||
mp.game.ui.displayHud(false);
|
||||
mp.game.ui.displayRadar(false);
|
||||
|
||||
textBoxBrowser = mp.browsers.new("package://assets/html/SimpleTextBox.html");
|
||||
|
||||
/*
|
||||
loginCam.setActive(true);
|
||||
mp.game.cam.renderScriptCams(true, false, 0, true, false);
|
||||
*/
|
||||
});
|
||||
|
||||
|
||||
mp.events.add('report_submitText', (tmp) => {
|
||||
|
||||
mp.events.callRemote("requestReport", tmp);
|
||||
});
|
||||
|
||||
mp.events.add("SERVER:CloseReportMenu", () => {
|
||||
mp.game.ui.clearHelp(true);
|
||||
if (reportMenu != null) {
|
||||
reportMenu.Close();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
179
ReallifeGamemode.Client/Player/weaponlist.ts
Normal file
179
ReallifeGamemode.Client/Player/weaponlist.ts
Normal file
@@ -0,0 +1,179 @@
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const UIMenuListItem = NativeUI.UIMenuListItem;
|
||||
const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const ItemsCollection = NativeUI.ItemsCollection;
|
||||
const Color = NativeUI.Color;
|
||||
|
||||
let screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
let saveItem = new UIMenuItem("Waffen Nehmen", "");
|
||||
saveItem.BackColor = new Color(13, 71, 161);
|
||||
saveItem.HighlightedBackColor = new Color(25, 118, 210);
|
||||
|
||||
let cancelItem = new UIMenuItem("Abbrechen", "");
|
||||
cancelItem.BackColor = new Color(213, 0, 0);
|
||||
cancelItem.HighlightedBackColor = new Color(229, 57, 53);
|
||||
|
||||
let WeaponStockItem = new UIMenuItem("Bestand", "Waffenbestand anzeigen");
|
||||
WeaponStockItem.BackColor = new Color(94, 94, 94);
|
||||
WeaponStockItem.HighlightedBackColor = new Color(105, 105, 105);
|
||||
|
||||
export default function weaponList(globalData: IGlobalData) {
|
||||
|
||||
var weaponMenu: NativeUI.Menu;
|
||||
|
||||
|
||||
|
||||
var primaries;
|
||||
var secondaries;
|
||||
var melees;
|
||||
var specialsWep;
|
||||
var time;
|
||||
var armor;
|
||||
|
||||
var primary = "";
|
||||
var secondary = "";
|
||||
var melee = "";
|
||||
var specialWep = "";
|
||||
var timer = "";
|
||||
|
||||
|
||||
//Weapon Menu
|
||||
|
||||
mp.events.add('showWeaponMenu', (primariesArr, secondariesArr, meleesArr, specialsArr, armorArr, jsonTime, pistol_Amount, pistol50_Amount, Pistol_mk2_Amount, Combatpistol_Amount, SMG_Amount, Carbinerifle_Amount, Compactrifle_Amount, sniperrifle_Amount, Pumpshotgun_Amount, Schutzweste_Amount, Stungun_Amount) => {
|
||||
if (!globalData.InMenu) {
|
||||
|
||||
globalData.InMenu = true;
|
||||
|
||||
primaries = primariesArr;
|
||||
secondaries = secondariesArr;
|
||||
melees = meleesArr;
|
||||
specialsWep = specialsArr;
|
||||
time = JSON.parse(jsonTime);
|
||||
armor = armorArr;
|
||||
|
||||
let dealItem = new UIMenuListItem("Waffentransport", "", new ItemsCollection(time));
|
||||
dealItem.BackColor = new Color(204, 170, 0);
|
||||
dealItem.HighlightedBackColor = new Color(255, 213, 0);
|
||||
|
||||
weaponMenu = new Menu("Waffenschrank", "Stelle deine Waffenausrüstung zusammen", new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
weaponMenu.AddItem(new UIMenuListItem("Primäre", "", new ItemsCollection(secondaries)));
|
||||
weaponMenu.AddItem(new UIMenuListItem("Sekundäre", "", new ItemsCollection(primaries)));
|
||||
weaponMenu.AddItem(new UIMenuListItem("Nahkampf", "", new ItemsCollection(melees)));
|
||||
weaponMenu.AddItem(new UIMenuListItem("Spezial", "", new ItemsCollection(specialsWep)));
|
||||
weaponMenu.AddItem(new UIMenuListItem("Schutzweste", "", new ItemsCollection(armor)));
|
||||
weaponMenu.AddItem(saveItem);
|
||||
weaponMenu.AddItem(WeaponStockItem);
|
||||
weaponMenu.BindMenuToItem(getWeaponStockMenu(weaponMenu), WeaponStockItem);
|
||||
weaponMenu.AddItem(dealItem);
|
||||
weaponMenu.AddItem(cancelItem);
|
||||
weaponMenu.Visible = true;
|
||||
|
||||
weaponMenu.ListChange.on((item, index) => {
|
||||
switch (item.Text) {
|
||||
case "Primäre":
|
||||
if (item.SelectedItem.DisplayText === "Keine") {
|
||||
primary = "";
|
||||
} else {
|
||||
primary = String(item.SelectedItem.DisplayText);
|
||||
}
|
||||
break;
|
||||
case "Sekundäre":
|
||||
if (item.SelectedItem.DisplayText === "Keine") {
|
||||
secondary = "";
|
||||
} else {
|
||||
secondary = String(item.SelectedItem.DisplayText);
|
||||
}
|
||||
break;
|
||||
case "Nahkampf":
|
||||
if (item.SelectedItem.DisplayText === "Keine") {
|
||||
melee = "";
|
||||
} else {
|
||||
melee = String(item.SelectedItem.DisplayText);
|
||||
}
|
||||
break;
|
||||
case "Spezial":
|
||||
if (item.SelectedItem.DisplayText === "Keine") {
|
||||
specialWep = "";
|
||||
} else {
|
||||
specialWep = String(item.SelectedItem.DisplayText);
|
||||
}
|
||||
break;
|
||||
case "Schutzweste":
|
||||
if (item.SelectedItem.DisplayText === "Keine") {
|
||||
armor = "";
|
||||
} else {
|
||||
armor = String(item.SelectedItem.DisplayText);
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
function getWeaponStockMenu(parentMenu: NativeUI.Menu, ): NativeUI.Menu {
|
||||
var weaponStockMenu = new NativeUI.Menu("Bestand","", new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
var menuItem = new UIMenuItem("Pistol");
|
||||
menuItem.SetRightLabel(pistol_Amount);
|
||||
weaponStockMenu.AddItem(menuItem);
|
||||
var menuItem = new UIMenuItem("Pistol50");
|
||||
menuItem.SetRightLabel(pistol50_Amount);
|
||||
weaponStockMenu.AddItem(menuItem);
|
||||
var menuItem = new UIMenuItem("Pistol_mk2");
|
||||
menuItem.SetRightLabel(Pistol_mk2_Amount);
|
||||
weaponStockMenu.AddItem(menuItem);
|
||||
var menuItem = new UIMenuItem("Combatpistol");
|
||||
menuItem.SetRightLabel(Combatpistol_Amount);
|
||||
weaponStockMenu.AddItem(menuItem);
|
||||
var menuItem = new UIMenuItem("SMG");
|
||||
menuItem.SetRightLabel(SMG_Amount);
|
||||
weaponStockMenu.AddItem(menuItem);
|
||||
var menuItem = new UIMenuItem("Carbinerifle");
|
||||
menuItem.SetRightLabel(Carbinerifle_Amount);
|
||||
weaponStockMenu.AddItem(menuItem);
|
||||
var menuItem = new UIMenuItem("Compactrifle");
|
||||
menuItem.SetRightLabel(Compactrifle_Amount);
|
||||
weaponStockMenu.AddItem(menuItem);
|
||||
var menuItem = new UIMenuItem("Sniperrifle");
|
||||
menuItem.SetRightLabel(sniperrifle_Amount);
|
||||
weaponStockMenu.AddItem(menuItem);
|
||||
var menuItem = new UIMenuItem("Pumpshotgun");
|
||||
menuItem.SetRightLabel(Pumpshotgun_Amount);
|
||||
weaponStockMenu.AddItem(menuItem);
|
||||
var menuItem = new UIMenuItem("Schutzweste");
|
||||
menuItem.SetRightLabel(Schutzweste_Amount);
|
||||
weaponStockMenu.AddItem(menuItem);
|
||||
var menuItem = new UIMenuItem("Stungun");
|
||||
menuItem.SetRightLabel(Stungun_Amount);
|
||||
weaponStockMenu.AddItem(menuItem);
|
||||
weaponStockMenu.Visible = false;
|
||||
return weaponStockMenu;
|
||||
}
|
||||
|
||||
|
||||
weaponMenu.ItemSelect.on((item) => {
|
||||
if (item.Text === "Waffen Nehmen") {
|
||||
mp.events.callRemote("saveWeaponSelection", primary, secondary, melee, specialWep, armor);
|
||||
weaponMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
} else if (item.Text === "Abbrechen") {
|
||||
weaponMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
} else if (item.Text === "Waffentransport") {
|
||||
mp.events.callRemote("startWeaponDeal");
|
||||
weaponMenu.Close();
|
||||
globalData.InMenu = false;
|
||||
}
|
||||
});
|
||||
|
||||
weaponMenu.MenuClose.on(() => {
|
||||
globalData.InMenu = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
45
ReallifeGamemode.Client/ReallifeGamemode.Client.csproj
Normal file
45
ReallifeGamemode.Client/ReallifeGamemode.Client.csproj
Normal file
@@ -0,0 +1,45 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Library</OutputType>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
<ApplicationIcon />
|
||||
<StartupObject />
|
||||
<Configurations>Debug;Release;ServerBuild</Configurations>
|
||||
<Platforms>AnyCPU;x64</Platforms>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="Gui\vehiclemenu\web\**" />
|
||||
<Compile Remove="Jobs\BusDriver\**" />
|
||||
<Compile Remove="tmp\**" />
|
||||
<EmbeddedResource Remove="Gui\vehiclemenu\web\**" />
|
||||
<EmbeddedResource Remove="Jobs\BusDriver\**" />
|
||||
<EmbeddedResource Remove="tmp\**" />
|
||||
<None Remove="Gui\vehiclemenu\web\**" />
|
||||
<None Remove="Jobs\BusDriver\**" />
|
||||
<None Remove="tmp\**" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="assets\css\atm\" />
|
||||
<Folder Include="assets\img\atm\" />
|
||||
<Folder Include="assets\img\items\" />
|
||||
<Folder Include="assets\sound\jobs\busfahrer\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="rage-sharp">
|
||||
<HintPath>..\Import\rage-sharp.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
36
ReallifeGamemode.Client/Save/main.ts
Normal file
36
ReallifeGamemode.Client/Save/main.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Save Main main.js
|
||||
* @author VegaZ
|
||||
* @copyright (c) 2008 - 2018 Life of German
|
||||
*/
|
||||
|
||||
export default function saveData() {
|
||||
var saveBrowser: BrowserMp;
|
||||
|
||||
mp.events.add('saveBlip', () => {
|
||||
|
||||
saveBrowser = mp.browsers.new('package://assets/html/save/blip/index.html');
|
||||
mp.gui.chat.activate(false);
|
||||
mp.gui.cursor.show(true, true);
|
||||
});
|
||||
|
||||
mp.events.add('saveBlipData', (blipSprite, blipName, blipScale, blipColor, blipAlpha, blipDrawDistance, blipShortRange, blipRotation, blipDimension) => {
|
||||
if (saveBrowser) {
|
||||
saveBrowser.destroy();
|
||||
}
|
||||
|
||||
mp.events.callRemote('OnSaveBlipData', blipSprite, blipName, blipScale, blipColor, blipAlpha,
|
||||
blipDrawDistance, blipShortRange, blipRotation, blipDimension);
|
||||
mp.gui.chat.push(blipShortRange);
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.activate(true);
|
||||
});
|
||||
|
||||
mp.events.add('cancelData', () => {
|
||||
if (saveBrowser) {
|
||||
saveBrowser.destroy();
|
||||
}
|
||||
mp.gui.cursor.show(false, false);
|
||||
mp.gui.chat.activate(true);
|
||||
});
|
||||
}
|
||||
89
ReallifeGamemode.Client/Speedometer/index.ts
Normal file
89
ReallifeGamemode.Client/Speedometer/index.ts
Normal file
@@ -0,0 +1,89 @@
|
||||
let player = mp.players.local;
|
||||
|
||||
export default function speedometer(globalData: IGlobalData) {
|
||||
var dictLoaded = false;
|
||||
|
||||
var lockStatus = false;
|
||||
|
||||
mp.events.add('render', () => {
|
||||
if (player.vehicle && !globalData.HideGui) // Check if player is in vehicle and is driver
|
||||
{
|
||||
if (!dictLoaded) {
|
||||
mp.game.graphics.requestStreamedTextureDict("vehicleimages", true);
|
||||
dictLoaded = true;
|
||||
}
|
||||
|
||||
mp.game.graphics.drawRect(0.5, 0.995, 0.35, 0.05, 0, 0, 0, 170);
|
||||
|
||||
var { x, y } = mp.game.graphics.getScreenActiveResolution(0, 0);
|
||||
|
||||
var engineR = 255;
|
||||
var engineG = 255;
|
||||
var engineB = 255;
|
||||
|
||||
if (player.vehicle.getIsEngineRunning()) {
|
||||
engineR = 104;
|
||||
engineG = 212;
|
||||
engineB = 42;
|
||||
} else {
|
||||
engineR = 188;
|
||||
engineG = 25;
|
||||
engineB = 25;
|
||||
}
|
||||
|
||||
let speed = (player.vehicle.getSpeed() * 3.6).toFixed(0);
|
||||
|
||||
var lockSprite = "";
|
||||
var lockR = 255;
|
||||
var lockG = 255;
|
||||
var lockB = 255;
|
||||
|
||||
lockStatus = player.vehicle.getDoorLockStatus() != 1;
|
||||
|
||||
if (lockStatus) {
|
||||
lockR = 188;
|
||||
lockG = 25;
|
||||
lockB = 25;
|
||||
lockSprite = "lockclosed";
|
||||
} else {
|
||||
lockSprite = "lockopen";
|
||||
lockR = 104;
|
||||
lockG = 212;
|
||||
lockB = 42;
|
||||
}
|
||||
|
||||
mp.game.graphics.drawSprite("vehicleimages", "engine", 0.343, 0.985, 0.015, 0.015 * (x / y), 0, engineR, engineG, engineB, 255);
|
||||
|
||||
mp.game.graphics.drawSprite("vehicleimages", lockSprite, 0.37, 0.985, 0.015, 0.015 * (x / y), 0, lockR, lockG, lockB, 255);
|
||||
|
||||
mp.game.graphics.drawText(speed.toString() + " KM/H", [0.41, 0.973], {
|
||||
font: 0,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.35, 0.35],
|
||||
outline: true,
|
||||
centre: false
|
||||
});
|
||||
|
||||
var drivenDistance = player.vehicle.getVariable("drivenDistance");
|
||||
var drivenDistanceStr = "0";
|
||||
if (drivenDistance) drivenDistanceStr = parseFloat(drivenDistance).toFixed(1).toString();
|
||||
mp.game.graphics.drawText(drivenDistanceStr + " KM", [0.48, 0.973], {
|
||||
font: 0,
|
||||
color: [255, 255, 255, 255],
|
||||
scale: [0.35, 0.35],
|
||||
outline: true,
|
||||
centre: false
|
||||
});
|
||||
}
|
||||
else {
|
||||
if (dictLoaded) {
|
||||
mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("vehicleimages");
|
||||
dictLoaded = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("Vehicle_setLockStatus", (status) => {
|
||||
lockStatus = status;
|
||||
});
|
||||
}
|
||||
143
ReallifeGamemode.Client/Tuning/colors.ts
Normal file
143
ReallifeGamemode.Client/Tuning/colors.ts
Normal file
@@ -0,0 +1,143 @@
|
||||
const vehicleColors = {
|
||||
"Klassisch (Util)": {
|
||||
"Schwarz": 15,
|
||||
"Silber": 18,
|
||||
"Dunkelsilber": 17,
|
||||
"Schattensilber": 20,
|
||||
"Metall": 19,
|
||||
"Rot": 43,
|
||||
"Hellrot": 44,
|
||||
"Granatrot": 45,
|
||||
"Gr\u00fcn": 57,
|
||||
"Dunkelgr\u00fcn": 56,
|
||||
"Blau": 77,
|
||||
"Hellblau": 81,
|
||||
"Dunkelblau": 75,
|
||||
"Mitternachtsblau": 76,
|
||||
"Meeresblau": 78,
|
||||
"Leuchtendes Blau": 79,
|
||||
"Braun": 108,
|
||||
"Hellbraun": 109,
|
||||
"Wei\u00df": 122
|
||||
},
|
||||
"Klassisch (Worn)": {
|
||||
"Schwarz": 21,
|
||||
"Graphit Schwarz": 22,
|
||||
"Silber": 24,
|
||||
"Silber Grau": 23,
|
||||
"Silber Blau": 25,
|
||||
"Schattensilber": 26,
|
||||
"Rot": 46,
|
||||
"Dunkelrot": 48,
|
||||
"Goldrot": 47,
|
||||
"Gr\u00fcn": 59,
|
||||
"Dunkelgr\u00fcn": 58,
|
||||
"Blau": 86,
|
||||
"Hellblau": 87,
|
||||
"Dunkelblau": 85,
|
||||
"Babyblau": 157,
|
||||
"Beige": 113,
|
||||
"Braun": 114,
|
||||
"Dunkelbraun": 115,
|
||||
"Wei\u00df 1": 134,
|
||||
"Wei\u00df 2": 121,
|
||||
"Wei\u00df 3": 132,
|
||||
"Orange": 123,
|
||||
"Helleres Orange": 124
|
||||
},
|
||||
"Metallic": {
|
||||
"Schwarz": 0,
|
||||
"Graphit Schwarz": 1,
|
||||
"Schwarzer Stahl": 2,
|
||||
"Dunkles Silber": 3,
|
||||
"Silber": 4,
|
||||
"Blaues Silber": 5,
|
||||
"Grauer Stahl": 6,
|
||||
"Schattensilber": 7,
|
||||
"Steinsilber": 8,
|
||||
"Mitternachtssilber": 9,
|
||||
"Metall": 10,
|
||||
"Anthrazitgrau": 11,
|
||||
"Rot": 27,
|
||||
"Turin Rot": 28,
|
||||
"Formel Rot": 29,
|
||||
"Feuer Rot": 30,
|
||||
"W\u00fcsten Rot": 33,
|
||||
"Lava Rot": 150,
|
||||
"Schwarz Rot": 143,
|
||||
"Orange": 38,
|
||||
"Helleres Orange": 138,
|
||||
"Sonnenaufgang Orange": 36,
|
||||
"Schokoorange": 104,
|
||||
"Gr\u00fcn": 53,
|
||||
"Hellgr\u00fcn": 139,
|
||||
"Dunkelgr\u00fcn": 49,
|
||||
"Renngr\u00fcn": 50,
|
||||
"Meeresgr\u00fcn": 51,
|
||||
"Olivgr\u00fcn": 52,
|
||||
"Limettengr\u00fcn": 92,
|
||||
"Blau": 64,
|
||||
"Dunkelblau": 62,
|
||||
"Hellblau": 70,
|
||||
"Mitternachtsblau": 61,
|
||||
"Babyblau": 140,
|
||||
"Marineblau": 65,
|
||||
"Hafenblau": 66,
|
||||
"Diamantblau": 67,
|
||||
"Surfblau": 68,
|
||||
"Nautisches Blau": 69,
|
||||
"Lila Blau": 71,
|
||||
"Ultra Blau": 73,
|
||||
"Schwarz Blau": 141,
|
||||
"Gelb": 88,
|
||||
"Renngelb": 89,
|
||||
"Vogelgelb": 91,
|
||||
"Champagner Grau": 93,
|
||||
"Pueblo Beige": 94,
|
||||
"Schokobraun": 96,
|
||||
"Goldbraun": 97,
|
||||
"Hellbraun": 98,
|
||||
"Moosbraun": 100,
|
||||
"Wei\u00df": 111,
|
||||
"Sahnewei\u00df": 107,
|
||||
"Frostwei\u00df": 112,
|
||||
"Pink": 137,
|
||||
"Lila": 145,
|
||||
"Schwarz Lila": 142
|
||||
},
|
||||
"Matt": {
|
||||
"Schwarz": 12,
|
||||
"Grau": 13,
|
||||
"Hellgrau": 14,
|
||||
"Rot": 39,
|
||||
"Dunkelrot": 40,
|
||||
"Orange": 41,
|
||||
"Gelb": 42,
|
||||
"Limonengr\u00fcn": 55,
|
||||
"Blau": 83,
|
||||
"Dunkelblau": 82,
|
||||
"Mitternachtsblau": 61,
|
||||
"Gr\u00fcn": 128,
|
||||
"Waldgr\u00fcn": 151,
|
||||
"Laubgr\u00fcn": 155,
|
||||
"Olivgr\u00fcn": 152,
|
||||
"Braun": 129,
|
||||
"Wei\u00df": 131,
|
||||
"Lila": 148,
|
||||
"Dunkellila": 149,
|
||||
"W\u00fcstenbraun": 153,
|
||||
"W\u00fcstenbr<62>une": 154
|
||||
},
|
||||
"Spezial": {
|
||||
"Geb\u00fcrsteter Stahl": 117,
|
||||
"Geb\u00fcrsteter schwarzer Stahl": 118,
|
||||
"Geb\u00fcrstetes Aluminium": 119,
|
||||
"Geb\u00fcrstetes Gold": 159,
|
||||
"Gold": 37,
|
||||
"Pures Gold": 158,
|
||||
"Chrome": 120,
|
||||
"Bronze": 90
|
||||
}
|
||||
};
|
||||
|
||||
export default vehicleColors;
|
||||
555
ReallifeGamemode.Client/Tuning/main.ts
Normal file
555
ReallifeGamemode.Client/Tuning/main.ts
Normal file
@@ -0,0 +1,555 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Tuning tuning.js
|
||||
* @author hydrant
|
||||
* @copyright (c) 2008 - 2018 Life of German
|
||||
*/
|
||||
|
||||
import * as NativeUI from '../libs/NativeUI';
|
||||
const Menu = NativeUI.Menu;
|
||||
const UIMenuItem = NativeUI.UIMenuItem;
|
||||
const BadgeStyle = NativeUI.BadgeStyle;
|
||||
const Point = NativeUI.Point;
|
||||
const Color = NativeUI.Color;
|
||||
let screenRes = mp.game.graphics.getScreenResolution(0, 0);
|
||||
import vehicleColors from './colors';
|
||||
|
||||
export default function tuning(globalData: IGlobalData) {
|
||||
var keyBound = false;
|
||||
|
||||
var currentPrimaryColor: number;
|
||||
var currentSecondaryColor: number;
|
||||
|
||||
const disableInput = [75, 278, 279, 280, 281, 23, 59, 60, 71, 72, 74];
|
||||
|
||||
const carModTypes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 22, -1, 25, 27, 28, 33, 34, 35, 38, 39, 40, 41, 42, 43, 44, 46, 48, 69];
|
||||
|
||||
const carModSlotName = [
|
||||
{ Slot: 0, Name: "Spoiler", Price: 2000 },
|
||||
{ Slot: 1, Name: "Frontstoßstange", Price: 2000},
|
||||
{ Slot: 2, Name: "Heckstoßstange", Price: 2000 },
|
||||
{ Slot: 3, Name: "Seitenschweller", Price: 2000 },
|
||||
{ Slot: 4, Name: "Auspuff", Price: 2000 },
|
||||
{ Slot: 5, Name: "Rahmen", Price: 2000 },
|
||||
{ Slot: 6, Name: "Kühlergrill", Price: 2000 },
|
||||
{ Slot: 7, Name: "Motorhaube", Price: 2000 },
|
||||
{ Slot: 8, Name: "Extra 1", Price: 2000 },
|
||||
{ Slot: 9, Name: "Extra 2", Price: 2000 },
|
||||
{ Slot: 10, Name: "Dach", Price: 2000 },
|
||||
{ Slot: 11, Name: "Motor", Price: 2000 },
|
||||
{ Slot: 12, Name: "Bremsen", Price: 2000 },
|
||||
{ Slot: 13, Name: "Getriebe", Price: 2000 },
|
||||
{ Slot: 14, Name: "Hupe", Price: 2000 },
|
||||
{ Slot: 15, Name: "Federung", Price: 2000 },
|
||||
{ Slot: 18, Name: "Turbo", Price: 2000 },
|
||||
{ Slot: 22, Name: "Licht", Price: 2000 },
|
||||
{ Slot: 23, Name: "Reifen", Price: 2000 },
|
||||
{ Slot: -1, Name: "Lackierung", Price: 2000 },
|
||||
{ Slot: 25, Name: "Nummernschildhalter", Price: 2000 },
|
||||
{ Slot: 27, Name: "Innenausstatung", Price: 2000 },
|
||||
{ Slot: 28, Name: "Wackelkopf", Price: 2000 },
|
||||
{ Slot: 33, Name: "Lenkrad", Price: 2000 },
|
||||
{ Slot: 34, Name: "Schalthebel", Price: 2000 },
|
||||
{ Slot: 35, Name: "Schild", Price: 2000 },
|
||||
{ Slot: 38, Name: "Hydraulik", Price: 2000 },
|
||||
{ Slot: 39, Name: "Motorabdeckung", Price: 2000 },
|
||||
{ Slot: 40, Name: "Luftfilter", Price: 2000 },
|
||||
{ Slot: 46, Name: "Fenster", Price: 2000 },
|
||||
{ Slot: 48, Name: "Design", Price: 2000 }
|
||||
];
|
||||
|
||||
const customPartNames = [
|
||||
{
|
||||
Model: 1093792632,
|
||||
Names: [
|
||||
{
|
||||
Slot: 8,
|
||||
Name: "Lüftungsschlitze"
|
||||
},
|
||||
{
|
||||
Slot: 43,
|
||||
Name: "Motorhaubenstifte"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
Model: 223240013,
|
||||
Names: [
|
||||
{
|
||||
Slot: 9,
|
||||
Name: "Heckkotflügel"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
Model: 1031562256,
|
||||
Names: [
|
||||
{
|
||||
Slot: 5,
|
||||
Name: "Stoßdämpfer"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
Model: 3308022675,
|
||||
Names: [
|
||||
{
|
||||
Slot: 9,
|
||||
Name: "Kotflügel"
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
const doorOpeners = [
|
||||
{
|
||||
Model: 3308022675,
|
||||
Doors: [
|
||||
{
|
||||
Slot: 5,
|
||||
Door: 4
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
var mainMenu: NativeUI.Menu;
|
||||
|
||||
mp.events.add('showTuningInfo', () => {
|
||||
//mp.game.ui.setTextComponentFormat('STRING');
|
||||
//mp.game.ui.addTextComponentSubstringPlayerName('Drücke ~INPUT_CONTEXT~, um dein Fahrzeug zu modifizieren');
|
||||
//mp.game.ui.displayHelpTextFromStringLabel(0, true, true, -1);
|
||||
|
||||
mp.events.call("renderHelpTextOnScreen", "~s~Drücke ~g~E ~s~um dein Fahrzeug zu modifizieren")
|
||||
|
||||
mp.keys.bind(0x45, false, keyPressHandler);
|
||||
keyBound = true;
|
||||
});
|
||||
|
||||
mp.events.add('hideTuningInfo', (unbind) => {
|
||||
mp.game.ui.clearHelp(true);
|
||||
mp.gui.chat.show(true);
|
||||
|
||||
if (mp.players.local.vehicle) {
|
||||
mp.players.local.vehicle.setLights(0);
|
||||
}
|
||||
|
||||
if (typeof mainMenu !== "undefined" && unbind) {
|
||||
mainMenu.Close();
|
||||
globalData.InTuning = false;
|
||||
}
|
||||
|
||||
if (keyBound && unbind) {
|
||||
mp.keys.unbind(0x45, false, keyPressHandler);
|
||||
keyBound = false;
|
||||
}
|
||||
});
|
||||
|
||||
function keyPressHandler() {
|
||||
mp.events.callRemote("startPlayerTuning");
|
||||
}
|
||||
|
||||
mp.events.add("render", () => {
|
||||
if (globalData.InTuning) {
|
||||
disableInput.forEach((input) => {
|
||||
mp.game.controls.disableControlAction(1, input, true);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add("showTuningMenu", () => {
|
||||
mp.events.call("hideTuningInfo", false);
|
||||
mp.gui.chat.show(false);
|
||||
|
||||
var localPlayer = mp.players.local;
|
||||
var localVehicle = localPlayer.vehicle;
|
||||
|
||||
localVehicle.setHalt(1.0, 1, false);
|
||||
|
||||
globalData.InMenu = true;
|
||||
globalData.InTuning = true;
|
||||
|
||||
localVehicle.setLights(1);
|
||||
var carName = mp.game.ui.getLabelText(mp.game.vehicle.getDisplayNameFromVehicleModel(localVehicle.model));
|
||||
|
||||
mainMenu = new Menu("Fahrzeugwerkstatt", carName, new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
var repairItem = new UIMenuItem("Fahrzeug reparieren");
|
||||
mainMenu.AddItem(repairItem);
|
||||
repairItem.BackColor = new Color(94, 94, 94);
|
||||
repairItem.HighlightedBackColor = new Color(105, 105, 105);
|
||||
|
||||
var currentMod = new Array<number>();
|
||||
var currentActiveModItem = new Array<NativeUI.UIMenuItem>();
|
||||
|
||||
carModTypes.forEach((modType) => {
|
||||
|
||||
var mod = null;
|
||||
|
||||
if (modType === 22) { // Lichter
|
||||
var hlColor = localVehicle.getVariable("headlightColor");
|
||||
if (typeof hlColor !== "number" || isNaN(hlColor) || hlColor < 0 || hlColor === 255) {
|
||||
mod = -1;
|
||||
} else if (hlColor === 13) mod = 0;
|
||||
else mod = hlColor + 1;
|
||||
} else if (modType === 18) { // Turbo
|
||||
var toggle = localVehicle.isToggleModOn(modType);
|
||||
mod = toggle ? 0 : -1;
|
||||
} else if (modType == -1) { // Lackierungen
|
||||
var colorItem = new UIMenuItem("Lackierungen");
|
||||
var colorMenu = getColorMenu();
|
||||
|
||||
mainMenu.AddItem(colorItem);
|
||||
mainMenu.BindMenuToItem(colorMenu, colorItem);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var num = localVehicle.getNumMods(modType);
|
||||
|
||||
if (num === 0 && modType !== 18 && modType !== 22 && modType !== -1) return;
|
||||
|
||||
var modName = localVehicle.getModSlotName(modType) || "nix gefunden";
|
||||
modName = mp.game.ui.getLabelText(modName);
|
||||
|
||||
if (modName === "NULL") {
|
||||
for (var x = 0; x < carModSlotName.length; x++) {
|
||||
var tmpSlot = carModSlotName[x];
|
||||
if (tmpSlot.Slot == modType) {
|
||||
modName = tmpSlot.Name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mod === null) {
|
||||
mod = localVehicle.getMod(modType);
|
||||
}
|
||||
|
||||
var modNum = localVehicle.getNumMods(modType);
|
||||
if (modType === 18) modNum = 1;
|
||||
if (modType === 22) modNum = 14;
|
||||
|
||||
var modMenu = new Menu(modName, carName, new Point(0, screenRes.y / 3), null, null);
|
||||
|
||||
modMenu.Visible = false;
|
||||
|
||||
var menuItem = new UIMenuItem(modName);
|
||||
mainMenu.AddItem(menuItem);
|
||||
mainMenu.BindMenuToItem(modMenu, menuItem);
|
||||
|
||||
currentMod[modType] = mod;
|
||||
|
||||
for (var x = -1; x < modNum; x++) {
|
||||
var modText = "";
|
||||
if (x === -1) {
|
||||
modText = "Serie";
|
||||
} else {
|
||||
modText = mp.game.ui.getLabelText(localVehicle.getModTextLabel(modType, x));
|
||||
if (modText === "NULL") modText = getModName(localVehicle, modType, x);
|
||||
}
|
||||
var item = new UIMenuItem(modText);
|
||||
modMenu.AddItem(item);
|
||||
|
||||
if (x === mod) {
|
||||
item.SetRightBadge(BadgeStyle.Car);
|
||||
currentActiveModItem[modType] = item;
|
||||
modMenu.CurrentSelection = x;
|
||||
}
|
||||
}
|
||||
|
||||
modMenu.IndexChange.on((index: number) => {
|
||||
if (modType === 18) return;
|
||||
if (modType === 22) {
|
||||
setHeadlightsColor(localVehicle, index);
|
||||
return;
|
||||
}
|
||||
localVehicle.setMod(modType, index - 1);
|
||||
});
|
||||
|
||||
modMenu.MenuOpen.on(() => {
|
||||
if (modType === 22) {
|
||||
localVehicle.setLights(2);
|
||||
}
|
||||
});
|
||||
|
||||
modMenu.ItemSelect.on((item: NativeUI.UIMenuItem, index: number) => {
|
||||
currentMod[modType] = index - 1;
|
||||
currentActiveModItem[modType].SetRightBadge(BadgeStyle.None);
|
||||
item.SetRightBadge(BadgeStyle.Car);
|
||||
currentActiveModItem[modType] = item;
|
||||
|
||||
mp.events.callRemote("setVehicleMod", modType, index);
|
||||
});
|
||||
|
||||
modMenu.MenuClose.on(() => {
|
||||
if (modType === 18) return;
|
||||
if (modType === 22) {
|
||||
localVehicle.setLights(1);
|
||||
setHeadlightsColor(localVehicle, currentMod[22] + 1);
|
||||
return;
|
||||
}
|
||||
localVehicle.setMod(modType, currentMod[modType]);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
mainMenu.ItemSelect.on((item: NativeUI.UIMenuItem, index: number) => {
|
||||
if (item === repairItem) {
|
||||
mp.events.callRemote("repairVehicle");
|
||||
};
|
||||
});
|
||||
|
||||
mainMenu.Visible = true;
|
||||
|
||||
mainMenu.MenuClose.on(() => {
|
||||
localVehicle.setLights(0);
|
||||
globalData.InTuning = false;
|
||||
globalData.InMenu = false;
|
||||
mp.events.call("hideTuningInfo", false);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
mp.events.add("playerLeaveVehicle", () => {
|
||||
if (keyBound) {
|
||||
mp.events.call("hideTuningInfo", true);
|
||||
}
|
||||
});
|
||||
|
||||
function getModName(vehicle: VehicleMp, slot: number, mod: number) {
|
||||
var modName = vehicle.getModTextLabel(slot, mod);
|
||||
var realModName = mp.game.ui.getLabelText(modName);
|
||||
|
||||
if (slot === 11) {
|
||||
switch (mod) {
|
||||
case 0:
|
||||
realModName = "EMS Verbesserung 1";
|
||||
break;
|
||||
case 1:
|
||||
realModName = "EMS Verbesserung 2";
|
||||
break;
|
||||
case 2:
|
||||
realModName = "EMS Verbesserung 3";
|
||||
break;
|
||||
case 3:
|
||||
realModName = "EMS Verbesserung 4";
|
||||
break;
|
||||
}
|
||||
} else if (slot === 12) {
|
||||
switch (mod) {
|
||||
case 0:
|
||||
realModName = "Straßenbremsen";
|
||||
break;
|
||||
case 1:
|
||||
realModName = "Sportbremsen";
|
||||
break;
|
||||
case 2:
|
||||
realModName = "Rennbremsen";
|
||||
break;
|
||||
case 3:
|
||||
realModName = "Wettkampfbremsen";
|
||||
break;
|
||||
}
|
||||
} else if (slot === 13) {
|
||||
switch (mod) {
|
||||
case 0:
|
||||
realModName = "Straßengetriebe";
|
||||
break;
|
||||
case 1:
|
||||
realModName = "Sportgetriebe";
|
||||
break;
|
||||
case 2:
|
||||
realModName = "Renngetriebe";
|
||||
break;
|
||||
case 3:
|
||||
realModName = "Wettkampfgetriebe";
|
||||
}
|
||||
} else if (slot === 15) {
|
||||
switch (mod) {
|
||||
case 0:
|
||||
realModName = "Tiefere Federung";
|
||||
break;
|
||||
case 1:
|
||||
realModName = "Straßenfederung";
|
||||
break;
|
||||
case 2:
|
||||
realModName = "Sportfederung";
|
||||
break;
|
||||
case 3:
|
||||
realModName = "Rennfederung";
|
||||
break;
|
||||
case 4:
|
||||
realModName = "Wettkampffederung";
|
||||
break;
|
||||
}
|
||||
} else if (slot === 18) {
|
||||
realModName = "Turbotuning";
|
||||
} else if (slot === 22) {
|
||||
switch (mod) {
|
||||
case 0:
|
||||
realModName = "Xenon Licht";
|
||||
break;
|
||||
case 1:
|
||||
realModName = "Weißes Licht";
|
||||
break;
|
||||
case 2:
|
||||
realModName = "Blaues Licht";
|
||||
break;
|
||||
case 3:
|
||||
realModName = "Hell-blaues Licht";
|
||||
break;
|
||||
case 4:
|
||||
realModName = "Grünes Licht";
|
||||
break;
|
||||
case 5:
|
||||
realModName = "Hell-grünes Licht";
|
||||
break;
|
||||
case 6:
|
||||
realModName = "Hell-gelbes Licht";
|
||||
break;
|
||||
case 7:
|
||||
realModName = "Gelbes Licht";
|
||||
break;
|
||||
case 8:
|
||||
realModName = "Orangenes Licht";
|
||||
break;
|
||||
case 9:
|
||||
realModName = "Rotes Licht";
|
||||
break;
|
||||
case 10:
|
||||
realModName = "Hell-pinkes Licht";
|
||||
break;
|
||||
case 11:
|
||||
realModName = "Pinkes Licht";
|
||||
break;
|
||||
case 12:
|
||||
realModName = "Lila Licht";
|
||||
break;
|
||||
case 13:
|
||||
realModName = "Schwarzlicht";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return realModName;
|
||||
}
|
||||
|
||||
function setHeadlightsColor(vehicle, index) {
|
||||
|
||||
if (!vehicle) {
|
||||
return;
|
||||
}
|
||||
|
||||
var color = index - 2;
|
||||
if (index === 0) color = -1;
|
||||
if (index === 1) color = 13;
|
||||
if (typeof color !== "number" || isNaN(color) || color < 0 || color === 255) {
|
||||
// Disable
|
||||
vehicle.toggleMod(22, false);
|
||||
mp.game.invoke("0xE41033B25D003A07", vehicle.handle, 255);
|
||||
} else {
|
||||
// Enable
|
||||
vehicle.toggleMod(22, true);
|
||||
mp.game.invoke("0xE41033B25D003A07", vehicle.handle, color);
|
||||
}
|
||||
}
|
||||
|
||||
function getColorMenu(): NativeUI.Menu {
|
||||
var currentColors = mp.players.local.vehicle.getColours(0, 0);
|
||||
|
||||
currentPrimaryColor = currentColors.colorPrimary;
|
||||
currentSecondaryColor = currentColors.colorSecondary;
|
||||
|
||||
var primaryColor = getSingleColorMenu("Primärfarbe", currentPrimaryColor, primaryColorSelect, primaryColorChange);
|
||||
var secondaryColor = getSingleColorMenu("Sekundärfarbe", currentSecondaryColor, secondaryColorSelect, secondaryColorChange);
|
||||
|
||||
var menu = new Menu("Lackierungen", "Ändere die Farbe deines Fahrzeugs", new Point(0, screenRes.y / 3));
|
||||
|
||||
var primaryColorItem = new UIMenuItem("Primärfarbe");
|
||||
var secondaryColorItem = new UIMenuItem("Sekundärfarbe");
|
||||
|
||||
secondaryColor.MenuClose.on(() => {
|
||||
mp.players.local.vehicle.setColours(currentPrimaryColor, currentSecondaryColor);
|
||||
});
|
||||
|
||||
primaryColor.MenuClose.on(() => {
|
||||
mp.players.local.vehicle.setColours(currentPrimaryColor, currentSecondaryColor);
|
||||
});
|
||||
|
||||
menu.AddItem(primaryColorItem);
|
||||
menu.AddItem(secondaryColorItem);
|
||||
|
||||
menu.BindMenuToItem(primaryColor, primaryColorItem);
|
||||
menu.BindMenuToItem(secondaryColor, secondaryColorItem);
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
function getSingleColorMenu(title: string, currentColor: number, onSelect: (color: number) => void, onChange: (color: number) => void): NativeUI.Menu {
|
||||
var menu = new Menu(title, "Ändere die Farbe deines Fahrzeugs", new Point(0, screenRes.y / 3));
|
||||
|
||||
var colorCategories = Object.keys(vehicleColors);
|
||||
|
||||
var currentColorItem: NativeUI.UIMenuItem = null;
|
||||
|
||||
colorCategories.forEach(category => {
|
||||
var categoryItem = new UIMenuItem(category);
|
||||
menu.AddItem(categoryItem);
|
||||
|
||||
var categoryMenu = new Menu(category, "Ändere die Farbe deines Fahrzeugs", new Point(0, screenRes.y / 3));
|
||||
|
||||
var categoryColors = Object.keys(vehicleColors[category]);
|
||||
categoryColors.forEach(categoryColor => {
|
||||
var color = vehicleColors[category][categoryColor];
|
||||
|
||||
var colorItem = new UIMenuItem(categoryColor);
|
||||
colorItem.Data = color;
|
||||
|
||||
if (color === currentColor) {
|
||||
colorItem.SetRightBadge(BadgeStyle.Car);
|
||||
currentColorItem = colorItem;
|
||||
}
|
||||
|
||||
categoryMenu.AddItem(colorItem);
|
||||
});
|
||||
|
||||
menu.BindMenuToItem(categoryMenu, categoryItem);
|
||||
|
||||
categoryMenu.IndexChange.on((index, item: NativeUI.UIMenuItem) => {
|
||||
onChange(<number>item.Data);
|
||||
});
|
||||
|
||||
categoryMenu.ItemSelect.on((item: NativeUI.UIMenuItem, index: number) => {
|
||||
currentColorItem.SetRightBadge(BadgeStyle.None);
|
||||
|
||||
item.SetRightBadge(BadgeStyle.Car);
|
||||
currentColorItem = item;
|
||||
|
||||
onSelect(<number>item.Data);
|
||||
});
|
||||
});
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
function primaryColorChange(color: number) {
|
||||
mp.players.local.vehicle.setColours(color, currentSecondaryColor);
|
||||
}
|
||||
|
||||
function primaryColorSelect(color: number) {
|
||||
currentPrimaryColor = color;
|
||||
|
||||
mp.events.callRemote("CLIENT:TuningManager_SetVehicleColor", true, color);
|
||||
}
|
||||
|
||||
function secondaryColorChange(color: number) {
|
||||
mp.players.local.vehicle.setColours(currentPrimaryColor, color);
|
||||
}
|
||||
|
||||
function secondaryColorSelect(color: number) {
|
||||
currentSecondaryColor = color;
|
||||
|
||||
mp.events.callRemote("CLIENT:TuningManager_SetVehicleColor", false, color);
|
||||
}
|
||||
}
|
||||
25
ReallifeGamemode.Client/Tuning/sirensilence.ts
Normal file
25
ReallifeGamemode.Client/Tuning/sirensilence.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
export default function sirenSilence() {
|
||||
mp.keys.bind(0x42, true, _ => {
|
||||
mp.events.callRemote("keyPress:B:toggleSiren");
|
||||
});
|
||||
|
||||
mp.events.add('toggleVehicleSiren', (vehicle, state) => {
|
||||
if (!vehicle) {
|
||||
return;
|
||||
}
|
||||
|
||||
vehicle.setSirenSound(state);
|
||||
});
|
||||
|
||||
mp.events.add('entityStreamIn', (entity) => {
|
||||
if (!entity) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (entity.isAVehicle()) {
|
||||
var state = entity.getVariable("sirenSound");
|
||||
if (state === undefined) return;
|
||||
entity.setSirenSound(state);
|
||||
}
|
||||
});
|
||||
}
|
||||
35
ReallifeGamemode.Client/Tuning/sync.ts
Normal file
35
ReallifeGamemode.Client/Tuning/sync.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
export default function tuningSync() {
|
||||
mp.events.add('entityStreamIn', (entity: EntityMp) => {
|
||||
if (!entity) {
|
||||
return;
|
||||
}
|
||||
if (entity.isAVehicle()) {
|
||||
|
||||
var vehicle: VehicleMp = entity as VehicleMp;
|
||||
|
||||
var taxiLight = entity.getVariable("vehicleTaxiLight");
|
||||
if (taxiLight) vehicle.setTaxiLights(taxiLight);
|
||||
|
||||
var mod18 = vehicle.getVariable('mod18');
|
||||
|
||||
if (mod18 !== undefined) {
|
||||
vehicle.toggleMod(18, mod18);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
mp.events.add('vehicleToggleMod', (veh, slot, newval) => {
|
||||
if (!veh) {
|
||||
return;
|
||||
}
|
||||
|
||||
veh.toggleMod(slot, newval);
|
||||
});
|
||||
|
||||
mp.events.addDataHandler("vehicleTaxiLight", (entity: VehicleMp, state: boolean) => {
|
||||
if (!entity) {
|
||||
return;
|
||||
}
|
||||
entity.setTaxiLights(state);
|
||||
});
|
||||
}
|
||||
103
ReallifeGamemode.Client/Voice/main.ts
Normal file
103
ReallifeGamemode.Client/Voice/main.ts
Normal file
@@ -0,0 +1,103 @@
|
||||
/**
|
||||
* @overview Life of German Reallife - Voice Main main.ts
|
||||
* @author Zeuto
|
||||
* @copyright (c) 2008 - 2019 Life of German
|
||||
*/
|
||||
|
||||
export default function voice(globalData: IGlobalData) {
|
||||
|
||||
let dictLoaded = false;
|
||||
const Use3d = true;
|
||||
const UseAutoVolume = false;
|
||||
const MaxRange = 30.0;
|
||||
|
||||
mp.voiceChat.muted = true; // initialize muted
|
||||
|
||||
var listeners: Array<PlayerMp> = new Array<PlayerMp>();
|
||||
|
||||
mp.keys.bind(0x73, false, _ => {
|
||||
mp.voiceChat.muted = !mp.voiceChat.muted;
|
||||
});
|
||||
|
||||
let gX = 0.5;
|
||||
let gY = 0.5;
|
||||
|
||||
mp.events.add('render', () => {
|
||||
|
||||
if (globalData.LoggedIn) {
|
||||
if (!dictLoaded) {
|
||||
mp.game.graphics.requestStreamedTextureDict("voiceimages", true);
|
||||
dictLoaded = true;
|
||||
}
|
||||
|
||||
var { x, y } = mp.game.graphics.getScreenActiveResolution(0, 0);
|
||||
|
||||
if (!mp.voiceChat.muted) {
|
||||
mp.game.graphics.drawSprite("voiceimages", "microphone-black-shape", 0.165, 0.952, 0.015, 0.015 * (x / y), 0, 0, 102, 0, 255);
|
||||
} else {
|
||||
mp.game.graphics.drawSprite("voiceimages", "microphone-off", 0.165, 0.952, 0.015, 0.015 * (x / y), 0, 255, 51, 51, 255);
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
function addListener(target: PlayerMp) {
|
||||
|
||||
listeners.push(target);
|
||||
mp.events.callRemote("CLIENT:AddVoiceListener", target);
|
||||
|
||||
if (UseAutoVolume) {
|
||||
target.voiceAutoVolume = true;
|
||||
} else {
|
||||
target.voiceVolume = 1.0;
|
||||
}
|
||||
if (Use3d) {
|
||||
target.voice3d = true;
|
||||
}
|
||||
}
|
||||
|
||||
function removeListener(target: PlayerMp) {
|
||||
let idx = listeners.indexOf(target)
|
||||
|
||||
if (idx !== -1) {
|
||||
listeners.splice(idx, 1);
|
||||
}
|
||||
|
||||
mp.events.callRemote("CLIENT:RemoveVoiceListener");
|
||||
}
|
||||
|
||||
setInterval(() => {
|
||||
let localPlayer = mp.players.local;
|
||||
let localPos = localPlayer.position;
|
||||
|
||||
mp.players.forEachInStreamRange(player => {
|
||||
if (player != localPlayer) {
|
||||
if (!listeners.includes(player)) {
|
||||
const playerPos = player.position;
|
||||
let dist = mp.game.system.vdist(playerPos.x, playerPos.y, playerPos.z, localPos.x, localPos.y, localPos.z);
|
||||
|
||||
if (dist <= MaxRange) {
|
||||
addListener(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
listeners.forEach((player: PlayerMp) => {
|
||||
if (player) {
|
||||
if (player.handle !== 0) {
|
||||
const playerPos = player.position;
|
||||
let dist = mp.game.system.vdist(playerPos.x, playerPos.y, playerPos.z, localPos.x, localPos.y, localPos.z);
|
||||
|
||||
if (dist > MaxRange) {
|
||||
removeListener(player);
|
||||
} else if (!UseAutoVolume) {
|
||||
player.voiceVolume = 1 - (dist / MaxRange);
|
||||
}
|
||||
}
|
||||
else {
|
||||
removeListener(player);
|
||||
}
|
||||
}
|
||||
})
|
||||
}, 500)
|
||||
}
|
||||
21
ReallifeGamemode.Client/admin/aspeed.ts
Normal file
21
ReallifeGamemode.Client/admin/aspeed.ts
Normal file
@@ -0,0 +1,21 @@
|
||||
import { VehicleSeat } from "../game";
|
||||
|
||||
export default function () {
|
||||
|
||||
var TorqueEntity
|
||||
var TorqueValue = 1;
|
||||
mp.events.addDataHandler("vehicleAdminSpeed", (entity, newValue) => {
|
||||
if (!entity.isAVehicle()) return;
|
||||
entity.setEnginePowerMultiplier(newValue);
|
||||
});
|
||||
mp.events.addDataHandler("vehicleAdminSpeed2", (entity, newValue2) => {
|
||||
if (!entity.isAVehicle()) return;
|
||||
//entity.setEngineTorqueMultiplier(newValue2);
|
||||
TorqueEntity = entity;
|
||||
TorqueValue = newValue2;
|
||||
});
|
||||
/*mp.events.add('render', () => {
|
||||
let vehicle = mp.players.local.vehicle;
|
||||
vehicle.setEngineTorqueMultiplier(1.5); // Multiplies by 1.5 the engine torque
|
||||
});*/
|
||||
}
|
||||
116
ReallifeGamemode.Client/assets/css/Introduction/style.css
Normal file
116
ReallifeGamemode.Client/assets/css/Introduction/style.css
Normal file
@@ -0,0 +1,116 @@
|
||||
html {
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
*, *::before, *::after {
|
||||
-webkit-box-sizing: inherit;
|
||||
box-sizing: inherit;
|
||||
}
|
||||
|
||||
body {
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-box-direction: normal;
|
||||
-ms-flex-direction: column;
|
||||
flex-direction: column;
|
||||
-webkit-box-pack: center;
|
||||
-ms-flex-pack: center;
|
||||
justify-content: center;
|
||||
height: 100vh;
|
||||
width: -webkit-fit-content;
|
||||
width: -moz-fit-content;
|
||||
width: fit-content;
|
||||
margin: 0 auto;
|
||||
padding: 1em .5em;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
|
||||
font-weight: 400;
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
main {
|
||||
height: auto;
|
||||
position: relative;
|
||||
min-width: 50ch;
|
||||
max-width: 35vw;
|
||||
padding: 1em;
|
||||
border-radius: .25em;
|
||||
font-size: 1em;
|
||||
line-height: 1.25;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
main a#close {
|
||||
position: absolute;
|
||||
right: 1em;
|
||||
top: 1em;
|
||||
height: 1em;
|
||||
width: 1em;
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
main a#close:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
main a#close:before, main a#close:after {
|
||||
content: ' ';
|
||||
position: absolute;
|
||||
left: .5em;
|
||||
height: 1em;
|
||||
width: 2px;
|
||||
background-color: #FFF;
|
||||
border-radius: 1px;
|
||||
}
|
||||
|
||||
main a#close:before {
|
||||
-webkit-transform: rotate(45deg);
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
|
||||
main a#close:after {
|
||||
-webkit-transform: rotate(-45deg);
|
||||
transform: rotate(-45deg);
|
||||
}
|
||||
|
||||
main h1, main p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
main h1 {
|
||||
font-size: 1.5em;
|
||||
line-height: 1;
|
||||
margin-bottom: .125em;
|
||||
padding-right: 1em;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
main p {
|
||||
margin-bottom: 1em;
|
||||
line-height: 1.125;
|
||||
}
|
||||
|
||||
main .form {
|
||||
margin-top: .25em;
|
||||
}
|
||||
|
||||
main .form input {
|
||||
width: 100%;
|
||||
padding: .5em;
|
||||
font-family: "Roboto Mono";
|
||||
font-weight: 500;
|
||||
font-size: 1em;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
background-color: rgba(0, 0, 0, 0.125);
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
main .form input:focus {
|
||||
outline-width: 0;
|
||||
}
|
||||
116
ReallifeGamemode.Client/assets/css/School/style.css
Normal file
116
ReallifeGamemode.Client/assets/css/School/style.css
Normal file
@@ -0,0 +1,116 @@
|
||||
html {
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
*, *::before, *::after {
|
||||
-webkit-box-sizing: inherit;
|
||||
box-sizing: inherit;
|
||||
}
|
||||
|
||||
body {
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-box-direction: normal;
|
||||
-ms-flex-direction: column;
|
||||
flex-direction: column;
|
||||
-webkit-box-pack: center;
|
||||
-ms-flex-pack: center;
|
||||
justify-content: center;
|
||||
height: 100vh;
|
||||
width: -webkit-fit-content;
|
||||
width: -moz-fit-content;
|
||||
width: fit-content;
|
||||
margin: 0 auto;
|
||||
padding: 1em .5em;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
|
||||
font-weight: 400;
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
main {
|
||||
height: auto;
|
||||
position: relative;
|
||||
min-width: 50ch;
|
||||
max-width: 35vw;
|
||||
padding: 1em;
|
||||
border-radius: .25em;
|
||||
font-size: 1em;
|
||||
line-height: 1.25;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
main a#close {
|
||||
position: absolute;
|
||||
right: 1em;
|
||||
top: 1em;
|
||||
height: 1em;
|
||||
width: 1em;
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
main a#close:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
main a#close:before, main a#close:after {
|
||||
content: ' ';
|
||||
position: absolute;
|
||||
left: .5em;
|
||||
height: 1em;
|
||||
width: 2px;
|
||||
background-color: #FFF;
|
||||
border-radius: 1px;
|
||||
}
|
||||
|
||||
main a#close:before {
|
||||
-webkit-transform: rotate(45deg);
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
|
||||
main a#close:after {
|
||||
-webkit-transform: rotate(-45deg);
|
||||
transform: rotate(-45deg);
|
||||
}
|
||||
|
||||
main h1, main p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
main h1 {
|
||||
font-size: 1.5em;
|
||||
line-height: 1;
|
||||
margin-bottom: .125em;
|
||||
padding-right: 1em;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
main p {
|
||||
margin-bottom: 1em;
|
||||
line-height: 1.125;
|
||||
}
|
||||
|
||||
main .form {
|
||||
margin-top: .25em;
|
||||
}
|
||||
|
||||
main .form input {
|
||||
width: 100%;
|
||||
padding: .5em;
|
||||
font-family: "Roboto Mono";
|
||||
font-weight: 500;
|
||||
font-size: 1em;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
background-color: rgba(0, 0, 0, 0.125);
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
main .form input:focus {
|
||||
outline-width: 0;
|
||||
}
|
||||
580
ReallifeGamemode.Client/assets/css/atm/atm.css
Normal file
580
ReallifeGamemode.Client/assets/css/atm/atm.css
Normal file
@@ -0,0 +1,580 @@
|
||||
@font-face {
|
||||
font-family: 'OSL';
|
||||
src: url('package://assets/font/OSL.ttf') format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'OSB';
|
||||
src: url('package://assets/font/OpenSans-Bold.ttf') format('truetype');
|
||||
}
|
||||
|
||||
* {
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
div {
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.atm {
|
||||
background:#6d6d6d;
|
||||
position:absolute;
|
||||
left:19.5vw;
|
||||
top:1vw;
|
||||
border-radius:1vw;
|
||||
-webkit-box-shadow:0 0 25px -1px rgba(0,0,0,0.75);
|
||||
-moz-box-shadow:0 0 25px -1px rgba(0,0,0,0.75);
|
||||
box-shadow:0 0 25px -1px rgba(0,0,0,0.75);
|
||||
z-index:3;
|
||||
padding:33vw 30vw 10vw;
|
||||
}
|
||||
|
||||
.content {
|
||||
position:absolute;
|
||||
left:4vw;
|
||||
top:2vw;
|
||||
border-radius:1vw;
|
||||
padding:29vw 26vw 5vw;
|
||||
}
|
||||
|
||||
.screen {
|
||||
position:absolute;
|
||||
left:5vw;
|
||||
top:2vw;
|
||||
-webkit-box-shadow:inset 0 0 19px -1px rgba(0,0,0,0.75);
|
||||
-moz-box-shadow:inset 0 0 19px -1px rgba(0,0,0,0.75);
|
||||
box-shadow:inset 0 0 19px -1px rgba(0,0,0,0.75);
|
||||
background:#fff;
|
||||
z-index:1;
|
||||
padding:15vw 21vw;
|
||||
}
|
||||
|
||||
.b-left {
|
||||
position:absolute;
|
||||
left:-1.5vw;
|
||||
top:11vw;
|
||||
border-radius:1vw;
|
||||
}
|
||||
|
||||
.b-right {
|
||||
position:absolute;
|
||||
left:47.5vw;
|
||||
top:11vw;
|
||||
border-radius:1vw;
|
||||
}
|
||||
|
||||
.b {
|
||||
background:#a7a7a7;
|
||||
border-radius:.1vw .3vw .3vw .1vw;
|
||||
margin-bottom:3vw;
|
||||
padding:2vw 3vw;
|
||||
}
|
||||
|
||||
.b2 {
|
||||
background:#a7a7a7;
|
||||
border-radius:.3vw .1vw .1vw .3vw;
|
||||
margin-bottom:3vw;
|
||||
margin-left:.4vw;
|
||||
padding:2vw 3vw;
|
||||
}
|
||||
|
||||
.b,.b2,.b3 {
|
||||
cursor:pointer;
|
||||
background:#a7a7a7;
|
||||
margin-bottom:1vw;
|
||||
-webkit-box-shadow:2px 3px 9px 3px rgba(99,99,99,1);
|
||||
-moz-box-shadow:2px 3px 9px 3px rgba(99,99,99,1);
|
||||
box-shadow:2px 3px 9px 3px rgba(99,99,99,1);
|
||||
font-size:3vw;
|
||||
color:#000;
|
||||
padding:2vw 2.8vw;
|
||||
border: 2px solid rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
.b:hover,.b2:hover,.b3:hover,.b3e:hover,.b4e:hover {
|
||||
background:#949494;
|
||||
}
|
||||
|
||||
.b3 {
|
||||
cursor:pointer;
|
||||
background:#a7a7a7;
|
||||
border-radius:.3vw;
|
||||
margin-bottom:.2vw;
|
||||
font-family:OSL;
|
||||
font-size:1vw;
|
||||
-webkit-box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
-moz-box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
padding: .14vw 2vw;
|
||||
}
|
||||
|
||||
.b3e {
|
||||
cursor:pointer;
|
||||
background:#a7a7a7;
|
||||
border-radius:.3vw;
|
||||
margin-bottom:.5vw;
|
||||
font-family:OSL;
|
||||
font-size:1vw;
|
||||
-webkit-box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
-moz-box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
padding:1vw 4vw 1vw .5vw;
|
||||
}
|
||||
|
||||
.b4e {
|
||||
cursor:pointer;
|
||||
background:#a7a7a7;
|
||||
border-radius:.3vw;
|
||||
margin-bottom:.5vw;
|
||||
font-family:OSL;
|
||||
font-size:1vw;
|
||||
-webkit-box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
-moz-box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
position:relative;
|
||||
top:.2vw;
|
||||
left:0;
|
||||
padding:1vw 4vw 1vw .5vw;
|
||||
}
|
||||
|
||||
.numpad {
|
||||
position:absolute;
|
||||
top:0;
|
||||
left:-4vw;
|
||||
z-index:20;
|
||||
}
|
||||
|
||||
.bz1 {
|
||||
position:absolute;
|
||||
top:34.3vw;
|
||||
left:21vw;
|
||||
}
|
||||
|
||||
.bz2 {
|
||||
position:absolute;
|
||||
top:34.3vw;
|
||||
left:26vw;
|
||||
}
|
||||
|
||||
.bz3 {
|
||||
position:absolute;
|
||||
top:34.3vw;
|
||||
left:31vw;
|
||||
}
|
||||
|
||||
.bz4 {
|
||||
position:absolute;
|
||||
top:35.3vw;
|
||||
left:44.6vw;
|
||||
}
|
||||
|
||||
.bz5 {
|
||||
position:absolute;
|
||||
top:34.8vw;
|
||||
left:37vw;
|
||||
font-family:OSB!important;
|
||||
}
|
||||
|
||||
.bz6 {
|
||||
position:absolute;
|
||||
top:4.1vw;
|
||||
}
|
||||
|
||||
.b4 {
|
||||
cursor:pointer;
|
||||
width:0;
|
||||
background:#cc2d2d;
|
||||
border-radius:.3vw;
|
||||
margin-bottom:1.5vw;
|
||||
-webkit-box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
-moz-box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
padding:1.2vw;
|
||||
}
|
||||
|
||||
.b5 {
|
||||
cursor:pointer;
|
||||
width:0;
|
||||
background:#ccb92e;
|
||||
border-radius:.3vw;
|
||||
margin-bottom:1.5vw;
|
||||
-webkit-box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
-moz-box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
padding:1.2vw;
|
||||
}
|
||||
|
||||
.b6 {
|
||||
cursor:pointer;
|
||||
width:0;
|
||||
background:#fff;
|
||||
border-radius:.3vw;
|
||||
margin-bottom:1.5vw;
|
||||
-webkit-box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
-moz-box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
padding:1.2vw;
|
||||
}
|
||||
|
||||
.b7 {
|
||||
cursor:pointer;
|
||||
width:0;
|
||||
background:#28bd26;
|
||||
border-radius:.3vw;
|
||||
margin-bottom:1.5vw;
|
||||
-webkit-box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
-moz-box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
box-shadow:0 0 6px -1px rgba(0,0,0,0.75);
|
||||
padding:1.2vw;
|
||||
}
|
||||
|
||||
.header {
|
||||
height:4vw;
|
||||
width:42vw;
|
||||
position:absolute;
|
||||
top:0;
|
||||
left:0;
|
||||
background-image: linear-gradient(to right, #ff0d0d 80%, #ff1616e0 99%);
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.title {
|
||||
text-align:center;
|
||||
line-height:2;
|
||||
font-size:1.6vw;
|
||||
font-family:OSB;
|
||||
color:#fff;
|
||||
}
|
||||
|
||||
.sub-title {
|
||||
text-align:center;
|
||||
line-height:3;
|
||||
font-size:1.6vw;
|
||||
font-family:OSB;
|
||||
color:#000;
|
||||
}
|
||||
|
||||
.text {
|
||||
text-align:center;
|
||||
font-size:2vw;
|
||||
font-family:OSL;
|
||||
color:#000;
|
||||
margin-top:2vw;
|
||||
font-weight:700;
|
||||
}
|
||||
|
||||
.picture {
|
||||
width:27vw;
|
||||
margin-left:7.5vw;
|
||||
margin-top:5.8vw;
|
||||
}
|
||||
|
||||
.show {
|
||||
display:show!important;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display:none!important;
|
||||
}
|
||||
|
||||
.menus {
|
||||
font-family:OSB;
|
||||
font-size: 0.8vw;
|
||||
}
|
||||
|
||||
.menu-list1 {
|
||||
line-height:6.35;
|
||||
margin-top:5.3vw;
|
||||
margin-left:-1.4vw;
|
||||
}
|
||||
|
||||
.menu-list2 {
|
||||
line-height:6.35;
|
||||
margin-left:33vw;
|
||||
margin-top:-20.7vw;
|
||||
text-align:left!important;
|
||||
}
|
||||
|
||||
ul,menu,dir {
|
||||
display:block;
|
||||
list-style-type:disc;
|
||||
-webkit-margin-before:1em;
|
||||
-webkit-margin-after:1em;
|
||||
-webkit-margin-start:0;
|
||||
-webkit-margin-end:0;
|
||||
-webkit-padding-start:40px;
|
||||
}
|
||||
|
||||
li {
|
||||
display:block;
|
||||
text-align:none;
|
||||
}
|
||||
|
||||
.circle {
|
||||
background:#c9f0f55e;
|
||||
position:absolute;
|
||||
height:36vw;
|
||||
top:0;
|
||||
left:0;
|
||||
z-index:-2;
|
||||
width:10vw;
|
||||
border-radius:0 380px 380px 0;
|
||||
}
|
||||
|
||||
.circle2 {
|
||||
background:#c9f0f55e;
|
||||
position:absolute;
|
||||
height:36vw;
|
||||
top:0;
|
||||
left:32vw;
|
||||
z-index:-2;
|
||||
width:10vw;
|
||||
border-radius:380px 0 0 380px;
|
||||
}
|
||||
|
||||
.randombox {
|
||||
position:absolute;
|
||||
z-index:0;
|
||||
width:42vw;
|
||||
height:9vw;
|
||||
top:34vw;
|
||||
left:13vw;
|
||||
background:#6d6d6d;
|
||||
}
|
||||
|
||||
.bg-box1 {
|
||||
background:#FFF;
|
||||
width:18vw;
|
||||
/* height:3vw; */
|
||||
padding-top: 1vw;
|
||||
padding-bottom: 1vw;
|
||||
position:absolute;
|
||||
z-index:-1;
|
||||
top: 9.6vw;
|
||||
}
|
||||
|
||||
.bg-box2 {
|
||||
background:#FFF;
|
||||
width:18vw;
|
||||
height:3vw;
|
||||
position:absolute;
|
||||
z-index:-1;
|
||||
top:14.4vw;
|
||||
}
|
||||
|
||||
.bg-box3 {
|
||||
background:#FFF;
|
||||
width:18vw;
|
||||
height:3vw;
|
||||
position:absolute;
|
||||
z-index:-1;
|
||||
top:19.4vw;
|
||||
}
|
||||
|
||||
.bg-box4 {
|
||||
background:#FFF;
|
||||
width:18vw;
|
||||
height:3vw;
|
||||
position:absolute;
|
||||
z-index:-1;
|
||||
top: 24.5vw;
|
||||
}
|
||||
|
||||
.bg-box5 {
|
||||
background:#FFF;
|
||||
width: 18vw;
|
||||
height:3vw;
|
||||
position:absolute;
|
||||
z-index:-1;
|
||||
top:9.4vw;
|
||||
left:24vw;
|
||||
}
|
||||
|
||||
.bg-box6 {
|
||||
background:#FFF;
|
||||
width:18vw;
|
||||
height:3vw;
|
||||
position:absolute;
|
||||
z-index:-1;
|
||||
top:14.4vw;
|
||||
left:24vw;
|
||||
}
|
||||
|
||||
.bg-box7 {
|
||||
background:#FFF;
|
||||
width:18vw;
|
||||
height:3vw;
|
||||
position:absolute;
|
||||
z-index:-1;
|
||||
top: 19.5vw;
|
||||
left:24vw;
|
||||
}
|
||||
|
||||
.bg-box8 {
|
||||
background:#FFF;
|
||||
width:18vw;
|
||||
height:3vw;
|
||||
position:absolute;
|
||||
z-index:-1;
|
||||
top:24.4vw;
|
||||
left:24vw;
|
||||
}
|
||||
|
||||
.input {
|
||||
display:block;
|
||||
width:30%;
|
||||
height:1vw;
|
||||
font-size:.7vw;
|
||||
line-height:1.42857143;
|
||||
color:#555;
|
||||
background-color:#fff;
|
||||
background-image:none;
|
||||
margin-left:14vw;
|
||||
border:1px solid #ccc;
|
||||
border-radius:4px;
|
||||
-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);
|
||||
box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);
|
||||
-webkit-transition:border-color ease-in-out .15s, 0 ease-in-out .15s;
|
||||
-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||
transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||
padding:.4vw .5vw;
|
||||
}
|
||||
|
||||
.back {
|
||||
font-size:1vw;
|
||||
position:absolute;
|
||||
font-family:OSB;
|
||||
left:0;
|
||||
top:9.5vw;
|
||||
background:#fff;
|
||||
padding:1vw 7vw 1vw 1vw;
|
||||
}
|
||||
|
||||
.back2 {
|
||||
font-size:1vw;
|
||||
position:absolute;
|
||||
font-family:OSB;
|
||||
left:0;
|
||||
top: 14.3vw;
|
||||
background:#fff;
|
||||
padding:1vw 7vw 1vw 1vw;
|
||||
}
|
||||
|
||||
.back3 {
|
||||
font-size:1vw;
|
||||
position:absolute;
|
||||
font-family:OSB;
|
||||
left:0;
|
||||
top: 19.5vw;
|
||||
background:#fff;
|
||||
padding:1vw 7vw 1vw 1vw;
|
||||
}
|
||||
|
||||
.back4 {
|
||||
font-size:1vw;
|
||||
position:absolute;
|
||||
font-family:OSB;
|
||||
left:0;
|
||||
top: 24.5vw;
|
||||
background:#fff;
|
||||
padding:1vw 7vw 1vw 1vw;
|
||||
}
|
||||
|
||||
.back5 {
|
||||
font-size:1vw;
|
||||
position:absolute;
|
||||
font-family:OSB;
|
||||
left: 29.5vw;
|
||||
top:9.5vw;
|
||||
background:#fff;
|
||||
padding: 1vw 2vw 1vw 7vw;
|
||||
}
|
||||
.back6 {
|
||||
font-size:1vw;
|
||||
position:absolute;
|
||||
font-family:OSB;
|
||||
left: 29.5vw;
|
||||
top: 14.5vw;
|
||||
background:#fff;
|
||||
padding: 1vw 2vw 1vw 7vw;
|
||||
}
|
||||
.back7 {
|
||||
font-size:1vw;
|
||||
position:absolute;
|
||||
font-family:OSB;
|
||||
left: 29.5vw;
|
||||
top: 19.5vw;
|
||||
background:#fff;
|
||||
padding: 1vw 2vw 1vw 7vw;
|
||||
}
|
||||
.helper {
|
||||
position:absolute;
|
||||
left:-5vw;
|
||||
top:-2vw;
|
||||
}
|
||||
|
||||
.input2 {
|
||||
display:block;
|
||||
width:30%;
|
||||
height:1vw;
|
||||
font-size:.7vw;
|
||||
line-height:1.42857143;
|
||||
color:#000;
|
||||
background-color:#fff;
|
||||
background-image:none;
|
||||
margin-left:14vw;
|
||||
border:1px solid #ccc;
|
||||
border-radius:4px;
|
||||
-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);
|
||||
box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);
|
||||
-webkit-transition:border-color ease-in-out .15s, 0 ease-in-out .15s;
|
||||
-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||
transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||
padding:.4vw .5vw;
|
||||
font-family: 'OSL';
|
||||
}
|
||||
|
||||
.input3 {
|
||||
display:block;
|
||||
width: 41%;
|
||||
height: 17vw;
|
||||
font-size:.7vw;
|
||||
line-height:1.42857143;
|
||||
color:#000;
|
||||
background-color:#fff;
|
||||
background-image:none;
|
||||
margin-left: 12vw;
|
||||
border:1px solid #ccc;
|
||||
border-radius:4px;
|
||||
-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);
|
||||
box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);
|
||||
-webkit-transition:border-color ease-in-out .15s, 0 ease-in-out .15s;
|
||||
-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||
transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||
padding:.4vw .5vw;
|
||||
font-family: 'OSL';
|
||||
}
|
||||
|
||||
.bg-box5, .bg-box6, .bg-box7, .bg-box8 {
|
||||
height: 1vw !important;
|
||||
padding-top: 1vw !important;
|
||||
padding-bottom: 1vw !important;
|
||||
text-align: right;
|
||||
width: 17vw !important;
|
||||
padding-right: 1vw;
|
||||
}
|
||||
|
||||
.bg-box1, .bg-box2, .bg-box3, .bg-box4 {
|
||||
|
||||
height: 1vw !important;
|
||||
|
||||
padding-top: 1vw !important;
|
||||
|
||||
padding-bottom: 1vw !important;
|
||||
|
||||
padding-left: 1vw;
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
body {
|
||||
font-family: "Roboto", sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
overflow: hidden;
|
||||
}
|
||||
div {
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.table {
|
||||
background-color: rgba(255, 255, 255, .8);
|
||||
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24);
|
||||
width: 350px;
|
||||
margin: auto;
|
||||
margin-top: 5%;
|
||||
padding: 0px 20px 20px 20px;
|
||||
}
|
||||
|
||||
.rankDnD {
|
||||
background-color: dimgrey;
|
||||
cursor: move;
|
||||
}
|
||||
|
||||
.save-btn {
|
||||
display:inline-block;
|
||||
margin-top: 10px;
|
||||
width: 100%;
|
||||
border-radius: 5px;
|
||||
background-color: forestgreen;
|
||||
color: white;
|
||||
outline: 0;
|
||||
padding: 5px 10px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.save-btn:active {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
#rank-table {
|
||||
margin-left: 50%;
|
||||
transform: translateX(-50%);
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#rank-table tr {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.input-rankname {
|
||||
display: inline-block;
|
||||
margin-left: 50%;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
|
||||
.delete-rank {
|
||||
background-color: orangered;
|
||||
color: white;
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
.delete-rank:hover, .delete-rank:focus, .delete-rank:active {
|
||||
background-color: #ff0223 !important;
|
||||
}
|
||||
|
||||
#rank-table tr td {
|
||||
border-bottom: 1px solid black;
|
||||
padding: 5px 15px;
|
||||
}
|
||||
|
||||
#rank-table tr:last-child td {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
#rank-table > tr:not(:first-child):hover {
|
||||
background-color: dimgrey;
|
||||
cursor: move;
|
||||
}
|
||||
|
||||
h2 {
|
||||
text-align:center;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user