diff --git a/enhanced_playermodel_selector.psd b/enhanced_playermodel_selector.psd new file mode 100644 index 0000000..01c9fff Binary files /dev/null and b/enhanced_playermodel_selector.psd differ diff --git a/enhanced_playermodel_selector_localization.jpg b/enhanced_playermodel_selector_localization.jpg new file mode 100644 index 0000000..ef87836 Binary files /dev/null and b/enhanced_playermodel_selector_localization.jpg differ diff --git a/lua/autorun/enhanced_playermodel_selector/default_playermodels.lua b/lua/autorun/enhanced_playermodel_selector/default_playermodels.lua new file mode 100644 index 0000000..91ca8ed --- /dev/null +++ b/lua/autorun/enhanced_playermodel_selector/default_playermodels.lua @@ -0,0 +1,101 @@ + +AddCSLuaFile() + +DefaultPlayerModels = { + ["models/player/alyx.mdl"] = true, + ["models/player/barney.mdl"] = true, + ["models/player/breen.mdl"] = true, + ["models/player/charple.mdl"] = true, + ["models/player/p2_chell.mdl"] = true, + ["models/player/corpse1.mdl"] = true, + ["models/player/combine_soldier.mdl"] = true, + ["models/player/combine_soldier_prisonguard.mdl"] = true, + ["models/player/combine_super_soldier.mdl"] = true, + ["models/player/eli.mdl"] = true, + ["models/player/gman_high.mdl"] = true, + ["models/player/kleiner.mdl"] = true, + ["models/player/monk.mdl"] = true, + ["models/player/mossman.mdl"] = true, + ["models/player/mossman_arctic.mdl"] = true, + ["models/player/odessa.mdl"] = true, + ["models/player/police.mdl"] = true, + ["models/player/police_fem.mdl"] = true, + ["models/player/magnusson.mdl"] = true, + ["models/player/soldier_stripped.mdl"] = true, + ["models/player/zombie_classic.mdl"] = true, + ["models/player/zombie_fast.mdl"] = true, + + -- Citizens + ["models/player/Group01/male_01.mdl"] = true, + ["models/player/Group01/male_02.mdl"] = true, + ["models/player/Group01/male_03.mdl"] = true, + ["models/player/Group01/male_04.mdl"] = true, + ["models/player/Group01/male_05.mdl"] = true, + ["models/player/Group01/male_06.mdl"] = true, + ["models/player/Group01/male_07.mdl"] = true, + ["models/player/Group01/male_08.mdl"] = true, + ["models/player/Group01/male_09.mdl"] = true, + ["models/player/Group01/female_01.mdl"] = true, + ["models/player/Group01/female_02.mdl"] = true, + ["models/player/Group01/female_03.mdl"] = true, + ["models/player/Group01/female_04.mdl"] = true, + ["models/player/Group01/female_05.mdl"] = true, + ["models/player/Group01/female_06.mdl"] = true, + + -- Refugees + ["models/player/Group03/male_01.mdl"] = true, + ["models/player/Group03/male_02.mdl"] = true, + ["models/player/Group03/male_03.mdl"] = true, + ["models/player/Group03/male_04.mdl"] = true, + ["models/player/Group03/male_05.mdl"] = true, + ["models/player/Group03/male_06.mdl"] = true, + ["models/player/Group03/male_07.mdl"] = true, + ["models/player/Group03/male_08.mdl"] = true, + ["models/player/Group03/male_09.mdl"] = true, + ["models/player/Group03/female_01.mdl"] = true, + ["models/player/Group03/female_02.mdl"] = true, + ["models/player/Group03/female_03.mdl"] = true, + ["models/player/Group03/female_04.mdl"] = true, + ["models/player/Group03/female_05.mdl"] = true, + ["models/player/Group03/female_06.mdl"] = true, + + ["models/player/Group02/male_02.mdl"] = true, + ["models/player/Group02/male_04.mdl"] = true, + ["models/player/Group02/male_06.mdl"] = true, + ["models/player/Group02/male_08.mdl"] = true, + + -- Medics + ["models/player/Group03m/male_01.mdl"] = true, + ["models/player/Group03m/male_02.mdl"] = true, + ["models/player/Group03m/male_03.mdl"] = true, + ["models/player/Group03m/male_04.mdl"] = true, + ["models/player/Group03m/male_05.mdl"] = true, + ["models/player/Group03m/male_06.mdl"] = true, + ["models/player/Group03m/male_07.mdl"] = true, + ["models/player/Group03m/male_08.mdl"] = true, + ["models/player/Group03m/male_09.mdl"] = true, + ["models/player/Group03m/female_01.mdl"] = true, + ["models/player/Group03m/female_02.mdl"] = true, + ["models/player/Group03m/female_03.mdl"] = true, + ["models/player/Group03m/female_04.mdl"] = true, + ["models/player/Group03m/female_05.mdl"] = true, + ["models/player/Group03m/female_06.mdl"] = true, + + ["models/player/skeleton.mdl"] = true, + ["models/player/zombie_soldier.mdl"] = true, + ["models/player/hostage/hostage_01.mdl"] = true, + ["models/player/hostage/hostage_02.mdl"] = true, + ["models/player/hostage/hostage_03.mdl"] = true, + ["models/player/hostage/hostage_04.mdl"] = true, + ["models/player/arctic.mdl"] = true, + ["models/player/gasmask.mdl"] = true, + ["models/player/guerilla.mdl"] = true, + ["models/player/leet.mdl"] = true, + ["models/player/phoenix.mdl"] = true, + ["models/player/riot.mdl"] = true, + ["models/player/swat.mdl"] = true, + ["models/player/urban.mdl"] = true, + ["models/player/dod_german.mdl"] = true, + ["models/player/dod_american.mdl"] = true + +} \ No newline at end of file diff --git a/lua/autorun/lf_playermodel_selector.lua b/lua/autorun/lf_playermodel_selector.lua index 2651033..ab700b1 100644 --- a/lua/autorun/lf_playermodel_selector.lua +++ b/lua/autorun/lf_playermodel_selector.lua @@ -1,7 +1,8 @@ -- Enhanced PlayerModel Selector --- Upgraded code by LibertyForce http://steamcommunity.com/id/libertyforce +-- Upgraded code by LibertyForce https://steamcommunity.com/id/libertyforce -- Based on: https://github.com/garrynewman/garrysmod/blob/1a2c317eeeef691e923453018236cf9f66ee74b4/garrysmod/gamemodes/sandbox/gamemode/editor_player.lua +include("enhanced_playermodel_selector/default_playermodels.lua") local flag = { FCVAR_REPLICATED } if SERVER then flag = { FCVAR_ARCHIVE, FCVAR_REPLICATED } end @@ -17,10 +18,8 @@ for cvar, def in pairs( convars ) do end flag = nil - if SERVER then - AddCSLuaFile() --util.AddNetworkString("lf_playermodel_client_sync") @@ -211,42 +210,42 @@ local function UpdatePlayerModel( ply ) timer.Simple( 0.1, function() if ply.SetupHands and isfunction( ply.SetupHands ) then ply:SetupHands() end end ) timer.Simple( 0.2, function() if ply:GetInfo( "cl_playerhands" ) != "" then mdlname = ply:GetInfo( "cl_playerhands" ) end - local mdlhands = player_manager.TranslatePlayerHands( mdlname ) + local HandsModel = player_manager.TranslatePlayerHands( mdlname ) - local hands_ent = ply:GetHands() - if hands_ent and mdlhands and istable( mdlhands ) then - if hands_ent:GetModel() != mdlhands.model then + local HandsEntity = ply:GetHands() + if HandsEntity and HandsModel and istable( HandsModel ) then + if HandsEntity:GetModel() != HandsModel.model then if debugmode then print( "LF_PMS: SetupHands failed. Gamemode doesn't implement this function correctly. Trying workaround..." ) end - if ( IsValid( hands_ent ) ) then - hands_ent:SetModel( mdlhands.model ) - hands_ent:SetSkin( mdlhands.skin ) - hands_ent:SetBodyGroups( mdlhands.body ) + if ( IsValid( HandsEntity ) ) then + HandsEntity:SetModel( HandsModel.model ) + HandsEntity:SetSkin( HandsModel.skin ) + HandsEntity:SetBodyGroups( HandsModel.body ) local skin = ply:GetInfoNum( "cl_playerhandsskin", 0 ) - hands_ent:SetSkin( skin ) + HandsEntity:SetSkin( skin ) if debugmode then print( "LF_PMS: Set hands model skin to no.: "..tostring( skin ) ) end local groups = ply:GetInfo( "cl_playerhandsbodygroups" ) if ( groups == nil ) then groups = "" end local groups = string.Explode( " ", groups ) - for k = 0, hands_ent:GetNumBodyGroups() - 1 do + for k = 0, HandsEntity:GetNumBodyGroups() - 1 do local v = tonumber( groups[ k + 1 ] ) or 0 - hands_ent:SetBodygroup( k, v ) + HandsEntity:SetBodygroup( k, v ) if debugmode then print( "LF_PMS: Set hands bodygroup no. "..tostring( k ).." to: "..tostring( v ) ) end end if debugmode then timer.Simple( 0.2, function() - if hands_ent:GetModel() != mdlhands.model then + if HandsEntity:GetModel() != HandsModel.model then print( "LF_PMS: Workaround failed. Unable to setup viewmodel hands. Please check for incompatible addons." ) else - print( "LF_PMS: Workaround successful. Hands set to: "..mdlhands.model ) + print( "LF_PMS: Workaround successful. Hands set to: "..HandsModel.model ) end end ) end end else - if debugmode then print( "LF_PMS: SetupHands successful. Hands set to: "..tostring( mdlhands.model ) ) end + if debugmode then print( "LF_PMS: SetupHands successful. Hands set to: "..tostring( HandsModel.model ) ) end end else if debugmode then print( "LF_PMS: ERROR - SetupHands failed. player_manager.TranslatePlayerHands didn't return valid data. Please check for incompatible addons." ) end @@ -380,10 +379,11 @@ end if CLIENT then -local Version = "3.3, Fesiug's Edit" +local Version = "4.1" local Menu = { } -local Frame -local default_animations = { "idle_all_01", "menu_walk", "pose_standing_02", "pose_standing_03", "idle_fist" } +local MainWindow +local default_animations = { "idle_all_01", "menu_walk", "menu_combine", "pose_standing_02", "pose_standing_03", "idle_fist", "menu_gman", "idle_all_scared", "menu_zombie_01", "idle_magic", "walk_ar2" } +local currentanim = 0 local Favorites = { } --local addon_vox = false @@ -406,17 +406,29 @@ if file.Exists( "lf_playermodel_selector/cl_favorites.txt", "DATA" ) then end end +local function RRRotateAroundPoint(pos, ang, point, offset_ang) + local mat = Matrix() + mat:SetTranslation(pos) + mat:SetAngles(ang) + mat:Translate(point) + + local rot_mat = Matrix() + rot_mat:SetAngles(offset_ang) + rot_mat:Invert() + + mat:Mul(rot_mat) + + mat:Translate(-point) + + return mat:GetTranslation(), mat:GetAngles() +end CreateClientConVar( "cl_playermodel_selector_force", "1", true, true ) +CreateClientConVar( "cl_playermodel_selector_hide_defaults", "0", true, true ) CreateClientConVar( "cl_playermodel_selector_unlockflexes", "0", false, true ) CreateClientConVar( "cl_playermodel_selector_bgcolor_custom", "1", true, true ) CreateClientConVar( "cl_playermodel_selector_bgcolor_trans", "1", true, true ) - ---net.Start("lf_playermodel_client_sync") ---net.SendToServer() ---net.Receive("lf_playermodel_client_sync", function() --- addon_vox = net.ReadBool() ---end ) +CreateClientConVar( "cl_playermodel_selector_ignorehands", "1", true, true ) hook.Add( "PostGamemodeLoaded", "lf_playermodel_sboxcvars", function() CreateConVar( "cl_playercolor", "0.24 0.34 0.41", { FCVAR_ARCHIVE, FCVAR_USERINFO, FCVAR_DONTRECORD }, "The value is a Vector - so between 0-1 - not between 0-255" ) @@ -431,14 +443,14 @@ end ) local function KeyboardOn( pnl ) - if ( IsValid( Frame ) and IsValid( pnl ) and pnl:HasParent( Frame ) ) then - Frame:SetKeyboardInputEnabled( true ) + if ( IsValid( MainWindow ) and IsValid( pnl ) and pnl:HasParent( MainWindow ) ) then + MainWindow:SetKeyboardInputEnabled( true ) end end hook.Add( "OnTextEntryGetFocus", "lf_playermodel_keyboard_on", KeyboardOn ) local function KeyboardOff( pnl ) - if ( IsValid( Frame ) and IsValid( pnl ) and pnl:HasParent( Frame ) ) then - Frame:SetKeyboardInputEnabled( false ) + if ( IsValid( MainWindow ) and IsValid( pnl ) and pnl:HasParent( MainWindow ) ) then + MainWindow:SetKeyboardInputEnabled( false ) end end hook.Add( "OnTextEntryLoseFocus", "lf_playermodel_keyboard_off", KeyboardOff ) @@ -466,19 +478,34 @@ end concommand.Add( "playermodel_loadfav", LoadFavorite ) +-- Horrible. I hate Garry's Mod +local HandIconGenerator = GetRenderTarget("HandIconGenerator", 512, 512) +local myMat2 = CreateMaterial( "HandIconGenerator_RTMat", "UnlitGeneric", { + ["$basetexture"] = HandIconGenerator:GetName(), -- Make the material use our render target texture + ["$translucent"] = 1, + ["$vertexcolor"] = 1, + ["$vertexalpha"] = 1, +} ) +local matshiny = Material("models/shiny") +local hasbgs = Material("eps/hasbgs4.png", "mips smooth") -- or hasbgs3 idk which better + + +function Menu.UpdateFromConvars() + -- wah wah dont error ples +end function Menu.Setup() - Frame = vgui.Create( "DFrame" ) + MainWindow = vgui.Create( "DFrame" ) local fw, fh = math.min( ScrW() - 16, 960 ), math.min( ScrH() - 16, 700 ) - Frame:SetSize( fw, fh ) - Frame:SetTitle( "Enhanced PlayerModel Selector "..Version ) - Frame:SetVisible( true ) - Frame:SetDraggable( true ) - Frame:SetScreenLock( false ) - Frame:ShowCloseButton( true ) - Frame:Center() - Frame:MakePopup() - Frame:SetKeyboardInputEnabled( false ) + MainWindow:SetSize( fw, fh ) + MainWindow:SetTitle( string.format(language.GetPhrase("EPS.Title"),Version) ) + MainWindow:SetVisible( true ) + MainWindow:SetDraggable( true ) + MainWindow:SetScreenLock( false ) + MainWindow:ShowCloseButton( true ) + MainWindow:Center() + MainWindow:MakePopup() + MainWindow:SetKeyboardInputEnabled( false ) local r, g, b = 97, 100, 102 if GetConVar( "cl_playermodel_selector_bgcolor_custom" ):GetBool() then local bgcolor = string.Explode( " ", GetConVar( "cl_playercolor" ):GetString() ) @@ -492,74 +519,84 @@ function Menu.Setup() end end local a = GetConVar( "cl_playermodel_selector_bgcolor_trans" ):GetBool() == true and 127 or 255 - Frame.Paint = function( self, w, h ) + MainWindow.Paint = function( self, w, h ) draw.RoundedBox( 10, 0, 0, w, h, Color( r, g, b, a ) ) return true end - Frame.lblTitle:SetTextColor( Color( 0, 0, 0, 255 ) ) - Frame.lblTitle.Paint = function ( self, w, h ) - draw.SimpleTextOutlined( Frame.lblTitle:GetText(), "DermaDefaultBold", 1, 2, Color( 255, 255, 255, 255), 0, 0, 1, Color( 0, 0, 0, 255) ) return true + MainWindow.lblTitle:SetTextColor( Color( 0, 0, 0, 255 ) ) + MainWindow.lblTitle.Paint = function ( self, w, h ) + draw.SimpleTextOutlined( MainWindow.lblTitle:GetText(), "DermaDefaultBold", 1, 2, Color( 255, 255, 255, 255), 0, 0, 1, Color( 0, 0, 0, 255) ) return true end - Frame.btnMinim:SetEnabled( true ) - Frame.btnMinim.DoClick = function() - Frame:SetVisible( false ) + MainWindow.btnMinim:SetEnabled( true ) + MainWindow.btnMinim.DoClick = function() + MainWindow:SetVisible( false ) end - --Frame.btnMaxim.Paint = function( panel, w, h ) derma.SkinHook( "Paint", "WindowMinimizeButton", panel, w, h ) end + --MainWindow.btnMaxim.Paint = function( panel, w, h ) derma.SkinHook( "Paint", "WindowMinimizeButton", panel, w, h ) end local maxi_allowed = false local maxi_mode = 0 if ScrW() > fw and ScrH() > fh then maxi_allowed = true end - Frame.btnMaxim:SetEnabled( maxi_allowed ) - Frame.btnMaxim.DoClick = function() + MainWindow.btnMaxim:SetEnabled( maxi_allowed ) + MainWindow.btnMaxim.DoClick = function() + local WorkshopButtonWidth, WorkshopButtonHeight = Menu.WorkshopButton:GetTextSize() + local ApplyButtonWidth, ApplyButtonHeight = Menu.ApplyButton:GetTextSize() + local ResetButtonWidth, ResetButtonHeight = Menu.ResetButton:GetTextSize() + local AnimButtonWidth, AnimButtonHeight = Menu.AnimButton:GetTextSize() if maxi_allowed and maxi_mode == 0 then - Frame:SetSize( ScrW(), ScrH() ) - Frame:Center() - Frame:SetDraggable( false ) - Menu.ApplyButton:SetPos( ScrW() - 560, 30 ) - Menu.ResetButton:SetPos( 5, ScrH() - 25 ) - Menu.AdvButton:SetPos( ScrW() - 200, 3 ) + MainWindow:SetSize( ScrW(), ScrH() ) + MainWindow:Center() + MainWindow:SetDraggable( false ) + Menu.ApplyButton:SetPos( ScrW() - (ApplyButtonWidth + 480), 0 ) + Menu.WorkshopButton:SetPos( ScrW() - (WorkshopButtonWidth + 110), 6 ) + + Menu.ResetButton:SetPos( 5, ScrH() - 60 ) + Menu.AnimButton:SetPos( 20 + ResetButtonWidth, ScrH() - 60 ) maxi_mode = 1 elseif maxi_allowed and maxi_mode == 1 then Menu.ApplyButton:SetVisible( false ) Menu.ResetButton:SetVisible( false ) - Menu.AdvButton:SetVisible( false ) + Menu.AnimButton:SetVisible( false ) + Menu.WorkshopButton:SetVisible( false ) Menu.Right:SetVisible( false ) - Frame:InvalidateLayout( false ) + MainWindow:InvalidateLayout( false ) maxi_mode = 2 else - Frame:SetSize( fw, fh ) - Frame:Center() - Frame:SetDraggable( true ) - Menu.ApplyButton:SetPos( fw - 560, 30 ) + MainWindow:SetSize( fw, fh ) + MainWindow:Center() + MainWindow:SetDraggable( true ) + + Menu.ApplyButton:SetPos( fw - (ApplyButtonWidth + 480), 0 ) Menu.ApplyButton:SetVisible( true ) - Menu.ResetButton:SetPos( 5, fh - 25 ) + Menu.ResetButton:SetPos( 5, fh - 60 ) + Menu.AnimButton:SetPos( 20 + ResetButtonWidth, fh - 60 ) Menu.ResetButton:SetVisible( true ) - Menu.AdvButton:SetPos( fw - 200, 3 ) - Menu.AdvButton:SetVisible( true ) + Menu.AnimButton:SetVisible( true ) + Menu.WorkshopButton:SetPos( fw - (WorkshopButtonWidth + 110), 6 ) + Menu.WorkshopButton:SetVisible( true ) Menu.Right:SetVisible( true ) maxi_mode = 0 end end - local mdl = Frame:Add( "DModelPanel" ) - mdl:Dock( FILL ) - --mdl:SetSize( 520, 0 ) - mdl:SetFOV( 36 ) - mdl:SetCamPos( Vector( 0, 0, 0 ) ) - mdl:SetDirectionalLight( BOX_RIGHT, Color( 255, 160, 80, 255 ) ) - mdl:SetDirectionalLight( BOX_LEFT, Color( 80, 160, 255, 255 ) ) - mdl:SetAmbientLight( Vector( -64, -64, -64 ) ) - mdl:SetAnimated( true ) - mdl:SetLookAt( Vector( -100, 0, -22 ) ) - function mdl.DefaultPos() + local ModelPreview = MainWindow:Add( "DModelPanel" ) + ModelPreview:Dock( FILL ) + ModelPreview:SetFOV( 36 ) -- PM FOV + ModelPreview:SetCamPos( Vector( 0, 0, 0 ) ) + ModelPreview:SetDirectionalLight( BOX_RIGHT, Color( 255, 160, 80, 255 ) ) + ModelPreview:SetDirectionalLight( BOX_LEFT, Color( 80, 160, 255, 255 ) ) + ModelPreview:SetAmbientLight( Vector( -64, -64, -64 ) ) + ModelPreview:SetAnimated( true ) + ModelPreview:SetLookAt( Vector( -100, 0, -22 ) ) + function ModelPreview.DefaultPos() if ( Menu.IsHandsTabActive() ) then return end - mdl.Angles = Angle( 0, 0, 0 ) - mdl.Pos = Vector( -100, 0, -61 ) + ModelPreview.Angles = Angle( 0, 0, 0 ) + ModelPreview.Pos = Vector( -100, 0, -61 ) + ModelPreview.AngleOffset = Angle( 0, 0, 0 ) end - mdl.DefaultPos() + ModelPreview.DefaultPos() - function mdl:PreDrawModel( mdlEnt ) + function ModelPreview:PreDrawModel( mdlEnt ) if ( IsValid( self.EntityHands ) and Menu.IsHandsTabActive() ) then if ( not self.EntityHands:IsEffectActive( EF_BONEMERGE ) ) then self.EntityHands:AddEffects( EF_BONEMERGE ) @@ -572,53 +609,62 @@ function Menu.Setup() end end - Menu.AdvButton = Frame:Add( "DButton" ) - Menu.AdvButton:SetSize( 100, 18 ) - Menu.AdvButton:SetPos( fw - 200, 3 ) - Menu.AdvButton:SetText( "Visit Addon Page" ) - Menu.AdvButton.DoClick = function() - gui.OpenURL( "http://steamcommunity.com/sharedfiles/filedetails/?id=2257795841" ) - SetClipboardText( "http://steamcommunity.com/sharedfiles/filedetails/?id=2257795841" ) + Menu.WorkshopButton = MainWindow:Add( "DButton" ) + Menu.WorkshopButton:SetText( "#EPS.VisitAddonPage" ) + local Width, Height = Menu.WorkshopButton:GetTextSize() + Menu.WorkshopButton:SetSize( Width + 8, 18 ) + Menu.WorkshopButton:SetPos( fw - (Width + 110), 6 ) + Menu.WorkshopButton.DoClick = function() + gui.OpenURL( "https://steamcommunity.com/sharedfiles/filedetails/?id=2247755443" ) + SetClipboardText( "https://steamcommunity.com/sharedfiles/filedetails/?id=2247755443" ) end - Menu.ApplyButton = Frame:Add( "DButton" ) - Menu.ApplyButton:SetSize( 120, 30 ) - Menu.ApplyButton:SetPos( fw - 560, 30 ) - Menu.ApplyButton:SetText( "Apply playermodel" ) + Menu.ApplyButton = ModelPreview:Add( "DButton" ) + Menu.ApplyButton:SetText( "#EPS.ApplyPM" ) + local ApplyButtonWidth, ApplyButtonHeight = Menu.ApplyButton:GetTextSize() + Menu.ApplyButton:SetPos( fw - (ApplyButtonWidth + 480), 0 ) + Menu.ApplyButton:SetSize( ApplyButtonWidth + 30, 30 ) Menu.ApplyButton:SetEnabled( LocalPlayer():IsAdmin() or GetConVar( "sv_playermodel_selector_instantly" ):GetBool() ) Menu.ApplyButton.DoClick = LoadPlayerModel - Menu.ResetButton = Frame:Add( "DButton" ) - Menu.ResetButton:SetSize( 40, 20 ) - Menu.ResetButton:SetPos( 5, fh - 25 ) - Menu.ResetButton:SetText( "Reset" ) - Menu.ResetButton.DoClick = mdl.DefaultPos + Menu.ResetButton = ModelPreview:Add( "DButton" ) + Menu.ResetButton:SetText( "#EPS.Reset" ) + local ResetButtonWidth, ResetButtonHeight = Menu.ResetButton:GetTextSize() + Menu.ResetButton:SetSize( ResetButtonWidth + 8, 20 ) + Menu.ResetButton:SetPos( 5, fh - 60 ) + Menu.ResetButton.DoClick = ModelPreview.DefaultPos + Menu.AnimButton = ModelPreview:Add( "DButton" ) + Menu.AnimButton:SetText( "#EPS.NextAnim" ) + local AnimButtonWidth, AnimButtonHeight = Menu.AnimButton:GetTextSize() + Menu.AnimButton:SetSize( AnimButtonWidth + 8, 20 ) + Menu.AnimButton:SetPos( 20 + ResetButtonWidth, fh - 60 ) + Menu.AnimButton.DoClick = function() + currentanim = (currentanim + 1) % (#default_animations) + Menu.PlayPreviewAnimation( ModelPreview, LocalPlayer():GetInfo( "cl_playermodel" ) ) + end - Menu.Right = Frame:Add( "DPropertySheet" ) + Menu.Right = MainWindow:Add( "DPropertySheet" ) Menu.Right:Dock( RIGHT ) Menu.Right:SetSize( 430, 0 ) Menu.Right.OnActiveTabChanged = function( self, oldTab, newTab ) - timer.Simple( 0, function() Menu.UpdateFromConvars() end ) + timer.Simple( 0.1, function() Menu.UpdateFromConvars() end ) end local modeltab = Menu.Right:Add( "DPropertySheet" ) - Menu.Right:AddSheet( "Model", modeltab, "icon16/user.png" ) + Menu.Right:AddSheet( "#EPS.Model", modeltab, "icon16/user.png" ) - local t = modeltab:Add( "DLabel" ) - t:SetPos( 129, 1 ) - --t:SetSize( 100, 20 ) - t:SetText( "Search:" ) - - Menu.ModelFilter = modeltab:Add( "DTextEntry" ) - Menu.ModelFilter:SetPos( 168, 1 ) - Menu.ModelFilter:SetSize( 246, 20 ) - Menu.ModelFilter:SetUpdateOnType( true ) - Menu.ModelFilter.OnValueChange = function() Menu.ModelPopulate() end + Menu.ModelFilter = modeltab:Add( "DTextEntry" ) + Menu.ModelFilter:SetPlaceholderText( "#EPS.Search" ) + Menu.ModelFilter:DockMargin( 8, 0, 8, 8 ) + Menu.ModelFilter:Dock( TOP ) + + Menu.ModelFilter:SetUpdateOnType( true ) + Menu.ModelFilter.OnValueChange = function() Menu.ModelPopulate() end local ModelScroll = modeltab:Add( "DScrollPanel" ) - modeltab:AddSheet( "Icons", ModelScroll, "icon16/application_view_tile.png" ) + modeltab:AddSheet( "#EPS.Model.Icons", ModelScroll, "icon16/application_view_tile.png" ) ModelScroll:DockMargin( 2, 0, 2, 2 ) ModelScroll:Dock( FILL ) @@ -631,12 +677,12 @@ function Menu.Setup() local ModelList = modeltab:Add( "DListView" ) - modeltab:AddSheet( "Table", ModelList, "icon16/application_view_list.png" ) + modeltab:AddSheet( "#EPS.Model.Table", ModelList, "icon16/application_view_list.png" ) ModelList:DockMargin( 5, 0, 5, 5 ) ModelList:Dock( FILL ) ModelList:SetMultiSelect( false ) - ModelList:AddColumn( "Model" ) - ModelList:AddColumn( "Path" ) + ModelList:AddColumn( "#EPS.Model.Table.Model" ) + ModelList:AddColumn( "#EPS.Model.Table.Path" ) ModelList.OnRowSelected = function() local sel = ModelList:GetSelected() if !sel[1] then return end @@ -648,7 +694,7 @@ function Menu.Setup() -- RunConsoleCommand( "cl_playerhands", "" ) RunConsoleCommand( "cl_playerhandsbodygroups", "0" ) RunConsoleCommand( "cl_playerhandsskin", "0" ) - timer.Simple( 0.1, function() Menu.UpdateFromConvars() end ) + timer.Simple( 0.3, function() Menu.UpdateFromConvars() end ) end local AllModels = player_manager.AllValidModels() @@ -675,9 +721,10 @@ function Menu.Setup() end for name, model in SortedPairs( AllModels ) do - + if IsInFilter( name ) then - + if GetConVar( "cl_playermodel_selector_hide_defaults" ):GetBool() and DefaultPlayerModels[model] then continue end -- Testing, may have bugs. + if GetConVar( "cl_playermodel_selector_ignorehands" ):GetBool() and player_manager.TranslatePlayerHands(name).model == model then continue end -- No local icon = ModelIconLayout:Add( "SpawnIcon" ) icon:SetSize( 64, 64 ) --icon:InvalidateLayout( true ) @@ -692,11 +739,11 @@ function Menu.Setup() -- RunConsoleCommand( "cl_playerhands", "" ) RunConsoleCommand( "cl_playerhandsbodygroups", "0" ) RunConsoleCommand( "cl_playerhandsskin", "0" ) - timer.Simple( 0.1, function() Menu.UpdateFromConvars() end ) + timer.Simple( 0.3, function() Menu.UpdateFromConvars() end ) end - + ModelList:AddLine( name, model ) - + end end @@ -707,23 +754,19 @@ function Menu.Setup() ------------------------------------------------------------- local handtab = Menu.Right:Add( "DPropertySheet" ) - local htb = Menu.Right:AddSheet( "Hands", handtab, "icon16/attach.png" ) + local htb = Menu.Right:AddSheet( "#EPS.Hands", handtab, "icon16/attach.png" ) htb.Tab.IsHandsTab = true - local t = handtab:Add( "DLabel" ) - t:SetPos( 129, 1 ) - --t:SetSize( 100, 20 ) - t:SetText( "Search:" ) - Menu.HandsFilter = handtab:Add( "DTextEntry" ) - Menu.HandsFilter:SetPos( 168, 1 ) - Menu.HandsFilter:SetSize( 246, 20 ) + Menu.HandsFilter:SetPlaceholderText( "#EPS.Search" ) + Menu.HandsFilter:DockMargin( 8, 0, 8, 4 ) + Menu.HandsFilter:Dock( TOP ) Menu.HandsFilter:SetUpdateOnType( true ) Menu.HandsFilter.OnValueChange = function() Menu.HandsPopulate() end local ModelScroll = handtab:Add( "DScrollPanel" ) - handtab:AddSheet( "Icons", ModelScroll, "icon16/application_view_tile.png" ) + handtab:AddSheet( "#EPS.Hands.Icons", ModelScroll, "icon16/application_view_tile.png" ) ModelScroll:DockMargin( 2, 0, 2, 2 ) ModelScroll:Dock( FILL ) @@ -732,16 +775,16 @@ function Menu.Setup() ModelIconLayout:SetSpaceY( 2 ) ModelIconLayout:Dock( FILL ) - local modelicons = { } + local modelicons_forhands = { } local ModelList = handtab:Add( "DListView" ) - handtab:AddSheet( "Table", ModelList, "icon16/application_view_list.png" ) + handtab:AddSheet( "#EPS.Hands.Table", ModelList, "icon16/application_view_list.png" ) ModelList:DockMargin( 5, 0, 5, 5 ) ModelList:Dock( FILL ) ModelList:SetMultiSelect( false ) - ModelList:AddColumn( "Model" ) - ModelList:AddColumn( "Path" ) + ModelList:AddColumn( "#EPS.Hands.Table.Model" ) + ModelList:AddColumn( "#EPS.Hands.Table.Path" ) ModelList.OnRowSelected = function() local sel = ModelList:GetSelected() if !sel[1] then return end @@ -777,60 +820,213 @@ function Menu.Setup() end end - local icon = ModelIconLayout:Add( "SpawnIcon" ) - icon:SetSize( 64, 64 ) - icon:SetSpawnIcon( "icon64/playermodel.png" ) - --icon:SetModel( model ) - icon:SetTooltip( "Use playermodel" ) - table.insert( modelicons, icon ) - icon.DoClick = function() - RunConsoleCommand( "cl_playerhands", "" ) - RunConsoleCommand( "cl_playerhandsbodygroups", "0" ) - RunConsoleCommand( "cl_playerhandsskin", "0" ) - timer.Simple( 0.1, function() Menu.UpdateFromConvars() end ) - end + local icon = ModelIconLayout:Add( "SpawnIcon" ) + icon:SetSize( 64, 64 ) + icon:SetSpawnIcon( "icon64/playermodel.png" ) + icon:SetTooltip( "#EPS.Hands.UsePM" ) + icon.DoClick = function() + RunConsoleCommand( "cl_playerhands", "" ) + RunConsoleCommand( "cl_playerhandsbodygroups", "0" ) + RunConsoleCommand( "cl_playerhandsskin", "0" ) + timer.Simple( 0.1, function() Menu.UpdateFromConvars() end ) + end - ModelList:AddLine( name, model ) + local exister = {} for name, model in SortedPairs( AllModels ) do if IsInFilter( name ) then - + local result = player_manager.TranslatePlayerHands( name ) + if exister[result.model:lower()] then + continue + else + exister[result.model:lower()] = true + end local icon = ModelIconLayout:Add( "SpawnIcon" ) icon:SetSize( 64, 64 ) --icon:InvalidateLayout( true ) - icon:SetModel( model ) - icon:SetTooltip( name ) - table.insert( modelicons, icon ) + icon:SetModel( "models/kleiner_animations.mdl" ) + icon:SetTooltip( name .. "\n" .. result.model ) + icon.ResultList = result + + function icon:Paint( w, h ) + return true + end + table.insert( modelicons_forhands, icon ) + + function icon:MakeHandIcon() + if !self.ResultList then print("EPS Hands: Result list missing.") return end + + local CL_FISTS = ClientsideModel("models/weapons/c_arms.mdl") + local CL_REALHANDS = ClientsideModel( self.ResultList.model, RENDERGROUP_BOTH ) + + CL_FISTS:SetNoDraw( true ) + CL_FISTS:SetPos( vector_origin ) + CL_FISTS:SetAngles( angle_zero ) + CL_REALHANDS:SetNoDraw( true ) + + CL_FISTS:ResetSequence( CL_FISTS:LookupSequence( "fists_idle_01" ) ) + + CL_REALHANDS:AddEffects( EF_BONEMERGE ) + CL_REALHANDS:SetBodyGroups(result.body) + CL_REALHANDS:SetSkin(isnumber(result.skin) and result.skin or 0) + + CL_REALHANDS:SetParent( CL_FISTS ) + + local cam_pos = Vector( 0, 0, 0 ) + local cam_ang = Angle( 6, -16.9, 0 ) + local cam_fov = 17 + + render.PushRenderTarget( HandIconGenerator ) + render.OverrideDepthEnable( true, true ) + render.SetWriteDepthToDestAlpha( false ) + render.SuppressEngineLighting( true ) + + local CL_SHIRT = { + { + type = MATERIAL_LIGHT_POINT, + color = Vector( 1, 1, 1 )*1, + pos = Vector( 0, -48, 32 ), + }, + { + type = MATERIAL_LIGHT_POINT, + color = Vector( -1, -1, -1 )*1, + pos = Vector( 0, 32, -64 ), + }, + } + + render.SetLocalModelLights(CL_SHIRT) + -- render.Clear(0, 0, 0, 0, true, true) + render.Clear(0, 0, 0, 0) + render.ClearDepth( true ) + render.OverrideAlphaWriteEnable( true, true ) + + + -- rendering twice to get good alpha + render.SetBlend(1) + render.SetColorModulation(1, 1, 1) + render.MaterialOverride(matshiny) + render.OverrideColorWriteEnable(true, false) + + cam.Start3D( cam_pos, cam_ang, cam_fov, 0, 0, 64, 64, 0.1, 1000 ) + CL_FISTS:SetupBones() + CL_REALHANDS:SetupBones() + CL_REALHANDS:DrawModel( STUDIO_TWOPASS ) + cam.End3D() + + render.OverrideColorWriteEnable(false, false) + render.MaterialOverride() + + + render.SetWriteDepthToDestAlpha( true ) + render.OverrideBlend( true, BLEND_ONE, BLEND_ZERO, BLENDFUNC_ADD, BLEND_ZERO, BLEND_ONE, BLENDFUNC_ADD ) + cam.Start3D( cam_pos, cam_ang, cam_fov, 0, 0, 64, 64, 0.1, 1000 ) + CL_FISTS:SetupBones() + CL_REALHANDS:SetupBones() + CL_REALHANDS:DrawModel( STUDIO_TWOPASS ) + cam.End3D() + + render.MaterialOverride() + render.SetWriteDepthToDestAlpha( false ) + + render.OverrideBlend( false ) + render.SuppressEngineLighting(false) + + local HandBodygroups = CL_REALHANDS:GetBodyGroups() + for i = 0, #HandBodygroups - 1 do + if CL_REALHANDS:GetBodygroupCount(i) < 2 then continue end + cam.Start2D() + surface.SetDrawColor( 255, 255, 255, 255 ) + surface.SetMaterial(hasbgs) + surface.DrawTexturedRect(0, 0, 64, 64) + cam.End2D() + break + end + print( "Generating " .. result.model:StripExtension() ) + local data = render.Capture( { + format = "png", + x = 0, + y = 0, + w = 64, + h = 64 + } ) + + if !file.Exists("eps_hands", "DATA") then + file.CreateDir("eps_hands") + end + + local EXPLOSION = string.Explode( "/", result.model:StripExtension(), false ) + EXPLOSION[#EXPLOSION] = nil + EXPLOSION = table.concat( EXPLOSION, "/" ) + file.CreateDir( "eps_hands/" .. EXPLOSION ) + local fullpath = "eps_hands/" .. result.model:StripExtension() .. ".png" + file.Write( fullpath, data ) + + render.OverrideAlphaWriteEnable( false ) + render.SuppressEngineLighting( false ) + render.OverrideDepthEnable( false ) + render.PopRenderTarget() + --icon:SetModel("models/kleiner_animations.mdl") + icon:SetIcon( "data/eps_hands/" .. result.model:StripExtension() .. ".png" ) + --icon:SetTooltip( name .. "\n" .. result.model ) + + --local tab = {} + --tab.ent = CL_REALHANDS + --tab.cam_pos = Vector( 0, 0, 0 ) + --tab.cam_ang = Angle( 4, -18, 0 ) + --tab.cam_fov = 20 + + --self:RebuildSpawnIconEx( tab ) + + CL_FISTS:Remove() + CL_REALHANDS:Remove() + end + + -- Make a pretty ass icon + if !file.Exists( "eps_hands/" .. result.model:StripExtension() .. ".png", "DATA" ) then + print("IT DOESN'T EXIST", "eps_hands/" .. result.model:StripExtension() .. ".png") + if IsValid(icon) then + icon:MakeHandIcon() + end + else + --icon:SetModel("models/kleiner_animations.mdl") + icon:SetIcon( "data/eps_hands/" .. result.model:StripExtension() .. ".png" ) + --icon:SetTooltip( name .. "\n" .. result.model ) + end icon.DoClick = function() RunConsoleCommand( "cl_playerhands", name ) RunConsoleCommand( "cl_playerhandsbodygroups", "0" ) RunConsoleCommand( "cl_playerhandsskin", "0" ) timer.Simple( 0.1, function() Menu.UpdateFromConvars() end ) end - + icon.DoRightClick = function() + if IsValid(icon) then + icon:MakeHandIcon() + end + end + ModelList:AddLine( name, model ) end end - + end Menu.HandsPopulate() -------------------------------------------------------- local favorites = Menu.Right:Add( "DPanel" ) - Menu.Right:AddSheet( "Favorites", favorites, "icon16/star.png" ) + Menu.Right:AddSheet( "#EPS.Favorites", favorites, "icon16/star.png" ) favorites:DockPadding( 8, 8, 8, 8 ) local FavList = favorites:Add( "DListView" ) FavList:Dock( FILL ) FavList:SetMultiSelect( true ) - FavList:AddColumn( "Favorites" ) - FavList:AddColumn( "Model" ) - FavList:AddColumn( "Skin" ):SetFixedWidth( 25 ) - FavList:AddColumn( "Bodygroups" ) + FavList:AddColumn( "#EPS.Favorites" ) + FavList:AddColumn( "#EPS.Favorites.Model" ) + FavList:AddColumn( "#EPS.Favorites.Skin" ):SetFixedWidth( 40 ) + FavList:AddColumn( "#EPS.Favorites.Bodygroups" ) FavList.DoDoubleClick = function( id, sel ) local name = tostring( FavList:GetLine( sel ):GetValue( 1 ) ) if istable( Favorites[name] ) then @@ -856,7 +1052,7 @@ function Menu.Setup() b:Dock( TOP ) b:SetHeight( 25 ) b:DockMargin( 0, 0, 200, 10 ) - b:SetText( "Load selected Favorite" ) + b:SetText( "#EPS.Favorites.LoadFavorite" ) b.DoClick = function() local sel = FavList:GetSelected() if !sel[1] then return end @@ -865,7 +1061,7 @@ function Menu.Setup() RunConsoleCommand( "cl_playermodel", Favorites[name].model ) RunConsoleCommand( "cl_playerbodygroups", Favorites[name].bodygroups ) RunConsoleCommand( "cl_playerskin", Favorites[name].skin ) - timer.Simple( 0.1, function() + timer.Simple( 0.3, function() Menu.UpdateFromConvars() end ) end @@ -874,7 +1070,7 @@ function Menu.Setup() local t = favorites:Add( "DLabel" ) t:Dock( BOTTOM ) t:SetAutoStretchVertical( true ) - t:SetText( "Here you can save your favorite playermodel combinations. To do this:\n1. Select a model and setup the skin and bodygroups as you wish.\n2. Enter a unique name into the textfield and click \"Add new favorite\".\n3. Load your favorite by selecting it in the list below and clicking \"Load selected\".\nYou can also apply existing favorites by console command:\nplayermodel_loadfav \"the favorite's name\"" ) + t:SetText( "#EPS.Favorites.Desc" ) t:SetDark( true ) t:SetWrap( true ) @@ -900,7 +1096,7 @@ function Menu.Setup() local b = control:Add( "DButton" ) b:SetPos( 0, 30 ) b:SetSize( 125, 20 ) - b:SetText( "Add new favorite" ) + b:SetText( "#EPS.Favorites.AddNewFavorite" ) b.DoClick = function() local name = FavEntry:GetValue() if name == "" then return end @@ -910,7 +1106,7 @@ function Menu.Setup() local b = control:Add( "DButton" ) b:SetPos( 135, 30 ) b:SetSize( 125, 20 ) - b:SetText( "Replace selected" ) + b:SetText( "#EPS.Favorites.ReplaceSelected" ) b.DoClick = function() local sel = FavList:GetSelected() if sel[2] then return end @@ -922,7 +1118,7 @@ function Menu.Setup() local b = control:Add( "DButton" ) b:SetPos( 270, 30 ) b:SetSize( 125, 20 ) - b:SetText( "Delete all selected" ) + b:SetText( "#EPS.Favorites.DeleteAllSelected" ) b.DoClick = function() local sel = FavList:GetSelected() for k, v in pairs( sel ) do @@ -935,7 +1131,7 @@ function Menu.Setup() local bdcontrols = Menu.Right:Add( "DPanel" ) - local bgtab = Menu.Right:AddSheet( "Bodygroups", bdcontrols, "icon16/group.png" ) + local bgtab = Menu.Right:AddSheet( "#EPS.Bodygroups", bdcontrols, "icon16/group.png" ) bdcontrols:DockPadding( 8, 8, 8, 8 ) local bdcontrolspanel = bdcontrols:Add( "DPanelList" ) @@ -944,7 +1140,7 @@ function Menu.Setup() -- Hands local h__bdcontrols = Menu.Right:Add( "DPanel" ) - local h__bgtab = Menu.Right:AddSheet( "Handgroups", h__bdcontrols, "icon16/group_link.png" ) + local h__bgtab = Menu.Right:AddSheet( "#EPS.Handgroups", h__bdcontrols, "icon16/group_link.png" ) h__bdcontrols:DockPadding( 8, 8, 8, 8 ) h__bgtab.Tab.IsHandsTab = true @@ -955,7 +1151,7 @@ function Menu.Setup() local flexcontrols = Menu.Right:Add( "DPanel" ) - local flextab = Menu.Right:AddSheet( "Flexes", flexcontrols, "icon16/emoticon_wink.png" ) + local flextab = Menu.Right:AddSheet( "#EPS.Flexes", flexcontrols, "icon16/emoticon_wink.png" ) flexcontrols:DockPadding( 8, 8, 8, 8 ) local flexcontrolspanel = flexcontrols:Add( "DPanelList" ) @@ -964,11 +1160,11 @@ function Menu.Setup() local controls = Menu.Right:Add( "DPanel" ) - Menu.Right:AddSheet( "Colors", controls, "icon16/color_wheel.png" ) + Menu.Right:AddSheet( "#EPS.Colors", controls, "icon16/color_wheel.png" ) controls:DockPadding( 8, 8, 8, 8 ) local lbl = controls:Add( "DLabel" ) - lbl:SetText( "Player color" ) + lbl:SetText( "#EPS.Colors.PlayerColor" ) lbl:SetTextColor( Color( 0, 0, 0, 255 ) ) lbl:Dock( TOP ) @@ -979,7 +1175,7 @@ function Menu.Setup() plycol:SetSize( 200, ( fh - 160) / 2 ) local lbl = controls:Add( "DLabel" ) - lbl:SetText( "Physgun color" ) + lbl:SetText( "#EPS.Colors.PhysgunColor" ) lbl:SetTextColor( Color( 0, 0, 0, 255 ) ) lbl:DockMargin( 0, 8, 0, 0 ) lbl:Dock( TOP ) @@ -995,7 +1191,7 @@ function Menu.Setup() b:DockMargin( 0, 8, 0, 0 ) b:Dock( TOP ) b:SetSize( 150, 20 ) - b:SetText( "Reset to default values" ) + b:SetText( "#EPS.Colors.ResetToDefault" ) b.DoClick = function() plycol:SetVector( Vector( 0.24, 0.34, 0.41 ) ) wepcol:SetVector( Vector( 0.30, 1.80, 2.10 ) ) @@ -1005,11 +1201,11 @@ function Menu.Setup() local moretab = Menu.Right:Add( "DPropertySheet" ) - Menu.Right:AddSheet( "Settings", moretab, "icon16/key.png" ) + Menu.Right:AddSheet( "#EPS.Settings", moretab, "icon16/key.png" ) local panel = moretab:Add( "DPanel" ) - moretab:AddSheet( "Client", panel, "icon16/status_online.png" ) + moretab:AddSheet( "#EPS.Settings.Client", panel, "icon16/status_online.png" ) panel:DockPadding( 10, 10, 10, 10 ) local panel = panel:Add( "DScrollPanel" ) @@ -1020,7 +1216,7 @@ function Menu.Setup() c:Dock( TOP ) c:DockMargin( 0, 0, 0, 5 ) c:SetValue( GetConVar(c.cvar):GetBool() ) - c:SetText( "Enforce your playermodel" ) + c:SetText( "#EPS.Settings.Client.EnforcePM" ) c:SetDark( true ) c.OnChange = function( p, v ) RunConsoleCommand( c.cvar, v == true and "1" or "0" ) @@ -1030,7 +1226,7 @@ function Menu.Setup() t:Dock( TOP ) t:DockMargin( 0, 0, 0, 20 ) t:SetAutoStretchVertical( true ) - t:SetText( "If enabled, your selected playermodel will be protected. No other function will be able to change your playermodel anymore." ) + t:SetText( "#EPS.Settings.Client.EnforcePM.Desc" ) t:SetDark( true ) t:SetWrap( true ) @@ -1039,7 +1235,7 @@ function Menu.Setup() c:Dock( TOP ) c:DockMargin( 0, 0, 0, 5 ) c:SetValue( GetConVar(c.cvar):GetBool() ) - c:SetText( "Use Player color as background" ) + c:SetText( "#EPS.Settings.Client.PlayerColorBG" ) c:SetDark( true ) c:SizeToContents() c.OnChange = function( p, v ) @@ -1050,7 +1246,7 @@ function Menu.Setup() t:Dock( TOP ) t:DockMargin( 0, 0, 0, 20 ) t:SetAutoStretchVertical( true ) - t:SetText( "If enabled, your selected player color will be used as the menu background. If disabled, the background will be grey." ) + t:SetText( "#EPS.Settings.Client.PlayerColorBG.Desc" ) t:SetDark( true ) t:SetWrap( true ) @@ -1059,7 +1255,27 @@ function Menu.Setup() c:Dock( TOP ) c:DockMargin( 0, 0, 0, 5 ) c:SetValue( GetConVar(c.cvar):GetBool() ) - c:SetText( "Transparent background" ) + c:SetText( "#EPS.Settings.Client.TransparentBG" ) + c:SetDark( true ) + c:SizeToContents() + c.OnChange = function( p, v ) + RunConsoleCommand( c.cvar, v == true and "1" or "0" ) + end + + local t = panel:Add( "DLabel" ) + t:Dock( TOP ) + t:DockMargin( 0, 0, 0, 20 ) + t:SetAutoStretchVertical( true ) + t:SetText( "#EPS.Settings.Client.TransparentBG.Desc" ) + t:SetDark( true ) + t:SetWrap( true ) + + local c = panel:Add( "DCheckBoxLabel" ) + c.cvar = "cl_playermodel_selector_hide_defaults" + c:Dock( TOP ) + c:DockMargin( 0, 0, 0, 5 ) + c:SetValue( GetConVar(c.cvar):GetBool() ) + c:SetText( "#EPS.Settings.Client.HideDefaultPMs" ) c:SetDark( true ) c:SizeToContents() c.OnChange = function( p, v ) @@ -1070,7 +1286,28 @@ function Menu.Setup() t:Dock( TOP ) t:DockMargin( 0, 0, 0, 20 ) t:SetAutoStretchVertical( true ) - t:SetText( "If enabled, the menu backgroup will be transparent. If disabled, the background will be opaque." ) + t:SetText( "#EPS.Settings.Client.HideDefaultPMs.Desc" ) + t:SetDark( true ) + t:SetWrap( true ) + + local c = panel:Add( "DCheckBoxLabel" ) + c.cvar = "cl_playermodel_selector_ignorehands" + c:Dock( TOP ) + c:DockMargin( 0, 0, 0, 5 ) + c:SetValue( GetConVar(c.cvar):GetBool() ) + c:SetText( "#EPS.Settings.Client.IgnoreC_ArmsOnlyPMs" ) + c:SetDark( true ) + c:SizeToContents() + c.OnChange = function( p, v ) + RunConsoleCommand( c.cvar, v == true and "1" or "0" ) + Menu.ModelPopulate() + end + + local t = panel:Add( "DLabel" ) + t:Dock( TOP ) + t:DockMargin( 0, 0, 0, 20 ) + t:SetAutoStretchVertical( true ) + t:SetText( "#EPS.Settings.Client.IgnoreC_ArmsOnlyPMs.Desc" ) t:SetDark( true ) t:SetWrap( true ) @@ -1079,7 +1316,7 @@ function Menu.Setup() c:Dock( TOP ) c:DockMargin( 0, 0, 0, 5 ) c:SetValue( GetConVar(c.cvar):GetBool() ) - c:SetText( "Show flexes tab" ) + c:SetText( "#EPS.Settings.Client.ShowFlexes" ) c:SetDark( true ) c:SizeToContents() c.OnChange = function( p, v ) @@ -1091,7 +1328,7 @@ function Menu.Setup() t:Dock( TOP ) t:DockMargin( 0, 0, 0, 20 ) t:SetAutoStretchVertical( true ) - t:SetText( "This allows you to manipulate flexes on your playermodel. However, flex manipulation is not really made for playermodels and will cause issues. This includes the following:\n- Eye blinking no longer working.\n- Faces might be distorted unless the flexes are corrected manually.\n- Might break the faces of incompatible playermodels completely.\n- Even if you put all flexes to default value, the engine still considers them as manipulated. Models with problems won't be fixed.\nYou must switch your model once, for the tab to appear!" ) + t:SetText( "#EPS.Settings.Client.ShowFlexes.Desc" ) t:SetDark( true ) t:SetWrap( true ) @@ -1099,18 +1336,25 @@ function Menu.Setup() b:Dock( TOP ) b:DockMargin( 0, 0, 270, 5 ) b:SetHeight( 15 ) - b:SetText( "Rebuild spawn icons" ) + b:SetText( "#EPS.Settings.Client.RebuildIcon" ) b.DoClick = function() for _, icon in pairs( modelicons ) do icon:RebuildSpawnIcon() end + + -- local thecount = 0 + for _, icon in pairs( modelicons_forhands ) do + if IsValid(icon) then + icon:MakeHandIcon() + end + end end local t = panel:Add( "DLabel" ) t:Dock( TOP ) t:DockMargin( 0, 0, 0, 20 ) t:SetAutoStretchVertical( true ) - t:SetText( "Forces all playermodel icons to be re-rendered. Useful if the icons are outdated after custom models changed their appearance. This may take a while, depending on the number of models and your PC's speed." ) + t:SetText( "#EPS.Settings.Client.RebuildIcon.Desc" ) t:SetDark( true ) t:SetWrap( true ) @@ -1118,7 +1362,7 @@ function Menu.Setup() if LocalPlayer():IsAdmin() then local panel = moretab:Add( "DPanel" ) - moretab:AddSheet( "Server", panel, "icon16/world.png" ) + moretab:AddSheet( "#EPS.Settings.Server", panel, "icon16/world.png" ) panel:DockPadding( 10, 10, 10, 10 ) local panel = panel:Add( "DScrollPanel" ) @@ -1136,7 +1380,7 @@ function Menu.Setup() c:Dock( TOP ) c:DockMargin( 0, 0, 0, 5 ) c:SetValue( GetConVar(c.cvar):GetBool() ) - c:SetText( "Enable playermodel enforcement" ) + c:SetText( "#EPS.Settings.Server.EnablePMEnforcement" ) c:SetDark( true ) c.OnChange = ChangeCVar @@ -1144,7 +1388,7 @@ function Menu.Setup() t:Dock( TOP ) t:DockMargin( 0, 0, 0, 20 ) t:SetAutoStretchVertical( true ) - t:SetText( "If enabled, selected playermodels will be enforced and protected. No gamemodes, maps or addons can overwrite them anymore. Players can toggle this function individually, using the checkbox on top of the menu.\nIf disabled, only the manual button works outside of Sandbox." ) + t:SetText( "#EPS.Settings.Server.EnablePMEnforcement.Desc" ) t:SetDark( true ) t:SetWrap( true ) @@ -1153,7 +1397,7 @@ function Menu.Setup() c:Dock( TOP ) c:DockMargin( 0, 0, 0, 5 ) c:SetValue( GetConVar(c.cvar):GetBool() ) - c:SetText( "Allow instant changes" ) + c:SetText( "#EPS.Settings.Server.AllowInstantChanges" ) c:SetDark( true ) c.OnChange = ChangeCVar @@ -1161,7 +1405,7 @@ function Menu.Setup() t:Dock( TOP ) t:DockMargin( 0, 0, 0, 20 ) t:SetAutoStretchVertical( true ) - t:SetText( "If enabled, players can apply their changes instantly instead of having to respawn." ) + t:SetText( "#EPS.Settings.Server.AllowInstantChanges.Desc" ) t:SetDark( true ) t:SetWrap( true ) @@ -1170,7 +1414,7 @@ function Menu.Setup() c:Dock( TOP ) c:DockMargin( 0, 0, 0, 5 ) c:SetValue( GetConVar(c.cvar):GetBool() ) - c:SetText( "Allow players to change flexes" ) + c:SetText( "#EPS.Settings.Server.AllowFlexes" ) c:SetDark( true ) c.OnChange = ChangeCVar @@ -1178,7 +1422,7 @@ function Menu.Setup() t:Dock( TOP ) t:DockMargin( 0, 0, 0, 20 ) t:SetAutoStretchVertical( true ) - t:SetText( "If enabled, players can change the flexes for their playermodels. This will break player blinking and may cause other issues. Enable at own risk. Players can only reset their flexes by disconnecting." ) + t:SetText( "#EPS.Settings.Server.AllowFlexes.Desc" ) t:SetDark( true ) t:SetWrap( true ) @@ -1187,7 +1431,7 @@ function Menu.Setup() c:Dock( TOP ) c:DockMargin( 0, 0, 0, 5 ) c:SetValue( GetConVar(c.cvar):GetBool() ) - c:SetText( "Enable in all gamemodes" ) + c:SetText( "#EPS.Settings.Server.EnableInAllGM" ) c:SetDark( true ) c.OnChange = ChangeCVar @@ -1195,7 +1439,7 @@ function Menu.Setup() t:Dock( TOP ) t:DockMargin( 0, 0, 0, 20 ) t:SetAutoStretchVertical( true ) - t:SetText( "If enabled, the PlayerModel Selector will be available for all players in every gamemode. If disabled, only Admins can use it outside of Sandbox." ) + t:SetText( "#EPS.Settings.Server.EnableInAllGM.Desc" ) t:SetDark( true ) t:SetWrap( true ) @@ -1203,7 +1447,7 @@ function Menu.Setup() s.cvar = "sv_playermodel_selector_limit" s:Dock( TOP ) s:DockMargin( 0, 0, 0, 5 ) - s:SetText( "Request limit" ) + s:SetText( "#EPS.Settings.Server.RequestLimit" ) s:SetDark( true ) s:SetDecimals( 0 ) s:SetMax( 900 ) @@ -1219,13 +1463,13 @@ function Menu.Setup() t:Dock( TOP ) t:DockMargin( 0, 0, 0, 20 ) t:SetAutoStretchVertical( true ) - t:SetText( "Timelimit in seconds that players have to wait, before they can use the instant change function again. Set to 0 to disable." ) + t:SetText( "#EPS.Settings.Server.RequestLimit.Desc" ) t:SetDark( true ) t:SetWrap( true ) local panel = moretab:Add( "DPanel" ) - moretab:AddSheet( "GM Blacklist", panel, "icon16/delete.png" ) + moretab:AddSheet( "#EPS.Settings.GM_Blacklist", panel, "icon16/delete.png" ) panel:DockPadding( 10, 10, 10, 10 ) local Blacklist = panel:Add( "DListView" ) @@ -1233,7 +1477,7 @@ function Menu.Setup() Blacklist:DockMargin( 0, 0, 20, 0 ) Blacklist:SetWidth( 150 ) Blacklist:SetMultiSelect( true ) - Blacklist:AddColumn( "Blacklisted gamemodes" ) + Blacklist:AddColumn( "#EPS.Settings.GM_Blacklist.ExistedGM" ) net.Receive("lf_playermodel_blacklist", function() local tbl = net.ReadTable() @@ -1255,7 +1499,7 @@ function Menu.Setup() t:Dock( TOP ) t:DockMargin( 0, 0, 0, 20 ) t:SetAutoStretchVertical( true ) - t:SetText( "Here you can blacklist incompatible gamemodes.\n\nPlayers (including Admins) can't change their playermodels in those gamemodes, regardless of other settings." ) + t:SetText( "#EPS.Settings.GM_Blacklist.Desc" ) t:SetDark( true ) t:SetWrap( true ) @@ -1263,7 +1507,7 @@ function Menu.Setup() b:Dock( TOP ) b:DockMargin( 0, 0, 0, 20 ) b:SetHeight( 25 ) - b:SetText( "Add current gamemode to Blacklist" ) + b:SetText( "#EPS.Settings.GM_Blacklist.AddCurrent" ) b.DoClick = function() if GAMEMODE_NAME == "sandbox" then return end net.Start( "lf_playermodel_blacklist" ) @@ -1281,7 +1525,7 @@ function Menu.Setup() b:Dock( TOP ) b:DockMargin( 0, 0, 0, 20 ) b:SetHeight( 20 ) - b:SetText( "Manually add gamemode" ) + b:SetText( "#EPS.Settings.GM_Blacklist.ManuallyAddGM" ) b.DoClick = function() local name = TextEntry:GetValue() if name == "" or name == "sandbox" then return end @@ -1295,7 +1539,7 @@ function Menu.Setup() b:Dock( TOP ) b:DockMargin( 0, 0, 0, 0 ) b:SetHeight( 25 ) - b:SetText( "Remove selected gamemodes" ) + b:SetText( "#EPS.Settings.GM_Blacklist.RemoveSelected" ) b.DoClick = function() local tbl = { } local sel = Blacklist:GetSelected() @@ -1313,7 +1557,7 @@ function Menu.Setup() if TFAVOX_Models then local panel = moretab:Add( "DPanel" ) - moretab:AddSheet( "VOX", panel, "icon16/sound.png" ) + moretab:AddSheet( "#EPS.Settings.VOX", panel, "icon16/sound.png" ) panel:DockPadding( 10, 10, 10, 10 ) local VOXlist = panel:Add( "DListView" ) @@ -1321,8 +1565,8 @@ function Menu.Setup() VOXlist:DockMargin( 0, 0, 0, 10 ) VOXlist:SetHeight( ( fh - 126 - 44 ) / 2 ) -- 260 VOXlist:SetMultiSelect( true ) - VOXlist:AddColumn( "PlayerModel" ) - VOXlist:AddColumn( "assigned VOX pack" ) + VOXlist:AddColumn( "#EPS.Settings.VOX.PlayerModel" ) + VOXlist:AddColumn( "#EPS.Settings.VOX.Assigned" ) net.Receive("lf_playermodel_voxlist", function() local tbl = net.ReadTable() @@ -1351,7 +1595,7 @@ function Menu.Setup() VOXinstalled:DockMargin( 0, 10, 0, 0 ) VOXinstalled:SetHeight( ( fh - 126 - 44 ) / 2 ) VOXinstalled:SetMultiSelect( false ) - VOXinstalled:AddColumn( "Available VOX packs" ) + VOXinstalled:AddColumn( "#EPS.Settings.VOX.AvailableVOX" ) if istable( TFAVOX_Models ) then for k, v in pairs( TFAVOX_Models ) do @@ -1364,7 +1608,7 @@ function Menu.Setup() b:Dock( LEFT ) --b:DockPadding( 100, 0, 100, 0 ) b:SetWidth( 200 ) - b:SetText( "Assign VOX pack to current PlayerModel" ) + b:SetText( "#EPS.Settings.VOX.AssignToCurrent" ) b.DoClick = function() local sel = VOXinstalled:GetSelected() if !sel[1] then return end @@ -1381,7 +1625,7 @@ function Menu.Setup() b:Dock( RIGHT ) --b:DockPadding( 100, 0, 100, 0 ) b:SetWidth( 170 ) - b:SetText( "Remove selected assignment" ) + b:SetText( "#EPS.Settings.VOX.RemoveSelected" ) b.DoClick = function() local tbl = { } local sel = VOXlist:GetSelected() @@ -1401,7 +1645,7 @@ function Menu.Setup() local panel = moretab:Add( "DPanel" ) - moretab:AddSheet( "Info", panel, "icon16/information.png" ) + moretab:AddSheet( "#EPS.Settings.Info", panel, "icon16/information.png" ) panel:DockPadding( 0, 0, 0, 0 ) local t = panel:Add( "DHTML" ) @@ -1412,9 +1656,12 @@ function Menu.Setup() t:AddFunction( "url", "open", function( str ) gui.OpenURL( str ) end ) t:AddFunction( "url", "copy", function( str ) SetClipboardText( str ) end ) + local title = string.format(language.GetPhrase("EPS.Title"),Version) + local intro = [[Created by LibertyForce.
Thank you for installing this addon! Enjoying it?
Modified by Fesiug. You can now customize your hands!
Modified by YuRaNnNzZZ. You can see your selected hands!
+ Modified by Insane Black Rock Shooter. Localization Support!
Please leave a LIKE on the workshop page.]] if !game.SinglePlayer() and !LocalPlayer():IsSuperAdmin() then intro = [[This server is running Enhanced PlayerModel Selector by LibertyForce. Enjoying it?
@@ -1435,6 +1682,12 @@ function Menu.Setup() font-size: 15px; color: #5aa9d6; font-weight: bold; + margin: 0; + padding: 0px 0px 4px 0px; + } + h3, h4, h5, h6 { + margin: 0; + padding: 2px 0px 6px 0px; } h1 { font-size: 20px; @@ -1464,24 +1717,47 @@ function Menu.Setup() -

Enhanced Playermodel Selector ]]..Version..[[

-

]]..intro..[[

+

]]..title..[[

+

]]..intro..[[

Compatible Addons

Enhanced Playermodel Selector provides additional functionality with those addons installed:

More addons

+ + + + + + + + + + + + + + + + + + + + + + +

Translators:

Language:

Insane Black Rock Shooter Simplified Chinese
Berry Russian
Stann Polish
憨憨羊の宇航鸽鸽 Traditional Chinese
Tora Turkish
GermanMaKo German

Left click: Open in Steam Overlay.
Right click: Copy URL to clipboard for use in browser.

@@ -1494,6 +1770,7 @@ function Menu.Setup() function Menu.MakeNiceName( str ) local newname = {} + if string.find(str, ".smd") then str = string.sub(str, 0, -5) end for _, s in pairs( string.Explode( "_", str ) ) do if ( string.len( s ) == 1 ) then table.insert( newname, string.upper( s ) ) continue end @@ -1504,7 +1781,7 @@ function Menu.Setup() end function Menu.PlayHandsPreviewAnimation( panel, playermodel ) - local iSeq = panel.EntityHandsAnim:LookupSequence( "seq_admire" ) + local iSeq = panel.EntityHandsAnim:LookupSequence( "idle" ) if ( iSeq > 0 ) then panel.EntityHandsAnim:ResetSequence( iSeq ) end end @@ -1513,13 +1790,13 @@ function Menu.Setup() if ( !panel or !IsValid( panel.Entity ) ) then return end - local anims = list.Get( "PlayerOptionsAnimations" ) + -- local anims = list.Get( "PlayerOptionsAnimations" ) - local anim = default_animations[ math.random( 1, #default_animations ) ] - if ( anims[ playermodel ] ) then - anims = anims[ playermodel ] - anim = anims[ math.random( 1, #anims ) ] - end + local anim = default_animations[ currentanim+1 ] + -- if ( anims[ playermodel ] ) then + -- anims = anims[ playermodel ] + -- anim = anims[ math.random( 1, #anims ) ] + -- end local iSeq = panel.Entity:LookupSequence( anim ) if ( iSeq > 0 ) then panel.Entity:ResetSequence( iSeq ) end @@ -1533,7 +1810,7 @@ function Menu.Setup() if ( pnl.type == "bgroup" ) then - if ( not handsTabActive ) then mdl.Entity:SetBodygroup( pnl.typenum, math.Round( val ) ) end + if ( not handsTabActive ) then ModelPreview.Entity:SetBodygroup( pnl.typenum, math.Round( val ) ) end local str = string.Explode( " ", GetConVar( "cl_playerbodygroups" ):GetString() ) if ( #str < pnl.typenum + 1 ) then for i = 1, pnl.typenum + 1 do str[ i ] = str[ i ] or 0 end end @@ -1542,7 +1819,7 @@ function Menu.Setup() elseif ( pnl.type == "flex" ) then - if ( not handsTabActive ) then mdl.Entity:SetFlexWeight( pnl.typenum, math.Round( val, 2 ) ) end + if ( not handsTabActive ) then ModelPreview.Entity:SetFlexWeight( pnl.typenum, math.Round( val, 2 ) ) end local str = string.Explode( " ", GetConVar( "cl_playerflexes" ):GetString() ) if ( #str < pnl.typenum + 1 ) then for i = 1, pnl.typenum + 1 do str[ i ] = str[ i ] or 0 end end @@ -1551,12 +1828,12 @@ function Menu.Setup() elseif ( pnl.type == "skin" ) then - if ( not handsTabActive ) then mdl.Entity:SetSkin( math.Round( val ) ) end + if ( not handsTabActive ) then ModelPreview.Entity:SetSkin( math.Round( val ) ) end RunConsoleCommand( "cl_playerskin", math.Round( val ) ) elseif ( pnl.type == "h__bgroup" ) then - if true or ( handsTabActive ) then mdl.EntityHands:SetBodygroup( pnl.typenum, math.Round( val ) ) end + if true or ( handsTabActive ) then ModelPreview.EntityHands:SetBodygroup( pnl.typenum, math.Round( val ) ) end local str = string.Explode( " ", GetConVar( "cl_playerhandsbodygroups" ):GetString() ) if ( #str < pnl.typenum + 1 ) then for i = 1, pnl.typenum + 1 do str[ i ] = str[ i ] or 0 end end @@ -1565,7 +1842,7 @@ function Menu.Setup() elseif ( pnl.type == "h__skin" ) then - if true or ( handsTabActive ) then mdl.EntityHands:SetSkin( math.Round( val ) ) end + if true or ( handsTabActive ) then ModelPreview.EntityHands:SetSkin( math.Round( val ) ) end RunConsoleCommand( "cl_playerhandsskin", math.Round( val ) ) end @@ -1580,11 +1857,11 @@ function Menu.Setup() h__bgtab.Tab:SetVisible( false ) flextab.Tab:SetVisible( false ) - local nskins = mdl.Entity:SkinCount() - 1 + local nskins = ModelPreview.Entity:SkinCount() - 1 if ( nskins > 0 ) then local skins = vgui.Create( "DNumSlider" ) skins:Dock( TOP ) - skins:SetText( "Skin" ) + skins:SetText( "#EPS.Skin" ) skins:SetDark( true ) skins:SetTall( 50 ) skins:SetDecimals( 0 ) @@ -1595,41 +1872,62 @@ function Menu.Setup() bdcontrolspanel:AddItem( skins ) - mdl.Entity:SetSkin( GetConVar( "cl_playerskin" ):GetInt() ) + ModelPreview.Entity:SetSkin( GetConVar( "cl_playerskin" ):GetInt() ) bgtab.Tab:SetVisible( true ) end local groups = string.Explode( " ", GetConVar( "cl_playerbodygroups" ):GetString() ) - for k = 0, mdl.Entity:GetNumBodyGroups() - 1 do - if ( mdl.Entity:GetBodygroupCount( k ) <= 1 ) then continue end + for k = 0, ModelPreview.Entity:GetNumBodyGroups() - 1 do + if ( ModelPreview.Entity:GetBodygroupCount( k ) <= 1 ) then continue end local bgroup = vgui.Create( "DNumSlider" ) bgroup:Dock( TOP ) - bgroup:SetText( Menu.MakeNiceName( mdl.Entity:GetBodygroupName( k ) ) ) + bgroup:SetText( Menu.MakeNiceName( ModelPreview.Entity:GetBodygroupName( k ) ) ) bgroup:SetDark( true ) bgroup:SetTall( 50 ) bgroup:SetDecimals( 0 ) bgroup.type = "bgroup" bgroup.typenum = k - bgroup:SetMax( mdl.Entity:GetBodygroupCount( k ) - 1 ) + bgroup:SetMax( ModelPreview.Entity:GetBodygroupCount( k ) - 1 ) bgroup:SetValue( groups[ k + 1 ] or 0 ) - bgroup.OnValueChanged = Menu.UpdateBodyGroups + -- bgroup.OnValueChanged = Menu.UpdateBodyGroups bdcontrolspanel:AddItem( bgroup ) + + local tgroup + local submdls = ModelPreview.Entity:GetBodyGroups()[k+1].submodels + if istable(submdls) then + local mdl = submdls[tonumber(groups[ k + 1 ] or 0)] or "idk" + tgroup = vgui.Create( "DLabel" ) + tgroup:Dock( TOP ) + tgroup:DockMargin(10, -15, 0, 0) + tgroup:SetText( Menu.MakeNiceName( mdl )) + + bdcontrolspanel:AddItem( tgroup ) + end - mdl.Entity:SetBodygroup( k, groups[ k + 1 ] or 0 ) + bgroup.OnValueChanged = function(something1, val) + local submdls = ModelPreview.Entity:GetBodyGroups()[k+1].submodels + if istable(submdls) then + tgroup:SetText(Menu.MakeNiceName(submdls[math.Round(val)]) or "idk") + end + + Menu.UpdateBodyGroups(something1, val) + end + + ModelPreview.Entity:SetBodygroup( k, groups[ k + 1 ] or 0 ) bgtab.Tab:SetVisible( true ) end -- Hands - if GetConVar( "cl_playerhands" ):GetString() and GetConVar( "cl_playerhands" ):GetString() != "" and ( IsValid( mdl.EntityHands ) ) then - local nskins = mdl.EntityHands:SkinCount() - 1 + if GetConVar( "cl_playerhands" ):GetString() and GetConVar( "cl_playerhands" ):GetString() != "" and ( IsValid( ModelPreview.EntityHands ) ) then + local nskins = ModelPreview.EntityHands:SkinCount() - 1 if ( nskins > 0 ) then local skins = vgui.Create( "DNumSlider" ) skins:Dock( TOP ) - skins:SetText( "Skin" ) + skins:SetText( "#EPS.Skin" ) skins:SetDark( true ) skins:SetTall( 50 ) skins:SetDecimals( 0 ) @@ -1640,30 +1938,50 @@ function Menu.Setup() h__bdcontrolspanel:AddItem( skins ) - mdl.EntityHands:SetSkin( GetConVar( "cl_playerhandsskin" ):GetInt() ) + ModelPreview.EntityHands:SetSkin( GetConVar( "cl_playerhandsskin" ):GetInt() ) h__bgtab.Tab:SetVisible( true ) end local groups = string.Explode( " ", GetConVar( "cl_playerhandsbodygroups" ):GetString() ) - for k = 0, mdl.EntityHands:GetNumBodyGroups() - 1 do - if ( mdl.EntityHands:GetBodygroupCount( k ) <= 1 ) then continue end + for k = 0, ModelPreview.EntityHands:GetNumBodyGroups() - 1 do + if ( ModelPreview.EntityHands:GetBodygroupCount( k ) <= 1 ) then continue end local bgroup = vgui.Create( "DNumSlider" ) bgroup:Dock( TOP ) - bgroup:SetText( Menu.MakeNiceName( mdl.EntityHands:GetBodygroupName( k ) ) ) + bgroup:SetText( Menu.MakeNiceName( ModelPreview.EntityHands:GetBodygroupName( k ) ) ) bgroup:SetDark( true ) bgroup:SetTall( 50 ) bgroup:SetDecimals( 0 ) bgroup.type = "h__bgroup" bgroup.typenum = k - bgroup:SetMax( mdl.EntityHands:GetBodygroupCount( k ) - 1 ) + bgroup:SetMax( ModelPreview.EntityHands:GetBodygroupCount( k ) - 1 ) bgroup:SetValue( groups[ k + 1 ] or 0 ) bgroup.OnValueChanged = Menu.UpdateBodyGroups h__bdcontrolspanel:AddItem( bgroup ) - mdl.EntityHands:SetBodygroup( k, groups[ k + 1 ] or 0 ) + local tgroup + local submdls = ModelPreview.EntityHands:GetBodyGroups()[k+1].submodels + if istable(submdls) then + local mdl = submdls[tonumber(groups[ k + 1 ] or 0)] or "idk" + tgroup = vgui.Create( "DLabel" ) + tgroup:Dock( TOP ) + tgroup:DockMargin(10, -15, 0, 0) + tgroup:SetText( Menu.MakeNiceName( mdl )) + + h__bdcontrolspanel:AddItem( tgroup ) + end + + bgroup.OnValueChanged = function(something1, val) + local submdls = ModelPreview.EntityHands:GetBodyGroups()[k+1].submodels + if istable(submdls) then + tgroup:SetText(Menu.MakeNiceName(submdls[math.Round(val)]) or "idk") + end + + Menu.UpdateBodyGroups(something1, val) + end + ModelPreview.EntityHands:SetBodygroup( k, groups[ k + 1 ] or 0 ) h__bgtab.Tab:SetVisible( true ) end @@ -1674,21 +1992,21 @@ function Menu.Setup() local t = vgui.Create( "DLabel" ) t:Dock( TOP ) t:SetTall( 70 ) - t:SetText( "Notes:\n-The model preview for flexes doesn't work correctly. However, they will be visible on your playermodel when you apply them.\n- The default values provided might not be correct and cause distorted faces.\n- There is no way to reset (or fix) flex manipulation besides disconnecting." ) + t:SetText( "#EPS.Notes" ) t:SetDark( true ) t:SetWrap( true ) flexcontrolspanel:AddItem( t ) local flexes = string.Explode( " ", GetConVar( "cl_playerflexes" ):GetString() ) - for k = 0, mdl.Entity:GetFlexNum() - 1 do - if ( mdl.Entity:GetFlexNum( k ) <= 1 ) then continue end + for k = 0, ModelPreview.Entity:GetFlexNum() - 1 do + if ( ModelPreview.Entity:GetFlexNum( k ) <= 1 ) then continue end local flex = vgui.Create( "DNumSlider" ) - local vmin, vmax = mdl.Entity:GetFlexBounds( k ) + local vmin, vmax = ModelPreview.Entity:GetFlexBounds( k ) local default = 0 if vmin == -1 and vmax == 1 then default = 0.5 end flex:Dock( TOP ) - flex:SetText( Menu.MakeNiceName( mdl.Entity:GetFlexName( k ) ) ) + flex:SetText( Menu.MakeNiceName( ModelPreview.Entity:GetFlexName( k ) ) ) flex:SetDark( true ) flex:SetTall( 30 ) flex:SetDecimals( 2 ) @@ -1701,7 +2019,7 @@ function Menu.Setup() flexcontrolspanel:AddItem( flex ) - mdl.Entity:SetFlexWeight( k, flexes[ k + 1 ] or default ) + ModelPreview.Entity:SetFlexWeight( k, flexes[ k + 1 ] or default ) flextab.Tab:SetVisible( true ) end @@ -1711,45 +2029,45 @@ function Menu.Setup() Menu.Right:InvalidateLayout( true ) end - local handsAnimModel = Model( "models/weapons/c_arms_combine.mdl" ) + local handsAnimModel = Model( "models/weapons/chand_checker.mdl" ) function Menu.UpdateFromConvars() - if ( IsValid( mdl.EntityHands ) ) then - mdl.EntityHands:Remove() + if ( IsValid( ModelPreview.EntityHands ) ) then + ModelPreview.EntityHands:Remove() end - if ( IsValid( mdl.EntityHandsAnim ) ) then - mdl.EntityHandsAnim:Remove() + if ( IsValid( ModelPreview.EntityHandsAnim ) ) then + ModelPreview.EntityHandsAnim:Remove() end - mdl.EntityHandsAnim = ClientsideModel( handsAnimModel, RENDERGROUP_OTHER ) - mdl.EntityHandsAnim:SetNoDraw( true ) - mdl.EntityHandsAnim:SetPos( Vector( -100, 0, -61 ) ) + ModelPreview.EntityHandsAnim = ClientsideModel( handsAnimModel, RENDERGROUP_OTHER ) + ModelPreview.EntityHandsAnim:SetNoDraw( true ) + ModelPreview.EntityHandsAnim:SetPos( Vector( 0, 0, 0 ) ) if true or ( Menu.IsHandsTabActive() ) then - mdl:SetModel( handsAnimModel ) + ModelPreview:SetModel( handsAnimModel ) local model = LocalPlayer():GetInfo( "cl_playerhands" ) if ( model == "" ) then model = LocalPlayer():GetInfo( "cl_playermodel" ) end - local mdlhands = player_manager.TranslatePlayerHands( model ) + local HandsModel = player_manager.TranslatePlayerHands( model ) - util.PrecacheModel( mdlhands.model ) + util.PrecacheModel( HandsModel.model ) - mdl.EntityHands = ClientsideModel( mdlhands.model, RENDERGROUP_OTHER ) - mdl.EntityHands:SetParent( mdl.EntityHandsAnim ) - mdl.EntityHands:SetNoDraw( true ) + ModelPreview.EntityHands = ClientsideModel( HandsModel.model, RENDERGROUP_OTHER ) + ModelPreview.EntityHands:SetParent( ModelPreview.EntityHandsAnim ) + ModelPreview.EntityHands:SetNoDraw( true ) - local dumbassproof = mdlhands.skin + local dumbassproof = HandsModel.skin if !isnumber( dumbassproof ) then dumbassproof = 0 end - mdl.EntityHands:SetSkin( dumbassproof ) - mdl.EntityHands:SetBodyGroups( mdlhands.body ) - mdl.EntityHands.GetPlayerColor = function() return Vector( GetConVar( "cl_playercolor" ):GetString() ) end + ModelPreview.EntityHands:SetSkin( dumbassproof ) + ModelPreview.EntityHands:SetBodyGroups( HandsModel.body ) + ModelPreview.EntityHands.GetPlayerColor = function() return Vector( GetConVar( "cl_playercolor" ):GetString() ) end - Menu.PlayHandsPreviewAnimation( mdl, model ) + Menu.PlayHandsPreviewAnimation( ModelPreview, model ) --Menu.RebuildBodygroupTab() --return end @@ -1758,14 +2076,14 @@ function Menu.Setup() local model = LocalPlayer():GetInfo( "cl_playermodel" ) local modelname = player_manager.TranslatePlayerModel( model ) util.PrecacheModel( modelname ) - mdl:SetModel( modelname ) - mdl.Entity.GetPlayerColor = function() return Vector( GetConVar( "cl_playercolor" ):GetString() ) end - mdl.Entity:SetPos( Vector( -100, 0, -61 ) ) + ModelPreview:SetModel( modelname ) + ModelPreview.Entity.GetPlayerColor = function() return Vector( GetConVar( "cl_playercolor" ):GetString() ) end + ModelPreview.Entity:SetPos( Vector( -100, 0, -61 ) ) plycol:SetVector( Vector( GetConVar( "cl_playercolor" ):GetString() ) ) wepcol:SetVector( Vector( GetConVar( "cl_weaponcolor" ):GetString() ) ) - Menu.PlayPreviewAnimation( mdl, model ) + Menu.PlayPreviewAnimation( ModelPreview, model ) Menu.RebuildBodygroupTab() end @@ -1785,19 +2103,19 @@ function Menu.Setup() -- Hold to rotate - function mdl:DragMousePress( button ) + function ModelPreview:DragMousePress( button ) self.PressX, self.PressY = gui.MousePos() self.Pressed = button end - function mdl:OnMouseWheeled( delta ) - self.WheelD = delta * -10 + function ModelPreview:OnMouseWheeled( delta ) + self.WheelD = delta * -5 self.Wheeled = true end - function mdl:DragMouseRelease() self.Pressed = false end + function ModelPreview:DragMouseRelease() self.Pressed = false end - function mdl:RunAnimation() -- override to restart hands animation + function ModelPreview:RunAnimation() -- override to restart hands animation if ( Menu.IsHandsTabActive() and self.Entity:GetCycle() > 0.99 ) then self.Entity:SetCycle( 0 ) end @@ -1806,31 +2124,33 @@ function Menu.Setup() end local handsang = Angle( 0, 180, 0 ) + local handspos = Vector( -2, 0, -2 ) - function mdl:LayoutEntity( Entity ) + function ModelPreview:LayoutEntity( Entity ) if ( self.bAnimated ) then self:RunAnimation() end if ( Menu.IsHandsTabActive() ) then self.WasHandsTab = true - self:SetFOV( 65 ) + self:SetFOV( 45 ) -- Hands FOV self.Angles = handsang - self.Pos = vector_origin + self.Pos = handspos self.EntityHandsAnim:SetAngles( self.Angles ) self.EntityHandsAnim:SetPos( self.Pos ) - self.EntityHandsAnim:SetCycle( math.Remap((CurTime()/3) % 1, 0, 1, 0.05, 0.95) ) + self.EntityHandsAnim:SetCycle( math.Remap((CurTime()/8) % 1, 0, 1, 0.01, 0.99) ) return elseif ( self.WasHandsTab ) then -- reset position on tab switch self.WasHandsTab = false - self:SetFOV( 36 ) + self:SetFOV( 36 ) -- PM FOV after switching back from Hands Tab self.Pos = Vector( -100, 0, -61 ) self.Angles = Angle( 0, 0, 0 ) + self.AngleOffset = Angle( 0, 0, 0 ) end if ( self.Pressed == MOUSE_LEFT ) then @@ -1842,14 +2162,14 @@ function Menu.Setup() if ( self.Pressed == MOUSE_RIGHT ) then local mx, my = gui.MousePos() - self.Angles = self.Angles - Angle( ( self.PressY*(0.5) or my*(0.5) ) - my*(0.5), 0, ( self.PressX*(-0.5) or mx*(-0.5) ) - mx*(-0.5) ) - + self.AngleOffset = Angle( ( self.PressY*(0.15) or my*(0.15) ) - my*(0.15), 0, ( self.PressX*(-0.15) or mx*(-0.15) ) - mx*(-0.15) ) + self.Pos, self.Angles = RRRotateAroundPoint(self.Pos, self.Angles, Vector(0, 0, self.Pos.z * -0.5), self.AngleOffset) self.PressX, self.PressY = gui.MousePos() end if ( self.Pressed == MOUSE_MIDDLE ) then local mx, my = gui.MousePos() - self.Pos = self.Pos - Vector( 0, ( self.PressX*(0.5) or mx*(0.5) ) - mx*(0.5), ( self.PressY*(-0.5) or my*(-0.5) ) - my*(-0.5) ) + self.Pos = self.Pos - Vector( 0, ( self.PressX*(0.15) or mx*(0.15) ) - mx*(0.15), ( self.PressY*(-0.15) or my*(-0.15) ) - my*(-0.15) ) self.PressX, self.PressY = gui.MousePos() end @@ -1874,13 +2194,13 @@ end function Menu.Toggle() if LocalPlayer():IsAdmin() or GAMEMODE_NAME == "sandbox" or GetConVar( "sv_playermodel_selector_gamemodes" ):GetBool() then - if IsValid( Frame ) then - Frame:ToggleVisible() + if IsValid( MainWindow ) then + MainWindow:ToggleVisible() else Menu.Setup() end else - if IsValid( Frame ) then Frame:Close() end + if IsValid( MainWindow ) then MainWindow:Close() end end end diff --git a/materials/eps/hasbgs2.png b/materials/eps/hasbgs2.png new file mode 100644 index 0000000..2e637fc Binary files /dev/null and b/materials/eps/hasbgs2.png differ diff --git a/materials/eps/hasbgs3.png b/materials/eps/hasbgs3.png new file mode 100644 index 0000000..57dc8ec Binary files /dev/null and b/materials/eps/hasbgs3.png differ diff --git a/materials/eps/hasbgs4.png b/materials/eps/hasbgs4.png new file mode 100644 index 0000000..87eea1b Binary files /dev/null and b/materials/eps/hasbgs4.png differ diff --git a/models/weapons/chand_checker.dx80.vtx b/models/weapons/chand_checker.dx80.vtx new file mode 100644 index 0000000..e8b8d12 Binary files /dev/null and b/models/weapons/chand_checker.dx80.vtx differ diff --git a/models/weapons/chand_checker.dx90.vtx b/models/weapons/chand_checker.dx90.vtx new file mode 100644 index 0000000..21d8d63 Binary files /dev/null and b/models/weapons/chand_checker.dx90.vtx differ diff --git a/models/weapons/chand_checker.mdl b/models/weapons/chand_checker.mdl new file mode 100644 index 0000000..a7b421a Binary files /dev/null and b/models/weapons/chand_checker.mdl differ diff --git a/models/weapons/chand_checker.vvd b/models/weapons/chand_checker.vvd new file mode 100644 index 0000000..708abae Binary files /dev/null and b/models/weapons/chand_checker.vvd differ diff --git a/resource/localization/de/enhanced_playermodel_selector.properties b/resource/localization/de/enhanced_playermodel_selector.properties new file mode 100644 index 0000000..41e8fa6 --- /dev/null +++ b/resource/localization/de/enhanced_playermodel_selector.properties @@ -0,0 +1,99 @@ + +EPS.Title=Enhanced PlayerModel Selector %s, Fesiug's Edit + +# Main Buttons +EPS.Reset=Zurücksetzen +EPS.NextAnim=Nächste Animation +EPS.ApplyPM=Spielermodell anwenden +EPS.VisitAddonPage=Addon Seite besuchen + +EPS.Search=Suche... + +# Model Sheet +EPS.Model=Modell +EPS.Model.Icons=Symbole +EPS.Model.Table=Tabelle +EPS.Model.Table.Model=Modell +EPS.Model.Table.Path=Weg + +# Hands Sheet +EPS.Hands=Hände +EPS.Hands.Icons=Symbole +EPS.Hands.Table=Tabelle +EPS.Hands.Table.Model=Modell +EPS.Hands.Table.Path=Weg +EPS.Hands.UsePM=Playermodel benutzen + +# Favorites Sheet +EPS.Favorites=Favoriten +EPS.Favorites.Model=Modell +EPS.Favorites.Skin=Skin +EPS.Favorites.Bodygroups=Körper-Gruppen +EPS.Favorites.LoadFavorite=Ausgewähltes Favorit auswählen +EPS.Favorites.Desc=Hier können Sie Ihre bevorzugten Spielermodellkombinationen speichern. Um dies zu tun:\n1. Wählen Sie ein Modell aus und richten Sie die Körpergruppen und Skin nach Ihren Wunsch ein.\n2. Geben Sie einen eindeutigen Namen in das Textfeld ein und klicken Sie auf „Neuen Favoriten hinzufügen“.\n3. Laden Sie Ihren Favoriten, indem Sie ihn in der Liste unten auswählen und auf „Ausgewählte laden“ klicken.\nSie können vorhandene Favoriten auch mit dem Konsolenbefehl anwenden:\nplayermodel_loadfav „Name des Favoriten“ +EPS.Favorites.AddNewFavorite=Neuen Favouriten hinzufügen +EPS.Favorites.ReplaceSelected=Ausgewähltes ersetzen +EPS.Favorites.DeleteAllSelected=Alles ausgewählte löschen + +# Bodygroups Sheet +EPS.Bodygroups=Körpergruppen + +EPS.Handgroups=Handgruppen + +EPS.Skin=Skin + +EPS.Flexes=Flexes +EPS.Notes=Zusatz:\n-Die Modellvorschau für Flexes funktioniert nicht richtig. Sie sind jedoch auf Ihrem Spielermodell sichtbar, wenn Sie sie anwenden.\n- Die bereitgestellten Standardwerte sind möglicherweise nicht korrekt und führen zu verzerrten Gesichtern.\n- Es gibt keine Möglichkeit, die Flex-Manipulation zurückzusetzen (oder zu reparieren), außer die Verbindung zu trennen. + +# Colors Sheet +EPS.Colors=Farben +EPS.Colors.PlayerColor=Spieler Farbe +EPS.Colors.PhysgunColor=Physgun Farbe +EPS.Colors.ResetToDefault=Auf Standardwerte zurücksetzen + +# Settings Sheet +EPS.Settings=Einstellungen +EPS.Settings.Client=Klient +EPS.Settings.Client.EnforcePM=Spielermodell durchsetzen +EPS.Settings.Client.EnforcePM.Desc=Falls aktiviert, wird Ihr ausgewähltes Spielermodell geschützt. Keine andere Funktion kann Ihr Spielermodell mehr ändern. +EPS.Settings.Client.PlayerColorBG=Spielerfarbe als Hintergrund benutzen +EPS.Settings.Client.PlayerColorBG.Desc=Falls aktiviert, wird die von Ihnen ausgewählte Spielerfarbe als Menühintergrund verwendet. Falls deaktiviert, ist der Hintergrund grau. +EPS.Settings.Client.TransparentBG=Durchsichtiger Hintergrund +EPS.Settings.Client.TransparentBG.Desc=Falls aktiviert, ist der Menühintergrund durchsichtig. Falls deaktiviert, ist der Hintergrund undurchsichtig. +EPS.Settings.Client.HideDefaultPMs=Standard Spielermodell ausblenden +EPS.Settings.Client.HideDefaultPMs.Desc=Falls aktiviert, werden die Standard Spielermodelle ausgeblendet. Dieses Fenster muss erneut geöffnet werden. +EPS.Settings.Client.IgnoreC_ArmsOnlyPMs=Ignore c_hands only "playermodels" in main list +EPS.Settings.Client.IgnoreC_ArmsOnlyPMs.Desc=If enabled, "playermodels" that are nothing but floating pair of hands will be not shown in list of available playermodels. Disable to see all registered playermodels. +EPS.Settings.Client.ShowFlexes=Flexes-Tab anzeigen +EPS.Settings.Client.ShowFlexes.Desc=Dadurch können Sie die Flexes Ihres Spielermodells manipulieren. Allerdings ist die Flex-Manipulation nicht wirklich für Spielermodelle geeignet und wird Probleme verursachen. Dazu gehört Folgendes:\n- Das Augenzwinkern funktioniert nicht mehr.\n- Gesichter könnten verzerrt sein, es sei denn, die Flexen werden manuell korrigiert.\n- Könnte die Gesichter inkompatibler Spielermodelle vollständig beschädigen.\n- Auch wenn Sie alle Flexen zu Standardwert zurückstellen, die Engine betrachtet sie immer noch als manipuliert. Modelle mit Problemen werden nicht repariert.\nSie müssen Ihr Modell einmal wechseln, damit die Tab angezeigt wird! +EPS.Settings.Client.RebuildIcon=Spawn-Symbole neu erstellen +EPS.Settings.Client.RebuildIcon.Desc=Setzt durch, dass alle Spielermodellsymbole neu gerendert werden. Nützlich, wenn die Symbole veraltet sind, nachdem benutzerdefinierte Modelle ihr Aussehen geändert haben. Dies kann je nach Anzahl der Modelle und der Geschwindigkeit Ihres PCs eine Weile dauern. + +EPS.Settings.Server=Server +EPS.Settings.Server.EnablePMEnforcement=Durchsetzung des Spielermodells aktivieren +EPS.Settings.Server.EnablePMEnforcement.Desc=Fals aktiviert, werden ausgewählte Spielermodelle durchgesetzt und geschützt. Keine Spielmodi, Karten oder Add-ons können diese mehr überschreiben. Spieler können diese Funktion individuell umschalten, indem sie das Kontrollkästchen oben im Menü verwenden.\nFalls deaktiviert, funktioniert nur die manuelle Schaltfläche außerhalb von Sandbox. +EPS.Settings.Server.AllowInstantChanges=Sofortige Änderungen erlauben +EPS.Settings.Server.AllowInstantChanges.Desc=Falls aktiviert, können Spieler ihre Änderungen sofort anwenden, anstatt respawnen zu müssen. +EPS.Settings.Server.AllowFlexes=Spielern erlauben, Flexes zu ändern +EPS.Settings.Server.AllowFlexes.Desc=Falls aktiviert, können Spieler die Flexes für ihre Spielermodelle ändern. Dadurch wird das Blinken des Players unterbrochen und es können andere Probleme auftreten. Aktivierung auf eigene Gefahr. Spieler können ihre Flexes nur zurücksetzen, indem sie die Verbindung trennen. +EPS.Settings.Server.EnableInAllGM=In allen Spielmodi aktivieren +EPS.Settings.Server.EnableInAllGM.Desc=Falls aktiviert, ist der PlayerModel Selector für alle Spieler in jedem Spielmodus verfügbar. Falls deaktiviert, können nur Administratoren es außerhalb von Sandbox verwenden. +EPS.Settings.Server.RequestLimit=Anforderungslimit +EPS.Settings.Server.RequestLimit.Desc=Zeitlimit in Sekunden, die die Spieler warten müssen, bevor sie die Sofortwechselfunktion erneut nutzen können. Zum Deaktivieren auf 0 setzen. + +EPS.Settings.GM_Blacklist=GM Blacklist +EPS.Settings.GM_Blacklist.ExistedGM=Geblacklistete Spielmodi +EPS.Settings.GM_Blacklist.Desc=Hier können Sie inkompatible Spielmodi auf die Blacklist setzen.\n\nSpieler (einschließlich Admins) können ihre Spielermodelle in diesen Spielmodi nicht ändern, unabhängig von anderen Einstellungen. +EPS.Settings.GM_Blacklist.AddCurrent=Jetziges Spielmodus zu Blacklist hinzufügen +EPS.Settings.GM_Blacklist.ManuallyAddGM=Spielmodus manuell hinzufügen +EPS.Settings.GM_Blacklist.RemoveSelected=Ausgewählte Spielmodi entfernen + +EPS.Settings.VOX=VOX +EPS.Settings.VOX.PlayerModel=Spielermodell +EPS.Settings.VOX.Assigned=Zugewiesenes VOX-Paket +EPS.Settings.VOX.AvailableVOX=Verfügbare VOX-Pakette +EPS.Settings.VOX.AssignToCurrent=VOX-Paket dem aktuellen PlayerModel zuweisen +EPS.Settings.VOX.RemoveSelected=Ausgewählte Zuordnung entfernen + +EPS.Settings.Info=Info +EPS.Settings.Info.CreateBy=Von %s hergestellt \ No newline at end of file diff --git a/resource/localization/en/enhanced_playermodel_selector.properties b/resource/localization/en/enhanced_playermodel_selector.properties new file mode 100644 index 0000000..6c28e0c --- /dev/null +++ b/resource/localization/en/enhanced_playermodel_selector.properties @@ -0,0 +1,99 @@ + +EPS.Title=Enhanced PlayerModel Selector %s, Fesiug's Edit + +# Main Buttons +EPS.Reset=Reset +EPS.NextAnim=Next anim +EPS.ApplyPM=Apply playermodel +EPS.VisitAddonPage=Visit Addon Page + +EPS.Search=Search... + +# Model Sheet +EPS.Model=Model +EPS.Model.Icons=Icons +EPS.Model.Table=Table +EPS.Model.Table.Model=Model +EPS.Model.Table.Path=Path + +# Hands Sheet +EPS.Hands=Hands +EPS.Hands.Icons=Icons +EPS.Hands.Table=Table +EPS.Hands.Table.Model=Model +EPS.Hands.Table.Path=Path +EPS.Hands.UsePM=Use playermodel + +# Favorites Sheet +EPS.Favorites=Favorites +EPS.Favorites.Model=Model +EPS.Favorites.Skin=Skin +EPS.Favorites.Bodygroups=Bodygroups +EPS.Favorites.LoadFavorite=Load selected Favorite +EPS.Favorites.Desc=Here you can save your favorite playermodel combinations. To do this:\n1. Select a model and setup the skin and bodygroups as you wish.\n2. Enter a unique name into the textfield and click "Add new favorite".\n3. Load your favorite by selecting it in the list below and clicking "Load selected".\nYou can also apply existing favorites by console command:\nplayermodel_loadfav "the favorite's name" +EPS.Favorites.AddNewFavorite=Add new favorite +EPS.Favorites.ReplaceSelected=Replace selected +EPS.Favorites.DeleteAllSelected=Delete all selected + +# Bodygroups Sheet +EPS.Bodygroups=Bodygroups + +EPS.Handgroups=Handgroups + +EPS.Skin=Skin + +EPS.Flexes=Flexes +EPS.Notes=Notes:\n-The model preview for flexes doesn't work correctly. However, they will be visible on your playermodel when you apply them.\n- The default values provided might not be correct and cause distorted faces.\n- There is no way to reset (or fix) flex manipulation besides disconnecting. + +# Colors Sheet +EPS.Colors=Colors +EPS.Colors.PlayerColor=Player color +EPS.Colors.PhysgunColor=Physgun color +EPS.Colors.ResetToDefault=Reset to default values + +# Settings Sheet +EPS.Settings=Settings +EPS.Settings.Client=Client +EPS.Settings.Client.EnforcePM=Enforce your playermodel +EPS.Settings.Client.EnforcePM.Desc=If enabled, your selected playermodel will be protected. No other function will be able to change your playermodel anymore. +EPS.Settings.Client.PlayerColorBG=Use Player color as background +EPS.Settings.Client.PlayerColorBG.Desc=If enabled, your selected player color will be used as the menu background. If disabled, the background will be grey. +EPS.Settings.Client.TransparentBG=Transparent background +EPS.Settings.Client.TransparentBG.Desc=If enabled, the menu backgroup will be transparent. If disabled, the background will be opaque. +EPS.Settings.Client.HideDefaultPMs=Hide Default Playermodels +EPS.Settings.Client.HideDefaultPMs.Desc=If enabled, the default playermodels will be hidden. Requires reopening the window. +EPS.Settings.Client.IgnoreC_ArmsOnlyPMs=Ignore c_hands only "playermodels" in main list +EPS.Settings.Client.IgnoreC_ArmsOnlyPMs.Desc=If enabled, "playermodels" that are nothing but floating pair of hands will be not shown in list of available playermodels. Disable to see all registered playermodels. +EPS.Settings.Client.ShowFlexes=Show flexes tab +EPS.Settings.Client.ShowFlexes.Desc=This allows you to manipulate flexes on your playermodel. However, flex manipulation is not really made for playermodels and will cause issues. This includes the following:\n- Eye blinking no longer working.\n- Faces might be distorted unless the flexes are corrected manually.\n- Might break the faces of incompatible playermodels completely.\n- Even if you put all flexes to default value, the engine still considers them as manipulated. Models with problems won't be fixed.\nYou must switch your model once, for the tab to appear! +EPS.Settings.Client.RebuildIcon=Rebuild spawn icons +EPS.Settings.Client.RebuildIcon.Desc=Forces all playermodel icons to be re-rendered. Useful if the icons are outdated after custom models changed their appearance. This may take a while, depending on the number of models and your PC's speed. + +EPS.Settings.Server=Server +EPS.Settings.Server.EnablePMEnforcement=Enable playermodel enforcement +EPS.Settings.Server.EnablePMEnforcement.Desc=If enabled, selected playermodels will be enforced and protected. No gamemodes, maps or addons can overwrite them anymore. Players can toggle this function individually, using the checkbox on top of the menu.\nIf disabled, only the manual button works outside of Sandbox. +EPS.Settings.Server.AllowInstantChanges=Allow instant changes +EPS.Settings.Server.AllowInstantChanges.Desc=If enabled, players can apply their changes instantly instead of having to respawn. +EPS.Settings.Server.AllowFlexes=Allow players to change flexes +EPS.Settings.Server.AllowFlexes.Desc=If enabled, players can change the flexes for their playermodels. This will break player blinking and may cause other issues. Enable at own risk. Players can only reset their flexes by disconnecting. +EPS.Settings.Server.EnableInAllGM=Enable in all gamemodes +EPS.Settings.Server.EnableInAllGM.Desc=If enabled, the PlayerModel Selector will be available for all players in every gamemode. If disabled, only Admins can use it outside of Sandbox. +EPS.Settings.Server.RequestLimit=Request limit +EPS.Settings.Server.RequestLimit.Desc=Timelimit in seconds that players have to wait, before they can use the instant change function again. Set to 0 to disable. + +EPS.Settings.GM_Blacklist=GM Blacklist +EPS.Settings.GM_Blacklist.ExistedGM=Blacklisted gamemodes +EPS.Settings.GM_Blacklist.Desc=Here you can blacklist incompatible gamemodes.\n\nPlayers (including Admins) can't change their playermodels in those gamemodes, regardless of other settings. +EPS.Settings.GM_Blacklist.AddCurrent=Add current gamemode to Blacklist +EPS.Settings.GM_Blacklist.ManuallyAddGM=Manually add gamemode +EPS.Settings.GM_Blacklist.RemoveSelected=Remove selected gamemodes + +EPS.Settings.VOX=VOX +EPS.Settings.VOX.PlayerModel=PlayerModel +EPS.Settings.VOX.Assigned=assigned VOX pack +EPS.Settings.VOX.AvailableVOX=Available VOX packs +EPS.Settings.VOX.AssignToCurrent=Assign VOX pack to current PlayerModel +EPS.Settings.VOX.RemoveSelected=Remove selected assignment + +EPS.Settings.Info=Info +EPS.Settings.Info.CreateBy=Created by %s \ No newline at end of file diff --git a/resource/localization/pl/enhanced_playermodel_selector.properties b/resource/localization/pl/enhanced_playermodel_selector.properties new file mode 100644 index 0000000..f23e55d --- /dev/null +++ b/resource/localization/pl/enhanced_playermodel_selector.properties @@ -0,0 +1,98 @@ + +EPS.Title=Enhanced PlayerModel Selector %s, Fesiug's Edit + +# Main Buttons +EPS.Reset=Reset +EPS.NextAnim=Następna Animacja +EPS.ApplyPM=Zatwierdź Model +EPS.VisitAddonPage=Odwiedź stronę addon'u + +EPS.Search=Szukaj... + +# Model Sheet +EPS.Model=Model +EPS.Model.Icons=Ikony +EPS.Model.Table=Lista +EPS.Model.Table.Model=Model +EPS.Model.Table.Path=Ścieżka + +# Hands Sheet +EPS.Hands=Dłonie +EPS.Hands.Icons=Ikony +EPS.Hands.Table=Lista +EPS.Hands.Table.Model=Model +EPS.Hands.Table.Path=Ścieżka +EPS.Hands.UsePM=Użyj Modelu + +# Favorites Sheet +EPS.Favorites=Ulubione +EPS.Favorites.Model=Model +EPS.Favorites.Skin=Skin +EPS.Favorites.Bodygroups=Bodygroups +EPS.Favorites.LoadFavorite=Załaduj konfigurację +EPS.Favorites.Desc=Tutaj możesz zapisać swoje preferowane ustawienia modeli. Aby to zrobić:\n1. Wybierz model i skonfiguruj skin'y oraz bodygroup'y zgodnie z własnymi preferencjami.\n2. Wprowadź unikalną nazwę w polu tekstowym i kliknij "Dodaj nową konfigurację".\n3. Załaduj ulubione, wybierając je z poniższej listy i klikając "Załaduj wybrane".\nMożesz również zastosować istniejące ulubione za pomocą polecenia konsoli: \nplayermodel_loadfav "nazwa konfiguracji". +EPS.Favorites.AddNewFavorite=Dodaj nową konfigurację +EPS.Favorites.ReplaceSelected=Nadpisz zaznaczone +EPS.Favorites.DeleteAllSelected=Usuń wszystkie zaznaczone + +# Bodygroups Sheet +EPS.Bodygroups=Bodygroups + +EPS.Handgroups=Handgroups + +EPS.Skin=Skin + +EPS.Flexes=Flexey +EPS.Notes=Uwagi:\n-Podgląd modelu dla flex'ów nie działa poprawnie. Będą one jednak widoczne na modelu gracza po ich zastosowaniu.\n- Dostarczone wartości domyślne mogą być nieprawidłowe i powodować zniekształcone twarze.\n- Nie ma sposobu na zresetowanie (lub naprawienie) manipulacji flex'em poza rozłączeniem. + +# Colors Sheet +EPS.Colors=Kolory +EPS.Colors.PlayerColor=Kolor gracza +EPS.Colors.PhysgunColor=Kolor physgun'a +EPS.Colors.ResetToDefault=Przywróć domyślne + +# Settings Sheet +EPS.Settings=Ustawienia +EPS.Settings.Client=Klient +EPS.Settings.Client.EnforcePM=Zabezpiecz model +EPS.Settings.Client.EnforcePM.Desc=Jeżeli ta opcja jest włączona, wybrany model gracza będzie chroniony. Żadna inna funkcja nie będzie już mogła go zmienić +EPS.Settings.Client.PlayerColorBG=Uzyj koloru gracza na kolor tła +EPS.Settings.Client.PlayerColorBG.Desc=Jeżeli ta opcja jest włączona, wybrany kolor gracza będzie używany jako tło menu. Jeżeli opcja ta jest wyłączona, tło będzie szare. +EPS.Settings.Client.TransparentBG=Przezroczyste Tło +EPS.Settings.Client.TransparentBG.Desc=Jeżeli ta opcja jest włączona, tło menu będzie przezroczyste. Jeżeli jest wyłączona, tło będzie nieprzezroczyste. +EPS.Settings.Client.HideDefaultPMs=Ukryj Domyślne Playermodels +EPS.Settings.Client.HideDefaultPMs.Desc=Jeżeli aktywowane, domyślny Model Gracza zostanie ukryty. Wymagany restart okna. +EPS.Settings.Client.IgnoreC_ArmsOnlyPMs=Ignore c_hands only "playermodels" in main list +EPS.Settings.Client.IgnoreC_ArmsOnlyPMs.Desc=If enabled, "playermodels" that are nothing but floating pair of hands will be not shown in list of available playermodels. Disable to see all registered playermodels. +EPS.Settings.Client.ShowFlexes=Pokaż flexy +EPS.Settings.Client.ShowFlexes.Desc=Pozwala to na manipulowanie flex'ami na modelu. Manipulowanie flex'ami nie jest jednak przeznaczone dla modeli i może powodować problemy. Obejmuje to następujące problemy:\n- Mruganie oczami przestaje działać.\n- Twarze mogą być zniekształcone, chyba że flex'y zostaną skorygowane ręcznie.\n- Może całkowicie zepsuć twarze niekompatybilnych modeli.\n- Nawet jeśli ustawisz wszystkie flexy na wartości domyślne, silnik nadal uważa je za zmanipulowane. Modele z problemami nie zostaną naprawione.\nMusisz raz przełączyć model, aby pojawiła się zakładka! +EPS.Settings.Client.RebuildIcon=Wygeneruj ponownie ikony +EPS.Settings.Client.RebuildIcon.Desc=Wymusza ponowne renderowanie wszystkich ikon modeli. Przydatne jeżeli ikony są nieaktualne po zmianie wyglądu własnych modeli. Może to trochę potrwać w zależności od liczby modeli i szybkości komputera. + +EPS.Settings.Server=Serwer +EPS.Settings.Server.EnablePMEnforcement=Zabezpiecz model +EPS.Settings.Server.EnablePMEnforcement.Desc=Jeżeli ta opcja jest włączona, wybrane modele będą wymuszane i chronione. Żadne tryby gry, mapy ani addon'y nie będą już mogły ich nadpisać. Gracze mogą przełączać tę funkcję indywidualnie, korzystając z pola wyboru w górnej części menu.\nJeżeli jest wyłączona, poza piaskownicą działa tylko przycisk ręczny. +EPS.Settings.Server.AllowInstantChanges=Zezwalaj na natychmiastowe zmiany +EPS.Settings.Server.AllowInstantChanges.Desc=Jeżeli opcja ta jest włączona, gracze mogą natychmiast zastosować wprowadzone zmiany bez konieczności odradzania się. +EPS.Settings.Server.AllowFlexes=Umożlw na modyfikację flex'ów +EPS.Settings.Server.AllowFlexes.Desc=Jeżeli ta opcja jest włączona, gracze mogą zmieniać flexy swoich modeli. Spowoduje to przerwanie mrugania gracza i może spowodować inne problemy. Włączasz na własne ryzyko. Gracze mogą zresetować swoje flexy tylko poprzez rozłączenie się. +EPS.Settings.Server.EnableInAllGM=Włącz we wszystkich trybach gry +EPS.Settings.Server.EnableInAllGM.Desc=Jeżeli opcja ta jest włączona, selektor modelu będzie dostępny dla wszystkich graczy w każdym trybie gry. Jeśli jest wyłączony, tylko administratorzy mogą z niego korzystać pozatrybem "Sandbox". +EPS.Settings.Server.RequestLimit=Limit żądań +EPS.Settings.Server.RequestLimit.Desc=Limit czasu w sekundach, który gracze muszą odczekać, zanim będą mogli ponownie użyć funkcji natychmiastowej zmiany. Ustaw na 0, aby wyłączyć. + +EPS.Settings.GM_Blacklist=Czarna lista +EPS.Settings.GM_Blacklist.ExistedGM=Tryby na czarnej liście +EPS.Settings.GM_Blacklist.Desc=Tutaj możesz umieścić na czarnej liście niekompatybilne tryby gry. Gracze (w tym administratorzy) nie mogą zmieniać swoich modeli w tych trybach gry, niezależnie od innych ustawień. +EPS.Settings.GM_Blacklist.AddCurrent=Dodaj bieżacy tryb do listy +EPS.Settings.GM_Blacklist.ManuallyAddGM=Manualnie dodaj tryb +EPS.Settings.GM_Blacklist.RemoveSelected=Usuń wybrane tryby + +EPS.Settings.VOX=VOX +EPS.Settings.VOX.PlayerModel=Model +EPS.Settings.VOX.Assigned=Przypisany pakiet VOX +EPS.Settings.VOX.AvailableVOX=Dostępne pakiety VOX +EPS.Settings.VOX.AssignToCurrent=Przypisz pakiet VOX do bieżącego Modelu gracza +EPS.Settings.VOX.RemoveSelected=Usuń wybrane przypisania + +EPS.Settings.Info=Info diff --git a/resource/localization/ru/enhanced_playermodel_selector.properties b/resource/localization/ru/enhanced_playermodel_selector.properties new file mode 100644 index 0000000..631690b --- /dev/null +++ b/resource/localization/ru/enhanced_playermodel_selector.properties @@ -0,0 +1,98 @@ + +EPS.Title=Enhanced PlayerModel Selector %s, изменённая версия от Fesiug + +# Main Buttons +EPS.Reset=Сброс +EPS.NextAnim=След. аним. +EPS.ApplyPM=Применить модель игрока +EPS.VisitAddonPage=Страница дополнения + +EPS.Search=Поиск... + +# Model Sheet +EPS.Model=Модель +EPS.Model.Icons=Значки +EPS.Model.Table=Таблица +EPS.Model.Table.Model=Модель +EPS.Model.Table.Path=Путь + +# Hands Sheet +EPS.Hands=Руки +EPS.Hands.Icons=Значки +EPS.Hands.Table=Таблица +EPS.Hands.Table.Model=Модель +EPS.Hands.Table.Path=Путь +EPS.Hands.UsePM=Исп. модель игрока + +# Favorites Sheet +EPS.Favorites=Избранное +EPS.Favorites.Model=Модель +EPS.Favorites.Skin=Облик +EPS.Favorites.Bodygroups=Группы тела +EPS.Favorites.LoadFavorite=Загрузка выбранного избранного +EPS.Favorites.Desc=Здесь вы можете сохранить свои любимые комбинации игровых моделей. Для этого:\n1. Выберите модель и настройте облик и группы тел по своему усмотрению.\n2. Введите уникальное имя в текстовое поле и нажмите кнопку «Добавить новое избранное».\n3. Загрузите избранное, выбрав его в списке ниже и нажав «Загрузить выбранное».\nВы также можете применить существующие избранные с помощью консольной команды:\nplayermodel_loadfav «имя избранного» +EPS.Favorites.AddNewFavorite=Добавить новое избранное +EPS.Favorites.ReplaceSelected=Заменить выбранное +EPS.Favorites.DeleteAllSelected=Удалить все выбранные + +# Bodygroups Sheet +EPS.Bodygroups=Группы тела + +EPS.Handgroups=Группы рук + +EPS.Skin=Облик + +EPS.Flexes=Выражение лица +EPS.Notes=Примечания:\n-Предпросмотр модели для лица работает неправильно. Однако оно будет видно на игровой модели, когда вы примените.\n- Значения по умолчанию могут быть неверными и приводить к искажению лиц.\n- Нет никакого способа сбросить (или исправить) манипуляции с лицом, кроме отключения. + +# Colors Sheet +EPS.Colors=Цвета +EPS.Colors.PlayerColor=Цвет игрока +EPS.Colors.PhysgunColor=Цвет физической пушки +EPS.Colors.ResetToDefault=Сброс к значениям по умолчанию + +# Settings Sheet +EPS.Settings=Настройки +EPS.Settings.Client=Клиент +EPS.Settings.Client.EnforcePM=Принудительно использовать выбранную модель +EPS.Settings.Client.EnforcePM.Desc=Если включено, то выбранная вами модель игрока будет выбрана автоматически. Ни одна другая функция больше не сможет изменить вашу модель игрока. +EPS.Settings.Client.PlayerColorBG=Использование цвета игрока в качестве фона +EPS.Settings.Client.PlayerColorBG.Desc=Если включено, то в качестве фона меню будет использоваться выбранный вами цвет игрока. Если отключено, то фон будет серым. +EPS.Settings.Client.TransparentBG=Прозрачный фон +EPS.Settings.Client.TransparentBG.Desc=Если включено, то фон меню будет прозрачным. Если отключено, то фон будет непрозрачным. +EPS.Settings.Client.HideDefaultPMs=Скрыть модели игрока по умолчанию +EPS.Settings.Client.HideDefaultPMs.Desc=Если включено, модели игрока по умолчанию будут скрыты. Требуется снова открыть окно. +EPS.Settings.Client.IgnoreC_ArmsOnlyPMs=Игнорировать c_hands в основном списке моделей +EPS.Settings.Client.IgnoreC_ArmsOnlyPMs.Desc=Если включено, «модели игрока», которые представляют собой лишь плавающую пару рук, не будут отображаться в списке доступных моделей игрока. Отключите, чтобы увидеть все зарегистрированные модели игрока. +EPS.Settings.Client.ShowFlexes=Вкладка выражения лица +EPS.Settings.Client.ShowFlexes.Desc=Это позволяет манипулировать лицом модели игрока. Однако работа с лицом не предназначена для моделей игрока и может вызвать следующие проблемы. К ним относятся следующие:\n- Мигание глаз больше не работает.\n- Лица могут быть искажены, если не корректировать лицо вручную.\n- Можно полностью сломать лица несовместимых моделей игрока.\n- Даже если вы установите лицо в значение по умолчанию, движок всё равно будет считать значения изменёнными. Модели с проблемами не будут исправлены.\nВы должны один раз переключить свою модель, чтобы появилась вкладка! +EPS.Settings.Client.RebuildIcon=Перестроить значки +EPS.Settings.Client.RebuildIcon.Desc=Принудительно перерисовывает все значки модели игроков. Пригодится, если значки устарели после того, как пользовательские модели изменили свой внешний вид. Это может занять некоторое время, в зависимости от количества моделей и скорости работы компьютера. + +EPS.Settings.Server=Сервер +EPS.Settings.Server.EnablePMEnforcement=Принудительное использование игровой модели +EPS.Settings.Server.EnablePMEnforcement.Desc=Если включено, выбранные модели игрока будут выбраны автоматически. Никакие игровые моды, карты или дополнения больше не смогут их перезаписать. Игроки могут переключать эту функцию для себя, используя флажок в верхней части меню.\nЕсли отключено, за пределами режима песочницы будет работать только кнопка ручного управления. +EPS.Settings.Server.AllowInstantChanges=Мгновенные изменения +EPS.Settings.Server.AllowInstantChanges.Desc=Если включено, игроки могут применять свои изменения мгновенно, не прибегая к повторному возрождению. +EPS.Settings.Server.AllowFlexes=Разрешить игрокам изменять лицо +EPS.Settings.Server.AllowFlexes.Desc=Если включено, то игроки могут изменять выражение лица для своей модели игрока. Это приведёт к нарушению мигания игрока и может вызвать другие проблемы. Включать на свой страх и риск. Игроки могут сбросить лицо, только отключившись от сервера. +EPS.Settings.Server.EnableInAllGM=Включить во всех игровых режимах +EPS.Settings.Server.EnableInAllGM.Desc=Если включено, то выбор моделей игрока будет доступен всем игрокам во всех игровых режимах. Если отключено, то только администраторы смогут использовать его вне режима песочницы. +EPS.Settings.Server.RequestLimit=Лимит запросов +EPS.Settings.Server.RequestLimit.Desc=Ограничение по времени в секундах, которое игроки должны выждать, прежде чем они смогут снова воспользоваться функцией мгновенного изменения. 0 = отключение. + +EPS.Settings.GM_Blacklist=Чёрный список ИМ +EPS.Settings.GM_Blacklist.ExistedGM=Игровые режимы в чёрном списке +EPS.Settings.GM_Blacklist.Desc=Здесь вы можете внести в чёрный список несовместимые игровые режимы.\n\nИгроки (включая администраторов) не смогут менять свою модель игрока в этих режимах, независимо от других настроек. +EPS.Settings.GM_Blacklist.AddCurrent=Добавить текущий игровой режим в чёрный список +EPS.Settings.GM_Blacklist.ManuallyAddGM=Вручную добавить игровой режим +EPS.Settings.GM_Blacklist.RemoveSelected=Удалить выбранные игровые режимы + +EPS.Settings.VOX=Голос +EPS.Settings.VOX.PlayerModel=Модель игрока +EPS.Settings.VOX.Assigned=назначенный пакет голоса +EPS.Settings.VOX.AvailableVOX=Доступные голосовые пакеты +EPS.Settings.VOX.AssignToCurrent=Назначение голосового пакета текущей модели игрока +EPS.Settings.VOX.RemoveSelected=Удалить выбранное назначение + +EPS.Settings.Info=Информация diff --git a/resource/localization/tr/enhanced_playermodel_selector.properties b/resource/localization/tr/enhanced_playermodel_selector.properties new file mode 100644 index 0000000..48ccc14 --- /dev/null +++ b/resource/localization/tr/enhanced_playermodel_selector.properties @@ -0,0 +1,99 @@ + +EPS.Title=Gelişmiş Oyuncu Modeli Seçici %s, Fesiug'un Düzenlemesi + +# Main Buttons +EPS.Reset=Sıfırla +EPS.ApplyPM=Modeli uygula +EPS.NextAnim=Sonraki anim +EPS.VisitAddonPage=Eklenti Sayfasını Ziyaret Et + +EPS.Search=Ara... + +# Model +EPS.Model=Model +EPS.Model.Icons=Simgeler +EPS.Model.Table=Liste +EPS.Model.Table.Model=Model +EPS.Model.Table.Path=Yol + +# Hands +EPS.Hands=Eller +EPS.Hands.Icons=Simgeler +EPS.Hands.Table=Liste +EPS.Hands.Table.Model=Model +EPS.Hands.Table.Path=Yol +EPS.Hands.UsePM=Oyuncu modelini kullan + +# Favorites +EPS.Favorites=Favoriler +EPS.Favorites.Model=Model +EPS.Favorites.Skin=Görünüm +EPS.Favorites.Bodygroups=Vücut Grupları +EPS.Favorites.LoadFavorite=Seçilen Favoriyi yükle +EPS.Favorites.Desc=Burada en sevdiğiniz oyuncu modeli kombinasyonlarını kaydedebilirsiniz. Bunu yapmak için:\n1. Bir model seçin ve görünüm ve vücut gruplarını istediğiniz gibi ayarlayın.\n2. Metin alanına benzersiz bir ad girin ve "Yeni favori ekle"ye tıklayın.\n3. Favorinizi aşağıdaki listeden seçip "Seçilenleri yükle"ye tıklayarak yükleyin.\nMevcut favorileri konsol komutuyla da uygulayabilirsiniz:\nplayermodel_loadfav "favorinin adı" +EPS.Favorites.AddNewFavorite=Yeni favori ekle +EPS.Favorites.ReplaceSelected=Seçileni değiştir +EPS.Favorites.DeleteAllSelected=Seçilenlerin tümünü sil + +# Bodygroups +EPS.Bodygroups=Vücut Grupları + +EPS.Handgroups=El Grupları + +EPS.Skin=Görünüm + +EPS.Flexes=Pozucu +EPS.Notes=Notlar:-\nPozucu için model önizlemesi düzgün çalışmıyor. Ancak, bunları uyguladığınızda oyuncu modelinizde görüneceklerdir.\n- Sağlanan varsayılan değerler doğru olmayabilir ve yüzlerin bozulmasına neden olabilir.\n- Bağlantıyı kesmekten başka pozucu manipülasyonunu sıfırlamanın (veya düzeltmenin) bir yolu yoktur. + +# Colors +EPS.Colors=Renkler +EPS.Colors.PlayerColor=Oyuncu Rengi +EPS.Colors.PhysgunColor=Fizik Silahı rengi +EPS.Colors.ResetToDefault=Varsayılan değerlere sıfırla + +# Settings +EPS.Settings=Ayarlar +EPS.Settings.Client=Kullanıcı +EPS.Settings.Client.EnforcePM=Oyuncu modelini zorla +EPS.Settings.Client.EnforcePM.Desc=Etkinleştirilirse, seçtiğiniz oyuncu modeli korunacaktır. Başka hiçbir işlev artık oyuncu modelinizi değiştiremez. +EPS.Settings.Client.PlayerColorBG=Oyuncu rengini arka plan olarak kullan +EPS.Settings.Client.PlayerColorBG.Desc=Etkinleştirilirse, seçtiğiniz oyuncu rengi menü arka planı olarak kullanılacaktır. Devre dışı bırakılırsa, arka plan gri olacaktır. +EPS.Settings.Client.TransparentBG=Saydam arka plan +EPS.Settings.Client.TransparentBG.Desc=Etkinleştirilirse, menü arka planı saydam olacaktır. Devre dışı bırakılırsa, arka plan opak olacaktır. +EPS.Settings.Client.HideDefaultPMs=Varsayılan Oyuncu Modellerini Gizle +EPS.Settings.Client.HideDefaultPMs.Desc=Etkinleştirilirse, varsayılan oyuncu modelleri gizlenecektir. Pencereyi yeniden açmanız gerekiyor. +EPS.Settings.Client.IgnoreC_ArmsOnlyPMs=Ana listede sadece c_hands olarak gözüken "oyuncu modelleri"ni yoksay +EPS.Settings.Client.IgnoreC_ArmsOnlyPMs.Desc=Etkinleştirilirse, havada asılı kalan el çiftinden başka bir şey olmayan "oyuncu modelleri" mevcut oyuncu modelleri listesinde gösterilmez. Kayıtlı tüm oyuncu modellerini görmek için devre dışı bırakın. +EPS.Settings.Client.ShowFlexes=Pozucu sekmesini göster +EPS.Settings.Client.ShowFlexes.Desc=Bu, oyuncu modelinizdeki pozları manipüle etmenizi sağlar. Ancak pozucu manipülasyonu oyuncu modelleri için yapılmadığı için sorunlara neden olur. Buna aşağıdakiler dahildir:\n- Göz kırpmanın artık çalışmaması.\n- Pozlar manuel olarak düzeltilmezse yüzler bozulabilir.\n- Uyumsuz oyuncu modellerinin yüzlerini tamamen bozabilir.\n- Tüm pozları varsayılan değere getirseniz bile, oyun motoru yine de bunları manipüle edilmiş olarak kabul eder. Sorunları olan modeller düzeltilmeyecektir.\nSekmenin görünmesi için modelinizi bir kez değiştirmelisiniz! +EPS.Settings.Client.RebuildIcon=Oluşum simgelerini yeniden oluştur +EPS.Settings.Client.RebuildIcon.Desc=Tüm oyuncu modeli simgelerinin yeniden oluşturulmasını zorlar. Özel modeller görünümlerini değiştirdikten sonra simgeleri eskiyse kullanışlıdır. Bu, model sayısına ve bilgisayarınızın hızına bağlı olarak biraz zaman alabilir. + +EPS.Settings.Server=Sunucu +EPS.Settings.Server.EnablePMEnforcement=Oyuncu modeli zorlamasını etkinleştir +EPS.Settings.Server.EnablePMEnforcement.Desc=Etkinleştirilirse, seçilen oyuncu modelleri zorla uygulanacak ve korunacaktır. Artık hiçbir oyun modu, harita veya eklenti bunların üzerine yazamaz. Oyuncular, menünün üstündeki onay kutusunu kullanarak bu işlevi tek tek değiştirebilirler.\nDevre dışı bırakılırsa, Sandbox dışında yalnızca manuel düğmesi çalışır. +EPS.Settings.Server.AllowInstantChanges=Anlık değişikliklere izin ver +EPS.Settings.Server.AllowInstantChanges.Desc=Etkinleştirilirse, oyuncular yeniden canlanmadan değişikliklerini anında uygulayabilirler. +EPS.Settings.Server.AllowFlexes=Oyuncuların pozlarını değiştirmesine izin ver +EPS.Settings.Server.AllowFlexes.Desc=Etkinleştirilirse, oyuncular oyuncu modellerinin pozlarını değiştirebilirler. Bu, oyuncunun göz kırpmasını bozabilir ve başka sorunlara neden olabilir. Riski göze alarak etkinleştirin. Oyuncular pozlarını yalnızca bağlantıyı keserek sıfırlayabilirler. +EPS.Settings.Server.EnableInAllGM=Tüm oyun modlarında etkinleştir +EPS.Settings.Server.EnableInAllGM.Desc=Etkinleştirilirse, Oyuncu Modeli Seçici her oyun modundaki tüm oyuncular için kullanılabilir olacaktır. Devre dışı bırakılırsa, yalnızca yöneticiler Sandbox dışında kullanabilir. +EPS.Settings.Server.RequestLimit=İstek sınırı +EPS.Settings.Server.RequestLimit.Desc=Anlık değişiklik işlevini tekrar kullanabilmeleri için oyuncuların beklemeleri gereken süreyi saniyeler içinde sınırlayın. Devre dışı bırakmak için 0 olarak ayarlayın. + +EPS.Settings.GM_Blacklist=OM Kara Listesi +EPS.Settings.GM_Blacklist.ExistedGM=Kara listeye alınmış oyun modları +EPS.Settings.GM_Blacklist.Desc=Burada uyumsuz oyun modlarını kara listeye alabilirsiniz.\n\nOyuncular (Yöneticiler dahil), diğer ayarlara bakmaksızın bu oyun modlarındaki oyuncu modellerini değiştiremez. +EPS.Settings.GM_Blacklist.AddCurrent=Mevcut oyun modunu Kara Listeye ekle +EPS.Settings.GM_Blacklist.ManuallyAddGM=Oyun modunu manuel olarak ekleyin +EPS.Settings.GM_Blacklist.RemoveSelected=Seçili oyun modlarını kaldır + +EPS.Settings.VOX=SES (VOX) +EPS.Settings.VOX.PlayerModel=Oyuncu Modeli +EPS.Settings.VOX.Assigned=atanmış ses paketi +EPS.Settings.VOX.AvailableVOX=Mevcut ses paketleri +EPS.Settings.VOX.AssignToCurrent=Geçerli oyuncu modeline ses paketi ata +EPS.Settings.VOX.RemoveSelected=Seçili atamayı kaldır + +EPS.Settings.Info=Bilgi +EPS.Settings.Info.CreateBy=Oluşturan: %s diff --git a/resource/localization/zh-cn/enhanced_playermodel_selector.properties b/resource/localization/zh-cn/enhanced_playermodel_selector.properties new file mode 100644 index 0000000..de06088 --- /dev/null +++ b/resource/localization/zh-cn/enhanced_playermodel_selector.properties @@ -0,0 +1,98 @@ + +EPS.Title=增强版玩家模型选择器 %s(Fesiug 修改版)| 简体中文翻译:Insane Black Rock Shooter + +# Main Buttons +EPS.Reset=重置 +EPS.NextAnim=切换动作 +EPS.ApplyPM=应用玩家模型 +EPS.VisitAddonPage=查看创意工坊页面 + +EPS.Search=搜索... + +# Model Sheet +EPS.Model=模型 +EPS.Model.Icons=图标 +EPS.Model.Table=列表 +EPS.Model.Table.Model=模型 +EPS.Model.Table.Path=路径 + +# Hands Sheet +EPS.Hands=手臂 +EPS.Hands.Icons=图标 +EPS.Hands.Table=列表 +EPS.Hands.Table.Model=模型 +EPS.Hands.Table.Path=路径 +EPS.Hands.UsePM=跟随玩家模型 + +# Favorites Sheet +EPS.Favorites=预设 +EPS.Favorites.Model=模型 +EPS.Favorites.Skin=皮肤 +EPS.Favorites.Bodygroups=身体组件 +EPS.Favorites.LoadFavorite=载入选中的预设 +EPS.Favorites.Desc=在这里,你可以保存你的模型数据预设,首先,你需要:\n1. 选择一个模型,然后根据你的偏好设置皮肤和身体组件。\n2. 在文本框中输入一个与其他预设不相同的名称,然后单击“添加新的预设”。\n3. 在下面的列表中选择你的预设,然后单击“载入选中预设”。\n你也可以通过控制台命令应用现有预设:\nplayermodel_loadfav “预设名称” +EPS.Favorites.AddNewFavorite=添加新的预设 +EPS.Favorites.ReplaceSelected=覆盖选中的预设 +EPS.Favorites.DeleteAllSelected=删除所有选中的预设 + +# Bodygroups Sheet +EPS.Bodygroups=身体组件 + +EPS.Handgroups=手臂组件 + +EPS.Skin=皮肤 + +EPS.Flexes=表情 +EPS.Notes=注意:\n-表情在模型预览中无法正常显示。但是当你应用模型之后,表情在人物模型上是可见的。\n- 提供的默认值可能不正确,并导致面部扭曲。\n- 除了断开连接之外,没有办法重置(或修复)表情操作。 + +# Colors Sheet +EPS.Colors=颜色 +EPS.Colors.PlayerColor=玩家颜色 +EPS.Colors.PhysgunColor=物理枪颜色 +EPS.Colors.ResetToDefault=恢复至默认值 + +# Settings Sheet +EPS.Settings=设置 +EPS.Settings.Client=客户端 +EPS.Settings.Client.EnforcePM=强制使用选中模型 +EPS.Settings.Client.EnforcePM.Desc=如果启用,你选中的玩家模型将会被锁定。无法被其他插件更改。 +EPS.Settings.Client.PlayerColorBG=使用玩家颜色作为背景色 +EPS.Settings.Client.PlayerColorBG.Desc=如果启用,背景颜色将会使用你设定的玩家颜色。如果禁用,背景将会变成灰色。 +EPS.Settings.Client.TransparentBG=透明背景 +EPS.Settings.Client.TransparentBG.Desc=如果启用,菜单背景将会变得透明。如果禁用,背景将会变得不透明。 +EPS.Settings.Client.HideDefaultPMs=隐藏默认玩家模型 +EPS.Settings.Client.HideDefaultPMs.Desc=如果启用,将会隐藏游戏默认的玩家模型。需要重启窗口生效。 +EPS.Settings.Client.IgnoreC_ArmsOnlyPMs=隐藏只有手臂模型的玩家模型 +EPS.Settings.Client.IgnoreC_ArmsOnlyPMs.Desc=如果启用,那些只有手臂模型的玩家模型将不会显示在模型列表中。禁用此项则显示全部模型。 +EPS.Settings.Client.ShowFlexes=显示表情选项卡 +EPS.Settings.Client.ShowFlexes.Desc=这允许你更改玩家模型的表情。但是,表情系统并非专门为人物模型设计的,因此会产生问题。问题包括:\n- 眨眼功能将会失效\n- 除非手动更正面部表情,否则面部可能会扭曲。\n- 可能会彻底损坏不兼容的玩家模型的面部。\n- 即使将所有表情设置为默认值,引擎仍将表情设置为更改后的表情。有问题的模型不会被修复。\n你必须切换模型一次,才能显示选项卡! +EPS.Settings.Client.RebuildIcon=重新加载图标 +EPS.Settings.Client.RebuildIcon.Desc=强制重新渲染所有玩家模型图标。对于模型更新后的过期图标很有用。这可能需要一些时间,渲染速度取决于你的模型数量和电脑性能。 + +EPS.Settings.Server=服务端 +EPS.Settings.Server.EnablePMEnforcement=启用玩家模型锁定 +EPS.Settings.Server.EnablePMEnforcement.Desc=如果启用,将强制使用和保护选定的玩家模型。没有任何游戏模式、地图或插件可以更改它们。玩家可以使用菜单顶部的复选框单独切换此功能。\n如果禁用,则只有手动按钮在沙盒模式以外可用。 +EPS.Settings.Server.AllowInstantChanges=允许立即更改模型 +EPS.Settings.Server.AllowInstantChanges.Desc=如果启用,玩家不需要重生就可以立即更改模型。 +EPS.Settings.Server.AllowFlexes=允许玩家改变表情 +EPS.Settings.Server.AllowFlexes.Desc=如果启用,玩家可以更改其玩家模型的表情。这将破坏玩家眨眼功能,并可能导致其他问题。风险自负。玩家只能通过断开连接来重置表情。 +EPS.Settings.Server.EnableInAllGM=在所有游戏模式中启用模型选择器 +EPS.Settings.Server.EnableInAllGM.Desc=如果启用,玩家模型选择器将对任何游戏模式下的所有玩家可用。如果禁用,则只有管理员可以在沙盒之外的模式使用它。 +EPS.Settings.Server.RequestLimit=时间限制 +EPS.Settings.Server.RequestLimit.Desc=时间限制:玩家在再次使用即时更改功能之前必须等待的秒数。设置为 0 禁用。 + +EPS.Settings.GM_Blacklist=游戏模式黑名单 +EPS.Settings.GM_Blacklist.ExistedGM=已加入黑名单的游戏模式 +EPS.Settings.GM_Blacklist.Desc=在这里你可以把不兼容的游戏模式加入黑名单。\n\n无论其他设置如何,玩家(包括管理员)都不能在这些游戏模式下更改其玩家模型。 +EPS.Settings.GM_Blacklist.AddCurrent=添加当前游戏模式至黑名单 +EPS.Settings.GM_Blacklist.ManuallyAddGM=手动添加游戏模式 +EPS.Settings.GM_Blacklist.RemoveSelected=移除选中游戏模式 + +EPS.Settings.VOX=语音包 +EPS.Settings.VOX.PlayerModel=玩家模型 +EPS.Settings.VOX.Assigned=设置的语音包 +EPS.Settings.VOX.AvailableVOX=可用的语音包 +EPS.Settings.VOX.AssignToCurrent=为选中的玩家模型设置语音包 +EPS.Settings.VOX.RemoveSelected=移除选中的设置 + +EPS.Settings.Info=信息 diff --git a/resource/localization/zh-tw/enhanced_playermodel_selector.properties b/resource/localization/zh-tw/enhanced_playermodel_selector.properties new file mode 100644 index 0000000..5d2a617 --- /dev/null +++ b/resource/localization/zh-tw/enhanced_playermodel_selector.properties @@ -0,0 +1,98 @@ + +EPS.Title=增強版玩家模型選擇器 %s(Fesiug 修改版)| 繁體中文翻译基於 Insane Black Rock Shooter 的簡體中文修改 + +# Main Buttons +EPS.Reset=重置 +EPS.NextAnim=Next anim +EPS.ApplyPM=套用玩家模型 +EPS.VisitAddonPage=查看工作坊頁面 + +EPS.Search=搜索... + +# Model Sheet +EPS.Model=模型 +EPS.Model.Icons=圖標 +EPS.Model.Table=列表 +EPS.Model.Table.Model=模型 +EPS.Model.Table.Path=路徑 + +# Hands Sheet +EPS.Hands=手臂 +EPS.Hands.Icons=圖標 +EPS.Hands.Table=列表 +EPS.Hands.Table.Model=模型 +EPS.Hands.Table.Path=路徑 +EPS.Hands.UsePM=跟隨玩家模型 + +# Favorites Sheet +EPS.Favorites=預設 +EPS.Favorites.Model=模型 +EPS.Favorites.Skin=皮膚 +EPS.Favorites.Bodygroups=身體組件 +EPS.Favorites.LoadFavorite=載入選中的預設 +EPS.Favorites.Desc=在這裏,你可以保存你的模型數據預設,首先,你需要:\n1. 選擇一個模型,然後根據你的偏好設定皮膚和身體組件。\n2. 在文本框中輸入一個與其他預設不相同的名稱,然後單擊“添加新的預設”。\n3. 在下面的列表中選擇你的預設,然後單擊“載入選中預設”。\n你也可以通過控制檯命令套用現有預設:\nplayermodel_loadfav “預設名稱” +EPS.Favorites.AddNewFavorite=添加新的預設 +EPS.Favorites.ReplaceSelected=覆蓋選中的預設 +EPS.Favorites.DeleteAllSelected=刪除所有選中的預設 + +# Bodygroups Sheet +EPS.Bodygroups=身體組件 + +EPS.Handgroups=手臂組件 + +EPS.Skin=皮膚 + +EPS.Flexes=表情 +EPS.Notes=注意:\n-表情在模型預覽中無法正常顯示。但是當你套用模型之後,表情在人物模型上是可見的。\n- 提供的預設值可能不正確,並導致面部扭曲。\n- 除了斷開連接之外,沒有辦法重置(或修復)表情操作。 + +# Colors Sheet +EPS.Colors=顏色 +EPS.Colors.PlayerColor=玩家顏色 +EPS.Colors.PhysgunColor=物理槍顏色 +EPS.Colors.ResetToDefault=恢復至預設值 + +# Settings Sheet +EPS.Settings=設定 +EPS.Settings.Client=用戶端 +EPS.Settings.Client.EnforcePM=強制使用選中模型 +EPS.Settings.Client.EnforcePM.Desc=如果啟用,你選中的玩家模型將會被鎖定。無法被其他插件更改。 +EPS.Settings.Client.PlayerColorBG=使用玩家顏色作爲背景色 +EPS.Settings.Client.PlayerColorBG.Desc=如果啟用,背景顏色將會使用你設定的玩家顏色。如果禁用,背景將會變成灰色。 +EPS.Settings.Client.TransparentBG=透明背景 +EPS.Settings.Client.TransparentBG.Desc=如果啟用,菜單背景將會變得透明。如果禁用,背景將會變得不透明。 +EPS.Settings.Client.HideDefaultPMs=Hide Default Playermodels +EPS.Settings.Client.HideDefaultPMs.Desc=If enabled, the default playermodels will be hidden. Requires reopening the window. +EPS.Settings.Client.IgnoreC_ArmsOnlyPMs=Ignore c_hands only "playermodels" in main list +EPS.Settings.Client.IgnoreC_ArmsOnlyPMs.Desc=If enabled, "playermodels" that are nothing but floating pair of hands will be not shown in list of available playermodels. Disable to see all registered playermodels. +EPS.Settings.Client.ShowFlexes=顯示錶情選項卡 +EPS.Settings.Client.ShowFlexes.Desc=這允許你更改玩家模型的表情。但是,表情系統並非專門爲人物模型設計的,因此會產生問題。問題包括:\n- 眨眼功能將會失效\n- 除非手動更正面部表情,否則面部可能會扭曲。\n- 可能會徹底損壞不兼容的玩家模型的面部。\n- 即使將所有表情設定爲預設值,引擎仍將表情設定爲更改後的表情。有問題的模型不會被修復。\n你必須切換模型一次,才能顯示選項卡! +EPS.Settings.Client.RebuildIcon=重新加載圖標 +EPS.Settings.Client.RebuildIcon.Desc=強制重新渲染所有玩家模型圖標。對於模型更新後的過期圖標很有用。這可能需要一些時間,渲染速度取決於你的模型數量和電腦性能。 + +EPS.Settings.Server=伺服器端 +EPS.Settings.Server.EnablePMEnforcement=啟用玩家模型鎖定 +EPS.Settings.Server.EnablePMEnforcement.Desc=如果啟用,將強制使用和保護選定的玩家模型。沒有任何遊戲模式、地圖或插件可以更改它們。玩家可以使用菜單頂部的複選框單獨切換此功能。\n如果禁用,則只有手動按鈕在沙盒模式以外可用。 +EPS.Settings.Server.AllowInstantChanges=允許立即更改模型 +EPS.Settings.Server.AllowInstantChanges.Desc=如果啟用,玩家不需要重生就可以立即更改模型。 +EPS.Settings.Server.AllowFlexes=允許玩家改變表情 +EPS.Settings.Server.AllowFlexes.Desc=如果啟用,玩家可以更改其玩家模型的表情。這將破壞玩家眨眼功能,並可能導致其他問題。風險自負。玩家只能通過斷開連接來重置表情。 +EPS.Settings.Server.EnableInAllGM=在所有遊戲模式中啟用模型選擇器 +EPS.Settings.Server.EnableInAllGM.Desc=如果啟用,玩家模型選擇器將對任何遊戲模式下的所有玩家可用。如果禁用,則只有管理員可以在沙盒之外的模式使用它。 +EPS.Settings.Server.RequestLimit=時間限制 +EPS.Settings.Server.RequestLimit.Desc=時間限制:玩家在再次使用即時更改功能之前必須等待的秒數。設定爲 0 禁用。 + +EPS.Settings.GM_Blacklist=遊戲模式黑名單 +EPS.Settings.GM_Blacklist.ExistedGM=已加入黑名單的遊戲模式 +EPS.Settings.GM_Blacklist.Desc=在這裏你可以把不兼容的遊戲模式加入黑名單。\n\n無論其他設定如何,玩家(包括管理員)都不能在這些遊戲模式下更改其玩家模型。 +EPS.Settings.GM_Blacklist.AddCurrent=添加當前遊戲模式至黑名單 +EPS.Settings.GM_Blacklist.ManuallyAddGM=手動添加遊戲模式 +EPS.Settings.GM_Blacklist.RemoveSelected=移除選中游戲模式 + +EPS.Settings.VOX=語音包 +EPS.Settings.VOX.PlayerModel=玩家模型 +EPS.Settings.VOX.Assigned=設定的語音包 +EPS.Settings.VOX.AvailableVOX=可用的語音包 +EPS.Settings.VOX.AssignToCurrent=爲選中的玩家模型設定語音包 +EPS.Settings.VOX.RemoveSelected=移除選中的設定 + +EPS.Settings.Info=訊息