Initial commit.
commit
89cf6fc809
|
@ -0,0 +1,9 @@
|
|||
*.bat
|
||||
*.cmd
|
||||
*.sh
|
||||
*.gma
|
||||
*.exe
|
||||
*.exe.config
|
||||
*.pdb
|
||||
*.dll
|
||||
*.dll.config
|
|
@ -0,0 +1,22 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 DreamNetwork
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
PropHunt Taunt Menu
|
||||
-------------------
|
||||
|
||||
Implements a very minimal but flexible menu for playing taunts while playing Prop Hunt.
|
||||
|
||||
## Installation via Workshop
|
||||
|
||||
This addon will be available via the Steam Workshop.
|
||||
If you want to install it on your client, subscribe to it with the green Subscribe button. It will be automatically updated appropriately.
|
||||
If you want to install it on your server, you can add the addon to a collection and use the collection with your server. More info regarding this can be looked up [here](http://wiki.garrysmod.com/page/Workshop_for_Dedicated_Servers).
|
||||
|
||||
## How to use?
|
||||
|
||||
Press the key you selected as "Spare 2" in your Garry's Mod "Options" menu while you're playing as Prop or Hunter. Usually that is F4.
|
||||
|
||||
## License
|
||||
|
||||
This tauntpack has been published under the MIT license. For license information see the [LICENSE](LICENSE) file.
|
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"title" : "PropHunt Taunt Menu",
|
||||
"type" : "gamemode",
|
||||
"tags" : [ "fun", "roleplay" ],
|
||||
"ignore" :
|
||||
[
|
||||
"*.md",
|
||||
"*.exe",
|
||||
"*.exe.config",
|
||||
"*.dll",
|
||||
"*.dll.config",
|
||||
"*.pdb",
|
||||
"*.bat",
|
||||
"*.cmd",
|
||||
"*.sh",
|
||||
"*.txt",
|
||||
"*.gma",
|
||||
".git*"
|
||||
]
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
-- Sent by the server to let us know about available taunts
|
||||
local sortedTaunts = {}
|
||||
|
||||
net.Receive("TauntList_Update", function()
|
||||
|
||||
local tauntsTable = net.ReadTable()
|
||||
|
||||
--[[
|
||||
print("Got tauntlist update:")
|
||||
PrintTable(tauntsTable)
|
||||
--]]
|
||||
|
||||
-- Syntax of the table is just the same as for tauntpacks.
|
||||
-- We categorize the taunts by splitting the names up and making use of the parts.
|
||||
sortedTaunts = {}
|
||||
for team, taunts in pairs(tauntsTable) do
|
||||
sortedTaunts[team] = { sounds={}, categories={} }
|
||||
|
||||
for _, value in pairs(taunts) do
|
||||
local path = value[1]
|
||||
local description = value[2]
|
||||
local name = nil
|
||||
local parent = sortedTaunts[team]
|
||||
|
||||
-- split the name for categorization
|
||||
for _, i in pairs(string.Split(description, " - ")) do
|
||||
if name ~= nil then
|
||||
if parent.categories[name] == nil then
|
||||
parent.categories[name] = { sounds={}, categories={} }
|
||||
end
|
||||
parent = parent.categories[name]
|
||||
end
|
||||
|
||||
name = i
|
||||
end
|
||||
|
||||
parent.sounds[name] = path
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
local windowColor = Color(128, 128, 128, 192)
|
||||
local textColor = Color(255, 255, 255)
|
||||
|
||||
local function PlayTaunt(sound)
|
||||
net.Start("TauntMenu_Play")
|
||||
net.WriteString(sound)
|
||||
net.SendToServer()
|
||||
end
|
||||
|
||||
local function Apply(menu, taunts)
|
||||
-- sort sounds
|
||||
local sounds = {}
|
||||
for key,value in pairs(taunts.sounds) do
|
||||
table.insert(sounds, { key=key, value=value })
|
||||
end
|
||||
table.sort(sounds, function(a, b)
|
||||
return string.lower(a.key) < string.lower(b.key)
|
||||
end)
|
||||
|
||||
-- sort categories
|
||||
local categories = {}
|
||||
for key,value in pairs(taunts.categories) do
|
||||
table.insert(categories, { key=key, value=value })
|
||||
end
|
||||
table.sort(categories, function(a, b)
|
||||
return string.lower(a.key) < string.lower(b.key)
|
||||
end)
|
||||
|
||||
-- add categories to the menu
|
||||
for _, item in pairs(categories) do
|
||||
Apply(menu:AddSubMenu(item.key), item.value)
|
||||
end
|
||||
|
||||
-- add sounds to the menu
|
||||
for _, item in pairs(sounds) do
|
||||
menu:AddOption(item.key, function()
|
||||
PlayTaunt(item.value)
|
||||
end)
|
||||
end
|
||||
|
||||
menu:AddSpacer()
|
||||
end
|
||||
|
||||
local function CreateMenu()
|
||||
-- does the team even have taunts? (spectators don't, so no menu for them!)
|
||||
local team = LocalPlayer():Team()
|
||||
local teamTaunts = sortedTaunts[team]
|
||||
if teamTaunts == nil then
|
||||
return nil
|
||||
end
|
||||
|
||||
-- menu bar
|
||||
local menu = vgui.Create("DMenu")
|
||||
|
||||
-- build submenus
|
||||
Apply(menu, teamTaunts)
|
||||
|
||||
return menu
|
||||
end
|
||||
|
||||
hook.Add( "PlayerBindPress", "PlayerBindPressFKeyMenus", function(pl, bind, pressed)
|
||||
if string.find(bind, "gm_showspare2") then
|
||||
local menu = CreateMenu()
|
||||
if menu ~= nil then
|
||||
menu:Open()
|
||||
end
|
||||
end
|
||||
end);
|
|
@ -0,0 +1,192 @@
|
|||
-- For reference see Prop Hunt, sh_init.lua:58 and sh_init.lua:63
|
||||
|
||||
local tauntsTable = {}
|
||||
local tauntsFixedTable = {}
|
||||
local tauntPathsTable = {}
|
||||
|
||||
local fixedNames = {
|
||||
--[[ Hunter taunts ]]--
|
||||
-- shipped with Prop Hunt
|
||||
["taunts/hunters/come_to_papa.wav"] = "Come to papa",
|
||||
["taunts/hunters/father.wav"] = "Father",
|
||||
["taunts/hunters/fireassis.wav"] = "Fire Assist",
|
||||
["taunts/hunters/hitassist.wav"] = "Hit Assist",
|
||||
["taunts/hunters/now_what.wav"] = "Now what",
|
||||
["taunts/hunters/you_dont_know_the_power.wav"] = "Star Wars - Darth Vader - You don't know the power of the dark side",
|
||||
["taunts/hunters/you_underestimate_the_power.wav"] = "Star Wars - Darth Vader - You underestimate the power of the dark side",
|
||||
["taunts/hunters/glados-president.wav"] = "Portal - GLaDOS - Past president of the being-alive club",
|
||||
["taunts/hunters/rude.mp3"] = "Rude",
|
||||
["taunts/hunters/illfindyou.mp3"] = "I will find you and I will kill you",
|
||||
|
||||
-- Half-Life 2
|
||||
["vo/k_lab/ba_guh.wav"] = "Half-Life 2 - Barney - Guh",
|
||||
["vo/npc/male01/vanswer13.wav"] = "Half-Life 2 - Stop, you're killing me",
|
||||
["vo/npc/male01/thehacks01.wav"] = "Half-Life 2 - The hacks!",
|
||||
["vo/npc/male01/runforyourlife02.wav"] = "Half-Life 2 - Run for your life!",
|
||||
["vo/npc/male01/overhere01.wav"] = "Half-Life 2 - Hey, over here!",
|
||||
["vo/npc/male01/overthere01.wav"] = "Half-Life 2 - Over there! - 1",
|
||||
["vo/npc/male01/overthere02.wav"] = "Half-Life 2 - Over there! - 2",
|
||||
|
||||
--[[ Prop taunts ]]--
|
||||
-- shipped with Prop Hunt
|
||||
["taunts/boom_headshot.wav"] = "Boom, Headshot!",
|
||||
["taunts/go_away_or_i_shall.wav"] = "Go away or I shall taunt you",
|
||||
["taunts/ill_be_back.wav"] = "I'll be back",
|
||||
["taunts/negative.wav"] = "Negative",
|
||||
["taunts/doh.wav"] = "Simpsons - D'oh!",
|
||||
["taunts/oh_yea_he_will_pay.wav"] = "Yeah, you'll pay, you will definitely pay",
|
||||
["taunts/ok_i_will_tell_you.wav"] = "I'll tell you, do you know the muffin man?",
|
||||
["taunts/please_come_again.wav"] = "Please come again",
|
||||
["taunts/threat_neutralized.wav"] = "Thread neutralized!",
|
||||
["taunts/what_is_wrong_with_you.wav"] = "What is wrong with you!?",
|
||||
["taunts/woohoo.wav"] = "Woohoo!",
|
||||
["taunts/props/1.wav"] = "Boom, Headshot!",
|
||||
["taunts/props/2.wav"] = "Simpsons - D'oh!",
|
||||
["taunts/props/3.wav"] = "Go away or I shall taunt you",
|
||||
["taunts/props/4.wav"] = "Vince with ShamWow!",
|
||||
["taunts/props/5.wav"] = "Negative",
|
||||
["taunts/props/6.wav"] = "Over 9000",
|
||||
["taunts/props/7.wav"] = "LEEROY JENKINS",
|
||||
["taunts/props/8.wav"] = "Please come again",
|
||||
["taunts/props/9.wav"] = "This is SPARTA!",
|
||||
["taunts/props/10.wav"] = "What is wrong with you!?",
|
||||
["taunts/props/11.wav"] = "Woohoo!",
|
||||
["taunts/props/12.wav"] = "What do you like to play? Pokemon!",
|
||||
["taunts/props/13.mp3"] = "I need chippie for my bonga hole",
|
||||
["taunts/props/14.wav"] = "Wheeee!",
|
||||
["taunts/props/15.wav"] = "Snooping as usual, I see",
|
||||
["taunts/props/16.wav"] = "AAAAAAAAAAATATATATATATATA",
|
||||
["taunts/props/17.mp3"] = "Aaaaaahahahaha",
|
||||
["taunts/props/18.wav"] = "Billy Maze - Get on the ball!",
|
||||
["taunts/props/19.wav"] = "Car horns",
|
||||
["taunts/props/20.wav"] = "Billy Maze - Are you on the ball?",
|
||||
["taunts/props/21.wav"] = "Billy Maze - For only 19.99!",
|
||||
["taunts/props/22.wav"] = "Billy Maze - And you'll never have to pour...",
|
||||
["taunts/props/23.wav"] = "Billy Maze - I guarantee it",
|
||||
["taunts/props/24.wav"] = "Billy Maze - It's new Oxiclean Detergent",
|
||||
["taunts/props/25.wav"] = "Billy Maze - It's so easy, even your kids can do laundry",
|
||||
["taunts/props/26.wav"] = "Billy Maze - So get on the ball!",
|
||||
["taunts/props/27.wav"] = "Billy Maze - The Oxiclean Detergent ball",
|
||||
["taunts/props/28.wav"] = "Billy Maze - Laundries just got easier",
|
||||
["taunts/props/29.wav"] = "Music - Running in the 90's",
|
||||
["taunts/props/30.wav"] = "All military forces...",
|
||||
["taunts/props/31.mp3"] = "Bad boys, what you gonna do when they come for you?",
|
||||
["taunts/props/32.mp3"] = "Music - TEKKNO",
|
||||
["taunts/props/33.mp3"] = "Music - Call on me",
|
||||
["taunts/props/34.mp3"] = "Music - I am the one and only",
|
||||
["taunts/props/35.mp3"] = "Wololo",
|
||||
["taunts/hunters/laugh.wav"] = "Laugh", -- look in the Prop Hunt source if you don't believe this being a prop taunt (despite the fact the sound file is missing there)
|
||||
|
||||
-- Half-life 2 taunts --
|
||||
["vo/citadel/br_ohshit.wav"] = "Half-Life 2 - Dr. Breen - Oh, shit",
|
||||
["vo/citadel/br_youfool.wav"] = "Half-Life 2 - Dr. Breen - You fool",
|
||||
["vo/citadel/br_youneedme.wav"] = "Half-Life 2 - Dr. Breen - You need me",
|
||||
["vo/coast/odessa/male01/nlo_cheer01.wav"] = "Half-Life 2 - Cheer - Male - 1",
|
||||
["vo/coast/odessa/male01/nlo_cheer02.wav"] = "Half-Life 2 - Cheer - Male - 2",
|
||||
["vo/coast/odessa/male01/nlo_cheer03.wav"] = "Half-Life 2 - Cheer - Male - 3",
|
||||
["vo/coast/odessa/male01/nlo_cheer04.wav"] = "Half-Life 2 - Cheer - Male - 4",
|
||||
["vo/coast/odessa/female01/nlo_cheer01.wav"] = "Half-Life 2 - Cheer - Female - 1",
|
||||
["vo/coast/odessa/female01/nlo_cheer02.wav"] = "Half-Life 2 - Cheer - Female - 2",
|
||||
["vo/coast/odessa/female01/nlo_cheer03.wav"] = "Half-Life 2 - Cheer - Female - 3",
|
||||
["vo/gman_misc/gman_riseshine.wav"] = "Half-Life 2 - G-Man - Rise and shine",
|
||||
["vo/npc/barney/ba_damnit.wav"] = "Half-Life 2 - Barney - Damn it",
|
||||
["vo/npc/barney/ba_laugh01.wav"] = "Half-Life 2 - Barney - Laugh - 1",
|
||||
["vo/npc/barney/ba_laugh02.wav"] = "Half-Life 2 - Barney - Laugh - 2",
|
||||
["vo/npc/barney/ba_laugh03.wav"] = "Half-Life 2 - Barney - Laugh - 3",
|
||||
["vo/npc/barney/ba_laugh04.wav"] = "Half-Life 2 - Barney - Laugh - 4",
|
||||
["vo/npc/male01/hacks01.wav"] = "Half-Life 2 - Hacks - 1",
|
||||
["vo/npc/male01/hacks02.wav"] = "Half-Life 2 - Hacks - 2",
|
||||
["vo/npc/male01/vanswer01.wav"] = "Half-Life 2 - Enough of your mumbo-jumbo",
|
||||
["vo/npc/male01/question05.wav"] = "Half-Life 2 - Oh! Deja-vu!",
|
||||
["vo/npc/male01/question06.wav"] = "Half-Life 2 - Sometimes I dream about cheese",
|
||||
["vo/npc/male01/answer34.wav"] = "Half-Life 2 - Don't forget Hawaii",
|
||||
["vo/npc/male01/question30.wav"] = "Half-Life 2 - I'm glad there's no kids around to see this",
|
||||
["vo/npc/male01/question26.wav"] = "Half-Life 2 - This is bullshit",
|
||||
["vo/npc/male01/incoming02.wav"] = "Half-Life 2 - Incoming!",
|
||||
["vo/npc/male01/gethellout.wav"] = "Half-Life 2 - Get the hell outta here",
|
||||
["vo/ravenholm/madlaugh04.wav"] = "Father Gregori - Mad laugh",
|
||||
["taunts/fixed/13_fix.wav"] = "I need chippie for my bonga hole",
|
||||
["taunts/fixed/bees_fix.wav"] = "Not the bees!"
|
||||
}
|
||||
|
||||
util.AddNetworkString("TauntList_Update")
|
||||
util.AddNetworkString("TauntMenu_Play")
|
||||
|
||||
local function FixName(name)
|
||||
if fixedNames[name] ~= nil then return fixedNames[name] end
|
||||
return name
|
||||
end
|
||||
|
||||
local function PlayTaunt(pl, sound)
|
||||
local team = pl:Team()
|
||||
local tauntPaths = tauntPathsTable[team]
|
||||
|
||||
-- TAUNT_DELAY from Prop Hunt, sh_config.lua:172
|
||||
-- The code tries to match up with Prop Hunt, init.lua:163-178
|
||||
if GAMEMODE:InRound() && IsValid(pl) && pl:IsPlayer() && pl:Alive() && pl.last_taunt_time + TAUNT_DELAY <= CurTime()
|
||||
&& tauntPaths ~= nil && table.HasValue(tauntPaths, sound) then
|
||||
pl.last_taunt_time = CurTime()
|
||||
pl.last_taunt = sound
|
||||
|
||||
pl:EmitSound(sound, 100)
|
||||
end
|
||||
end
|
||||
|
||||
local function BroadcastUpdate()
|
||||
net.Start("TauntList_Update")
|
||||
net.WriteTable(tauntsFixedTable)
|
||||
net.Broadcast()
|
||||
end
|
||||
|
||||
local function SendUpdate(pl)
|
||||
net.Start("TauntList_Update")
|
||||
net.WriteTable(tauntsFixedTable)
|
||||
net.Send(pl)
|
||||
end
|
||||
|
||||
-- Detect changes in the taunt list
|
||||
hook.Add("Think", "TauntList_DetectUpdate", function()
|
||||
-- Tauntpack loader replaces the old table with a new instance whenever it reloads the taunts.
|
||||
-- This means we can use reference equality to detect changes quickly here.
|
||||
-- For reference see sv_ph_tauntpack_loader.lua:55-56
|
||||
if (GAMEMODE.Hunter_Taunts == nil) or (GAMEMODE.Prop_Taunts == nil) then return end
|
||||
if (tauntsTable[TEAM_HUNTERS] ~= GAMEMODE.Hunter_Taunts)
|
||||
or (tauntsTable[TEAM_PROPS] ~= GAMEMODE.Prop_Taunts) then
|
||||
|
||||
tauntsTable= {}
|
||||
tauntsFixedTable= {}
|
||||
|
||||
-- Replace some of the names with fixed names since Tauntpack Loader
|
||||
-- just uses the file path for them which will look ugly on the UI
|
||||
tauntsTable[TEAM_HUNTERS] = GAMEMODE.Hunter_Taunts
|
||||
tauntsFixedTable[TEAM_HUNTERS] = {}
|
||||
for index, item in pairs(GAMEMODE.Hunter_Taunts) do
|
||||
tauntsFixedTable[TEAM_HUNTERS][index] = { item[1], FixName(item[2]) }
|
||||
end
|
||||
|
||||
tauntsTable[TEAM_PROPS] = GAMEMODE.Prop_Taunts
|
||||
tauntsFixedTable[TEAM_PROPS] = {}
|
||||
for index, item in pairs(GAMEMODE.Prop_Taunts) do
|
||||
tauntsFixedTable[TEAM_PROPS][index] = { item[1], FixName(item[2]) }
|
||||
end
|
||||
|
||||
-- Tables that hold sound paths, see Prop Hunt, sh_config.lua:70-168
|
||||
tauntPathsTable[TEAM_HUNTERS] = HUNTER_TAUNTS
|
||||
tauntPathsTable[TEAM_PROPS] = PROP_TAUNTS
|
||||
|
||||
BroadcastUpdate()
|
||||
end
|
||||
end)
|
||||
|
||||
-- PlayerInitialSpawn gets called when the player gets to "Sending Client Info".
|
||||
-- We let the player know all the taunts for the menu here.
|
||||
hook.Add("PlayerInitialSpawn", "TauntList_UpdateFirst", function(pl)
|
||||
SendUpdate(pl)
|
||||
end)
|
||||
|
||||
-- Sent by the client to play a custom taunt
|
||||
net.Receive("TauntMenu_Play", function(len, pl)
|
||||
local path = net.ReadString()
|
||||
|
||||
PlayTaunt(pl, path)
|
||||
end)
|
Loading…
Reference in New Issue