diff --git a/App.BulletPhysics/NoOpt/App.BulletPhysics.lib b/App.BulletPhysics/NoOpt/App.BulletPhysics.lib
index a2b95a0..93499f2 100644
Binary files a/App.BulletPhysics/NoOpt/App.BulletPhysics.lib and b/App.BulletPhysics/NoOpt/App.BulletPhysics.lib differ
diff --git a/App/App.vcxproj b/App/App.vcxproj
index 2d927b5..0d2f1bd 100644
--- a/App/App.vcxproj
+++ b/App/App.vcxproj
@@ -140,6 +140,9 @@
bin\$(Configuration)\
obj\$(Configuration)\
+
+ $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath);$(CONTRIB_PATH)\boost_1_56_0\lib;
+
Disabled
@@ -302,6 +305,11 @@ cmd /c "exit /b 0"
false
+
+
+ $(CONTRIB_PATH)\boost_1_56_0\lib;$(CONTRIB_PATH)\boost_1_56_0\;
+
+
Level1
diff --git a/App/CMakeLists.txt b/App/CMakeLists.txt
index ac55046..7f219b3 100644
--- a/App/CMakeLists.txt
+++ b/App/CMakeLists.txt
@@ -27,8 +27,6 @@ list(APPEND SOURCES ${libwww_ROOT}/HTParse.c)
set_source_files_properties(${libwww_ROOT}/HTParse.c PROPERTIES COMPILE_FLAGS "${libwww_cflags}")
list(APPEND SOURCES ${libwww_ROOT}/HTString.c)
set_source_files_properties(${libwww_ROOT}/HTString.c PROPERTIES COMPILE_FLAGS "${libwww_cflags}")
-list(APPEND SOURCES ${libwww_ROOT}/HTTrace.c)
-set_source_files_properties(${libwww_ROOT}/HTTrace.c PROPERTIES COMPILE_FLAGS "${libwww_cflags}")
if(UNIX)
list(APPEND SOURCES util/Unix/ProgramMemoryChecker.cpp)
diff --git a/App/NoOpt/App.lastbuildstate b/App/NoOpt/App.lastbuildstate
index 38f6559..656d8d7 100644
--- a/App/NoOpt/App.lastbuildstate
+++ b/App/NoOpt/App.lastbuildstate
@@ -1,2 +1,2 @@
#v4.0:v110:false
-NoOpt|Win32|F:\Trunk2012\BuildWatrbx\|
+NoOpt|Win32|J:\Trunk2012\Client\|
diff --git a/App/NoOpt/CL.read.1.tlog b/App/NoOpt/CL.read.1.tlog
index 3fc5f38..c6a8c94 100644
Binary files a/App/NoOpt/CL.read.1.tlog and b/App/NoOpt/CL.read.1.tlog differ
diff --git a/App/NoOpt/CL.write.1.tlog b/App/NoOpt/CL.write.1.tlog
index 704a804..6bf9acc 100644
Binary files a/App/NoOpt/CL.write.1.tlog and b/App/NoOpt/CL.write.1.tlog differ
diff --git a/App/NoOpt/cl.command.1.tlog b/App/NoOpt/cl.command.1.tlog
index 33c98fa..16bc9dc 100644
Binary files a/App/NoOpt/cl.command.1.tlog and b/App/NoOpt/cl.command.1.tlog differ
diff --git a/App/gui/ChatOutput.h b/App/gui/ChatOutput.h
new file mode 100644
index 0000000..247a2ee
--- /dev/null
+++ b/App/gui/ChatOutput.h
@@ -0,0 +1,199 @@
+/* Copyright 2003-2006 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Gui/Gui.h"
+#include "Util/RunStateOwner.h"
+#include "V8DataModel/ChatService.h"
+#include "Util/UDim.h"
+
+
+namespace RBX {
+
+ class SafeChat;
+ class GuiObject;
+ class BillboardGui;
+ class ModelInstance;
+
+ namespace Network {
+ class Player;
+ class Players;
+ class ChatMessage;
+ }
+
+ class ChatLine {
+ protected:
+ static float ComputeBubbleLifetime(const std::string& msg, bool isSelf);
+
+ public:
+ static const char* ELIPSES;
+ static const int CchMaxChatMessageLength; // max chat message length, including null terminator and elipses.
+ enum BubbleColor
+ {
+ WHITE,
+ BLUE,
+ GREEN,
+ RED,
+ };
+
+ enum ChatType
+ {
+ PLAYER_CHAT,
+ PLAYER_TEAM_CHAT,
+ PLAYER_WHISPER_CHAT,
+
+ GAME_MESSAGE,
+ PLAYER_GAME_CHAT,
+ BOT_CHAT,
+ };
+
+ std::string message;
+ const BubbleColor bubbleColor;
+ const ChatType chatType;
+ float startTime;
+ float bubbleDieDelay;
+ bool isLocalPlayer;
+ boost::weak_ptr origin;
+
+ const Instance* getOrigin() const { return origin.lock().get(); }
+
+ ChatLine(ChatType chatType, const std::string& message, float startTime, BubbleColor bubbleColor, bool isLocalPlayer);
+ virtual ~ChatLine() {}
+
+ bool isPlayerChat() const
+ {
+ switch(chatType)
+ {
+ case PLAYER_CHAT:
+ case PLAYER_TEAM_CHAT:
+ case PLAYER_WHISPER_CHAT:
+ return true;
+ default:
+ return false;
+ }
+ }
+ };
+
+ class PlayerChatLine : public ChatLine {
+ public:
+
+ static const char* ROBLOXNAME;
+ Color3 userColor;
+
+ std::string user;
+ float historyDieDelay;
+
+ const ModelInstance* getCharacter() const;
+
+ PlayerChatLine(ChatType chatType, boost::shared_ptr player, const std::string& message, float startTime, bool isLocalPlayer);
+ };
+ class GameChatLine: public ChatLine
+ {
+ public:
+ GameChatLine(boost::shared_ptr origin, const std::string& message, float startTime, bool isLocalPlayer, BubbleColor bubbleColor);
+ };
+
+ struct CharacterChats
+ {
+ CharacterChats()
+ : isVisible(false)
+ , isMoving(false)
+ {}
+ std::deque > fifo;
+ bool isVisible;
+ bool isMoving;
+ weak_ptr billboardGui;
+ };
+
+ class ChatOutput
+ : public GuiItem
+ {
+ private:
+ static const int kMaxTextSize = 16;
+ static const int kMaxCharsInLine = 20;
+
+ void createBillboardGuiHelper(Instance* instance, bool character);
+
+ void renderBubbleImposters(Adorn* adorn, weak_ptr owner, weak_ptr head);
+ void renderBubbles(Adorn* adorn, weak_ptr owner, weak_ptr head, bool playerAndGameChat,
+ Vector3 extentsOffset, Vector3 studsOffset);
+ typedef GuiItem Super;
+ static const int MaxChatBubblesPerPlayer;
+ static const int MaxChatLinesPerBubble;
+
+ RBX::Network::Players* players;
+ std::map > chatBubble;
+ std::map > chatBubbleWithTail;
+ std::map > scalingChatBubbleWithTail;
+
+ struct ScalingInfo
+ {
+ Vector2 scalingCutoff;
+ UDim2 fixedPosition;
+ UDim2 fixedSize;
+
+ UDim2 scalingPosition;
+ UDim2 scalingSize;
+
+ UDim2 getPosition(Vector2 size)
+ {
+
+ return UDim2(size.x < scalingCutoff.x ? scalingPosition.x : fixedPosition.x,
+ size.y < scalingCutoff.y ? scalingPosition.y : fixedPosition.y);
+ }
+ UDim2 getSize(Vector2 size)
+ {
+ return UDim2(size.x < scalingCutoff.x ? scalingSize.x : fixedSize.x,
+ size.y < scalingCutoff.y ? scalingSize.y : fixedSize.y);
+ }
+
+ ScalingInfo(Vector2 scalingCutoff, UDim2 fixedPosition, UDim2 fixedSize, UDim2 scalingPosition, UDim2 scalingSize)
+ :scalingCutoff(scalingCutoff)
+ ,fixedPosition(fixedPosition)
+ ,fixedSize(fixedSize)
+ ,scalingPosition(scalingPosition)
+ ,scalingSize(scalingSize)
+ {}
+ ScalingInfo()
+ {}
+ };
+ std::map scalingInfo;
+
+ std::map > chatPlaceholder;
+
+ std::deque > fifo;
+ typedef std::map CharacterChatMap;
+ CharacterChatMap characterSortedMsg;
+ float time;
+
+ void acceleratedBubbleDecay(ChatLine* line, float wallStep, bool isMoving, bool isVisible);
+
+ void removeOldest();
+ bool removeExpired();
+
+ bool bubbleChatEnabled();
+
+ std::string SanitizeChatLine(const std::string& msg); // truncate and make safe.
+
+ // Instance
+ /*override*/ void onServiceProvider(ServiceProvider* oldProvider, ServiceProvider* newProvider);
+
+ // Listener
+ rbx::signals::scoped_connection heartbeatConnection;
+ rbx::signals::scoped_connection playerChatMessageConnection;
+ rbx::signals::scoped_connection gameChatMessageConnection;
+ void onHeartbeat(const Heartbeat& heartbeat);
+
+ void onPlayerChatMessage(const Network::ChatMessage& event);
+ void onGameChatMessage(boost::shared_ptr origin, const std::string& message, ChatService::ChatColor color);
+
+ // GuiItem
+ /*override*/ void render2d(Adorn* adorn);
+ /*override*/ void render2d_bubbleStyle(Adorn* adorn, bool playerBubbleChat);
+
+ public:
+ ChatOutput();
+ ~ChatOutput();
+ };
+
+} // namespace
\ No newline at end of file
diff --git a/App/gui/ChatWidget.h b/App/gui/ChatWidget.h
new file mode 100644
index 0000000..5a4cf8a
--- /dev/null
+++ b/App/gui/ChatWidget.h
@@ -0,0 +1,59 @@
+ /* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Gui/GuiDraw.h"
+
+#include "GfxBase/Adorn.h"
+
+namespace RBX {
+
+ class UnifiedImageWidget : public UnifiedWidget
+ {
+ protected:
+ GuiDrawImage guiImageDraw;
+ std::string imageName;
+ unsigned imageState;
+ public:
+ UnifiedImageWidget(const std::string& imageName, int imageState)
+ : imageName(imageName)
+ , imageState(imageState)
+ {
+ }
+
+ Gui::WidgetState getWidgetState() const;
+
+ /*override*/ void render2dMe(Adorn* adorn);
+ /*override*/ void setSize(const Vector2& _size) {guiImageDraw.setImageSize(_size);}
+ /*override*/ Vector2 getSize(Canvas canvas) const {return guiImageDraw.getImageSize();}
+ };
+
+ class ChatButton : public UnifiedImageWidget
+ {
+ private:
+ /*override*/ bool isVisible() const;
+ public:
+ ChatButton(const std::string& imageName, unsigned imageState)
+ : UnifiedImageWidget(imageName, imageState)
+ {
+ }
+ };
+
+ class ChatWidget : public UnifiedWidget
+ {
+ private:
+ typedef UnifiedWidget Super;
+ std::string findMenuString(GuiItem* item);
+
+ std::string code;
+
+ // Unified Widget
+ /*override*/ void onMenuStateChanged();
+
+ /*override*/ GuiResponse process(const shared_ptr& event);
+
+ public:
+ ChatWidget(const std::string& text, std::string code);
+ };
+
+} // namespace
diff --git a/App/gui/EquationDisplay.h b/App/gui/EquationDisplay.h
new file mode 100644
index 0000000..632a535
--- /dev/null
+++ b/App/gui/EquationDisplay.h
@@ -0,0 +1,27 @@
+#pragma once
+
+#include "Gui/GUI.h"
+
+namespace RBX {
+
+ class EquationDisplay : public TextDisplay {
+ private:
+ std::string equation;
+
+ protected:
+ // TextDisplay
+ std::string getLabel() const;
+
+ public:
+ EquationDisplay(
+ const std::string& title,
+ const std::string& equation);
+
+ EquationDisplay(
+ const std::string& title,
+ const std::string& label,
+ const std::string& equation);
+
+ /*override*/ void render2d(Adorn* adorn);
+ };
+} // namespace
\ No newline at end of file
diff --git a/App/gui/GUI.h b/App/gui/GUI.h
new file mode 100644
index 0000000..b36c11c
--- /dev/null
+++ b/App/gui/GUI.h
@@ -0,0 +1,268 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "V8DataModel/InputObject.h"
+#include "Gui/GuiEvent.h"
+#include "Gui/Layout.h"
+#include "V8Tree/Instance.h"
+#include "GfxBase/Type.h"
+#include "GfxBase/Adorn.h"
+
+namespace RBX {
+
+
+extern const char* const sGuiItem;
+class GuiItem : public DescribedNonCreatable
+{
+private:
+ typedef Instance Super;
+ shared_ptr focus; // TODO: It should be safe to make this a bald pointer, since focus is always a child
+ Vector2 guiSize;
+
+ GuiResponse processNonFocus(const shared_ptr& event);
+ void switchFocus(GuiItem* item);
+
+ // Instance
+ /*override*/ void onDescendantRemoving(const shared_ptr& instance);
+ /*override*/ bool askAddChild(const Instance* instance) const {
+ return Instance::fastDynamicCast(instance)!=0;
+ }
+ /*override*/ const RBX::Name& getClassName() const {return RBX::Name::getNullName(); }
+
+protected:
+ GuiItem* getFocus() {return focus.get();}
+ void loseFocus() {
+ if (focus) {
+ focus->onLoseFocus();
+ }
+ focus.reset();
+ }
+
+ Rect getMyRect(Canvas canvas) const; // myPosition, myPosition + mySize
+
+ Rect2D getMyRect2D(Canvas canvas) const {
+ return getMyRect(canvas).toRect2D();
+ }
+
+ void label2d(
+ Adorn* adorn,
+ const std::string& label,
+ const Color4& fill,
+ const Color4& border,
+ Text::XAlign align = Text::XALIGN_LEFT) const;
+
+ /////////////////////////////////////////////////////////////
+ //
+ // GUI Item virtuals
+
+ virtual void onLoseFocus() {}
+ virtual bool canLoseFocus() {return false;} // in general, Gui Items don't lose focus while processing
+
+ // standard virtual overrides....
+ virtual Vector2 getPosition(Canvas canvas) const {
+ RBXASSERT(getGuiParent());
+ return getGuiParent()->getChildPosition(this, canvas);
+ }
+
+ virtual Vector2 getChildPosition(const GuiItem* child, Canvas canvas) const { // This should always be override if ever used
+ RBXASSERT(0);
+ return Vector2::zero();
+ }
+
+ // used internally - could these be protected?
+ virtual int getFontSize() const {return 12;}
+
+ virtual bool isVisible() const {return true;}
+
+ virtual std::string getTitle() {return getName();}
+
+public:
+ virtual Vector2 getSize(Canvas canvas) const {return getGuiSize();}
+
+ virtual GuiResponse process(const shared_ptr& event);
+
+ virtual void render2d(Adorn* adorn) {}
+
+
+ GuiItem();
+ ~GuiItem();
+
+ void addGuiItem(shared_ptr guiItem) {guiItem->setParent(this);}
+
+ void setGuiSize(const Vector2& size) {guiSize = size;}
+ const Vector2& getGuiSize() const {return guiSize;}
+
+ GuiItem* getGuiParent();
+ const GuiItem* getGuiParent() const;
+ GuiItem* getGuiItem(int index);
+ const GuiItem* getGuiItem(int index) const;
+
+ static const Color4& disabledFill();
+ static const Color4& translucentBackdrop();// background of the palette
+ static const Color4& menuSelect();
+};
+
+extern const char* const sGuiRoot;
+
+class GuiRoot :
+ public Reflection::Described
+{
+public:
+ GuiRoot();
+
+ /*override*/ void render2d(Adorn* adorn);
+
+ void render2dItem(Adorn* adorn, GuiItem* guiItem);
+
+ // GuiItem
+ /*override*/ Vector2 getSize(Canvas canvas) const {
+ // shouldn't be called - implies item doesn't know it's top level
+ RBXASSERT(false);
+ return canvas.size;
+ }
+
+protected:
+ virtual bool askSetParent(const Instance* instance) const {
+ return true;
+ }
+};
+
+
+class TopMenuBar : public GuiItem {
+private:
+ void init();
+
+protected:
+ Color4 backdropColor;
+ Layout::Style layoutStyle;
+ bool visible;
+
+ /*override*/ Vector2 getChildPosition(const GuiItem* child, Canvas canvas) const;
+
+public:
+ TopMenuBar() {init();}
+ TopMenuBar(
+ const std::string& _title,
+ Layout::Style layoutStyle,
+ bool translucentBackdrop = false);
+ TopMenuBar(
+ const std::string& _title,
+ Layout::Style _layoutStyle,
+ Color4 _backdropColor);
+
+ /*override*/ GuiResponse process(const shared_ptr& event);
+ /*override*/ void render2d(Adorn* adorn);
+ /*override*/ Vector2 getSize(Canvas canvas) const;
+ /*override*/ bool isVisible() const {return visible;}
+
+ void setVisible(bool _set) {visible = _set;}
+};
+
+
+
+class RelativePanel : public TopMenuBar {
+protected:
+ Rect::Location xLocation;
+ Rect::Location yLocation;
+ Vector2int16 offset;
+
+ void init(const Layout& layout);
+
+public:
+ RelativePanel() {init(Layout());}
+ RelativePanel(const Layout& layout) {init(layout);}
+
+ virtual Vector2 getPosition(Canvas canvas) const;
+};
+
+// This will become the new unified widget - menu, button, all...
+//
+
+class UnifiedWidget : public GuiItem {
+public:
+ enum MenuState {NOTHING, HOVER, SHOWN_APPEARING, SHOWN}; // + focus if child is shown
+
+private:
+ typedef GuiItem Super;
+ MenuState menuState;
+
+ GuiResponse processShown_InTitle(const shared_ptr& event);
+ GuiResponse processShown_OutOfTitle(const shared_ptr& event);
+
+ GuiResponse processNothing(const shared_ptr& event);
+ GuiResponse processHover(const shared_ptr& event);
+ GuiResponse processShown(const shared_ptr& event);
+ GuiResponse processKey(const shared_ptr& event);
+
+ void render2dChildren(Adorn* adorn);
+
+ /*override*/ Vector2 getChildPosition(const GuiItem* child, Canvas canvas) const;
+ /*override*/ bool canLoseFocus() {return true;}
+ /*override*/ void onLoseFocus();
+ /*override*/ int getFontSize() const {return 8;}
+
+ void init();
+
+protected:
+ bool showChildren() {return (menuState >= SHOWN_APPEARING);}
+
+ virtual void onMenuStateChanged() {}
+ virtual Vector2 firstChildPosition(Canvas canvas) const;
+ virtual Vector2 childOffset() const;
+ virtual void render2dMe(Adorn* adorn);
+
+public:
+ UnifiedWidget() {init();}
+ UnifiedWidget(const std::string& title);
+
+ MenuState getMenuState() const {return menuState;}
+ void setMenuState(MenuState value);
+
+ /*override*/ GuiResponse process(const shared_ptr& event);
+ /*override*/ void render2d(Adorn* adorn);
+};
+
+
+
+
+
+class TextDisplay : public GuiItem {
+private:
+ typedef GuiItem Super;
+
+ void init();
+
+protected:
+ std::string label;
+ int fontSize;
+ Color4 fontColor;
+ Color4 borderColor;
+ Text::XAlign align;
+ bool visible;
+
+ /*override*/ int getFontSize() const {return fontSize;}
+ /*override*/ bool isVisible() const {return visible;}
+
+ const std::string& getLabel() const {return label;}
+
+public:
+ TextDisplay() {init();}
+ TextDisplay(const std::string& title, const std::string& _label);
+
+ /*override*/ void render2d(Adorn* adorn);
+ /*override*/ Vector2 getSize(Canvas canvas) const;
+
+ void setLabel(const std::string& _label) {label = _label;}
+ void setFontSize(int _fontSize) {
+ fontSize = _fontSize;
+ setGuiSize(Vector2(fontSize*10.0f, fontSize*2.0f));
+ }
+ void setFontColor(const Color4& _color) {fontColor = _color;}
+ void setBorderColor(const Color4& _color) {borderColor = _color;}
+ void setAlign(Text::XAlign _align) {align = _align;}
+ void setVisible(bool _visible) {visible = _visible;}
+};
+
+
+} // namespace
diff --git a/App/gui/GuiDraw.h b/App/gui/GuiDraw.h
new file mode 100644
index 0000000..37c2820
--- /dev/null
+++ b/App/gui/GuiDraw.h
@@ -0,0 +1,76 @@
+/* Copyright 2003-2006 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "V8DataModel/GuiCore.h"
+#include "V8Xml/Reference.h"
+#include "Util/TextureId.h"
+#include "GfxBase/TextureProxyBase.h"
+#include "GfxBase/Adorn.h"
+#include "rbx/signal.h"
+
+namespace RBX {
+
+ class Adorn;
+
+ class GuiDrawImage
+ {
+ public:
+ enum ImageState
+ {
+ NORMAL = 0x1,
+ HOVER = 0x2,
+ DOWN = 0x4,
+ DISABLE = 0x8,
+ SELECTED = 0x10,
+ SELECTED_HOVER = 0x20,
+ SELECTED_DOWN = 0x40,
+ ALL = 0x7F
+ };
+ private:
+ TextureId currentTexture;
+ TextureId loadingTexture;
+ RBX::TextureProxyBaseRef disable;
+ RBX::TextureProxyBaseRef normal;
+ RBX::TextureProxyBaseRef hover;
+ RBX::TextureProxyBaseRef down;
+ RBX::TextureProxyBaseRef selected;
+ RBX::TextureProxyBaseRef selectedHover;
+ RBX::TextureProxyBaseRef selectedDown;
+ mutable Vector2 size;
+ rbx::signals::scoped_connection unbindResourceSignalHint;
+
+ void OnUnbindResourceSignalHint();
+
+ void draw(Adorn* adorn, const RBX::TextureProxyBaseRef& texture, const Rect& rect, const Vector2& texul, const Vector2& texbr, const Color4& color,
+ const Rect& clipRect, const Color4& behind, const Color4& inFront);
+
+ void draw(Adorn* adorn, const RBX::TextureProxyBaseRef& texture, const Rect& rect, const Vector2& texul, const Vector2& texbr, const Color4& color,
+ const Rotation2D& rotation, const Color4& behind, const Color4& inFront);
+
+ template
+ void render2dImpl(Adorn* adorn, bool enabled, const Rect& rect, const Vector2& texul, const Vector2& texbr, const Color4& color,
+ const Modifier& modifier, Gui::WidgetState state, bool isSelected);
+
+ void tryCreateTextureProxy(Adorn *adorn, const std::string& contentString, const std::string& context, RBX::TextureProxyBaseRef& textureRef, bool& isWaiting);
+ public:
+ GuiDrawImage() : size(Vector2(0,0)) {}
+ GuiDrawImage(Adorn *adorn, const std::string& textureName, unsigned imageState) {setImageFromName(adorn, textureName, imageState);}
+
+ void render2d(Adorn* adorn, bool enabled, const Rect& rect,
+ Gui::WidgetState state, bool isSelected);
+ void render2d(Adorn* adorn, bool enabled, const Rect& rect, const Vector2& texul, const Vector2& texbr, const Color4& color, const Rotation2D& rotation,
+ Gui::WidgetState state, bool isSelected);
+ void render2d(Adorn* adorn, bool enabled, const Rect& rect, const Vector2& texul, const Vector2& texbr, const Color4& color, const Rect& clipRect,
+ Gui::WidgetState state, bool isSelected);
+
+ void setImageSize(const Vector2& _size);
+ Vector2 getImageSize() const;
+
+ bool setImage(Adorn* adorn, const TextureId& textureId, unsigned imageState, Vector2* outSize = NULL, Instance* contextInstance = NULL, const char* context = "");
+ bool setImageFromName(Adorn* adorn, const std::string& textureName, unsigned imageState, Instance* contextInstance = NULL, const char* context = "");
+
+ void computeUV(Vector2& uvtl, Vector2& uvbr, const Vector2& imageRectOffset, const Vector2& imageRectSize, const Vector2& imageSize);
+ };
+
+} // namespace
diff --git a/App/gui/GuiEvent.h b/App/gui/GuiEvent.h
new file mode 100644
index 0000000..9c90098
--- /dev/null
+++ b/App/gui/GuiEvent.h
@@ -0,0 +1,62 @@
+/* Copyright 2003-2015 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "v8tree/Instance.h"
+
+LOGGROUP(GuiTargetLifetime)
+
+namespace RBX {
+
+ class GuiResponse
+ {
+ private:
+ enum ResponseType {NOT_SUNK, SUNK};
+ enum FinishedType {NOT_FINISHED, FINISHED};
+ enum MouseOverType {NOT_MOUSE_OVER, MOUSE_OVER};
+
+ ResponseType response;
+ FinishedType finished;
+ MouseOverType mouseWasOver;
+ weak_ptr target;
+
+ GuiResponse(ResponseType response, FinishedType finished, MouseOverType mouseWasOver, Instance* newTarget)
+ : response(response)
+ , finished(finished)
+ , mouseWasOver(mouseWasOver)
+ , target(weak_from(newTarget))
+ {}
+
+ GuiResponse(ResponseType response)
+ : response(response)
+ , finished(NOT_FINISHED)
+ , mouseWasOver(NOT_MOUSE_OVER)
+ {}
+
+ public:
+ GuiResponse()
+ : response(NOT_SUNK)
+ , finished(NOT_FINISHED)
+ , mouseWasOver(NOT_MOUSE_OVER)
+ {}
+
+ bool getMouseWasOver() const {return mouseWasOver == MOUSE_OVER;}
+ void setMouseWasOver() {mouseWasOver = MOUSE_OVER;}
+
+ bool wasSunk() {return (response == SUNK);}
+ bool wasSunkAndFinished()
+ {
+ RBXASSERT(!((finished == FINISHED) && !wasSunk()));
+ return (finished == FINISHED);
+ }
+
+ static GuiResponse notSunk() {return GuiResponse(NOT_SUNK);}
+ static GuiResponse notSunkMouseWasOver() {return GuiResponse(NOT_SUNK, NOT_FINISHED, MOUSE_OVER, NULL);}
+ static GuiResponse sunk() {return GuiResponse(SUNK);}
+ static GuiResponse sunkAndFinished() {return GuiResponse(SUNK, FINISHED, NOT_MOUSE_OVER, NULL);}
+ static GuiResponse sunkWithTarget(Instance* target) {return GuiResponse(SUNK, NOT_FINISHED, NOT_MOUSE_OVER, target);}
+
+ shared_ptr getTarget() { return target.lock(); }
+ void setTarget(Instance* value) { target = weak_from(value); }
+ };
+} // namespace
diff --git a/App/gui/Layout.h b/App/gui/Layout.h
new file mode 100644
index 0000000..5c7e937
--- /dev/null
+++ b/App/gui/Layout.h
@@ -0,0 +1,29 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Util/Rect.h"
+#include "Util/G3DCore.h"
+
+namespace RBX {
+
+ class Layout
+ {
+ public:
+ enum Style {HORIZONTAL = 0, VERTICAL = 1};
+
+ Rect::Location xLocation;
+ Rect::Location yLocation;
+ Vector2int16 offset;
+ Style layoutStyle;
+ Color4 backdropColor;
+
+ Layout()
+ : xLocation(Rect::LEFT)
+ , yLocation(Rect::TOP)
+ , offset(Vector2int16(0,0))
+ , layoutStyle(HORIZONTAL)
+ , backdropColor(Color4::clear())
+ {}
+ };
+} // namespace
diff --git a/App/gui/ProfanityFilter.h b/App/gui/ProfanityFilter.h
new file mode 100644
index 0000000..918d5db
--- /dev/null
+++ b/App/gui/ProfanityFilter.h
@@ -0,0 +1,35 @@
+/* Copyright 2003-2006 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Util/ScopedSingleton.h"
+
+namespace RBX {
+
+ class WordList
+ {
+ private:
+ std::set blacklist;
+ void decrypt(std::string& str);
+ public:
+ WordList();
+ ~WordList();
+
+ bool ContainsProfanity(std::string str);
+
+ };
+
+
+ class ProfanityFilter : public ScopedSingleton
+ {
+ private:
+ WordList *wordlist;
+ bool ContainsProfanityWorker(std::string str);
+ public:
+ ProfanityFilter();
+ ~ProfanityFilter();
+
+ static bool ContainsProfanity(const std::string& str);
+ };
+
+} // namespace
\ No newline at end of file
diff --git a/App/gui/ScoreHud.h b/App/gui/ScoreHud.h
new file mode 100644
index 0000000..a8c55ed
--- /dev/null
+++ b/App/gui/ScoreHud.h
@@ -0,0 +1,14 @@
+/* Copyright 2003-2008 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Gui/Gui.h"
+#include "Util/RunStateOwner.h"
+#include "Network/Player.h"
+#include "Network/Players.h"
+#include "V8DataModel/team.h"
+#include "V8DataModel/teams.h"
+
+namespace RBX {
+
+} // namespace
\ No newline at end of file
diff --git a/App/gui/Widget.h b/App/gui/Widget.h
new file mode 100644
index 0000000..e9389b5
--- /dev/null
+++ b/App/gui/Widget.h
@@ -0,0 +1,47 @@
+ /* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Gui/GUI.h"
+#include "V8Tree/Verb.h"
+#include "V8DataModel/GuiCore.h"
+#include "v8datamodel/InputObject.h"
+
+namespace RBX {
+
+ class Widget : public GuiItem
+ {
+ private:
+ typedef GuiItem Super;
+ GuiResponse processMouse(const shared_ptr& event);
+ GuiResponse processKey(const shared_ptr& event);
+
+ protected:
+ Gui::WidgetState widgetState;
+
+ // This should be standard for all widgets, verb widets, etc.
+ /*override*/ GuiResponse process(const shared_ptr& event);
+ /*override*/ void onLoseFocus() {
+ widgetState = Gui::NOTHING;
+ Super::onLoseFocus();
+ }
+
+ /////////////////////////////////////////////////////////
+ //
+ // Override these to make new widgets
+
+ // GUI ITEM
+ /*override*/ void render2d(Adorn* adorn);
+
+ // WIDGET
+ virtual void onClick(const shared_ptr& event) {}
+ virtual int getFontSize() const {return 10;}
+ virtual G3D::Color4 getFontColor() {return G3D::Color3::white();}
+ virtual bool isEnabled() {return isVisible();}
+
+ public:
+ Widget();
+ };
+
+
+} // namespace
\ No newline at end of file
diff --git a/App/humanoid/Balancing.h b/App/humanoid/Balancing.h
new file mode 100644
index 0000000..dce3f73
--- /dev/null
+++ b/App/humanoid/Balancing.h
@@ -0,0 +1,39 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Humanoid/HumanoidState.h"
+
+namespace RBX {
+namespace HUMAN {
+
+
+ class Balancing : public HumanoidState
+ {
+ private:
+ float kP; // units: 1/sec^2 torque = kP * momentOfInertia * rotation
+ float kD; // units: 1/sec torque = kD * momentOfInertia * rotVelocity
+
+ Vector3 lastBalanceTorque;
+ int tick;
+
+ static int balanceRate(double torqueMag);
+ static int balanceRateForPGS();
+ protected:
+ static const float maxTorqueComponent() {return 4000.0f;} // units: 1/sec^2 torque <= maxTorqueComponent * momentOfInertia
+
+ void setBalanceP(float P) { kP = P; };
+ void setBalanceD(float D) { kD = D; };
+
+ // Humanoid::State
+ /*override*/ void onComputeForceImpl();
+
+ public:
+ Balancing(Humanoid* humanoid, StateType priorState);
+ Balancing(Humanoid* humanoid, StateType priorState, const float kP, const float kD);
+ };
+
+
+} // namespace HUMAN
+} // namespace RBX
+
diff --git a/App/humanoid/FallingDown.h b/App/humanoid/FallingDown.h
new file mode 100644
index 0000000..b8110ea
--- /dev/null
+++ b/App/humanoid/FallingDown.h
@@ -0,0 +1,53 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Humanoid/HumanoidState.h"
+
+namespace RBX {
+
+ namespace HUMAN {
+
+ // pure simulation!
+
+ extern const char* const sDead;
+ class Dead : public Named
+ {
+ private:
+ /*override*/ StateType getStateType() const {return DEAD;}
+ /*override*/ void onStepImpl();
+ /*override*/ void onSimulatorStepImpl(float stepDt);
+ /*override*/ void onComputeForceImpl() {}
+ /*override*/ bool enableAutoJump() const { return false; }
+ public:
+ Dead(Humanoid* humanoid, StateType priorState);
+ };
+
+
+ extern const char* const sFallingDown;
+ class FallingDown : public Named
+ {
+ private:
+ /*override*/ StateType getStateType() const {return FALLING_DWN;}
+ /*override*/ void onComputeForceImpl() {}
+ /*override*/ bool enableAutoJump() const { return false; }
+ public:
+ FallingDown(Humanoid* humanoid, StateType priorState);
+ };
+
+ extern const char* const sPhysics;
+ class Physics : public Named
+ {
+ private:
+ /*override*/ StateType getStateType() const {return PHYSICS;}
+ /*override*/ void onComputeForceImpl() {}
+ /*override*/ bool enableAutoJump() const { return false; }
+ public:
+ Physics(Humanoid* humanoid, StateType priorState);
+ };
+
+
+
+ } // namespace HUMAN
+} // namespace RBX
+
diff --git a/App/humanoid/Flying.h b/App/humanoid/Flying.h
new file mode 100644
index 0000000..766e7a8
--- /dev/null
+++ b/App/humanoid/Flying.h
@@ -0,0 +1,32 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Humanoid/Balancing.h"
+#include "Util/Name.h"
+
+namespace RBX {
+ namespace HUMAN {
+
+ // Flying occurs when there's no ground below you. You have the ability
+ // to turn around the y-axis, but not much else.
+ extern const char* const sFlying;
+
+ class Flying : public Named
+ {
+ private:
+ /*override*/ StateType getStateType() const {return FLYING;}
+
+ protected:
+ // Humanoid::State
+ /*override*/ void onSimulatorStepImpl(float stepDt);
+ /*override*/ void onComputeForceImpl();
+ /*override*/ bool enableAutoJump() const { return false; }
+
+ public:
+ Flying(Humanoid* humanoid, StateType priorState);
+ };
+
+ } // namespace HUMAN
+} // namespace
+
diff --git a/App/humanoid/Freefall.h b/App/humanoid/Freefall.h
new file mode 100644
index 0000000..a0662f6
--- /dev/null
+++ b/App/humanoid/Freefall.h
@@ -0,0 +1,51 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Humanoid/Balancing.h"
+
+namespace RBX {
+
+ namespace HUMAN {
+
+ extern const char* const sFreefall;
+
+ class Freefall : public Named
+ {
+ private:
+ typedef Named Super;
+ bool initialized; // hack- some data is bad in the constructor - do first time through;
+ Vector3 initialLinearVelocity;
+ Velocity desiredVelocity; // Y is world-up
+ float torsoFriction; // I set both of these to zero!
+ float headFriction;
+
+ /*override*/ StateType getStateType() const {return FREE_FALL;}
+
+ /*override*/ void onSimulatorStepImpl(float stepDt);
+
+ /*override*/ void onComputeForceImpl();
+
+ /*override*/ int ladderCheckRate() { return 0; }
+
+ /*override*/ bool armsShouldCollide() const {return false;}
+ /*override*/ bool legsShouldCollide() const {return false;}
+ /*override*/ bool enableAutoJump() const { return false; }
+
+ static float characterVelocityInfluence();
+ static float floorVelocityInfluence();
+ static float velocityDecay();
+
+ public:
+ Freefall(Humanoid* humanoid, StateType priorState);
+
+ ~Freefall();
+
+ static float kTurnSpeed();
+ static float kTurnSpeedForPGS();
+ static const float kTurnAccelMax() {return 20000.0f * kTurnSpeed();} // units: 1/sec^2
+ };
+
+ } // namespace HUMAN
+} // namespace
+
diff --git a/App/humanoid/GettingUp.h b/App/humanoid/GettingUp.h
new file mode 100644
index 0000000..628c432
--- /dev/null
+++ b/App/humanoid/GettingUp.h
@@ -0,0 +1,30 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Humanoid/Humanoid.h"
+#include "Humanoid/Balancing.h"
+#include "Util/Name.h"
+
+namespace RBX {
+
+ namespace HUMAN {
+
+ extern const char* const sGettingUp;
+
+ class GettingUp : public Named
+ {
+ protected:
+ /*override*/ StateType getStateType() const {return GETTING_UP;}
+
+ /*override*/ bool armsShouldCollide() const {return false;}
+ /*override*/ bool legsShouldCollide() const {return false;}
+ /*override*/ bool enableAutoJump() const { return false; }
+
+ public:
+ GettingUp(Humanoid* humanoid, StateType priorState);
+ };
+
+ } // HUMAN
+} // namespace
+
diff --git a/App/humanoid/Humanoid.h b/App/humanoid/Humanoid.h
new file mode 100644
index 0000000..82eeb75
--- /dev/null
+++ b/App/humanoid/Humanoid.h
@@ -0,0 +1,621 @@
+/* Copyright 2003-2007 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "V8DataModel/ICharacterSubject.h"
+#include "V8DataModel/IModelModifier.h"
+#include "V8DataModel/PartInstance.h"
+#include "V8DataModel/Tool.h"
+#include "V8World/KernelJoint.h"
+#include "V8World/Primitive.h"
+#include "Util/SteppedInstance.h"
+#include "GfxBase/IAdornable.h"
+#include "Util/RunStateOwner.h"
+#include "Util/ContentFilter.h"
+#include "Util/HeapValue.h"
+#include "Humanoid/StatusInstance.h"
+#include "Humanoid/HumanoidState.h"
+
+namespace RBX {
+ class World;
+ class RunService;
+ class Controller;
+ class Primitive;
+ class PartInstance;
+ class ModelInstance;
+ class JointInstance;
+ class DataModelMesh;
+ class Decal;
+ class Weld;
+ class Animator;
+
+ namespace HUMAN {
+ class HumanoidState;
+ }
+
+ namespace Soundscape {
+ class SoundChannel;
+ }
+
+ extern const char* const sHumanoid;
+ class Humanoid
+ : public DescribedCreatable
+ , public KernelJoint // Implements "computeForce"
+ , public IAdornable
+ , public ICharacterSubject
+ , public IModelModifier
+ , public IStepped
+ {
+ public:
+ enum NameOcclusion
+ {
+ NAME_OCCLUSION_NONE = 0,
+ NAME_OCCLUSION_ENEMY = 1,
+ NAME_OCCLUSION_ALL = 2,
+ };
+
+ enum HumanoidDisplayDistanceType
+ {
+ HUMANOID_DISPLAY_DISTANCE_TYPE_VIEWER = 0,
+ HUMANOID_DISPLAY_DISTANCE_TYPE_SUBJECT = 1,
+ HUMANOID_DISPLAY_DISTANCE_TYPE_NONE = 2,
+ };
+
+ enum HumanoidRigType
+ {
+ HUMANOID_RIG_TYPE_R6 = 0,
+ HUMANOID_RIG_TYPE_R15 = 1,
+ };
+ private:
+ friend unsigned int HUMAN::HumanoidState::checkComputeEvent(); // only used to check for exploits.
+
+ typedef DescribedCreatable Super;
+
+ /////////////////////////////////////////////
+ // REFLECTED DATA
+ shared_ptr seatPart; // seat the humanoid is sitting in
+ shared_ptr walkToPart; // if null, then use the walk speed control
+ Vector3 walkToPoint; // in part coordinate Frame
+ Vector3 walkDirection; // x == xvalue, y == 0, z== zvalue
+ Vector3 luaMoveDirection; // unit vector, used to move humanoid continously in that direction
+ Vector3 rawMovementVector; // unit vector, stores the raw input (never world adjusted)
+ Vector3 targetPoint;
+ Vector3 replicatedTargetPoint;
+ float walkAngleError;
+ HeapValue walkSpeed;
+ HeapValue walkSpeedShadow; // due to exploits.
+ HeapValue percentWalkSpeed; // used to make walk speed variable (for joysticks and the like)
+ HeapValue health;
+ HeapValue maxHealth;
+ mutable ObscureValue walkSpeedErrors; // only used in const member functions...
+ HeapValue jumpPower;
+ HeapValue maxSlopeAngle;
+ HeapValue hipHeight;
+ bool torsoArrived;
+ bool jump;
+ bool autoJump;
+ bool sit;
+ bool touchedHard;
+ bool strafe;
+ bool localSimulating; // am I simulating this humanoid?
+ bool ownedByLocalPlayer; // is this my own humanoid?
+ bool typing;
+ bool autorotate;
+ HumanoidRigType rigType;
+ HeapValue platformStanding;
+
+ bool autoJumpEnabled;
+
+ bool activatePhysics;
+ Vector3 activatePhysicsImpulse; //
+
+ int ragdollCriteria;
+ int numContacts; // Used to signal nearlyTouched event
+ NameOcclusion nameOcclusion;
+ HumanoidDisplayDistanceType displayDistanceType;
+ float nameDisplayDistance;
+ float healthDisplayDistance;
+ Vector3 cameraOffset; // When this humanoid is used as a camera target, offset the camera target by this vector
+
+ bool isWalkingFromStudioTouchEmulation;
+
+ std::string displayText;
+ ContentFilter::FilterResult filterState;
+
+ ///////////////////////////////////////////////
+ // INTERNAL DATA
+ // Controller interface - server side
+ bool isWalking;
+ double walkTimer;
+ Vector3 getDeltaToGoal() const;
+ void setWalkMode(bool walking);
+ void stepWalkMode(double gameDt);
+
+ bool clickToWalkEnabled;
+
+ bool stateTransitionEnabled[HUMAN::NUM_STATE_TYPES];
+
+ Vector3 lastFloorNormal;
+ // Humanoid Network Floor Platforms
+ boost::shared_ptr lastFloorPart;
+ boost::shared_ptr rootFloorMechPart;
+ int lastFilterPhase;
+
+ // hack - easiest place to update is on query of had neck
+ bool hadNeck; // has this humanoid ever had a neck? Only break joints on death if so
+ bool hadHealth; // has this humanoid ever had health > 0? Only break joints on death if so
+
+ Vector3 pos0; // for looking for movement spikes
+ Vector3 pos1;
+ Vector3 pos2;
+
+ void updateHadHealth() {
+ hadHealth = hadHealth || (health > 0.0f);
+ }
+
+ typedef enum {TORSO, HEAD, RIGHT_ARM, LEFT_ARM, RIGHT_LEG, LEFT_LEG, VISIBLE_TORSO, APPENDAGE_COUNT} AppendageType;
+
+ shared_ptr appendageCache[APPENDAGE_COUNT];
+ shared_ptr baseInstance;
+
+ rbx::signals::scoped_connection characterChildAdded;
+ rbx::signals::scoped_connection characterChildRemoved;
+ void onEvent_ChildModified(shared_ptr child);
+
+ boost::unordered_map, rbx::signals::scoped_connection> siblingMap;
+ void updateSiblingPropertyListener(shared_ptr sibling);
+ void onEvent_SiblingPropertyChanged(const RBX::Reflection::PropertyDescriptor* desc);
+
+ shared_ptr status;
+
+ rbx::signals::scoped_connection onCFrameChangedConnection;
+ rbx::signals::scoped_connection humanoidEquipConnection;
+
+ void setCachePointerByType(AppendageType appendage, PartInstance *part);
+ void updateBaseInstance();
+
+ const PartInstance* getConstAppendageSlow(AppendageType appendage) const;
+ PartInstance* getAppendageFast(AppendageType appendage, shared_ptr& appendagePart);
+ PartInstance* getAppendageSlow(AppendageType appendage);
+
+ World* world;
+ shared_ptr currentState;
+ HUMAN::StateType previousState;
+
+ shared_ptr animator;
+ Animator* getAnimator();
+
+ void updateLocalSimulating(); // Do I need to simulate this humanoid?
+
+ void onLocalHumanoidEnteringWorkspace();
+
+ void onCFrameChangedFromReflection();
+
+ bool hasWalkToPoint(Vector3& worldPosition) const;
+
+ bool canClickToWalk() const;
+
+ void setLocalTransparencyModifier(float transparencyModifier) const;
+
+ void setWalkDirectionInternal(const Vector3& value, bool raiseSignal);
+ void setJumpInternal(bool value, bool replicate);
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Instance
+ /*override*/ bool askSetParent(const Instance* instance) const;
+ /*override*/ void onAncestorChanged(const AncestorChanged& event);
+ /*override*/ void setName(const std::string& value);
+ /*override*/ void onServiceProvider(ServiceProvider* oldProvider, ServiceProvider* newProvider);
+ /*override*/ void onDescendantAdded(Instance* instance);
+ /*override*/ void onDescendantRemoving(const shared_ptr& instance);
+
+ ///////////////////////////////////////////////////////////////////////////
+ // IAdornable
+ /*override*/ bool shouldRender3dAdorn() const {return true;}
+ /*override*/ bool shouldRender3dSortedAdorn() const {return true;}
+ /*override*/ Vector3 render3dSortedPosition() const;
+ /*override*/ void render3dAdorn(Adorn* adorn);
+ /*override*/ void render3dSortedAdorn(Adorn* adorn);
+
+ void renderMultiplayer(Adorn* adorn, const RBX::Camera& camera);
+
+ void renderBillboard(Adorn* adorn, const RBX::Camera& camera);
+ void renderBillboardImpl(Adorn* adorn, const Vector2& screenLoc, float fontSize, const Color3& nameTagColor, float nameAlpha, float healthAlpha);
+
+ ///////////////////////////////////////////////////////////////////////////
+ // SteppedInstance
+ /*override*/ void onStepped(const Stepped& event);
+
+ ///////////////////////////////////////////////////////////////////////////
+ // KernelJoint / Connector
+ /*override*/ void computeForce(bool throttling);
+ /*override*/ Body* getEngineBody() {return getRootBodyFast();}
+ /*override*/ virtual KernelType getConnectorKernelType() const { return Connector::HUMANOID; }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // ILocation
+ /*override*/ const CoordinateFrame getLocation();
+
+ ///////////////////////////////////////////////////////////////////////////
+ // CameraSubject
+ /*override*/ const CoordinateFrame getRenderLocation();
+ /*override*/ const Vector3 getRenderSize();
+
+ ///////////////////////////////////////////////////////////////////////////
+ // ICharacterSubject
+ /*override*/ float getYAxisRotationalVelocity() const; // used for camera control
+ /*override*/ void setFirstPersonRotationalVelocity(const Vector3& desiredLook, bool firstPersonOn);
+ /*override*/ void getSelectionIgnorePrimitives(std::vector& primitives);
+ /*override*/ virtual bool hasFocusCoord() const {return getHeadSlow() != NULL;}
+
+ // Humanoid Platform Networking
+ bool validateNetworkUpdateDistance(PartInstance* floorPart, CoordinateFrame& previousFloorPosition, float& netDt);
+ void truncateDisplacementIfObstacle(PartInstance* floorPart, Vector3& newCharPosition, const Vector3& previousCharPosition);
+ Vector3 getSimulatedFrictionVelocityOffset(PartInstance* floorPart, Vector3& newCharPosition, const Vector3& previousCharPosition, const Vector3& charPosInFloorSpace, const RBX::Velocity& previousFloorVelocity, float& netDt);
+ const Velocity getHumanoidRelativeVelocityToPart(Primitive* floorPrim);
+
+ public:
+ void updateNetworkFloorPosition(PartInstance* floorPart, CoordinateFrame& previousFloorPosition, RBX::Velocity& lastFloorVelocity, float& netDt);
+ bool shouldNotApplyFloorVelocity(Primitive* floorPrim);
+ bool primitiveIsLastFloor(Primitive* prim);
+ void updateFloorSimPhaseCharVelocity(Primitive* floorPrim);
+ // End Humanoid Platform Networking
+
+
+ /*override*/ void tellCameraNear(float distance) const;
+ /*override*/ void tellCameraSubjectDidChange(shared_ptr oldSubject, shared_ptr newSubject) const;
+ /*override*/ void tellCursorOver(float cursorOffset) const;
+ /*override*/ void getCameraIgnorePrimitives(std::vector& primitives);
+ /*override*/ Velocity calcDesiredWalkVelocity() const; // used for camera control
+
+ static float autoTurnSpeed() {return 8.0f;}
+
+ Humanoid();
+ ~Humanoid();
+
+ bool waitingForTorso() { return !torsoArrived; }
+ bool isLegalForClientToChange(const Reflection::PropertyDescriptor& desc) const;
+ int getPlayerId();
+
+ enum Status
+ {
+ POISON_STATUS = 0,
+ CONFUSION_STATUS = 1,
+ };
+ bool hasStatus(Status status);
+ bool addStatus(Status status);
+ bool removeStatus(Status status);
+ bool hasCustomStatus(std::string status);
+ bool addCustomStatus(std::string status);
+ bool removeCustomStatus(std::string status);
+ bool isLocalSimulating() const {return localSimulating;}
+ bool computeNearlyTouched();
+
+ bool getStateTransitionEnabled(HUMAN::StateType state);
+ void setStateTransitionEnabled(HUMAN::StateType state, bool enabled);
+
+ shared_ptr getStatuses();
+ rbx::signal statusAddedSignal;
+ rbx::signal statusRemovedSignal;
+ rbx::signal customStatusAddedSignal;
+ rbx::signal customStatusRemovedSignal;
+
+ rbx::remote_signal)> serverEquipToolSignal;
+
+ // Humanoid Network Update Connection
+ rbx::signals::scoped_connection onPositionUpdatedByNetworkConnection;
+
+ NameOcclusion getNameOcclusion() const { return nameOcclusion; }
+ void setNameOcclusion(NameOcclusion value);
+
+ HumanoidDisplayDistanceType getDisplayDistanceType() const { return displayDistanceType; }
+ void setDisplayDistanceType(HumanoidDisplayDistanceType value);
+
+ static Humanoid* humanoidFromBodyPart(Instance* bodyPart);
+ static const Humanoid* constHumanoidFromBodyPart(const Instance* bodyPart);
+ static const Humanoid* constHumanoidFromDescendant(const Instance* bodyPart);
+
+ static Humanoid* modelIsCharacter(Instance* testModel);
+ static const Humanoid* modelIsConstCharacter(const Instance* testModel);
+
+ static Humanoid* getLocalHumanoidFromContext(Instance* context);
+ static const Humanoid* getConstLocalHumanoidFromContext(const Instance* context);
+
+ static PartInstance* getLocalHeadFromContext(Instance* context);
+ static const PartInstance* getConstLocalHeadFromContext(const Instance* context);
+
+ static ModelInstance* getCharacterFromHumanoid(Humanoid* humanoid);
+ static const ModelInstance* getConstCharacterFromHumanoid(const Humanoid* humanoid);
+
+ static PartInstance* getHeadFromCharacter(ModelInstance* character);
+ static const PartInstance* getConstHeadFromCharacter(const ModelInstance* character);
+
+ static Weld* getGrip(Instance* character);
+
+ static const Vector3 &defaultCharacterCorner() { static Vector3 corner(2.5f,2.5f,2.5f); return corner; }
+
+ // By Definition, these are all called by HumanoidState - these are reflected
+ rbx::signal diedSignal;
+ rbx::signal swimmingSignal;
+ rbx::signal runningSignal; // state change scripts
+ rbx::signal climbingSignal; // state change scripts
+ rbx::signal jumpingSignal; // state change scripts
+ rbx::signal freeFallingSignal;
+ rbx::signal strafingSignal;
+ rbx::signal gettingUpSignal;
+ rbx::signal fallingDownSignal;
+ rbx::signal ragdollSignal;
+ rbx::signal)> seatedSignal;
+ rbx::signal platformStandingSignal;
+ rbx::signal stateChangedSignal;
+ rbx::signal stateEnabledChangedSignal;
+ RBX::HUMAN::StateType getCurrentStateType();
+ RBX::HUMAN::StateType getPreviousStateType() { return previousState; };
+ void setPreviousStateType(RBX::HUMAN::StateType newState);
+ void changeState(RBX::HUMAN::StateType state);
+ static bool isStateInString(const std::string& text, const RBX::HUMAN::StateType &compare, RBX::HUMAN::StateType& value);
+
+ rbx::signal healthChangedSignal;
+
+ // Internal use only - no reflection - happens both client, server
+ rbx::signal doneSittingSignal;
+ rbx::signal donePlatformStandingSignal;
+
+ void equipToolInstance(shared_ptr instance);
+ void equipTool(RBX::Tool* tool);
+ void unequipTools();
+
+ void setWalkSpeed(float value);
+ float getWalkSpeed() const {return walkSpeed;}
+ void testWalkSpeed(float walkSpeed, float percentWalkSpeed) const
+ {
+ walkSpeedErrors = (walkSpeed > walkSpeedShadow) ? walkSpeedErrors + 1 : 0;
+ if (walkSpeedErrors > 8)
+ {
+ RBX::Security::setHackFlagVs(RBX::Security::hackFlag11, HATE_SPEEDHACK);
+ }
+ if (fabs(percentWalkSpeed) > 1.01)
+ {
+ RBX::Security::setHackFlagVs(RBX::Security::hackFlag11, HATE_SPEEDHACK);
+ }
+ }
+
+ void setPercentWalkSpeed(float value);
+ float getPercentWalkSpeed() const { return percentWalkSpeed; }
+
+ void setJumpPower(float value);
+ float getJumpPower() const { return jumpPower; }
+
+ void setMaxSlopeAngle(float value);
+ float getMaxSlopeAngle() const { return maxSlopeAngle; }
+
+ const Vector3 &getLastFloorNormal() const { return lastFloorNormal; }
+ void setLastFloorNormal(const Vector3 &norm) { lastFloorNormal = norm; }
+
+ void setHipHeight(float value);
+ float getHipHeight() const { return hipHeight; }
+
+ // Health / damage interface
+ void setHealth(float value);
+ void setHealthUi(float value);
+ void zeroHealthLocal() {health = 0.0f;} // for a non-simulating client -zero out health without bouncing back to the server
+ float getHealth() const {return health;}
+
+ void setMaxHealth(float value);
+ float getMaxHealth() const {return maxHealth;}
+
+ void setTyping(bool value) { typing = value; }
+ bool getTyping() const { return typing; }
+
+ void takeDamage(float value); // honors explosions, etc.
+
+ void setClickToWalkEnabled(bool value) { clickToWalkEnabled = value; }
+
+ // Controller interface - don't set the walk direction directly
+ void setWalkDirection(const Vector3& value); // compacted - z is in the y place
+ Vector3 getWalkDirection() const {return walkDirection;} // compacted - z is in the y place
+ bool allow3dWalkDirection() const;
+
+ void move(Vector3 walkVector, bool relativeToCamera);
+
+ Vector3 getLuaMoveDirection() const { return luaMoveDirection;}
+ void setLuaMoveDirection(const Vector3& value);
+ Vector3 getRawMovementVector() const { return rawMovementVector; }
+
+ bool getAutoJumpEnabled() const { return autoJumpEnabled; };
+ void setAutoJumpEnabled(bool value);
+
+ void setWalkAngleError(const float &value);
+ float getWalkAngleError() const {return walkAngleError;}
+
+ void setWalkToPoint(const Vector3& value);
+ const Vector3& getWalkToPoint() const {return walkToPoint;}
+
+ void setWalkToPart(PartInstance* value);
+ PartInstance* getWalkToPart() const {return walkToPart.get();}
+
+ void setSeatPart(PartInstance* value);
+ PartInstance* getSeatPart() const {return seatPart.get();}
+
+ void setJump(bool value);
+ bool getJump() const { return jump; }
+
+ void setAutoJump(bool value);
+ bool getAutoJump() const { return autoJump;}
+
+ void setSit(bool value);
+ bool getSit() const { return sit; }
+
+ void setAutoRotate(bool value);
+ bool getAutoRotate() const { return autorotate; }
+
+ void setTouchedHard(bool hit) { touchedHard = hit; }
+
+ void setActivatePhysics(bool flag, const Vector3& impulse)
+ {
+ activatePhysics = flag;
+ if (flag)
+ activatePhysicsImpulse += impulse;
+ else
+ activatePhysicsImpulse = impulse;
+ }
+ bool getActivatePhysics() { return activatePhysics; }
+ const Vector3 getActivatePhysicsImpulse() { return activatePhysicsImpulse; }
+ bool getTouchedHard() { return touchedHard; }
+
+ void setRagdollCriteria(int value);
+ int getRagdollCriteria() const { return ragdollCriteria; }
+
+ void setPlatformStanding(bool value);
+ bool getPlatformStanding() const { return platformStanding; }
+
+ void setStrafe(bool value);
+ bool getStrafe() const { return strafe; }
+
+ bool getDead() const;
+
+ void setHadNeck() {hadNeck = true;}
+ bool breakJointsOnDeath() const {return hadNeck && hadHealth;}
+
+ void setTargetPoint(const Vector3& value);
+ void setTargetPointLocal(const Vector3& value); // does not replicate
+ const Vector3& getTargetPoint() const {return targetPoint;}
+
+ void setNameDisplayDistance(float d);
+ float getNameDisplayDistance() const { return nameDisplayDistance; }
+
+ void setHealthDisplayDistance(float d);
+ float getHealthDisplayDistance() const { return healthDisplayDistance; }
+
+ void setCameraOffset(const Vector3 &value);
+ const Vector3 &getCamearaOffset() const { return cameraOffset; }
+
+ // Humanoid Platform Update Getters and Setters;
+ void setLastFloor(PartInstance* part)
+ {
+ if(lastFloorPart)
+ {
+ lastFloorPart.reset();
+ }
+ lastFloorPart = shared_from(part);
+ }
+ const shared_ptr& getLastFloor() const { return lastFloorPart; }
+
+ void setRootFloorPart(PartInstance* part)
+ {
+ if (rootFloorMechPart)
+ {
+ rootFloorMechPart.reset();
+ }
+ rootFloorMechPart = shared_from(part);
+ }
+ shared_ptr getRootFloorPart() const { return rootFloorMechPart; }
+
+ int getCurrentFloorFilterPhase();
+ int getCurrentFloorFilterPhase(Assembly* floorAssembly);
+
+ void setLastFloorPhase(int phase) { lastFilterPhase = phase; }
+ int getLastFloorPhase() const { return lastFilterPhase; }
+
+ // Walk Utilities
+ void moveTo(const Vector3& worldPosition, PartInstance* part);
+ void moveTo2(Vector3 worldPosition, shared_ptr part);
+ rbx::signal moveToFinishedSignal;
+
+ bool getUseR15() const { return (rigType != HUMANOID_RIG_TYPE_R6); }
+ Humanoid::HumanoidRigType getRigType() const { return rigType; }
+ void setRigType(Humanoid::HumanoidRigType type);
+
+ // Build Joints
+ void buildJoints(RBX::DataModel* dm = NULL);
+ void buildJointsFromAttachments(PartInstance* part, std::vector& characterParts);
+
+ JointInstance* getRightShoulder();
+ Joint* getNeck();
+
+ // Primitive
+ void getPrimitives(std::vector& primitives) const;
+
+ void getParts(std::vector& primitives) const;
+
+ PartInstance* getTorsoDangerous() const; // reflection only
+ PartInstance* getLeftLegDangerous() const; // reflection only
+ PartInstance* getRightLegDangerous() const; // reflection only
+
+ // TODO: No internal buffering - after refactor, rename without the word slow
+ PartInstance* getTorsoSlow(); // no internal buffering
+ PartInstance* getVisibleTorsoSlow();
+ PartInstance* getHeadSlow();
+ PartInstance* getLeftLegSlow();
+ PartInstance* getRightLegSlow();
+ PartInstance* getLeftArmSlow();
+ PartInstance* getRightArmSlow();
+ StatusInstance* getStatusSlow();
+
+ const PartInstance* getTorsoSlow() const; // no internal buffering
+ const PartInstance* getVisibleTorsoSlow() const;
+ const PartInstance* getHeadSlow() const;
+ const PartInstance* getLeftLegSlow() const;
+ const PartInstance* getRightLegSlow() const;
+ const PartInstance* getLeftArmSlow() const;
+ const PartInstance* getRightArmSlow() const;
+ const StatusInstance* getStatusSlow() const;
+
+ Primitive* getTorsoPrimitiveSlow();
+ Primitive* getHeadPrimitiveSlow();
+
+ // Internal buffering
+ PartInstance* getTorsoFast();
+ PartInstance* getVisibleTorsoFast();
+ PartInstance* getHeadFast();
+ PartInstance* getLeftLegFast();
+ PartInstance* getRightLegFast();
+ PartInstance* getLeftArmFast();
+ PartInstance* getRightArmFast();
+ StatusInstance* getStatusFast();
+
+ Primitive* getTorsoPrimitiveFast();
+
+ // Body
+ inline Body* getTorsoBodyFast()
+ {
+ Primitive* prim = getTorsoPrimitiveFast();
+ return prim ? prim->getBody() : NULL;
+ }
+ Body* getRootBodyFast();
+
+ // Attachment Points
+ CoordinateFrame getTopOfHead() const;
+ CoordinateFrame getRightArmGrip() const;
+
+ float getTorsoHeading() const; // 0 == North == -Z. Pi/2 = WEST == -x
+ float getTorsoElevation() const;
+
+ void setTorso(PartInstance* value);
+ void setLeftLeg(PartInstance* value);
+ void setRightLeg(PartInstance* value);
+
+ void setHeadMesh(DataModelMesh* value);
+ void setHeadDecal(Decal* value);
+
+ World* getWorld() {return world;};
+ const World* getConstWorld() const {return world;};
+
+ static void renderWaypoint(Adorn* adorn, const Vector3& waypoint);
+
+ // proxy interface to Animator object.
+ shared_ptr loadAnimation(shared_ptr animation);
+ bool CheckTorso();
+ void setupAnimator();
+ shared_ptr getPlayingAnimationTracks();
+
+ rbx::signal)> animationPlayedSignal;
+
+ bool getOwnedByLocalPlayer() const { return ownedByLocalPlayer; }
+
+ bool getWalkingFromStudioTouchEmulation() const { return isWalkingFromStudioTouchEmulation; }
+ void setWalkingFromStudioTouchEmulation(bool value) { isWalkingFromStudioTouchEmulation = value; }
+ };
+
+} // namespace RBX
diff --git a/App/humanoid/HumanoidState.h b/App/humanoid/HumanoidState.h
new file mode 100644
index 0000000..e37ff8e
--- /dev/null
+++ b/App/humanoid/HumanoidState.h
@@ -0,0 +1,346 @@
+/* Copyright 2003-2007 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+
+#include "Util/HitTestFilter.h"
+#include "GfxBase/IAdornable.h"
+#include "Util/Name.h"
+#include "rbx/Debug.h"
+#include "Util/Velocity.h"
+#include "rbx/boost.hpp"
+#include "Reflection/Event.h"
+#include "G3D/Array.h"
+#include "util/PartMaterial.h"
+
+#include
+
+#define CHARACTER_FORCE_DEBUG 0
+
+namespace RBX
+{
+ class Humanoid;
+ class PartInstance;
+ class Controller;
+ class Assembly;
+ class GeometryService;
+
+ namespace HUMAN
+ {
+ typedef enum { FALLING_DWN = 0,
+ RAGDOLL, // 1
+ GETTING_UP,
+ JUMPING,
+ SWIMMING,
+ FREE_FALL, // 4: balancing, no thrust
+ FLYING,
+ LANDED, // 6: can't jump
+ RUNNING, // 7
+ RUNNING_SLAVE, // 8: slave side - lock to running mode to do accurate physics when touched slave side
+ RUNNING_NO_PHYS, // 9
+ STRAFING_NO_PHYS,
+ CLIMBING,
+ SEATED,
+ PLATFORM_STANDING,
+ DEAD,
+ PHYSICS,
+ NUM_STATE_TYPES,
+ xx } StateType; // XX == NO change
+
+ typedef enum { NO_HEALTH = 0, // Humanoid Commands
+ NO_NECK,
+ JUMP_CMD,
+ STRAFE_CMD,
+ NO_STRAFE_CMD,
+ SIT_CMD,
+ NO_SIT_CMD,
+ PLATFORM_STAND_CMD,
+ NO_PLATFORM_STAND_CMD,
+ TIPPED, // Tilting
+ UPRIGHT,
+ FACE_LDR, // Ladder
+ AWAY_LDR,
+ OFF_FLOOR, // Floor
+ OFF_FLOOR_GRACE, // Floor w/ Grace Period
+ ON_FLOOR,
+ TOUCHED, // Other Objects
+ NEARLY_TOUCHED, // Other Objects
+ TOUCHED_HARD,
+ ACTIVATE_PHYSICS,
+ FINISHED,
+ TIMER_UP, // FINISHED_FALLING, READY_TO_JUMP,
+ NO_TOUCH_ONE_SECOND,
+ HAS_GYRO,
+ HAS_BUOYANCY,
+ NO_BUOYANCY,
+ NUM_EVENT_TYPES } EventType;
+
+#if CHARACTER_FORCE_DEBUG
+ class DebugRay
+ {
+ public:
+ RbxRay ray;
+ Color3 color;
+
+ DebugRay(const RbxRay& _ray, const Color3& _color)
+ {
+ ray = _ray;
+ color = _color;
+ }
+
+ void Draw(Adorn* adorn);
+ };
+#endif
+
+ class HumanoidState : public INamed,
+ public HitTestFilter
+
+ {
+ public:
+ static const unsigned int kCorrectCheckValue = 2;
+
+ private:
+ const Vector3& unitializedFloorTouch() const {
+ static Vector3 v(1e15f, 1e15f, 1e15f);
+ return v;
+ }
+
+ Humanoid* humanoid;
+ float timer;
+ float noTouchTimer;
+ bool nearlyTouched;
+ bool shouldRender;
+ bool finished;
+ bool outOfWater;
+ bool headClear;
+ StateType priorState;
+ StateType luaState;
+
+ G3D::Array foundParts; // temp buffer
+ bool facingLadder;
+ shared_ptr floorPart;
+ PartMaterial floorMaterial;
+ Vector3 floorTouchInWorld;
+ Vector3 floorTouchNormal;
+ Vector3 floorHumanoidLocationInWorld;
+ float noFloorTimer;
+
+ // Cut down firing of the running event to when there are major difference in velocity
+ float lastMovementVelocity;
+
+ // signals that the state needs these updated
+ bool usesEvent(EventType e) const;
+ bool usesLadder() const {return (usesEvent(FACE_LDR) || usesEvent(AWAY_LDR));}
+ bool usesFloor() const {return (usesEvent(OFF_FLOOR) || usesEvent(ON_FLOOR) || usesEvent(OFF_FLOOR_GRACE));}
+
+ float computeTilt() const;
+ bool computeTipped() const;
+ bool computeUpright() const;
+ bool computeHasGyro() const;
+ bool computeJumped() const;
+ float computeFloorTilt() const;
+
+ void setLegsCanCollide(bool canCollide);
+ void setArmsCanCollide(bool canCollide);
+ void setHeadCanCollide(bool canCollide);
+ void setTorsoCanCollide(bool canCollide);
+
+ int ladderCheck;
+ virtual int ladderCheckRate() { return 2; }
+ bool findPrimitiveInLadderZone(Adorn* adorn);
+ bool findLadder(Adorn* adorn);
+ void doLadderRaycast(GeometryService *geom, const RbxRay& caster,Humanoid* humanoid, Primitive** hitPrimOut,
+ Vector3* hitLocationOut);
+ void doAutoJump();
+ void findFloor(shared_ptr& oldFloor);
+ shared_ptr tryFloor(const RbxRay& ray, Vector3& hitLocation, Vector3& hitNormal, float maxDistance, Assembly* humanoidAssembly, PartMaterial& recentFloorMaterial);
+ void AverageFloorRayCast(shared_ptr &floorPart, Vector3& floorPartHitLocation, Vector3& floorPartHitNormal,
+ PartMaterial& floorPartHitMaterial, Vector3& hitLocationAccumulator, int& hitLocationCount, const bool UpdateFloorPart,
+ const Vector3& offset, const float maxDistance, Assembly* humanoidAssembly, const CoordinateFrame& torsoC);
+ void preStepFloor();
+ void preStepCollide();
+ void preStepSimulatorSide(float dt);
+ void preStepSlaveSide() {preStepCollide();}
+
+ static void doSimulatorStateTable(shared_ptr& state, float dt);
+ static void doSlaveStateTable(shared_ptr& state, StateType newType);
+ static HumanoidState* create(StateType newType, StateType oldType, Humanoid* humanoid);
+ static HumanoidState* createNew(StateType newType, StateType oldType, Humanoid* humanoid);
+ static void changeState(shared_ptr& state, StateType newType);
+
+ void fireEvent(StateType stateType, bool entering);
+
+ // Override hitTestFiler
+ /*override*/ Result filterResult(const Primitive* testMe) const;
+
+ protected:
+
+ // For debugging
+ Vector3 maxTorque;
+ Vector3 maxForce;
+ float maxContactVel;
+ Vector3 lastTorque;
+ Vector3 lastForce;
+ float lastContactVel;
+
+ static float minMoveVelocity() {return 0.5f;}
+ static float maxClimbDistance() {return 2.45f;} // studs
+ static const Vector3 maxMoveForce() {static Vector3 m(1000.0f, 10000.0f, 1000.0f); return m;} //const Vector3 maxMoveAccelerationGrid(5e4f*0.02f, 5e5f*0.02f, 1e4f*0.02f);
+ static const Vector3 minMoveForce() {static Vector3 m(-1000.0f, 0.0f, -1000.0f); return m;}
+ static const Vector3 maxSwimmingMoveForce() {static Vector3 m(10000.0f, 1000.0f, 10000.0f); return m;}
+ static const Vector3 minSwimmingMoveForce() {static Vector3 m(-10000.0f, -10000.0f, -10000.0f); return m;}
+ static float fallDelay() { return 0.125f; }
+ static float maxLinearMoveForce() { return 143.0; }
+
+ // Need public for some Physics calculations outside of Humanoid State
+ public:
+ float steepSlopeAngle() const;
+ static float runningKMoveP();
+ static float runningKMovePForPGS();
+ static float maxLinearGroundMoveForce() { return 500.0; }
+
+ protected:
+ Assembly* filteringAssembly;
+
+ bool computeEvent(EventType eventType);
+
+ bool computeTouched();
+ bool computeNearlyTouched();
+ bool computeTouchedByMySimulation();
+ bool computeTouchedHard();
+ bool computeActivatePhysics();
+
+ void setOutOfWater() { outOfWater = true; }
+ bool getOutOfWater() const { return outOfWater; }
+
+ void setTimer(float time) {timer = time;}
+ float getTimer() const {return timer;}
+
+ bool getFinished() const {return finished;}
+ void setFinished(bool value) {finished = value;}
+
+ bool getFacingLadder() const {return facingLadder;}
+ bool getHeadClear() const { return headClear; }
+
+ PartMaterial getFloorMaterial() const { return floorMaterial; }
+ float getFloorFrictionProperty(Primitive* floorPrim) const;
+
+ Primitive* getFloorPrimitive();
+ const Primitive* getFloorPrimitiveConst() const;
+ const Vector3& getFloorTouchInWorld() const {
+ RBXASSERT(floorTouchInWorld != unitializedFloorTouch());
+ return floorTouchInWorld;
+ }
+ const Vector3& getFloorTouchNormal() const {
+ RBXASSERT(floorTouchInWorld != unitializedFloorTouch());
+ return floorTouchNormal;
+ }
+ const Vector3& getFloorHumanoidLocationInWorld() const {
+ RBXASSERT(floorHumanoidLocationInWorld != unitializedFloorTouch());
+ return floorHumanoidLocationInWorld;
+ }
+
+
+ const Velocity getFloorPointVelocity();
+ Vector3 getRelativeMovementVelocity();
+ float getDesiredAltitude() const;
+
+#if CHARACTER_FORCE_DEBUG
+ std::vector debugRayList;
+#endif
+
+ void fireMovementSignal(rbx::signal& movementSignal, float movementVelocity);
+
+ // Tick Count - 30 FPS, state table occurs here
+ virtual void onComputeForceImpl() = 0;
+ virtual void onStepImpl() {}
+ virtual void onSimulatorStepImpl(float stepDt) {}
+
+ protected:
+ void setCanThrottleState(bool canThrottle); // only the Seated state can throttle - its joined to parts so it must
+
+ // Attributes moved in assemblies
+ Assembly* getAssembly();
+ const Assembly* getAssemblyConst() const;
+ void stateToAssembly();
+ StateType stateFromAssembly();
+
+ public:
+ virtual bool armsShouldCollide() const {return true;}
+ virtual bool legsShouldCollide() const {return true;}
+ virtual bool headShouldCollide() const {return true;}
+ virtual bool torsoShouldCollide() const {return true;}
+
+ virtual bool enableAutoJump() const { return true; }
+
+ virtual void onCFrameChangedFromReflection() { preStepFloor();} // recalculate floor part
+
+
+ HumanoidState(Humanoid* humanoid, StateType priorState);
+
+ virtual ~HumanoidState();
+
+ const Humanoid* getHumanoidConst() const;
+
+ Humanoid* getHumanoid() {
+ return const_cast(getHumanoidConst());
+ }
+
+ static HumanoidState* defaultState(Humanoid* humanoid); // new Running(this));
+
+ static void simulate(shared_ptr& state, float dt);
+
+ static void updateHumanoidFloorStatus(shared_ptr& state);
+
+ static bool hasFloorChanged(shared_ptr& state, Primitive* lastFloorPrim);
+
+ static void noSimulate(shared_ptr& state); // for non-simulating humanoids, match states
+
+ virtual void fireEvents();
+
+ virtual float getYAxisRotationalVelocity() const {return 0.0f;}
+
+ float getCharacterHipHeight() const;
+
+ void onComputeForce();
+
+ bool torsoHasBuoyancy, leftLegHasBuoyancy, rightLegHasBuoyancy;
+ std::vector buoyancyConnections;
+ void setTorsoHasBuoyancy( bool value ) { torsoHasBuoyancy = value; }
+ void setLeftLegHasBuoyancy( bool value ) { leftLegHasBuoyancy = value; }
+ void setRightLegHasBuoyancy( bool value ) { rightLegHasBuoyancy = value; }
+ bool computeHasBuoyancy();
+
+ virtual StateType getStateType() const = 0;
+
+ void setLuaState(StateType state);
+ StateType getLuaState() { return luaState; }
+
+ static const char *getStateNameByType(StateType state);
+
+ bool computeHitByHighImpactObject();
+
+ // only in debug
+ void render3dAdorn(Adorn* adorn);
+
+ void setNearlyTouched();
+
+ // for security purposes, get the address of this code.
+ // A member function pointer is a compiler defined data structure.
+ static inline const void* getComputeEventBaseAddress()
+ {
+#ifdef _WIN32
+ bool (RBX::HUMAN::HumanoidState::* hsce)(EventType) = &computeEvent;
+ if(sizeof(hsce) == 8 || sizeof(hsce) == 4)
+ {
+ return (const void*&)(hsce); // odd, but required syntax for this horrible conversion.
+ }
+#endif
+ return NULL;
+ }
+
+ unsigned int checkComputeEvent(); // this was added due to exploits.
+ };
+
+ } // namespace HUMAN
+} // namespace RBX
diff --git a/App/humanoid/Jumping.h b/App/humanoid/Jumping.h
new file mode 100644
index 0000000..ab3eef7
--- /dev/null
+++ b/App/humanoid/Jumping.h
@@ -0,0 +1,43 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Humanoid/Flying.h"
+
+namespace RBX {
+ namespace HUMAN {
+
+ extern const char* const sJumping;
+
+ class Jumping : public Named
+ {
+ private:
+ typedef Named Super;
+ /*override*/ StateType getStateType() const {return JUMPING;}
+
+ // Humanoid::State
+ /*override*/ void onComputeForceImpl();
+
+ /*override*/ bool armsShouldCollide() const {return false;}
+ /*override*/ bool legsShouldCollide() const {return false;}
+ /*override*/ bool torsoShouldCollide() const {return false;}
+
+ // Override hitTestFiler
+ /*override*/ Result filterResult(const Primitive* testMe) const;
+
+ bool findCeiling();
+ shared_ptr tryCeiling(const RbxRay& ray, float maxDistance, Assembly* humanoidAssembly);
+
+ Vector3 jumpDir;
+
+ public:
+ Jumping(Humanoid* humanoid, StateType priorState);
+
+ static float kJumpP() {return 500.0f;}
+ static float kJumpVelocityGrid() {return 50.0f;}
+
+ };
+
+ } // namespace HUMAN
+} // namespace
+
diff --git a/App/humanoid/MovingNoPhysicsBase.h b/App/humanoid/MovingNoPhysicsBase.h
new file mode 100644
index 0000000..e806d2d
--- /dev/null
+++ b/App/humanoid/MovingNoPhysicsBase.h
@@ -0,0 +1,51 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Humanoid/HumanoidState.h"
+#include "V8World/Mechanism.h"
+
+namespace RBX {
+ class Assembly;
+ class PhysicsService;
+
+namespace HUMAN {
+
+ extern const char* const sMovingNoPhysicsBase;
+
+ class MovingNoPhysicsBase
+ : public Named
+ {
+ private:
+ typedef Named Super;
+ /*override*/ StateType getStateType() const {return RUNNING_NO_PHYS;}
+ /*override*/ void fireEvents();
+
+ shared_ptr torsoPart;
+ weak_ptr physicsService;
+
+ rbx::signals::scoped_connection torsoAncestryChanged;
+ void onEvent_TorsoAncestryChanged();
+ void disconnectTorso();
+
+ const Assembly* getAssemblyConst() const;
+
+ void applyImpulseToFloor(float dt);
+
+ protected:
+
+ // Humanoid::State
+ /*override*/ void onSimulatorStepImpl(float stepDt);
+ /*override*/ void onComputeForceImpl();
+
+ /*override*/ bool armsShouldCollide() const {return false;}
+ /*override*/ bool legsShouldCollide() const {return false;}
+ /*override*/ bool headTorsoShouldCollide() const {return false;}
+
+ public:
+ MovingNoPhysicsBase(Humanoid* humanoid, StateType priorState);
+ ~MovingNoPhysicsBase();
+ };
+
+ } // namespace HUMAN
+} // namespace
diff --git a/App/humanoid/Ragdoll.h b/App/humanoid/Ragdoll.h
new file mode 100644
index 0000000..51f04a4
--- /dev/null
+++ b/App/humanoid/Ragdoll.h
@@ -0,0 +1,30 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Humanoid/Balancing.h"
+#include "Util/Name.h"
+
+namespace RBX {
+ namespace HUMAN {
+
+ // Flying occurs when there's no ground below you. You have the ability
+ // to turn around the y-axis, but not much else.
+ extern const char* const sRagdoll;
+
+ class Ragdoll : public Named
+ {
+ private:
+ typedef Named Super;
+ /*override*/ StateType getStateType() const {return RAGDOLL;}
+ /*override*/ void onStepImpl();
+ /*override*/ void onComputeForceImpl() {}
+ /*override*/ bool enableAutoJump() const { return false; }
+ public:
+ Ragdoll(Humanoid* humanoid, StateType priorState);
+ ~Ragdoll();
+ };
+
+ } // namespace HUMAN
+} // namespace
+
diff --git a/App/humanoid/Running.h b/App/humanoid/Running.h
new file mode 100644
index 0000000..193e090
--- /dev/null
+++ b/App/humanoid/Running.h
@@ -0,0 +1,66 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Humanoid/RunningBase.h"
+
+namespace RBX {
+
+ class Body;
+
+ namespace HUMAN {
+
+ extern const char* const sRunning;
+ extern const char* const sRunningSlave;
+ extern const char* const sLanded;
+ extern const char* const sClimbing;
+
+
+ class Running : public Named
+ {
+ private:
+ typedef Named Super;
+ /*override*/ StateType getStateType() const {return RUNNING;}
+ /*override*/ void fireEvents();
+
+ protected:
+ /*override*/ void onComputeForceImpl();
+
+ public:
+ Running(Humanoid* humanoid, StateType priorState);
+ };
+
+ // Slave side only - stays running until some other change to respond to touch events correctly
+ class RunningSlave : public Named
+ {
+ public:
+ RunningSlave(Humanoid* humanoid, StateType priorState);
+ };
+
+ class Landed : public Named
+ {
+ private:
+ /*override*/ StateType getStateType() const {return LANDED;}
+
+ public:
+ Landed(Humanoid* humanoid, StateType priorState);
+ };
+
+
+ class Climbing : public Named
+ {
+ private:
+ typedef Named Super;
+ /*override*/ StateType getStateType() const {return CLIMBING;}
+ /*override*/ void fireEvents();
+ /*override*/ int ladderCheckRate() { return 0; }
+ /*override*/ bool enableAutoJump() const { return false; }
+ public:
+ Climbing(Humanoid* humanoid, StateType priorState) : Named(humanoid, priorState)
+ {}
+
+ };
+
+ } // namespace HUMAN
+} // namespace RBX
+
diff --git a/App/humanoid/RunningBase.h b/App/humanoid/RunningBase.h
new file mode 100644
index 0000000..5c50000
--- /dev/null
+++ b/App/humanoid/RunningBase.h
@@ -0,0 +1,51 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Humanoid/Balancing.h"
+
+
+namespace RBX {
+ class Body;
+
+namespace HUMAN {
+
+ class RunningBase : public Balancing
+ {
+ private:
+ typedef Balancing Super;
+ protected:
+ Velocity floorVelocity;
+
+ // The following velocities are w.r.t the ground that the figure is walking on. The ground may be moving
+ Velocity desiredVelocity; // desired velocity in world coordinates relative to the floor's velocity
+ float desiredAltitude; // ignored if 0.0
+
+ void rotateWithGround(Body* body);
+ void hoverOnFloor(Body* body);
+ void move(Body* body);
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Humanoid::State
+ /*override*/ void onComputeForceImpl();
+ /*override*/ void onSimulatorStepImpl(float stepDt);
+
+ /*override*/ float getYAxisRotationalVelocity() const {return desiredVelocity.rotational.y;}
+
+ /*override*/ bool armsShouldCollide() const {return false;}
+ /*override*/ bool legsShouldCollide() const {return false;}
+
+ public:
+ RunningBase(Humanoid* humanoid, StateType priorState);
+ RunningBase(Humanoid* humanoid, StateType priorState, const float kP, const float kD);
+
+ /*override*/ void onCFrameChangedFromReflection();
+
+ static const float kTurnP() {return 7500.0f;}
+ static const float kTurnPForRotatePGS() {return 450.0f;}
+ static const float kTurnPForFreeFallPGS() {return 375.0f;}
+ };
+
+ } // namespace HUMAN
+} // namespace RBX
\ No newline at end of file
diff --git a/App/humanoid/RunningNoPhysics.h b/App/humanoid/RunningNoPhysics.h
new file mode 100644
index 0000000..2ce0320
--- /dev/null
+++ b/App/humanoid/RunningNoPhysics.h
@@ -0,0 +1,24 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Humanoid/MovingNoPhysicsBase.h"
+
+namespace RBX {
+ class Clump;
+
+namespace HUMAN {
+
+ extern const char* const sRunningNoPhysics;
+
+ class RunningNoPhysics
+ : public Named
+ {
+ private:
+ /*override*/ StateType getStateType() const {return RUNNING_NO_PHYS;}
+ public:
+ RunningNoPhysics(Humanoid* humanoid, StateType priorState);
+ };
+
+ } // namespace HUMAN
+} // namespace
diff --git a/App/humanoid/Seated.h b/App/humanoid/Seated.h
new file mode 100644
index 0000000..814e1d0
--- /dev/null
+++ b/App/humanoid/Seated.h
@@ -0,0 +1,48 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Humanoid/HumanoidState.h"
+
+namespace RBX {
+
+ namespace HUMAN {
+
+ extern const char *const sSeated;
+
+ class Seated : public Named
+ {
+ private:
+ /*override*/ StateType getStateType() const {return SEATED;}
+
+ /*override*/ bool armsShouldCollide() const {return false;}
+ /*override*/ bool legsShouldCollide() const {return false;}
+ /*override*/ void onComputeForceImpl() {}
+ /*override*/ bool enableAutoJump() const { return false; }
+
+ public:
+ Seated(Humanoid* humanoid, StateType priorState);
+ ~Seated();
+ };
+
+
+ extern const char* const sPlatformStanding;
+
+ class PlatformStanding : public Named
+ {
+ private:
+ /*override*/ StateType getStateType() const {return PLATFORM_STANDING;}
+
+ /*override*/ bool armsShouldCollide() const {return false;}
+ /*override*/ bool legsShouldCollide() const {return false;}
+ /*override*/ void onComputeForceImpl() {}
+ /*override*/ bool enableAutoJump() const { return false; }
+
+ public:
+ PlatformStanding(Humanoid* humanoid, StateType priorState);
+ ~PlatformStanding();
+ };
+
+ } // namespace
+} // namespace
+
diff --git a/App/humanoid/StatusInstance.h b/App/humanoid/StatusInstance.h
new file mode 100644
index 0000000..8bf313e
--- /dev/null
+++ b/App/humanoid/StatusInstance.h
@@ -0,0 +1,24 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "V8DataModel/ModelInstance.h"
+
+namespace RBX {
+
+ extern const char* const sStatusInstance;
+ class StatusInstance
+ : public DescribedCreatable
+ {
+ private:
+ typedef DescribedCreatable Super;
+
+ public:
+ StatusInstance();
+
+ protected:
+ /*override*/ bool askSetParent(const Instance* instance) const;
+ /*override*/ bool askForbidParent(const Instance* instance) const { return !askSetParent(instance); }
+ };
+
+} // namespace
diff --git a/App/humanoid/StrafingNoPhysics.h b/App/humanoid/StrafingNoPhysics.h
new file mode 100644
index 0000000..8542f9e
--- /dev/null
+++ b/App/humanoid/StrafingNoPhysics.h
@@ -0,0 +1,24 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Humanoid/MovingNoPhysicsBase.h"
+
+namespace RBX {
+ class Clump;
+
+namespace HUMAN {
+
+ extern const char* const sStrafingNoPhysics;
+
+ class StrafingNoPhysics
+ : public Named
+ {
+ private:
+ /*override*/ StateType getStateType() const {return STRAFING_NO_PHYS;}
+ public:
+ StrafingNoPhysics(Humanoid* humanoid, StateType priorState);
+ };
+
+ } // namespace HUMAN
+} // namespace
diff --git a/App/humanoid/Swimming.h b/App/humanoid/Swimming.h
new file mode 100644
index 0000000..c57be7f
--- /dev/null
+++ b/App/humanoid/Swimming.h
@@ -0,0 +1,43 @@
+/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
+
+#pragma once
+
+#include "Humanoid/Balancing.h"
+#include "Util/Name.h"
+
+namespace RBX {
+ namespace HUMAN {
+
+ extern const char* const sSwimming;
+
+ class Swimming : public Named
+ {
+ private:
+ typedef Named Super;
+ Vector3 initialLinearVelocity;
+ static float velocityDecay();
+
+ /*override*/ StateType getStateType() const {return SWIMMING;}
+ /*override*/ void fireEvents();
+ /*override*/ bool enableAutoJump() const { return false; }
+
+ Velocity desiredVelocity;
+
+ protected:
+ ///////////////////////////////////////////////////////////////////////////
+ // Humanoid::State
+ /*override*/ void onComputeForceImpl();
+ /*override*/ void onSimulatorStepImpl(float stepDt);
+
+ public:
+ Swimming(Humanoid* humanoid, StateType priorState);
+
+
+
+ static const float kTurnSpeed() {return 6.0f;} // note Humanoid autoTurnSpeed is 8.0f;
+ static const float kTurnAccelMax() {return 20000.0f * kTurnSpeed();}
+ };
+
+ } // namespace HUMAN
+} // namespace
+
diff --git a/App/include/reflection/Type.h b/App/include/reflection/Type.h
index c1cee53..0fede78 100644
--- a/App/include/reflection/Type.h
+++ b/App/include/reflection/Type.h
@@ -58,7 +58,7 @@ namespace RBX
:Descriptor(name, Descriptor::Attributes())
,tag(Name::lookup(name))
,isNumber(boost::is_arithmetic::value)
- ,isFloat(boost::is_floating_point::value)
+ ,isFloat(boost::is_float::value)
,isEnum(false)
{
*isOutdated = false;
@@ -71,7 +71,7 @@ namespace RBX
:Descriptor(name, Descriptor::Attributes())
,tag(Name::declare(tag))
,isNumber(boost::is_arithmetic::value)
- ,isFloat(boost::is_floating_point::value)
+ ,isFloat(boost::is_float::value)
,isEnum(false)
{
RBXASSERT(!this->tag.empty());
diff --git a/App/include/reflection/reflection.h b/App/include/reflection/reflection.h
index c2b8a72..4f859da 100644
--- a/App/include/reflection/reflection.h
+++ b/App/include/reflection/reflection.h
@@ -133,7 +133,7 @@ namespace RBX
/*implement*/ void setValue(DescribedBase* object, const V& value) const
{
Class* c = boost::polymorphic_downcast(object);
- set(c, value);
+ (c->*set)(value);
}
};
diff --git a/App/include/v8datamodel/DataModel.h b/App/include/v8datamodel/DataModel.h
index cb23da7..c855cea 100644
--- a/App/include/v8datamodel/DataModel.h
+++ b/App/include/v8datamodel/DataModel.h
@@ -125,7 +125,6 @@ public:
rbx::signal screenshotReadySignal;
rbx::signal screenshotUploadSignal;
-
rbx::signal graphicsQualityShortcutSignal;
rbx::signal allowedGearTypeChanged;
@@ -227,8 +226,6 @@ private:
bool networkStatsWindowsOn;
- bool isRobloxApp;
-
bool renderGuisActive;
RBX::Game* game;
@@ -251,8 +248,6 @@ private:
public:
static bool BlockingDataModelShutdown;
- static bool isXboxApp;
-
static unsigned int perfStats; // another bitmask used to record detected hacks
std::string jobId;
@@ -384,9 +379,6 @@ public:
bool isStudio() const { return runningInStudio; }
void setIsStudio(bool runningInStudio);
- bool getIsXboxApp() const { return isXboxApp; }
- void setIsXboxApp(bool value);
-
bool isRunMode() const { return isStudioRunMode; }
void setIsRunMode(bool value);
@@ -499,8 +491,6 @@ public:
void save(ContentId contentId);
static bool canSave(const RBX::Instance* instance);
-
-
bool getRemoteBuildMode();
void setRemoteBuildMode(bool remoteBuildMode);
diff --git a/App/include/v8datamodel/GAMEBASICSETTINGS.H b/App/include/v8datamodel/GAMEBASICSETTINGS.H
index 00e8530..81becc5 100644
--- a/App/include/v8datamodel/GAMEBASICSETTINGS.H
+++ b/App/include/v8datamodel/GAMEBASICSETTINGS.H
@@ -5,33 +5,37 @@
namespace RBX
{
- extern const char *const sGameBasicSettings;
+ extern const char* const sGameBasicSettings;
class GameBasicSettings
: public GlobalBasicSettingsItem
{
typedef GlobalBasicSettingsItem Super;
public:
- enum ControlMode {CONTROL_CLASSIC = 0, CONTROL_MOUSELOCK = 1, CONTROL_HYBRID = 2, CONTROL_CAMLOCK = 3, CONTROL_MOUSEPAN = 4};
- enum RenderQualitySetting {QUALITY_AUTO = 0, QUALITY_1 = 1, QUALITY_2 = 2, QUALITY_3 = 3, QUALITY_4 = 4, QUALITY_5 = 5, QUALITY_6 = 6, QUALITY_7 = 7, QUALITY_8 = 8, QUALITY_9 = 9, QUALITY_10 = 10};
- enum CameraMode {CAMERA_MODE_DEFAULT = 0, CAMERA_MODE_CLASSIC = 1, CAMERA_MODE_FOLLOW = 2};
+ enum ControlMode { CONTROL_CLASSIC = 0, CONTROL_MOUSELOCK = 1, CONTROL_HYBRID = 2, CONTROL_CAMLOCK = 3, CONTROL_MOUSEPAN = 4 };
+ enum RenderQualitySetting { QUALITY_AUTO = 0, QUALITY_1 = 1, QUALITY_2 = 2, QUALITY_3 = 3, QUALITY_4 = 4, QUALITY_5 = 5, QUALITY_6 = 6, QUALITY_7 = 7, QUALITY_8 = 8, QUALITY_9 = 9, QUALITY_10 = 10 };
+ enum CameraMode { CAMERA_MODE_DEFAULT = 0, CAMERA_MODE_CLASSIC = 1, CAMERA_MODE_FOLLOW = 2 };
enum TouchCameraMovementMode {
- TOUCH_CAMERA_MOVEMENT_MODE_DEFAULT = 0,
- TOUCH_CAMERA_MOVEMENT_MODE_CLASSIC = 1,
- TOUCH_CAMERA_MOVEMENT_MODE_FOLLOW = 2 };
+ TOUCH_CAMERA_MOVEMENT_MODE_DEFAULT = 0,
+ TOUCH_CAMERA_MOVEMENT_MODE_CLASSIC = 1,
+ TOUCH_CAMERA_MOVEMENT_MODE_FOLLOW = 2
+ };
enum ComputerCameraMovementMode {
- COMPUTER_CAMERA_MOVEMENT_MODE_DEFAULT = 0,
- COMPUTER_CAMERA_MOVEMENT_MODE_CLASSIC = 1,
- COMPUTER_CAMERA_MOVEMENT_MODE_FOLLOW = 2};
- enum TouchMovementMode {
- TOUCH_MOVEMENT_MODE_DEFAULT = 0,
- TOUCH_MOVEMENT_MODE_THUMBSTICK = 1,
- TOUCH_MOVEMENT_MODE_DPAD = 2,
- TOUCH_MOVEMENT_MODE_THUMBPAD = 3,
- TOUCH_MOVEMENT_MODE_CLICK_TO_MOVE = 4 };
- enum ComputerMovementMode {
- COMPUTER_MOVEMENT_MODE_DEFAULT = 0,
- COMPUTER_MOVEMENT_MODE_KBD_MOUSE = 1,
- COMPUTER_MOVEMENT_MODE_CLICK_TO_MOVE = 2};
+ COMPUTER_CAMERA_MOVEMENT_MODE_DEFAULT = 0,
+ COMPUTER_CAMERA_MOVEMENT_MODE_CLASSIC = 1,
+ COMPUTER_CAMERA_MOVEMENT_MODE_FOLLOW = 2
+ };
+ enum TouchMovementMode {
+ TOUCH_MOVEMENT_MODE_DEFAULT = 0,
+ TOUCH_MOVEMENT_MODE_THUMBSTICK = 1,
+ TOUCH_MOVEMENT_MODE_DPAD = 2,
+ TOUCH_MOVEMENT_MODE_THUMBPAD = 3,
+ TOUCH_MOVEMENT_MODE_CLICK_TO_MOVE = 4
+ };
+ enum ComputerMovementMode {
+ COMPUTER_MOVEMENT_MODE_DEFAULT = 0,
+ COMPUTER_MOVEMENT_MODE_KBD_MOUSE = 1,
+ COMPUTER_MOVEMENT_MODE_CLICK_TO_MOVE = 2
+ };
enum YearSettings {
Year2016 = 0,
Year2015 = 1,
@@ -40,7 +44,8 @@ namespace RBX
};
enum RotationType {
ROTATION_TYPE_MOVEMENT_RELATIVE = 0,
- ROTATION_TYPE_CAMERA_RELATIVE = 1};
+ ROTATION_TYPE_CAMERA_RELATIVE = 1
+ };
static Reflection::PropDescriptor prop_masterVolume;
@@ -88,14 +93,14 @@ namespace RBX
void setFreeLook(bool canLook) { freeLook = canLook; }
bool getFreeLook() { return freeLook; }
- bool inClassicMode() { return controlMode == CONTROL_CLASSIC; }
- bool inMouseLockMode() { return controlMode == CONTROL_MOUSELOCK; }
- bool inHybridMode() { return controlMode == CONTROL_HYBRID; }
- bool inCamlockMode() { return controlMode == CONTROL_CAMLOCK; }
- bool inMousepanMode() { return controlMode == CONTROL_MOUSEPAN; }
-
- bool mouseLockedInMouseLockMode() { return inMouseLockMode() && isMouseLocked(); }
- bool camLockedInCamLockMode() { return inCamlockMode() && !getFreeLook(); }
+ bool inClassicMode() { return controlMode == CONTROL_CLASSIC; }
+ bool inMouseLockMode() { return controlMode == CONTROL_MOUSELOCK; }
+ bool inHybridMode() { return controlMode == CONTROL_HYBRID; }
+ bool inCamlockMode() { return controlMode == CONTROL_CAMLOCK; }
+ bool inMousepanMode() { return controlMode == CONTROL_MOUSEPAN; }
+
+ bool mouseLockedInMouseLockMode() { return inMouseLockMode() && isMouseLocked(); }
+ bool camLockedInCamLockMode() { return inCamlockMode() && !getFreeLook(); }
bool getTutorialState(std::string tutorialId);
void setTutorialState(std::string tutorialId, bool value);
@@ -118,11 +123,11 @@ namespace RBX
bool getFullScreenConst() const { return fullscreen; }
bool getFullScreen() { return fullscreen; }
- void setFullScreen(bool value)
- {
- if(value != fullscreen)
+ void setFullScreen(bool value)
+ {
+ if (value != fullscreen)
{
- fullscreen = value;
+ fullscreen = value;
fullscreenChangedSignal(value);
}
}
@@ -143,12 +148,12 @@ namespace RBX
void setMouseSensitivity(float value);
bool inStudioMode() { return studio; }
- void setStudioMode(bool value)
+ void setStudioMode(bool value)
{
- if(value != studio)
+ if (value != studio)
{
studioModeChangedSignal(value);
- studio = value;
+ studio = value;
}
}
@@ -157,7 +162,7 @@ namespace RBX
std::string getGoogleAnalyticsClientId() const;
void setGoogleAnalyticsClientId(const std::string& id);
-
+
/*override*/ void reset();
/*override*/ void verifySetParent(const Instance* instance) const;
@@ -166,7 +171,7 @@ namespace RBX
rbx::signal fullscreenChangedSignal;
rbx::signal studioModeChangedSignal;
- private:
+ private:
ControlMode controlMode;
RenderQualitySetting renderQualitySetting;
YearSettings currentYear;
@@ -205,4 +210,4 @@ namespace RBX
std::string googleAnalyticsClientId;
};
-}
+}
\ No newline at end of file
diff --git a/App/lua/LuaBridge.h b/App/lua/LuaBridge.h
new file mode 100644
index 0000000..c33537b
--- /dev/null
+++ b/App/lua/LuaBridge.h
@@ -0,0 +1,264 @@
+#pragma once
+
+#include "Lua.hpp"
+
+#include "util/exception.h"
+#include "util/utilities.h"
+#include "rbx/Debug.h"
+#include "rbx/atomic.h"
+
+namespace RBX { namespace Lua {
+
+void newweaktable(lua_State *L, const char *mode);
+
+template
+int memberFunctionProxy(lua_State* thread)
+{
+ C* c = reinterpret_cast(lua_touserdata(thread, lua_upvalueindex(1)));
+ return (c->*Func)(thread);
+}
+
+template
+void pushMemberFunction(lua_State* L, C* c)
+{
+ lua_pushlightuserdata(L, (void*)c);
+ lua_pushcclosure(L, &memberFunctionProxy, 1);
+}
+
+// TODO: Use traits pattern rather than bool __eq
+template
+class Bridge
+{
+public:
+ // 0 arg constructor
+ static Class* pushNewObject(lua_State *L)
+ {
+ Class* data = (Class*)lua_newuserdata(L, sizeof(Class));
+ new(data) Class;
+ luaL_getmetatable(L, className);
+ lua_setmetatable(L, -2);
+ return data;
+ }
+ // 1 arg constructor
+ template
+ static Class* pushNewObject(lua_State *L, Param1 param1)
+ {
+ Class* data = (Class*)lua_newuserdata(L, sizeof(Class));
+ new(data) Class(param1);
+ luaL_getmetatable(L, className);
+ lua_setmetatable(L, -2);
+ return data;
+ }
+ // 2 arg constructor
+ template
+ static Class* pushNewObject(lua_State *L, Param1 param1, Param2 param2)
+ {
+ Class* data = (Class*)lua_newuserdata(L, sizeof(Class));
+ new(data) Class(param1, param2);
+ luaL_getmetatable(L, className);
+ lua_setmetatable(L, -2);
+ return data;
+ }
+
+ // Throws an exception if index doesn't hold the right type
+ static Class& getObject(lua_State *L, unsigned int index) {
+ void *ud = luaL_checkudata(L, index, className);
+ return *reinterpret_cast(ud);
+ }
+
+ // Returns false if index doesn't hold the right type (leaving value unchanged)
+ template
+ static bool getValue(lua_State *L, unsigned int index, V& value) {
+
+ // A re-implementation of luaL_checkudata that doesn't throw an exception
+ void *p = lua_touserdata(L, index);
+ if (p != NULL) { /* value is a userdata? */
+ if (lua_getmetatable(L, index)) { /* does it have a metatable? */
+ lua_getfield(L, LUA_REGISTRYINDEX, className); /* get correct metatable */
+ if (lua_rawequal(L, -1, -2)) { /* does it have the correct mt? */
+ lua_pop(L, 2); /* remove both metatables */
+ value = *reinterpret_cast(p);
+ return true;
+ }
+ else
+ lua_pop(L, 2); /* remove both metatables */
+ }
+ }
+ return false;
+ }
+
+ static void registerClass (lua_State *L);
+
+/// gcc craps out with the error while it is called from ScriptContext.cpp for registerClass fns for the Bridge e.g EventBridge::registerClass(globalState);
+// error: 'static int RBX::Lua::Bridge::on_index(lua_State*) [with Class = RBX::Lua::EventInstance, bool __eq = true]' is protected
+#ifdef _WIN32
+protected:
+#endif
+
+ // The following members must be implemented by client:
+ static int on_index(const Class& object, const char* name, lua_State *L);
+ static void on_newindex(Class& object, const char* name, lua_State *L);
+
+ // This member may be specialized when StringConverter has no implementation for Class:
+ static int on_tostring(const Class& object, lua_State *L);
+
+ static const char* className;
+
+ static int on_gc(lua_State *L) {
+ getObject(L, 1).~Class();
+ return 0;
+ }
+
+ static int on_tostring(lua_State *L) {
+ return on_tostring(getObject(L, 1), L);
+ }
+
+ static int on_newindex(lua_State *L) {
+ const char* name = lua_checkstring_secure(L, 2);
+ on_newindex(getObject(L, 1), name, L);
+ return 0;
+ }
+
+ static int on_index(lua_State *L) {
+ const char* name = lua_checkstring_secure(L, 2);
+ return on_index(getObject(L, 1), name, L);
+ }
+
+ static int on_eq(lua_State *L) {
+ lua_pushboolean(L, getObject(L, 1) == getObject(L, 2));
+ return 1;
+ }
+};
+
+// This class hides parent on purpose
+template
+class SharedPtrBridge : protected Bridge, false>
+{
+public:
+ static void registerClass (lua_State *L)
+ {
+ Bridge, false>::registerClass(L);
+ }
+
+ static void registerClassLibrary (lua_State *L) {
+ // Declare the UserData re-use table
+ lua_pushlightuserdata(L, (void*)&push);
+ newweaktable(L, "v");
+ lua_rawset(L, LUA_REGISTRYINDEX);
+ }
+
+ static void push(lua_State *L, boost::shared_ptr instance)
+ {
+ if (instance==NULL)
+ lua_pushnil(L);
+ else
+ {
+#ifdef _DEBUG
+ int i = lua_gettop(L);
+#endif
+ // Matt Campbell at Serotek Corporation had a great idea. Create only
+ // a single instance of the userdata and re-use it. This way the userdata
+ // can be used in table keys, and we don't need an __eq operator
+ // Also see http://lua-users.org/lists/lua-l/2004-07/msg00391.html
+
+ lua_pushlightuserdata(L, (void*)&push ); /* Registry mapping for weak table. Key is arbitrary. */
+ lua_rawget(L, LUA_REGISTRYINDEX); // Stack: t
+ RBXASSERT(!lua_isnil( L, -1 )); // Did you forget to call registerClassLibrary??
+
+ // Now the top of the stack is our lookup table
+ // See if we already have a UserData for this instance
+ lua_pushlightuserdata (L, (void*)instance.get()); // Stack: t, i
+ lua_rawget (L, -2); // Stack: t, t[i]
+
+ if( lua_isnil( L, -1 ) ) { // Stack: t, nil or I
+ lua_pop (L, 1); // Stack: t
+ Bridge, false>::pushNewObject(L, instance); // Stack: t, I
+ /* store the value for later use */
+ lua_pushlightuserdata (L, (void*)instance.get()); // Stack: t, I, i
+ lua_pushvalue (L, -2); // Stack: t, I, i, I
+ lua_rawset (L, -4); // Stack: t, I
+ }
+ lua_remove (L, -2); // Stack: I
+#ifdef _DEBUG
+ RBXASSERT(lua_gettop(L) == i + 1);
+#endif
+ }
+ }
+
+ static boost::shared_ptr getPtr(lua_State *L, unsigned int index)
+ {
+ if (lua_isnil(L, index))
+ return boost::shared_ptr();
+ else
+ return RBX::Lua::Bridge, false>::getObject(L, index);
+ }
+
+ template
+ static bool getPtr(lua_State *L, unsigned int index, V& value) {
+ if (lua_isnil(L, index))
+ {
+ value = boost::shared_ptr();
+ return true;
+ }
+ else
+ return Bridge, false>::getValue(L, index, value);
+ }
+
+};
+
+// This class hides Bridge on purpose
+template
+class SingletonBridge : protected Bridge
+{
+public:
+ static void registerClass (lua_State *L) {
+ Bridge::registerClass(L);
+ }
+
+ static void registerClassLibrary (lua_State *L) {
+ // Declare the UserData re-use table
+ lua_pushlightuserdata(L, (void*)&push);
+ lua_newtable(L); // Not a weak table, unlike SharedPtrBridge
+ lua_rawset(L, LUA_REGISTRYINDEX);
+ }
+
+ static void push(lua_State *L, T item)
+ {
+#ifdef _DEBUG
+ int i = lua_gettop(L);
+#endif
+ // Matt Campbell at Serotek Corporation had a great idea. Create only
+ // a single instance of the userdata and re-use it. This way the userdata
+ // can be used in table keys
+ // Also see http://lua-users.org/lists/lua-l/2004-07/msg00391.html
+
+ lua_pushlightuserdata(L, (void*)&push); /* Registry mapping for table. Key is arbitrary. */
+ lua_rawget(L, LUA_REGISTRYINDEX); // Stack: t
+ RBXASSERT(!lua_isnil( L, -1 )); // Did you forget to call registerClassLibrary??
+
+ // Now the top of the stack is our lookup table
+ // See if we already have a UserData for this instance
+ lua_pushlightuserdata (L, (void*)item); // Stack: t, i
+ lua_rawget (L, -2); // Stack: t, t[i]
+
+ // TODO: only allow explicit, one-time declaration
+ if( lua_isnil( L, -1 ) ) { // Stack: t, nil or I
+ lua_pop (L, 1); // Stack: t
+ Bridge::pushNewObject(L, item); // Stack: t, I
+ /* store the value for later use */
+ lua_pushlightuserdata (L, (void*)item); // Stack: t, I, i
+ lua_pushvalue (L, -2); // Stack: t, I, i, I
+ lua_rawset (L, -4); // Stack: t, I
+ }
+ lua_remove (L, -2); // Stack: I
+
+#ifdef _DEBUG
+ RBXASSERT(lua_gettop(L) == i + 1);
+#endif
+ }
+};
+
+} }
+
+
+
diff --git a/App/lua/lua.hpp b/App/lua/lua.hpp
new file mode 100644
index 0000000..e64130a
--- /dev/null
+++ b/App/lua/lua.hpp
@@ -0,0 +1,73 @@
+#pragma once
+
+#include "lua.h"
+#include "lauxlib.h"
+#include "lualib.h"
+
+namespace RBX
+{
+ namespace Lua
+ {
+ extern const char* safe_lua_tostring(lua_State *L, int idx);
+ extern const char* throwable_lua_tostring(lua_State *L, int idx);
+ extern float lua_tofloat(lua_State *L, int idx);
+ extern void protect_metatable(lua_State* thread, int index);
+ inline void lua_pushstring(lua_State* thread, const std::string& s)
+ {
+ lua_pushlstring(thread, s.c_str(), s.size());
+ }
+
+ const char* lua_checkstring_secure(lua_State* L, int idx);
+
+ void lua_resetstack(lua_State* L, int idx);
+
+ // Pops items from the stack when it goes out of scope
+ class ScopedPopper
+ {
+ int popCount;
+ lua_State* const thread;
+ public:
+ ScopedPopper(lua_State* thread, int popCount)
+ :thread(thread),popCount(popCount)
+ {}
+
+ ScopedPopper& operator +=(int popCount)
+ {
+ this->popCount += popCount;
+ return *this;
+ }
+
+ ScopedPopper& operator -=(int popCount)
+ {
+ this->popCount -= popCount;
+ return *this;
+ }
+
+ ~ScopedPopper()
+ {
+ lua_pop(thread, popCount);
+ }
+ };
+
+ class ScopedState
+ {
+ lua_State* const thread;
+ public:
+ ScopedState()
+ :thread(luaL_newstate())
+ {}
+
+ ~ScopedState()
+ {
+ lua_close(thread);
+ }
+
+ operator lua_State*()
+ {
+ return thread;
+ }
+ };
+
+ }
+
+}
diff --git a/App/lua/luaStubs0.h b/App/lua/luaStubs0.h
new file mode 100644
index 0000000..37dcb58
--- /dev/null
+++ b/App/lua/luaStubs0.h
@@ -0,0 +1,103 @@
+#pragma once
+#include "lua/lua.hpp"
+
+RBX::Lua::LuaStubGen<609> stub609;
+RBX::Lua::LuaStubGen<288> stub288;
+RBX::Lua::LuaStubGen<646> stub646;
+RBX::Lua::LuaStubGen<387> stub387;
+RBX::Lua::LuaStubGen<649> stub649;
+RBX::Lua::LuaStubGen<687> stub687;
+RBX::Lua::LuaStubGen<836> stub836;
+RBX::Lua::LuaStubGen<959> stub959;
+RBX::Lua::LuaStubGen<803> stub803;
+RBX::Lua::LuaStubGen<107> stub107;
+RBX::Lua::LuaStubGen<361> stub361;
+RBX::Lua::LuaStubGen<172> stub172;
+RBX::Lua::LuaStubGen<666> stub666;
+RBX::Lua::LuaStubGen<901> stub901;
+RBX::Lua::LuaStubGen<287> stub287;
+RBX::Lua::LuaStubGen<523> stub523;
+RBX::Lua::LuaStubGen<701> stub701;
+RBX::Lua::LuaStubGen<316> stub316;
+RBX::Lua::LuaStubGen<671> stub671;
+RBX::Lua::LuaStubGen<423> stub423;
+RBX::Lua::LuaStubGen<718> stub718;
+RBX::Lua::LuaStubGen<711> stub711;
+RBX::Lua::LuaStubGen<211> stub211;
+RBX::Lua::LuaStubGen<158> stub158;
+RBX::Lua::LuaStubGen<219> stub219;
+RBX::Lua::LuaStubGen<68> stub68;
+RBX::Lua::LuaStubGen<790> stub790;
+RBX::Lua::LuaStubGen<58> stub58;
+RBX::Lua::LuaStubGen<919> stub919;
+RBX::Lua::LuaStubGen<747> stub747;
+RBX::Lua::LuaStubGen<161> stub161;
+RBX::Lua::LuaStubGen<119> stub119;
+RBX::Lua::LuaStubGen<622> stub622;
+RBX::Lua::LuaStubGen<183> stub183;
+RBX::Lua::LuaStubGen<93> stub93;
+RBX::Lua::LuaStubGen<560> stub560;
+RBX::Lua::LuaStubGen<382> stub382;
+RBX::Lua::LuaStubGen<455> stub455;
+RBX::Lua::LuaStubGen<562> stub562;
+RBX::Lua::LuaStubGen<554> stub554;
+RBX::Lua::LuaStubGen<652> stub652;
+RBX::Lua::LuaStubGen<997> stub997;
+RBX::Lua::LuaStubGen<237> stub237;
+RBX::Lua::LuaStubGen<655> stub655;
+RBX::Lua::LuaStubGen<892> stub892;
+RBX::Lua::LuaStubGen<840> stub840;
+RBX::Lua::LuaStubGen<872> stub872;
+RBX::Lua::LuaStubGen<821> stub821;
+RBX::Lua::LuaStubGen<314> stub314;
+RBX::Lua::LuaStubGen<249> stub249;
+RBX::Lua::LuaStubGen<82> stub82;
+RBX::Lua::LuaStubGen<470> stub470;
+RBX::Lua::LuaStubGen<203> stub203;
+RBX::Lua::LuaStubGen<722> stub722;
+RBX::Lua::LuaStubGen<492> stub492;
+RBX::Lua::LuaStubGen<29> stub29;
+RBX::Lua::LuaStubGen<429> stub429;
+RBX::Lua::LuaStubGen<933> stub933;
+RBX::Lua::LuaStubGen<983> stub983;
+RBX::Lua::LuaStubGen<700> stub700;
+RBX::Lua::LuaStubGen<471> stub471;
+RBX::Lua::LuaStubGen<453> stub453;
+RBX::Lua::LuaStubGen<396> stub396;
+RBX::Lua::LuaStubGen<330> stub330;
+RBX::Lua::LuaStubGen<206> stub206;
+RBX::Lua::LuaStubGen<362> stub362;
+RBX::Lua::LuaStubGen<737> stub737;
+RBX::Lua::LuaStubGen<390> stub390;
+RBX::Lua::LuaStubGen<914> stub914;
+RBX::Lua::LuaStubGen<985> stub985;
+RBX::Lua::LuaStubGen<490> stub490;
+RBX::Lua::LuaStubGen<786> stub786;
+RBX::Lua::LuaStubGen<173> stub173;
+RBX::Lua::LuaStubGen<346> stub346;
+RBX::Lua::LuaStubGen<643> stub643;
+RBX::Lua::LuaStubGen<331> stub331;
+RBX::Lua::LuaStubGen<539> stub539;
+RBX::Lua::LuaStubGen<134> stub134;
+RBX::Lua::LuaStubGen<325> stub325;
+RBX::Lua::LuaStubGen<34> stub34;
+RBX::Lua::LuaStubGen<88> stub88;
+RBX::Lua::LuaStubGen<536> stub536;
+RBX::Lua::LuaStubGen<79> stub79;
+RBX::Lua::LuaStubGen<459> stub459;
+RBX::Lua::LuaStubGen<842> stub842;
+RBX::Lua::LuaStubGen<370> stub370;
+RBX::Lua::LuaStubGen<553> stub553;
+RBX::Lua::LuaStubGen<486> stub486;
+RBX::Lua::LuaStubGen<591> stub591;
+RBX::Lua::LuaStubGen<797> stub797;
+RBX::Lua::LuaStubGen<571> stub571;
+RBX::Lua::LuaStubGen<907> stub907;
+RBX::Lua::LuaStubGen<43> stub43;
+RBX::Lua::LuaStubGen<918> stub918;
+RBX::Lua::LuaStubGen<866> stub866;
+RBX::Lua::LuaStubGen<856> stub856;
+RBX::Lua::LuaStubGen<751> stub751;
+RBX::Lua::LuaStubGen<124> stub124;
+RBX::Lua::LuaStubGen<559> stub559;
+RBX::Lua::LuaStubGen<620> stub620;
diff --git a/App/lua/luaStubs1.h b/App/lua/luaStubs1.h
new file mode 100644
index 0000000..55d6a9c
--- /dev/null
+++ b/App/lua/luaStubs1.h
@@ -0,0 +1,103 @@
+#pragma once
+#include "lua/lua.hpp"
+
+RBX::Lua::LuaStubGen<339> stub339;
+RBX::Lua::LuaStubGen<510> stub510;
+RBX::Lua::LuaStubGen<634> stub634;
+RBX::Lua::LuaStubGen<17> stub17;
+RBX::Lua::LuaStubGen<302> stub302;
+RBX::Lua::LuaStubGen<454> stub454;
+RBX::Lua::LuaStubGen<814> stub814;
+RBX::Lua::LuaStubGen<887> stub887;
+RBX::Lua::LuaStubGen<824> stub824;
+RBX::Lua::LuaStubGen<703> stub703;
+RBX::Lua::LuaStubGen<932> stub932;
+RBX::Lua::LuaStubGen<220> stub220;
+RBX::Lua::LuaStubGen<972> stub972;
+RBX::Lua::LuaStubGen<99> stub99;
+RBX::Lua::LuaStubGen<627> stub627;
+RBX::Lua::LuaStubGen<13> stub13;
+RBX::Lua::LuaStubGen<633> stub633;
+RBX::Lua::LuaStubGen<800> stub800;
+RBX::Lua::LuaStubGen<875> stub875;
+RBX::Lua::LuaStubGen<458> stub458;
+RBX::Lua::LuaStubGen<181> stub181;
+RBX::Lua::LuaStubGen<352> stub352;
+RBX::Lua::LuaStubGen<920> stub920;
+RBX::Lua::LuaStubGen<951> stub951;
+RBX::Lua::LuaStubGen<319> stub319;
+RBX::Lua::LuaStubGen<716> stub716;
+RBX::Lua::LuaStubGen<529> stub529;
+RBX::Lua::LuaStubGen<507> stub507;
+RBX::Lua::LuaStubGen<85> stub85;
+RBX::Lua::LuaStubGen<105> stub105;
+RBX::Lua::LuaStubGen<727> stub727;
+RBX::Lua::LuaStubGen<568> stub568;
+RBX::Lua::LuaStubGen<749> stub749;
+RBX::Lua::LuaStubGen<530> stub530;
+RBX::Lua::LuaStubGen<207> stub207;
+RBX::Lua::LuaStubGen<5> stub5;
+RBX::Lua::LuaStubGen<413> stub413;
+RBX::Lua::LuaStubGen<675> stub675;
+RBX::Lua::LuaStubGen<462> stub462;
+RBX::Lua::LuaStubGen<762> stub762;
+RBX::Lua::LuaStubGen<397> stub397;
+RBX::Lua::LuaStubGen<431> stub431;
+RBX::Lua::LuaStubGen<47> stub47;
+RBX::Lua::LuaStubGen<307> stub307;
+RBX::Lua::LuaStubGen<692> stub692;
+RBX::Lua::LuaStubGen<320> stub320;
+RBX::Lua::LuaStubGen<947> stub947;
+RBX::Lua::LuaStubGen<775> stub775;
+RBX::Lua::LuaStubGen<647> stub647;
+RBX::Lua::LuaStubGen<766> stub766;
+RBX::Lua::LuaStubGen<661> stub661;
+RBX::Lua::LuaStubGen<384> stub384;
+RBX::Lua::LuaStubGen<235> stub235;
+RBX::Lua::LuaStubGen<177> stub177;
+RBX::Lua::LuaStubGen<535> stub535;
+RBX::Lua::LuaStubGen<580> stub580;
+RBX::Lua::LuaStubGen<854> stub854;
+RBX::Lua::LuaStubGen<987> stub987;
+RBX::Lua::LuaStubGen<891> stub891;
+RBX::Lua::LuaStubGen<846> stub846;
+RBX::Lua::LuaStubGen<630> stub630;
+RBX::Lua::LuaStubGen<491> stub491;
+RBX::Lua::LuaStubGen<573> stub573;
+RBX::Lua::LuaStubGen<488> stub488;
+RBX::Lua::LuaStubGen<695> stub695;
+RBX::Lua::LuaStubGen<995> stub995;
+RBX::Lua::LuaStubGen<321> stub321;
+RBX::Lua::LuaStubGen<322> stub322;
+RBX::Lua::LuaStubGen<504> stub504;
+RBX::Lua::LuaStubGen<403> stub403;
+RBX::Lua::LuaStubGen<197> stub197;
+RBX::Lua::LuaStubGen<487> stub487;
+RBX::Lua::LuaStubGen<231> stub231;
+RBX::Lua::LuaStubGen<236> stub236;
+RBX::Lua::LuaStubGen<128> stub128;
+RBX::Lua::LuaStubGen<381> stub381;
+RBX::Lua::LuaStubGen<705> stub705;
+RBX::Lua::LuaStubGen<61> stub61;
+RBX::Lua::LuaStubGen<214> stub214;
+RBX::Lua::LuaStubGen<497> stub497;
+RBX::Lua::LuaStubGen<232> stub232;
+RBX::Lua::LuaStubGen<725> stub725;
+RBX::Lua::LuaStubGen<371> stub371;
+RBX::Lua::LuaStubGen<401> stub401;
+RBX::Lua::LuaStubGen<526> stub526;
+RBX::Lua::LuaStubGen<448> stub448;
+RBX::Lua::LuaStubGen<961> stub961;
+RBX::Lua::LuaStubGen<97> stub97;
+RBX::Lua::LuaStubGen<375> stub375;
+RBX::Lua::LuaStubGen<979> stub979;
+RBX::Lua::LuaStubGen<908> stub908;
+RBX::Lua::LuaStubGen<227> stub227;
+RBX::Lua::LuaStubGen<112> stub112;
+RBX::Lua::LuaStubGen<819> stub819;
+RBX::Lua::LuaStubGen<208> stub208;
+RBX::Lua::LuaStubGen<78> stub78;
+RBX::Lua::LuaStubGen<992> stub992;
+RBX::Lua::LuaStubGen<209> stub209;
+RBX::Lua::LuaStubGen<881> stub881;
+RBX::Lua::LuaStubGen<463> stub463;
diff --git a/App/lua/luaStubs2.h b/App/lua/luaStubs2.h
new file mode 100644
index 0000000..5cc4474
--- /dev/null
+++ b/App/lua/luaStubs2.h
@@ -0,0 +1,103 @@
+#pragma once
+#include "lua/lua.hpp"
+
+RBX::Lua::LuaStubGen<925> stub925;
+RBX::Lua::LuaStubGen<311> stub311;
+RBX::Lua::LuaStubGen<801> stub801;
+RBX::Lua::LuaStubGen<450> stub450;
+RBX::Lua::LuaStubGen<469> stub469;
+RBX::Lua::LuaStubGen<522> stub522;
+RBX::Lua::LuaStubGen<412> stub412;
+RBX::Lua::LuaStubGen<418> stub418;
+RBX::Lua::LuaStubGen<879> stub879;
+RBX::Lua::LuaStubGen<745> stub745;
+RBX::Lua::LuaStubGen<818> stub818;
+RBX::Lua::LuaStubGen<69> stub69;
+RBX::Lua::LuaStubGen<122> stub122;
+RBX::Lua::LuaStubGen<654> stub654;
+RBX::Lua::LuaStubGen<385> stub385;
+RBX::Lua::LuaStubGen<160> stub160;
+RBX::Lua::LuaStubGen<550> stub550;
+RBX::Lua::LuaStubGen<199> stub199;
+RBX::Lua::LuaStubGen<897> stub897;
+RBX::Lua::LuaStubGen<60> stub60;
+RBX::Lua::LuaStubGen<420> stub420;
+RBX::Lua::LuaStubGen<712> stub712;
+RBX::Lua::LuaStubGen<581> stub581;
+RBX::Lua::LuaStubGen<613> stub613;
+RBX::Lua::LuaStubGen<928> stub928;
+RBX::Lua::LuaStubGen<391> stub391;
+RBX::Lua::LuaStubGen<868> stub868;
+RBX::Lua::LuaStubGen<517> stub517;
+RBX::Lua::LuaStubGen<393> stub393;
+RBX::Lua::LuaStubGen<593> stub593;
+RBX::Lua::LuaStubGen<865> stub865;
+RBX::Lua::LuaStubGen<610> stub610;
+RBX::Lua::LuaStubGen<289> stub289;
+RBX::Lua::LuaStubGen<508> stub508;
+RBX::Lua::LuaStubGen<779> stub779;
+RBX::Lua::LuaStubGen<224> stub224;
+RBX::Lua::LuaStubGen<527> stub527;
+RBX::Lua::LuaStubGen<733> stub733;
+RBX::Lua::LuaStubGen<419> stub419;
+RBX::Lua::LuaStubGen<106> stub106;
+RBX::Lua::LuaStubGen<501> stub501;
+RBX::Lua::LuaStubGen<677> stub677;
+RBX::Lua::LuaStubGen<212> stub212;
+RBX::Lua::LuaStubGen<859> stub859;
+RBX::Lua::LuaStubGen<697> stub697;
+RBX::Lua::LuaStubGen<357> stub357;
+RBX::Lua::LuaStubGen<233> stub233;
+RBX::Lua::LuaStubGen<248> stub248;
+RBX::Lua::LuaStubGen<698> stub698;
+RBX::Lua::LuaStubGen<552> stub552;
+RBX::Lua::LuaStubGen<19> stub19;
+RBX::Lua::LuaStubGen<873> stub873;
+RBX::Lua::LuaStubGen<169> stub169;
+RBX::Lua::LuaStubGen<367> stub367;
+RBX::Lua::LuaStubGen<763> stub763;
+RBX::Lua::LuaStubGen<115> stub115;
+RBX::Lua::LuaStubGen<477> stub477;
+RBX::Lua::LuaStubGen<475> stub475;
+RBX::Lua::LuaStubGen<341> stub341;
+RBX::Lua::LuaStubGen<686> stub686;
+RBX::Lua::LuaStubGen<939> stub939;
+RBX::Lua::LuaStubGen<648> stub648;
+RBX::Lua::LuaStubGen<277> stub277;
+RBX::Lua::LuaStubGen<584> stub584;
+RBX::Lua::LuaStubGen<776> stub776;
+RBX::Lua::LuaStubGen<684> stub684;
+RBX::Lua::LuaStubGen<155> stub155;
+RBX::Lua::LuaStubGen<51> stub51;
+RBX::Lua::LuaStubGen<994> stub994;
+RBX::Lua::LuaStubGen<702> stub702;
+RBX::Lua::LuaStubGen<3> stub3;
+RBX::Lua::LuaStubGen<73> stub73;
+RBX::Lua::LuaStubGen<579> stub579;
+RBX::Lua::LuaStubGen<83> stub83;
+RBX::Lua::LuaStubGen<768> stub768;
+RBX::Lua::LuaStubGen<813> stub813;
+RBX::Lua::LuaStubGen<604> stub604;
+RBX::Lua::LuaStubGen<312> stub312;
+RBX::Lua::LuaStubGen<588> stub588;
+RBX::Lua::LuaStubGen<834> stub834;
+RBX::Lua::LuaStubGen<313> stub313;
+RBX::Lua::LuaStubGen<967> stub967;
+RBX::Lua::LuaStubGen<784> stub784;
+RBX::Lua::LuaStubGen<139> stub139;
+RBX::Lua::LuaStubGen<555> stub555;
+RBX::Lua::LuaStubGen<157> stub157;
+RBX::Lua::LuaStubGen<226> stub226;
+RBX::Lua::LuaStubGen<263> stub263;
+RBX::Lua::LuaStubGen<863> stub863;
+RBX::Lua::LuaStubGen<882> stub882;
+RBX::Lua::LuaStubGen<110> stub110;
+RBX::Lua::LuaStubGen<274> stub274;
+RBX::Lua::LuaStubGen<736> stub736;
+RBX::Lua::LuaStubGen<113> stub113;
+RBX::Lua::LuaStubGen<484> stub484;
+RBX::Lua::LuaStubGen<638> stub638;
+RBX::Lua::LuaStubGen<49> stub49;
+RBX::Lua::LuaStubGen<774> stub774;
+RBX::Lua::LuaStubGen<742> stub742;
+RBX::Lua::LuaStubGen<485> stub485;
diff --git a/App/lua/luaStubs3.h b/App/lua/luaStubs3.h
new file mode 100644
index 0000000..bebaff7
--- /dev/null
+++ b/App/lua/luaStubs3.h
@@ -0,0 +1,103 @@
+#pragma once
+#include "lua/lua.hpp"
+
+RBX::Lua::LuaStubGen<290> stub290;
+RBX::Lua::LuaStubGen<734> stub734;
+RBX::Lua::LuaStubGen<543> stub543;
+RBX::Lua::LuaStubGen<433> stub433;
+RBX::Lua::LuaStubGen<871> stub871;
+RBX::Lua::LuaStubGen<308> stub308;
+RBX::Lua::LuaStubGen<685> stub685;
+RBX::Lua::LuaStubGen<839> stub839;
+RBX::Lua::LuaStubGen<870> stub870;
+RBX::Lua::LuaStubGen<910> stub910;
+RBX::Lua::LuaStubGen<150> stub150;
+RBX::Lua::LuaStubGen<439> stub439;
+RBX::Lua::LuaStubGen<799> stub799;
+RBX::Lua::LuaStubGen<760> stub760;
+RBX::Lua::LuaStubGen<878> stub878;
+RBX::Lua::LuaStubGen<912> stub912;
+RBX::Lua::LuaStubGen<168> stub168;
+RBX::Lua::LuaStubGen<743> stub743;
+RBX::Lua::LuaStubGen<624> stub624;
+RBX::Lua::LuaStubGen<516> stub516;
+RBX::Lua::LuaStubGen<545> stub545;
+RBX::Lua::LuaStubGen<148> stub148;
+RBX::Lua::LuaStubGen<121> stub121;
+RBX::Lua::LuaStubGen<977> stub977;
+RBX::Lua::LuaStubGen<998> stub998;
+RBX::Lua::LuaStubGen<156> stub156;
+RBX::Lua::LuaStubGen<999> stub999;
+RBX::Lua::LuaStubGen<860> stub860;
+RBX::Lua::LuaStubGen<41> stub41;
+RBX::Lua::LuaStubGen<479> stub479;
+RBX::Lua::LuaStubGen<366> stub366;
+RBX::Lua::LuaStubGen<938> stub938;
+RBX::Lua::LuaStubGen<577> stub577;
+RBX::Lua::LuaStubGen<640> stub640;
+RBX::Lua::LuaStubGen<956> stub956;
+RBX::Lua::LuaStubGen<929> stub929;
+RBX::Lua::LuaStubGen<574> stub574;
+RBX::Lua::LuaStubGen<619> stub619;
+RBX::Lua::LuaStubGen<166> stub166;
+RBX::Lua::LuaStubGen<198> stub198;
+RBX::Lua::LuaStubGen<11> stub11;
+RBX::Lua::LuaStubGen<64> stub64;
+RBX::Lua::LuaStubGen<221> stub221;
+RBX::Lua::LuaStubGen<564> stub564;
+RBX::Lua::LuaStubGen<56> stub56;
+RBX::Lua::LuaStubGen<787> stub787;
+RBX::Lua::LuaStubGen<713> stub713;
+RBX::Lua::LuaStubGen<777> stub777;
+RBX::Lua::LuaStubGen<541> stub541;
+RBX::Lua::LuaStubGen<187> stub187;
+RBX::Lua::LuaStubGen<600> stub600;
+RBX::Lua::LuaStubGen<472> stub472;
+RBX::Lua::LuaStubGen<196> stub196;
+RBX::Lua::LuaStubGen<323> stub323;
+RBX::Lua::LuaStubGen<616> stub616;
+RBX::Lua::LuaStubGen<242> stub242;
+RBX::Lua::LuaStubGen<699> stub699;
+RBX::Lua::LuaStubGen<678> stub678;
+RBX::Lua::LuaStubGen<532> stub532;
+RBX::Lua::LuaStubGen<949> stub949;
+RBX::Lua::LuaStubGen<973> stub973;
+RBX::Lua::LuaStubGen<270> stub270;
+RBX::Lua::LuaStubGen<14> stub14;
+RBX::Lua::LuaStubGen<451> stub451;
+RBX::Lua::LuaStubGen<12> stub12;
+RBX::Lua::LuaStubGen<809> stub809;
+RBX::Lua::LuaStubGen<642> stub642;
+RBX::Lua::LuaStubGen<324> stub324;
+RBX::Lua::LuaStubGen<7> stub7;
+RBX::Lua::LuaStubGen<569> stub569;
+RBX::Lua::LuaStubGen<880> stub880;
+RBX::Lua::LuaStubGen<828> stub828;
+RBX::Lua::LuaStubGen<35> stub35;
+RBX::Lua::LuaStubGen<547> stub547;
+RBX::Lua::LuaStubGen<447> stub447;
+RBX::Lua::LuaStubGen<228> stub228;
+RBX::Lua::LuaStubGen<739> stub739;
+RBX::Lua::LuaStubGen<796> stub796;
+RBX::Lua::LuaStubGen<889> stub889;
+RBX::Lua::LuaStubGen<317> stub317;
+RBX::Lua::LuaStubGen<668> stub668;
+RBX::Lua::LuaStubGen<598> stub598;
+RBX::Lua::LuaStubGen<781> stub781;
+RBX::Lua::LuaStubGen<466> stub466;
+RBX::Lua::LuaStubGen<823> stub823;
+RBX::Lua::LuaStubGen<753> stub753;
+RBX::Lua::LuaStubGen<101> stub101;
+RBX::Lua::LuaStubGen<170> stub170;
+RBX::Lua::LuaStubGen<612> stub612;
+RBX::Lua::LuaStubGen<40> stub40;
+RBX::Lua::LuaStubGen<502> stub502;
+RBX::Lua::LuaStubGen<621> stub621;
+RBX::Lua::LuaStubGen<893> stub893;
+RBX::Lua::LuaStubGen<452> stub452;
+RBX::Lua::LuaStubGen<345> stub345;
+RBX::Lua::LuaStubGen<546> stub546;
+RBX::Lua::LuaStubGen<623> stub623;
+RBX::Lua::LuaStubGen<513> stub513;
+RBX::Lua::LuaStubGen<15> stub15;
+RBX::Lua::LuaStubGen<758> stub758;
diff --git a/App/lua/luaStubs4.h b/App/lua/luaStubs4.h
new file mode 100644
index 0000000..61dac43
--- /dev/null
+++ b/App/lua/luaStubs4.h
@@ -0,0 +1,103 @@
+#pragma once
+#include "lua/lua.hpp"
+
+RBX::Lua::LuaStubGen<614> stub614;
+RBX::Lua::LuaStubGen<481> stub481;
+RBX::Lua::LuaStubGen<217> stub217;
+RBX::Lua::LuaStubGen<883> stub883;
+RBX::Lua::LuaStubGen<261> stub261;
+RBX::Lua::LuaStubGen<432> stub432;
+RBX::Lua::LuaStubGen<383> stub383;
+RBX::Lua::LuaStubGen<791> stub791;
+RBX::Lua::LuaStubGen<395> stub395;
+RBX::Lua::LuaStubGen<20> stub20;
+RBX::Lua::LuaStubGen<916> stub916;
+RBX::Lua::LuaStubGen<229> stub229;
+RBX::Lua::LuaStubGen<215> stub215;
+RBX::Lua::LuaStubGen<589> stub589;
+RBX::Lua::LuaStubGen<23> stub23;
+RBX::Lua::LuaStubGen<750> stub750;
+RBX::Lua::LuaStubGen<483> stub483;
+RBX::Lua::LuaStubGen<724> stub724;
+RBX::Lua::LuaStubGen<505> stub505;
+RBX::Lua::LuaStubGen<254> stub254;
+RBX::Lua::LuaStubGen<752> stub752;
+RBX::Lua::LuaStubGen<926> stub926;
+RBX::Lua::LuaStubGen<524> stub524;
+RBX::Lua::LuaStubGen<672> stub672;
+RBX::Lua::LuaStubGen<406> stub406;
+RBX::Lua::LuaStubGen<924> stub924;
+RBX::Lua::LuaStubGen<394> stub394;
+RBX::Lua::LuaStubGen<506> stub506;
+RBX::Lua::LuaStubGen<772> stub772;
+RBX::Lua::LuaStubGen<603> stub603;
+RBX::Lua::LuaStubGen<175> stub175;
+RBX::Lua::LuaStubGen<256> stub256;
+RBX::Lua::LuaStubGen<392> stub392;
+RBX::Lua::LuaStubGen<605> stub605;
+RBX::Lua::LuaStubGen<534> stub534;
+RBX::Lua::LuaStubGen<443> stub443;
+RBX::Lua::LuaStubGen<365> stub365;
+RBX::Lua::LuaStubGen<126> stub126;
+RBX::Lua::LuaStubGen<709> stub709;
+RBX::Lua::LuaStubGen<42> stub42;
+RBX::Lua::LuaStubGen<10> stub10;
+RBX::Lua::LuaStubGen<292> stub292;
+RBX::Lua::LuaStubGen<669> stub669;
+RBX::Lua::LuaStubGen<282> stub282;
+RBX::Lua::LuaStubGen<201> stub201;
+RBX::Lua::LuaStubGen<585> stub585;
+RBX::Lua::LuaStubGen<693> stub693;
+RBX::Lua::LuaStubGen<241> stub241;
+RBX::Lua::LuaStubGen<131> stub131;
+RBX::Lua::LuaStubGen<70> stub70;
+RBX::Lua::LuaStubGen<360> stub360;
+RBX::Lua::LuaStubGen<537> stub537;
+RBX::Lua::LuaStubGen<408> stub408;
+RBX::Lua::LuaStubGen<515> stub515;
+RBX::Lua::LuaStubGen<9> stub9;
+RBX::Lua::LuaStubGen<111> stub111;
+RBX::Lua::LuaStubGen<388> stub388;
+RBX::Lua::LuaStubGen<937> stub937;
+RBX::Lua::LuaStubGen<276> stub276;
+RBX::Lua::LuaStubGen<426> stub426;
+RBX::Lua::LuaStubGen<832> stub832;
+RBX::Lua::LuaStubGen<90> stub90;
+RBX::Lua::LuaStubGen<414> stub414;
+RBX::Lua::LuaStubGen<151> stub151;
+RBX::Lua::LuaStubGen<178> stub178;
+RBX::Lua::LuaStubGen<625> stub625;
+RBX::Lua::LuaStubGen<478> stub478;
+RBX::Lua::LuaStubGen<941> stub941;
+RBX::Lua::LuaStubGen<71> stub71;
+RBX::Lua::LuaStubGen<556> stub556;
+RBX::Lua::LuaStubGen<421> stub421;
+RBX::Lua::LuaStubGen<683> stub683;
+RBX::Lua::LuaStubGen<422> stub422;
+RBX::Lua::LuaStubGen<193> stub193;
+RBX::Lua::LuaStubGen<626> stub626;
+RBX::Lua::LuaStubGen<738> stub738;
+RBX::Lua::LuaStubGen<728> stub728;
+RBX::Lua::LuaStubGen<438> stub438;
+RBX::Lua::LuaStubGen<606> stub606;
+RBX::Lua::LuaStubGen<969> stub969;
+RBX::Lua::LuaStubGen<602> stub602;
+RBX::Lua::LuaStubGen<857> stub857;
+RBX::Lua::LuaStubGen<572> stub572;
+RBX::Lua::LuaStubGen<129> stub129;
+RBX::Lua::LuaStubGen<578> stub578;
+RBX::Lua::LuaStubGen<544> stub544;
+RBX::Lua::LuaStubGen<358> stub358;
+RBX::Lua::LuaStubGen<651> stub651;
+RBX::Lua::LuaStubGen<482> stub482;
+RBX::Lua::LuaStubGen<729> stub729;
+RBX::Lua::LuaStubGen<582> stub582;
+RBX::Lua::LuaStubGen<975> stub975;
+RBX::Lua::LuaStubGen<238> stub238;
+RBX::Lua::LuaStubGen<167> stub167;
+RBX::Lua::LuaStubGen<632> stub632;
+RBX::Lua::LuaStubGen<770> stub770;
+RBX::Lua::LuaStubGen<176> stub176;
+RBX::Lua::LuaStubGen<805> stub805;
+RBX::Lua::LuaStubGen<473> stub473;
+RBX::Lua::LuaStubGen<145> stub145;
diff --git a/App/lua/luaStubs5.h b/App/lua/luaStubs5.h
new file mode 100644
index 0000000..6b030d8
--- /dev/null
+++ b/App/lua/luaStubs5.h
@@ -0,0 +1,103 @@
+#pragma once
+#include "lua/lua.hpp"
+
+RBX::Lua::LuaStubGen<641> stub641;
+RBX::Lua::LuaStubGen<200> stub200;
+RBX::Lua::LuaStubGen<428> stub428;
+RBX::Lua::LuaStubGen<596> stub596;
+RBX::Lua::LuaStubGen<909> stub909;
+RBX::Lua::LuaStubGen<540> stub540;
+RBX::Lua::LuaStubGen<108> stub108;
+RBX::Lua::LuaStubGen<328> stub328;
+RBX::Lua::LuaStubGen<852> stub852;
+RBX::Lua::LuaStubGen<81> stub81;
+RBX::Lua::LuaStubGen<761> stub761;
+RBX::Lua::LuaStubGen<159> stub159;
+RBX::Lua::LuaStubGen<46> stub46;
+RBX::Lua::LuaStubGen<272> stub272;
+RBX::Lua::LuaStubGen<404> stub404;
+RBX::Lua::LuaStubGen<386> stub386;
+RBX::Lua::LuaStubGen<719> stub719;
+RBX::Lua::LuaStubGen<191> stub191;
+RBX::Lua::LuaStubGen<33> stub33;
+RBX::Lua::LuaStubGen<851> stub851;
+RBX::Lua::LuaStubGen<561> stub561;
+RBX::Lua::LuaStubGen<681> stub681;
+RBX::Lua::LuaStubGen<721> stub721;
+RBX::Lua::LuaStubGen<87> stub87;
+RBX::Lua::LuaStubGen<996> stub996;
+RBX::Lua::LuaStubGen<576> stub576;
+RBX::Lua::LuaStubGen<835> stub835;
+RBX::Lua::LuaStubGen<305> stub305;
+RBX::Lua::LuaStubGen<182> stub182;
+RBX::Lua::LuaStubGen<974> stub974;
+RBX::Lua::LuaStubGen<294> stub294;
+RBX::Lua::LuaStubGen<922> stub922;
+RBX::Lua::LuaStubGen<890> stub890;
+RBX::Lua::LuaStubGen<185> stub185;
+RBX::Lua::LuaStubGen<253> stub253;
+RBX::Lua::LuaStubGen<298> stub298;
+RBX::Lua::LuaStubGen<744> stub744;
+RBX::Lua::LuaStubGen<861> stub861;
+RBX::Lua::LuaStubGen<885> stub885;
+RBX::Lua::LuaStubGen<351> stub351;
+RBX::Lua::LuaStubGen<63> stub63;
+RBX::Lua::LuaStubGen<327> stub327;
+RBX::Lua::LuaStubGen<599> stub599;
+RBX::Lua::LuaStubGen<720> stub720;
+RBX::Lua::LuaStubGen<911> stub911;
+RBX::Lua::LuaStubGen<676> stub676;
+RBX::Lua::LuaStubGen<993> stub993;
+RBX::Lua::LuaStubGen<326> stub326;
+RBX::Lua::LuaStubGen<489> stub489;
+RBX::Lua::LuaStubGen<4> stub4;
+RBX::Lua::LuaStubGen<830> stub830;
+RBX::Lua::LuaStubGen<398> stub398;
+RBX::Lua::LuaStubGen<509> stub509;
+RBX::Lua::LuaStubGen<372> stub372;
+RBX::Lua::LuaStubGen<102> stub102;
+RBX::Lua::LuaStubGen<296> stub296;
+RBX::Lua::LuaStubGen<86> stub86;
+RBX::Lua::LuaStubGen<258> stub258;
+RBX::Lua::LuaStubGen<981> stub981;
+RBX::Lua::LuaStubGen<971> stub971;
+RBX::Lua::LuaStubGen<65> stub65;
+RBX::Lua::LuaStubGen<467> stub467;
+RBX::Lua::LuaStubGen<566> stub566;
+RBX::Lua::LuaStubGen<118> stub118;
+RBX::Lua::LuaStubGen<565> stub565;
+RBX::Lua::LuaStubGen<717> stub717;
+RBX::Lua::LuaStubGen<741> stub741;
+RBX::Lua::LuaStubGen<66> stub66;
+RBX::Lua::LuaStubGen<348> stub348;
+RBX::Lua::LuaStubGen<557> stub557;
+RBX::Lua::LuaStubGen<202> stub202;
+RBX::Lua::LuaStubGen<674> stub674;
+RBX::Lua::LuaStubGen<480> stub480;
+RBX::Lua::LuaStubGen<794> stub794;
+RBX::Lua::LuaStubGen<234> stub234;
+RBX::Lua::LuaStubGen<353> stub353;
+RBX::Lua::LuaStubGen<757> stub757;
+RBX::Lua::LuaStubGen<844> stub844;
+RBX::Lua::LuaStubGen<900> stub900;
+RBX::Lua::LuaStubGen<587> stub587;
+RBX::Lua::LuaStubGen<773> stub773;
+RBX::Lua::LuaStubGen<84> stub84;
+RBX::Lua::LuaStubGen<284> stub284;
+RBX::Lua::LuaStubGen<300> stub300;
+RBX::Lua::LuaStubGen<456> stub456;
+RBX::Lua::LuaStubGen<461> stub461;
+RBX::Lua::LuaStubGen<109> stub109;
+RBX::Lua::LuaStubGen<349> stub349;
+RBX::Lua::LuaStubGen<337> stub337;
+RBX::Lua::LuaStubGen<154> stub154;
+RBX::Lua::LuaStubGen<293> stub293;
+RBX::Lua::LuaStubGen<706> stub706;
+RBX::Lua::LuaStubGen<764> stub764;
+RBX::Lua::LuaStubGen<930> stub930;
+RBX::Lua::LuaStubGen<465> stub465;
+RBX::Lua::LuaStubGen<245> stub245;
+RBX::Lua::LuaStubGen<55> stub55;
+RBX::Lua::LuaStubGen<960> stub960;
+RBX::Lua::LuaStubGen<756> stub756;
+RBX::Lua::LuaStubGen<521> stub521;
diff --git a/App/lua/luaStubs6.h b/App/lua/luaStubs6.h
new file mode 100644
index 0000000..ad7f12e
--- /dev/null
+++ b/App/lua/luaStubs6.h
@@ -0,0 +1,103 @@
+#pragma once
+#include "lua/lua.hpp"
+
+RBX::Lua::LuaStubGen<144> stub144;
+RBX::Lua::LuaStubGen<44> stub44;
+RBX::Lua::LuaStubGen<667> stub667;
+RBX::Lua::LuaStubGen<896> stub896;
+RBX::Lua::LuaStubGen<318> stub318;
+RBX::Lua::LuaStubGen<731> stub731;
+RBX::Lua::LuaStubGen<98> stub98;
+RBX::Lua::LuaStubGen<306> stub306;
+RBX::Lua::LuaStubGen<434> stub434;
+RBX::Lua::LuaStubGen<374> stub374;
+RBX::Lua::LuaStubGen<92> stub92;
+RBX::Lua::LuaStubGen<309> stub309;
+RBX::Lua::LuaStubGen<94> stub94;
+RBX::Lua::LuaStubGen<239> stub239;
+RBX::Lua::LuaStubGen<464> stub464;
+RBX::Lua::LuaStubGen<243> stub243;
+RBX::Lua::LuaStubGen<963> stub963;
+RBX::Lua::LuaStubGen<514> stub514;
+RBX::Lua::LuaStubGen<639> stub639;
+RBX::Lua::LuaStubGen<816> stub816;
+RBX::Lua::LuaStubGen<164> stub164;
+RBX::Lua::LuaStubGen<653> stub653;
+RBX::Lua::LuaStubGen<812> stub812;
+RBX::Lua::LuaStubGen<269> stub269;
+RBX::Lua::LuaStubGen<822> stub822;
+RBX::Lua::LuaStubGen<864> stub864;
+RBX::Lua::LuaStubGen<499> stub499;
+RBX::Lua::LuaStubGen<130> stub130;
+RBX::Lua::LuaStubGen<59> stub59;
+RBX::Lua::LuaStubGen<27> stub27;
+RBX::Lua::LuaStubGen<162> stub162;
+RBX::Lua::LuaStubGen<570> stub570;
+RBX::Lua::LuaStubGen<74> stub74;
+RBX::Lua::LuaStubGen<117> stub117;
+RBX::Lua::LuaStubGen<935> stub935;
+RBX::Lua::LuaStubGen<96> stub96;
+RBX::Lua::LuaStubGen<629> stub629;
+RBX::Lua::LuaStubGen<163> stub163;
+RBX::Lua::LuaStubGen<934> stub934;
+RBX::Lua::LuaStubGen<275> stub275;
+RBX::Lua::LuaStubGen<165> stub165;
+RBX::Lua::LuaStubGen<267> stub267;
+RBX::Lua::LuaStubGen<195> stub195;
+RBX::Lua::LuaStubGen<833> stub833;
+RBX::Lua::LuaStubGen<30> stub30;
+RBX::Lua::LuaStubGen<304> stub304;
+RBX::Lua::LuaStubGen<114> stub114;
+RBX::Lua::LuaStubGen<369> stub369;
+RBX::Lua::LuaStubGen<708> stub708;
+RBX::Lua::LuaStubGen<611> stub611;
+RBX::Lua::LuaStubGen<441> stub441;
+RBX::Lua::LuaStubGen<512> stub512;
+RBX::Lua::LuaStubGen<143> stub143;
+RBX::Lua::LuaStubGen<615> stub615;
+RBX::Lua::LuaStubGen<792> stub792;
+RBX::Lua::LuaStubGen<76> stub76;
+RBX::Lua::LuaStubGen<853> stub853;
+RBX::Lua::LuaStubGen<500> stub500;
+RBX::Lua::LuaStubGen<710> stub710;
+RBX::Lua::LuaStubGen<782> stub782;
+RBX::Lua::LuaStubGen<869> stub869;
+RBX::Lua::LuaStubGen<690> stub690;
+RBX::Lua::LuaStubGen<184> stub184;
+RBX::Lua::LuaStubGen<424> stub424;
+RBX::Lua::LuaStubGen<204> stub204;
+RBX::Lua::LuaStubGen<2> stub2;
+RBX::Lua::LuaStubGen<354> stub354;
+RBX::Lua::LuaStubGen<400> stub400;
+RBX::Lua::LuaStubGen<216> stub216;
+RBX::Lua::LuaStubGen<152> stub152;
+RBX::Lua::LuaStubGen<18> stub18;
+RBX::Lua::LuaStubGen<190> stub190;
+RBX::Lua::LuaStubGen<380> stub380;
+RBX::Lua::LuaStubGen<246> stub246;
+RBX::Lua::LuaStubGen<628> stub628;
+RBX::Lua::LuaStubGen<26> stub26;
+RBX::Lua::LuaStubGen<645> stub645;
+RBX::Lua::LuaStubGen<945> stub945;
+RBX::Lua::LuaStubGen<347> stub347;
+RBX::Lua::LuaStubGen<829> stub829;
+RBX::Lua::LuaStubGen<858> stub858;
+RBX::Lua::LuaStubGen<802> stub802;
+RBX::Lua::LuaStubGen<965> stub965;
+RBX::Lua::LuaStubGen<262> stub262;
+RBX::Lua::LuaStubGen<268> stub268;
+RBX::Lua::LuaStubGen<806> stub806;
+RBX::Lua::LuaStubGen<944> stub944;
+RBX::Lua::LuaStubGen<225> stub225;
+RBX::Lua::LuaStubGen<188> stub188;
+RBX::Lua::LuaStubGen<266> stub266;
+RBX::Lua::LuaStubGen<417> stub417;
+RBX::Lua::LuaStubGen<377> stub377;
+RBX::Lua::LuaStubGen<425> stub425;
+RBX::Lua::LuaStubGen<286> stub286;
+RBX::Lua::LuaStubGen<986> stub986;
+RBX::Lua::LuaStubGen<843> stub843;
+RBX::Lua::LuaStubGen<827> stub827;
+RBX::Lua::LuaStubGen<807> stub807;
+RBX::Lua::LuaStubGen<730> stub730;
+RBX::Lua::LuaStubGen<440> stub440;
diff --git a/App/lua/luaStubs7.h b/App/lua/luaStubs7.h
new file mode 100644
index 0000000..7e03560
--- /dev/null
+++ b/App/lua/luaStubs7.h
@@ -0,0 +1,103 @@
+#pragma once
+#include "lua/lua.hpp"
+
+RBX::Lua::LuaStubGen<525> stub525;
+RBX::Lua::LuaStubGen<980> stub980;
+RBX::Lua::LuaStubGen<496> stub496;
+RBX::Lua::LuaStubGen<194> stub194;
+RBX::Lua::LuaStubGen<608> stub608;
+RBX::Lua::LuaStubGen<884> stub884;
+RBX::Lua::LuaStubGen<265> stub265;
+RBX::Lua::LuaStubGen<62> stub62;
+RBX::Lua::LuaStubGen<336> stub336;
+RBX::Lua::LuaStubGen<538> stub538;
+RBX::Lua::LuaStubGen<295> stub295;
+RBX::Lua::LuaStubGen<991> stub991;
+RBX::Lua::LuaStubGen<795> stub795;
+RBX::Lua::LuaStubGen<976> stub976;
+RBX::Lua::LuaStubGen<498> stub498;
+RBX::Lua::LuaStubGen<103> stub103;
+RBX::Lua::LuaStubGen<723> stub723;
+RBX::Lua::LuaStubGen<222> stub222;
+RBX::Lua::LuaStubGen<886> stub886;
+RBX::Lua::LuaStubGen<285> stub285;
+RBX::Lua::LuaStubGen<927> stub927;
+RBX::Lua::LuaStubGen<765> stub765;
+RBX::Lua::LuaStubGen<147> stub147;
+RBX::Lua::LuaStubGen<867> stub867;
+RBX::Lua::LuaStubGen<597> stub597;
+RBX::Lua::LuaStubGen<136> stub136;
+RBX::Lua::LuaStubGen<895> stub895;
+RBX::Lua::LuaStubGen<837> stub837;
+RBX::Lua::LuaStubGen<631> stub631;
+RBX::Lua::LuaStubGen<825> stub825;
+RBX::Lua::LuaStubGen<575> stub575;
+RBX::Lua::LuaStubGen<329> stub329;
+RBX::Lua::LuaStubGen<435> stub435;
+RBX::Lua::LuaStubGen<769> stub769;
+RBX::Lua::LuaStubGen<494> stub494;
+RBX::Lua::LuaStubGen<45> stub45;
+RBX::Lua::LuaStubGen<31> stub31;
+RBX::Lua::LuaStubGen<179> stub179;
+RBX::Lua::LuaStubGen<255> stub255;
+RBX::Lua::LuaStubGen<943> stub943;
+RBX::Lua::LuaStubGen<810> stub810;
+RBX::Lua::LuaStubGen<617> stub617;
+RBX::Lua::LuaStubGen<988> stub988;
+RBX::Lua::LuaStubGen<446> stub446;
+RBX::Lua::LuaStubGen<213> stub213;
+RBX::Lua::LuaStubGen<567> stub567;
+RBX::Lua::LuaStubGen<714> stub714;
+RBX::Lua::LuaStubGen<379> stub379;
+RBX::Lua::LuaStubGen<301> stub301;
+RBX::Lua::LuaStubGen<350> stub350;
+RBX::Lua::LuaStubGen<691> stub691;
+RBX::Lua::LuaStubGen<551> stub551;
+RBX::Lua::LuaStubGen<24> stub24;
+RBX::Lua::LuaStubGen<948> stub948;
+RBX::Lua::LuaStubGen<931> stub931;
+RBX::Lua::LuaStubGen<704> stub704;
+RBX::Lua::LuaStubGen<343> stub343;
+RBX::Lua::LuaStubGen<133> stub133;
+RBX::Lua::LuaStubGen<923> stub923;
+RBX::Lua::LuaStubGen<968> stub968;
+RBX::Lua::LuaStubGen<735> stub735;
+RBX::Lua::LuaStubGen<436> stub436;
+RBX::Lua::LuaStubGen<218> stub218;
+RBX::Lua::LuaStubGen<957> stub957;
+RBX::Lua::LuaStubGen<364> stub364;
+RBX::Lua::LuaStubGen<601> stub601;
+RBX::Lua::LuaStubGen<982> stub982;
+RBX::Lua::LuaStubGen<409> stub409;
+RBX::Lua::LuaStubGen<899> stub899;
+RBX::Lua::LuaStubGen<953> stub953;
+RBX::Lua::LuaStubGen<637> stub637;
+RBX::Lua::LuaStubGen<16> stub16;
+RBX::Lua::LuaStubGen<402> stub402;
+RBX::Lua::LuaStubGen<780> stub780;
+RBX::Lua::LuaStubGen<689> stub689;
+RBX::Lua::LuaStubGen<373> stub373;
+RBX::Lua::LuaStubGen<273> stub273;
+RBX::Lua::LuaStubGen<636> stub636;
+RBX::Lua::LuaStubGen<210> stub210;
+RBX::Lua::LuaStubGen<548> stub548;
+RBX::Lua::LuaStubGen<804> stub804;
+RBX::Lua::LuaStubGen<1> stub1;
+RBX::Lua::LuaStubGen<663> stub663;
+RBX::Lua::LuaStubGen<785> stub785;
+RBX::Lua::LuaStubGen<811> stub811;
+RBX::Lua::LuaStubGen<344> stub344;
+RBX::Lua::LuaStubGen<664> stub664;
+RBX::Lua::LuaStubGen<831> stub831;
+RBX::Lua::LuaStubGen<783> stub783;
+RBX::Lua::LuaStubGen<978> stub978;
+RBX::Lua::LuaStubGen<841> stub841;
+RBX::Lua::LuaStubGen<22> stub22;
+RBX::Lua::LuaStubGen<520> stub520;
+RBX::Lua::LuaStubGen<6> stub6;
+RBX::Lua::LuaStubGen<659> stub659;
+RBX::Lua::LuaStubGen<230> stub230;
+RBX::Lua::LuaStubGen<72> stub72;
+RBX::Lua::LuaStubGen<57> stub57;
+RBX::Lua::LuaStubGen<333> stub333;
+RBX::Lua::LuaStubGen<80> stub80;
diff --git a/App/lua/luaStubs8.h b/App/lua/luaStubs8.h
new file mode 100644
index 0000000..8616eb8
--- /dev/null
+++ b/App/lua/luaStubs8.h
@@ -0,0 +1,103 @@
+#pragma once
+#include "lua/lua.hpp"
+
+RBX::Lua::LuaStubGen<355> stub355;
+RBX::Lua::LuaStubGen<411> stub411;
+RBX::Lua::LuaStubGen<531> stub531;
+RBX::Lua::LuaStubGen<281> stub281;
+RBX::Lua::LuaStubGen<67> stub67;
+RBX::Lua::LuaStubGen<297> stub297;
+RBX::Lua::LuaStubGen<415> stub415;
+RBX::Lua::LuaStubGen<954> stub954;
+RBX::Lua::LuaStubGen<410> stub410;
+RBX::Lua::LuaStubGen<798> stub798;
+RBX::Lua::LuaStubGen<519> stub519;
+RBX::Lua::LuaStubGen<493> stub493;
+RBX::Lua::LuaStubGen<299> stub299;
+RBX::Lua::LuaStubGen<656> stub656;
+RBX::Lua::LuaStubGen<808> stub808;
+RBX::Lua::LuaStubGen<906> stub906;
+RBX::Lua::LuaStubGen<778> stub778;
+RBX::Lua::LuaStubGen<445> stub445;
+RBX::Lua::LuaStubGen<468> stub468;
+RBX::Lua::LuaStubGen<363> stub363;
+RBX::Lua::LuaStubGen<902> stub902;
+RBX::Lua::LuaStubGen<740> stub740;
+RBX::Lua::LuaStubGen<32> stub32;
+RBX::Lua::LuaStubGen<278> stub278;
+RBX::Lua::LuaStubGen<767> stub767;
+RBX::Lua::LuaStubGen<594> stub594;
+RBX::Lua::LuaStubGen<335> stub335;
+RBX::Lua::LuaStubGen<356> stub356;
+RBX::Lua::LuaStubGen<376> stub376;
+RBX::Lua::LuaStubGen<955> stub955;
+RBX::Lua::LuaStubGen<315> stub315;
+RBX::Lua::LuaStubGen<915> stub915;
+RBX::Lua::LuaStubGen<788> stub788;
+RBX::Lua::LuaStubGen<940> stub940;
+RBX::Lua::LuaStubGen<405> stub405;
+RBX::Lua::LuaStubGen<442> stub442;
+RBX::Lua::LuaStubGen<250> stub250;
+RBX::Lua::LuaStubGen<476> stub476;
+RBX::Lua::LuaStubGen<120> stub120;
+RBX::Lua::LuaStubGen<528> stub528;
+RBX::Lua::LuaStubGen<142> stub142;
+RBX::Lua::LuaStubGen<186> stub186;
+RBX::Lua::LuaStubGen<754> stub754;
+RBX::Lua::LuaStubGen<989> stub989;
+RBX::Lua::LuaStubGen<25> stub25;
+RBX::Lua::LuaStubGen<223> stub223;
+RBX::Lua::LuaStubGen<848> stub848;
+RBX::Lua::LuaStubGen<815> stub815;
+RBX::Lua::LuaStubGen<658> stub658;
+RBX::Lua::LuaStubGen<905> stub905;
+RBX::Lua::LuaStubGen<37> stub37;
+RBX::Lua::LuaStubGen<338> stub338;
+RBX::Lua::LuaStubGen<53> stub53;
+RBX::Lua::LuaStubGen<682> stub682;
+RBX::Lua::LuaStubGen<904> stub904;
+RBX::Lua::LuaStubGen<862> stub862;
+RBX::Lua::LuaStubGen<533> stub533;
+RBX::Lua::LuaStubGen<694> stub694;
+RBX::Lua::LuaStubGen<558> stub558;
+RBX::Lua::LuaStubGen<100> stub100;
+RBX::Lua::LuaStubGen<518> stub518;
+RBX::Lua::LuaStubGen<125> stub125;
+RBX::Lua::LuaStubGen<845> stub845;
+RBX::Lua::LuaStubGen<503> stub503;
+RBX::Lua::LuaStubGen<340> stub340;
+RBX::Lua::LuaStubGen<399> stub399;
+RBX::Lua::LuaStubGen<89> stub89;
+RBX::Lua::LuaStubGen<146> stub146;
+RBX::Lua::LuaStubGen<917> stub917;
+RBX::Lua::LuaStubGen<877> stub877;
+RBX::Lua::LuaStubGen<696> stub696;
+RBX::Lua::LuaStubGen<279> stub279;
+RBX::Lua::LuaStubGen<368> stub368;
+RBX::Lua::LuaStubGen<936> stub936;
+RBX::Lua::LuaStubGen<378> stub378;
+RBX::Lua::LuaStubGen<958> stub958;
+RBX::Lua::LuaStubGen<962> stub962;
+RBX::Lua::LuaStubGen<38> stub38;
+RBX::Lua::LuaStubGen<444> stub444;
+RBX::Lua::LuaStubGen<257> stub257;
+RBX::Lua::LuaStubGen<607> stub607;
+RBX::Lua::LuaStubGen<427> stub427;
+RBX::Lua::LuaStubGen<149> stub149;
+RBX::Lua::LuaStubGen<855> stub855;
+RBX::Lua::LuaStubGen<135> stub135;
+RBX::Lua::LuaStubGen<127> stub127;
+RBX::Lua::LuaStubGen<430> stub430;
+RBX::Lua::LuaStubGen<511> stub511;
+RBX::Lua::LuaStubGen<748> stub748;
+RBX::Lua::LuaStubGen<952> stub952;
+RBX::Lua::LuaStubGen<104> stub104;
+RBX::Lua::LuaStubGen<650> stub650;
+RBX::Lua::LuaStubGen<771> stub771;
+RBX::Lua::LuaStubGen<680> stub680;
+RBX::Lua::LuaStubGen<876> stub876;
+RBX::Lua::LuaStubGen<849> stub849;
+RBX::Lua::LuaStubGen<251> stub251;
+RBX::Lua::LuaStubGen<635> stub635;
+RBX::Lua::LuaStubGen<77> stub77;
+RBX::Lua::LuaStubGen<141> stub141;
diff --git a/App/lua/luaStubs9.h b/App/lua/luaStubs9.h
new file mode 100644
index 0000000..8472d92
--- /dev/null
+++ b/App/lua/luaStubs9.h
@@ -0,0 +1,103 @@
+#pragma once
+#include "lua/lua.hpp"
+
+RBX::Lua::LuaStubGen<137> stub137;
+RBX::Lua::LuaStubGen<966> stub966;
+RBX::Lua::LuaStubGen<894> stub894;
+RBX::Lua::LuaStubGen<95> stub95;
+RBX::Lua::LuaStubGen<586> stub586;
+RBX::Lua::LuaStubGen<715> stub715;
+RBX::Lua::LuaStubGen<657> stub657;
+RBX::Lua::LuaStubGen<244> stub244;
+RBX::Lua::LuaStubGen<826> stub826;
+RBX::Lua::LuaStubGen<303> stub303;
+RBX::Lua::LuaStubGen<964> stub964;
+RBX::Lua::LuaStubGen<732> stub732;
+RBX::Lua::LuaStubGen<984> stub984;
+RBX::Lua::LuaStubGen<240> stub240;
+RBX::Lua::LuaStubGen<342> stub342;
+RBX::Lua::LuaStubGen<264> stub264;
+RBX::Lua::LuaStubGen<192> stub192;
+RBX::Lua::LuaStubGen<874> stub874;
+RBX::Lua::LuaStubGen<563> stub563;
+RBX::Lua::LuaStubGen<644> stub644;
+RBX::Lua::LuaStubGen<495> stub495;
+RBX::Lua::LuaStubGen<460> stub460;
+RBX::Lua::LuaStubGen<583> stub583;
+RBX::Lua::LuaStubGen<39> stub39;
+RBX::Lua::LuaStubGen<707> stub707;
+RBX::Lua::LuaStubGen<334> stub334;
+RBX::Lua::LuaStubGen<8> stub8;
+RBX::Lua::LuaStubGen<132> stub132;
+RBX::Lua::LuaStubGen<474> stub474;
+RBX::Lua::LuaStubGen<407> stub407;
+RBX::Lua::LuaStubGen<75> stub75;
+RBX::Lua::LuaStubGen<542> stub542;
+RBX::Lua::LuaStubGen<789> stub789;
+RBX::Lua::LuaStubGen<36> stub36;
+RBX::Lua::LuaStubGen<174> stub174;
+RBX::Lua::LuaStubGen<252> stub252;
+RBX::Lua::LuaStubGen<28> stub28;
+RBX::Lua::LuaStubGen<618> stub618;
+RBX::Lua::LuaStubGen<205> stub205;
+RBX::Lua::LuaStubGen<838> stub838;
+RBX::Lua::LuaStubGen<260> stub260;
+RBX::Lua::LuaStubGen<116> stub116;
+RBX::Lua::LuaStubGen<888> stub888;
+RBX::Lua::LuaStubGen<91> stub91;
+RBX::Lua::LuaStubGen<153> stub153;
+RBX::Lua::LuaStubGen<180> stub180;
+RBX::Lua::LuaStubGen<247> stub247;
+RBX::Lua::LuaStubGen<850> stub850;
+RBX::Lua::LuaStubGen<660> stub660;
+RBX::Lua::LuaStubGen<280> stub280;
+RBX::Lua::LuaStubGen<942> stub942;
+RBX::Lua::LuaStubGen<665> stub665;
+RBX::Lua::LuaStubGen<726> stub726;
+RBX::Lua::LuaStubGen<332> stub332;
+RBX::Lua::LuaStubGen<820> stub820;
+RBX::Lua::LuaStubGen<592> stub592;
+RBX::Lua::LuaStubGen<793> stub793;
+RBX::Lua::LuaStubGen<759> stub759;
+RBX::Lua::LuaStubGen<898> stub898;
+RBX::Lua::LuaStubGen<746> stub746;
+RBX::Lua::LuaStubGen<817> stub817;
+RBX::Lua::LuaStubGen<457> stub457;
+RBX::Lua::LuaStubGen<449> stub449;
+RBX::Lua::LuaStubGen<950> stub950;
+RBX::Lua::LuaStubGen<291> stub291;
+RBX::Lua::LuaStubGen<140> stub140;
+RBX::Lua::LuaStubGen<389> stub389;
+RBX::Lua::LuaStubGen<913> stub913;
+RBX::Lua::LuaStubGen<549> stub549;
+RBX::Lua::LuaStubGen<310> stub310;
+RBX::Lua::LuaStubGen<990> stub990;
+RBX::Lua::LuaStubGen<259> stub259;
+RBX::Lua::LuaStubGen<50> stub50;
+RBX::Lua::LuaStubGen<688> stub688;
+RBX::Lua::LuaStubGen<52> stub52;
+RBX::Lua::LuaStubGen<755> stub755;
+RBX::Lua::LuaStubGen<437> stub437;
+RBX::Lua::LuaStubGen<48> stub48;
+RBX::Lua::LuaStubGen<662> stub662;
+RBX::Lua::LuaStubGen<189> stub189;
+RBX::Lua::LuaStubGen<123> stub123;
+RBX::Lua::LuaStubGen<679> stub679;
+RBX::Lua::LuaStubGen<0> stub0;
+RBX::Lua::LuaStubGen<283> stub283;
+RBX::Lua::LuaStubGen<359> stub359;
+RBX::Lua::LuaStubGen<946> stub946;
+RBX::Lua::LuaStubGen<670> stub670;
+RBX::Lua::LuaStubGen<271> stub271;
+RBX::Lua::LuaStubGen<847> stub847;
+RBX::Lua::LuaStubGen<416> stub416;
+RBX::Lua::LuaStubGen<903> stub903;
+RBX::Lua::LuaStubGen<595> stub595;
+RBX::Lua::LuaStubGen<970> stub970;
+RBX::Lua::LuaStubGen<138> stub138;
+RBX::Lua::LuaStubGen<54> stub54;
+RBX::Lua::LuaStubGen<590> stub590;
+RBX::Lua::LuaStubGen<921> stub921;
+RBX::Lua::LuaStubGen<21> stub21;
+RBX::Lua::LuaStubGen<171> stub171;
+RBX::Lua::LuaStubGen<673> stub673;
diff --git a/App/reflection/Callback.h b/App/reflection/Callback.h
new file mode 100644
index 0000000..1e34c9c
--- /dev/null
+++ b/App/reflection/Callback.h
@@ -0,0 +1,597 @@
+
+#pragma once
+
+#include "reflection/type.h"
+#include "security/securitycontext.h"
+#include "reflection/member.h"
+#include "reflection/Type.h"
+#include
+#include
+
+namespace RBX
+{
+ namespace Reflection
+ {
+ class Callback;
+
+ // Base class that describes a Callback
+ class RBXBaseClass CallbackDescriptor : public MemberDescriptor
+ {
+ public:
+ typedef Callback ConstMember;
+ typedef Callback Member;
+
+ protected:
+ SignatureDescriptor signature;
+ bool async;
+
+ CallbackDescriptor(ClassDescriptor& classDescriptor, const char* name, Descriptor::Attributes attributes, Security::Permissions security, bool async);
+ public:
+ inline const SignatureDescriptor& getSignature() const { return signature; }
+ bool isAsync() const { return async; }
+ };
+
+ class SyncCallbackDescriptor : public CallbackDescriptor
+ {
+ protected:
+ SyncCallbackDescriptor(ClassDescriptor& classDescriptor, const char* name, Descriptor::Attributes attributes, Security::Permissions security);
+ public:
+ typedef boost::function(shared_ptr args)> GenericFunction;
+
+ // the preferred way to set a generic function:
+ virtual void setGenericCallback(DescribedBase* object, shared_ptr function) const = 0;
+ virtual void clearCallback(DescribedBase* object) const = 0;
+
+ // use this function if you don't have a shared_ptr:
+ void setGenericCallbackHelper(DescribedBase* object, const GenericFunction& function) const;
+ };
+
+ class AsyncCallbackDescriptor : public CallbackDescriptor
+ {
+ public:
+ typedef boost::function)> ResumeFunction;
+ typedef boost::function ErrorFunction;
+ typedef boost::function args, ResumeFunction resumeFunction, ErrorFunction errorFunction)> GenericFunction;
+
+ // the preferred way to set a generic function:
+ virtual void setGenericCallback(DescribedBase* object, shared_ptr function) const = 0;
+ virtual void clearCallback(DescribedBase* object) const = 0;
+
+ // use this function if you don't have a shared_ptr:
+ void setGenericCallbackHelper(DescribedBase* object, const GenericFunction& function) const;
+
+ protected:
+ AsyncCallbackDescriptor(ClassDescriptor& classDescriptor, const char* name, Descriptor::Attributes attributes, Security::Permissions security);
+
+ static void callGenericImpl(shared_ptr function, shared_ptr args,
+ AsyncCallbackDescriptor::ResumeFunction resumeFunction, AsyncCallbackDescriptor::ErrorFunction errorFunction);
+
+ template
+ void setGenericCallbackImpl(DescribedBase* object, Function Class::*member, void (Class::*onChanged)(const Function&), const Value& value) const
+ {
+ Class* c = static_cast(object);
+
+ Function oldValue = c->*member;
+ c->*member = value;
+ if (onChanged)
+ (c->*onChanged)(oldValue);
+ }
+ };
+
+
+ // A light-weight convenience class that associates a CallbackDescriptor
+ // with a described object to create a "Callback"
+ class Callback
+ {
+ const CallbackDescriptor* descriptor;
+ DescribedBase* instance;
+ public:
+ inline Callback(const CallbackDescriptor& descriptor, DescribedBase* instance)
+ :descriptor(&descriptor),instance(instance)
+ {}
+
+ inline Callback(const Callback& other)
+ :descriptor(other.descriptor),instance(other.instance)
+ {}
+
+ inline Callback& operator =(const Callback& other)
+ {
+ this->descriptor = other.descriptor;
+ this->instance = other.instance;
+ return *this;
+ }
+
+ inline const RBX::Name& getName() const {
+ return descriptor->name;
+ }
+
+ inline DescribedBase* getInstance() const
+ {
+ return instance;
+ }
+
+ inline const CallbackDescriptor& getDescriptor() const
+ {
+ return *descriptor;
+ }
+ };
+
+
+ // Base class of typed CallbackDescriptors
+ template
+ class SyncCallbackDesc : public SyncCallbackDescriptor
+ {
+ protected:
+ typedef typename boost::function Function;
+ typedef typename boost::function_traits::result_type result_type;
+
+ template
+ static typename boost::enable_if, void>::type
+ callGeneric(shared_ptr function, shared_ptr args)
+ {
+ (*function)(args);
+ }
+
+ template
+ static typename boost::disable_if, Result>, Result>::type
+ convertResult(shared_ptr result)
+ {
+ // Extract the first value in the Tuple and return it as the result. Ignore other vales
+ if (result->values.size() == 0)
+ throw std::runtime_error("Callback did not return a value");
+ return result->values[0].convert();
+ }
+
+ template
+ static typename boost::enable_if, Result>, Result>::type
+ convertResult(shared_ptr result)
+ {
+ return result;
+ }
+
+ template
+ static typename boost::disable_if, Result>::type
+ callGeneric(shared_ptr function, shared_ptr args)
+ {
+ shared_ptr result = (*function)(args);
+ return convertResult(result);
+ }
+
+ class RBXInterface ISetter
+ {
+ public:
+ virtual ~ISetter() {}
+ virtual void setCallback(DescribedBase* object, const Function& value) const = 0;
+ };
+ boost::scoped_ptr setter;
+
+ SyncCallbackDesc(ClassDescriptor& classDescriptor, const char* name, Descriptor::Attributes attributes, Security::Permissions security):
+ SyncCallbackDescriptor(classDescriptor, name, attributes, security)
+ {}
+ public:
+ void setCallback(DescribedBase* object, const Function& value) const
+ {
+ setter->setCallback(object, value);
+ }
+ void clearCallback(DescribedBase* object) const
+ {
+ setter->setCallback(object, Function());
+ }
+ };
+
+ // Specialized class that implements generic bindings and sets the signature
+ template
+ class SyncCallbackDescImpl;
+
+ template
+ class SyncCallbackDescImpl : public SyncCallbackDesc
+ {
+ typedef typename SyncCallbackDesc::result_type result_type;
+ static result_type callGeneric(shared_ptr function)
+ {
+ shared_ptr args(new Tuple());
+ return SyncCallbackDesc::template callGeneric(function, args);
+ }
+
+ protected:
+ SyncCallbackDescImpl(ClassDescriptor& classDescriptor, const char* name, Descriptor::Attributes attributes, Security::Permissions security)
+ :SyncCallbackDesc(classDescriptor, name, attributes, security)
+ {
+ BOOST_STATIC_ASSERT((boost::function_traits::arity == 0));
+ this->signature.resultType = &Type::singleton();
+ }
+ public:
+ virtual void setGenericCallback(DescribedBase* object, shared_ptr function) const
+ {
+ this->setCallback(object, boost::bind(callGeneric, function));
+ }
+ };
+
+ template
+ class SyncCallbackDescImpl : public SyncCallbackDesc
+ {
+ typedef typename SyncCallbackDesc::result_type result_type;
+ static result_type callGeneric(shared_ptr function,
+ // TODO: Use const ref for args and bind with boost::cref?
+ typename boost::function_traits