Advertisement
Kalashnikov

Untitled

Oct 3rd, 2011
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 19.12 KB | None | 0 0
  1. #ifndef SCRIPTENGINE_H
  2. #define SCRIPTENGINE_H
  3.  
  4. #include <QtCore>
  5. #include <QTextEdit>
  6.  
  7. #include <QtScript>
  8.  
  9. #include <QScriptValueIterator>
  10.  
  11. #include <QNetworkAccessManager>
  12. #include <QNetworkRequest>
  13. #include <QNetworkReply>
  14.  
  15. #include "../PokemonInfo/pokemonstructs.h"
  16. #include "sessiondatafactory.h"
  17. #include "scriptdb.h"
  18.  
  19. class Server;
  20. class ChallengeInfo;
  21.  
  22. class ScriptEngine : public QObject
  23. {
  24.     Q_OBJECT
  25. public:
  26.     ScriptEngine(Server *s);
  27.     ~ScriptEngine();
  28.  
  29.     /* Events */
  30.  
  31.     bool beforeSpectateBattle(int src, int p1, int p2);
  32.     void afterSpectateBattle(int src, int p1, int p2);
  33.     bool attemptToSpectateBattle(int src, int p1, int p2);
  34.     void stepEvent();
  35.  
  36.     bool beforeChatMessage(int src, const QString &message, int channel);
  37.     void afterChatMessage(int src, const QString &message, int channel);
  38.     bool beforeNewMessage(const QString &message);
  39.     void afterNewMessage(const QString &message);
  40.     void serverStartUp();
  41.     void serverShutDown();
  42.     void beforeLogOut(int src);
  43.     void afterLogOut(int src);
  44.     bool beforeLogIn(int src);
  45.     void afterLogIn(int src);
  46.     bool beforeChannelCreated(int channelid, const QString &channelname, int playerid);
  47.     void afterChannelCreated(int channelid, const QString &channelname, int playerid);
  48.     bool beforeChannelDestroyed(int channelid);
  49.     void afterChannelDestroyed(int channelid);
  50.     bool beforeChannelJoin(int src, int channelid);
  51.     void afterChannelJoin(int src, int channelid);
  52.     void beforeChannelLeave(int src, int channelid);
  53.     void afterChannelLeave(int src, int channelid);
  54.     void beforeChangeTeam(int src);
  55.     void afterChangeTeam(int src);
  56.     bool beforeChangeTier(int src, const QString& oldTier, const QString &newTier);
  57.     void afterChangeTier(int src, const QString& oldTier, const QString &newTier);
  58.     bool beforeChallengeIssued(int src, int dest, const ChallengeInfo &desc);
  59.     void afterChallengeIssued(int src, int dest, const ChallengeInfo &desc);
  60.     bool beforeBattleMatchup(int src, int dest, const ChallengeInfo &desc);
  61.     void afterBattleMatchup(int src, int dest, const ChallengeInfo &desc);
  62.     void beforeBattleStarted(int src, int dest, const ChallengeInfo &desc, int battleid);
  63.     void afterBattleStarted(int winner, int loser, const ChallengeInfo &desc, int battleid);
  64.     void beforeBattleEnded(int winner, int loser, int desc, int battleid);
  65.     void afterBattleEnded(int winner, int loser, int desc, int battleid);
  66.     bool beforePlayerAway(int src, bool away);
  67.     void afterPlayerAway(int src, bool away);
  68.     bool beforePlayerKick(int src, int dest);
  69.     void afterPlayerKick(int src, int dest);
  70.     bool beforePlayerBan(int src, int dest);
  71.     void afterPlayerBan(int src, int dest);
  72.     void battleSetup(int src, int dest, int battleId);
  73.  
  74.     /* Functions called in scripts */
  75.     Q_INVOKABLE void sendAll(const QString &mess);
  76.     Q_INVOKABLE void sendHtmlAll(const QString &mess);
  77.     Q_INVOKABLE void sendAll(const QString &mess, int channel);
  78.     Q_INVOKABLE void sendHtmlAll(const QString &mess, int channel);
  79.     Q_INVOKABLE void kick(int id);
  80.     Q_INVOKABLE void kick(int playerid, int chanid);
  81.     /* If you edited his team, updates it for the rest of the world */
  82.     Q_INVOKABLE void updatePlayer(int playerid);
  83.     Q_INVOKABLE void putInChannel(int playerid, int chanid);
  84.     Q_INVOKABLE QScriptValue createChannel(const QString &channame);
  85.     Q_INVOKABLE QScriptValue getAnnouncement();
  86.     Q_INVOKABLE QScriptValue getColor(int id);
  87.     Q_INVOKABLE void setAnnouncement(const QString &html, int id);
  88.     Q_INVOKABLE void setAnnouncement(const QString &html);
  89.     Q_INVOKABLE void changeAnnouncement(const QString &html);
  90.     Q_INVOKABLE void makeServerPublic(bool isPublic);
  91.  
  92.     // Q_INVOKABLE void setTimer(int ms); // Causes crash
  93.  
  94.     /* Prevents the event from happening.
  95.        For exemple, if called in 'beforeChatMessage', the message won't appear.
  96.        If called in 'beforeChallengeIssued', the challenge won't be issued.
  97.        */
  98.     Q_INVOKABLE void stopEvent();
  99.  
  100.     Q_INVOKABLE void shutDown();
  101.     Q_INVOKABLE void sendMessage(int id, const QString &mess);
  102.     Q_INVOKABLE void sendMessage(int id, const QString &mess, int channel);
  103.     Q_INVOKABLE void sendHtmlMessage(int id, const QString &mess);
  104.     Q_INVOKABLE void sendHtmlMessage(int id, const QString &mess, int channel);
  105.     /* Print on the server. Useful for debug purposes */
  106.     Q_INVOKABLE void print(QScriptContext *context, QScriptEngine *engine);
  107.     Q_INVOKABLE void clearPass(const QString &name);
  108.     Q_INVOKABLE void changeAuth(int id, int auth);
  109.     Q_INVOKABLE void changeDbAuth(const QString &name, int auth);
  110.     Q_INVOKABLE void changeAway(int id, bool away);
  111.     Q_INVOKABLE void changeRating(const QString& name, const QString& tier, int newRating);
  112.     Q_INVOKABLE void changePokeLevel(int id, int slot, int level);
  113.     Q_INVOKABLE void changePokeNum(int id, int slot, int num);
  114.     Q_INVOKABLE void changePokeItem(int id, int slot, int item);
  115.     Q_INVOKABLE void changePokeMove(int id, int pokeslot, int moveslot, int move);
  116.     Q_INVOKABLE void changePokeGender(int id, int pokeslot, int gender);
  117.     Q_INVOKABLE void changePokeName(int id, int pokeslot, const QString &name);
  118.     Q_INVOKABLE void changeTier(int id, const QString &tier);
  119.     Q_INVOKABLE void reloadTiers();
  120.     /* Export the SQL databases to old style txt files */
  121.     Q_INVOKABLE void exportMemberDatabase();
  122.     Q_INVOKABLE void exportTierDatabase();
  123.     /* Updates the rankings. Very time consuming, be aware... ! */
  124.     Q_INVOKABLE void updateRatings();
  125.     /* Resets a tier's ladders */
  126.     Q_INVOKABLE void resetLadder(const QString &tier);
  127.     Q_INVOKABLE void synchronizeTierWithSQL(const QString &tier);
  128.  
  129.     Q_INVOKABLE void clearChat();
  130.     /* Accepts string as 1st parameter. */
  131.     Q_INVOKABLE void callLater(const QString &s, int delay);
  132.     Q_INVOKABLE void callQuickly(const QString &s, int delay);
  133.     /* Accepts function as 1st parameter. */
  134.     Q_INVOKABLE void delayedCall(const QScriptValue &func, int delay);
  135.     /* Evaluates the script given in parameter */
  136.     Q_INVOKABLE QScriptValue eval(const QString &script);
  137.     Q_INVOKABLE void setPA(const QString &name);
  138.     Q_INVOKABLE void unsetPA(const QString &name);
  139.  
  140.     Q_INVOKABLE QScriptValue channelIds();
  141.     Q_INVOKABLE QScriptValue channel(int id);
  142.     Q_INVOKABLE QScriptValue channelId(const QString &name);
  143.     Q_INVOKABLE QScriptValue channelsOfPlayer(int playerid);
  144.     Q_INVOKABLE QScriptValue playersOfChannel(int channelid);
  145.     Q_INVOKABLE bool existChannel(const QString &channame);
  146.     Q_INVOKABLE bool isInChannel(int playerid, int channelid);
  147.     Q_INVOKABLE bool isInSameChannel(int player1, int player2);
  148.  
  149.     Q_INVOKABLE QScriptValue playerIds();
  150.     Q_INVOKABLE QScriptValue name(int id);
  151.     Q_INVOKABLE QScriptValue id(const QString& name);
  152.     Q_INVOKABLE QScriptValue auth(int id);
  153.     Q_INVOKABLE QScriptValue battling(int id);
  154.     Q_INVOKABLE QScriptValue away(int id);
  155.     Q_INVOKABLE QScriptValue ip(int id);
  156.     Q_INVOKABLE QScriptValue proxyIp(int id);
  157.     Q_INVOKABLE QScriptValue gen(int id);
  158.     Q_INVOKABLE QScriptValue dbAuth(const QString &name);
  159.     Q_INVOKABLE QScriptValue dbAuths();
  160.     Q_INVOKABLE QScriptValue dbAll();
  161.     Q_INVOKABLE QScriptValue dbIp(const QString &name);
  162.     Q_INVOKABLE QScriptValue dbDelete(const QString &name);
  163.     Q_INVOKABLE QScriptValue dbLastOn(const QString &name);
  164.     Q_INVOKABLE bool dbRegistered(const QString &name);
  165.     Q_INVOKABLE QScriptValue tier(int id);
  166.     Q_INVOKABLE QScriptValue ranking(int id);
  167.     Q_INVOKABLE QScriptValue ratedBattles(int id);
  168.     Q_INVOKABLE QScriptValue ranking(const QString &name, const QString &tier);
  169.     Q_INVOKABLE QScriptValue ratedBattles(const QString &name, const QString &tier);
  170.     Q_INVOKABLE int maxAuth(const QString &ip);
  171.     Q_INVOKABLE QScriptValue aliases(const QString &ip);
  172.     Q_INVOKABLE QScriptValue totalPlayersByTier(const QString &tier);
  173.     Q_INVOKABLE QScriptValue ladderEnabled(int id);
  174.     Q_INVOKABLE QScriptValue ladderRating(int id, const QString &tier = QString());
  175.     /* returns a state of the memory, useful to check for memory leaks and memory usage */
  176.     Q_INVOKABLE QScriptValue memoryDump();
  177.     Q_INVOKABLE bool hasLegalTeamForTier(int id, const QString &tier);
  178.     Q_INVOKABLE void changeName(int playerId, QString newName);
  179.     Q_INVOKABLE void changeInfo(int playerId, QString newInfo);
  180.     Q_INVOKABLE QScriptValue info(int playerId);
  181.     Q_INVOKABLE void changeAvatar(int playerId, quint16 avatarId);
  182.     Q_INVOKABLE QScriptValue avatar(int playerId);
  183.  
  184.     Q_INVOKABLE QScriptValue pokemon(int num);
  185.     Q_INVOKABLE QScriptValue pokeNum(const QString &name);
  186.     Q_INVOKABLE QScriptValue move(int num);
  187.     Q_INVOKABLE QScriptValue moveNum(const QString &name);
  188.     Q_INVOKABLE QScriptValue item(int num);
  189.     Q_INVOKABLE QScriptValue itemNum(const QString &item);
  190.     Q_INVOKABLE QScriptValue nature(int num);
  191.     Q_INVOKABLE QScriptValue natureNum(const QString &nature);
  192.     Q_INVOKABLE QScriptValue ability(int num);
  193.     Q_INVOKABLE QScriptValue abilityNum(const QString &nature);
  194.     Q_INVOKABLE QScriptValue genderNum(QString genderName);
  195.     Q_INVOKABLE QString gender(int genderNum);
  196.  
  197.     Q_INVOKABLE QScriptValue teamPokeLevel(int id, int slot);
  198.     Q_INVOKABLE QScriptValue teamPoke(int id, int index);
  199.     Q_INVOKABLE bool hasTeamPoke(int id, int pokemonnum);
  200.     Q_INVOKABLE QScriptValue indexOfTeamPoke(int id, int pokenum);
  201.     Q_INVOKABLE bool hasDreamWorldAbility(int id, int slot);
  202.     Q_INVOKABLE bool compatibleAsDreamWorldEvent(int id, int slot);
  203.  
  204.     Q_INVOKABLE QScriptValue teamPokeMove(int id, int pokeindex, int moveindex);
  205.     Q_INVOKABLE bool hasTeamPokeMove(int id, int pokeindex, int movenum);
  206.     Q_INVOKABLE QScriptValue indexOfTeamPokeMove(int id, int pokeindex, int movenum);
  207.     Q_INVOKABLE bool hasTeamMove(int id, int movenum);
  208.  
  209.     Q_INVOKABLE QScriptValue teamPokeItem(int id, int pokeindex);
  210.     Q_INVOKABLE bool hasTeamItem(int id, int itemNum);
  211.  
  212.     Q_INVOKABLE QScriptValue teamPokeNature(int id, int slot);
  213.     Q_INVOKABLE QScriptValue teamPokeEV(int id, int slot, int stat);
  214.     Q_INVOKABLE QScriptValue teamPokeDV(int id, int slot, int stat);
  215.     Q_INVOKABLE void setTeamPokeDV(int id, int slot, int stat, int newValue);
  216.     Q_INVOKABLE void changeTeamPokeIV(int id, int slot, int stat, int newValue);
  217.     Q_INVOKABLE void changeTeamPokeEV(int id, int slot, int stat, int newValue);
  218.  
  219.     Q_INVOKABLE int numPlayers();
  220.     Q_INVOKABLE bool loggedIn(int id);
  221.  
  222.     Q_INVOKABLE int rand(int min, int max);
  223.     Q_INVOKABLE long time();
  224.     Q_INVOKABLE QScriptValue getTierList();
  225.  
  226.     Q_INVOKABLE void modifyTypeChart(int type_attack, int type_defend, const QString &modifier);
  227.     Q_INVOKABLE QScriptValue type(int id);
  228.     Q_INVOKABLE QScriptValue typeNum(const QString &typeName);
  229.  
  230.     Q_INVOKABLE int hiddenPowerType(int gen, quint8 hpdv, quint8 attdv, quint8 defdv, quint8 spddv, quint8 sattdv, quint8 sdefdv);
  231.  
  232.     Q_INVOKABLE QScriptValue getScript();
  233.  
  234.     Q_INVOKABLE int pokeType1(int id, int gen = GEN_MAX);
  235.     Q_INVOKABLE int pokeType2(int id, int gen = GEN_MAX);
  236.  
  237.     Q_INVOKABLE void modifyMovePower(int moveNum, unsigned char power, int gen = GEN_MAX);
  238.     Q_INVOKABLE void modifyMoveAccuracy(int moveNum, char accuracy, int gen = GEN_MAX);
  239.     Q_INVOKABLE void modifyMovePP(int moveNum, char pp, int gen = GEN_MAX);
  240.     Q_INVOKABLE void modifyMovePriority(int moveNum, qint8 priority, int gen = GEN_MAX);
  241.    
  242.     Q_INVOKABLE QScriptValue banList();
  243.     Q_INVOKABLE void ban(QString name);
  244.     Q_INVOKABLE void unban(QString name);
  245.  
  246.     Q_INVOKABLE void prepareWeather(int battleId, int weatherId);
  247.     Q_INVOKABLE QScriptValue weatherNum(const QString &weatherName);
  248.     Q_INVOKABLE QScriptValue weather(int weatherId);
  249.  
  250.     Q_INVOKABLE QString getBattleLogFileName(int battleid);
  251.  
  252.     Q_INVOKABLE int teamPokeAbility(int id, int slot);
  253.     Q_INVOKABLE void modifyPokeAbility(int id, int slot, int ability, int gen = GEN_MAX);
  254.     Q_INVOKABLE void changePokeAbility(int id, int slot, int ability);
  255.     Q_INVOKABLE QScriptValue pokeAbility(int poke, int slot, int gen = GEN_MAX);
  256.     Q_INVOKABLE void changePokeHappiness(int id, int slot, int value);
  257.     Q_INVOKABLE void changePokeShine(int id, int slot, bool value);
  258.     Q_INVOKABLE void changePokeNature(int id, int pokeslot, int nature);
  259.     Q_INVOKABLE QScriptValue teamPokeGender(int id, int slot);
  260.  
  261.     Q_INVOKABLE QScriptValue teamPokeNick(int id, int pokeslot);
  262.  
  263.     static QScriptValue nativePrint(QScriptContext *context, QScriptEngine *engine);
  264.  
  265.     Q_INVOKABLE void inflictStatus(int battleId, bool toFirstPlayer, int slot, int status);
  266.     Q_INVOKABLE void modifyPokeStat(int poke, int stat, quint8 value);
  267.  
  268.     Q_INVOKABLE void forceBattle(int player1, int player2, int clauses, int mode, bool is_rated = false);
  269.     Q_INVOKABLE int getClauses(const QString &tier);
  270.  
  271.     /* Internal use only */
  272.     Q_INVOKABLE void sendNetworkCommand(int id, int command);
  273.    
  274. // Potentially unsafe functions.
  275. #ifndef PO_SCRIPT_SAFE_ONLY
  276.     /* Save vals using the QSettings (persistent vals, that stay after the shutdown of the server */
  277.     Q_INVOKABLE void saveVal(const QString &key, const QVariant &val);
  278.     Q_INVOKABLE void saveVal(const QString &file, const QString &key, const QVariant &val);
  279.     Q_INVOKABLE void removeVal(const QString &key);
  280.     Q_INVOKABLE void removeVal(const QString &file, const QString &key);
  281.     Q_INVOKABLE QScriptValue getVal(const QString &key);
  282.     Q_INVOKABLE QScriptValue getVal(const QString &file, const QString &key);
  283.     // Returns an array of Script_* key names in config.
  284.     Q_INVOKABLE QScriptValue getValKeys();
  285.     Q_INVOKABLE QScriptValue getValKeys(const QString &file);
  286.     // Direct file access.
  287.     Q_INVOKABLE void appendToFile(const QString &fileName, const QString &content);
  288.     Q_INVOKABLE void writeToFile(const QString &fileName, const QString &content);
  289.     Q_INVOKABLE void deleteFile(const QString &fileName);
  290.     Q_INVOKABLE QScriptValue getFileContent(const QString &path);
  291.     /* GET call */
  292.     Q_INVOKABLE void webCall(const QString &urlstring, const QScriptValue &callback);
  293.     /* POST call */
  294.     Q_INVOKABLE void webCall(const QString &urlstring, const QScriptValue &callback, const QScriptValue &params_array);
  295.     /* synchronous GET call */
  296.     Q_INVOKABLE QScriptValue synchronousWebCall(const QString &urlstring);
  297.     /* synchronous POST call */
  298.     Q_INVOKABLE QScriptValue synchronousWebCall(const QString &urlstring, const QScriptValue &params_array);
  299. #endif // PO_SCRIPT_SAFE_ONLY
  300.  
  301. #if !defined(PO_SCRIPT_NO_SYSTEM) && !defined(PO_SCRIPT_SAFE_ONLY)
  302.     /* Calls the underlying OS for a command */
  303.     Q_INVOKABLE int system(const QString &command);
  304. #endif // PO_SCRIPT_NO_SYSTEM
  305.  
  306. signals:
  307.     void clearTheChat();
  308. public slots:
  309.     void changeScript(const QString &script, const bool triggerStartUp = false);
  310.  
  311. private slots:
  312.     void timer();
  313.     void timer_step();
  314.     void timerFunc();
  315. #ifndef PO_SCRIPT_SAFE_ONLY
  316.     void webCall_replyFinished(QNetworkReply* reply);
  317.     void synchronousWebCall_replyFinished(QNetworkReply* reply);
  318. #endif
  319.    
  320. private:
  321.     Server *myserver;
  322.     QScriptEngine myengine;
  323.     QScriptValue myscript;
  324.     QTimer * step_timer;
  325.     QVector<bool> stopevents;
  326.     QList<QScriptString> playerArrays;
  327.     SessionDataFactory *mySessionDataFactory;
  328.     ScriptDB *myScriptDB;
  329.  
  330.     QNetworkAccessManager manager;
  331.     QHash<QTimer*,QString> timerEvents;
  332.     QHash<QTimer*,QScriptValue> timerEventsFunc;
  333.     QHash<QNetworkReply*,QScriptValue> webCallEvents;
  334.  
  335.     void startStopEvent() {stopevents.push_back(false);}
  336.     bool endStopEvent() {
  337.         bool res = stopevents.back();
  338.         stopevents.pop_back();
  339.         return res;
  340.     }
  341.  
  342.     QEventLoop sync_loop;
  343.     QString sync_data;
  344.  
  345.     void evaluate(const QScriptValue &expr);
  346.     void printLine(const QString &s);
  347.  
  348.     bool testPlayer(const QString &function, int id);
  349.     bool testChannel(const QString &function, int id);
  350.     bool testPlayerInChannel(const QString &function, int id, int chan);
  351.     bool testRange(const QString &function, int val, int min, int max);
  352.     void warn(const QString &function, const QString &message);
  353.  
  354.     template<class T>
  355.     void makeEvent(const QString &event, const T& param);
  356.     template<class T, class T2>
  357.     void makeEvent(const QString &event, const T &param, const T2 &param2);
  358.     template<class T, class T2, class T3>
  359.     void makeEvent(const QString &event, const T& param, const T2 &param2, const T3 &param3);
  360.     template<class T>
  361.     bool makeSEvent(const QString &event, const T& param);
  362.     template<class T, class T2>
  363.     bool makeSEvent(const QString &event, const T &param, const T2 &param2);
  364.     template<class T, class T2, class T3>
  365.     bool makeSEvent(const QString &event, const T& param, const T2 &param2, const T3 &param3);
  366. };
  367.  
  368. class ScriptWindow : public QWidget
  369. {
  370.     Q_OBJECT
  371. public:
  372.     ScriptWindow();
  373. signals:
  374.     void scriptChanged(const QString &script);
  375. public slots:
  376.     void okPressed();
  377. private:
  378.     QTextEdit *myedit;
  379. };
  380.  
  381. template<class T>
  382. void ScriptEngine::makeEvent(const QString &event, const T &param)
  383. {
  384.     if (!myscript.property(event, QScriptValue::ResolveLocal).isValid())
  385.         return;
  386.  
  387.     evaluate(myscript.property(event).call(myscript, QScriptValueList() << param));
  388. }
  389.  
  390. template<class T, class T2>
  391. void ScriptEngine::makeEvent(const QString &event, const T &param, const T2 &param2)
  392. {
  393.     if (!myscript.property(event, QScriptValue::ResolveLocal).isValid())
  394.         return;
  395.  
  396.     evaluate(myscript.property(event).call(myscript, QScriptValueList() << param << param2));
  397. }
  398.  
  399. template<class T, class T2, class T3>
  400. void ScriptEngine::makeEvent(const QString &event, const T &param, const T2 &param2, const T3 &param3)
  401. {
  402.     if (!myscript.property(event, QScriptValue::ResolveLocal).isValid())
  403.         return;
  404.  
  405.     evaluate(myscript.property(event).call(myscript, QScriptValueList() << param << param2 << param3));
  406. }
  407.  
  408. template<class T>
  409. bool ScriptEngine::makeSEvent(const QString &event, const T &param)
  410. {
  411.     if (!myscript.property(event, QScriptValue::ResolveLocal).isValid())
  412.         return true;
  413.  
  414.     startStopEvent();
  415.  
  416.     evaluate(myscript.property(event).call(myscript, QScriptValueList() << param));
  417.  
  418.     return !endStopEvent();
  419. }
  420.  
  421. template<class T, class T2>
  422. bool ScriptEngine::makeSEvent(const QString &event, const T &param, const T2 &param2)
  423. {
  424.     if (!myscript.property(event, QScriptValue::ResolveLocal).isValid())
  425.         return true;
  426.  
  427.     startStopEvent();
  428.  
  429.     evaluate(myscript.property(event).call(myscript, QScriptValueList() << param << param2));
  430.  
  431.     return !endStopEvent();
  432. }
  433.  
  434. template<class T, class T2, class T3>
  435. bool ScriptEngine::makeSEvent(const QString &event, const T &param, const T2 &param2, const T3 &param3)
  436. {
  437.     if (!myscript.property(event, QScriptValue::ResolveLocal).isValid())
  438.         return true;
  439.  
  440.     startStopEvent();
  441.  
  442.     evaluate(myscript.property(event).call(myscript, QScriptValueList() << param << param2 << param3));
  443.  
  444.     return !endStopEvent();
  445. }
  446.  
  447. #endif // SCRIPTENGINE_H
  448.  
  449.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement