Name | Type | is_array | initial_value |
globals
hashtable Hashtable = InitHashtable()
endglobals
function GlobalHandle takes nothing returns integer
return GetHandleId(Hashtable)
endfunction
function hexvalue takes integer number returns string
if number < 10 then
return I2S(number)
elseif number == 10 then
return "a"
elseif number == 11 then
return "b"
elseif number == 12 then
return "c"
elseif number == 13 then
return "d"
elseif number == 14 then
return "e"
elseif number == 15 then
return "f"
endif
return "Error"
endfunction
function IsHex takes string hexcode returns boolean
local integer c1
local integer c2
local boolean check
set c1 = 0
loop
exitwhen c1 > 5
set c2 = 0
set check = false
loop
exitwhen c2 > 15
if StringCase(SubString(hexcode, c1, c1 + 1), false) == hexvalue(c2) then
set check = true
endif
set c2 = c2 + 1
endloop
if not check then
return false
endif
set c1 = c1 + 1
endloop
return true
endfunction
function NewMUITimer takes integer pID returns integer
local integer MaxTimer = LoadInteger(Hashtable, GlobalHandle(), StringHash("TimerMaximumCount"))
local integer Iterator = LoadInteger(Hashtable, GetHandleId(Player(pID)), StringHash("TimerIterator"))
loop
exitwhen not LoadBoolean(Hashtable, GetHandleId(LoadTimerHandle(Hashtable, GetHandleId(Player(pID)), Iterator)), StringHash("TimerStarted")) and Iterator <= MaxTimer
if Iterator > MaxTimer then
set Iterator = 0
else
set Iterator = Iterator + 1
endif
endloop
call SaveInteger(Hashtable, GetHandleId(Player(pID)), StringHash("TimerIterator"), Iterator)
if LoadTimerHandle(Hashtable, GetHandleId(Player(pID)), Iterator) == null then
call SaveTimerHandle(Hashtable, GetHandleId(Player(pID)), Iterator, CreateTimer())
endif
call SaveBoolean(Hashtable, GetHandleId(LoadTimerHandle(Hashtable, GetHandleId(Player(pID)), Iterator)), StringHash("TimerStarted"), true)
return GetHandleId(LoadTimerHandle(Hashtable, GetHandleId(Player(pID)), Iterator))
endfunction
function LoadMUITimer takes integer pID returns timer
return LoadTimerHandle(Hashtable, GetHandleId(Player(pID)), LoadInteger(Hashtable, GetHandleId(Player(pID)), StringHash("TimerIterator")))
endfunction
function TimerPause takes timer Timer returns nothing
if LoadBoolean(Hashtable, GetHandleId(Timer), StringHash("TimerStarted")) then
call PauseTimer(Timer)
call FlushChildHashtable(Hashtable, GetHandleId(Timer))
call SaveBoolean(Hashtable, GetHandleId(Timer), StringHash("TimerStarted"), false)
endif
endfunction
function Update_Game_Time takes nothing returns nothing
local integer pID = 0
call SaveInteger(Hashtable, GlobalHandle(), StringHash("Game Time"), LoadInteger(Hashtable, GlobalHandle(), StringHash("Game Time")) + 1)
loop
exitwhen pID > 23
if GetPlayerController(Player(pID)) == MAP_CONTROL_USER then
call SaveStr(Hashtable, GetHandleId(Player(pID)), StringHash("Default Dialog Variable: ptime"), I2S(LoadInteger(Hashtable, GlobalHandle(), StringHash("Game Time"))))
endif
set pID = pID + 1
endloop
endfunction
function Get_Game_Time takes nothing returns integer
return LoadInteger(Hashtable, GlobalHandle(), StringHash("Game Time"))
endfunction
function Set_Chat_Color takes integer pID, string hexcode returns boolean
if StringLength(hexcode) == 6 and IsHex(hexcode) then
call SaveStr(Hashtable, GlobalHandle(), StringHash("Chat Color " + I2S(pID)), hexcode)
return true
endif
return false
endfunction
function Get_Chat_Color takes integer pID returns string
if LoadStr(Hashtable, GlobalHandle(), StringHash("Chat Color " + I2S(pID))) != null and LoadStr(Hashtable, GlobalHandle(), StringHash("Chat Color " + I2S(pID))) != "" then
return LoadStr(Hashtable, GlobalHandle(), StringHash("Chat Color " + I2S(pID)))
else
return "None"
endif
endfunction
// Chat Internal Start
function Chat_SM takes nothing returns string
return "[|cffe6a200System|r]"
endfunction
function Chat_AM takes nothing returns string
return "[|cffe6a200Global|r]"
endfunction
function Chat_TimeTag takes nothing returns string
local integer Quotient = Get_Game_Time()
local string minutes = I2S(Quotient / 60)
local string seconds = I2S(Quotient - (Quotient / 60) * 60)
if StringLength(minutes) < 2 then
set minutes = "0" + minutes
endif
if StringLength(seconds) < 2 then
set seconds = "0" + seconds
endif
return "[" + minutes + ":" + seconds + "]"
endfunction
function Chat_User takes integer pID returns string
local string name = GetPlayerName(Player(pID))
if LoadStr(Hashtable, GlobalHandle(), StringHash("Chat Color " + I2S(pID))) != null and LoadStr(Hashtable, GlobalHandle(), StringHash("Chat Color " + I2S(pID))) != "" then
return "|cff" + LoadStr(Hashtable, GlobalHandle(), StringHash("Chat Color " + I2S(pID))) + name + "|r"
else
return "|cff990000" + name + "|r"
endif
endfunction
function generateNotification takes integer number returns string
local string notification = Chat_AM() + Chat_TimeTag()
if number == 1 then
set notification = notification + " |CFFFF0000INVALID COMMAND|r"
elseif number == 2 then
set notification = notification + " |CFFFF0000MESSAGE OVERSIZED|r"
endif
return notification
endfunction
function sizeCheck takes string message returns boolean
if StringLength(message) > 128 then
return false
endif
return true
endfunction
function sortWindow takes integer HandleID returns integer
local integer current
if LoadInteger(Hashtable, HandleID, StringHash("Total Messages")) >= 10 then
set current = 1
loop
exitwhen current > 9
call SaveStr(Hashtable, HandleID, StringHash("Chat Message " + I2S(current)), LoadStr(Hashtable, HandleID, StringHash("Chat Message " + I2S(current + 1))))
set current = current + 1
endloop
else
call SaveInteger(Hashtable, HandleID, StringHash("Total Messages"), LoadInteger(Hashtable, HandleID, StringHash("Total Messages")) + 1)
endif
return LoadInteger(Hashtable, HandleID, StringHash("Total Messages"))
endfunction
function updateWindow takes nothing returns nothing
local integer current
local integer total
local string message
local string Chat_Text = ""
set total = LoadInteger(Hashtable, GlobalHandle(), StringHash("Total Messages"))
if total > 0 then
set current = 1
loop
exitwhen current > total
set message = LoadStr(Hashtable, GlobalHandle(), StringHash("Chat Message " + I2S(current)))
if Chat_Text == "" then
set Chat_Text = message
else
set Chat_Text = Chat_Text + "\n" + message
endif
set current = current + 1
endloop
endif
call BlzFrameSetText(BlzGetFrameByName("Chat Text", 0), Chat_Text)
endfunction
function generateMessage takes integer pID, string message returns string
return Chat_AM() + Chat_TimeTag() + " " + Chat_User(pID) + ": " + message
endfunction
function MessageEvent takes integer pID, string message returns nothing
local integer current
local integer HandleID = GlobalHandle()
if SubString(message, 0, StringLength(Chat_SM())) != Chat_SM() then
set current = sortWindow(HandleID)
call SaveStr(Hashtable, GlobalHandle(), StringHash("Chat Message " + I2S(current)), message)
else
if GetLocalPlayer() == Player(pID) then
set current = sortWindow(HandleID)
call SaveStr(Hashtable, HandleID, StringHash("Chat Message " + I2S(current)), message)
endif
endif
call updateWindow()
endfunction
function SendUCSChatAll takes integer sender, string message returns nothing
local integer pID = 0
set message = generateMessage(sender, message)
call MessageEvent(pID, message)
endfunction
function SendUCSChatSystem takes integer receiver, string message returns nothing
call MessageEvent(receiver, Chat_SM() + Chat_TimeTag() + " " + message)
endfunction
function print takes string text returns nothing
local integer pID = 0
loop
exitwhen pID > 23
call SendUCSChatSystem(pID, text)
set pID = pID + 1
endloop
endfunction
// Chat Internal End
// Chat External Start
function Chat_Action takes nothing returns nothing
local integer pID = GetPlayerId(GetTriggerPlayer())
local string message = GetEventPlayerChatString()
if SubString(message, 0, 1) == "-" then
// Command
//call CommandEvent(pID, message)
else
// Message
if sizeCheck(message) then
set message = generateMessage(pID, message)
call MessageEvent(pID, message)
else
set message = generateNotification(2)
call MessageEvent(pID, message)
endif
endif
endfunction
// Chat External End
function Chat_Init takes string font returns nothing
local integer pID
local framehandle Chat
local framehandle Chat_Text
local trigger Chat_Trig = CreateTrigger()
set Chat = BlzCreateSimpleFrame("Chat", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0)
call BlzFrameSetAbsPoint(Chat, FRAMEPOINT_TOPLEFT, -0.131, 0.595)
call BlzFrameSetLevel(Chat, 8)
set Chat = null
set Chat_Text = BlzGetFrameByName("Chat Text", 0)
call BlzFrameSetTextAlignment(Chat_Text, TEXT_JUSTIFY_TOP, TEXT_JUSTIFY_LEFT)
call BlzFrameSetFont(Chat_Text, "UI\\Font\\" + font, 0.009, 0)
set Chat_Text = null
call TimerStart(CreateTimer(), 1.00, true, function Update_Game_Time)
set pID = 0
loop
exitwhen pID > 23
call TriggerRegisterPlayerChatEvent(Chat_Trig, Player(pID), "", false)
set pID = pID + 1
endloop
call TriggerAddAction(Chat_Trig, function Chat_Action)
set Chat_Trig = null
endfunction
// Convert Values Start
function String2Key takes string oskey returns oskeytype
if StringCase(oskey, true) == "A" then
return OSKEY_A
elseif StringCase(oskey, true) == "B" then
return OSKEY_B
elseif StringCase(oskey, true) == "C" then
return OSKEY_C
elseif StringCase(oskey, true) == "D" then
return OSKEY_D
elseif StringCase(oskey, true) == "E" then
return OSKEY_E
elseif StringCase(oskey, true) == "F" then
return OSKEY_F
elseif StringCase(oskey, true) == "G" then
return OSKEY_G
elseif StringCase(oskey, true) == "H" then
return OSKEY_H
elseif StringCase(oskey, true) == "I" then
return OSKEY_I
elseif StringCase(oskey, true) == "J" then
return OSKEY_J
elseif StringCase(oskey, true) == "K" then
return OSKEY_K
elseif StringCase(oskey, true) == "L" then
return OSKEY_L
elseif StringCase(oskey, true) == "M" then
return OSKEY_M
elseif StringCase(oskey, true) == "N" then
return OSKEY_N
elseif StringCase(oskey, true) == "O" then
return OSKEY_O
elseif StringCase(oskey, true) == "P" then
return OSKEY_P
elseif StringCase(oskey, true) == "Q" then
return OSKEY_Q
elseif StringCase(oskey, true) == "R" then
return OSKEY_R
elseif StringCase(oskey, true) == "S" then
return OSKEY_S
elseif StringCase(oskey, true) == "T" then
return OSKEY_T
elseif StringCase(oskey, true) == "U" then
return OSKEY_U
elseif StringCase(oskey, true) == "V" then
return OSKEY_V
elseif StringCase(oskey, true) == "W" then
return OSKEY_W
elseif StringCase(oskey, true) == "X" then
return OSKEY_X
elseif StringCase(oskey, true) == "Y" then
return OSKEY_Y
elseif StringCase(oskey, true) == "Z" then
return OSKEY_Z
elseif StringCase(oskey, false) == "0" then
return OSKEY_0
elseif StringCase(oskey, false) == "1" then
return OSKEY_1
elseif StringCase(oskey, false) == "2" then
return OSKEY_2
elseif StringCase(oskey, false) == "3" then
return OSKEY_3
elseif StringCase(oskey, false) == "4" then
return OSKEY_4
elseif StringCase(oskey, false) == "5" then
return OSKEY_5
elseif StringCase(oskey, false) == "6" then
return OSKEY_6
elseif StringCase(oskey, false) == "7" then
return OSKEY_7
elseif StringCase(oskey, false) == "8" then
return OSKEY_8
elseif StringCase(oskey, false) == "9" then
return OSKEY_9
endif
return null
endfunction
// Convert Values End
// Status Checks Start
// It is recommended to do NOT edit SaveDVar and LoadDVar cause these are default variables assigned by the system automatically.
function SaveDVar takes integer pID, string ref, string content returns nothing
call SaveStr(Hashtable, GetHandleId(Player(pID)), StringHash("Default Dialog Variable: " + ref), content)
endfunction
function LoadDVar takes integer pID, string ref returns string
if LoadStr(Hashtable, GetHandleId(Player(pID)), StringHash("Default Dialog Variable: " + ref)) != null then
return LoadStr(Hashtable, GetHandleId(Player(pID)), StringHash("Default Dialog Variable: " + ref))
else
return ""
endif
endfunction
function SetDialog takes integer pID, boolean isDialog returns nothing
call SaveBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Currently Dialog"), isDialog)
endfunction
function IsDialog takes integer pID returns boolean
return LoadBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Currently Dialog"))
endfunction
function Change_Dialog_Box_State takes integer pID returns nothing
local framehandle Dialog_Box
local framehandle Dialog_Main
if IsDialog(pID) then
set Dialog_Box = BlzGetFrameByName("Dialog Box", 0)
set Dialog_Main = BlzGetFrameByName("Dialog Main", 0)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetVisible(Dialog_Box, not BlzFrameIsVisible(Dialog_Box))
call BlzFrameSetVisible(Dialog_Main, not BlzFrameIsVisible(Dialog_Main))
endif
set Dialog_Box = null
set Dialog_Main = null
endif
endfunction
function Right_Click takes nothing returns nothing
local integer pID = GetPlayerId(GetTriggerPlayer())
if BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_RIGHT and LoadBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Right Click UI Hide Allowed")) then
call Change_Dialog_Box_State(pID)
endif
endfunction
function Reset_Idle takes nothing returns nothing
local integer pID = GetPlayerId(GetTriggerPlayer())
local integer HandleID = LoadInteger(Hashtable, GetHandleId(GetTriggerPlayer()), StringHash("Idle Handle"))
call SaveReal(Hashtable, HandleID, StringHash("Idle Time"), 0.)
if Player(pID) == GetLocalPlayer() then
call BlzEnableCursor(true)
endif
endfunction
function Mouse_Idle takes nothing returns nothing
local integer HandleID = GetHandleId(GetExpiredTimer())
local real idle_time = LoadReal(Hashtable, HandleID, StringHash("Idle Time"))
local real set_idle = LoadReal(Hashtable, HandleID, StringHash("Set Idle"))
local integer pID = LoadInteger(Hashtable, HandleID, StringHash("Player"))
if IsDialog(pID) then
if set_idle > 0. then
set idle_time = idle_time + 0.01
call SaveReal(Hashtable, HandleID, StringHash("Idle Time"), idle_time)
if idle_time >= set_idle then
if Player(pID) == GetLocalPlayer() then
call BlzEnableCursor(false)
endif
endif
endif
endif
endfunction
function Set_Last_Choice takes integer pID, string choice returns nothing
call SaveDVar(pID, "choice", choice)
call SaveStr(Hashtable, GetHandleId(Player(pID)), StringHash("Last Selected Option"), choice)
endfunction
function Get_Last_Choice takes integer pID returns string
return LoadStr(Hashtable, GetHandleId(Player(pID)), StringHash("Last Selected Option"))
endfunction
function Set_Choice_Enabled takes integer pID, string id, boolean isEnabled returns nothing
call SaveBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Choice Button isEnabled " + id), isEnabled)
endfunction
function Get_Choice_Content takes string id returns string
return LoadStr(Hashtable, GlobalHandle(), StringHash("Choice Button Content " + id))
endfunction
function Get_Choice_FollowUp takes string id returns string
return LoadStr(Hashtable, GlobalHandle(), StringHash("Choice Button FollowUp " + id))
endfunction
function Is_Choice_Enabled takes integer pID, string id returns boolean
return LoadBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Choice Button isEnabled " + id))
endfunction
function Allow_Right_Click takes integer pID, boolean isAllowed returns boolean
local integer pID2 = pID
if LoadTriggerHandle(Hashtable, GlobalHandle(), StringHash("Right Click Trigger")) == null then
call SaveTriggerHandle(Hashtable, GlobalHandle(), StringHash("Right Click Trigger"), CreateTrigger())
set pID = 0
loop
exitwhen pID > 23
call TriggerRegisterPlayerMouseEventBJ(LoadTriggerHandle(Hashtable, GlobalHandle(), StringHash("Right Click Trigger")), Player(pID), bj_MOUSEEVENTTYPE_DOWN)
set pID = pID + 1
endloop
call TriggerAddAction(LoadTriggerHandle(Hashtable, GlobalHandle(), StringHash("Right Click Trigger")), function Right_Click)
endif
set pID = pID2
if pID >= 0 and pID <= 23 then
call SaveBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Right Click UI Hide Allowed"), isAllowed)
return true
elseif pID == -1 then
set pID = 0
loop
exitwhen pID > 23
call SaveBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Right Click UI Hide Allowed"), isAllowed)
set pID = pID + 1
endloop
return true
endif
return false
endfunction
function Set_Idle_Time takes integer pID, real idletime returns boolean
local integer pID2 = pID
local integer HandleID
if LoadTriggerHandle(Hashtable, GlobalHandle(), StringHash("Idle Reset Trigger")) == null then
call SaveTriggerHandle(Hashtable, GlobalHandle(), StringHash("Idle Reset Trigger"), CreateTrigger())
set pID = 0
loop
exitwhen pID > 23
call TriggerRegisterPlayerMouseEventBJ(LoadTriggerHandle(Hashtable, GlobalHandle(), StringHash("Idle Reset Trigger")), Player(pID), bj_MOUSEEVENTTYPE_MOVE)
set HandleID = NewMUITimer(pID)
call SaveReal(Hashtable, HandleID, StringHash("Set Idle"), 0.)
call SaveReal(Hashtable, HandleID, StringHash("Idle Time"), 0.)
call SaveInteger(Hashtable, HandleID, StringHash("Player"), pID)
call TimerStart(LoadMUITimer(pID), 0.01, true, function Mouse_Idle)
call SaveInteger(Hashtable, GetHandleId(Player(pID)), StringHash("Idle Handle"), HandleID)
set pID = pID + 1
endloop
call TriggerAddAction(LoadTriggerHandle(Hashtable, GlobalHandle(), StringHash("Idle Reset Trigger")), function Reset_Idle)
endif
set pID = pID2
if pID >= 0 and pID <= 23 then
set HandleID = LoadInteger(Hashtable, GetHandleId(Player(pID)), StringHash("Idle Handle"))
call SaveReal(Hashtable, HandleID, StringHash("Set Idle"), idletime)
return true
elseif pID == -1 then
set pID = 0
loop
exitwhen pID > 23
set HandleID = LoadInteger(Hashtable, GetHandleId(Player(pID)), StringHash("Idle Handle"))
call SaveReal(Hashtable, HandleID, StringHash("Set Idle"), idletime)
set pID = pID + 1
endloop
return true
endif
return false
endfunction
function Set_Clock_Visible takes integer pID, boolean state returns boolean
local framehandle Dialog_Clock
if pID >= 0 and pID <= 23 then
call SaveBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Dialog Clock Visible"), state)
if IsDialog(pID) then
set Dialog_Clock = BlzGetFrameByName("Dialog Time", 0)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetVisible(Dialog_Clock, state)
endif
set Dialog_Clock = null
endif
return true
elseif pID == -1 then
set pID = 0
loop
exitwhen pID > 23
call SaveBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Dialog Clock Visible"), state)
if IsDialog(pID) then
set Dialog_Clock = BlzGetFrameByName("Dialog Time", 0)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetVisible(Dialog_Clock, state)
endif
set Dialog_Clock = null
endif
set pID = pID + 1
endloop
return true
endif
return false
endfunction
function Is_Clock_Visible takes integer pID returns boolean
return LoadBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Dialog Clock Visible"))
endfunction
function Set_Input_Key takes integer pID, string key returns boolean
local framehandle Dialog_Input
if String2Key(key) != null then
if pID >= 0 and pID <= 23 then
call SaveDVar(pID, "ikey", StringCase(key, false))
call SaveStr(Hashtable, GetHandleId(Player(pID)), StringHash("Input Key"), StringCase(key, false))
set Dialog_Input = BlzGetFrameByName("Dialog Input 1 Text", 0)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetText(Dialog_Input, StringCase(key, true))
endif
set Dialog_Input = null
return true
elseif pID == -1 then
set pID = 0
loop
exitwhen pID > 23
call SaveDVar(pID, "ikey", StringCase(key, false))
call SaveStr(Hashtable, GetHandleId(Player(pID)), StringHash("Input Key"), StringCase(key, false))
set pID = pID + 1
endloop
set Dialog_Input = BlzGetFrameByName("Dialog Input 1 Text", 0)
call BlzFrameSetText(Dialog_Input, StringCase(key, true))
set Dialog_Input = null
return true
endif
endif
return false
endfunction
function Get_Input_Key takes integer pID returns string
return LoadStr(Hashtable, GetHandleId(Player(pID)), StringHash("Input Key"))
endfunction
function Dialog_Skip_Button takes nothing returns nothing
if BlzGetTriggerPlayerKey() == String2Key(LoadStr(Hashtable, GetHandleId(GetTriggerPlayer()), StringHash("Skip Key"))) then
if BlzGetTriggerPlayerIsKeyDown() then
call SaveBoolean(Hashtable, GetHandleId(GetTriggerPlayer()), StringHash("Do Skip Key"), true)
else
call SaveBoolean(Hashtable, GetHandleId(GetTriggerPlayer()), StringHash("Do Skip Key"), false)
endif
endif
endfunction
function Set_Skip_Key takes integer pID, string key returns boolean
local framehandle Dialog_Input
if String2Key(key) != null then
if pID >= 0 and pID <= 23 then
if LoadStr(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Key")) != StringCase(key, false) then
call SaveDVar(pID, "skey", StringCase(key, false))
call SaveStr(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Key"), StringCase(key, false))
set Dialog_Input = BlzGetFrameByName("Dialog Input 2 Text", 0)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetText(Dialog_Input, StringCase(key, true))
endif
set Dialog_Input = null
if LoadTriggerHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Trigger")) == null then
call SaveTriggerHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Trigger"), CreateTrigger())
call TriggerAddAction(LoadTriggerHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Trigger")), function Dialog_Skip_Button)
endif
if LoadTriggerEventHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Event Down " + StringCase(key, false))) == null then
call SaveTriggerEventHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Event Down " + StringCase(key, false)), BlzTriggerRegisterPlayerKeyEvent(LoadTriggerHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Trigger")), Player(pID), String2Key(key), 0, true))
endif
if LoadTriggerEventHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Event Up " + StringCase(key, false))) == null then
call SaveTriggerEventHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Event Up " + StringCase(key, false)), BlzTriggerRegisterPlayerKeyEvent(LoadTriggerHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Trigger")), Player(pID), String2Key(key), 0, false))
endif
endif
return true
elseif pID == -1 then
set pID = 0
loop
exitwhen pID > 23
if LoadStr(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Key")) != StringCase(key, false) then
call SaveDVar(pID, "skey", StringCase(key, false))
call SaveStr(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Key"), StringCase(key, false))
if LoadTriggerHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Trigger")) == null then
call SaveTriggerHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Trigger"), CreateTrigger())
call TriggerAddAction(LoadTriggerHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Trigger")), function Dialog_Skip_Button)
endif
if LoadTriggerEventHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Event Down " + StringCase(key, false))) == null then
call SaveTriggerEventHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Event Down " + StringCase(key, false)), BlzTriggerRegisterPlayerKeyEvent(LoadTriggerHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Trigger")), Player(pID), String2Key(key), 0, true))
endif
if LoadTriggerEventHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Event Up " + StringCase(key, false))) == null then
call SaveTriggerEventHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Event Up " + StringCase(key, false)), BlzTriggerRegisterPlayerKeyEvent(LoadTriggerHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Trigger")), Player(pID), String2Key(key), 0, false))
endif
endif
set pID = pID + 1
endloop
set Dialog_Input = BlzGetFrameByName("Dialog Input 2 Text", 0)
call BlzFrameSetText(Dialog_Input, StringCase(key, true))
set Dialog_Input = null
return true
endif
endif
return false
endfunction
function Get_Skip_Key takes integer pID returns string
return LoadStr(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Key"))
endfunction
function Set_Skip_Speed takes integer pID, real multiplier returns boolean
if multiplier > 0. then
if pID >= 0 and pID <= 23 then
call SaveDVar(pID, "sspd", R2S(multiplier))
call SaveReal(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Speed Multiplier"), multiplier)
return true
elseif pID == -1 then
set pID = 0
loop
exitwhen pID > 23
call SaveDVar(pID, "sspd", R2S(multiplier))
call SaveReal(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Speed Multiplier"), multiplier)
set pID = pID + 1
endloop
return true
endif
endif
return false
endfunction
function Get_Skip_Speed takes integer pID returns real
return LoadReal(Hashtable, GetHandleId(Player(pID)), StringHash("Skip Speed Multiplier"))
endfunction
function SkipMultiplier takes integer pID returns real
if LoadBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Do Skip Key")) or LoadBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Auto Skip Active")) then
if Get_Skip_Speed(pID) > 0. then
return Get_Skip_Speed(pID)
endif
endif
return 1.
endfunction
function Set_Global_Speed takes integer pID, real multiplier returns boolean
if multiplier > 0. then
if pID >= 0 and pID <= 23 then
call SaveDVar(pID, "gspd", R2S(multiplier))
call SaveReal(Hashtable, GetHandleId(Player(pID)), StringHash("Global Speed Multiplier"), multiplier)
return true
elseif pID == -1 then
set pID = 0
loop
exitwhen pID > 23
call SaveDVar(pID, "gspd", R2S(multiplier))
call SaveReal(Hashtable, GetHandleId(Player(pID)), StringHash("Global Speed Multiplier"), multiplier)
set pID = pID + 1
endloop
return true
endif
endif
return false
endfunction
function Get_Global_Speed takes integer pID returns real
return LoadReal(Hashtable, GetHandleId(Player(pID)), StringHash("Global Speed Multiplier"))
endfunction
function Set_Text_Speed takes integer pID, real multiplier returns boolean
if multiplier > 0. then
if pID >= 0 and pID <= 23 then
call SaveDVar(pID, "tspd", R2S(multiplier))
call SaveReal(Hashtable, GetHandleId(Player(pID)), StringHash("Text Speed Multiplier"), multiplier)
return true
elseif pID == -1 then
set pID = 0
loop
exitwhen pID > 23
call SaveDVar(pID, "tspd", R2S(multiplier))
call SaveReal(Hashtable, GetHandleId(Player(pID)), StringHash("Text Speed Multiplier"), multiplier)
set pID = pID + 1
endloop
return true
endif
endif
return false
endfunction
function Get_Text_Speed takes integer pID returns real
return LoadReal(Hashtable, GetHandleId(Player(pID)), StringHash("Text Speed Multiplier"))
endfunction
function SavePVar takes integer pID, string ref, string content returns boolean
if pID >= 0 and pID <= 23 then
call SaveStr(Hashtable, GetHandleId(Player(pID)), StringHash("Dialog Variable: " + ref), content)
endif
return false
endfunction
function LoadPVar takes integer pID, string ref returns string
if pID >= 0 and pID <= 23 then
if LoadStr(Hashtable, GetHandleId(Player(pID)), StringHash("Dialog Variable: " + ref)) != null then
return LoadStr(Hashtable, GetHandleId(Player(pID)), StringHash("Dialog Variable: " + ref))
else
return ""
endif
endif
return "Invalid Player ID"
endfunction
function SaveGVar takes string ref, string content returns nothing
call SaveStr(Hashtable, GlobalHandle(), StringHash("Dialog Variable: " + ref), content)
endfunction
function LoadGVar takes string ref returns string
if LoadStr(Hashtable, GlobalHandle(), StringHash("Dialog Variable: " + ref)) != null then
return LoadStr(Hashtable, GlobalHandle(), StringHash("Dialog Variable: " + ref))
else
return ""
endif
endfunction
function Set_Auto_Play takes integer pID, boolean isEnabled returns boolean
if pID >= 0 and pID <= 23 then
call SaveBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Auto Play Active"), isEnabled)
endif
return false
endfunction
function Is_Auto_Play takes integer pID returns boolean
return LoadBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Auto Play Active"))
endfunction
function Set_AutoP_Speed takes integer pID, real multiplier returns boolean
if multiplier > 0. then
if pID >= 0 and pID <= 23 then
call SaveDVar(pID, "aspd", R2S(multiplier))
call SaveReal(Hashtable, GetHandleId(Player(pID)), StringHash("Auto Play Speed Multiplier"), multiplier)
return true
elseif pID == -1 then
set pID = 0
loop
exitwhen pID > 23
call SaveDVar(pID, "aspd", R2S(multiplier))
call SaveReal(Hashtable, GetHandleId(Player(pID)), StringHash("Auto Play Speed Multiplier"), multiplier)
set pID = pID + 1
endloop
return true
endif
endif
return false
endfunction
function Get_AutoP_Speed takes integer pID returns real
return LoadReal(Hashtable, GetHandleId(Player(pID)), StringHash("Auto Play Speed Multiplier"))
endfunction
function Set_Auto_Skip takes integer pID, boolean isEnabled returns boolean
if pID >= 0 and pID <= 23 then
call SaveBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Auto Skip Active"), isEnabled)
endif
return false
endfunction
function Is_Auto_Skip takes integer pID returns boolean
return LoadBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Auto Skip Active"))
endfunction
function Set_Repeat_Button takes framehandle frame returns nothing
call SaveFrameHandle(Hashtable, GlobalHandle(), StringHash("Repeat Sound Frame"), frame)
endfunction
function Search_Color takes integer HandleID, string text returns string
local integer current = 2
local integer last = 0
local string converted = text
if HandleID != GlobalHandle() then // Implies that the color shouldn't be applied yet
loop
exitwhen current - 1 > StringLength(converted)
if SubString(converted, current - 2, current) == "<#" then
if SubString(converted, current - 2, current + 1) == "<#>" then
call SaveBoolean(Hashtable, HandleID, StringHash("Stop Color " + I2S(current - 2)), true)
if current - 2 != 0 then
set converted = SubString(converted, 0, current - 2) + SubString(converted, current + 1, StringLength(converted))
else
set converted = SubString(converted, current + 1, StringLength(converted))
endif
set current = 1
elseif SubString(converted, current + 6, current + 7) == ">" then
if IsHex(SubString(converted, current, current + 6)) then
call SaveStr(Hashtable, HandleID, StringHash("Color Code " + I2S(current - 2)), SubString(converted, current, current + 6))
if current - 2 != 0 then
set converted = SubString(converted, 0, current - 2) + SubString(converted, current + 7, StringLength(converted))
else
set converted = SubString(converted, current + 7, StringLength(converted))
endif
set current = 1
endif
endif
endif
set current = current + 1
endloop
return converted
else // Implies that the color should be applied
loop
exitwhen current - 1 > StringLength(converted)
if SubString(converted, current - 2, current) == "<#" then
if SubString(converted, current - 2, current + 1) == "<#>" then
if current - 2 != 0 then
set converted = SubString(converted, 0, current - 2) + "|r" + SubString(converted, current + 1, StringLength(converted))
else
set converted = SubString(converted, current + 1, StringLength(converted))
endif
set current = 1
elseif SubString(converted, current + 6, current + 7) == ">" then
if IsHex(SubString(converted, current, current + 6)) then
if current - 2 != 0 then
set converted = SubString(converted, 0, current - 2) + "|c00" + SubString(converted, current, current + 6) + SubString(converted, current + 7, StringLength(converted))
else
set converted = "|c00" + SubString(converted, current, current + 6) + SubString(converted, current + 7, StringLength(converted))
endif
set current = 1
endif
endif
endif
set current = current + 1
endloop
return converted
endif
endfunction
function Search_Variables takes integer pID, string text returns string
local integer current = 2
local integer current2
local string ref = ""
local integer last = 0
local string converted = text
loop
exitwhen current - 1 > StringLength(converted)
if SubString(converted, current - 2, current) == "<!" then // Player Variables
set current2 = current
set ref = ""
loop
exitwhen current2 > StringLength(converted) or ref != ""
if SubString(converted, current2 - 1, current2) == ">" then
set ref = SubString(converted, current, current2 - 1)
else
set current2 = current2 + 1
endif
endloop
if ref != "" then // check if ref even has content
if current -2 != 0 then
set converted = SubString(converted, 0, current - 2) + LoadPVar(pID, ref) + SubString(converted, current2, StringLength(converted))
else
set converted = LoadPVar(pID, ref) + SubString(converted, current2, StringLength(converted))
endif
endif
set current = 1
elseif SubString(converted, current - 2, current) == "<?" then // Global Variables
set current2 = current
set ref = ""
loop
exitwhen current2 > StringLength(converted) or ref != ""
if SubString(converted, current2 - 1, current2) == ">" then
set ref = SubString(converted, current, current2 - 1)
else
set current2 = current2 + 1
endif
endloop
if ref != "" then // check if ref even has content
if current -2 != 0 then
set converted = SubString(converted, 0, current - 2) + LoadGVar(ref) + SubString(converted, current2, StringLength(converted))
else
set converted = LoadGVar(ref) + SubString(converted, current2, StringLength(converted))
endif
endif
set current = 1
elseif SubString(converted, current - 2, current) == "<." then // Global Variables
set current2 = current
set ref = ""
loop
exitwhen current2 > StringLength(converted) or ref != ""
if SubString(converted, current2 - 1, current2) == ">" then
set ref = SubString(converted, current, current2 - 1)
else
set current2 = current2 + 1
endif
endloop
if ref != "" then // check if ref even has content
if current -2 != 0 then
set converted = SubString(converted, 0, current - 2) + LoadDVar(pID, ref) + SubString(converted, current2, StringLength(converted))
else
set converted = LoadDVar(pID, ref) + SubString(converted, current2, StringLength(converted))
endif
endif
set current = 1
endif
set current = current + 1
endloop
return converted
endfunction
// Status Checks End
// Used to reset focus of frames
function Reset_Focus takes integer pID, framehandle Frame returns nothing
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetEnable(Frame, false)
call BlzFrameSetEnable(Frame, true)
endif
endfunction
function Reset_Focus_2 takes nothing returns nothing
call Reset_Focus(GetPlayerId(GetTriggerPlayer()), BlzGetTriggerFrame())
endfunction
function Set_Repeat_State takes integer pID, string Sound_File returns nothing
local framehandle Repeat_Frame = LoadFrameHandle(Hashtable, GlobalHandle(), StringHash("Repeat Sound Frame"))
call SaveStr(Hashtable, GetHandleId(Player(pID)), StringHash("Current Sound File"), Sound_File)
if Sound_File == "" or Sound_File == null then
if Repeat_Frame != null then
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetEnable(Repeat_Frame, false)
endif
endif
else
if Repeat_Frame != null then
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetEnable(Repeat_Frame, true)
endif
endif
endif
endfunction
function Edit_Button takes framehandle frame, code action, string name returns boolean
local integer current
if frame != null then
if action != null then
if LoadTriggerHandle(Hashtable, GetHandleId(frame), StringHash("Trigger")) == null then
call SaveTriggerHandle(Hashtable, GetHandleId(frame), StringHash("Trigger"), CreateTrigger())
call BlzTriggerRegisterFrameEvent(LoadTriggerHandle(Hashtable, GetHandleId(frame), StringHash("Trigger")), frame, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(LoadTriggerHandle(Hashtable, GetHandleId(frame), StringHash("Trigger")), function Reset_Focus_2)
call BlzFrameSetEnable(frame, true)
set current = 0
loop
exitwhen LoadFrameHandle(Hashtable, GlobalHandle(), StringHash("Custom Created Frame " + I2S(current))) == null
set current = current + 1
endloop
call SaveFrameHandle(Hashtable, GlobalHandle(), StringHash("Custom Created Frame " + I2S(current)), frame)
endif
if LoadTriggerActionHandle(Hashtable, GetHandleId(frame), StringHash("Action")) != null then
call TriggerRemoveAction(LoadTriggerHandle(Hashtable, GetHandleId(frame), StringHash("Trigger")), LoadTriggerActionHandle(Hashtable, GetHandleId(frame), StringHash("Action")))
endif
call SaveTriggerActionHandle(Hashtable, GetHandleId(frame), StringHash("Action"), TriggerAddAction(LoadTriggerHandle(Hashtable, GetHandleId(frame), StringHash("Trigger")), action))
elseif LoadTriggerActionHandle(Hashtable, GetHandleId(frame), StringHash("Action")) == null then
call BlzFrameSetEnable(frame, false)
endif
if BlzFrameGetText(frame) != null then
// Text Button
call BlzFrameSetText(frame, name)
else
// Button
endif
return true
endif
return false
endfunction
// Hides Dialog
function End_Dialog takes integer pID returns nothing
local framehandle Dialog_Speaker = BlzGetFrameByName("Dialog Speaker", 0)
local framehandle Dialog_Text = BlzGetFrameByName("Dialog Text", 0)
local framehandle Dialog_NPC_1 = BlzGetFrameByName("Dialog NPC", 1)
local framehandle Dialog_NPC_2 = BlzGetFrameByName("Dialog NPC", 2)
local framehandle Dialog_Arrow = BlzGetFrameByName("Dialog Arrow", 0)
local framehandle Dialog = BlzGetFrameByName("Dialog", 0)
local framehandle Background = BlzGetFrameByName("Dialog Background", 0)
local framehandle Dialog_Box = BlzGetFrameByName("Dialog Main", 0)
local framehandle Dialog_Clock = BlzGetFrameByName("Dialog Time", 0)
local integer current = 0
local framehandle frame
call SetDialog(pID, false)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetText(Dialog_Speaker, "")
call BlzFrameSetText(Dialog_Text, "")
call BlzFrameSetVisible(Dialog_NPC_1, false)
call BlzFrameSetVisible(Dialog_NPC_2, false)
call BlzFrameSetVisible(Dialog_Arrow, false)
call BlzFrameSetVisible(Dialog, false)
call BlzFrameSetVisible(Background, false)
call BlzFrameSetVisible(Dialog_Box, false)
call BlzFrameSetVisible(Dialog_Clock, false)
endif
loop
exitwhen LoadFrameHandle(Hashtable, GlobalHandle(), StringHash("Custom Created Frame " + I2S(current))) == null
set frame = LoadFrameHandle(Hashtable, GlobalHandle(), StringHash("Custom Created Frame " + I2S(current)))
if LoadTriggerActionHandle(Hashtable, GetHandleId(frame), StringHash("Action")) != null then
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetEnable(frame, true)
endif
endif
set frame = null
set current = current + 1
endloop
call Set_Auto_Play(pID, false)
call Set_Auto_Skip(pID, false)
call Set_Repeat_State(pID, "")
if LoadSoundHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Character Voice")) != null then
call StopSound(LoadSoundHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Character Voice")), true, false)
call RemoveSavedHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Character Voice"))
endif
set Dialog_Speaker = null
set Dialog_Text = null
set Dialog_NPC_1 = null
set Dialog_NPC_2 = null
set Dialog_Arrow = null
set Dialog = null
set Background = null
set Dialog_Box = null
set Dialog_Clock = null
endfunction
function Dialog_Transition takes integer pID returns nothing
local framehandle Dialog_Speaker = BlzGetFrameByName("Dialog Speaker", 0)
local framehandle Dialog_Text = BlzGetFrameByName("Dialog Text", 0)
local framehandle Dialog_Arrow = BlzGetFrameByName("Dialog Arrow", 0)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetText(Dialog_Speaker, "")
call BlzFrameSetText(Dialog_Text, "")
call BlzFrameSetVisible(Dialog_Arrow, false)
endif
set Dialog_Speaker = null
set Dialog_Text = null
set Dialog_Arrow = null
endfunction
function Dialog_Update_Time takes nothing returns nothing
local framehandle Dialog_Clock = BlzGetFrameByName("Dialog Clock Value Text", 0)
local string World_Time = R2S(GetFloatGameState(GAME_STATE_TIME_OF_DAY)) // defaults to 0.000
local string hours = SubString(World_Time, 0, StringLength(World_Time) - 4)
local string minutes = SubString(World_Time, StringLength(World_Time) - 3, StringLength(World_Time) - 1)
local string Time
local integer pID
set minutes = I2S(R2I((S2R(minutes) / 99) * 60))
if S2I(hours) >= 13 then
set hours = I2S(S2I(hours) - 12)
set Time = "PM "
else
set Time = "AM "
endif
if StringLength(hours) < 2 then
set hours = "0" + hours
endif
if StringLength(minutes) < 2 then
set minutes = "0" + minutes
endif
set Time = Time + hours + ":" + minutes
set pID = 0
loop
exitwhen pID > 23
if GetPlayerController(Player(pID)) == MAP_CONTROL_USER then
call SaveDVar(pID, "gtime", Time)
endif
set pID = pID + 1
endloop
call BlzFrameSetText(Dialog_Clock, Time)
set Dialog_Clock = null
endfunction
function Dialog_Button_Press takes nothing returns nothing
local integer HandleID = GetHandleId(GetTriggeringTrigger())
local integer pID = LoadInteger(Hashtable, HandleID, StringHash("Player"))
local integer Current = 1
local integer Option_Selected = 0
local framehandle Choice_Frame
local boolean hasFollow_Up = false
local string DialogID
if Player(pID) == GetTriggerPlayer() then
loop
exitwhen LoadInteger(Hashtable, HandleID, StringHash("Option " + I2S(Current))) == 0
if GetHandleId(BlzGetTriggerFrame()) == LoadInteger(Hashtable, HandleID, StringHash("Option " + I2S(Current))) then
set Option_Selected = Current
endif
set Choice_Frame = BlzGetFrameByName("Dialog Button 3", Current)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetVisible(Choice_Frame, false)
endif
set Choice_Frame = null
set Current = Current + 1
endloop
call Set_Last_Choice(pID, LoadStr(Hashtable, HandleID, StringHash("ID " + I2S(Option_Selected))))
// Reset Hashtable already, but then add follow up if necessary
if LoadStr(Hashtable, HandleID, StringHash("Follow Up " + I2S(Option_Selected))) != "" then
set hasFollow_Up = true
set DialogID = LoadStr(Hashtable, HandleID, StringHash("Follow Up " + I2S(Option_Selected)))
endif
call FlushChildHashtable(Hashtable, HandleID)
if hasFollow_Up then
call Dialog_Transition(pID)
call SaveBoolean(Hashtable, HandleID, StringHash("Dialog Transition"), true)
set Current = 0
loop
exitwhen LoadStr(Hashtable, GlobalHandle(), StringHash("Dialog Action " + I2S(Current) + DialogID)) == null
call SaveStr(Hashtable, HandleID, StringHash("Action " + I2S(Current)), LoadStr(Hashtable, GlobalHandle(), StringHash("Dialog Action " + I2S(Current) + DialogID)))
set Current = Current + 1
endloop
endif
call DestroyTrigger(GetTriggeringTrigger())
endif
endfunction
function Dialog_Multiple_Choice takes integer pID, string Option_1, string Option_2, string Option_3, string Option_4, string Option_5 returns integer
local string array Option
local string array Content
local boolean array isEnabled
local string array Follow_Up
local integer Total = 0
local integer Current = 0
local real Start_Y
local framehandle Choice_Frame
local integer HandleID
local trigger Dialog_Button_Trigger
local string converted
set Option[1] = Search_Variables(pID, Option_1)
set Option[2] = Search_Variables(pID, Option_2)
set Option[3] = Search_Variables(pID, Option_3)
set Option[4] = Search_Variables(pID, Option_4)
set Option[5] = Search_Variables(pID, Option_5)
loop
exitwhen Current > 5 or Option[Current] == ""
set Total = Current
// Check for content
set Content[Current] = Get_Choice_Content(Option[Current])
if Content[Current] != "" then
set Content[Current] = Search_Variables(pID, Content[Current])
endif
// Check if enabled
set isEnabled[Current] = Is_Choice_Enabled(pID, Option[Current])
// Check for follow up
set Follow_Up[Current] = Get_Choice_FollowUp(Option[Current])
if Follow_Up[Current] != "" then
set Follow_Up[Current] = Search_Variables(pID, Follow_Up[Current])
endif
set Current = Current + 1
endloop
if Total != 0 then
set Dialog_Button_Trigger = CreateTrigger()
set HandleID = GetHandleId(Dialog_Button_Trigger)
// go -y a bit more than half of choice button height for each choice
set Current = Total
set Start_Y = 0.4 - 0.025 * (Total - 1)
loop
exitwhen Current < 1
set Choice_Frame = BlzGetFrameByName("Dialog Button 3", Current)
set converted = Search_Color(GlobalHandle(), Content[Current])
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetAbsPoint(Choice_Frame, FRAMEPOINT_BOTTOM, 0.4, Start_Y + 0.05 * (Total - Current - 1))
call BlzFrameSetText(Choice_Frame, converted)
call BlzFrameSetVisible(Choice_Frame, true)
call BlzFrameSetEnable(Choice_Frame, isEnabled[Current])
endif
call SaveInteger(Hashtable, HandleID, StringHash("Option " + I2S(Current)), GetHandleId(Choice_Frame))
call SaveStr(Hashtable, HandleID, StringHash("ID " + I2S(Current)), Option[Current])
call SaveStr(Hashtable, HandleID, StringHash("Content " + I2S(Current)), Content[Current])
call SaveStr(Hashtable, HandleID, StringHash("Follow Up " + I2S(Current)), Follow_Up[Current])
call BlzTriggerRegisterFrameEvent(Dialog_Button_Trigger, Choice_Frame, FRAMEEVENT_CONTROL_CLICK)
set Choice_Frame = null
set Current = Current - 1
endloop
// ...
call TriggerAddAction(Dialog_Button_Trigger, function Dialog_Button_Press)
call SaveInteger(Hashtable, HandleID, StringHash("Player"), pID)
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), true)
set Dialog_Button_Trigger = null
else
// Theres no option...
set HandleID = GetHandleId(Player(pID))
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), false)
endif
return HandleID
endfunction
function Dialog_Choice_State takes integer pID, string id, string isEnabled returns integer
local integer HandleID = GetHandleId(Player(pID))
set id = Search_Variables(pID, id)
set isEnabled = Search_Variables(pID, isEnabled)
if StringCase(isEnabled, false) == "true" then
call Set_Choice_Enabled(pID, id, true)
elseif StringCase(isEnabled, false) == "false" then
call Set_Choice_Enabled(pID, id, false)
endif
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), false)
return HandleID
endfunction
function Dialog_Text_Input_Confirm takes nothing returns nothing
local integer HandleID = GetHandleId(GetTriggeringTrigger())
local integer pID = GetPlayerId(LoadPlayerHandle(Hashtable, HandleID, StringHash("Player")))
local framehandle Text_Input_Frame
if GetTriggerPlayer() == LoadPlayerHandle(Hashtable, HandleID, StringHash("Player")) then
set Text_Input_Frame = BlzGetTriggerFrame()
if LoadBoolean(Hashtable, HandleID, StringHash("Is Global")) then
call SaveGVar(LoadStr(Hashtable, HandleID, StringHash("Variable")), BlzGetTriggerFrameText())
else
call SavePVar(pID, LoadStr(Hashtable, HandleID, StringHash("Variable")), BlzGetTriggerFrameText())
endif
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetText(Text_Input_Frame, "")
call BlzFrameSetVisible(Text_Input_Frame, false)
call BlzFrameSetFocus(Text_Input_Frame, false)
endif
call SaveBoolean(Hashtable, GetHandleId(GetTriggerPlayer()), StringHash("Do Skip Key"), false)
call FlushChildHashtable(Hashtable, HandleID)
call DestroyTrigger(GetTriggeringTrigger())
set Text_Input_Frame = null
endif
endfunction
function Dialog_Text_Input takes integer pID, string var, string global returns integer
local trigger t = CreateTrigger()
local integer HandleID = GetHandleId(t)
local framehandle Text_Input_Frame = BlzGetFrameByName("Dialog Text Input", 0)
set var = Search_Variables(pID, var)
set global = Search_Variables(pID, global)
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), true)
call SavePlayerHandle(Hashtable, HandleID, StringHash("Player"), Player(pID))
call SaveStr(Hashtable, HandleID, StringHash("Variable"), var)
if global == "true" then
call SaveBoolean(Hashtable, HandleID, StringHash("Is Global"), true)
else
call SaveBoolean(Hashtable, HandleID, StringHash("Is Global"), false)
endif
call BlzTriggerRegisterFrameEvent(t, Text_Input_Frame, FRAMEEVENT_EDITBOX_ENTER)
call TriggerAddAction(t, function Dialog_Text_Input_Confirm)
set t = null
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetText(Text_Input_Frame, "")
call BlzFrameSetVisible(Text_Input_Frame, true)
call BlzFrameSetFocus(Text_Input_Frame, true)
endif
set Text_Input_Frame = null
return HandleID
endfunction
function Dialog_Save_Variable takes integer pID, string ref, string content, string global returns integer
local integer HandleID = GetHandleId(Player(pID))
set ref = Search_Variables(pID, ref)
set content = Search_Variables(pID, content)
set global = Search_Variables(pID, global)
if global == "true" then
call SaveGVar(ref, content)
else
call SavePVar(pID, ref, content)
endif
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), false)
return HandleID
endfunction
function Dialog_Set_TextS takes integer pID, string speed returns integer
local integer HandleID = GetHandleId(Player(pID))
set speed = Search_Variables(pID, speed)
call Set_Text_Speed(pID, S2R(speed))
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), false)
return HandleID
endfunction
function Dialog_Change_SkipS takes integer pID, string speed returns integer
local integer HandleID = GetHandleId(Player(pID))
set speed = Search_Variables(pID, speed)
call Set_Skip_Speed(pID, S2R(speed))
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), false)
return HandleID
endfunction
function Dialog_Change_SkipK takes integer pID, string key returns integer
local integer HandleID = GetHandleId(Player(pID))
set key = Search_Variables(pID, key)
call Set_Skip_Key(pID, key)
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), false)
return HandleID
endfunction
function Dialog_Change_InputK takes integer pID, string key returns integer
local integer HandleID = GetHandleId(Player(pID))
set key = Search_Variables(pID, key)
call Set_Input_Key(pID, key)
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), false)
return HandleID
endfunction
function Dialog_Change_Time takes integer pID, string hours, string minutes returns integer
local integer HandleID = GetHandleId(Player(pID))
local real new_time
set hours = Search_Variables(pID, hours)
set minutes = Search_Variables(pID, minutes)
set new_time = S2R(hours) + (((S2R(minutes) / 60) * 99) / 100)
call SetFloatGameState(GAME_STATE_TIME_OF_DAY, new_time)
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), false)
return HandleID
endfunction
// Simply waits a specific time
function Dialog_Time_Wait_End takes nothing returns nothing
local integer HandleID = GetHandleId(GetExpiredTimer())
local integer pID = LoadInteger(Hashtable, HandleID, StringHash("Player"))
call SaveReal(Hashtable, HandleID, StringHash("Wait Duration"), LoadReal(Hashtable, HandleID, StringHash("Wait Duration")) - (0.01 * Get_Global_Speed(pID) * SkipMultiplier(pID)))
if LoadReal(Hashtable, HandleID, StringHash("Wait Duration")) <= 0. then
call TimerPause(GetExpiredTimer())
endif
endfunction
function Dialog_Time_Wait takes integer pID, string seconds returns integer
local integer HandleID = NewMUITimer(pID)
set seconds = Search_Variables(pID, seconds)
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), true)
call SaveReal(Hashtable, HandleID, StringHash("Wait Duration"), S2R(seconds))
call SaveInteger(Hashtable, HandleID, StringHash("Player"), pID)
call TimerStart(LoadMUITimer(pID), 0.01, true, function Dialog_Time_Wait_End)
return HandleID
endfunction
// Animates the arrow at bottom right of dialog text (signals dialog waiting for input)
function Animate_Jumping_Arrow takes nothing returns nothing
local integer HandleID = GetHandleId(GetExpiredTimer())
local framehandle Arrow = BlzGetFrameByName("Dialog Arrow", 0)
local integer pID = LoadInteger(Hashtable, HandleID, StringHash("Player"))
local real Current = LoadReal(Hashtable, HandleID, StringHash("Current")) + LoadReal(Hashtable, HandleID, StringHash("Speed"))
local real Speed = LoadReal(Hashtable, HandleID, StringHash("Speed"))
local framehandle Dialog_Box = BlzGetFrameByName("Dialog Box", 0)
if LoadBoolean(Hashtable, LoadInteger(Hashtable, HandleID, StringHash("True Handle")), StringHash("Action in Progress")) then
call BlzFrameSetPoint(Arrow, FRAMEPOINT_BOTTOMRIGHT, Dialog_Box, FRAMEPOINT_BOTTOMRIGHT, -0.04, 0.016 + 0.0003 * Current)
if Current > 30 or Current < 0 then
call SaveReal(Hashtable, HandleID, StringHash("Speed"), Speed * -1)
else
call SaveReal(Hashtable, HandleID, StringHash("Current"), Current)
endif
else
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetVisible(Arrow, false)
endif
call TimerPause(GetExpiredTimer())
endif
set Arrow = null
set Dialog_Box = null
endfunction
function Dialog_Input_Action takes nothing returns nothing
local integer HandleID = GetHandleId(GetTriggeringTrigger())
if BlzGetTriggerPlayerMouseButton() != MOUSE_BUTTON_TYPE_RIGHT and BlzGetTriggerPlayerMouseButton() != MOUSE_BUTTON_TYPE_MIDDLE then
call FlushChildHashtable(Hashtable, HandleID)
call DestroyTrigger(GetTriggeringTrigger())
endif
endfunction
// Simply waits a specific time
function Dialog_AutoP_Wait_End takes nothing returns nothing
local integer HandleID = GetHandleId(GetExpiredTimer())
local integer pID = LoadInteger(Hashtable, HandleID, StringHash("Player"))
if not LoadBoolean(Hashtable, GetHandleId(LoadTriggerHandle(Hashtable, HandleID, StringHash("True Trigger"))), StringHash("Action in Progress")) then
call TimerPause(GetExpiredTimer())
elseif Is_Auto_Play(pID) then
if LoadReal(Hashtable, GetHandleId(Player(pID)), StringHash("Auto Play Wait Duration")) > 0. then
call SaveReal(Hashtable, HandleID, StringHash("Wait Duration"), LoadReal(Hashtable, HandleID, StringHash("Wait Duration")) - 0.01)
if LoadReal(Hashtable, HandleID, StringHash("Wait Duration")) <= 0. then
call FlushChildHashtable(Hashtable, GetHandleId(LoadTriggerHandle(Hashtable, HandleID, StringHash("True Trigger"))))
call DestroyTrigger(LoadTriggerHandle(Hashtable, HandleID, StringHash("True Trigger")))
call TimerPause(GetExpiredTimer())
endif
endif
elseif Is_Auto_Skip(pID) then
call FlushChildHashtable(Hashtable, GetHandleId(LoadTriggerHandle(Hashtable, HandleID, StringHash("True Trigger"))))
call DestroyTrigger(LoadTriggerHandle(Hashtable, HandleID, StringHash("True Trigger")))
call TimerPause(GetExpiredTimer())
endif
endfunction
function Dialog_Input_Wait takes integer pID, string LeftMouseAllowed returns integer
local trigger t = CreateTrigger()
local integer HandleID = GetHandleId(t)
local integer HandleID2
local framehandle Arrow = BlzGetFrameByName("Dialog Arrow", 0)
local string Button = Get_Input_Key(pID)
local string skipButton = Get_Skip_Key(pID)
local real seconds
set LeftMouseAllowed = Search_Variables(pID, LeftMouseAllowed)
if not LoadBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Do Skip Key")) and not LoadBoolean(Hashtable, GetHandleId(Player(pID)), StringHash("Auto Skip Active")) then
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), true)
call BlzTriggerRegisterPlayerKeyEvent(t, Player(pID), String2Key(Button), 0, true)
call BlzTriggerRegisterPlayerKeyEvent(t, Player(pID), String2Key(skipButton), 0, true)
if StringCase(LeftMouseAllowed, false) == "true" then
call TriggerRegisterPlayerMouseEventBJ(t, Player(pID), bj_MOUSEEVENTTYPE_DOWN)
endif
call TriggerAddAction(t, function Dialog_Input_Action)
set HandleID2 = NewMUITimer(pID)
set seconds = (1 + LoadReal(Hashtable, GetHandleId(Player(pID)), StringHash("Auto Play Wait Duration"))) * (1 / Get_AutoP_Speed(pID))
call SaveReal(Hashtable, HandleID2, StringHash("Wait Duration"), seconds)
call SaveTriggerHandle(Hashtable, HandleID2, StringHash("True Trigger"), t)
call SaveInteger(Hashtable, HandleID2, StringHash("Player"), pID)
call TimerStart(LoadMUITimer(pID), 0.01, true, function Dialog_AutoP_Wait_End)
set t = null
set HandleID2 = NewMUITimer(pID)
call SaveInteger(Hashtable, HandleID2, StringHash("True Handle"), HandleID)
call SaveInteger(Hashtable, HandleID2, StringHash("Player"), pID)
call SaveReal(Hashtable, HandleID2, StringHash("Current"), 0)
call SaveReal(Hashtable, HandleID2, StringHash("Speed"), 1.)
call TimerStart(LoadMUITimer(pID), 0.01, true, function Animate_Jumping_Arrow)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetVisible(Arrow, true)
endif
else
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), false)
endif
set Arrow = null
return HandleID
endfunction
// Each 10 Count equal 1 Letter ; Count increases by Speed each 0.01 seconds ; Timer Pauses if text is complete
function Update_Dialog_Text takes nothing returns nothing
local integer HandleID = GetHandleId(GetExpiredTimer())
local framehandle Dialog_Text = BlzGetFrameByName("Dialog Text", 0)
local integer pID = LoadInteger(Hashtable, HandleID, StringHash("Player"))
local real Current = LoadReal(Hashtable, HandleID, StringHash("Dialog Count")) + (Get_Text_Speed(pID) * Get_Global_Speed(pID) * SkipMultiplier(pID))
local string Dialog_Text_Value = LoadStr(Hashtable, HandleID, StringHash("Dialog Text"))
local string Displayed_Text = LoadStr(Hashtable, HandleID, StringHash("Displayed Text"))
local integer Displayed_Actual = LoadInteger(Hashtable, HandleID, StringHash("Displayed Actual"))
call SaveReal(Hashtable, HandleID, StringHash("Dialog Count"), Current)
if Current >= StringLength(Dialog_Text_Value) * 10 then
loop
exitwhen Displayed_Actual == StringLength(Dialog_Text_Value)
if LoadStr(Hashtable, HandleID, StringHash("Color Code " + I2S(Displayed_Actual))) != null then
set Displayed_Text = Displayed_Text + "|c00" + LoadStr(Hashtable, HandleID, StringHash("Color Code " + I2S(Displayed_Actual))) + SubString(Dialog_Text_Value, Displayed_Actual, Displayed_Actual + 1)
elseif LoadBoolean(Hashtable, HandleID, StringHash("Stop Color " + I2S(Displayed_Actual))) then
set Displayed_Text = Displayed_Text + "|r" + SubString(Dialog_Text_Value, Displayed_Actual, Displayed_Actual + 1)
else
set Displayed_Text = Displayed_Text + SubString(Dialog_Text_Value, Displayed_Actual, Displayed_Actual + 1)
endif
set Displayed_Actual = Displayed_Actual + 1
endloop
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetText(Dialog_Text, Displayed_Text)
endif
call SaveStr(Hashtable, HandleID, StringHash("Displayed Text"), Displayed_Text)
call SaveInteger(Hashtable, HandleID, StringHash("Displayed Actual"), Displayed_Actual)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetText(Dialog_Text, Displayed_Text)
endif
call SaveReal(Hashtable, GetHandleId(Player(pID)), StringHash("Auto Play Wait Duration"), StringLength(Dialog_Text_Value) * 0.03)
call TimerPause(GetExpiredTimer())
elseif Current / 10 > Displayed_Actual then
loop
exitwhen Displayed_Actual == R2I(Current / 10)
if LoadStr(Hashtable, HandleID, StringHash("Color Code " + I2S(Displayed_Actual))) != null then
set Displayed_Text = Displayed_Text + "|c00" + LoadStr(Hashtable, HandleID, StringHash("Color Code " + I2S(Displayed_Actual))) + SubString(Dialog_Text_Value, Displayed_Actual, Displayed_Actual + 1)
elseif LoadBoolean(Hashtable, HandleID, StringHash("Stop Color " + I2S(Displayed_Actual))) then
set Displayed_Text = Displayed_Text + "|r" + SubString(Dialog_Text_Value, Displayed_Actual, Displayed_Actual + 1)
else
set Displayed_Text = Displayed_Text + SubString(Dialog_Text_Value, Displayed_Actual, Displayed_Actual + 1)
endif
set Displayed_Actual = Displayed_Actual + 1
endloop
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetText(Dialog_Text, Displayed_Text)
endif
call SaveStr(Hashtable, HandleID, StringHash("Displayed Text"), Displayed_Text)
call SaveInteger(Hashtable, HandleID, StringHash("Displayed Actual"), Displayed_Actual)
endif
set Dialog_Text = null
endfunction
function Character_Voice takes integer pID, string Sound_File returns nothing
local sound Sound
if LoadSoundHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Character Voice")) != null then
call StopSound(LoadSoundHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Character Voice")), true, false)
call RemoveSavedHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Character Voice"))
endif
set Sound = CreateSound("UI\\Dialog\\Sounds\\" + Sound_File + ".mp3", false, false, false, 12700, 12700, "")
call SaveSoundHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Character Voice"), Sound)
if GetLocalPlayer() == Player(pID) then
call StartSound(Sound)
endif
set Sound = null
endfunction
function Repeat_Current takes integer pID returns nothing
local string Sound_File = LoadStr(Hashtable, GetHandleId(Player(pID)), StringHash("Current Sound File"))
local sound Sound
if Sound_File != null and Sound_File != "" then
call Character_Voice(pID, Sound_File)
endif
endfunction
// Returns the handle id in that all informations are stored
function Dialog_Text_Change takes integer pID, string Text, string Sound returns integer
local integer HandleID = NewMUITimer(pID)
local framehandle Dialog_Box
local framehandle Dialog_Main
set Dialog_Box = BlzGetFrameByName("Dialog Box", 0)
set Dialog_Main = BlzGetFrameByName("Dialog Main", 0)
if not BlzFrameIsVisible(Dialog_Box) then
call BlzFrameSetVisible(Dialog_Box, true)
call BlzFrameSetVisible(Dialog_Main, true)
endif
set Dialog_Box = null
set Dialog_Main = null
if Sound != "" then
call Search_Variables(pID, Sound)
call Set_Repeat_State(pID, Sound)
call Character_Voice(pID, Sound)
endif
call SaveReal(Hashtable, HandleID, StringHash("Dialog Count"), 0.)
set Text = Search_Variables(pID, Text)
call SaveStr(Hashtable, HandleID, StringHash("Dialog Text"), Search_Color(HandleID, Text))
call SaveStr(Hashtable, HandleID, StringHash("Displayed Text"), "")
call SaveInteger(Hashtable, HandleID, StringHash("Player"), pID)
call TimerStart(LoadMUITimer(pID), 0.01, true, function Update_Dialog_Text)
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), true)
return HandleID
endfunction
// Instant function, nothing else necessary
function Dialog_Speaker_Change takes integer pID, string NPC returns integer
local framehandle Dialog_Speaker = BlzGetFrameByName("Dialog Speaker", 0)
local integer HandleID = GetHandleId(Player(pID))
set NPC = Search_Variables(pID, NPC)
set NPC = Search_Color(GlobalHandle(), NPC)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetText(Dialog_Speaker, NPC)
endif
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), false)
set Dialog_Speaker = null
return HandleID
endfunction
// Moves Dialog NPC Sprite
function Update_Dialog_NPC takes nothing returns nothing
local integer HandleID = GetHandleId(GetExpiredTimer())
local integer Side = LoadInteger(Hashtable, HandleID, StringHash("Dialog Side"))
local framehandle Dialog_NPC = BlzGetFrameByName("Dialog NPC", Side)
local integer pID = LoadInteger(Hashtable, HandleID, StringHash("Player"))
local real Current = LoadReal(Hashtable, HandleID, StringHash("Dialog Count")) + (LoadReal(Hashtable, HandleID, StringHash("Dialog Speed")) * Get_Global_Speed(pID) * SkipMultiplier(pID))
local real Position
call SaveReal(Hashtable, HandleID, StringHash("Dialog Count"), Current)
if Side == 1 then // left -> right (+)
if LoadStr(Hashtable, HandleID, StringHash("Direction")) == "Enter" then
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetAbsPoint(Dialog_NPC, FRAMEPOINT_BOTTOMRIGHT, -0.13333 + Current * 0.0025, 0.)
endif
else
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetAbsPoint(Dialog_NPC, FRAMEPOINT_BOTTOMRIGHT, 0.24166 - Current * 0.0025, 0.)
endif
endif
else // right -> left (-)
if LoadStr(Hashtable, HandleID, StringHash("Direction")) == "Enter" then
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetAbsPoint(Dialog_NPC, FRAMEPOINT_BOTTOMLEFT, 0.93333 - Current * 0.0025, 0.)
endif
else
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetAbsPoint(Dialog_NPC, FRAMEPOINT_BOTTOMLEFT, 0.55833 + Current * 0.0025, 0.)
endif
endif
endif
if Current >= 150 then
if LoadStr(Hashtable, HandleID, StringHash("Direction")) == "Leave" then
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetVisible(Dialog_NPC, false)
endif
endif
call TimerPause(GetExpiredTimer())
endif
set Dialog_NPC = null
endfunction
// Changes NPC Instantly
function NPC_Dialog_Instant takes integer pID, string NPC, string Side returns integer
local framehandle NPC_Texture
local integer HandleID = GetHandleId(Player(pID))
set NPC = Search_Variables(pID, NPC)
set Side = Search_Variables(pID, Side)
if Side == "Left" then
set NPC_Texture = BlzGetFrameByName("Dialog NPC Texture", 1)
elseif Side == "Right" then
set NPC_Texture = BlzGetFrameByName("Dialog NPC Texture", 2)
endif
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetTexture(NPC_Texture, "UI\\Dialog\\NPCs\\" + NPC + ".blp", 0, true)
endif
set NPC_Texture = null
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), false)
return HandleID
endfunction
// Returns the time required for the NPC to leave screen
function NPC_Dialog_Leave takes integer pID, string NPC, string Speed, string Side returns integer
local framehandle NPC_Frame
local framepointtype Frame_Side
local real End_X
local integer Side_Value
local integer HandleID = NewMUITimer(pID)
set NPC = Search_Variables(pID, NPC)
set Speed = Search_Variables(pID, Speed)
set Side = Search_Variables(pID, Side)
if Side == "Left" then
set NPC_Frame = BlzGetFrameByName("Dialog NPC", 1)
set Frame_Side = FRAMEPOINT_BOTTOMRIGHT
set End_X = -0.13333 // far left
set Side_Value = 1
elseif Side == "Right" then
set NPC_Frame = BlzGetFrameByName("Dialog NPC", 2)
set Frame_Side = FRAMEPOINT_BOTTOMLEFT
set End_X = 0.93333 // far right
set Side_Value = 2
endif
if NPC_Frame != null then
if GetLocalPlayer() == Player(pID) then
call BlzFrameClearAllPoints(NPC_Frame)
call BlzFrameSetAbsPoint(NPC_Frame, Frame_Side, End_X, 0.)
call BlzFrameSetVisible(NPC_Frame, true)
endif
call SaveReal(Hashtable, HandleID, StringHash("Dialog Count"), 0.)
call SaveInteger(Hashtable, HandleID, StringHash("Dialog Side"), Side_Value)
call SaveStr(Hashtable, HandleID, StringHash("Direction"), "Leave")
call SaveReal(Hashtable, HandleID, StringHash("Dialog Speed"), S2R(Speed))
call SaveInteger(Hashtable, HandleID, StringHash("Player"), pID)
call SaveReal(Hashtable, HandleID, StringHash("Dialog Position"), End_X)
call TimerStart(LoadMUITimer(pID), 0.01, true, function Update_Dialog_NPC)
endif
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), true)
set NPC_Frame = null
return HandleID
endfunction
// Returns the handle id in that all informations are stored
function NPC_Dialog_Entrance takes integer pID, string NPC, string Speed, string Side returns integer
local framehandle NPC_Frame
local framehandle NPC_Texture
local framepointtype Frame_Side
local real Start_X
local integer Side_Value
local integer HandleID = NewMUITimer(pID)
set NPC = Search_Variables(pID, NPC)
set Speed = Search_Variables(pID, Speed)
set Side = Search_Variables(pID, Side)
if Side == "Left" then
set NPC_Frame = BlzGetFrameByName("Dialog NPC", 1)
set NPC_Texture = BlzGetFrameByName("Dialog NPC Texture", 1)
set Frame_Side = FRAMEPOINT_BOTTOMRIGHT
set Start_X = -0.13333 // far left
set Side_Value = 1
elseif Side == "Right" then
set NPC_Frame = BlzGetFrameByName("Dialog NPC", 2)
set NPC_Texture = BlzGetFrameByName("Dialog NPC Texture", 2)
set Frame_Side = FRAMEPOINT_BOTTOMLEFT
set Start_X = 0.93333 // far right
set Side_Value = 2
endif
if NPC_Frame != null then
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetTexture(NPC_Texture, "UI\\Dialog\\NPCs\\" + NPC + ".blp", 0, true)
call BlzFrameClearAllPoints(NPC_Frame)
call BlzFrameSetAbsPoint(NPC_Frame, Frame_Side, Start_X, 0.)
call BlzFrameSetVisible(NPC_Frame, true)
endif
call SaveReal(Hashtable, HandleID, StringHash("Dialog Count"), 0.)
call SaveInteger(Hashtable, HandleID, StringHash("Dialog Side"), Side_Value)
call SaveStr(Hashtable, HandleID, StringHash("Direction"), "Enter")
call SaveReal(Hashtable, HandleID, StringHash("Dialog Speed"), S2R(Speed))
call SaveInteger(Hashtable, HandleID, StringHash("Player"), pID)
call SaveReal(Hashtable, HandleID, StringHash("Dialog Position"), Start_X)
call TimerStart(LoadMUITimer(pID), 0.01, true, function Update_Dialog_NPC)
endif
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), true)
set NPC_Frame = null
return HandleID
endfunction
function Dialog_Stop_BGM takes integer pID returns integer
local integer HandleID = GetHandleId(Player(pID))
if GetLocalPlayer() == Player(pID) then
call StopMusic(false)
endif
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), false)
return HandleID
endfunction
function Dialog_Change_BGM takes integer pID, string Music, string milliseconds returns integer
local integer HandleID = GetHandleId(Player(pID))
local integer millisecondsConv
set Music = Search_Variables(pID, Music)
call SaveDVar(pID, "music", Music)
set milliseconds = Search_Variables(pID, milliseconds)
set millisecondsConv = S2I(milliseconds)
if GetLocalPlayer() == Player(pID) then
call PlayMusic("UI\\Dialog\\Music\\" + Music + ".mp3")
call SetMusicPlayPosition(millisecondsConv)
endif
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), false)
return HandleID
endfunction
function Dialog_Change_Background takes integer pID, string Background returns integer
local integer HandleID = GetHandleId(Player(pID))
local framehandle Background_Frame = BlzGetFrameByName("Dialog Background", 0)
local framehandle Background_Texture = BlzGetFrameByName("Dialog Background Texture", 0)
set Background = Search_Variables(pID, Background)
call SaveDVar(pID, "background", Background)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetTexture(Background_Texture, "UI\\Dialog\\Backgrounds\\" + Background + ".blp", 0, true)
call BlzFrameSetVisible(Background_Frame, true)
endif
call SaveBoolean(Hashtable, HandleID, StringHash("Action In Progress"), false)
return HandleID
endfunction
function Dialog_API takes string Action returns boolean
if Action == "Change Background" or Action == "Change BGM" or Action == "Stop BGM" or Action == "Add NPC" or Action == "Remove NPC" or Action == "Change NPC Instant" or Action == "Change Speaker" or Action == "Change Text" or Action == "Input Wait" or Action == "Time Wait" or Action == "Multiple Choice" or Action == "Change Time" or Action == "Change InputK" or Action == "Change SkipK" or Action == "Change SkipS" or Action == "Set TextS" or Action == "Save Variable" or Action == "Choice State" or Action == "Text Input" then
return true
endif
return false
endfunction
// Handles Dialog
function Dialog_System takes nothing returns nothing
local integer HandleID = GetHandleId(GetExpiredTimer())
local integer Action_Handle = LoadInteger(Hashtable, HandleID, StringHash("Action Handle"))
local integer Current = LoadInteger(Hashtable, HandleID, StringHash("Current"))
local integer pID = LoadInteger(Hashtable, HandleID, StringHash("Player"))
local string def
local string Action = ""
local integer Last = 0
local integer Letter_Count = 1
local integer String_Count = 0
local string array Action_Info
local integer Fill_Count = 0
local framehandle Dialog_Clock = BlzGetFrameByName("Dialog Time", 0)
if LoadBoolean(Hashtable, Action_Handle, StringHash("Dialog Transition")) then
call FlushChildHashtable(Hashtable, HandleID)
call SaveBoolean(Hashtable, GetHandleId(GetExpiredTimer()), StringHash("TimerStarted"), true)
call SaveInteger(Hashtable, HandleID, StringHash("Player"), pID)
set Current = 0
loop
exitwhen LoadStr(Hashtable, Action_Handle, StringHash("Action " + I2S(Current))) == null
call SaveStr(Hashtable, HandleID, StringHash("Action " + I2S(Current)), LoadStr(Hashtable, Action_Handle, StringHash("Action " + I2S(Current))))
set Current = Current + 1
endloop
set Current = 0
call FlushChildHashtable(Hashtable, Action_Handle)
endif
if Dialog_Clock != null then
call Dialog_Update_Time()
endif
set Dialog_Clock = null
if not LoadBoolean(Hashtable, Action_Handle, StringHash("Action In Progress")) then
call SaveInteger(Hashtable, HandleID, StringHash("Current"), Current + 1)
if LoadStr(Hashtable, HandleID, StringHash("Action " + I2S(Current))) != null then
set def = LoadStr(Hashtable, HandleID, StringHash("Action " + I2S(Current)))
loop
exitwhen Letter_Count > StringLength(def)
if Dialog_API(SubString(def, Last, Letter_Count)) and Action == "" then
set Action = SubString(def, Last, Letter_Count)
set Letter_Count = Letter_Count + 1 // skip spacebar
set Last = Letter_Count
elseif Action != "" and SubString(def, Letter_Count - 1, Letter_Count) == "|" then
set Action_Info[String_Count] = SubString(def, Last, Letter_Count - 1)
set Last = Letter_Count
set String_Count = String_Count + 1
elseif Letter_Count == StringLength(def) then
set Action_Info[String_Count] = SubString(def, Last, Letter_Count)
endif
set Letter_Count = Letter_Count + 1
endloop
if Action == "Change Background" then
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Change_Background(pID, Action_Info[0]))
elseif Action == "Change BGM" then
if Action_Info[1] == null then
set Action_Info[1] = ""
endif
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Change_BGM(pID, Action_Info[0], Action_Info[1]))
elseif Action == "Stop BGM" then
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Stop_BGM(pID))
elseif Action == "Add NPC" then
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), NPC_Dialog_Entrance(pID, Action_Info[0], Action_Info[1], Action_Info[2]))
elseif Action == "Remove NPC" then
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), NPC_Dialog_Leave(pID, Action_Info[0], Action_Info[1], Action_Info[2]))
elseif Action == "Change NPC Instant" then
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), NPC_Dialog_Instant(pID, Action_Info[0], Action_Info[1]))
elseif Action == "Change Speaker" then
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Speaker_Change(pID, Action_Info[0]))
elseif Action == "Change Text" then
if Action_Info[1] == null then
set Action_Info[1] = ""
endif
call Set_Repeat_State(pID, "")
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Text_Change(pID, Action_Info[0], Action_Info[1]))
elseif Action == "Input Wait" then
if StringCase(Action_Info[0], false) != "true" then
set Action_Info[0] = "false"
endif
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Input_Wait(pID, Action_Info[0]))
elseif Action == "Time Wait" then
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Time_Wait(pID, Action_Info[0]))
elseif Action == "Multiple Choice" then
loop
exitwhen Fill_Count > 4
if Action_Info[Fill_Count] == null then
set Action_Info[Fill_Count] = ""
endif
set Fill_Count = Fill_Count + 1
endloop
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Multiple_Choice(pID, Action_Info[0], Action_Info[1], Action_Info[2], Action_Info[3], Action_Info[4]))
elseif Action == "Change Time" then
if Action_Info[1] == null or Action_Info[1] == "" then
set Action_Info[1] = "0"
endif
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Change_Time(pID, Action_Info[0], Action_Info[1]))
elseif Action == "Change InputK" then
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Change_InputK(pID, Action_Info[0]))
elseif Action == "Change SkipK" then
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Change_SkipK(pID, Action_Info[0]))
elseif Action == "Change SkipS" then
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Change_SkipS(pID, Action_Info[0]))
elseif Action == "Set TextS" then
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Set_TextS(pID, Action_Info[0]))
elseif Action == "Save Variable" then
if StringCase(Action_Info[2], false) != "true" then
set Action_Info[2] = "false"
endif
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Save_Variable(pID, Action_Info[0], Action_Info[1], Action_Info[2]))
elseif Action == "Choice State" then
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Choice_State(pID, Action_Info[0], Action_Info[1]))
elseif Action == "Text Input" then
call SaveInteger(Hashtable, HandleID, StringHash("Action Handle"), Dialog_Text_Input(pID, Action_Info[0], Action_Info[1]))
endif
else
call RemoveSavedHandle(Hashtable, GetHandleId(Player(pID)), StringHash("Current Sound File"))
call End_Dialog(pID)
call TimerPause(GetExpiredTimer())
endif
endif
endfunction
// Applies Dialog Setup ; Reads Dialog based on DialogID, to prevent bugs due to changes of dialog during Dialog ; returns True/False based on if dialog was initiated successfully
function Initiate_Dialog takes integer pID, string DialogID returns boolean
local framehandle Dialog = BlzGetFrameByName("Dialog", 0)
local framehandle Dialog_Box = BlzGetFrameByName("Dialog Main", 0)
local framehandle Dialog_Clock = BlzGetFrameByName("Dialog Time", 0)
local integer Current = 0
local integer HandleID
if LoadStr(Hashtable, GlobalHandle(), StringHash("Dialog Action " + I2S(Current) + DialogID)) != null and not IsDialog(pID) then
set HandleID = NewMUITimer(pID)
call SetDialog(pID, true)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetVisible(Dialog, true)
call BlzFrameSetVisible(Dialog_Box, true)
if Is_Clock_Visible(pID) then
call BlzFrameSetVisible(Dialog_Clock, true)
endif
endif
call SaveInteger(Hashtable, HandleID, StringHash("Player"), pID)
loop
exitwhen LoadStr(Hashtable, GlobalHandle(), StringHash("Dialog Action " + I2S(Current) + DialogID)) == null
call SaveStr(Hashtable, HandleID, StringHash("Action " + I2S(Current)), LoadStr(Hashtable, GlobalHandle(), StringHash("Dialog Action " + I2S(Current) + DialogID)))
set Current = Current + 1
endloop
call Set_Repeat_State(pID, "")
call TimerStart(LoadMUITimer(pID), 0.01, true, function Dialog_System)
set Dialog = null
set Dialog_Box = null
set Dialog_Clock = null
return true
else
set Dialog = null
set Dialog_Box = null
set Dialog_Clock = null
return false
endif
endfunction
function Choice_Add takes string id, string content, boolean isEnabled, string FollowUp returns boolean
local integer pID
call SaveStr(Hashtable, GlobalHandle(), StringHash("Choice Button Content " + id), content)
call SaveStr(Hashtable, GlobalHandle(), StringHash("Choice Button FollowUp " + id), FollowUp)
set pID = 0
loop
exitwhen pID > 23
if GetPlayerController(Player(pID)) == MAP_CONTROL_USER then
call Set_Choice_Enabled(pID, id, isEnabled)
endif
set pID = pID + 1
endloop
return true
endfunction
// Returns Action Slot
function Dialog_Add takes string DialogID, string Action returns integer
local integer Current = 0
loop
exitwhen LoadStr(Hashtable, GlobalHandle(), StringHash("Dialog Action " + I2S(Current) + DialogID)) == null
set Current = Current + 1
endloop
call SaveStr(Hashtable, GlobalHandle(), StringHash("Dialog Action " + I2S(Current) + DialogID), Action)
return Current
endfunction
// Removes Dialog Action based on Slot ; Do note that all slots after will go down by one due to that
function Dialog_Remove takes string DialogID, integer Slot returns nothing
local integer Current = Slot
call RemoveSavedString(Hashtable, GlobalHandle(), StringHash("Dialog Action " + I2S(Current) + DialogID))
set Current = Current + 1
loop
exitwhen LoadStr(Hashtable, GlobalHandle(), StringHash("Dialog Action " + I2S(Current) + DialogID)) == null
call SaveStr(Hashtable, GlobalHandle(), StringHash("Dialog Action " + I2S(Current - 1) + DialogID), LoadStr(Hashtable, GlobalHandle(), StringHash("Dialog Action " + I2S(Current) + DialogID)))
call RemoveSavedString(Hashtable, GlobalHandle(), StringHash("Dialog Action " + I2S(Current) + DialogID))
set Current = Current + 1
endloop
endfunction
function Generate_Dialog_Frames takes nothing returns nothing
local framehandle Dialog_Background
local framehandle Dialog_Box
local framehandle Dialog_Clock
local framehandle Dialog
local framehandle Dialog_Arrow
local framehandle Dialog_Choice
local framehandle Dialog_NPC
local framehandle Chat
local framehandle Chat_Text
local trigger Chat_Trig = CreateTrigger()
local integer Current
local trigger t
local framehandle Dialog_Menu_Button
local framehandle Dialog_Input
local framehandle Dialog_Editbox
local integer pID
local string Input_Key
// Generate the frame that shows the background image
set Dialog_Background = BlzCreateSimpleFrame("Dialog Background", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0)
call BlzFrameSetAbsPoint(Dialog_Background, FRAMEPOINT_BOTTOM, 0.4, 0.0)
call BlzFrameSetLevel(Dialog_Background, 0)
call BlzFrameSetVisible(Dialog_Background, false)
set Dialog_Background = null
// Generate the Big Dialog Box at bottom
set Dialog_Box = BlzCreateSimpleFrame("Dialog Main", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0)
call BlzFrameSetAbsPoint(Dialog_Box, FRAMEPOINT_BOTTOM, 0.4, 0.0)
call BlzFrameSetLevel(Dialog_Box, 2)
call BlzFrameSetVisible(Dialog_Box, false)
set Dialog_Box = null
// Create Game Time Clock if wanted.
set Dialog_Clock = BlzCreateSimpleFrame("Dialog Time", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0)
call BlzFrameSetAbsPoint(Dialog_Clock, FRAMEPOINT_TOPRIGHT, 0.9333333 - 0.01722, 0.6 - 0.01278)
call BlzFrameSetLevel(Dialog_Clock, 5)
call BlzFrameSetVisible(Dialog_Clock, false)
set Dialog_Clock = null
set Dialog_Clock = BlzGetFrameByName("Dialog Clock Value", 0)
call BlzFrameSetAbsPoint(Dialog_Clock, FRAMEPOINT_TOPRIGHT, 0.9333333 - 0.02222, 0.6 - 0.01778)
call BlzFrameSetLevel(Dialog_Clock, 6)
set Dialog_Clock = null
set Dialog_Clock = BlzGetFrameByName("Dialog Clock Value Text", 0)
call BlzFrameSetText(Dialog_Clock, "AM 6:00")
call BlzFrameSetTextAlignment(Dialog_Clock, TEXT_JUSTIFY_MIDDLE, TEXT_JUSTIFY_CENTER)
call BlzFrameSetFont(Dialog_Clock, "UI\\Font\\NotoSans-Regular.ttf", 0.010, 0)
set Dialog_Clock = null
// Generate main dialog frame branch (mostly static ui elements)
set Dialog = BlzCreateFrame("Dialog", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, 0)
call BlzFrameSetAbsPoint(Dialog, FRAMEPOINT_BOTTOM, 0.4, 0.0)
// Hide dialog arrow
set Dialog_Arrow = BlzGetFrameByName("Dialog Arrow", 0)
call BlzFrameSetVisible(Dialog_Arrow, false)
set Dialog_Arrow = null
// Dialog Menu Button 1-1
set Dialog_Menu_Button = BlzGetFrameByName("Dialog Menu Button 1-1", 0)
call BlzFrameSetEnable(Dialog_Menu_Button, false)
// Dialog Menu Button 1-2
set Dialog_Menu_Button = BlzGetFrameByName("Dialog Menu Button 1-2", 0)
call BlzFrameSetEnable(Dialog_Menu_Button, false)
// Dialog Menu Button 1-3
set Dialog_Menu_Button = BlzGetFrameByName("Dialog Menu Button 1-3", 0)
call BlzFrameSetEnable(Dialog_Menu_Button, false)
// Dialog Menu Button 1-4
set Dialog_Menu_Button = BlzGetFrameByName("Dialog Menu Button 1-4", 0)
call BlzFrameSetEnable(Dialog_Menu_Button, false)
// Dialog Menu Button 1-5
set Dialog_Menu_Button = BlzGetFrameByName("Dialog Menu Button 1-5", 0)
call BlzFrameSetEnable(Dialog_Menu_Button, false)
// Dialog Menu Button 2-1
set Dialog_Menu_Button = BlzGetFrameByName("Dialog Menu Button 2-1", 0)
// Dialog Menu Button 2-2
set Dialog_Menu_Button = BlzGetFrameByName("Dialog Menu Button 2-2", 0)
// Dialog Menu Button 2-3
set Dialog_Menu_Button = BlzGetFrameByName("Dialog Menu Button 2-3", 0)
// Dialog Menu Button 2-4
set Dialog_Menu_Button = BlzGetFrameByName("Dialog Menu Button 2-4", 0)
// Create 5 possible Choice Buttons
set Current = 1
loop
exitwhen Current > 5
set t = CreateTrigger()
set Dialog_Choice = BlzCreateFrame("Dialog Button 3", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, Current)
call BlzFrameSetVisible(Dialog_Choice, false)
call BlzTriggerRegisterFrameEvent(t, Dialog_Choice, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(t, function Reset_Focus_2)
set Dialog_Choice = null
set t = null
set Current = Current + 1
endloop
call BlzFrameSetVisible(Dialog, false) //-> can be used to hide all frames in Dialog [true = show ; false = hide]
set Dialog = null
// Create 10 NPC Slots
set Current = 1
loop
exitwhen Current > 10
set Dialog_NPC = BlzCreateSimpleFrame("Dialog NPC", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), Current)
call BlzFrameSetAbsPoint(Dialog_NPC, FRAMEPOINT_BOTTOMRIGHT, -0.13333, 0.0)
call BlzFrameSetLevel(Dialog_NPC, 1)
call BlzFrameSetVisible(Dialog_NPC, false)
set Dialog_NPC = null
set Current = Current + 1
endloop
// Create Input Infos
set Dialog_Input = BlzGetFrameByName("Dialog Input 1", 0)
call BlzFrameSetAbsPoint(Dialog_Input, FRAMEPOINT_BOTTOMLEFT, -0.13333 + 0.00889, 0.002)
call BlzFrameSetLevel(Dialog_Input, 7)
set Dialog_Input = null
set Dialog_Input = BlzGetFrameByName("Dialog Input 2", 0)
call BlzFrameSetAbsPoint(Dialog_Input, FRAMEPOINT_BOTTOMLEFT, -0.13333 + 0.075, 0.002)
call BlzFrameSetLevel(Dialog_Input, 7)
set Dialog_Input = null
set Dialog_Input = BlzGetFrameByName("Dialog Input 1 Text", 0)
call BlzFrameSetFont(Dialog_Input, "UI\\Font\\NotoSans-Regular.ttf", 0.011, 0)
call BlzFrameSetTextAlignment(Dialog_Input, TEXT_JUSTIFY_MIDDLE, TEXT_JUSTIFY_CENTER)
set pID = 0
loop
exitwhen pID > 23
set Input_Key = Get_Input_Key(pID)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetText(Dialog_Input, StringCase(Input_Key, true))
endif
set pID = pID + 1
endloop
set Dialog_Input = null
set Dialog_Input = BlzGetFrameByName("Dialog Input 2 Text", 0)
call BlzFrameSetFont(Dialog_Input, "UI\\Font\\NotoSans-Regular.ttf", 0.011, 0)
call BlzFrameSetTextAlignment(Dialog_Input, TEXT_JUSTIFY_MIDDLE, TEXT_JUSTIFY_CENTER)
set pID = 0
loop
exitwhen pID > 23
set Input_Key = Get_Skip_Key(pID)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetText(Dialog_Input, StringCase(Input_Key, true))
endif
set pID = pID + 1
endloop
set Dialog_Input = null
set Dialog_Editbox = BlzCreateFrame("Dialog Text Input", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, 0)
call BlzFrameSetAbsPoint(Dialog_Editbox, FRAMEPOINT_CENTER, 0.4, 0.4)
call BlzFrameSetTextSizeLimit(Dialog_Editbox, 16)
call BlzFrameSetVisible(Dialog_Editbox, false)
set Dialog_Editbox = null
endfunction
// Test Map function
function Exit_Game takes nothing returns nothing
call RemovePlayer(GetTriggerPlayer(), PLAYER_GAME_RESULT_NEUTRAL)
if GetLocalPlayer() == GetTriggerPlayer() then
call EndGame(true)
endif
endfunction
function Auto_Play_Button takes nothing returns nothing
local integer pID = GetPlayerId(GetTriggerPlayer())
local boolean Auto_Play_Active = not Is_Auto_Play(pID)
local framehandle Auto_Skip_Frame = BlzGetFrameByName("Dialog Menu Button 1-2", 0)
local framehandle Repeat_Frame = BlzGetFrameByName("Dialog Menu Button 1-3", 0)
local string Repeat_Check = LoadStr(Hashtable, GetHandleId(Player(pID)), StringHash("Current Sound File"))
local framehandle Hide_UI_Frame = BlzGetFrameByName("Dialog Menu Button 1-5", 0)
call Set_Auto_Play(GetPlayerId(GetTriggerPlayer()), Auto_Play_Active)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetEnable(Auto_Skip_Frame, not Auto_Play_Active)
call BlzFrameSetEnable(Hide_UI_Frame, not Auto_Play_Active)
endif
if Auto_Play_Active then
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetEnable(Repeat_Frame, not Auto_Play_Active)
endif
else
if Repeat_Check != null and Repeat_Check != "" then
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetEnable(Repeat_Frame, not Auto_Play_Active)
endif
endif
endif
set Auto_Skip_Frame = null
set Repeat_Frame = null
set Hide_UI_Frame = null
endfunction
function Auto_Skip_Button takes nothing returns nothing
local integer pID = GetPlayerId(GetTriggerPlayer())
local boolean Auto_Skip_Active = not Is_Auto_Skip(pID)
local framehandle Auto_Play_Frame = BlzGetFrameByName("Dialog Menu Button 1-1", 0)
local framehandle Repeat_Frame = BlzGetFrameByName("Dialog Menu Button 1-3", 0)
local string Repeat_Check = LoadStr(Hashtable, GetHandleId(Player(pID)), StringHash("Current Sound File"))
local framehandle Hide_UI_Frame = BlzGetFrameByName("Dialog Menu Button 1-5", 0)
call Set_Auto_Skip(GetPlayerId(GetTriggerPlayer()), Auto_Skip_Active)
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetEnable(Auto_Play_Frame, not Auto_Skip_Active)
call BlzFrameSetEnable(Hide_UI_Frame, not Auto_Skip_Active)
endif
if Auto_Skip_Active then
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetEnable(Repeat_Frame, not Auto_Skip_Active)
endif
else
if Repeat_Check != null and Repeat_Check != "" then
if GetLocalPlayer() == Player(pID) then
call BlzFrameSetEnable(Repeat_Frame, not Auto_Skip_Active)
endif
endif
endif
set Auto_Play_Frame = null
set Repeat_Frame = null
set Hide_UI_Frame = null
endfunction
function Repeat_Current_Button takes nothing returns nothing
call Repeat_Current(GetPlayerId(GetTriggerPlayer()))
endfunction
function Close_UI_Button takes nothing returns nothing
call Change_Dialog_Box_State(GetPlayerId(GetTriggerPlayer()))
endfunction
function Dummy_Dialog takes nothing returns nothing
local integer pID = GetPlayerId(GetTriggerPlayer())
call Initiate_Dialog(pID, "Intro")
endfunction
function Test_Map takes nothing returns nothing
local trigger t
local integer pID = 0
// Choice_Add(id, content, isEnabled, followUp)
call Choice_Add("ChoiceA", "I want to use the input button <#ff7f00>a<#>.", true, "inputA")
call Choice_Add("ChoiceJ", "I want to use the input button <#ff7f00>j<#>.", false, "inputJ")
call Choice_Add("ChoiceY", "I would like to keep it as it is.", true, "inputY")
// Dialog_Add(id, dialog action)
call Dialog_Add("Intro", "Save Variable latertw|3.5|true")
call Dialog_Add("Intro", "Change InputK y")
call Dialog_Add("Intro", "Add NPC Tutorial Girl|1|Left")
call Dialog_Add("Intro", "Change Speaker <#add8e6>Tutorial Girl")
call Dialog_Add("Intro", "Change Text Oh, hello there. Whats your name?")
call Dialog_Add("Intro", "Text Input name")
call Dialog_Add("Intro", "Change Text Nice to meet you <!name>, seems like you are interested in knowing how this system works, right?")
call Dialog_Add("Intro", "Input Wait")
call Dialog_Add("Intro", "Change Text Lets get a swap to a better looking place first.")
call Dialog_Add("Intro", "Input Wait")
call Dialog_Add("Intro", "Change Background Default")
call Dialog_Add("Intro", "Change Text ...")
call Dialog_Add("Intro", "Input Wait")
call Dialog_Add("Intro", "Change Text How I did this you ask?")
call Dialog_Add("Intro", "Input Wait")
call Dialog_Add("Intro", "Change Text You simply do the action <#ff7f00>Change Background Default<#>, it switches the background to <#ff7f00>UI\\Dialog\\Backgrounds\\Default.blp<#>.")
call Dialog_Add("Intro", "Input Wait")
call Dialog_Add("Intro", "Change Text Its a bit quiet here, dont you think so? Lets get some sounds.")
call Dialog_Add("Intro", "Input Wait")
call Dialog_Add("Intro", "Change BGM Default")
call Dialog_Add("Intro", "Change Text To do this I used <#ff7f00>Change BGM Default<#>, it switches the music to <#ff7f00>UI\\Music\\Default.blp<#>.")
call Dialog_Add("Intro", "Input Wait")
call Dialog_Add("Intro", "Change Text You gotta do this and that and that and there you go, you finished your stuff easily and fast.")
call Dialog_Add("Intro", "Change Text Whoops, forgot to put a break there.\nUse <#ff7f00>Input Wait<#> to make the game wait for the current input key\n(Can be changed with <#ff7f00>Change InputK<#>)")
call Dialog_Add("Intro", "Input Wait")
call Dialog_Add("Intro", "Change Text Lets give it a try, choose any of the choice buttons, and i will switch the input button to your choice.")
call Dialog_Add("Intro", "Save Variable entryspd|2.5")
call Dialog_Add("Intro", "Multiple Choice ChoiceA|ChoiceJ|ChoiceY")
call Dialog_Add("inputA", "Save Variable btn|a")
call Dialog_Add("inputA", "Change Speaker <#add8e6>Tutorial Girl")
call Dialog_Add("inputA", "Change Text You want me to change it to <#ff7f00><!btn><#>? Fine, there you go.")
call Dialog_Add("inputA", "Change InputK <!btn>")
call Dialog_Add("inputA", "Input Wait")
call Dialog_Add("inputA", "Change Text Lets get someone else in this conversation, since you never answer it is getting quite monotone.")
call Dialog_Add("inputA", "Input Wait")
call Dialog_Add("inputA", "Change Text Add NPC SomeoneMoreInteresting")
call Dialog_Add("inputA", "Add NPC SomeoneMoreInteresting|<!entryspd>|Right")
call Dialog_Add("inputA", "Input Wait")
call Dialog_Add("inputA", "Change Text Oh, did i say that out loud? Sorry, didnt meant it like that.")
call Dialog_Add("inputA", "Input Wait")
call Dialog_Add("inputA", "Change Speaker <#FFD700>Tasyen")
call Dialog_Add("inputA", "Change Text huh?")
call Dialog_Add("inputA", "Input Wait")
call Dialog_Add("inputA", "Change Speaker <#add8e6>Tutorial Girl")
call Dialog_Add("inputA", "Change Text Oh, ups. Wrong Person.")
call Dialog_Add("inputA", "Input Wait")
call Dialog_Add("inputA", "Remove NPC SomeoneMoreInteresting|<!entryspd>|Right")
call Dialog_Add("inputA", "Change Text You can remove them any time again with <#ff7f00>Remove NPC<#>. In this case I used <#ff7f00>Remove NPC SomeoneMoreInteresting<#>.")
call Dialog_Add("inputA", "Input Wait")
call Dialog_Add("inputA", "Time Wait <?latertw>")
call Dialog_Add("inputA", "Change Text You thought the system freezed? Dead wrong, I just decided to mimik you.\n(<#ff7f00>Time Wait <?latertw><#> waits <?latertw> real time seconds.)")
call Dialog_Add("inputA", "Input Wait")
call Dialog_Add("inputA", "Change Text Thats it for the tutorial, you never answer, and i have honestly better stuff to do. Goodbye.")
call Dialog_Add("inputA", "Input Wait")
call Dialog_Add("inputA", "Change Speaker ")
call Dialog_Add("inputA", "Remove NPC Tutorial Girl|1.5|Left")
call Dialog_Add("inputA", "Choice State ChoiceJ|true")
call Dialog_Add("inputA", "Choice State ChoiceA|false")
call Dialog_Add("inputA", "Change Text Press <!btn> or left-click to end the dialog... (PS: This choice is now disabled, and choice 2 (j) is now enabled)")
call Dialog_Add("inputA", "Input Wait")
call Dialog_Add("inputA", "Stop BGM")
call Dialog_Add("inputJ", "Save Variable btn|j")
call Dialog_Add("inputJ", "Change Speaker <#add8e6>Tutorial Girl")
call Dialog_Add("inputJ", "Change Text You want me to change it to <#ff7f00><!btn><#>? Fine, there you go.")
call Dialog_Add("inputJ", "Change InputK <!btn>")
call Dialog_Add("inputJ", "Input Wait")
call Dialog_Add("inputJ", "Change Text Lets get someone else in this conversation, since you never answer it is getting quite monotone.")
call Dialog_Add("inputJ", "Input Wait")
call Dialog_Add("inputJ", "Change Text Add NPC SomeoneMoreInteresting")
call Dialog_Add("inputJ", "Add NPC SomeoneMoreInteresting|<!entryspd>|Right")
call Dialog_Add("inputJ", "Input Wait")
call Dialog_Add("inputJ", "Change Text Oh, did i say that out loud? Sorry, didnt meant it like that.")
call Dialog_Add("inputJ", "Input Wait")
call Dialog_Add("inputJ", "Change Speaker <#FFD700>Tasyen")
call Dialog_Add("inputJ", "Change Text huh?")
call Dialog_Add("inputJ", "Input Wait")
call Dialog_Add("inputJ", "Change Speaker <#add8e6>Tutorial Girl")
call Dialog_Add("inputJ", "Change Text Oh, ups. Wrong Person.")
call Dialog_Add("inputJ", "Input Wait")
call Dialog_Add("inputJ", "Remove NPC SomeoneMoreInteresting|<!entryspd>|Right")
call Dialog_Add("inputJ", "Change Text You can remove them any time again with <#ff7f00>Remove NPC<#>. In this case I used <#ff7f00>Remove NPC SomeoneMoreInteresting<#>.")
call Dialog_Add("inputJ", "Input Wait")
call Dialog_Add("inputJ", "Time Wait <?latertw>")
call Dialog_Add("inputJ", "Change Text You thought the system freezed? Dead wrong, I just decided to mimik you.\n(<#ff7f00>Time Wait <?latertw><#> waits <?latertw> real time seconds.)")
call Dialog_Add("inputJ", "Input Wait")
call Dialog_Add("inputJ", "Change Text Thats it for the tutorial, you never answer, and i have honestly better stuff to do. Goodbye.")
call Dialog_Add("inputJ", "Input Wait")
call Dialog_Add("inputJ", "Change Speaker ")
call Dialog_Add("inputJ", "Remove NPC Tutorial Girl|1.5|Left")
call Dialog_Add("inputJ", "Change Text Press <!btn> or left-click to end the dialog...")
call Dialog_Add("inputJ", "Input Wait")
call Dialog_Add("inputJ", "Stop BGM")
call Dialog_Add("inputY", "Save Variable btn|y")
call Dialog_Add("inputY", "Save Variable btn2|c")
call Dialog_Add("inputY", "Save Variable spd|5.0")
call Dialog_Add("inputY", "Change Speaker <#add8e6>Tutorial Girl")
call Dialog_Add("inputY", "Change SkipK <!btn2>")
call Dialog_Add("inputY", "Change SkipS <!spd>")
call Dialog_Add("inputY", "Change Text You want me to keep <#ff7f00><!btn><#>? Fine.\n(Skip Button was changed to <#ff7f00><!btn2><#> and Skip Speed was changed to <#ff7f00><!spd><#> for test purpose)")
call Dialog_Add("inputY", "Input Wait")
call Dialog_Add("inputY", "Change Text Lets get someone else in this conversation, since you never answer it is getting quite monotone.")
call Dialog_Add("inputY", "Input Wait")
call Dialog_Add("inputY", "Change Text Add NPC SomeoneMoreInteresting")
call Dialog_Add("inputY", "Add NPC SomeoneMoreInteresting|<!entryspd>|Right")
call Dialog_Add("inputY", "Input Wait")
call Dialog_Add("inputY", "Change Text Oh, did i say that out loud? Sorry, didnt meant it like that.")
call Dialog_Add("inputY", "Input Wait")
call Dialog_Add("inputY", "Change Speaker <#FFD700>Tasyen")
call Dialog_Add("inputY", "Change Text huh?")
call Dialog_Add("inputY", "Input Wait")
call Dialog_Add("inputY", "Change Speaker <#add8e6>Tutorial Girl")
call Dialog_Add("inputY", "Change Text Oh, ups. Wrong Person.")
call Dialog_Add("inputY", "Input Wait")
call Dialog_Add("inputY", "Remove NPC SomeoneMoreInteresting|<!entryspd>|Right")
call Dialog_Add("inputY", "Change Text You can remove them any time again with <#ff7f00>Remove NPC<#>. In this case I used <#ff7f00>Remove NPC SomeoneMoreInteresting<#>.")
call Dialog_Add("inputY", "Input Wait")
call Dialog_Add("inputY", "Time Wait <?latertw>")
call Dialog_Add("inputY", "Change Text You thought the system freezed? Dead wrong, I just decided to mimik you.\n(<#ff7f00>Time Wait <?latertw><#> waits <?latertw> real time seconds.)")
call Dialog_Add("inputY", "Input Wait")
call Dialog_Add("inputY", "Change Text Thats it for the tutorial, you never answer, and i have honestly better stuff to do. Goodbye.")
call Dialog_Add("inputY", "Input Wait")
call Dialog_Add("inputY", "Change Speaker ")
call Dialog_Add("inputY", "Remove NPC Tutorial Girl|1.5|Left")
call Dialog_Add("inputY", "Change Text Press <!btn> or left-click to end the dialog...")
//call Dialog_Add("inputY", "Change Text <.ptime>, <.gtime>, <.ikey>, <.skey>, <.sspd>, <.gspd>, <.tspd>, <.choice>, <.background>, <.music>, <.aspd>") // can be used if you wanna check the default values.
call Dialog_Add("inputY", "Input Wait")
call Dialog_Add("inputY", "Stop BGM")
// Test Map Trigger for the dummy dialog
loop
exitwhen pID > 23
// Dialog System Related
if GetPlayerController(Player(pID)) == MAP_CONTROL_USER then
set t = CreateTrigger()
call TriggerRegisterPlayerChatEvent(t, Player(pID), "Dialog", true)
call TriggerAddAction(t, function Dummy_Dialog)
set t = null
endif
// Chat System Related
if GetPlayerName(Player(pID)) == "Zoson" then
call Set_Chat_Color(pID, "c1f9a2")
endif
set pID = pID + 1
endloop
endfunction