feat: move mod-eluna-lua-engine to Eluna fork

feat: move mod-eluna-lua-engine to Eluna fork
This commit is contained in:
55Honey
2022-03-28 18:09:48 +02:00
committed by GitHub
174 changed files with 21828 additions and 30 deletions

View File

@@ -5,3 +5,4 @@ indent_size = 4
tab_width = 4 tab_width = 4
insert_final_newline = true insert_final_newline = true
trim_trailing_whitespace = true trim_trailing_whitespace = true
max_line_length = 80

49
.git_commit_template.txt Normal file
View File

@@ -0,0 +1,49 @@
### TITLE
## Type(Scope/Subscope): Commit ultra short explanation
## |---- Write below the examples with a maximum of 50 characters ----|
## Example 1: fix(DB/SAI): Missing spell to NPC Hogger
## Example 2: fix(CORE/Raid): Phase 2 of Ragnaros
## Example 3: feat(CORE/Commands): New GM command to do something
### DESCRIPTION
## Explain why this change is being made, what does it fix etc...
## |---- Write below the examples with a maximum of 72 characters per lines ----|
## Example: Hogger (id: 492) was not charging player when being engaged.
## Provide links to any issue, commit, pull request or other resource
## Example 1: Closes issue #23
## Example 2: Ported from other project's commit (link)
## Example 3: References taken from wowpedia / wowhead / wowwiki / https://wowgaming.altervista.org/aowow/
## =======================================================
## EXTRA INFOS
## =======================================================
## "Type" can be:
## feat (new feature)
## fix (bug fix)
## refactor (refactoring production code)
## style (formatting, missing semi colons, etc; no code change)
## docs (changes to documentation)
## test (adding or refactoring tests; no production code change)
## chore (updating bash scripts, git files etc; no production code change)
## --------------------
## Remember to
## Capitalize the subject line
## Use the imperative mood in the subject line
## Do not end the subject line with a period
## Separate subject from body with a blank line
## Use the body to explain what and why rather than how
## Can use multiple lines with "-" for bullet points in body
## --------------------
## More info here https://www.conventionalcommits.org/en/v1.0.0-beta.2/
## =======================================================
## "Scope" can be:
## CORE (core related, c++)
## DB (database related, sql)
## =======================================================
## "Subscope" is optional and depends on the nature of the commit.
## =======================================================

105
.gitattributes vendored Normal file
View File

@@ -0,0 +1,105 @@
## AUTO-DETECT
## Handle line endings automatically for files detected as
## text and leave all files detected as binary untouched.
## This will handle all files NOT defined below.
* text=auto eol=lf
# Text
*.conf text
*.conf.dist text
*.cmake text
## Scripts
*.sh text
*.fish text
*.lua text
## SQL
*.sql text
## C++
*.c text
*.cc text
*.cxx text
*.cpp text
*.c++ text
*.hpp text
*.h text
*.h++ text
*.hh text
## For documentation
# Documents
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain
## DOCUMENTATION
*.markdown text
*.md text
*.mdwn text
*.mdown text
*.mkd text
*.mkdn text
*.mdtxt text
*.mdtext text
*.txt text
AUTHORS text
CHANGELOG text
CHANGES text
CONTRIBUTING text
COPYING text
copyright text
*COPYRIGHT* text
INSTALL text
license text
LICENSE text
NEWS text
readme text
*README* text
TODO text
## GRAPHICS
*.ai binary
*.bmp binary
*.eps binary
*.gif binary
*.ico binary
*.jng binary
*.jp2 binary
*.jpg binary
*.jpeg binary
*.jpx binary
*.jxr binary
*.pdf binary
*.png binary
*.psb binary
*.psd binary
*.svg text
*.svgz binary
*.tif binary
*.tiff binary
*.wbmp binary
*.webp binary
## ARCHIVES
*.7z binary
*.gz binary
*.jar binary
*.rar binary
*.tar binary
*.zip binary
## EXECUTABLES
*.exe binary
*.pyc binary

44
.github/workflows/core_build.yml vendored Normal file
View File

@@ -0,0 +1,44 @@
name: core-build
on:
push:
pull_request:
jobs:
build:
strategy:
fail-fast: false
matrix:
compiler: [clang]
runs-on: ubuntu-latest
name: ${{ matrix.compiler }}
env:
COMPILER: ${{ matrix.compiler }}
steps:
- uses: actions/checkout@v2
with:
repository: 'azerothcore/azerothcore-wotlk'
ref: 'master'
submodules: 'recursive'
- uses: actions/checkout@v2
with:
path: 'modules/mod-eluna'
- name: Cache
uses: actions/cache@v1.1.2
with:
path: /home/runner/.ccache
key: ccache:${{ matrix.compiler }}:${{ github.ref }}:${{ github.sha }}
restore-keys: |
ccache:${{ matrix.compiler }}:${{ github.ref }}
ccache:${{ matrix.compiler }}
- name: Configure OS
run: source ./apps/ci/ci-install.sh
env:
CONTINUOUS_INTEGRATION: true
- name: Import db
run: source ./apps/ci/ci-import-db.sh
- name: Build
run: source ./apps/ci/ci-compile.sh
- name: Dry run
run: source ./apps/ci/ci-worldserver-dry-run.sh
- name: Check startup errors
run: source ./apps/ci/ci-error-check.sh

43
.gitignore vendored
View File

