Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/cleanup/src/world_entities/script_trigger.cc @ 10590

Last change on this file since 10590 was 10585, checked in by snellen, 18 years ago

Removed classes Account and Object (both needed only to test the scriptingframework)and removed example.cc, cleaned commented code in script_trigger.cc and gameworld.cc. … more to come

File size: 7.5 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  target = NULL;
66
67  if(root != NULL)
68  {
69
70    loadParams(root);
71
72    if(addToScript && scriptIsOk)
73    {
74      script->addObject( "ScriptTrigger", this->getName());
75    }
76
77  }
78
79}
80
81/**
82 * Deletes the ScriptTrigger.
83 *
84 */
85ScriptTrigger::~ScriptTrigger()
86{
87
88}
89
90/**
91 * Reads the values from the tml element and sets them.
92 * @param root the xml element to load the parameters from.
93 *
94 */
95void ScriptTrigger::loadParams(const TiXmlElement* root)
96{
97
98  WorldEntity ::loadParams(root);
99
100  LoadParam(root, "file", this, ScriptTrigger, setScript)
101      .describe("the fileName of the script, that should be triggered by this script trigger")
102      .defaultValues("");
103  LoadParam(root, "function", this, ScriptTrigger, setFunction)
104      .describe("the function of the script, that should be triggered by this script trigger")
105      .defaultValues("");
106  LoadParam(root, "abs-coor", this, ScriptTrigger, setAbsCoor)
107      .describe("where this script trigger should be located")
108      .defaultValues("");
109  LoadParam(root, "radius", this, ScriptTrigger, setRadius)
110      .describe("the fileName of the script, that should be triggered by this script trigger")
111      .defaultValues(0);
112  LoadParam(root, "delay", this, ScriptTrigger, setDelay)
113      .describe("the delay after which the funtion sould be triggered")
114      .defaultValues(0);
115  LoadParam(root, "worldentity", this, ScriptTrigger, setTarget)
116      .describe("The name of the target as it is in the *.oxw file")
117      .defaultValues("");
118  LoadParam(root, "triggerparent", this, ScriptTrigger, setTriggerParent)
119      .describe("The name of the parent as it is in the *.oxw file")
120      .defaultValues("");
121  LoadParam(root, "invert", this, ScriptTrigger, setInvert)
122      .describe("")
123      .defaultValues(false);
124  LoadParam(root, "triggerRemains", this, ScriptTrigger, setTriggerRemains)
125      .describe("")
126      .defaultValues(true);
127  LoadParam(root, "debugdraw", this, ScriptTrigger, setDebugDraw)
128      .describe("")
129      .defaultValues(false);
130  LoadParam(root, "addtoscript", this, ScriptTrigger, setAddToScript)
131      .describe("True if this scripttrigger should be aviable in the script")
132      .defaultValues(false);
133}
134
135
136/**
137 * 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.
138 * @param target The worldentity that the script supervises.
139 */
140void ScriptTrigger::setTarget(const std::string& target)
141{
142
143  WorldEntity* targetEntity = WorldEntity::objectList().getObject(target);
144  if (targetEntity != NULL)
145  {
146    this->setTarget(targetEntity);
147  }
148  else
149  {
150    PRINTF(2)("ERROR SCRTIPTTRIGGER : Target %s for %s::%s does not Exist\n", target.c_str(), this->getClassCName(), this->getCName());
151  }
152}
153
154/**
155 * Sets the parent of the trigger.
156 * @param parent The parrent.
157 */
158void ScriptTrigger::setTriggerParent(const std::string& parent)
159{
160  WorldEntity* parentEntity = WorldEntity::objectList().getObject(parent);
161
162  if (parentEntity != NULL)
163  {
164    this->setParent(parentEntity);
165    this->setParentMode(PNODE_MOVEMENT);
166  }
167  else
168  {
169    PRINTF(2)("ERROR SCRTIPTTRIGGER : Parent %s for %s::%s does not Exist\n", parent.c_str(), this->getClassCName(), this->getCName());
170  }
171}
172
173void ScriptTrigger::tick(float timestep)
174{
175  if(scriptFinished) return;
176
177  if(activeOnCreation)
178   {
179     executeAction(timestep);
180     return;
181   }
182
183 if(triggerRemains && scriptCalled)
184  {
185    executeAction(timestep);
186    return;
187  }
188
189  if( this->target != NULL)
190  {
191    if( !invert && this->distance(target) < radius)
192    {
193    //printf("Distance is %f \n", this->distance(target));
194    executeAction(timestep);
195    scriptCalled = true;
196    return;
197
198    }
199    else if( invert && this->distance(target) > radius)
200    {
201      executeAction(timestep);
202      scriptCalled = true;
203      return;
204    }
205  }
206}
207
208
209void ScriptTrigger::executeAction(float timestep)
210{
211  if(scriptIsOk)
212  {
213       //testScriptingFramework();
214    if(!(script->selectFunction(this->functionName,returnCount)) )
215      PRINT(1)("ERROR SCRTIPTTRIGGER : Selection of %s in %s failed.\n",functionName.c_str(), script->getFileName().c_str());
216
217    script->pushParam( timestep, this->functionName);
218
219    if( !(script->executeFunction()) )
220      PRINT(1)("ERROR SCRTIPTTRIGGER : Execution of %s in %s failed.\n",functionName.c_str(), script->getFileName().c_str());
221
222    scriptFinished = script->getReturnedBool();
223  }
224  else
225  printf("ERROR SCRTIPTTRIGGER : Script could not be executed !\n");
226
227
228}
229
230
231void ScriptTrigger::setScript(const std::string& file)
232{
233  ScriptManager* scriptManager = State::getScriptManager();
234  if (scriptManager != NULL)
235  {
236
237    script = scriptManager->getScriptByFile(file);
238    if(script != NULL)
239    {
240      scriptIsOk = true;
241    }
242    else
243    printf("ERROR SCRTIPTTRIGGER : Could not find the wrapperobject of %s , the script won't be executed ! \n", file.c_str());
244  }
245}
Note: See TracBrowser for help on using the repository browser.