Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/heathaze/src/world_entities/script_trigger.cc @ 10764

Last change on this file since 10764 was 10287, checked in by snellen, 18 years ago

some fixes

File size: 8.8 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11### File Specific:
12   main-programmer: Silvan Nellen
13   co-programmer: ...
14*/
15
16
17#include "script_trigger.h"
18#include "script.h"
19
20#include "state.h"
21#include "debug.h"
22ObjectListDefinition(ScriptTrigger);
23
24CREATE_SCRIPTABLE_CLASS(ScriptTrigger,
25            // Coordinates
26                        addMethod("setAbsCoor", Executor3<PNode, lua_State*,float,float,float>(&PNode::setAbsCoor))
27                            ->addMethod("getAbsCoorX", Executor0ret<PNode, lua_State*, float>(&PNode::getAbsCoorX))
28                            ->addMethod("getAbsCoorY", Executor0ret<PNode, lua_State*, float>(&PNode::getAbsCoorY))
29                            ->addMethod("getAbsCoorZ", Executor0ret<PNode, lua_State*, float>(&PNode::getAbsCoorZ))
30            //Properties
31                            ->addMethod("setName", Executor1<BaseObject, lua_State*, const std::string&>(&BaseObject::setName))
32                            ->addMethod("setTarget", Executor1<ScriptTrigger, lua_State*, const std::string&>(&ScriptTrigger::setTarget))
33                            ->addMethod("setTriggerParent", Executor1<ScriptTrigger, lua_State*, const std::string&>(&ScriptTrigger::setTriggerParent))
34                            ->addMethod("setTriggerRemains", Executor1<ScriptTrigger, lua_State*, bool>(&ScriptTrigger::setTriggerRemains))
35                            ->addMethod("setActiveOnCreation", Executor1<ScriptTrigger, lua_State*, bool>(&ScriptTrigger::setActiveOnCreation))
36                            ->addMethod("setInvert", Executor1<ScriptTrigger, lua_State*, bool>(&ScriptTrigger::setInvert))
37                            ->addMethod("setRadius", Executor1<ScriptTrigger, lua_State*, float>(&ScriptTrigger::setRadius))
38                            ->addMethod("setScript", Executor1<ScriptTrigger, lua_State*, const std::string&>(&ScriptTrigger::setScript))
39                            ->addMethod("setFunction", Executor1<ScriptTrigger, lua_State*, const std::string&>(&ScriptTrigger::setFunction))
40                            ->addMethod("setDebugDraw", Executor1<ScriptTrigger, lua_State*, bool>(&ScriptTrigger::setDebugDraw))
41                            ->addMethod("setAddToScript", Executor1<ScriptTrigger, lua_State*, bool>(&ScriptTrigger::setAddToScript))
42             );
43
44
45/**
46 * Constructs a new ScriptTrigger.
47 * @param root the xml element to load the parameters from.
48 *
49 */
50ScriptTrigger::ScriptTrigger(const TiXmlElement* root)
51{
52  this->registerObject(this, ScriptTrigger::_objectList);
53  this->toList(OM_COMMON);
54
55  radius = 10;
56  returnCount = 1;
57  scriptFinished = false;
58  doDebugDraw = false;
59  invert = false;
60  scriptCalled = false;
61  scriptIsOk = false;
62  triggerRemains = true;
63  addToScript = false;
64  this->activeOnCreation = false;
65
66  if(root != NULL)
67  {
68
69    loadParams(root);
70
71    if(addToScript && scriptIsOk)
72    {
73      script->addObject( "ScriptTrigger", this->getName());
74    }
75
76  }
77
78}
79
80/**
81 * Deletes the ScriptTrigger.
82 *
83 */
84ScriptTrigger::~ScriptTrigger()
85{
86
87}
88
89/**
90 * Reads the values from the tml element and sets them.
91 * @param root the xml element to load the parameters from.
92 *
93 */
94void ScriptTrigger::loadParams(const TiXmlElement* root)
95{
96
97  WorldEntity ::loadParams(root);
98
99  LoadParam(root, "file", this, ScriptTrigger, setScript)
100      .describe("the fileName of the script, that should be triggered by this script trigger")
101      .defaultValues("");
102  LoadParam(root, "function", this, ScriptTrigger, setFunction)
103      .describe("the function of the script, that should be triggered by this script trigger")
104      .defaultValues("");
105  LoadParam(root, "abs-coor", this, ScriptTrigger, setAbsCoor)
106      .describe("where this script trigger should be located")
107      .defaultValues("");
108  LoadParam(root, "radius", this, ScriptTrigger, setRadius)
109      .describe("the fileName of the script, that should be triggered by this script trigger")
110      .defaultValues(0);
111  LoadParam(root, "delay", this, ScriptTrigger, setDelay)
112      .describe("the delay after which the funtion sould be triggered")
113      .defaultValues(0);
114  LoadParam(root, "worldentity", this, ScriptTrigger, setTarget)
115      .describe("The name of the target as it is in the *.oxw file")
116      .defaultValues("");
117  LoadParam(root, "triggerparent", this, ScriptTrigger, setTriggerParent)
118      .describe("The name of the parent as it is in the *.oxw file")
119      .defaultValues("");
120  LoadParam(root, "invert", this, ScriptTrigger, setInvert)
121      .describe("")
122      .defaultValues(false);
123  LoadParam(root, "triggerRemains", this, ScriptTrigger, setTriggerRemains)
124      .describe("")
125      .defaultValues(true);
126  LoadParam(root, "debugdraw", this, ScriptTrigger, setDebugDraw)
127      .describe("")
128      .defaultValues(false);
129  LoadParam(root, "addtoscript", this, ScriptTrigger, setAddToScript)
130      .describe("True if this scripttrigger should be aviable in the script")
131      .defaultValues(false);
132}
133
134
135/**
136 * Sets the target(a world entity) of the ScriptTrigger. If the distance between the target and this trigger is smaller than the radius, the script gets triggered.
137 * @param target The worldentity that the script supervises.
138 */
139void ScriptTrigger::setTarget(const std::string& target)
140{
141
142  WorldEntity* targetEntity = WorldEntity::objectList().getObject(target);
143  if (targetEntity != NULL)
144  {
145    this->setTarget(targetEntity);
146  }
147  else
148  {
149    PRINTF(2)("Target %s for %s::%s does not Exist\n", target.c_str(), this->getClassCName(), this->getCName());
150  }
151}
152
153/**
154 * Sets the parent of the trigger.
155 * @param parent The parrent.
156 */
157void ScriptTrigger::setTriggerParent(const std::string& parent)
158{
159  WorldEntity* parentEntity = WorldEntity::objectList().getObject(parent);
160
161  if (parentEntity != NULL)
162  {
163    this->setParent(parentEntity);
164    this->setParentMode(PNODE_MOVEMENT);
165  }
166  else
167  {
168    PRINTF(2)("Parent %s for %s::%s does not Exist\n", parent.c_str(), this->getClassCName(), this->getCName());
169  }
170}
171
172void ScriptTrigger::tick(float timestep)
173{
174  if(scriptFinished) return;
175
176  if(activeOnCreation)
177   {
178     executeAction(timestep);
179     return;
180   }
181
182  if(triggerRemains && scriptCalled)
183  {
184    executeAction(timestep);
185    return;
186  }
187
188  if( !invert && this->distance(target) < radius)
189  {
190  //  printf("Trigger position is: %f %f %f \n", this->getAbsCoor().x, this->getAbsCoor().y, this->getAbsCoor().z);
191  //  printf("Target position is: %f %f %f \n", this->target->getAbsCoor().x, this->target->getAbsCoor().y, this->target->getAbsCoor().z);
192    executeAction(timestep);
193    scriptCalled = true;
194    return;
195
196  }
197  else if( invert && this->distance(target) > radius)
198  {
199    executeAction(timestep);
200    scriptCalled = true;
201    return;
202  }
203 //else
204   //printf("SCRIPTTRIGGER: target out of range\n");
205
206}
207
208
209void ScriptTrigger::executeAction(float timestep)
210{
211
212  if(scriptIsOk)
213  {
214       //testScriptingFramework();
215    if(!(script->selectFunction(this->functionName,returnCount)) )
216      PRINT(1)("Error ScriptTrigger: Selection of %s in %s failed.\n",functionName.c_str(), script->getFileName().c_str());
217
218    script->pushParam( timestep, this->functionName);
219
220    if( !(script->executeFunction()) )
221      PRINT(1)("Error ScriptTrigger: Execution of %s in %s failed.\n",functionName.c_str(), script->getFileName().c_str());
222
223    scriptFinished = script->getReturnedBool();
224  }
225
226
227}
228
229
230void ScriptTrigger::setScript(const std::string& file)
231{
232  ScriptManager* scriptManager = State::getScriptManager();
233  if (scriptManager != NULL)
234  {
235
236    script = scriptManager->getScriptByFile(file);
237    if(script != NULL)
238    {
239      scriptIsOk = true;
240    }
241  }
242}
243
244/*
245 void ScriptTrigger::testScriptingFramework()
246{
247   std::string file("lunartest2.lua");
248   //get script
249   Script* script = State::getScriptManager()->getScriptByFile(file);
250   printf("-------------------------- top of the stack:%i\n",lua_gettop(script->getLuaState()));
251
252      //execute a function
253   printf("----------- main -----------\n");
254   std::string main("main");
255   if( script->selectFunction(main,3))
256     printf("function %s selected\n",main.c_str());
257
258   script->pushParam(3.14159,main);
259   printf("-------------------------- top of the stack:%i\n",lua_gettop(script->getLuaState()));
260   script->executeFunction();
261
262   int ret = script->getReturnedInt();
263   printf("main returned %i\n",ret);
264
265   if(script->getReturnedBool())
266     printf("main returned true\n");
267   else
268     printf("main returned false\n");
269
270   float retf = script->getReturnedFloat();
271   printf("main returned %f\n",retf);
272
273
274   printf("-------------------------- top of the stack:%i\n",lua_gettop(script->getLuaState()));
275      //execute a 2nd function
276   printf("----------- test -----------\n");
277   std::string test("test");
278   if( script->selectFunction(test,0))
279     printf("function %s selected\n",test.c_str());
280
281   script->executeFunction();
282
283
284      //if(argc>1) lua_dofile(script.getLuaState(), argv[1]);
285   printf("-------------------------- top of the stack:%i\n",lua_gettop(script->getLuaState()));
286
287}*/
Note: See TracBrowser for help on using the repository browser.