diff --git a/direct/src/task/Task.py b/direct/src/task/Task.py index c1847dbd6e..b8624d0b3f 100644 --- a/direct/src/task/Task.py +++ b/direct/src/task/Task.py @@ -410,8 +410,10 @@ class TaskManager: return task def __setupTask(self, funcOrTask, name, priority, sort, extraArgs, taskChain, appendTask, owner, uponDeath): + wasTask = False if isinstance(funcOrTask, AsyncTask): task = funcOrTask + wasTask = True elif hasattr(funcOrTask, '__call__') or \ hasattr(funcOrTask, 'cr_await') or \ isinstance(funcOrTask, types.GeneratorType): @@ -427,8 +429,14 @@ class TaskManager: if hasattr(task, 'setArgs'): # It will only accept arguments if it's a PythonTask. if extraArgs is None: - extraArgs = [] - appendTask = True + if wasTask: + extraArgs = task.getArgs() + #do not append the task to an existing task. It was already there + #from the last time it was addeed + appendTask = False + else: + extraArgs = [] + appendTask = True task.setArgs(extraArgs, appendTask) elif extraArgs is not None: self.notify.error( diff --git a/tests/task/test_task_arg.py b/tests/task/test_task_arg.py new file mode 100644 index 0000000000..4243c44f2b --- /dev/null +++ b/tests/task/test_task_arg.py @@ -0,0 +1,28 @@ +from direct.showbase.ShowBase import ShowBase +from direct.task import Task +from panda3d.core import Vec2 + +def test_task_arg(): + def test(ship, flood, task): + ship.y += flood + return task.done + + ship = Vec2(2.2, 2) + flood = 1 + + base = ShowBase(windowType='none') + task = base.addTask(test, 'test_task', extraArgs=[ship, flood], appendTask=True) + base.taskMgr.step() + assert ship.y == 3 + base.remove_task(task) + task = base.addTask(task) + base.taskMgr.step() + assert ship.y == 4 + task = base.taskMgr.add(test, 'test_task', extraArgs=[ship, flood], appendTask=True) + base.taskMgr.step() + assert ship.y == 5 + base.remove_task(task) + task = base.taskMgr.add(task) + base.taskMgr.step() + assert ship.y == 6 + \ No newline at end of file