653 lines
15 KiB
Plaintext
Executable File
653 lines
15 KiB
Plaintext
Executable File
--
|
|
-- File:: rockstar/helpers/bugstar.ms
|
|
-- Description:: Bugstar
|
|
--
|
|
-- Author:: Greg Smith <greg.smith@rockstarnorth.com>
|
|
-- Date:: 11/5/2004
|
|
--
|
|
-----------------------------------------------------------------------------
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- Globals
|
|
-----------------------------------------------------------------------------
|
|
GtaNumBugsA = 0
|
|
GtaNumBugsB = 0
|
|
GtaNumBugsC = 0
|
|
GtaNumBugsD = 0
|
|
GtaNumBugsWish = 0
|
|
GtaNumBugsTODO = 0
|
|
GtaNumBugsFixed = 0
|
|
|
|
GtaUserList = #()
|
|
GtaUserIDList = #()
|
|
GtaUserPrintList = #()
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- Functions
|
|
-----------------------------------------------------------------------------
|
|
fn ResetBugStarList = (
|
|
|
|
GtaNumBugsA = 0
|
|
GtaNumBugsB = 0
|
|
GtaNumBugsC = 0
|
|
GtaNumBugsD = 0
|
|
GtaNumBugsWish = 0
|
|
GtaNumBugsTODO = 0
|
|
GtaNumBugsFixed = 0
|
|
|
|
for obj in rootnode.children do (
|
|
|
|
if classof obj == Sphere and isdeleted obj == false then (
|
|
|
|
delete obj
|
|
)
|
|
)
|
|
)
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- Rollout
|
|
-----------------------------------------------------------------------------
|
|
rollout GtaBuglistRoll "Bugstar Viewer"
|
|
(
|
|
hyperlink lnkHelp "Help?" address:"https://devstar.rockstargames.com/wiki/index.php/Bugstar" align:#right color:(color 0 0 255) hoverColor:(color 0 0 255) visitedColor:(color 0 0 255)
|
|
dropdownlist listUsers "User"
|
|
button buttonLoad "Get From Database" width:110 offset:[-60,0]
|
|
button buttonReset "Reset" width:60 offset:[30,-26]
|
|
checkbox checkShowA "A" checked:true offset:[0,-0]
|
|
checkbox checkShowB "B" checked:true offset:[35,-20]
|
|
checkbox checkShowC "C" checked:true offset:[70,-20]
|
|
checkbox checkShowD "D" checked:true offset:[105,-20]
|
|
checkbox checkShowWISH "WISH" checked:true offset:[140,-20]
|
|
checkbox checkShowTODO "TODO" checked:true offset:[195,-20]
|
|
edittext currentItem "Current:" enabled:false
|
|
edittext currentOwner "Owner:" enabled:false
|
|
edittext currentClass "Class:" enabled:false
|
|
checkbox checkFixed "Fix" checked:false
|
|
button buttonSendFixes "Send Fixes to Database" width:140 offset:[20,-20]
|
|
button buttonPrevious "Previous" width:70 offset:[-80,0]
|
|
button buttonNext "Next" width:70 offset:[0,-26]
|
|
button buttonSavePos "Save Pos" width:70 offset:[80,-26]
|
|
checkbox checkHideFixed "Freeze Fixed" checked:false
|
|
edittext bugsTypeA "A class bugs" enabled:false
|
|
edittext bugsTypeB "B class bugs" enabled:false
|
|
edittext bugsTypeC "C class bugs" enabled:false
|
|
edittext bugsTypeD "D class bugs" enabled:false
|
|
edittext bugsTypeWISH "WISH class bugs" enabled:false
|
|
edittext bugsTypeTODO "TODO class bugs" enabled:false
|
|
edittext bugsTypeFIXED "Fixed bugs" enabled:false
|
|
|
|
fn updateWhatToShow = (
|
|
|
|
for obj in rootnode.children do (
|
|
|
|
if classof obj == Sphere then (
|
|
|
|
objClass = getuserprop obj "class"
|
|
found = false
|
|
|
|
if objClass == "A" and checkShowA.checked == false then (
|
|
hide obj
|
|
found = true
|
|
)
|
|
|
|
if objClass == "B" and checkShowB.checked == false then (
|
|
hide obj
|
|
found = true
|
|
)
|
|
|
|
if objClass == "C" and checkShowC.checked == false then (
|
|
hide obj
|
|
found = true
|
|
)
|
|
|
|
if objClass == "D" and checkShowD.checked == false then (
|
|
hide obj
|
|
found = true
|
|
)
|
|
|
|
if objClass == "WISH" and checkShowWISH.checked == false then (
|
|
hide obj
|
|
found = true
|
|
)
|
|
|
|
if objClass == "TODO" and checkShowTODO.checked == false then (
|
|
hide obj
|
|
found = true
|
|
)
|
|
|
|
if found == false then (
|
|
unhide obj
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
fn updateStats = (
|
|
|
|
bugsTypeA.text = (GtaNumBugsA as string)
|
|
bugsTypeB.text = (GtaNumBugsB as string)
|
|
bugsTypeC.text = (GtaNumBugsC as string)
|
|
bugsTypeD.text = (GtaNumBugsD as string)
|
|
bugsTypeWISH.text = (GtaNumBugsWish as string)
|
|
bugsTypeTODO.text = (GtaNumBugsTODO as string)
|
|
bugsTypeFIXED.text = (GtaNumBugsFixed as string)
|
|
)
|
|
|
|
fn computeStats = (
|
|
|
|
GtaNumBugsA = 0
|
|
GtaNumBugsB = 0
|
|
GtaNumBugsC = 0
|
|
GtaNumBugsD = 0
|
|
GtaNumBugsWish = 0
|
|
GtaNumBugsTODO = 0
|
|
GtaNumBugsFixed = 0
|
|
|
|
for obj in rootnode.children do (
|
|
if classof obj == Sphere then (
|
|
|
|
objClass = getuserprop obj "class"
|
|
objFixed = getuserprop obj "fixed"
|
|
|
|
if objFixed == "yes" then (
|
|
GtaNumBugsFixed = GtaNumBugsFixed + 1
|
|
) else (
|
|
if objClass == "A" then (
|
|
GtaNumBugsA = GtaNumBugsA + 1
|
|
)
|
|
|
|
if objClass == "B" then (
|
|
GtaNumBugsB = GtaNumBugsB + 1
|
|
)
|
|
|
|
if objClass == "C" then (
|
|
GtaNumBugsC = GtaNumBugsC + 1
|
|
)
|
|
|
|
if objClass == "D" then (
|
|
GtaNumBugsD = GtaNumBugsD + 1
|
|
)
|
|
|
|
if objClass == "WISH" then (
|
|
GtaNumBugsWish = GtaNumBugsWish + 1
|
|
)
|
|
|
|
if objClass == "TODO" then (
|
|
GtaNumBugsTODO = GtaNumBugsTODO + 1
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
updateStats()
|
|
)
|
|
|
|
fn loadBugList = (
|
|
|
|
ResetBugStarList()
|
|
|
|
if listUsers.selection == 0 then return 0
|
|
|
|
idFound = finditem GtaUserList listUsers.items[listUsers.selection]
|
|
|
|
bugs = bugstar_getbugs (GtaUserIDList[idFound])
|
|
|
|
for bugItem in bugs do (
|
|
|
|
if bugItem[4] == 0 then (
|
|
|
|
newSphere = Sphere()
|
|
newSphere.pos = [bugItem[5] as float,bugItem[6] as float,bugItem[7] as float]
|
|
newSphere.radius = 2.0
|
|
newSphere.segs = 4
|
|
|
|
if bugItem[3] == 0 then (
|
|
bugItem[3] = "A"
|
|
GtaNumBugsA = GtaNumBugsA + 1
|
|
newSphere.wirecolor = (color 255 0 0)
|
|
) else if bugItem[3] == 1 then (
|
|
bugItem[3] = "B"
|
|
GtaNumBugsB = GtaNumBugsB + 1
|
|
newSphere.wirecolor = (color 0 255 0)
|
|
) else if bugItem[3] == 2 then (
|
|
bugItem[3] = "C"
|
|
GtaNumBugsC = GtaNumBugsC + 1
|
|
newSphere.wirecolor = (color 0 0 255)
|
|
) else if bugItem[3] == 3 then (
|
|
bugItem[3] = "D"
|
|
GtaNumBugsD = GtaNumBugsD + 1
|
|
newSphere.wirecolor = (color 255 255 0)
|
|
) else if bugItem[3] == 4 then (
|
|
bugItem[3] = "WISH"
|
|
GtaNumBugsWish = GtaNumBugsWish + 1
|
|
newSphere.wirecolor = (color 255 0 255)
|
|
) else (
|
|
bugItem[3] = "TODO"
|
|
GtaNumBugsTODO = GtaNumBugsTODO + 1
|
|
newSphere.wirecolor = (color 255 0 255)
|
|
)
|
|
|
|
setuserprop newSphere "summary" bugItem[2]
|
|
setuserprop newSphere "id" (bugItem[1] as string)
|
|
setuserprop newSphere "owner" listUsers.items[listUsers.selection]
|
|
setuserprop newSphere "fixed" "no"
|
|
setuserprop newSphere "class" bugItem[3]
|
|
|
|
newSphere.name = ("BUG" + (bugItem[8] as string) + "_" + bugItem[2])
|
|
)
|
|
)
|
|
|
|
updateStats()
|
|
updateWhatToShow()
|
|
)
|
|
|
|
fn updateSelection = (
|
|
|
|
currentPickSelection = #()
|
|
|
|
for obj in selection do (
|
|
|
|
if classof obj == Sphere then (
|
|
|
|
append currentPickSelection obj
|
|
)
|
|
)
|
|
|
|
if currentPickSelection.count > 1 then (
|
|
|
|
currentItem.text = "Multiple"
|
|
currentOwner.text = ""
|
|
currentClass.text = ""
|
|
) else (
|
|
|
|
if currentPickSelection.count == 1 then (
|
|
currentItem.text = currentPickSelection[1].name
|
|
|
|
ownerText = getuserprop currentPickSelection[1] "owner"
|
|
|
|
if ownerText == undefined then (
|
|
currentOwner.text = ""
|
|
) else (
|
|
currentOwner.text = ownerText
|
|
)
|
|
|
|
classText = getuserprop currentPickSelection[1] "class"
|
|
|
|
if classText == undefined then (
|
|
currentClass.text = ""
|
|
) else (
|
|
currentClass.text = classText
|
|
)
|
|
|
|
isFixed = getuserprop selection[1] "fixed"
|
|
|
|
if isFixed == "yes" then (
|
|
checkFixed.checked = true
|
|
) else (
|
|
checkFixed.checked = false
|
|
)
|
|
|
|
) else (
|
|
currentItem.text = ""
|
|
currentOwner.text = ""
|
|
currentClass.text = ""
|
|
)
|
|
)
|
|
)
|
|
|
|
on buttonSavePos pressed do (
|
|
|
|
if selection.count < 1 then (
|
|
return 0
|
|
)
|
|
|
|
if classof selection[1] != Sphere then (
|
|
return 0
|
|
)
|
|
|
|
filename = "x:\\gta\\build\\playercoords.txt"
|
|
bugstarfile = openfile filename mode:"w+"
|
|
|
|
if bugstarfile == undefined then (
|
|
return 0
|
|
)
|
|
|
|
format "% % %\n" selection[1].pos[1] selection[1].pos[2] selection[1].pos[3] to:bugstarfile
|
|
|
|
close bugstarfile
|
|
)
|
|
|
|
on buttonPrevious pressed do (
|
|
currentSel = undefined
|
|
previous = undefined
|
|
|
|
-- get the currently selected object
|
|
|
|
for obj in selection do (
|
|
if classof obj == Sphere and isdeleted obj == false then (
|
|
currentSel = obj
|
|
exit
|
|
)
|
|
)
|
|
|
|
clearSelection()
|
|
|
|
-- look for the next object
|
|
|
|
for obj in rootnode.children do (
|
|
if classof obj == Sphere and isdeleted obj == false and obj.ishidden == false then (
|
|
|
|
if obj == currentSel then (
|
|
if previous == undefined then (
|
|
for obj in rootnode.children do (
|
|
if classof obj == Sphere and isdeleted obj == false and obj.ishidden == false then (
|
|
previous = obj
|
|
)
|
|
)
|
|
|
|
if previous != undefined then (
|
|
select previous
|
|
)
|
|
|
|
return 0
|
|
|
|
) else (
|
|
select previous
|
|
return 0
|
|
)
|
|
)
|
|
|
|
previous = obj
|
|
)
|
|
)
|
|
)
|
|
|
|
on buttonNext pressed do (
|
|
currentSel = undefined
|
|
previous = undefined
|
|
|
|
-- get the currently selected object
|
|
|
|
for obj in selection do (
|
|
if classof obj == Sphere and isdeleted obj == false then (
|
|
currentSel = obj
|
|
exit
|
|
)
|
|
)
|
|
|
|
clearSelection()
|
|
|
|
-- look for the next object
|
|
|
|
found = false
|
|
first = undefined
|
|
|
|
for obj in rootnode.children do (
|
|
|
|
if classof obj == Sphere and isdeleted obj == false and obj.ishidden == false then (
|
|
|
|
if first == undefined then first = obj
|
|
|
|
if found == true then (
|
|
|
|
select obj
|
|
return 0
|
|
)
|
|
|
|
if obj == currentSel then (
|
|
|
|
found = true
|
|
)
|
|
)
|
|
)
|
|
|
|
if first != undefined then select first
|
|
)
|
|
|
|
|
|
on buttonUpdate pressed do (
|
|
|
|
return 0
|
|
|
|
itemFixed = #()
|
|
|
|
for obj in rootnode.children do (
|
|
if classof obj == Sphere then (
|
|
if getuserprop obj "fixed" == "yes" then (
|
|
append itemFixed (getuserprop obj "id" as integer)
|
|
)
|
|
)
|
|
)
|
|
|
|
if itemFixed.count > 0 then (
|
|
|
|
-- setbugfixed userName.text itemFixed
|
|
|
|
loadBugList()
|
|
)
|
|
)
|
|
|
|
on checkShowA changed state do (
|
|
updateWhatToShow()
|
|
)
|
|
|
|
on checkShowB changed state do (
|
|
updateWhatToShow()
|
|
)
|
|
|
|
on checkShowC changed state do (
|
|
updateWhatToShow()
|
|
)
|
|
|
|
on checkShowD changed state do (
|
|
updateWhatToShow()
|
|
)
|
|
|
|
on checkShowWISH changed state do (
|
|
updateWhatToShow()
|
|
)
|
|
|
|
on checkShowTODO changed state do (
|
|
updateWhatToShow()
|
|
)
|
|
|
|
on checkHideFixed changed state do (
|
|
|
|
for obj in rootnode.children do (
|
|
|
|
if classof obj == Sphere then (
|
|
|
|
if state == true and (getuserprop obj "fixed" == "yes") then (
|
|
|
|
freeze obj
|
|
) else (
|
|
|
|
unfreeze obj
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
on buttonSendFixes pressed do (
|
|
|
|
retval = querybox "are you sure? you can only undo this through bugstar"
|
|
|
|
if retval then (
|
|
|
|
for obj in rootnode.children do (
|
|
|
|
if classof obj == Sphere and isdeleted obj == false then (
|
|
|
|
isFixed = getuserprop obj "fixed"
|
|
|
|
if isFixed == "yes" then (
|
|
|
|
bugid = getuserprop obj "id"
|
|
username = getuserprop obj "owner"
|
|
|
|
idFound = finditem GtaUserList username
|
|
|
|
if idFound != 0 then (
|
|
|
|
userid = GtaUserIDList[idFound]
|
|
|
|
bugstar_resolve userid bugid "resolved from max"
|
|
|
|
case getuserprop obj "class" of (
|
|
"A": GtaNumBugsA = GtaNumBugsA - 1
|
|
"B": GtaNumBugsB = GtaNumBugsB - 1
|
|
"C": GtaNumBugsC = GtaNumBugsC - 1
|
|
"D": GtaNumBugsD = GtaNumBugsD - 1
|
|
"WISH": GtaNumBugsWish = GtaNumBugsWish - 1
|
|
"TODO": GtaNumBugsTODO = GtaNumBugsTODO - 1
|
|
)
|
|
|
|
GtaNumBugsFixed = GtaNumBugsFixed + 1
|
|
|
|
delete obj
|
|
)
|
|
)
|
|
)
|
|
)
|
|
) else (
|
|
|
|
messagebox "this can only be undone through bugstar"
|
|
)
|
|
)
|
|
|
|
on checkFixed changed state do (
|
|
|
|
if selection.count == 1 and classof selection[1] == Sphere then (
|
|
|
|
obj = selection[1]
|
|
|
|
if state == true then (
|
|
|
|
bugid = getuserprop obj "id"
|
|
username = getuserprop obj "owner"
|
|
|
|
idFound = finditem GtaUserList username
|
|
|
|
if idFound != 0 then (
|
|
|
|
setuserprop obj "fixed" "yes"
|
|
obj.xray = true
|
|
|
|
if checkHideFixed.checked == true and getuserprop obj "fixed" == "yes" then (
|
|
freeze obj
|
|
) else (
|
|
unfreeze obj
|
|
)
|
|
)
|
|
) else (
|
|
|
|
setuserprop obj "fixed" "no"
|
|
)
|
|
)
|
|
|
|
updateStats()
|
|
)
|
|
|
|
on buttonReset pressed do (
|
|
ResetBugStarList()
|
|
)
|
|
|
|
on buttonLoad pressed do (
|
|
loadBugList()
|
|
)
|
|
|
|
on GtaBuglistRoll open do (
|
|
|
|
userlist = bugstar_getusers()
|
|
|
|
if userlist == false then (
|
|
|
|
messagebox "bugstar server is down. have you enabled max integration in bugstar?"
|
|
return 0
|
|
)
|
|
|
|
GtaUserList = #()
|
|
GtaUserIDList = #()
|
|
GtaUserPrintList = #()
|
|
|
|
for item in userlist do (
|
|
|
|
append GtaUserPrintList item[2]
|
|
append GtaUserList item[2]
|
|
append GtaUserIDList item[1]
|
|
)
|
|
|
|
sort GtaUserPrintList
|
|
|
|
listUsers.items = GtaUserPrintList
|
|
|
|
computeStats()
|
|
updateSelection()
|
|
callbacks.addscript #selectionSetChanged "GtaBuglistUtil.rollouts[1].updateSelection()" id:#pickBugselect
|
|
)
|
|
|
|
on GtaBuglistRoll close do (
|
|
|
|
callbacks.removescripts id:#pickBugselect )
|
|
)
|
|
|
|
rollout GtaBugReassignRoll "Bugstar Reassign"
|
|
(
|
|
dropdownlist listUsers "Reassign to:"
|
|
button butReassign "Reassign Selected"
|
|
|
|
on butReassign pressed do (
|
|
|
|
if listUsers.selected == 0 then (
|
|
messagebox "please select a user to reassign to"
|
|
return 0
|
|
)
|
|
|
|
retval = queryBox "Are you sure you want to reassign?"
|
|
|
|
if retval == false then (
|
|
return 0
|
|
)
|
|
|
|
bugsID = #()
|
|
bugsDelete = #()
|
|
|
|
for bugItem in selection do (
|
|
if classof bugItem == Sphere then (
|
|
idVal = getuserprop bugItem "id"
|
|
idVal = idVal as integer
|
|
|
|
if idVal != undefined then (
|
|
append bugsID idVal
|
|
append bugsDelete bugItem
|
|
)
|
|
)
|
|
)
|
|
|
|
if bugsID.count < 1 then (
|
|
messagebox "please select some bugs to reassign"
|
|
return 0
|
|
)
|
|
|
|
retval = reassignbugs listUsers.selected bugsID
|
|
|
|
if retval == true then (
|
|
messagebox ((bugsID.count as string) + " bugs reassigned to " + listUsers.selected)
|
|
delete bugsDelete
|
|
) else (
|
|
messagebox "error in reassign"
|
|
)
|
|
)
|
|
|
|
on GtaBugReassignRoll open do (
|
|
userNames = getbugusers()
|
|
-- userNames = #()
|
|
|
|
listUsers.items = userNames
|
|
)
|
|
)
|
|
|
|
try CloseRolloutFloater GtaBuglistUtil catch()
|
|
GtaBuglistUtil = newRolloutFloater "Bugstar" 300 530 1 136
|
|
addRollout GtaBuglistRoll GtaBuglistUtil
|