Compare commits

...

57 Commits

Author SHA1 Message Date
Marco Tylus
8c399fb517
Merge 8935c520c0 into f08cbc0795 2026-02-06 02:39:34 +00:00
fallenoak
f08cbc0795
feat(ui): add ScriptEventsRegisterEvents 2026-02-05 20:33:53 -06:00
fallenoak
19f51db2e2
chore(ui): move ScriptEventsInitialize into game ui dir 2026-02-05 20:13:32 -06:00
fallenoak
315ea05ba0
feat(ui): implement Script_UnitXPMax
Some checks are pending
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:cl compiler_name:MSVC cxx:cl os:windows-latest system_name:Windows test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:clang compiler_name:Clang cxx:clang++ os:macos-latest system_name:macOS test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:gcc compiler_name:GCC cxx:g++ os:ubuntu-latest system_name:Linux test_path:WhoaTest]) (push) Waiting to run
2026-02-05 16:56:44 -06:00
fallenoak
a53e1360a4
feat(ui): implement Script_UnitXP 2026-02-05 16:12:04 -06:00
fallenoak
cfb8f2bae1
feat(ui): add Script_GetUnitFromName 2026-02-05 16:05:19 -06:00
fallenoak
ed9c683602
feat(object): add CGPlayer_C::GetActiveNextLevelXP 2026-02-05 16:01:46 -06:00
fallenoak
ee48e47992
feat(object): add CGPlayer_C::GetActiveXP 2026-02-05 15:58:48 -06:00
fallenoak
5d81022c74
feat(object): add CGPlayer::GetNextLevelXP 2026-02-05 15:00:32 -06:00
fallenoak
c9f26b6666
feat(object): add CGObject::IsExactlyA 2026-02-05 14:53:58 -06:00
fallenoak
f567a3a7c8
feat(object): add CGPlayer::GetXP 2026-02-05 14:51:17 -06:00
fallenoak
aac8cf0855
feat(object): add CGObject::IsA 2026-02-05 13:26:59 -06:00
fallenoak
aa22dd952a
feat(ui): add CSimpleStatusBar::OnLayerUpdate
Some checks are pending
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:cl compiler_name:MSVC cxx:cl os:windows-latest system_name:Windows test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:clang compiler_name:Clang cxx:clang++ os:macos-latest system_name:macOS test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:gcc compiler_name:GCC cxx:g++ os:ubuntu-latest system_name:Linux test_path:WhoaTest]) (push) Waiting to run
2026-02-05 07:05:28 -06:00
fallenoak
534e05be93
feat(ui): add CLayoutFrame::GetSize 2026-02-05 07:01:30 -06:00
fallenoak
856bb72e1a
chore(ui): improve CSimpleStatusBar ctor
Some checks are pending
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:cl compiler_name:MSVC cxx:cl os:windows-latest system_name:Windows test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:clang compiler_name:Clang cxx:clang++ os:macos-latest system_name:macOS test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:gcc compiler_name:GCC cxx:g++ os:ubuntu-latest system_name:Linux test_path:WhoaTest]) (push) Waiting to run
2026-02-04 21:53:51 -06:00
fallenoak
3713a7ee89
feat(ui): implement CSimpleStatusBar_GetMinMaxValues 2026-02-04 21:40:42 -06:00
fallenoak
98103db5ee
feat(ui): implement CSimpleStatusBar_SetStatusBarColor 2026-02-04 21:15:32 -06:00
fallenoak
d0621df975
feat(ui): implement CSimpleStatusBar::SetStatusBarColor 2026-02-04 21:10:42 -06:00
fallenoak
fd31a10eaf
feat(ui): implement CSimpleStatusBar::SetBarTexture 2026-02-04 21:06:53 -06:00
fallenoak
78f2afb891
feat(ui): add CSimpleStatusBar::LoadXML 2026-02-04 17:08:31 -06:00
fallenoak
d9b6647c42
feat(ui): add CSimpleStatusBar::IsA
Some checks are pending
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:cl compiler_name:MSVC cxx:cl os:windows-latest system_name:Windows test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:clang compiler_name:Clang cxx:clang++ os:macos-latest system_name:macOS test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:gcc compiler_name:GCC cxx:g++ os:ubuntu-latest system_name:Linux test_path:WhoaTest]) (push) Waiting to run
2026-02-04 15:22:58 -06:00
fallenoak
dc22db2f18
feat(ui): implement CSimpleStatusBar_GetValue 2026-02-04 15:16:33 -06:00
fallenoak
977a3051db
feat(ui): implement CSimpleStatusBar_SetMinMaxValues 2026-02-04 15:08:45 -06:00
fallenoak
c54dda367b
feat(ui): implement CSimpleStatusBar_SetValue 2026-02-04 14:33:23 -06:00
fallenoak
35699af8d2
feat(ui): add CSimpleStatusBar::SetMinMaxValues 2026-02-04 14:28:55 -06:00
fallenoak
61484450b8
feat(ui): add CSimpleStatusBar::SetValue 2026-02-04 13:23:14 -06:00
fallenoak
bc2dabeea9
feat(ui): add CSimpleStatusBar::GetScriptByName 2026-02-04 12:48:52 -06:00
fallenoak
6a4a2110f4
feat(ui): implement CSimpleFrame_GetScript 2026-02-04 11:37:30 -06:00
fallenoak
4857e817c5
feat(ui): implement CSimpleFrame_CreateTexture 2026-02-04 09:45:37 -06:00
fallenoak
7d911e453d
feat(ui): implement Script_GetActionBarPage
Some checks are pending
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:cl compiler_name:MSVC cxx:cl os:windows-latest system_name:Windows test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:clang compiler_name:Clang cxx:clang++ os:macos-latest system_name:macOS test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:gcc compiler_name:GCC cxx:g++ os:ubuntu-latest system_name:Linux test_path:WhoaTest]) (push) Waiting to run
2026-02-03 17:11:18 -06:00
fallenoak
d34336cd7e
feat(ui): add ActionBarRegisterScriptFunctions 2026-02-03 17:03:59 -06:00
fallenoak
3bf95af10c
feat(ui): implement CSimpleTexture_SetDrawLayer
Some checks are pending
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:cl compiler_name:MSVC cxx:cl os:windows-latest system_name:Windows test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:clang compiler_name:Clang cxx:clang++ os:macos-latest system_name:macOS test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:gcc compiler_name:GCC cxx:g++ os:ubuntu-latest system_name:Linux test_path:WhoaTest]) (push) Waiting to run
2026-02-03 16:24:09 -06:00
fallenoak
0681e432e2
feat(ui): handle 3 argument form in CSimpleFrame_GetAttribute 2026-02-03 14:57:22 -06:00
fallenoak
66fd4a6564
feat(ui): implement CSimpleFrame_SetAttribute 2026-02-03 10:13:08 -06:00
fallenoak
c201da76cd
feat(ui): partially implement CSimpleFrame_GetAttribute 2026-02-03 09:40:46 -06:00
fallenoak
3d8073cf75
feat(ui): implement CSimpleFrame::LoadXML_Attributes 2026-02-03 09:00:27 -06:00
fallenoak
bdce266205
feat(ui): add CSimpleFrame::SetAttribute 2026-02-03 08:36:04 -06:00
fallenoak
c099226cd2
feat(ui): add CSimpleFrame::GetAttribute
Some checks are pending
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:cl compiler_name:MSVC cxx:cl os:windows-latest system_name:Windows test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:clang compiler_name:Clang cxx:clang++ os:macos-latest system_name:macOS test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:gcc compiler_name:GCC cxx:g++ os:ubuntu-latest system_name:Linux test_path:WhoaTest]) (push) Waiting to run
2026-02-02 22:29:26 -06:00
fallenoak
ae64833a5c
feat(ui): add CSimpleFrame::m_attributes 2026-02-02 22:19:15 -06:00
fallenoak
728d13b216
fix(object): link to ui lib 2026-02-02 22:13:40 -06:00
fallenoak
f42416bd0b
feat(ui): implement CSimpleButton_GetTextHeight 2026-02-02 21:09:56 -06:00
fallenoak
b076c2c573
feat(ui): implement CSimpleFontString_GetText 2026-02-02 21:02:29 -06:00
fallenoak
0962e5952e
feat(ui): implement Script_FillLocalizedClassList 2026-02-02 20:30:52 -06:00
fallenoak
e51df96e8d
feat(ui): implement Script_UnitExists 2026-02-02 16:46:42 -06:00
fallenoak
55e37fd779
feat(object): add CGUnit_C::CanHighlight 2026-02-02 16:46:23 -06:00
fallenoak
71b7b159de
feat(ui): add CGPetInfo 2026-02-02 16:45:58 -06:00
fallenoak
953fb372d8
feat(object): add CGUnit_C::CanBeTargetted 2026-02-02 11:41:15 -06:00
fallenoak
03bd53324a
feat(object): add CGObject_C::CanBeTargetted 2026-02-02 11:39:02 -06:00
fallenoak
1c85269d1c
feat(object): add CGObject_C::CanHighlight 2026-02-02 11:37:30 -06:00
aomizu
8935c520c0 feat: Add texture matrix transform support to Metal shaders for animated textures 2025-12-26 17:03:37 +09:00
aomizu
7cf7127810 feat: Implement color animation in Metal shaders by using diffuse and emissive vertex constants for output color. 2025-12-25 15:11:18 +09:00
aomizu
8fb51991e0 revert: remove non-metal shader init from Client.cpp 2025-12-25 13:24:07 +09:00
aomizu
7fdd22545f feat: Convert GxTex_Argb4444 textures to RGBA8 during Metal upload to simplify handling 2025-12-25 13:10:25 +09:00
aomizu
15eafe92d7 feat: Implement fog and point size in Metal shaders and refine render state processing for textures and other states. 2025-12-25 13:10:25 +09:00
aomizu
1ad3679f90 feat: Implement initial Metal graphics device with comprehensive shader system and pipeline management. 2025-12-25 13:10:25 +09:00
aomizu
81970958a8 feat: Add debug rendering pipeline to draw a triangle in the Metal backend. 2025-12-25 13:10:25 +09:00
aomizu
a9cad5238d init metal backend 2025-12-25 13:10:25 +09:00
52 changed files with 3887 additions and 692 deletions

View File

@ -32,6 +32,8 @@ if(WHOA_SYSTEM_MAC)
"-framework AppKit"
"-framework Carbon"
"-framework IOKit"
"-framework Metal"
"-framework QuartzCore"
)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/mac/MainMenu.nib DESTINATION "bin")

View File

@ -0,0 +1,9 @@
#ifndef APP_MAC_ENGINE_MTL_LAYER_VIEW_H
#define APP_MAC_ENGINE_MTL_LAYER_VIEW_H
#include "app/mac/EngineGLLayerView.h"
@interface EngineMTLLayerView : EngineGLLayerView
@end
#endif

View File

