Advertisement
Guest User

Untitled

a guest
Jan 21st, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.46 KB | None | 0 0
  1. #Conditional Hooks
  2. $Application: FS2_Open
  3.  
  4. $On Game Init:
  5.  
  6. [
  7.  
  8. AXMessage = {}
  9.  
  10. function AXMessage:Init()
  11.  
  12. ba.print("Initializing AXMessage...\n")
  13.  
  14. if cf.fileExists("axmessage.cfg", "data/config", true) then
  15. self.Config = axemParse:ReadJSON("axmessage.cfg")
  16. ba.print("Loaded axmessage config file\n")
  17. else
  18. self.Config = {}
  19. self.Config.Default = {}
  20. self.Config.Default.TitleColor = {}
  21. self.Config.Default.TextColor = {}
  22. self.Config.Offsets = {}
  23. self.Config.Offsets.Sender = {}
  24. self.Config.Offsets.Text = {}
  25. self.Config.Position = {}
  26. self.Config.Backlog = {}
  27. end
  28.  
  29. if not self.Config.MinVertRes or (self.Config.MinVertRes and self.Config.MinVertRes <= gr.getScreenHeight()) then
  30.  
  31. self.Enabled = true
  32. mn.runSEXP("(hud-set-retail-gauge-active (false) !Messages!)")
  33. self.ShowBuiltIn = true
  34.  
  35. self.Timer = nil
  36. self.RawString = nil
  37. self.DisplayString = nil
  38. self.AlwaysDrawMsgBox = false
  39. self.DrawControl = "self"
  40. self.Alpha = 1
  41.  
  42. self.Backlog = {}
  43. self.Backlog.Enabled = false or self.Config.Backlog.Enabled
  44. self.Backlog.Entry = {}
  45. self.Backlog.Height = self.Config.Backlog.Height or 50
  46. self.Backlog.MaxSize = self.Config.Backlog.MaxSize or 4
  47.  
  48. self.Speed = self.Config.Default.Speed or 0.03
  49. self.Length = self.Config.Default.Length or 0.07
  50. self.AfterVoice = self.Config.Default.AfterVoice or 1.5
  51. self.Offsets = {}
  52. self.Offsets.Sender = {x = self.Config.Offsets.Sender[1] or 7, y = self.Config.Offsets.Sender[2] or 3}
  53. self.Offsets.Text = {x = self.Config.Offsets.Text[1] or 10, y = self.Config.Offsets.Text[2] or 15}
  54.  
  55. self.Monochrome = self.Config.Monochrome
  56.  
  57. local titleFont, textFont, backlogFont
  58.  
  59. if self.Config.Default.TitleFont and self.Config.Default.TextFont then
  60. if gr.Fonts[self.Config.Default.TitleFont]:isValid() then
  61. titleFont = gr.Fonts[self.Config.Default.TitleFont]
  62. end
  63.  
  64. if gr.Fonts[self.Config.Default.TextFont]:isValid() then
  65. textFont = gr.Fonts[self.Config.Default.TextFont]
  66. end
  67.  
  68. if gr.Fonts[self.Config.Backlog.Font]:isValid() then
  69. backlogFont = gr.Fonts[self.Config.Backlog.Font]
  70. end
  71.  
  72. end
  73.  
  74. self.Fonts = {Title = titleFont or gr.Fonts[3], Text = textFont or gr.Fonts[1], Backlog = backlogFont or gr.Fonts[1]}
  75.  
  76. self:LoadMsgBox(self.Config.Default.Image or "messagebox")
  77.  
  78. self.Config.Position_0 = self.Config.Position
  79.  
  80. if self.Config.Monochrome then
  81. self.Color = {}
  82. self.Color.Title = {}
  83. self.Color.Title[1], self.Color.Title[2], self.Color.Title[3], self.Color.Title[4] = hu.getHUDGaugeColor(27) --27 is message lines!
  84. self.Color.Title[4] = 255
  85. self.Color.Text = {}
  86. self.Color.Text[1], self.Color.Text[2], self.Color.Text[3], self.Color.Text[4] = hu.getHUDGaugeColor(27)
  87. self.Color.Text[4] = 255
  88. self.Color.HUD = {}
  89. self.Color.HUD[1], self.Color.HUD[2], self.Color.HUD[3], self.Color.HUD[4] = hu.getHUDGaugeColor(25) --25 is the talking head!
  90. else
  91. self.Color = {}
  92. self.Color.Title = {self.Config.Default.TitleColor[1] or 161,self.Config.Default.TitleColor[2] or 184,self.Config.Default.TitleColor[3] or 161,self.Config.Default.TitleColor[4] or 255}
  93. self.Color.Text = {self.Config.Default.TextColor[1] or 161,self.Config.Default.TextColor[2] or 184,self.Config.Default.TextColor[3] or 161,self.Config.Default.TextColor[4] or 255}
  94. self.Color.HUD = {}
  95. self.Color.HUD[1], self.Color.HUD[2], self.Color.HUD[3], self.Color.HUD[4] = hu.getHUDGaugeColor(25) --25 is the talking head!
  96. end
  97.  
  98. end
  99.  
  100. end
  101.  
  102. function AXMessage:Move(x,y,ox,oy)
  103.  
  104. local pos = self.Config.Position
  105.  
  106. pos.Origin[1] = x or pos.Origin[1]
  107. pos.Origin[2] = y or pos.Origin[2]
  108.  
  109. pos.Offset[1] = ox or pos.Offset[1]
  110. pos.Offset[2] = oy or pos.Offset[2]
  111.  
  112. AXMessage:LoadMsgBox()
  113.  
  114. end
  115.  
  116. function AXMessage:ResetPos()
  117.  
  118. self.Config.Position = self.Config.Position_0
  119.  
  120. AXMessage:LoadMsgBox()
  121.  
  122. end
  123.  
  124. function AXMessage:LoadMsgBox(filename)
  125.  
  126. if not filename then
  127. ba.print("AXMSG: Oops no file name given!\n")
  128. return
  129. end
  130.  
  131. self.Image = {}
  132. self.Image.file = gr.loadTexture(filename)
  133. self.Image.file2 = gr.loadTexture(filename .. "2")
  134.  
  135. if not self.Image.file:isValid() then
  136. return
  137. end
  138.  
  139. self.Image.w = self.Image.file:getWidth()
  140. self.Image.h = self.Image.file:getHeight()
  141.  
  142. self.Position = {}
  143. self.BacklogPos = {}
  144.  
  145. local pos = self.Config.Position
  146. local blpos = self.Config.Backlog
  147.  
  148. if pos.Origin and pos.Offset then
  149. self.Position.x = (gr.getScreenWidth() * pos.Origin[1]) + pos.Offset[1]
  150. self.Position.y = (gr.getScreenHeight() * pos.Origin[2]) + pos.Offset[2]
  151. elseif pos.Origin and not pos.Offset then
  152. self.Position.x = (gr.getScreenWidth() * pos.Origin[1]) - (self.Image.w/2)
  153. self.Position.y = (gr.getScreenHeight() * pos.Origin[2])
  154. elseif pos.X and pos.Y then
  155. self.Position.x = pos.X
  156. self.Position.y = pos.Y
  157. else
  158. self.Position.x = (gr.getScreenWidth() * 0.5) - (self.Image.w/2)
  159. self.Position.y = (gr.getScreenHeight() * 0.7)
  160. end
  161.  
  162. if blpos.Origin and blpos.Offset then
  163. self.BacklogPos.x = (gr.getScreenWidth() * blpos.Origin[1]) + blpos.Offset[1]
  164. self.BacklogPos.y = (gr.getScreenHeight() * blpos.Origin[2]) + blpos.Offset[2]
  165. elseif blpos.Origin and blpos.Offset then
  166. self.BacklogPos.x = (gr.getScreenWidth() * blpos.Origin[1])
  167. self.BacklogPos.y = (gr.getScreenHeight() * blpos.Origin[2])
  168. else
  169. self.BacklogPos.x = 15
  170. self.BacklogPos.y = 50
  171. end
  172.  
  173. if not blpos.Height then
  174. blpos.Height = 50
  175. end
  176.  
  177. --local hx, hy = self.Position.x + pos.HeadAni[1], self.Position.y + pos.HeadAni[2]
  178.  
  179. --mn.runSEXP("hud-set-coords !Talking head! !"..hx.."! !"..hy.."!")
  180.  
  181. end
  182.  
  183. function AXMessage:SetupMessage(sender, message, messageText)
  184.  
  185. if self.Timer and self.RawString then
  186. self:AddToBacklog(self.Sender, self.RawString)
  187. end
  188.  
  189. local thisMessage
  190. local genericVoice
  191. local speedFactor = 1
  192.  
  193. if mn.Messages[message]:isValid() then
  194. thisMessage = mn.Messages[message]
  195. elseif not self.ShowBuiltIn then
  196. return
  197. end
  198.  
  199. if string.find(message, "!!!", 1, true) == 1 then
  200. speedFactor = 0
  201. elseif string.find(message, "!!", 1, true) == 1 then
  202. speedFactor = 0.3
  203. elseif string.find(message, "!", 1, true) == 1 then
  204. speedFactor = 0.6
  205. elseif string.find(message, "...", 1, true) == 1 then
  206. speedFactor = 2.0
  207. elseif string.find(message, "..", 1, true) == 1 then
  208. speedFactor = 1.6
  209. elseif string.find(message, ".", 1, true) == 1 then
  210. speedFactor = 1.3
  211. end
  212.  
  213. self.Sender = sender
  214.  
  215. self.RawString = messageText
  216.  
  217. self.DisplayString = nil
  218. self.NextChar = mn.getMissionTime() + self.Length
  219. self.Drawing = true
  220.  
  221. if self.Config.GenericFiles and thisMessage and thisMessage.VoiceFile.Filename then
  222.  
  223. for i, v in ipairs(self.Config.GenericFiles) do
  224. if v == string.gsub(thisMessage.VoiceFile.Filename,'\....$','') then
  225. genericVoice = true
  226. break
  227. end
  228. end
  229. end
  230.  
  231. self.Speed = self.Config.Default.Speed or 0.03
  232. self.Speed = self.Speed * speedFactor
  233. local guesstimatelength
  234.  
  235. if self.Config.Unicode then
  236. guesstimatelength = math.max(self.Length * utf8.len(self.RawString), self.Length * utf8.len(self.RawString) * speedFactor, 2)
  237. else
  238. guesstimatelength = math.max(self.Length * #self.RawString, self.Length * #self.RawString * speedFactor, 2)
  239. end
  240.  
  241. if thisMessage then
  242. if thisMessage.VoiceFile.Duration > 0 and not genericVoice then
  243. self.Timer = mn.getMissionTime() + thisMessage.VoiceFile.Duration + self.AfterVoice
  244. self.debug = "Got Voice"
  245. if self.Config.MatchVoiceLength then
  246. self.Speed = self.Timer / #self.RawString
  247. end
  248. else
  249. self.Timer = mn.getMissionTime() + guesstimatelength
  250. self.debug = "No voice"
  251. end
  252. else
  253. self.Timer = mn.getMissionTime() + guesstimatelength
  254. self.debug = "Built in"
  255. end
  256.  
  257. self.Timestamp = mn.getMissionTime()
  258.  
  259. end
  260.  
  261. function AXMessage:UpdateString()
  262.  
  263. if self.Speed == 0 then
  264. self.DisplayString = self.RawString
  265. else
  266. if self.RawString and self.RawString ~= self.DisplayString and self.Drawing then
  267. local toDraw = (mn.getMissionTime() - self.Timestamp) / self.Speed
  268. if toDraw > 0 then
  269. if self.Config.Unicode then
  270. self.DisplayString = utf8.sub(self.RawString, 1, toDraw)
  271. else
  272. self.DisplayString = self.RawString:sub(1, toDraw)
  273. end
  274. end
  275. end
  276. end
  277.  
  278. if self.DisplayString == self.RawString and self.Drawing then
  279. self.Drawing = false
  280. end
  281.  
  282. end
  283.  
  284. function AXMessage:Draw()
  285.  
  286. local draw
  287.  
  288. if self.Timer and not self.AlwaysDrawMsgBox then
  289. if self.Timer > mn.getMissionTime() then
  290. draw = true
  291. elseif self.RawString then
  292. self:AddToBacklog(self.Sender, self.RawString)
  293. self.Sender = nil
  294. self.RawString = nil
  295. self.Timer = nil
  296. end
  297. end
  298.  
  299. if self.AlwaysDrawMsgBox then
  300. draw = true
  301. end
  302.  
  303. if draw then
  304. self:DrawMessageBox()
  305. end
  306.  
  307.  
  308. end
  309.  
  310. function AXMessage:SetColor(text,r,g,b,a)
  311.  
  312. if text == "title" then
  313. self.Color.Title = {r,g,b,a or 255}
  314. elseif text == "text" then
  315. self.Color.Text = {r,g,b,a or 255}
  316. end
  317.  
  318. end
  319.  
  320. function AXMessage:AddToBacklog(sender, message)
  321.  
  322. local newEntry = {}
  323.  
  324. newEntry.Sender = sender
  325. newEntry.Text = message
  326.  
  327. if self.Config.Backlog.Timeout then
  328. newEntry.Expire = self.Config.Backlog.Timeout + mn.getMissionTime()
  329. end
  330.  
  331. self.Backlog.Entry[#self.Backlog.Entry+1] = newEntry
  332. self.Backlog.Timestamp = mn.getMissionTime()
  333.  
  334. if #self.Backlog.Entry > self.Backlog.MaxSize then
  335. table.remove(self.Backlog.Entry, 1)
  336. end
  337.  
  338. end
  339.  
  340.  
  341. function AXMessage:DrawMessageBox()
  342.  
  343. if self.Monochrome then
  344. if self.Image.file2:isValid() then
  345. gr.drawImage(self.Image.file2, self.Position.x, self.Position.y, self.Position.x + self.Image.w, self.Position.y + self.Image.h, 0, 0, 1, 1, 0.5 )
  346. end
  347. gr.setColor(self.Color.HUD[1], self.Color.HUD[2], self.Color.HUD[3], self.Color.HUD[4])
  348. gr.drawMonochromeImage(self.Image.file, self.Position.x, self.Position.y)
  349. else
  350. gr.drawImage(self.Image.file, self.Position.x, self.Position.y)
  351. end
  352.  
  353. if self.DisplayString and self.Sender then
  354. gr.setColor(self.Color.Title[1], self.Color.Title[2], self.Color.Title[3], self.Color.Title[4])
  355. gr.CurrentFont = self.Fonts.Title
  356. gr.drawString(self.Sender, self.Position.x + self.Offsets.Sender.x, self.Position.y + self.Offsets.Sender.y)
  357. gr.setColor(self.Color.Text[1], self.Color.Text[2], self.Color.Text[3], self.Color.Text[4])
  358. gr.CurrentFont = self.Fonts.Text
  359. gr.drawString(self.DisplayString, self.Position.x + self.Offsets.Text.x, self.Position.y + self.Offsets.Text.y + gr.CurrentFont.Height, self.Position.x + self.Image.w - 20, self.Position.y + self.Image.h - 5 + gr.CurrentFont.Height)
  360. end
  361.  
  362. end
  363.  
  364. function AXMessage:DrawBacklog()
  365.  
  366. gr.CurrentFont = self.Fonts.Backlog
  367.  
  368. local backlogSize = #self.Backlog.Entry
  369. local line = 1
  370. local drawnLines = 1
  371. local offset = 0
  372. local screenWidth = gr.getScreenWidth()
  373. local fontHeight = gr.CurrentFont.Height
  374.  
  375. if self.Backlog.Timestamp then
  376. if (self.Backlog.Timestamp + 0.2) > mn.getMissionTime() then
  377. offset = -10 * (mn.getMissionTime()-self.Backlog.Timestamp) / 0.2 + 10
  378. else
  379. self.Backlog.Timestamp = nil
  380. end
  381. end
  382.  
  383. local width = screenWidth - self.BacklogPos.x
  384.  
  385. gr.setClip(self.BacklogPos.x, self.BacklogPos.y, width, self.Backlog.Height)
  386.  
  387. for i = backlogSize, 1, -1 do
  388.  
  389. local text = self.Backlog.Entry[i].Text
  390. local sender = self.Backlog.Entry[i].Sender .. ": "
  391. local x1 = 0
  392. local x2 = (screenWidth/2) - 85 - self.BacklogPos.x
  393. --local guessedLines = math.floor((gr.getStringWidth(text)+20)/(x2 - (gr.getStringWidth(sender))))
  394. --local guessedLines = (gr.getStringWidth(text))/(x2 - (gr.getStringWidth(sender)))
  395. local guessedLines = gr.drawString(text, x1 + gr.getStringWidth(sender), self.Backlog.Height + 100, x2, self.Backlog.Height + 200) - 1 --this is horrible, but those two other guessedLines don't work!
  396. local y1 = self.Backlog.Height - ((line + guessedLines) * fontHeight) + offset
  397. local y2 = y1 + (fontHeight * 5)
  398. local alpha = 255
  399.  
  400. if line ~= 1 then
  401. alpha = (127 * (y1 / self.Backlog.Height)) + 128
  402. end
  403.  
  404. gr.setColor(self.Color.Text[1], self.Color.Text[2], self.Color.Text[3], alpha)
  405.  
  406. if text and y1 > (-1 * (guessedLines+1) * fontHeight) then
  407. if (not self.Config.Backlog.Timeout) or (self.Config.Backlog.Timeout and self.Backlog.Entry[i].Expire and (self.Backlog.Entry[i].Expire > mn.getMissionTime())) then
  408. gr.drawString = gr.drawString(sender, x1, y1)
  409. drawnLines = gr.drawString(text, x1 + gr.getStringWidth(sender), y1, x2, y2)
  410. end
  411. line = line + drawnLines
  412. end
  413.  
  414. end
  415.  
  416. gr.resetClip()
  417.  
  418. --gr.setColor(255,255,255,255)
  419. --gr.drawString("BACKLOG SIZE: " .. backlogSize, 150,350)
  420.  
  421. end
  422.  
  423. function AXMessage:Exit()
  424.  
  425. self.Enabled = false
  426. if self.Image.file:isValid() then self.Image.file:unload() end
  427. if self.Image.file2:isValid() then self.Image.file2:unload() end
  428.  
  429. end
  430.  
  431. ]
  432.  
  433. $State: GS_STATE_GAME_PLAY
  434. $On Gameplay Start:
  435. [
  436. if not AXMessage.Enabled then
  437. AXMessage:Init()
  438. end
  439. ]
  440.  
  441. $On State End:
  442. [
  443. if AXMessage.Enabled then
  444. AXMessage:Exit()
  445. end
  446. ]
  447.  
  448. $On HUD Draw:
  449. [
  450. if hu.HUDDrawn then
  451. if AXMessage.Enabled and AXMessage.DrawControl == "self" then
  452. AXMessage:UpdateString()
  453. AXMessage:Draw()
  454. if not hu.HUDDisabledExceptMessages and AXMessage.Backlog and AXMessage.Backlog.Enabled then
  455. AXMessage:DrawBacklog()
  456. end
  457. end
  458. end
  459. ]
  460.  
  461. $On Message Received:
  462. [
  463.  
  464. --Hook vars: "Name" (Message name), "Message" (Message Text), "SenderString" (Displayed name), "Builtin" (boolean if its a builtin message), "Sender" (object handle that sent, not always valid!!!!)
  465.  
  466. if AXMessage.Enabled and AXMessage.DrawControl == "self" then
  467. AXMessage:SetupMessage(hv.SenderString, hv.Name, hv.Message)
  468. end
  469.  
  470. ]
  471.  
  472. $On HUD Message Received:
  473. [
  474. --[[hv.Source Types:
  475. 0->Computer (Things like "Warp Drive Broken")
  476. 1->Training (Carries over from the Training Messages)
  477. 2->Hidden (Things like "Cannot fire %s without a lock")
  478. 3->Important (Not actually used)
  479. 4->Failed (Used for objective status in the message log)
  480. 5->Satisfied (Ditto)
  481. 6->Terran Command (Anything from #Command)
  482. 7->Netplayer (Multichat)
  483. 8+->Teams (8 = friendly, 9 = hostile etc etc)
  484. ]]--
  485.  
  486. if AXMessage.Enabled and AXMessage.Backlog then
  487. if ((hv.SourceType == 0) or (hv.SourceType == 2)) then
  488. AXMessage:AddToBacklog("SYSTEM", hv.Text)
  489. end
  490. end
  491.  
  492. ]
  493.  
  494. $State: GS_STATE_GAME_PAUSED
  495. $On Frame:
  496. [
  497. if AXMessage.Timer then
  498. AXMessage.Timer = AXMessage.Timer + ba.getFrametime()
  499. end
  500. ]
  501. #End
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement