ScriptSpot

Forum topic · General Scripting

Error "Call needs function or class"

By jetaman · 2016-10-16

Description

Hello. I am using a script to import animation, but I always get this error "Type error: Call needs function or class, got: undefined". Please help me someone to fix it.

/*
Import Diablo III Animation
Written by Taylor Mouse (c) 04.2014
Added config possibilities
Added Reaper Of Souls Animations
*/
ClearListener()

global startFrame = 10
global d
global configFile = ((GetDir #plugcfg) + "\\d3.config")

/************************************************************************************************
STRUCTS
************************************************************************************************/
struct D3Bone ( ID, Name, TheBone )
struct TranslationAnimation ( BoneId, KeyFrame, Position )
struct RotationAnimation (BoneId, KeyFrame, Quaternion )
struct ScaleAnimation (BoneId, KeyFrame, Scaling )

/************************************************************************************************
HELPER FUNCTIONS
************************************************************************************************/
fn ReadBytes stream val =
(
for i=1 to val do ReadByte stream
)

fn ReadFixedString stream val =
(
local str = ""
for i=1 to val do
(
s= bit.IntAsChar(ReadByte stream)

if(s!="\0") then str+=s
)
return str
)

fn SetWorldRotation theNode theRot =
(
local matrix = transmatrix theNode.transform.pos
in coordsys matrix (theNode.rotation = theRot)
)

/************************************************************************************************
MAIN METHOD
************************************************************************************************/
function ReadAniFile file =
(
d = GetNodeByName "Animations"
if(d==undefined) then d = dummy pos:[0,0,0] Scale:[0.5,0.5,0.5] name:"Animations"

hide d

startingFrame = 0
startingFrame = startFrame

SetUserProp d ((GetFileNameFile file) + " START") (startingFrame as string)

Format " START READING ANIMATION FILE"

stream = fOpen file "rb" -- Open the file for reading

ReadBytes stream 76 -- Skip 76 bytes

animationName = ReadFixedString stream 64 -- Animation name

ReadBytes stream 52 -- Skip 52 bytes

nBones = ReadLong stream -- number of bones
offBones = ReadLong stream -- data for the bones
sizeBones = ReadLong stream -- size in bytes of the bones

ReadBytes stream 12 -- Skip 12 bytes

totalFrames = ReadLong stream -- total frames in this animation

SetUserProp d ((GetFileNameFile file) + " END") ((startingFrame + totalFrames) as string)

offTranslation = ReadLong stream -- data for translation animation
sizeTranslation = ReadLong stream -- size of the translation animation data

ReadBytes stream 12 -- Skip 12 bytes

offRotation = ReadLong stream -- data for the rotations
sizeRotation = ReadLong stream -- size of the rotation data

ReadBytes stream 8 -- Skip 8 bytes

offScale = ReadLong stream -- data for the scaling
sizeScale = ReadLong stream -- size for the scaling data

ReadBytes stream 208 -- Skip 208 bytes

xan = ReadFixedString stream 256 -- always 0000.xan
source = ReadFixedString stream 256 -- initial location of this file

/* BONES */
fSeek stream ( offBones + 16 ) #seek_set -- jump to the bone data position
allBones = #()
for i=1 to nBones do
(
b = D3Bone()
b.ID = i --> for reference only
b.Name = ReadFixedString stream 64 -- name of the bone
b.TheBone = GetNodeByName b.Name -- find the bone in the scene
append allBones b
)
--print allBones

/* Frame data*/
nFrameData = #()
offFrameData = #()
sizeFrameData = #()

/* TRANSLATION */
fSeek stream ( offTranslation + 16 ) #seek_set
for i=1 to nBones do -- get the offset of where the translation data is stored
(
append nFrameData (ReadLong stream)
append offFrameData (ReadLong stream)
append sizeFrameData (ReadLong stream)
ReadBytes stream 12 -- always 00 00 00 00 - 00 00 00 00 - 00 00 00 00 ?
)

allTranslations = #()
for i=1 to nBones do -- Read the translation data structure
(
fSeek stream ( offFrameData[i] + 16 ) #seek_set

for fd=1 to nFrameData[i] do
(
tran = TranslationAnimation()
tran.BoneId = i
tran.KeyFrame = ReadLong stream

boneY = ReadFloat stream * -17
boneX = ReadFloat stream * 17
boneZ = ReadFloat stream * 17

tran.Position = [boneX,boneY,boneZ]

--tran.Position = [ReadFloat stream, ReadFloat stream, ReadFloat stream]

append allTranslations tran
)
)
--print allTranslations

/* Reset Frame data*/
nFrameData = #()
offFrameData = #()
sizeFrameData = #()

/* ROTATION */
fSeek stream ( offRotation + 16 ) #seek_set
for i=1 to nBones do -- get the offset of where the translation data is stored
(
append nFrameData (ReadLong stream)
append offFrameData (ReadLong stream)
append sizeFrameData (ReadLong stream)
ReadBytes stream 12 -- always 00 00 00 00 - 00 00 00 00 - 00 00 00 00 ?
)

allRotations = #()
for i=1 to nBones do -- Read the rotation data structure
(
fSeek stream ( offFrameData[i] + 16 ) #seek_set

for fd=1 to nFrameData[i] do
(
rot = RotationAnimation()
rot.BoneId = i
rot.KeyFrame = ReadLong stream
y = (ReadShort stream #signed) / -32767.0
x = (ReadShort stream #signed) / 32767.0
z = (ReadShort stream #signed) / 32767.0
w = (ReadShort stream #signed) / 32767.0

rot.Quaternion = quat x y z w

append allRotations rot
)
)
--print allRotations

/* Reset Frame data*/
nFrameData = #()
offFrameData = #()
sizeFrameData = #()

/* SCALE */
fSeek stream ( offScale + 16 ) #seek_set
for i=1 to nBones do -- get the offset of where the scaling data is stored
(
append nFrameData (ReadLong stream)
append offFrameData (ReadLong stream)
append sizeFrameData (ReadLong stream)
ReadBytes stream 12
)

allScaling = #()
for i=1 to nBones do -- Read the scale data structure
(
fSeek stream ( offFrameData[i] + 16 ) #seek_set

for fd=1 to nFrameData[i] do
(
s = ScaleAnimation()
s.BoneId = i
s.KeyFrame = ReadLong stream
s.Scaling = ReadFloat stream

append allScaling s
)
)
--print allScaling

echo " APPLYING ANIMATION TO THE BONES \n"

-- TODO: get the last used animation key, so we can add multiple animations to the scene

--Apply the Rotation
prevQ = quat 1 -- set a starting rotation
prevB = 1
for i=1 to allRotations.count do
(
b = allBones[allRotations[i].BoneId].TheBone
if(b == undefined) then continue

t = allRotations[i].KeyFrame + startingFrame
q = allRotations[i].Quaternion

with animate on
(
at time t (
b.assumeskinpose()
local mtrx = matrix3 1
rotate mtrx (inverse q)
mtrx.row4 = b.pos
if b.parent != undefined then(
mtrx = mtrx * b.parent.transform
)
b.transform = mtrx
deleteKey b.position.controller (numKeys b.position.controller)
deleteKey b.scale.controller (numKeys b.scale.controller)
)
)

)

-- Apply the Translation
for i=1 to allTranslations.count do
(
b = allBones[allTranslations[i].BoneId].TheBone
t = allTranslations[i].KeyFrame + startingFrame
pos = allTranslations[i].Position

if(b!=undefined) then
(
with animate on
at time t
in coordsys parent b.position = pos
)
)

-- Apply the Scaling
for i=1 to allScaling.count do
(
b = allBones[allScaling[i].BoneId].TheBone
scaling = point3 allScaling[i].Scaling allScaling[i].Scaling allScaling[i].Scaling
t = allScaling[i].KeyFrame + startingFrame

if( b!=undefined) then (
with animate on
at time t
in coordsys parent b.Scale = scaling
)
)

fClose stream

startFrame += totalFrames + 50
ECHO " DONE"
)

/************************************************************************************************
UTILITY
************************************************************************************************/
Utility Diablo3AniImport "Diablo 3 Animation Import"
(
Group "Animation File"
(
Button bSelectAniFile "..."
EditText txtSelectedFile
Label lbl01 "Start at frame"
EditText txtFrame text:"10"
Button bGo "Import..." height:35 width:100
)
On bSelectAniFile PRESSED do
(
file = getOpenFileName \
caption:"Diablo 3 Animation File" \
types:"Diablo 3 Animation File(*.ani)|*.ani" \
historyCategory:"Diablo3AnimationPresets"

if(file!=undefined ) then txtSelectedFile.Text = file

)

On bGo PRESSED do
(
if(txtSelectedFile.text != undefined and (DoesFileExist txtSelectedFile.text == true )) then
(
startFrame = txtFrame.Text as float

ReadAniFile txtSelectedFile.text
)
)
)

Comments (1)

`

pixamoon · 2016-10-21

hi, let me know which line of code is generating an error? It's long code to check.

It should be selected by error and written in Listener when error is generated.