Game Modding | Call of Duty: Black Ops 3 | Scripting
Spiki:
Jukebox V2
I present to you a clickable jukebox that plays 2d songs (for all players in the map).
I was going to make it so that you can choose if you want to hear it but then I remembered that I don't like streamers cuz many of them don't even mention your name or the map name.
Imma level with you. I'm not good in lua so if you don't like the design you can go suck a lemon.
I pulled parts of the lua code from previous projects, idk who the original scripter was. Prob quentin
Instructions:
1: You need to have lua in your map. If you don't know what that is, this tutorial will be hell for you.
2: Download the GSC from the attachment (change txt to gsc) and drop it in mapname/scripts/zm (or where ever you want i don't care :p).
3: Add the jukebox gsc to your main gsc with a #using and add it to your zone file
4: Copy the following lua code to the bottom your main lua file (not bottom of function):
function LUI.createMenu.JukeboxMenu(InstanceRef)
--CoD.Menu.CommonHudRequire()
local HudRef = CoD.Menu.NewForUIEditor("JukeboxMenu")
local AliasTable = {"mus_roundstart1_intro", "mus_roundstart2_intro", "mus_roundstart3_intro"}
local TitlesTable = {"Girls girls girls", "Straight outta compton", "Send nudes"}
local max_vert = 9
HudRef:setUseStencil(false) --maybe true?
HudRef.id = "JukeboxMenu"
HudRef.soundSet = "default"
HudRef:setLeftRight(true, true, 0.0, 0.0)
HudRef:setTopBottom(true, true, 0.0, 0.0)
HudRef:playSound("menu_open", InstanceRef)
HudRef.buttonModel = Engine.CreateModel(Engine.GetModelForController(Instance), "JukeboxMenu.buttonPrompts")
HudRef.JukeboxTitle = LUI.UIText.new()
HudRef.JukeboxTitle:setLeftRight(false, false, -150, 150)
HudRef.JukeboxTitle:setTopBottom(true, false, 20, 50)
HudRef.JukeboxTitle:setText("Jukebox")
HudRef:addElement(HudRef.JukeboxTitle)
local function MakeButton( HudRef, InstanceRef, DisplayText, x, y, str_to_gsc, index )
if str_to_gsc == nil then
str_to_gsc = "X"
end
if index == nil then
index = 0
end
local offx = 250
local offy = 30
if DisplayText == "X" then
offx = 50
offy = 50
end
local Text = LUI.UIText.new(Hud, Instance)
local Button = LUI.UIButton.new(HudRef, InstanceRef)
Text:setText(DisplayText)
Text:setTopBottom(true, false, y, y+offy)
Text:setLeftRight(true, false, x, x+offx)
Button:setTopBottom(true, false, y, y+offy)
Button:setLeftRight(true, false, x, x+offx)
if index > max_vert then
Text:setLeftRight(false, true, -x-offx, -x)
Button:setLeftRight(false, true, -x-offx, -x)
end
HudRef:addElement(Text)
HudRef:addElement(Button)
local function OnButtonMouseDown(Sender, EventArgs)
Text:setText("Mouse Down")
Engine.SendMenuResponse(HudRef, HudRef.menuName, tostring(str_to_gsc) )
Engine.SendMenuResponse(HudRef, HudRef.menuName, tostring(str_to_gsc) )
Engine.SendMenuResponse(HudRef, HudRef.menuName, tostring(str_to_gsc) )
HudRef:close()
end
local function SetMouseButton(arg0, arg1)
arg0.m_button = arg1
end
Button:setHandleMouse(true)
Button:registerEventHandler("button_action", OnButtonMouseDown)
Button.setButton = SetMouseButton
end
if #AliasTable == #TitlesTable then
MakeButton( HudRef, InstanceRef, "X", 0, 0, "X" )
else
MakeButton( HudRef, InstanceRef, "Mismatch", 0, 0, "Error" )
end
MakeButton( HudRef, InstanceRef, "Stop Music", 0, 70, "Stop" )
for i=1, #AliasTable do
if i > max_vert then
MakeButton( HudRef, InstanceRef, tostring(TitlesTable[i]), 300, (100+(50*(i-max_vert))), AliasTable[i], i)
else
MakeButton( HudRef, InstanceRef, tostring(TitlesTable[i]), 300, (100+(50*i)), AliasTable[i])
end
end
local function HudCloseCallback(MainHUD)
Engine.GetModel(Engine.GetModelForController(Instance), "JukeboxMenu.buttonPrompts")
Engine.UnsubscribeAndFreeModel()
end
LUI.OverrideFunction_CallOriginalSecond(HudRef, "close", HudCloseCallback)
return HudRef
end
4: Make some aliases
Example:
mus_slender_page_collected,,streamed,mus\zm\zod\meatball_round\meatball_round_end_mas_edited.wav,,,UIN_MOD,,,,,BUS_MUSIC,,,,,,100,100,,,,,,,,2,oldest,,,1,1,,,,,,2d,,,NONLOOPING,,,,,,,,,,,,,,,,,,,,,,,,,,,yes,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
5: Add aliases to the lua file.
In the top of my code you'll see AliasTable and TitlesTable
AliasTable contains aliases
TitlesTable contains the names displayed on screen
The aliases and titles must be in the same order otherwise wrong sounds will play
If ingame it says "Mismatch" in the top left, there aren't the same amount of aliases as titles
You can change the amount of entries per column by changing max_vert from 9 to whatever (check pic above)
ATTENTION: This is a mouse only menu. Controllers are useless here.
Changelog:
2020 04 20 - Release
ModmeBot:
Reply By: Lapin123
How to add new sounds? Can you help me to add sound
Do you have a tutorial for this ?
ModmeBot:
Reply By: mathfag
Lapin123
How to add new sounds? Can you help me to add sound Do you have a tutorial for this ?
ModmeBot:
Reply By: tygo246
Script and sounds are working however the text is not showing up when you are next to the trigger
ModmeBot:
Reply By: mathfag
tygo246
Script and sounds are working however the text is not showing up when you are next to the trigger
ModmeBot:
Reply By: tygo246
Thanks it's working fine now
ModmeBot:
Reply By: Artleck
I'm trying to use this myself. But it isn't working at all, Not even running the script. I have no clue what is happening. But i did make sure that the Trigger multiple has targetname - trig_jukebox and that the code is in MAP_NAME.GSC. Any ideas why this is happening?
ModmeBot:
Reply By: modric
Did you thread it properly
ModmeBot:
Reply By: Artleck
modric
Did you thread it properly
ModmeBot:
Reply By: Lokii
Hey math, just one quick issue, i don't know if i could take this any further in discord but basically, whenever someone walks upto the jukebox and doesn't activate it, the jukebox enable message stays on the screen indefinitely, i have added everything, i even tried to add my own little destroy HUD command, but alas, that didn't work.
ChiefMustardo:
Hi there, I am currently receiving and unexpected token error and I have had a look through the line specified but I can't identify where the typo is. Anybody got any solutions or ran into this problem before?
The Error
UNRECOVERABLE ERROR:
^1SCRIPT ERROR: No generated data for 'scripts/zm/zm_actual.gsc'
ERR(0) scripts/zm/zm_actual.gsc (340,44) in "song_switch()" : syntax error, unexpected TOKEN_EQUALS : for( i=0;i<level.juke_songs.size;i++) {=
Linker will now terminate.
********************************************************************************
==================================================
Linker summary:
There were no errors or warnings.
==================================================
^1 for( i=0;i<level.juke_songs.size;i++) {=
^1-------------------------------------------^
^1ERR(0) scripts/zm/zm_actual.gsc (340,44) in "song_switch()" : syntax error, unexpected TOKEN_EQUALS : for( i=0;i<level.juke_songs.size;i++) {=
The Function
function song_switch()
{
//IPrintLnBold("song change start");
for( i=0;i<level.juke_songs.size;i++) {="" wait(0.05);="" iprintlnbold(level.juke_songs[i]);="" player="GetPlayers();" player="ArrayGetClosest(self.origin,player,100);" level.juke="i;" player="" iprintlnbold(level.juke_songs[level.juke]);="" thread="" setgunhint(level.juke_songs[level.juke],="" self);="" wait(1);="" wait(0.1);="" self="" stopsound(level.juke_songs[i-1]);="" iprintlnbold(i);="" if(i="">=level.juke_songs.size-1);
i=-1;
level waittill("song_change");
//wait(0.1);
continue;
}
}
ChiefMustardo:
I've gotten numerous errors from the script now even after fixing the one above so I assume it just fails to work as of 16/10/19
Haxxatoic:
I've gotten numerous errors from the script now even after fixing the one above so I assume it just fails to work as of 16/10/19
function song_switch()
{
//IPrintLnBold("song change start");
for( i=0;i<level.juke_songs.size;i++)
{
wait(0.05);
//iprintlnbold(level.juke_songs[i]); <Removed the name being printed twice>
player=GetPlayers();
player=ArrayGetClosest(self.origin,player,100);
level.juke=i;
player= iprintlnbold(level.juke_songs[level.juke]);
thread setgunhint(level.juke_songs[level.juke], self);
wait(1);
wait(0.1);
self stopsound(level.juke_songs[i-1]);
//iprintlnbold(i); <Removed the number of the song being printed in game>
if(i>=level.juke_songs.size-1)
{
i=-1;
}
level waittill("song_change");
//wait(0.1);
continue;
}
}
ChiefMustardo:
Ah ok. I will give it another shot and see. Thanks!
Spiki:
Updated to lua
https://forum.modme.co/threads/jukebox.1136/
ChiefMustardo:
Ayyy, you gem!