|
|
|
|
# Scorpio
|
|
|
|
|
|
|
|
|
|
The Scorpio Project is used to build an addon platform for World of Warcraft.
|
|
|
|
|
|
|
|
|
|
It's designed based on the [PLoop](https://github.com/kurapica/PLoop), although the Lib is created based on
|
|
|
|
|
the OOP system, it provided a pure functional programming style to easy the addon development.
|
|
|
|
|
|
|
|
|
|
The Scorpio provides several features to simple and power the addons:
|
|
|
|
|
|
|
|
|
|
1. A declarative functional programming style to register and handle the system events, secure hooks and slash commands.
|
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
-- Use a Scorpio Module to change the code environment
|
|
|
|
|
-- so the declarative functional style can be used
|
|
|
|
|
Scorpio "Test" ""
|
|
|
|
|
|
|
|
|
|
-- Register UNIT_SPELLCAST_START system event and bind its handler
|
|
|
|
|
__SystemEvent__()
|
|
|
|
|
function UNIT_SPELLCAST_START(unit, spell)
|
|
|
|
|
print(unit .. " cast " .. spell)
|
|
|
|
|
end
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
2. A full addon life-cycle management. Addons can split their features into several modules for management.
|
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
-- Addon Module can have sub-modules, the sub-modules can share all global variables defined in its parent module
|
|
|
|
|
Scorpio "Test.SubModule" ""
|
|
|
|
|
|
|
|
|
|
-- Triggered when the addon(module) and it's saved variables is loaded
|
|
|
|
|
function OnLoad()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Triggered when the addon(module) is enabled or player logined, so all player data can be accessed
|
|
|
|
|
function OnEnable()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Triggered when player specialization changed or player logined, we can check the player's specialization
|
|
|
|
|
function OnSpecChanged(spec)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Triggered when the addon(module) is disabled, normally no use, the module will disable its event handlers
|
|
|
|
|
-- when it's disabled.
|
|
|
|
|
function OnDisable()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Triggered when the player logout, we can modify the saved variables for the last time
|
|
|
|
|
function OnQuit()
|
|
|
|
|
end
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
3. An asynchronous framework to avoid the using of callbacks, and have all the asynchronous tasks controlled under
|
|
|
|
|
a task schedule system, so the FPS will be smooth and almost no dropping caused by the Lua codes.
|
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
Scorpio "Test" ""
|
|
|
|
|
|
|
|
|
|
-- So the endless task will be started when player logined
|
|
|
|
|
__Async__()
|
|
|
|
|
function OnEnable()
|
|
|
|
|
local count = 0
|
|
|
|
|
|
|
|
|
|
while true do
|
|
|
|
|
-- Delay the code execution for 10s, only works in
|
|
|
|
|
-- function with `__Async__` declaration
|
|
|
|
|
Delay(10)
|
|
|
|
|
|
|
|
|
|
count = count + 10
|
|
|
|
|
print("you have played for " .. count .. " sec")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
4. A new UI & Skin system, It'll split the functionality and display of the widgets, so we can create functionality
|
|
|
|
|
UIs in one addons, and let's other authors do the skin parts very easily.
|
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
Scorpio "Test" ""
|
|
|
|
|
|
|
|
|
|
Style[UIParent] = {
|
|
|
|
|
-- Here a fontstring will be created on the center of the screen
|
|
|
|
|
-- widget like Label are property child, they can be released and re-used
|
|
|
|
|
-- Change the code to `Label = NIL`, it'll be released and waiting for the next usage
|
|
|
|
|
-- So we don't need create those ui elements in the core logic, it's just a skin settings
|
|
|
|
|
-- We'll see more in the observable introduction
|
|
|
|
|
Label = {
|
|
|
|
|
location = { Anchor("CENTER") },
|
|
|
|
|
|
|
|
|
|
-- Bind the label's text to observe the player's unit health
|
|
|
|
|
-- Need lose some hp to trigger the UNIT_HEALTH event
|
|
|
|
|
text = Wow.FromEvent("UNIT_HEALTH") -- An observable generate from the UNIT_HEALTH event
|
|
|
|
|
:MatchUnit("player") -- A filter operation that only allow player
|
|
|
|
|
:Map(UnitHealth), -- A map operation that change the unit -> health
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
5. A well designed secure template framework, so we can enjoy the power of the secure template system provided by
|
|
|
|
|
the blizzard and stay away the hard part.
|
|
|
|
|
|
|
|
|
|
* Check the [Aim](https://www.curseforge.com/wow/addons/aim) for nameplates, use its defaultskin.lua can
|
|
|
|
|
simply change all the skins.
|
|
|
|
|
* Check the [AshToAsh](https://www.curseforge.com/wow/addons/ashtoash) for raid panel, it can smoothly relayout
|
|
|
|
|
during combat.
|
|
|
|
|
* Check the [ShadowDancer](https://www.curseforge.com/wow/addons/shadowdancer) for action bars, it provide
|
|
|
|
|
all your need for the action bars, also with special features.
|
|
|
|
|
* Check the [BagView](https://www.curseforge.com/wow/addons/bagview) for containers.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Documents
|
|
|
|
|
|
|
|
|
|
You can find the documents in [Scorpio Documents](https://github.com/kurapica/Scorpio/tree/master/Docs)
|