@@ -1,5 +1,48 @@
!.gitignore
#
#Generic
#
.directory
.mailmap
*.orig *.orig
*.rej *.rej
*.*~
.hg/
*.kdev*
.DS_Store
CMakeLists.txt.user
*.bak *.bak
*.patch *.patch
*.diff *.diff
*.REMOTE.*
*.BACKUP.*
*.BASE.*
*.LOCAL.*
#
# IDE & other softwares
#
/.settings/
/.externalToolBuilders/*
# exclude in all levels
nbproject/
.sync.ffs_db
*.kate-swp
#
# Eclipse
#
*.pydevproject
.metadata
.gradle
tmp/
*.tmp
*.swp
*~.nib
local.properties
.settings/
.loadpath
.project
.cproject

View File

@@ -1,4 +1,4 @@
### [![Eluna](docs/Eluna.png)](https://github.com/ElunaLuaEngine/Eluna) ### [![Eluna](src/LuaEngine/docs/Eluna.png)](https://github.com/ElunaLuaEngine/Eluna)
## About ## About
@@ -6,47 +6,63 @@ Eluna Lua Engine © is a lua engine embedded to World of Warcraft emulators.
We are currently working hard to make Eluna better from inside and outside. We are currently working hard to make Eluna better from inside and outside.
If you are having trouble with installation or scripts, please feel free to open an issue. If you are having trouble with installation or scripts, please feel free to open an issue.
For documentation and reference see [Eluna API](http://elunaluaengine.github.io/) and [Lua reference manual](http://www.lua.org/manual/5.2/). For documentation and reference see [Eluna API (AC version)](https://www.azerothcore.org/pages/eluna/index.html) and [Lua reference manual](http://www.lua.org/manual/5.2/).
Special thanks to [MaNGOS](http://getmangos.eu/) for their continued support and use of Eluna. Please head over to their forums and show them some love!
## Community ## Community
You can join the official Eluna Discord server, where you'll be able to find resources, releases and support provided by the community. You can join the official Eluna Discord server, where you'll be able to find resources, releases and support provided by the community:
<a href="https://discord.gg/bjkCVWqqfX"> <a href="https://discord.gg/bjkCVWqqfX">
<img src="https://img.shields.io/badge/discord-join-7289DA.svg?logo=discord&longCache=true&style=flat" /> <img src="https://img.shields.io/badge/discord-join-7289DA.svg?logo=discord&longCache=true&style=flat" />
</a> </a>
The official Azerothcore Discord server offers a channel dedicated to lua development as well:
<a href="https://discord.gg/gkt4y2x">
<img src="https://img.shields.io/badge/discord-join-7289DA.svg?logo=discord&longCache=true&style=flat" />
</a>
# ![logo](https://raw.githubusercontent.com/azerothcore/azerothcore.github.io/master/images/logo-github.png) mod-eluna for AzerothCore
- Latest build status with azerothcore: [![Build Status](https://github.com/azerothcore/mod-eluna-lua-engine/workflows/core-build/badge.svg?branch=master&event=push)](https://github.com/azerothcore/mod-eluna-lua-engine)
[english](README.md) | [中文说明](README_CN.md) | [Español](README_ES.md)
An [Eluna](https://github.com/ElunaLuaEngine/Eluna) module for AzerothCore.
## How to install:
### 1) Download the sources
You can get the sources using git.
#### download with git
1. open a terminal inside your `azerothcore-wotlk` folder
2. go inside the **modules** folder: `cd modules`
3. download the module sources using:
```
git clone https://github.com/azerothcore/Eluna.git mod-eluna
```
### 2) Build
You need to run the cmake again and rebuild the project.
Eluna API for AC:
[https://www.azerothcore.org/pages/eluna/index.html](https://www.azerothcore.org/pages/eluna/index.html)
## Documentation ## Documentation
* [__Installation__](https://github.com/ElunaLuaEngine/Eluna/blob/master/docs/INSTALL.md)
* [Getting started](https://github.com/ElunaLuaEngine/Eluna/blob/master/docs/USAGE.md) * [Getting started](https://github.com/ElunaLuaEngine/Eluna/blob/master/docs/USAGE.md)
* [Eluna features](https://github.com/ElunaLuaEngine/Eluna/blob/master/docs/IMPL_DETAILS.md) * [Eluna features](https://github.com/ElunaLuaEngine/Eluna/blob/master/docs/IMPL_DETAILS.md)
* [Function documentation](http://elunaluaengine.github.io/) * [Function documentation (AC version)](https://www.azerothcore.org/pages/eluna/index.html)
* [Hook documentation](https://github.com/ElunaLuaEngine/Eluna/blob/master/Hooks.h) * [Hook documentation](https://github.com/ElunaLuaEngine/Eluna/blob/master/Hooks.h)
* [Lua reference manual](http://www.lua.org/manual/5.2/) * [Lua reference manual](http://www.lua.org/manual/5.2/)
* [Forum - support, releases, guides](https://www.getmangos.eu/forums/forum/119-eluna-central/) * [Forum - support, releases, guides](https://www.getmangos.eu/forums/forum/119-eluna-central/)
* [Example scripts](https://github.com/ElunaLuaEngine/Scripts) * [Example scripts](https://github.com/ElunaLuaEngine/Scripts)
* [Contributing](https://github.com/ElunaLuaEngine/Eluna/blob/master/docs/CONTRIBUTING.md) * [Contributing](https://github.com/ElunaLuaEngine/Eluna/blob/master/docs/CONTRIBUTING.md)
## Source
Eluna source code: [Source](https://github.com/ElunaLuaEngine/Eluna)
Core forks with required modifications for Eluna:
[![Build Status](https://api.travis-ci.org/mangoszero/server.svg)](https://travis-ci.org/mangoszero/server) [Official MaNGOS Zero with Eluna](https://github.com/mangoszero/server)
[![Build Status](https://api.travis-ci.org/mangosone/server.svg)](https://travis-ci.org/mangosone/server) [Official MaNGOS One with Eluna](https://github.com/mangosone/server)
[![Build Status](https://api.travis-ci.org/mangostwo/server.svg)](https://travis-ci.org/mangostwo/server) [Official MaNGOS Two with Eluna](https://github.com/mangostwo/server)
[![Build Status](https://travis-ci.org/ElunaLuaEngine/ElunaTrinityWotlk.png?branch=master)](https://travis-ci.org/ElunaLuaEngine/ElunaTrinityWotlk) [Eluna TrinityCore WotLK](https://github.com/ElunaLuaEngine/ElunaTrinityWotlk)
[![Build Status](https://travis-ci.org/ElunaLuaEngine/ElunaMangosClassic.png?branch=master)](https://travis-ci.org/ElunaLuaEngine/ElunaMangosClassic) [Eluna cMaNGOS Classic](https://github.com/ElunaLuaEngine/ElunaMangosClassic)
[![Build Status](https://travis-ci.org/ElunaLuaEngine/ElunaMangosTbc.png?branch=master)](https://travis-ci.org/ElunaLuaEngine/ElunaMangosTbc) [Eluna cMaNGOS TBC](https://github.com/ElunaLuaEngine/ElunaMangosTbc)
[![Build Status](https://travis-ci.org/ElunaLuaEngine/ElunaMangosWotlk.png?branch=master)](https://travis-ci.org/ElunaLuaEngine/ElunaMangosWotlk) [Eluna cMaNGOS WotLK](https://github.com/ElunaLuaEngine/ElunaMangosWotlk)
Core plugin modules for Eluna:
- [AzerothCore Eluna Module](https://github.com/azerothcore/mod-eluna-lua-engine)
## Links ## Links
@@ -57,10 +73,26 @@ Core plugin modules for Eluna:
* [Lua.org](http://www.lua.org/) * [Lua.org](http://www.lua.org/)
* [License](https://github.com/ElunaLuaEngine/Eluna/blob/master/docs/LICENSE.md) * [License](https://github.com/ElunaLuaEngine/Eluna/blob/master/docs/LICENSE.md)
## Team
* [Tommy (Easelm)](https://github.com/Easelm) ## Additions from Eluna/master
* [Foereaper](https://github.com/Foereaper)
* [Rochet2](https://github.com/Rochet2) - Added HttpRequest method. https://github.com/azerothcore/Eluna/pull/2
* [Salja](https://github.com/Salja) - Added RegisterPlayerEvent 43: `OnBeforePetAddedToWorld()` fires for pets and summoned creatures. https://github.com/azerothcore/Eluna/pull/3
* [Patman64](https://github.com/Patman64) - Added Chat-Handler methods to player events. https://github.com/azerothcore/Eluna/pull/23
- Exposed `ModifyThreatPct()`. https://github.com/azerothcore/Eluna/pull/25
## How to update the Eluna version (for project mainteners)
1) `cd` into `mod-eluna-lua-engine`
2) `git checkout master`
3) cd `LuaEngine`
4) `git checkout master`
5) `git pull`
6) `cd ..` so you get back to `mod-eluna-lua-engine`
7) `git checkout -b some-new-unique-branch-name`
8) `git add LuaEngine`
9) `git commit -m "feat: update Eluna version"`
10) `git push`
11) The terminal will tell you something like `fatal: The current branch some-new-unique-branch-name has no upstream branch.` and suggest the command to use, for example: `git push --set-upstream origin some-new-unique-branch-name`
12) Open [the repo on Github](https://github.com/azerothcore/mod-eluna-lua-engine) and create a new PR

50
README_CN.md Normal file
View File

@@ -0,0 +1,50 @@
# 本译文源于一个过期的版本。
##
##
##
##
# ![logo](https://raw.githubusercontent.com/azerothcore/azerothcore.github.io/master/images/logo-github.png) mod-eluna-lua-engine for AzerothCore
- 最新版本在Azerothcore的构建状态: [![Build Status](https://github.com/azerothcore/mod-eluna-lua-engine/workflows/core-build/badge.svg?branch=master&event=push)](https://github.com/azerothcore/mod-eluna-lua-engine)
[english](README.md) | [中文说明](README_CN.md) | [Español](README_ES.md)
一个用于Azerothcore的[Eluna](https://github.com/ElunaLuaEngine/Eluna)模块.
## 如何安装:
### 1) 下载源码
你可以使用git(推荐)或手动下载源代码的方法安装。
#### 使用git(推荐)下载
1. 在你的`azerothcore-wotlk`源码文件夹中打开命令行(win的用户进入目录后shift+鼠标右键可以通过右键菜单打开)
2. 进入 **modules** 文件夹,命令行中输入: `cd modules`
3. 下载模块源码:
```
git clone https://github.com/azerothcore/mod-eluna-lua-engine.git
```
4. 下载模块源码后进入文件夹 **mod-eluna-lua-engine**,命令行中输入: `cd mod-eluna-lua-engine`
5. 下载Eluna源码,命令行中输入: `git submodule update --init`
可选: 模块中集成的Eluna是稳定版本,如果你要更新Eluna到最新版本,你可以进入目录**LuaEngine**(命令行输入:`cd LuaEngine`),进入后输入`git pull`获取即可更新最新版本.
请注意,最新版本可能和稳定版的源码不匹配.视情况可能需要自行修正.
#### 手动下载
1. 下载 [mod-eluna-lua-engine](https://github.com/azerothcore/mod-eluna-lua-engine/archive/master.zip)
2. 解压到你的`azerothcore-wotlk`源码中的**modules**文件夹中,请确保路径看起来是这样的`azerothcore-wotlk/modules/mod-eluna-lua-engine`
3. 下载 [Eluna](https://github.com/azerothcore/Eluna/archive/master.zip)
4. 把文件解压到 `mod-eluna-lua-engine/LuaEngine`. `LuaEngine.h`这个文件的路径看起来应该是这样的`mod-eluna-lua-engine/LuaEngine/LuaEngine.h`.
### 2) 生成
你需要重新CMake并重新生成你的项目.
Eluna API :
[http://elunaluaengine.github.io/](http://elunaluaengine.github.io/)
Eluna 中文文档(重构):
[http://wiki.uiwow.com/doku.php/eluna:start](http://wiki.uiwow.com/doku.php/eluna:start)

26
README_ES.md Normal file
View File

@@ -0,0 +1,26 @@
# Esta traducción proviene de una versión desactualizada.
##
##
##
##
# mod-LuaEngine
[English](README.md) | [中文说明](README_CN.md) | [Español](README_ES.md)
Un módulo de Eluna para AzerothCore.
Cómo instalar:
1. Descargar o clonar este módulo:
> [Descargar archivo zip](https://github.com/azerothcore/mod-eluna-lua-engine/archive/master.zip)
> o clonar `git clone https://github.com/azerothcore/mod-eluna-lua-engine.git`
2. Póngalo en la carpeta de módulos del Azerothcore.
> $HOME/azerothcore/modules/
3. Descargar o clonar el archivo central de ELUNA:
> [Descargar archivo zip](https://github.com/ElunaLuaEngine/Eluna/archive/master.zip)
> o clonar `git clone https://github.com/ElunaLuaEngine/Eluna.git .`
4. Dentro de la carpeta del módulo de Eluna de Azeroth, se encuentra una carpeta / directorio llamado: `LuaEngine` (mod-eluna-lua-engine/LuaEngine). Debe depositar los ficheros de lua, directamente dentro de esa carpeta. Los archivos directamente, no un directorio y luego los ficheros dentro. Por eso te utiliza el “.” cuando se está clonando, para que no genere un directorio nuevo.
5. Una vez copiado los ficheros y descargado el modulo, debes volver a compilar. Si seguiste la guía de instalación, debiste haber generado un directorio build, dentro de azerothcore. Dirígete a él y realiza la compilación como lo menciona en la guía.
Eluna API :
[http://elunaluaengine.github.io/](http://elunaluaengine.github.io/)

1
_config.yml Normal file
View File

@@ -0,0 +1 @@
theme: jekyll-theme-architect

View File

@@ -0,0 +1,114 @@
[worldserver]
###################################################################################################
# ELUNA SETTINGS
#
# Eluna.Enabled
# Description: Enable or disable Eluna LuaEngine
# Default: true - (enabled)
# false - (disabled)
#
# Eluna.TraceBack
# Description: Sets whether to use debug.traceback function on a lua error or not.
# Notice that you can redefine the function.
# Default: false - (use default error output)
# true - (use debug.traceback function)
#
# Eluna.ScriptPath
# Description: Sets the location of the script folder to load scripts from
# The path can be relative or absolute.
# Default: "lua_scripts"
#
Eluna.Enabled = true
Eluna.TraceBack = false
Eluna.ScriptPath = "lua_scripts"
###################################################################################################
# LOGGING SYSTEM SETTINGS
#
# Appender config values: Given an appender "name"
# Appender.name
# Description: Defines 'where to log'.
# Format: Type,LogLevel,Flags,optional1,optional2,optional3
#
# Type
# 0 - (None)
# 1 - (Console)
# 2 - (File)
# 3 - (DB)
#
# LogLevel
# 0 - (Disabled)
# 1 - (Fatal)
# 2 - (Error)
# 3 - (Warning)
# 4 - (Info)
# 5 - (Debug)
# 6 - (Trace)
#
# Flags:
# 0 - None
# 1 - Prefix Timestamp to the text
# 2 - Prefix Log Level to the text
# 4 - Prefix Log Filter type to the text
# 8 - Append timestamp to the log file name. Format: YYYY-MM-DD_HH-MM-SS
# (Only used with Type = 2)
# 16 - Make a backup of existing file before overwrite
# (Only used with Mode = w)
#
# Colors (read as optional1 if Type = Console)
# Format: "fatal error warn info debug trace"
# 0 - BLACK
# 1 - RED
# 2 - GREEN
# 3 - BROWN
# 4 - BLUE
# 5 - MAGENTA
# 6 - CYAN
# 7 - GREY
# 8 - YELLOW
# 9 - LRED
# 10 - LGREEN
# 11 - LBLUE
# 12 - LMAGENTA
# 13 - LCYAN
# 14 - WHITE
# Example: "1 9 3 6 5 8"
#
# File: Name of the file (read as optional1 if Type = File)
# Allows to use one "%s" to create dynamic files
#
# Mode: Mode to open the file (read as optional2 if Type = File)
# a - (Append)
# w - (Overwrite)
#
# MaxFileSize: Maximum file size of the log file before creating a new log file
# (read as optional3 if Type = File)
# Size is measured in bytes expressed in a 64-bit unsigned integer.
# Maximum value is 4294967295 (4 GB). Leave blank for no limit.
# NOTE: Does not work with dynamic filenames.
# Example: 536870912 (512 MB)
#
Appender.ElunaLog=2,5,0,eluna.log,w
Appender.ElunaConsole=1,4,0,"0 9 0 3 5 0"
# Logger config values: Given a logger "name"
# Logger.name
# Description: Defines 'What to log'
# Format: LogLevel,AppenderList
#
# LogLevel
# 0 - (Disabled)
# 1 - (Fatal)
# 2 - (Error)
# 3 - (Warning)
# 4 - (Info)
# 5 - (Debug)
# 6 - (Trace)
#
# AppenderList: List of appenders linked to logger
# (Using spaces as separator).
#
Logger.eluna=6,ElunaLog ElunaConsole

BIN
icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

24
sql/README.md Normal file
View File

@@ -0,0 +1,24 @@
# BEST PRACTICES
## Create a new table
**Example:**
```
CREATE TABLE IF NOT EXISTS `table`(
`id` int(11) unsigned NOT NULL,
`active` BOOLEAN DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
**Boolean datatype in mysql:**
Use "TinyInt(1)"" or "Boolean" (this is the same thing)
"bit(1)" can also work, but it may require a syntax like b'(0) and b'(1) when inserting (not sure).
If there are multiple booleans in the same table, bit(1) is better, otherwise it's the same result.
## Resources
https://www.w3schools.com/sql/sql_datatypes.asp

0
sql/auth/.gitkeep Normal file
View File

0
sql/characters/.gitkeep Normal file
View File

0
sql/world/.gitkeep Normal file
View File

947
src/ElunaLuaEngine_SC.cpp Normal file
View File

@@ -0,0 +1,947 @@
/*
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Chat.h"
#include "ElunaEventMgr.h"
#include "Log.h"
#include "LuaEngine.h"
#include "Pet.h"
#include "Player.h"
#include "ScriptMgr.h"
#include "ScriptedGossip.h"
class Eluna_AllCreatureScript : public AllCreatureScript
{
public:
Eluna_AllCreatureScript() : AllCreatureScript("Eluna_AllCreatureScript") { }
// Creature
bool CanCreatureGossipHello(Player* player, Creature* creature) override
{
if (sEluna->OnGossipHello(player, creature))
return true;
return false;
}
bool CanCreatureGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override
{
if (sEluna->OnGossipSelect(player, creature, sender, action))
return true;
return false;
}
bool CanCreatureGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code) override
{
if (sEluna->OnGossipSelectCode(player, creature, sender, action, code))
return true;
return false;
}
void OnCreatureAddWorld(Creature* creature) override
{
sEluna->OnAddToWorld(creature);
if (creature->IsGuardian() && creature->ToTempSummon() && creature->ToTempSummon()->GetSummonerGUID().IsPlayer())
sEluna->OnPetAddedToWorld(creature->ToTempSummon()->GetSummonerUnit()->ToPlayer(), creature);
}
void OnCreatureRemoveWorld(Creature* creature) override
{
sEluna->OnRemoveFromWorld(creature);
}
bool CanCreatureQuestAccept(Player* player, Creature* creature, Quest const* quest) override
{
sEluna->OnQuestAccept(player, creature, quest);
return false;
}
bool CanCreatureQuestReward(Player* player, Creature* creature, Quest const* quest, uint32 opt) override
{
if (sEluna->OnQuestReward(player, creature, quest, opt))
{
ClearGossipMenuFor(player);
return true;
}
return false;
}
CreatureAI* GetCreatureAI(Creature* creature) const override
{
if (CreatureAI* luaAI = sEluna->GetAI(creature))
return luaAI;
return nullptr;
}
};
class Eluna_AllGameObjectScript : public AllGameObjectScript
{
public:
Eluna_AllGameObjectScript() : AllGameObjectScript("Eluna_AllGameObjectScript") { }
void OnGameObjectAddWorld(GameObject* go) override
{
sEluna->OnAddToWorld(go);
}
void OnGameObjectRemoveWorld(GameObject* go) override
{
sEluna->OnRemoveFromWorld(go);
}
void OnGameObjectUpdate(GameObject* go, uint32 diff) override
{
sEluna->UpdateAI(go, diff);
}
bool CanGameObjectGossipHello(Player* player, GameObject* go) override
{
if (sEluna->OnGossipHello(player, go))
return true;
if (sEluna->OnGameObjectUse(player, go))
return true;
return false;
}
void OnGameObjectDamaged(GameObject* go, Player* player) override
{
sEluna->OnDamaged(go, player);
}
void OnGameObjectDestroyed(GameObject* go, Player* player) override
{
sEluna->OnDestroyed(go, player);
}
void OnGameObjectLootStateChanged(GameObject* go, uint32 state, Unit* /*unit*/) override
{
sEluna->OnLootStateChanged(go, state);
}
void OnGameObjectStateChanged(GameObject* go, uint32 state) override
{
sEluna->OnGameObjectStateChanged(go, state);
}
bool CanGameObjectQuestAccept(Player* player, GameObject* go, Quest const* quest) override
{
sEluna->OnQuestAccept(player, go, quest);
return false;
}
bool CanGameObjectGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action) override
{
if (sEluna->OnGossipSelect(player, go, sender, action))
return true;
return false;
}
bool CanGameObjectGossipSelectCode(Player* player, GameObject* go, uint32 sender, uint32 action, const char* code) override
{
if (sEluna->OnGossipSelectCode(player, go, sender, action, code))
return true;
return false;
}
bool CanGameObjectQuestReward(Player* player, GameObject* go, Quest const* quest, uint32 opt) override
{
if (sEluna->OnQuestAccept(player, go, quest))
return false;
if (sEluna->OnQuestReward(player, go, quest, opt))
return false;
return true;
}
GameObjectAI* GetGameObjectAI(GameObject* go) const override
{
sEluna->OnSpawn(go);
return nullptr;
}
};
class Eluna_AllItemScript : public AllItemScript
{
public:
Eluna_AllItemScript() : AllItemScript("Eluna_AllItemScript") { }
bool CanItemQuestAccept(Player* player, Item* item, Quest const* quest) override
{
if (sEluna->OnQuestAccept(player, item, quest))
return false;
return true;
}
bool CanItemUse(Player* player, Item* item, SpellCastTargets const& targets) override
{
if (!sEluna->OnUse(player, item, targets))
return true;
return false;
}
bool CanItemExpire(Player* player, ItemTemplate const* proto) override
{
if (sEluna->OnExpire(player, proto))
return false;
return true;
}
bool CanItemRemove(Player* player, Item* item) override
{
if (sEluna->OnRemove(player, item))
return false;
return true;
}
void OnItemGossipSelect(Player* player, Item* item, uint32 sender, uint32 action) override
{
sEluna->HandleGossipSelectOption(player, item, sender, action, "");
}
void OnItemGossipSelectCode(Player* player, Item* item, uint32 sender, uint32 action, const char* code) override
{
sEluna->HandleGossipSelectOption(player, item, sender, action, code);
}
};
class Eluna_AllMapScript : public AllMapScript
{
public:
Eluna_AllMapScript() : AllMapScript("Eluna_AllMapScript") { }
void OnBeforeCreateInstanceScript(InstanceMap* instanceMap, InstanceScript* instanceData, bool /*load*/, std::string /*data*/, uint32 /*completedEncounterMask*/) override
{
instanceData = sEluna->GetInstanceData(instanceMap);
}
void OnDestroyInstance(MapInstanced* /*mapInstanced*/, Map* map) override
{
sEluna->FreeInstanceId(map->GetInstanceId());
}
void OnCreateMap(Map* map) override
{
sEluna->OnCreate(map);
}
void OnDestroyMap(Map* map) override
{
sEluna->OnDestroy(map);
}
void OnPlayerEnterAll(Map* map, Player* player) override
{
sEluna->OnPlayerEnter(map, player);
}
void OnPlayerLeaveAll(Map* map, Player* player) override
{
sEluna->OnPlayerLeave(map, player);
}
void OnMapUpdate(Map* map, uint32 diff) override
{
sEluna->OnUpdate(map, diff);
}
};
class Eluna_AuctionHouseScript : public AuctionHouseScript
{
public:
Eluna_AuctionHouseScript() : AuctionHouseScript("Eluna_AuctionHouseScript") { }
void OnAuctionAdd(AuctionHouseObject* ah, AuctionEntry* entry) override
{
sEluna->OnAdd(ah, entry);
}
void OnAuctionRemove(AuctionHouseObject* ah, AuctionEntry* entry) override
{
sEluna->OnRemove(ah, entry);
}
void OnAuctionSuccessful(AuctionHouseObject* ah, AuctionEntry* entry) override
{
sEluna->OnSuccessful(ah, entry);
}
void OnAuctionExpire(AuctionHouseObject* ah, AuctionEntry* entry) override
{
sEluna->OnExpire(ah, entry);
}
};
class Eluna_BGScript : public BGScript
{
public:
Eluna_BGScript() : BGScript("Eluna_BGScript") { }
void OnBattlegroundStart(Battleground* bg) override
{
sEluna->OnBGStart(bg, bg->GetBgTypeID(), bg->GetInstanceID());
}
void OnBattlegroundEnd(Battleground* bg, TeamId winnerTeam) override
{
sEluna->OnBGEnd(bg, bg->GetBgTypeID(), bg->GetInstanceID(), winnerTeam);
}
void OnBattlegroundDestroy(Battleground* bg) override
{
sEluna->OnBGDestroy(bg, bg->GetBgTypeID(), bg->GetInstanceID());
}
void OnBattlegroundCreate(Battleground* bg) override
{
sEluna->OnBGCreate(bg, bg->GetBgTypeID(), bg->GetInstanceID());
}
};
class Eluna_CommandSC : public CommandSC
{
public:
Eluna_CommandSC() : CommandSC("Eluna_CommandSC") { }
bool CanExecuteCommand(ChatHandler& handler, std::string_view cmdStr) override
{
if (!sEluna->OnCommand(handler, std::string(cmdStr).c_str()))
{
return false;
}
return true;
}
};
class Eluna_ElunaScript : public ElunaScript
{
public:
Eluna_ElunaScript() : ElunaScript("Eluna_ElunaScript") { }
// Weather
void OnWeatherChange(Weather* weather, WeatherState state, float grade) override
{
sEluna->OnChange(weather, weather->GetZone(), state, grade);
}
// AreaTriger
bool CanAreaTrigger(Player* player, AreaTrigger const* trigger) override
{
if (sEluna->OnAreaTrigger(player, trigger))
return true;
return false;
}
};
class Eluna_GameEventScript : public GameEventScript
{
public:
Eluna_GameEventScript() : GameEventScript("Eluna_GameEventScript") { }
void OnEventStart(uint16 eventID)
{
sEluna->OnGameEventStart(eventID);
}
void OnEventStop(uint16 eventID)
{
sEluna->OnGameEventStop(eventID);
}
};
class Eluna_GroupScript : public GroupScript
{
public:
Eluna_GroupScript() : GroupScript("Eluna_GroupScript") { }
void OnAddMember(Group* group, ObjectGuid guid) override
{
sEluna->OnAddMember(group, guid);
}
void OnInviteMember(Group* group, ObjectGuid guid) override
{
sEluna->OnInviteMember(group, guid);
}
void OnRemoveMember(Group* group, ObjectGuid guid, RemoveMethod method, ObjectGuid /* kicker */, const char* /* reason */) override
{
sEluna->OnRemoveMember(group, guid, method);
}
void OnChangeLeader(Group* group, ObjectGuid newLeaderGuid, ObjectGuid oldLeaderGuid) override
{
sEluna->OnChangeLeader(group, newLeaderGuid, oldLeaderGuid);
}
void OnDisband(Group* group) override
{
sEluna->OnDisband(group);
}
};
class Eluna_GuildScript : public GuildScript
{
public:
Eluna_GuildScript() : GuildScript("Eluna_GuildScript") { }
void OnAddMember(Guild* guild, Player* player, uint8& plRank) override
{
sEluna->OnAddMember(guild, player, plRank);
}
void OnRemoveMember(Guild* guild, Player* player, bool isDisbanding, bool /*isKicked*/) override
{
sEluna->OnRemoveMember(guild, player, isDisbanding);
}
void OnMOTDChanged(Guild* guild, const std::string& newMotd) override
{
sEluna->OnMOTDChanged(guild, newMotd);
}
void OnInfoChanged(Guild* guild, const std::string& newInfo) override
{
sEluna->OnInfoChanged(guild, newInfo);
}
void OnCreate(Guild* guild, Player* leader, const std::string& name) override
{
sEluna->OnCreate(guild, leader, name);
}
void OnDisband(Guild* guild) override
{
sEluna->OnDisband(guild);
}
void OnMemberWitdrawMoney(Guild* guild, Player* player, uint32& amount, bool isRepair) override
{
sEluna->OnMemberWitdrawMoney(guild, player, amount, isRepair);
}
void OnMemberDepositMoney(Guild* guild, Player* player, uint32& amount) override
{
sEluna->OnMemberDepositMoney(guild, player, amount);
}
void OnItemMove(Guild* guild, Player* player, Item* pItem, bool isSrcBank, uint8 srcContainer, uint8 srcSlotId,
bool isDestBank, uint8 destContainer, uint8 destSlotId) override
{
sEluna->OnItemMove(guild, player, pItem, isSrcBank, srcContainer, srcSlotId, isDestBank, destContainer, destSlotId);
}
void OnEvent(Guild* guild, uint8 eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank) override
{
sEluna->OnEvent(guild, eventType, playerGuid1, playerGuid2, newRank);
}
void OnBankEvent(Guild* guild, uint8 eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId) override
{
sEluna->OnBankEvent(guild, eventType, tabId, playerGuid, itemOrMoney, itemStackCount, destTabId);
}
};
class Eluna_LootScript : public LootScript
{
public:
Eluna_LootScript() : LootScript("Eluna_LootScript") { }
void OnLootMoney(Player* player, uint32 gold) override
{
sEluna->OnLootMoney(player, gold);
}
};
class Eluna_MiscScript : public MiscScript
{
public:
Eluna_MiscScript() : MiscScript("Eluna_MiscScript") { }
void GetDialogStatus(Player* player, Object* questgiver) override
{
if (questgiver->GetTypeId() == TYPEID_GAMEOBJECT)
sEluna->GetDialogStatus(player, questgiver->ToGameObject());
else if (questgiver->GetTypeId() == TYPEID_UNIT)
sEluna->GetDialogStatus(player, questgiver->ToCreature());
}
};
class Eluna_PetScript : public PetScript
{
public:
Eluna_PetScript() : PetScript("Eluna_PetScript") { }
void OnPetAddToWorld(Pet* pet) override
{
sEluna->OnPetAddedToWorld(pet->GetOwner(), pet);
}
};
class Eluna_PlayerScript : public PlayerScript
{
public:
Eluna_PlayerScript() : PlayerScript("Eluna_PlayerScript") { }
void OnPlayerResurrect(Player* player, float /*restore_percent*/, bool /*applySickness*/) override
{
sEluna->OnResurrect(player);
}
bool CanPlayerUseChat(Player* player, uint32 type, uint32 lang, std::string& msg) override
{
if (type != CHAT_MSG_SAY && type != CHAT_MSG_YELL && type != CHAT_MSG_EMOTE)
return true;
if (!sEluna->OnChat(player, type, lang, msg))
return false;
return true;
}
bool CanPlayerUseChat(Player* player, uint32 type, uint32 lang, std::string& msg, Player* target) override
{
if (!sEluna->OnChat(player, type, lang, msg, target))
return false;
return true;
}
bool CanPlayerUseChat(Player* player, uint32 type, uint32 lang, std::string& msg, Group* group) override
{
if (!sEluna->OnChat(player, type, lang, msg, group))
return false;
return true;
}
bool CanPlayerUseChat(Player* player, uint32 type, uint32 lang, std::string& msg, Guild* guild) override
{
if (!sEluna->OnChat(player, type, lang, msg, guild))
return false;
return true;
}
bool CanPlayerUseChat(Player* player, uint32 type, uint32 lang, std::string& msg, Channel* channel) override
{
if (!sEluna->OnChat(player, type, lang, msg, channel))
return false;
return true;
}
void OnLootItem(Player* player, Item* item, uint32 count, ObjectGuid lootguid) override
{
sEluna->OnLootItem(player, item, count, lootguid);
}
void OnPlayerLearnTalents(Player* player, uint32 talentId, uint32 talentRank, uint32 spellid) override
{
sEluna->OnLearnTalents(player, talentId, talentRank, spellid);
}
bool CanUseItem(Player* player, ItemTemplate const* proto, InventoryResult& result) override
{
result = sEluna->OnCanUseItem(player, proto->ItemId);
return result != EQUIP_ERR_OK ? false : true;
}
void OnEquip(Player* player, Item* it, uint8 bag, uint8 slot, bool /*update*/) override
{
sEluna->OnEquip(player, it, bag, slot);
}
void OnPlayerEnterCombat(Player* player, Unit* enemy) override
{
sEluna->OnPlayerEnterCombat(player, enemy);
}
void OnPlayerLeaveCombat(Player* player) override
{
sEluna->OnPlayerLeaveCombat(player);
}
bool CanRepopAtGraveyard(Player* player) override
{
sEluna->OnRepop(player);
return true;
}
void OnQuestAbandon(Player* player, uint32 questId) override
{
sEluna->OnQuestAbandon(player, questId);
}
void OnMapChanged(Player* player) override
{
sEluna->OnMapChanged(player);
}
void OnGossipSelect(Player* player, uint32 menu_id, uint32 sender, uint32 action) override
{
sEluna->HandleGossipSelectOption(player, menu_id, sender, action, "");
}
void OnGossipSelectCode(Player* player, uint32 menu_id, uint32 sender, uint32 action, const char* code) override
{
sEluna->HandleGossipSelectOption(player, menu_id, sender, action, code);
}
void OnPVPKill(Player* killer, Player* killed) override
{
sEluna->OnPVPKill(killer, killed);
}
void OnCreatureKill(Player* killer, Creature* killed) override
{
sEluna->OnCreatureKill(killer, killed);
}
void OnPlayerKilledByCreature(Creature* killer, Player* killed) override
{
sEluna->OnPlayerKilledByCreature(killer, killed);
}
void OnLevelChanged(Player* player, uint8 oldLevel) override
{
sEluna->OnLevelChanged(player, oldLevel);
}
void OnFreeTalentPointsChanged(Player* player, uint32 points) override
{
sEluna->OnFreeTalentPointsChanged(player, points);
}
void OnTalentsReset(Player* player, bool noCost) override
{
sEluna->OnTalentsReset(player, noCost);
}
void OnMoneyChanged(Player* player, int32& amount) override
{
sEluna->OnMoneyChanged(player, amount);
}
void OnGiveXP(Player* player, uint32& amount, Unit* victim) override
{
sEluna->OnGiveXP(player, amount, victim);
}
bool OnReputationChange(Player* player, uint32 factionID, int32& standing, bool incremental) override
{
return sEluna->OnReputationChange(player, factionID, standing, incremental);
}
void OnDuelRequest(Player* target, Player* challenger) override
{
sEluna->OnDuelRequest(target, challenger);
}
void OnDuelStart(Player* player1, Player* player2) override
{
sEluna->OnDuelStart(player1, player2);
}
void OnDuelEnd(Player* winner, Player* loser, DuelCompleteType type) override
{
sEluna->OnDuelEnd(winner, loser, type);
}
void OnEmote(Player* player, uint32 emote) override
{
sEluna->OnEmote(player, emote);
}
void OnTextEmote(Player* player, uint32 textEmote, uint32 emoteNum, ObjectGuid guid) override
{
sEluna->OnTextEmote(player, textEmote, emoteNum, guid);
}
void OnSpellCast(Player* player, Spell* spell, bool skipCheck) override
{
sEluna->OnSpellCast(player, spell, skipCheck);
}
void OnLogin(Player* player) override
{
sEluna->OnLogin(player);
}
void OnLogout(Player* player) override
{
sEluna->OnLogout(player);
}
void OnCreate(Player* player) override
{
sEluna->OnCreate(player);
}
void OnSave(Player* player) override
{
sEluna->OnSave(player);
}
void OnDelete(ObjectGuid guid, uint32 /*accountId*/) override
{
sEluna->OnDelete(guid.GetCounter());
}
void OnBindToInstance(Player* player, Difficulty difficulty, uint32 mapid, bool permanent) override
{
sEluna->OnBindToInstance(player, difficulty, mapid, permanent);
}
void OnUpdateZone(Player* player, uint32 newZone, uint32 newArea) override
{
sEluna->OnUpdateZone(player, newZone, newArea);
}
void OnFirstLogin(Player* player) override
{
sEluna->OnFirstLogin(player);
}
};
class Eluna_ServerScript : public ServerScript
{
public:
Eluna_ServerScript() : ServerScript("Eluna_ServerScript") { }
bool CanPacketSend(WorldSession* session, WorldPacket& packet) override
{
if (!sEluna->OnPacketSend(session, packet))
return false;
return true;
}
bool CanPacketReceive(WorldSession* session, WorldPacket& packet) override
{
if (!sEluna->OnPacketReceive(session, packet))
return false;
return true;
}
};
class Eluna_SpellSC : public SpellSC
{
public:
Eluna_SpellSC() : SpellSC("Eluna_SpellSC") { }
void OnDummyEffect(WorldObject* caster, uint32 spellID, SpellEffIndex effIndex, GameObject* gameObjTarget) override
{
sEluna->OnDummyEffect(caster, spellID, effIndex, gameObjTarget);
}
void OnDummyEffect(WorldObject* caster, uint32 spellID, SpellEffIndex effIndex, Creature* creatureTarget) override
{
sEluna->OnDummyEffect(caster, spellID, effIndex, creatureTarget);
}
void OnDummyEffect(WorldObject* caster, uint32 spellID, SpellEffIndex effIndex, Item* itemTarget) override
{
sEluna->OnDummyEffect(caster, spellID, effIndex, itemTarget);
}
};
class Eluna_UnitScript : public UnitScript
{
public:
Eluna_UnitScript() : UnitScript("Eluna_UnitScript") { }
void OnUnitUpdate(Unit* unit, uint32 diff) override
{
unit->elunaEvents->Update(diff);
}
};
class Eluna_VehicleScript : public VehicleScript
{
public:
Eluna_VehicleScript() : VehicleScript("Eluna_VehicleScript") { }
void OnInstall(Vehicle* veh) override
{
sEluna->OnInstall(veh);
}
void OnUninstall(Vehicle* veh) override
{
sEluna->OnUninstall(veh);
}
void OnInstallAccessory(Vehicle* veh, Creature* accessory) override
{
sEluna->OnInstallAccessory(veh, accessory);
}
void OnAddPassenger(Vehicle* veh, Unit* passenger, int8 seatId) override
{
sEluna->OnAddPassenger(veh, passenger, seatId);
}
void OnRemovePassenger(Vehicle* veh, Unit* passenger) override
{
sEluna->OnRemovePassenger(veh, passenger);
}
};
class Eluna_WorldObjectScript : public WorldObjectScript
{
public:
Eluna_WorldObjectScript() : WorldObjectScript("Eluna_WorldObjectScript") { }
void OnWorldObjectDestroy(WorldObject* object) override
{
delete object->elunaEvents;
object->elunaEvents = nullptr;
}
void OnWorldObjectCreate(WorldObject* object) override
{
object->elunaEvents = nullptr;
}
void OnWorldObjectSetMap(WorldObject* object, Map* /*map*/) override
{
delete object->elunaEvents;
// On multithread replace this with a pointer to map's Eluna pointer stored in a map
object->elunaEvents = new ElunaEventProcessor(&Eluna::GEluna, object);
}
void OnWorldObjectResetMap(WorldObject* object) override
{
delete object->elunaEvents;
object->elunaEvents = nullptr;
}
void OnWorldObjectUpdate(WorldObject* object, uint32 diff) override
{
object->elunaEvents->Update(diff);
}
};
class Eluna_WorldScript : public WorldScript
{
public:
Eluna_WorldScript() : WorldScript("Eluna_WorldScript") { }
void OnOpenStateChange(bool open) override
{
sEluna->OnOpenStateChange(open);
}
void OnBeforeConfigLoad(bool reload) override
{
if (!reload)
{
///- Initialize Lua Engine
LOG_INFO("eluna", "Initialize Eluna Lua Engine...");
Eluna::Initialize();
}
sEluna->OnConfigLoad(reload, true);
}
void OnAfterConfigLoad(bool reload) override
{
sEluna->OnConfigLoad(reload, false);
}
void OnShutdownInitiate(ShutdownExitCode code, ShutdownMask mask) override
{
sEluna->OnShutdownInitiate(code, mask);
}
void OnShutdownCancel() override
{
sEluna->OnShutdownCancel();
}
void OnUpdate(uint32 diff) override
{
sEluna->OnWorldUpdate(diff);
}
void OnStartup() override
{
sEluna->OnStartup();
}
void OnShutdown() override
{
sEluna->OnShutdown();
}
void OnAfterUnloadAllMaps() override
{
Eluna::Uninitialize();
}
void OnBeforeWorldInitialized() override
{
///- Run eluna scripts.
// in multithread foreach: run scripts
sEluna->RunScripts();
sEluna->OnConfigLoad(false, false); // Must be done after Eluna is initialized and scripts have run.
}
};
// Group all custom scripts
void AddSC_ElunaLuaEngine()
{
new Eluna_AllCreatureScript();
new Eluna_AllGameObjectScript();
new Eluna_AllItemScript();
new Eluna_AllMapScript();
new Eluna_AuctionHouseScript();
new Eluna_BGScript();
new Eluna_CommandSC();
new Eluna_ElunaScript();
new Eluna_GameEventScript();
new Eluna_GroupScript();
new Eluna_GuildScript();
new Eluna_LootScript();
new Eluna_MiscScript();
new Eluna_PetScript();
new Eluna_PlayerScript();
new Eluna_ServerScript();
new Eluna_SpellSC();
new Eluna_UnitScript();
new Eluna_VehicleScript();
new Eluna_WorldObjectScript();
new Eluna_WorldScript();
}

View File

@@ -0,0 +1,7 @@
[*]
charset = utf-8
indent_style = space
indent_size = 4
tab_width = 4
insert_final_newline = true
trim_trailing_whitespace = true

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

View File

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Some files were not shown because too many files have changed in this diff Show More