From 6b50ca22189fc3dc4da28d60bbeff1d14ab53a00 Mon Sep 17 00:00:00 2001 From: icedream Date: Sat, 21 Dec 2013 10:46:51 +0100 Subject: [PATCH] Add worldtip compatibility layer. --- lua/autorun/client/patch_createfont.lua | 57 ++++++++++ lua/weapons/disguiser/cl_init.lua | 11 +- lua/weapons/disguiser/cl_worldtips.lua | 135 ++++++++++++++++++++++++ lua/weapons/disguiser/init.lua | 1 + 4 files changed, 199 insertions(+), 5 deletions(-) create mode 100644 lua/autorun/client/patch_createfont.lua create mode 100644 lua/weapons/disguiser/cl_worldtips.lua diff --git a/lua/autorun/client/patch_createfont.lua b/lua/autorun/client/patch_createfont.lua new file mode 100644 index 0000000..af3c5ce --- /dev/null +++ b/lua/autorun/client/patch_createfont.lua @@ -0,0 +1,57 @@ +/** + * Disguiser SWEP - Lets you disguise as any prop on a map. + * + * File: + * patch_createfont.lua + * + * Purpose: + * This code will allow any font to be checked for existence. I hope it works + * as it is only a function patch which should be loaded right at the beginning. + * Can't guarantee that it loads right at the beginning though. + * + * Copyright (C) 2013 Carl Kittelberger (Icedream) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +print("[Disguiser] Loading compatibility layer for surface.CreateFont...") + +local registered_fonts = {} + +// Function already patched by us? +if !!surface.__createFont then + MsgC(Color(255, 255, 0), "[Fontpatch] Can't patch surface.CreateFont, already patched. Skipping patch.\n") + return +end + +// Original function +surface.__createFont = surface.CreateFont + +// Patch function +function surface.CreateFont(name, data) + if !name || !data then return false end + + if !!registered_fonts[name] then + MsgN("[Fontpatch] Skipping font " .. name .. ", already registered") + else + MsgN("[Fontpatch] Registering font " .. name .. "...") + end + registered_fonts[name] = true + surface.__createFont(name, data) +end + +// Check if a font exists +function surface.FontExists(name) + return !!registered_fonts[name] // I love how all those peeps on the internet still don't use the !! thingie +end \ No newline at end of file diff --git a/lua/weapons/disguiser/cl_init.lua b/lua/weapons/disguiser/cl_init.lua index c3df095..bd51917 100644 --- a/lua/weapons/disguiser/cl_init.lua +++ b/lua/weapons/disguiser/cl_init.lua @@ -39,6 +39,11 @@ SWEP.WepSelectIcon = surface.GetTextureID("vgui/gmod_tool" ) SWEP.Gradient = surface.GetTextureID("gui/gradient" ) SWEP.InfoIcon = surface.GetTextureID("gui/info") +include("cl_fxfake.lua") +include("cl_3rdperson.lua") +include("cl_obb.lua") +include("cl_worldtips.lua") + local BannedPropError_Entity = nil local BannedPropError_Time = 5 local function BannedPropError() @@ -79,8 +84,4 @@ end // this is usually triggered on right mouse click function SWEP:SecondaryAttack() -end - -include("cl_fxfake.lua") -include("cl_3rdperson.lua") -include("cl_obb.lua") \ No newline at end of file +end \ No newline at end of file diff --git a/lua/weapons/disguiser/cl_worldtips.lua b/lua/weapons/disguiser/cl_worldtips.lua new file mode 100644 index 0000000..237815b --- /dev/null +++ b/lua/weapons/disguiser/cl_worldtips.lua @@ -0,0 +1,135 @@ +/** + * Disguiser SWEP - Lets you disguise as any prop on a map. + * + * File: + * cl_worldtips.lua + * + * Purpose: + * First, yes, this is a ripoff from the GMod lua code repository. Yes, this + * is thought as a compatibility layer for non-sandbox gamemodes as I'm sick + * and tired of text-only warnings. So this will fill the empty space called + * "world tips" if they aren't already existing yet. + * The original code has been written by GMod creator Garry Newman himself. + * + * Copyright (C) 2013 Carl Kittelberger (Icedream) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +// We use the font patch from autostart here +if !surface.FontExists then + MsgC(Color(255, 255, 0), "The font patch did not load yet. Might make trouble with surface.CreateFont. Look out for errors!") +end +if !surface:FontExists("GModWorldtip") then + surface.CreateFont( "GModWorldtip", + { + font = "Helvetica", + size = 20, + weight = 700 + }) +end + +local need_AddWorldTip = !AddWorldTip +local need_GM_PaintWorldTips = false + +// Let's hope the gamemode is patchable +GM = GM or GAMEMODE or nil +if need_AddWorldTip then + if GM == nil then + GM = {} + MsgC(Color(255, 255, 0), "Can not apply worldtip patch to GAMEMODE! Will not display any balloon tips!") + else + need_GM_PaintWorldTips = !GAMEMODE.PaintWorldTips + end +end + +local needPatch = need_AddWorldTip || need_GM_PaintWorldTips + +// Check if we have to create the compatibility layer +if !needPatch then + local cl_drawworldtooltips = CreateConVar( "cl_drawworldtooltips", "1", { FCVAR_ARCHIVE } ) + local WorldTip = nil + + local TipColor = Color( 250, 250, 200, 255 ) + + function AddWorldTip(_1, text, _2, pos, entity) + WorldTip = { + dietime = SysTime() + 0.05, + ["text"] = text, + ["pos"] = pos, + ["ent"] = ent + } + end + + if !!GM then + local function DrawWorldTip( tip ) + if ( IsValid( tip.ent ) ) then + tip.pos = tip.ent:GetPos() + end + + local pos = tip.pos:ToScreen() + + local black = Color( 0, 0, 0, 255 ) + local tipcol = Color( TipColor.r, TipColor.g, TipColor.b, 255 ) + + local x = 0 + local y = 0 + local padding = 10 + local offset = 50 + + surface.SetFont( "GModWorldtip" ) + local w, h = surface.GetTextSize( tip.text ) + + x = pos.x - w + y = pos.y - h + + x = x - offset + y = y - offset + + draw.RoundedBox( 8, x-padding-2, y-padding-2, w+padding*2+4, h+padding*2+4, black ) + + local verts = {} + verts[1] = { x=x+w/1.5-2, y=y+h+2 } + verts[2] = { x=x+w+2, y=y+h/2-1 } + verts[3] = { x=pos.x-offset/2+2, y=pos.y-offset/2+2 } + + draw.NoTexture() + surface.SetDrawColor( 0, 0, 0, tipcol.a ) + surface.DrawPoly( verts ) + + + draw.RoundedBox( 8, x-padding, y-padding, w+padding*2, h+padding*2, tipcol ) + + local verts = {} + verts[1] = { x=x+w/1.5, y=y+h } + verts[2] = { x=x+w, y=y+h/2 } + verts[3] = { x=pos.x-offset/2, y=pos.y-offset/2 } + + draw.NoTexture() + surface.SetDrawColor( tipcol.r, tipcol.g, tipcol.b, tipcol.a ) + surface.DrawPoly( verts ) + + + draw.DrawText( tip.text, "GModWorldtip", x + w/2, y, black, TEXT_ALIGN_CENTER ) + end + + function GM:PaintWorldTips() + if ( !cl_drawworldtooltips:GetBool() ) then return end + + if ( WorldTip && WorldTip.dietime > SysTime() ) then + DrawWorldTip( WorldTip ) + end + end + end +end \ No newline at end of file diff --git a/lua/weapons/disguiser/init.lua b/lua/weapons/disguiser/init.lua index 6cb0d7c..cf7e237 100644 --- a/lua/weapons/disguiser/init.lua +++ b/lua/weapons/disguiser/init.lua @@ -39,6 +39,7 @@ AddCSLuaFile("cl_init.lua") AddCSLuaFile("cl_3rdperson.lua") AddCSLuaFile("cl_obb.lua") AddCSLuaFile("cl_fxfake.lua") +AddCSLuaFile("cl_worldtips.lua") AddCSLuaFile("sh_init.lua") // Shared stuff