Fractured: Paragon core hooks, mod-paragon, mod-ale, Docker build cap
- Track mod-paragon and mod-ale (un-ignore modules in .gitignore). - Ship docker-compose.override.yml with CMAKE_EXTRA_OPTIONS for LuaJIT (mod-ale). - Dockerfile: CBUILD_PARALLEL default to limit OOM under Docker/WSL2. - Core: CLASS_PARAGON sticky combo points (DetachComboTarget), selection rebind, Spell::CheckPower rune path for multi-resource Paragon. - spell_dk_death_rune: IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY) for Blood of the North / Reaping / DRM on Paragon. - Remove temporary Paragon CheckPower logging. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,437 @@
|
||||
<div align="center">
|
||||
|
||||
# 🤝 Contributing to ALE
|
||||
|
||||
*Help improve the AzerothCore Lua Engine*
|
||||
|
||||
[](https://discord.com/invite/ZKSVREE7)
|
||||
[](https://github.com/azerothcore/mod-ale/issues)
|
||||
|
||||
---
|
||||
</div>
|
||||
|
||||
> [!IMPORTANT]
|
||||
> We welcome contributions from everyone! Whether you code or not, there are many ways to help improve ALE.
|
||||
|
||||
## 📋 Table of Contents
|
||||
|
||||
- [Ways to Contribute](#-ways-to-contribute)
|
||||
- [Contributing Code](#-contributing-code)
|
||||
- [Reporting Issues](#-reporting-issues)
|
||||
- [Improving Documentation](#-improving-documentation)
|
||||
- [Creating Scripts](#-creating-scripts)
|
||||
- [Development Guidelines](#-development-guidelines)
|
||||
|
||||
## 🌟 Ways to Contribute
|
||||
|
||||
You don't need to be a developer to contribute to ALE! Here are various ways you can help:
|
||||
|
||||
### 💻 For Developers
|
||||
|
||||
- **Fix Bugs**: Browse open issues and submit fixes
|
||||
- **Add Features**: Implement new functionality
|
||||
- **Improve Performance**: Optimize existing code
|
||||
- **Write Tests**: Help ensure code quality
|
||||
- **Review Pull Requests**: Provide feedback on proposed changes
|
||||
|
||||
### 📚 For Writers
|
||||
|
||||
- **Improve Documentation**: Fix typos, clarify explanations, add examples
|
||||
- **Write Tutorials**: Create guides for common use cases
|
||||
- **Translate**: Help make documentation available in other languages
|
||||
- **API Documentation**: Document undocumented functions
|
||||
|
||||
### 🎮 For Scripters
|
||||
|
||||
- **Create Example Scripts**: Share useful script templates
|
||||
- **Report Script Issues**: Help identify API problems
|
||||
- **Share Best Practices**: Document scripting patterns
|
||||
- **Test New Features**: Verify new functionality works as expected
|
||||
|
||||
### 💬 For Community Members
|
||||
|
||||
- **Answer Questions**: Help others on Discord or GitHub
|
||||
- **Report Bugs**: Submit detailed issue reports
|
||||
- **Test Releases**: Try pre-release versions and provide feedback
|
||||
- **Spread the Word**: Share ALE with other server administrators
|
||||
|
||||
## 💻 Contributing Code
|
||||
|
||||
### Getting Started
|
||||
|
||||
1. **[Set up Git](https://help.github.com/articles/set-up-git/)** if you haven't already
|
||||
|
||||
2. **[Fork the repository](https://help.github.com/articles/fork-a-repo/)** to your GitHub account:
|
||||
- Main repository: [mod-ale](https://github.com/azerothcore/mod-ale)
|
||||
- Core engine: [ALE source in mod-ale](https://github.com/azerothcore/mod-ale/tree/master/src/LuaEngine)
|
||||
|
||||
3. **Clone your fork** to your local machine:
|
||||
```bash
|
||||
git clone https://github.com/YOUR_USERNAME/mod-ale.git
|
||||
cd mod-ale
|
||||
```
|
||||
|
||||
4. **Add the upstream repository**:
|
||||
```bash
|
||||
git remote add upstream https://github.com/azerothcore/mod-ale.git
|
||||
```
|
||||
|
||||
### Development Workflow
|
||||
|
||||
1. **Create a feature branch** from `master`:
|
||||
```bash
|
||||
git checkout master
|
||||
git pull upstream master
|
||||
git checkout -b feature/my-awesome-feature
|
||||
```
|
||||
|
||||
2. **Make your changes**:
|
||||
- Write clean, readable code
|
||||
- Follow existing code style
|
||||
- Add comments where necessary
|
||||
- Test your changes thoroughly
|
||||
|
||||
3. **Commit your changes**:
|
||||
```bash
|
||||
git add .
|
||||
git commit -m "Add feature: description of what you did"
|
||||
```
|
||||
|
||||
**Commit Message Guidelines:**
|
||||
- Use clear, descriptive messages
|
||||
- Start with a verb (Add, Fix, Update, Remove, etc.)
|
||||
- Keep the first line under 50 characters
|
||||
- Add detailed explanation in subsequent lines if needed
|
||||
|
||||
```
|
||||
Add new Player:GetQuestStatus method
|
||||
|
||||
This method allows scripts to check the status of a player's quest
|
||||
without needing to retrieve the full quest object. This improves
|
||||
performance for common quest-checking scenarios.
|
||||
```
|
||||
|
||||
4. **Push to your fork**:
|
||||
```bash
|
||||
git push origin feature/my-awesome-feature
|
||||
```
|
||||
|
||||
5. **[Open a Pull Request](https://help.github.com/articles/using-pull-requests/)**:
|
||||
- Go to your fork on GitHub
|
||||
- Click "New Pull Request"
|
||||
- Select your feature branch
|
||||
- Provide a clear description of your changes
|
||||
- Link any related issues
|
||||
|
||||
### Code Style Guidelines
|
||||
|
||||
#### C++ Code
|
||||
|
||||
```cpp
|
||||
// Use clear, descriptive names
|
||||
int GetPlayerLevel(Player* player)
|
||||
{
|
||||
if (!player)
|
||||
return 0;
|
||||
|
||||
return player->getLevel();
|
||||
}
|
||||
|
||||
// Prefer modern C++ features
|
||||
std::vector<uint32> GetPlayerQuests(Player* player)
|
||||
{
|
||||
std::vector<uint32> quests;
|
||||
// ... implementation
|
||||
return quests;
|
||||
}
|
||||
```
|
||||
|
||||
**Key Points:**
|
||||
- Use 4 spaces for indentation (no tabs)
|
||||
- Opening braces on the same line for functions
|
||||
- Use meaningful variable names
|
||||
- Add comments for complex logic
|
||||
- Follow existing patterns in the codebase
|
||||
|
||||
#### Lua Code (for examples/tests)
|
||||
|
||||
```lua
|
||||
-- Use local variables
|
||||
local QUEST_STATUS_COMPLETE = 1
|
||||
|
||||
-- Clear, descriptive function names
|
||||
local function OnQuestComplete(event, player, quest)
|
||||
if not player or not quest then
|
||||
return
|
||||
end
|
||||
|
||||
local questId = quest:GetId()
|
||||
print("Player", player:GetName(), "completed quest", questId)
|
||||
end
|
||||
|
||||
-- Register with clear event IDs
|
||||
RegisterPlayerEvent(8, OnQuestComplete) -- PLAYER_EVENT_ON_QUEST_COMPLETE
|
||||
```
|
||||
|
||||
### Testing Your Changes
|
||||
|
||||
Before submitting a PR:
|
||||
|
||||
1. **Compile the code** without errors
|
||||
2. **Test basic functionality** with your changes
|
||||
3. **Test edge cases** (nil values, invalid input, etc.)
|
||||
4. **Verify no regressions** (existing features still work)
|
||||
5. **Test on a real server** if possible
|
||||
|
||||
## 🐛 Reporting Issues
|
||||
|
||||
Good bug reports help us fix problems faster!
|
||||
|
||||
### Before Reporting
|
||||
|
||||
1. **Search existing issues** to avoid duplicates
|
||||
2. **Test on latest version** to ensure it's not already fixed
|
||||
3. **Gather information** about your setup and the problem
|
||||
|
||||
### Creating a Good Issue Report
|
||||
|
||||
Use this template:
|
||||
|
||||
```markdown
|
||||
**Describe the bug**
|
||||
A clear description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Load script '...'
|
||||
2. Trigger event '...'
|
||||
3. See error
|
||||
|
||||
**Expected behavior**
|
||||
What you expected to happen.
|
||||
|
||||
**Actual behavior**
|
||||
What actually happened.
|
||||
|
||||
**Environment:**
|
||||
- AzerothCore version: [e.g., commit hash]
|
||||
- ALE version: [e.g., commit hash]
|
||||
- Lua version: [e.g., LuaJIT, Lua 5.2]
|
||||
- OS: [e.g., Ubuntu 20.04]
|
||||
|
||||
**Script/Code:**
|
||||
```lua
|
||||
-- Minimal script that reproduces the issue
|
||||
local function OnLogin(event, player)
|
||||
-- problematic code
|
||||
end
|
||||
RegisterPlayerEvent(3, OnLogin)
|
||||
```
|
||||
|
||||
**Error messages:**
|
||||
```
|
||||
Paste any error messages from the log here
|
||||
```
|
||||
|
||||
**Additional context**
|
||||
Any other information that might be helpful.
|
||||
```
|
||||
|
||||
## 📖 Improving Documentation
|
||||
|
||||
Documentation is crucial for helping users understand ALE.
|
||||
|
||||
### What to Document
|
||||
|
||||
- **API Functions**: Descriptions, parameters, return values, examples
|
||||
- **Events**: When they trigger, what parameters they pass
|
||||
- **Best Practices**: Common patterns and anti-patterns
|
||||
- **Examples**: Real-world use cases and complete scripts
|
||||
|
||||
### Documentation Workflow
|
||||
|
||||
1. Fork the repository
|
||||
2. Edit documentation files in the `docs/` folder
|
||||
3. Use clear, concise language
|
||||
4. Add code examples where helpful
|
||||
5. Test any code examples you include
|
||||
6. Submit a Pull Request
|
||||
|
||||
### Markdown Tips
|
||||
|
||||
```markdown
|
||||
# Use headers for structure
|
||||
|
||||
## Subsections help organize content
|
||||
|
||||
**Bold** for emphasis
|
||||
|
||||
`code` for inline code
|
||||
|
||||
```lua
|
||||
-- Code blocks for examples
|
||||
```
|
||||
|
||||
> [!TIP]
|
||||
> Use callouts for important information
|
||||
|
||||
- Lists
|
||||
- Keep
|
||||
- Things
|
||||
- Organized
|
||||
```
|
||||
|
||||
## 🎮 Creating Scripts
|
||||
|
||||
Share your scripts with the community!
|
||||
|
||||
### Where to Share
|
||||
|
||||
- **Discord**: [ALE Community](https://discord.com/invite/bx3y5Qmy)
|
||||
- **GitHub Discussions**: For detailed explanations
|
||||
- **Pull Requests**: Add example scripts to the repository
|
||||
|
||||
### Script Quality Guidelines
|
||||
|
||||
Good example scripts should:
|
||||
|
||||
1. **Be Well Commented**: Explain what the code does
|
||||
2. **Handle Edge Cases**: Check for nil values, validate input
|
||||
3. **Follow Best Practices**: Use local variables, cache data, etc.
|
||||
4. **Include Usage Instructions**: How to install and configure
|
||||
5. **Be Self-Contained**: Include all necessary code
|
||||
|
||||
### Example Template
|
||||
|
||||
```lua
|
||||
--[[
|
||||
Script Name: Player Welcome System
|
||||
Description: Sends customized welcome message based on player level
|
||||
Author: YourName
|
||||
Version: 1.0
|
||||
Date: 2025-01-09
|
||||
|
||||
Installation:
|
||||
1. Place this file in lua_scripts folder
|
||||
2. Configure MESSAGES table below
|
||||
3. Restart server
|
||||
|
||||
Features:
|
||||
- Different messages for different level ranges
|
||||
- Personalized with player name
|
||||
- Configurable message tiers
|
||||
]]
|
||||
|
||||
-- Configuration
|
||||
local MESSAGES = {
|
||||
[1] = "Welcome to the server, %s! Enjoy your adventure!",
|
||||
[10] = "Welcome back, %s! You've grown stronger!",
|
||||
[60] = "Greetings, veteran %s! The endgame awaits!",
|
||||
[80] = "Welcome, champion %s! You've mastered your class!"
|
||||
}
|
||||
|
||||
-- Get appropriate message for player level
|
||||
local function GetWelcomeMessage(player)
|
||||
local level = player:GetLevel()
|
||||
local message = MESSAGES[1] -- Default message
|
||||
|
||||
-- Find highest tier message player qualifies for
|
||||
for minLevel, msg in pairs(MESSAGES) do
|
||||
if level >= minLevel then
|
||||
message = msg
|
||||
end
|
||||
end
|
||||
|
||||
return string.format(message, player:GetName())
|
||||
end
|
||||
|
||||
-- Event handler
|
||||
local function OnLogin(event, player)
|
||||
if not player then
|
||||
return
|
||||
end
|
||||
|
||||
local message = GetWelcomeMessage(player)
|
||||
player:SendBroadcastMessage(message)
|
||||
end
|
||||
|
||||
-- Register the event
|
||||
RegisterPlayerEvent(3, OnLogin) -- PLAYER_EVENT_ON_LOGIN
|
||||
```
|
||||
|
||||
## 🔨 Development Guidelines
|
||||
|
||||
### Project Structure
|
||||
|
||||
```
|
||||
mod-ale/
|
||||
├── src/
|
||||
│ └── LuaEngine/ # Core ALE source code
|
||||
│ ├── docs/ # Source documentation
|
||||
│ ├── methods/ # API method implementations
|
||||
│ └── hooks/ # Event hook implementations
|
||||
├── docs/ # User-facing documentation
|
||||
├── conf/ # Configuration file templates
|
||||
└── README.md # Project overview
|
||||
```
|
||||
|
||||
### Branch Strategy
|
||||
|
||||
- **master**: Stable, production-ready code
|
||||
- **feature/**: New features (e.g., `feature/add-new-hook`)
|
||||
- **fix/**: Bug fixes (e.g., `fix/player-null-check`)
|
||||
- **docs/**: Documentation updates (e.g., `docs/update-install-guide`)
|
||||
|
||||
### Pull Request Guidelines
|
||||
|
||||
**Good PR:**
|
||||
- Single, focused change
|
||||
- Clear title and description
|
||||
- Links related issues
|
||||
- Passes compilation
|
||||
- Includes documentation updates if needed
|
||||
|
||||
**PR Template:**
|
||||
|
||||
```markdown
|
||||
## Description
|
||||
Brief description of the changes
|
||||
|
||||
## Type of Change
|
||||
- [ ] Bug fix
|
||||
- [ ] New feature
|
||||
- [ ] Documentation update
|
||||
- [ ] Performance improvement
|
||||
|
||||
## Testing
|
||||
Describe how you tested your changes
|
||||
|
||||
## Related Issues
|
||||
Fixes #123
|
||||
Related to #456
|
||||
|
||||
## Checklist
|
||||
- [ ] Code compiles without errors
|
||||
- [ ] Tested on a running server
|
||||
- [ ] Updated documentation
|
||||
- [ ] Followed code style guidelines
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🌟 Acknowledgements
|
||||
|
||||
ALE is built upon the foundation of the [Eluna Lua Engine](https://github.com/ElunaLuaEngine/Eluna). We acknowledge and thank the Eluna team for their pioneering work in Lua scripting for World of Warcraft server emulators.
|
||||
|
||||
- **[Original Eluna Repository](https://github.com/ElunaLuaEngine/Eluna)**
|
||||
- **[Eluna Discord Community](https://discord.gg/bjkCVWqqfX)**
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
<sub>Developed with ❤️ by the AzerothCore and ALE community</sub>
|
||||
|
||||
Thank you for contributing! 🎉
|
||||
|
||||
[⬆ Back to Top](#-contributing-to-ale)
|
||||
</div>
|
||||
Reference in New Issue
Block a user