Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentationFS15/src/orxonox/controllers/ControllerDirector.cc @ 10499

Last change on this file since 10499 was 10499, checked in by maxima, 10 years ago

New XMLPort for ControllerDirector. The name of the script can now be set via XMLPort. Level scriptController plays the new Script 'presentation.lua'

  • Property svn:eol-style set to native
File size: 4.9 KB
Line 
1/*
2 * First try of a ControllerDirector. Target: An event occurs in the levelTry.oxw
3 * file, which is "heard" by an object of the type of this class. It then SHOULD
4 * (because it is not working) execute the party function.
5 */
6
7#include "ControllerDirector.h"
8#include "ScriptController.h"
9#include "core/CoreIncludes.h"
10
11//#include "network/NetworkFunction.h"
12
13#include "infos/HumanPlayer.h"
14#include "interfaces/PlayerTrigger.h"
15#include "worldentities/pawns/Pawn.h"
16#include "core/LuaState.h"
17
18
19namespace orxonox
20{
21    RegisterClass(ControllerDirector);
22
23    ControllerDirector::ControllerDirector(Context* context) : ArtificialController(context)
24    {
25        // Register the object with the framework
26        RegisterObject(ControllerDirector);
27
28        // output a message to ensure we know the constructor was run
29        orxout(verbose)<<"hello universe constructor blablub"<< endl;
30
31
32
33        // Initialize member variables
34        this->player_ = NULL;
35        this->entity_ = NULL;
36        this->pTrigger_ = NULL;
37        this->context_ = context;
38    }
39
40    void ControllerDirector::XMLPort(Element& xmlelement, XMLPort::Mode mode)
41    {
42        SUPER(ControllerDirector, XMLPort, xmlelement, mode);
43        XMLPortParam(ControllerDirector, "scriptname", setScriptName, getScriptName, xmlelement, mode).defaultValues("testscript");
44
45        orxout(verbose)<< "ControllerDirector::XMLPort " 
46          << "An instance of ControllerDirector has been created." << endl;
47    }
48
49    void ControllerDirector::XMLEventPort(Element& xmlelement, XMLPort::Mode mode)
50    {
51        // Call the xmleventport functions of the classes we derive from
52        SUPER(ControllerDirector, XMLEventPort, xmlelement, mode);
53
54        // Add an event sink for a "takeControl" event, which leads to the
55        // function takeControl() being called.
56        XMLPortEventSink(ControllerDirector, BaseObject, "takeControl", 
57          takeControl, xmlelement, mode);
58    }
59
60
61
62
63    void ControllerDirector::takeControl(Controller * controller, BaseObject * trigger) 
64    {
65       /* Output a message confirming that the function was called */
66       orxout(verbose)<<"test takecontrol."<< endl;
67
68       /* First, we set up a new controller to attach to the unit that
69        * triggered our event.
70        */
71       static int ctrlid = 1;
72       bool prepok = preparationToTakeControl(trigger);
73       if( prepok == true) 
74       {
75         /* Create a scriptcontroller object */
76         ScriptController *newctrl = new ScriptController(this->context_);
77
78         /* Make the player we were given its slave */
79         newctrl->setPlayer(this->player_);
80
81         /* Start controlling that object */
82         newctrl->takeControl(ctrlid);
83       }
84       else
85         return;
86
87       /* Set up a luastate to use for running the scripts */
88       LuaState * ls = new LuaState();
89       
90       /* Assemble a string to define a controller id variable in lua space */
91       std::stringstream tmp;
92       tmp << "newctrlid = " << ctrlid << endl;
93       std::string todo = tmp.str();
94       
95       /* Run the string using the luastate created earlier */
96       ls->doString(todo);
97
98       /* Now run the script on this controller. This will still have the above
99        * variable "newctrlid" defined, which means it can make use of it.
100        */
101       std::string scr = this->scriptname_ + ".lua";
102       ls->doFile(scr);
103
104       /* Increase the controller ID so we have a different one for
105        * the next time it is triggered */
106       ctrlid += 1;
107    } 
108
109    bool ControllerDirector::preparationToTakeControl(BaseObject * trigger) 
110    {
111        this->pTrigger_ = orxonox_cast<PlayerTrigger*>(trigger);
112        this->player_ = NULL;
113
114        orxout(verbose) << "Preparation to take Control!" << endl; 
115
116        // Check whether it is a player trigger and extract pawn from it
117        if(this->pTrigger_ != NULL)
118        {
119            // Get the object which triggered the event.
120            this->player_ = this->pTrigger_->getTriggeringPlayer(); 
121
122            // Check if there actually was a player returned.
123            if( this->player_ == NULL) return false;
124        }
125        else
126        {
127            orxout(verbose) << "ControllerDirector::preparationToTakeControl " 
128              << "Not a player trigger, can't extract pawn from it.." << endl;
129            return false;
130        }
131
132        this->entity_ = this->player_->getControllableEntity();
133        assert(this->entity_);
134
135        return true;
136    }
137
138    /* // Currently unused
139    void ControllerDirector::setNewController(Controller * controller) {
140
141
142        orxout() << "New Controller is going to be set!" << endl;
143
144        this->entity_->setDestroyWhenPlayerLeft(false);
145        this->player_->pauseControl();
146        this->entity_->setController(controller);
147        this->player_->startControl(this->entity_);
148        //this->setControllableEntity(this->entity_);
149    }
150    */
151       
152   
153
154}
155
156
157
158
Note: See TracBrowser for help on using the repository browser.