@ -0,0 +1,36 @@
#include "app/mac/EngineMTLLayerView.h"
#import <QuartzCore/CAMetalLayer.h>
@implementation EngineMTLLayerView
- (CALayer*)makeBackingLayer {
return [CAMetalLayer layer];
}
- (id)initWithFrame:(NSRect)frame glWindow:(GLWindow*)window {
self = [super initWithFrame:frame glWindow:window];
if (self) {
[self setWantsLayer:YES];
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect {
// Rendering is driven by CGxDeviceMTL.
}
- (void)update {
[super update];
if (![self.layer isKindOfClass:[CAMetalLayer class]]) {
return;
}
CAMetalLayer* layer = (CAMetalLayer*)self.layer;
CGSize size = [self convertSizeToBacking:self.bounds.size];
layer.drawableSize = size;
}
@end

View File

@ -1,7 +1,9 @@
#include "app/mac/View.h"
#include "app/mac/EngineGLLayerView.h"
#include "app/mac/EngineMTLLayerView.h"
#include "app/mac/WindowCallbacks.h"
#include "gx/gll/GLWindow.h"
#include "gx/Device.hpp"
GLWindowCallbacks EngineViewCallbacks = {
&MacOnResized,
@ -23,5 +25,9 @@ void AssignEngineViewCallbacks(GLWindowCallbacks* callbacks) {
}
Class GetEngineViewClass() {
if (GxDevApi() == GxApi_Metal) {
return [EngineMTLLayerView class];
}
return [EngineGLLayerView class];
}

View File

@ -2,6 +2,7 @@
#include "app/mac/MacClient.h"
#include "event/Input.hpp"
#include "gx/gll/CGxDeviceGLL.hpp"
#include "gx/mtl/CGxDeviceMTL.hpp"
#include "gx/Device.hpp"
#include "gx/Window.hpp"
#include <bc/Debug.hpp>
@ -171,7 +172,11 @@ void MacOnResized(int32_t width, int32_t height, bool a3) {
return;
}
static_cast<CGxDeviceGLL*>(g_theGxDevicePtr)->Resize(width, height);
if (GxDevApi() == GxApi_GLL) {
static_cast<CGxDeviceGLL*>(g_theGxDevicePtr)->Resize(width, height);
} else if (GxDevApi() == GxApi_Metal) {
static_cast<CGxDeviceMTL*>(g_theGxDevicePtr)->Resize(width, height);
}
OsQueuePut(OS_INPUT_SIZE, width, height, 0, 0);

View File

@ -6,6 +6,7 @@
#include "gx/Adapter.hpp"
#include "gx/Device.hpp"
#include <storm/Array.hpp>
#include <cstdlib>
#include <cstring>
static CGxDevice* s_device;
@ -417,6 +418,13 @@ void ConsoleDeviceInitialize(const char* title) {
api = GxApi_GLL;
#endif
#if defined(WHOA_SYSTEM_MAC)
const char* apiOverride = getenv("WHOA_GX_API");
if (apiOverride && !strcmp(apiOverride, "metal")) {
api = GxApi_Metal;
}
#endif
s_device = GxDevCreate(api, OsWindowProc, format);
// TODO

View File

@ -18,6 +18,7 @@
#if defined(WHOA_SYSTEM_MAC)
#include "gx/gll/CGxDeviceGLL.hpp"
#include "gx/mtl/CGxDeviceMTL.hpp"
#include "gx/mac/Display.hpp"
#include <ApplicationServices/ApplicationServices.h>
#include <OpenGL/OpenGL.h>
@ -117,6 +118,8 @@ int32_t CGxDevice::AdapterFormats(EGxApi api, TSGrowableArray<CGxFormat>& adapte
CGxDevice::OpenGlAdapterFormats(adapterFormats);
} else if (api == GxApi_GLL) {
CGxDevice::GLLAdapterFormats(adapterFormats);
} else if (api == GxApi_Metal) {
CGxDevice::OpenGlAdapterFormats(adapterFormats);
}
#elif defined(WHOA_SYSTEM_LINUX)
@ -228,6 +231,11 @@ CGxDevice* CGxDevice::NewGLL() {
auto m = SMemAlloc(sizeof(CGxDeviceGLL), __FILE__, __LINE__, 0x0);
return new (m) CGxDeviceGLL();
}
CGxDevice* CGxDevice::NewMTL() {
auto m = SMemAlloc(sizeof(CGxDeviceMTL), __FILE__, __LINE__, 0x0);
return new (m) CGxDeviceMTL();
}
#endif
CGxDevice* CGxDevice::NewOpenGl() {

View File

@ -70,6 +70,7 @@ class CGxDevice {
#endif
#if defined(WHOA_SYSTEM_MAC)
static CGxDevice* NewGLL();
static CGxDevice* NewMTL();
#endif
static CGxDevice* NewOpenGl();
static void OpenGlAdapterFormats(TSGrowableArray<CGxFormat>& adapterFormats);

View File

@ -20,6 +20,7 @@ if(WHOA_SYSTEM_MAC)
file(GLOB MAC_SOURCES
"gll/*.cpp"
"gll/*.mm"
"mtl/*.mm"
"mac/*.cpp"
)

View File

@ -24,6 +24,8 @@ CGxDevice* GxDevCreate(EGxApi api, int32_t (*windowProc)(void* window, uint32_t
device = CGxDevice::NewOpenGl();
} else if (api == GxApi_GLL) {
device = CGxDevice::NewGLL();
} else if (api == GxApi_Metal) {
device = CGxDevice::NewMTL();
} else {
// Error
}

View File

@ -35,7 +35,8 @@ enum EGxApi {
GxApi_D3d10 = 3,
GxApi_D3d11 = 4,
GxApi_GLL = 5,
GxApis_Last = 6
GxApi_Metal = 6,
GxApis_Last = 7
};
enum EGxBlend {

View File

@ -0,0 +1,81 @@
#ifndef GX_MTL_C_GX_DEVICE_MTL_HPP
#define GX_MTL_C_GX_DEVICE_MTL_HPP
#include "gx/CGxDevice.hpp"
#include "gx/gll/GLWindow.h"
class CGxBatch;
class CGxShader;
class CGxDeviceMTL : public CGxDevice {
public:
// Member variables
GLWindow m_window;
// Virtual member functions
void ITexMarkAsUpdated(CGxTex*) override;
void IRsSendToHw(EGxRenderState) override;
int32_t DeviceCreate(int32_t (*windowProc)(void* window, uint32_t message, uintptr_t wparam, intptr_t lparam), const CGxFormat&) override;
int32_t DeviceSetFormat(const CGxFormat&) override;
void* DeviceWindow() override;
void DeviceWM(EGxWM wm, uintptr_t param1, uintptr_t param2) override {};
void CapsWindowSize(CRect&) override;
void CapsWindowSizeInScreenCoords(CRect& dst) override;
void ScenePresent() override;
void SceneClear(uint32_t, CImVector) override;
void Draw(CGxBatch* batch, int32_t indexed) override;
void PoolSizeSet(CGxPool*, uint32_t) override;
char* BufLock(CGxBuf*) override;
int32_t BufUnlock(CGxBuf*, uint32_t) override;
void BufData(CGxBuf* buf, const void* data, size_t size, uintptr_t offset) override;
void TexDestroy(CGxTex* texId) override;
void IShaderCreate(CGxShader*) override;
void ShaderCreate(CGxShader*[], EGxShTarget, const char*, const char*, int32_t) override;
int32_t StereoEnabled(void) override;
void XformSetProjection(const C44Matrix& matrix) override;
// Member functions
CGxDeviceMTL();
void Resize(uint32_t width, uint32_t height);
private:
void ISetCaps(const CGxFormat& format);
void EnsureLibrary();
void BeginFrame();
void* GetPipeline(EGxVertexBufferFormat format, bool useColor, bool useSkin, bool useTex, int32_t blendMode);
void* GetPoolBuffer(CGxPool* pool);
void ITexCreate(CGxTex* texId);
void ITexUpload(CGxTex* texId);
void* GetTexture(CGxTex* texId);
void* GetSampler(CGxTex* texId);
void EnsureFallbackTexture();
void EnsureDepthTexture(uint32_t width, uint32_t height);
void* GetDepthState(bool depthTest, bool depthWrite, uint32_t depthFunc);
void* m_device = nullptr;
void* m_commandQueue = nullptr;
void* m_layer = nullptr;
void* m_shaderLibrary = nullptr;
void* m_pipelineColor[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineSolid[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineSkin[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineColorTex[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineSolidTex[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineSkinTex[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineColorTex2[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineSolidTex2[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineSkinTex2[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_frameCommandBuffer = nullptr;
void* m_frameEncoder = nullptr;
void* m_frameDrawable = nullptr;
uint32_t m_frameHasDraw = 0;
uint32_t m_clearMask = 0;
uint32_t m_clearColor = 0;
void* m_fallbackTexture = nullptr;
void* m_fallbackSampler = nullptr;
void* m_depthTexture = nullptr;
uint32_t m_depthWidth = 0;
uint32_t m_depthHeight = 0;
void* m_depthStates[2][2][4] = {};
};
#endif

1855
src/gx/mtl/CGxDeviceMTL.mm Normal file

File diff suppressed because it is too large Load Diff

View File

@ -16,4 +16,5 @@ target_include_directories(object
target_link_libraries(object
PRIVATE
db
ui
)

View File

@ -36,6 +36,14 @@ OBJECT_TYPE_ID CGObject::GetTypeID() const {
return this->m_typeID;
}
int32_t CGObject::IsA(OBJECT_TYPE type) const {
return (this->GetType() & type) != 0;
}
int32_t CGObject::IsExactlyA(OBJECT_TYPE_ID typeID) const {
return this->m_typeID == typeID;
}
CGObjectData* CGObject::Obj() const {
return this->m_obj;
}

View File

@ -31,6 +31,8 @@ class CGObject {
WOWGUID GetGUID() const;
OBJECT_TYPE GetType() const;
OBJECT_TYPE_ID GetTypeID() const;
int32_t IsA(OBJECT_TYPE type) const;
int32_t IsExactlyA(OBJECT_TYPE_ID typeID) const;
protected:
// Protected member variables

View File

@ -31,6 +31,14 @@ void CGObject_C::AddWorldObject() {
// TODO
}
int32_t CGObject_C::CanBeTargetted() {
return false;
}
int32_t CGObject_C::CanHighlight() {
return false;
}
void CGObject_C::Disable() {
// TODO

View File

@ -33,6 +33,8 @@ class CGObject_C : public CGObject, public TSHashObject<CGObject_C, CHashKeyGUID
void PostReenable();
virtual void HandleOutOfRange(OUT_OF_RANGE_TYPE type) {};
// TODO
virtual int32_t CanHighlight();
virtual int32_t CanBeTargetted();
// Public member functions
CGObject_C() = default;

View File

@ -41,6 +41,14 @@ uint32_t CGPlayer::TotalRemoteFieldsSaved() {
return CGPlayer::GetBaseOffsetSaved() + 173;
}
uint32_t CGPlayer::GetNextLevelXP() const {
return this->Player()->nextLevelXP;
}
uint32_t CGPlayer::GetXP() const {
return this->Player()->xp;
}
CGPlayerData* CGPlayer::Player() const {
return this->m_player;
}

View File

@ -148,6 +148,10 @@ class CGPlayer {
static uint32_t TotalFieldsSaved();
static uint32_t TotalRemoteFieldsSaved();
// Public member functions
uint32_t GetNextLevelXP() const;
uint32_t GetXP() const;
protected:
// Protected member variables
CGPlayerData* m_player;

View File

@ -1,5 +1,6 @@
#include "object/client/CGPlayer_C.hpp"
#include "db/Db.hpp"
#include "object/client/ObjMgr.hpp"
#include "object/Types.hpp"
#include <storm/Error.hpp>
@ -11,6 +12,22 @@ CGPlayer_C::~CGPlayer_C() {
// TODO
}
uint32_t CGPlayer_C::GetActiveNextLevelXP() const {
if (this->GetGUID() != ClntObjMgrGetActivePlayer()) {
return 0;
}
return this->GetNextLevelXP();
}
uint32_t CGPlayer_C::GetActiveXP() const {
if (this->GetGUID() != ClntObjMgrGetActivePlayer()) {
return 0;
}
return this->GetXP();
}
void CGPlayer_C::PostInit(uint32_t time, const CClientObjCreate& init, bool a4) {
// TODO

View File

@ -15,6 +15,8 @@ class CGPlayer_C : public CGUnit_C, public CGPlayer {
// Public member functions
CGPlayer_C(uint32_t time, CClientObjCreate& objCreate);
uint32_t GetActiveNextLevelXP() const;
uint32_t GetActiveXP() const;
void PostInit(uint32_t time, const CClientObjCreate& init, bool a4);
void SetStorage(uint32_t* storage, uint32_t* saved);
};

View File

@ -1,5 +1,7 @@
#include "object/client/CGUnit_C.hpp"
#include "object/client/ObjMgr.hpp"
#include "db/Db.hpp"
#include "ui/Game.hpp"
WOWGUID CGUnit_C::s_activeMover;
@ -99,6 +101,20 @@ CGUnit_C::~CGUnit_C() {
// TODO
}
int32_t CGUnit_C::CanHighlight() {
if (this->m_unit->flags & 0x2000000) {
if (this->m_unit->createdBy != ClntObjMgrGetActivePlayer() || this->GetGUID() != CGPetInfo::GetPet(0)) {
return false;
}
}
return true;
}
int32_t CGUnit_C::CanBeTargetted() {
return this->CanHighlight();
}
void CGUnit_C::PostInit(uint32_t time, const CClientObjCreate& init, bool a4) {
// TODO

View File

@ -21,6 +21,10 @@ class CGUnit_C : public CGObject_C, public CGUnit {
// Virtual public member functions
virtual ~CGUnit_C();
// TODO
virtual int32_t CanHighlight();
virtual int32_t CanBeTargetted();
// TODO
// Public member functions
CGUnit_C(uint32_t time, CClientObjCreate& objCreate);

View File

@ -332,6 +332,10 @@ void CLayoutFrame::GetFirstPointY(const FRAMEPOINT* const pointarray, int32_t el
}
}
float CLayoutFrame::GetHeight() {
return this->m_height;
}
CLayoutFrame* CLayoutFrame::GetLayoutFrameByName(const char* name) {
return nullptr;
}
@ -353,8 +357,20 @@ int32_t CLayoutFrame::GetRect(CRect* rect) {
return 1;
}
float CLayoutFrame::GetHeight() {
return this->m_height;
void CLayoutFrame::GetSize(float& width, float& height, int32_t a4) {
width = this->GetWidth();
height = this->GetHeight();
if (!a4 && (width == 0.0f || height == 0.0f)) {
if (this->m_flags & FLAG_RESIZE_PENDING) {
this->Resize(1);
}
if (this->m_flags & 0x1) {
width = (this->m_rect.maxX - this->m_rect.minX) / this->m_layoutScale;
height = (this->m_rect.maxY - this->m_rect.minY) / this->m_layoutScale;
}
}
}
float CLayoutFrame::GetWidth() {

View File

@ -51,6 +51,7 @@ class CLayoutFrame {
virtual void SetHeight(float height);
virtual float GetWidth();
virtual float GetHeight();
virtual void GetSize(float& width, float& height, int32_t a4);
virtual void GetClampRectInsets(float& a1, float& a2, float& a3, float& a4);
virtual int32_t IsAttachmentOrigin();
virtual CLayoutFrame* GetLayoutFrameByName(const char* name);

View File

@ -11,8 +11,6 @@
#include <storm/String.hpp>
#include <tempest/Vector.hpp>
const char* g_scriptEvents[722];
int32_t g_glueFrameScriptGenders[] = {
2, // UNIT_SEX_MALE
3, // UNIT_SEX_FEMALE
@ -154,8 +152,10 @@ void FrameScript_CreateEvents(const char* names[], uint32_t count) {
FrameScript::s_scriptEvents.SetCount(count);
for (int32_t i = 0; i < count; i++) {
auto event = FrameScript::s_scriptEventsHash.New(names[i], 0, 0);
FrameScript::s_scriptEvents[i] = event;
if (names[i]) {
auto event = FrameScript::s_scriptEventsHash.New(names[i], 0, 0);
FrameScript::s_scriptEvents[i] = event;
}
}
}
@ -1083,656 +1083,3 @@ void FrameScript_UnregisterScriptEvent(FrameScript_Object* object, FrameScript_E
}
}
}
void ScriptEventsInitialize() {
g_scriptEvents[0] = "UNIT_PET";
g_scriptEvents[2] = "UNIT_PET";
g_scriptEvents[12] = "UNIT_TARGET";
g_scriptEvents[17] = "UNIT_DISPLAYPOWER";
g_scriptEvents[18] = "UNIT_HEALTH";
g_scriptEvents[19] = "UNIT_MANA";
g_scriptEvents[20] = "UNIT_RAGE";
g_scriptEvents[21] = "UNIT_FOCUS";
g_scriptEvents[22] = "UNIT_ENERGY";
g_scriptEvents[23] = "UNIT_HAPPINESS";
g_scriptEvents[25] = "UNIT_RUNIC_POWER";
g_scriptEvents[26] = "UNIT_MAXHEALTH";
g_scriptEvents[27] = "UNIT_MAXMANA";
g_scriptEvents[28] = "UNIT_MAXRAGE";
g_scriptEvents[29] = "UNIT_MAXFOCUS";
g_scriptEvents[30] = "UNIT_MAXENERGY";
g_scriptEvents[31] = "UNIT_MAXHAPPINESS";
g_scriptEvents[33] = "UNIT_MAXRUNIC_POWER";
g_scriptEvents[48] = "UNIT_LEVEL";
g_scriptEvents[49] = "UNIT_FACTION";
g_scriptEvents[53] = "UNIT_FLAGS";
g_scriptEvents[54] = "UNIT_FLAGS";
g_scriptEvents[56] = "UNIT_ATTACK_SPEED";
g_scriptEvents[57] = "UNIT_ATTACK_SPEED";
g_scriptEvents[58] = "UNIT_RANGEDDAMAGE";
g_scriptEvents[64] = "UNIT_DAMAGE";
g_scriptEvents[65] = "UNIT_DAMAGE";
g_scriptEvents[66] = "UNIT_DAMAGE";
g_scriptEvents[67] = "UNIT_DAMAGE";
g_scriptEvents[71] = "UNIT_PET_EXPERIENCE";
g_scriptEvents[72] = "UNIT_PET_EXPERIENCE";
g_scriptEvents[73] = "UNIT_DYNAMIC_FLAGS";
g_scriptEvents[78] = "UNIT_STATS";
g_scriptEvents[79] = "UNIT_STATS";
g_scriptEvents[80] = "UNIT_STATS";
g_scriptEvents[81] = "UNIT_STATS";
g_scriptEvents[82] = "UNIT_STATS";
g_scriptEvents[93] = "UNIT_RESISTANCES";
g_scriptEvents[94] = "UNIT_RESISTANCES";
g_scriptEvents[95] = "UNIT_RESISTANCES";
g_scriptEvents[96] = "UNIT_RESISTANCES";
g_scriptEvents[97] = "UNIT_RESISTANCES";
g_scriptEvents[98] = "UNIT_RESISTANCES";
g_scriptEvents[99] = "UNIT_RESISTANCES";
g_scriptEvents[100] = "UNIT_RESISTANCES";
g_scriptEvents[101] = "UNIT_RESISTANCES";
g_scriptEvents[102] = "UNIT_RESISTANCES";
g_scriptEvents[103] = "UNIT_RESISTANCES";
g_scriptEvents[104] = "UNIT_RESISTANCES";
g_scriptEvents[105] = "UNIT_RESISTANCES";
g_scriptEvents[106] = "UNIT_RESISTANCES";
g_scriptEvents[107] = "UNIT_RESISTANCES";
g_scriptEvents[108] = "UNIT_RESISTANCES";
g_scriptEvents[109] = "UNIT_RESISTANCES";
g_scriptEvents[110] = "UNIT_RESISTANCES";
g_scriptEvents[111] = "UNIT_RESISTANCES";
g_scriptEvents[112] = "UNIT_RESISTANCES";
g_scriptEvents[113] = "UNIT_RESISTANCES";
g_scriptEvents[117] = "UNIT_ATTACK_POWER";
g_scriptEvents[118] = "UNIT_ATTACK_POWER";
g_scriptEvents[119] = "UNIT_ATTACK_POWER";
g_scriptEvents[120] = "UNIT_RANGED_ATTACK_POWER";
g_scriptEvents[121] = "UNIT_RANGED_ATTACK_POWER";
g_scriptEvents[122] = "UNIT_RANGED_ATTACK_POWER";
g_scriptEvents[123] = "UNIT_RANGEDDAMAGE";
g_scriptEvents[124] = "UNIT_RANGEDDAMAGE";
g_scriptEvents[125] = "UNIT_MANA";
g_scriptEvents[132] = "UNIT_MANA";
g_scriptEvents[139] = "UNIT_STATS";
g_scriptEvents[142] = "UNIT_AURA";
g_scriptEvents[143] = "UNIT_COMBAT";
g_scriptEvents[144] = "UNIT_NAME_UPDATE";
g_scriptEvents[145] = "UNIT_PORTRAIT_UPDATE";
g_scriptEvents[146] = "UNIT_MODEL_CHANGED";
g_scriptEvents[147] = "UNIT_INVENTORY_CHANGED";
g_scriptEvents[148] = "UNIT_CLASSIFICATION_CHANGED";
g_scriptEvents[149] = "UNIT_COMBO_POINTS";
g_scriptEvents[150] = "ITEM_LOCK_CHANGED";
g_scriptEvents[151] = "PLAYER_XP_UPDATE";
g_scriptEvents[152] = "PLAYER_REGEN_DISABLED";
g_scriptEvents[153] = "PLAYER_REGEN_ENABLED";
g_scriptEvents[154] = "PLAYER_AURAS_CHANGED";
g_scriptEvents[155] = "PLAYER_ENTER_COMBAT";
g_scriptEvents[156] = "PLAYER_LEAVE_COMBAT";
g_scriptEvents[157] = "PLAYER_TARGET_CHANGED";
g_scriptEvents[158] = "PLAYER_FOCUS_CHANGED";
g_scriptEvents[159] = "PLAYER_CONTROL_LOST";
g_scriptEvents[160] = "PLAYER_CONTROL_GAINED";
g_scriptEvents[161] = "PLAYER_FARSIGHT_FOCUS_CHANGED";
g_scriptEvents[162] = "PLAYER_LEVEL_UP";
g_scriptEvents[163] = "PLAYER_MONEY";
g_scriptEvents[164] = "PLAYER_DAMAGE_DONE_MODS";
g_scriptEvents[165] = "PLAYER_TOTEM_UPDATE";
g_scriptEvents[166] = "ZONE_CHANGED";
g_scriptEvents[167] = "ZONE_CHANGED_INDOORS";
g_scriptEvents[168] = "ZONE_CHANGED_NEW_AREA";
g_scriptEvents[169] = "MINIMAP_UPDATE_ZOOM";
g_scriptEvents[170] = "MINIMAP_UPDATE_TRACKING";
g_scriptEvents[171] = "SCREENSHOT_SUCCEEDED";
g_scriptEvents[172] = "SCREENSHOT_FAILED";
g_scriptEvents[173] = "ACTIONBAR_SHOWGRID";
g_scriptEvents[174] = "ACTIONBAR_HIDEGRID";
g_scriptEvents[175] = "ACTIONBAR_PAGE_CHANGED";
g_scriptEvents[176] = "ACTIONBAR_SLOT_CHANGED";
g_scriptEvents[177] = "ACTIONBAR_UPDATE_STATE";
g_scriptEvents[178] = "ACTIONBAR_UPDATE_USABLE";
g_scriptEvents[179] = "ACTIONBAR_UPDATE_COOLDOWN";
g_scriptEvents[180] = "UPDATE_BONUS_ACTIONBAR";
g_scriptEvents[181] = "PARTY_MEMBERS_CHANGED";
g_scriptEvents[182] = "PARTY_LEADER_CHANGED";
g_scriptEvents[183] = "PARTY_MEMBER_ENABLE";
g_scriptEvents[184] = "PARTY_MEMBER_DISABLE";
g_scriptEvents[185] = "PARTY_LOOT_METHOD_CHANGED";
g_scriptEvents[186] = "SYSMSG";
g_scriptEvents[187] = "UI_ERROR_MESSAGE";
g_scriptEvents[188] = "UI_INFO_MESSAGE";
g_scriptEvents[189] = "UPDATE_CHAT_COLOR";
g_scriptEvents[190] = "CHAT_MSG_ADDON";
g_scriptEvents[191] = "CHAT_MSG_SYSTEM";
g_scriptEvents[192] = "CHAT_MSG_SAY";
g_scriptEvents[193] = "CHAT_MSG_PARTY";
g_scriptEvents[194] = "CHAT_MSG_RAID";
g_scriptEvents[195] = "CHAT_MSG_GUILD";
g_scriptEvents[196] = "CHAT_MSG_OFFICER";
g_scriptEvents[197] = "CHAT_MSG_YELL";
g_scriptEvents[198] = "CHAT_MSG_WHISPER";
g_scriptEvents[199] = "CHAT_MSG_WHISPER_INFORM";
g_scriptEvents[200] = "CHAT_MSG_EMOTE";
g_scriptEvents[201] = "CHAT_MSG_TEXT_EMOTE";
g_scriptEvents[202] = "CHAT_MSG_MONSTER_SAY";
g_scriptEvents[203] = "CHAT_MSG_MONSTER_PARTY";
g_scriptEvents[204] = "CHAT_MSG_MONSTER_YELL";
g_scriptEvents[205] = "CHAT_MSG_MONSTER_WHISPER";
g_scriptEvents[206] = "CHAT_MSG_MONSTER_EMOTE";
g_scriptEvents[207] = "CHAT_MSG_CHANNEL";
g_scriptEvents[208] = "CHAT_MSG_CHANNEL_JOIN";
g_scriptEvents[209] = "CHAT_MSG_CHANNEL_LEAVE";
g_scriptEvents[210] = "CHAT_MSG_CHANNEL_LIST";
g_scriptEvents[211] = "CHAT_MSG_CHANNEL_NOTICE";
g_scriptEvents[212] = "CHAT_MSG_CHANNEL_NOTICE_USER";
g_scriptEvents[213] = "CHAT_MSG_AFK";
g_scriptEvents[214] = "CHAT_MSG_DND";
g_scriptEvents[215] = "CHAT_MSG_IGNORED";
g_scriptEvents[216] = "CHAT_MSG_SKILL";
g_scriptEvents[217] = "CHAT_MSG_LOOT";
g_scriptEvents[218] = "CHAT_MSG_MONEY";
g_scriptEvents[219] = "CHAT_MSG_OPENING";
g_scriptEvents[220] = "CHAT_MSG_TRADESKILLS";
g_scriptEvents[221] = "CHAT_MSG_PET_INFO";
g_scriptEvents[222] = "CHAT_MSG_COMBAT_MISC_INFO";
g_scriptEvents[223] = "CHAT_MSG_COMBAT_XP_GAIN";
g_scriptEvents[224] = "CHAT_MSG_COMBAT_HONOR_GAIN";
g_scriptEvents[225] = "CHAT_MSG_COMBAT_FACTION_CHANGE";
g_scriptEvents[226] = "CHAT_MSG_BG_SYSTEM_NEUTRAL";
g_scriptEvents[227] = "CHAT_MSG_BG_SYSTEM_ALLIANCE";
g_scriptEvents[228] = "CHAT_MSG_BG_SYSTEM_HORDE";
g_scriptEvents[229] = "CHAT_MSG_RAID_LEADER";
g_scriptEvents[230] = "CHAT_MSG_RAID_WARNING";
g_scriptEvents[231] = "CHAT_MSG_RAID_BOSS_WHISPER";
g_scriptEvents[232] = "CHAT_MSG_RAID_BOSS_EMOTE";
g_scriptEvents[233] = "CHAT_MSG_FILTERED";
g_scriptEvents[234] = "CHAT_MSG_BATTLEGROUND";
g_scriptEvents[235] = "CHAT_MSG_BATTLEGROUND_LEADER";
g_scriptEvents[236] = "CHAT_MSG_RESTRICTED";
// TODO
// g_scriptEvents[237] = &byte_9E14FF;
g_scriptEvents[238] = "CHAT_MSG_ACHIEVEMENT";
g_scriptEvents[239] = "CHAT_MSG_GUILD_ACHIEVEMENT";
g_scriptEvents[240] = "LANGUAGE_LIST_CHANGED";
g_scriptEvents[241] = "TIME_PLAYED_MSG";
g_scriptEvents[242] = "SPELLS_CHANGED";
g_scriptEvents[243] = "CURRENT_SPELL_CAST_CHANGED";
g_scriptEvents[244] = "SPELL_UPDATE_COOLDOWN";
g_scriptEvents[245] = "SPELL_UPDATE_USABLE";
g_scriptEvents[246] = "CHARACTER_POINTS_CHANGED";
g_scriptEvents[247] = "SKILL_LINES_CHANGED";
g_scriptEvents[248] = "ITEM_PUSH";
g_scriptEvents[249] = "LOOT_OPENED";
g_scriptEvents[250] = "LOOT_SLOT_CLEARED";
g_scriptEvents[251] = "LOOT_SLOT_CHANGED";
g_scriptEvents[252] = "LOOT_CLOSED";
g_scriptEvents[253] = "PLAYER_LOGIN";
g_scriptEvents[254] = "PLAYER_LOGOUT";
g_scriptEvents[255] = "PLAYER_ENTERING_WORLD";
g_scriptEvents[256] = "PLAYER_LEAVING_WORLD";
g_scriptEvents[257] = "PLAYER_ALIVE";
g_scriptEvents[258] = "PLAYER_DEAD";
g_scriptEvents[259] = "PLAYER_CAMPING";
g_scriptEvents[260] = "PLAYER_QUITING";
g_scriptEvents[261] = "LOGOUT_CANCEL";
g_scriptEvents[262] = "RESURRECT_REQUEST";
g_scriptEvents[263] = "PARTY_INVITE_REQUEST";
g_scriptEvents[264] = "PARTY_INVITE_CANCEL";
g_scriptEvents[265] = "GUILD_INVITE_REQUEST";
g_scriptEvents[266] = "GUILD_INVITE_CANCEL";
g_scriptEvents[267] = "GUILD_MOTD";
g_scriptEvents[268] = "TRADE_REQUEST";
g_scriptEvents[269] = "TRADE_REQUEST_CANCEL";
g_scriptEvents[270] = "LOOT_BIND_CONFIRM";
g_scriptEvents[271] = "EQUIP_BIND_CONFIRM";
g_scriptEvents[272] = "AUTOEQUIP_BIND_CONFIRM";
g_scriptEvents[273] = "USE_BIND_CONFIRM";
g_scriptEvents[274] = "DELETE_ITEM_CONFIRM";
g_scriptEvents[275] = "CURSOR_UPDATE";
g_scriptEvents[276] = "ITEM_TEXT_BEGIN";
g_scriptEvents[277] = "ITEM_TEXT_TRANSLATION";
g_scriptEvents[278] = "ITEM_TEXT_READY";
g_scriptEvents[279] = "ITEM_TEXT_CLOSED";
g_scriptEvents[280] = "GOSSIP_SHOW";
g_scriptEvents[281] = "GOSSIP_CONFIRM";
g_scriptEvents[282] = "GOSSIP_CONFIRM_CANCEL";
g_scriptEvents[283] = "GOSSIP_ENTER_CODE";
g_scriptEvents[284] = "GOSSIP_CLOSED";
g_scriptEvents[285] = "QUEST_GREETING";
g_scriptEvents[286] = "QUEST_DETAIL";
g_scriptEvents[287] = "QUEST_PROGRESS";
g_scriptEvents[288] = "QUEST_COMPLETE";
g_scriptEvents[289] = "QUEST_FINISHED";
g_scriptEvents[290] = "QUEST_ITEM_UPDATE";
g_scriptEvents[291] = "TAXIMAP_OPENED";
g_scriptEvents[292] = "TAXIMAP_CLOSED";
g_scriptEvents[293] = "QUEST_LOG_UPDATE";
g_scriptEvents[294] = "TRAINER_SHOW";
g_scriptEvents[295] = "TRAINER_UPDATE";
g_scriptEvents[296] = "TRAINER_DESCRIPTION_UPDATE";
g_scriptEvents[297] = "TRAINER_CLOSED";
g_scriptEvents[298] = "CVAR_UPDATE";
g_scriptEvents[299] = "TRADE_SKILL_SHOW";
g_scriptEvents[300] = "TRADE_SKILL_UPDATE";
g_scriptEvents[301] = "TRADE_SKILL_CLOSE";
g_scriptEvents[302] = "MERCHANT_SHOW";
g_scriptEvents[303] = "MERCHANT_UPDATE";
g_scriptEvents[304] = "MERCHANT_CLOSED";
g_scriptEvents[305] = "TRADE_SHOW";
g_scriptEvents[306] = "TRADE_CLOSED";
g_scriptEvents[307] = "TRADE_UPDATE";
g_scriptEvents[308] = "TRADE_ACCEPT_UPDATE";
g_scriptEvents[309] = "TRADE_TARGET_ITEM_CHANGED";
g_scriptEvents[310] = "TRADE_PLAYER_ITEM_CHANGED";
g_scriptEvents[311] = "TRADE_MONEY_CHANGED";
g_scriptEvents[312] = "PLAYER_TRADE_MONEY";
g_scriptEvents[313] = "BAG_OPEN";
g_scriptEvents[314] = "BAG_UPDATE";
g_scriptEvents[315] = "BAG_CLOSED";
g_scriptEvents[316] = "BAG_UPDATE_COOLDOWN";
g_scriptEvents[317] = "LOCALPLAYER_PET_RENAMED";
g_scriptEvents[318] = "UNIT_ATTACK";
g_scriptEvents[319] = "UNIT_DEFENSE";
g_scriptEvents[320] = "PET_ATTACK_START";
g_scriptEvents[321] = "PET_ATTACK_STOP";
g_scriptEvents[322] = "UPDATE_MOUSEOVER_UNIT";
g_scriptEvents[323] = "UNIT_SPELLCAST_SENT";
g_scriptEvents[324] = "UNIT_SPELLCAST_START";
g_scriptEvents[325] = "UNIT_SPELLCAST_STOP";
g_scriptEvents[326] = "UNIT_SPELLCAST_FAILED";
g_scriptEvents[327] = "UNIT_SPELLCAST_FAILED_QUIET";
g_scriptEvents[328] = "UNIT_SPELLCAST_INTERRUPTED";
g_scriptEvents[329] = "UNIT_SPELLCAST_DELAYED";
g_scriptEvents[330] = "UNIT_SPELLCAST_SUCCEEDED";
g_scriptEvents[331] = "UNIT_SPELLCAST_CHANNEL_START";
g_scriptEvents[332] = "UNIT_SPELLCAST_CHANNEL_UPDATE";
g_scriptEvents[333] = "UNIT_SPELLCAST_CHANNEL_STOP";
g_scriptEvents[334] = "UNIT_SPELLCAST_INTERRUPTIBLE";
g_scriptEvents[335] = "UNIT_SPELLCAST_NOT_INTERRUPTIBLE";
g_scriptEvents[336] = "PLAYER_GUILD_UPDATE";
g_scriptEvents[337] = "QUEST_ACCEPT_CONFIRM";
g_scriptEvents[338] = "PLAYERBANKSLOTS_CHANGED";
g_scriptEvents[339] = "BANKFRAME_OPENED";
g_scriptEvents[340] = "BANKFRAME_CLOSED";
g_scriptEvents[341] = "PLAYERBANKBAGSLOTS_CHANGED";
g_scriptEvents[342] = "FRIENDLIST_UPDATE";
g_scriptEvents[343] = "IGNORELIST_UPDATE";
g_scriptEvents[344] = "MUTELIST_UPDATE";
g_scriptEvents[345] = "PET_BAR_UPDATE";
g_scriptEvents[346] = "PET_BAR_UPDATE_COOLDOWN";
g_scriptEvents[347] = "PET_BAR_SHOWGRID";
g_scriptEvents[348] = "PET_BAR_HIDEGRID";
g_scriptEvents[349] = "PET_BAR_HIDE";
g_scriptEvents[350] = "PET_BAR_UPDATE_USABLE";
g_scriptEvents[351] = "MINIMAP_PING";
g_scriptEvents[352] = "MIRROR_TIMER_START";
g_scriptEvents[353] = "MIRROR_TIMER_PAUSE";
g_scriptEvents[354] = "MIRROR_TIMER_STOP";
g_scriptEvents[355] = "WORLD_MAP_UPDATE";
g_scriptEvents[356] = "WORLD_MAP_NAME_UPDATE";
g_scriptEvents[357] = "AUTOFOLLOW_BEGIN";
g_scriptEvents[358] = "AUTOFOLLOW_END";
g_scriptEvents[360] = "CINEMATIC_START";
g_scriptEvents[361] = "CINEMATIC_STOP";
g_scriptEvents[362] = "UPDATE_FACTION";
g_scriptEvents[363] = "CLOSE_WORLD_MAP";
g_scriptEvents[364] = "OPEN_TABARD_FRAME";
g_scriptEvents[365] = "CLOSE_TABARD_FRAME";
g_scriptEvents[366] = "TABARD_CANSAVE_CHANGED";
g_scriptEvents[367] = "GUILD_REGISTRAR_SHOW";
g_scriptEvents[368] = "GUILD_REGISTRAR_CLOSED";
g_scriptEvents[369] = "DUEL_REQUESTED";
g_scriptEvents[370] = "DUEL_OUTOFBOUNDS";
g_scriptEvents[371] = "DUEL_INBOUNDS";
g_scriptEvents[372] = "DUEL_FINISHED";
g_scriptEvents[373] = "TUTORIAL_TRIGGER";
g_scriptEvents[374] = "PET_DISMISS_START";
g_scriptEvents[375] = "UPDATE_BINDINGS";
g_scriptEvents[376] = "UPDATE_SHAPESHIFT_FORMS";
g_scriptEvents[377] = "UPDATE_SHAPESHIFT_FORM";
g_scriptEvents[378] = "UPDATE_SHAPESHIFT_USABLE";
g_scriptEvents[379] = "UPDATE_SHAPESHIFT_COOLDOWN";
g_scriptEvents[380] = "WHO_LIST_UPDATE";
g_scriptEvents[381] = "PETITION_SHOW";
g_scriptEvents[382] = "PETITION_CLOSED";
g_scriptEvents[383] = "EXECUTE_CHAT_LINE";
g_scriptEvents[384] = "UPDATE_MACROS";
g_scriptEvents[385] = "UPDATE_TICKET";
g_scriptEvents[386] = "UPDATE_CHAT_WINDOWS";
g_scriptEvents[387] = "CONFIRM_XP_LOSS";
g_scriptEvents[388] = "CORPSE_IN_RANGE";
g_scriptEvents[389] = "CORPSE_IN_INSTANCE";
g_scriptEvents[390] = "CORPSE_OUT_OF_RANGE";
g_scriptEvents[391] = "UPDATE_GM_STATUS";
g_scriptEvents[392] = "PLAYER_UNGHOST";
g_scriptEvents[393] = "BIND_ENCHANT";
g_scriptEvents[394] = "REPLACE_ENCHANT";
g_scriptEvents[395] = "TRADE_REPLACE_ENCHANT";
g_scriptEvents[396] = "TRADE_POTENTIAL_BIND_ENCHANT";
g_scriptEvents[397] = "PLAYER_UPDATE_RESTING";
g_scriptEvents[398] = "UPDATE_EXHAUSTION";
g_scriptEvents[399] = "PLAYER_FLAGS_CHANGED";
g_scriptEvents[400] = "GUILD_ROSTER_UPDATE";
g_scriptEvents[401] = "GM_PLAYER_INFO";
g_scriptEvents[402] = "MAIL_SHOW";
g_scriptEvents[403] = "MAIL_CLOSED";
g_scriptEvents[404] = "SEND_MAIL_MONEY_CHANGED";
g_scriptEvents[405] = "SEND_MAIL_COD_CHANGED";
g_scriptEvents[406] = "MAIL_SEND_INFO_UPDATE";
g_scriptEvents[407] = "MAIL_SEND_SUCCESS";
g_scriptEvents[408] = "MAIL_INBOX_UPDATE";
g_scriptEvents[409] = "MAIL_LOCK_SEND_ITEMS";
g_scriptEvents[410] = "MAIL_UNLOCK_SEND_ITEMS";
g_scriptEvents[411] = "BATTLEFIELDS_SHOW";
g_scriptEvents[412] = "BATTLEFIELDS_CLOSED";
g_scriptEvents[413] = "UPDATE_BATTLEFIELD_STATUS";
g_scriptEvents[414] = "UPDATE_BATTLEFIELD_SCORE";
g_scriptEvents[415] = "AUCTION_HOUSE_SHOW";
g_scriptEvents[416] = "AUCTION_HOUSE_CLOSED";
g_scriptEvents[417] = "NEW_AUCTION_UPDATE";
g_scriptEvents[418] = "AUCTION_ITEM_LIST_UPDATE";
g_scriptEvents[419] = "AUCTION_OWNED_LIST_UPDATE";
g_scriptEvents[420] = "AUCTION_BIDDER_LIST_UPDATE";
g_scriptEvents[421] = "PET_UI_UPDATE";
g_scriptEvents[422] = "PET_UI_CLOSE";
g_scriptEvents[423] = "ADDON_LOADED";
g_scriptEvents[424] = "VARIABLES_LOADED";
g_scriptEvents[425] = "MACRO_ACTION_FORBIDDEN";
g_scriptEvents[426] = "ADDON_ACTION_FORBIDDEN";
g_scriptEvents[427] = "MACRO_ACTION_BLOCKED";
g_scriptEvents[428] = "ADDON_ACTION_BLOCKED";
g_scriptEvents[429] = "START_AUTOREPEAT_SPELL";
g_scriptEvents[430] = "STOP_AUTOREPEAT_SPELL";
g_scriptEvents[431] = "PET_STABLE_SHOW";
g_scriptEvents[432] = "PET_STABLE_UPDATE";
g_scriptEvents[433] = "PET_STABLE_UPDATE_PAPERDOLL";
g_scriptEvents[434] = "PET_STABLE_CLOSED";
g_scriptEvents[435] = "RAID_ROSTER_UPDATE";
g_scriptEvents[436] = "UPDATE_PENDING_MAIL";
g_scriptEvents[437] = "UPDATE_INVENTORY_ALERTS";
g_scriptEvents[438] = "UPDATE_INVENTORY_DURABILITY";
g_scriptEvents[439] = "UPDATE_TRADESKILL_RECAST";
g_scriptEvents[440] = "OPEN_MASTER_LOOT_LIST";
g_scriptEvents[441] = "UPDATE_MASTER_LOOT_LIST";
g_scriptEvents[442] = "START_LOOT_ROLL";
g_scriptEvents[443] = "CANCEL_LOOT_ROLL";
g_scriptEvents[444] = "CONFIRM_LOOT_ROLL";
g_scriptEvents[445] = "CONFIRM_DISENCHANT_ROLL";
g_scriptEvents[446] = "INSTANCE_BOOT_START";
g_scriptEvents[447] = "INSTANCE_BOOT_STOP";
g_scriptEvents[448] = "LEARNED_SPELL_IN_TAB";
g_scriptEvents[449] = "DISPLAY_SIZE_CHANGED";
g_scriptEvents[450] = "CONFIRM_TALENT_WIPE";
g_scriptEvents[451] = "CONFIRM_BINDER";
g_scriptEvents[452] = "MAIL_FAILED";
g_scriptEvents[453] = "CLOSE_INBOX_ITEM";
g_scriptEvents[454] = "CONFIRM_SUMMON";
g_scriptEvents[455] = "CANCEL_SUMMON";
g_scriptEvents[456] = "BILLING_NAG_DIALOG";
g_scriptEvents[457] = "IGR_BILLING_NAG_DIALOG";
g_scriptEvents[458] = "PLAYER_SKINNED";
g_scriptEvents[459] = "TABARD_SAVE_PENDING";
g_scriptEvents[460] = "UNIT_QUEST_LOG_CHANGED";
g_scriptEvents[461] = "PLAYER_PVP_KILLS_CHANGED";
g_scriptEvents[462] = "PLAYER_PVP_RANK_CHANGED";
g_scriptEvents[463] = "INSPECT_HONOR_UPDATE";
g_scriptEvents[464] = "UPDATE_WORLD_STATES";
g_scriptEvents[465] = "AREA_SPIRIT_HEALER_IN_RANGE";
g_scriptEvents[466] = "AREA_SPIRIT_HEALER_OUT_OF_RANGE";
g_scriptEvents[467] = "PLAYTIME_CHANGED";
g_scriptEvents[468] = "UPDATE_LFG_TYPES";
g_scriptEvents[469] = "UPDATE_LFG_LIST";
g_scriptEvents[470] = "UPDATE_LFG_LIST_INCREMENTAL";
g_scriptEvents[471] = "START_MINIGAME";
g_scriptEvents[472] = "MINIGAME_UPDATE";
g_scriptEvents[473] = "READY_CHECK";
g_scriptEvents[474] = "READY_CHECK_CONFIRM";
g_scriptEvents[475] = "READY_CHECK_FINISHED";
g_scriptEvents[476] = "RAID_TARGET_UPDATE";
g_scriptEvents[477] = "GMSURVEY_DISPLAY";
g_scriptEvents[478] = "UPDATE_INSTANCE_INFO";
g_scriptEvents[479] = "SOCKET_INFO_UPDATE";
g_scriptEvents[480] = "SOCKET_INFO_CLOSE";
g_scriptEvents[481] = "PETITION_VENDOR_SHOW";
g_scriptEvents[482] = "PETITION_VENDOR_CLOSED";
g_scriptEvents[483] = "PETITION_VENDOR_UPDATE";
g_scriptEvents[484] = "COMBAT_TEXT_UPDATE";
g_scriptEvents[485] = "QUEST_WATCH_UPDATE";
g_scriptEvents[486] = "KNOWLEDGE_BASE_SETUP_LOAD_SUCCESS";
g_scriptEvents[487] = "KNOWLEDGE_BASE_SETUP_LOAD_FAILURE";
g_scriptEvents[488] = "KNOWLEDGE_BASE_QUERY_LOAD_SUCCESS";
g_scriptEvents[489] = "KNOWLEDGE_BASE_QUERY_LOAD_FAILURE";
g_scriptEvents[490] = "KNOWLEDGE_BASE_ARTICLE_LOAD_SUCCESS";
g_scriptEvents[491] = "KNOWLEDGE_BASE_ARTICLE_LOAD_FAILURE";
g_scriptEvents[492] = "KNOWLEDGE_BASE_SYSTEM_MOTD_UPDATED";
g_scriptEvents[493] = "KNOWLEDGE_BASE_SERVER_MESSAGE";
g_scriptEvents[494] = "ARENA_TEAM_UPDATE";
g_scriptEvents[495] = "ARENA_TEAM_ROSTER_UPDATE";
g_scriptEvents[496] = "ARENA_TEAM_INVITE_REQUEST";
g_scriptEvents[497] = "HONOR_CURRENCY_UPDATE";
g_scriptEvents[498] = "KNOWN_TITLES_UPDATE";
g_scriptEvents[499] = "NEW_TITLE_EARNED";
g_scriptEvents[500] = "OLD_TITLE_LOST";
g_scriptEvents[501] = "LFG_UPDATE";
g_scriptEvents[502] = "LFG_PROPOSAL_UPDATE";
g_scriptEvents[503] = "LFG_PROPOSAL_SHOW";
g_scriptEvents[504] = "LFG_PROPOSAL_FAILED";
g_scriptEvents[505] = "LFG_PROPOSAL_SUCCEEDED";
g_scriptEvents[506] = "LFG_ROLE_UPDATE";
g_scriptEvents[507] = "LFG_ROLE_CHECK_UPDATE";
g_scriptEvents[508] = "LFG_ROLE_CHECK_SHOW";
g_scriptEvents[509] = "LFG_ROLE_CHECK_HIDE";
g_scriptEvents[510] = "LFG_ROLE_CHECK_ROLE_CHOSEN";
g_scriptEvents[511] = "LFG_QUEUE_STATUS_UPDATE";
g_scriptEvents[512] = "LFG_BOOT_PROPOSAL_UPDATE";
g_scriptEvents[513] = "LFG_LOCK_INFO_RECEIVED";
g_scriptEvents[514] = "LFG_UPDATE_RANDOM_INFO";
g_scriptEvents[515] = "LFG_OFFER_CONTINUE";
g_scriptEvents[516] = "LFG_OPEN_FROM_GOSSIP";
g_scriptEvents[517] = "LFG_COMPLETION_REWARD";
g_scriptEvents[518] = "PARTY_LFG_RESTRICTED";
g_scriptEvents[519] = "PLAYER_ROLES_ASSIGNED";
g_scriptEvents[520] = "COMBAT_RATING_UPDATE";
g_scriptEvents[521] = "MODIFIER_STATE_CHANGED";
g_scriptEvents[522] = "UPDATE_STEALTH";
g_scriptEvents[523] = "ENABLE_TAXI_BENCHMARK";
g_scriptEvents[524] = "DISABLE_TAXI_BENCHMARK";
g_scriptEvents[525] = "VOICE_START";
g_scriptEvents[526] = "VOICE_STOP";
g_scriptEvents[527] = "VOICE_STATUS_UPDATE";
g_scriptEvents[528] = "VOICE_CHANNEL_STATUS_UPDATE";
g_scriptEvents[529] = "UPDATE_FLOATING_CHAT_WINDOWS";
g_scriptEvents[530] = "RAID_INSTANCE_WELCOME";
g_scriptEvents[531] = "MOVIE_RECORDING_PROGRESS";
g_scriptEvents[532] = "MOVIE_COMPRESSING_PROGRESS";
g_scriptEvents[533] = "MOVIE_UNCOMPRESSED_MOVIE";
g_scriptEvents[534] = "VOICE_PUSH_TO_TALK_START";
g_scriptEvents[535] = "VOICE_PUSH_TO_TALK_STOP";
g_scriptEvents[536] = "GUILDBANKFRAME_OPENED";
g_scriptEvents[537] = "GUILDBANKFRAME_CLOSED";
g_scriptEvents[538] = "GUILDBANKBAGSLOTS_CHANGED";
g_scriptEvents[539] = "GUILDBANK_ITEM_LOCK_CHANGED";
g_scriptEvents[540] = "GUILDBANK_UPDATE_TABS";
g_scriptEvents[541] = "GUILDBANK_UPDATE_MONEY";
g_scriptEvents[542] = "GUILDBANKLOG_UPDATE";
g_scriptEvents[543] = "GUILDBANK_UPDATE_WITHDRAWMONEY";
g_scriptEvents[544] = "GUILDBANK_UPDATE_TEXT";
g_scriptEvents[545] = "GUILDBANK_TEXT_CHANGED";
g_scriptEvents[546] = "CHANNEL_UI_UPDATE";
g_scriptEvents[547] = "CHANNEL_COUNT_UPDATE";
g_scriptEvents[548] = "CHANNEL_ROSTER_UPDATE";
g_scriptEvents[549] = "CHANNEL_VOICE_UPDATE";
g_scriptEvents[550] = "CHANNEL_INVITE_REQUEST";
g_scriptEvents[551] = "CHANNEL_PASSWORD_REQUEST";
g_scriptEvents[552] = "CHANNEL_FLAGS_UPDATED";
g_scriptEvents[553] = "VOICE_SESSIONS_UPDATE";
g_scriptEvents[554] = "VOICE_CHAT_ENABLED_UPDATE";
g_scriptEvents[555] = "VOICE_LEFT_SESSION";
g_scriptEvents[556] = "INSPECT_TALENT_READY";
g_scriptEvents[557] = "VOICE_SELF_MUTE";
g_scriptEvents[558] = "VOICE_PLATE_START";
g_scriptEvents[559] = "VOICE_PLATE_STOP";
g_scriptEvents[560] = "ARENA_SEASON_WORLD_STATE";
g_scriptEvents[561] = "GUILD_EVENT_LOG_UPDATE";
g_scriptEvents[562] = "GUILDTABARD_UPDATE";
g_scriptEvents[563] = "SOUND_DEVICE_UPDATE";
g_scriptEvents[564] = "COMMENTATOR_MAP_UPDATE";
g_scriptEvents[565] = "COMMENTATOR_ENTER_WORLD";
g_scriptEvents[566] = "COMBAT_LOG_EVENT";
g_scriptEvents[567] = "COMBAT_LOG_EVENT_UNFILTERED";
g_scriptEvents[568] = "COMMENTATOR_PLAYER_UPDATE";
g_scriptEvents[569] = "PLAYER_ENTERING_BATTLEGROUND";
g_scriptEvents[570] = "BARBER_SHOP_OPEN";
g_scriptEvents[571] = "BARBER_SHOP_CLOSE";
g_scriptEvents[572] = "BARBER_SHOP_SUCCESS";
g_scriptEvents[573] = "BARBER_SHOP_APPEARANCE_APPLIED";
g_scriptEvents[574] = "CALENDAR_UPDATE_INVITE_LIST";
g_scriptEvents[575] = "CALENDAR_UPDATE_EVENT_LIST";
g_scriptEvents[576] = "CALENDAR_NEW_EVENT";
g_scriptEvents[577] = "CALENDAR_OPEN_EVENT";
g_scriptEvents[578] = "CALENDAR_CLOSE_EVENT";
g_scriptEvents[579] = "CALENDAR_UPDATE_EVENT";
g_scriptEvents[580] = "CALENDAR_UPDATE_PENDING_INVITES";
g_scriptEvents[581] = "CALENDAR_EVENT_ALARM";
g_scriptEvents[582] = "CALENDAR_UPDATE_ERROR";
g_scriptEvents[583] = "CALENDAR_ACTION_PENDING";
g_scriptEvents[584] = "VEHICLE_ANGLE_SHOW";
g_scriptEvents[585] = "VEHICLE_ANGLE_UPDATE";
g_scriptEvents[586] = "VEHICLE_POWER_SHOW";
g_scriptEvents[587] = "UNIT_ENTERING_VEHICLE";
g_scriptEvents[588] = "UNIT_ENTERED_VEHICLE";
g_scriptEvents[589] = "UNIT_EXITING_VEHICLE";
g_scriptEvents[590] = "UNIT_EXITED_VEHICLE";
g_scriptEvents[591] = "VEHICLE_PASSENGERS_CHANGED";
g_scriptEvents[592] = "PLAYER_GAINS_VEHICLE_DATA";
g_scriptEvents[593] = "PLAYER_LOSES_VEHICLE_DATA";
g_scriptEvents[594] = "PET_FORCE_NAME_DECLENSION";
g_scriptEvents[595] = "LEVEL_GRANT_PROPOSED";
g_scriptEvents[596] = "SYNCHRONIZE_SETTINGS";
g_scriptEvents[597] = "PLAY_MOVIE";
g_scriptEvents[598] = "RUNE_POWER_UPDATE";
g_scriptEvents[599] = "RUNE_TYPE_UPDATE";
g_scriptEvents[600] = "ACHIEVEMENT_EARNED";
g_scriptEvents[601] = "CRITERIA_UPDATE";
g_scriptEvents[602] = "RECEIVED_ACHIEVEMENT_LIST";
g_scriptEvents[603] = "PET_RENAMEABLE";
g_scriptEvents[604] = "KNOWN_CURRENCY_TYPES_UPDATE";
g_scriptEvents[605] = "CURRENCY_DISPLAY_UPDATE";
g_scriptEvents[606] = "COMPANION_LEARNED";
g_scriptEvents[607] = "COMPANION_UNLEARNED";
g_scriptEvents[608] = "COMPANION_UPDATE";
g_scriptEvents[609] = "UNIT_THREAT_LIST_UPDATE";
g_scriptEvents[610] = "UNIT_THREAT_SITUATION_UPDATE";
g_scriptEvents[611] = "GLYPH_ADDED";
g_scriptEvents[612] = "GLYPH_REMOVED";
g_scriptEvents[613] = "GLYPH_UPDATED";
g_scriptEvents[614] = "GLYPH_ENABLED";
g_scriptEvents[615] = "GLYPH_DISABLED";
g_scriptEvents[616] = "USE_GLYPH";
g_scriptEvents[617] = "TRACKED_ACHIEVEMENT_UPDATE";
g_scriptEvents[618] = "ARENA_OPPONENT_UPDATE";
g_scriptEvents[619] = "INSPECT_ACHIEVEMENT_READY";
g_scriptEvents[620] = "RAISED_AS_GHOUL";
g_scriptEvents[621] = "PARTY_CONVERTED_TO_RAID";
g_scriptEvents[622] = "PVPQUEUE_ANYWHERE_SHOW";
g_scriptEvents[623] = "PVPQUEUE_ANYWHERE_UPDATE_AVAILABLE";
g_scriptEvents[624] = "QUEST_ACCEPTED";
g_scriptEvents[625] = "PLAYER_TALENT_UPDATE";
g_scriptEvents[626] = "ACTIVE_TALENT_GROUP_CHANGED";
g_scriptEvents[627] = "PET_TALENT_UPDATE";
g_scriptEvents[628] = "PREVIEW_TALENT_POINTS_CHANGED";
g_scriptEvents[629] = "PREVIEW_PET_TALENT_POINTS_CHANGED";
g_scriptEvents[630] = "WEAR_EQUIPMENT_SET";
g_scriptEvents[631] = "EQUIPMENT_SETS_CHANGED";
g_scriptEvents[632] = "INSTANCE_LOCK_START";
g_scriptEvents[633] = "INSTANCE_LOCK_STOP";
g_scriptEvents[634] = "PLAYER_EQUIPMENT_CHANGED";
g_scriptEvents[635] = "ITEM_LOCKED";
g_scriptEvents[636] = "ITEM_UNLOCKED";
g_scriptEvents[637] = "TRADE_SKILL_FILTER_UPDATE";
g_scriptEvents[638] = "EQUIPMENT_SWAP_PENDING";
g_scriptEvents[639] = "EQUIPMENT_SWAP_FINISHED";
g_scriptEvents[640] = "NPC_PVPQUEUE_ANYWHERE";
g_scriptEvents[641] = "UPDATE_MULTI_CAST_ACTIONBAR";
g_scriptEvents[642] = "ENABLE_XP_GAIN";
g_scriptEvents[643] = "DISABLE_XP_GAIN";
g_scriptEvents[644] = "BATTLEFIELD_MGR_ENTRY_INVITE";
g_scriptEvents[645] = "BATTLEFIELD_MGR_ENTERED";
g_scriptEvents[646] = "BATTLEFIELD_MGR_QUEUE_REQUEST_RESPONSE";
g_scriptEvents[647] = "BATTLEFIELD_MGR_EJECT_PENDING";
g_scriptEvents[648] = "BATTLEFIELD_MGR_EJECTED";
g_scriptEvents[649] = "BATTLEFIELD_MGR_QUEUE_INVITE";
g_scriptEvents[650] = "BATTLEFIELD_MGR_STATE_CHANGE";
g_scriptEvents[651] = "WORLD_STATE_UI_TIMER_UPDATE";
g_scriptEvents[652] = "END_REFUND";
g_scriptEvents[653] = "END_BOUND_TRADEABLE";
g_scriptEvents[654] = "UPDATE_CHAT_COLOR_NAME_BY_CLASS";
g_scriptEvents[655] = "GMRESPONSE_RECEIVED";
g_scriptEvents[656] = "VEHICLE_UPDATE";
g_scriptEvents[657] = "WOW_MOUSE_NOT_FOUND";
g_scriptEvents[659] = "MAIL_SUCCESS";
g_scriptEvents[660] = "TALENTS_INVOLUNTARILY_RESET";
g_scriptEvents[661] = "INSTANCE_ENCOUNTER_ENGAGE_UNIT";
g_scriptEvents[662] = "QUEST_QUERY_COMPLETE";
g_scriptEvents[663] = "QUEST_POI_UPDATE";
g_scriptEvents[664] = "PLAYER_DIFFICULTY_CHANGED";
g_scriptEvents[665] = "CHAT_MSG_PARTY_LEADER";
g_scriptEvents[666] = "VOTE_KICK_REASON_NEEDED";
g_scriptEvents[667] = "ENABLE_LOW_LEVEL_RAID";
g_scriptEvents[668] = "DISABLE_LOW_LEVEL_RAID";
g_scriptEvents[669] = "CHAT_MSG_TARGETICONS";
g_scriptEvents[670] = "AUCTION_HOUSE_DISABLED";
g_scriptEvents[671] = "AUCTION_MULTISELL_START";
g_scriptEvents[672] = "AUCTION_MULTISELL_UPDATE";
g_scriptEvents[673] = "AUCTION_MULTISELL_FAILURE";
g_scriptEvents[674] = "PET_SPELL_POWER_UPDATE";
g_scriptEvents[675] = "BN_CONNECTED";
g_scriptEvents[676] = "BN_DISCONNECTED";
g_scriptEvents[677] = "BN_SELF_ONLINE";
g_scriptEvents[678] = "BN_SELF_OFFLINE";
g_scriptEvents[679] = "BN_FRIEND_LIST_SIZE_CHANGED";
g_scriptEvents[680] = "BN_FRIEND_INVITE_LIST_INITIALIZED";
g_scriptEvents[681] = "BN_FRIEND_INVITE_SEND_RESULT";
g_scriptEvents[682] = "BN_FRIEND_INVITE_ADDED";
g_scriptEvents[683] = "BN_FRIEND_INVITE_REMOVED";
g_scriptEvents[684] = "BN_FRIEND_INFO_CHANGED";
g_scriptEvents[685] = "BN_CUSTOM_MESSAGE_CHANGED";
g_scriptEvents[686] = "BN_CUSTOM_MESSAGE_LOADED";
g_scriptEvents[687] = "CHAT_MSG_BN_WHISPER";
g_scriptEvents[688] = "CHAT_MSG_BN_WHISPER_INFORM";
g_scriptEvents[689] = "BN_CHAT_WHISPER_UNDELIVERABLE";
g_scriptEvents[690] = "BN_CHAT_CHANNEL_JOINED";
g_scriptEvents[691] = "BN_CHAT_CHANNEL_LEFT";
g_scriptEvents[692] = "BN_CHAT_CHANNEL_CLOSED";
g_scriptEvents[693] = "CHAT_MSG_BN_CONVERSATION";
g_scriptEvents[694] = "CHAT_MSG_BN_CONVERSATION_NOTICE";
g_scriptEvents[695] = "CHAT_MSG_BN_CONVERSATION_LIST";
g_scriptEvents[696] = "BN_CHAT_CHANNEL_MESSAGE_UNDELIVERABLE";
g_scriptEvents[697] = "BN_CHAT_CHANNEL_MESSAGE_BLOCKED";
g_scriptEvents[698] = "BN_CHAT_CHANNEL_MEMBER_JOINED";
g_scriptEvents[699] = "BN_CHAT_CHANNEL_MEMBER_LEFT";
g_scriptEvents[700] = "BN_CHAT_CHANNEL_MEMBER_UPDATED";
g_scriptEvents[701] = "BN_CHAT_CHANNEL_CREATE_SUCCEEDED";
g_scriptEvents[702] = "BN_CHAT_CHANNEL_CREATE_FAILED";
g_scriptEvents[703] = "BN_CHAT_CHANNEL_INVITE_SUCCEEDED";
g_scriptEvents[704] = "BN_CHAT_CHANNEL_INVITE_FAILED";
g_scriptEvents[705] = "BN_BLOCK_LIST_UPDATED";
g_scriptEvents[706] = "BN_SYSTEM_MESSAGE";
g_scriptEvents[707] = "BN_REQUEST_FOF_SUCCEEDED";
g_scriptEvents[708] = "BN_REQUEST_FOF_FAILED";
g_scriptEvents[709] = "BN_NEW_PRESENCE";
g_scriptEvents[710] = "BN_TOON_NAME_UPDATED";
g_scriptEvents[711] = "BN_FRIEND_ACCOUNT_ONLINE";
g_scriptEvents[712] = "BN_FRIEND_ACCOUNT_OFFLINE";
g_scriptEvents[713] = "BN_FRIEND_TOON_ONLINE";
g_scriptEvents[714] = "BN_FRIEND_TOON_OFFLINE";
g_scriptEvents[715] = "BN_MATURE_LANGUAGE_FILTER";
g_scriptEvents[716] = "COMMENTATOR_SKIRMISH_QUEUE_REQUEST";
g_scriptEvents[717] = "COMMENTATOR_SKIRMISH_MODE_REQUEST";
g_scriptEvents[718] = "CHAT_MSG_BN_INLINE_TOAST_ALERT";
g_scriptEvents[719] = "CHAT_MSG_BN_INLINE_TOAST_BROADCAST";
g_scriptEvents[720] = "CHAT_MSG_BN_INLINE_TOAST_BROADCAST_INFORM";
g_scriptEvents[721] = "CHAT_MSG_BN_INLINE_TOAST_CONVERSATION";
}

View File

@ -40,7 +40,6 @@ class FrameScript_EventObject : public TSHashObject<FrameScript_EventObject, HAS
};
extern int32_t g_glueFrameScriptGenders[UNITSEX_LAST];
extern const char* g_scriptEvents[722];
namespace FrameScript {
extern void* s_mempool;
@ -103,6 +102,4 @@ void FrameScript_UnregisterFunction(const char* name);
void FrameScript_UnregisterScriptEvent(FrameScript_Object* object, FrameScript_EventObject* event);
void ScriptEventsInitialize();
#endif

View File

@ -35,6 +35,33 @@ const char* FrameScript_Object::GetDisplayName() {
return name ? name : "<unnamed>";
}
int32_t FrameScript_Object::GetScript(lua_State* L) {
if (!lua_isstring(L, 2)) {
luaL_error(L, "Usage: %s:GetScript(\"type\")", this->GetDisplayName());
return 0;
}
auto name = lua_tostring(L, 2);
ScriptData data;
auto script = this->GetScriptByName(name, data);
if (!script) {
luaL_error(L, "%s doesn't have a \"%s\" script", this->GetDisplayName(), lua_tostring(L, 2));
return 0;
}
// TODO taint management
if (script->luaRef > 0) {
lua_rawgeti(L, LUA_REGISTRYINDEX, script->luaRef);
} else {
lua_pushnil(L);
}
return 1;
}
FrameScript_Object::ScriptIx* FrameScript_Object::GetScriptByName(const char* name, FrameScript_Object::ScriptData& data) {
if (!SStrCmpI(name, "OnEvent", STORM_MAX_STR)) {
data.wrapper = "return function(self,event,...) %s end";

View File

@ -43,6 +43,7 @@ class FrameScript_Object {
// Member functions
const char* GetDisplayName();
int32_t GetScript(lua_State* L);
int32_t RegisterScriptEvent(const char* name);
void RegisterScriptObject(const char* name);
void RunScript(ScriptIx const& script, int32_t argCount, const char* a4);

View File

@ -2,5 +2,7 @@
#define UI_GAME_HPP
#include "ui/game/CGGameUI.hpp"
#include "ui/game/CGPetInfo.hpp"
#include "ui/game/ScriptEvents.hpp"
#endif

View File

@ -0,0 +1,164 @@
#include "ui/game/ActionBarScript.hpp"
#include "ui/FrameScript.hpp"
#include "ui/game/CGActionBar.hpp"
#include "util/Lua.hpp"
#include "util/Unimplemented.hpp"
namespace {
int32_t Script_GetActionInfo(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_GetActionTexture(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_GetActionCount(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_GetActionCooldown(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_GetActionAutocast(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_GetActionText(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_HasAction(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_UseAction(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_PickupAction(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_PlaceAction(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_IsAttackAction(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_IsCurrentAction(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_IsAutoRepeatAction(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_IsUsableAction(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_IsConsumableAction(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_IsStackableAction(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_IsEquippedAction(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_ActionHasRange(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_IsActionInRange(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_GetBonusBarOffset(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_GetMultiCastBarOffset(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_ChangeActionBarPage(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_GetActionBarPage(lua_State* L) {
if (CGActionBar::s_tempPageActiveFlags) {
lua_pushinteger(L, 1);
} else {
lua_pushinteger(L, CGActionBar::s_currentPage + 1);
}
return 1;
}
int32_t Script_GetActionBarToggles(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_SetActionBarToggles(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_IsPossessBarVisible(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_GetMultiCastTotemSpells(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
int32_t Script_SetMultiCastSpell(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
}
}
static FrameScript_Method s_ScriptFunctions[] = {
{ "GetActionInfo", &Script_GetActionInfo },
{ "GetActionTexture", &Script_GetActionTexture },
{ "GetActionCount", &Script_GetActionCount },
{ "GetActionCooldown", &Script_GetActionCooldown },
{ "GetActionAutocast", &Script_GetActionAutocast },
{ "GetActionText", &Script_GetActionText },
{ "HasAction", &Script_HasAction },
{ "UseAction", &Script_UseAction },
{ "PickupAction", &Script_PickupAction },
{ "PlaceAction", &Script_PlaceAction },
{ "IsAttackAction", &Script_IsAttackAction },
{ "IsCurrentAction", &Script_IsCurrentAction },
{ "IsAutoRepeatAction", &Script_IsAutoRepeatAction },
{ "IsUsableAction", &Script_IsUsableAction },
{ "IsConsumableAction", &Script_IsConsumableAction },
{ "IsStackableAction", &Script_IsStackableAction },
{ "IsEquippedAction", &Script_IsEquippedAction },
{ "ActionHasRange", &Script_ActionHasRange },
{ "IsActionInRange", &Script_IsActionInRange },
{ "GetBonusBarOffset", &Script_GetBonusBarOffset },
{ "GetMultiCastBarOffset", &Script_GetMultiCastBarOffset },
{ "ChangeActionBarPage", &Script_ChangeActionBarPage },
{ "GetActionBarPage", &Script_GetActionBarPage },
{ "GetActionBarToggles", &Script_GetActionBarToggles },
{ "SetActionBarToggles", &Script_SetActionBarToggles },
{ "IsPossessBarVisible", &Script_IsPossessBarVisible },
{ "GetMultiCastTotemSpells", &Script_GetMultiCastTotemSpells },
{ "SetMultiCastSpell", &Script_SetMultiCastSpell },
};
void ActionBarRegisterScriptFunctions() {
for (auto& func : s_ScriptFunctions) {
FrameScript_RegisterFunction(func.name, func.method);
}
}

View File

@ -0,0 +1,6 @@
#ifndef UI_GAME_ACTION_BAR_SCRIPT_HPP
#define UI_GAME_ACTION_BAR_SCRIPT_HPP
void ActionBarRegisterScriptFunctions();
#endif

View File

@ -0,0 +1,4 @@
#include "ui/game/CGActionBar.hpp"
uint32_t CGActionBar::s_currentPage;
uint32_t CGActionBar::s_tempPageActiveFlags;

View File

@ -0,0 +1,13 @@
#ifndef UI_GAME_C_G_ACTION_BAR_HPP
#define UI_GAME_C_G_ACTION_BAR_HPP
#include <cstdint>
class CGActionBar {
public:
// Static variables
static uint32_t s_currentPage;
static uint32_t s_tempPageActiveFlags;
};
#endif

View File

@ -3,6 +3,7 @@
#include "ui/CScriptObject.hpp"
#include "ui/FrameXML.hpp"
#include "ui/Key.hpp"
#include "ui/game/ActionBarScript.hpp"
#include "ui/game/BattlefieldInfoScript.hpp"
#include "ui/game/CGCharacterModelBase.hpp"
#include "ui/game/CGCooldown.hpp"
@ -46,6 +47,10 @@ void LoadScriptFunctions() {
// TODO
ActionBarRegisterScriptFunctions();
// TODO
CharacterInfoRegisterScriptFunctions();
// TODO
@ -75,6 +80,7 @@ void CGGameUI::Initialize() {
// TODO
LoadScriptFunctions();
ScriptEventsRegisterEvents();
// TODO

View File

@ -0,0 +1,6 @@
#include "ui/game/CGPetInfo.hpp"
WOWGUID CGPetInfo::GetPet(uint32_t index) {
// TODO
return 0;
}

13
src/ui/game/CGPetInfo.hpp Normal file
View File

@ -0,0 +1,13 @@
#ifndef UI_GAME_C_G_PET_INFO_HPP
#define UI_GAME_C_G_PET_INFO_HPP
#include "util/GUID.hpp"
#include <cstdint>
class CGPetInfo {
public:
// Static functions
static WOWGUID GetPet(uint32_t index);
};
#endif

View File

@ -1,17 +1,35 @@
#include "ui/game/ScriptEvents.hpp"
#include "object/client/ObjMgr.hpp"
#include "db/Db.hpp"
#include "object/Client.hpp"
#include "ui/FrameScript.hpp"
#include "ui/ScriptFunctionsSystem.hpp"
#include "ui/game/CGGameUI.hpp"
#include "ui/game/ScriptUtil.hpp"
#include "util/GUID.hpp"
#include "util/Lua.hpp"
#include "util/StringTo.hpp"
#include "util/Unimplemented.hpp"
#define NUM_SCRIPT_EVENTS 722
const char* g_scriptEvents[NUM_SCRIPT_EVENTS];
namespace {
int32_t Script_UnitExists(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
auto token = lua_tostring(L, 1);
WOWGUID guid = 0;
Script_GetGUIDFromToken(token, guid, false);
auto object = ClntObjMgrObjectPtr(guid, TYPE_OBJECT, __FILE__, __LINE__);
if ((object && object->CanBeTargetted()) || CGGameUI::IsRaidMemberOrPet(guid)) {
lua_pushnumber(L, 1.0);
} else {
lua_pushnil(L);
}
return 1;
}
int32_t Script_UnitIsVisible(lua_State* L) {
@ -159,11 +177,43 @@ int32_t Script_UnitPVPName(lua_State* L) {
}
int32_t Script_UnitXP(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
if (!lua_isstring(L, 1)) {
luaL_error(L, "Usage: UnitXP(\"unit\")");
return 0;
}
auto name = lua_tostring(L, 1);
auto unit = Script_GetUnitFromName(name);
float xp = 0.0f;
if (unit && unit->IsA(TYPE_PLAYER)) {
xp = static_cast<CGPlayer_C*>(unit)->GetActiveXP();
}
lua_pushnumber(L, xp);
return 1;
}
int32_t Script_UnitXPMax(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
if (!lua_isstring(L, 1)) {
luaL_error(L, "Usage: UnitXPMax(\"unit\")");
return 0;
}
auto name = lua_tostring(L, 1);
auto unit = Script_GetUnitFromName(name);
float xpMax = 0.0f;
if (unit && unit->IsA(TYPE_PLAYER)) {
xpMax = static_cast<CGPlayer_C*>(unit)->GetActiveNextLevelXP();
}
lua_pushnumber(L, xpMax);
return 1;
}
int32_t Script_UnitHealth(lua_State* L) {
@ -695,7 +745,29 @@ int32_t Script_IsXPUserDisabled(lua_State* L) {
}
int32_t Script_FillLocalizedClassList(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
if (lua_type(L, 1) != LUA_TTABLE) {
luaL_error(L, "Usage: FillLocalizedClassList(classTable[, isFemale])");
return 0;
}
auto isFemale = StringToBOOL(L, 2, 0);
auto sex = isFemale ? UNITSEX_FEMALE : UNITSEX_MALE;
lua_settop(L, 1);
for (int32_t i = 0; i < g_chrClassesDB.GetNumRecords(); ++i) {
auto classRec = g_chrClassesDB.GetRecordByIndex(i);
if (classRec) {
auto displayName = CGUnit_C::GetDisplayClassNameFromRecord(classRec, sex, 0);
lua_pushstring(L, classRec->m_filename);
lua_pushstring(L, displayName);
lua_settable(L, -3);
}
}
return 1;
}
}
@ -879,3 +951,657 @@ void ScriptEventsRegisterFunctions() {
FrameScript_RegisterFunction(func.name, func.method);
}
}
void ScriptEventsInitialize() {
g_scriptEvents[0] = "UNIT_PET";
g_scriptEvents[2] = "UNIT_PET";
g_scriptEvents[12] = "UNIT_TARGET";
g_scriptEvents[17] = "UNIT_DISPLAYPOWER";
g_scriptEvents[18] = "UNIT_HEALTH";
g_scriptEvents[19] = "UNIT_MANA";
g_scriptEvents[20] = "UNIT_RAGE";
g_scriptEvents[21] = "UNIT_FOCUS";
g_scriptEvents[22] = "UNIT_ENERGY";
g_scriptEvents[23] = "UNIT_HAPPINESS";
g_scriptEvents[25] = "UNIT_RUNIC_POWER";
g_scriptEvents[26] = "UNIT_MAXHEALTH";
g_scriptEvents[27] = "UNIT_MAXMANA";
g_scriptEvents[28] = "UNIT_MAXRAGE";
g_scriptEvents[29] = "UNIT_MAXFOCUS";
g_scriptEvents[30] = "UNIT_MAXENERGY";
g_scriptEvents[31] = "UNIT_MAXHAPPINESS";
g_scriptEvents[33] = "UNIT_MAXRUNIC_POWER";
g_scriptEvents[48] = "UNIT_LEVEL";
g_scriptEvents[49] = "UNIT_FACTION";
g_scriptEvents[53] = "UNIT_FLAGS";
g_scriptEvents[54] = "UNIT_FLAGS";
g_scriptEvents[56] = "UNIT_ATTACK_SPEED";
g_scriptEvents[57] = "UNIT_ATTACK_SPEED";
g_scriptEvents[58] = "UNIT_RANGEDDAMAGE";
g_scriptEvents[64] = "UNIT_DAMAGE";
g_scriptEvents[65] = "UNIT_DAMAGE";
g_scriptEvents[66] = "UNIT_DAMAGE";
g_scriptEvents[67] = "UNIT_DAMAGE";
g_scriptEvents[71] = "UNIT_PET_EXPERIENCE";
g_scriptEvents[72] = "UNIT_PET_EXPERIENCE";
g_scriptEvents[73] = "UNIT_DYNAMIC_FLAGS";
g_scriptEvents[78] = "UNIT_STATS";
g_scriptEvents[79] = "UNIT_STATS";
g_scriptEvents[80] = "UNIT_STATS";
g_scriptEvents[81] = "UNIT_STATS";
g_scriptEvents[82] = "UNIT_STATS";
g_scriptEvents[93] = "UNIT_RESISTANCES";
g_scriptEvents[94] = "UNIT_RESISTANCES";
g_scriptEvents[95] = "UNIT_RESISTANCES";
g_scriptEvents[96] = "UNIT_RESISTANCES";
g_scriptEvents[97] = "UNIT_RESISTANCES";
g_scriptEvents[98] = "UNIT_RESISTANCES";
g_scriptEvents[99] = "UNIT_RESISTANCES";
g_scriptEvents[100] = "UNIT_RESISTANCES";
g_scriptEvents[101] = "UNIT_RESISTANCES";
g_scriptEvents[102] = "UNIT_RESISTANCES";
g_scriptEvents[103] = "UNIT_RESISTANCES";
g_scriptEvents[104] = "UNIT_RESISTANCES";
g_scriptEvents[105] = "UNIT_RESISTANCES";
g_scriptEvents[106] = "UNIT_RESISTANCES";
g_scriptEvents[107] = "UNIT_RESISTANCES";
g_scriptEvents[108] = "UNIT_RESISTANCES";
g_scriptEvents[109] = "UNIT_RESISTANCES";
g_scriptEvents[110] = "UNIT_RESISTANCES";
g_scriptEvents[111] = "UNIT_RESISTANCES";
g_scriptEvents[112] = "UNIT_RESISTANCES";
g_scriptEvents[113] = "UNIT_RESISTANCES";
g_scriptEvents[117] = "UNIT_ATTACK_POWER";
g_scriptEvents[118] = "UNIT_ATTACK_POWER";
g_scriptEvents[119] = "UNIT_ATTACK_POWER";
g_scriptEvents[120] = "UNIT_RANGED_ATTACK_POWER";
g_scriptEvents[121] = "UNIT_RANGED_ATTACK_POWER";
g_scriptEvents[122] = "UNIT_RANGED_ATTACK_POWER";
g_scriptEvents[123] = "UNIT_RANGEDDAMAGE";
g_scriptEvents[124] = "UNIT_RANGEDDAMAGE";
g_scriptEvents[125] = "UNIT_MANA";
g_scriptEvents[132] = "UNIT_MANA";
g_scriptEvents[139] = "UNIT_STATS";
g_scriptEvents[142] = "UNIT_AURA";
g_scriptEvents[143] = "UNIT_COMBAT";
g_scriptEvents[144] = "UNIT_NAME_UPDATE";
g_scriptEvents[145] = "UNIT_PORTRAIT_UPDATE";
g_scriptEvents[146] = "UNIT_MODEL_CHANGED";
g_scriptEvents[147] = "UNIT_INVENTORY_CHANGED";
g_scriptEvents[148] = "UNIT_CLASSIFICATION_CHANGED";
g_scriptEvents[149] = "UNIT_COMBO_POINTS";
g_scriptEvents[150] = "ITEM_LOCK_CHANGED";
g_scriptEvents[151] = "PLAYER_XP_UPDATE";
g_scriptEvents[152] = "PLAYER_REGEN_DISABLED";
g_scriptEvents[153] = "PLAYER_REGEN_ENABLED";
g_scriptEvents[154] = "PLAYER_AURAS_CHANGED";
g_scriptEvents[155] = "PLAYER_ENTER_COMBAT";
g_scriptEvents[156] = "PLAYER_LEAVE_COMBAT";
g_scriptEvents[157] = "PLAYER_TARGET_CHANGED";
g_scriptEvents[158] = "PLAYER_FOCUS_CHANGED";
g_scriptEvents[159] = "PLAYER_CONTROL_LOST";
g_scriptEvents[160] = "PLAYER_CONTROL_GAINED";
g_scriptEvents[161] = "PLAYER_FARSIGHT_FOCUS_CHANGED";
g_scriptEvents[162] = "PLAYER_LEVEL_UP";
g_scriptEvents[163] = "PLAYER_MONEY";
g_scriptEvents[164] = "PLAYER_DAMAGE_DONE_MODS";
g_scriptEvents[165] = "PLAYER_TOTEM_UPDATE";
g_scriptEvents[166] = "ZONE_CHANGED";
g_scriptEvents[167] = "ZONE_CHANGED_INDOORS";
g_scriptEvents[168] = "ZONE_CHANGED_NEW_AREA";
g_scriptEvents[169] = "MINIMAP_UPDATE_ZOOM";
g_scriptEvents[170] = "MINIMAP_UPDATE_TRACKING";
g_scriptEvents[171] = "SCREENSHOT_SUCCEEDED";
g_scriptEvents[172] = "SCREENSHOT_FAILED";
g_scriptEvents[173] = "ACTIONBAR_SHOWGRID";
g_scriptEvents[174] = "ACTIONBAR_HIDEGRID";
g_scriptEvents[175] = "ACTIONBAR_PAGE_CHANGED";
g_scriptEvents[176] = "ACTIONBAR_SLOT_CHANGED";
g_scriptEvents[177] = "ACTIONBAR_UPDATE_STATE";
g_scriptEvents[178] = "ACTIONBAR_UPDATE_USABLE";
g_scriptEvents[179] = "ACTIONBAR_UPDATE_COOLDOWN";
g_scriptEvents[180] = "UPDATE_BONUS_ACTIONBAR";
g_scriptEvents[181] = "PARTY_MEMBERS_CHANGED";
g_scriptEvents[182] = "PARTY_LEADER_CHANGED";
g_scriptEvents[183] = "PARTY_MEMBER_ENABLE";
g_scriptEvents[184] = "PARTY_MEMBER_DISABLE";
g_scriptEvents[185] = "PARTY_LOOT_METHOD_CHANGED";
g_scriptEvents[186] = "SYSMSG";
g_scriptEvents[187] = "UI_ERROR_MESSAGE";
g_scriptEvents[188] = "UI_INFO_MESSAGE";
g_scriptEvents[189] = "UPDATE_CHAT_COLOR";
g_scriptEvents[190] = "CHAT_MSG_ADDON";
g_scriptEvents[191] = "CHAT_MSG_SYSTEM";
g_scriptEvents[192] = "CHAT_MSG_SAY";
g_scriptEvents[193] = "CHAT_MSG_PARTY";
g_scriptEvents[194] = "CHAT_MSG_RAID";
g_scriptEvents[195] = "CHAT_MSG_GUILD";
g_scriptEvents[196] = "CHAT_MSG_OFFICER";
g_scriptEvents[197] = "CHAT_MSG_YELL";
g_scriptEvents[198] = "CHAT_MSG_WHISPER";
g_scriptEvents[199] = "CHAT_MSG_WHISPER_INFORM";
g_scriptEvents[200] = "CHAT_MSG_EMOTE";
g_scriptEvents[201] = "CHAT_MSG_TEXT_EMOTE";
g_scriptEvents[202] = "CHAT_MSG_MONSTER_SAY";
g_scriptEvents[203] = "CHAT_MSG_MONSTER_PARTY";
g_scriptEvents[204] = "CHAT_MSG_MONSTER_YELL";
g_scriptEvents[205] = "CHAT_MSG_MONSTER_WHISPER";
g_scriptEvents[206] = "CHAT_MSG_MONSTER_EMOTE";
g_scriptEvents[207] = "CHAT_MSG_CHANNEL";
g_scriptEvents[208] = "CHAT_MSG_CHANNEL_JOIN";
g_scriptEvents[209] = "CHAT_MSG_CHANNEL_LEAVE";
g_scriptEvents[210] = "CHAT_MSG_CHANNEL_LIST";
g_scriptEvents[211] = "CHAT_MSG_CHANNEL_NOTICE";
g_scriptEvents[212] = "CHAT_MSG_CHANNEL_NOTICE_USER";
g_scriptEvents[213] = "CHAT_MSG_AFK";
g_scriptEvents[214] = "CHAT_MSG_DND";
g_scriptEvents[215] = "CHAT_MSG_IGNORED";
g_scriptEvents[216] = "CHAT_MSG_SKILL";
g_scriptEvents[217] = "CHAT_MSG_LOOT";
g_scriptEvents[218] = "CHAT_MSG_MONEY";
g_scriptEvents[219] = "CHAT_MSG_OPENING";
g_scriptEvents[220] = "CHAT_MSG_TRADESKILLS";
g_scriptEvents[221] = "CHAT_MSG_PET_INFO";
g_scriptEvents[222] = "CHAT_MSG_COMBAT_MISC_INFO";
g_scriptEvents[223] = "CHAT_MSG_COMBAT_XP_GAIN";
g_scriptEvents[224] = "CHAT_MSG_COMBAT_HONOR_GAIN";
g_scriptEvents[225] = "CHAT_MSG_COMBAT_FACTION_CHANGE";
g_scriptEvents[226] = "CHAT_MSG_BG_SYSTEM_NEUTRAL";
g_scriptEvents[227] = "CHAT_MSG_BG_SYSTEM_ALLIANCE";
g_scriptEvents[228] = "CHAT_MSG_BG_SYSTEM_HORDE";
g_scriptEvents[229] = "CHAT_MSG_RAID_LEADER";
g_scriptEvents[230] = "CHAT_MSG_RAID_WARNING";
g_scriptEvents[231] = "CHAT_MSG_RAID_BOSS_WHISPER";
g_scriptEvents[232] = "CHAT_MSG_RAID_BOSS_EMOTE";
g_scriptEvents[233] = "CHAT_MSG_FILTERED";
g_scriptEvents[234] = "CHAT_MSG_BATTLEGROUND";
g_scriptEvents[235] = "CHAT_MSG_BATTLEGROUND_LEADER";
g_scriptEvents[236] = "CHAT_MSG_RESTRICTED";
g_scriptEvents[237] = "";
g_scriptEvents[238] = "CHAT_MSG_ACHIEVEMENT";
g_scriptEvents[239] = "CHAT_MSG_GUILD_ACHIEVEMENT";
g_scriptEvents[240] = "LANGUAGE_LIST_CHANGED";
g_scriptEvents[241] = "TIME_PLAYED_MSG";
g_scriptEvents[242] = "SPELLS_CHANGED";
g_scriptEvents[243] = "CURRENT_SPELL_CAST_CHANGED";
g_scriptEvents[244] = "SPELL_UPDATE_COOLDOWN";
g_scriptEvents[245] = "SPELL_UPDATE_USABLE";
g_scriptEvents[246] = "CHARACTER_POINTS_CHANGED";
g_scriptEvents[247] = "SKILL_LINES_CHANGED";
g_scriptEvents[248] = "ITEM_PUSH";
g_scriptEvents[249] = "LOOT_OPENED";
g_scriptEvents[250] = "LOOT_SLOT_CLEARED";
g_scriptEvents[251] = "LOOT_SLOT_CHANGED";
g_scriptEvents[252] = "LOOT_CLOSED";
g_scriptEvents[253] = "PLAYER_LOGIN";
g_scriptEvents[254] = "PLAYER_LOGOUT";
g_scriptEvents[255] = "PLAYER_ENTERING_WORLD";
g_scriptEvents[256] = "PLAYER_LEAVING_WORLD";
g_scriptEvents[257] = "PLAYER_ALIVE";
g_scriptEvents[258] = "PLAYER_DEAD";
g_scriptEvents[259] = "PLAYER_CAMPING";
g_scriptEvents[260] = "PLAYER_QUITING";
g_scriptEvents[261] = "LOGOUT_CANCEL";
g_scriptEvents[262] = "RESURRECT_REQUEST";
g_scriptEvents[263] = "PARTY_INVITE_REQUEST";
g_scriptEvents[264] = "PARTY_INVITE_CANCEL";
g_scriptEvents[265] = "GUILD_INVITE_REQUEST";
g_scriptEvents[266] = "GUILD_INVITE_CANCEL";
g_scriptEvents[267] = "GUILD_MOTD";
g_scriptEvents[268] = "TRADE_REQUEST";
g_scriptEvents[269] = "TRADE_REQUEST_CANCEL";
g_scriptEvents[270] = "LOOT_BIND_CONFIRM";
g_scriptEvents[271] = "EQUIP_BIND_CONFIRM";
g_scriptEvents[272] = "AUTOEQUIP_BIND_CONFIRM";
g_scriptEvents[273] = "USE_BIND_CONFIRM";
g_scriptEvents[274] = "DELETE_ITEM_CONFIRM";
g_scriptEvents[275] = "CURSOR_UPDATE";
g_scriptEvents[276] = "ITEM_TEXT_BEGIN";
g_scriptEvents[277] = "ITEM_TEXT_TRANSLATION";
g_scriptEvents[278] = "ITEM_TEXT_READY";
g_scriptEvents[279] = "ITEM_TEXT_CLOSED";
g_scriptEvents[280] = "GOSSIP_SHOW";
g_scriptEvents[281] = "GOSSIP_CONFIRM";
g_scriptEvents[282] = "GOSSIP_CONFIRM_CANCEL";
g_scriptEvents[283] = "GOSSIP_ENTER_CODE";
g_scriptEvents[284] = "GOSSIP_CLOSED";
g_scriptEvents[285] = "QUEST_GREETING";
g_scriptEvents[286] = "QUEST_DETAIL";
g_scriptEvents[287] = "QUEST_PROGRESS";
g_scriptEvents[288] = "QUEST_COMPLETE";
g_scriptEvents[289] = "QUEST_FINISHED";
g_scriptEvents[290] = "QUEST_ITEM_UPDATE";
g_scriptEvents[291] = "TAXIMAP_OPENED";
g_scriptEvents[292] = "TAXIMAP_CLOSED";
g_scriptEvents[293] = "QUEST_LOG_UPDATE";
g_scriptEvents[294] = "TRAINER_SHOW";
g_scriptEvents[295] = "TRAINER_UPDATE";
g_scriptEvents[296] = "TRAINER_DESCRIPTION_UPDATE";
g_scriptEvents[297] = "TRAINER_CLOSED";
g_scriptEvents[298] = "CVAR_UPDATE";
g_scriptEvents[299] = "TRADE_SKILL_SHOW";
g_scriptEvents[300] = "TRADE_SKILL_UPDATE";
g_scriptEvents[301] = "TRADE_SKILL_CLOSE";
g_scriptEvents[302] = "MERCHANT_SHOW";
g_scriptEvents[303] = "MERCHANT_UPDATE";
g_scriptEvents[304] = "MERCHANT_CLOSED";
g_scriptEvents[305] = "TRADE_SHOW";
g_scriptEvents[306] = "TRADE_CLOSED";
g_scriptEvents[307] = "TRADE_UPDATE";
g_scriptEvents[308] = "TRADE_ACCEPT_UPDATE";
g_scriptEvents[309] = "TRADE_TARGET_ITEM_CHANGED";
g_scriptEvents[310] = "TRADE_PLAYER_ITEM_CHANGED";
g_scriptEvents[311] = "TRADE_MONEY_CHANGED";
g_scriptEvents[312] = "PLAYER_TRADE_MONEY";
g_scriptEvents[313] = "BAG_OPEN";
g_scriptEvents[314] = "BAG_UPDATE";
g_scriptEvents[315] = "BAG_CLOSED";
g_scriptEvents[316] = "BAG_UPDATE_COOLDOWN";
g_scriptEvents[317] = "LOCALPLAYER_PET_RENAMED";
g_scriptEvents[318] = "UNIT_ATTACK";
g_scriptEvents[319] = "UNIT_DEFENSE";
g_scriptEvents[320] = "PET_ATTACK_START";
g_scriptEvents[321] = "PET_ATTACK_STOP";
g_scriptEvents[322] = "UPDATE_MOUSEOVER_UNIT";
g_scriptEvents[323] = "UNIT_SPELLCAST_SENT";
g_scriptEvents[324] = "UNIT_SPELLCAST_START";
g_scriptEvents[325] = "UNIT_SPELLCAST_STOP";
g_scriptEvents[326] = "UNIT_SPELLCAST_FAILED";
g_scriptEvents[327] = "UNIT_SPELLCAST_FAILED_QUIET";
g_scriptEvents[328] = "UNIT_SPELLCAST_INTERRUPTED";
g_scriptEvents[329] = "UNIT_SPELLCAST_DELAYED";
g_scriptEvents[330] = "UNIT_SPELLCAST_SUCCEEDED";
g_scriptEvents[331] = "UNIT_SPELLCAST_CHANNEL_START";
g_scriptEvents[332] = "UNIT_SPELLCAST_CHANNEL_UPDATE";
g_scriptEvents[333] = "UNIT_SPELLCAST_CHANNEL_STOP";
g_scriptEvents[334] = "UNIT_SPELLCAST_INTERRUPTIBLE";
g_scriptEvents[335] = "UNIT_SPELLCAST_NOT_INTERRUPTIBLE";
g_scriptEvents[336] = "PLAYER_GUILD_UPDATE";
g_scriptEvents[337] = "QUEST_ACCEPT_CONFIRM";
g_scriptEvents[338] = "PLAYERBANKSLOTS_CHANGED";
g_scriptEvents[339] = "BANKFRAME_OPENED";
g_scriptEvents[340] = "BANKFRAME_CLOSED";
g_scriptEvents[341] = "PLAYERBANKBAGSLOTS_CHANGED";
g_scriptEvents[342] = "FRIENDLIST_UPDATE";
g_scriptEvents[343] = "IGNORELIST_UPDATE";
g_scriptEvents[344] = "MUTELIST_UPDATE";
g_scriptEvents[345] = "PET_BAR_UPDATE";
g_scriptEvents[346] = "PET_BAR_UPDATE_COOLDOWN";
g_scriptEvents[347] = "PET_BAR_SHOWGRID";
g_scriptEvents[348] = "PET_BAR_HIDEGRID";
g_scriptEvents[349] = "PET_BAR_HIDE";
g_scriptEvents[350] = "PET_BAR_UPDATE_USABLE";
g_scriptEvents[351] = "MINIMAP_PING";
g_scriptEvents[352] = "MIRROR_TIMER_START";
g_scriptEvents[353] = "MIRROR_TIMER_PAUSE";
g_scriptEvents[354] = "MIRROR_TIMER_STOP";
g_scriptEvents[355] = "WORLD_MAP_UPDATE";
g_scriptEvents[356] = "WORLD_MAP_NAME_UPDATE";
g_scriptEvents[357] = "AUTOFOLLOW_BEGIN";
g_scriptEvents[358] = "AUTOFOLLOW_END";
g_scriptEvents[360] = "CINEMATIC_START";
g_scriptEvents[361] = "CINEMATIC_STOP";
g_scriptEvents[362] = "UPDATE_FACTION";
g_scriptEvents[363] = "CLOSE_WORLD_MAP";
g_scriptEvents[364] = "OPEN_TABARD_FRAME";
g_scriptEvents[365] = "CLOSE_TABARD_FRAME";
g_scriptEvents[366] = "TABARD_CANSAVE_CHANGED";
g_scriptEvents[367] = "GUILD_REGISTRAR_SHOW";
g_scriptEvents[368] = "GUILD_REGISTRAR_CLOSED";
g_scriptEvents[369] = "DUEL_REQUESTED";
g_scriptEvents[370] = "DUEL_OUTOFBOUNDS";
g_scriptEvents[371] = "DUEL_INBOUNDS";
g_scriptEvents[372] = "DUEL_FINISHED";
g_scriptEvents[373] = "TUTORIAL_TRIGGER";
g_scriptEvents[374] = "PET_DISMISS_START";
g_scriptEvents[375] = "UPDATE_BINDINGS";
g_scriptEvents[376] = "UPDATE_SHAPESHIFT_FORMS";
g_scriptEvents[377] = "UPDATE_SHAPESHIFT_FORM";
g_scriptEvents[378] = "UPDATE_SHAPESHIFT_USABLE";
g_scriptEvents[379] = "UPDATE_SHAPESHIFT_COOLDOWN";
g_scriptEvents[380] = "WHO_LIST_UPDATE";
g_scriptEvents[381] = "PETITION_SHOW";
g_scriptEvents[382] = "PETITION_CLOSED";
g_scriptEvents[383] = "EXECUTE_CHAT_LINE";
g_scriptEvents[384] = "UPDATE_MACROS";
g_scriptEvents[385] = "UPDATE_TICKET";
g_scriptEvents[386] = "UPDATE_CHAT_WINDOWS";
g_scriptEvents[387] = "CONFIRM_XP_LOSS";
g_scriptEvents[388] = "CORPSE_IN_RANGE";
g_scriptEvents[389] = "CORPSE_IN_INSTANCE";
g_scriptEvents[390] = "CORPSE_OUT_OF_RANGE";
g_scriptEvents[391] = "UPDATE_GM_STATUS";
g_scriptEvents[392] = "PLAYER_UNGHOST";
g_scriptEvents[393] = "BIND_ENCHANT";
g_scriptEvents[394] = "REPLACE_ENCHANT";
g_scriptEvents[395] = "TRADE_REPLACE_ENCHANT";
g_scriptEvents[396] = "TRADE_POTENTIAL_BIND_ENCHANT";
g_scriptEvents[397] = "PLAYER_UPDATE_RESTING";
g_scriptEvents[398] = "UPDATE_EXHAUSTION";
g_scriptEvents[399] = "PLAYER_FLAGS_CHANGED";
g_scriptEvents[400] = "GUILD_ROSTER_UPDATE";
g_scriptEvents[401] = "GM_PLAYER_INFO";
g_scriptEvents[402] = "MAIL_SHOW";
g_scriptEvents[403] = "MAIL_CLOSED";
g_scriptEvents[404] = "SEND_MAIL_MONEY_CHANGED";
g_scriptEvents[405] = "SEND_MAIL_COD_CHANGED";
g_scriptEvents[406] = "MAIL_SEND_INFO_UPDATE";
g_scriptEvents[407] = "MAIL_SEND_SUCCESS";
g_scriptEvents[408] = "MAIL_INBOX_UPDATE";
g_scriptEvents[409] = "MAIL_LOCK_SEND_ITEMS";
g_scriptEvents[410] = "MAIL_UNLOCK_SEND_ITEMS";
g_scriptEvents[411] = "BATTLEFIELDS_SHOW";
g_scriptEvents[412] = "BATTLEFIELDS_CLOSED";
g_scriptEvents[413] = "UPDATE_BATTLEFIELD_STATUS";
g_scriptEvents[414] = "UPDATE_BATTLEFIELD_SCORE";
g_scriptEvents[415] = "AUCTION_HOUSE_SHOW";
g_scriptEvents[416] = "AUCTION_HOUSE_CLOSED";
g_scriptEvents[417] = "NEW_AUCTION_UPDATE";
g_scriptEvents[418] = "AUCTION_ITEM_LIST_UPDATE";
g_scriptEvents[419] = "AUCTION_OWNED_LIST_UPDATE";
g_scriptEvents[420] = "AUCTION_BIDDER_LIST_UPDATE";
g_scriptEvents[421] = "PET_UI_UPDATE";
g_scriptEvents[422] = "PET_UI_CLOSE";
g_scriptEvents[423] = "ADDON_LOADED";
g_scriptEvents[424] = "VARIABLES_LOADED";
g_scriptEvents[425] = "MACRO_ACTION_FORBIDDEN";
g_scriptEvents[426] = "ADDON_ACTION_FORBIDDEN";
g_scriptEvents[427] = "MACRO_ACTION_BLOCKED";
g_scriptEvents[428] = "ADDON_ACTION_BLOCKED";
g_scriptEvents[429] = "START_AUTOREPEAT_SPELL";
g_scriptEvents[430] = "STOP_AUTOREPEAT_SPELL";
g_scriptEvents[431] = "PET_STABLE_SHOW";
g_scriptEvents[432] = "PET_STABLE_UPDATE";
g_scriptEvents[433] = "PET_STABLE_UPDATE_PAPERDOLL";
g_scriptEvents[434] = "PET_STABLE_CLOSED";
g_scriptEvents[435] = "RAID_ROSTER_UPDATE";
g_scriptEvents[436] = "UPDATE_PENDING_MAIL";
g_scriptEvents[437] = "UPDATE_INVENTORY_ALERTS";
g_scriptEvents[438] = "UPDATE_INVENTORY_DURABILITY";
g_scriptEvents[439] = "UPDATE_TRADESKILL_RECAST";
g_scriptEvents[440] = "OPEN_MASTER_LOOT_LIST";
g_scriptEvents[441] = "UPDATE_MASTER_LOOT_LIST";
g_scriptEvents[442] = "START_LOOT_ROLL";
g_scriptEvents[443] = "CANCEL_LOOT_ROLL";
g_scriptEvents[444] = "CONFIRM_LOOT_ROLL";
g_scriptEvents[445] = "CONFIRM_DISENCHANT_ROLL";
g_scriptEvents[446] = "INSTANCE_BOOT_START";
g_scriptEvents[447] = "INSTANCE_BOOT_STOP";
g_scriptEvents[448] = "LEARNED_SPELL_IN_TAB";
g_scriptEvents[449] = "DISPLAY_SIZE_CHANGED";
g_scriptEvents[450] = "CONFIRM_TALENT_WIPE";
g_scriptEvents[451] = "CONFIRM_BINDER";
g_scriptEvents[452] = "MAIL_FAILED";
g_scriptEvents[453] = "CLOSE_INBOX_ITEM";
g_scriptEvents[454] = "CONFIRM_SUMMON";
g_scriptEvents[455] = "CANCEL_SUMMON";
g_scriptEvents[456] = "BILLING_NAG_DIALOG";
g_scriptEvents[457] = "IGR_BILLING_NAG_DIALOG";
g_scriptEvents[458] = "PLAYER_SKINNED";
g_scriptEvents[459] = "TABARD_SAVE_PENDING";
g_scriptEvents[460] = "UNIT_QUEST_LOG_CHANGED";
g_scriptEvents[461] = "PLAYER_PVP_KILLS_CHANGED";
g_scriptEvents[462] = "PLAYER_PVP_RANK_CHANGED";
g_scriptEvents[463] = "INSPECT_HONOR_UPDATE";
g_scriptEvents[464] = "UPDATE_WORLD_STATES";
g_scriptEvents[465] = "AREA_SPIRIT_HEALER_IN_RANGE";
g_scriptEvents[466] = "AREA_SPIRIT_HEALER_OUT_OF_RANGE";
g_scriptEvents[467] = "PLAYTIME_CHANGED";
g_scriptEvents[468] = "UPDATE_LFG_TYPES";
g_scriptEvents[469] = "UPDATE_LFG_LIST";
g_scriptEvents[470] = "UPDATE_LFG_LIST_INCREMENTAL";
g_scriptEvents[471] = "START_MINIGAME";
g_scriptEvents[472] = "MINIGAME_UPDATE";
g_scriptEvents[473] = "READY_CHECK";
g_scriptEvents[474] = "READY_CHECK_CONFIRM";
g_scriptEvents[475] = "READY_CHECK_FINISHED";
g_scriptEvents[476] = "RAID_TARGET_UPDATE";
g_scriptEvents[477] = "GMSURVEY_DISPLAY";
g_scriptEvents[478] = "UPDATE_INSTANCE_INFO";
g_scriptEvents[479] = "SOCKET_INFO_UPDATE";
g_scriptEvents[480] = "SOCKET_INFO_CLOSE";
g_scriptEvents[481] = "PETITION_VENDOR_SHOW";
g_scriptEvents[482] = "PETITION_VENDOR_CLOSED";
g_scriptEvents[483] = "PETITION_VENDOR_UPDATE";
g_scriptEvents[484] = "COMBAT_TEXT_UPDATE";
g_scriptEvents[485] = "QUEST_WATCH_UPDATE";
g_scriptEvents[486] = "KNOWLEDGE_BASE_SETUP_LOAD_SUCCESS";
g_scriptEvents[487] = "KNOWLEDGE_BASE_SETUP_LOAD_FAILURE";
g_scriptEvents[488] = "KNOWLEDGE_BASE_QUERY_LOAD_SUCCESS";
g_scriptEvents[489] = "KNOWLEDGE_BASE_QUERY_LOAD_FAILURE";
g_scriptEvents[490] = "KNOWLEDGE_BASE_ARTICLE_LOAD_SUCCESS";
g_scriptEvents[491] = "KNOWLEDGE_BASE_ARTICLE_LOAD_FAILURE";
g_scriptEvents[492] = "KNOWLEDGE_BASE_SYSTEM_MOTD_UPDATED";
g_scriptEvents[493] = "KNOWLEDGE_BASE_SERVER_MESSAGE";
g_scriptEvents[494] = "ARENA_TEAM_UPDATE";
g_scriptEvents[495] = "ARENA_TEAM_ROSTER_UPDATE";
g_scriptEvents[496] = "ARENA_TEAM_INVITE_REQUEST";
g_scriptEvents[497] = "HONOR_CURRENCY_UPDATE";
g_scriptEvents[498] = "KNOWN_TITLES_UPDATE";
g_scriptEvents[499] = "NEW_TITLE_EARNED";
g_scriptEvents[500] = "OLD_TITLE_LOST";
g_scriptEvents[501] = "LFG_UPDATE";
g_scriptEvents[502] = "LFG_PROPOSAL_UPDATE";
g_scriptEvents[503] = "LFG_PROPOSAL_SHOW";
g_scriptEvents[504] = "LFG_PROPOSAL_FAILED";
g_scriptEvents[505] = "LFG_PROPOSAL_SUCCEEDED";
g_scriptEvents[506] = "LFG_ROLE_UPDATE";
g_scriptEvents[507] = "LFG_ROLE_CHECK_UPDATE";
g_scriptEvents[508] = "LFG_ROLE_CHECK_SHOW";
g_scriptEvents[509] = "LFG_ROLE_CHECK_HIDE";
g_scriptEvents[510] = "LFG_ROLE_CHECK_ROLE_CHOSEN";
g_scriptEvents[511] = "LFG_QUEUE_STATUS_UPDATE";
g_scriptEvents[512] = "LFG_BOOT_PROPOSAL_UPDATE";
g_scriptEvents[513] = "LFG_LOCK_INFO_RECEIVED";
g_scriptEvents[514] = "LFG_UPDATE_RANDOM_INFO";
g_scriptEvents[515] = "LFG_OFFER_CONTINUE";
g_scriptEvents[516] = "LFG_OPEN_FROM_GOSSIP";
g_scriptEvents[517] = "LFG_COMPLETION_REWARD";
g_scriptEvents[518] = "PARTY_LFG_RESTRICTED";
g_scriptEvents[519] = "PLAYER_ROLES_ASSIGNED";
g_scriptEvents[520] = "COMBAT_RATING_UPDATE";
g_scriptEvents[521] = "MODIFIER_STATE_CHANGED";
g_scriptEvents[522] = "UPDATE_STEALTH";
g_scriptEvents[523] = "ENABLE_TAXI_BENCHMARK";
g_scriptEvents[524] = "DISABLE_TAXI_BENCHMARK";
g_scriptEvents[525] = "VOICE_START";
g_scriptEvents[526] = "VOICE_STOP";
g_scriptEvents[527] = "VOICE_STATUS_UPDATE";
g_scriptEvents[528] = "VOICE_CHANNEL_STATUS_UPDATE";
g_scriptEvents[529] = "UPDATE_FLOATING_CHAT_WINDOWS";
g_scriptEvents[530] = "RAID_INSTANCE_WELCOME";
g_scriptEvents[531] = "MOVIE_RECORDING_PROGRESS";
g_scriptEvents[532] = "MOVIE_COMPRESSING_PROGRESS";
g_scriptEvents[533] = "MOVIE_UNCOMPRESSED_MOVIE";
g_scriptEvents[534] = "VOICE_PUSH_TO_TALK_START";
g_scriptEvents[535] = "VOICE_PUSH_TO_TALK_STOP";
g_scriptEvents[536] = "GUILDBANKFRAME_OPENED";
g_scriptEvents[537] = "GUILDBANKFRAME_CLOSED";
g_scriptEvents[538] = "GUILDBANKBAGSLOTS_CHANGED";
g_scriptEvents[539] = "GUILDBANK_ITEM_LOCK_CHANGED";
g_scriptEvents[540] = "GUILDBANK_UPDATE_TABS";
g_scriptEvents[541] = "GUILDBANK_UPDATE_MONEY";
g_scriptEvents[542] = "GUILDBANKLOG_UPDATE";
g_scriptEvents[543] = "GUILDBANK_UPDATE_WITHDRAWMONEY";
g_scriptEvents[544] = "GUILDBANK_UPDATE_TEXT";
g_scriptEvents[545] = "GUILDBANK_TEXT_CHANGED";
g_scriptEvents[546] = "CHANNEL_UI_UPDATE";
g_scriptEvents[547] = "CHANNEL_COUNT_UPDATE";
g_scriptEvents[548] = "CHANNEL_ROSTER_UPDATE";
g_scriptEvents[549] = "CHANNEL_VOICE_UPDATE";
g_scriptEvents[550] = "CHANNEL_INVITE_REQUEST";
g_scriptEvents[551] = "CHANNEL_PASSWORD_REQUEST";
g_scriptEvents[552] = "CHANNEL_FLAGS_UPDATED";
g_scriptEvents[553] = "VOICE_SESSIONS_UPDATE";
g_scriptEvents[554] = "VOICE_CHAT_ENABLED_UPDATE";
g_scriptEvents[555] = "VOICE_LEFT_SESSION";
g_scriptEvents[556] = "INSPECT_TALENT_READY";
g_scriptEvents[557] = "VOICE_SELF_MUTE";
g_scriptEvents[558] = "VOICE_PLATE_START";
g_scriptEvents[559] = "VOICE_PLATE_STOP";
g_scriptEvents[560] = "ARENA_SEASON_WORLD_STATE";
g_scriptEvents[561] = "GUILD_EVENT_LOG_UPDATE";
g_scriptEvents[562] = "GUILDTABARD_UPDATE";
g_scriptEvents[563] = "SOUND_DEVICE_UPDATE";
g_scriptEvents[564] = "COMMENTATOR_MAP_UPDATE";
g_scriptEvents[565] = "COMMENTATOR_ENTER_WORLD";
g_scriptEvents[566] = "COMBAT_LOG_EVENT";
g_scriptEvents[567] = "COMBAT_LOG_EVENT_UNFILTERED";
g_scriptEvents[568] = "COMMENTATOR_PLAYER_UPDATE";
g_scriptEvents[569] = "PLAYER_ENTERING_BATTLEGROUND";
g_scriptEvents[570] = "BARBER_SHOP_OPEN";
g_scriptEvents[571] = "BARBER_SHOP_CLOSE";
g_scriptEvents[572] = "BARBER_SHOP_SUCCESS";
g_scriptEvents[573] = "BARBER_SHOP_APPEARANCE_APPLIED";
g_scriptEvents[574] = "CALENDAR_UPDATE_INVITE_LIST";
g_scriptEvents[575] = "CALENDAR_UPDATE_EVENT_LIST";
g_scriptEvents[576] = "CALENDAR_NEW_EVENT";
g_scriptEvents[577] = "CALENDAR_OPEN_EVENT";
g_scriptEvents[578] = "CALENDAR_CLOSE_EVENT";
g_scriptEvents[579] = "CALENDAR_UPDATE_EVENT";
g_scriptEvents[580] = "CALENDAR_UPDATE_PENDING_INVITES";
g_scriptEvents[581] = "CALENDAR_EVENT_ALARM";
g_scriptEvents[582] = "CALENDAR_UPDATE_ERROR";
g_scriptEvents[583] = "CALENDAR_ACTION_PENDING";
g_scriptEvents[584] = "VEHICLE_ANGLE_SHOW";
g_scriptEvents[585] = "VEHICLE_ANGLE_UPDATE";
g_scriptEvents[586] = "VEHICLE_POWER_SHOW";
g_scriptEvents[587] = "UNIT_ENTERING_VEHICLE";
g_scriptEvents[588] = "UNIT_ENTERED_VEHICLE";
g_scriptEvents[589] = "UNIT_EXITING_VEHICLE";
g_scriptEvents[590] = "UNIT_EXITED_VEHICLE";
g_scriptEvents[591] = "VEHICLE_PASSENGERS_CHANGED";
g_scriptEvents[592] = "PLAYER_GAINS_VEHICLE_DATA";
g_scriptEvents[593] = "PLAYER_LOSES_VEHICLE_DATA";
g_scriptEvents[594] = "PET_FORCE_NAME_DECLENSION";
g_scriptEvents[595] = "LEVEL_GRANT_PROPOSED";
g_scriptEvents[596] = "SYNCHRONIZE_SETTINGS";
g_scriptEvents[597] = "PLAY_MOVIE";
g_scriptEvents[598] = "RUNE_POWER_UPDATE";
g_scriptEvents[599] = "RUNE_TYPE_UPDATE";
g_scriptEvents[600] = "ACHIEVEMENT_EARNED";
g_scriptEvents[601] = "CRITERIA_UPDATE";
g_scriptEvents[602] = "RECEIVED_ACHIEVEMENT_LIST";
g_scriptEvents[603] = "PET_RENAMEABLE";
g_scriptEvents[604] = "KNOWN_CURRENCY_TYPES_UPDATE";
g_scriptEvents[605] = "CURRENCY_DISPLAY_UPDATE";
g_scriptEvents[606] = "COMPANION_LEARNED";
g_scriptEvents[607] = "COMPANION_UNLEARNED";
g_scriptEvents[608] = "COMPANION_UPDATE";
g_scriptEvents[609] = "UNIT_THREAT_LIST_UPDATE";
g_scriptEvents[610] = "UNIT_THREAT_SITUATION_UPDATE";
g_scriptEvents[611] = "GLYPH_ADDED";
g_scriptEvents[612] = "GLYPH_REMOVED";
g_scriptEvents[613] = "GLYPH_UPDATED";
g_scriptEvents[614] = "GLYPH_ENABLED";
g_scriptEvents[615] = "GLYPH_DISABLED";
g_scriptEvents[616] = "USE_GLYPH";
g_scriptEvents[617] = "TRACKED_ACHIEVEMENT_UPDATE";
g_scriptEvents[618] = "ARENA_OPPONENT_UPDATE";
g_scriptEvents[619] = "INSPECT_ACHIEVEMENT_READY";
g_scriptEvents[620] = "RAISED_AS_GHOUL";
g_scriptEvents[621] = "PARTY_CONVERTED_TO_RAID";
g_scriptEvents[622] = "PVPQUEUE_ANYWHERE_SHOW";
g_scriptEvents[623] = "PVPQUEUE_ANYWHERE_UPDATE_AVAILABLE";
g_scriptEvents[624] = "QUEST_ACCEPTED";
g_scriptEvents[625] = "PLAYER_TALENT_UPDATE";
g_scriptEvents[626] = "ACTIVE_TALENT_GROUP_CHANGED";
g_scriptEvents[627] = "PET_TALENT_UPDATE";
g_scriptEvents[628] = "PREVIEW_TALENT_POINTS_CHANGED";
g_scriptEvents[629] = "PREVIEW_PET_TALENT_POINTS_CHANGED";
g_scriptEvents[630] = "WEAR_EQUIPMENT_SET";
g_scriptEvents[631] = "EQUIPMENT_SETS_CHANGED";
g_scriptEvents[632] = "INSTANCE_LOCK_START";
g_scriptEvents[633] = "INSTANCE_LOCK_STOP";
g_scriptEvents[634] = "PLAYER_EQUIPMENT_CHANGED";
g_scriptEvents[635] = "ITEM_LOCKED";
g_scriptEvents[636] = "ITEM_UNLOCKED";
g_scriptEvents[637] = "TRADE_SKILL_FILTER_UPDATE";
g_scriptEvents[638] = "EQUIPMENT_SWAP_PENDING";
g_scriptEvents[639] = "EQUIPMENT_SWAP_FINISHED";
g_scriptEvents[640] = "NPC_PVPQUEUE_ANYWHERE";
g_scriptEvents[641] = "UPDATE_MULTI_CAST_ACTIONBAR";
g_scriptEvents[642] = "ENABLE_XP_GAIN";
g_scriptEvents[643] = "DISABLE_XP_GAIN";
g_scriptEvents[644] = "BATTLEFIELD_MGR_ENTRY_INVITE";
g_scriptEvents[645] = "BATTLEFIELD_MGR_ENTERED";
g_scriptEvents[646] = "BATTLEFIELD_MGR_QUEUE_REQUEST_RESPONSE";
g_scriptEvents[647] = "BATTLEFIELD_MGR_EJECT_PENDING";
g_scriptEvents[648] = "BATTLEFIELD_MGR_EJECTED";
g_scriptEvents[649] = "BATTLEFIELD_MGR_QUEUE_INVITE";
g_scriptEvents[650] = "BATTLEFIELD_MGR_STATE_CHANGE";
g_scriptEvents[651] = "WORLD_STATE_UI_TIMER_UPDATE";
g_scriptEvents[652] = "END_REFUND";
g_scriptEvents[653] = "END_BOUND_TRADEABLE";
g_scriptEvents[654] = "UPDATE_CHAT_COLOR_NAME_BY_CLASS";
g_scriptEvents[655] = "GMRESPONSE_RECEIVED";
g_scriptEvents[656] = "VEHICLE_UPDATE";
g_scriptEvents[657] = "WOW_MOUSE_NOT_FOUND";
g_scriptEvents[659] = "MAIL_SUCCESS";
g_scriptEvents[660] = "TALENTS_INVOLUNTARILY_RESET";
g_scriptEvents[661] = "INSTANCE_ENCOUNTER_ENGAGE_UNIT";
g_scriptEvents[662] = "QUEST_QUERY_COMPLETE";
g_scriptEvents[663] = "QUEST_POI_UPDATE";
g_scriptEvents[664] = "PLAYER_DIFFICULTY_CHANGED";
g_scriptEvents[665] = "CHAT_MSG_PARTY_LEADER";
g_scriptEvents[666] = "VOTE_KICK_REASON_NEEDED";
g_scriptEvents[667] = "ENABLE_LOW_LEVEL_RAID";
g_scriptEvents[668] = "DISABLE_LOW_LEVEL_RAID";
g_scriptEvents[669] = "CHAT_MSG_TARGETICONS";
g_scriptEvents[670] = "AUCTION_HOUSE_DISABLED";
g_scriptEvents[671] = "AUCTION_MULTISELL_START";
g_scriptEvents[672] = "AUCTION_MULTISELL_UPDATE";
g_scriptEvents[673] = "AUCTION_MULTISELL_FAILURE";
g_scriptEvents[674] = "PET_SPELL_POWER_UPDATE";
g_scriptEvents[675] = "BN_CONNECTED";
g_scriptEvents[676] = "BN_DISCONNECTED";
g_scriptEvents[677] = "BN_SELF_ONLINE";
g_scriptEvents[678] = "BN_SELF_OFFLINE";
g_scriptEvents[679] = "BN_FRIEND_LIST_SIZE_CHANGED";
g_scriptEvents[680] = "BN_FRIEND_INVITE_LIST_INITIALIZED";
g_scriptEvents[681] = "BN_FRIEND_INVITE_SEND_RESULT";
g_scriptEvents[682] = "BN_FRIEND_INVITE_ADDED";
g_scriptEvents[683] = "BN_FRIEND_INVITE_REMOVED";
g_scriptEvents[684] = "BN_FRIEND_INFO_CHANGED";
g_scriptEvents[685] = "BN_CUSTOM_MESSAGE_CHANGED";
g_scriptEvents[686] = "BN_CUSTOM_MESSAGE_LOADED";
g_scriptEvents[687] = "CHAT_MSG_BN_WHISPER";
g_scriptEvents[688] = "CHAT_MSG_BN_WHISPER_INFORM";
g_scriptEvents[689] = "BN_CHAT_WHISPER_UNDELIVERABLE";
g_scriptEvents[690] = "BN_CHAT_CHANNEL_JOINED";
g_scriptEvents[691] = "BN_CHAT_CHANNEL_LEFT";
g_scriptEvents[692] = "BN_CHAT_CHANNEL_CLOSED";
g_scriptEvents[693] = "CHAT_MSG_BN_CONVERSATION";
g_scriptEvents[694] = "CHAT_MSG_BN_CONVERSATION_NOTICE";
g_scriptEvents[695] = "CHAT_MSG_BN_CONVERSATION_LIST";
g_scriptEvents[696] = "BN_CHAT_CHANNEL_MESSAGE_UNDELIVERABLE";
g_scriptEvents[697] = "BN_CHAT_CHANNEL_MESSAGE_BLOCKED";
g_scriptEvents[698] = "BN_CHAT_CHANNEL_MEMBER_JOINED";
g_scriptEvents[699] = "BN_CHAT_CHANNEL_MEMBER_LEFT";
g_scriptEvents[700] = "BN_CHAT_CHANNEL_MEMBER_UPDATED";
g_scriptEvents[701] = "BN_CHAT_CHANNEL_CREATE_SUCCEEDED";
g_scriptEvents[702] = "BN_CHAT_CHANNEL_CREATE_FAILED";
g_scriptEvents[703] = "BN_CHAT_CHANNEL_INVITE_SUCCEEDED";
g_scriptEvents[704] = "BN_CHAT_CHANNEL_INVITE_FAILED";
g_scriptEvents[705] = "BN_BLOCK_LIST_UPDATED";
g_scriptEvents[706] = "BN_SYSTEM_MESSAGE";
g_scriptEvents[707] = "BN_REQUEST_FOF_SUCCEEDED";
g_scriptEvents[708] = "BN_REQUEST_FOF_FAILED";
g_scriptEvents[709] = "BN_NEW_PRESENCE";
g_scriptEvents[710] = "BN_TOON_NAME_UPDATED";
g_scriptEvents[711] = "BN_FRIEND_ACCOUNT_ONLINE";
g_scriptEvents[712] = "BN_FRIEND_ACCOUNT_OFFLINE";
g_scriptEvents[713] = "BN_FRIEND_TOON_ONLINE";
g_scriptEvents[714] = "BN_FRIEND_TOON_OFFLINE";
g_scriptEvents[715] = "BN_MATURE_LANGUAGE_FILTER";
g_scriptEvents[716] = "COMMENTATOR_SKIRMISH_QUEUE_REQUEST";
g_scriptEvents[717] = "COMMENTATOR_SKIRMISH_MODE_REQUEST";
g_scriptEvents[718] = "CHAT_MSG_BN_INLINE_TOAST_ALERT";
g_scriptEvents[719] = "CHAT_MSG_BN_INLINE_TOAST_BROADCAST";
g_scriptEvents[720] = "CHAT_MSG_BN_INLINE_TOAST_BROADCAST_INFORM";
g_scriptEvents[721] = "CHAT_MSG_BN_INLINE_TOAST_CONVERSATION";
}
void ScriptEventsRegisterEvents() {
FrameScript_CreateEvents(g_scriptEvents, NUM_SCRIPT_EVENTS);
}

View File

@ -1,6 +1,12 @@
#ifndef UI_GAME_SCRIPT_EVENTS_HPP
#define UI_GAME_SCRIPT_EVENTS_HPP
extern const char* g_scriptEvents[];
void ScriptEventsInitialize();
void ScriptEventsRegisterEvents();
void ScriptEventsRegisterFunctions();
#endif

View File

@ -12,6 +12,16 @@ bool ParseTrailingTokens(const char* token, WOWGUID& guid, CGPlayer_C* player) {
}
CGUnit_C* Script_GetUnitFromName(const char* name) {
WOWGUID guid;
if (!Script_GetGUIDFromToken(name, guid, false)) {
return nullptr;
}
return static_cast<CGUnit_C*>(ClntObjMgrObjectPtr(guid, TYPE_UNIT, __FILE__, __LINE__));
}
bool Script_GetGUIDFromString(const char*& token, WOWGUID& guid) {
// TODO
return true;

View File

@ -3,6 +3,10 @@
#include "util/GUID.hpp"
class CGUnit_C;
CGUnit_C* Script_GetUnitFromName(const char* name);
bool Script_GetGUIDFromString(const char*& token, WOWGUID& guid);
bool Script_GetGUIDFromToken(const char* token, WOWGUID& guid, bool defaultToTarget);

View File

@ -372,7 +372,18 @@ int32_t CSimpleButton_GetTextWidth(lua_State* L) {
}
int32_t CSimpleButton_GetTextHeight(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
auto type = CSimpleButton::GetObjectType();
auto button = static_cast<CSimpleButton*>(FrameScript_GetObjectThis(L, type));
auto text = button->m_text;
float height = text ? text->GetHeight() : 0.0f;
float ddcHeight = CoordinateGetAspectCompensation() * 1024.0f * height;
float ndcHeight = DDCToNDCWidth(ddcHeight);
lua_pushnumber(L, ndcHeight);
return 1;
}
int32_t CSimpleButton_RegisterForClicks(lua_State* L) {

View File

@ -162,7 +162,17 @@ int32_t CSimpleFontString_SetFont(lua_State* L) {
}
int32_t CSimpleFontString_GetText(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
auto type = CSimpleFontString::GetObjectType();
auto string = static_cast<CSimpleFontString*>(FrameScript_GetObjectThis(L, type));
auto text = string->GetText();
if (!text || !*text) {
text = nullptr;
}
lua_pushstring(L, text);
return 1;
}
int32_t CSimpleFontString_GetFieldSize(lua_State* L) {

View File

@ -95,6 +95,10 @@ void CSimpleFrame::AddFrameRegion(CSimpleRegion* region, uint32_t drawlayer) {
this->NotifyDrawLayerChanged(drawlayer);
}
int32_t CSimpleFrame::AttributeChangesAllowed() {
return true;
}
void CSimpleFrame::DisableDrawLayer(uint32_t drawlayer) {
this->m_drawenabled[drawlayer] = 0;
this->NotifyDrawLayerChanged(drawlayer);
@ -376,6 +380,29 @@ void CSimpleFrame::RegisterForEvents(int32_t a2) {
}
}
void CSimpleFrame::RunOnAttributeChangedScript(const char* name, int32_t luaRef) {
if (!this->m_onAttributeChange.luaRef) {
return;
}
auto L = FrameScript_GetContext();
// TODO taint management
// Attribute name
auto nameLower = static_cast<char*>(alloca(SStrLen(name) + 1));
SStrCopy(nameLower, name);
SStrLower(nameLower);
lua_pushstring(L, nameLower);
// Attribute ref
lua_rawgeti(L, LUA_REGISTRYINDEX, luaRef);
this->RunScript(this->m_onAttributeChange, 2, nullptr);
// TODO taint management
}
void CSimpleFrame::RunOnCharScript(const char* chr) {
if (this->m_onChar.luaRef) {
auto L = FrameScript_GetContext();
@ -522,6 +549,18 @@ void CSimpleFrame::PreLoadXML(XMLNode* node, CStatus* status) {
}
}
bool CSimpleFrame::GetAttribute(const char* name, int32_t& luaRef) {
auto attr = this->m_attributes.Ptr(name);
if (!attr || attr->luaRef == -1) {
return false;
}
luaRef = attr->luaRef;
return true;
}
int32_t CSimpleFrame::GetBoundsRect(CRect& bounds) {
if (this->IsResizePending()) {
this->Resize(1);
@ -737,7 +776,69 @@ int32_t CSimpleFrame::HideThis() {
}
void CSimpleFrame::LoadXML_Attributes(const XMLNode* node, CStatus* status) {
// TODO
auto L = FrameScript_GetContext();
auto child = node->GetChild();
while (child) {
// Unexpected child node
if (SStrCmpI(child->GetName(), "Attribute")) {
status->Add(STATUS_WARNING, "Frame %s: Unknown attributes element %s", this->GetDisplayName(), child->GetName());
child = child->GetSibling();
continue;
}
auto attrName = child->GetAttributeByName("name");
// No attribute name
if (!attrName) {
status->Add(STATUS_WARNING, "Frame %s: unnamed attribute element", this->GetDisplayName());
child = child->GetSibling();
continue;
}
auto attrType = child->GetAttributeByName("type");
if (!attrType) {
attrType = "string";
}
auto attrValue = child->GetAttributeByName("value");
// Missing attribute value for non-nil type
if (SStrCmpI(attrType, "nil") && !attrValue) {
status->Add(STATUS_WARNING, "Frame %s: attribute element named %s missing value", this->GetDisplayName(), attrName);
child = child->GetSibling();
continue;
}
// Push attribute value to stack
if (!SStrCmpI(attrType, "nil")) {
lua_pushnil(L);
} else if (!SStrCmpI(attrType, "boolean")) {
lua_pushboolean(L, StringToBOOL(attrValue));
} else if (!SStrCmpI(attrType, "number")) {
lua_pushnumber(L, SStrToFloat(attrValue));
} else {
lua_pushstring(L, attrValue);
}
auto attr = this->m_attributes.Ptr(attrName);
if (attr) {
luaL_unref(L, LUA_REGISTRYINDEX, attr->luaRef);
} else {
attr = this->m_attributes.New(attrName, 0, 0x0);
}
// TODO taint management
attr->luaRef = luaL_ref(L, LUA_REGISTRYINDEX);
// TODO taint management
child = child->GetSibling();
}
}
void CSimpleFrame::LoadXML_Backdrop(const XMLNode* node, CStatus* status) {
@ -1317,6 +1418,18 @@ void CSimpleFrame::RemoveFrameRegion(CSimpleRegion* region, uint32_t drawlayer)
this->NotifyDrawLayerChanged(drawlayer);
}
void CSimpleFrame::SetAttribute(const char* name, int32_t luaRef) {
auto attr = this->m_attributes.Ptr(name);
if (!attr) {
attr = this->m_attributes.New(name, 0, 0x0);
}
attr->luaRef = luaRef;
this->RunOnAttributeChangedScript(name, luaRef);
}
void CSimpleFrame::SetBackdrop(CBackdropGenerator* backdrop) {
if (this->m_backdrop) {
delete this->m_backdrop;

View File

@ -6,6 +6,7 @@
#include "ui/CScriptRegion.hpp"
#include "ui/Types.hpp"
#include "ui/simple/CSimpleRegion.hpp"
#include <storm/Hash.hpp>
#include <storm/List.hpp>
#include <cstdint>
@ -17,6 +18,10 @@ class CSimpleTitleRegion;
class CSimpleTop;
struct lua_State;
struct FRAMEATTR : TSHashObject<FRAMEATTR, HASHKEY_STRI> {
int32_t luaRef;
};
class CSimpleFrame : public CScriptRegion {
public:
// Static members
@ -71,6 +76,7 @@ class CSimpleFrame : public CScriptRegion {
ScriptIx m_onAttributeChange;
ScriptIx m_onEnable;
ScriptIx m_onDisable;
TSHashTable<FRAMEATTR, HASHKEY_STRI> m_attributes;
int32_t m_drawenabled[NUM_SIMPLEFRAME_DRAWLAYERS];
CBackdropGenerator* m_backdrop = nullptr;
STORM_EXPLICIT_LIST(CSimpleRegion, m_regionLink) m_regions;
@ -122,10 +128,12 @@ class CSimpleFrame : public CScriptRegion {
// Member functions
CSimpleFrame(CSimpleFrame* parent);
void AddFrameRegion(CSimpleRegion* region, uint32_t drawlayer);
int32_t AttributeChangesAllowed();
void DisableDrawLayer(uint32_t drawlayer);
void DisableEvent(CSimpleEventType eventType);
void EnableDrawLayer(uint32_t drawlayer);
void EnableEvent(CSimpleEventType eventType, int32_t priority);
bool GetAttribute(const char* name, int32_t& luaRef);
int32_t GetHitRect(CRect& rect);
void Hide();
void LoadXML_Attributes(const XMLNode* node, CStatus* status);
@ -139,6 +147,7 @@ class CSimpleFrame : public CScriptRegion {
void RegisterForEvents(int32_t a2);
void RegisterRegion(CSimpleRegion* region);
void RemoveFrameRegion(CSimpleRegion* region, uint32_t drawlayer);
void RunOnAttributeChangedScript(const char* name, int32_t luaRef);
void RunOnCharScript(const char* chr);
void RunOnEnableScript();
void RunOnEnterScript(int32_t a2);
@ -152,6 +161,7 @@ class CSimpleFrame : public CScriptRegion {
void RunOnShowScript();
void RunOnSizeChangedScript(float width, float height);
void RunOnUpdateScript(float elapsedSec);
void SetAttribute(const char* name, int32_t luaRef);
void SetBackdrop(CBackdropGenerator* backdrop);
void SetBeingScrolled(int32_t a2, int32_t a3);
void SetFrameAlpha(uint8_t alpha);

View File

@ -2,10 +2,13 @@
#include "gx/Coordinate.hpp"
#include "ui/CBackdropGenerator.hpp"
#include "ui/FrameScript.hpp"
#include "ui/FrameXML.hpp"
#include "ui/simple/CSimpleFrame.hpp"
#include "ui/simple/CSimpleTexture.hpp"
#include "util/Lua.hpp"
#include "util/StringTo.hpp"
#include "util/Unimplemented.hpp"
#include <storm/Memory.hpp>
#include <algorithm>
#include <cstdint>
#include <limits>
@ -19,7 +22,66 @@ int32_t CSimpleFrame_CreateTitleRegion(lua_State* L) {
}
int32_t CSimpleFrame_CreateTexture(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
auto type = CSimpleFrame::GetObjectType();
auto frame = static_cast<CSimpleFrame*>(FrameScript_GetObjectThis(L, type));
const char* name = nullptr;
if (lua_isstring(L, 2)) {
name = lua_tostring(L, 2);
}
int32_t drawlayer = DRAWLAYER_ARTWORK;
if (lua_isstring(L, 3)) {
auto drawlayerStr = lua_tostring(L, 3);
StringToDrawLayer(drawlayerStr, drawlayer);
}
XMLNode* inheritNode = nullptr;
if (lua_type(L, 4) == LUA_TSTRING) {
auto inheritName = lua_tostring(L, 4);
const char* tainted;
bool locked;
inheritNode = FrameXML_AcquireHashNode(inheritName, tainted, locked);
if (!inheritNode) {
luaL_error(L, "%s:CreateTexture(): Couldn't find inherited node \"%s\"", frame->GetDisplayName(), inheritName);
return 0;
}
if (locked) {
luaL_error(L, "%s:CreateTexture(): Recursively inherited node \"%s\"", frame->GetDisplayName(), inheritName);
return 0;
}
}
// TODO CDataAllocator::GetData
auto texture = STORM_NEW(CSimpleTexture)(frame, drawlayer, true);
if (name && *name) {
texture->SetName(name);
}
if (inheritNode) {
CStatus status;
texture->LoadXML(inheritNode, &status);
texture->PostLoadXML(inheritNode, &status);
auto inheritName = lua_tostring(L, 4);
FrameXML_ReleaseHashNode(inheritName);
}
// TODO anim related logic?
if (!texture->lua_registered) {
texture->RegisterScriptObject(nullptr);
}
lua_rawgeti(L, LUA_REGISTRYINDEX, texture->lua_objectRef);
return 1;
}
int32_t CSimpleFrame_CreateFontString(lua_State* L) {
@ -126,7 +188,10 @@ int32_t CSimpleFrame_HasScript(lua_State* L) {
}
int32_t CSimpleFrame_GetScript(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
auto type = CSimpleFrame::GetObjectType();
auto frame = static_cast<CSimpleFrame*>(FrameScript_GetObjectThis(L, type));
return frame->GetScript(L);
}
int32_t CSimpleFrame_SetScript(lua_State* L) {
@ -180,11 +245,197 @@ int32_t CSimpleFrame_CanChangeAttributes(lua_State* L) {
}
int32_t CSimpleFrame_GetAttribute(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
auto type = CSimpleFrame::GetObjectType();
auto frame = static_cast<CSimpleFrame*>(FrameScript_GetObjectThis(L, type));
// 3 argument form
if (lua_gettop(L) == 4 && lua_isstring(L, 3)) {
size_t prefixLen, nameLen, suffixLen;
auto prefix = lua_tolstring(L, 2, &prefixLen);
auto name = lua_tolstring(L, 3, &nameLen);
auto suffix = lua_tolstring(L, 4, &suffixLen);
char buffer[256];
char* write;
size_t remaining;
size_t copyLen;
int32_t luaRef;
// Attempt 1: prefix + name + suffix
write = buffer;
remaining = 255;
if (prefixLen > 0) {
copyLen = (prefixLen < remaining) ? prefixLen : remaining;
memcpy(write, prefix, copyLen);
write += copyLen;
remaining -= copyLen;
}
if (nameLen > 0) {
copyLen = (nameLen < remaining) ? nameLen : remaining;
memcpy(write, name, copyLen);
write += copyLen;
remaining -= copyLen;
}
if (suffixLen > 0) {
copyLen = (suffixLen < remaining) ? suffixLen : remaining;
memcpy(write, suffix, copyLen);
write += copyLen;
}
*write = '\0';
if (frame->GetAttribute(buffer, luaRef)) {
lua_rawgeti(L, LUA_REGISTRYINDEX, luaRef);
return 1;
}
// Attempt 2: "*" + name + suffix
write = buffer;
*write++ = '*';
remaining = 254;
if (nameLen > 0) {
copyLen = (nameLen < remaining) ? nameLen : remaining;
memcpy(write, name, copyLen);
write += copyLen;
remaining -= copyLen;
}
if (suffixLen > 0) {
copyLen = (suffixLen < remaining) ? suffixLen : remaining;
memcpy(write, suffix, copyLen);
write += copyLen;
}
*write = '\0';
if (frame->GetAttribute(buffer, luaRef)) {
lua_rawgeti(L, LUA_REGISTRYINDEX, luaRef);
return 1;
}
// Attempt 3: prefix + name + "*"
write = buffer;
remaining = 254;
if (prefixLen > 0) {
copyLen = (prefixLen < remaining) ? prefixLen : remaining;
memcpy(write, prefix, copyLen);
write += copyLen;
remaining -= copyLen;
}
if (nameLen > 0) {
copyLen = (nameLen < remaining) ? nameLen : remaining;
memcpy(write, name, copyLen);
write += copyLen;
}
*write++ = '*';
*write = '\0';
if (frame->GetAttribute(buffer, luaRef)) {
lua_rawgeti(L, LUA_REGISTRYINDEX, luaRef);
return 1;
}
// Attempt 4: "*" + name + "*"
write = buffer;
*write++ = '*';
remaining = 253;
if (nameLen > 0) {
copyLen = (nameLen < remaining) ? nameLen : remaining;
memcpy(write, name, copyLen);
write += copyLen;
}
*write++ = '*';
*write = '\0';
if (frame->GetAttribute(buffer, luaRef)) {
lua_rawgeti(L, LUA_REGISTRYINDEX, luaRef);
return 1;
}
// Attempt 5: name
if (frame->GetAttribute(name, luaRef)) {
lua_rawgeti(L, LUA_REGISTRYINDEX, luaRef);
return 1;
}
// Not found
lua_pushnil(L);
return 1;
}
// 1 argument form
if (lua_isstring(L, 2)) {
auto attrName = lua_tostring(L, 2);
int32_t luaRef;
if (frame->GetAttribute(attrName, luaRef)) {
lua_rawgeti(L, LUA_REGISTRYINDEX, luaRef);
return 1;
}
// Not found
lua_pushnil(L);
return 1;
}
// Invalid call
luaL_error(L, "Usage: %s:GetAttribute(\"name\")", frame->GetDisplayName());
return 0;
}
int32_t CSimpleFrame_SetAttribute(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
auto type = CSimpleFrame::GetObjectType();
auto frame = static_cast<CSimpleFrame*>(FrameScript_GetObjectThis(L, type));
if (!frame->ProtectedFunctionsAllowed() && !frame->AttributeChangesAllowed()) {
// TODO disallowed logic
return 0;
}
lua_settop(L, 3);
if (!lua_isstring(L, 2) || lua_type(L, 3) == LUA_TNONE) {
luaL_error(L, "Usage: %s:SetAttribute(\"name\", value)", frame->GetDisplayName());
return 0;
}
auto attrName = lua_tostring(L, 2);
int32_t luaRef;
if (frame->GetAttribute(attrName, luaRef)) {
luaL_unref(L, LUA_REGISTRYINDEX, luaRef);
}
// TODO taint management
luaRef = luaL_ref(L, LUA_REGISTRYINDEX);
// TODO taint management
frame->SetAttribute(attrName, luaRef);
return 0;
}
int32_t CSimpleFrame_GetEffectiveScale(lua_State* L) {

View File

@ -1,5 +1,11 @@
#include "ui/simple/CSimpleStatusBar.hpp"
#include "ui/LoadXML.hpp"
#include "ui/simple/CSimpleStatusBarScript.hpp"
#include "ui/simple/CSimpleTexture.hpp"
#include "util/CStatus.hpp"
#include "util/Lua.hpp"
#include "util/StringTo.hpp"
#include <common/XML.hpp>
int32_t CSimpleStatusBar::s_metatable;
int32_t CSimpleStatusBar::s_objectType;
@ -22,10 +28,260 @@ void CSimpleStatusBar::RegisterScriptMethods(lua_State* L) {
FrameScript_Object::FillScriptMethodTable(L, SimpleStatusBarMethods, NUM_SIMPLE_STATUS_BAR_SCRIPT_METHODS);
}
CSimpleStatusBar::CSimpleStatusBar(CSimpleFrame* parent) : CSimpleFrame(parent) {
// TODO
float CSimpleStatusBar::GetAnimValue() const {
auto range = this->m_maxValue - this->m_minValue;
if (range <= 0.0f) {
return 0.0f;
}
return (this->m_value - this->m_minValue) / range;
}
FrameScript_Object::ScriptIx* CSimpleStatusBar::GetScriptByName(const char* name, ScriptData& data) {
auto script = this->CSimpleFrame::GetScriptByName(name, data);
if (script) {
return script;
}
if (!SStrCmpI(name, "OnValueChanged")) {
script = &this->m_onValueChanged;
data.wrapper = "return function(self,value) %s end";
} else if (!SStrCmpI(name, "OnMinMaxChanged")) {
script = &this->m_onMinMaxChanged;
data.wrapper = "return function(self,min,max) %s end";
}
return script;
}
int32_t CSimpleStatusBar::GetScriptMetaTable() {
return CSimpleStatusBar::s_metatable;
}
float CSimpleStatusBar::GetMaxValue() const {
return this->m_maxValue;
}
float CSimpleStatusBar::GetMinValue() const {
return this->m_minValue;
}
float CSimpleStatusBar::GetValue() const {
return this->m_value;
}
bool CSimpleStatusBar::IsA(int32_t type) {
return type == CSimpleStatusBar::s_objectType
|| type == CSimpleFrame::s_objectType
|| type == CScriptRegion::s_objectType
|| type == CScriptObject::s_objectType;
}
void CSimpleStatusBar::LoadXML(const XMLNode* node, CStatus* status) {
this->CSimpleFrame::LoadXML(node, status);
int32_t drawlayer = DRAWLAYER_ARTWORK;
auto drawlayerAttr = node->GetAttributeByName("drawLayer");
if (drawlayerAttr && *drawlayerAttr) {
StringToDrawLayer(drawlayerAttr, drawlayer);
}
for (auto child = node->GetChild(); child; child = child->GetSibling()) {
if (!SStrCmpI(child->GetName(), "BarTexture")) {
auto texture = LoadXML_Texture(child, this, status);
this->SetBarTexture(texture, drawlayer);
} else if (!SStrCmpI(child->GetName(), "BarColor")) {
CImVector color = {};
LoadXML_Color(child, color);
this->SetStatusBarColor(color);
}
}
auto minValueAttr = node->GetAttributeByName("minValue");
if (minValueAttr && *minValueAttr) {
auto maxValueAttr = node->GetAttributeByName("maxValue");
if (maxValueAttr && *maxValueAttr) {
auto minValue = SStrToFloat(minValueAttr);
auto maxValue = SStrToFloat(maxValueAttr);
if (minValue < -1.0e12 || minValue > 1.0e12 || maxValue < -1.0e12 || maxValue > 1.0e12) {
status->Add(STATUS_ERROR, "Frame %s: Min or Max out of range", this->GetDisplayName());
} else if (maxValue - minValue > 1.0e12) {
status->Add(STATUS_ERROR, "Frame %s: Min and Max too far apart", this->GetDisplayName());
} else {
this->SetMinMaxValues(minValue, maxValue);
}
auto defaultValueAttr = node->GetAttributeByName("defaultValue");
if (defaultValueAttr && *defaultValueAttr) {
auto defaultValue = SStrToFloat(defaultValueAttr);
this->SetValue(defaultValue);
}
}
}
auto orientationAttr = node->GetAttributeByName("orientation");
if (orientationAttr && *orientationAttr) {
ORIENTATION orientation;
if (StringToOrientation(orientationAttr, orientation)) {
this->SetOrientation(orientation);
} else {
status->Add(STATUS_WARNING, "Frame %s: Unknown orientation %s in element %s", this->GetDisplayName(), orientationAttr, node->GetName());
}
}
auto rotatesTextureAttr = node->GetAttributeByName("rotatesTexture");
if (rotatesTextureAttr && *rotatesTextureAttr) {
auto rotatesTexture = StringToBOOL(rotatesTextureAttr);
this->SetRotatesTexture(rotatesTexture);
}
}
void CSimpleStatusBar::OnLayerUpdate(float elapsedSec) {
this->CSimpleFrame::OnLayerUpdate(elapsedSec);
if (!this->m_changed || !this->m_rangeSet || !this->m_valueSet || !this->m_barTexture) {
return;
}
auto animValue = this->GetAnimValue();
if (animValue <= 0.0f) {
this->m_barTexture->Hide();
this->m_changed = false;
return;
}
float width, height;
this->GetSize(width, height, false);
auto fill = 1.0f - animValue;
this->m_barTexture->Show();
if (this->m_orientation == ORIENTATION_VERTICAL) {
this->m_barTexture->SetPoint(FRAMEPOINT_BOTTOMLEFT, this, FRAMEPOINT_BOTTOMLEFT, 0.0f, 0.0f, true);
this->m_barTexture->SetPoint(FRAMEPOINT_BOTTOMRIGHT, this, FRAMEPOINT_BOTTOMRIGHT, 0.0f, 0.0f, true);
this->m_barTexture->SetPoint(FRAMEPOINT_TOPLEFT, this, FRAMEPOINT_TOPLEFT, 0.0f, -(fill * height), true);
this->m_barTexture->SetPoint(FRAMEPOINT_TOPRIGHT, this, FRAMEPOINT_TOPRIGHT, 0.0f, -(fill * height), true);
} else {
this->m_barTexture->SetPoint(FRAMEPOINT_TOPLEFT, this, FRAMEPOINT_TOPLEFT, 0.0f, 0.0f, true);
this->m_barTexture->SetPoint(FRAMEPOINT_BOTTOMLEFT, this, FRAMEPOINT_BOTTOMLEFT, 0.0f, 0.0f, true);
this->m_barTexture->SetPoint(FRAMEPOINT_TOPRIGHT, this, FRAMEPOINT_TOPRIGHT, -(fill * width), 0.0f, true);
this->m_barTexture->SetPoint(FRAMEPOINT_BOTTOMRIGHT, this, FRAMEPOINT_BOTTOMRIGHT, -(fill * width), 0.0f, true);
}
this->m_changed = false;
}
void CSimpleStatusBar::RunOnMinMaxChangedScript() {
if (!this->m_onMinMaxChanged.luaRef) {
return;
}
auto L = FrameScript_GetContext();
lua_pushnumber(L, this->m_minValue);
lua_pushnumber(L, this->m_maxValue);
this->RunScript(this->m_onMinMaxChanged, 2, nullptr);
}
void CSimpleStatusBar::RunOnValueChangedScript() {
if (!this->m_onValueChanged.luaRef) {
return;
}
auto L = FrameScript_GetContext();
lua_pushnumber(L, this->m_value);
this->RunScript(this->m_onValueChanged, 1, nullptr);
}
void CSimpleStatusBar::SetBarTexture(CSimpleTexture* texture, int32_t drawlayer) {
// No change
if (this->m_barTexture == texture) {
return;
}
if (this->m_barTexture) {
delete this->m_barTexture;
}
if (texture) {
texture->SetFrame(this, drawlayer, true);
texture->SetPoint(FRAMEPOINT_BOTTOMLEFT, this, FRAMEPOINT_BOTTOMLEFT, 0.0f, 0.0f, true);
texture->SetPoint(FRAMEPOINT_BOTTOMRIGHT, this, FRAMEPOINT_BOTTOMRIGHT, 0.0f, 0.0f, true);
texture->SetPoint(FRAMEPOINT_TOPLEFT, this, FRAMEPOINT_TOPLEFT, 0.0f, 0.0f, true);
texture->SetPoint(FRAMEPOINT_TOPRIGHT, this, FRAMEPOINT_TOPRIGHT, 0.0f, 0.0f, true);
}
this->m_barTexture = texture;
this->m_changed = true;
}
void CSimpleStatusBar::SetMinMaxValues(float min, float max) {
if (min > max) {
min = max;
}
// No change
if (this->m_rangeSet && this->m_minValue == min && this->m_maxValue == max) {
return;
}
this->m_minValue = min;
this->m_maxValue = max;
this->m_changed = true;
this->m_rangeSet = true;
this->RunOnMinMaxChangedScript();
if (this->m_valueSet) {
this->SetValue(this->m_value);
}
}
void CSimpleStatusBar::SetOrientation(ORIENTATION orientation) {
// TODO
}
void CSimpleStatusBar::SetRotatesTexture(int32_t enabled) {
// TODO
}
void CSimpleStatusBar::SetStatusBarColor(const CImVector& color) {
if (this->m_barTexture) {
this->m_barTexture->SetVertexColor(color);
}
}
void CSimpleStatusBar::SetValue(float value) {
if (!this->m_rangeSet) {
return;
}
// Clamp value
value = std::min(std::max(value, this->m_minValue), this->m_maxValue);
// No change
if (this->m_valueSet && this->m_value == value) {
return;
}
this->m_value = value;
this->m_changed = true;
this->m_valueSet = true;
this->RunOnValueChangedScript();
}

View File

@ -5,23 +5,55 @@
class CSimpleStatusBar : public CSimpleFrame {
public:
// Static variables
// Public static variables
static int32_t s_metatable;
static int32_t s_objectType;
// Static functions
// Public static functions
static void CreateScriptMetaTable();
static int32_t GetObjectType();
static void RegisterScriptMethods(lua_State* L);
// Member variables
// TODO
// Virtual member functions
// Public virtual member functions
virtual int32_t GetScriptMetaTable();
virtual ScriptIx* GetScriptByName(const char* name, ScriptData& data);
virtual bool IsA(int32_t type);
// TODO
virtual void OnLayerUpdate(float elapsedSec);
// TODO
virtual void SetValue(float value);
virtual void LoadXML(const XMLNode* node, CStatus* status);
// Member functions
CSimpleStatusBar(CSimpleFrame* parent);
// Public member functions
CSimpleStatusBar(CSimpleFrame* parent)
: CSimpleFrame(parent)
, m_changed(false)
, m_rangeSet(false)
, m_valueSet(false) {};
float GetAnimValue() const;
float GetMaxValue() const;
float GetMinValue() const;
float GetValue() const;
void RunOnMinMaxChangedScript();
void RunOnValueChangedScript();
void SetBarTexture(CSimpleTexture* texture, int32_t drawlayer);
void SetMinMaxValues(float min, float max);
void SetOrientation(ORIENTATION orientation);
void SetRotatesTexture(int32_t enabled);
void SetStatusBarColor(const CImVector& color);
protected:
// Protected member variables
uint32_t m_changed : 1;
uint32_t m_rangeSet : 1;
uint32_t m_valueSet : 1;
float m_minValue = 0.0f;
float m_maxValue = 0.0f;
float m_value = 0.0f;
CSimpleTexture* m_barTexture = nullptr;
ORIENTATION m_orientation = ORIENTATION_HORIZONTAL;
ScriptIx m_onValueChanged;
ScriptIx m_onMinMaxChanged;
};
#endif

View File

@ -1,5 +1,7 @@
#include "ui/simple/CSimpleStatusBarScript.hpp"
#include "ui/simple/CSimpleStatusBar.hpp"
#include "ui/FrameScript.hpp"
#include "util/Lua.hpp"
#include "util/Unimplemented.hpp"
namespace {
@ -13,19 +15,65 @@ int32_t CSimpleStatusBar_SetOrientation(lua_State* L) {
}
int32_t CSimpleStatusBar_GetMinMaxValues(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
auto type = CSimpleStatusBar::GetObjectType();
auto statusBar = static_cast<CSimpleStatusBar*>(FrameScript_GetObjectThis(L, type));
lua_pushnumber(L, statusBar->GetMinValue());
lua_pushnumber(L, statusBar->GetMaxValue());
return 2;
}
int32_t CSimpleStatusBar_SetMinMaxValues(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
auto type = CSimpleStatusBar::GetObjectType();
auto statusBar = static_cast<CSimpleStatusBar*>(FrameScript_GetObjectThis(L, type));
if (!lua_isnumber(L, 2) || !lua_isnumber(L, 3)) {
luaL_error(L, "Usage: %s:SetMinMaxValues(min, max)", statusBar->GetDisplayName());
return 0;
}
auto min = lua_tonumber(L, 2);
auto max = lua_tonumber(L, 3);
if (min < -1.0e12 || min > 1.0e12 || max < -1.0e12 || max > 1.0e12) {
luaL_error(L, "Min or Max out of range");
return 0;
}
if (max - min > 1.0e12) {
luaL_error(L, "Min and Max too far apart");
return 0;
}
statusBar->SetMinMaxValues(static_cast<float>(min), static_cast<float>(max));
return 0;
}
int32_t CSimpleStatusBar_GetValue(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
auto type = CSimpleStatusBar::GetObjectType();
auto statusBar = static_cast<CSimpleStatusBar*>(FrameScript_GetObjectThis(L, type));
lua_pushnumber(L, statusBar->GetValue());
return 1;
}
int32_t CSimpleStatusBar_SetValue(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
auto type = CSimpleStatusBar::GetObjectType();
auto statusBar = static_cast<CSimpleStatusBar*>(FrameScript_GetObjectThis(L, type));
if (!lua_isnumber(L, 2)) {
luaL_error(L, "Usage: %s:SetValue(value)", statusBar->GetDisplayName());
return 0;
}
auto value = static_cast<float>(lua_tonumber(L, 2));
statusBar->SetValue(value);
return 0;
}
int32_t CSimpleStatusBar_GetStatusBarTexture(lua_State* L) {
@ -41,7 +89,15 @@ int32_t CSimpleStatusBar_GetStatusBarColor(lua_State* L) {
}
int32_t CSimpleStatusBar_SetStatusBarColor(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
auto type = CSimpleStatusBar::GetObjectType();
auto statusBar = static_cast<CSimpleStatusBar*>(FrameScript_GetObjectThis(L, type));
CImVector color = {};
FrameScript_GetColor(L, 2, color);
statusBar->SetStatusBarColor(color);
return 0;
}
int32_t CSimpleStatusBar_GetRotatesTexture(lua_State* L) {

View File

@ -19,7 +19,25 @@ int32_t CSimpleTexture_GetDrawLayer(lua_State* L) {
}
int32_t CSimpleTexture_SetDrawLayer(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
auto type = CSimpleTexture::GetObjectType();
auto texture = static_cast<CSimpleTexture*>(FrameScript_GetObjectThis(L, type));
if (!lua_isstring(L, 2)) {
luaL_error(L, "Usage: %s:SetDrawLayer(\"layer\")", texture->GetDisplayName());
return 0;
}
auto drawlayerStr = lua_tostring(L, 2);
int32_t drawlayer = texture->m_drawlayer;
if (!StringToDrawLayer(drawlayerStr, drawlayer)) {
luaL_error(L, "Usage: %s:SetDrawLayer(\"layer\")", texture->GetDisplayName());
return 0;
}
texture->SetFrame(texture->m_parent, drawlayer, texture->m_shown);
return 0;
}
int32_t CSimpleTexture_GetBlendMode(lua_State* L) {

View File

@ -23,6 +23,8 @@ if(WHOA_SYSTEM_MAC)
"-framework AppKit"
"-framework Carbon"
"-framework IOKit"
"-framework Metal"
"-framework QuartzCore"
)
endif()