488 lines
17 KiB
Plaintext
Executable File
488 lines
17 KiB
Plaintext
Executable File
-- Rockstar Fragment Tuning
|
|
-- Rockstar North
|
|
-- 15/5/2006
|
|
-- by Luke Openshaw
|
|
-- rewritten by Gunnar Droege
|
|
|
|
-- Read and write fragment params
|
|
-- dependent on structures in RsFragmentTunungGlobals.ms in startup folder
|
|
-- note: children are bound objects, groups are the actual breaking bits and might have more chidren
|
|
|
|
filein "rockstar/export/settings.ms"
|
|
filein "string.ms"
|
|
|
|
try CloseRolloutFloater RsFragTuner catch()
|
|
global RsFragTuner = newRolloutFloater "Rockstar Fragment Tuner" 300 1100 50 126
|
|
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- global UI code
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
rollout RsBasicEditRollout "Quick edit"
|
|
(
|
|
label lblBullt "bullet ped car truck" align:#right
|
|
label comboLabel "Only damaged by:" across:2 align:#left
|
|
slider sliderDamagedBy "" range:[0,16,8] type:#integer --items:#("bullet", "ped", "car")
|
|
label checkboxLabel "Disappear when dead" across:2 align:#left
|
|
checkbox checkDisappear ""
|
|
|
|
on sliderDamagedBy changed val do
|
|
(
|
|
local threshold = 1
|
|
for i=1 to val do threshold = threshold * 2
|
|
if gFragTuner!=undefined then
|
|
(
|
|
gFragTuner.setGroupValueDirect gFragTuner.currFragRoot "minDamageForce" threshold setAllChildren:true
|
|
)
|
|
)
|
|
on checkDisappear changed val do
|
|
(
|
|
if gFragTuner!=undefined then
|
|
(
|
|
gFragTuner.setGroupValueDirect gFragTuner.currFragRoot "disappearsWhenDead" val setAllChildren:true
|
|
)
|
|
)
|
|
)
|
|
|
|
fn addControlAndHandler creator type varName readableName paramString groupName attributeValue childindex:undefined cmbBoxItems:undefined customCallback:undefined =
|
|
(
|
|
creator.addControl #label (varName+"_label") readableName paramStr:("align:#left across:3")
|
|
local checkBoxName = (varName+"_expChck")
|
|
local params = (paramString+" width:60 offset:(point2 55 0)")
|
|
local codeString = "gFragTuner.setGroupValue @"+groupName+"@ @"+attributeValue.attrName+"@ val undefined; "
|
|
if undefined!=childindex then codeString = "gFragTuner.setChildValue @"+groupName+"@ @"+(childindex as string)+"@ @"+attributeValue.attrName+"@ val; "
|
|
if undefined!=cmbBoxItems then
|
|
(
|
|
codeString = "gFragTuner.setGroupValue @"+groupName+"@ @"+attributeValue.attrName+"@ "+varName+".selected undefined; "
|
|
append params (" items:"+cmbBoxItems as string)
|
|
)
|
|
if undefined!=customCallback then
|
|
(
|
|
append codeString ("\n::" + customCallback + " " + (creator.name) as string + " "+varName+".selected @" + groupName + "@; ")
|
|
)
|
|
creator.addControl type varName "" paramStr:params
|
|
creator.addControl #checkbox checkBoxName "" paramStr:("width:10 align:#right checked:"+attributeValue.attrExportFlag as string)
|
|
-- print (varName +", "+attributeValue.attrExportFlag as string)
|
|
local handlerType = #changed
|
|
if type==#dropdownlist then
|
|
handlerType = #selected
|
|
|
|
append codeString (checkBoxName+".checked = true; ")
|
|
creator.addHandler varName handlerType paramStr:"val " codeStr:(codeString)
|
|
creator.addHandler checkBoxName #changed paramStr:"val " codeStr:("gFragTuner.setGroupExportFlag @"+groupName+"@ @"+attributeValue.attrName+"@ val")
|
|
)
|
|
|
|
fn ResetRollouts groupName = (
|
|
for r in RsFragTuner.rollouts do
|
|
(
|
|
try(
|
|
if findString r.name "RsTree"==undefined and
|
|
findString r.name "RsFrag"==undefined and
|
|
findString r.name "RsButton"==undefined then
|
|
(
|
|
-- format "Remove rollout: % [%]\n" r r.name
|
|
removeRollout r RsFragTuner
|
|
)
|
|
)catch()
|
|
)
|
|
|
|
local rolloutsToAdd = #()
|
|
|
|
if undefined!=gFragTuner.currHirarchyErrors then
|
|
(
|
|
-- local stream = stringstream ""
|
|
-- theClass = dotNetClass "System.Drawing.Color"
|
|
-- showMethods theClass to:stream
|
|
-- messagebox stream
|
|
-- theClass.fromARGB 255 0 0
|
|
rollout ErrorRollout "Hierarchy errors:"
|
|
(
|
|
dotNetControl f1 "System.Windows.Forms.Textbox" text:gFragTuner.currHirarchyErrors readonly:true multiline:true height:60
|
|
--edittext lbl "" text:gFragTuner.currHirarchyErrors readOnly:true height:32
|
|
|
|
on ErrorRollout open do
|
|
(
|
|
local sb = dotnetclass "System.Windows.Forms.ScrollBars"
|
|
f1.scrollbars = sb.both
|
|
)
|
|
)
|
|
append rolloutsToAdd ErrorRollout
|
|
)
|
|
|
|
-- search for groupNode
|
|
local rootGroup = gFragTuner.currFragGroup
|
|
-- if undefined!=RsButtonRoll then
|
|
-- (
|
|
-- if groupName==undefined then
|
|
-- ::RsButtonRoll.btnCreate.enabled = true
|
|
-- else
|
|
-- ::RsButtonRoll.btnCreate.enabled = false
|
|
-- )
|
|
|
|
if groupName==undefined then
|
|
(
|
|
return false
|
|
)
|
|
if gFragEditMode==#basic then
|
|
(
|
|
append rolloutsToAdd RsBasicEditRollout
|
|
return true
|
|
)
|
|
|
|
child = rolloutCreator "RsDynFragRoll" "Root fragment values"
|
|
child.begin()
|
|
local index=0
|
|
for c in gFragTuner.currFragRoot.groupValues do
|
|
(
|
|
local varName = c.attrName --"var"+index as string
|
|
local readableName = gRsFragAttribLUT.getValue c.attrName
|
|
if (undefined==readableName) then continue
|
|
case c.attrType of
|
|
(
|
|
#typeScalar:
|
|
(
|
|
addControlAndHandler child #spinner varName readableName (" type:#float range:[-100,100000,"+c.attrValue as string+"]") "fragments" c
|
|
)
|
|
#typeArray:
|
|
(
|
|
arrayVarName = varname+"a0"
|
|
addControlAndHandler child #label arrayVarName readableName "" "" c
|
|
arrayVarName = varname+"a1"
|
|
child.addControl #spinner arrayVarName "" paramStr:(" across:3 type:#float range:[-100,100000,"+c.attrValue[1] as string+"]")
|
|
child.addHandler arrayVarName #changed paramStr:"val " codeStr:("gFragTuner.setGroupValue @fragments@ @"+c.attrName+"@ val 1")
|
|
arrayVarName = varname+"a2"
|
|
child.addControl #spinner arrayVarName "" paramStr:(" type:#float range:[-100,100000,"+c.attrValue[2] as string+"]")
|
|
child.addHandler arrayVarName #changed paramStr:"val " codeStr:("gFragTuner.setGroupValue @fragments@ @"+c.attrName+"@ val 2")
|
|
arrayVarName = varname+"a3"
|
|
child.addControl #spinner arrayVarName "" paramStr:(" type:#float range:[-100,100000,"+c.attrValue[3] as string+"]")
|
|
child.addHandler arrayVarName #changed paramStr:"val " codeStr:("gFragTuner.setGroupValue @fragments@ @"+c.attrName+"@ val 3")
|
|
)
|
|
#typeBool:
|
|
(
|
|
addControlAndHandler child #checkbox varName readableName ("checked:"+c.attrValue as string) "fragments" c
|
|
)
|
|
#typeString:
|
|
(
|
|
local dataFunc = gRsFragAttribLUT.getDataFunc c.attrName
|
|
local data = dataFunc()
|
|
local selIndex = 1
|
|
if undefined!=data then
|
|
(
|
|
local foundInData = findItem data c.attrValue
|
|
if 0!=foundInData then selIndex = foundInData
|
|
)
|
|
local customCallback = gRsFragAttribLUT.getCallback c.attrName
|
|
addControlAndHandler child #dropdownlist varName readableName (" align:#right selection:"+selIndex as string) "fragments" c cmbBoxItems:data customCallback:customCallback
|
|
)
|
|
)
|
|
index+=1
|
|
)
|
|
child.end()
|
|
append rolloutsToAdd child.def
|
|
|
|
if groupName==undefined or groupName==gFragTuner.currFragRoot.groupName or gFragEditMode==#basic then return true
|
|
|
|
child = rolloutCreator "RsGroupRoll" "Current group values"
|
|
child.begin()
|
|
local index=0
|
|
local isInScaleGroup = false
|
|
for c in rootGroup.groupValues do
|
|
(
|
|
local varName = c.attrName --"var"+index as string
|
|
local readableName = gRsFragAttribLUT.getValue c.attrName
|
|
if (undefined==readableName) then continue
|
|
if matchPattern c.attrName pattern:"*scale" then
|
|
(
|
|
if not isInScaleGroup then
|
|
(
|
|
isInScaleGroup = true
|
|
child.addText "group @Damage Scales@ (" filter:true
|
|
)
|
|
)
|
|
else if isInScaleGroup then
|
|
(
|
|
child.addText ")"
|
|
isInScaleGroup = false
|
|
)
|
|
case c.attrType of
|
|
(
|
|
#typeScalar:
|
|
(
|
|
addControlAndHandler child #spinner varName readableName (" type:#float range:[-100,100000,"+c.attrValue as string+"]") groupName c
|
|
)
|
|
#typeArray:
|
|
(
|
|
arrayVarName = varname+"a0"
|
|
addControlAndHandler child #label arrayVarName readableName "" "" c
|
|
arrayVarName = varname+"a1"
|
|
child.addControl #spinner arrayVarName "" paramStr:(" across:3 type:#float range:[-100,100000,"+c.attrValue[1] as string+"]")
|
|
child.addHandler arrayVarName #changed paramStr:"val " codeStr:("gFragTuner.setGroupValue @"+groupName+"@ @"+c.attrName+"@ val 1")
|
|
arrayVarName = varname+"a2"
|
|
child.addControl #spinner arrayVarName "" paramStr:(" type:#float range:[-100,100000,"+c.attrValue[2] as string+"]")
|
|
child.addHandler arrayVarName #changed paramStr:"val " codeStr:("gFragTuner.setGroupValue @"+groupName+"@ @"+c.attrName+"@ val 2")
|
|
arrayVarName = varname+"a3"
|
|
child.addControl #spinner arrayVarName "" paramStr:(" type:#float range:[-100,100000,"+c.attrValue[3] as string+"]")
|
|
child.addHandler arrayVarName #changed paramStr:"val " codeStr:("gFragTuner.setGroupValue @"+groupName+"@ @"+c.attrName+"@ val 3")
|
|
)
|
|
#typeBool:
|
|
(
|
|
addControlAndHandler child #checkbox varName readableName ("checked:"+c.attrValue as string) groupName c
|
|
)
|
|
#typeString:
|
|
(
|
|
local dataFunc = gRsFragAttribLUT.getDataFunc c.attrName
|
|
local data = dataFunc()
|
|
local selIndex = 1
|
|
if undefined!=data then
|
|
(
|
|
local foundInData = findItem data c.attrValue
|
|
if 0!=foundInData then selIndex = foundInData
|
|
)
|
|
local customCallback = gRsFragAttribLUT.getCallback c.attrName
|
|
addControlAndHandler child #dropdownlist varName readableName (" align:#right selection:"+selIndex as string) groupName c cmbBoxItems:data customCallback:customCallback
|
|
)
|
|
)
|
|
index+=1
|
|
)
|
|
if isInScaleGroup then
|
|
(
|
|
child.addText ")"
|
|
isInScaleGroup = false
|
|
)
|
|
child.end()
|
|
append rolloutsToAdd child.def
|
|
|
|
local index=1
|
|
for c in rootGroup.childArray do
|
|
(
|
|
local readableName = gRsFragAttribLUT.getValue c.childValues[1].attrName
|
|
if (undefined==readableName) then continue
|
|
child = rolloutCreator ("Child"+(index as string)) ("Current group collision child "+(index as string))
|
|
-- Start creating the rollout
|
|
child.begin()
|
|
addControlAndHandler child #spinner "myEdit1" readableName (" type:#float range:[-100,100000,"+c.childValues[1].attrValue as string+"]") groupName c.childValues[1] childindex:index
|
|
|
|
readableName = gRsFragAttribLUT.getValue c.childValues[2].attrName
|
|
if (undefined==readableName) then continue
|
|
addControlAndHandler child #spinner "myEdit2" readableName (" type:#float range:[-100,100000,"+c.childValues[2].attrValue as string+"]") groupName c.childValues[2] childindex:index
|
|
child.end()
|
|
index+=1
|
|
append rolloutsToAdd child.def
|
|
)
|
|
|
|
for r in rolloutsToAdd do
|
|
addRollout r RsFragTuner
|
|
)
|
|
|
|
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- rollouts
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
rollout RsFragRoll "Fragment"
|
|
(
|
|
hyperlink hyperHelp "HELP?" color:(color 100 100 255) address:"https://devstar.rockstargames.com/wiki/index.php/Fragment_tuner" align:#right
|
|
editText edtFragName "Frag Name:"
|
|
|
|
on RsFragRoll open do (
|
|
callbacks.removeScripts id:#loadFrag
|
|
local script =
|
|
"gFragTuner.RefreshUI()"
|
|
callbacks.addscript #selectionSetChanged script id:#loadFrag
|
|
)
|
|
on RsFragRoll close do (
|
|
callbacks.removeScripts id:#loadFrag
|
|
)
|
|
|
|
fn setFragName newName =
|
|
(
|
|
edtFragName.text = newName
|
|
)
|
|
)
|
|
|
|
rollout RsButtonRoll "Update"
|
|
(
|
|
local values = #(#basic, #default, #verbose)
|
|
local buttwidth = 68
|
|
local buttwidth2 = 120
|
|
local buttwidth3 = 85
|
|
radiobuttons radioMode "Editing mode" labels:values columns:3 default:(findItem values gFragEditMode)
|
|
button btnCreate "Create/Reset Tune" across:2 width:buttwidth2
|
|
button btnUpdate "Save Tune" width:buttwidth2
|
|
group "Advanced"
|
|
(
|
|
checkbox checkReloadFile "Reload tune on select" checked:true
|
|
checkbox checkPrvntCollSel "Prevent collision selection" checked:true
|
|
label lblTickButts "Value export/copy selection" align:#left
|
|
button btnTickNone "Uncheck all" across:4 width:buttwidth
|
|
button btnTickAll "Check all" width:buttwidth
|
|
button btnTickDefault "Default" width:buttwidth
|
|
button btnTickInvert "Inverse" width:buttwidth
|
|
button btnCopy "Copy hierarchy" across:3 width:buttwidth3
|
|
checkbox checkCpyChilds "curr group" offset:[0,4] checked:(not gCpyChildren)
|
|
button btnPaste "Paste hierarchy" width:buttwidth3
|
|
)
|
|
|
|
on btnCreate pressed do (
|
|
local tunePath = gFragTuner.GetTunePath()
|
|
if doesFileExist tunePath then
|
|
(
|
|
if queryBox "Tune file already exists! This will delete it and create a new definition from scratch, which you will have to save." then
|
|
(
|
|
if not gRsPerforce.edit tunePath then
|
|
messagebox "Tune file could not be checked out." title:"Warning"
|
|
|
|
if not deleteFile tunePath then
|
|
(
|
|
messagebox "Tune file could not be deleted. If it's checked out, try restarting max." title:"Error!"
|
|
return false
|
|
)
|
|
)
|
|
else
|
|
return false
|
|
)
|
|
if not gFragTuner.CreateHierarachyFromNodes() then
|
|
return false
|
|
ResetRollouts gFragTuner.currFragGroup.groupName
|
|
if undefined!=RsTreeViewRoll then
|
|
RsTreeViewRoll.updateTV gFragTuner.currFragRoot gFragTuner.currFragGroup
|
|
)
|
|
|
|
on btnUpdate pressed do (
|
|
gFragTuner.WriteFragTuneData()
|
|
)
|
|
|
|
on btnTickNone pressed do (
|
|
gFragTuner.tickFragHierarchy #ticknone
|
|
)
|
|
on btnTickAll pressed do (
|
|
gFragTuner.tickFragHierarchy #tickall
|
|
)
|
|
on btnTickDefault pressed do (
|
|
gFragTuner.tickFragHierarchy #tickdefault
|
|
)
|
|
on btnTickInvert pressed do (
|
|
gFragTuner.tickFragHierarchy #tickinvert
|
|
)
|
|
|
|
-- on btnLoad pressed do (
|
|
-- local f = getOpenFileName caption:"Open A Test File:" filename:(RsProjectGetCommonDir()+"/data/fragments/")
|
|
-- if undefined!=f then
|
|
-- (
|
|
-- gFragTuner.ReadInAttrib f
|
|
-- gFragTuner.RefreshUI()
|
|
-- )
|
|
-- )
|
|
|
|
on checkReloadFile changed val do
|
|
(
|
|
gReloadFileMode = val
|
|
)
|
|
|
|
on checkPrvntCollSel changed val do
|
|
(
|
|
gPrvntCollSel = val
|
|
)
|
|
|
|
on checkCpyChilds changed val do
|
|
(
|
|
gCpyChildren = not val
|
|
)
|
|
|
|
on radioMode changed val do
|
|
(
|
|
gFragEditMode = values[val]
|
|
gFragTuner.PopulateFragTuner()
|
|
)
|
|
on btnCopy pressed do
|
|
(
|
|
gFragTuner.copyFragHierarchy()
|
|
)
|
|
on btnPaste pressed do
|
|
(
|
|
gFragTuner.PasteFragHierarchy()
|
|
)
|
|
)
|
|
|
|
rollout RsTreeViewRoll "Node hirarchy"
|
|
(
|
|
button buttLevelUp "select parent node" width:280 align:#center
|
|
dotNetControl tv "TreeView" width:280 height:200 align:#center
|
|
local currentSelected = undefined
|
|
|
|
fn addChildren theNode theChildren selected =
|
|
(
|
|
if not RsTreeViewRoll.open then return false
|
|
|
|
local bgColorClass = (dotNetclass "System.Drawing.Color")
|
|
local bgColor = bgColorClass.FromArgb 255 0 100 255
|
|
local fgColor = bgColorClass.FromArgb 255 255 255 255
|
|
for c in theChildren do
|
|
(
|
|
newNode = theNode.Nodes.add c.groupName
|
|
if selected.groupName==c.groupName then
|
|
(
|
|
newNode.backcolor = bgcolor
|
|
newNode.foreColor = fgColor
|
|
)
|
|
addChildren newNode c.groupArray selected
|
|
)
|
|
)
|
|
fn expandAll =
|
|
(
|
|
if not RsTreeViewRoll.open then return false
|
|
|
|
tv.ExpandAll()
|
|
)
|
|
fn updateTV root selected =
|
|
(
|
|
if not RsTreeViewRoll.open then return false
|
|
|
|
currentSelected = undefined
|
|
tv.Nodes.clear()
|
|
local theChildren = root.groupArray
|
|
if theChildren.count<=0 then return false
|
|
theRoot = tv.Nodes.add "ROOT"
|
|
rootNodes = for o in theChildren collect o --where o.parent == undefined
|
|
addChildren theRoot rootNodes selected
|
|
expandAll()
|
|
)
|
|
on tv Click arg do
|
|
(
|
|
hitNode = tv.GetNodeAt (dotNetObject "System.Drawing.Point" arg.x arg.y)
|
|
if hitNode != undefined and hitNode.Text!="ROOT" do
|
|
try(
|
|
local theNodes = getNodeByName (hitNode.Text+"_frag_") all:true
|
|
if(theNodes.count<=0) then
|
|
theNodes = getNodeByName (hitNode.Text) all:true
|
|
clearSelection()
|
|
for aNode in theNodes where gFragTuner.isObjInCurrHierarchy aNode do
|
|
(
|
|
selectMore aNode
|
|
)
|
|
)catch(print ("error selecting node"+(getCurrentException())))
|
|
)
|
|
|
|
on buttLevelUp pressed do
|
|
(
|
|
if selection[1]!=undefined and selection[1].parent!=undefined then
|
|
(
|
|
select selection[1].parent
|
|
)
|
|
)
|
|
|
|
fn reset =
|
|
(
|
|
if not RsTreeViewRoll.open then return false
|
|
|
|
tv.nodes.Clear()
|
|
)
|
|
)
|
|
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- invoking code
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
addRollout RsFragRoll RsFragTuner
|
|
addRollout RsTreeViewRoll RsFragTuner
|
|
addRollout RsButtonRoll RsFragTuner
|
|
gFragTuner.PopulateFragTuner() |