initial commit
This commit is contained in:
@@ -0,0 +1,63 @@
|
|||||||
|
###############################################################################
|
||||||
|
# Set default behavior to automatically normalize line endings.
|
||||||
|
###############################################################################
|
||||||
|
* text=auto
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Set default behavior for command prompt diff.
|
||||||
|
#
|
||||||
|
# This is need for earlier builds of msysgit that does not have it on by
|
||||||
|
# default for csharp files.
|
||||||
|
# Note: This is only used by command line
|
||||||
|
###############################################################################
|
||||||
|
#*.cs diff=csharp
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Set the merge driver for project and solution files
|
||||||
|
#
|
||||||
|
# Merging from the command prompt will add diff markers to the files if there
|
||||||
|
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||||
|
# the diff markers are never inserted). Diff markers may cause the following
|
||||||
|
# file extensions to fail to load in VS. An alternative would be to treat
|
||||||
|
# these files as binary and thus will always conflict and require user
|
||||||
|
# intervention with every merge. To do so, just uncomment the entries below
|
||||||
|
###############################################################################
|
||||||
|
#*.sln merge=binary
|
||||||
|
#*.csproj merge=binary
|
||||||
|
#*.vbproj merge=binary
|
||||||
|
#*.vcxproj merge=binary
|
||||||
|
#*.vcproj merge=binary
|
||||||
|
#*.dbproj merge=binary
|
||||||
|
#*.fsproj merge=binary
|
||||||
|
#*.lsproj merge=binary
|
||||||
|
#*.wixproj merge=binary
|
||||||
|
#*.modelproj merge=binary
|
||||||
|
#*.sqlproj merge=binary
|
||||||
|
#*.wwaproj merge=binary
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# behavior for image files
|
||||||
|
#
|
||||||
|
# image files are treated as binary by default.
|
||||||
|
###############################################################################
|
||||||
|
#*.jpg binary
|
||||||
|
#*.png binary
|
||||||
|
#*.gif binary
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# diff behavior for common document formats
|
||||||
|
#
|
||||||
|
# Convert binary document formats to text before diffing them. This feature
|
||||||
|
# is only available from the command line. Turn it on by uncommenting the
|
||||||
|
# entries below.
|
||||||
|
###############################################################################
|
||||||
|
#*.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
|
||||||
+159
@@ -0,0 +1,159 @@
|
|||||||
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
|
||||||
|
[Dd]ebug/
|
||||||
|
[Rr]elease/
|
||||||
|
x64/
|
||||||
|
build/
|
||||||
|
[Bb]in/
|
||||||
|
[Oo]bj/
|
||||||
|
|
||||||
|
# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets
|
||||||
|
!packages/*/build/
|
||||||
|
|
||||||
|
# MSTest test Results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
UnitTestResults.html
|
||||||
|
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.tmp_proj
|
||||||
|
*.log
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
.builds
|
||||||
|
*.pidb
|
||||||
|
*.log
|
||||||
|
*.scc
|
||||||
|
|
||||||
|
# Visual Studio cache files
|
||||||
|
*.sln.ide/
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
*.vspx
|
||||||
|
|
||||||
|
# Guidance Automation Toolkit
|
||||||
|
*.gpState
|
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in
|
||||||
|
_ReSharper*/
|
||||||
|
*.[Rr]e[Ss]harper
|
||||||
|
|
||||||
|
# TeamCity is a build add-in
|
||||||
|
_TeamCity*
|
||||||
|
|
||||||
|
# DotCover is a Code Coverage Tool
|
||||||
|
*.dotCover
|
||||||
|
|
||||||
|
# NCrunch
|
||||||
|
*.ncrunch*
|
||||||
|
.*crunch*.local.xml
|
||||||
|
|
||||||
|
# Installshield output folder
|
||||||
|
[Ee]xpress/
|
||||||
|
|
||||||
|
# DocProject is a documentation generator add-in
|
||||||
|
DocProject/buildhelp/
|
||||||
|
DocProject/Help/*.HxT
|
||||||
|
DocProject/Help/*.HxC
|
||||||
|
DocProject/Help/*.hhc
|
||||||
|
DocProject/Help/*.hhk
|
||||||
|
DocProject/Help/*.hhp
|
||||||
|
DocProject/Help/Html2
|
||||||
|
DocProject/Help/html
|
||||||
|
|
||||||
|
# Click-Once directory
|
||||||
|
publish/
|
||||||
|
|
||||||
|
# Publish Web Output
|
||||||
|
*.Publish.xml
|
||||||
|
|
||||||
|
# NuGet Packages Directory
|
||||||
|
packages/
|
||||||
|
|
||||||
|
# Windows Azure Build Output
|
||||||
|
csx
|
||||||
|
*.build.csdef
|
||||||
|
|
||||||
|
# Windows Store app package directory
|
||||||
|
AppPackages/
|
||||||
|
|
||||||
|
# Others
|
||||||
|
sql/
|
||||||
|
*.Cache
|
||||||
|
ClientBin/
|
||||||
|
[Ss]tyle[Cc]op.*
|
||||||
|
~$*
|
||||||
|
*~
|
||||||
|
*.dbmdl
|
||||||
|
*.[Pp]ublish.xml
|
||||||
|
*.pfx
|
||||||
|
*.publishsettings
|
||||||
|
|
||||||
|
# RIA/Silverlight projects
|
||||||
|
Generated_Code/
|
||||||
|
|
||||||
|
# Backup & report files from converting an old project file to a newer
|
||||||
|
# Visual Studio version. Backup files are not needed, because we have git ;-)
|
||||||
|
_UpgradeReport_Files/
|
||||||
|
Backup*/
|
||||||
|
UpgradeLog*.XML
|
||||||
|
UpgradeLog*.htm
|
||||||
|
|
||||||
|
# SQL Server files
|
||||||
|
App_Data/*.mdf
|
||||||
|
App_Data/*.ldf
|
||||||
|
|
||||||
|
|
||||||
|
#LightSwitch generated files
|
||||||
|
GeneratedArtifacts/
|
||||||
|
_Pvt_Extensions/
|
||||||
|
ModelManifest.xml
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# Windows detritus
|
||||||
|
# =========================
|
||||||
|
|
||||||
|
# Windows image file caches
|
||||||
|
Thumbs.db
|
||||||
|
ehthumbs.db
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
Desktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Mac desktop service store files
|
||||||
|
.DS_Store
|
||||||
@@ -0,0 +1,242 @@
|
|||||||
|
###################################################################################################
|
||||||
|
# Cypher BNet Server Configuration File #
|
||||||
|
###################################################################################################
|
||||||
|
|
||||||
|
###################################################################################################
|
||||||
|
# BNet SERVER SETTINGS
|
||||||
|
#
|
||||||
|
# LogsDir
|
||||||
|
# Description: Logs directory setting.
|
||||||
|
# Important: LogsDir needs to be quoted, as the string might contain space characters.
|
||||||
|
# Logs directory must exists, or log file creation will be disabled.
|
||||||
|
# Default: "" - (Log files will be stored in the current path)
|
||||||
|
|
||||||
|
LogsDir = "./Logs"
|
||||||
|
|
||||||
|
#
|
||||||
|
# BattlenetPort
|
||||||
|
# Description: TCP port to reach the auth server for battle.net connections.
|
||||||
|
# Default: 1119
|
||||||
|
|
||||||
|
BattlenetPort = 1119
|
||||||
|
|
||||||
|
#
|
||||||
|
# LoginREST.Port
|
||||||
|
# Description: TCP port to reach the REST login method.
|
||||||
|
# Default: 8081
|
||||||
|
#
|
||||||
|
# LoginREST.ExternalAddress
|
||||||
|
# Description: IP address sent to clients connecting from outside the network where bnetserver runs
|
||||||
|
#
|
||||||
|
# LoginREST.LocalAddress
|
||||||
|
# Description: IP address sent to clients connecting from inside the network where bnetserver runs
|
||||||
|
#
|
||||||
|
|
||||||
|
LoginREST.Port = 8081
|
||||||
|
LoginREST.ExternalAddress=127.0.0.1
|
||||||
|
LoginREST.LocalAddress=127.0.0.1
|
||||||
|
|
||||||
|
#
|
||||||
|
# BindIP
|
||||||
|
# Description: Bind auth server to IP/hostname
|
||||||
|
# Default: "0.0.0.0" - (Bind to all IPs on the system)
|
||||||
|
|
||||||
|
BindIP = "0.0.0.0"
|
||||||
|
|
||||||
|
#
|
||||||
|
# RealmsStateUpdateDelay
|
||||||
|
# Description: Time (in seconds) between realm list updates.
|
||||||
|
# Default: 10
|
||||||
|
# 0 - (Disabled)
|
||||||
|
|
||||||
|
RealmsStateUpdateDelay = 10
|
||||||
|
|
||||||
|
#
|
||||||
|
# WrongPass.MaxCount
|
||||||
|
# Description: Number of login attemps with wrong password before the account or IP will be
|
||||||
|
# banned.
|
||||||
|
# Default: 0 - (Disabled)
|
||||||
|
# 1+ - (Enabled)
|
||||||
|
|
||||||
|
WrongPass.MaxCount = 0
|
||||||
|
|
||||||
|
#
|
||||||
|
# WrongPass.BanTime
|
||||||
|
# Description: Time (in seconds) for banning account or IP for invalid login attempts.
|
||||||
|
# Default: 600 - (10 minutes)
|
||||||
|
# 0 - (Permanent ban)
|
||||||
|
|
||||||
|
WrongPass.BanTime = 600
|
||||||
|
|
||||||
|
#
|
||||||
|
# WrongPass.BanType
|
||||||
|
# Description: Ban type for invalid login attempts.
|
||||||
|
# Default: 0 - (Ban IP)
|
||||||
|
# 1 - (Ban Account)
|
||||||
|
|
||||||
|
WrongPass.BanType = 0
|
||||||
|
|
||||||
|
#
|
||||||
|
###################################################################################################
|
||||||
|
|
||||||
|
###################################################################################################
|
||||||
|
# MYSQL SETTINGS
|
||||||
|
#
|
||||||
|
# LoginDatabaseInfo
|
||||||
|
# Description: Database connection settings for the realm server.
|
||||||
|
# Example: "hostname;port;username;password;database"
|
||||||
|
# ".;somenumber;username;password;database" - (Use named pipes on Windows
|
||||||
|
# "enable-named-pipe" to [mysqld]
|
||||||
|
# section my.ini)
|
||||||
|
# ".;/path/to/unix_socket;username;password;database" - (use Unix sockets on
|
||||||
|
# Unix/Linux)
|
||||||
|
# Default: "127.0.0.1;3306;cypher;cypher;auth"
|
||||||
|
|
||||||
|
LoginDatabaseInfo = "127.0.0.1;3306;username;password;auth"
|
||||||
|
|
||||||
|
#
|
||||||
|
# DBQueryWorkerInterval
|
||||||
|
# Description: Time (milliseconds) for Query Task Worker interval.
|
||||||
|
# Default: 1000
|
||||||
|
|
||||||
|
DBQueryWorkerInterval = 1000
|
||||||
|
|
||||||
|
#
|
||||||
|
###################################################################################################
|
||||||
|
|
||||||
|
###################################################################################################
|
||||||
|
# UPDATE SETTINGS
|
||||||
|
#
|
||||||
|
# Updates.EnableDatabases
|
||||||
|
# Description: A mask that describes which databases shall be updated.
|
||||||
|
#
|
||||||
|
# Following flags are available
|
||||||
|
# DATABASE_LOGIN = 1, // Auth database
|
||||||
|
#
|
||||||
|
# Default: 0 - (All Disabled)
|
||||||
|
# 1 - (All Enabled)
|
||||||
|
|
||||||
|
Updates.EnableDatabases = 0
|
||||||
|
|
||||||
|
#
|
||||||
|
# Updates.SourcePath
|
||||||
|
# Description: The path to your CypherCore source directory.
|
||||||
|
# If the path is left empty, built-in CMAKE_SOURCE_DIR is used.
|
||||||
|
# Example: "../CypherCore"
|
||||||
|
# Default: ""
|
||||||
|
|
||||||
|
Updates.SourcePath = ""
|
||||||
|
|
||||||
|
#
|
||||||
|
# Updates.AutoSetup
|
||||||
|
# Description: Auto populate empty databases.
|
||||||
|
# Default: 1 - (Enabled)
|
||||||
|
# 0 - (Disabled)
|
||||||
|
|
||||||
|
Updates.AutoSetup = 1
|
||||||
|
|
||||||
|
#
|
||||||
|
# Updates.Redundancy
|
||||||
|
# Description: Perform data redundancy checks through hashing
|
||||||
|
# to detect changes on sql updates and reapply it.
|
||||||
|
# Default: 1 - (Enabled)
|
||||||
|
# 0 - (Disabled)
|
||||||
|
|
||||||
|
Updates.Redundancy = 1
|
||||||
|
|
||||||
|
#
|
||||||
|
# Updates.ArchivedRedundancy
|
||||||
|
# Description: Check hashes of archived updates (slows down startup).
|
||||||
|
# Default: 0 - (Disabled)
|
||||||
|
# 1 - (Enabled)
|
||||||
|
|
||||||
|
Updates.ArchivedRedundancy = 0
|
||||||
|
|
||||||
|
#
|
||||||
|
# Updates.AllowRehash
|
||||||
|
# Description: Inserts the current file hash in the database if it is left empty.
|
||||||
|
# Useful if you want to mark a file as applied but you don't know its hash.
|
||||||
|
# Default: 1 - (Enabled)
|
||||||
|
# 0 - (Disabled)
|
||||||
|
|
||||||
|
Updates.AllowRehash = 1
|
||||||
|
|
||||||
|
#
|
||||||
|
# Updates.CleanDeadRefMaxCount
|
||||||
|
# Description: Cleans dead/ orphaned references that occur if an update was removed or renamed and edited in one step.
|
||||||
|
# It only starts the clean up if the count of the missing updates is below or equal the Updates.CleanDeadRefMaxCount value.
|
||||||
|
# This way prevents erasing of the update history due to wrong source directory state (maybe wrong branch or bad revision).
|
||||||
|
# Disable this if you want to know if the database is in a possible "dirty state".
|
||||||
|
# Default: 3 - (Enabled)
|
||||||
|
# 0 - (Disabled)
|
||||||
|
# -1 - (Enabled - unlimited)
|
||||||
|
|
||||||
|
Updates.CleanDeadRefMaxCount = 3
|
||||||
|
|
||||||
|
#
|
||||||
|
###################################################################################################
|
||||||
|
|
||||||
|
###################################################################################################
|
||||||
|
#
|
||||||
|
# LOGGING SYSTEM SETTINGS
|
||||||
|
#
|
||||||
|
# Appender config values: Given a 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 - (Trace)
|
||||||
|
# 2 - (Debug)
|
||||||
|
# 3 - (Info)
|
||||||
|
# 4 - (Warn)
|
||||||
|
# 5 - (Error)
|
||||||
|
# 6 - (Fatal)
|
||||||
|
#
|
||||||
|
# Flags:
|
||||||
|
# 0 - None
|
||||||
|
# 1 - Prefix Timestamp to the text
|
||||||
|
# 2 - Prefix Log Level to the text
|
||||||
|
# 4 - Prefix Log Filter type to the text
|
||||||
|
#
|
||||||
|
# File: Name of the file (read as optional1 if Type = File)
|
||||||
|
# Allows to use one "{0}" to create dynamic files
|
||||||
|
#
|
||||||
|
|
||||||
|
Appender.Console=1,2,0
|
||||||
|
Appender.Bnet=2,2,0,Bnet.log
|
||||||
|
|
||||||
|
# Logger config values: Given a logger "name"
|
||||||
|
# Logger.name
|
||||||
|
# Description: Defines 'What to log'
|
||||||
|
# Format: LogLevel,AppenderList
|
||||||
|
#
|
||||||
|
# LogLevel
|
||||||
|
# 0 - (Disabled)
|
||||||
|
# 1 - (Trace)
|
||||||
|
# 2 - (Debug)
|
||||||
|
# 3 - (Info)
|
||||||
|
# 4 - (Warn)
|
||||||
|
# 5 - (Error)
|
||||||
|
# 6 - (Fatal)
|
||||||
|
#
|
||||||
|
# AppenderList: List of appenders linked to logger
|
||||||
|
# (Using spaces as separator).
|
||||||
|
#
|
||||||
|
|
||||||
|
Logger.Server=3,Console Bnet
|
||||||
|
Logger.Realmlist=3,Console Bnet
|
||||||
|
Logger.Session=3,Console Bnet
|
||||||
|
Logger.Network=3,Console Bnet
|
||||||
|
Logger.SqlUpdates=3,Console Bnet
|
||||||
|
Logger.ServiceProtobuf=2,Console Bnet
|
||||||
|
|
||||||
|
#
|
||||||
|
###################################################################################################
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{668E1664-FB63-47DA-9EA1-93B59851BF1E}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>BNetServer</RootNamespace>
|
||||||
|
<AssemblyName>BNetServer</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<TargetFrameworkProfile />
|
||||||
|
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||||
|
<PublishUrl>publish\</PublishUrl>
|
||||||
|
<Install>true</Install>
|
||||||
|
<InstallFrom>Disk</InstallFrom>
|
||||||
|
<UpdateEnabled>false</UpdateEnabled>
|
||||||
|
<UpdateMode>Foreground</UpdateMode>
|
||||||
|
<UpdateInterval>7</UpdateInterval>
|
||||||
|
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||||
|
<UpdatePeriodically>false</UpdatePeriodically>
|
||||||
|
<UpdateRequired>false</UpdateRequired>
|
||||||
|
<MapFileExtensions>true</MapFileExtensions>
|
||||||
|
<ApplicationRevision>0</ApplicationRevision>
|
||||||
|
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||||
|
<UseApplicationTrust>false</UseApplicationTrust>
|
||||||
|
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<StartupObject>BNetServer.Server</StartupObject>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<ApplicationIcon>Red.ico</ApplicationIcon>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>..\Build\x64\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
<CodeAnalysisIgnoreGeneratedCode>false</CodeAnalysisIgnoreGeneratedCode>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||||
|
<OutputPath>bin\x64\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>..\Build\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG</DefineConstants>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||||
|
<OutputPath>..\Build\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup />
|
||||||
|
<PropertyGroup />
|
||||||
|
<PropertyGroup>
|
||||||
|
<SignManifests>false</SignManifests>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<ManifestCertificateThumbprint>7EA13AA3A2003652283599344471651FF1C1100A</ManifestCertificateThumbprint>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<ManifestKeyFile>BNetServer_TemporaryKey.pfx</ManifestKeyFile>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SignAssembly>false</SignAssembly>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Google.Protobuf, Version=3.0.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\Libs\Google.Protobuf.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Numerics" />
|
||||||
|
<Reference Include="System.Runtime.Serialization" />
|
||||||
|
<Reference Include="System.Runtime.Serialization.Formatters.Soap" />
|
||||||
|
<Reference Include="System.Web" />
|
||||||
|
<Reference Include="System.Web.Extensions" />
|
||||||
|
<Reference Include="System.Web.Services" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Managers\SessionManager.cs" />
|
||||||
|
<Compile Include="Networking\RestSession.cs" />
|
||||||
|
<Compile Include="Managers\Global.cs" />
|
||||||
|
<Compile Include="Networking\Session.cs" />
|
||||||
|
<Compile Include="Server.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="Services\AccountService.cs" />
|
||||||
|
<Compile Include="Services\AuthenticationService.cs" />
|
||||||
|
<Compile Include="Services\ChallengeService.cs" />
|
||||||
|
<Compile Include="Services\ChannelService.cs" />
|
||||||
|
<Compile Include="Services\ConnectionService.cs" />
|
||||||
|
<Compile Include="Services\FriendService.cs" />
|
||||||
|
<Compile Include="Services\GameUtilitiesService.cs" />
|
||||||
|
<Compile Include="Services\PresenceService.cs" />
|
||||||
|
<Compile Include="Services\ReportService.cs" />
|
||||||
|
<Compile Include="Services\ResourcesService.cs" />
|
||||||
|
<Compile Include="Services\ServiceDispatcher.cs" />
|
||||||
|
<Compile Include="Services\UserManagerService.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="Red.ico" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="BNetServer.conf">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Framework\Framework.csproj">
|
||||||
|
<Project>{82d442a9-18c0-4c59-8ec6-0dfe3e34d334}</Project>
|
||||||
|
<Name>Framework</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<BootstrapperPackage Include=".NETFramework,Version=v4.5.2">
|
||||||
|
<Visible>False</Visible>
|
||||||
|
<ProductName>Microsoft .NET Framework 4.5.2 %28x86 and x64%29</ProductName>
|
||||||
|
<Install>true</Install>
|
||||||
|
</BootstrapperPackage>
|
||||||
|
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||||
|
<Visible>False</Visible>
|
||||||
|
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||||
|
<Install>false</Install>
|
||||||
|
</BootstrapperPackage>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup />
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<PreBuildEvent>
|
||||||
|
</PreBuildEvent>
|
||||||
|
</PropertyGroup>
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using BNetServer.Services;
|
||||||
|
|
||||||
|
namespace BNetServer
|
||||||
|
{
|
||||||
|
public static class Global
|
||||||
|
{
|
||||||
|
public static RealmManager RealmMgr { get { return RealmManager.Instance; } }
|
||||||
|
public static SessionManager SessionMgr { get { return SessionManager.Instance; } }
|
||||||
|
public static ServiceDispatcher ServiceDispatcher { get { return ServiceDispatcher.Instance; } }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using BNetServer.Networking;
|
||||||
|
using Framework.Configuration;
|
||||||
|
using Framework.Rest;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Security.Cryptography.X509Certificates;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace BNetServer
|
||||||
|
{
|
||||||
|
public class SessionManager : Singleton<SessionManager>
|
||||||
|
{
|
||||||
|
SessionManager()
|
||||||
|
{
|
||||||
|
_formInputs = new FormInputs();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Initialize()
|
||||||
|
{
|
||||||
|
int _port = ConfigMgr.GetDefaultValue("LoginREST.Port", 8081);
|
||||||
|
if (_port < 0 || _port > 0xFFFF)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.Network, "Specified login service port ({0}) out of allowed range (1-65535), defaulting to 8081", _port);
|
||||||
|
_port = 8081;
|
||||||
|
}
|
||||||
|
|
||||||
|
string configuredAddress = ConfigMgr.GetDefaultValue("LoginREST.ExternalAddress", "127.0.0.1");
|
||||||
|
IPAddress address;
|
||||||
|
if (!IPAddress.TryParse(configuredAddress, out address))
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.Network, "Could not resolve LoginREST.ExternalAddress {0}", configuredAddress);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
_externalAddress = new IPEndPoint(address, _port);
|
||||||
|
|
||||||
|
configuredAddress = ConfigMgr.GetDefaultValue("LoginREST.LocalAddress", "127.0.0.1");
|
||||||
|
if (!IPAddress.TryParse(configuredAddress, out address))
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.Network, "Could not resolve LoginREST.ExternalAddress {0}", configuredAddress);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_localAddress = new IPEndPoint(address, _port);
|
||||||
|
|
||||||
|
// set up form inputs
|
||||||
|
_formInputs.Type = "LOGIN_FORM";
|
||||||
|
|
||||||
|
var input = new FormInput();
|
||||||
|
input.Id = "account_name";
|
||||||
|
input.Type = "text";
|
||||||
|
input.Label = "E-mail";
|
||||||
|
input.MaxLength = 320;
|
||||||
|
_formInputs.Inputs.Add(input);
|
||||||
|
|
||||||
|
input = new FormInput();
|
||||||
|
input.Id = "password";
|
||||||
|
input.Type = "password";
|
||||||
|
input.Label = "Password";
|
||||||
|
input.MaxLength = 16;
|
||||||
|
_formInputs.Inputs.Add(input);
|
||||||
|
|
||||||
|
input = new FormInput();
|
||||||
|
input.Id = "log_in_submit";
|
||||||
|
input.Type = "submit";
|
||||||
|
input.Label = "Log In";
|
||||||
|
_formInputs.Inputs.Add(input);
|
||||||
|
|
||||||
|
_loginTicketCleanupTimer = new Timer(CleanupLoginTickets);
|
||||||
|
_loginTicketCleanupTimer.Change(TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10));
|
||||||
|
|
||||||
|
_certificate = new X509Certificate2("BNetServer.pfx");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IPEndPoint GetAddressForClient(IPAddress address)
|
||||||
|
{
|
||||||
|
if (IPAddress.IsLoopback(address))
|
||||||
|
return _localAddress;
|
||||||
|
|
||||||
|
return _externalAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FormInputs GetFormInput()
|
||||||
|
{
|
||||||
|
return _formInputs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public X509Certificate2 GetCertificate()
|
||||||
|
{
|
||||||
|
return _certificate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddLoginTicket(string id, AccountInfo accountInfo)
|
||||||
|
{
|
||||||
|
_validLoginTickets[id] = new LoginTicket() { Id = id, Account = accountInfo, ExpiryTime = Time.UnixTime + 10 };
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccountInfo VerifyLoginTicket(string id)
|
||||||
|
{
|
||||||
|
var accountInfo = _validLoginTickets.LookupByKey(id);
|
||||||
|
if (accountInfo != null)
|
||||||
|
{
|
||||||
|
if (accountInfo.ExpiryTime > Time.UnixTime)
|
||||||
|
{
|
||||||
|
_validLoginTickets.Remove(id);
|
||||||
|
return accountInfo.Account;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new AccountInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CleanupLoginTickets(object state)
|
||||||
|
{
|
||||||
|
long now = Time.UnixTime;
|
||||||
|
|
||||||
|
foreach (var pair in _validLoginTickets.ToList())
|
||||||
|
{
|
||||||
|
if (pair.Value.ExpiryTime < now)
|
||||||
|
_validLoginTickets.Remove(pair.Key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FormInputs _formInputs;
|
||||||
|
IPEndPoint _externalAddress;
|
||||||
|
IPEndPoint _localAddress;
|
||||||
|
Dictionary<string, LoginTicket> _validLoginTickets = new Dictionary<string, LoginTicket>();
|
||||||
|
Timer _loginTicketCleanupTimer;
|
||||||
|
X509Certificate2 _certificate;
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoginTicket
|
||||||
|
{
|
||||||
|
public string Id;
|
||||||
|
public AccountInfo Account;
|
||||||
|
public long ExpiryTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BanMode
|
||||||
|
{
|
||||||
|
Ip = 0,
|
||||||
|
Account = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,215 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Framework.Configuration;
|
||||||
|
using Framework.Database;
|
||||||
|
using Framework.Networking;
|
||||||
|
using Framework.Rest;
|
||||||
|
using Framework.Serialization;
|
||||||
|
using Framework.Web;
|
||||||
|
using System;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace BNetServer.Networking
|
||||||
|
{
|
||||||
|
public class RestSession : SSLSocket
|
||||||
|
{
|
||||||
|
public RestSession(Socket socket) : base(socket) { }
|
||||||
|
|
||||||
|
public override void Start()
|
||||||
|
{
|
||||||
|
AsyncHandshake(Global.SessionMgr.GetCertificate());
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void ReadHandler(int transferredBytes)
|
||||||
|
{
|
||||||
|
var httpRequest = HttpHelper.ParseRequest(GetReceiveBuffer(), transferredBytes);
|
||||||
|
if (httpRequest == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (httpRequest.Method)
|
||||||
|
{
|
||||||
|
case "GET":
|
||||||
|
default:
|
||||||
|
HandleConnectRequest(httpRequest);
|
||||||
|
break;
|
||||||
|
case "POST":
|
||||||
|
HandleLoginRequest(httpRequest);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AsyncRead();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void HandleConnectRequest(HttpHeader request)
|
||||||
|
{
|
||||||
|
// Login form is the same for all clients...
|
||||||
|
SendResponse(HttpCode.Ok, Global.SessionMgr.GetFormInput());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void HandleLoginRequest(HttpHeader request)
|
||||||
|
{
|
||||||
|
LogonData loginForm = Json.CreateObject<LogonData>(request.Content);
|
||||||
|
LogonResult loginResult = new LogonResult();
|
||||||
|
if (loginForm == null)
|
||||||
|
{
|
||||||
|
loginResult.AuthenticationState = "LOGIN";
|
||||||
|
loginResult.ErrorCode = "UNABLE_TO_DECODE";
|
||||||
|
loginResult.ErrorMessage = "There was an internal error while connecting to Battle.net. Please try again later.";
|
||||||
|
SendResponse(HttpCode.BadRequest, loginResult);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string login = "";
|
||||||
|
string password = "";
|
||||||
|
|
||||||
|
for (int i = 0; i < loginForm.Inputs.Count; ++i)
|
||||||
|
{
|
||||||
|
switch (loginForm.Inputs[i].Id)
|
||||||
|
{
|
||||||
|
case "account_name":
|
||||||
|
login = loginForm.Inputs[i].Value;
|
||||||
|
break;
|
||||||
|
case "password":
|
||||||
|
password = loginForm.Inputs[i].Value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_BNET_ACCOUNT_INFO);
|
||||||
|
stmt.AddValue(0, login);
|
||||||
|
|
||||||
|
SQLResult result = DB.Login.Query(stmt);
|
||||||
|
if (result.IsEmpty())
|
||||||
|
{
|
||||||
|
loginResult.AuthenticationState = "LOGIN";
|
||||||
|
loginResult.ErrorCode = "UNABLE_TO_DECODE";
|
||||||
|
loginResult.ErrorMessage = "There was an internal error while connecting to Battle.net. Please try again later.";
|
||||||
|
SendResponse(HttpCode.BadRequest, loginResult);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string pass_hash = result.Read<string>(13);
|
||||||
|
|
||||||
|
var accountInfo = new AccountInfo();
|
||||||
|
accountInfo.LoadResult(result);
|
||||||
|
|
||||||
|
if (CalculateShaPassHash(login, password) == pass_hash)
|
||||||
|
{
|
||||||
|
stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_BNET_CHARACTER_COUNTS_BY_BNET_ID);
|
||||||
|
stmt.AddValue(0, accountInfo.Id);
|
||||||
|
|
||||||
|
SQLResult characterCountsResult = DB.Login.Query(stmt);
|
||||||
|
if (!characterCountsResult.IsEmpty())
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
accountInfo.GameAccounts[characterCountsResult.Read<uint>(0)]
|
||||||
|
.CharacterCounts[new RealmHandle(characterCountsResult.Read<byte>(3), characterCountsResult.Read<byte>(4), characterCountsResult.Read<uint>(2)).GetAddress()] = characterCountsResult.Read<byte>(1);
|
||||||
|
|
||||||
|
} while (characterCountsResult.NextRow());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_BNET_LAST_PLAYER_CHARACTERS);
|
||||||
|
stmt.AddValue(0, accountInfo.Id);
|
||||||
|
|
||||||
|
SQLResult lastPlayerCharactersResult = DB.Login.Query(stmt);
|
||||||
|
if (!lastPlayerCharactersResult.IsEmpty())
|
||||||
|
{
|
||||||
|
RealmHandle realmId = new RealmHandle(lastPlayerCharactersResult.Read<byte>(1), lastPlayerCharactersResult.Read<byte>(2), lastPlayerCharactersResult.Read<uint>(3));
|
||||||
|
|
||||||
|
LastPlayedCharacterInfo lastPlayedCharacter = new LastPlayedCharacterInfo();
|
||||||
|
lastPlayedCharacter.RealmId = realmId;
|
||||||
|
lastPlayedCharacter.CharacterName = lastPlayerCharactersResult.Read<string>(4);
|
||||||
|
lastPlayedCharacter.CharacterGUID = lastPlayerCharactersResult.Read<ulong>(5);
|
||||||
|
lastPlayedCharacter.LastPlayedTime = lastPlayerCharactersResult.Read<uint>(6);
|
||||||
|
|
||||||
|
accountInfo.GameAccounts[lastPlayerCharactersResult.Read<uint>(0)].LastPlayedCharacters[realmId.GetSubRegionAddress()] = lastPlayedCharacter;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] ticket = new byte[0].GenerateRandomKey(20);
|
||||||
|
loginResult.LoginTicket = "TC-" + ticket.ToHexString();
|
||||||
|
|
||||||
|
Global.SessionMgr.AddLoginTicket(loginResult.LoginTicket, accountInfo);
|
||||||
|
}
|
||||||
|
else if (!accountInfo.IsBanned)
|
||||||
|
{
|
||||||
|
uint maxWrongPassword = ConfigMgr.GetDefaultValue("WrongPass.MaxCount", 0u);
|
||||||
|
|
||||||
|
if (ConfigMgr.GetDefaultValue("WrongPass.Logging", false))
|
||||||
|
Log.outDebug(LogFilter.Network, "[{0}, Account {1}, Id {2}] Attempted to connect with wrong password!", request.Host, login, accountInfo.Id);
|
||||||
|
|
||||||
|
if (maxWrongPassword != 0)
|
||||||
|
{
|
||||||
|
SQLTransaction trans = new SQLTransaction();
|
||||||
|
stmt = DB.Login.GetPreparedStatement(LoginStatements.UPD_BNET_FAILED_LOGINS);
|
||||||
|
stmt.AddValue(0, accountInfo.Id);
|
||||||
|
trans.Append(stmt);
|
||||||
|
|
||||||
|
++accountInfo.FailedLogins;
|
||||||
|
|
||||||
|
Log.outDebug(LogFilter.Network, "MaxWrongPass : {0}, failed_login : {1}", maxWrongPassword, accountInfo.Id);
|
||||||
|
|
||||||
|
if (accountInfo.FailedLogins >= maxWrongPassword)
|
||||||
|
{
|
||||||
|
BanMode banType = ConfigMgr.GetDefaultValue("WrongPass.BanType", BanMode.Ip);
|
||||||
|
int banTime = ConfigMgr.GetDefaultValue("WrongPass.BanTime", 600);
|
||||||
|
|
||||||
|
if (banType == BanMode.Account)
|
||||||
|
{
|
||||||
|
stmt = DB.Login.GetPreparedStatement(LoginStatements.INS_BNET_ACCOUNT_AUTO_BANNED);
|
||||||
|
stmt.AddValue(0, accountInfo.Id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stmt = DB.Login.GetPreparedStatement(LoginStatements.INS_IP_AUTO_BANNED);
|
||||||
|
stmt.AddValue(0, request.Host);
|
||||||
|
}
|
||||||
|
|
||||||
|
stmt.AddValue(1, banTime);
|
||||||
|
trans.Append(stmt);
|
||||||
|
|
||||||
|
stmt = DB.Login.GetPreparedStatement(LoginStatements.UPD_BNET_RESET_FAILED_LOGINS);
|
||||||
|
stmt.AddValue(0, accountInfo.Id);
|
||||||
|
trans.Append(stmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
DB.Login.CommitTransaction(trans);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
loginResult.AuthenticationState = "DONE";
|
||||||
|
SendResponse(HttpCode.Ok, loginResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SendResponse<T>(HttpCode code, T response)
|
||||||
|
{
|
||||||
|
AsyncWrite(HttpHelper.CreateResponse(code, Json.CreateString(response)));
|
||||||
|
}
|
||||||
|
|
||||||
|
string CalculateShaPassHash(string name, string password)
|
||||||
|
{
|
||||||
|
SHA256 sha256 = SHA256.Create();
|
||||||
|
var i = sha256.ComputeHash(Encoding.UTF8.GetBytes(name));
|
||||||
|
return sha256.ComputeHash(Encoding.UTF8.GetBytes(i.ToHexString() + ":" + password)).ToHexString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,661 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Bgs.Protocol;
|
||||||
|
using Bgs.Protocol.Challenge.V1;
|
||||||
|
using Framework.Constants;
|
||||||
|
using Framework.Database;
|
||||||
|
using Framework.IO;
|
||||||
|
using Framework.Networking;
|
||||||
|
using Framework.Rest;
|
||||||
|
using Framework.Serialization;
|
||||||
|
using Google.Protobuf;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
|
||||||
|
namespace BNetServer.Networking
|
||||||
|
{
|
||||||
|
public partial class Session : SSLSocket
|
||||||
|
{
|
||||||
|
public Session(Socket socket) : base(socket)
|
||||||
|
{
|
||||||
|
_accountInfo = new AccountInfo();
|
||||||
|
|
||||||
|
ClientRequestHandlers.Add("Command_RealmListTicketRequest_v1_b9", GetRealmListTicket);
|
||||||
|
ClientRequestHandlers.Add("Command_LastCharPlayedRequest_v1_b9", GetLastCharPlayed);
|
||||||
|
ClientRequestHandlers.Add("Command_RealmListRequest_v1_b9", GetRealmList);
|
||||||
|
ClientRequestHandlers.Add("Command_RealmJoinRequest_v1_b9", JoinRealm);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Start()
|
||||||
|
{
|
||||||
|
string ip_address = GetRemoteIpAddress().ToString();
|
||||||
|
Log.outTrace(LogFilter.Session, "{0} Accepted connection", GetClientInfo());
|
||||||
|
|
||||||
|
// Verify that this IP is not in the ip_banned table
|
||||||
|
DB.Login.Execute(DB.Login.GetPreparedStatement(LoginStatements.DEL_EXPIRED_IP_BANS));
|
||||||
|
|
||||||
|
PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_IP_INFO);
|
||||||
|
stmt.AddValue(0, ip_address);
|
||||||
|
stmt.AddValue(1, BitConverter.ToUInt32(GetRemoteIpAddress().GetAddressBytes(), 0));
|
||||||
|
|
||||||
|
_queryProcessor.AddQuery(DB.Login.AsyncQuery(stmt).WithCallback(CheckIpCallback));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CheckIpCallback(SQLResult result)
|
||||||
|
{
|
||||||
|
if (!result.IsEmpty())
|
||||||
|
{
|
||||||
|
bool banned = false;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (result.Read<ulong>(0) != 0)
|
||||||
|
banned = true;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(result.Read<string>(1)))
|
||||||
|
_ipCountry = result.Read<string>(1);
|
||||||
|
|
||||||
|
} while (result.NextRow());
|
||||||
|
|
||||||
|
if (banned)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.Session, "{0} tries to log in using banned IP!", GetClientInfo());
|
||||||
|
CloseSocket();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AsyncHandshake(Global.SessionMgr.GetCertificate());
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Update()
|
||||||
|
{
|
||||||
|
if (!base.Update())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
_queryProcessor.ProcessReadyQueries();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void ReadHandler(int transferredBytes)
|
||||||
|
{
|
||||||
|
if (!IsOpen())
|
||||||
|
return;
|
||||||
|
|
||||||
|
var stream = new CodedInputStream(GetReceiveBuffer(), 0, transferredBytes);
|
||||||
|
while (!stream.IsAtEnd)
|
||||||
|
{
|
||||||
|
var header = new Header();
|
||||||
|
stream.ReadMessage(header);
|
||||||
|
|
||||||
|
if (header.ServiceId != 0xFE)
|
||||||
|
{
|
||||||
|
Global.ServiceDispatcher.Dispatch(this, header.ServiceHash, header.Token, header.MethodId, stream);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var handler = _responseCallbacks.LookupByKey(header.Token);
|
||||||
|
if (handler != null)
|
||||||
|
{
|
||||||
|
handler(stream);
|
||||||
|
_responseCallbacks.Remove(header.Token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AsyncRead();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AsyncWrite(ByteBuffer packet)
|
||||||
|
{
|
||||||
|
if (!IsOpen())
|
||||||
|
return;
|
||||||
|
|
||||||
|
AsyncWrite(packet.GetData());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendResponse(uint token, IMessage response)
|
||||||
|
{
|
||||||
|
Header header = new Header();
|
||||||
|
header.Token = token;
|
||||||
|
header.ServiceId = 0xFE;
|
||||||
|
header.Size = (uint)response.CalculateSize();
|
||||||
|
|
||||||
|
var headerSizeBytes = BitConverter.GetBytes((ushort)header.CalculateSize());
|
||||||
|
Array.Reverse(headerSizeBytes);
|
||||||
|
|
||||||
|
ByteBuffer packet = new ByteBuffer();
|
||||||
|
packet.WriteBytes(headerSizeBytes, 2);
|
||||||
|
packet.WriteBytes(header.ToByteArray());
|
||||||
|
packet.WriteBytes(response.ToByteArray());
|
||||||
|
|
||||||
|
AsyncWrite(packet.GetData());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendResponse(uint token, BattlenetRpcErrorCode status)
|
||||||
|
{
|
||||||
|
Header header = new Header();
|
||||||
|
header.Token = token;
|
||||||
|
header.Status = (uint)status;
|
||||||
|
header.ServiceId = 0xFE;
|
||||||
|
|
||||||
|
var headerSizeBytes = BitConverter.GetBytes((ushort)header.CalculateSize());
|
||||||
|
Array.Reverse(headerSizeBytes);
|
||||||
|
|
||||||
|
ByteBuffer packet = new ByteBuffer();
|
||||||
|
packet.WriteBytes(headerSizeBytes, 2);
|
||||||
|
packet.WriteBytes(header.ToByteArray());
|
||||||
|
|
||||||
|
AsyncWrite(packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendRequest(uint serviceHash, uint methodId, IMessage request, Action<CodedInputStream> callback)
|
||||||
|
{
|
||||||
|
_responseCallbacks[_requestToken] = callback;
|
||||||
|
SendRequest(serviceHash, methodId, request);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendRequest(uint serviceHash, uint methodId, IMessage request)
|
||||||
|
{
|
||||||
|
Header header = new Header();
|
||||||
|
header.ServiceId = 0;
|
||||||
|
header.ServiceHash = serviceHash;
|
||||||
|
header.MethodId = methodId;
|
||||||
|
header.Size = (uint)request.CalculateSize();
|
||||||
|
header.Token = _requestToken++;
|
||||||
|
|
||||||
|
var headerSizeBytes = BitConverter.GetBytes((ushort)header.CalculateSize());
|
||||||
|
Array.Reverse(headerSizeBytes);
|
||||||
|
|
||||||
|
ByteBuffer packet = new ByteBuffer();
|
||||||
|
packet.WriteBytes(headerSizeBytes, 2);
|
||||||
|
packet.WriteBytes(header.ToByteArray());
|
||||||
|
packet.WriteBytes(request.ToByteArray());
|
||||||
|
|
||||||
|
AsyncWrite(packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BattlenetRpcErrorCode HandleLogon(Bgs.Protocol.Authentication.V1.LogonRequest logonRequest)
|
||||||
|
{
|
||||||
|
if (logonRequest.Program != "WoW")
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.Session, "Battlenet.LogonRequest: {0} attempted to log in with game other than WoW (using {1})!", GetClientInfo(), logonRequest.Program);
|
||||||
|
return BattlenetRpcErrorCode.BadProgram;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (logonRequest.Platform != "Win" && logonRequest.Platform != "Wn64" && logonRequest.Platform != "Mc64")
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.Session, "Battlenet.LogonRequest: {0} attempted to log in from an unsupported platform (using {1})!", GetClientInfo(), logonRequest.Platform);
|
||||||
|
return BattlenetRpcErrorCode.BadPlatform;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (logonRequest.Locale.ToEnum<LocaleConstant>() == LocaleConstant.enUS && logonRequest.Locale != "enUS")
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.Session, "Battlenet.LogonRequest: {0} attempted to log in with unsupported locale (using {1})!", GetClientInfo(), logonRequest.Locale);
|
||||||
|
return BattlenetRpcErrorCode.BadLocale;
|
||||||
|
}
|
||||||
|
|
||||||
|
_locale = logonRequest.Locale;
|
||||||
|
_os = logonRequest.Platform;
|
||||||
|
|
||||||
|
var endpoint = Global.SessionMgr.GetAddressForClient(GetRemoteIpAddress());
|
||||||
|
|
||||||
|
ChallengeExternalRequest externalChallenge = new ChallengeExternalRequest();
|
||||||
|
externalChallenge.PayloadType = "web_auth_url";
|
||||||
|
|
||||||
|
externalChallenge.Payload = ByteString.CopyFromUtf8(string.Format("https://{0}:{1}/bnetserver/login/", endpoint.Address, endpoint.Port));
|
||||||
|
SendRequest((uint)OriginalHash.ChallengeListener, 3, externalChallenge);
|
||||||
|
return BattlenetRpcErrorCode.Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BattlenetRpcErrorCode HandleVerifyWebCredentials(Bgs.Protocol.Authentication.V1.VerifyWebCredentialsRequest verifyWebCredentialsRequest)
|
||||||
|
{
|
||||||
|
Bgs.Protocol.Authentication.V1.LogonResult logonResult = new Bgs.Protocol.Authentication.V1.LogonResult();
|
||||||
|
logonResult.ErrorCode = 0;
|
||||||
|
_accountInfo = Global.SessionMgr.VerifyLoginTicket(verifyWebCredentialsRequest.WebCredentials.ToStringUtf8());
|
||||||
|
if (_accountInfo == null)
|
||||||
|
return BattlenetRpcErrorCode.Denied;
|
||||||
|
|
||||||
|
string ip_address = GetRemoteIpAddress().ToString();
|
||||||
|
|
||||||
|
// If the IP is 'locked', check that the player comes indeed from the correct IP address
|
||||||
|
if (_accountInfo.IsLockedToIP)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.Session, "Session.HandleVerifyWebCredentials: Account '{0}' is locked to IP - '{1}' is logging in from '{2}'",
|
||||||
|
_accountInfo.Login, _accountInfo.LastIP, ip_address);
|
||||||
|
|
||||||
|
if (_accountInfo.LastIP != ip_address)
|
||||||
|
return BattlenetRpcErrorCode.RiskAccountLocked;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.Session, "Session.HandleVerifyWebCredentials: Account '{0}' is not locked to ip", _accountInfo.Login);
|
||||||
|
if (_accountInfo.LockCountry.IsEmpty() || _accountInfo.LockCountry == "00")
|
||||||
|
Log.outDebug(LogFilter.Session, "Session.HandleVerifyWebCredentials: Account '{0}' is not locked to country", _accountInfo.Login);
|
||||||
|
else if (!_accountInfo.LockCountry.IsEmpty() && !_ipCountry.IsEmpty())
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.Session, "Session.HandleVerifyWebCredentials: Account '{0}' is locked to country: '{1}' Player country is '{2}'",
|
||||||
|
_accountInfo.Login, _accountInfo.LockCountry, _ipCountry);
|
||||||
|
|
||||||
|
if (_ipCountry != _accountInfo.LockCountry)
|
||||||
|
return BattlenetRpcErrorCode.RiskAccountLocked;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the account is banned, reject the logon attempt
|
||||||
|
if (_accountInfo.IsBanned)
|
||||||
|
{
|
||||||
|
if (_accountInfo.IsPermanenetlyBanned)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.Session, "{0} Session.HandleVerifyWebCredentials: Banned account {1} tried to login!", GetClientInfo(), _accountInfo.Login);
|
||||||
|
return BattlenetRpcErrorCode.GameAccountBanned;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.Session, "{0} Session.HandleVerifyWebCredentials: Temporarily banned account {1} tried to login!", GetClientInfo(), _accountInfo.Login);
|
||||||
|
return BattlenetRpcErrorCode.GameAccountSuspended;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logonResult.AccountId = new EntityId();
|
||||||
|
logonResult.AccountId.Low = _accountInfo.Id;
|
||||||
|
logonResult.AccountId.High = 0x100000000000000;
|
||||||
|
foreach (var pair in _accountInfo.GameAccounts)
|
||||||
|
{
|
||||||
|
if (!pair.Value.IsBanned)
|
||||||
|
{
|
||||||
|
EntityId gameAccountId = new EntityId();
|
||||||
|
gameAccountId.Low = pair.Value.Id;
|
||||||
|
gameAccountId.High = 0x200000200576F57;
|
||||||
|
logonResult.GameAccountId.Add(gameAccountId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_ipCountry.IsEmpty())
|
||||||
|
logonResult.GeoipCountry = _ipCountry;
|
||||||
|
|
||||||
|
logonResult.SessionKey = ByteString.CopyFrom(new byte[64].GenerateRandomKey(64));
|
||||||
|
|
||||||
|
_authed = true;
|
||||||
|
|
||||||
|
SendRequest((uint)OriginalHash.AuthenticationListener, 5, logonResult);
|
||||||
|
return BattlenetRpcErrorCode.Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BattlenetRpcErrorCode HandleGetAccountState(Bgs.Protocol.Account.V1.GetAccountStateRequest request, Bgs.Protocol.Account.V1.GetAccountStateResponse response)
|
||||||
|
{
|
||||||
|
if (!_authed)
|
||||||
|
return BattlenetRpcErrorCode.Denied;
|
||||||
|
|
||||||
|
if (request.Options.FieldPrivacyInfo)
|
||||||
|
{
|
||||||
|
response.State = new Bgs.Protocol.Account.V1.AccountState();
|
||||||
|
response.State.PrivacyInfo = new Bgs.Protocol.Account.V1.PrivacyInfo();
|
||||||
|
response.State.PrivacyInfo.IsUsingRid = false;
|
||||||
|
response.State.PrivacyInfo.IsRealIdVisibleForViewFriends = false;
|
||||||
|
response.State.PrivacyInfo.IsHiddenFromFriendFinder = true;
|
||||||
|
|
||||||
|
response.Tags = new Bgs.Protocol.Account.V1.AccountFieldTags();
|
||||||
|
response.Tags.PrivacyInfoTag = 0xD7CA834D;
|
||||||
|
}
|
||||||
|
|
||||||
|
return BattlenetRpcErrorCode.Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BattlenetRpcErrorCode HandleGetGameAccountState(Bgs.Protocol.Account.V1.GetGameAccountStateRequest request, Bgs.Protocol.Account.V1.GetGameAccountStateResponse response)
|
||||||
|
{
|
||||||
|
if (!_authed)
|
||||||
|
return BattlenetRpcErrorCode.Denied;
|
||||||
|
|
||||||
|
if (request.Options.FieldGameLevelInfo)
|
||||||
|
{
|
||||||
|
var gameAccountInfo = _accountInfo.GameAccounts.LookupByKey(request.GameAccountId.Low);
|
||||||
|
if (gameAccountInfo != null)
|
||||||
|
{
|
||||||
|
response.State = new Bgs.Protocol.Account.V1.GameAccountState();
|
||||||
|
response.State.GameLevelInfo = new Bgs.Protocol.Account.V1.GameLevelInfo();
|
||||||
|
response.State.GameLevelInfo.Name = gameAccountInfo.DisplayName;
|
||||||
|
response.State.GameLevelInfo.Program = 5730135; // WoW
|
||||||
|
}
|
||||||
|
|
||||||
|
response.Tags = new Bgs.Protocol.Account.V1.GameAccountFieldTags();
|
||||||
|
response.Tags.GameLevelInfoTag = 0x5C46D483;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (request.Options.FieldGameStatus)
|
||||||
|
{
|
||||||
|
if (response.State == null)
|
||||||
|
response.State = new Bgs.Protocol.Account.V1.GameAccountState();
|
||||||
|
|
||||||
|
response.State.GameStatus = new Bgs.Protocol.Account.V1.GameStatus();
|
||||||
|
|
||||||
|
var gameAccountInfo = _accountInfo.GameAccounts.LookupByKey(request.GameAccountId.Low);
|
||||||
|
if (gameAccountInfo != null)
|
||||||
|
{
|
||||||
|
response.State.GameStatus.IsSuspended = gameAccountInfo.IsBanned;
|
||||||
|
response.State.GameStatus.IsBanned = gameAccountInfo.IsPermanenetlyBanned;
|
||||||
|
}
|
||||||
|
|
||||||
|
response.State.GameStatus.Program = 5730135; // WoW
|
||||||
|
response.Tags.GameStatusTag = 0x98B75F99;
|
||||||
|
}
|
||||||
|
|
||||||
|
return BattlenetRpcErrorCode.Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BattlenetRpcErrorCode HandleProcessClientRequest(Bgs.Protocol.GameUtilities.V1.ClientRequest request, Bgs.Protocol.GameUtilities.V1.ClientResponse response)
|
||||||
|
{
|
||||||
|
if (!_authed)
|
||||||
|
return BattlenetRpcErrorCode.Denied;
|
||||||
|
|
||||||
|
Bgs.Protocol.Attribute command = null;
|
||||||
|
Dictionary<string, Variant> Params = new Dictionary<string, Variant>();
|
||||||
|
|
||||||
|
for (int i = 0; i < request.Attribute.Count; ++i)
|
||||||
|
{
|
||||||
|
Bgs.Protocol.Attribute attr = request.Attribute[i];
|
||||||
|
Params[attr.Name] = attr.Value;
|
||||||
|
if (attr.Name.Contains("Command_"))
|
||||||
|
command = attr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (command == null)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.SessionRpc, "{0} sent ClientRequest with no command.", GetClientInfo());
|
||||||
|
return BattlenetRpcErrorCode.RpcMalformedRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
var handler = ClientRequestHandlers.LookupByKey(command.Name);
|
||||||
|
if (handler == null)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.SessionRpc, "{0} sent ClientRequest with unknown command {1}.", GetClientInfo(), command.Name);
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
return handler(Params, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
Variant GetParam(Dictionary<string, Variant> Params, string paramName)
|
||||||
|
{
|
||||||
|
return Params.LookupByKey(paramName);
|
||||||
|
}
|
||||||
|
|
||||||
|
delegate BattlenetRpcErrorCode ClientRequestHandler(Dictionary<string, Variant> Params, Bgs.Protocol.GameUtilities.V1.ClientResponse response);
|
||||||
|
BattlenetRpcErrorCode GetRealmListTicket(Dictionary<string, Variant> Params, Bgs.Protocol.GameUtilities.V1.ClientResponse response)
|
||||||
|
{
|
||||||
|
Variant identity = GetParam(Params, "Param_Identity");
|
||||||
|
if (identity != null)
|
||||||
|
{
|
||||||
|
var realmListTicketIdentity = Json.CreateObject<RealmListTicketIdentity>(identity.BlobValue.ToStringUtf8(), true);
|
||||||
|
var gameAccountInfo = _accountInfo.GameAccounts.LookupByKey(realmListTicketIdentity.GameAccountId);
|
||||||
|
if (gameAccountInfo != null)
|
||||||
|
_gameAccountInfo = gameAccountInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_gameAccountInfo == null)
|
||||||
|
return BattlenetRpcErrorCode.UtilServerInvalidIdentityArgs;
|
||||||
|
|
||||||
|
Variant clientInfo = GetParam(Params, "Param_ClientInfo");
|
||||||
|
if (clientInfo != null)
|
||||||
|
{
|
||||||
|
var realmListTicketClientInformation = Json.CreateObject<RealmListTicketClientInformation>(clientInfo.BlobValue.ToStringUtf8(), true);
|
||||||
|
_build = (uint)realmListTicketClientInformation.Info.ClientVersion.Build;
|
||||||
|
_clientSecret.AddRange(realmListTicketClientInformation.Info.Secret.Select(x => Convert.ToByte(x)).ToArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_build == 0)
|
||||||
|
return BattlenetRpcErrorCode.WowServicesDeniedRealmListTicket;
|
||||||
|
|
||||||
|
PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.UPD_BNET_LAST_LOGIN_INFO);
|
||||||
|
stmt.AddValue(0, GetRemoteIpAddress().ToString());
|
||||||
|
stmt.AddValue(1, Enum.Parse(typeof(LocaleConstant), _locale));
|
||||||
|
stmt.AddValue(2, _os);
|
||||||
|
stmt.AddValue(3, _accountInfo.Id);
|
||||||
|
|
||||||
|
DB.Login.Execute(stmt);
|
||||||
|
|
||||||
|
var attribute = new Bgs.Protocol.Attribute();
|
||||||
|
attribute.Name = "Param_RealmListTicket";
|
||||||
|
attribute.Value = new Variant();
|
||||||
|
attribute.Value.BlobValue = ByteString.CopyFrom("AuthRealmListTicket", System.Text.Encoding.UTF8);
|
||||||
|
response.Attribute.Add(attribute);
|
||||||
|
|
||||||
|
return BattlenetRpcErrorCode.Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode GetLastCharPlayed(Dictionary<string, Variant> Params, Bgs.Protocol.GameUtilities.V1.ClientResponse response)
|
||||||
|
{
|
||||||
|
Variant subRegion = GetParam(Params, "Command_LastCharPlayedRequest_v1_b9");
|
||||||
|
if (subRegion != null)
|
||||||
|
{
|
||||||
|
var lastPlayerChar = _gameAccountInfo.LastPlayedCharacters.LookupByKey(subRegion.StringValue);
|
||||||
|
if (lastPlayerChar != null)
|
||||||
|
{
|
||||||
|
var compressed = Global.RealmMgr.GetRealmEntryJSON(lastPlayerChar.RealmId, _build);
|
||||||
|
if (compressed.Length == 0)
|
||||||
|
return BattlenetRpcErrorCode.UtilServerFailedToSerializeResponse;
|
||||||
|
|
||||||
|
var attribute = new Bgs.Protocol.Attribute();
|
||||||
|
attribute.Name = "Param_RealmEntry";
|
||||||
|
attribute.Value = new Variant();
|
||||||
|
attribute.Value.BlobValue = ByteString.CopyFrom(compressed);
|
||||||
|
response.Attribute.Add(attribute);
|
||||||
|
|
||||||
|
attribute = new Bgs.Protocol.Attribute();
|
||||||
|
attribute.Name = "Param_CharacterName";
|
||||||
|
attribute.Value = new Variant();
|
||||||
|
attribute.Value.StringValue = lastPlayerChar.CharacterName;
|
||||||
|
response.Attribute.Add(attribute);
|
||||||
|
|
||||||
|
attribute = new Bgs.Protocol.Attribute();
|
||||||
|
attribute.Name = "Param_CharacterGUID";
|
||||||
|
attribute.Value = new Variant();
|
||||||
|
attribute.Value.BlobValue = ByteString.CopyFrom(BitConverter.GetBytes(lastPlayerChar.CharacterGUID));
|
||||||
|
response.Attribute.Add(attribute);
|
||||||
|
|
||||||
|
attribute = new Bgs.Protocol.Attribute();
|
||||||
|
attribute.Name = "Param_LastPlayedTime";
|
||||||
|
attribute.Value = new Variant();
|
||||||
|
attribute.Value.IntValue = (int)lastPlayerChar.LastPlayedTime;
|
||||||
|
response.Attribute.Add(attribute);
|
||||||
|
}
|
||||||
|
|
||||||
|
return BattlenetRpcErrorCode.Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
return BattlenetRpcErrorCode.UtilServerUnknownRealm;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode GetRealmList(Dictionary<string, Variant> Params, Bgs.Protocol.GameUtilities.V1.ClientResponse response)
|
||||||
|
{
|
||||||
|
if (_gameAccountInfo == null)
|
||||||
|
return BattlenetRpcErrorCode.UserServerBadWowAccount;
|
||||||
|
|
||||||
|
string subRegionId = "";
|
||||||
|
Variant subRegion = GetParam(Params, "Command_RealmListRequest_v1_b9");
|
||||||
|
if (subRegion != null)
|
||||||
|
subRegionId = subRegion.StringValue;
|
||||||
|
|
||||||
|
var compressed = Global.RealmMgr.GetRealmList(_build, subRegionId);
|
||||||
|
if (compressed.Length == 0)
|
||||||
|
return BattlenetRpcErrorCode.UtilServerFailedToSerializeResponse;
|
||||||
|
|
||||||
|
var attribute = new Bgs.Protocol.Attribute();
|
||||||
|
attribute.Name = "Param_RealmList";
|
||||||
|
attribute.Value = new Variant();
|
||||||
|
attribute.Value.BlobValue = ByteString.CopyFrom(compressed);
|
||||||
|
response.Attribute.Add(attribute);
|
||||||
|
|
||||||
|
var realmCharacterCounts = new RealmCharacterCountList();
|
||||||
|
foreach (var characterCount in _gameAccountInfo.CharacterCounts)
|
||||||
|
{
|
||||||
|
var countEntry = new RealmCharacterCountEntry();
|
||||||
|
countEntry.WowRealmAddress = (int)characterCount.Key;
|
||||||
|
countEntry.Count = characterCount.Value;
|
||||||
|
realmCharacterCounts.Counts.Add(countEntry);
|
||||||
|
}
|
||||||
|
|
||||||
|
compressed = Json.Deflate("JSONRealmCharacterCountList", realmCharacterCounts);
|
||||||
|
|
||||||
|
attribute = new Bgs.Protocol.Attribute();
|
||||||
|
attribute.Name = "Param_CharacterCountList";
|
||||||
|
attribute.Value = new Variant();
|
||||||
|
attribute.Value.BlobValue = ByteString.CopyFrom(compressed);
|
||||||
|
response.Attribute.Add(attribute);
|
||||||
|
return BattlenetRpcErrorCode.Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode JoinRealm(Dictionary<string, Variant> Params, Bgs.Protocol.GameUtilities.V1.ClientResponse response)
|
||||||
|
{
|
||||||
|
Variant realmAddress = GetParam(Params, "Param_RealmAddress");
|
||||||
|
if (realmAddress != null)
|
||||||
|
return Global.RealmMgr.JoinRealm((uint)realmAddress.UintValue, _build, GetRemoteIpAddress(), _clientSecret, (LocaleConstant)Enum.Parse(typeof(LocaleConstant), _locale), _os, _gameAccountInfo.Name, response);
|
||||||
|
|
||||||
|
return BattlenetRpcErrorCode.WowServicesInvalidJoinTicket;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BattlenetRpcErrorCode HandleGetAllValuesForAttribute(Bgs.Protocol.GameUtilities.V1.GetAllValuesForAttributeRequest request, Bgs.Protocol.GameUtilities.V1.GetAllValuesForAttributeResponse response)
|
||||||
|
{
|
||||||
|
if (!_authed)
|
||||||
|
return BattlenetRpcErrorCode.Denied;
|
||||||
|
|
||||||
|
if (request.AttributeKey == "Command_RealmListRequest_v1_b9")
|
||||||
|
{
|
||||||
|
Global.RealmMgr.WriteSubRegions(response);
|
||||||
|
return BattlenetRpcErrorCode.Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetClientInfo()
|
||||||
|
{
|
||||||
|
string stream = '[' + GetRemoteIpAddress().ToString() + ':' + GetRemotePort();
|
||||||
|
if (_accountInfo != null && !string.IsNullOrEmpty(_accountInfo.Login))
|
||||||
|
stream += ", Account: " + _accountInfo.Login;
|
||||||
|
|
||||||
|
if (_gameAccountInfo != null)
|
||||||
|
stream += ", Game account: " + _gameAccountInfo.Name;
|
||||||
|
|
||||||
|
stream += ']';
|
||||||
|
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint GetAccountId() { return _accountInfo.Id; }
|
||||||
|
public uint GetGameAccountId() { return _gameAccountInfo.Id; }
|
||||||
|
|
||||||
|
Dictionary<string, ClientRequestHandler> ClientRequestHandlers = new Dictionary<string, ClientRequestHandler>();
|
||||||
|
|
||||||
|
AccountInfo _accountInfo;
|
||||||
|
GameAccountInfo _gameAccountInfo; // Points at selected game account (inside _gameAccounts)
|
||||||
|
|
||||||
|
string _locale;
|
||||||
|
string _os;
|
||||||
|
uint _build;
|
||||||
|
|
||||||
|
string _ipCountry;
|
||||||
|
|
||||||
|
Array<byte> _clientSecret = new Array<byte>(32);
|
||||||
|
|
||||||
|
bool _authed;
|
||||||
|
|
||||||
|
QueryCallbackProcessor _queryProcessor = new QueryCallbackProcessor();
|
||||||
|
|
||||||
|
Dictionary<uint, Action<CodedInputStream>> _responseCallbacks = new Dictionary<uint, Action<CodedInputStream>>();
|
||||||
|
uint _requestToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AccountInfo
|
||||||
|
{
|
||||||
|
public void LoadResult(SQLResult result)
|
||||||
|
{
|
||||||
|
Id = result.Read<uint>(0);
|
||||||
|
Login = result.Read<string>(1);
|
||||||
|
IsLockedToIP = result.Read<bool>(2);
|
||||||
|
LockCountry = result.Read<string>(3);
|
||||||
|
LastIP = result.Read<string>(4);
|
||||||
|
FailedLogins = result.Read<uint>(5);
|
||||||
|
IsBanned = result.Read<ulong>(6) != 0;
|
||||||
|
IsPermanenetlyBanned = result.Read<ulong>(7) != 0;
|
||||||
|
PasswordVerifier = result.Read<string>(9);
|
||||||
|
Salt = result.Read<string>(10);
|
||||||
|
|
||||||
|
const int GameAccountFieldsOffset = 8;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
var account = new GameAccountInfo();
|
||||||
|
account.LoadResult(result.GetFields(), GameAccountFieldsOffset);
|
||||||
|
GameAccounts[result.Read<uint>(GameAccountFieldsOffset)] = account;
|
||||||
|
|
||||||
|
} while (result.NextRow());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint Id;
|
||||||
|
public string Login;
|
||||||
|
public bool IsLockedToIP;
|
||||||
|
public string LockCountry;
|
||||||
|
public string LastIP;
|
||||||
|
public uint FailedLogins;
|
||||||
|
public bool IsBanned;
|
||||||
|
public bool IsPermanenetlyBanned;
|
||||||
|
public string PasswordVerifier;
|
||||||
|
public string Salt;
|
||||||
|
|
||||||
|
public Dictionary<uint, GameAccountInfo> GameAccounts = new Dictionary<uint, GameAccountInfo>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GameAccountInfo
|
||||||
|
{
|
||||||
|
public void LoadResult(SQLFields fields, int startColumn)
|
||||||
|
{
|
||||||
|
Id = fields.Read<uint>(startColumn + 0);
|
||||||
|
Name = fields.Read<string>(startColumn + 1);
|
||||||
|
IsBanned = fields.Read<ulong>(startColumn + 2) != 0;
|
||||||
|
IsPermanenetlyBanned = fields.Read<ulong>(startColumn + 3) != 0;
|
||||||
|
SecurityLevel = (AccountTypes)fields.Read<byte>(startColumn + 4);
|
||||||
|
|
||||||
|
int hashPos = Name.IndexOf('#');
|
||||||
|
if (hashPos != -1)
|
||||||
|
DisplayName = "WoW" + Name.Substring(hashPos + 1);
|
||||||
|
else
|
||||||
|
DisplayName = Name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint Id;
|
||||||
|
public string Name;
|
||||||
|
public string DisplayName;
|
||||||
|
public bool IsBanned;
|
||||||
|
public bool IsPermanenetlyBanned;
|
||||||
|
public AccountTypes SecurityLevel;
|
||||||
|
|
||||||
|
public Dictionary<uint /*realmAddress*/, byte> CharacterCounts = new Dictionary<uint, byte>();
|
||||||
|
public Dictionary<string /*subRegion*/, LastPlayedCharacterInfo> LastPlayedCharacters = new Dictionary<string, LastPlayedCharacterInfo>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class LastPlayedCharacterInfo
|
||||||
|
{
|
||||||
|
public RealmHandle RealmId;
|
||||||
|
public string CharacterName;
|
||||||
|
public ulong CharacterGUID;
|
||||||
|
public uint LastPlayedTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("BNetServer")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("BNetServer")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2014")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("ffe6ae44-fd7a-431f-b65d-fe8ac7bfc86a")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 141 KiB |
@@ -0,0 +1,154 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using BNetServer.Networking;
|
||||||
|
using Framework.Configuration;
|
||||||
|
using Framework.Database;
|
||||||
|
using Framework.Networking;
|
||||||
|
using Framework.Runtime;
|
||||||
|
using System;
|
||||||
|
using System.Timers;
|
||||||
|
|
||||||
|
namespace BNetServer
|
||||||
|
{
|
||||||
|
class Server
|
||||||
|
{
|
||||||
|
static void Main()
|
||||||
|
{
|
||||||
|
ApplicationSignal.SetConsoleCtrlHandler(AbortHandler, true);
|
||||||
|
ApplicationSignal.RemoveConsoleQuickEditMode();
|
||||||
|
|
||||||
|
if (!ConfigMgr.Load(System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".conf"))
|
||||||
|
ExitNow();
|
||||||
|
|
||||||
|
testing();
|
||||||
|
|
||||||
|
// Initialize the database connection
|
||||||
|
if (!StartDB())
|
||||||
|
ExitNow();
|
||||||
|
|
||||||
|
string bindIp = ConfigMgr.GetDefaultValue("BindIP", "0.0.0.0");
|
||||||
|
|
||||||
|
var restSocketServer = new SocketManager<RestSession>();
|
||||||
|
int restPort = ConfigMgr.GetDefaultValue("LoginREST.Port", 8081);
|
||||||
|
if (restPort < 0 || restPort > 0xFFFF)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.Network, "Specified login service port ({0}) out of allowed range (1-65535), defaulting to 8081", restPort);
|
||||||
|
restPort = 8081;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!restSocketServer.StartNetwork(bindIp, restPort))
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.Server, "Failed to initialize Rest Socket Server");
|
||||||
|
ExitNow();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the list of realms for the server
|
||||||
|
Global.RealmMgr.Initialize(ConfigMgr.GetDefaultValue("RealmsStateUpdateDelay", 10));
|
||||||
|
Global.SessionMgr.Initialize();
|
||||||
|
|
||||||
|
var sessionSocketServer = new SocketManager<Session>();
|
||||||
|
// Start the listening port (acceptor) for auth connections
|
||||||
|
int bnPort = ConfigMgr.GetDefaultValue("BattlenetPort", 1119);
|
||||||
|
if (bnPort < 0 || bnPort > 0xFFFF)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.Server, "Specified battle.net port ({0}) out of allowed range (1-65535)", bnPort);
|
||||||
|
ExitNow();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!sessionSocketServer.StartNetwork(bindIp, bnPort))
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.Network, "Failed to start BnetServer Network");
|
||||||
|
ExitNow();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint _banExpiryCheckInterval = ConfigMgr.GetDefaultValue("BanExpiryCheckInterval", 60u);
|
||||||
|
_banExpiryCheckTimer = new Timer(_banExpiryCheckInterval);
|
||||||
|
_banExpiryCheckTimer.Elapsed += _banExpiryCheckTimer_Elapsed;
|
||||||
|
|
||||||
|
while (true) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool StartDB()
|
||||||
|
{
|
||||||
|
DatabaseLoader loader = new DatabaseLoader(DatabaseTypeFlags.None);
|
||||||
|
loader.AddDatabase(DB.Login, "Login");
|
||||||
|
|
||||||
|
if (!loader.Load())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Log.SetRealmId(0); // Enables DB appenders when realm is set.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ExitNow()
|
||||||
|
{
|
||||||
|
Log.outInfo(LogFilter.Server, "Halting process...");
|
||||||
|
Environment.Exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _banExpiryCheckTimer_Elapsed(object sender, ElapsedEventArgs e)
|
||||||
|
{
|
||||||
|
DB.Login.Execute(DB.Login.GetPreparedStatement(LoginStatements.DEL_EXPIRED_IP_BANS));
|
||||||
|
DB.Login.Execute(DB.Login.GetPreparedStatement(LoginStatements.UPD_EXPIRED_ACCOUNT_BANS));
|
||||||
|
DB.Login.Execute(DB.Login.GetPreparedStatement(LoginStatements.DEL_BNET_EXPIRED_ACCOUNT_BANNED));
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool AbortHandler(CtrlType sig)
|
||||||
|
{
|
||||||
|
Global.RealmMgr.Close();
|
||||||
|
|
||||||
|
Log.outInfo(LogFilter.Server, "Halting process...");
|
||||||
|
Environment.Exit(-1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void testing()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static Timer _banExpiryCheckTimer;
|
||||||
|
|
||||||
|
static void Profile(string description, int iterations, Action func)
|
||||||
|
{
|
||||||
|
//Run at highest priority to minimize fluctuations caused by other processes/threads
|
||||||
|
System.Diagnostics.Process.GetCurrentProcess().PriorityClass = System.Diagnostics.ProcessPriorityClass.High;
|
||||||
|
System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Highest;
|
||||||
|
|
||||||
|
// warm up
|
||||||
|
func();
|
||||||
|
|
||||||
|
var watch = new System.Diagnostics.Stopwatch();
|
||||||
|
|
||||||
|
// clean up
|
||||||
|
GC.Collect();
|
||||||
|
GC.WaitForPendingFinalizers();
|
||||||
|
GC.Collect();
|
||||||
|
|
||||||
|
watch.Start();
|
||||||
|
for (int i = 0; i < iterations; i++)
|
||||||
|
{
|
||||||
|
func();
|
||||||
|
}
|
||||||
|
watch.Stop();
|
||||||
|
Console.Write(description);
|
||||||
|
Console.WriteLine(" Time Elapsed {0} ms", watch.Elapsed.TotalMilliseconds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,582 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Bgs.Protocol;
|
||||||
|
using Bgs.Protocol.Account.V1;
|
||||||
|
using BNetServer.Services;
|
||||||
|
using Framework.Constants;
|
||||||
|
using Google.Protobuf;
|
||||||
|
|
||||||
|
namespace BNetServer.Networking
|
||||||
|
{
|
||||||
|
class AccountService : ServiceBase
|
||||||
|
{
|
||||||
|
public AccountService(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 12:
|
||||||
|
{
|
||||||
|
GameAccountHandle request = new GameAccountHandle();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
GameAccountBlob response = new GameAccountBlob();
|
||||||
|
BattlenetRpcErrorCode status = HandleGetGameAccountBlob(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.GetGameAccountBlob(GameAccountHandle: {1}) returned GameAccountBlob: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 13:
|
||||||
|
{
|
||||||
|
GetAccountRequest request = new GetAccountRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
GetAccountResponse response = new GetAccountResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleGetAccount(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.GetAccount(GetAccountRequest: {1}) returned GetAccountResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 14:
|
||||||
|
{
|
||||||
|
CreateGameAccountRequest request = new CreateGameAccountRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
GameAccountHandle response = new GameAccountHandle();
|
||||||
|
BattlenetRpcErrorCode status = HandleCreateGameAccount(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.CreateGameAccount(CreateGameAccountRequest: {1}) returned GameAccountHandle: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 15:
|
||||||
|
{
|
||||||
|
IsIgrAddressRequest request = new IsIgrAddressRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleIsIgrAddress(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.IsIgrAddress(IsIgrAddressRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 20:
|
||||||
|
{
|
||||||
|
CacheExpireRequest request = new CacheExpireRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleCacheExpire(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.CacheExpire(CacheExpireRequest: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 21:
|
||||||
|
{
|
||||||
|
CredentialUpdateRequest request = new CredentialUpdateRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
CredentialUpdateResponse response = new CredentialUpdateResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleCredentialUpdate(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.CredentialUpdate(CredentialUpdateRequest: {1}) returned CredentialUpdateResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 25:
|
||||||
|
{
|
||||||
|
SubscriptionUpdateRequest request = new SubscriptionUpdateRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
SubscriptionUpdateResponse response = new SubscriptionUpdateResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleSubscribe(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.Subscribe(SubscriptionUpdateRequest: {1}) returned SubscriptionUpdateResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 26:
|
||||||
|
{
|
||||||
|
SubscriptionUpdateRequest request = new SubscriptionUpdateRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleUnsubscribe(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.Unsubscribe(SubscriptionUpdateRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 30:
|
||||||
|
{
|
||||||
|
GetAccountStateRequest request = new GetAccountStateRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
GetAccountStateResponse response = new GetAccountStateResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleGetAccountState(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.GetAccountState(GetAccountStateRequest: {1}) returned GetAccountStateResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 31:
|
||||||
|
{
|
||||||
|
GetGameAccountStateRequest request = new GetGameAccountStateRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
GetGameAccountStateResponse response = new GetGameAccountStateResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleGetGameAccountState(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.GetGameAccountState(GetGameAccountStateRequest: {1}) returned GetGameAccountStateResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 32:
|
||||||
|
{
|
||||||
|
GetLicensesRequest request = new GetLicensesRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
GetLicensesResponse response = new GetLicensesResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleGetLicenses(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.GetLicenses(GetLicensesRequest: {1}) returned GetLicensesResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 33:
|
||||||
|
{
|
||||||
|
GetGameTimeRemainingInfoRequest request = new GetGameTimeRemainingInfoRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
GetGameTimeRemainingInfoResponse response = new GetGameTimeRemainingInfoResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleGetGameTimeRemainingInfo(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.GetGameTimeRemainingInfo(GetGameTimeRemainingInfoRequest: {1}) returned GetGameTimeRemainingInfoResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 34:
|
||||||
|
{
|
||||||
|
GetGameSessionInfoRequest request = new GetGameSessionInfoRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
GetGameSessionInfoResponse response = new GetGameSessionInfoResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleGetGameSessionInfo(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.GetGameSessionInfo(GetGameSessionInfoRequest: {1}) returned GetGameSessionInfoResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 35:
|
||||||
|
{
|
||||||
|
GetCAISInfoRequest request = new GetCAISInfoRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
GetCAISInfoResponse response = new GetCAISInfoResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleGetCAISInfo(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.GetCAISInfo(GetCAISInfoRequest: {1}) returned GetCAISInfoResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 36:
|
||||||
|
{
|
||||||
|
ForwardCacheExpireRequest request = new ForwardCacheExpireRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleForwardCacheExpire(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.ForwardCacheExpire(ForwardCacheExpireRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 37:
|
||||||
|
{
|
||||||
|
GetAuthorizedDataRequest request = new GetAuthorizedDataRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
GetAuthorizedDataResponse response = new GetAuthorizedDataResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleGetAuthorizedData(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.GetAuthorizedData(GetAuthorizedDataRequest: {1}) returned GetAuthorizedDataResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 38:
|
||||||
|
{
|
||||||
|
AccountFlagUpdateRequest request = new AccountFlagUpdateRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleAccountFlagUpdate(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.AccountFlagUpdate(AccountFlagUpdateRequest: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 39:
|
||||||
|
{
|
||||||
|
GameAccountFlagUpdateRequest request = new GameAccountFlagUpdateRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleGameAccountFlagUpdate(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.GameAccountFlagUpdate(GameAccountFlagUpdateRequest: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* case 40:
|
||||||
|
{
|
||||||
|
UpdateParentalControlsAndCAISRequest request = new UpdateParentalControlsAndCAISRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleUpdateParentalControlsAndCAIS(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.UpdateParentalControlsAndCAIS(UpdateParentalControlsAndCAISRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 41:
|
||||||
|
{
|
||||||
|
CreateGameAccountRequest request = new CreateGameAccountRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
CreateGameAccountResponse response = new CreateGameAccountResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleCreateGameAccount2(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.CreateGameAccount2(CreateGameAccountRequest: {1}) returned CreateGameAccountResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 42:
|
||||||
|
{
|
||||||
|
GetGameAccountRequest request = new GetGameAccountRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
GetGameAccountResponse response = new GetGameAccountResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleGetGameAccount(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.GetGameAccount(GetGameAccountRequest: {1}) returned GetGameAccountResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, &response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 43:
|
||||||
|
{
|
||||||
|
QueueDeductRecordRequest request = new QueueDeductRecordRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleQueueDeductRecord(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountService.QueueDeductRecord(QueueDeductRecordRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}*/
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGetGameAccountBlob(GameAccountHandle request, GameAccountBlob response)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.GetAccount({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGetAccount(GetAccountRequest request, GetAccountResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.GetAccount({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleCreateGameAccount(CreateGameAccountRequest request, GameAccountHandle response)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.CreateGameAccount({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleIsIgrAddress(IsIgrAddressRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.IsIgrAddress({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleCacheExpire(CacheExpireRequest request)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.CacheExpire({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleCredentialUpdate(CredentialUpdateRequest request, CredentialUpdateResponse response)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.CredentialUpdate({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleSubscribe(SubscriptionUpdateRequest request, SubscriptionUpdateResponse response)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.Subscribe({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleUnsubscribe(SubscriptionUpdateRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.Unsubscribe({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGetAccountState(GetAccountStateRequest request, GetAccountStateResponse response)
|
||||||
|
{
|
||||||
|
return _session.HandleGetAccountState(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGetGameAccountState(GetGameAccountStateRequest request, GetGameAccountStateResponse response)
|
||||||
|
{
|
||||||
|
return _session.HandleGetGameAccountState(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGetLicenses(GetLicensesRequest request, GetLicensesResponse response)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.GetLicenses({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGetGameTimeRemainingInfo(GetGameTimeRemainingInfoRequest request, GetGameTimeRemainingInfoResponse response)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.GetGameTimeRemainingInfo({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGetGameSessionInfo(GetGameSessionInfoRequest request, GetGameSessionInfoResponse response)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.GetGameSessionInfo({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGetCAISInfo(GetCAISInfoRequest request, GetCAISInfoResponse response)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.GetCAISInfo({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleForwardCacheExpire(ForwardCacheExpireRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.ForwardCacheExpire({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGetAuthorizedData(GetAuthorizedDataRequest request, GetAuthorizedDataResponse response)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.GetAuthorizedData({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleAccountFlagUpdate(AccountFlagUpdateRequest request)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.AccountFlagUpdate({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGameAccountFlagUpdate(GameAccountFlagUpdateRequest request)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.GameAccountFlagUpdate({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*BattlenetRpcErrorCode HandleUpdateParentalControlsAndCAIS(UpdateParentalControlsAndCAISRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.UpdateParentalControlsAndCAIS: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleCreateGameAccount2(CreateGameAccountRequest request, CreateGameAccountResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.CreateGameAccount2: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGetGameAccount(GetGameAccountRequest request, GetGameAccountResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.GetGameAccount: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleQueueDeductRecord(QueueDeductRecordRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountService.QueueDeductRecord: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
class AccountListener : ServiceBase
|
||||||
|
{
|
||||||
|
public AccountListener(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
AccountStateNotification request = new AccountStateNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnAccountStateUpdated(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountListener.OnAccountStateUpdated(AccountStateNotification: {1} status: {2}.", GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
GameAccountStateNotification request = new GameAccountStateNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnGameAccountStateUpdated(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountListener.OnGameAccountStateUpdated(GameAccountStateNotification: {1} status: {2}.", GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
GameAccountNotification request = new GameAccountNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnGameAccountsUpdated(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountListener.OnGameAccountsUpdated(GameAccountNotification: {1} status: {2}.", GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
GameAccountSessionNotification request = new GameAccountSessionNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnGameSessionUpdated(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AccountListener.OnGameSessionUpdated(GameAccountSessionNotification: {1} status: {2}.", GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnAccountStateUpdated(AccountStateNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountListener.OnAccountStateUpdated: {1}", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnGameAccountStateUpdated(GameAccountStateNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountListener.OnGameAccountStateUpdated: {1}", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnGameAccountsUpdated(GameAccountNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountListener.OnGameAccountsUpdated: {1}", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnGameSessionUpdated(GameAccountSessionNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AccountListener.OnGameSessionUpdated: {1}", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,442 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Bgs.Protocol;
|
||||||
|
using Bgs.Protocol.Authentication.V1;
|
||||||
|
using BNetServer.Services;
|
||||||
|
using Framework.Constants;
|
||||||
|
using Google.Protobuf;
|
||||||
|
|
||||||
|
namespace BNetServer.Networking
|
||||||
|
{
|
||||||
|
class AuthenticationService : ServiceBase
|
||||||
|
{
|
||||||
|
public AuthenticationService(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
LogonRequest request = new LogonRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleLogon(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationService.Logon(bgs.protocol.authentication.v1.LogonRequest: {1}) returned bgs.protocol.NoData: {2} status {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
ModuleNotification request = new ModuleNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleModuleNotify(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationService.ModuleNotify(bgs.protocol.authentication.v1.ModuleNotification: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
ModuleMessageRequest request = new ModuleMessageRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleModuleMessage(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationService.ModuleMessage(bgs.protocol.authentication.v1.ModuleMessageRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
EntityId request = new EntityId();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleSelectGameAccount_DEPRECATED(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationService.SelectGameAccount_DEPRECATED(bgs.protocol.EntityId: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 5:
|
||||||
|
{
|
||||||
|
GenerateSSOTokenRequest request = new GenerateSSOTokenRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
GenerateSSOTokenResponse response = new GenerateSSOTokenResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleGenerateSSOToken(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationService.GenerateSSOToken(bgs.protocol.authentication.v1.GenerateSSOTokenRequest: {1}) returned bgs.protocol.authentication.v1.GenerateSSOTokenResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
SelectGameAccountRequest request = new SelectGameAccountRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleSelectGameAccount(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationService.SelectGameAccount(bgs.protocol.authentication.v1.SelectGameAccountRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 7:
|
||||||
|
{
|
||||||
|
VerifyWebCredentialsRequest request = new VerifyWebCredentialsRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleVerifyWebCredentials(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationService.VerifyWebCredentials(bgs.protocol.authentication.v1.VerifyWebCredentialsRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 8:
|
||||||
|
{
|
||||||
|
GenerateWebCredentialsRequest request = new GenerateWebCredentialsRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
GenerateWebCredentialsResponse response = new GenerateWebCredentialsResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleGenerateWebCredentials(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationService.GenerateWebCredentials(bgs.protocol.authentication.v1.GenerateWebCredentialsRequest: {1}) returned bgs.protocol.authentication.v1.GenerateWebCredentialsResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleLogon(LogonRequest request, NoData response)
|
||||||
|
{
|
||||||
|
return _session.HandleLogon(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleModuleNotify(ModuleNotification request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationService.ModuleNotify: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleModuleMessage(ModuleMessageRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationService.ModuleMessage: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleSelectGameAccount_DEPRECATED(EntityId request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationService.SelectGameAccount_DEPRECATED: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGenerateSSOToken(GenerateSSOTokenRequest request, GenerateSSOTokenResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationService.GenerateSSOToken: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleSelectGameAccount(SelectGameAccountRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationService.SelectGameAccount: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleVerifyWebCredentials(VerifyWebCredentialsRequest request, NoData response)
|
||||||
|
{
|
||||||
|
return _session.HandleVerifyWebCredentials(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGenerateWebCredentials(GenerateWebCredentialsRequest request, GenerateWebCredentialsResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationService.GenerateWebCredentials: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AuthenticationListener : ServiceBase
|
||||||
|
{
|
||||||
|
public AuthenticationListener(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
ModuleLoadRequest request = new ModuleLoadRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnModuleLoad(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationListener.OnModuleLoad(bgs.protocol.authentication.v1.ModuleLoadRequest: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
ModuleMessageRequest request = new ModuleMessageRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleOnModuleMessage(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationListener.OnModuleMessage(bgs.protocol.authentication.v1.ModuleMessageRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
ServerStateChangeRequest request = new ServerStateChangeRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnServerStateChange(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationListener.OnServerStateChange(bgs.protocol.authentication.v1.ServerStateChangeRequest: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 5:
|
||||||
|
{
|
||||||
|
LogonResult request = new LogonResult();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnLogonComplete(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationListener.OnLogonComplete(bgs.protocol.authentication.v1.LogonResult: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
MemModuleLoadRequest request = new MemModuleLoadRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
MemModuleLoadResponse response = new MemModuleLoadResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleOnMemModuleLoad(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationListener.OnMemModuleLoad(bgs.protocol.authentication.v1.MemModuleLoadRequest: {1}) returned bgs.protocol.authentication.v1.MemModuleLoadResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 10:
|
||||||
|
{
|
||||||
|
LogonUpdateRequest request = new LogonUpdateRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnLogonUpdate(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationListener.OnLogonUpdate(bgs.protocol.authentication.v1.LogonUpdateRequest: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 11:
|
||||||
|
{
|
||||||
|
VersionInfoNotification request = new VersionInfoNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnVersionInfoUpdated(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationListener.OnVersionInfoUpdated(bgs.protocol.authentication.v1.VersionInfoNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 12:
|
||||||
|
{
|
||||||
|
LogonQueueUpdateRequest request = new LogonQueueUpdateRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnLogonQueueUpdate(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationListener.OnLogonQueueUpdate(bgs.protocol.authentication.v1.LogonQueueUpdateRequest: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 13:
|
||||||
|
{
|
||||||
|
NoData request = new NoData();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnLogonQueueEnd(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationListener.OnLogonQueueEnd(bgs.protocol.NoData: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 14:
|
||||||
|
{
|
||||||
|
GameAccountSelectedRequest request = new GameAccountSelectedRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnGameAccountSelected(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method AuthenticationListener.OnGameAccountSelected(bgs.protocol.authentication.v1.GameAccountSelectedRequest: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnModuleLoad(ModuleLoadRequest request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationListener.OnModuleLoad: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnModuleMessage(ModuleMessageRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationListener.OnModuleMessage: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnServerStateChange(ServerStateChangeRequest request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationListener.OnServerStateChange: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnLogonComplete(LogonResult request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationListener.OnLogonComplete: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnMemModuleLoad(MemModuleLoadRequest request, MemModuleLoadResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationListener.OnMemModuleLoad: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnLogonUpdate(LogonUpdateRequest request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationListener.OnLogonUpdate: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnVersionInfoUpdated(VersionInfoNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationListener.OnVersionInfoUpdated: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnLogonQueueUpdate(LogonQueueUpdateRequest request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationListener.OnLogonQueueUpdate: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnLogonQueueEnd(NoData request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationListener.OnLogonQueueEnd: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnGameAccountSelected(GameAccountSelectedRequest request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method AuthenticationListener.OnGameAccountSelected: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,228 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Bgs.Protocol;
|
||||||
|
using Bgs.Protocol.Challenge.V1;
|
||||||
|
using BNetServer.Services;
|
||||||
|
using Framework.Constants;
|
||||||
|
using Google.Protobuf;
|
||||||
|
|
||||||
|
namespace BNetServer.Networking
|
||||||
|
{
|
||||||
|
class ChallengeService : ServiceBase
|
||||||
|
{
|
||||||
|
public ChallengeService(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
ChallengePickedRequest request = new ChallengePickedRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
ChallengePickedResponse response = new ChallengePickedResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleChallengePicked(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChallengeService.ChallengePicked(bgs.protocol.challenge.v1.ChallengePickedRequest: {1}) returned bgs.protocol.challenge.v1.ChallengePickedResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
ChallengeAnsweredRequest request = new ChallengeAnsweredRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
ChallengeAnsweredResponse response = new ChallengeAnsweredResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleChallengeAnswered(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChallengeService.ChallengeAnswered(bgs.protocol.challenge.v1.ChallengeAnsweredRequest: {1}) returned bgs.protocol.challenge.v1.ChallengeAnsweredResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
ChallengeCancelledRequest request = new ChallengeCancelledRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleChallengeCancelled(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChallengeService.ChallengeCancelled(bgs.protocol.challenge.v1.ChallengeCancelledRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
SendChallengeToUserRequest request = new SendChallengeToUserRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
SendChallengeToUserResponse response = new SendChallengeToUserResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleSendChallengeToUser(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChallengeService.SendChallengeToUser(bgs.protocol.challenge.v1.SendChallengeToUserRequest: {1}) returned bgs.protocol.challenge.v1.SendChallengeToUserResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleChallengePicked(ChallengePickedRequest request, ChallengePickedResponse response) {
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChallengeService.ChallengePicked: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleChallengeAnswered(ChallengeAnsweredRequest request, ChallengeAnsweredResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChallengeService.ChallengeAnswered: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleChallengeCancelled(ChallengeCancelledRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChallengeService.ChallengeCancelled: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleSendChallengeToUser(SendChallengeToUserRequest request, SendChallengeToUserResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChallengeService.SendChallengeToUser: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class ChallengeListener : ServiceBase
|
||||||
|
{
|
||||||
|
public ChallengeListener(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
ChallengeUserRequest request = new ChallengeUserRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnChallengeUser(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChallengeListener.OnChallengeUser(bgs.protocol.challenge.v1.ChallengeUserRequest: {1} status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
ChallengeResultRequest request = new ChallengeResultRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnChallengeResult(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChallengeListener.OnChallengeResult(bgs.protocol.challenge.v1.ChallengeResultRequest: {1} status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
ChallengeExternalRequest request = new ChallengeExternalRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnExternalChallenge(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChallengeListener.OnExternalChallenge(bgs.protocol.challenge.v1.ChallengeExternalRequest: {1} status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
ChallengeExternalResult request = new ChallengeExternalResult();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnExternalChallengeResult(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChallengeListener.OnExternalChallengeResult(bgs.protocol.challenge.v1.ChallengeExternalResult: {1} status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnChallengeUser(ChallengeUserRequest request) {
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChallengeListener.OnChallengeUser: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnChallengeResult(ChallengeResultRequest request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChallengeListener.OnChallengeResult: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnExternalChallenge(ChallengeExternalRequest request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChallengeListener.OnExternalChallenge: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnExternalChallengeResult(ChallengeExternalResult request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChallengeListener.OnExternalChallengeResult: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,312 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Bgs.Protocol;
|
||||||
|
using Bgs.Protocol.Channel.V1;
|
||||||
|
using BNetServer.Services;
|
||||||
|
using Framework.Constants;
|
||||||
|
using Google.Protobuf;
|
||||||
|
|
||||||
|
namespace BNetServer.Networking
|
||||||
|
{
|
||||||
|
class ChannelService : ServiceBase
|
||||||
|
{
|
||||||
|
public ChannelService(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
RemoveMemberRequest request = new RemoveMemberRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleRemoveMember(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChannelService.RemoveMember(bgs.protocol.channel.v1.RemoveMemberRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
SendMessageRequest request = new SendMessageRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleSendMessage(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChannelService.SendMessage(bgs.protocol.channel.v1.SendMessageRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
UpdateChannelStateRequest request = new UpdateChannelStateRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleUpdateChannelState(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChannelService.UpdateChannelState(bgs.protocol.channel.v1.UpdateChannelStateRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 5:
|
||||||
|
{
|
||||||
|
UpdateMemberStateRequest request = new UpdateMemberStateRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleUpdateMemberState(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChannelService.UpdateMemberState(bgs.protocol.channel.v1.UpdateMemberStateRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
DissolveRequest request = new DissolveRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleDissolve(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChannelService.Dissolve(bgs.protocol.channel.v1.DissolveRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleRemoveMember(RemoveMemberRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChannelService.RemoveMember: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleSendMessage(SendMessageRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChannelService.SendMessage: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleUpdateChannelState(UpdateChannelStateRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChannelService.UpdateChannelState: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleUpdateMemberState(UpdateMemberStateRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChannelService.UpdateMemberState: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleDissolve(DissolveRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChannelService.Dissolve: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ChannelListener : ServiceBase
|
||||||
|
{
|
||||||
|
public ChannelListener(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
JoinNotification request = new JoinNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnJoin(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChannelListener.OnJoin(bgs.protocol.channel.v1.JoinNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
MemberAddedNotification request = new MemberAddedNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnMemberAdded(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChannelListener.OnMemberAdded(bgs.protocol.channel.v1.MemberAddedNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
LeaveNotification request = new LeaveNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnLeave(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChannelListener.OnLeave(bgs.protocol.channel.v1.LeaveNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
MemberRemovedNotification request = new MemberRemovedNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnMemberRemoved(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChannelListener.OnMemberRemoved(bgs.protocol.channel.v1.MemberRemovedNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 5:
|
||||||
|
{
|
||||||
|
SendMessageNotification request = new SendMessageNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnSendMessage(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChannelListener.OnSendMessage(bgs.protocol.channel.v1.SendMessageNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
UpdateChannelStateNotification request = new UpdateChannelStateNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnUpdateChannelState(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChannelListener.OnUpdateChannelState(bgs.protocol.channel.v1.UpdateChannelStateNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 7:
|
||||||
|
{
|
||||||
|
UpdateMemberStateNotification request = new UpdateMemberStateNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnUpdateMemberState(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ChannelListener.OnUpdateMemberState(bgs.protocol.channel.v1.UpdateMemberStateNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnJoin(JoinNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChannelListener.OnJoin: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnMemberAdded(MemberAddedNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChannelListener.OnMemberAdded: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnLeave(LeaveNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChannelListener.OnLeave: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnMemberRemoved(MemberRemovedNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChannelListener.OnMemberRemoved: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnSendMessage(SendMessageNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChannelListener.OnSendMessage: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnUpdateChannelState(UpdateChannelStateNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChannelListener.OnUpdateChannelState: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnUpdateMemberState(UpdateMemberStateNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ChannelListener.OnUpdateMemberState: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,187 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Bgs.Protocol;
|
||||||
|
using Bgs.Protocol.Connection.V1;
|
||||||
|
using BNetServer.Services;
|
||||||
|
using Framework.Constants;
|
||||||
|
using Google.Protobuf;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
|
namespace BNetServer.Networking
|
||||||
|
{
|
||||||
|
class ConnectionService : ServiceBase
|
||||||
|
{
|
||||||
|
public ConnectionService(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
ConnectRequest request = ConnectRequest.Parser.ParseFrom(stream);
|
||||||
|
ConnectResponse response = new ConnectResponse();
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleConnect(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ConnectionService.Connect(bgs.protocol.connection.v1.ConnectRequest: {1}) returned bgs.protocol.connection.v1.ConnectResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
BindRequest request = new BindRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
BindResponse response = new BindResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleBind(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ConnectionService.Bind(bgs.protocol.connection.v1.BindRequest: {1}) returned bgs.protocol.connection.v1.BindResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
EchoRequest request = new EchoRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
EchoResponse response = new EchoResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleEcho(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ConnectionService.Echo(bgs.protocol.connection.v1.EchoRequest: {1}) returned bgs.protocol.connection.v1.EchoResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
DisconnectNotification request = DisconnectNotification.Parser.ParseFrom(stream);
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleForceDisconnect(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ConnectionService.ForceDisconnect(bgs.protocol.connection.v1.DisconnectNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 5:
|
||||||
|
{
|
||||||
|
NoData request = NoData.Parser.ParseFrom(stream);
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleKeepAlive(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ConnectionService.KeepAlive(bgs.protocol.NoData: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
EncryptRequest request = EncryptRequest.Parser.ParseFrom(stream);
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleEncrypt(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ConnectionService.Encrypt(bgs.protocol.connection.v1.EncryptRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 7:
|
||||||
|
{
|
||||||
|
DisconnectRequest request = DisconnectRequest.Parser.ParseFrom(stream);
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleRequestDisconnect(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ConnectionService.RequestDisconnect(bgs.protocol.connection.v1.DisconnectRequest: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleConnect(ConnectRequest request, ConnectResponse response)
|
||||||
|
{
|
||||||
|
if (request.ClientId != null)
|
||||||
|
response.ClientId.MergeFrom(request.ClientId);
|
||||||
|
|
||||||
|
response.ServerId = new ProcessId();
|
||||||
|
response.ServerId.Label = (uint)Process.GetCurrentProcess().Id;
|
||||||
|
response.ServerId.Epoch = (uint)Time.UnixTime;
|
||||||
|
response.ServerTime = (ulong)Time.UnixTimeMilliseconds;
|
||||||
|
|
||||||
|
response.UseBindlessRpc = request.UseBindlessRpc;
|
||||||
|
|
||||||
|
return BattlenetRpcErrorCode.Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleBind(BindRequest request, BindResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ConnectionService.Bind: {1}", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleEcho(EchoRequest request, EchoResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ConnectionService.Echo: {1}", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleForceDisconnect(DisconnectNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ConnectionService.ForceDisconnect: {1}", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleKeepAlive(NoData request)
|
||||||
|
{
|
||||||
|
return BattlenetRpcErrorCode.Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleEncrypt(EncryptRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ConnectionService.Encrypt: {1}", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleRequestDisconnect(DisconnectRequest request)
|
||||||
|
{
|
||||||
|
var disconnectNotification = new DisconnectNotification();
|
||||||
|
disconnectNotification.ErrorCode = request.ErrorCode;
|
||||||
|
SendRequest(4, disconnectNotification);
|
||||||
|
|
||||||
|
_session.CloseSocket();
|
||||||
|
return BattlenetRpcErrorCode.Ok;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,520 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Bgs.Protocol;
|
||||||
|
using Bgs.Protocol.Friends.V1;
|
||||||
|
using BNetServer.Services;
|
||||||
|
using Framework.Constants;
|
||||||
|
using Google.Protobuf;
|
||||||
|
|
||||||
|
namespace BNetServer.Networking
|
||||||
|
{
|
||||||
|
class FriendsService : ServiceBase
|
||||||
|
{
|
||||||
|
public FriendsService(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
SubscribeRequest request = new SubscribeRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
SubscribeResponse response = new SubscribeResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleSubscribe(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsService.Subscribe(bgs.protocol.friends.v1.SubscribeRequest: {1}) returned bgs.protocol.friends.v1.SubscribeResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
SendInvitationRequest request = new SendInvitationRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleSendInvitation(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsService.SendInvitation(bgs.protocol.SendInvitationRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
GenericInvitationRequest request = new GenericInvitationRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleAcceptInvitation(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsService.AcceptInvitation(bgs.protocol.GenericInvitationRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
GenericInvitationRequest request = new GenericInvitationRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleRevokeInvitation(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsService.RevokeInvitation(bgs.protocol.GenericInvitationRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 5:
|
||||||
|
{
|
||||||
|
GenericInvitationRequest request = new GenericInvitationRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleDeclineInvitation(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsService.DeclineInvitation(bgs.protocol.GenericInvitationRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
GenericInvitationRequest request = new GenericInvitationRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleIgnoreInvitation(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsService.IgnoreInvitation(bgs.protocol.GenericInvitationRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 7:
|
||||||
|
{
|
||||||
|
AssignRoleRequest request = new AssignRoleRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleAssignRole(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsService.AssignRole(bgs.protocol.friends.v1.AssignRoleRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 8:
|
||||||
|
{
|
||||||
|
GenericFriendRequest request = new GenericFriendRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
GenericFriendResponse response = new GenericFriendResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleRemoveFriend(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsService.RemoveFriend(bgs.protocol.friends.v1.GenericFriendRequest: {1}) returned bgs.protocol.friends.v1.GenericFriendResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 9:
|
||||||
|
{
|
||||||
|
ViewFriendsRequest request = new ViewFriendsRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
ViewFriendsResponse response = new ViewFriendsResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleViewFriends(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsService.ViewFriends(bgs.protocol.friends.v1.ViewFriendsRequest: {1}) returned bgs.protocol.friends.v1.ViewFriendsResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 10:
|
||||||
|
{
|
||||||
|
UpdateFriendStateRequest request = new UpdateFriendStateRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleUpdateFriendState(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsService.UpdateFriendState(bgs.protocol.friends.v1.UpdateFriendStateRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 11:
|
||||||
|
{
|
||||||
|
UnsubscribeRequest request = new UnsubscribeRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleUnsubscribe(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsService.Unsubscribe(bgs.protocol.friends.v1.UnsubscribeRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 12:
|
||||||
|
{
|
||||||
|
GenericFriendRequest request = new GenericFriendRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleRevokeAllInvitations(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsService.RevokeAllInvitations(bgs.protocol.friends.v1.GenericFriendRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/*case 13:
|
||||||
|
{
|
||||||
|
GetFriendListRequest request = new GetFriendListRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
GetFriendListResponse response = new GetFriendListResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleGetFriendList(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsService.GetFriendList(bgs.protocol.friends.v1.GetFriendListRequest: {1}) returned bgs.protocol.friends.v1.GetFriendListResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 14:
|
||||||
|
{
|
||||||
|
CreateFriendshipRequest request = new CreateFriendshipRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleCreateFriendship(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsService.CreateFriendship(bgs.protocol.friends.v1.CreateFriendshipRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}*/
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleSubscribe(SubscribeRequest request, SubscribeResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsService.Subscribe: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleSendInvitation(SendInvitationRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsService.SendInvitation: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleAcceptInvitation(GenericInvitationRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsService.AcceptInvitation: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleRevokeInvitation(GenericInvitationRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsService.RevokeInvitation: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleDeclineInvitation(GenericInvitationRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsService.DeclineInvitation: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleIgnoreInvitation(GenericInvitationRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsService.IgnoreInvitation: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleAssignRole(AssignRoleRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsService.AssignRole: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleRemoveFriend(GenericFriendRequest request, GenericFriendResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsService.RemoveFriend: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleViewFriends(ViewFriendsRequest request, ViewFriendsResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsService.ViewFriends: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleUpdateFriendState(UpdateFriendStateRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsService.UpdateFriendState: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleUnsubscribe(UnsubscribeRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsService.Unsubscribe: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleRevokeAllInvitations(GenericFriendRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsService.RevokeAllInvitations: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*BattlenetRpcErrorCode HandleGetFriendList(GetFriendListRequest request, GetFriendListResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsService.GetFriendList: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleCreateFriendship(CreateFriendshipRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsService.CreateFriendship: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
class FriendsListener : ServiceBase
|
||||||
|
{
|
||||||
|
public FriendsListener(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
FriendNotification request = new FriendNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnFriendAdded(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsListener.OnFriendAdded(bgs.protocol.friends.v1.FriendNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
FriendNotification request = new FriendNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnFriendRemoved(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsListener.OnFriendRemoved(bgs.protocol.friends.v1.FriendNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
InvitationNotification request = new InvitationNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnReceivedInvitationAdded(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsListener.OnReceivedInvitationAdded(bgs.protocol.friends.v1.InvitationNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
InvitationNotification request = new InvitationNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnReceivedInvitationRemoved(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsListener.OnReceivedInvitationRemoved(bgs.protocol.friends.v1.InvitationNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 5:
|
||||||
|
{
|
||||||
|
InvitationNotification request = new InvitationNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnSentInvitationAdded(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsListener.OnSentInvitationAdded(bgs.protocol.friends.v1.InvitationNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
InvitationNotification request = new InvitationNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnSentInvitationRemoved(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsListener.OnSentInvitationRemoved(bgs.protocol.friends.v1.InvitationNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 7:
|
||||||
|
{
|
||||||
|
UpdateFriendStateNotification request = new UpdateFriendStateNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnUpdateFriendState(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method FriendsListener.OnUpdateFriendState(bgs.protocol.friends.v1.UpdateFriendStateNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnFriendAdded(FriendNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsListener.OnFriendAdded: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnFriendRemoved(FriendNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsListener.OnFriendRemoved: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnReceivedInvitationAdded(InvitationNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsListener.OnReceivedInvitationAdded: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnReceivedInvitationRemoved(InvitationNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsListener.OnReceivedInvitationRemoved: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnSentInvitationAdded(InvitationNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsListener.OnSentInvitationAdded: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnSentInvitationRemoved(InvitationNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsListener.OnSentInvitationRemoved: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnUpdateFriendState(UpdateFriendStateNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method FriendsListener.OnUpdateFriendState: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,215 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Bgs.Protocol;
|
||||||
|
using Bgs.Protocol.GameUtilities.V1;
|
||||||
|
using BNetServer.Services;
|
||||||
|
using Framework.Constants;
|
||||||
|
using Google.Protobuf;
|
||||||
|
|
||||||
|
namespace BNetServer.Networking
|
||||||
|
{
|
||||||
|
class GameUtilitiesService : ServiceBase
|
||||||
|
{
|
||||||
|
public GameUtilitiesService(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
ClientRequest request = new ClientRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
ClientResponse response = new ClientResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleProcessClientRequest(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method GameUtilitiesService.ProcessClientRequest(bgs.protocol.game_utilities.v1.ClientRequest: {1}) returned bgs.protocol.game_utilities.v1.ClientResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
PresenceChannelCreatedRequest request = new PresenceChannelCreatedRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandlePresenceChannelCreated(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method GameUtilitiesService.PresenceChannelCreated(bgs.protocol.game_utilities.v1.PresenceChannelCreatedRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
GetPlayerVariablesRequest request = new GetPlayerVariablesRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
GetPlayerVariablesResponse response = new GetPlayerVariablesResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleGetPlayerVariables(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method GameUtilitiesService.GetPlayerVariables(bgs.protocol.game_utilities.v1.GetPlayerVariablesRequest: {1}) returned bgs.protocol.game_utilities.v1.GetPlayerVariablesResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
ServerRequest request = new ServerRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
ServerResponse response = new ServerResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleProcessServerRequest(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method GameUtilitiesService.ProcessServerRequest(bgs.protocol.game_utilities.v1.ServerRequest: {1}) returned bgs.protocol.game_utilities.v1.ServerResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 7:
|
||||||
|
{
|
||||||
|
GameAccountOnlineNotification request = new GameAccountOnlineNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnGameAccountOnline(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method GameUtilitiesService.OnGameAccountOnline(bgs.protocol.game_utilities.v1.GameAccountOnlineNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 8:
|
||||||
|
{
|
||||||
|
GameAccountOfflineNotification request = new GameAccountOfflineNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnGameAccountOffline(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method GameUtilitiesService.OnGameAccountOffline(bgs.protocol.game_utilities.v1.GameAccountOfflineNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 9:
|
||||||
|
{
|
||||||
|
GetAchievementsFileRequest request = new GetAchievementsFileRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
GetAchievementsFileResponse response = new GetAchievementsFileResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleGetAchievementsFile(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method GameUtilitiesService.GetAchievementsFile(bgs.protocol.game_utilities.v1.GetAchievementsFileRequest: {1}) returned bgs.protocol.game_utilities.v1.GetAchievementsFileResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 10:
|
||||||
|
{
|
||||||
|
GetAllValuesForAttributeRequest request = new GetAllValuesForAttributeRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
GetAllValuesForAttributeResponse response = new GetAllValuesForAttributeResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleGetAllValuesForAttribute(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method GameUtilitiesService.GetAllValuesForAttribute(bgs.protocol.game_utilities.v1.GetAllValuesForAttributeRequest: {1}) returned bgs.protocol.game_utilities.v1.GetAllValuesForAttributeResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleProcessClientRequest(ClientRequest request, ClientResponse response)
|
||||||
|
{
|
||||||
|
return _session.HandleProcessClientRequest(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandlePresenceChannelCreated(PresenceChannelCreatedRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method GameUtilitiesService.PresenceChannelCreated: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGetPlayerVariables(GetPlayerVariablesRequest request, GetPlayerVariablesResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method GameUtilitiesService.GetPlayerVariables: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleProcessServerRequest(ServerRequest request, ServerResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method GameUtilitiesService.ProcessServerRequest: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnGameAccountOnline(GameAccountOnlineNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method GameUtilitiesService.OnGameAccountOnline: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnGameAccountOffline(GameAccountOfflineNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method GameUtilitiesService.OnGameAccountOffline: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGetAchievementsFile(GetAchievementsFileRequest request, GetAchievementsFileResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method GameUtilitiesService.GetAchievementsFile: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleGetAllValuesForAttribute(GetAllValuesForAttributeRequest request, GetAllValuesForAttributeResponse response)
|
||||||
|
{
|
||||||
|
return _session.HandleGetAllValuesForAttribute(request, response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,203 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Bgs.Protocol;
|
||||||
|
using Bgs.Protocol.Presence.V1;
|
||||||
|
using BNetServer.Services;
|
||||||
|
using Framework.Constants;
|
||||||
|
using Google.Protobuf;
|
||||||
|
|
||||||
|
namespace BNetServer.Networking
|
||||||
|
{
|
||||||
|
class PresenceService : ServiceBase
|
||||||
|
{
|
||||||
|
public PresenceService(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
SubscribeRequest request = new SubscribeRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleSubscribe(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method PresenceService.Subscribe(bgs.protocol.presence.v1.SubscribeRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
UnsubscribeRequest request = new UnsubscribeRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleUnsubscribe(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method PresenceService.Unsubscribe(bgs.protocol.presence.v1.UnsubscribeRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
UpdateRequest request = new UpdateRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleUpdate(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method PresenceService.Update(bgs.protocol.presence.v1.UpdateRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
QueryRequest request = new QueryRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
QueryResponse response = new QueryResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleQuery(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method PresenceService.Query(bgs.protocol.presence.v1.QueryRequest: {1}) returned bgs.protocol.presence.v1.QueryResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 5:
|
||||||
|
{
|
||||||
|
OwnershipRequest request = new OwnershipRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleOwnership(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method PresenceService.Ownership(bgs.protocol.presence.v1.OwnershipRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 7:
|
||||||
|
{
|
||||||
|
SubscribeNotificationRequest request = new SubscribeNotificationRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleSubscribeNotification(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method PresenceService.SubscribeNotification(bgs.protocol.presence.v1.SubscribeNotificationRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/*case 8:
|
||||||
|
{
|
||||||
|
MigrateOlympusCustomMessageRequest request = new MigrateOlympusCustomMessageRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
MigrateOlympusCustomMessageResponse response = new MigrateOlympusCustomMessageResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleMigrateOlympusCustomMessage(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method PresenceService.MigrateOlympusCustomMessage(bgs.protocol.presence.v1.MigrateOlympusCustomMessageRequest: {1}) returned bgs.protocol.presence.v1.MigrateOlympusCustomMessageResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}*/
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleSubscribe(SubscribeRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method PresenceService.Subscribe: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleUnsubscribe(UnsubscribeRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method PresenceService.Unsubscribe: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleUpdate(UpdateRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method PresenceService.Update: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleQuery(QueryRequest request, QueryResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method PresenceService.Query: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOwnership(OwnershipRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method PresenceService.Ownership: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleSubscribeNotification(SubscribeNotificationRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method PresenceService.SubscribeNotification: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*BattlenetRpcErrorCode HandleMigrateOlympusCustomMessage(MigrateOlympusCustomMessageRequest request, MigrateOlympusCustomMessageResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method PresenceService.MigrateOlympusCustomMessage: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Bgs.Protocol;
|
||||||
|
using Bgs.Protocol.Report.V1;
|
||||||
|
using BNetServer.Services;
|
||||||
|
using Framework.Constants;
|
||||||
|
using Google.Protobuf;
|
||||||
|
|
||||||
|
namespace BNetServer.Networking
|
||||||
|
{
|
||||||
|
class ReportService : ServiceBase
|
||||||
|
{
|
||||||
|
public ReportService(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
SendReportRequest request = new SendReportRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleSendReport(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ReportService.SendReport(bgs.protocol.report.v1.SendReportRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/*case 2:
|
||||||
|
{
|
||||||
|
SubmitReportRequest request = new SubmitReportRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleSubmitReport(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ReportService.SubmitReport(bgs.protocol.report.v1.SubmitReportRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}*/
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleSendReport(SendReportRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ReportService.SendReport: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* BattlenetRpcErrorCode HandleSubmitReport(SubmitReportRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ReportService.SubmitReport: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using BNetServer.Services;
|
||||||
|
using Framework.Constants;
|
||||||
|
using Google.Protobuf;
|
||||||
|
|
||||||
|
namespace BNetServer.Networking
|
||||||
|
{
|
||||||
|
class ResourcesService : ServiceBase
|
||||||
|
{
|
||||||
|
public ResourcesService(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
/*case 1:
|
||||||
|
{
|
||||||
|
ContentHandleRequest request = new ContentHandleRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
ContentHandle response = new ContentHandle();
|
||||||
|
BattlenetRpcErrorCode status = HandleGetContentHandle(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method ResourcesService.GetContentHandle(bgs.protocol.resources.v1.ContentHandleRequest: {1}) returned bgs.protocol.ContentHandle: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}*/
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*BattlenetRpcErrorCode HandleGetContentHandle(ContentHandleRequest request, ContentHandle response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method ResourcesService.GetContentHandle({1})", GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2016 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using BNetServer.Networking;
|
||||||
|
using Framework.Constants;
|
||||||
|
using Google.Protobuf;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace BNetServer.Services
|
||||||
|
{
|
||||||
|
public class ServiceDispatcher : Singleton<ServiceDispatcher>
|
||||||
|
{
|
||||||
|
ServiceDispatcher()
|
||||||
|
{
|
||||||
|
AddService<AccountService>(OriginalHash.AccountService);
|
||||||
|
AddService<AccountListener>(OriginalHash.AccountListener);
|
||||||
|
AddService<AuthenticationService>(OriginalHash.AuthenticationService);
|
||||||
|
AddService<ChallengeService>(OriginalHash.ChallengeService);
|
||||||
|
AddService<ChannelService>(OriginalHash.ChannelService);
|
||||||
|
AddService<ConnectionService>(OriginalHash.ConnectionService);
|
||||||
|
AddService<FriendsService>(OriginalHash.FriendsService);
|
||||||
|
AddService<GameUtilitiesService>(OriginalHash.GameUtilitiesService);
|
||||||
|
AddService<PresenceService>(OriginalHash.PresenceService);
|
||||||
|
AddService<ReportService>(OriginalHash.ReportService);
|
||||||
|
AddService<ResourcesService>(OriginalHash.ResourcesService);
|
||||||
|
AddService<UserManagerService>(OriginalHash.UserManagerService);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispatch(Session session, uint serviceHash, uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
Log.outInfo(LogFilter.Server, "ServiceHash = {0}, methodId = {1}", serviceHash, methodId);
|
||||||
|
var action = _dispatchers.LookupByKey(serviceHash);
|
||||||
|
if (action != null)
|
||||||
|
action(session, serviceHash, token, methodId, stream);
|
||||||
|
else
|
||||||
|
Log.outDebug(LogFilter.SessionRpc, "{0} tried to call invalid service {1}", session.GetClientInfo(), serviceHash);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddService<Service>(OriginalHash OriginalHash) where Service : ServiceBase
|
||||||
|
{
|
||||||
|
_dispatchers[(uint)OriginalHash] = Dispatch<Service>;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dispatch<Service>(Session session, uint serviceHash, uint token, uint methodId, CodedInputStream stream) where Service : ServiceBase
|
||||||
|
{
|
||||||
|
var obj = (Service)Activator.CreateInstance(typeof(Service), session, serviceHash);
|
||||||
|
obj.CallServerMethod(token, methodId, stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
Dictionary<uint, DispatcherHandler> _dispatchers = new Dictionary<uint, DispatcherHandler>();
|
||||||
|
|
||||||
|
delegate void DispatcherHandler(Session session, uint serviceHash, uint token, uint methodId, CodedInputStream stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class ServiceBase
|
||||||
|
{
|
||||||
|
public ServiceBase(Session session, uint serviceHash)
|
||||||
|
{
|
||||||
|
_session = session;
|
||||||
|
_serviceHash = serviceHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void CallServerMethod(uint token, uint methodId, CodedInputStream stream);
|
||||||
|
|
||||||
|
public void SendRequest(uint methodId, IMessage request, Action<CodedInputStream> callback) { _session.SendRequest(_serviceHash, methodId, request, callback); }
|
||||||
|
public void SendRequest(uint methodId, IMessage request) { _session.SendRequest(_serviceHash, methodId, request); }
|
||||||
|
public void SendResponse(uint token, BattlenetRpcErrorCode status) { _session.SendResponse(token, status); }
|
||||||
|
public void SendResponse(uint token, IMessage response) { _session.SendResponse(token, response); }
|
||||||
|
|
||||||
|
public string GetCallerInfo()
|
||||||
|
{
|
||||||
|
return _session.GetClientInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Session _session;
|
||||||
|
protected uint _serviceHash;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,319 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Bgs.Protocol;
|
||||||
|
using Bgs.Protocol.UserManager.V1;
|
||||||
|
using BNetServer.Services;
|
||||||
|
using Framework.Constants;
|
||||||
|
using Google.Protobuf;
|
||||||
|
|
||||||
|
namespace BNetServer.Networking
|
||||||
|
{
|
||||||
|
class UserManagerService : ServiceBase
|
||||||
|
{
|
||||||
|
public UserManagerService(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
SubscribeRequest request = new SubscribeRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
SubscribeResponse response = new SubscribeResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleSubscribe(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method UserManagerService.Subscribe(bgs.protocol.user_manager.v1.SubscribeRequest: {1}) returned bgs.protocol.user_manager.v1.SubscribeResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 10:
|
||||||
|
{
|
||||||
|
AddRecentPlayersRequest request = new AddRecentPlayersRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
AddRecentPlayersResponse response = new AddRecentPlayersResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleAddRecentPlayers(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method UserManagerService.AddRecentPlayers(bgs.protocol.user_manager.v1.AddRecentPlayersRequest: {1}) returned bgs.protocol.user_manager.v1.AddRecentPlayersResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 11:
|
||||||
|
{
|
||||||
|
ClearRecentPlayersRequest request = new ClearRecentPlayersRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
ClearRecentPlayersResponse response = new ClearRecentPlayersResponse();
|
||||||
|
BattlenetRpcErrorCode status = HandleClearRecentPlayers(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method UserManagerService.ClearRecentPlayers(bgs.protocol.user_manager.v1.ClearRecentPlayersRequest: {1}) returned bgs.protocol.user_manager.v1.ClearRecentPlayersResponse: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 20:
|
||||||
|
{
|
||||||
|
BlockPlayerRequest request = new BlockPlayerRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleBlockPlayer(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method UserManagerService.BlockPlayer(bgs.protocol.user_manager.v1.BlockPlayerRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 21:
|
||||||
|
{
|
||||||
|
UnblockPlayerRequest request = new UnblockPlayerRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleUnblockPlayer(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method UserManagerService.UnblockPlayer(bgs.protocol.user_manager.v1.UnblockPlayerRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 40:
|
||||||
|
{
|
||||||
|
BlockPlayerRequest request = new BlockPlayerRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleBlockPlayerForSession(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method UserManagerService.BlockPlayerForSession(bgs.protocol.user_manager.v1.BlockPlayerRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 50:
|
||||||
|
{
|
||||||
|
EntityId request = new EntityId();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleLoadBlockList(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method UserManagerService.LoadBlockList(bgs.protocol.EntityId: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 51:
|
||||||
|
{
|
||||||
|
UnsubscribeRequest request = new UnsubscribeRequest();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
NoData response = new NoData();
|
||||||
|
BattlenetRpcErrorCode status = HandleUnsubscribe(request, response);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method UserManagerService.Unsubscribe(bgs.protocol.user_manager.v1.UnsubscribeRequest: {1}) returned bgs.protocol.NoData: {2} status: {3}.",
|
||||||
|
GetCallerInfo(), request.ToString(), response.ToString(), status);
|
||||||
|
if (status == 0)
|
||||||
|
SendResponse(token, response);
|
||||||
|
else
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleSubscribe(SubscribeRequest request, SubscribeResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method UserManagerService.Subscribe: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleAddRecentPlayers(AddRecentPlayersRequest request, AddRecentPlayersResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method UserManagerService.AddRecentPlayers: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleClearRecentPlayers(ClearRecentPlayersRequest request, ClearRecentPlayersResponse response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method UserManagerService.ClearRecentPlayers: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleBlockPlayer(BlockPlayerRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method UserManagerService.BlockPlayer: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleUnblockPlayer(UnblockPlayerRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method UserManagerService.UnblockPlayer: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleBlockPlayerForSession(BlockPlayerRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method UserManagerService.BlockPlayerForSession: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleLoadBlockList(EntityId request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method UserManagerService.LoadBlockList: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleUnsubscribe(UnsubscribeRequest request, NoData response)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method UserManagerService.Unsubscribe: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class UserManagerListener : ServiceBase
|
||||||
|
{
|
||||||
|
public UserManagerListener(Session session, uint serviceHash) : base(session, serviceHash) { }
|
||||||
|
|
||||||
|
public override void CallServerMethod(uint token, uint methodId, CodedInputStream stream)
|
||||||
|
{
|
||||||
|
switch (methodId)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
BlockedPlayerAddedNotification request = new BlockedPlayerAddedNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnBlockedPlayerAdded(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method UserManagerListener.OnBlockedPlayerAdded(bgs.protocol.user_manager.v1.BlockedPlayerAddedNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
BlockedPlayerRemovedNotification request = new BlockedPlayerRemovedNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnBlockedPlayerRemoved(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method UserManagerListener.OnBlockedPlayerRemoved(bgs.protocol.user_manager.v1.BlockedPlayerRemovedNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 11:
|
||||||
|
{
|
||||||
|
RecentPlayersAddedNotification request = new RecentPlayersAddedNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnRecentPlayersAdded(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method UserManagerListener.OnRecentPlayersAdded(bgs.protocol.user_manager.v1.RecentPlayersAddedNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 12:
|
||||||
|
{
|
||||||
|
RecentPlayersRemovedNotification request = new RecentPlayersRemovedNotification();
|
||||||
|
request.MergeFrom(stream);
|
||||||
|
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode status = HandleOnRecentPlayersRemoved(request);
|
||||||
|
Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server method UserManagerListener.OnRecentPlayersRemoved(bgs.protocol.user_manager.v1.RecentPlayersRemovedNotification: {1}) status: {2}.",
|
||||||
|
GetCallerInfo(), request.ToString(), status);
|
||||||
|
if (status != 0)
|
||||||
|
SendResponse(token, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "Bad method id {0}.", methodId);
|
||||||
|
SendResponse(token, BattlenetRpcErrorCode.RpcInvalidMethod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnBlockedPlayerAdded(BlockedPlayerAddedNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method UserManagerListener.OnBlockedPlayerAdded: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnBlockedPlayerRemoved(BlockedPlayerRemovedNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method UserManagerListener.OnBlockedPlayerRemoved: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnRecentPlayersAdded(RecentPlayersAddedNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method UserManagerListener.OnRecentPlayersAdded: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
|
BattlenetRpcErrorCode HandleOnRecentPlayersRemoved(RecentPlayersRemovedNotification request)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServiceProtobuf, "{0} Client tried to call not implemented method UserManagerListener.OnRecentPlayersRemoved: {1}",
|
||||||
|
GetCallerInfo(), request.ToString());
|
||||||
|
return BattlenetRpcErrorCode.RpcNotImplemented;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+115
@@ -0,0 +1,115 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 15
|
||||||
|
VisualStudioVersion = 15.0.26430.12
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorldServer", "WorldServer\WorldServer.csproj", "{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736} = {9E28B9C1-E473-4DAE-813F-3243CE318736}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BNetServer", "BNetServer\BNetServer.csproj", "{668E1664-FB63-47DA-9EA1-93B59851BF1E}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Game", "Game\Game.csproj", "{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Scripts", "Scripts\Scripts.csproj", "{9E28B9C1-E473-4DAE-813F-3243CE318736}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Framework", "Framework\Framework.csproj", "{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
|
Debug|x86 = Debug|x86
|
||||||
|
DebugMono|x64 = DebugMono|x64
|
||||||
|
DebugMono|x86 = DebugMono|x86
|
||||||
|
Release|x64 = Release|x64
|
||||||
|
Release|x86 = Release|x86
|
||||||
|
ReleaseMono|x64 = ReleaseMono|x64
|
||||||
|
ReleaseMono|x86 = ReleaseMono|x86
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.DebugMono|x64.ActiveCfg = Debug|x64
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.DebugMono|x64.Build.0 = Debug|x64
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.DebugMono|x86.ActiveCfg = Debug|x86
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.DebugMono|x86.Build.0 = Debug|x86
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.Release|x64.Build.0 = Release|x64
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.Release|x86.Build.0 = Release|x86
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.ReleaseMono|x64.ActiveCfg = Release|x64
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.ReleaseMono|x64.Build.0 = Release|x64
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.ReleaseMono|x86.ActiveCfg = Release|x86
|
||||||
|
{D157534F-86F1-4E8E-80B0-ECAD321ECAA6}.ReleaseMono|x86.Build.0 = Release|x86
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.DebugMono|x64.ActiveCfg = Debug|x64
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.DebugMono|x64.Build.0 = Debug|x64
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.DebugMono|x86.ActiveCfg = Debug|x86
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.DebugMono|x86.Build.0 = Debug|x86
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.Release|x64.Build.0 = Release|x64
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.Release|x86.Build.0 = Release|x86
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.ReleaseMono|x64.ActiveCfg = Release|x64
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.ReleaseMono|x64.Build.0 = Release|x64
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.ReleaseMono|x86.ActiveCfg = Release|x86
|
||||||
|
{668E1664-FB63-47DA-9EA1-93B59851BF1E}.ReleaseMono|x86.Build.0 = Release|x86
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.DebugMono|x64.ActiveCfg = Debug|x64
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.DebugMono|x64.Build.0 = Debug|x64
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.DebugMono|x86.ActiveCfg = Debug|x86
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.DebugMono|x86.Build.0 = Debug|x86
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.Release|x64.Build.0 = Release|x64
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.Release|x86.Build.0 = Release|x86
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.ReleaseMono|x64.ActiveCfg = Release|x64
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.ReleaseMono|x64.Build.0 = Release|x64
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.ReleaseMono|x86.ActiveCfg = Release|x86
|
||||||
|
{83EF8D5C-AFA1-4546-BCDD-6422D55B1515}.ReleaseMono|x86.Build.0 = Release|x86
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.DebugMono|x64.ActiveCfg = Debug|x64
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.DebugMono|x64.Build.0 = Debug|x64
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.DebugMono|x86.ActiveCfg = Debug|x86
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.DebugMono|x86.Build.0 = Debug|x86
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.Release|x64.Build.0 = Release|x64
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.Release|x86.Build.0 = Release|x86
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.ReleaseMono|x64.ActiveCfg = Release|x64
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.ReleaseMono|x64.Build.0 = Release|x64
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.ReleaseMono|x86.ActiveCfg = Release|x86
|
||||||
|
{9E28B9C1-E473-4DAE-813F-3243CE318736}.ReleaseMono|x86.Build.0 = Release|x86
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.DebugMono|x64.ActiveCfg = Debug|x64
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.DebugMono|x64.Build.0 = Debug|x64
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.DebugMono|x86.ActiveCfg = Debug|x86
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.DebugMono|x86.Build.0 = Debug|x86
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.Release|x64.Build.0 = Release|x64
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.Release|x86.Build.0 = Release|x86
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.ReleaseMono|x64.ActiveCfg = Release|x64
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.ReleaseMono|x64.Build.0 = Release|x64
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.ReleaseMono|x86.ActiveCfg = Release|x86
|
||||||
|
{82D442A9-18C0-4C59-8EC6-0DFE3E34D334}.ReleaseMono|x86.Build.0 = Release|x86
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace System.Collections.Generic
|
||||||
|
{
|
||||||
|
public class Array<T> : List<T>
|
||||||
|
{
|
||||||
|
public Array(int size) : base(size)
|
||||||
|
{
|
||||||
|
_limit = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Array(params T[] args) : base(args)
|
||||||
|
{
|
||||||
|
_limit = args.Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Array(int size, T defaultFillValue) : this(size)
|
||||||
|
{
|
||||||
|
Fill(defaultFillValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Fill(T value)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < _limit; ++i)
|
||||||
|
Add(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public new void Add(T value)
|
||||||
|
{
|
||||||
|
if (base.Count >= _limit)
|
||||||
|
throw new InternalBufferOverflowException("Attempted to read more array elements from packet " + base.Count + 1 + " than allowed " + _limit);
|
||||||
|
|
||||||
|
base.Add(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public new T this[int index]
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return base[index];
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (index >= Count)
|
||||||
|
{
|
||||||
|
if (Count >= _limit)
|
||||||
|
throw new InternalBufferOverflowException("Attempted to read more array elements from packet " + base.Count + 1 + " than allowed " + _limit);
|
||||||
|
base.Insert(index, value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
base[index] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetLimit() { return _limit; }
|
||||||
|
|
||||||
|
public static implicit operator T[] (Array<T> array)
|
||||||
|
{
|
||||||
|
return array.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
int _limit;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,414 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Diagnostics.Contracts;
|
||||||
|
|
||||||
|
namespace System.Collections
|
||||||
|
{
|
||||||
|
public class BitSet : ICollection, ICloneable
|
||||||
|
{
|
||||||
|
public BitSet(int length, bool defaultValue = false)
|
||||||
|
{
|
||||||
|
if (length < 0)
|
||||||
|
{
|
||||||
|
throw new ArgumentOutOfRangeException("length");
|
||||||
|
}
|
||||||
|
Contract.EndContractBlock();
|
||||||
|
|
||||||
|
m_array = new uint[GetArrayLength(length, BitsPerInt32)];
|
||||||
|
m_length = length;
|
||||||
|
|
||||||
|
uint fillValue = defaultValue ? 0xffffffff : 0;
|
||||||
|
for (int i = 0; i < m_array.Length; i++)
|
||||||
|
{
|
||||||
|
m_array[i] = fillValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
_version = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BitSet(uint[] values)
|
||||||
|
{
|
||||||
|
if (values == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("values");
|
||||||
|
}
|
||||||
|
Contract.EndContractBlock();
|
||||||
|
// this value is chosen to prevent overflow when computing m_length
|
||||||
|
if (values.Length > UInt32.MaxValue / BitsPerInt32)
|
||||||
|
{
|
||||||
|
throw new ArgumentException();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_array = new uint[values.Length];
|
||||||
|
m_length = values.Length * BitsPerInt32;
|
||||||
|
|
||||||
|
Array.Copy(values, m_array, values.Length);
|
||||||
|
|
||||||
|
_version = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BitSet(BitSet bits)
|
||||||
|
{
|
||||||
|
if (bits == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("bits");
|
||||||
|
}
|
||||||
|
Contract.EndContractBlock();
|
||||||
|
|
||||||
|
int arrayLength = GetArrayLength(bits.m_length, BitsPerInt32);
|
||||||
|
m_array = new uint[arrayLength];
|
||||||
|
m_length = bits.m_length;
|
||||||
|
|
||||||
|
Array.Copy(bits.m_array, m_array, arrayLength);
|
||||||
|
|
||||||
|
_version = bits._version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool this[int index]
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Get(index);
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
Set(index, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Get(int index)
|
||||||
|
{
|
||||||
|
if (index < 0 || index >= Length)
|
||||||
|
{
|
||||||
|
throw new ArgumentOutOfRangeException("index");
|
||||||
|
}
|
||||||
|
Contract.EndContractBlock();
|
||||||
|
|
||||||
|
return (Convert.ToInt64(m_array[index / 32]) & (1 << (index % 32))) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Set(int index, bool value)
|
||||||
|
{
|
||||||
|
if (index < 0 || index >= Length)
|
||||||
|
{
|
||||||
|
throw new ArgumentOutOfRangeException("index");
|
||||||
|
}
|
||||||
|
Contract.EndContractBlock();
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
{
|
||||||
|
m_array[index / 32] |= (1u << (index % 32));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_array[index / 32] &= ~(1u << (index % 32));
|
||||||
|
}
|
||||||
|
|
||||||
|
_version++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetAll(bool value)
|
||||||
|
{
|
||||||
|
uint fillValue = value ? 0xffffffff : 0u;
|
||||||
|
int ints = GetArrayLength(m_length, BitsPerInt32);
|
||||||
|
for (int i = 0; i < ints; i++)
|
||||||
|
{
|
||||||
|
m_array[i] = fillValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
_version++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BitSet And(BitSet value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
throw new ArgumentNullException("value");
|
||||||
|
if (Length != value.Length)
|
||||||
|
throw new ArgumentException();
|
||||||
|
Contract.EndContractBlock();
|
||||||
|
|
||||||
|
int ints = GetArrayLength(m_length, BitsPerInt32);
|
||||||
|
for (int i = 0; i < ints; i++)
|
||||||
|
{
|
||||||
|
m_array[i] &= value.m_array[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
_version++;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BitSet Or(BitSet value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
throw new ArgumentNullException("value");
|
||||||
|
if (Length != value.Length)
|
||||||
|
throw new ArgumentException();
|
||||||
|
Contract.EndContractBlock();
|
||||||
|
|
||||||
|
int ints = GetArrayLength(m_length, BitsPerInt32);
|
||||||
|
for (int i = 0; i < ints; i++)
|
||||||
|
{
|
||||||
|
m_array[i] |= value.m_array[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
_version++;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BitSet Xor(BitSet value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
throw new ArgumentNullException("value");
|
||||||
|
if (Length != value.Length)
|
||||||
|
throw new ArgumentException();
|
||||||
|
Contract.EndContractBlock();
|
||||||
|
|
||||||
|
int ints = GetArrayLength(m_length, BitsPerInt32);
|
||||||
|
for (int i = 0; i < ints; i++)
|
||||||
|
{
|
||||||
|
m_array[i] ^= value.m_array[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
_version++;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BitSet Not()
|
||||||
|
{
|
||||||
|
int ints = GetArrayLength(m_length, BitsPerInt32);
|
||||||
|
for (int i = 0; i < ints; i++)
|
||||||
|
{
|
||||||
|
m_array[i] = ~m_array[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
_version++;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Length
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
Contract.Ensures(Contract.Result<int>() >= 0);
|
||||||
|
return m_length;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value < 0)
|
||||||
|
{
|
||||||
|
throw new ArgumentOutOfRangeException("value");
|
||||||
|
}
|
||||||
|
Contract.EndContractBlock();
|
||||||
|
|
||||||
|
int newints = GetArrayLength(value, BitsPerInt32);
|
||||||
|
if (newints > m_array.Length || newints + _ShrinkThreshold < m_array.Length)
|
||||||
|
{
|
||||||
|
// grow or shrink (if wasting more than _ShrinkThreshold ints)
|
||||||
|
uint[] newarray = new uint[newints];
|
||||||
|
Array.Copy(m_array, newarray, newints > m_array.Length ? m_array.Length : newints);
|
||||||
|
m_array = newarray;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value > m_length)
|
||||||
|
{
|
||||||
|
// clear high bit values in the last int
|
||||||
|
int last = GetArrayLength(m_length, BitsPerInt32) - 1;
|
||||||
|
int bits = m_length % 32;
|
||||||
|
if (bits > 0)
|
||||||
|
{
|
||||||
|
m_array[last] &= (1u << bits) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear remaining int values
|
||||||
|
Array.Clear(m_array, last + 1, newints - last - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_length = value;
|
||||||
|
_version++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ICollection implementation
|
||||||
|
public void CopyTo(Array array, int index)
|
||||||
|
{
|
||||||
|
if (array == null)
|
||||||
|
throw new ArgumentNullException("array");
|
||||||
|
|
||||||
|
if (index < 0)
|
||||||
|
throw new ArgumentOutOfRangeException("index");
|
||||||
|
|
||||||
|
if (array.Rank != 1)
|
||||||
|
throw new ArgumentException();
|
||||||
|
|
||||||
|
Contract.EndContractBlock();
|
||||||
|
|
||||||
|
if (array is uint[])
|
||||||
|
{
|
||||||
|
Array.Copy(m_array, 0, array, index, GetArrayLength(m_length, BitsPerInt32));
|
||||||
|
}
|
||||||
|
else if (array is byte[])
|
||||||
|
{
|
||||||
|
int arrayLength = GetArrayLength(m_length, BitsPerByte);
|
||||||
|
if ((array.Length - index) < arrayLength)
|
||||||
|
throw new ArgumentException();
|
||||||
|
|
||||||
|
byte[] b = (byte[])array;
|
||||||
|
for (int i = 0; i < arrayLength; i++)
|
||||||
|
b[index + i] = (byte)((m_array[i / 4] >> ((i % 4) * 8)) & 0x000000FF); // Shift to bring the required byte to LSB, then mask
|
||||||
|
}
|
||||||
|
else if (array is bool[])
|
||||||
|
{
|
||||||
|
if (array.Length - index < m_length)
|
||||||
|
throw new ArgumentException();
|
||||||
|
|
||||||
|
bool[] b = (bool[])array;
|
||||||
|
for (int i = 0; i < m_length; i++)
|
||||||
|
b[index + i] = ((m_array[i / 32] >> (i % 32)) & 0x00000001) != 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw new ArgumentException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Count
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
Contract.Ensures(Contract.Result<int>() >= 0);
|
||||||
|
|
||||||
|
return (int)m_length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object Clone()
|
||||||
|
{
|
||||||
|
Contract.Ensures(Contract.Result<Object>() != null);
|
||||||
|
Contract.Ensures(((BitArray)Contract.Result<Object>()).Length == this.Length);
|
||||||
|
|
||||||
|
BitSet bitArray = new BitSet(m_array);
|
||||||
|
bitArray._version = _version;
|
||||||
|
bitArray.m_length = m_length;
|
||||||
|
return bitArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object SyncRoot
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_syncRoot == null)
|
||||||
|
{
|
||||||
|
System.Threading.Interlocked.CompareExchange<Object>(ref _syncRoot, new Object(), null);
|
||||||
|
}
|
||||||
|
return _syncRoot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsReadOnly
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsSynchronized
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerator GetEnumerator()
|
||||||
|
{
|
||||||
|
return new BitArrayEnumeratorSimple(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// XPerY=n means that n Xs can be stored in 1 Y.
|
||||||
|
private const int BitsPerInt32 = 32;
|
||||||
|
private const int BytesPerInt32 = 4;
|
||||||
|
private const int BitsPerByte = 8;
|
||||||
|
|
||||||
|
private static int GetArrayLength(int n, int div)
|
||||||
|
{
|
||||||
|
Contract.Assert(div > 0, "GetArrayLength: div arg must be greater than 0");
|
||||||
|
return n > 0 ? (((n - 1) / div) + 1) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
private class BitArrayEnumeratorSimple : IEnumerator, ICloneable
|
||||||
|
{
|
||||||
|
private BitSet bitarray;
|
||||||
|
private int index;
|
||||||
|
private int version;
|
||||||
|
private bool currentElement;
|
||||||
|
|
||||||
|
internal BitArrayEnumeratorSimple(BitSet bitarray)
|
||||||
|
{
|
||||||
|
this.bitarray = bitarray;
|
||||||
|
this.index = -1;
|
||||||
|
version = bitarray._version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object Clone()
|
||||||
|
{
|
||||||
|
return MemberwiseClone();
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual bool MoveNext()
|
||||||
|
{
|
||||||
|
//if (version != bitarray._version) throw new InvalidOperationException(Environment.GetResourceString(ResId.InvalidOperation_EnumFailedVersion));
|
||||||
|
if (index < (bitarray.Count - 1))
|
||||||
|
{
|
||||||
|
index++;
|
||||||
|
currentElement = bitarray.Get(index);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
index = bitarray.Count;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual Object Current
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (index == -1)
|
||||||
|
throw new InvalidOperationException();
|
||||||
|
if (index >= bitarray.Count)
|
||||||
|
throw new InvalidOperationException();
|
||||||
|
return currentElement;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Reset()
|
||||||
|
{
|
||||||
|
//if (version != bitarray._version) throw new InvalidOperationException(Environment.GetResourceString(ResId.InvalidOperation_EnumFailedVersion));
|
||||||
|
index = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private uint[] m_array;
|
||||||
|
private int m_length;
|
||||||
|
private int _version;
|
||||||
|
[NonSerialized]
|
||||||
|
private Object _syncRoot;
|
||||||
|
|
||||||
|
private const int _ShrinkThreshold = 256;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace System.Collections.Generic
|
||||||
|
{
|
||||||
|
public interface IMultiMap<TKey, TValue>
|
||||||
|
{
|
||||||
|
void AddRange(TKey key, IEnumerable<TValue> valueList);
|
||||||
|
List<TValue> this[TKey key] { get; set;}
|
||||||
|
bool Remove(TKey key, TValue value);
|
||||||
|
void Add(TKey key, TValue value);
|
||||||
|
bool ContainsKey(TKey key);
|
||||||
|
|
||||||
|
ICollection<TKey> Keys {get;}
|
||||||
|
bool Remove(TKey key);
|
||||||
|
ICollection<TValue> Values{get;}
|
||||||
|
|
||||||
|
void Add(KeyValuePair<TKey, TValue> item);
|
||||||
|
void Clear();
|
||||||
|
bool Contains(TKey key, TValue item);
|
||||||
|
void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex);
|
||||||
|
int Count {get;}
|
||||||
|
bool Remove(KeyValuePair<TKey, TValue> item);
|
||||||
|
|
||||||
|
List<TValue> LookupByKey(TKey key);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Collections
|
||||||
|
{
|
||||||
|
public class LinkedListElement
|
||||||
|
{
|
||||||
|
internal LinkedListElement iNext;
|
||||||
|
internal LinkedListElement iPrev;
|
||||||
|
|
||||||
|
public LinkedListElement()
|
||||||
|
{
|
||||||
|
iNext = iPrev = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
~LinkedListElement() { delink(); }
|
||||||
|
|
||||||
|
bool hasNext() { return (iNext != null && iNext.iNext != null); }
|
||||||
|
bool hasPrev() { return (iPrev != null && iPrev.iPrev != null); }
|
||||||
|
public bool isInList() { return (iNext != null && iPrev != null); }
|
||||||
|
|
||||||
|
public LinkedListElement GetNextElement() { return hasNext() ? iNext : null; }
|
||||||
|
public LinkedListElement GetPrevElement() { return hasPrev() ? iPrev : null; }
|
||||||
|
|
||||||
|
public void delink()
|
||||||
|
{
|
||||||
|
if (isInList())
|
||||||
|
{
|
||||||
|
iNext.iPrev = iPrev;
|
||||||
|
iPrev.iNext = iNext;
|
||||||
|
iNext = null;
|
||||||
|
iPrev = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void insertBefore(LinkedListElement pElem)
|
||||||
|
{
|
||||||
|
pElem.iNext = this;
|
||||||
|
pElem.iPrev = iPrev;
|
||||||
|
iPrev.iNext = pElem;
|
||||||
|
iPrev = pElem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void insertAfter(LinkedListElement pElem)
|
||||||
|
{
|
||||||
|
pElem.iPrev = this;
|
||||||
|
pElem.iNext = iNext;
|
||||||
|
iNext.iPrev = pElem;
|
||||||
|
iNext = pElem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class LinkedListHead
|
||||||
|
{
|
||||||
|
LinkedListElement iFirst = new LinkedListElement();
|
||||||
|
LinkedListElement iLast = new LinkedListElement();
|
||||||
|
uint iSize;
|
||||||
|
|
||||||
|
public LinkedListHead()
|
||||||
|
{
|
||||||
|
iSize = 0;
|
||||||
|
// create empty list
|
||||||
|
|
||||||
|
iFirst.iNext = iLast;
|
||||||
|
iLast.iPrev = iFirst;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool isEmpty() { return (!iFirst.iNext.isInList()); }
|
||||||
|
|
||||||
|
public LinkedListElement GetFirstElement() { return (isEmpty() ? null : iFirst.iNext); }
|
||||||
|
public LinkedListElement GetLastElement() { return (isEmpty() ? null : iLast.iPrev); }
|
||||||
|
|
||||||
|
public void insertFirst(LinkedListElement pElem)
|
||||||
|
{
|
||||||
|
iFirst.insertAfter(pElem);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void insertLast(LinkedListElement pElem)
|
||||||
|
{
|
||||||
|
iLast.insertBefore(pElem);
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint getSize()
|
||||||
|
{
|
||||||
|
if (iSize == 0)
|
||||||
|
{
|
||||||
|
uint result = 0;
|
||||||
|
LinkedListElement e = GetFirstElement();
|
||||||
|
while (e != null)
|
||||||
|
{
|
||||||
|
++result;
|
||||||
|
e = e.GetNextElement();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return iSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void incSize() { ++iSize; }
|
||||||
|
public void decSize() { --iSize; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,508 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace System.Collections.Generic
|
||||||
|
{
|
||||||
|
public sealed class MultiMap<TKey, TValue> : IMultiMap<TKey, TValue>, IDictionary<TKey, TValue>
|
||||||
|
{
|
||||||
|
public MultiMap() { }
|
||||||
|
|
||||||
|
public MultiMap(IEnumerable<KeyValuePair<TKey, TValue>> initialData)
|
||||||
|
{
|
||||||
|
foreach (var item in initialData)
|
||||||
|
{
|
||||||
|
Add(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Add(TKey key, TValue value)
|
||||||
|
{
|
||||||
|
if (!_interalStorage.ContainsKey(key))
|
||||||
|
_interalStorage.Add(key, new List<TValue>());
|
||||||
|
|
||||||
|
_interalStorage[key].Add(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddRange(TKey key, IEnumerable<TValue> valueList)
|
||||||
|
{
|
||||||
|
if (!_interalStorage.ContainsKey(key))
|
||||||
|
{
|
||||||
|
_interalStorage.Add(key, new List<TValue>());
|
||||||
|
}
|
||||||
|
foreach (TValue value in valueList)
|
||||||
|
{
|
||||||
|
_interalStorage[key].Add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Add(KeyValuePair<TKey, TValue> item)
|
||||||
|
{
|
||||||
|
if (!_interalStorage.ContainsKey(item.Key))
|
||||||
|
{
|
||||||
|
_interalStorage.Add(item.Key, new List<TValue>());
|
||||||
|
}
|
||||||
|
_interalStorage[item.Key].Add(item.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Remove(TKey key)
|
||||||
|
{
|
||||||
|
return _interalStorage.Remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Remove(KeyValuePair<TKey, TValue> item)
|
||||||
|
{
|
||||||
|
if (!ContainsKey(item.Key))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool val = _interalStorage[item.Key].Remove(item.Value);
|
||||||
|
|
||||||
|
if (!val)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (_interalStorage[item.Key].Empty())
|
||||||
|
_interalStorage.Remove(item.Key);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Remove(TKey key, TValue value)
|
||||||
|
{
|
||||||
|
if (!ContainsKey(key))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool val = _interalStorage[key].Remove(value);
|
||||||
|
|
||||||
|
if (!val)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (_interalStorage[key].Empty())
|
||||||
|
_interalStorage.Remove(key);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ContainsKey(TKey key)
|
||||||
|
{
|
||||||
|
return _interalStorage.ContainsKey(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Contains(KeyValuePair<TKey, TValue> item)
|
||||||
|
{
|
||||||
|
List<TValue> valueList;
|
||||||
|
if (_interalStorage.TryGetValue(item.Key, out valueList))
|
||||||
|
return valueList.Contains(item.Value);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Contains(TKey key, TValue item)
|
||||||
|
{
|
||||||
|
if (!_interalStorage.ContainsKey(key)) return false;
|
||||||
|
return _interalStorage[key].Contains(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<TValue> LookupByKey(TKey key)
|
||||||
|
{
|
||||||
|
if (_interalStorage.ContainsKey(key))
|
||||||
|
return _interalStorage[key].ToList();
|
||||||
|
|
||||||
|
return new List<TValue>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<TValue> LookupByKey(object key)
|
||||||
|
{
|
||||||
|
TKey newkey = (TKey)Convert.ChangeType(key, typeof(TKey));
|
||||||
|
if (_interalStorage.ContainsKey(newkey))
|
||||||
|
return _interalStorage[newkey].ToList();
|
||||||
|
|
||||||
|
return new List<TValue>();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IDictionary<TKey, TValue>.TryGetValue(TKey key, out TValue value)
|
||||||
|
{
|
||||||
|
if (!_interalStorage.ContainsKey(key))
|
||||||
|
{
|
||||||
|
value = default(TValue);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
value = _interalStorage[key].Last();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
TValue IDictionary<TKey, TValue>.this[TKey key]
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _interalStorage[key].LastOrDefault();
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
Add(key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<TValue> this[TKey key]
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (!_interalStorage.ContainsKey(key))
|
||||||
|
return new List<TValue>();
|
||||||
|
return _interalStorage[key];
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (!_interalStorage.ContainsKey(key))
|
||||||
|
_interalStorage.Add(key, value);
|
||||||
|
else
|
||||||
|
_interalStorage[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICollection<TKey> Keys
|
||||||
|
{
|
||||||
|
get { return _interalStorage.Keys; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICollection<TValue> Values
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
List<TValue> retVal = new List<TValue>();
|
||||||
|
foreach (var item in _interalStorage)
|
||||||
|
{
|
||||||
|
retVal.AddRange(item.Value);
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<KeyValuePair<TKey, TValue>> KeyValueList
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
List<KeyValuePair<TKey, TValue>> retVal = new List<KeyValuePair<TKey, TValue>>();
|
||||||
|
foreach (var pair in _interalStorage)
|
||||||
|
{
|
||||||
|
foreach (var value in pair.Value)
|
||||||
|
retVal.Add(new KeyValuePair<TKey, TValue>(pair.Key, value));
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
_interalStorage.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
|
||||||
|
{
|
||||||
|
if (array == null)
|
||||||
|
throw new ArgumentNullException("array");
|
||||||
|
|
||||||
|
if (arrayIndex < 0)
|
||||||
|
throw new ArgumentOutOfRangeException("arrayIndex", arrayIndex, "argument 'arrayIndex' cannot be negative");
|
||||||
|
|
||||||
|
if (arrayIndex >= array.Length || Count > array.Length - arrayIndex)
|
||||||
|
array = new KeyValuePair<TKey, TValue>[Count];
|
||||||
|
|
||||||
|
int index = arrayIndex;
|
||||||
|
foreach (KeyValuePair<TKey, TValue> pair in this)
|
||||||
|
array[index++] = new KeyValuePair<TKey, TValue>(pair.Key, pair.Value);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Count
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
foreach (var item in _interalStorage)
|
||||||
|
{
|
||||||
|
count += item.Value.Count;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int ICollection<KeyValuePair<TKey, TValue>>.Count
|
||||||
|
{
|
||||||
|
get { return _interalStorage.Count; }
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly
|
||||||
|
{
|
||||||
|
get { return false; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
|
||||||
|
{
|
||||||
|
return new MultiMapEnumerator<TKey, TValue>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerator IEnumerable.GetEnumerator()
|
||||||
|
{
|
||||||
|
return new MultiMapEnumerator<TKey, TValue>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Dictionary<TKey, List<TValue>> _interalStorage = new Dictionary<TKey, List<TValue>>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public sealed class SortedMultiMap<TKey, TValue> : IMultiMap<TKey, TValue>, IDictionary<TKey, TValue>
|
||||||
|
{
|
||||||
|
public SortedMultiMap() { }
|
||||||
|
|
||||||
|
public SortedMultiMap(IEnumerable<KeyValuePair<TKey, TValue>> initialData)
|
||||||
|
{
|
||||||
|
foreach (var item in initialData)
|
||||||
|
{
|
||||||
|
Add(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Add(TKey key, TValue value)
|
||||||
|
{
|
||||||
|
if (!_interalStorage.ContainsKey(key))
|
||||||
|
_interalStorage.Add(key, new List<TValue>());
|
||||||
|
|
||||||
|
_interalStorage[key].Add(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddRange(TKey key, IEnumerable<TValue> valueList)
|
||||||
|
{
|
||||||
|
if (!_interalStorage.ContainsKey(key))
|
||||||
|
{
|
||||||
|
_interalStorage.Add(key, new List<TValue>());
|
||||||
|
}
|
||||||
|
foreach (TValue value in valueList)
|
||||||
|
{
|
||||||
|
_interalStorage[key].Add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Add(KeyValuePair<TKey, TValue> item)
|
||||||
|
{
|
||||||
|
if (!_interalStorage.ContainsKey(item.Key))
|
||||||
|
{
|
||||||
|
_interalStorage.Add(item.Key, new List<TValue>());
|
||||||
|
}
|
||||||
|
_interalStorage[item.Key].Add(item.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Remove(TKey key)
|
||||||
|
{
|
||||||
|
return _interalStorage.Remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Remove(KeyValuePair<TKey, TValue> item)
|
||||||
|
{
|
||||||
|
if (!ContainsKey(item.Key))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool val = _interalStorage[item.Key].Remove(item.Value);
|
||||||
|
|
||||||
|
if (!val)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (_interalStorage[item.Key].Empty())
|
||||||
|
_interalStorage.Remove(item.Key);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Remove(TKey key, TValue value)
|
||||||
|
{
|
||||||
|
if (!ContainsKey(key))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool val = _interalStorage[key].Remove(value);
|
||||||
|
|
||||||
|
if (!val)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (_interalStorage[key].Empty())
|
||||||
|
_interalStorage.Remove(key);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ContainsKey(TKey key)
|
||||||
|
{
|
||||||
|
return _interalStorage.ContainsKey(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Contains(KeyValuePair<TKey, TValue> item)
|
||||||
|
{
|
||||||
|
List<TValue> valueList;
|
||||||
|
if (_interalStorage.TryGetValue(item.Key, out valueList))
|
||||||
|
return valueList.Contains(item.Value);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Contains(TKey key, TValue item)
|
||||||
|
{
|
||||||
|
if (!_interalStorage.ContainsKey(key)) return false;
|
||||||
|
return _interalStorage[key].Contains(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<TValue> LookupByKey(TKey key)
|
||||||
|
{
|
||||||
|
if (_interalStorage.ContainsKey(key))
|
||||||
|
return _interalStorage[key].ToList();
|
||||||
|
|
||||||
|
return new List<TValue>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<TValue> LookupByKey(object key)
|
||||||
|
{
|
||||||
|
TKey newkey = (TKey)Convert.ChangeType(key, typeof(TKey));
|
||||||
|
if (_interalStorage.ContainsKey(newkey))
|
||||||
|
return _interalStorage[newkey].ToList();
|
||||||
|
|
||||||
|
return new List<TValue>();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IDictionary<TKey, TValue>.TryGetValue(TKey key, out TValue value)
|
||||||
|
{
|
||||||
|
if (!_interalStorage.ContainsKey(key))
|
||||||
|
{
|
||||||
|
value = default(TValue);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
value = _interalStorage[key].Last();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
TValue IDictionary<TKey, TValue>.this[TKey key]
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _interalStorage[key].LastOrDefault();
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
Add(key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<TValue> this[TKey key]
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (!_interalStorage.ContainsKey(key))
|
||||||
|
return new List<TValue>();
|
||||||
|
return _interalStorage[key];
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (!_interalStorage.ContainsKey(key))
|
||||||
|
_interalStorage.Add(key, value);
|
||||||
|
else _interalStorage[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICollection<TKey> Keys
|
||||||
|
{
|
||||||
|
get { return _interalStorage.Keys; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICollection<TValue> Values
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
List<TValue> retVal = new List<TValue>();
|
||||||
|
foreach (var item in _interalStorage)
|
||||||
|
{
|
||||||
|
retVal.AddRange(item.Value);
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<KeyValuePair<TKey, TValue>> KeyValueList
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
List<KeyValuePair<TKey, TValue>> retVal = new List<KeyValuePair<TKey, TValue>>();
|
||||||
|
foreach (var pair in _interalStorage)
|
||||||
|
{
|
||||||
|
foreach (var value in pair.Value)
|
||||||
|
retVal.Add(new KeyValuePair<TKey, TValue>(pair.Key, value));
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
_interalStorage.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
|
||||||
|
{
|
||||||
|
if (array == null)
|
||||||
|
throw new ArgumentNullException("array");
|
||||||
|
|
||||||
|
if (arrayIndex < 0)
|
||||||
|
throw new ArgumentOutOfRangeException("arrayIndex", arrayIndex, "argument 'arrayIndex' cannot be negative");
|
||||||
|
|
||||||
|
if (arrayIndex >= array.Length || Count > array.Length - arrayIndex)
|
||||||
|
array = new KeyValuePair<TKey, TValue>[Count];
|
||||||
|
|
||||||
|
int index = arrayIndex;
|
||||||
|
foreach (KeyValuePair<TKey, TValue> pair in this)
|
||||||
|
array[index++] = new KeyValuePair<TKey, TValue>(pair.Key, pair.Value);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Count
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
foreach (var item in _interalStorage)
|
||||||
|
{
|
||||||
|
count += item.Value.Count;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int ICollection<KeyValuePair<TKey, TValue>>.Count
|
||||||
|
{
|
||||||
|
get { return _interalStorage.Count; }
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly
|
||||||
|
{
|
||||||
|
get { return false; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
|
||||||
|
{
|
||||||
|
return new SortedMultiMapEnumerator<TKey, TValue>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerator IEnumerable.GetEnumerator()
|
||||||
|
{
|
||||||
|
return new SortedMultiMapEnumerator<TKey, TValue>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SortedDictionary<TKey, List<TValue>> _interalStorage = new SortedDictionary<TKey, List<TValue>>();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace System.Collections.Generic
|
||||||
|
{
|
||||||
|
public class MultiMapEnumerator<TKey, TValue> : IEnumerator<KeyValuePair<TKey, TValue>>
|
||||||
|
{
|
||||||
|
MultiMap<TKey, TValue> _map;
|
||||||
|
IEnumerator<TKey> _keyEnumerator;
|
||||||
|
IEnumerator<TValue> _valueEnumerator;
|
||||||
|
|
||||||
|
public MultiMapEnumerator(MultiMap<TKey, TValue> map)
|
||||||
|
{
|
||||||
|
_map = map;
|
||||||
|
Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
object IEnumerator.Current
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyValuePair<TKey, TValue> Current
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new KeyValuePair<TKey, TValue>(_keyEnumerator.Current, _valueEnumerator.Current);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
_keyEnumerator = null;
|
||||||
|
_valueEnumerator = null;
|
||||||
|
_map = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool MoveNext()
|
||||||
|
{
|
||||||
|
if (!_valueEnumerator.MoveNext())
|
||||||
|
{
|
||||||
|
if (!_keyEnumerator.MoveNext())
|
||||||
|
return false;
|
||||||
|
_valueEnumerator = _map[_keyEnumerator.Current].GetEnumerator();
|
||||||
|
_valueEnumerator.MoveNext();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Reset()
|
||||||
|
{
|
||||||
|
_keyEnumerator = _map.Keys.GetEnumerator();
|
||||||
|
_valueEnumerator = new List<TValue>().GetEnumerator();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SortedMultiMapEnumerator<TKey, TValue> : IEnumerator<KeyValuePair<TKey, TValue>>
|
||||||
|
{
|
||||||
|
SortedMultiMap<TKey, TValue> _map;
|
||||||
|
IEnumerator<TKey> _keyEnumerator;
|
||||||
|
IEnumerator<TValue> _valueEnumerator;
|
||||||
|
|
||||||
|
public SortedMultiMapEnumerator(SortedMultiMap<TKey, TValue> map)
|
||||||
|
{
|
||||||
|
_map = map;
|
||||||
|
Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
object IEnumerator.Current
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyValuePair<TKey, TValue> Current
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new KeyValuePair<TKey, TValue>(_keyEnumerator.Current, _valueEnumerator.Current);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
_keyEnumerator = null;
|
||||||
|
_valueEnumerator = null;
|
||||||
|
_map = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool MoveNext()
|
||||||
|
{
|
||||||
|
if (!_valueEnumerator.MoveNext())
|
||||||
|
{
|
||||||
|
if (!_keyEnumerator.MoveNext())
|
||||||
|
return false;
|
||||||
|
_valueEnumerator = _map[_keyEnumerator.Current].GetEnumerator();
|
||||||
|
_valueEnumerator.MoveNext();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Reset()
|
||||||
|
{
|
||||||
|
_keyEnumerator = _map.Keys.GetEnumerator();
|
||||||
|
_valueEnumerator = new List<TValue>().GetEnumerator();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
|
||||||
|
namespace Framework.Collections
|
||||||
|
{
|
||||||
|
public class StringArray
|
||||||
|
{
|
||||||
|
public StringArray(int size)
|
||||||
|
{
|
||||||
|
_str = new string[size];
|
||||||
|
|
||||||
|
for (var i = 0; i < size; ++i)
|
||||||
|
_str[i] = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public StringArray(string str, params string[] separator)
|
||||||
|
{
|
||||||
|
_str = str.Split(separator, StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StringArray(string str, params char[] separator)
|
||||||
|
{
|
||||||
|
_str = str.Split(separator, StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string this[int index]
|
||||||
|
{
|
||||||
|
get { return _str[index]; }
|
||||||
|
set { _str[index] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerator GetEnumerator()
|
||||||
|
{
|
||||||
|
return _str.GetEnumerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Length { get { return _str.Length; } }
|
||||||
|
|
||||||
|
string[] _str;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Framework.Collections;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Framework.Configuration
|
||||||
|
{
|
||||||
|
public class ConfigMgr
|
||||||
|
{
|
||||||
|
public static bool Load(string fileName)
|
||||||
|
{
|
||||||
|
string path = "./" + fileName;
|
||||||
|
if (!File.Exists(path))
|
||||||
|
{
|
||||||
|
Console.WriteLine("{0} doesn't exist!", fileName);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
string[] ConfigContent = File.ReadAllLines(path, Encoding.UTF8);
|
||||||
|
|
||||||
|
int lineCounter = 0;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string name = string.Empty;
|
||||||
|
foreach (var line in ConfigContent)
|
||||||
|
{
|
||||||
|
lineCounter++;
|
||||||
|
if (line.StartsWith("#") || line.StartsWith("-") || string.IsNullOrEmpty(line))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var configOption = new StringArray(line, '=');
|
||||||
|
_configList.Add(configOption[0].Trim(), configOption[1].Replace("\"", "").Trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Console.WriteLine("Error in {0} on Line {1}", fileName, lineCounter);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static T GetDefaultValue<T>(string name, T defaultValue)
|
||||||
|
{
|
||||||
|
string temp = _configList.LookupByKey(name);
|
||||||
|
|
||||||
|
var type = typeof(T).IsEnum ? typeof(T).GetEnumUnderlyingType() : typeof(T);
|
||||||
|
|
||||||
|
if (temp.IsEmpty())
|
||||||
|
return (T)Convert.ChangeType(defaultValue, type);
|
||||||
|
|
||||||
|
if (Type.GetTypeCode(typeof(T)) == TypeCode.Boolean && temp.IsNumber())
|
||||||
|
return (T)Convert.ChangeType(temp == "1", typeof(T));
|
||||||
|
|
||||||
|
return (T)Convert.ChangeType(temp, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<string> GetKeysByString(string name)
|
||||||
|
{
|
||||||
|
return _configList.Where(p => p.Key.Contains(name)).Select(p => p.Key).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
static Dictionary<string, string> _configList = new Dictionary<string, string>();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,762 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum AccountDataTypes
|
||||||
|
{
|
||||||
|
GlobalConfigCache = 0x00,
|
||||||
|
PerCharacterConfigCache = 0x01,
|
||||||
|
GlobalBindingsCache = 0x02,
|
||||||
|
PerCharacterBindingsCache = 0x03,
|
||||||
|
GlobalMacrosCache = 0x04,
|
||||||
|
PerCharacterMacrosCache = 0x05,
|
||||||
|
PerCharacterLayoutCache = 0x06,
|
||||||
|
PerCharacterChatCache = 0x07,
|
||||||
|
Max = 8,
|
||||||
|
|
||||||
|
GlobalCacheMask = 0x15,
|
||||||
|
PerCharacterCacheMask = 0xEA
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TutorialAction
|
||||||
|
{
|
||||||
|
Update = 0,
|
||||||
|
Clear = 1,
|
||||||
|
Reset = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum AccountTypes
|
||||||
|
{
|
||||||
|
Player = 0,
|
||||||
|
Moderator = 1,
|
||||||
|
GameMaster = 2,
|
||||||
|
Administrator = 3,
|
||||||
|
Console = 4
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum RBACPermissions
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
InstantLogout = 1,
|
||||||
|
SkipQueue = 2,
|
||||||
|
JoinNormalBg = 3,
|
||||||
|
JoinRandomBg = 4,
|
||||||
|
JoinArenas = 5,
|
||||||
|
JoinDungeonFinder = 6,
|
||||||
|
// 7 - Reuse
|
||||||
|
// 8 - Reuse
|
||||||
|
// 9 - Reuse
|
||||||
|
UseCharacterTemplates = 10,
|
||||||
|
LogGmTrade = 11,
|
||||||
|
SkipCheckCharacterCreationDemonHunter = 12,
|
||||||
|
SkipCheckInstanceRequiredBosses = 13,
|
||||||
|
SkipCheckCharacterCreationTeammask = 14,
|
||||||
|
SkipCheckCharacterCreationClassmask = 15,
|
||||||
|
SkipCheckCharacterCreationRacemask = 16,
|
||||||
|
SkipCheckCharacterCreationReservedname = 17,
|
||||||
|
SkipCheckCharacterCreationDeathKnight = 18,
|
||||||
|
SkipCheckChatChannelReq = 19,
|
||||||
|
SkipCheckDisableMap = 20,
|
||||||
|
SkipCheckMoreTalentsThanAllowed = 21,
|
||||||
|
SkipCheckChatSpam = 22,
|
||||||
|
SkipCheckOverspeedPing = 23,
|
||||||
|
TwoSideCharacterCreation = 24,
|
||||||
|
TwoSideInteractionChat = 25,
|
||||||
|
TwoSideInteractionChannel = 26,
|
||||||
|
TwoSideInteractionMail = 27,
|
||||||
|
TwoSideWhoList = 28,
|
||||||
|
TwoSideAddFriend = 29,
|
||||||
|
CommandsSaveWithoutDelay = 30,
|
||||||
|
CommandsUseUnstuckWithArgs = 31,
|
||||||
|
CommandsBeAssignedTicket = 32,
|
||||||
|
CommandsNotifyCommandNotFoundError = 33,
|
||||||
|
CommandsAppearInGmList = 34,
|
||||||
|
WhoSeeAllSecLevels = 35,
|
||||||
|
CanFilterWhispers = 36,
|
||||||
|
ChatUseStaffBadge = 37,
|
||||||
|
ResurrectWithFullHps = 38,
|
||||||
|
RestoreSavedGmState = 39,
|
||||||
|
AllowGmFriend = 40,
|
||||||
|
UseStartGmLevel = 41,
|
||||||
|
OpcodeWorldTeleport = 42,
|
||||||
|
OpcodeWhois = 43,
|
||||||
|
ReceiveGlobalGmTextmessage = 44,
|
||||||
|
SilentlyJoinChannel = 45,
|
||||||
|
ChangeChannelNotModerator = 46,
|
||||||
|
CheckForLowerSecurity = 47,
|
||||||
|
CommandsPinfoCheckPersonalData = 48,
|
||||||
|
EmailConfirmForPassChange = 49,
|
||||||
|
MayCheckOwnEmail = 50,
|
||||||
|
AllowTwoSideTrade = 51,
|
||||||
|
|
||||||
|
// Free Space For Core Permissions (Till 149)
|
||||||
|
// Roles (Permissions With Delegated Permissions) Use 199 And Descending
|
||||||
|
CommandRbac = 200,
|
||||||
|
CommandRbacAcc = 201,
|
||||||
|
CommandRbacAccPermList = 202,
|
||||||
|
CommandRbacAccPermGrant = 203,
|
||||||
|
CommandRbacAccPermDeny = 204,
|
||||||
|
CommandRbacAccPermRevoke = 205,
|
||||||
|
CommandRbacList = 206,
|
||||||
|
CommandBnetAccount = 207,
|
||||||
|
CommandBnetAccountCreate = 208,
|
||||||
|
CommandBnetAccountLockCountry = 209,
|
||||||
|
CommandBnetAccountLockIp = 210,
|
||||||
|
CommandBnetAccountPassword = 211,
|
||||||
|
CommandBnetAccountSet = 212,
|
||||||
|
CommandBnetAccountSetPassword = 213,
|
||||||
|
CommandBnetAccountLink = 214,
|
||||||
|
CommandBnetAccountUnlink = 215,
|
||||||
|
CommandBnetAccountCreateGame = 216,
|
||||||
|
CommandAccount = 217,
|
||||||
|
CommandAccountAddon = 218,
|
||||||
|
CommandAccountCreate = 219,
|
||||||
|
CommandAccountDelete = 220,
|
||||||
|
CommandAccountLock = 221,
|
||||||
|
CommandAccountLockCountry = 222,
|
||||||
|
CommandAccountLockIp = 223,
|
||||||
|
CommandAccountOnlineList = 224,
|
||||||
|
CommandAccountPassword = 225,
|
||||||
|
CommandAccountSet = 226,
|
||||||
|
CommandAccountSetAddon = 227,
|
||||||
|
CommandAccountSetGmlevel = 228,
|
||||||
|
CommandAccountSetPassword = 229,
|
||||||
|
CommandAchievement = 230,
|
||||||
|
CommandAchievementAdd = 231,
|
||||||
|
CommandArena = 232,
|
||||||
|
CommandArenaCaptain = 233,
|
||||||
|
CommandArenaCreate = 234,
|
||||||
|
CommandArenaDisband = 235,
|
||||||
|
CommandArenaInfo = 236,
|
||||||
|
CommandArenaLookup = 237,
|
||||||
|
CommandArenaRename = 238,
|
||||||
|
CommandBan = 239,
|
||||||
|
CommandBanAccount = 240,
|
||||||
|
CommandBanCharacter = 241,
|
||||||
|
CommandBanIp = 242,
|
||||||
|
CommandBanPlayeraccount = 243,
|
||||||
|
CommandBaninfo = 244,
|
||||||
|
CommandBaninfoAccount = 245,
|
||||||
|
CommandBaninfoCharacter = 246,
|
||||||
|
CommandBaninfoIp = 247,
|
||||||
|
CommandBanlist = 248,
|
||||||
|
CommandBanlistAccount = 249,
|
||||||
|
CommandBanlistCharacter = 250,
|
||||||
|
CommandBanlistIp = 251,
|
||||||
|
CommandUnban = 252,
|
||||||
|
CommandUnbanAccount = 253,
|
||||||
|
CommandUnbanCharacter = 254,
|
||||||
|
CommandUnbanIp = 255,
|
||||||
|
CommandUnbanPlayeraccount = 256,
|
||||||
|
CommandBf = 257,
|
||||||
|
CommandBfStart = 258,
|
||||||
|
CommandBfStop = 259,
|
||||||
|
CommandBfSwitch = 260,
|
||||||
|
CommandBfTimer = 261,
|
||||||
|
CommandBfEnable = 262,
|
||||||
|
CommandAccountEmail = 263,
|
||||||
|
CommandAccountSetSec = 264,
|
||||||
|
CommandAccountSetSecEmail = 265,
|
||||||
|
CommandAccountSetSecRegmail = 266,
|
||||||
|
CommandCast = 267,
|
||||||
|
CommandCastBack = 268,
|
||||||
|
CommandCastDist = 269,
|
||||||
|
CommandCastSelf = 270,
|
||||||
|
CommandCastTarget = 271,
|
||||||
|
CommandCastDest = 272,
|
||||||
|
CommandCharacter = 273,
|
||||||
|
CommandCharacterCustomize = 274,
|
||||||
|
CommandCharacterChangefaction = 275,
|
||||||
|
CommandCharacterChangerace = 276,
|
||||||
|
CommandCharacterDeleted = 277,
|
||||||
|
CommandCharacterDeletedDelete = 278,
|
||||||
|
CommandCharacterDeletedList = 279,
|
||||||
|
CommandCharacterDeletedRestore = 280,
|
||||||
|
CommandCharacterDeletedOld = 281,
|
||||||
|
CommandCharacterErase = 282,
|
||||||
|
CommandCharacterLevel = 283,
|
||||||
|
CommandCharacterRename = 284,
|
||||||
|
CommandCharacterReputation = 285,
|
||||||
|
CommandCharacterTitles = 286,
|
||||||
|
CommandLevelup = 287,
|
||||||
|
CommandPdump = 288,
|
||||||
|
CommandPdumpLoad = 289,
|
||||||
|
CommandPdumpWrite = 290,
|
||||||
|
CommandCheat = 291,
|
||||||
|
CommandCheatCasttime = 292,
|
||||||
|
CommandCheatCooldown = 293,
|
||||||
|
CommandCheatExplore = 294,
|
||||||
|
CommandCheatGod = 295,
|
||||||
|
CommandCheatPower = 296,
|
||||||
|
CommandCheatStatus = 297,
|
||||||
|
CommandCheatTaxi = 298,
|
||||||
|
CommandCheatWaterwalk = 299,
|
||||||
|
CommandDebug = 300,
|
||||||
|
CommandDebugAnim = 301,
|
||||||
|
CommandDebugAreatriggers = 302,
|
||||||
|
CommandDebugArena = 303,
|
||||||
|
CommandDebugBg = 304,
|
||||||
|
CommandDebugEntervehicle = 305,
|
||||||
|
CommandDebugGetitemstate = 306,
|
||||||
|
CommandDebugGetitemvalue = 307,
|
||||||
|
CommandDebugGetvalue = 308,
|
||||||
|
CommandDebugHostil = 309,
|
||||||
|
CommandDebugItemexpire = 310,
|
||||||
|
CommandDebugLootrecipient = 311,
|
||||||
|
CommandDebugLos = 312,
|
||||||
|
CommandDebugMod32value = 313,
|
||||||
|
CommandDebugMoveflags = 314,
|
||||||
|
CommandDebugPlay = 315,
|
||||||
|
CommandDebugPlayCinematic = 316,
|
||||||
|
CommandDebugPlayMovie = 317,
|
||||||
|
CommandDebugPlaySound = 318,
|
||||||
|
CommandDebugSend = 319,
|
||||||
|
CommandDebugSendBuyerror = 320,
|
||||||
|
CommandDebugSendChannelnotify = 321,
|
||||||
|
CommandDebugSendChatmessage = 322,
|
||||||
|
CommandDebugSendEquiperror = 323,
|
||||||
|
CommandDebugSendLargepacket = 324,
|
||||||
|
CommandDebugSendOpcode = 325,
|
||||||
|
CommandDebugSendQinvalidmsg = 326,
|
||||||
|
CommandDebugSendQpartymsg = 327,
|
||||||
|
CommandDebugSendSellerror = 328,
|
||||||
|
CommandDebugSendSetphaseshift = 329,
|
||||||
|
CommandDebugSendSpellfail = 330,
|
||||||
|
CommandDebugSetaurastate = 331,
|
||||||
|
CommandDebugSetbit = 332,
|
||||||
|
CommandDebugSetitemvalue = 333,
|
||||||
|
CommandDebugSetvalue = 334,
|
||||||
|
CommandDebugSetvid = 335,
|
||||||
|
CommandDebugSpawnvehicle = 336,
|
||||||
|
CommandDebugThreat = 337,
|
||||||
|
CommandDebugUpdate = 338,
|
||||||
|
CommandDebugUws = 339,
|
||||||
|
CommandWpgps = 340,
|
||||||
|
CommandDeserter = 341,
|
||||||
|
CommandDeserterBg = 342,
|
||||||
|
CommandDeserterBgAdd = 343,
|
||||||
|
CommandDeserterBgRemove = 344,
|
||||||
|
CommandDeserterInstance = 345,
|
||||||
|
CommandDeserterInstanceAdd = 346,
|
||||||
|
CommandDeserterInstanceRemove = 347,
|
||||||
|
CommandDisable = 348,
|
||||||
|
CommandDisableAdd = 349,
|
||||||
|
CommandDisableAddCriteria = 350,
|
||||||
|
CommandDisableAddBattleground = 351,
|
||||||
|
CommandDisableAddMap = 352,
|
||||||
|
CommandDisableAddMmap = 353,
|
||||||
|
CommandDisableAddOutdoorpvp = 354,
|
||||||
|
CommandDisableAddQuest = 355,
|
||||||
|
CommandDisableAddSpell = 356,
|
||||||
|
CommandDisableAddVmap = 357,
|
||||||
|
CommandDisableRemove = 358,
|
||||||
|
CommandDisableRemoveCriteria = 359,
|
||||||
|
CommandDisableRemoveBattleground = 360,
|
||||||
|
CommandDisableRemoveMap = 361,
|
||||||
|
CommandDisableRemoveMmap = 362,
|
||||||
|
CommandDisableRemoveOutdoorpvp = 363,
|
||||||
|
CommandDisableRemoveQuest = 364,
|
||||||
|
CommandDisableRemoveSpell = 365,
|
||||||
|
CommandDisableRemoveVmap = 366,
|
||||||
|
CommandEvent = 367,
|
||||||
|
CommandEventActivelist = 368,
|
||||||
|
CommandEventStart = 369,
|
||||||
|
CommandEventStop = 370,
|
||||||
|
CommandGm = 371,
|
||||||
|
CommandGmChat = 372,
|
||||||
|
CommandGmFly = 373,
|
||||||
|
CommandGmIngame = 374,
|
||||||
|
CommandGmList = 375,
|
||||||
|
CommandGmVisible = 376,
|
||||||
|
CommandGo = 377,
|
||||||
|
CommandGoCreature = 378,
|
||||||
|
CommandGoGraveyard = 379,
|
||||||
|
CommandGoGrid = 380,
|
||||||
|
CommandGoObject = 381,
|
||||||
|
CommandGoTaxinode = 382,
|
||||||
|
// 383 reuse
|
||||||
|
CommandGoTrigger = 384,
|
||||||
|
CommandGoXyz = 385,
|
||||||
|
CommandGoZonexy = 386,
|
||||||
|
CommandGobject = 387,
|
||||||
|
CommandGobjectActivate = 388,
|
||||||
|
CommandGobjectAdd = 389,
|
||||||
|
CommandGobjectAddTemp = 390,
|
||||||
|
CommandGobjectDelete = 391,
|
||||||
|
CommandGobjectInfo = 392,
|
||||||
|
CommandGobjectMove = 393,
|
||||||
|
CommandGobjectNear = 394,
|
||||||
|
CommandGobjectSet = 395,
|
||||||
|
CommandGobjectSetPhase = 396,
|
||||||
|
CommandGobjectSetState = 397,
|
||||||
|
CommandGobjectTarget = 398,
|
||||||
|
CommandGobjectTurn = 399,
|
||||||
|
CommandDebugTransport = 400,
|
||||||
|
CommandGuild = 401,
|
||||||
|
CommandGuildCreate = 402,
|
||||||
|
CommandGuildDelete = 403,
|
||||||
|
CommandGuildInvite = 404,
|
||||||
|
CommandGuildUninvite = 405,
|
||||||
|
CommandGuildRank = 406,
|
||||||
|
CommandGuildRename = 407,
|
||||||
|
CommandHonor = 408,
|
||||||
|
CommandHonorAdd = 409,
|
||||||
|
CommandHonorAddKill = 410,
|
||||||
|
CommandHonorUpdate = 411,
|
||||||
|
CommandInstance = 412,
|
||||||
|
CommandInstanceListbinds = 413,
|
||||||
|
CommandInstanceUnbind = 414,
|
||||||
|
CommandInstanceStats = 415,
|
||||||
|
CommandInstanceSavedata = 416,
|
||||||
|
CommandLearn = 417,
|
||||||
|
CommandLearnAll = 418,
|
||||||
|
CommandLearnAllMy = 419,
|
||||||
|
CommandLearnAllMyClass = 420,
|
||||||
|
CommandLearnAllMyPettalents = 421,
|
||||||
|
CommandLearnAllMySpells = 422,
|
||||||
|
CommandLearnAllMyTalents = 423,
|
||||||
|
CommandLearnAllGm = 424,
|
||||||
|
CommandLearnAllCrafts = 425,
|
||||||
|
CommandLearnAllDefault = 426,
|
||||||
|
CommandLearnAllLang = 427,
|
||||||
|
CommandLearnAllRecipes = 428,
|
||||||
|
CommandUnlearn = 429,
|
||||||
|
CommandLfg = 430,
|
||||||
|
CommandLfgPlayer = 431,
|
||||||
|
CommandLfgGroup = 432,
|
||||||
|
CommandLfgQueue = 433,
|
||||||
|
CommandLfgClean = 434,
|
||||||
|
CommandLfgOptions = 435,
|
||||||
|
CommandList = 436,
|
||||||
|
CommandListCreature = 437,
|
||||||
|
CommandListItem = 438,
|
||||||
|
CommandListObject = 439,
|
||||||
|
CommandListAuras = 440,
|
||||||
|
CommandListMail = 441,
|
||||||
|
CommandLookup = 442,
|
||||||
|
CommandLookupArea = 443,
|
||||||
|
CommandLookupCreature = 444,
|
||||||
|
CommandLookupEvent = 445,
|
||||||
|
CommandLookupFaction = 446,
|
||||||
|
CommandLookupItem = 447,
|
||||||
|
CommandLookupItemset = 448,
|
||||||
|
CommandLookupObject = 449,
|
||||||
|
CommandLookupQuest = 450,
|
||||||
|
CommandLookupPlayer = 451,
|
||||||
|
CommandLookupPlayerIp = 452,
|
||||||
|
CommandLookupPlayerAccount = 453,
|
||||||
|
CommandLookupPlayerEmail = 454,
|
||||||
|
CommandLookupSkill = 455,
|
||||||
|
CommandLookupSpell = 456,
|
||||||
|
CommandLookupSpellId = 457,
|
||||||
|
CommandLookupTaxinode = 458,
|
||||||
|
CommandLookupTele = 459,
|
||||||
|
CommandLookupTitle = 460,
|
||||||
|
CommandLookupMap = 461,
|
||||||
|
CommandAnnounce = 462,
|
||||||
|
CommandChannel = 463,
|
||||||
|
CommandChannelSet = 464,
|
||||||
|
CommandChannelSetOwnership = 465,
|
||||||
|
CommandGmannounce = 466,
|
||||||
|
CommandGmnameannounce = 467,
|
||||||
|
CommandGmnotify = 468,
|
||||||
|
CommandNameannounce = 469,
|
||||||
|
CommandNotify = 470,
|
||||||
|
CommandWhispers = 471,
|
||||||
|
CommandGroup = 472,
|
||||||
|
CommandGroupLeader = 473,
|
||||||
|
CommandGroupDisband = 474,
|
||||||
|
CommandGroupRemove = 475,
|
||||||
|
CommandGroupJoin = 476,
|
||||||
|
CommandGroupList = 477,
|
||||||
|
CommandGroupSummon = 478,
|
||||||
|
CommandPet = 479,
|
||||||
|
CommandPetCreate = 480,
|
||||||
|
CommandPetLearn = 481,
|
||||||
|
CommandPetUnlearn = 482,
|
||||||
|
CommandSend = 483,
|
||||||
|
CommandSendItems = 484,
|
||||||
|
CommandSendMail = 485,
|
||||||
|
CommandSendMessage = 486,
|
||||||
|
CommandSendMoney = 487,
|
||||||
|
CommandAdditem = 488,
|
||||||
|
CommandAdditemset = 489,
|
||||||
|
CommandAppear = 490,
|
||||||
|
CommandAura = 491,
|
||||||
|
CommandBank = 492,
|
||||||
|
CommandBindsight = 493,
|
||||||
|
CommandCombatstop = 494,
|
||||||
|
CommandCometome = 495,
|
||||||
|
CommandCommands = 496,
|
||||||
|
CommandCooldown = 497,
|
||||||
|
CommandDamage = 498,
|
||||||
|
CommandDev = 499,
|
||||||
|
CommandDie = 500,
|
||||||
|
CommandDismount = 501,
|
||||||
|
CommandDistance = 502,
|
||||||
|
CommandFlusharenapoints = 503,
|
||||||
|
CommandFreeze = 504,
|
||||||
|
CommandGps = 505,
|
||||||
|
CommandGuid = 506,
|
||||||
|
CommandHelp = 507,
|
||||||
|
CommandHidearea = 508,
|
||||||
|
CommandItemmove = 509,
|
||||||
|
CommandKick = 510,
|
||||||
|
CommandLinkgrave = 511,
|
||||||
|
CommandListfreeze = 512,
|
||||||
|
CommandMaxskill = 513,
|
||||||
|
CommandMovegens = 514,
|
||||||
|
CommandMute = 515,
|
||||||
|
CommandNeargrave = 516,
|
||||||
|
CommandPinfo = 517,
|
||||||
|
CommandPlayall = 518,
|
||||||
|
CommandPossess = 519,
|
||||||
|
CommandRecall = 520,
|
||||||
|
CommandRepairitems = 521,
|
||||||
|
CommandRespawn = 522,
|
||||||
|
CommandRevive = 523,
|
||||||
|
CommandSaveall = 524,
|
||||||
|
CommandSave = 525,
|
||||||
|
CommandSetskill = 526,
|
||||||
|
CommandShowarea = 527,
|
||||||
|
CommandSummon = 528,
|
||||||
|
CommandUnaura = 529,
|
||||||
|
CommandUnbindsight = 530,
|
||||||
|
CommandUnfreeze = 531,
|
||||||
|
CommandUnmute = 532,
|
||||||
|
CommandUnpossess = 533,
|
||||||
|
CommandUnstuck = 534,
|
||||||
|
CommandWchange = 535,
|
||||||
|
CommandMmap = 536,
|
||||||
|
CommandMmapLoadedtiles = 537,
|
||||||
|
CommandMmapLoc = 538,
|
||||||
|
CommandMmapPath = 539,
|
||||||
|
CommandMmapStats = 540,
|
||||||
|
CommandMmapTestarea = 541,
|
||||||
|
CommandMorph = 542,
|
||||||
|
CommandDemorph = 543,
|
||||||
|
CommandModify = 544,
|
||||||
|
CommandModifyArenapoints = 545,
|
||||||
|
CommandModifyBit = 546,
|
||||||
|
CommandModifyDrunk = 547,
|
||||||
|
CommandModifyEnergy = 548,
|
||||||
|
CommandModifyFaction = 549,
|
||||||
|
CommandModifyGender = 550,
|
||||||
|
CommandModifyHonor = 551,
|
||||||
|
CommandModifyHp = 552,
|
||||||
|
CommandModifyMana = 553,
|
||||||
|
CommandModifyMoney = 554,
|
||||||
|
CommandModifyMount = 555,
|
||||||
|
CommandModifyPhase = 556,
|
||||||
|
CommandModifyRage = 557,
|
||||||
|
CommandModifyReputation = 558,
|
||||||
|
CommandModifyRunicpower = 559,
|
||||||
|
CommandModifyScale = 560,
|
||||||
|
CommandModifySpeed = 561,
|
||||||
|
CommandModifySpeedAll = 562,
|
||||||
|
CommandModifySpeedBackwalk = 563,
|
||||||
|
CommandModifySpeedFly = 564,
|
||||||
|
CommandModifySpeedWalk = 565,
|
||||||
|
CommandModifySpeedSwim = 566,
|
||||||
|
CommandModifySpell = 567,
|
||||||
|
CommandModifyStandstate = 568,
|
||||||
|
CommandModifyTalentpoints = 569,
|
||||||
|
CommandNpc = 570,
|
||||||
|
CommandNpcAdd = 571,
|
||||||
|
CommandNpcAddFormation = 572,
|
||||||
|
CommandNpcAddItem = 573,
|
||||||
|
CommandNpcAddMove = 574,
|
||||||
|
CommandNpcAddTemp = 575,
|
||||||
|
CommandNpcDelete = 576,
|
||||||
|
CommandNpcDeleteItem = 577,
|
||||||
|
CommandNpcFollow = 578,
|
||||||
|
CommandNpcFollowStop = 579,
|
||||||
|
CommandNpcSet = 580,
|
||||||
|
CommandNpcSetAllowmove = 581,
|
||||||
|
CommandNpcSetEntry = 582,
|
||||||
|
CommandNpcSetFactionid = 583,
|
||||||
|
CommandNpcSetFlag = 584,
|
||||||
|
CommandNpcSetLevel = 585,
|
||||||
|
CommandNpcSetLink = 586,
|
||||||
|
CommandNpcSetModel = 587,
|
||||||
|
CommandNpcSetMovetype = 588,
|
||||||
|
CommandNpcSetPhase = 589,
|
||||||
|
CommandNpcSetSpawndist = 590,
|
||||||
|
CommandNpcSetSpawntime = 591,
|
||||||
|
CommandNpcSetData = 592,
|
||||||
|
CommandNpcInfo = 593,
|
||||||
|
CommandNpcNear = 594,
|
||||||
|
CommandNpcMove = 595,
|
||||||
|
CommandNpcPlayemote = 596,
|
||||||
|
CommandNpcSay = 597,
|
||||||
|
CommandNpcTextemote = 598,
|
||||||
|
CommandNpcWhisper = 599,
|
||||||
|
CommandNpcYell = 600,
|
||||||
|
CommandNpcTame = 601,
|
||||||
|
CommandQuest = 602,
|
||||||
|
CommandQuestAdd = 603,
|
||||||
|
CommandQuestComplete = 604,
|
||||||
|
CommandQuestRemove = 605,
|
||||||
|
CommandQuestReward = 606,
|
||||||
|
CommandReload = 607,
|
||||||
|
CommandReloadAccessRequirement = 608,
|
||||||
|
CommandReloadCriteriaData = 609,
|
||||||
|
CommandReloadAchievementReward = 610,
|
||||||
|
CommandReloadAll = 611,
|
||||||
|
CommandReloadAllAchievement = 612,
|
||||||
|
CommandReloadAllArea = 613,
|
||||||
|
CommandReloadBroadcastText = 614,
|
||||||
|
CommandReloadAllGossip = 615,
|
||||||
|
CommandReloadAllItem = 616,
|
||||||
|
CommandReloadAllLocales = 617,
|
||||||
|
CommandReloadAllLoot = 618,
|
||||||
|
CommandReloadAllNpc = 619,
|
||||||
|
CommandReloadAllQuest = 620,
|
||||||
|
CommandReloadAllScripts = 621,
|
||||||
|
CommandReloadAllSpell = 622,
|
||||||
|
CommandReloadAreatriggerInvolvedrelation = 623,
|
||||||
|
CommandReloadAreatriggerTavern = 624,
|
||||||
|
CommandReloadAreatriggerTeleport = 625,
|
||||||
|
CommandReloadAuctions = 626,
|
||||||
|
CommandReloadAutobroadcast = 627,
|
||||||
|
CommandReloadCommand = 628,
|
||||||
|
CommandReloadConditions = 629,
|
||||||
|
CommandReloadConfig = 630,
|
||||||
|
CommandReloadBattlegroundTemplate = 631,
|
||||||
|
CommandMutehistory = 632,
|
||||||
|
CommandReloadCreatureLinkedRespawn = 633,
|
||||||
|
CommandReloadCreatureLootTemplate = 634,
|
||||||
|
CommandReloadCreatureOnkillReputation = 635,
|
||||||
|
CommandReloadCreatureQuestender = 636,
|
||||||
|
CommandReloadCreatureQueststarter = 637,
|
||||||
|
CommandReloadCreatureSummonGroups = 638,
|
||||||
|
CommandReloadCreatureTemplate = 639,
|
||||||
|
CommandReloadCreatureText = 640,
|
||||||
|
CommandReloadDisables = 641,
|
||||||
|
CommandReloadDisenchantLootTemplate = 642,
|
||||||
|
CommandReloadEventScripts = 643,
|
||||||
|
CommandReloadFishingLootTemplate = 644,
|
||||||
|
CommandReloadGraveyardZone = 645,
|
||||||
|
CommandReloadGameTele = 646,
|
||||||
|
CommandReloadGameobjectQuestender = 647,
|
||||||
|
CommandReloadGameobjectQuestLootTemplate = 648,
|
||||||
|
CommandReloadGameobjectQueststarter = 649,
|
||||||
|
CommandReloadSupportSystem = 650,
|
||||||
|
CommandReloadGossipMenu = 651,
|
||||||
|
CommandReloadGossipMenuOption = 652,
|
||||||
|
CommandReloadItemEnchantmentTemplate = 653,
|
||||||
|
CommandReloadItemLootTemplate = 654,
|
||||||
|
CommandReloadItemSetNames = 655,
|
||||||
|
CommandReloadLfgDungeonRewards = 656,
|
||||||
|
CommandReloadLocalesAchievementReward = 657,
|
||||||
|
CommandReloadLocalesCreature = 658,
|
||||||
|
CommandReloadLocalesCreatureText = 659,
|
||||||
|
CommandReloadLocalesGameobject = 660,
|
||||||
|
CommandReloadLocalesGossipMenuOption = 661,
|
||||||
|
// 662 Unused
|
||||||
|
CommandReloadLocalesItemSetName = 663,
|
||||||
|
// 664 Unused
|
||||||
|
CommandReloadLocalesPageText = 665,
|
||||||
|
CommandReloadLocalesPointsOfInterest = 666,
|
||||||
|
CommandReloadQuestLocale = 667,
|
||||||
|
CommandReloadMailLevelReward = 668,
|
||||||
|
CommandReloadMailLootTemplate = 669,
|
||||||
|
CommandReloadMillingLootTemplate = 670,
|
||||||
|
CommandReloadNpcSpellclickSpells = 671,
|
||||||
|
CommandReloadNpcTrainer = 672,
|
||||||
|
CommandReloadNpcVendor = 673,
|
||||||
|
CommandReloadPageText = 674,
|
||||||
|
CommandReloadPickpocketingLootTemplate = 675,
|
||||||
|
CommandReloadPointsOfInterest = 676,
|
||||||
|
CommandReloadProspectingLootTemplate = 677,
|
||||||
|
CommandReloadQuestPoi = 678,
|
||||||
|
CommandReloadQuestTemplate = 679,
|
||||||
|
CommandReloadRbac = 680,
|
||||||
|
CommandReloadReferenceLootTemplate = 681,
|
||||||
|
CommandReloadReservedName = 682,
|
||||||
|
CommandReloadReputationRewardRate = 683,
|
||||||
|
CommandReloadSpilloverTemplate = 684,
|
||||||
|
CommandReloadSkillDiscoveryTemplate = 685,
|
||||||
|
CommandReloadSkillExtraItemTemplate = 686,
|
||||||
|
CommandReloadSkillFishingBaseLevel = 687,
|
||||||
|
CommandReloadSkinningLootTemplate = 688,
|
||||||
|
CommandReloadSmartScripts = 689,
|
||||||
|
CommandReloadSpellRequired = 690,
|
||||||
|
CommandReloadSpellArea = 691,
|
||||||
|
// 692 Unused
|
||||||
|
CommandReloadSpellGroup = 693,
|
||||||
|
CommandReloadSpellLearnSpell = 694,
|
||||||
|
CommandReloadSpellLootTemplate = 695,
|
||||||
|
CommandReloadSpellLinkedSpell = 696,
|
||||||
|
CommandReloadSpellPetAuras = 697,
|
||||||
|
CommandReloadSpellProcEvent = 698,
|
||||||
|
CommandReloadSpellProc = 699,
|
||||||
|
CommandReloadSpellScripts = 700,
|
||||||
|
CommandReloadSpellTargetPosition = 701,
|
||||||
|
CommandReloadSpellThreats = 702,
|
||||||
|
CommandReloadSpellGroupStackRules = 703,
|
||||||
|
CommandReloadCypherString = 704,
|
||||||
|
CommandReloadWardenAction = 705,
|
||||||
|
CommandReloadWaypointScripts = 706,
|
||||||
|
CommandReloadWaypointData = 707,
|
||||||
|
CommandReloadVehicleAccesory = 708,
|
||||||
|
CommandReloadVehicleTemplateAccessory = 709,
|
||||||
|
CommandReset = 710,
|
||||||
|
CommandResetAchievements = 711,
|
||||||
|
CommandResetHonor = 712,
|
||||||
|
CommandResetLevel = 713,
|
||||||
|
CommandResetSpells = 714,
|
||||||
|
CommandResetStats = 715,
|
||||||
|
CommandResetTalents = 716,
|
||||||
|
CommandResetAll = 717,
|
||||||
|
CommandServer = 718,
|
||||||
|
CommandServerCorpses = 719,
|
||||||
|
CommandServerExit = 720,
|
||||||
|
CommandServerIdlerestart = 721,
|
||||||
|
CommandServerIdlerestartCancel = 722,
|
||||||
|
CommandServerIdleshutdown = 723,
|
||||||
|
CommandServerIdleshutdownCancel = 724,
|
||||||
|
CommandServerInfo = 725,
|
||||||
|
CommandServerPlimit = 726,
|
||||||
|
CommandServerRestart = 727,
|
||||||
|
CommandServerRestartCancel = 728,
|
||||||
|
CommandServerSet = 729,
|
||||||
|
CommandServerSetClosed = 730,
|
||||||
|
CommandServerSetDifftime = 731,
|
||||||
|
CommandServerSetLoglevel = 732,
|
||||||
|
CommandServerSetMotd = 733,
|
||||||
|
CommandServerShutdown = 734,
|
||||||
|
CommandServerShutdownCancel = 735,
|
||||||
|
CommandServerMotd = 736,
|
||||||
|
CommandTele = 737,
|
||||||
|
CommandTeleAdd = 738,
|
||||||
|
CommandTeleDel = 739,
|
||||||
|
CommandTeleName = 740,
|
||||||
|
CommandTeleGroup = 741,
|
||||||
|
CommandTicket = 742,
|
||||||
|
// 743 - 752 reuse
|
||||||
|
CommandTicketReset = 753,
|
||||||
|
// 754 - 756 reuse
|
||||||
|
CommandTicketTogglesystem = 757,
|
||||||
|
// 758 - 760 reuse
|
||||||
|
CommandTitles = 761,
|
||||||
|
CommandTitlesAdd = 762,
|
||||||
|
CommandTitlesCurrent = 763,
|
||||||
|
CommandTitlesRemove = 764,
|
||||||
|
CommandTitlesSet = 765,
|
||||||
|
CommandTitlesSetMask = 766,
|
||||||
|
CommandWp = 767,
|
||||||
|
CommandWpAdd = 768,
|
||||||
|
CommandWpEvent = 769,
|
||||||
|
CommandWpLoad = 770,
|
||||||
|
CommandWpModify = 771,
|
||||||
|
CommandWpUnload = 772,
|
||||||
|
CommandWpReload = 773,
|
||||||
|
CommandWpShow = 774,
|
||||||
|
CommandModifyCurrency = 775, // Only 4.3.4
|
||||||
|
CommandDebugPhase = 776, // Only 4.3.4
|
||||||
|
CommandMailbox = 777,
|
||||||
|
CommandAhbot = 778,
|
||||||
|
CommandAhbotItems = 779,
|
||||||
|
CommandAhbotItemsGray = 780,
|
||||||
|
CommandAhbotItemsWhite = 781,
|
||||||
|
CommandAhbotItemsGreen = 782,
|
||||||
|
CommandAhbotItemsBlue = 783,
|
||||||
|
CommandAhbotItemsPurple = 784,
|
||||||
|
CommandAhbotItemsOrange = 785,
|
||||||
|
CommandAhbotItemsYellow = 786,
|
||||||
|
CommandAhbotRatio = 787,
|
||||||
|
CommandAhbotRatioAlliance = 788,
|
||||||
|
CommandAhbotRatioHorde = 789,
|
||||||
|
CommandAhbotRatioNeutral = 790,
|
||||||
|
CommandAhbotRebuild = 791,
|
||||||
|
CommandAhbotReload = 792,
|
||||||
|
CommandAhbotStatus = 793,
|
||||||
|
CommandGuildInfo = 794,
|
||||||
|
CommandInstanceSetBossState = 795,
|
||||||
|
CommandInstanceGetBossState = 796,
|
||||||
|
CommandPvpstats = 797,
|
||||||
|
CommandModifyXp = 798,
|
||||||
|
CommandGoBugTicket = 799,
|
||||||
|
CommandGoComplaintTicket = 800,
|
||||||
|
CommandGoSuggestionTicket = 801,
|
||||||
|
CommandTicketBug = 802,
|
||||||
|
CommandTicketComplaint = 803,
|
||||||
|
CommandTicketSuggestion = 804,
|
||||||
|
CommandTicketBugAssign = 805,
|
||||||
|
CommandTicketBugClose = 806,
|
||||||
|
CommandTicketBugClosedlist = 807,
|
||||||
|
CommandTicketBugComment = 808,
|
||||||
|
CommandTicketBugDelete = 809,
|
||||||
|
CommandTicketBugList = 810,
|
||||||
|
CommandTicketBugUnassign = 811,
|
||||||
|
CommandTicketBugView = 812,
|
||||||
|
CommandTicketComplaintAssign = 813,
|
||||||
|
CommandTicketComplaintClose = 814,
|
||||||
|
CommandTicketComplaintClosedlist = 815,
|
||||||
|
CommandTicketComplaintComment = 816,
|
||||||
|
CommandTicketComplaintDelete = 817,
|
||||||
|
CommandTicketComplaintList = 818,
|
||||||
|
CommandTicketComplaintUnassign = 819,
|
||||||
|
CommandTicketComplaintView = 820,
|
||||||
|
CommandTicketSuggestionAssign = 821,
|
||||||
|
CommandTicketSuggestionClose = 822,
|
||||||
|
CommandTicketSuggestionClosedlist = 823,
|
||||||
|
CommandTicketSuggestionComment = 824,
|
||||||
|
CommandTicketSuggestionDelete = 825,
|
||||||
|
CommandTicketSuggestionList = 826,
|
||||||
|
CommandTicketSuggestionUnassign = 827,
|
||||||
|
CommandTicketSuggestionView = 828,
|
||||||
|
CommandTicketResetAll = 829,
|
||||||
|
CommandBnetAccountListGameAccounts = 830,
|
||||||
|
CommandTicketResetBug = 831,
|
||||||
|
CommandTicketResetComplaint = 832,
|
||||||
|
CommandTicketResetSuggestion = 833,
|
||||||
|
CommandGoQuest = 834,
|
||||||
|
CommandDebugLoadcells = 835,
|
||||||
|
CommandDebugBoundary = 836,
|
||||||
|
CommandNpcEvade = 837,
|
||||||
|
CommandPetLevel = 838,
|
||||||
|
CommandServerShutdownForce = 839,
|
||||||
|
CommandServerRestartForce = 840,
|
||||||
|
CommandNearGraveyard = 841,
|
||||||
|
CommandReloadCharacterTemplate = 842,
|
||||||
|
CommandReloadQuestGreeting = 843,
|
||||||
|
CommandScene = 844,
|
||||||
|
CommandSceneDedug = 845,
|
||||||
|
CommandScenePlay = 846,
|
||||||
|
CommandScenePlayPackage = 847,
|
||||||
|
CommandSceneCancel = 848,
|
||||||
|
CommandListScenes = 849,
|
||||||
|
CommandReloacSceneTemplate = 850,
|
||||||
|
CommandReloadAreatriggerTemplate = 851,
|
||||||
|
CommandGoOffset = 852,
|
||||||
|
CommandReloadConversationTemplate = 853,
|
||||||
|
CommandDebugConversation = 854,
|
||||||
|
|
||||||
|
// Custom Permissions 1000+
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MountStatusFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
NeedsFanfare = 0x01,
|
||||||
|
IsFavorite = 0x02
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,440 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum AchievementFaction : sbyte
|
||||||
|
{
|
||||||
|
Horde = 0,
|
||||||
|
Alliance = 1,
|
||||||
|
Any = -1,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CriteriaTreeFlags : ushort
|
||||||
|
{
|
||||||
|
ProgressBar = 0x0001,
|
||||||
|
ProgressIsDate = 0x0004,
|
||||||
|
ShowCurrencyIcon = 0x0008,
|
||||||
|
AllianceOnly = 0x0200,
|
||||||
|
HordeOnly = 0x0400,
|
||||||
|
ShowRequiredCount = 0x0800
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CriteriaTreeOperator
|
||||||
|
{
|
||||||
|
Single = 0,
|
||||||
|
SinglerNotCompleted = 1,
|
||||||
|
All = 4,
|
||||||
|
SumChildren = 5,
|
||||||
|
MaxChild = 6,
|
||||||
|
CountDirectChildren = 7,
|
||||||
|
Any = 8,
|
||||||
|
SumChildrenWeight = 9
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum AchievementFlags
|
||||||
|
{
|
||||||
|
Counter = 0x01,
|
||||||
|
Hidden = 0x02,
|
||||||
|
PlayNoVisual = 0x04,
|
||||||
|
Summ = 0x08,
|
||||||
|
MaxUsed = 0x10,
|
||||||
|
ReqCount = 0x20,
|
||||||
|
Average = 0x40,
|
||||||
|
Bar = 0x80,
|
||||||
|
RealmFirstReach = 0x100,
|
||||||
|
RealmFirstKill = 0x200,
|
||||||
|
Unk3 = 0x400,
|
||||||
|
HideIncomplete = 0x800,
|
||||||
|
ShowInGuildNews = 0x1000,
|
||||||
|
ShowInGuildHeader = 0x2000,
|
||||||
|
Guild = 0x4000,
|
||||||
|
ShowGuildMembers = 0x8000,
|
||||||
|
ShowCriteriaMembers = 0x10000,
|
||||||
|
Account = 0x20000,
|
||||||
|
Unk5 = 0x00040000,
|
||||||
|
HideZeroCounter = 0x00080000,
|
||||||
|
TrackingFlag = 0x00100000
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CriteriaFlagsCu
|
||||||
|
{
|
||||||
|
Player = 0x1,
|
||||||
|
Account = 0x2,
|
||||||
|
Guild = 0x4,
|
||||||
|
Scenario = 0x8
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CriteriaCondition
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
NoDeath = 1,
|
||||||
|
Unk2 = 2,
|
||||||
|
BgMap = 3,
|
||||||
|
NoLose = 4,
|
||||||
|
Unk5 = 5,
|
||||||
|
Unk8 = 8,
|
||||||
|
NoSpellHit = 9,
|
||||||
|
NotInGroup = 10,
|
||||||
|
Unk13 = 13
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CriteriaAdditionalCondition
|
||||||
|
{
|
||||||
|
SourceDrunkValue = 1,
|
||||||
|
Unk2 = 2,
|
||||||
|
ItemLevel = 3,
|
||||||
|
TargetCreatureEntry = 4,
|
||||||
|
TargetMustBePlayer = 5,
|
||||||
|
TargetMustBeDead = 6,
|
||||||
|
TargetMustBeEnemy = 7,
|
||||||
|
SourceHasAura = 8,
|
||||||
|
TargetHasAura = 10,
|
||||||
|
TargetHasAuraType = 11,
|
||||||
|
ItemQualityMin = 14,
|
||||||
|
ItemQualityEquals = 15,
|
||||||
|
Unk16 = 16,
|
||||||
|
SourceAreaOrZone = 17,
|
||||||
|
TargetAreaOrZone = 18,
|
||||||
|
MapDifficultyOld = 20,
|
||||||
|
TargetCreatureYieldsXp = 21,
|
||||||
|
ArenaType = 24,
|
||||||
|
SourceRace = 25,
|
||||||
|
SourceClass = 26,
|
||||||
|
TargetRace = 27,
|
||||||
|
TargetClass = 28,
|
||||||
|
MaxGroupMembers = 29,
|
||||||
|
TargetCreatureType = 30,
|
||||||
|
SourceMap = 32,
|
||||||
|
ItemClass = 33,
|
||||||
|
ItemSubclass = 34,
|
||||||
|
CompleteQuestNotInGroup = 35,
|
||||||
|
MinPersonalRating = 37,
|
||||||
|
TitleBitIndex = 38,
|
||||||
|
SourceLevel = 39,
|
||||||
|
TargetLevel = 40,
|
||||||
|
TargetZone = 41,
|
||||||
|
TargetHealthPercentBelow = 46,
|
||||||
|
Unk55 = 55,
|
||||||
|
MinAchievementPoints = 56,
|
||||||
|
RequiresLfgGroup = 58,
|
||||||
|
Unk60 = 60,
|
||||||
|
RequiresGuildGroup = 61,
|
||||||
|
GuildReputation = 62,
|
||||||
|
RatedBattleground = 63,
|
||||||
|
RatedBattlegroundRating = 64,
|
||||||
|
ProjectRarity = 65,
|
||||||
|
ProjectRace = 66,
|
||||||
|
WorldState = 67, // Nyi
|
||||||
|
MapDifficulty = 68, // Nyi
|
||||||
|
PlayerLevel = 69, // Nyi
|
||||||
|
TargetPlayerLevel = 70, // Nyi
|
||||||
|
//PlayerLevelOnAccount = 71, // Not Verified
|
||||||
|
//Unk73 = 73, // References Another Modifier Tree Id
|
||||||
|
ScenarioId = 74, // Nyi
|
||||||
|
BattlePetFamily = 78, // Nyi
|
||||||
|
BattlePetHealthPct = 79, // Nyi
|
||||||
|
//Unk80 = 80 // Something To Do With World Bosses
|
||||||
|
BattlePetEntry = 81, // Nyi
|
||||||
|
//BattlePetEntryId = 82, // Some Sort Of Data Id?
|
||||||
|
ChallengeModeMedal = 83, // NYI
|
||||||
|
//CRITERIA_ADDITIONAL_CONDITION_UNK84 = 84, // Quest id
|
||||||
|
//CRITERIA_ADDITIONAL_CONDITION_UNK86 = 86, // Some external event id
|
||||||
|
//CRITERIA_ADDITIONAL_CONDITION_UNK87 = 87, // Achievement id
|
||||||
|
BattlePetSpecies = 91,
|
||||||
|
GarrisonFollowerEntry = 144,
|
||||||
|
GarrisonFollowerQuality = 145,
|
||||||
|
GarrisonFollowerLevel = 146,
|
||||||
|
GarrisonRareMission = 147, // NYI
|
||||||
|
GarrisonBuildingLevel = 149, // NYI
|
||||||
|
GarrisonMissionType = 167, // NYI
|
||||||
|
PLayerItemLevel = 169, // NYI
|
||||||
|
GarrisonFollowILvl = 184,
|
||||||
|
HonorLevel = 193,
|
||||||
|
PrestigeLevel = 194
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CriteriaFlags
|
||||||
|
{
|
||||||
|
ShowProgressBar = 0x01,
|
||||||
|
Hidden = 0x02,
|
||||||
|
FailAchievement = 0x04,
|
||||||
|
ResetOnStart = 0x08,
|
||||||
|
IsDate = 0x10,
|
||||||
|
MoneyCounter = 0x20
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CriteriaTimedTypes : byte
|
||||||
|
{
|
||||||
|
Event = 1, // Timer Is Started By Internal Event With Id In Timerstartevent
|
||||||
|
Quest = 2, // Timer Is Started By Accepting Quest With Entry In Timerstartevent
|
||||||
|
SpellCaster = 5, // Timer Is Started By Casting A Spell With Entry In Timerstartevent
|
||||||
|
SpellTarget = 6, // Timer Is Started By Being Target Of Spell With Entry In Timerstartevent
|
||||||
|
Creature = 7, // Timer Is Started By Killing Creature With Entry In Timerstartevent
|
||||||
|
Item = 9, // Timer Is Started By Using Item With Entry In Timerstartevent
|
||||||
|
Unk = 10, // Unknown
|
||||||
|
Unk2 = 13, // Unknown
|
||||||
|
ScenarioStage = 14, // Timer is started by changing stages in a scenario
|
||||||
|
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CriteriaTypes : byte
|
||||||
|
{
|
||||||
|
KillCreature = 0,
|
||||||
|
WinBg = 1,
|
||||||
|
// 2 - unused (Legion - 23420)
|
||||||
|
CompleteArchaeologyProjects = 3, // Struct { Uint32 Itemcount; }
|
||||||
|
SurveyGameobject = 4,
|
||||||
|
ReachLevel = 5,
|
||||||
|
ClearDigsite = 6,
|
||||||
|
ReachSkillLevel = 7,
|
||||||
|
CompleteAchievement = 8,
|
||||||
|
CompleteQuestCount = 9,
|
||||||
|
CompleteDailyQuestDaily = 10, // You Have To Complete A Daily Quest X Times In A Row
|
||||||
|
CompleteQuestsInZone = 11,
|
||||||
|
Currency = 12,
|
||||||
|
DamageDone = 13,
|
||||||
|
CompleteDailyQuest = 14,
|
||||||
|
CompleteBattleground = 15,
|
||||||
|
DeathAtMap = 16,
|
||||||
|
Death = 17,
|
||||||
|
DeathInDungeon = 18,
|
||||||
|
CompleteRaid = 19,
|
||||||
|
KilledByCreature = 20,
|
||||||
|
ManualCompleteCriteria = 21,
|
||||||
|
CompleteChallengeModeGuild = 22,
|
||||||
|
KilledByPlayer = 23,
|
||||||
|
FallWithoutDying = 24,
|
||||||
|
// 25 - unused (Legion - 23420)
|
||||||
|
DeathsFrom = 26,
|
||||||
|
CompleteQuest = 27,
|
||||||
|
BeSpellTarget = 28,
|
||||||
|
CastSpell = 29,
|
||||||
|
BgObjectiveCapture = 30,
|
||||||
|
HonorableKillAtArea = 31,
|
||||||
|
WinArena = 32,
|
||||||
|
PlayArena = 33,
|
||||||
|
LearnSpell = 34,
|
||||||
|
HonorableKill = 35,
|
||||||
|
OwnItem = 36,
|
||||||
|
WinRatedArena = 37,
|
||||||
|
HighestTeamRating = 38,
|
||||||
|
HighestPersonalRating = 39,
|
||||||
|
LearnSkillLevel = 40,
|
||||||
|
UseItem = 41,
|
||||||
|
LootItem = 42,
|
||||||
|
ExploreArea = 43,
|
||||||
|
OwnRank = 44,
|
||||||
|
BuyBankSlot = 45,
|
||||||
|
GainReputation = 46,
|
||||||
|
GainExaltedReputation = 47,
|
||||||
|
VisitBarberShop = 48,
|
||||||
|
EquipEpicItem = 49,
|
||||||
|
RollNeedOnLoot = 50, /// Todo Itemlevel Is Mentioned In Text But Not Present In Dbc
|
||||||
|
RollGreedOnLoot = 51,
|
||||||
|
HkClass = 52,
|
||||||
|
HkRace = 53,
|
||||||
|
DoEmote = 54,
|
||||||
|
HealingDone = 55,
|
||||||
|
GetKillingBlows = 56, /// Todo In Some Cases Map Not Present, And In Some Cases Need Do Without Die
|
||||||
|
EquipItem = 57,
|
||||||
|
// 58 - unused (Legion - 23420)
|
||||||
|
MoneyFromVendors = 59,
|
||||||
|
GoldSpentForTalents = 60,
|
||||||
|
NumberOfTalentResets = 61,
|
||||||
|
MoneyFromQuestReward = 62,
|
||||||
|
GoldSpentForTravelling = 63,
|
||||||
|
DefeatCreatureGroup = 64,
|
||||||
|
GoldSpentAtBarber = 65,
|
||||||
|
GoldSpentForMail = 66,
|
||||||
|
LootMoney = 67,
|
||||||
|
UseGameobject = 68,
|
||||||
|
BeSpellTarget2 = 69,
|
||||||
|
SpecialPvpKill = 70,
|
||||||
|
CompleteChallengeMode = 71,
|
||||||
|
FishInGameobject = 72,
|
||||||
|
SendEvent = 73,
|
||||||
|
OnLogin = 74,
|
||||||
|
LearnSkilllineSpells = 75,
|
||||||
|
WinDuel = 76,
|
||||||
|
LoseDuel = 77,
|
||||||
|
KillCreatureType = 78,
|
||||||
|
CookRecipesGuild = 79,
|
||||||
|
GoldEarnedByAuctions = 80,
|
||||||
|
EarnPetBattleAchievementPoints = 81,
|
||||||
|
CreateAuction = 82,
|
||||||
|
HighestAuctionBid = 83,
|
||||||
|
WonAuctions = 84,
|
||||||
|
HighestAuctionSold = 85,
|
||||||
|
HighestGoldValueOwned = 86,
|
||||||
|
GainReveredReputation = 87,
|
||||||
|
GainHonoredReputation = 88,
|
||||||
|
KnownFactions = 89,
|
||||||
|
LootEpicItem = 90,
|
||||||
|
ReceiveEpicItem = 91,
|
||||||
|
SendEventScenario = 92,
|
||||||
|
RollNeed = 93,
|
||||||
|
RollGreed = 94,
|
||||||
|
ReleaseSpirit = 95,
|
||||||
|
OwnPet = 96,
|
||||||
|
GarrisonCompleteDungeonEncounter = 97,
|
||||||
|
// 98 - unused (Legion - 23420)
|
||||||
|
// 99 - unused (Legion - 23420)
|
||||||
|
// 100 - unused (Legion - 23420)
|
||||||
|
HighestHitDealt = 101,
|
||||||
|
HighestHitReceived = 102,
|
||||||
|
TotalDamageReceived = 103,
|
||||||
|
HighestHealCasted = 104,
|
||||||
|
TotalHealingReceived = 105,
|
||||||
|
HighestHealingReceived = 106,
|
||||||
|
QuestAbandoned = 107,
|
||||||
|
FlightPathsTaken = 108,
|
||||||
|
LootType = 109,
|
||||||
|
CastSpell2 = 110, /// Todo Target Entry Is Missing
|
||||||
|
// 111 - unused (Legion - 23420)
|
||||||
|
LearnSkillLine = 112,
|
||||||
|
EarnHonorableKill = 113,
|
||||||
|
AcceptedSummonings = 114,
|
||||||
|
EarnAchievementPoints = 115,
|
||||||
|
// 116 - unused (Legion - 23420)
|
||||||
|
// 117 - unused (Legion - 23420)
|
||||||
|
CompleteLfgDungeon = 118,
|
||||||
|
UseLfdToGroupWithPlayers = 119,
|
||||||
|
LfgVoteKicksInitiatedByPlayer = 120,
|
||||||
|
LfgVoteKicksNotInitByPlayer = 121,
|
||||||
|
BeKickedFromLfg = 122,
|
||||||
|
LfgLeaves = 123,
|
||||||
|
SpentGoldGuildRepairs = 124,
|
||||||
|
ReachGuildLevel = 125,
|
||||||
|
CraftItemsGuild = 126,
|
||||||
|
CatchFromPool = 127,
|
||||||
|
BuyGuildBankSlots = 128,
|
||||||
|
EarnGuildAchievementPoints = 129,
|
||||||
|
WinRatedBattleground = 130,
|
||||||
|
// 131 - unused (Legion - 23420)
|
||||||
|
ReachBgRating = 132,
|
||||||
|
BuyGuildTabard = 133,
|
||||||
|
CompleteQuestsGuild = 134,
|
||||||
|
HonorableKillsGuild = 135,
|
||||||
|
KillCreatureTypeGuild = 136,
|
||||||
|
CountOfLfgQueueBoostsByTank = 137,
|
||||||
|
CompleteGuildChallengeType = 138, //Struct { Flag Flag; Uint32 Count; } 1: Guild Dungeon, 2:Guild Challenge, 3:Guild Battlefield
|
||||||
|
CompleteGuildChallenge = 139, //Struct { Uint32 Count; } Guild Challenge
|
||||||
|
// 140 - 1 criteria (16883), unused (Legion - 23420)
|
||||||
|
// 141 - 1 criteria (16884), unused (Legion - 23420)
|
||||||
|
// 142 - 1 criteria (16881), unused (Legion - 23420)
|
||||||
|
// 143 - 1 criteria (16882), unused (Legion - 23420)
|
||||||
|
// 144 - 1 criteria (17386), unused (Legion - 23420)
|
||||||
|
LfrDungeonsCompleted = 145,
|
||||||
|
LfrLeaves = 146,
|
||||||
|
LfrVoteKicksInitiatedByPlayer = 147,
|
||||||
|
LfrVoteKicksNotInitByPlayer = 148,
|
||||||
|
BeKickedFromLfr = 149,
|
||||||
|
CountOfLfrQueueBoostsByTank = 150,
|
||||||
|
CompleteScenarioCount = 151,
|
||||||
|
CompleteScenario = 152,
|
||||||
|
ReachAreatriggerWithActionset = 153,
|
||||||
|
// 154 - unused (Legion - 23420)
|
||||||
|
OwnBattlePet = 155,
|
||||||
|
OwnBattlePetCount = 156,
|
||||||
|
CaptureBattlePet = 157,
|
||||||
|
WinPetBattle = 158,
|
||||||
|
// 159 - 2 criterias (22312,22314), unused (Legion - 23420)
|
||||||
|
LevelBattlePet = 160,
|
||||||
|
CaptureBattlePetCredit = 161, // Triggers A Quest Credit
|
||||||
|
LevelBattlePetCredit = 162, // Triggers A Quest Credit
|
||||||
|
EnterArea = 163, // Triggers A Quest Credit
|
||||||
|
LeaveArea = 164, // Triggers A Quest Credit
|
||||||
|
CompleteDungeonEncounter = 165,
|
||||||
|
// 166 - unused (Legion - 23420)
|
||||||
|
PlaceGarrisonBuilding = 167,
|
||||||
|
UpgradeGarrisonBuilding = 168,
|
||||||
|
ConstructGarrisonBuilding = 169,
|
||||||
|
UpgradeGarrison = 170,
|
||||||
|
StartGarrisonMission = 171,
|
||||||
|
StartOrderHallMission = 172,
|
||||||
|
CompleteGarrisonMissionCount = 173,
|
||||||
|
CompleteGarrisonMission = 174,
|
||||||
|
RecruitGarrisonFollowerCount = 175,
|
||||||
|
RecruitGarrisonFollower = 176,
|
||||||
|
// 177 - 0 criterias (Legion - 23420)
|
||||||
|
LearnGarrisonBlueprintCount = 178,
|
||||||
|
// 179 - 0 criterias (Legion - 23420)
|
||||||
|
// 180 - 0 criterias (Legion - 23420)
|
||||||
|
// 181 - 0 criterias (Legion - 23420)
|
||||||
|
CompleteGarrisonShipment = 182,
|
||||||
|
RaiseGarrisonFollowerItemLevel = 183,
|
||||||
|
RaiseGarrisonFollowerLevel = 184,
|
||||||
|
OwnToy = 185,
|
||||||
|
OwnToyCount = 186,
|
||||||
|
RecruitGarrisonFollowerWithQuality = 187,
|
||||||
|
// 188 - 0 criterias (Legion - 23420)
|
||||||
|
OwnHeirlooms = 189,
|
||||||
|
ArtifactPowerEarned = 190,
|
||||||
|
ArtifactTraitsUnlocked = 191,
|
||||||
|
HonorLevelReached = 194,
|
||||||
|
PrestigeReached = 195,
|
||||||
|
// 196 - CRITERIA_TYPE_REACH_LEVEL_2 or something
|
||||||
|
// 197 - Order Hall Advancement related
|
||||||
|
OrderHallTalentLearned = 198,
|
||||||
|
AppearanceUnlockedBySlot = 199,
|
||||||
|
OrderHallRecruitTyoop = 200,
|
||||||
|
// 201 - 0 criterias (Legion - 23420)
|
||||||
|
// 202 - 0 criterias (Legion - 23420)
|
||||||
|
CompleteWorldQuest = 203,
|
||||||
|
// 204 - Special criteria type to award players for some external events? Comes with what looks like an identifier, so guessing it's not unique.
|
||||||
|
TotalTypes = 208
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CriteriaDataType
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
TCreature = 1,
|
||||||
|
TPlayerClassRace = 2,
|
||||||
|
TPlayerLessHealth = 3,
|
||||||
|
SAura = 5,
|
||||||
|
TAura = 7,
|
||||||
|
Value = 8,
|
||||||
|
TLevel = 9,
|
||||||
|
TGender = 10,
|
||||||
|
Script = 11,
|
||||||
|
// Reuse
|
||||||
|
MapPlayerCount = 13,
|
||||||
|
TTeam = 14,
|
||||||
|
SDrunk = 15,
|
||||||
|
Holiday = 16,
|
||||||
|
BgLossTeamScore = 17,
|
||||||
|
InstanceScript = 18,
|
||||||
|
SEquippedItem = 19,
|
||||||
|
MapId = 20,
|
||||||
|
SPlayerClassRace = 21,
|
||||||
|
// Reuse
|
||||||
|
SKnownTitle = 23,
|
||||||
|
GameEvent = 24,
|
||||||
|
SItemQuality = 25,
|
||||||
|
|
||||||
|
Max = 25
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ProgressType
|
||||||
|
{
|
||||||
|
Set,
|
||||||
|
Accumulate,
|
||||||
|
Highest
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum AreaTriggerFlags
|
||||||
|
{
|
||||||
|
HasAbsoluteOrientation = 0x01, // Nyi
|
||||||
|
HasDynamicShape = 0x02, // Implemented For Spheres
|
||||||
|
HasAttached = 0x04,
|
||||||
|
HasFaceMovementDir = 0x08,
|
||||||
|
HasFollowsTerrain = 0x010, // Nyi
|
||||||
|
Unk1 = 0x020,
|
||||||
|
HasTargetRollPitchYaw = 0x040, // Nyi
|
||||||
|
Unk2 = 0x080,
|
||||||
|
Unk3 = 0x100,
|
||||||
|
Unk4 = 0x200,
|
||||||
|
Unk5 = 0x400
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum AreaTriggerTypes
|
||||||
|
{
|
||||||
|
Sphere = 0,
|
||||||
|
Box = 1,
|
||||||
|
Unk = 2,
|
||||||
|
Polygon = 3,
|
||||||
|
Cylinder = 4,
|
||||||
|
Max = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum AreaTriggerActionTypes
|
||||||
|
{
|
||||||
|
Cast = 0,
|
||||||
|
AddAura = 1,
|
||||||
|
Max = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum AreaTriggerActionUserTypes
|
||||||
|
{
|
||||||
|
Any = 0,
|
||||||
|
Friend = 1,
|
||||||
|
Enemy = 2,
|
||||||
|
Raid = 3,
|
||||||
|
Party = 4,
|
||||||
|
Caster = 5,
|
||||||
|
Max = 6
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum AuctionError
|
||||||
|
{
|
||||||
|
Ok = 0,
|
||||||
|
Inventory = 1,
|
||||||
|
DatabaseError = 2,
|
||||||
|
NotEnoughtMoney = 3,
|
||||||
|
ItemNotFound = 4,
|
||||||
|
HigherBid = 5,
|
||||||
|
BidIncrement = 7,
|
||||||
|
BidOwn = 10,
|
||||||
|
RestrictedAccount = 13
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum AuctionAction
|
||||||
|
{
|
||||||
|
SellItem = 0,
|
||||||
|
Cancel = 1,
|
||||||
|
PlaceBid = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MailAuctionAnswers
|
||||||
|
{
|
||||||
|
Outbidded = 0,
|
||||||
|
Won = 1,
|
||||||
|
Successful = 2,
|
||||||
|
Expired = 3,
|
||||||
|
CancelledToBidder = 4,
|
||||||
|
Canceled = 5,
|
||||||
|
SalePending = 6
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum ResponseCodes
|
||||||
|
{
|
||||||
|
Success = 0,
|
||||||
|
Failure = 1,
|
||||||
|
Cancelled = 2,
|
||||||
|
Disconnected = 3,
|
||||||
|
FailedToConnect = 4,
|
||||||
|
Connected = 5,
|
||||||
|
VersionMismatch = 6,
|
||||||
|
|
||||||
|
CstatusConnecting = 7,
|
||||||
|
CstatusNegotiatingSecurity = 8,
|
||||||
|
CstatusNegotiationComplete = 9,
|
||||||
|
CstatusNegotiationFailed = 10,
|
||||||
|
CstatusAuthenticating = 11,
|
||||||
|
|
||||||
|
RealmListInProgress = 12,
|
||||||
|
RealmListSuccess = 13,
|
||||||
|
RealmListFailed = 14,
|
||||||
|
RealmListInvalid = 15,
|
||||||
|
RealmListRealmNotFound = 16,
|
||||||
|
|
||||||
|
AccountCreateInProgress = 17,
|
||||||
|
AccountCreateSuccess = 18,
|
||||||
|
AccountCreateFailed = 19,
|
||||||
|
|
||||||
|
CharListRetrieving = 20,
|
||||||
|
CharListRetrieved = 21,
|
||||||
|
CharListFailed = 22,
|
||||||
|
|
||||||
|
CharCreateInProgress = 23,
|
||||||
|
CharCreateSuccess = 24,
|
||||||
|
CharCreateError = 25,
|
||||||
|
CharCreateFailed = 26,
|
||||||
|
CharCreateNameInUse = 27,
|
||||||
|
CharCreateDisabled = 28,
|
||||||
|
CharCreatePvpTeamsViolation = 29,
|
||||||
|
CharCreateServerLimit = 30,
|
||||||
|
CharCreateAccountLimit = 31,
|
||||||
|
CharCreateServerQueue = 32,
|
||||||
|
CharCreateOnlyExisting = 33,
|
||||||
|
CharCreateExpansion = 34,
|
||||||
|
CharCreateExpansionClass = 35,
|
||||||
|
CharCreateLevelRequirement = 36,
|
||||||
|
CharCreateUniqueClassLimit = 37,
|
||||||
|
CharCreateCharacterInGuild = 38,
|
||||||
|
CharCreateRestrictedRaceclass = 39,
|
||||||
|
CharCreateCharacterChooseRace = 40,
|
||||||
|
CharCreateCharacterArenaLeader = 41,
|
||||||
|
CharCreateCharacterDeleteMail = 42,
|
||||||
|
CharCreateCharacterSwapFaction = 43,
|
||||||
|
CharCreateCharacterRaceOnly = 44,
|
||||||
|
CharCreateCharacterGoldLimit = 45,
|
||||||
|
CharCreateForceLogin = 46,
|
||||||
|
CharCreateTrial = 47,
|
||||||
|
CharCreateTimeout = 48,
|
||||||
|
CharCreateThrottle = 49,
|
||||||
|
|
||||||
|
CharDeleteInProgress = 50,
|
||||||
|
CharDeleteSuccess = 51,
|
||||||
|
CharDeleteFailed = 52,
|
||||||
|
CharDeleteFailedLockedForTransfer = 53,
|
||||||
|
CharDeleteFailedGuildLeader = 54,
|
||||||
|
CharDeleteFailedArenaCaptain = 55,
|
||||||
|
CharDeleteFailedHasHeirloomOrMail = 56,
|
||||||
|
CharDeleteFailedUpgradeInProgress = 57,
|
||||||
|
CharDeleteFailedHasWowToken = 58,
|
||||||
|
CharDeleteFailedVasTransactionInProgress = 59,
|
||||||
|
|
||||||
|
CharLoginInProgress = 60,
|
||||||
|
CharLoginSuccess = 61,
|
||||||
|
CharLoginNoWorld = 62,
|
||||||
|
CharLoginDuplicateCharacter = 63,
|
||||||
|
CharLoginNoInstances = 64,
|
||||||
|
CharLoginFailed = 65,
|
||||||
|
CharLoginDisabled = 66,
|
||||||
|
CharLoginNoCharacter = 67,
|
||||||
|
CharLoginLockedForTransfer = 68,
|
||||||
|
CharLoginLockedByBilling = 69,
|
||||||
|
CharLoginLockedByMobileAh = 70,
|
||||||
|
CharLoginTemporaryGmLock = 71,
|
||||||
|
CharLoginLockedByCharacterUpgrade = 72,
|
||||||
|
CharLoginLockedByRevokedCharacterUpgrade = 73,
|
||||||
|
CharLoginLockedByRevokedVasTransaction = 74,
|
||||||
|
|
||||||
|
CharNameSuccess = 75,
|
||||||
|
CharNameFailure = 76,
|
||||||
|
CharNameNoName = 77,
|
||||||
|
CharNameTooShort = 78,
|
||||||
|
CharNameTooLong = 79,
|
||||||
|
CharNameInvalidCharacter = 80,
|
||||||
|
CharNameMixedLanguages = 81,
|
||||||
|
CharNameProfane = 82,
|
||||||
|
CharNameReserved = 83,
|
||||||
|
CharNameInvalidApostrophe = 84,
|
||||||
|
CharNameMultipleApostrophes = 85,
|
||||||
|
CharNameThreeConsecutive = 86,
|
||||||
|
CharNameInvalidSpace = 87,
|
||||||
|
CharNameConsecutiveSpaces = 88,
|
||||||
|
CharNameRussianConsecutiveSilentCharacters = 89,
|
||||||
|
CharNameRussianSilentCharacterAtBeginningOrEnd = 90,
|
||||||
|
CharNameDeclensionDoesntMatchBaseName = 91
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CharacterUndeleteResult
|
||||||
|
{
|
||||||
|
Ok = 0,
|
||||||
|
Cooldown = 1,
|
||||||
|
CharCreate = 2,
|
||||||
|
Disabled = 3,
|
||||||
|
NameTakenByThisAccount = 4,
|
||||||
|
Unknown = 5
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,668 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum BattlenetRpcErrorCode : uint
|
||||||
|
{
|
||||||
|
Ok = 0x00000000,
|
||||||
|
Internal = 0x00000001,
|
||||||
|
TimedOut = 0x00000002,
|
||||||
|
Denied = 0x00000003,
|
||||||
|
NotExists = 0x00000004,
|
||||||
|
NotStarted = 0x00000005,
|
||||||
|
InProgress = 0x00000006,
|
||||||
|
InvalidArgs = 0x00000007,
|
||||||
|
InvalidSubscriber = 0x00000008,
|
||||||
|
WaitingForDependency = 0x00000009,
|
||||||
|
NoAuth = 0x0000000a,
|
||||||
|
ParentalControlRestriction = 0x0000000b,
|
||||||
|
NoGameAccount = 0x0000000c,
|
||||||
|
NotImplemented = 0x0000000d,
|
||||||
|
ObjectRemoved = 0x0000000e,
|
||||||
|
InvalidEntityId = 0x0000000f,
|
||||||
|
InvalidEntityAccountId = 0x00000010,
|
||||||
|
InvalidEntityGameAccountId = 0x00000011,
|
||||||
|
InvalidAgentId = 0x00000013,
|
||||||
|
InvalidTargetId = 0x00000014,
|
||||||
|
ModuleNotLoaded = 0x00000015,
|
||||||
|
ModuleNoEntryPoint = 0x00000016,
|
||||||
|
ModuleSignatureIncorrect = 0x00000017,
|
||||||
|
ModuleCreateFailed = 0x00000018,
|
||||||
|
NoProgram = 0x00000019,
|
||||||
|
ApiNotReady = 0x0000001b,
|
||||||
|
BadVersion = 0x0000001c,
|
||||||
|
AttributeTooManyAttributesSet = 0x0000001d,
|
||||||
|
AttributeMaxSizeExceeded = 0x0000001e,
|
||||||
|
AttributeQuotaExceeded = 0x0000001f,
|
||||||
|
ServerPoolServerDisappeared = 0x00000020,
|
||||||
|
ServerIsPrivate = 0x00000021,
|
||||||
|
Disabled = 0x00000022,
|
||||||
|
ModuleNotFound = 0x00000024,
|
||||||
|
ServerBusy = 0x00000025,
|
||||||
|
NoBattletag = 0x00000026,
|
||||||
|
IncompleteProfanityFilters = 0x00000027,
|
||||||
|
InvalidRegion = 0x00000028,
|
||||||
|
ExistsAlready = 0x00000029,
|
||||||
|
InvalidServerThumbprint = 0x0000002a,
|
||||||
|
PhoneLock = 0x0000002b,
|
||||||
|
Squelched = 0x0000002c,
|
||||||
|
TargetOffline = 0x0000002d,
|
||||||
|
BadServer = 0x0000002e,
|
||||||
|
NoCookie = 0x0000002f,
|
||||||
|
ExpiredCookie = 0x00000030,
|
||||||
|
TokenNotFound = 0x00000031,
|
||||||
|
GameAccountNoTime = 0x00000032,
|
||||||
|
GameAccountNoPlan = 0x00000033,
|
||||||
|
GameAccountBanned = 0x00000034,
|
||||||
|
GameAccountSuspended = 0x00000035,
|
||||||
|
GameAccountAlreadySelected = 0x00000036,
|
||||||
|
GameAccountCancelled = 0x00000037,
|
||||||
|
GameAccountCreationDisabled = 0x00000038,
|
||||||
|
GameAccountLocked = 0x00000039,
|
||||||
|
|
||||||
|
SessionDuplicate = 0x0000003c,
|
||||||
|
SessionDisconnected = 0x0000003d,
|
||||||
|
SessionDataChanged = 0x0000003e,
|
||||||
|
SessionUpdateFailed = 0x0000003f,
|
||||||
|
SessionNotFound = 0x00000040,
|
||||||
|
|
||||||
|
AdminKick = 0x00000046,
|
||||||
|
UnplannedMaintenance = 0x00000047,
|
||||||
|
PlannedMaintenance = 0x00000048,
|
||||||
|
ServiceFailureAccount = 0x00000049,
|
||||||
|
ServiceFailureSession = 0x0000004a,
|
||||||
|
ServiceFailureAuth = 0x0000004b,
|
||||||
|
ServiceFailureRisk = 0x0000004c,
|
||||||
|
BadProgram = 0x0000004d,
|
||||||
|
BadLocale = 0x0000004e,
|
||||||
|
BadPlatform = 0x0000004f,
|
||||||
|
LocaleRestrictedLa = 0x00000051,
|
||||||
|
LocaleRestrictedRu = 0x00000052,
|
||||||
|
LocaleRestrictedKo = 0x00000053,
|
||||||
|
LocaleRestrictedTw = 0x00000054,
|
||||||
|
LocaleRestricted = 0x00000055,
|
||||||
|
AccountNeedsMaintenance = 0x00000056,
|
||||||
|
ModuleApiError = 0x00000057,
|
||||||
|
ModuleBadCacheHandle = 0x00000058,
|
||||||
|
ModuleAlreadyLoaded = 0x00000059,
|
||||||
|
NetworkBlacklisted = 0x0000005a,
|
||||||
|
EventProcessorSlow = 0x0000005b,
|
||||||
|
ServerShuttingDown = 0x0000005c,
|
||||||
|
NetworkNotPrivileged = 0x0000005d,
|
||||||
|
TooManyOutstandingRequests = 0x0000005e,
|
||||||
|
NoAccountRegistered = 0x0000005f,
|
||||||
|
BattlenetAccountBanned = 0x00000060,
|
||||||
|
|
||||||
|
OkDeprecated = 0x00000064,
|
||||||
|
ServerInModeZombie = 0x00000065,
|
||||||
|
|
||||||
|
LogonModuleRequired = 0x000001f4,
|
||||||
|
LogonModuleNotConfigured = 0x000001f5,
|
||||||
|
LogonModuleTimeout = 0x000001f6,
|
||||||
|
LogonAgreementRequired = 0x000001fe,
|
||||||
|
LogonAgreementNotConfigured = 0x000001ff,
|
||||||
|
|
||||||
|
LogonInvalidServerProof = 0x00000208,
|
||||||
|
LogonWebVerifyTimeout = 0x00000209,
|
||||||
|
LogonInvalidAuthToken = 0x0000020a,
|
||||||
|
|
||||||
|
ChallengeSmsTooSoon = 0x00000258,
|
||||||
|
ChallengeSmsThrottled = 0x00000259,
|
||||||
|
ChallengeSmsTempOutage = 0x0000025a,
|
||||||
|
ChallengeNoChallenge = 0x0000025b,
|
||||||
|
ChallengeNotPicked = 0x0000025c,
|
||||||
|
ChallengeAlreadyPicked = 0x0000025d,
|
||||||
|
ChallengeInProgress = 0x0000025e,
|
||||||
|
|
||||||
|
ConfigFormatInvalid = 0x000002bc,
|
||||||
|
ConfigNotFound = 0x000002bd,
|
||||||
|
ConfigRetrieveFailed = 0x000002be,
|
||||||
|
|
||||||
|
NetworkModuleBusy = 0x000003e8,
|
||||||
|
NetworkModuleCantResolveAddress = 0x000003e9,
|
||||||
|
NetworkModuleConnectionRefused = 0x000003ea,
|
||||||
|
NetworkModuleInterrupted = 0x000003eb,
|
||||||
|
NetworkModuleConnectionAborted = 0x000003ec,
|
||||||
|
NetworkModuleConnectionReset = 0x000003ed,
|
||||||
|
NetworkModuleBadAddress = 0x000003ee,
|
||||||
|
NetworkModuleNotReady = 0x000003ef,
|
||||||
|
NetworkModuleAlreadyConnected = 0x000003f0,
|
||||||
|
NetworkModuleCantCreateSocket = 0x000003f1,
|
||||||
|
NetworkModuleNetworkUnreachable = 0x000003f2,
|
||||||
|
NetworkModuleSocketPermissionDenied = 0x000003f3,
|
||||||
|
NetworkModuleNotInitialized = 0x000003f4,
|
||||||
|
NetworkModuleNoSslCertificateForPeer = 0x000003f5,
|
||||||
|
NetworkModuleNoSslCommonNameForCertificate = 0x000003f6,
|
||||||
|
NetworkModuleSslCommonNameDoesNotMatchRemoteEndpoint = 0x000003f7,
|
||||||
|
NetworkModuleSocketClosed = 0x000003f8,
|
||||||
|
NetworkModuleSslPeerIsNotRegisteredInCertbundle = 0x000003f9,
|
||||||
|
NetworkModuleSslInitializeLowFirst = 0x000003fa,
|
||||||
|
NetworkModuleSslCertBundleReadError = 0x000003fb,
|
||||||
|
NetworkModuleNoCertBundle = 0x000003fc,
|
||||||
|
NetworkModuleFailedToDownloadCertBundle = 0x000003fd,
|
||||||
|
NetworkModuleNotReadyToRead = 0x000003fe,
|
||||||
|
|
||||||
|
NetworkModuleOpensslX509Ok = 0x000004b0,
|
||||||
|
NetworkModuleOpensslX509UnableToGetIssuerCert = 0x000004b1,
|
||||||
|
NetworkModuleOpensslX509UnableToGetCrl = 0x000004b2,
|
||||||
|
NetworkModuleOpensslX509UnableToDecryptCertSignature = 0x000004b3,
|
||||||
|
NetworkModuleOpensslX509UnableToDecryptCrlSignature = 0x000004b4,
|
||||||
|
NetworkModuleOpensslX509UnableToDecodeIssuerPublicKey = 0x000004b5,
|
||||||
|
NetworkModuleOpensslX509CertSignatureFailure = 0x000004b6,
|
||||||
|
NetworkModuleOpensslX509CrlSignatureFailure = 0x000004b7,
|
||||||
|
NetworkModuleOpensslX509CertNotYetValid = 0x000004b8,
|
||||||
|
NetworkModuleOpensslX509CertHasExpired = 0x000004b9,
|
||||||
|
NetworkModuleOpensslX509CrlNotYetValid = 0x000004ba,
|
||||||
|
NetworkModuleOpensslX509CrlHasExpired = 0x000004bb,
|
||||||
|
NetworkModuleOpensslX509InCertNotBeforeField = 0x000004bc,
|
||||||
|
NetworkModuleOpensslX509InCertNotAfterField = 0x000004bd,
|
||||||
|
NetworkModuleOpensslX509InCrlLastUpdateField = 0x000004be,
|
||||||
|
NetworkModuleOpensslX509InCrlNextUpdateField = 0x000004bf,
|
||||||
|
NetworkModuleOpensslX509OutOfMem = 0x000004c0,
|
||||||
|
NetworkModuleOpensslX509DepthZeroSelfSignedCert = 0x000004c1,
|
||||||
|
NetworkModuleOpensslX509SelfSignedCertInChain = 0x000004c2,
|
||||||
|
NetworkModuleOpensslX509UnableToGetIssuerCertLocally = 0x000004c3,
|
||||||
|
NetworkModuleOpensslX509UnableToVerifyLeafSignature = 0x000004c4,
|
||||||
|
NetworkModuleOpensslX509CertChainTooLong = 0x000004c5,
|
||||||
|
NetworkModuleOpensslX509CertRevoked = 0x000004c6,
|
||||||
|
NetworkModuleOpensslX509InvalidCa = 0x000004c7,
|
||||||
|
NetworkModuleOpensslX509PathLengthExceeded = 0x000004c8,
|
||||||
|
NetworkModuleOpensslX509InvalidPurpose = 0x000004c9,
|
||||||
|
NetworkModuleOpensslX509CertUntrusted = 0x000004ca,
|
||||||
|
NetworkModuleOpensslX509CertRejected = 0x000004cb,
|
||||||
|
NetworkModuleOpensslX509SubjectIssuerMismatch = 0x000004cc,
|
||||||
|
NetworkModuleOpensslX509AkidSkidMismatch = 0x000004cd,
|
||||||
|
NetworkModuleOpensslX509AkidIssuerSerialMismatch = 0x000004ce,
|
||||||
|
NetworkModuleOpensslX509KeyusageNoCertsign = 0x000004cf,
|
||||||
|
NetworkModuleOpensslX509ApplicationVerification = 0x000004d0,
|
||||||
|
|
||||||
|
NetworkModuleSchannelCannotFindOsVersion = 0x00000514,
|
||||||
|
NetworkModuleSchannelOsNotSupported = 0x00000515,
|
||||||
|
NetworkModuleSchannelLoadlibraryFail = 0x00000516,
|
||||||
|
NetworkModuleSchannelCannotFindInterface = 0x00000517,
|
||||||
|
NetworkModuleSchannelInitFail = 0x00000518,
|
||||||
|
NetworkModuleSchannelFunctionCallFail = 0x00000519,
|
||||||
|
NetworkModuleSchannelX509UnableToGetIssuerCert = 0x00000546,
|
||||||
|
NetworkModuleSchannelX509TimeInvalid = 0x00000547,
|
||||||
|
NetworkModuleSchannelX509SignatureInvalid = 0x00000548,
|
||||||
|
NetworkModuleSchannelX509UnableToVerifyLeafSignature = 0x00000549,
|
||||||
|
NetworkModuleSchannelX509SelfSignedLeafCertificate = 0x0000054a,
|
||||||
|
NetworkModuleSchannelX509UnhandledError = 0x0000054b,
|
||||||
|
NetworkModuleSchannelX509SelfSignedCertInChain = 0x0000054c,
|
||||||
|
|
||||||
|
WebsocketHandshake = 0x00000578,
|
||||||
|
|
||||||
|
NetworkModuleDurangoUnknown = 0x000005dc,
|
||||||
|
NetworkModuleDurangoMalformedHostName = 0x000005dd,
|
||||||
|
NetworkModuleDurangoInvalidConnectionResponse = 0x000005de,
|
||||||
|
NetworkModuleDurangoInvalidCaCert = 0x000005df,
|
||||||
|
|
||||||
|
RpcWriteFailed = 0x00000bb8,
|
||||||
|
RpcServiceNotBound = 0x00000bb9,
|
||||||
|
RpcTooManyRequests = 0x00000bba,
|
||||||
|
RpcPeerUnknown = 0x00000bbb,
|
||||||
|
RpcPeerUnavailable = 0x00000bbc,
|
||||||
|
RpcPeerDisconnected = 0x00000bbd,
|
||||||
|
RpcRequestTimedOut = 0x00000bbe,
|
||||||
|
RpcConnectionTimedOut = 0x00000bbf,
|
||||||
|
RpcMalformedResponse = 0x00000bc0,
|
||||||
|
RpcAccessDenied = 0x00000bc1,
|
||||||
|
RpcInvalidService = 0x00000bc2,
|
||||||
|
RpcInvalidMethod = 0x00000bc3,
|
||||||
|
RpcInvalidObject = 0x00000bc4,
|
||||||
|
RpcMalformedRequest = 0x00000bc5,
|
||||||
|
RpcQuotaExceeded = 0x00000bc6,
|
||||||
|
RpcNotImplemented = 0x00000bc7,
|
||||||
|
RpcServerError = 0x00000bc8,
|
||||||
|
RpcShutdown = 0x00000bc9,
|
||||||
|
RpcDisconnect = 0x00000bca,
|
||||||
|
RpcDisconnectIdle = 0x00000bcb,
|
||||||
|
RpcProtocolError = 0x00000bcc,
|
||||||
|
RpcNotReady = 0x00000bcd,
|
||||||
|
RpcForwardFailed = 0x00000bce,
|
||||||
|
RpcEncryptionFailed = 0x00000bcf,
|
||||||
|
RpcInvalidAddress = 0x00000bd0,
|
||||||
|
RpcMethodDisabled = 0x00000bd1,
|
||||||
|
RpcShardNotFound = 0x00000bd2,
|
||||||
|
RpcInvalidConnectionId = 0x00000bd3,
|
||||||
|
RpcNotConnected = 0x00000bd4,
|
||||||
|
RpcInvalidConnectionState = 0x00000bd5,
|
||||||
|
RpcServiceAlreadyRegistered = 0x00000bd6,
|
||||||
|
|
||||||
|
PresenceInvalidFieldId = 0x00000fa0,
|
||||||
|
PresenceNoValidSubscribers = 0x00000fa1,
|
||||||
|
PresenceAlreadySubscribed = 0x00000fa2,
|
||||||
|
PresenceConsumerNotFound = 0x00000fa3,
|
||||||
|
PresenceConsumerIsNull = 0x00000fa4,
|
||||||
|
PresenceTemporaryOutage = 0x00000fa5,
|
||||||
|
PresenceTooManySubscriptions = 0x00000fa6,
|
||||||
|
PresenceSubscriptionCancelled = 0x00000fa7,
|
||||||
|
PresenceRichPresenceParseError = 0x00000fa8,
|
||||||
|
PresenceRichPresenceXmlError = 0x00000fa9,
|
||||||
|
PresenceRichPresenceLoadError = 0x00000faa,
|
||||||
|
|
||||||
|
FriendsTooManySentInvitations = 0x00001389,
|
||||||
|
FriendsTooManyReceivedInvitations = 0x0000138a,
|
||||||
|
FriendsFriendshipAlreadyExists = 0x0000138b,
|
||||||
|
FriendsFriendshipDoesNotExist = 0x0000138c,
|
||||||
|
FriendsInvitationAlreadyExists = 0x0000138d,
|
||||||
|
FriendsInvalidInvitation = 0x0000138e,
|
||||||
|
FriendsAlreadySubscribed = 0x0000138f,
|
||||||
|
FriendsAccountBlocked = 0x00001391,
|
||||||
|
FriendsNotSubscribed = 0x00001392,
|
||||||
|
FriendsInvalidRoleId = 0x00001393,
|
||||||
|
FriendsDisabledRoleId = 0x00001394,
|
||||||
|
FriendsNoteMaxSizeExceeded = 0x00001395,
|
||||||
|
FriendsUpdateFriendStateFailed = 0x00001396,
|
||||||
|
FriendsInviteeAtMaxFriends = 0x00001397,
|
||||||
|
FriendsInviterAtMaxFriends = 0x00001398,
|
||||||
|
|
||||||
|
PlatformStorageFileWriteDenied = 0x00001770,
|
||||||
|
|
||||||
|
WhisperUndeliverable = 0x00001b58,
|
||||||
|
WhisperMaxSizeExceeded = 0x00001b59,
|
||||||
|
|
||||||
|
UserManagerAlreadyBlocked = 0x00001f40,
|
||||||
|
UserManagerNotBlocked = 0x00001f41,
|
||||||
|
UserManagerCannotBlockSelf = 0x00001f42,
|
||||||
|
UserManagerAlreadyRegistered = 0x00001f43,
|
||||||
|
UserManagerNotRegistered = 0x00001f44,
|
||||||
|
UserManagerTooManyBlockedEntities = 0x00001f45,
|
||||||
|
UserManagerTooManyIds = 0x00001f47,
|
||||||
|
UserManagerBlockRecordUnavailable = 0x00001f4f,
|
||||||
|
UserManagerBlockEntityFailed = 0x00001f50,
|
||||||
|
UserManagerUnblockEntityFailed = 0x00001f51,
|
||||||
|
UserManagerCannotBlockFriend = 0x00001f53,
|
||||||
|
|
||||||
|
SocialNetworkDbException = 0x00002328,
|
||||||
|
SocialNetworkDenialFromProvider = 0x00002329,
|
||||||
|
SocialNetworkInvalidSnsId = 0x0000232a,
|
||||||
|
SocialNetworkCantSendToProvider = 0x0000232b,
|
||||||
|
SocialNetworkExCommFailed = 0x0000232c,
|
||||||
|
SocialNetworkDisabled = 0x0000232d,
|
||||||
|
SocialNetworkMissingRequestParam = 0x0000232e,
|
||||||
|
SocialNetworkUnsupportedOauthVersion = 0x0000232f,
|
||||||
|
|
||||||
|
ChannelFull = 0x00002710,
|
||||||
|
ChannelNoChannel = 0x00002711,
|
||||||
|
ChannelNotMember = 0x00002712,
|
||||||
|
ChannelAlreadyMember = 0x00002713,
|
||||||
|
ChannelNoSuchMember = 0x00002714,
|
||||||
|
ChannelInvalidChannelId = 0x00002716,
|
||||||
|
ChannelNoSuchInvitation = 0x00002718,
|
||||||
|
ChannelTooManyInvitations = 0x00002719,
|
||||||
|
ChannelInvitationAlreadyExists = 0x0000271a,
|
||||||
|
ChannelInvalidChannelSize = 0x0000271b,
|
||||||
|
ChannelInvalidRoleId = 0x0000271c,
|
||||||
|
ChannelRoleNotAssignable = 0x0000271d,
|
||||||
|
ChannelInsufficientPrivileges = 0x0000271e,
|
||||||
|
ChannelInsufficientPrivacyLevel = 0x0000271f,
|
||||||
|
ChannelInvalidPrivacyLevel = 0x00002720,
|
||||||
|
ChannelTooManyChannelsJoined = 0x00002721,
|
||||||
|
ChannelInvitationAlreadySubscribed = 0x00002722,
|
||||||
|
ChannelInvalidChannelDelegate = 0x00002723,
|
||||||
|
ChannelSlotAlreadyReserved = 0x00002724,
|
||||||
|
ChannelSlotNotReserved = 0x00002725,
|
||||||
|
ChannelNoReservedSlotsAvailable = 0x00002726,
|
||||||
|
ChannelInvalidRoleSet = 0x00002727,
|
||||||
|
ChannelRequireFriendValidation = 0x00002728,
|
||||||
|
ChannelMemberOffline = 0x00002729,
|
||||||
|
ChannelReceivedTooManyInvitations = 0x0000272a,
|
||||||
|
ChannelInvitationInvalidGameAccountSelected = 0x0000272b,
|
||||||
|
ChannelUnreachable = 0x0000272c,
|
||||||
|
ChannelInvitationNotSubscribed = 0x0000272d,
|
||||||
|
ChannelInvalidMessageSize = 0x0000272e,
|
||||||
|
ChannelMaxMessageSizeExceeded = 0x0000272f,
|
||||||
|
ChannelConfigNotFound = 0x00002730,
|
||||||
|
ChannelInvalidChannelType = 0x00002731,
|
||||||
|
|
||||||
|
LocalStorageFileOpenError = 0x00002af8,
|
||||||
|
LocalStorageFileCreateError = 0x00002af9,
|
||||||
|
LocalStorageFileReadError = 0x00002afa,
|
||||||
|
LocalStorageFileWriteError = 0x00002afb,
|
||||||
|
LocalStorageFileDeleteError = 0x00002afc,
|
||||||
|
LocalStorageFileCopyError = 0x00002afd,
|
||||||
|
LocalStorageFileDecompressError = 0x00002afe,
|
||||||
|
LocalStorageFileHashMismatch = 0x00002aff,
|
||||||
|
LocalStorageFileUsageMismatch = 0x00002b00,
|
||||||
|
LocalStorageDatabaseInitError = 0x00002b01,
|
||||||
|
LocalStorageDatabaseNeedsRebuild = 0x00002b02,
|
||||||
|
LocalStorageDatabaseInsertError = 0x00002b03,
|
||||||
|
LocalStorageDatabaseLookupError = 0x00002b04,
|
||||||
|
LocalStorageDatabaseUpdateError = 0x00002b05,
|
||||||
|
LocalStorageDatabaseDeleteError = 0x00002b06,
|
||||||
|
LocalStorageDatabaseShrinkError = 0x00002b07,
|
||||||
|
LocalStorageCacheCrawlError = 0x00002b08,
|
||||||
|
LocalStorageDatabaseIndexTriggerError = 0x00002b09,
|
||||||
|
LocalStorageDatabaseRebuildInProgress = 0x00002b0a,
|
||||||
|
LocalStorageOkButNotInCache = 0x00002b0b,
|
||||||
|
LocalStorageDatabaseRebuildInterrupted = 0x00002b0d,
|
||||||
|
LocalStorageDatabaseNotInitialized = 0x00002b0e,
|
||||||
|
LocalStorageDirectoryCreateError = 0x00002b0f,
|
||||||
|
LocalStorageFilekeyNotFound = 0x00002b10,
|
||||||
|
LocalStorageNotAvailableOnServer = 0x00002b11,
|
||||||
|
|
||||||
|
RegistryCreateKeyError = 0x00002ee0,
|
||||||
|
RegistryOpenKeyError = 0x00002ee1,
|
||||||
|
RegistryReadError = 0x00002ee2,
|
||||||
|
RegistryWriteError = 0x00002ee3,
|
||||||
|
RegistryTypeError = 0x00002ee4,
|
||||||
|
RegistryDeleteError = 0x00002ee5,
|
||||||
|
RegistryEncryptError = 0x00002ee6,
|
||||||
|
RegistryDecryptError = 0x00002ee7,
|
||||||
|
RegistryKeySizeError = 0x00002ee8,
|
||||||
|
RegistryValueSizeError = 0x00002ee9,
|
||||||
|
RegistryNotFound = 0x00002eeb,
|
||||||
|
RegistryMalformedString = 0x00002eec,
|
||||||
|
|
||||||
|
InterfaceAlreadyConnected = 0x000032c8,
|
||||||
|
InterfaceNotReady = 0x000032c9,
|
||||||
|
InterfaceOptionKeyTooLarge = 0x000032ca,
|
||||||
|
InterfaceOptionValueTooLarge = 0x000032cb,
|
||||||
|
InterfaceOptionKeyInvalidUtf8String = 0x000032cc,
|
||||||
|
InterfaceOptionValueInvalidUtf8String = 0x000032cd,
|
||||||
|
|
||||||
|
HttpCouldntResolve = 0x000036b0,
|
||||||
|
HttpCouldntConnect = 0x000036b1,
|
||||||
|
HttpTimeout = 0x000036b2,
|
||||||
|
HttpFailed = 0x000036b3,
|
||||||
|
HttpMalformedUrl = 0x000036b4,
|
||||||
|
HttpDownloadAborted = 0x000036b5,
|
||||||
|
HttpCouldntWriteFile = 0x000036b6,
|
||||||
|
HttpTooManyRedirects = 0x000036b7,
|
||||||
|
HttpCouldntOpenFile = 0x000036b8,
|
||||||
|
HttpCouldntCreateFile = 0x000036b9,
|
||||||
|
HttpCouldntReadFile = 0x000036ba,
|
||||||
|
HttpCouldntRenameFile = 0x000036bb,
|
||||||
|
HttpCouldntCreateDirectory = 0x000036bc,
|
||||||
|
HttpCurlIsNotReady = 0x000036bd,
|
||||||
|
HttpCancelled = 0x000036be,
|
||||||
|
|
||||||
|
HttpFileNotFound = 0x00003844,
|
||||||
|
|
||||||
|
AccountMissingConfig = 0x00004650,
|
||||||
|
AccountDataNotFound = 0x00004651,
|
||||||
|
AccountAlreadySubscribed = 0x00004652,
|
||||||
|
AccountNotSubscribed = 0x00004653,
|
||||||
|
AccountFailedToParseTimezoneData = 0x00004654,
|
||||||
|
AccountLoadFailed = 0x00004655,
|
||||||
|
AccountLoadCancelled = 0x00004656,
|
||||||
|
AccountDatabaseInvalidateFailed = 0x00004657,
|
||||||
|
AccountCacheInvalidateFailed = 0x00004658,
|
||||||
|
AccountSubscriptionPending = 0x00004659,
|
||||||
|
AccountUnknownRegion = 0x0000465a,
|
||||||
|
AccountDataFailedToParse = 0x0000465b,
|
||||||
|
AccountUnderage = 0x0000465c,
|
||||||
|
AccountIdentityCheckPending = 0x0000465d,
|
||||||
|
AccountIdentityUnverified = 0x0000465e,
|
||||||
|
|
||||||
|
DatabaseBindingCountMismatch = 0x00004a38,
|
||||||
|
DatabaseBindingParseFail = 0x00004a39,
|
||||||
|
DatabaseResultsetColumnsMismatch = 0x00004a3a,
|
||||||
|
DatabaseDeadlock = 0x00004a3b,
|
||||||
|
DatabaseDuplicateKey = 0x00004a3c,
|
||||||
|
DatabaseCannotConnect = 0x00004a3d,
|
||||||
|
DatabaseStatementFailed = 0x00004a3e,
|
||||||
|
DatabaseTransactionNotStarted = 0x00004a3f,
|
||||||
|
DatabaseTransactionNotEnded = 0x00004a40,
|
||||||
|
DatabaseTransactionLeak = 0x00004a41,
|
||||||
|
DatabaseTransactionStateBad = 0x00004a42,
|
||||||
|
DatabaseServerGone = 0x00004a43,
|
||||||
|
DatabaseQueryTimeout = 0x00004a44,
|
||||||
|
DatabaseBindingNotNullable = 0x00004a9c,
|
||||||
|
DatabaseBindingInvalidInteger = 0x00004a9d,
|
||||||
|
DatabaseBindingInvalidFloat = 0x00004a9e,
|
||||||
|
DatabaseBindingInvalidTemporal = 0x00004a9f,
|
||||||
|
DatabaseBindingInvalidProtobuf = 0x00004aa0,
|
||||||
|
|
||||||
|
PartyInvalidPartyId = 0x00004e20,
|
||||||
|
PartyAlreadyInParty = 0x00004e21,
|
||||||
|
PartyNotInParty = 0x00004e22,
|
||||||
|
PartyInvitationUndeliverable = 0x00004e23,
|
||||||
|
PartyInvitationAlreadyExists = 0x00004e24,
|
||||||
|
PartyTooManyPartyInvitations = 0x00004e25,
|
||||||
|
PartyTooManyReceivedInvitations = 0x00004e26,
|
||||||
|
PartyNoSuchType = 0x00004e27,
|
||||||
|
|
||||||
|
GamesNoSuchFactory = 0x000055f0,
|
||||||
|
GamesNoSuchGame = 0x000055f1,
|
||||||
|
GamesNoSuchRequest = 0x000055f2,
|
||||||
|
GamesNoSuchPartyMember = 0x000055f3,
|
||||||
|
|
||||||
|
ResourcesOffline = 0x000059d8,
|
||||||
|
|
||||||
|
GameServerCreateGameRefused = 0x00005dc0,
|
||||||
|
GameServerAddPlayersRefused = 0x00005dc1,
|
||||||
|
GameServerRemovePlayersRefused = 0x00005dc2,
|
||||||
|
GameServerFinishGameRefused = 0x00005dc3,
|
||||||
|
GameServerNoSuchGame = 0x00005dc4,
|
||||||
|
GameServerNoSuchPlayer = 0x00005dc5,
|
||||||
|
GameServerCreateGameRefusedTransient = 0x00005df2,
|
||||||
|
GameServerAddPlayersRefusedTransient = 0x00005df3,
|
||||||
|
GameServerRemovePlayersRefusedTransient = 0x00005df4,
|
||||||
|
GameServerFinishGameRefusedTransient = 0x00005df5,
|
||||||
|
GameServerCreateGameRefusedBusy = 0x00005e24,
|
||||||
|
GameServerAddPlayersRefusedBusy = 0x00005e25,
|
||||||
|
GameServerRemovePlayersRefusedBusy = 0x00005e26,
|
||||||
|
GameServerFinishGameRefusedBusy = 0x00005e27,
|
||||||
|
|
||||||
|
GameMasterInvalidFactory = 0x000061a8,
|
||||||
|
GameMasterInvalidGame = 0x000061a9,
|
||||||
|
GameMasterGameFull = 0x000061aa,
|
||||||
|
GameMasterRegisterFailed = 0x000061ab,
|
||||||
|
GameMasterNoGameServer = 0x000061ac,
|
||||||
|
GameMasterNoUtilityServer = 0x000061ad,
|
||||||
|
GameMasterNoGameVersion = 0x000061ae,
|
||||||
|
GameMasterGameJoinFailed = 0x000061af,
|
||||||
|
GameMasterAlreadyRegistered = 0x000061b0,
|
||||||
|
GameMasterNoFactory = 0x000061b1,
|
||||||
|
GameMasterMultipleGameVersions = 0x000061b2,
|
||||||
|
GameMasterInvalidPlayer = 0x000061b3,
|
||||||
|
GameMasterInvalidGameRequest = 0x000061b4,
|
||||||
|
GameMasterInsufficientPrivileges = 0x000061b5,
|
||||||
|
GameMasterAlreadyInGame = 0x000061b6,
|
||||||
|
GameMasterInvalidGameServerResponse = 0x000061b7,
|
||||||
|
GameMasterGameAccountLookupFailed = 0x000061b8,
|
||||||
|
GameMasterGameEntryCancelled = 0x000061b9,
|
||||||
|
GameMasterGameEntryAbortedClientDropped = 0x000061ba,
|
||||||
|
GameMasterGameEntryAbortedByService = 0x000061bb,
|
||||||
|
GameMasterNoAvailableCapacity = 0x000061bc,
|
||||||
|
GameMasterInvalidTeamId = 0x000061bd,
|
||||||
|
GameMasterCreationInProgress = 0x000061be,
|
||||||
|
|
||||||
|
NotificationInvalidClientId = 0x00006590,
|
||||||
|
NotificationDuplicateName = 0x00006591,
|
||||||
|
NotificationNameNotFound = 0x00006592,
|
||||||
|
NotificationInvalidServer = 0x00006593,
|
||||||
|
NotificationQuotaExceeded = 0x00006594,
|
||||||
|
NotificationInvalidNotificationType = 0x00006595,
|
||||||
|
NotificationUndeliverable = 0x00006596,
|
||||||
|
NotificationUndeliverableTemporary = 0x00006597,
|
||||||
|
|
||||||
|
AchievementsNothingToUpdate = 0x00006d60,
|
||||||
|
AchievementsInvalidParams = 0x00006d61,
|
||||||
|
AchievementsNotRegistered = 0x00006d62,
|
||||||
|
AchievementsNotReady = 0x00006d63,
|
||||||
|
AchievementsFailedToParseStaticData = 0x00006d64,
|
||||||
|
AchievementsUnknownId = 0x00006d65,
|
||||||
|
AchievementsMissingSnapshot = 0x00006d66,
|
||||||
|
AchievementsAlreadyRegistered = 0x00006d67,
|
||||||
|
AchievementsTooManyRegistrations = 0x00006d68,
|
||||||
|
AchievementsAlreadyInProgress = 0x00006d69,
|
||||||
|
AchievementsTemporaryOutage = 0x00006d6a,
|
||||||
|
AchievementsInvalidProgramid = 0x00006d6b,
|
||||||
|
AchievementsMissingRecord = 0x00006d6c,
|
||||||
|
AchievementsRegistrationPending = 0x00006d6d,
|
||||||
|
AchievementsEntityIdNotFound = 0x00006d6e,
|
||||||
|
AchievementsAchievementIdNotFound = 0x00006d6f,
|
||||||
|
AchievementsCriteriaIdNotFound = 0x00006d70,
|
||||||
|
AchievementsStaticDataMismatch = 0x00006d71,
|
||||||
|
AchievementsWrongThread = 0x00006d72,
|
||||||
|
AchievementsCallbackIsNull = 0x00006d73,
|
||||||
|
AchievementsAutoRegisterPending = 0x00006d74,
|
||||||
|
AchievementsNotInitialized = 0x00006d75,
|
||||||
|
AchievementsAchievementIdAlreadyExists = 0x00006d76,
|
||||||
|
AchievementsFailedToDownloadStaticData = 0x00006d77,
|
||||||
|
AchievementsStaticDataNotFound = 0x00006d78,
|
||||||
|
|
||||||
|
GameUtilityServerVariableRequestRefused = 0x000084d1,
|
||||||
|
GameUtilityServerWrongNumberOfVariablesReturned = 0x000084d2,
|
||||||
|
GameUtilityServerClientRequestRefused = 0x000084d3,
|
||||||
|
GameUtilityServerPresenceChannelCreatedRefused = 0x000084d4,
|
||||||
|
GameUtilityServerVariableRequestRefusedTransient = 0x00008502,
|
||||||
|
GameUtilityServerClientRequestRefusedTransient = 0x00008503,
|
||||||
|
GameUtilityServerPresenceChannelCreatedRefusedTransient = 0x00008504,
|
||||||
|
GameUtilityServerServerRequestRefusedTransient = 0x00008505,
|
||||||
|
GameUtilityServerVariableRequestRefusedBusy = 0x00008534,
|
||||||
|
GameUtilityServerClientRequestRefusedBusy = 0x00008535,
|
||||||
|
GameUtilityServerPresenceChannelCreatedRefusedBusy = 0x00008536,
|
||||||
|
GameUtilityServerServerRequestRefusedBusy = 0x00008537,
|
||||||
|
GameUtilityServerNoServer = 0x00008598,
|
||||||
|
|
||||||
|
IdentityInsufficientData = 0x0000a028,
|
||||||
|
IdentityTooManyResults = 0x0000a029,
|
||||||
|
IdentityBadId = 0x0000a02a,
|
||||||
|
IdentityNoAccountBlob = 0x0000a02b,
|
||||||
|
|
||||||
|
RiskChallengeAction = 0x0000a410,
|
||||||
|
RiskDelayAction = 0x0000a411,
|
||||||
|
RiskThrottleAction = 0x0000a412,
|
||||||
|
RiskAccountLocked = 0x0000a413,
|
||||||
|
RiskCsDenied = 0x0000a414,
|
||||||
|
RiskDisconnectAccount = 0x0000a415,
|
||||||
|
RiskCheckSkipped = 0x0000a416,
|
||||||
|
|
||||||
|
ReportUnavailable = 0x0000afc8,
|
||||||
|
ReportTooLarge = 0x0000afc9,
|
||||||
|
ReportUnknownType = 0x0000afca,
|
||||||
|
ReportAttributeInvalid = 0x0000afcb,
|
||||||
|
ReportAttributeQuotaExceeded = 0x0000afcc,
|
||||||
|
ReportUnconfirmed = 0x0000afcd,
|
||||||
|
ReportNotConnected = 0x0000afce,
|
||||||
|
ReportRejected = 0x0000afcf,
|
||||||
|
ReportTooManyRequests = 0x0000afd0,
|
||||||
|
|
||||||
|
AccountAlreadyRegisterd = 0x0000bb80,
|
||||||
|
AccountNotRegistered = 0x0000bb81,
|
||||||
|
AccountRegistrationPending = 0x0000bb82,
|
||||||
|
|
||||||
|
MemcachedClientNoError = 0x00010000,
|
||||||
|
MemcachedClientKeyNotFound = 0x00010001,
|
||||||
|
MemcachedKeyExists = 0x00010002,
|
||||||
|
MemcachedValueToLarge = 0x00010003,
|
||||||
|
MemcachedInvalidArgs = 0x00010004,
|
||||||
|
MemcachedItemNotStored = 0x00010005,
|
||||||
|
MemcachedNonNumericValue = 0x00010006,
|
||||||
|
MemcachedWrongServer = 0x00010007,
|
||||||
|
MemcachedAuthenticationError = 0x00010008,
|
||||||
|
MemcachedAuthenticationContinue = 0x00010009,
|
||||||
|
MemcachedUnknownCommand = 0x0001000a,
|
||||||
|
MemcachedOutOfMemory = 0x0001000b,
|
||||||
|
MemcachedNotSupported = 0x0001000c,
|
||||||
|
MemcachedInternalError = 0x0001000d,
|
||||||
|
MemcachedTemporaryFailure = 0x0001000e,
|
||||||
|
|
||||||
|
MemcachedClientAlreadyConnected = 0x000186a0,
|
||||||
|
MemcachedClientBadConfig = 0x000186a1,
|
||||||
|
MemcachedClientNotConnected = 0x000186a2,
|
||||||
|
MemcachedClientTimeout = 0x000186a3,
|
||||||
|
MemcachedClientAborted = 0x000186a4,
|
||||||
|
|
||||||
|
UtilServerFailedToSerialize = 0x80000064,
|
||||||
|
UtilServerDisconnectedFromBattlenet = 0x80000065,
|
||||||
|
UtilServerTimedOut = 0x80000066,
|
||||||
|
UtilServerNoMeteringData = 0x80000067,
|
||||||
|
UtilServerFailPermissionCheck = 0x80000068,
|
||||||
|
UtilServerUnknownRealm = 0x80000069,
|
||||||
|
UtilServerMissingSessionKey = 0x8000006a,
|
||||||
|
UtilServerMissingVirtualRealm = 0x8000006b,
|
||||||
|
UtilServerInvalidSessionKey = 0x8000006c,
|
||||||
|
UtilServerMissingRealmList = 0x8000006d,
|
||||||
|
UtilServerInvalidIdentityArgs = 0x8000006e,
|
||||||
|
UtilServerSessionObjectMissing = 0x8000006f,
|
||||||
|
UtilServerInvalidBnetSession = 0x80000070,
|
||||||
|
UtilServerInvalidVirtualRealm = 0x80000071,
|
||||||
|
UtilServerInvalidClientAddress = 0x80000072,
|
||||||
|
UtilServerFailedToSerializeResponse = 0x80000073,
|
||||||
|
UtilServerUnknownRequest = 0x80000074,
|
||||||
|
UtilServerUnableToGenerateJoinTicket = 0x80000075,
|
||||||
|
UtilServerUnableToGenerateRealmListTicket = 0x80000076,
|
||||||
|
UtilServerAccountDenied = 0x80000077,
|
||||||
|
UtilServerInvalidWowAccount = 0x80000078,
|
||||||
|
UtilServerUnableToStoreSession = 0x80000079,
|
||||||
|
UtilServerSessionAlreadyCreated = 0x8000007a,
|
||||||
|
|
||||||
|
UserServerFailedToSerialize = 0x800000c8,
|
||||||
|
UserServerDisconnectedFromUtil = 0x800000c9,
|
||||||
|
UserServerSessionDuplicate = 0x800000ca,
|
||||||
|
UserServerFailedToDisableBilling = 0x800000cb,
|
||||||
|
UserServerPlayerDisconnected = 0x800000cc,
|
||||||
|
UserServerFailedToParseAccountState = 0x800000cd,
|
||||||
|
UserServerAccountLoadCancelled = 0x800000ce,
|
||||||
|
UserServerBadPlatform = 0x800000cf,
|
||||||
|
UserServerBadVirtualRealm = 0x800000d0,
|
||||||
|
UserServerLocaleRestricted = 0x800000d1,
|
||||||
|
UserServerMissingPropass = 0x800000d2,
|
||||||
|
UserServerBadWowAccount = 0x800000d3,
|
||||||
|
UserServerBadBnetAccount = 0x800000d4,
|
||||||
|
UserServerFailedToParseGameAccountState = 0x800000d5,
|
||||||
|
UserServerFailedToParseGameTimeRemaining = 0x800000d6,
|
||||||
|
UserServerFailedToParseGameSessionInfo = 0x800000d7,
|
||||||
|
UserServerAccountStatePoorlyFormed = 0x800000d8,
|
||||||
|
UserServerGameAccountStatePoorlyFormed = 0x800000d9,
|
||||||
|
UserServerGameTimeRemainingPoorlyFormed = 0x800000da,
|
||||||
|
UserServerGameSessionInfoPoorlyFormed = 0x800000db,
|
||||||
|
UserServerBadSessionTrackerState = 0x800000dc,
|
||||||
|
UserServerFailedToParseCaisInfo = 0x800000dd,
|
||||||
|
UserServerGameSessionDisconnected = 0x800000de,
|
||||||
|
UserServerVersionMismatch = 0x800000df,
|
||||||
|
UserServerAccountSuspended = 0x800000e0,
|
||||||
|
UserServerNotPermittedOnRealm = 0x800000e1,
|
||||||
|
UserServerLoginFailedConnect = 0x800000e2,
|
||||||
|
|
||||||
|
WowServicesTimedOut = 0x8000012c,
|
||||||
|
WowServicesInvalidRealmListTicket = 0x8000012d,
|
||||||
|
WowServicesInvalidJoinTicket = 0x8000012e,
|
||||||
|
WowServicesInvalidServerAddresses = 0x8000012f,
|
||||||
|
WowServicesInvalidSecretBlob = 0x80000130,
|
||||||
|
WowServicesNoRealmJoinIpFound = 0x80000131,
|
||||||
|
WowServicesDeniedRealmListTicket = 0x80000132,
|
||||||
|
WowServicesMissingGameAccount = 0x80000133,
|
||||||
|
WowServicesLogonInvalidAuthToken = 0x80000134,
|
||||||
|
WowServicesNoAvailableRealms = 0x80000135,
|
||||||
|
WowServicesFailedToParseDispatch = 0x80000136,
|
||||||
|
WowServicesMissingMeteringFile = 0x80000137,
|
||||||
|
WowServicesLoginInvalidContentType = 0x80000138,
|
||||||
|
WowServicesLoginUnableToDecode = 0x80000139,
|
||||||
|
WowServicesLoginPostError = 0x8000013a,
|
||||||
|
WowServicesAuthenticatorParseFailed = 0x8000013b,
|
||||||
|
WowServicesLegalParseFailed = 0x8000013c,
|
||||||
|
WowServicesLoginAuthenticationParseFailed = 0x8000013d,
|
||||||
|
WowSerivcesUserMustAcceptLegal = 0x8000013e,
|
||||||
|
WowServicesDisconnected = 0x8000013f,
|
||||||
|
WowServicesNoHandlerForDispatch = 0x80000140,
|
||||||
|
WowServicesPreDispatchHandlerFailed = 0x80000141,
|
||||||
|
WowServicesCriticalStreamingError = 0x80000142,
|
||||||
|
WowServicesWorldLoadError = 0x80000143,
|
||||||
|
WowServicesLoginFailed = 0x80000144,
|
||||||
|
WowServicesLoginFailedOnChallenge = 0x80000145,
|
||||||
|
WowServicesNoPrepaidTime = 0x80000146,
|
||||||
|
WowServicesSubscriptionExpired = 0x80000147,
|
||||||
|
WowServicesCantConnect = 0x80000148,
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum RealmFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
VersionMismatch = 0x01,
|
||||||
|
Offline = 0x02,
|
||||||
|
SpecifyBuild = 0x04,
|
||||||
|
Unk1 = 0x08,
|
||||||
|
Unk2 = 0x10,
|
||||||
|
Recommended = 0x20,
|
||||||
|
New = 0x40,
|
||||||
|
Full = 0x80
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum RealmType
|
||||||
|
{
|
||||||
|
Normal = 0,
|
||||||
|
PVP = 1,
|
||||||
|
Normal2 = 4,
|
||||||
|
RP = 6,
|
||||||
|
RPPVP = 8,
|
||||||
|
|
||||||
|
MaxType = 14,
|
||||||
|
|
||||||
|
FFAPVP = 16 // custom, free for all pvp mode like arena PvP in all zones except rest activated places and sanctuaries
|
||||||
|
// replaced by REALM_PVP in realm list
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum RealmZones
|
||||||
|
{
|
||||||
|
Unknown = 0, // Any Language
|
||||||
|
Development = 1, // Any Language
|
||||||
|
UnitedStates = 2, // Extended-Latin
|
||||||
|
Oceanic = 3, // Extended-Latin
|
||||||
|
LatinAmerica = 4, // Extended-Latin
|
||||||
|
Tournament5 = 5, // Basic-Latin At Create, Any At Login
|
||||||
|
Korea = 6, // East-Asian
|
||||||
|
Tournament7 = 7, // Basic-Latin At Create, Any At Login
|
||||||
|
English = 8, // Extended-Latin
|
||||||
|
German = 9, // Extended-Latin
|
||||||
|
French = 10, // Extended-Latin
|
||||||
|
Spanish = 11, // Extended-Latin
|
||||||
|
Russian = 12, // Cyrillic
|
||||||
|
Tournament13 = 13, // Basic-Latin At Create, Any At Login
|
||||||
|
Taiwan = 14, // East-Asian
|
||||||
|
Tournament15 = 15, // Basic-Latin At Create, Any At Login
|
||||||
|
China = 16, // East-Asian
|
||||||
|
Cn1 = 17, // Basic-Latin At Create, Any At Login
|
||||||
|
Cn2 = 18, // Basic-Latin At Create, Any At Login
|
||||||
|
Cn3 = 19, // Basic-Latin At Create, Any At Login
|
||||||
|
Cn4 = 20, // Basic-Latin At Create, Any At Login
|
||||||
|
Cn5 = 21, // Basic-Latin At Create, Any At Login
|
||||||
|
Cn6 = 22, // Basic-Latin At Create, Any At Login
|
||||||
|
Cn7 = 23, // Basic-Latin At Create, Any At Login
|
||||||
|
Cn8 = 24, // Basic-Latin At Create, Any At Login
|
||||||
|
Tournament25 = 25, // Basic-Latin At Create, Any At Login
|
||||||
|
TestServer = 26, // Any Language
|
||||||
|
Tournament27 = 27, // Basic-Latin At Create, Any At Login
|
||||||
|
QaServer = 28, // Any Language
|
||||||
|
Cn9 = 29, // Basic-Latin At Create, Any At Login
|
||||||
|
TestServer2 = 30, // Any Language
|
||||||
|
Cn10 = 31, // Basic-Latin At Create, Any At Login
|
||||||
|
Ctc = 32,
|
||||||
|
Cnc = 33,
|
||||||
|
Cn14 = 34, // Basic-Latin At Create, Any At Login
|
||||||
|
Cn269 = 35, // Basic-Latin At Create, Any At Login
|
||||||
|
Cn37 = 36, // Basic-Latin At Create, Any At Login
|
||||||
|
Cn58 = 37 // Basic-Latin At Create, Any At Login
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public struct BattlefieldSounds
|
||||||
|
{
|
||||||
|
public const uint HordeWins = 8454;
|
||||||
|
public const uint AllianceWins = 8455;
|
||||||
|
public const uint Start = 3439;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BattleFieldObjectiveStates
|
||||||
|
{
|
||||||
|
Neutral = 0,
|
||||||
|
Alliance,
|
||||||
|
Horde,
|
||||||
|
NeutralAllianceChallenge,
|
||||||
|
NeutralHordeChallenge,
|
||||||
|
AllianceHordeChallenge,
|
||||||
|
HordeAllianceChallenge
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BFLeaveReason
|
||||||
|
{
|
||||||
|
Close = 1,
|
||||||
|
//BF_LEAVE_REASON_UNK1 = 2, (not used)
|
||||||
|
//BF_LEAVE_REASON_UNK2 = 4, (not used)
|
||||||
|
Exited = 8,
|
||||||
|
LowLevel = 10,
|
||||||
|
NotWhileInRaid = 15,
|
||||||
|
Deserter = 16
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BattlefieldState
|
||||||
|
{
|
||||||
|
Inactive = 0,
|
||||||
|
Warnup = 1,
|
||||||
|
InProgress = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct BattlefieldIds
|
||||||
|
{
|
||||||
|
public const uint WG = 1; // Wintergrasp battle
|
||||||
|
public const uint TB = 21; // Tol Barad
|
||||||
|
public const uint Ashran = 24; // Ashran
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,386 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public struct BattlegroundConst
|
||||||
|
{
|
||||||
|
//Time Intervals
|
||||||
|
public const uint CheckPlayerPositionInverval = 1000; // Ms
|
||||||
|
public const uint ResurrectionInterval = 30000; // Ms
|
||||||
|
//RemindInterval = 10000, // Ms
|
||||||
|
public const uint InvitationRemindTime = 20000; // Ms
|
||||||
|
public const uint InviteAcceptWaitTime = 90000; // Ms
|
||||||
|
public const uint AutocloseBattleground = 120000; // Ms
|
||||||
|
public const uint MaxOfflineTime = 300; // Secs
|
||||||
|
public const uint RespawnOneDay = 86400; // Secs
|
||||||
|
public const uint RespawnImmediately = 0; // Secs
|
||||||
|
public const uint BuffRespawnTime = 180; // Secs
|
||||||
|
public const uint BattlegroundCountdownMax = 120; // Secs
|
||||||
|
public const uint ArenaCountdownMax = 60; // Secs
|
||||||
|
public const uint PlayerPositionUpdateInterval = 5; // secs
|
||||||
|
|
||||||
|
//EventIds
|
||||||
|
public const int EventIdFirst = 0;
|
||||||
|
public const int EventIdSecond = 1;
|
||||||
|
public const int EventIdThird = 2;
|
||||||
|
public const int EventIdFourth = 3;
|
||||||
|
public const int EventIdCount = 4;
|
||||||
|
|
||||||
|
//Quests
|
||||||
|
public const uint WsQuestReward = 43483;
|
||||||
|
public const uint AbQuestReward = 43484;
|
||||||
|
public const uint AvQuestReward = 43475;
|
||||||
|
public const uint AvQuestKilledBoss = 23658;
|
||||||
|
public const uint EyQuestReward = 43477;
|
||||||
|
public const uint SaQuestReward = 61213;
|
||||||
|
public const uint AbQuestReward4Bases = 24061;
|
||||||
|
public const uint AbQuestReward5Bases = 24064;
|
||||||
|
|
||||||
|
//BuffObjects
|
||||||
|
public const uint SpeedBuff = 179871;
|
||||||
|
public const uint RegenBuff = 179904;
|
||||||
|
public const uint BerserkerBuff = 179905;
|
||||||
|
|
||||||
|
//QueueGroupTypes
|
||||||
|
public const uint BgQueuePremadeAlliance = 0;
|
||||||
|
public const uint BgQueuePremadeHorde = 1;
|
||||||
|
public const uint BgQueueNormalAlliance = 2;
|
||||||
|
public const uint BgQueueNormalHorde = 3;
|
||||||
|
public const int BgQueueTypesCount = 4;
|
||||||
|
|
||||||
|
//PlayerPosition
|
||||||
|
public const sbyte PlayerPositionIconNone = 0;
|
||||||
|
public const sbyte PlayerPositionIconHordeFlag = 1;
|
||||||
|
public const sbyte PlayerPositionIconAllianceFlag = 2;
|
||||||
|
|
||||||
|
public const sbyte PlayerPositionArenaSlotNone = 1;
|
||||||
|
public const sbyte PlayerPositionArenaSlot1 = 2;
|
||||||
|
public const sbyte PlayerPositionArenaSlot2 = 3;
|
||||||
|
public const sbyte PlayerPositionArenaSlot3 = 4;
|
||||||
|
public const sbyte PlayerPositionArenaSlot4 = 5;
|
||||||
|
public const sbyte PlayerPositionArenaSlot5 = 6;
|
||||||
|
|
||||||
|
//Spells
|
||||||
|
public const uint SpellWaitingForResurrect = 2584; // Waiting To Resurrect
|
||||||
|
public const uint SpellSpiritHealChannel = 22011; // Spirit Heal Channel
|
||||||
|
public const uint SpellSpiritHeal = 22012; // Spirit Heal
|
||||||
|
public const uint SpellResurrectionVisual = 24171; // Resurrection Impact Visual
|
||||||
|
public const uint SpellArenaPreparation = 32727; // Use This One, 32728 Not Correct
|
||||||
|
public const uint SpellPreparation = 44521; // Preparation
|
||||||
|
public const uint SpellSpiritHealMana = 44535; // Spirit Heal
|
||||||
|
public const uint SpellRecentlyDroppedFlag = 42792; // Recently Dropped Flag
|
||||||
|
public const uint SpellAuraPlayerInactive = 43681; // Inactive
|
||||||
|
public const uint SpellHonorableDefender25y = 68652; // +50% Honor When Standing At A Capture Point That You Control, 25yards Radius (Added In 3.2)
|
||||||
|
public const uint SpellHonorableDefender60y = 66157; // +50% Honor When Standing At A Capture Point That You Control, 60yards Radius (Added In 3.2), Probably For 40+ Player Battlegrounds
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BattlegroundEventFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
Event1 = 0x01,
|
||||||
|
Event2 = 0x02,
|
||||||
|
Event3 = 0x04,
|
||||||
|
Event4 = 0x08
|
||||||
|
}
|
||||||
|
|
||||||
|
// indexes of BattlemasterList.dbc
|
||||||
|
public enum BattlegroundTypeId
|
||||||
|
{
|
||||||
|
None = 0, // None
|
||||||
|
AV = 1, // Alterac Valley
|
||||||
|
WS = 2, // Warsong Gulch
|
||||||
|
AB = 3, // Arathi Basin
|
||||||
|
NA = 4, // Nagrand Arena
|
||||||
|
BE = 5, // Blade'S Edge Arena
|
||||||
|
AA = 6, // All Arenas
|
||||||
|
EY = 7, // Eye Of The Storm
|
||||||
|
RL = 8, // Ruins Of Lordaernon
|
||||||
|
SA = 9, // Strand Of The Ancients
|
||||||
|
DS = 10, // Dalaran Sewers
|
||||||
|
RV = 11, // The Ring Of Valor
|
||||||
|
IC = 30, // Isle Of Conquest
|
||||||
|
RB = 32, // Random Battleground
|
||||||
|
Rated10Vs10 = 100, // Rated Battleground 10 Vs 10
|
||||||
|
Rated15Vs15 = 101, // Rated Battleground 15 Vs 15
|
||||||
|
Rated25Vs25 = 102, // Rated Battleground 25 Vs 25
|
||||||
|
TP = 108, // Twin Peaks
|
||||||
|
BFG = 120, // Battle For Gilneas
|
||||||
|
// 656 = "Rated Eye Of The Storm"
|
||||||
|
Tk = 699, // Temple Of Kotmogu
|
||||||
|
// 706 = "Ctf3"
|
||||||
|
SM = 708, // Silvershard Mines
|
||||||
|
TVA = 719, // Tol'Viron Arena
|
||||||
|
DG = 754, // Deepwind Gorge
|
||||||
|
TTP = 757, // The Tiger'S Peak
|
||||||
|
SSvsTM = 789, // Southshore Vs. Tarren Mill
|
||||||
|
SmallD = 803, // Small Battleground D
|
||||||
|
BRH = 808, // Black Rook Hold Arena
|
||||||
|
// 809 = "New Nagrand Arena (Legion)"
|
||||||
|
AF = 816, // Ashamane'S Fall
|
||||||
|
// 844 = "New Blade'S Edge Arena (Legion)"
|
||||||
|
Max = 845
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BattlegroundQueueTypeId
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
AV = 1,
|
||||||
|
WS = 2,
|
||||||
|
AB = 3,
|
||||||
|
EY = 4,
|
||||||
|
SA = 5,
|
||||||
|
IC = 6,
|
||||||
|
TP = 7,
|
||||||
|
BFG = 8,
|
||||||
|
RB = 9,
|
||||||
|
Arena2v2 = 10,
|
||||||
|
Arena3v3 = 11,
|
||||||
|
Arena5v5 = 12,
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BattlegroundQueueInvitationType
|
||||||
|
{
|
||||||
|
NoBalance = 0, // no balance: N+M vs N players
|
||||||
|
Balanced = 1, // teams balanced: N+1 vs N players
|
||||||
|
Even = 2 // teams even: N vs N players
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BattlegroundCriteriaId
|
||||||
|
{
|
||||||
|
ResilientVictory,
|
||||||
|
SaveTheDay,
|
||||||
|
EverythingCounts,
|
||||||
|
AvPerfection,
|
||||||
|
DefenseOfTheAncients,
|
||||||
|
NotEvenAScratch,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BattlegroundSounds
|
||||||
|
{
|
||||||
|
HordeWins = 8454,
|
||||||
|
AllianceWins = 8455,
|
||||||
|
BgStart = 3439,
|
||||||
|
BgStartL70etc = 11803
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BattlegroundTeamId
|
||||||
|
{
|
||||||
|
Horde = 0, // Battleground: Horde, Arena: Green
|
||||||
|
Alliance = 1, // Battleground: Alliance, Arena: Gold
|
||||||
|
Neutral = 2 // Battleground: Neutral, Arena: None
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BattlegroundMarks
|
||||||
|
{
|
||||||
|
SpellWsMarkLoser = 24950,
|
||||||
|
SpellWsMarkWinner = 24951,
|
||||||
|
SpellAbMarkLoser = 24952,
|
||||||
|
SpellAbMarkWinner = 24953,
|
||||||
|
SpellAvMarkLoser = 24954,
|
||||||
|
SpellAvMarkWinner = 24955,
|
||||||
|
SpellSaMarkWinner = 61160,
|
||||||
|
SpellSaMarkLoser = 61159,
|
||||||
|
ItemAvMarkOfHonor = 20560,
|
||||||
|
ItemWsMarkOfHonor = 20558,
|
||||||
|
ItemAbMarkOfHonor = 20559,
|
||||||
|
ItemEyMarkOfHonor = 29024,
|
||||||
|
ItemSaMarkOfHonor = 42425
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BattlegroundMarksCount
|
||||||
|
{
|
||||||
|
WinnterCount = 3,
|
||||||
|
LoserCount = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BattlegroundCreatures
|
||||||
|
{
|
||||||
|
A_SpiritGuide = 13116, // alliance
|
||||||
|
H_SpiritGuide = 13117 // horde
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BattlegroundStartTimeIntervals
|
||||||
|
{
|
||||||
|
Delay2m = 120000, // Ms (2 Minutes)
|
||||||
|
Delay1m = 60000, // Ms (1 Minute)
|
||||||
|
Delay30s = 30000, // Ms (30 Seconds)
|
||||||
|
Delay15s = 15000, // Ms (15 Seconds) Used Only In Arena
|
||||||
|
None = 0 // Ms
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BattlegroundStatus
|
||||||
|
{
|
||||||
|
None = 0, // first status, should mean bg is not instance
|
||||||
|
WaitQueue = 1, // means bg is empty and waiting for queue
|
||||||
|
WaitJoin = 2, // this means, that BG has already started and it is waiting for more players
|
||||||
|
InProgress = 3, // means bg is running
|
||||||
|
WaitLeave = 4 // means some faction has won BG and it is ending
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BGHonorMode
|
||||||
|
{
|
||||||
|
Normal = 0,
|
||||||
|
Holiday,
|
||||||
|
HonorModeNum
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GroupJoinBattlegroundResult
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Deserters = 2, // You Cannot Join The BattlegroundYet Because You Or One Of Your Party Members Is Flagged As A Deserter.
|
||||||
|
ArenaTeamPartySize = 3, // Incorrect Party Size For This Arena.
|
||||||
|
TooManyQueues = 4, // You Can Only Be Queued For 2 Battles At Once
|
||||||
|
CannotQueueForRated = 5, // You Cannot Queue For A Rated Match While Queued For Other Battles
|
||||||
|
BattledgroundQueuedForRated = 6, // You Cannot Queue For Another Battle While Queued For A Rated Arena Match
|
||||||
|
TeamLeftQueue = 7, // Your Team Has Left The Arena Queue
|
||||||
|
NotInBattleground= 8, // You Can'T Do That In A Battleground.
|
||||||
|
JoinXpGain = 9, // Wtf, Doesn'T Exist In Client...
|
||||||
|
JoinRangeIndex = 10, // Cannot Join The Queue Unless All Members Of Your Party Are In The Same BattlegroundLevel Range.
|
||||||
|
JoinTimedOut = 11, // %S Was Unavailable To Join The Queue. (Uint64 Guid Exist In Client Cache)
|
||||||
|
//JoinTimedOut = 12, // Same As 11
|
||||||
|
//TeamLeftQueue = 13, // Same As 7
|
||||||
|
LfgCantUseBattleground= 14, // You Cannot Queue For A BattlegroundOr Arena While Using The Dungeon System.
|
||||||
|
InRandomBg = 15, // Can'T Do That While In A Random BattlegroundQueue.
|
||||||
|
InNonRandomBg = 16, // Can'T Queue For Random BattlegroundWhile In Another BattlegroundQueue.
|
||||||
|
BgDeveloperOnly = 17,
|
||||||
|
InvitationDeclined = 18,
|
||||||
|
MeetingStoneNotFound = 19,
|
||||||
|
WargameRequestFailure = 20,
|
||||||
|
BattlefieldTeamPartySize = 22,
|
||||||
|
NotOnTournamentRealm = 23,
|
||||||
|
PlayersFromDifferentRealms = 24,
|
||||||
|
RemoveFromPvpQueueGrantLevel = 33,
|
||||||
|
RemoveFromPvpQueueFactionChange = 34,
|
||||||
|
JoinFailed = 35,
|
||||||
|
DupeQueue = 43,
|
||||||
|
JoinNoValidSpecForRole = 44,
|
||||||
|
JoinRespec = 45,
|
||||||
|
AlreadyUsingLFGList = 46,
|
||||||
|
JoinMustCompleteQuest = 47
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ScoreType
|
||||||
|
{
|
||||||
|
KillingBlows = 1,
|
||||||
|
Deaths = 2,
|
||||||
|
HonorableKills = 3,
|
||||||
|
BonusHonor = 4,
|
||||||
|
DamageDone = 5,
|
||||||
|
HealingDone = 6,
|
||||||
|
|
||||||
|
// Ws And Ey
|
||||||
|
FlagCaptures = 7,
|
||||||
|
FlagReturns = 8,
|
||||||
|
|
||||||
|
// Ab And Ic
|
||||||
|
BasesAssaulted = 9,
|
||||||
|
BasesDefended = 10,
|
||||||
|
|
||||||
|
// Av
|
||||||
|
GraveyardsAssaulted = 11,
|
||||||
|
GraveyardsDefended = 12,
|
||||||
|
TowersAssaulted = 13,
|
||||||
|
TowersDefended = 14,
|
||||||
|
MinesCaptured = 15,
|
||||||
|
|
||||||
|
// Sota
|
||||||
|
DestroyedDemolisher = 16,
|
||||||
|
DestroyedWall = 17
|
||||||
|
}
|
||||||
|
|
||||||
|
//Arenas
|
||||||
|
public struct ArenaSpellIds
|
||||||
|
{
|
||||||
|
public const uint AllianceGoldFlag = 32724;
|
||||||
|
public const uint AllianceGreenFlag = 32725;
|
||||||
|
public const uint HordeGoldFlag = 35774;
|
||||||
|
public const uint HordeGreenFlag = 35775;
|
||||||
|
public const uint LastManStanding = 26549; // Arena Achievement Related
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ArenaTeamCommandTypes
|
||||||
|
{
|
||||||
|
Create_S = 0x00,
|
||||||
|
Invite_SS = 0x01,
|
||||||
|
Quit_S = 0x03,
|
||||||
|
Founder_S = 0x0e
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ArenaTeamCommandErrors
|
||||||
|
{
|
||||||
|
ArenaTeamCreated = 0x00,
|
||||||
|
ArenaTeamInternal = 0x01,
|
||||||
|
AlreadyInArenaTeam = 0x02,
|
||||||
|
AlreadyInArenaTeamS = 0x03,
|
||||||
|
InvitedToArenaTeam = 0x04,
|
||||||
|
AlreadyInvitedToArenaTeamS = 0x05,
|
||||||
|
ArenaTeamNameInvalid = 0x06,
|
||||||
|
ArenaTeamNameExistsS = 0x07,
|
||||||
|
ArenaTeamLeaderLeaveS = 0x08,
|
||||||
|
ArenaTeamPermissions = 0x08,
|
||||||
|
ArenaTeamPlayerNotInTeam = 0x09,
|
||||||
|
ArenaTeamPlayerNotInTeamSs = 0x0a,
|
||||||
|
ArenaTeamPlayerNotFoundS = 0x0b,
|
||||||
|
ArenaTeamNotAllied = 0x0c,
|
||||||
|
ArenaTeamIgnoringYouS = 0x13,
|
||||||
|
ArenaTeamTargetTooLowS = 0x15,
|
||||||
|
ArenaTeamTargetTooHighS = 0x16,
|
||||||
|
ArenaTeamTooManyMembersS = 0x17,
|
||||||
|
ArenaTeamNotFound = 0x1b,
|
||||||
|
ArenaTeamsLocked = 0x1e,
|
||||||
|
ArenaTeamTooManyCreate = 0x21,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ArenaTeamEvents
|
||||||
|
{
|
||||||
|
JoinSs = 3, // Player Name + Arena Team Name
|
||||||
|
LeaveSs = 4, // Player Name + Arena Team Name
|
||||||
|
RemoveSss = 5, // Player Name + Arena Team Name + Captain Name
|
||||||
|
LeaderIsSs = 6, // Player Name + Arena Team Name
|
||||||
|
LeaderChangedSss = 7, // Old Captain + New Captain + Arena Team Name
|
||||||
|
DisbandedS = 8 // Captain Name + Arena Team Name
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ArenaTypes
|
||||||
|
{
|
||||||
|
BG = 0,
|
||||||
|
Team2v2 = 2,
|
||||||
|
Team3v3 = 3,
|
||||||
|
Team5v5 = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ArenaErrorType
|
||||||
|
{
|
||||||
|
NoTeam = 0,
|
||||||
|
ExpiredCAIS = 1,
|
||||||
|
CantUseBattleground = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ArenaTeamInfoType
|
||||||
|
{
|
||||||
|
Id = 0,
|
||||||
|
Type = 1, // new in 3.2 - team type?
|
||||||
|
Member = 2, // 0 - captain, 1 - member
|
||||||
|
GamesWeek = 3,
|
||||||
|
GamesSeason = 4,
|
||||||
|
WinsSeason = 5,
|
||||||
|
PersonalRating = 6,
|
||||||
|
End = 7
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum FlagsControlType
|
||||||
|
{
|
||||||
|
Apply = 1,
|
||||||
|
Remove = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BattlePetError
|
||||||
|
{
|
||||||
|
CantHaveMorePetsOfThatType = 3,
|
||||||
|
CantHaveMorePets = 4,
|
||||||
|
TooHighLevelToUncage = 7,
|
||||||
|
|
||||||
|
// TODO: find correct values if possible and needed (also wrong order)
|
||||||
|
DuplicateConvertedPet,
|
||||||
|
NeedToUnlock,
|
||||||
|
BadParam,
|
||||||
|
LockedPetAlreadyExists,
|
||||||
|
Ok,
|
||||||
|
Uncapturable,
|
||||||
|
CantInvalidCharacterGuid
|
||||||
|
}
|
||||||
|
|
||||||
|
// taken from BattlePetState.db2 - it seems to store some initial values for battle pets
|
||||||
|
// there are only values used in BattlePetSpeciesState.db2 and BattlePetBreedState.db2
|
||||||
|
// TODO: expand this enum if needed
|
||||||
|
public enum BattlePetState
|
||||||
|
{
|
||||||
|
MaxHealthBonus = 2,
|
||||||
|
InternalInitialLevel = 17,
|
||||||
|
StatPower = 18,
|
||||||
|
StatStamina = 19,
|
||||||
|
StatSpeed = 20,
|
||||||
|
ModDamageDealtPercent = 23,
|
||||||
|
Gender = 78, // 1 - Male, 2 - Female
|
||||||
|
CosmeticWaterBubbled = 85,
|
||||||
|
SpecialIsCockroach = 93,
|
||||||
|
CosmeticFlyTier = 128,
|
||||||
|
CosmeticBigglesworth = 144,
|
||||||
|
PassiveElite = 153,
|
||||||
|
PassiveBoss = 162,
|
||||||
|
CosmeticTreasureGoblin = 176,
|
||||||
|
// These Are Not In Battlepetstate.Db2 But Are Used In Battlepetspeciesstate.Db2
|
||||||
|
StartWithBuff = 183,
|
||||||
|
StartWithBuff2 = 184,
|
||||||
|
//
|
||||||
|
CosmeticSpectralBlue = 196
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BattlePetSaveInfo
|
||||||
|
{
|
||||||
|
Unchanged = 0,
|
||||||
|
Changed = 1,
|
||||||
|
New = 2,
|
||||||
|
Removed = 3
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public struct BlackMarketConst
|
||||||
|
{
|
||||||
|
public const ulong MaxBid = 1000000UL* MoneyConstants.Gold;
|
||||||
|
}
|
||||||
|
public enum BlackMarketError
|
||||||
|
{
|
||||||
|
Ok = 0,
|
||||||
|
ItemNotFound = 1,
|
||||||
|
AlreadyBid = 2,
|
||||||
|
HigherBid = 4,
|
||||||
|
DatabaseError = 6,
|
||||||
|
NotEnoughMoney = 7,
|
||||||
|
RestrictedAccountTrial = 9
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BMAHMailAuctionAnswers
|
||||||
|
{
|
||||||
|
Outbid = 0,
|
||||||
|
Won = 1,
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum CalendarMailAnswers
|
||||||
|
{
|
||||||
|
EventRemovedMailSubject = 0,
|
||||||
|
InviteRemovedMailSubject = 0x100
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CalendarFlags
|
||||||
|
{
|
||||||
|
AllAllowed = 0x001,
|
||||||
|
InvitesLocked = 0x010,
|
||||||
|
WithoutInvites = 0x040,
|
||||||
|
GuildEvent = 0x400
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CalendarModerationRank
|
||||||
|
{
|
||||||
|
Player = 0,
|
||||||
|
Moderator = 1,
|
||||||
|
Owner = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CalendarSendEventType
|
||||||
|
{
|
||||||
|
Get = 0,
|
||||||
|
Add = 1,
|
||||||
|
Copy = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CalendarEventType
|
||||||
|
{
|
||||||
|
Raid = 0,
|
||||||
|
Dungeon = 1,
|
||||||
|
Pvp = 2,
|
||||||
|
Meeting = 3,
|
||||||
|
Other = 4,
|
||||||
|
Heroic = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CalendarRepeatType
|
||||||
|
{
|
||||||
|
Never = 0,
|
||||||
|
Weekly = 1,
|
||||||
|
Biweekly = 2,
|
||||||
|
Monthly = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CalendarInviteStatus
|
||||||
|
{
|
||||||
|
Invited = 0,
|
||||||
|
Accepted = 1,
|
||||||
|
Declined = 2,
|
||||||
|
Confirmed = 3,
|
||||||
|
Out = 4,
|
||||||
|
Standby = 5,
|
||||||
|
SignedUp = 6,
|
||||||
|
NotSignedUp = 7,
|
||||||
|
Tentative = 8,
|
||||||
|
Removed = 9 // Correct Name?
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CalendarError
|
||||||
|
{
|
||||||
|
Ok = 0,
|
||||||
|
GuildEventsExceeded = 1,
|
||||||
|
EventsExceeded = 2,
|
||||||
|
SelfInvitesExceeded = 3,
|
||||||
|
OtherInvitesExceeded = 4,
|
||||||
|
Permissions = 5,
|
||||||
|
EventInvalid = 6,
|
||||||
|
NotInvited = 7,
|
||||||
|
Internal = 8,
|
||||||
|
GuildPlayerNotInGuild = 9,
|
||||||
|
AlreadyInvitedToEventS = 10,
|
||||||
|
PlayerNotFound = 11,
|
||||||
|
NotAllied = 12,
|
||||||
|
IgnoringYouS = 13,
|
||||||
|
InvitesExceeded = 14,
|
||||||
|
InvalidDate = 16,
|
||||||
|
InvalidTime = 17,
|
||||||
|
|
||||||
|
NeedsTitle = 19,
|
||||||
|
EventPassed = 20,
|
||||||
|
EventLocked = 21,
|
||||||
|
DeleteCreatorFailed = 22,
|
||||||
|
SystemDisabled = 24,
|
||||||
|
RestrictedAccount = 25,
|
||||||
|
ArenaEventsExceeded = 26,
|
||||||
|
RestrictedLevel = 27,
|
||||||
|
UserSquelched = 28,
|
||||||
|
NoInvite = 29,
|
||||||
|
|
||||||
|
EventWrongServer = 36,
|
||||||
|
InviteWrongServer = 37,
|
||||||
|
NoGuildInvites = 38,
|
||||||
|
InvalidSignup = 39,
|
||||||
|
NoModerator = 40
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum ChatNotify
|
||||||
|
{
|
||||||
|
JoinedNotice = 0x00, //+ "%S Joined Channel.";
|
||||||
|
LeftNotice = 0x01, //+ "%S Left Channel.";
|
||||||
|
//SuspendedNotice = 0x01, // "%S Left Channel.";
|
||||||
|
YouJoinedNotice = 0x02, //+ "Joined Channel: [%S]"; -- You Joined
|
||||||
|
//YouChangedNotice = 0x02, // "Changed Channel: [%S]";
|
||||||
|
YouLeftNotice = 0x03, //+ "Left Channel: [%S]"; -- You Left
|
||||||
|
WrongPasswordNotice = 0x04, //+ "Wrong Password For %S.";
|
||||||
|
NotMemberNotice = 0x05, //+ "Not On Channel %S.";
|
||||||
|
NotModeratorNotice = 0x06, //+ "Not A Moderator Of %S.";
|
||||||
|
PasswordChangedNotice = 0x07, //+ "[%S] Password Changed By %S.";
|
||||||
|
OwnerChangedNotice = 0x08, //+ "[%S] Owner Changed To %S.";
|
||||||
|
PlayerNotFoundNotice = 0x09, //+ "[%S] Player %S Was Not Found.";
|
||||||
|
NotOwnerNotice = 0x0a, //+ "[%S] You Are Not The Channel Owner.";
|
||||||
|
ChannelOwnerNotice = 0x0b, //+ "[%S] Channel Owner Is %S.";
|
||||||
|
ModeChangeNotice = 0x0c, //?
|
||||||
|
AnnouncementsOnNotice = 0x0d, //+ "[%S] Channel Announcements Enabled By %S.";
|
||||||
|
AnnouncementsOffNotice = 0x0e, //+ "[%S] Channel Announcements Disabled By %S.";
|
||||||
|
ModerationOnNotice = 0x0f, //+ "[%S] Channel Moderation Enabled By %S.";
|
||||||
|
ModerationOffNotice = 0x10, //+ "[%S] Channel Moderation Disabled By %S.";
|
||||||
|
MutedNotice = 0x11, //+ "[%S] You Do Not Have Permission To Speak.";
|
||||||
|
PlayerKickedNotice = 0x12, //? "[%S] Player %S Kicked By %S.";
|
||||||
|
BannedNotice = 0x13, //+ "[%S] You Are Bannedstore From That Channel.";
|
||||||
|
PlayerBannedNotice = 0x14, //? "[%S] Player %S Bannedstore By %S.";
|
||||||
|
PlayerUnbannedNotice = 0x15, //? "[%S] Player %S Unbanned By %S.";
|
||||||
|
PlayerNotBannedNotice = 0x16, //+ "[%S] Player %S Is Not Bannedstore.";
|
||||||
|
PlayerAlreadyMemberNotice = 0x17, //+ "[%S] Player %S Is Already On The Channel.";
|
||||||
|
InviteNotice = 0x18, //+ "%2$S Has Invited You To Join The Channel '%1$S'.";
|
||||||
|
InviteWrongFactionNotice = 0x19, //+ "Target Is In The Wrong Alliance For %S.";
|
||||||
|
WrongFactionNotice = 0x1a, //+ "Wrong Alliance For %S.";
|
||||||
|
InvalidNameNotice = 0x1b, //+ "Invalid Channel Name";
|
||||||
|
NotModeratedNotice = 0x1c, //+ "%S Is Not Moderated";
|
||||||
|
PlayerInvitedNotice = 0x1d, //+ "[%S] You Invited %S To Join The Channel";
|
||||||
|
PlayerInviteBannedNotice = 0x1e, //+ "[%S] %S Has Been Bannedstore.";
|
||||||
|
ThrottledNotice = 0x1f, //+ "[%S] The Number Of Messages That Can Be Sent To This Channel Is Limited, Please Wait To Send Another Message.";
|
||||||
|
NotInAreaNotice = 0x20, //+ "[%S] You Are Not In The Correct Area For This Channel."; -- The User Is Trying To Send A Chat To A Zone Specific Channel, And They'Re Not Physically In That Zone.
|
||||||
|
NotInLfgNotice = 0x21, //+ "[%S] You Must Be Queued In Looking For Group Before Joining This Channel."; -- The User Must Be In The Looking For Group System To Join Lfg Chat Channels.
|
||||||
|
VoiceOnNotice = 0x22, //+ "[%S] Channel Voice Enabled By %S.";
|
||||||
|
VoiceOffNotice = 0x23, //+ "[%S] Channel Voice Disabled By %S.";
|
||||||
|
TrialRestricted = 0x24,
|
||||||
|
NotAllowedInChannel = 0x25
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ChannelFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
Custom = 0x01,
|
||||||
|
// 0x02
|
||||||
|
Trade = 0x04,
|
||||||
|
NotLfg = 0x08,
|
||||||
|
General = 0x10,
|
||||||
|
City = 0x20,
|
||||||
|
Lfg = 0x40,
|
||||||
|
Voice = 0x80
|
||||||
|
// General 0x18 = 0x10 | 0x08
|
||||||
|
// Trade 0x3C = 0x20 | 0x10 | 0x08 | 0x04
|
||||||
|
// LocalDefence 0x18 = 0x10 | 0x08
|
||||||
|
// GuildRecruitment 0x38 = 0x20 | 0x10 | 0x08
|
||||||
|
// LookingForGroup 0x50 = 0x40 | 0x10
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ChannelDBCFlags
|
||||||
|
{
|
||||||
|
None = 0x00000,
|
||||||
|
Initial = 0x00001, // General, Trade, Localdefense, Lfg
|
||||||
|
ZoneDep = 0x00002, // General, Trade, Localdefense, Guildrecruitment
|
||||||
|
Global = 0x00004, // Worlddefense
|
||||||
|
Trade = 0x00008, // Trade, Lfg
|
||||||
|
CityOnly = 0x00010, // Trade, Guildrecruitment, Lfg
|
||||||
|
CityOnly2 = 0x00020, // Trade, Guildrecruitment, Lfg
|
||||||
|
Defense = 0x10000, // Localdefense, Worlddefense
|
||||||
|
GuildReq = 0x20000, // Guildrecruitment
|
||||||
|
Lfg = 0x40000, // Lfg
|
||||||
|
Unk1 = 0x80000 // General
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ChannelMemberFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
Owner = 0x01,
|
||||||
|
Moderator = 0x02,
|
||||||
|
Voiced = 0x04,
|
||||||
|
Muted = 0x08,
|
||||||
|
Custom = 0x10,
|
||||||
|
MicMuted = 0x20
|
||||||
|
// 0x40
|
||||||
|
// 0x80
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,123 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum ConditionTypes
|
||||||
|
{ // value1 value2 value3
|
||||||
|
None = 0, // 0 0 0 Always True
|
||||||
|
Aura = 1, // Spell_Id Effindex Use Target? True If Player (Or Target, If Value3) Has Aura Of Spell_Id With Effect Effindex
|
||||||
|
Item = 2, // Item_Id Count Bank True If Has #Count Of Item_Ids (If 'Bank' Is Set It Searches In Bank Slots Too)
|
||||||
|
ItemEquipped = 3, // Item_Id 0 0 True If Has Item_Id Equipped
|
||||||
|
Zoneid = 4, // Zone_Id 0 0 True If In Zone_Id
|
||||||
|
ReputationRank = 5, // Faction_Id Rankmask 0 True If Has Min_Rank For Faction_Id
|
||||||
|
Team = 6, // Player_Team 0, 0 469 - Alliance, 67 - Horde)
|
||||||
|
Skill = 7, // Skill_Id Skill_Value 0 True If Has Skill_Value For Skill_Id
|
||||||
|
QuestRewarded = 8, // Quest_Id 0 0 True If Quest_Id Was Rewarded Before
|
||||||
|
QuestTaken = 9, // Quest_Id 0, 0 True While Quest Active
|
||||||
|
DrunkenState = 10, // Drunkenstate 0, 0 True If Player Is Drunk Enough
|
||||||
|
WorldState = 11, // Index Value 0 True If World Has The Value For The Index
|
||||||
|
ActiveEvent = 12, // Event_Id 0 0 True If Event Is Active
|
||||||
|
InstanceInfo = 13, // Entry Data Type True If The Instance Info Defined By Type (Enum Instanceinfo) Equals Data.
|
||||||
|
QuestNone = 14, // Quest_Id 0 0 True If Doesn'T Have Quest Saved
|
||||||
|
Class = 15, // Class 0 0 True If Player'S Class Is Equal To Class
|
||||||
|
Race = 16, // Race 0 0 True If Player'S Race Is Equal To Race
|
||||||
|
Achievement = 17, // Achievement_Id 0 0 True If Achievement Is Complete
|
||||||
|
Title = 18, // Title Id 0 0 True If Player Has Title
|
||||||
|
Spawnmask = 19, // Spawnmask 0 0 True If In Spawnmask
|
||||||
|
Gender = 20, // Gender 0 0 True If Player'S Gender Is Equal To Gender
|
||||||
|
UnitState = 21, // Unitstate 0 0 True If Unit Has Unitstate
|
||||||
|
Mapid = 22, // Map_Id 0 0 True If In Map_Id
|
||||||
|
Areaid = 23, // Area_Id 0 0 True If In Area_Id
|
||||||
|
CreatureType = 24, // cinfo.type 0 0 true if creature_template.type = value1
|
||||||
|
Spell = 25, // Spell_Id 0 0 True If Player Has Learned Spell
|
||||||
|
PhaseId = 26, // Phasemask 0 0 True If Object Is In PhaseId
|
||||||
|
Level = 27, // Level Comparisontype 0 True If Unit'S Level Is Equal To Param1 (Param2 Can Modify The Statement)
|
||||||
|
QuestComplete = 28, // Quest_Id 0 0 True If Player Has Quest_Id With All Objectives Complete, But Not Yet Rewarded
|
||||||
|
NearCreature = 29, // Creature Entry Distance 0 True If There Is A Creature Of Entry In Range
|
||||||
|
NearGameobject = 30, // Gameobject Entry Distance 0 True If There Is A Gameobject Of Entry In Range
|
||||||
|
ObjectEntryGuid = 31, // Typeid Entry 0 True If Object Is Type Typeid And The Entry Is 0 Or Matches Entry Of The Object
|
||||||
|
TypeMask = 32, // Typemask 0 0 True If Object Is Type Object'S Typemask Matches Provided Typemask
|
||||||
|
RelationTo = 33, // Conditiontarget Relationtype 0 True If Object Is In Given Relation With Object Specified By Conditiontarget
|
||||||
|
ReactionTo = 34, // Conditiontarget Rankmask 0 True If Object'S Reaction Matches Rankmask Object Specified By Conditiontarget
|
||||||
|
DistanceTo = 35, // Conditiontarget Distance Comparisontype True If Object And Conditiontarget Are Within Distance Given By Parameters
|
||||||
|
Alive = 36, // 0 0 0 True If Unit Is Alive
|
||||||
|
HpVal = 37, // Hpval Comparisontype 0 True If Unit'S Hp Matches Given Value
|
||||||
|
HpPct = 38, // Hppct Comparisontype 0 True If Unit'S Hp Matches Given Pct
|
||||||
|
RealmAchievement = 39, // achievement_id 0 0 true if realm achievement is complete
|
||||||
|
InWater = 40, // 0 0 0 true if unit in water
|
||||||
|
TerrainSwap = 41, // terrainSwap 0 0 true if object is in terrainswap
|
||||||
|
StandState = 42, // stateType state 0 true if unit matches specified sitstate (0,x: has exactly state x; 1,0: any standing state; 1,1: any sitting state;)
|
||||||
|
DailyQuestDone = 43, // quest id 0 0 true if daily quest has been completed for the day
|
||||||
|
Charmed = 44, // 0 0 0 true if unit is currently charmed
|
||||||
|
PetType = 45, // mask 0 0 true if player has a pet of given type(s)
|
||||||
|
Taxi = 46, // 0 0 0 true if player is on taxi
|
||||||
|
Queststate = 47, // quest_id state_mask 0 true if player is in any of the provided quest states for the quest (1 = not taken, 2 = completed, 8 = in progress, 32 = failed, 64 = rewarded)
|
||||||
|
ObjectiveComplete = 48, // ID 0 0 true if player has ID objective complete, but quest not yet rewarded
|
||||||
|
Max = 49 // Max
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ConditionSourceType
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
CreatureLootTemplate = 1,
|
||||||
|
DisenchantLootTemplate = 2,
|
||||||
|
FishingLootTemplate = 3,
|
||||||
|
GameobjectLootTemplate = 4,
|
||||||
|
ItemLootTemplate = 5,
|
||||||
|
MailLootTemplate = 6,
|
||||||
|
MillingLootTemplate = 7,
|
||||||
|
PickpocketingLootTemplate = 8,
|
||||||
|
ProspectingLootTemplate = 9,
|
||||||
|
ReferenceLootTemplate = 10,
|
||||||
|
SkinningLootTemplate = 11,
|
||||||
|
SpellLootTemplate = 12,
|
||||||
|
SpellImplicitTarget = 13,
|
||||||
|
GossipMenu = 14,
|
||||||
|
GossipMenuOption = 15,
|
||||||
|
CreatureTemplateVehicle = 16,
|
||||||
|
Spell = 17,
|
||||||
|
SpellClickEvent = 18,
|
||||||
|
QuestAccept = 19,
|
||||||
|
// Condition source type 20 unused
|
||||||
|
VehicleSpell = 21,
|
||||||
|
SmartEvent = 22,
|
||||||
|
NpcVendor = 23,
|
||||||
|
SpellProc = 24,
|
||||||
|
TerrainSwap = 25,
|
||||||
|
Phase = 26,
|
||||||
|
Max = 27
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum RelationType
|
||||||
|
{
|
||||||
|
Self = 0,
|
||||||
|
InParty,
|
||||||
|
InRaidOrParty,
|
||||||
|
OwnedBy,
|
||||||
|
PassengerOf,
|
||||||
|
CreatedBy,
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum InstanceInfo
|
||||||
|
{
|
||||||
|
Data = 0,
|
||||||
|
Data64,
|
||||||
|
BossState
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum ConnectionType
|
||||||
|
{
|
||||||
|
Realm = 0,
|
||||||
|
Instance = 1,
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ConnectToSerial
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Realm = 14,
|
||||||
|
WorldAttempt1 = 17,
|
||||||
|
WorldAttempt2 = 35,
|
||||||
|
WorldAttempt3 = 53,
|
||||||
|
WorldAttempt4 = 71,
|
||||||
|
WorldAttempt5 = 89
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LoginFailureReason
|
||||||
|
{
|
||||||
|
Failed = 0,
|
||||||
|
NoWorld = 1,
|
||||||
|
DuplicateCharacter = 2,
|
||||||
|
NoInstances = 3,
|
||||||
|
Disabled = 4,
|
||||||
|
NoCharacter = 5,
|
||||||
|
LockedForTransfer = 6,
|
||||||
|
LockedByBilling = 7,
|
||||||
|
LockedByMobileAH = 8,
|
||||||
|
TemporaryGMLock = 9,
|
||||||
|
LockedByCharacterUpgrade = 10,
|
||||||
|
LockedByRevokedCharacterUpgrade = 11
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,338 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum CreatureLinkedRespawnType
|
||||||
|
{
|
||||||
|
CreatureToCreature,
|
||||||
|
CreatureToGO, // Creature is dependant on GO
|
||||||
|
GOToGO,
|
||||||
|
GOToCreature // GO is dependant on creature
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum AiReaction
|
||||||
|
{
|
||||||
|
Alert = 0, // pre-aggro (used in client packet handler)
|
||||||
|
Friendly = 1, // (NOT used in client packet handler)
|
||||||
|
Hostile = 2, // sent on every attack, triggers aggro sound (used in client packet handler)
|
||||||
|
Afraid = 3, // seen for polymorph (when AI not in control of self?) (NOT used in client packet handler)
|
||||||
|
Destory = 4 // used on object destroy (NOT used in client packet handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CreatureEliteType
|
||||||
|
{
|
||||||
|
Normal = 0,
|
||||||
|
Elite = 1,
|
||||||
|
RareElite = 2,
|
||||||
|
WorldBoss = 3,
|
||||||
|
Rare = 4,
|
||||||
|
Unknown = 5 // found in 2.2.3 for 2 mobs
|
||||||
|
}
|
||||||
|
|
||||||
|
[System.Flags]
|
||||||
|
public enum UnitFlags : uint
|
||||||
|
{
|
||||||
|
ServerControlled = 0x01,
|
||||||
|
NonAttackable = 0x02,
|
||||||
|
RemoveClientControl = 0x04, // This is a legacy flag used to disable movement player's movement while controlling other units, SMSG_CLIENT_CONTROL replaces this functionality clientside now. CONFUSED and FLEEING flags have the same effect on client movement asDISABLE_MOVE_CONTROL in addition to preventing spell casts/autoattack (they all allow climbing steeper hills and emotes while moving)
|
||||||
|
PvpAttackable = 0x08,
|
||||||
|
Rename = 0x10,
|
||||||
|
Preparation = 0x20,
|
||||||
|
Unk6 = 0x40,
|
||||||
|
NotAttackable1 = 0x80,
|
||||||
|
ImmuneToPc = 0x100,
|
||||||
|
ImmuneToNpc = 0x200,
|
||||||
|
Looting = 0x400,
|
||||||
|
PetInCombat = 0x800,
|
||||||
|
Pvp = 0x1000,
|
||||||
|
Silenced = 0x2000,
|
||||||
|
CannotSwim = 0x4000,
|
||||||
|
Unk15 = 0x8000,
|
||||||
|
Unk16 = 0x10000,
|
||||||
|
Pacified = 0x20000,
|
||||||
|
Stunned = 0x40000,
|
||||||
|
InCombat = 0x80000,
|
||||||
|
TaxiFlight = 0x100000,
|
||||||
|
Disarmed = 0x200000,
|
||||||
|
Confused = 0x400000,
|
||||||
|
Fleeing = 0x800000,
|
||||||
|
PlayerControlled = 0x1000000,
|
||||||
|
NotSelectable = 0x2000000,
|
||||||
|
Skinnable = 0x4000000,
|
||||||
|
Mount = 0x8000000,
|
||||||
|
Unk28 = 0x10000000,
|
||||||
|
Unk29 = 0x20000000,
|
||||||
|
Sheathe = 0x40000000,
|
||||||
|
Unk31 = 0x80000000
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum UnitFlags2 : uint
|
||||||
|
{
|
||||||
|
FeignDeath = 0x01,
|
||||||
|
Unk1 = 0x02,
|
||||||
|
IgnoreReputation = 0x04,
|
||||||
|
ComprehendLang = 0x08,
|
||||||
|
MirrorImage = 0x10,
|
||||||
|
InstantlyAppearModel = 0x20,
|
||||||
|
ForceMove = 0x40,
|
||||||
|
DisarmOffhand = 0x80,
|
||||||
|
DisablePredStats = 0x100,
|
||||||
|
DisarmRanged = 0x400,
|
||||||
|
RegeneratePower = 0x800,
|
||||||
|
RestrictPartyInteraction = 0x1000,
|
||||||
|
PreventSpellClick = 0x2000,
|
||||||
|
AllowEnemyInteract = 0x4000,
|
||||||
|
DisableTurn = 0x8000,
|
||||||
|
Unk2 = 0x10000,
|
||||||
|
PlayDeathAnim = 0x20000,
|
||||||
|
AllowCheatSpells = 0x40000,
|
||||||
|
NoActions = 0x800000
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum UnitFlags3 : uint
|
||||||
|
{
|
||||||
|
Unk1 = 0x01,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum NPCFlags : ulong
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
Gossip = 0x01,
|
||||||
|
QuestGiver = 0x02,
|
||||||
|
Unk1 = 0x04,
|
||||||
|
Unk2 = 0x08,
|
||||||
|
Trainer = 0x10,
|
||||||
|
TrainerClass = 0x20,
|
||||||
|
TrainerProfession = 0x40,
|
||||||
|
Vendor = 0x80,
|
||||||
|
VendorGeneral = 0x100,
|
||||||
|
VendorFood = 0x200,
|
||||||
|
VendorPoison = 0x400,
|
||||||
|
VendorReagent = 0x800,
|
||||||
|
Repair = 0x1000,
|
||||||
|
FlightMaster = 0x2000,
|
||||||
|
SpiritHealer = 0x4000,
|
||||||
|
SpiritGuide = 0x8000,
|
||||||
|
Innkeeper = 0x10000,
|
||||||
|
Banker = 0x20000,
|
||||||
|
Petitioner = 0x40000,
|
||||||
|
TabardDesigner = 0x80000,
|
||||||
|
BattleMaster = 0x100000,
|
||||||
|
Auctioneer = 0x200000,
|
||||||
|
StableMaster = 0x400000,
|
||||||
|
GuildBanker = 0x800000,
|
||||||
|
SpellClick = 0x1000000,
|
||||||
|
PlayerVehicle = 0x2000000,
|
||||||
|
Mailbox = 0x4000000,
|
||||||
|
ArtifactPowerRespec = 0x8000000,
|
||||||
|
Transmogrifier = 0x10000000,
|
||||||
|
VaultKeeper = 0x20000000,
|
||||||
|
BlackMarket = 0x80000000,
|
||||||
|
ItemUpgradeMaster = 0x100000000,
|
||||||
|
GarrisonArchitect = 0x200000000,
|
||||||
|
Steering = 0x400000000,
|
||||||
|
ShipmentCrafter = 0x1000000000,
|
||||||
|
GarrisonMissionNpc = 0x2000000000,
|
||||||
|
TradeskillNpc = 0x4000000000,
|
||||||
|
BlackMarketView = 0x8000000000
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CreatureTypeFlags : uint
|
||||||
|
{
|
||||||
|
TameablePet = 0x01, // Makes the mob tameable (must also be a beast and have family set)
|
||||||
|
GhostVisible = 0x02, // Creature are also visible for not alive player. Allow gossip interaction if npcflag allow?
|
||||||
|
BossMob = 0x04, // Changes creature's visible level to "??" in the creature's portrait - Immune Knockback.
|
||||||
|
DoNotPlayWoundParryAnimation = 0x08,
|
||||||
|
HideFactionTooltip = 0x10,
|
||||||
|
Unk5 = 0x20, // Sound related
|
||||||
|
SpellAttackable = 0x40,
|
||||||
|
CanInteractWhileDead = 0x80, // Player can interact with the creature if its dead (not player dead)
|
||||||
|
HerbSkinningSkill = 0x100, // Can be looted by herbalist
|
||||||
|
MiningSkinningSkill = 0x200, // Can be looted by miner
|
||||||
|
DoNotLogDeath = 0x400, // Death event will not show up in combat log
|
||||||
|
MountedCombatAllowed = 0x800, // Creature can remain mounted when entering combat
|
||||||
|
CanAssist = 0x1000, // ? Can aid any player in combat if in range?
|
||||||
|
IsPetBarUsed = 0x2000,
|
||||||
|
MaskUID = 0x4000,
|
||||||
|
EngineeringSkinningSkill = 0x8000, // Can be looted by engineer
|
||||||
|
ExoticPet = 0x10000, // Can be tamed by hunter as exotic pet
|
||||||
|
UseDefaultCollisionBox = 0x20000, // Collision related. (always using default collision box?)
|
||||||
|
IsSiegeWeapon = 0x40000,
|
||||||
|
CanCollideWithMissiles = 0x80000, // Projectiles can collide with this creature - interacts with TARGET_DEST_TRAJ
|
||||||
|
HideNamePlate = 0x100000,
|
||||||
|
DoNotPlayMountedAnimations = 0x200000,
|
||||||
|
IsLinkAll = 0x400000,
|
||||||
|
InteractOnlyWithCreator = 0x800000,
|
||||||
|
DoNotPlayUnitEventSounds = 0x1000000,
|
||||||
|
HasNoShadowBlob = 0x2000000,
|
||||||
|
TreatAsRaidUnit = 0x4000000, //! Creature can be targeted by spells that require target to be in caster's party/raid
|
||||||
|
ForceGossip = 0x8000000, // Allows the creature to display a single gossip option.
|
||||||
|
DoNotSheathe = 0x10000000,
|
||||||
|
DoNotTargetOnInteration = 0x20000000,
|
||||||
|
DoNotRenderObjectName = 0x40000000,
|
||||||
|
UnitIsQuestBoss = 0x80000000 // Not verified
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CreatureFlagsExtra : uint
|
||||||
|
{
|
||||||
|
InstanceBind = 0x01, // Creature Kill Bind Instance With Killer And Killer'S Group
|
||||||
|
Civilian = 0x02, // Not Aggro (Ignore Faction/Reputation Hostility)
|
||||||
|
NoParry = 0x04, // Creature Can'T Parry
|
||||||
|
NoParryHasten = 0x08, // Creature Can'T Counter-Attack At Parry
|
||||||
|
NoBlock = 0x10, // Creature Can'T Block
|
||||||
|
NoCrush = 0x20, // Creature Can'T Do Crush Attacks
|
||||||
|
NoXpAtKill = 0x40, // Creature Kill Not Provide Xp
|
||||||
|
Trigger = 0x80, // Trigger Creature
|
||||||
|
NoTaunt = 0x100, // Creature Is Immune To Taunt Auras And Effect Attack Me
|
||||||
|
Worldevent = 0x4000, // Custom Flag For World Event Creatures (Left Room For Merging)
|
||||||
|
Guard = 0x8000, // Creature Is Guard
|
||||||
|
NoCrit = 0x20000, // Creature Can'T Do Critical Strikes
|
||||||
|
NoSkillgain = 0x40000, // Creature Won'T Increase Weapon Skills
|
||||||
|
TauntDiminish = 0x80000, // Taunt Is A Subject To Diminishing Returns On This Creautre
|
||||||
|
AllDiminish = 0x100000, // Creature Is Subject To All Diminishing Returns As Player Are
|
||||||
|
NoPlayerDamageReq = 0x200000, // creature does not need to take player damage for kill credit
|
||||||
|
DungeonBoss = 0x10000000, // Creature Is A Dungeon Boss (Set Dynamically, Do Not Add In Db)
|
||||||
|
IgnorePathfinding = 0x20000000, // creature ignore pathfinding
|
||||||
|
ImmunityKnockback = 0x40000000, // creature is immune to knockback effects
|
||||||
|
|
||||||
|
DBAllowed = (InstanceBind | Civilian | NoParry | NoParryHasten | NoBlock | NoCrush | NoXpAtKill |
|
||||||
|
Trigger | NoTaunt | Worldevent | NoCrit | NoSkillgain | TauntDiminish | AllDiminish | Guard |
|
||||||
|
IgnorePathfinding | NoPlayerDamageReq | ImmunityKnockback)
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CreatureType
|
||||||
|
{
|
||||||
|
Beast = 1,
|
||||||
|
Dragonkin = 2,
|
||||||
|
Demon = 3,
|
||||||
|
Elemental = 4,
|
||||||
|
Giant = 5,
|
||||||
|
Undead = 6,
|
||||||
|
Humanoid = 7,
|
||||||
|
Critter = 8,
|
||||||
|
Mechanical = 9,
|
||||||
|
NotSpecified = 10,
|
||||||
|
Totem = 11,
|
||||||
|
NonCombatPet = 12,
|
||||||
|
GasCloud = 13,
|
||||||
|
WildPet = 14,
|
||||||
|
Aberration = 15,
|
||||||
|
|
||||||
|
MaskDemonOrUnDead = (1 << (Demon - 1)) | (1 << (Undead - 1)),
|
||||||
|
MaskHumanoidOrUndead = (1 << (Humanoid - 1)) | (1 << (Undead - 1)),
|
||||||
|
MaskMechanicalOrElemental = (1 << (Mechanical - 1)) | (1 << (Elemental - 1))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CreatureFamily
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Wolf = 1,
|
||||||
|
Cat = 2,
|
||||||
|
Spider = 3,
|
||||||
|
Bear = 4,
|
||||||
|
Boar = 5,
|
||||||
|
Crocolisk = 6,
|
||||||
|
CarrionBird = 7,
|
||||||
|
Crab = 8,
|
||||||
|
Gorilla = 9,
|
||||||
|
HorseCustom = 10, // Does Not Exist In Dbc But Used For Horse Like Beasts In Db
|
||||||
|
Raptor = 11,
|
||||||
|
Tallstrider = 12,
|
||||||
|
Felhunter = 15,
|
||||||
|
Voidwalker = 16,
|
||||||
|
Succubus = 17,
|
||||||
|
Doomguard = 19,
|
||||||
|
Scorpid = 20,
|
||||||
|
Turtle = 21,
|
||||||
|
Imp = 23,
|
||||||
|
Bat = 24,
|
||||||
|
Hyena = 25,
|
||||||
|
BirdOfPrey = 26,
|
||||||
|
WindSerpent = 27,
|
||||||
|
RemoteControl = 28,
|
||||||
|
Felguard = 29,
|
||||||
|
Dragonhawk = 30,
|
||||||
|
Ravager = 31,
|
||||||
|
WarpStalker = 32,
|
||||||
|
Sporebat = 33,
|
||||||
|
NetherRay = 34,
|
||||||
|
Serpent = 35,
|
||||||
|
Moth = 37,
|
||||||
|
Chimaera = 38,
|
||||||
|
Devilsaur = 39,
|
||||||
|
Ghoul = 40,
|
||||||
|
Silithid = 41,
|
||||||
|
Worm = 42,
|
||||||
|
Rhino = 43,
|
||||||
|
Wasp = 44,
|
||||||
|
CoreHound = 45,
|
||||||
|
SpiritBeast = 46,
|
||||||
|
WaterElemental = 49,
|
||||||
|
Fox = 50,
|
||||||
|
Monkey = 51,
|
||||||
|
Dog = 52,
|
||||||
|
Beetle = 53,
|
||||||
|
ShaleSpider = 55,
|
||||||
|
Zombie = 56,
|
||||||
|
BeetleOld = 57,
|
||||||
|
Silithid2 = 59,
|
||||||
|
Wasp2 = 66,
|
||||||
|
Hydra = 68,
|
||||||
|
Felimp = 100,
|
||||||
|
Voidlord = 101,
|
||||||
|
Shivara = 102,
|
||||||
|
Observer = 103,
|
||||||
|
Wrathguard = 104,
|
||||||
|
Infernal = 108,
|
||||||
|
Fireelemental = 116,
|
||||||
|
Earthelemental = 117,
|
||||||
|
Crane = 125,
|
||||||
|
Waterstrider = 126,
|
||||||
|
Porcupine = 127,
|
||||||
|
Quilen = 128,
|
||||||
|
Goat = 129,
|
||||||
|
Basilisk = 130,
|
||||||
|
Direhorn = 138,
|
||||||
|
Stormelemental = 145,
|
||||||
|
Mtwaterelemental = 146,
|
||||||
|
Torrorguard = 147,
|
||||||
|
Abyssal = 148,
|
||||||
|
Rylak = 149,
|
||||||
|
Riverbeast = 150,
|
||||||
|
Stag = 151
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum InhabitType
|
||||||
|
{
|
||||||
|
Ground = 1,
|
||||||
|
Water = 2,
|
||||||
|
Air = 4,
|
||||||
|
Root = 8,
|
||||||
|
Anywhere = Ground | Water | Air | Root
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum EvadeReason
|
||||||
|
{
|
||||||
|
NoHostiles, // the creature's threat list is empty
|
||||||
|
Boundary, // the creature has moved outside its evade boundary
|
||||||
|
NoPath, // the creature was unable to reach its target for over 5 seconds
|
||||||
|
SequenceBreak, // this is a boss and the pre-requisite encounters for engaging it are not defeated yet
|
||||||
|
Other
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum GameObjectTypes : byte
|
||||||
|
{
|
||||||
|
Door = 0,
|
||||||
|
Button = 1,
|
||||||
|
QuestGiver = 2,
|
||||||
|
Chest = 3,
|
||||||
|
Binder = 4,
|
||||||
|
Generic = 5,
|
||||||
|
Trap = 6,
|
||||||
|
Chair = 7,
|
||||||
|
SpellFocus = 8,
|
||||||
|
Text = 9,
|
||||||
|
Goober = 10,
|
||||||
|
Transport = 11,
|
||||||
|
AreaDamage = 12,
|
||||||
|
Camera = 13,
|
||||||
|
MapObject = 14,
|
||||||
|
MapObjTransport = 15,
|
||||||
|
DuelArbiter = 16,
|
||||||
|
FishingNode = 17,
|
||||||
|
Ritual = 18,
|
||||||
|
Mailbox = 19,
|
||||||
|
DoNotUse = 20,
|
||||||
|
GuardPost = 21,
|
||||||
|
SpellCaster = 22,
|
||||||
|
MeetingStone = 23,
|
||||||
|
FlagStand = 24,
|
||||||
|
FishingHole = 25,
|
||||||
|
FlagDrop = 26,
|
||||||
|
MiniGame = 27,
|
||||||
|
DoNotUse2 = 28,
|
||||||
|
ControlZone = 29,
|
||||||
|
AuraGenerator = 30,
|
||||||
|
DungeonDifficulty = 31,
|
||||||
|
BarberChair = 32,
|
||||||
|
DestructibleBuilding = 33,
|
||||||
|
GuildBank = 34,
|
||||||
|
TrapDoor = 35,
|
||||||
|
NewFlag = 36,
|
||||||
|
NewFlagDrop = 37,
|
||||||
|
GarrisonBuilding = 38,
|
||||||
|
GarrisonPlot = 39,
|
||||||
|
ClientCreature = 40,
|
||||||
|
ClientItem = 41,
|
||||||
|
CapturePoint = 42,
|
||||||
|
PhaseableMo = 43,
|
||||||
|
GarrisonMonument = 44,
|
||||||
|
GarrisonShipment = 45,
|
||||||
|
GarrisonMonumentPlaque = 46,
|
||||||
|
ArtifactForge = 47,
|
||||||
|
UILink = 48,
|
||||||
|
KeystoneReceptacle = 49,
|
||||||
|
GatheringNode = 50,
|
||||||
|
ChallengeModeReward = 51,
|
||||||
|
Max = 52
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GameObjectState
|
||||||
|
{
|
||||||
|
Active = 0,
|
||||||
|
Ready = 1,
|
||||||
|
ActiveAlternative = 2,
|
||||||
|
TransportActive = 24,
|
||||||
|
TransportStopped = 25,
|
||||||
|
Max = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GameObjectDynamicLowFlags
|
||||||
|
{
|
||||||
|
HideModel = 0x02,
|
||||||
|
Activate = 0x04,
|
||||||
|
Animate = 0x08,
|
||||||
|
NoInteract = 0x10,
|
||||||
|
Sparkle = 0x20,
|
||||||
|
Stopped = 0x40
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GameObjectFlags
|
||||||
|
{
|
||||||
|
InUse = 0x01, // Disables Interaction While Animated
|
||||||
|
Locked = 0x02, // Require Key, Spell, Event, Etc To Be Opened. Makes "Locked" Appear In Tooltip
|
||||||
|
InteractCond = 0x04, // cannot interact (condition to interact - requires GO_DYNFLAG_LO_ACTIVATE to enable interaction clientside)
|
||||||
|
Transport = 0x08, // Any Kind Of Transport? Object Can Transport (Elevator, Boat, Car)
|
||||||
|
NotSelectable = 0x10, // Not Selectable Even In Gm Mode
|
||||||
|
NoDespawn = 0x20, // Never Despawn, Typically For Doors, They Just Change State
|
||||||
|
AiObstacle = 0x40, // makes the client register the object in something called AIObstacleMgr, unknown what it does
|
||||||
|
FreezeAnimation = 0x80,
|
||||||
|
Damaged = 0x200,
|
||||||
|
Destroyed = 0x400,
|
||||||
|
InteractDistanceUsesTemplateModel = 0x80000, // client checks interaction distance from model sent in SMSG_QUERY_GAMEOBJECT_RESPONSE instead of GAMEOBJECT_DISPLAYID
|
||||||
|
MapObject = 0x00100000 // pre-7.0 model loading used to be controlled by file extension (wmo vs m2)
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LootState
|
||||||
|
{
|
||||||
|
NotReady = 0,
|
||||||
|
Ready, // can be ready but despawned, and then not possible activate until spawn
|
||||||
|
Activated,
|
||||||
|
JustDeactivated
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GameObjectDestructibleState
|
||||||
|
{
|
||||||
|
Intact = 0,
|
||||||
|
Damaged = 1,
|
||||||
|
Destroyed = 2,
|
||||||
|
Rebuilding = 3
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public struct GarrisonFactionIndex
|
||||||
|
{
|
||||||
|
public const uint Horde = 0;
|
||||||
|
public const uint Alliance = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GarrisonBuildingFlags : byte
|
||||||
|
{
|
||||||
|
NeedsPlan = 0x1
|
||||||
|
}
|
||||||
|
|
||||||
|
enum GarrisonFollowerFlags
|
||||||
|
{
|
||||||
|
Unique = 0x1
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GarrisonFollowerType
|
||||||
|
{
|
||||||
|
Garrison = 1,
|
||||||
|
Shipyard = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GarrisonAbilityFlags : ushort
|
||||||
|
{
|
||||||
|
Trait = 0x01,
|
||||||
|
CannotRoll = 0x02,
|
||||||
|
HordeOnly = 0x04,
|
||||||
|
AllianceOnly = 0x08,
|
||||||
|
CannotRemove = 0x10,
|
||||||
|
Exclusive = 0x20,
|
||||||
|
SingleMissionDuration = 0x40,
|
||||||
|
ActiveOnlyOnZoneSupport = 0x80,
|
||||||
|
ApplyToFirstMission = 0x100,
|
||||||
|
IsSpecialization = 0x200,
|
||||||
|
IsEmptySlot = 0x400
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GarrisonError
|
||||||
|
{
|
||||||
|
Success = 0,
|
||||||
|
NoGarrison = 1,
|
||||||
|
GarrisonExists = 2,
|
||||||
|
GarrisonSameTypeExists = 3,
|
||||||
|
InvalidGarrison = 4,
|
||||||
|
InvalidGarrisonLevel = 5,
|
||||||
|
GarrisonLevelUnchanged = 6,
|
||||||
|
NotInGarrison = 7,
|
||||||
|
NoBuilding = 8,
|
||||||
|
BuildingExists = 9,
|
||||||
|
InvalidPlotInstanceId = 10,
|
||||||
|
InvalidBuildingId = 11,
|
||||||
|
InvalidUpgradeLevel = 12,
|
||||||
|
UpgradeLevelExceedsGarrisonLevel = 13,
|
||||||
|
PlotsNotFull = 14,
|
||||||
|
InvalidSiteId = 15,
|
||||||
|
InvalidPlotBuilding = 16,
|
||||||
|
InvalidFaction = 17,
|
||||||
|
InvalidSpecialization = 18,
|
||||||
|
SpecializationExists = 19,
|
||||||
|
SpecializationOnCooldown = 20,
|
||||||
|
BlueprintExists = 21,
|
||||||
|
RequiresBlueprint = 22,
|
||||||
|
InvalidDoodadSetId = 23,
|
||||||
|
BuildingTypeExists = 24,
|
||||||
|
BuildingNotActive = 25,
|
||||||
|
ConstructionComplete = 26,
|
||||||
|
FollowerExists = 27,
|
||||||
|
InvalidFollower = 28,
|
||||||
|
FollowerAlreadyOnMission = 29,
|
||||||
|
FollowerInBuilding = 30,
|
||||||
|
FollowerInvalidForBuilding = 31,
|
||||||
|
InvalidFollowerLevel = 32,
|
||||||
|
MissionExists = 33,
|
||||||
|
InvalidMission = 34,
|
||||||
|
InvalidMissionTime = 35,
|
||||||
|
InvalidMissionRewardIndex = 36,
|
||||||
|
MissionNotOffered = 37,
|
||||||
|
AlreadyOnMission = 38,
|
||||||
|
MissionSizeInvalid = 39,
|
||||||
|
FollowerSoftCapExceeded = 40,
|
||||||
|
NotOnMission = 41,
|
||||||
|
AlreadyCompletedMission = 42,
|
||||||
|
MissionNotComplete = 43,
|
||||||
|
MissionRewardsPending = 44,
|
||||||
|
MissionExpired = 45,
|
||||||
|
NotEnoughCurrency = 46,
|
||||||
|
NotEnoughGold = 47,
|
||||||
|
BuildingMissing = 48,
|
||||||
|
NoArchitect = 49,
|
||||||
|
ArchitectNotAvailable = 50,
|
||||||
|
NoMissionNpc = 51,
|
||||||
|
MissionNpcNotAvailable = 52,
|
||||||
|
InternalError = 53,
|
||||||
|
InvalidStaticTableValue = 54,
|
||||||
|
InvalidItemLevel = 55,
|
||||||
|
InvalidAvailableRecruit = 56,
|
||||||
|
FollowerAlreadyRecruited = 57,
|
||||||
|
RecruitmentGenerationInProgress = 58,
|
||||||
|
RecruitmentOnCooldown = 59,
|
||||||
|
RecruitBlockedByGeneration = 60,
|
||||||
|
RecruitmentNpcNotAvailable = 61,
|
||||||
|
InvalidFollowerQuality = 62,
|
||||||
|
ProxyNotOk = 63,
|
||||||
|
RecallPortalUsedLessThan24HoursAgo = 64,
|
||||||
|
OnRemoveBuildingSpellFailed = 65,
|
||||||
|
OperationNotSupported = 66,
|
||||||
|
FollowerFatigued = 67,
|
||||||
|
UpgradeConditionFailed = 68,
|
||||||
|
FollowerInactive = 69,
|
||||||
|
FollowerActive = 70,
|
||||||
|
FollowerActivationUnavailable = 71,
|
||||||
|
FollowerTypeMismatch = 72,
|
||||||
|
InvalidGarrisonType = 73,
|
||||||
|
MissionStartConditionFailed = 74,
|
||||||
|
InvalidFollowerAbility = 75,
|
||||||
|
InvalidMissionBonusAbility = 76,
|
||||||
|
HigherBuildingTypeExists = 77,
|
||||||
|
AtFollowerHardCap = 78,
|
||||||
|
FollowerCannotGainXp = 79,
|
||||||
|
NoOp = 80,
|
||||||
|
AtClassSpecCap = 81,
|
||||||
|
MissionRequires100ToStart = 82,
|
||||||
|
MissionMissingRequiredFollower = 83,
|
||||||
|
InvalidTalent = 84,
|
||||||
|
AlreadyResearchingTalent = 85,
|
||||||
|
FailedCondition = 86,
|
||||||
|
InvalidTier = 87,
|
||||||
|
InvalidClass = 88
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GarrisonFollowerStatus
|
||||||
|
{
|
||||||
|
Favorite = 0x01,
|
||||||
|
Exhausted = 0x02,
|
||||||
|
Inactive = 0x04,
|
||||||
|
Troop = 0x08,
|
||||||
|
NoXpGain = 0x10
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GarrisonType
|
||||||
|
{
|
||||||
|
Garrison = 2,
|
||||||
|
ClassOrder = 3
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum GossipOption
|
||||||
|
{
|
||||||
|
None = 0, //Unit_Npc_Flag_None (0)
|
||||||
|
Gossip = 1, //Unit_Npc_Flag_Gossip (1)
|
||||||
|
Questgiver = 2, //Unit_Npc_Flag_Questgiver (2)
|
||||||
|
Vendor = 3, //Unit_Npc_Flag_Vendor (128)
|
||||||
|
Taxivendor = 4, //Unit_Npc_Flag_Taxivendor (8192)
|
||||||
|
Trainer = 5, //Unit_Npc_Flag_Trainer (16)
|
||||||
|
Spirithealer = 6, //Unit_Npc_Flag_Spirithealer (16384)
|
||||||
|
Spiritguide = 7, //Unit_Npc_Flag_Spiritguide (32768)
|
||||||
|
Innkeeper = 8, //Unit_Npc_Flag_Innkeeper (65536)
|
||||||
|
Banker = 9, //Unit_Npc_Flag_Banker (131072)
|
||||||
|
Petitioner = 10, //Unit_Npc_Flag_Petitioner (262144)
|
||||||
|
Tabarddesigner = 11, //Unit_Npc_Flag_Tabarddesigner (524288)
|
||||||
|
Battlefield = 12, //Unit_Npc_Flag_Battlefieldperson (1048576)
|
||||||
|
Auctioneer = 13, //Unit_Npc_Flag_Auctioneer (2097152)
|
||||||
|
Stablepet = 14, //Unit_Npc_Flag_Stable (4194304)
|
||||||
|
Armorer = 15, //Unit_Npc_Flag_Armorer (4096)
|
||||||
|
Unlearntalents = 16, //Unit_Npc_Flag_Trainer (16) (Bonus Option For Trainer)
|
||||||
|
Unlearnpettalents = 17, //Unit_Npc_Flag_Trainer (16) (Bonus Option For Trainer)
|
||||||
|
Learndualspec = 18, //Unit_Npc_Flag_Trainer (16) (Bonus Option For Trainer)
|
||||||
|
Outdoorpvp = 19, //Added By Code (Option For Outdoor Pvp Creatures)
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GossipOptionIcon
|
||||||
|
{
|
||||||
|
Chat = 0, // White Chat Bubble
|
||||||
|
Vendor = 1, // Brown Bag
|
||||||
|
Taxi = 2, // Flightmarker (Paperplane)
|
||||||
|
Trainer = 3, // Brown Book (Trainer)
|
||||||
|
Interact1 = 4, // Golden Interaction Wheel
|
||||||
|
Interact2 = 5, // Golden Interaction Wheel
|
||||||
|
MoneyBag = 6, // Brown Bag (With Gold Coin In Lower Corner)
|
||||||
|
Talk = 7, // White Chat Bubble (With "..." Inside)
|
||||||
|
Tabard = 8, // White Tabard
|
||||||
|
Battle = 9, // Two Crossed Swords
|
||||||
|
Dot = 10, // Yellow Dot/Point
|
||||||
|
Chat11 = 11, // White Chat Bubble
|
||||||
|
Chat12 = 12, // White Chat Bubble
|
||||||
|
Chat13 = 13, // White Chat Bubble
|
||||||
|
Unk14 = 14, // Invalid - Do Not Use
|
||||||
|
Unk15 = 15, // Invalid - Do Not Use
|
||||||
|
Chat16 = 16, // White Chat Bubble
|
||||||
|
Chat17 = 17, // White Chat Bubble
|
||||||
|
Chat18 = 18, // White Chat Bubble
|
||||||
|
Chat19 = 19, // White Chat Bubble
|
||||||
|
Chat20 = 20, // White Chat Bubble
|
||||||
|
Chat21 = 21, // transmogrifier?
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct eTradeskill
|
||||||
|
{
|
||||||
|
// Skill Defines
|
||||||
|
public const uint TradeskillAlchemy = 1;
|
||||||
|
public const uint TradeskillBlacksmithing = 2;
|
||||||
|
public const uint TradeskillCooking = 3;
|
||||||
|
public const uint TradeskillEnchanting = 4;
|
||||||
|
public const uint TradeskillEngineering = 5;
|
||||||
|
public const uint TradeskillFirstaid = 6;
|
||||||
|
public const uint TradeskillHerbalism = 7;
|
||||||
|
public const uint TradeskillLeatherworking = 8;
|
||||||
|
public const uint TradeskillPoisons = 9;
|
||||||
|
public const uint TradeskillTailoring = 10;
|
||||||
|
public const uint TradeskillMining = 11;
|
||||||
|
public const uint TradeskillFishing = 12;
|
||||||
|
public const uint TradeskillSkinning = 13;
|
||||||
|
public const uint TradeskillJewlcrafting = 14;
|
||||||
|
public const uint TradeskillInscription = 15;
|
||||||
|
|
||||||
|
public const uint TradeskillLevelNone = 0;
|
||||||
|
public const uint TradeskillLevelApprentice = 1;
|
||||||
|
public const uint TradeskillLevelJourneyman = 2;
|
||||||
|
public const uint TradeskillLevelExpert = 3;
|
||||||
|
public const uint TradeskillLevelArtisan = 4;
|
||||||
|
public const uint TradeskillLevelMaster = 5;
|
||||||
|
public const uint TradeskillLevelGrandMaster = 6;
|
||||||
|
|
||||||
|
// Gossip Defines
|
||||||
|
public const uint GossipActionTrade = 1;
|
||||||
|
public const uint GossipActionTrain = 2;
|
||||||
|
public const uint GossipActionTaxi = 3;
|
||||||
|
public const uint GossipActionGuild = 4;
|
||||||
|
public const uint GossipActionBattle = 5;
|
||||||
|
public const uint GossipActionBank = 6;
|
||||||
|
public const uint GossipActionInn = 7;
|
||||||
|
public const uint GossipActionHeal = 8;
|
||||||
|
public const uint GossipActionTabard = 9;
|
||||||
|
public const uint GossipActionAuction = 10;
|
||||||
|
public const uint GossipActionInnInfo = 11;
|
||||||
|
public const uint GossipActionUnlearn = 12;
|
||||||
|
public const uint GossipActionInfoDef = 1000;
|
||||||
|
|
||||||
|
public const uint GossipSenderMain = 1;
|
||||||
|
public const uint GossipSenderInnInfo = 2;
|
||||||
|
public const uint GossipSenderInfo = 3;
|
||||||
|
public const uint GossipSenderSecProftrain = 4;
|
||||||
|
public const uint GossipSenderSecClasstrain = 5;
|
||||||
|
public const uint GossipSenderSecBattleinfo = 6;
|
||||||
|
public const uint GossipSenderSecBank = 7;
|
||||||
|
public const uint GossipSenderSecInn = 8;
|
||||||
|
public const uint GossipSenderSecMailbox = 9;
|
||||||
|
public const uint GossipSenderSecStablemaster = 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,166 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum RemoveMethod
|
||||||
|
{
|
||||||
|
Default = 0,
|
||||||
|
Kick = 1,
|
||||||
|
Leave = 2,
|
||||||
|
KickLFG = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GroupMemberOnlineStatus
|
||||||
|
{
|
||||||
|
Offline = 0x00,
|
||||||
|
Online = 0x01, // Lua_UnitIsConnected
|
||||||
|
PVP = 0x02, // Lua_UnitIsPVP
|
||||||
|
Dead = 0x04, // Lua_UnitIsDead
|
||||||
|
Ghost = 0x08, // Lua_UnitIsGhost
|
||||||
|
PVPFFA = 0x10, // Lua_UnitIsPVPFreeForAll
|
||||||
|
Unk3 = 0x20, // used in calls from Lua_GetPlayerMapPosition/Lua_GetBattlefieldFlagPosition
|
||||||
|
AFK = 0x40, // Lua_UnitIsAFK
|
||||||
|
DND = 0x80, // Lua_UnitIsDND
|
||||||
|
RAF = 0x100,
|
||||||
|
Vehicle = 0x200, // Lua_UnitInVehicle
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GroupMemberFlags
|
||||||
|
{
|
||||||
|
Assistant = 0x01,
|
||||||
|
MainTank = 0x02,
|
||||||
|
MainAssist = 0x04
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GroupMemberAssignment
|
||||||
|
{
|
||||||
|
MainTank = 0,
|
||||||
|
MainAssist = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GroupType
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Normal = 1,
|
||||||
|
WorldPvp = 4,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GroupFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
FakeRaid = 0x01,
|
||||||
|
Raid = 0x02,
|
||||||
|
LfgRestricted = 0x04, // Script_HasLFGRestrictions()
|
||||||
|
Lfg = 0x08,
|
||||||
|
Destroyed = 0x10,
|
||||||
|
OnePersonParty = 0x020, // Script_IsOnePersonParty()
|
||||||
|
EveryoneAssistant = 0x040, // Script_IsEveryoneAssistant()
|
||||||
|
GuildGroup = 0x100,
|
||||||
|
|
||||||
|
MaskBgRaid = FakeRaid | Raid
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GroupUpdateFlags
|
||||||
|
{
|
||||||
|
None = 0x00, // nothing
|
||||||
|
Unk704 = 0x01, // Uint8[2] (Unk)
|
||||||
|
Status = 0x02, // public ushort (Groupmemberstatusflag)
|
||||||
|
PowerType = 0x04, // Uint8 (Powertype)
|
||||||
|
Unk322 = 0x08, // public ushort (Unk)
|
||||||
|
CurHp = 0x10, // Uint32 (Hp)
|
||||||
|
MaxHp = 0x20, // Uint32 (Max Hp)
|
||||||
|
CurPower = 0x40, // Int16 (Power Value)
|
||||||
|
MaxPower = 0x80, // Int16 (Max Power Value)
|
||||||
|
Level = 0x100, // public ushort (Level Value)
|
||||||
|
Unk200000 = 0x200, // Int16 (Unk)
|
||||||
|
Zone = 0x400, // public ushort (Zone Id)
|
||||||
|
Unk2000000 = 0x800, // Int16 (Unk)
|
||||||
|
Unk4000000 = 0x1000, // Int32 (Unk)
|
||||||
|
Position = 0x2000, // public ushort (X), public ushort (Y), public ushort (Z)
|
||||||
|
VehicleSeat = 0x4000, // Int32 (Vehicle Seat Id)
|
||||||
|
Auras = 0x8000, // Uint8 (Unk), Uint64 (Mask), Uint32 (Count), For Each Bit Set: Uint32 (Spell Id) + public ushort (Auraflags) (If Has Flags Scalable -> 3x Int32 (Bps))
|
||||||
|
Pet = 0x10000, // Complex (Pet)
|
||||||
|
Phase = 0x20000, // Int32 (Unk), Uint32 (Phase Count), For (Count) Uint16(Phaseid)
|
||||||
|
|
||||||
|
Full = Unk704 | Status | PowerType | Unk322 | CurHp | MaxHp |
|
||||||
|
CurPower | MaxPower | Level | Unk200000 | Zone | Unk2000000 |
|
||||||
|
Unk4000000 | Position | VehicleSeat | Auras | Pet | Phase // All Known Flags
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GroupUpdatePetFlags
|
||||||
|
{
|
||||||
|
None = 0x00000000, // nothing
|
||||||
|
GUID = 0x00000001, // ObjectGuid (pet guid)
|
||||||
|
Name = 0x00000002, // cstring (name, NULL terminated string)
|
||||||
|
ModelId = 0x00000004, // public ushort (model id)
|
||||||
|
CurHp = 0x00000008, // uint32 (HP)
|
||||||
|
MaxHp = 0x00000010, // uint32 (max HP)
|
||||||
|
Auras = 0x00000020, // [see GROUP_UPDATE_FLAG_AURAS]
|
||||||
|
|
||||||
|
Full = GUID | Name | ModelId | CurHp | MaxHp | Auras // all pet flags
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PartyResult
|
||||||
|
{
|
||||||
|
Ok = 0,
|
||||||
|
BadPlayerNameS = 1,
|
||||||
|
TargetNotInGroupS = 2,
|
||||||
|
TargetNotInInstanceS = 3,
|
||||||
|
GroupFull = 4,
|
||||||
|
AlreadyInGroupS = 5,
|
||||||
|
NotInGroup = 6,
|
||||||
|
NotLeader = 7,
|
||||||
|
PlayerWrongFaction = 8,
|
||||||
|
IgnoringYouS = 9,
|
||||||
|
LfgPending = 12,
|
||||||
|
InviteRestricted = 13,
|
||||||
|
GroupSwapFailed = 14, // If (Partyoperation == PartyOpSwap) GroupSwapFailed Else InviteInCombat
|
||||||
|
InviteUnknownRealm = 15,
|
||||||
|
InviteNoPartyServer = 16,
|
||||||
|
InvitePartyBusy = 17,
|
||||||
|
PartyTargetAmbiguous = 18,
|
||||||
|
PartyLfgInviteRaidLocked = 19,
|
||||||
|
PartyLfgBootLimit = 20,
|
||||||
|
PartyLfgBootCooldownS = 21,
|
||||||
|
PartyLfgBootInProgress = 22,
|
||||||
|
PartyLfgBootTooFewPlayers = 23,
|
||||||
|
PartyLfgBootNotEligibleS = 24,
|
||||||
|
RaidDisallowedByLevel = 25,
|
||||||
|
PartyLfgBootInCombat = 26,
|
||||||
|
VoteKickReasonNeeded = 27,
|
||||||
|
PartyLfgBootDungeonComplete = 28,
|
||||||
|
PartyLfgBootLootRolls = 29,
|
||||||
|
PartyLfgTeleportInCombat = 30
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PartyOperation
|
||||||
|
{
|
||||||
|
Invite = 0,
|
||||||
|
UnInvite = 1,
|
||||||
|
Leave = 2,
|
||||||
|
Swap = 4
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GroupCategory
|
||||||
|
{
|
||||||
|
Home = 0,
|
||||||
|
Instance = 1,
|
||||||
|
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,283 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public class GuildConst
|
||||||
|
{
|
||||||
|
public const int MaxBankTabs = 8;
|
||||||
|
public const int MaxBankSlots = 98;
|
||||||
|
public const int BankMoneyLogsTab = 100;
|
||||||
|
|
||||||
|
public const int WithdrawMoneyUnlimited = -1;
|
||||||
|
public const int WithdrawSlotUnlimited = -1;
|
||||||
|
public const uint EventLogGuidUndefined = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
public const uint ChallengesTypes = 6;
|
||||||
|
public const uint CharterItemId = 5863;
|
||||||
|
|
||||||
|
public const int RankNone = 0xFF;
|
||||||
|
public const int MinRanks = 5;
|
||||||
|
public const int MaxRanks = 10;
|
||||||
|
|
||||||
|
public const int BankLogMaxRecords = 25;
|
||||||
|
public const int EventLogMaxRecords = 100;
|
||||||
|
public const int NewsLogMaxRecords = 250;
|
||||||
|
|
||||||
|
public static int[] ChallengeGoldReward = { 0, 250, 1000, 500, 250, 500 };
|
||||||
|
public static int[] ChallengeMaxLevelGoldReward = { 0, 125, 500, 250, 125, 250 };
|
||||||
|
public static int[] ChallengesMaxCount = { 0, 7, 1, 3, 0, 3 };
|
||||||
|
|
||||||
|
public static uint MinNewsItemLevel = 353;
|
||||||
|
|
||||||
|
public static byte OldMaxLevel = 25;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GuildRankRights
|
||||||
|
{
|
||||||
|
None = 0x00000000,
|
||||||
|
GChatListen = 0x00000001,
|
||||||
|
GChatSpeak = 0x00000002,
|
||||||
|
OffChatListen = 0x00000004,
|
||||||
|
OffChatSpeak = 0x00000008,
|
||||||
|
Invite = 0x00000010,
|
||||||
|
Remove = 0x00000020,
|
||||||
|
Roster = 0x00000040,
|
||||||
|
Promote = 0x00000080,
|
||||||
|
Demote = 0x00000100,
|
||||||
|
Unk200 = 0x00000200,
|
||||||
|
Unk400 = 0x00000400,
|
||||||
|
Unk800 = 0x00000800,
|
||||||
|
SetMotd = 0x00001000,
|
||||||
|
EditPublicNote = 0x00002000,
|
||||||
|
ViewOffNote = 0x00004000,
|
||||||
|
EOffNote = 0x00008000,
|
||||||
|
ModifyGuildInfo = 0x00010000,
|
||||||
|
WithdrawGoldLock = 0x00020000, // remove money withdraw capacity
|
||||||
|
WithdrawRepair = 0x00040000, // withdraw for repair
|
||||||
|
WithdrawGold = 0x00080000, // withdraw gold
|
||||||
|
CreateGuildEvent = 0x00100000, // wotlk
|
||||||
|
All = 0x00DDFFBF
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct GuildDefaultRanks
|
||||||
|
{
|
||||||
|
public const int Master = 0;
|
||||||
|
public const int Officer = 1;
|
||||||
|
public const int Veteran = 2;
|
||||||
|
public const int Member = 3;
|
||||||
|
public const int Initiate = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GuildMemberFlags
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Online = 1,
|
||||||
|
AFK = 2,
|
||||||
|
DND = 3,
|
||||||
|
Mobile = 4
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GuildMemberData
|
||||||
|
{
|
||||||
|
ZoneId,
|
||||||
|
AchievementPoints,
|
||||||
|
Level,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GuildCommandType
|
||||||
|
{
|
||||||
|
CreateGuild = 0,
|
||||||
|
InvitePlayer = 1,
|
||||||
|
LeaveGuild = 3,
|
||||||
|
GetRoster = 5,
|
||||||
|
PromotePlayer = 6,
|
||||||
|
DemotePlayer = 7,
|
||||||
|
RemovePlayer = 8,
|
||||||
|
ChangeLeader = 10,
|
||||||
|
EditMOTD = 11,
|
||||||
|
GuildChat = 13,
|
||||||
|
Founder = 14,
|
||||||
|
ChangeRank = 16,
|
||||||
|
EditPublicNote = 19,
|
||||||
|
ViewTab = 21,
|
||||||
|
MoveItem = 22,
|
||||||
|
Repair = 25
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GuildCommandError
|
||||||
|
{
|
||||||
|
Success = 0,
|
||||||
|
GuildInternal = 1,
|
||||||
|
AlreadyInGuild = 2,
|
||||||
|
AlreadyInGuild_S = 3,
|
||||||
|
InvitedToGuild = 4,
|
||||||
|
AlreadyInvitedToGuild_S = 5,
|
||||||
|
NameInvalid = 6,
|
||||||
|
NameExists_S = 7,
|
||||||
|
LeaderLeave = 8,
|
||||||
|
Permissions = 8,
|
||||||
|
PlayerNotInGuild = 9,
|
||||||
|
PlayerNotInGuild_S = 10,
|
||||||
|
PlayerNotFound_S = 11,
|
||||||
|
NotAllied = 12,
|
||||||
|
RankTooHigh_S = 13,
|
||||||
|
RankTooLow_S = 14,
|
||||||
|
RanksLocked = 17,
|
||||||
|
RankInUse = 18,
|
||||||
|
IgnoringYou_S = 19,
|
||||||
|
Unk1 = 20,
|
||||||
|
WithdrawLimit = 25,
|
||||||
|
NotEnoughMoney = 26,
|
||||||
|
BankFull = 28,
|
||||||
|
ItemNotFound = 29,
|
||||||
|
TooMuchMoney = 31,
|
||||||
|
WrongTab = 32,
|
||||||
|
RequiresAuthenticator = 34,
|
||||||
|
BankVoucherFailed = 35,
|
||||||
|
TrialAccount = 36,
|
||||||
|
UndeletableDueToLevel = 37,
|
||||||
|
MoveStarting = 38,
|
||||||
|
RepTooLow = 39
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GuildEventLogTypes
|
||||||
|
{
|
||||||
|
InvitePlayer = 1,
|
||||||
|
JoinGuild = 2,
|
||||||
|
PromotePlayer = 3,
|
||||||
|
DemotePlayer = 4,
|
||||||
|
UninvitePlayer = 5,
|
||||||
|
LeaveGuild = 6,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GuildBankEventLogTypes
|
||||||
|
{
|
||||||
|
DepositItem = 1,
|
||||||
|
WithdrawItem = 2,
|
||||||
|
MoveItem = 3,
|
||||||
|
DepositMoney = 4,
|
||||||
|
WithdrawMoney = 5,
|
||||||
|
RepairMoney = 6,
|
||||||
|
MoveItem2 = 7,
|
||||||
|
Unk1 = 8,
|
||||||
|
BuySlot = 9,
|
||||||
|
CashFlowDeposit = 10
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GuildEmblemError
|
||||||
|
{
|
||||||
|
Success = 0,
|
||||||
|
InvalidTabardColors = 1,
|
||||||
|
NoGuild = 2,
|
||||||
|
NotGuildMaster = 3,
|
||||||
|
NotEnoughMoney = 4,
|
||||||
|
InvalidVendor = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GuildBankRights : int
|
||||||
|
{
|
||||||
|
ViewTab = 0x01,
|
||||||
|
PutItem = 0x02,
|
||||||
|
UpdateText = 0x04,
|
||||||
|
|
||||||
|
DepositItem = ViewTab | PutItem,
|
||||||
|
Full = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GuildNews
|
||||||
|
{
|
||||||
|
Achievement = 0,
|
||||||
|
PlayerAchievement = 1,
|
||||||
|
DungeonEncounter = 2,
|
||||||
|
ItemLooted = 3,
|
||||||
|
ItemCrafted = 4,
|
||||||
|
ItemPurchased = 5,
|
||||||
|
LevelUp = 6,
|
||||||
|
Create = 7,
|
||||||
|
Event = 8
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PetitionTurns
|
||||||
|
{
|
||||||
|
Ok = 0,
|
||||||
|
AlreadyInGuild = 2,
|
||||||
|
NeedMoreSignatures = 4,
|
||||||
|
GuildPermissions = 11,
|
||||||
|
GuildNameInvalid = 12
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PetitionSigns
|
||||||
|
{
|
||||||
|
Ok = 0,
|
||||||
|
AlreadySigned = 1,
|
||||||
|
AlreadyInGuild = 2,
|
||||||
|
CantSignOwn = 3,
|
||||||
|
NotServer = 4,
|
||||||
|
Full = 5,
|
||||||
|
AlreadySignedOther = 6,
|
||||||
|
RestrictedAccount = 7
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CharterTypes
|
||||||
|
{
|
||||||
|
Guild = 4,
|
||||||
|
Arena2v2 = 2,
|
||||||
|
Arena3v3 = 3,
|
||||||
|
Arena5v5 = 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct CharterCosts
|
||||||
|
{
|
||||||
|
public const uint Guild = 1000;
|
||||||
|
public const uint Arena2v2 = 800000;
|
||||||
|
public const uint Arena3v3 = 1200000;
|
||||||
|
public const uint Arena5v5 = 2000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GuildFinderOptionsInterest
|
||||||
|
{
|
||||||
|
Questing = 0x01,
|
||||||
|
Dungeons = 0x02,
|
||||||
|
Raids = 0x04,
|
||||||
|
PVP = 0x08,
|
||||||
|
RolePlaying = 0x10,
|
||||||
|
All = Questing | Dungeons | Raids | PVP | RolePlaying
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GuildFinderOptionsAvailability
|
||||||
|
{
|
||||||
|
Weekdays = 0x1,
|
||||||
|
Weekends = 0x2,
|
||||||
|
Always = Weekdays | Weekends
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GuildFinderOptionsRoles
|
||||||
|
{
|
||||||
|
Tank = 0x1,
|
||||||
|
Healer = 0x2,
|
||||||
|
DPS = 0x4,
|
||||||
|
All = Tank | Healer | DPS
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GuildFinderOptionsLevel
|
||||||
|
{
|
||||||
|
Any = 0x1,
|
||||||
|
Max = 0x2,
|
||||||
|
All = Any | Max
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,179 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
[Flags]
|
||||||
|
public enum LfgRoles
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
Leader = 0x01,
|
||||||
|
Tank = 0x02,
|
||||||
|
Healer = 0x04,
|
||||||
|
Damage = 0x08
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LfgUpdateType
|
||||||
|
{
|
||||||
|
Default = 0, // Internal Use
|
||||||
|
LeaderUnk1 = 1, // Fixme: At Group Leave
|
||||||
|
RolecheckAborted = 4,
|
||||||
|
JoinQueue = 6,
|
||||||
|
RolecheckFailed = 7,
|
||||||
|
RemovedFromQueue = 8,
|
||||||
|
ProposalFailed = 9,
|
||||||
|
ProposalDeclined = 10,
|
||||||
|
GroupFound = 11,
|
||||||
|
AddedToQueue = 13,
|
||||||
|
ProposalBegin = 14,
|
||||||
|
UpdateStatus = 15,
|
||||||
|
GroupMemberOffline = 16,
|
||||||
|
GroupDisbandUnk16 = 17, // Fixme: Sometimes At Group Disband
|
||||||
|
JoinQueueInitial = 24,
|
||||||
|
DungeonFinished = 25,
|
||||||
|
PartyRoleNotAvailable = 43,
|
||||||
|
JoinLfgObjectFailed = 45,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LfgState
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
Rolecheck,
|
||||||
|
Queued,
|
||||||
|
Proposal,
|
||||||
|
//Boot,
|
||||||
|
Dungeon = 5,
|
||||||
|
FinishedDungeon,
|
||||||
|
Raidbrowser
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LfgLockStatusType
|
||||||
|
{
|
||||||
|
InsufficientExpansion = 1,
|
||||||
|
TooLowLevel = 2,
|
||||||
|
TooHighLevel = 3,
|
||||||
|
TooLowGearScore = 4,
|
||||||
|
TooHighGearScore = 5,
|
||||||
|
RaidLocked = 6,
|
||||||
|
AttunementTooLowLevel = 1001,
|
||||||
|
AttunementTooHighLevel = 1002,
|
||||||
|
QuestNotCompleted = 1022,
|
||||||
|
MissingItem = 1025,
|
||||||
|
NotInSeason = 1031,
|
||||||
|
MissingAchievement = 1034
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LfgOptions
|
||||||
|
{
|
||||||
|
EnableDungeonFinder = 0x01,
|
||||||
|
EnableRaidBrowser = 0x02,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LfgFlags
|
||||||
|
{
|
||||||
|
Unk1 = 0x1,
|
||||||
|
Unk2 = 0x2,
|
||||||
|
Seasonal = 0x4,
|
||||||
|
Unk3 = 0x8
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LfgType : byte
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Dungeon = 1,
|
||||||
|
Raid = 2,
|
||||||
|
Zone = 4,
|
||||||
|
Quest = 5,
|
||||||
|
RandomDungeon = 6
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LfgProposalState
|
||||||
|
{
|
||||||
|
Initiating = 0,
|
||||||
|
Failed = 1,
|
||||||
|
Success = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LfgTeleportResult
|
||||||
|
{
|
||||||
|
// 7 = "You Can'T Do That Right Now" | 5 = No Client Reaction
|
||||||
|
Ok = 0, // Internal Use
|
||||||
|
PlayerDead = 1,
|
||||||
|
Falling = 2,
|
||||||
|
InVehicle = 3,
|
||||||
|
Fatigue = 4,
|
||||||
|
InvalidLocation = 6,
|
||||||
|
Charming = 8 // Fixme - It Can Be 7 Or 8 (Need Proper Data)
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LfgJoinResult
|
||||||
|
{
|
||||||
|
// 3 = No Client Reaction | 18 = "Rolecheck Failed"
|
||||||
|
Ok = 0x00, // Joined (No Client Msg)
|
||||||
|
Failed = 0x1b, // Rolecheck Failed
|
||||||
|
Groupfull = 0x1c, // Your Group Is Full
|
||||||
|
InternalError = 0x1e, // Internal Lfg Error
|
||||||
|
NotMeetReqs = 0x1f, // You Do Not Meet The Requirements For The Chosen Dungeons
|
||||||
|
PartyNotMeetReqs = 6, // One Or More Party Members Do Not Meet The Requirements For The Chosen Dungeons
|
||||||
|
MixedRaidDungeon = 0x20, // You Cannot Mix Dungeons, Raids, And Random When Picking Dungeons
|
||||||
|
MultiRealm = 0x21, // The Dungeon You Chose Does Not Support Players From Multiple Realms
|
||||||
|
Disconnected = 0x22, // One Or More Party Members Are Pending Invites Or Disconnected
|
||||||
|
PartyInfoFailed = 0x23, // Could Not Retrieve Information About Some Party Members
|
||||||
|
DungeonInvalid = 0x24, // One Or More Dungeons Was Not Valid
|
||||||
|
Deserter = 0x25, // You Can Not Queue For Dungeons Until Your Deserter Debuff Wears Off
|
||||||
|
PartyDeserter = 0x26, // One Or More Party Members Has A Deserter Debuff
|
||||||
|
RandomCooldown = 0x27, // You Can Not Queue For Random Dungeons While On Random Dungeon Cooldown
|
||||||
|
PartyRandomCooldown = 0x28, // One Or More Party Members Are On Random Dungeon Cooldown
|
||||||
|
TooMuchMembers = 0x29, // You Can Not Enter Dungeons With More That 5 Party Members
|
||||||
|
UsingBgSystem = 0x2a, // You Can Not Use The Dungeon System While In Bg Or Arenas
|
||||||
|
RoleCheckFailed = 0x2b // Role Check Failed, Client Shows Special Error
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LfgRoleCheckState
|
||||||
|
{
|
||||||
|
Default = 0, // Internal Use = Not Initialized.
|
||||||
|
Finished = 1, // Role Check Finished
|
||||||
|
Initialiting = 2, // Role Check Begins
|
||||||
|
MissingRole = 3, // Someone Didn'T Selected A Role After 2 Mins
|
||||||
|
WrongRoles = 4, // Can'T Form A Group With That Role Selection
|
||||||
|
Aborted = 5, // Someone Leave The Group
|
||||||
|
NoRole = 6 // Someone Selected No Role
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LfgAnswer
|
||||||
|
{
|
||||||
|
Pending = -1,
|
||||||
|
Deny = 0,
|
||||||
|
Agree = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LfgCompatibility
|
||||||
|
{
|
||||||
|
Pending,
|
||||||
|
WrongGroupSize,
|
||||||
|
TooMuchPlayers,
|
||||||
|
MultipleLfgGroups,
|
||||||
|
HasIgnores,
|
||||||
|
NoRoles,
|
||||||
|
NoDungeons,
|
||||||
|
WithLessPlayers, // Values Under This = Not Compatible (Do Not Modify Order)
|
||||||
|
BadStates,
|
||||||
|
Match // Must Be The Last One
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum RollType
|
||||||
|
{
|
||||||
|
Pass = 0,
|
||||||
|
Need = 1,
|
||||||
|
Greed = 2,
|
||||||
|
Disenchant = 3,
|
||||||
|
NotEmitedYet = 4,
|
||||||
|
NotValid = 5,
|
||||||
|
|
||||||
|
MaxTypes = 4,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum RollMask
|
||||||
|
{
|
||||||
|
Pass = 0x01,
|
||||||
|
Need = 0x02,
|
||||||
|
Greed = 0x04,
|
||||||
|
Disenchant = 0x08,
|
||||||
|
|
||||||
|
AllNoDisenchant = 0x07,
|
||||||
|
AllMask = 0x0f
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LootMethod
|
||||||
|
{
|
||||||
|
FreeForAll = 0,
|
||||||
|
MasterLoot = 2,
|
||||||
|
GroupLoot = 3,
|
||||||
|
PersonalLoot = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LootModes
|
||||||
|
{
|
||||||
|
Default = 0x1,
|
||||||
|
HardMode1 = 0x2,
|
||||||
|
HardMode2 = 0x4,
|
||||||
|
HardMode3 = 0x8,
|
||||||
|
HardMode4 = 0x10,
|
||||||
|
JunkFish = 0x8000
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PermissionTypes
|
||||||
|
{
|
||||||
|
All = 0,
|
||||||
|
Group = 1,
|
||||||
|
Master = 2,
|
||||||
|
Restricted = 3,
|
||||||
|
Owner = 5,
|
||||||
|
None = 6
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LootType
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Corpse = 1,
|
||||||
|
Pickpocketing = 2,
|
||||||
|
Fishing = 3,
|
||||||
|
Disenchanting = 4,
|
||||||
|
// Ignored Always By Client
|
||||||
|
Skinning = 6,
|
||||||
|
Prospecting = 7,
|
||||||
|
Milling = 8,
|
||||||
|
|
||||||
|
Fishinghole = 20, // Unsupported By Client, Sending Fishing Instead
|
||||||
|
Insignia = 21, // Unsupported By Client, Sending Corpse Instead
|
||||||
|
FishingJunk = 22 // unsupported by client, sending LOOT_FISHING instead
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LootError
|
||||||
|
{
|
||||||
|
DidntKill = 0, // You don't have permission to loot that corpse.
|
||||||
|
TooFar = 4, // You are too far away to loot that corpse.
|
||||||
|
BadFacing = 5, // You must be facing the corpse to loot it.
|
||||||
|
Locked = 6, // Someone is already looting that corpse.
|
||||||
|
NotStanding = 8, // You need to be standing up to loot something!
|
||||||
|
Stunned = 9, // You can't loot anything while stunned!
|
||||||
|
PlayerNotFound = 10, // Player not found
|
||||||
|
PlayTimeExceeded = 11, // Maximum play time exceeded
|
||||||
|
MasterInvFull = 12, // That player's inventory is full
|
||||||
|
MasterUniqueItem = 13, // Player has too many of that item already
|
||||||
|
MasterOther = 14, // Can't assign item to that player
|
||||||
|
AlreadPickPocketed = 15, // Your target has already had its pockets picked
|
||||||
|
NotWhileShapeShifted = 16, // You can't do that while shapeshifted.
|
||||||
|
NoLoot = 17 // There is no loot.
|
||||||
|
}
|
||||||
|
|
||||||
|
// type of Loot Item in Loot View
|
||||||
|
public enum LootSlotType
|
||||||
|
{
|
||||||
|
AllowLoot = 0, // Player Can Loot The Item.
|
||||||
|
RollOngoing = 1, // Roll Is Ongoing. Player Cannot Loot.
|
||||||
|
Locked = 2, // Item Is Shown In Red. Player Cannot Loot.
|
||||||
|
Master = 3, // Item Can Only Be Distributed By Group Loot Master.
|
||||||
|
Owner = 4 // Ignore Binding Confirmation And Etc, For Single Player Looting
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum MailMessageType
|
||||||
|
{
|
||||||
|
Normal = 0,
|
||||||
|
Auction = 2,
|
||||||
|
Creature = 3,
|
||||||
|
Gameobject = 4,
|
||||||
|
Calendar = 5,
|
||||||
|
Blackmarket = 6
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MailCheckMask
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
Read = 0x01,
|
||||||
|
Returned = 0x02, /// This Mail Was Returned. Do Not Allow Returning Mail Back Again.
|
||||||
|
Copied = 0x04, /// This Mail Was Copied. Do Not Allow Making A Copy Of Items In Mail.
|
||||||
|
CodPayment = 0x08,
|
||||||
|
HasBody = 0x10 /// This Mail Has Body Text.
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MailStationery
|
||||||
|
{
|
||||||
|
Test = 1,
|
||||||
|
Default = 41,
|
||||||
|
Gm = 61,
|
||||||
|
Auction = 62,
|
||||||
|
Val = 64, // Valentine
|
||||||
|
Chr = 65, // Christmas
|
||||||
|
Orp = 67 // Orphan
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MailState
|
||||||
|
{
|
||||||
|
Unchanged = 1,
|
||||||
|
Changed = 2,
|
||||||
|
Deleted = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MailShowFlags
|
||||||
|
{
|
||||||
|
Unk0 = 0x0001,
|
||||||
|
Delete = 0x0002, // Forced Show Delete Button Instead Return Button
|
||||||
|
Auction = 0x0004, // From Old Comment
|
||||||
|
Unk2 = 0x0008, // Unknown, Cod Will Be Shown Even Without That Flag
|
||||||
|
Return = 0x0010
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MailResponseType
|
||||||
|
{
|
||||||
|
Send = 0,
|
||||||
|
MoneyTaken = 1,
|
||||||
|
ItemTaken = 2,
|
||||||
|
ReturnedToSender = 3,
|
||||||
|
Deleted = 4,
|
||||||
|
MadePermanent = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MailResponseResult
|
||||||
|
{
|
||||||
|
Ok = 0,
|
||||||
|
EquipError = 1,
|
||||||
|
CannotSendToSelf = 2,
|
||||||
|
NotEnoughMoney = 3,
|
||||||
|
RecipientNotFound = 4,
|
||||||
|
NotYourTeam = 5,
|
||||||
|
InternalError = 6,
|
||||||
|
DisabledForTrialAcc = 14,
|
||||||
|
RecipientCapReached = 15,
|
||||||
|
CantSendWrappedCod = 16,
|
||||||
|
MailAndChatSuspended = 17,
|
||||||
|
TooManyAttachments = 18,
|
||||||
|
MailAttachmentInvalid = 19,
|
||||||
|
ItemHasExpired = 21
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public class MapConst
|
||||||
|
{
|
||||||
|
//Grids
|
||||||
|
public const int MaxGrids = 64;
|
||||||
|
public const float SizeofGrids = 533.33333f;
|
||||||
|
public const float CenterGridCellId = (MaxCells * MaxGrids / 2);
|
||||||
|
public const float CenterGridId = (MaxGrids / 2);
|
||||||
|
public const float CenterGridOffset = (SizeofGrids / 2);
|
||||||
|
public const float CenterGridCellOffset = (SizeofCells / 2);
|
||||||
|
|
||||||
|
//Cells
|
||||||
|
public const int MaxCells = 8;
|
||||||
|
public const float SizeofCells = (SizeofGrids / MaxCells);
|
||||||
|
public const int TotalCellsPerMap = (MaxGrids * MaxCells);
|
||||||
|
public const float MapSize = (SizeofGrids * MaxGrids);
|
||||||
|
public const float MapHalfSize = (MapSize / 2);
|
||||||
|
|
||||||
|
public const uint MaxGroupSize = 5;
|
||||||
|
public const uint MaxRaidSize = 40;
|
||||||
|
public const uint MaxRaidSubGroups = MaxRaidSize / MaxGroupSize;
|
||||||
|
public const uint TargetIconsCount = 8;
|
||||||
|
public const uint RaidMarkersCount = 8;
|
||||||
|
public const uint ReadycheckDuration = 35000;
|
||||||
|
|
||||||
|
//Liquid
|
||||||
|
public const int MapLiquidTypeNoWater = 0x00;
|
||||||
|
public const int MapLiquidTypeWater = 0x01;
|
||||||
|
public const int MapLiquidTypeOcean = 0x02;
|
||||||
|
public const int MapLiquidTypeMagma = 0x04;
|
||||||
|
public const int MapLiquidTypeSlime = 0x08;
|
||||||
|
public const int MapLiquidTypeDarkWater = 0x10;
|
||||||
|
public const int MapLiquidTypeWMOWater = 0x20;
|
||||||
|
public const int MapAllLiquidTypes = (MapLiquidTypeWater | MapLiquidTypeOcean | MapLiquidTypeMagma | MapLiquidTypeSlime);
|
||||||
|
public const float LiquidTileSize = (533.333f / 128.0f);
|
||||||
|
|
||||||
|
public const int MinMapUpdateDelay = 50;
|
||||||
|
public const int MinGridDelay = (Time.Minute * Time.InMilliseconds);
|
||||||
|
|
||||||
|
public const int MapResolution = 128;
|
||||||
|
public const float DefaultHeightSearch = 50.0f;
|
||||||
|
public const float InvalidHeight = -100000.0f;
|
||||||
|
public const float MaxHeight = 100000.0f;
|
||||||
|
public const float MaxFallDistance = 250000.0f;
|
||||||
|
|
||||||
|
public const string MapMagic = "MAPS";
|
||||||
|
public const string MapVersionMagic = "v1.8";
|
||||||
|
public const string MapAreaMagic = "AREA";
|
||||||
|
public const string MapHeightMagic = "MHGT";
|
||||||
|
public const string MapLiquidMagic = "MLIQ";
|
||||||
|
|
||||||
|
public const string mmapMagic = "MMAP";
|
||||||
|
public const int mmapVersion = 8;
|
||||||
|
|
||||||
|
public const string VMapMagic = "VMAP_4.5";
|
||||||
|
public const float VMAPInvalidHeightValue = -200000.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum NewWorldReason
|
||||||
|
{
|
||||||
|
Normal = 16, // Normal map change
|
||||||
|
Seamless = 21, // Teleport to another map without a loading screen, used for outdoor scenarios
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum InstanceResetWarningType
|
||||||
|
{
|
||||||
|
WarningHours = 1, // WARNING! %s is scheduled to reset in %d hour(s).
|
||||||
|
WarningMin = 2, // WARNING! %s is scheduled to reset in %d minute(s)!
|
||||||
|
WarningMinSoon = 3, // WARNING! %s is scheduled to reset in %d minute(s). Please exit the zone or you will be returned to your bind location!
|
||||||
|
Welcome = 4, // Welcome to %s. This raid instance is scheduled to reset in %s.
|
||||||
|
Expired = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum InstanceResetMethod
|
||||||
|
{
|
||||||
|
All,
|
||||||
|
ChangeDifficulty,
|
||||||
|
Global,
|
||||||
|
GroupDisband,
|
||||||
|
GroupJoin,
|
||||||
|
RespawnDelay
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GridMapTypeMask
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
Corpse = 0x01,
|
||||||
|
Creature = 0x02,
|
||||||
|
DynamicObject = 0x04,
|
||||||
|
GameObject = 0x08,
|
||||||
|
Player = 0x10,
|
||||||
|
AreaTrigger = 0x20,
|
||||||
|
Conversation = 0x40,
|
||||||
|
All = 0x7F,
|
||||||
|
|
||||||
|
//GameObjects, Creatures(except pets), DynamicObject, Corpse(Bones), AreaTrigger
|
||||||
|
AllGrid = GameObject | Creature | DynamicObject | Corpse | AreaTrigger | Conversation,
|
||||||
|
|
||||||
|
//Player, Pets, Corpse(resurrectable), DynamicObject(farsight)
|
||||||
|
AllWorld = Player | Creature | Corpse | DynamicObject
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ZLiquidStatus
|
||||||
|
{
|
||||||
|
NoWater = 0x00,
|
||||||
|
AboveWater = 0x01,
|
||||||
|
WaterWalk = 0x02,
|
||||||
|
InWater = 0x04,
|
||||||
|
UnderWater = 0x08
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum EncounterFrameType
|
||||||
|
{
|
||||||
|
SetCombatResLimit = 0,
|
||||||
|
ResetCombatResLimit = 1,
|
||||||
|
Engage = 2,
|
||||||
|
Disengage = 3,
|
||||||
|
UpdatePriority = 4,
|
||||||
|
AddTimer = 5,
|
||||||
|
EnableObjective = 6,
|
||||||
|
UpdateObjective = 7,
|
||||||
|
DisableObjective = 8,
|
||||||
|
Unk7 = 9, // Seems To Have Something To Do With Sorting The Encounter Units
|
||||||
|
AddCombatResLimit = 10
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum EncounterState
|
||||||
|
{
|
||||||
|
NotStarted = 0,
|
||||||
|
InProgress = 1,
|
||||||
|
Fail = 2,
|
||||||
|
Done = 3,
|
||||||
|
Special = 4,
|
||||||
|
ToBeDecided = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum EncounterCreditType
|
||||||
|
{
|
||||||
|
KillCreature = 0,
|
||||||
|
CastSpell = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum DoorType
|
||||||
|
{
|
||||||
|
Room = 0, // Door can open if encounter is not in progress
|
||||||
|
Passage = 1, // Door can open if encounter is done
|
||||||
|
SpawnHole = 2, // Door can open if encounter is in progress, typically used for spawning places
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum EnterState
|
||||||
|
{
|
||||||
|
CanEnter = 0,
|
||||||
|
CannotEnterAlreadyInMap = 1, // Player Is Already In The Map
|
||||||
|
CannotEnterNoEntry, // No Map Entry Was Found For The Target Map Id
|
||||||
|
CannotEnterUninstancedDungeon, // No Instance Template Was Found For Dungeon Map
|
||||||
|
CannotEnterDifficultyUnavailable, // Requested Instance Difficulty Is Not Available For Target Map
|
||||||
|
CannotEnterNotInRaid, // Target Instance Is A Raid Instance And The Player Is Not In A Raid Group
|
||||||
|
CannotEnterCorpseInDifferentInstance, // Player Is Dead And Their Corpse Is Not In Target Instance
|
||||||
|
CannotEnterInstanceBindMismatch, // Player'S Permanent Instance Save Is Not Compatible With Their Group'S Current Instance Bind
|
||||||
|
CannotEnterTooManyInstances, // Player Has Entered Too Many Instances Recently
|
||||||
|
CannotEnterMaxPlayers, // Target Map Already Has The Maximum Number Of Players Allowed
|
||||||
|
CannotEnterZoneInCombat, // A Boss Encounter Is Currently In Progress On The Target Map
|
||||||
|
CannotEnterUnspecifiedReason
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum MovementSlot
|
||||||
|
{
|
||||||
|
Idle,
|
||||||
|
Active,
|
||||||
|
Controlled,
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MovementGeneratorType
|
||||||
|
{
|
||||||
|
Idle = 0, // IdleMovement
|
||||||
|
Random = 1, // RandomMovement
|
||||||
|
Waypoint = 2, // WaypointMovement
|
||||||
|
|
||||||
|
MaxDB = 3, // *** this and below motion types can't be set in DB.
|
||||||
|
AnimalRandom = MaxDB, // AnimalRandomMovementGenerator.h
|
||||||
|
Confused = 4, // ConfusedMovementGenerator.h
|
||||||
|
Chase = 5, // TargetedMovementGenerator.h
|
||||||
|
Home = 6, // HomeMovementGenerator.h
|
||||||
|
Flight = 7, // WaypointMovementGenerator.h
|
||||||
|
Point = 8, // PointMovementGenerator.h
|
||||||
|
Fleeing = 9, // FleeingMovementGenerator.h
|
||||||
|
Distract = 10, // IdleMovementGenerator.h
|
||||||
|
Assistance = 11, // PointMovementGenerator.h (first part of flee for assistance)
|
||||||
|
AssistanceDistract = 12, // IdleMovementGenerator.h (second part of flee for assistance)
|
||||||
|
TimedFleeing = 13, // FleeingMovementGenerator.h (alt.second part of flee for assistance)
|
||||||
|
Follow = 14,
|
||||||
|
Rotate = 15,
|
||||||
|
Effect = 16,
|
||||||
|
Null = 17,
|
||||||
|
SplineChain = 18,
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct EventId
|
||||||
|
{
|
||||||
|
public const uint Charge = 1003;
|
||||||
|
public const uint Jump = 1004;
|
||||||
|
|
||||||
|
/// Special charge event which is used for charge spells that have explicit targets
|
||||||
|
/// and had a path already generated - using it in PointMovementGenerator will not
|
||||||
|
/// create a new spline and launch it
|
||||||
|
public const uint ChargePrepath = 1005;
|
||||||
|
public const uint SmartRandomPoint = 0xFFFFFE;
|
||||||
|
public const uint SmartEscortLastOCCPoint = 0xFFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum AnimType
|
||||||
|
{
|
||||||
|
ToGround = 0, // 460 = ToGround, index of AnimationData.dbc
|
||||||
|
FlyToFly = 1, // 461 = FlyToFly?
|
||||||
|
ToFly = 2, // 458 = ToFly
|
||||||
|
FlyToGround = 3 // 463 = FlyToGround
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum RotateDirection
|
||||||
|
{
|
||||||
|
Left,
|
||||||
|
Right
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum UpdateCollisionHeightReason
|
||||||
|
{
|
||||||
|
Scale = 0,
|
||||||
|
Mount = 1,
|
||||||
|
Force = 2
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
[Flags]
|
||||||
|
public enum MovementFlag
|
||||||
|
{
|
||||||
|
None = 0x0,
|
||||||
|
Forward = 0x1,
|
||||||
|
Backward = 0x2,
|
||||||
|
StrafeLeft = 0x4,
|
||||||
|
StrafeRight = 0x8,
|
||||||
|
Left = 0x10,
|
||||||
|
Right = 0x20,
|
||||||
|
PitchUp = 0x40,
|
||||||
|
PitchDown = 0x80,
|
||||||
|
Walking = 0x100,
|
||||||
|
DisableGravity = 0x200,
|
||||||
|
Root = 0x400,
|
||||||
|
Falling = 0x800,
|
||||||
|
FallingFar = 0x1000,
|
||||||
|
PendingStop = 0x2000,
|
||||||
|
PendingStrafeStop = 0x4000,
|
||||||
|
PendingForward = 0x8000,
|
||||||
|
PendingBackward = 0x10000,
|
||||||
|
PendingStrafeLeft = 0x20000,
|
||||||
|
PendingStrafeRight = 0x40000,
|
||||||
|
PendingRoot = 0x80000,
|
||||||
|
Swimming = 0x100000,
|
||||||
|
Ascending = 0x200000,
|
||||||
|
Descending = 0x400000,
|
||||||
|
CanFly = 0x800000,
|
||||||
|
Flying = 0x1000000,
|
||||||
|
SplineElevation = 0x2000000,
|
||||||
|
WaterWalk = 0x4000000,
|
||||||
|
FallingSlow = 0x8000000,
|
||||||
|
Hover = 0x10000000,
|
||||||
|
DisableCollision = 0x20000000,
|
||||||
|
|
||||||
|
MaskMoving = Forward | Backward | StrafeLeft | StrafeRight | Falling | Ascending | Descending,
|
||||||
|
|
||||||
|
MaskTurning = Left | Right | PitchUp | PitchDown,
|
||||||
|
|
||||||
|
MaskMovingFly = Flying | Ascending | Descending,
|
||||||
|
|
||||||
|
MaskCreatureAllowed = Forward | DisableGravity | Root | Swimming |
|
||||||
|
CanFly | WaterWalk | FallingSlow | Hover | DisableCollision,
|
||||||
|
|
||||||
|
MaskPlayerOnly = Flying,
|
||||||
|
|
||||||
|
MaskHasPlayerStatusOpcode = DisableGravity | Root | CanFly | WaterWalk |
|
||||||
|
FallingSlow | Hover | DisableCollision
|
||||||
|
}
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
public enum MovementFlag2
|
||||||
|
{
|
||||||
|
None = 0x0,
|
||||||
|
NoStrafe = 0x1,
|
||||||
|
NoJumping = 0x2,
|
||||||
|
FullSpeedTurning = 0x4,
|
||||||
|
FullSpeedPitching = 0x8,
|
||||||
|
AlwaysAllowPitching = 0x10,
|
||||||
|
IsVehicleExitVoluntary = 0x20,
|
||||||
|
JumpSplineInAir = 0x40,
|
||||||
|
AnimTierInTrans = 0x80,
|
||||||
|
WaterwalkingFullPitch = 0x100, // will always waterwalk, even if facing the camera directly down
|
||||||
|
VehiclePassengerIsTransitionAllowed = 0x200,
|
||||||
|
CanSwimToFlyTrans = 0x400,
|
||||||
|
Unk11 = 0x800, // terrain normal calculation is disabled if this flag is not present, client automatically handles setting this flag
|
||||||
|
CanTurnWhileFalling = 0x1000,
|
||||||
|
Unk13 = 0x2000, // will always waterwalk, even if facing the camera directly down
|
||||||
|
IgnoreMovementForces = 0x4000,
|
||||||
|
Unk15 = 0x8000,
|
||||||
|
CanDoubleJump = 0x10000,
|
||||||
|
DoubleJump = 0x20000,
|
||||||
|
// these flags cannot be sent (18 bits in packet)
|
||||||
|
Unk18 = 0x40000,
|
||||||
|
Unk19 = 0x80000,
|
||||||
|
InterpolatedMovement = 0x100000,
|
||||||
|
InterpolatedTurning = 0x200000,
|
||||||
|
InterpolatedPitching = 0x400000
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum MonsterMoveType
|
||||||
|
{
|
||||||
|
Normal = 0,
|
||||||
|
FacingSpot = 1,
|
||||||
|
FacingTarget = 2,
|
||||||
|
FacingAngle = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
public enum SplineFlag : uint
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
// x00-x07 used as animation Ids storage in pair with Animation flag
|
||||||
|
Unknown0 = 0x00000008, // NOT VERIFIED - does someting related to falling/fixed orientation
|
||||||
|
FallingSlow = 0x00000010,
|
||||||
|
Done = 0x00000020,
|
||||||
|
Falling = 0x00000040, // Affects elevation computation, can't be combined with Parabolic flag
|
||||||
|
NoSpline = 0x00000080,
|
||||||
|
Unknown1 = 0x00000100, // NOT VERIFIED
|
||||||
|
Flying = 0x00000200, // Smooth movement(Catmullrom interpolation mode), flying animation
|
||||||
|
OrientationFixed = 0x00000400, // Model orientation fixed
|
||||||
|
Catmullrom = 0x00000800, // Used Catmullrom interpolation mode
|
||||||
|
Cyclic = 0x00001000, // Movement by cycled spline
|
||||||
|
EnterCycle = 0x00002000, // Everytimes appears with cyclic flag in monster move packet, erases first spline vertex after first cycle done
|
||||||
|
Frozen = 0x00004000, // Will never arrive
|
||||||
|
TransportEnter = 0x00008000,
|
||||||
|
TransportExit = 0x00010000,
|
||||||
|
Unknown2 = 0x00020000, // NOT VERIFIED
|
||||||
|
Unknown3 = 0x00040000, // NOT VERIFIED
|
||||||
|
Backward = 0x00080000,
|
||||||
|
SmoothGroundPath = 0x00100000,
|
||||||
|
CanSwim = 0x00200000,
|
||||||
|
UncompressedPath = 0x00400000,
|
||||||
|
Unknown4 = 0x00800000, // NOT VERIFIED
|
||||||
|
Unknown5 = 0x01000000, // NOT VERIFIED
|
||||||
|
Animation = 0x02000000, // Plays animation after some time passed
|
||||||
|
Parabolic = 0x04000000, // Affects elevation computation, can't be combined with Falling flag
|
||||||
|
FadeObject = 0x08000000,
|
||||||
|
Steering = 0x10000000,
|
||||||
|
Unknown8 = 0x20000000, // NOT VERIFIED
|
||||||
|
Unknown9 = 0x40000000, // NOT VERIFIED
|
||||||
|
Unknown10 = 0x80000000, // NOT VERIFIED
|
||||||
|
|
||||||
|
// animation ids stored here, see AnimType enum, used with Animation flag
|
||||||
|
MaskAnimations = 0x7,
|
||||||
|
// flags that shouldn't be appended into SMSG_MONSTER_MOVE\SMSG_MONSTER_MOVE_TRANSPORT packet, should be more probably
|
||||||
|
MaskNoMonsterMove = MaskAnimations | Done,
|
||||||
|
// Unused, not suported flags
|
||||||
|
MaskUnused = NoSpline | EnterCycle | Frozen | Unknown0 | Unknown1 | Unknown2 | Unknown3 | Unknown4 | FadeObject | Steering | Unknown8 | Unknown9 | Unknown10
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
// Player state
|
||||||
|
public enum SessionStatus
|
||||||
|
{
|
||||||
|
Authed = 0, // Player authenticated (_player == NULL, m_playerRecentlyLogout = false or will be reset before handler call, m_GUID have garbage)
|
||||||
|
Loggedin, // Player in game (_player != NULL, m_GUID == _player->GetGUID(), inWorld())
|
||||||
|
Transfer, // Player transferring to another map (_player != NULL, m_GUID == _player->GetGUID(), !inWorld())
|
||||||
|
LoggedinOrRecentlyLogout, // _player != NULL or _player == NULL && m_playerRecentlyLogout && m_playerLogout, m_GUID store last _player guid)
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PacketProcessing
|
||||||
|
{
|
||||||
|
Inplace = 0, //process packet whenever we receive it - mostly for non-handled or non-implemented packets
|
||||||
|
ThreadUnsafe, //packet is not thread-safe - process it in World.UpdateSessions()
|
||||||
|
ThreadSafe //packet is thread-safe - process it in Map.Update()
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,229 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum TypeId
|
||||||
|
{
|
||||||
|
Object = 0,
|
||||||
|
Item = 1,
|
||||||
|
Container = 2,
|
||||||
|
Unit = 3,
|
||||||
|
Player = 4,
|
||||||
|
GameObject = 5,
|
||||||
|
DynamicObject = 6,
|
||||||
|
Corpse = 7,
|
||||||
|
AreaTrigger = 8,
|
||||||
|
SceneObject = 9,
|
||||||
|
Conversation = 10
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TypeMask
|
||||||
|
{
|
||||||
|
Object = 0x01,
|
||||||
|
Item = 0x02,
|
||||||
|
Container = Item | 0x04,
|
||||||
|
Unit = 0x08,
|
||||||
|
Player = 0x10,
|
||||||
|
GameObject = 0x20,
|
||||||
|
DynamicObject = 0x40,
|
||||||
|
Corpse = 0x80,
|
||||||
|
AreaTrigger = 0x100,
|
||||||
|
Sceneobject = 0x200,
|
||||||
|
Conversation = 0x400,
|
||||||
|
Seer = Player | Unit | DynamicObject
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum HighGuid
|
||||||
|
{
|
||||||
|
Null = 0,
|
||||||
|
Uniq = 1,
|
||||||
|
Player = 2,
|
||||||
|
Item = 3,
|
||||||
|
WorldTransaction = 4,
|
||||||
|
StaticDoor = 5, //NYI
|
||||||
|
Transport = 6,
|
||||||
|
Conversation = 7,
|
||||||
|
Creature = 8,
|
||||||
|
Vehicle = 9,
|
||||||
|
Pet = 10,
|
||||||
|
GameObject = 11,
|
||||||
|
DynamicObject = 12,
|
||||||
|
AreaTrigger = 13,
|
||||||
|
Corpse = 14,
|
||||||
|
LootObject = 15,
|
||||||
|
SceneObject = 16,
|
||||||
|
Scenario = 17,
|
||||||
|
AIGroup = 18,
|
||||||
|
DynamicDoor = 19,
|
||||||
|
ClientActor = 20, //NYI
|
||||||
|
Vignette = 21,
|
||||||
|
CallForHelp = 22,
|
||||||
|
AIResource = 23,
|
||||||
|
AILock = 24,
|
||||||
|
AILockTicket = 25,
|
||||||
|
ChatChannel = 26,
|
||||||
|
Party = 27,
|
||||||
|
Guild = 28,
|
||||||
|
WowAccount = 29,
|
||||||
|
BNetAccount = 30,
|
||||||
|
GMTask = 31,
|
||||||
|
MobileSession = 32, //NYI
|
||||||
|
RaidGroup = 33,
|
||||||
|
Spell = 34,
|
||||||
|
Mail = 35,
|
||||||
|
WebObj = 36, //NYI
|
||||||
|
LFGObject = 37, //NYI
|
||||||
|
LFGList = 38, //NYI
|
||||||
|
UserRouter = 39,
|
||||||
|
PVPQueueGroup = 40,
|
||||||
|
UserClient = 41,
|
||||||
|
PetBattle = 42, //NYI
|
||||||
|
UniqUserClient = 43,
|
||||||
|
BattlePet = 44,
|
||||||
|
CommerceObj = 45,
|
||||||
|
ClientSession = 46,
|
||||||
|
Cast = 47
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum NotifyFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
AIRelocation = 0x01,
|
||||||
|
VisibilityChanged = 0x02,
|
||||||
|
All = 0xFF
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TempSummonType
|
||||||
|
{
|
||||||
|
TimedOrDeadDespawn = 1, // despawns after a specified time OR when the creature disappears
|
||||||
|
TimedOrCorpseDespawn = 2, // despawns after a specified time OR when the creature dies
|
||||||
|
TimedDespawn = 3, // despawns after a specified time
|
||||||
|
TimedDespawnOOC = 4, // despawns after a specified time after the creature is out of combat
|
||||||
|
CorpseDespawn = 5, // despawns instantly after death
|
||||||
|
CorpseTimedDespawn = 6, // despawns after a specified time after death
|
||||||
|
DeadDespawn = 7, // despawns when the creature disappears
|
||||||
|
ManualDespawn = 8 // despawns when UnSummon() is called
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SummonCategory
|
||||||
|
{
|
||||||
|
Wild = 0,
|
||||||
|
Ally = 1,
|
||||||
|
Pet = 2,
|
||||||
|
Puppet = 3,
|
||||||
|
Vehicle = 4,
|
||||||
|
Unk = 5 // as of patch 3.3.5a only Bone Spike in Icecrown Citadel
|
||||||
|
// uses this category
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SummonType
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Pet = 1,
|
||||||
|
Guardian = 2,
|
||||||
|
Minion = 3,
|
||||||
|
Totem = 4,
|
||||||
|
Minipet = 5,
|
||||||
|
Guardian2 = 6,
|
||||||
|
Wild2 = 7,
|
||||||
|
Wild3 = 8, // Related to phases and DK prequest line (3.3.5a)
|
||||||
|
Vehicle = 9,
|
||||||
|
Vehicle2 = 10, // Oculus and Argent Tournament vehicles (3.3.5a)
|
||||||
|
LightWell = 11,
|
||||||
|
Jeeves = 12,
|
||||||
|
Unk13 = 13
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SummonerType
|
||||||
|
{
|
||||||
|
Creature = 0,
|
||||||
|
GameObject = 1,
|
||||||
|
Map = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GhostVisibilityType
|
||||||
|
{
|
||||||
|
Alive = 0x1,
|
||||||
|
Ghost = 0x2
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum StealthType
|
||||||
|
{
|
||||||
|
General = 0,
|
||||||
|
Trap = 1,
|
||||||
|
|
||||||
|
Max = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum InvisibilityType
|
||||||
|
{
|
||||||
|
General = 0,
|
||||||
|
Unk1 = 1,
|
||||||
|
Unk2 = 2,
|
||||||
|
Trap = 3,
|
||||||
|
Unk4 = 4,
|
||||||
|
Unk5 = 5,
|
||||||
|
Drunk = 6,
|
||||||
|
Unk7 = 7,
|
||||||
|
Unk8 = 8,
|
||||||
|
Unk9 = 9,
|
||||||
|
Unk10 = 10,
|
||||||
|
Unk11 = 11,
|
||||||
|
Unk12 = 12,
|
||||||
|
Unk13 = 13,
|
||||||
|
Unk14 = 14,
|
||||||
|
Unk15 = 15,
|
||||||
|
Unk16 = 16,
|
||||||
|
Unk17 = 17,
|
||||||
|
Unk18 = 18,
|
||||||
|
Unk19 = 19,
|
||||||
|
Unk20 = 20,
|
||||||
|
Unk21 = 21,
|
||||||
|
Unk22 = 22,
|
||||||
|
Unk23 = 23,
|
||||||
|
Unk24 = 24,
|
||||||
|
Unk25 = 25,
|
||||||
|
Unk26 = 26,
|
||||||
|
Unk27 = 27,
|
||||||
|
Unk28 = 28,
|
||||||
|
Unk29 = 29,
|
||||||
|
Unk30 = 30,
|
||||||
|
Unk31 = 31,
|
||||||
|
Unk32 = 32,
|
||||||
|
Unk33 = 33,
|
||||||
|
Unk34 = 34,
|
||||||
|
Unk35 = 35,
|
||||||
|
Unk36 = 36,
|
||||||
|
Unk37 = 37,
|
||||||
|
|
||||||
|
Max = 38
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ServerSideVisibilityType
|
||||||
|
{
|
||||||
|
GM = 0,
|
||||||
|
Ghost = 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SessionFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
FromRedirect = 0x01,
|
||||||
|
HasRedirected = 0x02
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum ObjectiveStates
|
||||||
|
{
|
||||||
|
Neutral = 0,
|
||||||
|
Alliance,
|
||||||
|
Horde,
|
||||||
|
NeutralAllianceChallenge,
|
||||||
|
NeutralHordeChallenge,
|
||||||
|
AllianceHordeChallenge,
|
||||||
|
HordeAllianceChallenge
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum OutdoorPvPTypes
|
||||||
|
{
|
||||||
|
HellfirePeninsula = 1,
|
||||||
|
Nagrand = 2,
|
||||||
|
TerokkarForest = 3,
|
||||||
|
Zangarmarsh = 4,
|
||||||
|
Silithus = 5,
|
||||||
|
Max = 6
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum CharmType
|
||||||
|
{
|
||||||
|
Charm,
|
||||||
|
Possess,
|
||||||
|
Vehicle,
|
||||||
|
Convert
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PetType
|
||||||
|
{
|
||||||
|
Summon = 0,
|
||||||
|
Hunter = 1,
|
||||||
|
Max = 4
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PetSaveMode
|
||||||
|
{
|
||||||
|
AsDeleted = -1, // not saved in fact
|
||||||
|
AsCurrent = 0, // in current slot (with player)
|
||||||
|
FirstStableSlot = 1,
|
||||||
|
LastStableSlot = 4, // last in DB stable slot index (including), all higher have same meaning as PET_SAVE_NOT_IN_SLOT
|
||||||
|
NotInSlot = 100 // for avoid conflict with stable size grow will use 100
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum HappinessState
|
||||||
|
{
|
||||||
|
UnHappy = 1,
|
||||||
|
Content = 2,
|
||||||
|
Happy = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PetSpellState
|
||||||
|
{
|
||||||
|
Unchanged = 0,
|
||||||
|
Changed = 1,
|
||||||
|
New = 2,
|
||||||
|
Removed = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PetSpellType
|
||||||
|
{
|
||||||
|
Normal = 0,
|
||||||
|
Family = 1,
|
||||||
|
Talent = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ActionFeedback
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
PetDead = 1,
|
||||||
|
NothingToAtt = 2,
|
||||||
|
CantAttTarget = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PetTalk
|
||||||
|
{
|
||||||
|
SpecialSpell = 0,
|
||||||
|
Attack = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CommandStates
|
||||||
|
{
|
||||||
|
Stay = 0,
|
||||||
|
Follow = 1,
|
||||||
|
Attack = 2,
|
||||||
|
Abandon = 3,
|
||||||
|
MoveTo = 4
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PetNameInvalidReason
|
||||||
|
{
|
||||||
|
// custom, not send
|
||||||
|
Success = 0,
|
||||||
|
|
||||||
|
Invalid = 1,
|
||||||
|
NoName = 2,
|
||||||
|
TooShort = 3,
|
||||||
|
TooLong = 4,
|
||||||
|
MixedLanguages = 6,
|
||||||
|
Profane = 7,
|
||||||
|
Reserved = 8,
|
||||||
|
ThreeConsecutive = 11,
|
||||||
|
InvalidSpace = 12,
|
||||||
|
ConsecutiveSpaces = 13,
|
||||||
|
RussianConsecutiveSilentCharacters = 14,
|
||||||
|
RussianSilentCharacterAtBeginningOrEnd = 15,
|
||||||
|
DeclensionDoesntMatchBaseName = 16
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PetStableinfo
|
||||||
|
{
|
||||||
|
Active = 1,
|
||||||
|
Inactive = 2
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,771 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public struct PlayerConst
|
||||||
|
{
|
||||||
|
public const int MaxTalentTiers = 7;
|
||||||
|
public const int MaxTalentColumns = 3;
|
||||||
|
public const int MaxTalentRank = 5;
|
||||||
|
public const int MinSpecializationLevel = 10;
|
||||||
|
public const int MaxSpecializations = 4;
|
||||||
|
public const int MaxMasterySpells = 2;
|
||||||
|
|
||||||
|
public const int ReqPrimaryTreeTalents = 31;
|
||||||
|
public const int ExploredZonesSize = 256;
|
||||||
|
public const long MaxMoneyAmount = long.MaxValue;
|
||||||
|
public const int MaxActionButtons = 132;
|
||||||
|
public const int MaxActionButtonActionValue = 0x00FFFFFF + 1;
|
||||||
|
|
||||||
|
public const uint KnowTitlesSize = 6;
|
||||||
|
public const uint MaxTitleIndex = KnowTitlesSize * 64;
|
||||||
|
|
||||||
|
public const int MaxDailyQuests = 25;
|
||||||
|
public const int QuestsCompletedBitsSize = 1750;
|
||||||
|
|
||||||
|
public static TimeSpan InfinityCooldownDelay = TimeSpan.FromSeconds(Time.Month); // used for set "infinity cooldowns" for spells and check
|
||||||
|
public const uint infinityCooldownDelayCheck = Time.Month / 2;
|
||||||
|
public const int MaxPlayerSummonDelay = 2 * Time.Minute;
|
||||||
|
|
||||||
|
public const int TaxiMaskSize = 243;
|
||||||
|
|
||||||
|
// corpse reclaim times
|
||||||
|
public const int DeathExpireStep = (5 * Time.Minute);
|
||||||
|
public const int MaxDeathCount = 3;
|
||||||
|
|
||||||
|
public const int MaxCUFProfiles = 5;
|
||||||
|
|
||||||
|
public static uint[] copseReclaimDelay = { 30, 60, 120 };
|
||||||
|
|
||||||
|
public const int MaxRunes = 7;
|
||||||
|
public const int MaxRechargingRunes = 3;
|
||||||
|
|
||||||
|
public static uint[] DefaultTalentRowLevels = { 15, 30, 45, 60, 75, 90, 100 };
|
||||||
|
public static uint[] DKTalentRowLevels = { 57, 58, 59, 60, 75, 90, 100 };
|
||||||
|
//public static uint[] DHTalentRowLevels = { 99, 100, 102, 104, 106, 108, 110 };
|
||||||
|
|
||||||
|
public const int CustomDisplaySize = 3;
|
||||||
|
|
||||||
|
public const int ArtifactsAllWeaponsGeneralWeaponEquippedPassive = 197886;
|
||||||
|
|
||||||
|
public const byte MaxHonorLevel = 50;
|
||||||
|
public const byte LevelMinHonor = 110;
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct MoneyConstants
|
||||||
|
{
|
||||||
|
public const int Copper = 1;
|
||||||
|
public const int Silver = Copper * 100;
|
||||||
|
public const int Gold = Silver * 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct PlayerFieldOffsets
|
||||||
|
{
|
||||||
|
public const byte BytesOffsetSkinId = 0;
|
||||||
|
public const byte BytesOffsetFaceId = 1;
|
||||||
|
public const byte BytesOffsetHairStyleId = 2;
|
||||||
|
public const byte BytesOffsetHairColorId = 3;
|
||||||
|
|
||||||
|
public const byte Bytes2OffsetCustomDisplayOption = 0; // 3 Bytes
|
||||||
|
public const byte Bytes2OffsetFacialStyle = 3;
|
||||||
|
|
||||||
|
public const byte Bytes3OffsetPartyType = 0;
|
||||||
|
public const byte Bytes3OffsetBankBagSlots = 1;
|
||||||
|
public const byte Bytes3OffsetGender = 2;
|
||||||
|
public const byte Bytes3OffsetInebriation = 3;
|
||||||
|
|
||||||
|
public const byte Bytes4OffsetPvpTitle = 0;
|
||||||
|
public const byte Bytes4OffsetArenaFaction = 1;
|
||||||
|
|
||||||
|
public const byte FieldBytesOffsetRafGrantableLevel = 0;
|
||||||
|
public const byte FieldBytesOffsetActionBarToggles = 1;
|
||||||
|
public const byte FieldBytesOffsetLifetimeMaxPvpRank = 2;
|
||||||
|
public const byte FieldBytesOffsetMaxArtifactPowerRanks = 3;
|
||||||
|
|
||||||
|
public const byte FieldBytes2OffsetIgnorePowerRegenPredictionMask = 0;
|
||||||
|
public const byte FieldBytes2OffsetAuraVision = 1;
|
||||||
|
|
||||||
|
public const byte FieldBytes3OffsetOverrideSpellsId = 2; // Uint16!
|
||||||
|
public const byte FieldBytes3OffsetOverrideSpellsIdUint16Offset = FieldBytes3OffsetOverrideSpellsId / 2;
|
||||||
|
|
||||||
|
public const byte FieldKillsOffsetTodayKills = 0;
|
||||||
|
public const byte FieldKillsOffsetYesterdayKills = 1;
|
||||||
|
|
||||||
|
public const byte RestStateXp = 0;
|
||||||
|
public const byte RestRestedXp = 1;
|
||||||
|
public const byte RestStateHonor = 2;
|
||||||
|
public const byte RestRestedHonor = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TradeSlots
|
||||||
|
{
|
||||||
|
Invalid = -1,
|
||||||
|
NonTraded = 6,
|
||||||
|
TradedCount = 6,
|
||||||
|
Count = 7
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Tutorials
|
||||||
|
{
|
||||||
|
Talent = 0,
|
||||||
|
Spec = 1,
|
||||||
|
Glyph = 2,
|
||||||
|
SpellBook = 3,
|
||||||
|
Professions = 4,
|
||||||
|
CoreAbilitites = 5,
|
||||||
|
PetJournal = 6,
|
||||||
|
WhatHasChanged = 7,
|
||||||
|
Max = 8
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TradeStatus
|
||||||
|
{
|
||||||
|
PlayerBusy = 0,
|
||||||
|
Proposed = 1,
|
||||||
|
Initiated = 2,
|
||||||
|
Cancelled = 3,
|
||||||
|
Accepted = 4,
|
||||||
|
AlreadyTrading = 5,
|
||||||
|
NoTarget = 6,
|
||||||
|
Unaccepted = 7,
|
||||||
|
Complete = 8,
|
||||||
|
StateChanged = 9,
|
||||||
|
TooFarAway = 10,
|
||||||
|
WrongFaction = 11,
|
||||||
|
Failed = 12,
|
||||||
|
Petition = 13,
|
||||||
|
PlayerIgnored = 14,
|
||||||
|
Stunned = 15,
|
||||||
|
TargetStunned = 16,
|
||||||
|
Dead = 17,
|
||||||
|
TargetDead = 18,
|
||||||
|
LoggingOut = 19,
|
||||||
|
TargetLoggingOut = 20,
|
||||||
|
RestrictedAccount = 21,
|
||||||
|
WrongRealm = 22,
|
||||||
|
NotOnTaplist = 23,
|
||||||
|
CurrencyNotTradable = 24,
|
||||||
|
NotEnoughCurrency = 25,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum RestFlag
|
||||||
|
{
|
||||||
|
Tavern = 0x01,
|
||||||
|
City = 0x02,
|
||||||
|
FactionArea = 0x04
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ChatFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
AFK = 0x01,
|
||||||
|
DND = 0x02,
|
||||||
|
GM = 0x04,
|
||||||
|
Com = 0x08, // Commentator
|
||||||
|
Dev = 0x10,
|
||||||
|
BossSound = 0x20, // Plays "RaidBossEmoteWarning" sound on raid boss emote/whisper
|
||||||
|
Mobile = 0x40
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum DrunkenState
|
||||||
|
{
|
||||||
|
Sober = 0,
|
||||||
|
Tipsy = 1,
|
||||||
|
Drunk = 2,
|
||||||
|
Smashed = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TalentSpecialization // talent tabs
|
||||||
|
{
|
||||||
|
MageArcane = 62,
|
||||||
|
MageFire = 63,
|
||||||
|
MageFrost = 64,
|
||||||
|
PaladinHoly = 65,
|
||||||
|
PaladinProtection = 66,
|
||||||
|
PaladinRetribution = 70,
|
||||||
|
WarriorArms = 71,
|
||||||
|
WarriorFury = 72,
|
||||||
|
WarriorProtection = 73,
|
||||||
|
DruidBalance = 102,
|
||||||
|
DruidFeralCombat = 103,
|
||||||
|
DruidRestoration = 104,
|
||||||
|
DeathKnightBlood = 250,
|
||||||
|
DeathKnightFrost = 251,
|
||||||
|
DeathKnightUnholy = 252,
|
||||||
|
HunterBeastMastery = 253,
|
||||||
|
HunterMarksman = 254,
|
||||||
|
HunterSurvival = 255,
|
||||||
|
PriestDiscipline = 256,
|
||||||
|
PriestHoly = 257,
|
||||||
|
PriestShadow = 258,
|
||||||
|
RogueAssassination = 259,
|
||||||
|
RogueCombat = 260,
|
||||||
|
RogueSubtlety = 261,
|
||||||
|
ShamanElemental = 262,
|
||||||
|
ShamanEnhancement = 263,
|
||||||
|
ShamanRestoration = 264,
|
||||||
|
WarlockAffliction = 265,
|
||||||
|
WarlockDemonology = 266,
|
||||||
|
WarlockDestruction = 267,
|
||||||
|
MonkBrewmaster = 268,
|
||||||
|
MonkBattledancer = 269,
|
||||||
|
MonkMistweaver = 270,
|
||||||
|
DemonHunterHavoc = 577,
|
||||||
|
DemonHunterVengeance = 581
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SpecResetType
|
||||||
|
{
|
||||||
|
Talents = 0,
|
||||||
|
Specialization = 1,
|
||||||
|
Glyphs = 2,
|
||||||
|
PetTalents = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MirrorTimerType
|
||||||
|
{
|
||||||
|
Disabled = -1,
|
||||||
|
Fatigue = 0,
|
||||||
|
Breath = 1,
|
||||||
|
Fire = 2, // feign death
|
||||||
|
Max = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TransferAbortReason
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Error = 1,
|
||||||
|
MaxPlayers = 2, // Transfer ed: Instance Is Full
|
||||||
|
NotFound = 3, // Transfer ed: Instance Not Found
|
||||||
|
TooManyInstances = 4, // You Have Entered Too Many Instances Recently.
|
||||||
|
ZoneInCombat = 6, // Unable To Zone In While An Encounter Is In Progress.
|
||||||
|
InsufExpanLvl = 7, // You Must Have <Tbc, Wotlk> Expansion Installed To Access This Area.
|
||||||
|
Difficulty = 8, // <Normal, Heroic, Epic> Difficulty Mode Is Not Available For %S.
|
||||||
|
UniqueMessage = 9, // Until You'Ve Escaped Tlk'S Grasp, You Cannot Leave This Place!
|
||||||
|
TooManyRealmInstances = 10, // Additional Instances Cannot Be Launched, Please Try Again Later.
|
||||||
|
NeedGroup = 11, // Transfer ed: You Must Be In A Raid Group To Enter This Instance
|
||||||
|
NotFound2 = 12, // Transfer ed: Instance Not Found
|
||||||
|
NotFound3 = 13, // Transfer ed: Instance Not Found
|
||||||
|
NotFound4 = 14, // Transfer ed: Instance Not Found
|
||||||
|
RealmOnly = 15, // All Players In The Party Must Be From The Same Realm To Enter %S.
|
||||||
|
MapNotAllowed = 16, // Map Cannot Be Entered At This Time.
|
||||||
|
LockedToDifferentInstance = 18, // You Are Already Locked To %S
|
||||||
|
AlreadyCompletedEncounter = 19, // You Are Ineligible To Participate In At Least One Encounter In This Instance Because You Are Already Locked To An Instance In Which It Has Been Defeated.
|
||||||
|
DifficultyNotFound = 22, // Client Writes To Console "Unable To Resolve Requested Difficultyid %U To Actual Difficulty For Map %D"
|
||||||
|
XrealmZoneDown = 24, // Transfer ed: Cross-Realm Zone Is Down
|
||||||
|
SoloPlayerSwitchDifficulty = 26, // This Instance Is Already In Progress. You May Only Switch Difficulties From Inside The Instance.
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum RaidGroupReason
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Lowlevel = 1, // "You are too low level to enter this instance."
|
||||||
|
Only = 2, // "You must be in a raid group to enter this instance."
|
||||||
|
Full = 3, // "The instance is full."
|
||||||
|
RequirementsUnmatch = 4 // "You do not meet the requirements to enter this instance."
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ResetFailedReason
|
||||||
|
{
|
||||||
|
Failed = 0, // "Cannot reset %s. There are players still inside the instance."
|
||||||
|
Zoning = 1, // "Cannot reset %s. There are players in your party attempting to zone into an instance."
|
||||||
|
Offline = 2 // "Cannot reset %s. There are players offline in your party."
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ActivateTaxiReply
|
||||||
|
{
|
||||||
|
Ok = 0,
|
||||||
|
UnspecifiedServerError = 1,
|
||||||
|
NoSuchPath = 2,
|
||||||
|
NotEnoughMoney = 3,
|
||||||
|
TooFarAway = 4,
|
||||||
|
NoVendorNearby = 5,
|
||||||
|
NotVisited = 6,
|
||||||
|
PlayerBusy = 7,
|
||||||
|
PlayerAlreadyMounted = 8,
|
||||||
|
PlayerShapeshifted = 9,
|
||||||
|
PlayerMoving = 10,
|
||||||
|
SameNode = 11,
|
||||||
|
NotStanding = 12,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TaxiNodeStatus
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Learned = 1,
|
||||||
|
Unlearned = 2,
|
||||||
|
NotEligible = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PlayerDelayedOperations
|
||||||
|
{
|
||||||
|
SavePlayer = 0x01,
|
||||||
|
ResurrectPlayer = 0x02,
|
||||||
|
SpellCastDeserter = 0x04,
|
||||||
|
BGMountRestore = 0x08, ///< Flag to restore mount state after teleport from BG
|
||||||
|
BGTaxiRestore = 0x10, ///< Flag to restore taxi state after teleport from BG
|
||||||
|
BGGroupRestore = 0x20, ///< Flag to restore group state after teleport from BG
|
||||||
|
End
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CorpseType
|
||||||
|
{
|
||||||
|
Bones = 0,
|
||||||
|
ResurrectablePVE = 1,
|
||||||
|
ResurrectablePVP = 2,
|
||||||
|
Max = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CorpseFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
Bones = 0x01,
|
||||||
|
Unk1 = 0x02,
|
||||||
|
PvP = 0x04,
|
||||||
|
HideHelm = 0x08,
|
||||||
|
HideCloak = 0x10,
|
||||||
|
Skinnable = 0x20,
|
||||||
|
FFAPvP = 0x40
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ActionButtonUpdateState
|
||||||
|
{
|
||||||
|
UnChanged = 0,
|
||||||
|
Changed = 1,
|
||||||
|
New = 2,
|
||||||
|
Deleted = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ActionButtonType
|
||||||
|
{
|
||||||
|
Spell = 0x00,
|
||||||
|
C = 0x01, // click?
|
||||||
|
Eqset = 0x20,
|
||||||
|
Dropdown = 0x30,
|
||||||
|
Macro = 0x40,
|
||||||
|
CMacro = C | Macro,
|
||||||
|
Mount = 0x60,
|
||||||
|
Item = 0x80
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TeleportToOptions
|
||||||
|
{
|
||||||
|
GMMode = 0x01,
|
||||||
|
NotLeaveTransport = 0x02,
|
||||||
|
NotLeaveCombat = 0x04,
|
||||||
|
NotUnSummonPet = 0x08,
|
||||||
|
Spell = 0x10,
|
||||||
|
Seamless = 0x20
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Type of environmental damages
|
||||||
|
public enum EnviromentalDamage
|
||||||
|
{
|
||||||
|
Exhausted = 0,
|
||||||
|
Drowning = 1,
|
||||||
|
Fall = 2,
|
||||||
|
Lava = 3,
|
||||||
|
Slime = 4,
|
||||||
|
Fire = 5,
|
||||||
|
FallToVoid = 6 // custom case for fall without durability loss
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PlayerUnderwaterState
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
InWater = 0x01, // terrain type is water and player is afflicted by it
|
||||||
|
InLava = 0x02, // terrain type is lava and player is afflicted by it
|
||||||
|
InSlime = 0x04, // terrain type is lava and player is afflicted by it
|
||||||
|
InDarkWater = 0x08, // terrain type is dark water and player is afflicted by it
|
||||||
|
|
||||||
|
ExistTimers = 0x10
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct RuneCooldowns
|
||||||
|
{
|
||||||
|
public const int Base = 10000;
|
||||||
|
public const int Miss = 1500; // cooldown applied on runes when the spell misses
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PlayerFlags : uint
|
||||||
|
{
|
||||||
|
GroupLeader = 0x01,
|
||||||
|
AFK = 0x02,
|
||||||
|
DND = 0x04,
|
||||||
|
GM = 0x08,
|
||||||
|
Ghost = 0x10,
|
||||||
|
Resting = 0x20,
|
||||||
|
Unk6 = 0x40,
|
||||||
|
Unk7 = 0x80,
|
||||||
|
ContestedPVP = 0x100,
|
||||||
|
InPVP = 0x200,
|
||||||
|
HideHelm = 0x400,
|
||||||
|
HideCloak = 0x800,
|
||||||
|
PlayedLongTime = 0x1000,
|
||||||
|
PlayedTooLong = 0x2000,
|
||||||
|
IsOutOfBounds = 0x4000,
|
||||||
|
Developer = 0x8000,
|
||||||
|
Unk16 = 0x10000,
|
||||||
|
TaxiBenchmark = 0x20000,
|
||||||
|
PVPTimer = 0x40000,
|
||||||
|
Uber = 0x80000,
|
||||||
|
Unk20 = 0x100000,
|
||||||
|
Unk21 = 0x200000,
|
||||||
|
Commentator2 = 0x400000,
|
||||||
|
AllowOnlyAbility = 0x800000,
|
||||||
|
PetBattlesUnlocked = 0x1000000,
|
||||||
|
NoXPGain = 0x2000000,
|
||||||
|
Unk26 = 0x4000000,
|
||||||
|
AutoDeclineGuild = 0x8000000,
|
||||||
|
GuildLevelEnabled = 0x10000000,
|
||||||
|
VoidUnlocked = 0x20000000,
|
||||||
|
Mentor = 0x40000000,
|
||||||
|
Unk31 = 0x80000000
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PlayerFlagsEx
|
||||||
|
{
|
||||||
|
ReagentBankUnlocked = 0x01,
|
||||||
|
MercenaryMode = 0x02
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CharacterFlags : uint
|
||||||
|
{
|
||||||
|
None = 0x00000000,
|
||||||
|
Unk1 = 0x00000001,
|
||||||
|
Unk2 = 0x00000002,
|
||||||
|
CharacterLockedForTransfer = 0x00000004,
|
||||||
|
Unk4 = 0x00000008,
|
||||||
|
Unk5 = 0x00000010,
|
||||||
|
Unk6 = 0x00000020,
|
||||||
|
Unk7 = 0x00000040,
|
||||||
|
Unk8 = 0x00000080,
|
||||||
|
Unk9 = 0x00000100,
|
||||||
|
Unk10 = 0x00000200,
|
||||||
|
HideHelm = 0x00000400,
|
||||||
|
HideCloak = 0x00000800,
|
||||||
|
Unk13 = 0x00001000,
|
||||||
|
Ghost = 0x00002000,
|
||||||
|
Rename = 0x00004000,
|
||||||
|
Unk16 = 0x00008000,
|
||||||
|
Unk17 = 0x00010000,
|
||||||
|
Unk18 = 0x00020000,
|
||||||
|
Unk19 = 0x00040000,
|
||||||
|
Unk20 = 0x00080000,
|
||||||
|
Unk21 = 0x00100000,
|
||||||
|
Unk22 = 0x00200000,
|
||||||
|
Unk23 = 0x00400000,
|
||||||
|
Unk24 = 0x00800000,
|
||||||
|
LockedByBilling = 0x01000000,
|
||||||
|
Declined = 0x02000000,
|
||||||
|
Unk27 = 0x04000000,
|
||||||
|
Unk28 = 0x08000000,
|
||||||
|
Unk29 = 0x10000000,
|
||||||
|
Unk30 = 0x20000000,
|
||||||
|
Unk31 = 0x40000000,
|
||||||
|
Unk32 = 0x80000000
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PlayerLocalFlags
|
||||||
|
{
|
||||||
|
TrackStealthed = 0x02,
|
||||||
|
ReleaseTimer = 0x08, // Display time till auto release spirit
|
||||||
|
NoReleaseWindow = 0x10, // Display no "release spirit" window at all
|
||||||
|
NoPetBar = 0x00000020, // CGPetInfo::IsPetBarUsed
|
||||||
|
OverrideCameraMinHeight = 0x00000040,
|
||||||
|
UsingPartGarrison = 0x00000100,
|
||||||
|
CanUseObjectsMounted = 0x00000200,
|
||||||
|
CanVisitPartyGarrison = 0x00000400
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PlayerFieldByte2Flags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
Stealth = 0x20,
|
||||||
|
InvisibilityGlow = 0x40
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum AreaTeams
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Ally = 2,
|
||||||
|
Horde = 4,
|
||||||
|
Any = 6
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum RestTypes : byte
|
||||||
|
{
|
||||||
|
XP = 0,
|
||||||
|
Honor = 1,
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PlayerRestState
|
||||||
|
{
|
||||||
|
Rested = 0x01,
|
||||||
|
NotRAFLinked = 0x02,
|
||||||
|
RAFLinked = 0x06
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CharacterCustomizeFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
Customize = 0x01, // Name, Gender, Etc...
|
||||||
|
Faction = 0x10000, // Name, Gender, Faction, Etc...
|
||||||
|
Race = 0x100000 // Name, Gender, Race, Etc...
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CharacterFlags3 : uint
|
||||||
|
{
|
||||||
|
LockedByRevokedVasTransaction = 0x100000,
|
||||||
|
LockedByRevokedCharacterUpgrade = 0x80000000,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CharacterFlags4
|
||||||
|
{
|
||||||
|
TrialBoost = 0x80,
|
||||||
|
TrialBoostLocked = 0x40000,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TextureSection // TODO: Find a better name. Used in CharSections.dbc
|
||||||
|
{
|
||||||
|
BaseSkin = 0,
|
||||||
|
Face = 1,
|
||||||
|
FacialHair = 2,
|
||||||
|
Hair = 3,
|
||||||
|
Underwear = 4,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum AtLoginFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
Rename = 0x01,
|
||||||
|
ResetSpells = 0x02,
|
||||||
|
ResetTalents = 0x04,
|
||||||
|
Customize = 0x08,
|
||||||
|
ResetPetTalents = 0x10,
|
||||||
|
FirstLogin = 0x20,
|
||||||
|
ChangeFaction = 0x40,
|
||||||
|
ChangeRace = 0x80,
|
||||||
|
Resurrect = 0x100
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PlayerSlots
|
||||||
|
{
|
||||||
|
// first slot for item stored (in any way in player items data)
|
||||||
|
Start = 0,
|
||||||
|
// last+1 slot for item stored (in any way in player items data)
|
||||||
|
End = 187,
|
||||||
|
Count = (End - Start)
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PlayerTitle : ulong
|
||||||
|
{
|
||||||
|
Disabled = 0x0000000000000000,
|
||||||
|
None = 0x0000000000000001,
|
||||||
|
Private = 0x0000000000000002, // 1
|
||||||
|
Corporal = 0x0000000000000004, // 2
|
||||||
|
SergeantA = 0x0000000000000008, // 3
|
||||||
|
MasterSergeant = 0x0000000000000010, // 4
|
||||||
|
SergeantMajor = 0x0000000000000020, // 5
|
||||||
|
Knight = 0x0000000000000040, // 6
|
||||||
|
KnightLieutenant = 0x0000000000000080, // 7
|
||||||
|
KnightCaptain = 0x0000000000000100, // 8
|
||||||
|
KnightChampion = 0x0000000000000200, // 9
|
||||||
|
LieutenantCommander = 0x0000000000000400, // 10
|
||||||
|
Commander = 0x0000000000000800, // 11
|
||||||
|
Marshal = 0x0000000000001000, // 12
|
||||||
|
FieldMarshal = 0x0000000000002000, // 13
|
||||||
|
GrandMarshal = 0x0000000000004000, // 14
|
||||||
|
Scout = 0x0000000000008000, // 15
|
||||||
|
Grunt = 0x0000000000010000, // 16
|
||||||
|
SergeantH = 0x0000000000020000, // 17
|
||||||
|
SeniorSergeant = 0x0000000000040000, // 18
|
||||||
|
FirstSergeant = 0x0000000000080000, // 19
|
||||||
|
StoneGuard = 0x0000000000100000, // 20
|
||||||
|
BloodGuard = 0x0000000000200000, // 21
|
||||||
|
Legionnaire = 0x0000000000400000, // 22
|
||||||
|
Centurion = 0x0000000000800000, // 23
|
||||||
|
Champion = 0x0000000001000000, // 24
|
||||||
|
LieutenantGeneral = 0x0000000002000000, // 25
|
||||||
|
General = 0x0000000004000000, // 26
|
||||||
|
Warlord = 0x0000000008000000, // 27
|
||||||
|
HighWarlord = 0x0000000010000000, // 28
|
||||||
|
Gladiator = 0x0000000020000000, // 29
|
||||||
|
Duelist = 0x0000000040000000, // 30
|
||||||
|
Rival = 0x0000000080000000, // 31
|
||||||
|
Challenger = 0x0000000100000000, // 32
|
||||||
|
ScarabLord = 0x0000000200000000, // 33
|
||||||
|
Conqueror = 0x0000000400000000, // 34
|
||||||
|
Justicar = 0x0000000800000000, // 35
|
||||||
|
ChampionOfTheNaaru = 0x0000001000000000, // 36
|
||||||
|
MercilessGladiator = 0x0000002000000000, // 37
|
||||||
|
OfTheShatteredSun = 0x0000004000000000, // 38
|
||||||
|
HandOfAdal = 0x0000008000000000, // 39
|
||||||
|
VengefulGladiator = 0x0000010000000000, // 40
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PlayerExtraFlags
|
||||||
|
{
|
||||||
|
// gm abilities
|
||||||
|
GMOn = 0x01,
|
||||||
|
AcceptWhispers = 0x04,
|
||||||
|
TaxiCheat = 0x08,
|
||||||
|
GMInvisible = 0x10,
|
||||||
|
GMChat = 0x20, // Show GM badge in chat messages
|
||||||
|
|
||||||
|
// other states
|
||||||
|
PVPDeath = 0x100 // store PvP death status until corpse creating.
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum EquipmentSetUpdateState
|
||||||
|
{
|
||||||
|
Unchanged = 0,
|
||||||
|
Changed = 1,
|
||||||
|
New = 2,
|
||||||
|
Deleted = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CUFBoolOptions
|
||||||
|
{
|
||||||
|
KeepGroupsTogether,
|
||||||
|
DisplayPets,
|
||||||
|
DisplayMainTankAndAssist,
|
||||||
|
DisplayHealPrediction,
|
||||||
|
DisplayAggroHighlight,
|
||||||
|
DisplayOnlyDispellableDebuffs,
|
||||||
|
DisplayPowerBar,
|
||||||
|
DisplayBorder,
|
||||||
|
UseClassColors,
|
||||||
|
DisplayHorizontalGroups,
|
||||||
|
DisplayNonBossDebuffs,
|
||||||
|
DynamicPosition,
|
||||||
|
Locked,
|
||||||
|
Shown,
|
||||||
|
AutoActivate2Players,
|
||||||
|
AutoActivate3Players,
|
||||||
|
AutoActivate5Players,
|
||||||
|
AutoActivate10Players,
|
||||||
|
AutoActivate15Players,
|
||||||
|
AutoActivate25Players,
|
||||||
|
AutoActivate40Players,
|
||||||
|
AutoActivateSpec1,
|
||||||
|
AutoActivateSpec2,
|
||||||
|
AutoActivateSpec3,
|
||||||
|
AutoActivateSpec4,
|
||||||
|
AutoActivatePvp,
|
||||||
|
AutoActivatePve,
|
||||||
|
|
||||||
|
BoolOptionsCount,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum DuelCompleteType
|
||||||
|
{
|
||||||
|
Interrupted = 0,
|
||||||
|
Won = 1,
|
||||||
|
Fled = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ReferAFriendError
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
NotReferredBy = 1,
|
||||||
|
TargetTooHigh = 2,
|
||||||
|
InsufficientGrantableLevels = 3,
|
||||||
|
TooFar = 4,
|
||||||
|
DifferentFaction = 5,
|
||||||
|
NotNow = 6,
|
||||||
|
GrantLevelMaxI = 7,
|
||||||
|
NoTarget = 8,
|
||||||
|
NotInGroup = 9,
|
||||||
|
SummonLevelMaxI = 10,
|
||||||
|
SummonCooldown = 11,
|
||||||
|
InsufExpanLvl = 12,
|
||||||
|
SummonOfflineS = 13,
|
||||||
|
NoXrealm = 14,
|
||||||
|
MapIncomingTransferNotAllowed = 15
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PlayerCommandStates
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
God = 0x01,
|
||||||
|
Casttime = 0x02,
|
||||||
|
Cooldown = 0x04,
|
||||||
|
Power = 0x08,
|
||||||
|
Waterwalk = 0x10
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum AttackSwingErr
|
||||||
|
{
|
||||||
|
CantAttack = 0,
|
||||||
|
BadFacing = 1,
|
||||||
|
NotInRange = 2,
|
||||||
|
DeadTarget = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PlayerLogXPReason
|
||||||
|
{
|
||||||
|
Kill = 0,
|
||||||
|
NoKill = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum HeirloomPlayerFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
BonusLevel90 = 0x01,
|
||||||
|
BonusLevel100 = 0x02,
|
||||||
|
BonusLevel110 = 0x04
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum HeirloomItemFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
ShowOnlyIfKnown = 0x01,
|
||||||
|
Pvp = 0x02
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum DeclinedNameResult
|
||||||
|
{
|
||||||
|
Success = 0,
|
||||||
|
Error = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BindExtensionState
|
||||||
|
{
|
||||||
|
Expired = 0,
|
||||||
|
Normal = 1,
|
||||||
|
Extended = 2,
|
||||||
|
Keep = 255 // special state: keep current save type
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TalentLearnResult
|
||||||
|
{
|
||||||
|
LearnOk = 0,
|
||||||
|
FailedUnknown = 1,
|
||||||
|
FailedNotEnoughTalentsInPrimaryTree = 2,
|
||||||
|
FailedNoPrimaryTreeSelected = 3,
|
||||||
|
FailedCantDoThatRightNow = 4,
|
||||||
|
FailedAffectingCombat = 5,
|
||||||
|
FailedCantRemoveTalent = 6,
|
||||||
|
FailedCantDoThatChallengeModeActive = 7,
|
||||||
|
FailedRestArea = 8
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,339 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum QuestObjectiveType
|
||||||
|
{
|
||||||
|
Monster = 0,
|
||||||
|
Item = 1,
|
||||||
|
GameObject = 2,
|
||||||
|
TalkTo = 3,
|
||||||
|
Currency = 4,
|
||||||
|
LearnSpell = 5,
|
||||||
|
MinReputation = 6,
|
||||||
|
MaxReputation = 7,
|
||||||
|
Money = 8,
|
||||||
|
PlayerKills = 9,
|
||||||
|
AreaTrigger = 10,
|
||||||
|
WinPetBattleAgainstNpc = 11,
|
||||||
|
DefeatBattlePet = 12,
|
||||||
|
WinPvpPetBattles = 13,
|
||||||
|
CriteriaTree = 14,
|
||||||
|
ProgressBar = 15,
|
||||||
|
HaveCurrency = 16, // requires the player to have X currency when turning in but does not consume it
|
||||||
|
ObtainCurrency = 17 // requires the player to gain X currency after starting the quest but not required to keep it until the end (does not consume)
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum QuestObjectiveFlags
|
||||||
|
{
|
||||||
|
TrackedOnMinimap = 0x01, // Client Displays Large Yellow Blob On Minimap For Creature/Gameobject
|
||||||
|
Sequenced = 0x02, // Client Will Not See The Objective Displayed Until All Previous Objectives Are Completed
|
||||||
|
Optional = 0x04, // Not Required To Complete The Quest
|
||||||
|
Hidden = 0x08, // Never Displayed In Quest Log
|
||||||
|
HideItemGains = 0x10, // Skip Showing Item Objective Progress
|
||||||
|
ProgressCountsItemsInInventory = 0x20, // Item Objective Progress Counts Items In Inventory Instead Of Reading It From Updatefields
|
||||||
|
PartOfProgressBar = 0x40, // Hidden Objective Used To Calculate Progress Bar Percent (Quests Are Limited To A Single Progress Bar Objective)
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct QuestSlotOffsets
|
||||||
|
{
|
||||||
|
public const int Id = 0;
|
||||||
|
public const int State = 1;
|
||||||
|
public const int Counts = 2;
|
||||||
|
public const int Time = 14;
|
||||||
|
public const int Max = 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum QuestSlotStateMask
|
||||||
|
{
|
||||||
|
None = 0x0000,
|
||||||
|
Complete = 0x0001,
|
||||||
|
Fail = 0x0002
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum QuestType
|
||||||
|
{
|
||||||
|
AutoComplete= 0,
|
||||||
|
Disabled = 1,
|
||||||
|
Normal = 2,
|
||||||
|
Task = 3,
|
||||||
|
Max = 4
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum QuestInfos
|
||||||
|
{
|
||||||
|
Group = 1,
|
||||||
|
Class = 21,
|
||||||
|
PVP = 41,
|
||||||
|
Raid = 62,
|
||||||
|
Dungeon = 81,
|
||||||
|
WorldEvent = 82,
|
||||||
|
Legendary = 83,
|
||||||
|
Escort = 84,
|
||||||
|
Heroic = 85,
|
||||||
|
Raid10 = 88,
|
||||||
|
Raid25 = 89,
|
||||||
|
Scenario = 98,
|
||||||
|
Account = 102,
|
||||||
|
SideQuest = 104
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum QuestSort
|
||||||
|
{
|
||||||
|
Epic = 1,
|
||||||
|
HallowsEnd = 21,
|
||||||
|
Seasonal = 22,
|
||||||
|
Cataclysm = 23,
|
||||||
|
Herbalism = 24,
|
||||||
|
Battlegrounds = 25,
|
||||||
|
DayOfTheDead = 41,
|
||||||
|
Warlock = 61,
|
||||||
|
Warrior = 81,
|
||||||
|
Shaman = 82,
|
||||||
|
Fishing = 101,
|
||||||
|
Blacksmithing = 121,
|
||||||
|
Paladin = 141,
|
||||||
|
Mage = 161,
|
||||||
|
Rogue = 162,
|
||||||
|
Alchemy = 181,
|
||||||
|
Leatherworking = 182,
|
||||||
|
Engineering = 201,
|
||||||
|
TreasureMap = 221,
|
||||||
|
Tournament = 241,
|
||||||
|
Hunter = 261,
|
||||||
|
Priest = 262,
|
||||||
|
Druid = 263,
|
||||||
|
Tailoring = 264,
|
||||||
|
Special = 284,
|
||||||
|
Cooking = 304,
|
||||||
|
FirstAid = 324,
|
||||||
|
Legendary = 344,
|
||||||
|
DarkmoonFaire = 364,
|
||||||
|
AhnQirajWar = 365,
|
||||||
|
LunarFestival = 366,
|
||||||
|
Reputation = 367,
|
||||||
|
Invasion = 368,
|
||||||
|
Midsummer = 369,
|
||||||
|
Brewfest = 370,
|
||||||
|
Inscription = 371,
|
||||||
|
DeathKnight = 372,
|
||||||
|
Jewelcrafting = 373,
|
||||||
|
Noblegarden = 374,
|
||||||
|
PilgrimsBounty = 375,
|
||||||
|
LoveIsInTheAir = 376,
|
||||||
|
Archaeology = 377,
|
||||||
|
ChildrensWeek = 378,
|
||||||
|
FirelandsInvasion = 379,
|
||||||
|
TheZandalari = 380,
|
||||||
|
ElementalBonds = 381,
|
||||||
|
PandarenBrewmaster = 391,
|
||||||
|
Scenario = 392,
|
||||||
|
BattlePets = 394,
|
||||||
|
Monk = 395,
|
||||||
|
Landfall = 396,
|
||||||
|
PandarenCampaign = 397,
|
||||||
|
Riding = 398,
|
||||||
|
BrawlersGuild = 399,
|
||||||
|
ProvingGrounds = 400,
|
||||||
|
GarrisonCampaign = 401,
|
||||||
|
AssaultOnTheDarkPortal = 402,
|
||||||
|
GarrisonSupport = 403,
|
||||||
|
Logging = 404,
|
||||||
|
Pickpocketing = 405
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum QuestFailedReasons
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
FailedLowLevel = 1, // "You Are Not High Enough Level For That Quest.""
|
||||||
|
FailedWrongRace = 6, // "That Quest Is Not Available To Your Race."
|
||||||
|
AlreadyDone = 7, // "You Have Completed That Daily Quest Today."
|
||||||
|
OnlyOneTimed = 12, // "You Can Only Be On One Timed Quest At A Time"
|
||||||
|
AlreadyOn1 = 13, // "You Are Already On That Quest"
|
||||||
|
FailedExpansion = 16, // "This Quest Requires An Expansion Enabled Account."
|
||||||
|
AlreadyOn2 = 18, // "You Are Already On That Quest"
|
||||||
|
FailedMissingItems = 21, // "You Don'T Have The Required Items With You. Check Storage."
|
||||||
|
FailedNotEnoughMoney = 23, // "You Don'T Have Enough Money For That Quest"
|
||||||
|
FailedCais = 24, // "You Cannot Complete Quests Once You Have Reached Tired Time"
|
||||||
|
AlreadyDoneDaily = 26, // "You Have Completed That Daily Quest Today."
|
||||||
|
FailedSpell = 28, // "You Haven'T Learned The Required Spell."
|
||||||
|
HasInProgress = 30 // "Progress Bar Objective Not Completed"
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum QuestPushReason
|
||||||
|
{
|
||||||
|
Success = 0,
|
||||||
|
Invalid = 1,
|
||||||
|
Accepted = 2,
|
||||||
|
Declined = 3,
|
||||||
|
Busy = 4,
|
||||||
|
Dead = 5,
|
||||||
|
LogFull = 6,
|
||||||
|
OnQuest = 7,
|
||||||
|
AlreadyDone = 8,
|
||||||
|
NotDaily = 9,
|
||||||
|
TimerExpired = 10,
|
||||||
|
NotInParty = 11,
|
||||||
|
DifferentServerDaily = 12,
|
||||||
|
NotAllowed = 13
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum QuestTradeSkill
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Alchemy = 1,
|
||||||
|
Blacksmithing = 2,
|
||||||
|
Cooking = 3,
|
||||||
|
Enchanting = 4,
|
||||||
|
Engineering = 5,
|
||||||
|
Firstaid = 6,
|
||||||
|
Herbalism = 7,
|
||||||
|
Leatherworking = 8,
|
||||||
|
Poisons = 9,
|
||||||
|
Tailoring = 10,
|
||||||
|
Mining = 11,
|
||||||
|
Fishing = 12,
|
||||||
|
Skinning = 13,
|
||||||
|
Jewelcrafting = 14
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum QuestStatus
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Complete = 1,
|
||||||
|
//Unavailable = 2,
|
||||||
|
Incomplete = 3,
|
||||||
|
//Available = 4,
|
||||||
|
Failed = 5,
|
||||||
|
Rewarded = 6, // Not Used In Db
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum QuestGiverStatus
|
||||||
|
{
|
||||||
|
None = 0x000,
|
||||||
|
Unk = 0x001,
|
||||||
|
Unavailable = 0x002,
|
||||||
|
LowLevelAvailable = 0x004,
|
||||||
|
LowLevelRewardRep = 0x008,
|
||||||
|
LowLevelAvailableRep = 0x010,
|
||||||
|
Incomplete = 0x020,
|
||||||
|
RewardRep = 0x040,
|
||||||
|
AvailableRep = 0x080,
|
||||||
|
Available = 0x100,
|
||||||
|
Reward2 = 0x200, // No Yellow Dot On Minimap
|
||||||
|
Reward = 0x400, // Yellow Dot On Minimap
|
||||||
|
|
||||||
|
// Custom value meaning that script call did not return any valid quest status
|
||||||
|
ScriptedNoStatus = 0x1000
|
||||||
|
}
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
public enum QuestFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
StayAlive = 0x01, // Not Used Currently
|
||||||
|
PartyAccept = 0x02, // Not Used Currently. If Player In Party, All Players That Can Accept This Quest Will Receive Confirmation Box To Accept Quest Cmsg_Quest_Confirm_Accept/Smsg_Quest_Confirm_Accept
|
||||||
|
Exploration = 0x04, // Not Used Currently
|
||||||
|
Sharable = 0x08, // Can Be Shared: Player.Cansharequest()
|
||||||
|
HasCondition = 0x10, // Not Used Currently
|
||||||
|
HideRewardPoi = 0x20, // Not Used Currently: Unsure Of Content
|
||||||
|
Raid = 0x40, // Can be completed while in raid
|
||||||
|
TBC = 0x80, // Not Used Currently: Available If Tbc Expansion Enabled Only
|
||||||
|
NoMoneyFromXp = 0x100, // Not Used Currently: Experience Is Not Converted To Gold At Max Level
|
||||||
|
HiddenRewards = 0x200, // Items And Money Rewarded Only Sent In Smsg_Questgiver_Offer_Reward (Not In Smsg_Questgiver_Quest_Details Or In Client Quest Log(Smsg_Quest_Query_Response))
|
||||||
|
Tracking = 0x400, // These Quests Are Automatically Rewarded On Quest Complete And They Will Never Appear In Quest Log Client Side.
|
||||||
|
DeprecateReputation = 0x800, // Not Used Currently
|
||||||
|
Daily = 0x1000, // Used To Know Quest Is Daily One
|
||||||
|
Pvp = 0x2000, // Having This Quest In Log Forces Pvp Flag
|
||||||
|
Unavailable = 0x4000, // Used On Quests That Are Not Generically Available
|
||||||
|
Weekly = 0x8000,
|
||||||
|
AutoComplete = 0x10000, // Quests with this flag player submit automatically by special button in player gui
|
||||||
|
DisplayItemInTracker = 0x20000, // Displays Usable Item In Quest Tracker
|
||||||
|
ObjText = 0x40000, // Use Objective Text As Complete Text
|
||||||
|
AutoAccept = 0x80000, // The client recognizes this flag as auto-accept. However, NONE of the current quests (3.3.5a) have this flag. Maybe blizz used to use it, or will use it in the future.
|
||||||
|
Unk1 = 0x100000, //
|
||||||
|
AutoTake = 0x200000, // Automatically Suggestion Of Accepting Quest. Not From Npc.
|
||||||
|
//Unk2 = 0x400000,
|
||||||
|
//Unk3 = 0x800000, // Found In Quest 14069
|
||||||
|
//Unk4 = 0x1000000,
|
||||||
|
// ... 4.X Added Flags Up To 0x80000000 - All Unknown For Now
|
||||||
|
}
|
||||||
|
|
||||||
|
// last checked in 19802
|
||||||
|
[Flags]
|
||||||
|
public enum QuestFlagsEx
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
KeepAdditionalItems = 0x01,
|
||||||
|
SuppressGossipComplete = 0x02,
|
||||||
|
SuppressGossipAccept = 0x04,
|
||||||
|
DisallowPlayerAsQuestgiver = 0x08,
|
||||||
|
DisplayClassChoiceRewards = 0x10,
|
||||||
|
DisplaySpecChoiceRewards = 0x20,
|
||||||
|
RemoveFromLogOnPeriodicReset = 0x40,
|
||||||
|
AccountLevelQuest = 0x80,
|
||||||
|
LegendaryQuest = 0x100,
|
||||||
|
NoGuildXp = 0x200,
|
||||||
|
ResetCacheOnAccept = 0x400,
|
||||||
|
NoAbandonOnceAnyObjectiveComplete = 0x800,
|
||||||
|
RecastAcceptSpellOnLogin = 0x1000,
|
||||||
|
UpdateZoneAuras = 0x2000,
|
||||||
|
NoCreditForProxy = 0x4000,
|
||||||
|
DisplayAsDailyQuest = 0x8000,
|
||||||
|
PartOfQuestLine = 0x10000,
|
||||||
|
QuestForInternalBuildsOnly = 0x20000,
|
||||||
|
SuppressSpellLearnTextLine = 0x40000,
|
||||||
|
DisplayHeaderAsObjectiveForTasks = 0x80000,
|
||||||
|
GarrisonNonOwnersAllowed = 0x100000,
|
||||||
|
RemoveQuestOnWeeklyReset = 0x200000,
|
||||||
|
SuppressFarewellAudioAfterQuestAccept = 0x0400000,
|
||||||
|
RewardsBypassWeeklyCapsAndSeasonTotal = 0x0800000,
|
||||||
|
ClearProgressOfCriteriaTreeObjectivesOnAccept = 0x1000000
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum QuestSpecialFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
// Flags For Set Specialflags In Db If Required But Used Only At Server
|
||||||
|
Repeatable = 0x001,
|
||||||
|
ExplorationOrEvent = 0x002, // If Required Area Explore, Spell Spell_Effect_Quest_Complete Casting, Table `*_Script` Command Script_Command_Quest_Explored Use, Set From Script)
|
||||||
|
AutoAccept = 0x004, // Quest Is To Be Auto-Accepted.
|
||||||
|
DfQuest = 0x008, // Quest Is Used By Dungeon Finder.
|
||||||
|
Monthly = 0x010, // Quest Is Reset At The Begining Of The Month
|
||||||
|
Cast = 0x20, // Set by 32 in SpecialFlags in DB if the quest requires RequiredOrNpcGo killcredit but NOT kill (a spell cast)
|
||||||
|
// Room For More Custom Flags
|
||||||
|
|
||||||
|
DbAllowed = Repeatable | ExplorationOrEvent | AutoAccept | DfQuest | Monthly | Cast,
|
||||||
|
|
||||||
|
Deliver = 0x080, // Internal Flag Computed Only
|
||||||
|
Speakto = 0x100, // Internal Flag Computed Only
|
||||||
|
Kill = 0x200, // Internal Flag Computed Only
|
||||||
|
Timed = 0x400, // Internal Flag Computed Only
|
||||||
|
PlayerKill = 0x800 // Internal Flag Computed Only
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum QuestSaveType
|
||||||
|
{
|
||||||
|
Default = 0,
|
||||||
|
Delete,
|
||||||
|
ForceDelete
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
// AuraScript interface - enum used for runtime checks of script function calls
|
||||||
|
public enum AuraScriptHookType
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Registration,
|
||||||
|
Loading,
|
||||||
|
Unloading,
|
||||||
|
EffectApply,
|
||||||
|
EffectAfterApply,
|
||||||
|
EffectRemove,
|
||||||
|
EffectAfterRemove,
|
||||||
|
EffectPeriodic,
|
||||||
|
EffectUpdatePeriodic,
|
||||||
|
EffectCalcAmount,
|
||||||
|
EffectCalcPeriodic,
|
||||||
|
EffectCalcSpellmod,
|
||||||
|
EffectAbsorb,
|
||||||
|
EffectAfterAbsorb,
|
||||||
|
EffectManaShield,
|
||||||
|
EffectAfterManaShield,
|
||||||
|
EffectSplit,
|
||||||
|
CheckAreaTarget,
|
||||||
|
Dispel,
|
||||||
|
AfterDispel,
|
||||||
|
// Spell Proc Hooks
|
||||||
|
CheckProc,
|
||||||
|
PrepareProc,
|
||||||
|
Proc,
|
||||||
|
EffectProc,
|
||||||
|
EffectAfterProc,
|
||||||
|
AfterProc,
|
||||||
|
//Apply,
|
||||||
|
//Remove
|
||||||
|
}
|
||||||
|
|
||||||
|
// SpellScript interface - enum used for runtime checks of script function calls
|
||||||
|
public enum SpellScriptHookType
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Registration,
|
||||||
|
Loading,
|
||||||
|
Unloading,
|
||||||
|
Launch,
|
||||||
|
LaunchTarget,
|
||||||
|
EffectHit,
|
||||||
|
EffectHitTarget,
|
||||||
|
EffectSuccessfulDispel,
|
||||||
|
BeforeHit,
|
||||||
|
OnHit,
|
||||||
|
AfterHit,
|
||||||
|
ObjectAreaTargetSelect,
|
||||||
|
ObjectTargetSelect,
|
||||||
|
DestinationTargetSelect,
|
||||||
|
CheckCast,
|
||||||
|
BeforeCast,
|
||||||
|
OnCast,
|
||||||
|
AfterCast
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum OriginalHash : uint
|
||||||
|
{
|
||||||
|
AccountService = 0x62DA0891u,
|
||||||
|
AccountListener = 0x54DFDA17u,
|
||||||
|
AuthenticationListener = 0x71240E35u,
|
||||||
|
AuthenticationService = 0xDECFC01u,
|
||||||
|
ChallengeService = 0xDBBF6F19u,
|
||||||
|
ChallengeListener = 0xBBDA171Fu,
|
||||||
|
ChannelService = 0xB732DB32u,
|
||||||
|
ChannelListener = 0xBF8C8094u,
|
||||||
|
ConnectionService = 0x65446991u,
|
||||||
|
FriendsService = 0xA3DDB1BDu,
|
||||||
|
FriendsListener = 0x6F259A13u,
|
||||||
|
GameUtilitiesService = 0x3FC1274Du,
|
||||||
|
PresenceService = 0xFA0796FFu,
|
||||||
|
ReportService = 0x7CAF61C9u,
|
||||||
|
ResourcesService = 0xECBE75BAu,
|
||||||
|
UserManagerService = 0x3E19268Au,
|
||||||
|
UserManagerListener = 0xBC872C22u
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum NameHash : uint
|
||||||
|
{
|
||||||
|
AccountService = 0x1E4DC42Fu,
|
||||||
|
AccountListener = 0x7807483Cu,
|
||||||
|
AuthenticationListener = 0x4DA86228u,
|
||||||
|
AuthenticationService = 0xFF5A6AC3u,
|
||||||
|
ChallengeService = 0x71BB6833u,
|
||||||
|
ChallengeListener = 0xC6D90AB8u,
|
||||||
|
ChannelService = 0xA913A87Bu,
|
||||||
|
ChannelListener = 0xDA660990u,
|
||||||
|
ConnectionService = 0x2782094Bu,
|
||||||
|
FriendsService = 0xABDFED63u,
|
||||||
|
FriendsListener = 0xA6717548u,
|
||||||
|
GameUtilitiesService = 0x51923A28u,
|
||||||
|
PresenceService = 0xD8F94B3Bu,
|
||||||
|
ReportService = 0x724F5F47u,
|
||||||
|
ResourcesService = 0x4B104C53u,
|
||||||
|
UserManagerService = 0x8EE5694Eu,
|
||||||
|
UserManagerListener = 0xB3426BB3u
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,364 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum SmartScriptType
|
||||||
|
{
|
||||||
|
Creature = 0,
|
||||||
|
GameObject = 1,
|
||||||
|
AreaTrigger = 2,
|
||||||
|
Event = 3,
|
||||||
|
Gossip = 4,
|
||||||
|
Quest = 5,
|
||||||
|
Spell = 6,
|
||||||
|
Transport = 7,
|
||||||
|
Instance = 8,
|
||||||
|
TimedActionlist = 9,
|
||||||
|
Scene = 10, // done
|
||||||
|
Max = 11
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct SmartScriptTypeMaskId
|
||||||
|
{
|
||||||
|
public const uint Creature = 1;
|
||||||
|
public const uint Gameobject = 2;
|
||||||
|
public const uint Areatrigger = 4;
|
||||||
|
public const uint Event = 8;
|
||||||
|
public const uint Gossip = 16;
|
||||||
|
public const uint Quest = 32;
|
||||||
|
public const uint Spell = 64;
|
||||||
|
public const uint Transport = 128;
|
||||||
|
public const uint Instance = 256;
|
||||||
|
public const uint TimedActionlist = 512;
|
||||||
|
public const uint Scene = 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SmartPhase
|
||||||
|
{
|
||||||
|
ALWAYS = 0,
|
||||||
|
Phase1 = 1,
|
||||||
|
Phase2 = 2,
|
||||||
|
Phase3 = 3,
|
||||||
|
Phase4 = 4,
|
||||||
|
Phase5 = 5,
|
||||||
|
Phase6 = 6,
|
||||||
|
Max = 7,
|
||||||
|
All = (Phase1 | Phase2 | Phase3 | Phase4 | Phase5 | Phase6),
|
||||||
|
|
||||||
|
Count = 6
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SmartEventFlags
|
||||||
|
{
|
||||||
|
NotRepeatable = 0x01, //Event can not repeat
|
||||||
|
Difficulty0 = 0x02, //Event only occurs in instance difficulty 0
|
||||||
|
Difficulty1 = 0x04, //Event only occurs in instance difficulty 1
|
||||||
|
Difficulty2 = 0x08, //Event only occurs in instance difficulty 2
|
||||||
|
Difficulty3 = 0x10, //Event only occurs in instance difficulty 3
|
||||||
|
Reserved5 = 0x20,
|
||||||
|
Reserved6 = 0x40,
|
||||||
|
DebugOnly = 0x80, //Event only occurs in debug build
|
||||||
|
DontReset = 0x100, //Event will not reset in SmartScript.OnReset()
|
||||||
|
WhileCharmed = 0x200, //Event occurs even if AI owner is charmed
|
||||||
|
|
||||||
|
DifficultyAll = (Difficulty0 | Difficulty1 | Difficulty2 | Difficulty3),
|
||||||
|
All = (NotRepeatable | DifficultyAll | Reserved5 | Reserved6 | DebugOnly | DontReset | WhileCharmed)
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SmartRespawnCondition
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Map = 1,
|
||||||
|
Area = 2,
|
||||||
|
End = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SmartAITemplate
|
||||||
|
{
|
||||||
|
Basic = 0, //nothing is preset
|
||||||
|
Caster = 1, //spellid, repeatMin, repeatMax, range, manaPCT +JOIN: target_param1 as castFlag
|
||||||
|
Turret = 2, //spellid, repeatMin, repeatMax +JOIN: target_param1 as castFlag
|
||||||
|
Passive = 3,
|
||||||
|
CagedGOPart = 4, //creatureID, give credit at point end?,
|
||||||
|
CagedNPCPart = 5, //gameObjectID, despawntime, run?, dist, TextGroupID
|
||||||
|
End = 6
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SmartCastFlags
|
||||||
|
{
|
||||||
|
InterruptPrevious = 0x01, //Interrupt any spell casting
|
||||||
|
Triggered = 0x02, //Triggered (this makes spell cost zero mana and have no cast time)
|
||||||
|
//CAST_FORCE_CAST = 0x04, //Forces cast even if creature is out of mana or out of range
|
||||||
|
//CAST_NO_MELEE_IF_OOM = 0x08, //Prevents creature from entering melee if out of mana or out of range
|
||||||
|
//CAST_FORCE_TARGET_SELF = 0x10, //Forces the target to cast this spell on itself
|
||||||
|
AuraNotPresent = 0x20, //Only casts the spell if the target does not have an aura from the spell
|
||||||
|
CombatMove = 0x40 //Prevents combat movement if cast successful. Allows movement on range, OOM, LOS
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SmartEvents
|
||||||
|
{
|
||||||
|
UpdateIc = 0, // Initialmin, Initialmax, Repeatmin, Repeatmax
|
||||||
|
UpdateOoc = 1, // Initialmin, Initialmax, Repeatmin, Repeatmax
|
||||||
|
HealtPct = 2, // Hpmin%, Hpmax%, Repeatmin, Repeatmax
|
||||||
|
ManaPct = 3, // Manamin%, Manamax%, Repeatmin, Repeatmax
|
||||||
|
Aggro = 4, // None
|
||||||
|
Kill = 5, // Cooldownmin0, Cooldownmax1, Playeronly2, Else Creature Entry3
|
||||||
|
Death = 6, // None
|
||||||
|
Evade = 7, // None
|
||||||
|
SpellHit = 8, // Spellid, School, Cooldownmin, Cooldownmax
|
||||||
|
Range = 9, // Mindist, Maxdist, Repeatmin, Repeatmax
|
||||||
|
OocLos = 10, // Nohostile, Maxrnage, Cooldownmin, Cooldownmax
|
||||||
|
Respawn = 11, // Type, Mapid, Zoneid
|
||||||
|
TargetHealthPct = 12, // Hpmin%, Hpmax%, Repeatmin, Repeatmax
|
||||||
|
VictimCasting = 13, // Repeatmin, Repeatmax
|
||||||
|
FriendlyHealth = 14, // Hpdeficit, Radius, Repeatmin, Repeatmax
|
||||||
|
FriendlyIsCc = 15, // Radius, Repeatmin, Repeatmax
|
||||||
|
FriendlyMissingBuff = 16, // Spellid, Radius, Repeatmin, Repeatmax
|
||||||
|
SummonedUnit = 17, // Creatureid(0 All), Cooldownmin, Cooldownmax
|
||||||
|
TargetManaPct = 18, // Manamin%, Manamax%, Repeatmin, Repeatmax
|
||||||
|
AcceptedQuest = 19, // Questid(0any)
|
||||||
|
RewardQuest = 20, // Questid(0any)
|
||||||
|
ReachedHome = 21, // None
|
||||||
|
ReceiveEmote = 22, // Emoteid, Cooldownmin, Cooldownmax, Condition, Val1, Val2, Val3
|
||||||
|
HasAura = 23, // Param1 = Spellid, Param2 = Stack Amount, Param3/4 Repeatmin, Repeatmax
|
||||||
|
TargetBuffed = 24, // Param1 = Spellid, Param2 = Stack Amount, Param3/4 Repeatmin, Repeatmax
|
||||||
|
Reset = 25, // Called After Combat, When The Creature Respawn And Spawn.
|
||||||
|
IcLos = 26, // Nohostile, Maxrnage, Cooldownmin, Cooldownmax
|
||||||
|
PassengerBoarded = 27, // Cooldownmin, Cooldownmax
|
||||||
|
PassengerRemoved = 28, // Cooldownmin, Cooldownmax
|
||||||
|
Charmed = 29, // onRemove (0 - on apply, 1 - on remove)
|
||||||
|
CharmedTarget = 30, // None
|
||||||
|
SpellhitTarget = 31, // Spellid, School, Cooldownmin, Cooldownmax
|
||||||
|
Damaged = 32, // Mindmg, Maxdmg, Cooldownmin, Cooldownmax
|
||||||
|
DamagedTarget = 33, // Mindmg, Maxdmg, Cooldownmin, Cooldownmax
|
||||||
|
Movementinform = 34, // Movementtype(Any), Pointid
|
||||||
|
SummonDespawned = 35, // Entry, Cooldownmin, Cooldownmax
|
||||||
|
CorpseRemoved = 36, // None
|
||||||
|
AiInit = 37, // None
|
||||||
|
DataSet = 38, // Id, Value, Cooldownmin, Cooldownmax
|
||||||
|
WaypointStart = 39, // Pointid(0any), Pathid(0any)
|
||||||
|
WaypointReached = 40, // Pointid(0any), Pathid(0any)
|
||||||
|
TransportAddplayer = 41, // None
|
||||||
|
TransportAddcreature = 42, // Entry (0 Any)
|
||||||
|
TransportRemovePlayer = 43, // None
|
||||||
|
TransportRelocate = 44, // Pointid
|
||||||
|
InstancePlayerEnter = 45, // Team (0 Any), Cooldownmin, Cooldownmax
|
||||||
|
AreatriggerOntrigger = 46, // Triggerid(0 Any)
|
||||||
|
QuestAccepted = 47, // None
|
||||||
|
QuestObjCompletion = 48, // None
|
||||||
|
QuestCompletion = 49, // None
|
||||||
|
QuestRewarded = 50, // None
|
||||||
|
QuestFail = 51, // None
|
||||||
|
TextOver = 52, // Groupid From CreatureText, Creature Entry Who Talks (0 Any)
|
||||||
|
ReceiveHeal = 53, // Minheal, Maxheal, Cooldownmin, Cooldownmax
|
||||||
|
JustSummoned = 54, // None
|
||||||
|
WaypointPaused = 55, // Pointid(0any), Pathid(0any)
|
||||||
|
WaypointResumed = 56, // Pointid(0any), Pathid(0any)
|
||||||
|
WaypointStopped = 57, // Pointid(0any), Pathid(0any)
|
||||||
|
WaypointEnded = 58, // Pointid(0any), Pathid(0any)
|
||||||
|
TimedEventTriggered = 59, // Id
|
||||||
|
Update = 60, // Initialmin, Initialmax, Repeatmin, Repeatmax
|
||||||
|
Link = 61, // Internal Usage, No Params, Used To Link Together Multiple Events, Does Not Use Any Extra Resources To Iterate Event Lists Needlessly
|
||||||
|
GossipSelect = 62, // Menuid, Actionid
|
||||||
|
JustCreated = 63, // None
|
||||||
|
GossipHello = 64, // None
|
||||||
|
FollowCompleted = 65, // None
|
||||||
|
DummyEffect = 66, // Spellid, Effectindex
|
||||||
|
IsBehindTarget = 67, // Cooldownmin, Cooldownmax
|
||||||
|
GameEventStart = 68, // GameEvent.Entry
|
||||||
|
GameEventEnd = 69, // GameEvent.Entry
|
||||||
|
GoStateChanged = 70, // Go State
|
||||||
|
GoEventInform = 71, // Eventid
|
||||||
|
ActionDone = 72, // Eventid (Shareddefines.Eventid)
|
||||||
|
OnSpellclick = 73, // Clicker (Unit)
|
||||||
|
FriendlyHealthPCT = 74,// minHpPct, maxHpPct, repeatMin, repeatMax
|
||||||
|
DistanceCreature = 75, // guid, entry, distance, repeat
|
||||||
|
DistanceGameobject = 76, // guid, entry, distance, repeat
|
||||||
|
CounterSet = 77, // id, value, cooldownMin, cooldownMax
|
||||||
|
SceneStart = 78, // none
|
||||||
|
SceneTrigger = 79, // param_string : triggerName
|
||||||
|
SceneCancel = 80, // none
|
||||||
|
SceneComplete = 81, // none
|
||||||
|
|
||||||
|
End = 82
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SmartActions
|
||||||
|
{
|
||||||
|
None = 0, // No Action
|
||||||
|
Talk = 1, // Groupid From CreatureText, Duration To Wait Before TextOver Event Is Triggered, useTalkTarget (0/1) - use target as talk target
|
||||||
|
SetFaction = 2, // Factionid (Or 0 For Default)
|
||||||
|
MorphToEntryOrModel = 3, // CreatureTemplate Entry(Param1) Or Modelid (Param2) (Or 0 For Both To Demorph)
|
||||||
|
Sound = 4, // Soundid, Textrange
|
||||||
|
PlayEmote = 5, // Emoteid
|
||||||
|
FailQuest = 6, // Questid
|
||||||
|
OfferQuest = 7, // Questid, directAdd
|
||||||
|
SetReactState = 8, // State
|
||||||
|
ActivateGobject = 9, //
|
||||||
|
RandomEmote = 10, // Emoteid1, Emoteid2, Emoteid3...
|
||||||
|
Cast = 11, // Spellid, Castflags, TriggeredFlags
|
||||||
|
SummonCreature = 12, // Creatureid, Summontype, Duration In Ms, Storageid, Attackinvoker,
|
||||||
|
ThreatSinglePct = 13, // Threat%
|
||||||
|
ThreatAllPct = 14, // Threat%
|
||||||
|
CallAreaexploredoreventhappens = 15, // Questid
|
||||||
|
SetIngamePhaseGroup = 16, // phaseGroupId, apply
|
||||||
|
SetEmoteState = 17, // Emoteid
|
||||||
|
SetUnitFlag = 18, // Flags (May Be More Than One Field Or'D Together), Target
|
||||||
|
RemoveUnitFlag = 19, // Flags (May Be More Than One Field Or'D Together), Target
|
||||||
|
AutoAttack = 20, // Allowattackstate (0 = Stop Attack, Anything Else Means Continue Attacking)
|
||||||
|
AllowCombatMovement = 21, // Allowcombatmovement (0 = Stop Combat Based Movement, Anything Else Continue Attacking)
|
||||||
|
SetEventPhase = 22, // Phase
|
||||||
|
IncEventPhase = 23, // Value (May Be Negative To Decrement Phase, Should Not Be 0)
|
||||||
|
Evade = 24, // No Params
|
||||||
|
FleeForAssist = 25, // With Emote
|
||||||
|
CallGroupeventhappens = 26, // Questid
|
||||||
|
CombatStop = 27, //
|
||||||
|
Removeaurasfromspell = 28, // Spellid, 0 Removes All Auras
|
||||||
|
Follow = 29, // Distance (0 = Default), Angle (0 = Default), Endcreatureentry, Credit, Credittype (0monsterkill, 1event)
|
||||||
|
RandomPhase = 30, // Phaseid1, Phaseid2, Phaseid3...
|
||||||
|
RandomPhaseRange = 31, // Phasemin, Phasemax
|
||||||
|
ResetGobject = 32, //
|
||||||
|
CallKilledmonster = 33, // Creatureid,
|
||||||
|
SetInstData = 34, // Field, Data, Type (0 = SetData, 1 = SetBossState)
|
||||||
|
SetInstData64 = 35, // Field,
|
||||||
|
UpdateTemplate = 36, // Entry
|
||||||
|
Die = 37, // No Params
|
||||||
|
SetInCombatWithZone = 38, // No Params
|
||||||
|
CallForHelp = 39, // Radius, With Emote
|
||||||
|
SetSheath = 40, // Sheath (0-Unarmed, 1-Melee, 2-Ranged)
|
||||||
|
ForceDespawn = 41, // Timer
|
||||||
|
SetInvincibilityHpLevel = 42, // Minhpvalue(+Pct, -Flat)
|
||||||
|
MountToEntryOrModel = 43, // CreatureTemplate Entry(Param1) Or Modelid (Param2) (Or 0 For Both To Dismount)
|
||||||
|
SetIngamePhaseId = 44, // Id
|
||||||
|
SetData = 45, // Field, Data (Only Creature Todo)
|
||||||
|
//46 Unused
|
||||||
|
SetVisibility = 47, // On/Off
|
||||||
|
SetActive = 48, // No Params
|
||||||
|
AttackStart = 49, //
|
||||||
|
SummonGo = 50, // Gameobjectid, Despawntime In Ms,
|
||||||
|
KillUnit = 51, //
|
||||||
|
ActivateTaxi = 52, // Taxiid
|
||||||
|
WpStart = 53, // Run/Walk, Pathid, Canrepeat, Quest, Despawntime, Reactstate
|
||||||
|
WpPause = 54, // Time
|
||||||
|
WpStop = 55, // Despawntime, Quest, Fail?
|
||||||
|
AddItem = 56, // Itemid, Count
|
||||||
|
RemoveItem = 57, // Itemid, Count
|
||||||
|
InstallAiTemplate = 58, // Aitemplateid
|
||||||
|
SetRun = 59, // 0/1
|
||||||
|
SetFly = 60, // 0/1
|
||||||
|
SetSwim = 61, // 0/1
|
||||||
|
Teleport = 62, // Mapid,
|
||||||
|
SetCounter = 63, // id, value, reset (0/1)
|
||||||
|
StoreTargetList = 64, // Varid,
|
||||||
|
WpResume = 65, // None
|
||||||
|
SetOrientation = 66, //
|
||||||
|
CreateTimedEvent = 67, // Id, Initialmin, Initialmax, Repeatmin(Only If It Repeats), Repeatmax(Only If It Repeats), Chance
|
||||||
|
Playmovie = 68, // Entry
|
||||||
|
MoveToPos = 69, // PointId, transport, disablePathfinding
|
||||||
|
RespawnTarget = 70, //
|
||||||
|
Equip = 71, // Entry, Slotmask Slot1, Slot2, Slot3 , Only Slots With Mask Set Will Be Sent To Client, Bits Are 1, 2, 4, Leaving Mask 0 Is Defaulted To Mask 7 (Send All), Slots1-3 Are Only Used If No Entry Is Set
|
||||||
|
CloseGossip = 72, // None
|
||||||
|
TriggerTimedEvent = 73, // Id(>1)
|
||||||
|
RemoveTimedEvent = 74, // Id(>1)
|
||||||
|
AddAura = 75, // Spellid, Targets
|
||||||
|
OverrideScriptBaseObject = 76, // Warning: Can Crash Core, Do Not Use If You Dont Know What You Are Doing
|
||||||
|
ResetScriptBaseObject = 77, // None
|
||||||
|
CallScriptReset = 78, // None
|
||||||
|
SetRangedMovement = 79, // Distance, Angle
|
||||||
|
CallTimedActionlist = 80, // Id (Overwrites Already Running Actionlist), Stop After Combat?(0/1), Timer Update Type(0-Ooc, 1-Ic, 2-Always)
|
||||||
|
SetNpcFlag = 81, // Flags
|
||||||
|
AddNpcFlag = 82, // Flags
|
||||||
|
RemoveNpcFlag = 83, // Flags
|
||||||
|
SimpleTalk = 84, // Groupid, Can Be Used To Make Players Say Groupid, TextOver Event Is Not Triggered, Whisper Can Not Be Used (Target Units Will Say The Text)
|
||||||
|
InvokerCast = 85, // Spellid, Castflags, If Avaliable, Last Used Invoker Will Cast Spellid With Castflags On Targets
|
||||||
|
CrossCast = 86, // Spellid, Castflags, Castertargettype, Castertarget Param1, Castertarget Param2, Castertarget Param3, ( + The Origonal Target Fields As Destination Target), Castertargets Will Cast Spellid On All Targets (Use With Caution If Targeting Multiple * Multiple Units)
|
||||||
|
CallRandomTimedActionlist = 87, // Script9 Ids 1-9
|
||||||
|
CallRandomRangeTimedActionlist = 88, // Script9 Id Min, Max
|
||||||
|
RandomMove = 89, // Maxdist
|
||||||
|
SetUnitFieldBytes1 = 90, // Bytes, Target
|
||||||
|
RemoveUnitFieldBytes1 = 91, // Bytes, Target
|
||||||
|
InterruptSpell = 92,
|
||||||
|
SendGoCustomAnim = 93, // Anim Id
|
||||||
|
SetDynamicFlag = 94, // Flags
|
||||||
|
AddDynamicFlag = 95, // Flags
|
||||||
|
RemoveDynamicFlag = 96, // Flags
|
||||||
|
JumpToPos = 97, // Speedxy, Speedz, Targetx, Targety, Targetz
|
||||||
|
SendGossipMenu = 98, // Menuid, Optionid
|
||||||
|
GoSetLootState = 99, // State
|
||||||
|
SendTargetToTarget = 100, // Id
|
||||||
|
SetHomePos = 101, // None
|
||||||
|
SetHealthRegen = 102, // 0/1
|
||||||
|
SetRoot = 103, // Off/On
|
||||||
|
SetGoFlag = 104, // Flags
|
||||||
|
AddGoFlag = 105, // Flags
|
||||||
|
RemoveGoFlag = 106, // Flags
|
||||||
|
SummonCreatureGroup = 107, // Group, Attackinvoker
|
||||||
|
SetPower = 108, // PowerType, newPower
|
||||||
|
AddPower = 109, // PowerType, newPower
|
||||||
|
RemovePower = 110, // PowerType, newPower
|
||||||
|
GameEventStop = 111, // GameEventId
|
||||||
|
GameEventStart = 112, // GameEventId
|
||||||
|
StartClosestWaypoint = 113, // wp1, wp2, wp3, wp4, wp5, wp6, wp7
|
||||||
|
MoveOffset = 114,
|
||||||
|
RandomSound = 115, // SoundId1, SoundId2, SoundId3, SoundId4, SoundId5, onlySelf
|
||||||
|
SetCorpseDelay = 116, // timer
|
||||||
|
DisableEvade = 117, // 0/1 (1 = disabled, 0 = enabled)
|
||||||
|
// 118 - 127 : 3.3.5 reserved
|
||||||
|
PlayAnimkit = 128,
|
||||||
|
ScenePlay = 129, // sceneId
|
||||||
|
SceneCancel = 130, // sceneId
|
||||||
|
|
||||||
|
End = 131
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SmartTargets
|
||||||
|
{
|
||||||
|
None = 0, // None, Defaulting To Invoket
|
||||||
|
Self = 1, // Self Cast
|
||||||
|
Victim = 2, // Our Current Target (Ie: Highest Aggro)
|
||||||
|
HostileSecondAggro = 3, // Second Highest Aggro
|
||||||
|
HostileLastAggro = 4, // Dead Last On Aggro
|
||||||
|
HostileRandom = 5, // Just Any Random Target On Our Threat List
|
||||||
|
HostileRandomNotTop = 6, // Any Random Target Except Top Threat
|
||||||
|
ActionInvoker = 7, // Unit Who Caused This Event To Occur
|
||||||
|
Position = 8, // Use Xyz From Event Params
|
||||||
|
CreatureRange = 9, // Creatureentry(0any), Mindist, Maxdist
|
||||||
|
CreatureGuid = 10, // Guid, Entry
|
||||||
|
CreatureDistance = 11, // Creatureentry(0any), Maxdist
|
||||||
|
Stored = 12, // Id, Uses Pre-Stored Target(List)
|
||||||
|
GameobjectRange = 13, // Entry(0any), Min, Max
|
||||||
|
GameobjectGuid = 14, // Guid, Entry
|
||||||
|
GameobjectDistance = 15, // Entry(0any), Maxdist
|
||||||
|
InvokerParty = 16, // Invoker'S Party Members
|
||||||
|
PlayerRange = 17, // Min, Max
|
||||||
|
PlayerDistance = 18, // Maxdist
|
||||||
|
ClosestCreature = 19, // Creatureentry(0any), Maxdist, Dead?
|
||||||
|
ClosestGameobject = 20, // Entry(0any), Maxdist
|
||||||
|
ClosestPlayer = 21, // Maxdist
|
||||||
|
ActionInvokerVehicle = 22, // Unit'S Vehicle Who Caused This Event To Occur
|
||||||
|
OwnerOrSummoner = 23, // Unit'S Owner Or Summoner
|
||||||
|
ThreatList = 24, // All Units On Creature'S Threat List
|
||||||
|
ClosestEnemy = 25, // maxDist, playerOnly
|
||||||
|
ClosestFriendly = 26, // maxDist, playerOnly
|
||||||
|
LootRecipients = 27, // all players that have tagged this creature (for kill credit)
|
||||||
|
Farthest = 28, // maxDist, playerOnly, isInLos
|
||||||
|
VehicleAccessory = 29, // seat number (vehicle can target it's own accessory)
|
||||||
|
|
||||||
|
End = 30
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,246 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public struct SkillConst
|
||||||
|
{
|
||||||
|
public const int MaxPlayerSkills = 128;
|
||||||
|
public const uint MaxSkillStep = 15;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SkillType
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
|
||||||
|
Swords = 43,
|
||||||
|
Axes = 44,
|
||||||
|
Bows = 45,
|
||||||
|
Guns = 46,
|
||||||
|
Maces = 54,
|
||||||
|
TwoHandedSwords = 55,
|
||||||
|
Defense = 95,
|
||||||
|
LangCommon = 98,
|
||||||
|
RacialDwarf = 101,
|
||||||
|
LangOrcish = 109,
|
||||||
|
LangDwarven = 111,
|
||||||
|
LangDarnassian = 113,
|
||||||
|
LangTaurahe = 115,
|
||||||
|
DualWield = 118,
|
||||||
|
RacialTauren = 124,
|
||||||
|
RacialOrc = 125,
|
||||||
|
RacialNightElf = 126,
|
||||||
|
FirstAid = 129,
|
||||||
|
Staves = 136,
|
||||||
|
LangThalassian = 137,
|
||||||
|
LangDraconic = 138,
|
||||||
|
LangDemonTongue = 139,
|
||||||
|
LangTitan = 140,
|
||||||
|
LangOldTongue = 141,
|
||||||
|
Survival = 142,
|
||||||
|
HorseRiding = 148,
|
||||||
|
WolfRiding = 149,
|
||||||
|
TigerRiding = 150,
|
||||||
|
RamRiding = 152,
|
||||||
|
Swimming = 155,
|
||||||
|
TwoHandedMaces = 160,
|
||||||
|
Unarmed = 162,
|
||||||
|
Blacksmithing = 164,
|
||||||
|
Leatherworking = 165,
|
||||||
|
Alchemy = 171,
|
||||||
|
TwoHandedAxes = 172,
|
||||||
|
Daggers = 173,
|
||||||
|
Herbalism = 182,
|
||||||
|
GenericDnd = 183,
|
||||||
|
Cooking = 185,
|
||||||
|
Mining = 186,
|
||||||
|
PetImp = 188,
|
||||||
|
PetFelhunter = 189,
|
||||||
|
Tailoring = 197,
|
||||||
|
Engineering = 202,
|
||||||
|
PetSpider = 203,
|
||||||
|
PetVoidwalker = 204,
|
||||||
|
PetSuccubus = 205,
|
||||||
|
PetInfernal = 206,
|
||||||
|
PetDoomguard = 207,
|
||||||
|
PetWolf = 208,
|
||||||
|
PetCat = 209,
|
||||||
|
PetBear = 210,
|
||||||
|
PetBoar = 211,
|
||||||
|
PetCrocolisk = 212,
|
||||||
|
PetCarrionBird = 213,
|
||||||
|
PetCrab = 214,
|
||||||
|
PetGorilla = 215,
|
||||||
|
PetRaptor = 217,
|
||||||
|
PetTallstrider = 218,
|
||||||
|
RacialUndead = 220,
|
||||||
|
Crossbows = 226,
|
||||||
|
Wands = 228,
|
||||||
|
Polearms = 229,
|
||||||
|
PetScorpid = 236,
|
||||||
|
PetTurtle = 251,
|
||||||
|
PetGenericHunter = 270,
|
||||||
|
PlateMail = 293,
|
||||||
|
LangGnomish = 313,
|
||||||
|
LangTroll = 315,
|
||||||
|
Enchanting = 333,
|
||||||
|
Fishing = 356,
|
||||||
|
Skinning = 393,
|
||||||
|
Mail = 413,
|
||||||
|
Leather = 414,
|
||||||
|
Cloth = 415,
|
||||||
|
Shield = 433,
|
||||||
|
FistWeapons = 473,
|
||||||
|
RaptorRiding = 533,
|
||||||
|
MechanostriderPiloting = 553,
|
||||||
|
UndeadHorsemanship = 554,
|
||||||
|
PetBat = 653,
|
||||||
|
PetHyena = 654,
|
||||||
|
PetBirdOfPrey = 655,
|
||||||
|
PetWindSerpent = 656,
|
||||||
|
LangForsaken = 673,
|
||||||
|
KodoRiding = 713,
|
||||||
|
RacialTroll = 733,
|
||||||
|
RacialGnome = 753,
|
||||||
|
RacialHuman = 754,
|
||||||
|
Jewelcrafting = 755,
|
||||||
|
RacialBloodElf = 756,
|
||||||
|
PetEventRemoteControl = 758,
|
||||||
|
LangDraenei = 759,
|
||||||
|
RacialDraenei = 760,
|
||||||
|
PetFelguard = 761,
|
||||||
|
Riding = 762,
|
||||||
|
PetDragonhawk = 763,
|
||||||
|
PetNetherRay = 764,
|
||||||
|
PetSporebat = 765,
|
||||||
|
PetWarpStalker = 766,
|
||||||
|
PetRavager = 767,
|
||||||
|
PetSerpent = 768,
|
||||||
|
Internal = 769,
|
||||||
|
Inscription = 773,
|
||||||
|
PetMoth = 775,
|
||||||
|
Mounts = 777,
|
||||||
|
Companions = 778,
|
||||||
|
PetExoticChimaera = 780,
|
||||||
|
PetExoticDevilsaur = 781,
|
||||||
|
PetGhoul = 782,
|
||||||
|
PetExoticSilithid = 783,
|
||||||
|
PetExoticWorm = 784,
|
||||||
|
PetWasp = 785,
|
||||||
|
PetExoticClefthoof = 786,
|
||||||
|
PetExoticCoreHound = 787,
|
||||||
|
PetExoticSpiritBeast = 788,
|
||||||
|
RacialWorgen = 789,
|
||||||
|
RacialGoblin = 790,
|
||||||
|
LangGilnean = 791,
|
||||||
|
LangGoblin = 792,
|
||||||
|
Archaeology = 794,
|
||||||
|
Hunter = 795,
|
||||||
|
DeathKnight = 796,
|
||||||
|
Druid = 798,
|
||||||
|
Paladin = 800,
|
||||||
|
Priest = 804,
|
||||||
|
PetWaterElemental = 805,
|
||||||
|
PetFox = 808,
|
||||||
|
AllGlyphs = 810,
|
||||||
|
PetDog = 811,
|
||||||
|
PetMonkey = 815,
|
||||||
|
PetShaleSpider = 817,
|
||||||
|
Beetle = 818,
|
||||||
|
AllGuildPerks = 821,
|
||||||
|
PetHydra = 824,
|
||||||
|
Monk = 829,
|
||||||
|
Warrior = 840,
|
||||||
|
Warlock = 849,
|
||||||
|
RacialPandaren = 899,
|
||||||
|
Mage = 904,
|
||||||
|
LangPandarenNeutral = 905,
|
||||||
|
LangPandarenAlliance = 906,
|
||||||
|
LangPandarenHorde = 907,
|
||||||
|
Rogue = 921,
|
||||||
|
Shaman = 924,
|
||||||
|
FelImp = 927,
|
||||||
|
Voidlord = 928,
|
||||||
|
Shivarra = 929,
|
||||||
|
Observer = 930,
|
||||||
|
Wrathguard = 931,
|
||||||
|
AllSpecializations = 934,
|
||||||
|
Runeforging = 960,
|
||||||
|
PetPrimalFireElemental = 962,
|
||||||
|
PetPrimalEarthElemental = 963,
|
||||||
|
WayOfTheGrill = 975,
|
||||||
|
WayOfTheWok = 976,
|
||||||
|
WayOfThePot = 977,
|
||||||
|
WayOfTheSteamer = 978,
|
||||||
|
WayOfTheOven = 979,
|
||||||
|
WayOfTheBrew = 980,
|
||||||
|
ApprenticeCooking = 981,
|
||||||
|
JourneymanCookbook = 982,
|
||||||
|
Porcupine = 983,
|
||||||
|
Crane = 984,
|
||||||
|
WaterStrider = 985,
|
||||||
|
PetExoticQuilen = 986,
|
||||||
|
PetGoat = 987,
|
||||||
|
Basilisk = 988,
|
||||||
|
NoPlayers = 999,
|
||||||
|
Direhorn = 1305,
|
||||||
|
PetPrimalStormElemental = 1748,
|
||||||
|
PetWaterElementalMinorTalentVersion = 1777,
|
||||||
|
PetExoticRylak = 1818,
|
||||||
|
PetRiverbeast = 1819,
|
||||||
|
Unused = 1830,
|
||||||
|
DemonHunter = 1848,
|
||||||
|
Logging = 1945,
|
||||||
|
PetTerrorguard = 1981,
|
||||||
|
PetAbyssal = 1982,
|
||||||
|
PetStag = 1993,
|
||||||
|
TradingPost = 2000,
|
||||||
|
Warglaives = 2152,
|
||||||
|
PetMechanical = 2189,
|
||||||
|
PetAbomination = 2216,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SkillState
|
||||||
|
{
|
||||||
|
Unchanged = 0,
|
||||||
|
Changed = 1,
|
||||||
|
New = 2,
|
||||||
|
Deleted = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SkillCategory : byte
|
||||||
|
{
|
||||||
|
Unk = 0,
|
||||||
|
Attributes = 5,
|
||||||
|
Weapon = 6,
|
||||||
|
Class = 7,
|
||||||
|
Armor = 8,
|
||||||
|
Secondary = 9,
|
||||||
|
Languages = 10,
|
||||||
|
Profession = 11,
|
||||||
|
Generic = 12
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SkillRangeType
|
||||||
|
{
|
||||||
|
Language, // 300..300
|
||||||
|
Level, // 1..max skill for level
|
||||||
|
Mono, // 1..1, grey monolite bar
|
||||||
|
Rank, // 1..skill for known rank
|
||||||
|
None // 0..0 always
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,565 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum AuraType
|
||||||
|
{
|
||||||
|
Any = -1,
|
||||||
|
|
||||||
|
None = 0,
|
||||||
|
BindSight = 1,
|
||||||
|
ModPossess = 2,
|
||||||
|
PeriodicDamage = 3,
|
||||||
|
Dummy = 4,
|
||||||
|
ModConfuse = 5,
|
||||||
|
ModCharm = 6,
|
||||||
|
ModFear = 7,
|
||||||
|
PeriodicHeal = 8,
|
||||||
|
ModAttackspeed = 9,
|
||||||
|
ModThreat = 10,
|
||||||
|
ModTaunt = 11,
|
||||||
|
ModStun = 12,
|
||||||
|
ModDamageDone = 13,
|
||||||
|
ModDamageTaken = 14,
|
||||||
|
DamageShield = 15,
|
||||||
|
ModStealth = 16,
|
||||||
|
ModStealthDetect = 17,
|
||||||
|
ModInvisibility = 18,
|
||||||
|
ModInvisibilityDetect = 19,
|
||||||
|
ObsModHealth = 20, // 20, 21 Unofficial
|
||||||
|
ObsModPower = 21,
|
||||||
|
ModResistance = 22,
|
||||||
|
PeriodicTriggerSpell = 23,
|
||||||
|
PeriodicEnergize = 24,
|
||||||
|
ModPacify = 25,
|
||||||
|
ModRoot = 26,
|
||||||
|
ModSilence = 27,
|
||||||
|
ReflectSpells = 28,
|
||||||
|
ModStat = 29,
|
||||||
|
ModSkill = 30,
|
||||||
|
ModIncreaseSpeed = 31,
|
||||||
|
ModIncreaseMountedSpeed = 32,
|
||||||
|
ModDecreaseSpeed = 33,
|
||||||
|
ModIncreaseHealth = 34,
|
||||||
|
ModIncreaseEnergy = 35,
|
||||||
|
ModShapeshift = 36,
|
||||||
|
EffectImmunity = 37,
|
||||||
|
StateImmunity = 38,
|
||||||
|
SchoolImmunity = 39,
|
||||||
|
DamageImmunity = 40,
|
||||||
|
DispelImmunity = 41,
|
||||||
|
ProcTriggerSpell = 42,
|
||||||
|
ProcTriggerDamage = 43,
|
||||||
|
TrackCreatures = 44,
|
||||||
|
TrackResources = 45,
|
||||||
|
Unk46 = 46, // Ignore All Gear Test Spells
|
||||||
|
ModParryPercent = 47,
|
||||||
|
Unk48 = 48, // One Periodic Spell
|
||||||
|
ModDodgePercent = 49,
|
||||||
|
ModCriticalHealingAmount = 50,
|
||||||
|
ModBlockPercent = 51,
|
||||||
|
ModWeaponCritPercent = 52,
|
||||||
|
PeriodicLeech = 53,
|
||||||
|
ModHitChance = 54,
|
||||||
|
ModSpellHitChance = 55,
|
||||||
|
Transform = 56,
|
||||||
|
ModSpellCritChance = 57,
|
||||||
|
ModIncreaseSwimSpeed = 58,
|
||||||
|
ModDamageDoneCreature = 59,
|
||||||
|
ModPacifySilence = 60,
|
||||||
|
ModScale = 61,
|
||||||
|
PeriodicHealthFunnel = 62,
|
||||||
|
ModAdditionalPowerCost = 63, // NYI
|
||||||
|
PeriodicManaLeech = 64,
|
||||||
|
ModCastingSpeedNotStack = 65,
|
||||||
|
FeignDeath = 66,
|
||||||
|
ModDisarm = 67,
|
||||||
|
ModStalked = 68,
|
||||||
|
SchoolAbsorb = 69,
|
||||||
|
ExtraAttacks = 70,
|
||||||
|
Unk71 = 71,
|
||||||
|
ModPowerCostSchoolPct = 72,
|
||||||
|
ModPowerCostSchool = 73,
|
||||||
|
ReflectSpellsSchool = 74,
|
||||||
|
ModLanguage = 75,
|
||||||
|
FarSight = 76,
|
||||||
|
MechanicImmunity = 77,
|
||||||
|
Mounted = 78,
|
||||||
|
ModDamagePercentDone = 79,
|
||||||
|
ModPercentStat = 80,
|
||||||
|
SplitDamagePct = 81,
|
||||||
|
WaterBreathing = 82,
|
||||||
|
ModBaseResistance = 83,
|
||||||
|
ModRegen = 84,
|
||||||
|
ModPowerRegen = 85,
|
||||||
|
ChannelDeathItem = 86,
|
||||||
|
ModDamagePercentTaken = 87,
|
||||||
|
ModHealthRegenPercent = 88,
|
||||||
|
PeriodicDamagePercent = 89,
|
||||||
|
Unk90 = 90, // Old ModResistChance
|
||||||
|
ModDetectRange = 91,
|
||||||
|
PreventsFleeing = 92,
|
||||||
|
ModUnattackable = 93,
|
||||||
|
InterruptRegen = 94,
|
||||||
|
Ghost = 95,
|
||||||
|
SpellMagnet = 96,
|
||||||
|
ManaShield = 97,
|
||||||
|
ModSkillTalent = 98,
|
||||||
|
ModAttackPower = 99,
|
||||||
|
AurasVisible = 100,
|
||||||
|
ModResistancePct = 101,
|
||||||
|
ModMeleeAttackPowerVersus = 102,
|
||||||
|
ModTotalThreat = 103,
|
||||||
|
WaterWalk = 104,
|
||||||
|
FeatherFall = 105,
|
||||||
|
Hover = 106,
|
||||||
|
AddFlatModifier = 107,
|
||||||
|
AddPctModifier = 108,
|
||||||
|
AddTargetTrigger = 109,
|
||||||
|
ModPowerRegenPercent = 110,
|
||||||
|
AddCasterHitTrigger = 111,
|
||||||
|
OverrideClassScripts = 112,
|
||||||
|
ModRangedDamageTaken = 113,
|
||||||
|
ModRangedDamageTakenPct = 114,
|
||||||
|
ModHealing = 115,
|
||||||
|
ModRegenDuringCombat = 116,
|
||||||
|
ModMechanicResistance = 117,
|
||||||
|
ModHealingPct = 118,
|
||||||
|
Unk119 = 119, // Old SharePetTracking
|
||||||
|
Untrackable = 120,
|
||||||
|
Empathy = 121,
|
||||||
|
ModOffhandDamagePct = 122,
|
||||||
|
ModTargetResistance = 123,
|
||||||
|
ModRangedAttackPower = 124,
|
||||||
|
ModMeleeDamageTaken = 125,
|
||||||
|
ModMeleeDamageTakenPct = 126,
|
||||||
|
RangedAttackPowerAttackerBonus = 127,
|
||||||
|
ModPossessPet = 128,
|
||||||
|
ModSpeedAlways = 129,
|
||||||
|
ModMountedSpeedAlways = 130,
|
||||||
|
ModRangedAttackPowerVersus = 131,
|
||||||
|
ModIncreaseEnergyPercent = 132,
|
||||||
|
ModIncreaseHealthPercent = 133,
|
||||||
|
ModManaRegenInterrupt = 134,
|
||||||
|
ModHealingDone = 135,
|
||||||
|
ModHealingDonePercent = 136,
|
||||||
|
ModTotalStatPercentage = 137,
|
||||||
|
ModMeleeHaste = 138,
|
||||||
|
ForceReaction = 139,
|
||||||
|
ModRangedHaste = 140,
|
||||||
|
Unk141 = 141, // Old ModRangedAmmoHaste, Unused Now
|
||||||
|
ModBaseResistancePct = 142,
|
||||||
|
ModRecoveryRate = 143, // NYI
|
||||||
|
SafeFall = 144,
|
||||||
|
ModPetTalentPoints = 145,
|
||||||
|
AllowTamePetType = 146,
|
||||||
|
MechanicImmunityMask = 147,
|
||||||
|
RetainComboPoints = 148,
|
||||||
|
ReducePushback = 149, // Reduce Pushback
|
||||||
|
ModShieldBlockvaluePct = 150,
|
||||||
|
TrackStealthed = 151, // Track Stealthed
|
||||||
|
ModDetectedRange = 152, // Mod Detected Range
|
||||||
|
Unk153 = 153, // Old SplitDamageFlat. Unused 4.3.4
|
||||||
|
ModStealthLevel = 154, // Stealth Level Modifier
|
||||||
|
ModWaterBreathing = 155, // Mod Water Breathing
|
||||||
|
ModReputationGain = 156, // Mod Reputation Gain
|
||||||
|
PetDamageMulti = 157, // Mod Pet Damage
|
||||||
|
ModShieldBlockvalue = 158,
|
||||||
|
NoPvpCredit = 159,
|
||||||
|
Unk160 = 160, // Old ModAoeAvoidance. Unused 4.3.4
|
||||||
|
ModHealthRegenInCombat = 161,
|
||||||
|
PowerBurn = 162,
|
||||||
|
ModCritDamageBonus = 163,
|
||||||
|
Unk164 = 164,
|
||||||
|
MeleeAttackPowerAttackerBonus = 165,
|
||||||
|
ModAttackPowerPct = 166,
|
||||||
|
ModRangedAttackPowerPct = 167,
|
||||||
|
ModDamageDoneVersus = 168,
|
||||||
|
Unk169 = 169, // Old ModCritPercentVersus. Unused 4.3.4
|
||||||
|
DetectAmore = 170,
|
||||||
|
ModSpeedNotStack = 171,
|
||||||
|
ModMountedSpeedNotStack = 172,
|
||||||
|
ModRecoveryRate2 = 173, // NYI
|
||||||
|
ModSpellDamageOfStatPercent = 174, // By Defeult Intelect, Dependent From ModSpellHealingOfStatPercent
|
||||||
|
ModSpellHealingOfStatPercent = 175,
|
||||||
|
SpiritOfRedemption = 176,
|
||||||
|
AoeCharm = 177,
|
||||||
|
ModMaxPowerPct = 178, // NYI
|
||||||
|
ModPowerDisplay = 179,
|
||||||
|
ModFlatSpellDamageVersus = 180,
|
||||||
|
Unk181 = 181, // Old ModFlatSpellCritDamageVersus - Possible Flat Spell Crit Damage Versus
|
||||||
|
ModResistanceOfStatPercent = 182,
|
||||||
|
ModCriticalThreat = 183,
|
||||||
|
ModAttackerMeleeHitChance = 184,
|
||||||
|
ModAttackerRangedHitChance = 185,
|
||||||
|
ModAttackerSpellHitChance = 186,
|
||||||
|
ModAttackerMeleeCritChance = 187,
|
||||||
|
ModAttackerRangedCritChance = 188,
|
||||||
|
ModRating = 189,
|
||||||
|
ModFactionReputationGain = 190,
|
||||||
|
UseNormalMovementSpeed = 191,
|
||||||
|
ModMeleeRangedHaste = 192,
|
||||||
|
MeleeSlow = 193,
|
||||||
|
ModTargetAbsorbSchool = 194,
|
||||||
|
ModTargetAbilityAbsorbSchool = 195,
|
||||||
|
ModCooldown = 196, // Only 24818 Noxious Breath
|
||||||
|
ModAttackerSpellAndWeaponCritChance = 197,
|
||||||
|
Unk198 = 198, // Old ModAllWeaponSkills
|
||||||
|
Unk199 = 199, // Old ModIncreasesSpellPctToHit. Unused 4.3.4
|
||||||
|
ModXpPct = 200,
|
||||||
|
Fly = 201,
|
||||||
|
IgnoreCombatResult = 202,
|
||||||
|
ModAttackerMeleeCritDamage = 203,
|
||||||
|
ModAttackerRangedCritDamage = 204,
|
||||||
|
ModChargeCooldown = 205, // NYI
|
||||||
|
ModIncreaseVehicleFlightSpeed = 206,
|
||||||
|
ModIncreaseMountedFlightSpeed = 207,
|
||||||
|
ModIncreaseFlightSpeed = 208,
|
||||||
|
ModMountedFlightSpeedAlways = 209,
|
||||||
|
ModVehicleSpeedAlways = 210,
|
||||||
|
ModFlightSpeedNotStack = 211,
|
||||||
|
ModHonorGainPct = 212,
|
||||||
|
ModRageFromDamageDealt = 213,
|
||||||
|
Unk214 = 214,
|
||||||
|
ArenaPreparation = 215,
|
||||||
|
HasteSpells = 216,
|
||||||
|
ModMeleeHaste2 = 217,
|
||||||
|
Unk218 = 218, // old SPELL_AURA_HASTE_RANGED
|
||||||
|
ModManaRegenFromStat = 219,
|
||||||
|
ModRatingFromStat = 220,
|
||||||
|
ModDetaunt = 221,
|
||||||
|
Unk222 = 222,
|
||||||
|
RaidProcFromCharge = 223,
|
||||||
|
Unk224 = 224,
|
||||||
|
RaidProcFromChargeWithValue = 225,
|
||||||
|
PeriodicDummy = 226,
|
||||||
|
PeriodicTriggerSpellWithValue = 227,
|
||||||
|
DetectStealth = 228,
|
||||||
|
ModAoeDamageAvoidance = 229,
|
||||||
|
ModMaxHealth = 230,
|
||||||
|
ProcTriggerSpellWithValue = 231,
|
||||||
|
MechanicDurationMod = 232,
|
||||||
|
ChangeModelForAllHumanoids = 233, // Client-Side Only
|
||||||
|
MechanicDurationModNotStack = 234,
|
||||||
|
ModDispelResist = 235,
|
||||||
|
ControlVehicle = 236,
|
||||||
|
ModSpellDamageOfAttackPower = 237,
|
||||||
|
ModSpellHealingOfAttackPower = 238,
|
||||||
|
ModScale2 = 239,
|
||||||
|
ModExpertise = 240,
|
||||||
|
ForceMoveForward = 241,
|
||||||
|
ModSpellDamageFromHealing = 242,
|
||||||
|
ModFaction = 243,
|
||||||
|
ComprehendLanguage = 244,
|
||||||
|
ModAuraDurationByDispel = 245,
|
||||||
|
ModAuraDurationByDispelNotStack = 246,
|
||||||
|
CloneCaster = 247,
|
||||||
|
ModCombatResultChance = 248,
|
||||||
|
ConvertRune = 249,
|
||||||
|
ModIncreaseHealth2 = 250,
|
||||||
|
ModEnemyDodge = 251,
|
||||||
|
ModSpeedSlowAll = 252,
|
||||||
|
ModBlockCritChance = 253,
|
||||||
|
ModDisarmOffhand = 254,
|
||||||
|
ModMechanicDamageTakenPercent = 255,
|
||||||
|
NoReagentUse = 256,
|
||||||
|
ModTargetResistBySpellClass = 257,
|
||||||
|
OverrideSummonedObject = 258,
|
||||||
|
Unk259 = 259, // Old ModHotPct, Unused 4.3.4
|
||||||
|
ScreenEffect = 260,
|
||||||
|
Phase = 261,
|
||||||
|
AbilityIgnoreAurastate = 262,
|
||||||
|
AllowOnlyAbility = 263,
|
||||||
|
Unk264 = 264,
|
||||||
|
Unk265 = 265,
|
||||||
|
Unk266 = 266,
|
||||||
|
ModImmuneAuraApplySchool = 267,
|
||||||
|
Unk268 = 268, // Old ModAttackPowerOfStatPercent. Unused 4.3.4
|
||||||
|
ModIgnoreTargetResist = 269,
|
||||||
|
ModSchoolMaskDamageFromCaster = 270, // NYI
|
||||||
|
ModSpellDamageFromCaster = 271,
|
||||||
|
IgnoreMeleeReset = 272,
|
||||||
|
XRay = 273,
|
||||||
|
Unk274 = 274, // Old AbilityConsumeNoAmmo, Unused 4.3.4
|
||||||
|
ModIgnoreShapeshift = 275,
|
||||||
|
ModDamageDoneForMechanic = 276,
|
||||||
|
Unk277 = 277, // Old ModMaxAffectedTargets. Unused 4.3.4
|
||||||
|
ModDisarmRanged = 278,
|
||||||
|
InitializeImages = 279,
|
||||||
|
Unk280 = 280, // Old ModArmorPenetrationPct Unused 4.3.4
|
||||||
|
ModGuildReputationGainPct = 281, // NYI
|
||||||
|
ModBaseHealthPct = 282,
|
||||||
|
ModHealingReceived = 283, // Possibly Only For Some Spell Family Class Spells
|
||||||
|
Linked = 284,
|
||||||
|
ModAttackPowerOfArmor = 285,
|
||||||
|
AbilityPeriodicCrit = 286,
|
||||||
|
DeflectSpells = 287,
|
||||||
|
IgnoreHitDirection = 288,
|
||||||
|
PreventDurabilityLoss = 289,
|
||||||
|
ModCritPct = 290,
|
||||||
|
ModXpQuestPct = 291,
|
||||||
|
OpenStable = 292,
|
||||||
|
OverrideSpells = 293,
|
||||||
|
PreventRegeneratePower = 294,
|
||||||
|
Unk295 = 295,
|
||||||
|
SetVehicleId = 296,
|
||||||
|
BlockSpellFamily = 297,
|
||||||
|
Strangulate = 298,
|
||||||
|
Unk299 = 299,
|
||||||
|
ShareDamagePct = 300,
|
||||||
|
SchoolHealAbsorb = 301,
|
||||||
|
Unk302 = 302,
|
||||||
|
ModDamageDoneVersusAurastate = 303,
|
||||||
|
ModFakeInebriate = 304,
|
||||||
|
ModMinimumSpeed = 305,
|
||||||
|
Unk306 = 306,
|
||||||
|
HealAbsorbTest = 307,
|
||||||
|
ModCritChanceForCaster = 308,
|
||||||
|
ModResilience = 309, // NYI
|
||||||
|
ModCreatureAoeDamageAvoidance = 310,
|
||||||
|
Unk311 = 311,
|
||||||
|
AnimReplacementSet = 312,
|
||||||
|
Unk313 = 313, // Not Used In 4.3.4 - Related To Mounts
|
||||||
|
PreventResurrection = 314,
|
||||||
|
UnderwaterWalking = 315,
|
||||||
|
PeriodicHaste = 316, // Not Used In 4.3.4 (Name From 3.3.5a)
|
||||||
|
ModSpellPowerPct = 317,
|
||||||
|
Mastery = 318,
|
||||||
|
ModMeleeHaste3 = 319,
|
||||||
|
ModRangedHaste2 = 320,
|
||||||
|
ModNoActions = 321,
|
||||||
|
InterfereTargetting = 322,
|
||||||
|
Unk323 = 323, // Not Used In 4.3.4
|
||||||
|
Unk324 = 324, // Spell Critical Chance (Probably By School Mask)
|
||||||
|
Unk325 = 325, // Not Used In 4.3.4
|
||||||
|
PhaseGroup = 326, // Phase Related
|
||||||
|
Unk327 = 327, // Not Used In 4.3.4
|
||||||
|
ProcOnPowerAmount = 328,
|
||||||
|
ModPowerGainPct = 329, // Nyi
|
||||||
|
CastWhileWalking = 330,
|
||||||
|
ForceWeather = 331,
|
||||||
|
OverrideActionbarSpells = 332,
|
||||||
|
OverrideActionbarSpellsTriggered = 333, // Spells cast with this override have no cast time or power cost
|
||||||
|
ModBlind = 334, // Nyi
|
||||||
|
Unk335 = 335,
|
||||||
|
ModFlyingRestrictions = 336, // Nyi
|
||||||
|
ModVendorItemsPrices = 337,
|
||||||
|
ModDurabilityLoss = 338,
|
||||||
|
IncreaseSkillGainChance = 339, // Nyi
|
||||||
|
ModResurrectedHealthByGuildMember = 340, // Increases Health Gained When Resurrected By A Guild Member By X
|
||||||
|
ModSpellCategoryCooldown = 341,
|
||||||
|
ModMeleeRangedHaste2 = 342,
|
||||||
|
ModMeleeDamageFromCaster = 343,
|
||||||
|
ModAutoattackDamage = 344,
|
||||||
|
BypassArmorForCaster = 345,
|
||||||
|
EnableAltPower = 346, // Nyi
|
||||||
|
ModSpellCooldownByHaste = 347,
|
||||||
|
DepositBonusMoneyInGuildBankOnLoot = 348, // Nyi
|
||||||
|
ModCurrencyGain = 349,
|
||||||
|
ModGatheringItemsGainedPercent = 350, // Nyi
|
||||||
|
Unk351 = 351,
|
||||||
|
Unk352 = 352,
|
||||||
|
ModCamouflage = 353, // Nyi
|
||||||
|
Unk354 = 354, // Restoration Shaman Mastery - Mod Healing Based On Target'S Health (Less = More Healing)
|
||||||
|
ModCastingSpeed = 355, // NYI
|
||||||
|
Unk356 = 356, // Arcane Mage Mastery - Mod Damage Based On Current Mana
|
||||||
|
EnableBoss1UnitFrame = 357,
|
||||||
|
WorgenAlteredForm = 358,
|
||||||
|
Unk359 = 359,
|
||||||
|
ProcTriggerSpellCopy = 360, // Procs The Same Spell That Caused This Proc (Dragonwrath, Tarecgosa'S Rest)
|
||||||
|
OverrideAutoattackWithMeleeSpell = 361, // NYI
|
||||||
|
Unk362 = 362, // Not Used In 4.3.4
|
||||||
|
ModNextSpell = 363, // Used By 101601 Throw Totem - Causes The Client To Initialize Spell Cast With Specified Spell
|
||||||
|
Unk364 = 364, // Not Used In 4.3.4
|
||||||
|
MaxFarClipPlane = 365, // Overrides Client'S View Distance Setting To Max("Fair", CurrentSetting) And Turns Off Terrain Display
|
||||||
|
OverrideSpellPowerByApPct = 366, // Sets Spellpower Equal To % Of Attack Power, Discarding All Other Bonuses (From Gear And Buffs)
|
||||||
|
OverrideAutoattackWithRangedSpell = 367, // NYI
|
||||||
|
Unk368 = 368, // Not Used In 4.3.4
|
||||||
|
EnablePowerBarTimer = 369,
|
||||||
|
SetFairFarClip = 370, // Overrides Client'S View Distance Setting To Max("Fair", CurrentSetting)
|
||||||
|
Unk371 = 371,
|
||||||
|
Unk372 = 372,
|
||||||
|
ModSpeedNoControl = 373, // NYI
|
||||||
|
ModifyFallDamagePct = 374,
|
||||||
|
Unk375 = 375,
|
||||||
|
ModCurrencyGainFromSource = 376, // NYI
|
||||||
|
CastWhileWalking2 = 377, // NYI
|
||||||
|
Unk378 = 378,
|
||||||
|
Unk379 = 379,
|
||||||
|
ModGlobalCooldownByHaste = 380, // Allows melee abilities to benefit from haste GCD reduction
|
||||||
|
Unk381 = 381,
|
||||||
|
ModPetStatPct = 382, // NYI
|
||||||
|
IgnoreSpellCooldown = 383,
|
||||||
|
Unk384 = 384,
|
||||||
|
ChanceOverrideAutoattackWithSpellOnSelf = 385,// NYI (with triggered spell cast by the initial caster?)
|
||||||
|
Unk386 = 386,
|
||||||
|
Unk387 = 387,
|
||||||
|
ModTaxiFlightSpeed = 388,
|
||||||
|
Unk389 = 389,
|
||||||
|
Unk390 = 390,
|
||||||
|
Unk391 = 391,
|
||||||
|
Unk392 = 392,
|
||||||
|
Unk393 = 393,
|
||||||
|
ShowConfirmationPrompt = 394,
|
||||||
|
AreaTrigger = 395, // NYI
|
||||||
|
ProcOnPowerAmount2 = 396,
|
||||||
|
Unk397 = 397,
|
||||||
|
Unk398 = 398,
|
||||||
|
Unk399 = 399,
|
||||||
|
ModSkill2 = 400,
|
||||||
|
Unk401 = 401,
|
||||||
|
ModOverridePowerDisplay = 402,
|
||||||
|
OverrideSpellVisual = 403,
|
||||||
|
OverrideAttackPowerBySpPct = 404,
|
||||||
|
ModRatingPct = 405, // NYI
|
||||||
|
KeyboundOverride = 406, // NYI
|
||||||
|
ModFear2 = 407,
|
||||||
|
Unk408 = 408,
|
||||||
|
CanTurnWhileFalling = 409,
|
||||||
|
Unk410 = 410,
|
||||||
|
ModMaxCharges = 411,
|
||||||
|
Unk412 = 412,
|
||||||
|
Unk413 = 413,
|
||||||
|
Unk414 = 414,
|
||||||
|
Unk415 = 415,
|
||||||
|
ModCooldownByHasteRegen = 416,
|
||||||
|
ModGlobalCooldownByHasteRegen = 417,
|
||||||
|
ModMaxPower = 418, // NYI
|
||||||
|
ModBaseManaPct = 419,
|
||||||
|
ModBattlePetXpPct = 420,
|
||||||
|
ModAbsorbEffectsAmountPct = 421, // NYI
|
||||||
|
Unk422 = 422,
|
||||||
|
Unk423 = 423,
|
||||||
|
Unk424 = 424,
|
||||||
|
Unk425 = 425,
|
||||||
|
Unk426 = 426,
|
||||||
|
ScalePlayerLevel = 427, // NYI
|
||||||
|
Unk428 = 428,
|
||||||
|
Unk429 = 429,
|
||||||
|
PlayScene = 430,
|
||||||
|
ModOverrideZonePvpType = 431, // NYI
|
||||||
|
Unk432 = 432,
|
||||||
|
Unk433 = 433,
|
||||||
|
Unk434 = 434,
|
||||||
|
Unk435 = 435,
|
||||||
|
ModEnvironmentalDamageTaken = 436, // NYI
|
||||||
|
ModMinimumSpeedRate = 437,
|
||||||
|
PreloadPhase = 438, // NYI
|
||||||
|
Unk439 = 439,
|
||||||
|
ModMultistrikeDamage = 440, // NYI
|
||||||
|
ModMultistrikeChance = 441, // NYI
|
||||||
|
ModReadiness = 442, // NYI
|
||||||
|
ModLeech = 443, // NYI
|
||||||
|
Unk444 = 444,
|
||||||
|
Unk445 = 445,
|
||||||
|
Unk446 = 446,
|
||||||
|
ModXpFromCreatureType = 447,
|
||||||
|
Unk448 = 448,
|
||||||
|
Unk449 = 449,
|
||||||
|
Unk450 = 450,
|
||||||
|
OverridePetSpecs = 451,
|
||||||
|
Unk452 = 452,
|
||||||
|
ChargeRecoveryMod = 453,
|
||||||
|
ChargeRecoveryMultiplier = 454,
|
||||||
|
ModRoot2 = 455,
|
||||||
|
ChargeRecoveryAffectedByHaste = 456,
|
||||||
|
ChargeRecoveryAffectedByHasteRegen = 457,
|
||||||
|
IgnoreDualWieldHitPenalty = 458,
|
||||||
|
IgnoreMovementForces = 459,
|
||||||
|
ResetCooldownsOnDuelStart = 460,
|
||||||
|
Unk461 = 461,
|
||||||
|
ModHealingAndAbsorbFromCaster = 462, // NYI
|
||||||
|
ConvertCritRatingPctToParryRating = 463, // NYI
|
||||||
|
ModAttackPowerOfBonusArmor = 464, // NYI
|
||||||
|
ModBonusArmor = 465, // NYI
|
||||||
|
ModBonusArmorPct = 466,
|
||||||
|
ModStatBonusPct = 467,
|
||||||
|
TriggerSpellOnHealthBelowPct = 468,
|
||||||
|
ShowConfirmationPromptWithDifficulty = 469,
|
||||||
|
Unk470 = 470,
|
||||||
|
ModVersatility = 471, // NYI
|
||||||
|
Unk472 = 472,
|
||||||
|
PreventDurabilityLossFromCombat = 473,
|
||||||
|
Unk474 = 474,
|
||||||
|
AllowUsingGameobjectsWhileMounted = 475,
|
||||||
|
ModCurrencyGainLooted = 476,
|
||||||
|
Unk477 = 477,
|
||||||
|
Unk478 = 478,
|
||||||
|
Unk479 = 479,
|
||||||
|
Unk480 = 480,
|
||||||
|
ConvertConsumedRune = 481,
|
||||||
|
Unk482 = 482,
|
||||||
|
SuppressTransforms = 483, // NYI
|
||||||
|
Unk484 = 484,
|
||||||
|
Unk485 = 485,
|
||||||
|
Unk486 = 486,
|
||||||
|
Unk487 = 487,
|
||||||
|
Unk488 = 488,
|
||||||
|
Unk489 = 489,
|
||||||
|
Unk490 = 490,
|
||||||
|
Unk491 = 491,
|
||||||
|
Total = 492
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum AuraEffectHandleModes
|
||||||
|
{
|
||||||
|
Default = 0x0,
|
||||||
|
Real = 0x01, // Handler Applies/Removes Effect From Unit
|
||||||
|
SendForClient = 0x02, // Handler Sends Apply/Remove Packet To Unit
|
||||||
|
ChangeAmount = 0x04, // Handler Updates Effect On Target After Effect Amount Change
|
||||||
|
Reapply = 0x08, // Handler Updates Effect On Target After Aura Is Reapplied On Target
|
||||||
|
Stat = 0x10, // Handler Updates Effect On Target When Stat Removal/Apply Is Needed For Calculations By Core
|
||||||
|
Skill = 0x20, // Handler Updates Effect On Target When Skill Removal/Apply Is Needed For Calculations By Core
|
||||||
|
SendForClientMask = (SendForClient | Real), // Any Case Handler Need To Send Packet
|
||||||
|
ChangeAmountMask = (ChangeAmount | Real), // Any Case Handler Applies Effect Depending On Amount
|
||||||
|
ChangeAmountSendForClientMask = (ChangeAmountMask | SendForClientMask),
|
||||||
|
RealOrReapplyMask = (Reapply | Real)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Diminishing Returns Types
|
||||||
|
public enum DiminishingReturnsType
|
||||||
|
{
|
||||||
|
None = 0, // this spell is not diminished, but may have its duration limited
|
||||||
|
Player = 1, // this spell is diminished only when applied on players
|
||||||
|
All = 2 // this spell is diminished in every case
|
||||||
|
}
|
||||||
|
|
||||||
|
// Diminishing Return Groups
|
||||||
|
public enum DiminishingGroup
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Root = 1,
|
||||||
|
Stun = 2,
|
||||||
|
Incapacitate = 3,
|
||||||
|
Disorient = 4,
|
||||||
|
Silence = 5,
|
||||||
|
AOEKnockback = 6,
|
||||||
|
Taunt = 7,
|
||||||
|
LimitOnly = 8,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum DiminishingLevels
|
||||||
|
{
|
||||||
|
Level1 = 0,
|
||||||
|
Level2 = 1,
|
||||||
|
Level3 = 2,
|
||||||
|
Immune = 3,
|
||||||
|
Level4 = 3,
|
||||||
|
TauntImmune = 4
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum GMTicketSystemStatus
|
||||||
|
{
|
||||||
|
Disabled = 0,
|
||||||
|
Enabled = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GMSupportComplaintType
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Language = 2,
|
||||||
|
PlayerName = 4,
|
||||||
|
Cheat = 15,
|
||||||
|
GuildName = 23,
|
||||||
|
Spamming = 24
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SupportSpamType
|
||||||
|
{
|
||||||
|
Mail = 0,
|
||||||
|
Chat = 1,
|
||||||
|
Calendar = 2
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,577 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum VehicleSeatFlags : uint
|
||||||
|
{
|
||||||
|
HasLowerAnimForEnter = 0x01,
|
||||||
|
HasLowerAnimForRide = 0x02,
|
||||||
|
Unk3 = 0x04,
|
||||||
|
ShouldUseVehSeatExitAnimOnVoluntaryExit = 0x08,
|
||||||
|
Unk5 = 0x10,
|
||||||
|
Unk6 = 0x20,
|
||||||
|
Unk7 = 0x40,
|
||||||
|
Unk8 = 0x80,
|
||||||
|
Unk9 = 0x100,
|
||||||
|
HidePassenger = 0x200, // Passenger Is Hidden
|
||||||
|
AllowTurning = 0x400, // Needed For CgcameraSyncfreelookfacing
|
||||||
|
CanControl = 0x800, // LuaUnitinvehiclecontrolseat
|
||||||
|
CanCastMountSpell = 0x1000, // Can Cast Spells With SpellAuraMounted From Seat (Possibly 4.X Only, 0 Seats On 3.3.5a)
|
||||||
|
Uncontrolled = 0x2000, // Can Override !& CanEnterOrExit
|
||||||
|
CanAttack = 0x4000, // Can Attack, Cast Spells And Use Items From Vehicle
|
||||||
|
ShouldUseVehSeatExitAnimOnForcedExit = 0x8000,
|
||||||
|
Unk17 = 0x10000,
|
||||||
|
Unk18 = 0x20000, // Needs Research And Support (28 Vehicles): Allow Entering Vehicles While Keeping Specific Permanent(?) Auras That Impose Visuals (States Like Beeing Under Freeze/Stun Mechanic, Emote State Animations).
|
||||||
|
HasVehExitAnimVoluntaryExit = 0x40000,
|
||||||
|
HasVehExitAnimForcedExit = 0x80000,
|
||||||
|
PassengerNotSelectable = 0x100000,
|
||||||
|
Unk22 = 0x200000,
|
||||||
|
RecHasVehicleEnterAnim = 0x400000,
|
||||||
|
IsUsingVehicleControls = 0x800000, // LuaIsusingvehiclecontrols
|
||||||
|
EnableVehicleZoom = 0x1000000,
|
||||||
|
CanEnterOrExit = 0x2000000, // LuaCanexitvehicle - Can Enter And Exit At Free Will
|
||||||
|
CanSwitch = 0x4000000, // LuaCanswitchvehicleseats
|
||||||
|
HasStartWaritingForVehTransitionAnimEnter = 0x8000000,
|
||||||
|
HasStartWaritingForVehTransitionAnimExit = 0x10000000,
|
||||||
|
CanCast = 0x20000000, // LuaUnithasvehicleui
|
||||||
|
Unk2 = 0x40000000, // Checked In Conjunction With 0x800 In Castspell2
|
||||||
|
AllowsInteraction = 0x80000000
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum VehicleSeatFlagsB : uint
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
UsableForced = 0x02,
|
||||||
|
TargetsInRaidUi = 0x08, // Lua_Unittargetsvehicleinraidui
|
||||||
|
Ejectable = 0x20, // Ejectable
|
||||||
|
UsableForced2 = 0x40,
|
||||||
|
UsableForced3 = 0x100,
|
||||||
|
KeepPet = 0x20000,
|
||||||
|
UsableForced4 = 0x02000000,
|
||||||
|
CanSwitch = 0x4000000,
|
||||||
|
VehiclePlayerframeUi = 0x80000000 // Lua_Unithasvehicleplayerframeui - Actually Checked For Flagsb &~ 0x80000000
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SpellClickCastFlags
|
||||||
|
{
|
||||||
|
CasterClicker = 0x01,
|
||||||
|
TargetClicker = 0x02,
|
||||||
|
OrigCasterOwner = 0x04
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public enum SummonSlot
|
||||||
|
{
|
||||||
|
Pet = 0,
|
||||||
|
Totem = 1,
|
||||||
|
MiniPet = 5,
|
||||||
|
Quest = 6,
|
||||||
|
}
|
||||||
|
public enum PlayerTotemType
|
||||||
|
{
|
||||||
|
Fire = 63,
|
||||||
|
Earth = 81,
|
||||||
|
Water = 82,
|
||||||
|
Air = 83
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BaseModType
|
||||||
|
{
|
||||||
|
FlatMod,
|
||||||
|
PCTmod,
|
||||||
|
End
|
||||||
|
}
|
||||||
|
|
||||||
|
//To all Immune system, if target has immunes,
|
||||||
|
//some spell that related to ImmuneToDispel or ImmuneToSchool or ImmuneToDamage type can't cast to it,
|
||||||
|
//some spell_effects that related to ImmuneToEffect<effect>(only this effect in the spell) can't cast to it,
|
||||||
|
//some aura(related to Mechanics or ImmuneToState<aura>) can't apply to it.
|
||||||
|
public enum SpellImmunity
|
||||||
|
{
|
||||||
|
Effect = 0, // enum SpellEffects
|
||||||
|
State = 1, // enum AuraType
|
||||||
|
School = 2, // enum SpellSchoolMask
|
||||||
|
Damage = 3, // enum SpellSchoolMask
|
||||||
|
Dispel = 4, // enum DispelType
|
||||||
|
Mechanic = 5, // enum Mechanics
|
||||||
|
Id = 6,
|
||||||
|
Max = 7
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public enum BaseModGroup
|
||||||
|
{
|
||||||
|
CritPercentage,
|
||||||
|
RangedCritPercentage,
|
||||||
|
OffhandCritPercentage,
|
||||||
|
ShieldBlockValue,
|
||||||
|
End
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum DamageEffectType
|
||||||
|
{
|
||||||
|
Direct = 0, // used for normal weapon damage (not for class abilities or spells)
|
||||||
|
SpellDirect = 1, // spell/class abilities damage
|
||||||
|
DOT = 2,
|
||||||
|
Heal = 3,
|
||||||
|
NoDamage = 4, // used also in case when damage applied to health but not applied to spell channelInterruptFlags/etc
|
||||||
|
Self = 5
|
||||||
|
}
|
||||||
|
public enum WeaponDamageRange
|
||||||
|
{
|
||||||
|
MinDamage,
|
||||||
|
MaxDamage
|
||||||
|
}
|
||||||
|
public enum UnitMods
|
||||||
|
{
|
||||||
|
StatStrength, // STAT_STRENGTH..UNIT_MOD_STAT_INTELLECT must be in existed order, it's accessed by index values of Stats enum.
|
||||||
|
StatAgility,
|
||||||
|
StatStamina,
|
||||||
|
StatIntellect,
|
||||||
|
Health,
|
||||||
|
Mana, // MANA..RUNIC_POWER must be in existed order, it's accessed by index values of Powers enum.
|
||||||
|
Rage,
|
||||||
|
Focus,
|
||||||
|
Energy,
|
||||||
|
Unused, // Old HAPPINESS
|
||||||
|
Rune,
|
||||||
|
RunicPower,
|
||||||
|
SoulShards,
|
||||||
|
Eclipse,
|
||||||
|
HolyPower,
|
||||||
|
Alternative,
|
||||||
|
Maelstrom,
|
||||||
|
Chi,
|
||||||
|
Insanity,
|
||||||
|
BurningEmbers,
|
||||||
|
DemonicFury,
|
||||||
|
ArcaneCharges,
|
||||||
|
Fury,
|
||||||
|
Pain,
|
||||||
|
Armor, // ARMOR..RESISTANCE_ARCANE must be in existed order, it's accessed by index values of SpellSchools enum.
|
||||||
|
ResistanceHoly,
|
||||||
|
ResistanceFire,
|
||||||
|
ResistanceNature,
|
||||||
|
ResistanceFrost,
|
||||||
|
ResistanceShadow,
|
||||||
|
ResistanceArcane,
|
||||||
|
AttackPower,
|
||||||
|
AttackPowerRanged,
|
||||||
|
DamageMainHand,
|
||||||
|
DamageOffHand,
|
||||||
|
DamageRanged,
|
||||||
|
End,
|
||||||
|
// synonyms
|
||||||
|
StatStart = StatStrength,
|
||||||
|
StatEnd = StatIntellect + 1,
|
||||||
|
ResistanceStart = Armor,
|
||||||
|
ResistanceEnd = ResistanceArcane + 1,
|
||||||
|
PowerStart = Mana,
|
||||||
|
PowerEnd = Pain + 1
|
||||||
|
}
|
||||||
|
public enum UnitModifierType
|
||||||
|
{
|
||||||
|
BaseValue = 0,
|
||||||
|
BasePCTExcludeCreate = 1, // percent modifier affecting all stat values from auras and gear but not player base for level
|
||||||
|
BasePCT = 2,
|
||||||
|
TotalValue = 3,
|
||||||
|
TotalPCT = 4,
|
||||||
|
End = 5
|
||||||
|
}
|
||||||
|
public enum VictimState
|
||||||
|
{
|
||||||
|
Intact = 0, // set when attacker misses
|
||||||
|
Hit = 1, // victim got clear/blocked hit
|
||||||
|
Dodge = 2,
|
||||||
|
Parry = 3,
|
||||||
|
Imterrupt = 4,
|
||||||
|
Blocks = 5, // unused? not set when blocked, even on full block
|
||||||
|
Evades = 6,
|
||||||
|
Immune = 7,
|
||||||
|
Deflects = 8
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum HitInfo
|
||||||
|
{
|
||||||
|
NormalSwing = 0x0,
|
||||||
|
Unk1 = 0x01, // req correct packet structure
|
||||||
|
AffectsVictim = 0x02,
|
||||||
|
OffHand = 0x04,
|
||||||
|
Unk2 = 0x08,
|
||||||
|
Miss = 0x10,
|
||||||
|
FullAbsorb = 0x20,
|
||||||
|
PartialAbsorb = 0x40,
|
||||||
|
FullResist = 0x80,
|
||||||
|
PartialResist = 0x100,
|
||||||
|
CriticalHit = 0x200, // critical hit
|
||||||
|
Unk10 = 0x400,
|
||||||
|
Unk11 = 0x800,
|
||||||
|
Unk12 = 0x1000,
|
||||||
|
Block = 0x2000, // blocked damage
|
||||||
|
Unk14 = 0x4000, // set only if meleespellid is present// no world text when victim is hit for 0 dmg(HideWorldTextForNoDamage?)
|
||||||
|
Unk15 = 0x8000, // player victim?// something related to blod sprut visual (BloodSpurtInBack?)
|
||||||
|
Glancing = 0x10000,
|
||||||
|
Crushing = 0x20000,
|
||||||
|
NoAnimation = 0x40000,
|
||||||
|
Unk19 = 0x80000,
|
||||||
|
Unk20 = 0x100000,
|
||||||
|
SwingNoHitSound = 0x200000, // unused?
|
||||||
|
Unk22 = 0x00400000,
|
||||||
|
RageGain = 0x800000,
|
||||||
|
FakeDamage = 0x1000000 // enables damage animation even if no damage done, set only if no damage
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ReactStates
|
||||||
|
{
|
||||||
|
Passive = 0,
|
||||||
|
Defensive = 1,
|
||||||
|
Aggressive = 2,
|
||||||
|
Assist = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// UnitStandStateType
|
||||||
|
/// </summary>
|
||||||
|
public enum UnitStandStateType
|
||||||
|
{
|
||||||
|
Stand = 0,
|
||||||
|
Sit = 1,
|
||||||
|
SitChair = 2,
|
||||||
|
Sleep = 3,
|
||||||
|
SitLowChair = 4,
|
||||||
|
SitMediumChair = 5,
|
||||||
|
SitHighChair = 6,
|
||||||
|
Dead = 7,
|
||||||
|
Kneel = 8,
|
||||||
|
Submerged = 9
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct UnitBytes0Offsets
|
||||||
|
{
|
||||||
|
public const byte Race = 0;
|
||||||
|
public const byte Class = 1;
|
||||||
|
public const byte PlayerClass = 2;
|
||||||
|
public const byte Gender = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct UnitBytes1Offsets
|
||||||
|
{
|
||||||
|
public const byte StandState = 0;
|
||||||
|
public const byte PetTalents = 1; // unused
|
||||||
|
public const byte VisFlag = 2;
|
||||||
|
public const byte AnimTier = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum UnitStandFlags
|
||||||
|
{
|
||||||
|
Unk1 = 0x01,
|
||||||
|
Creep = 0x02,
|
||||||
|
Untrackable = 0x04,
|
||||||
|
Unk4 = 0x08,
|
||||||
|
Unk5 = 0x10,
|
||||||
|
All = 0xFF
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum UnitBytes1Flags
|
||||||
|
{
|
||||||
|
AlwaysStand = 0x01,
|
||||||
|
Hover = 0x02,
|
||||||
|
Unk3 = 0x04,
|
||||||
|
All = 0xFF
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct UnitBytes2Offsets
|
||||||
|
{
|
||||||
|
public const byte SheathState = 0;
|
||||||
|
public const byte PvpFlag = 1;
|
||||||
|
public const byte PetFlags = 2;
|
||||||
|
public const byte ShapeshiftForm = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum UnitBytes2Flags
|
||||||
|
{
|
||||||
|
PvP = 0x01,
|
||||||
|
Unk1 = 0x02,
|
||||||
|
FFAPvp = 0x04,
|
||||||
|
Sanctuary = 0x08,
|
||||||
|
Unk4 = 0x10,
|
||||||
|
Unk5 = 0x20,
|
||||||
|
Unk6 = 0x40,
|
||||||
|
Unk7 = 0x80,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum UnitPetFlags
|
||||||
|
{
|
||||||
|
CanBeRenamed = 0x01,
|
||||||
|
CanBeAbandoned = 0x02
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// UnitFields.Bytes2, 3
|
||||||
|
/// </summary>
|
||||||
|
public enum ShapeShiftForm
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
CatForm = 1,
|
||||||
|
TreeOfLife = 2,
|
||||||
|
TravelForm = 3,
|
||||||
|
AquaticForm = 4,
|
||||||
|
BearForm = 5,
|
||||||
|
Ambient = 6,
|
||||||
|
Ghoul = 7,
|
||||||
|
DireBearForm = 8,
|
||||||
|
CraneStance = 9,
|
||||||
|
TharonjaSkeleton = 10,
|
||||||
|
DarkmoonTestOfStrength = 11,
|
||||||
|
BlbPlayer = 12,
|
||||||
|
ShadowDance = 13,
|
||||||
|
CreatureBear = 14,
|
||||||
|
CreatureCat = 15,
|
||||||
|
GhostWolf = 16,
|
||||||
|
BattleStance = 17,
|
||||||
|
DefensiveStance = 18,
|
||||||
|
BerserkerStance = 19,
|
||||||
|
SerpentStance = 20,
|
||||||
|
Zombie = 21,
|
||||||
|
Metamorphosis = 22,
|
||||||
|
OxStance = 23,
|
||||||
|
TigerStance = 24,
|
||||||
|
Undead = 25,
|
||||||
|
Frenzy = 26,
|
||||||
|
FlightFormEpic = 27,
|
||||||
|
Shadowform = 28,
|
||||||
|
FlightForm = 29,
|
||||||
|
Stealth = 30,
|
||||||
|
MoonkinForm = 31,
|
||||||
|
SpiritOfRedemption = 32,
|
||||||
|
GladiatorStance = 33
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ReactiveType
|
||||||
|
{
|
||||||
|
Defense = 0,
|
||||||
|
HunterParry = 1,
|
||||||
|
OverPower = 2,
|
||||||
|
Max = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SpellValueMod
|
||||||
|
{
|
||||||
|
BasePoint0,
|
||||||
|
BasePoint1,
|
||||||
|
BasePoint2,
|
||||||
|
BasePoint3,
|
||||||
|
BasePoint4,
|
||||||
|
BasePoint5,
|
||||||
|
BasePoint6,
|
||||||
|
BasePoint7,
|
||||||
|
BasePoint8,
|
||||||
|
BasePoint9,
|
||||||
|
BasePoint10,
|
||||||
|
BasePoint11,
|
||||||
|
BasePoint12,
|
||||||
|
BasePoint13,
|
||||||
|
BasePoint14,
|
||||||
|
BasePoint15,
|
||||||
|
BasePoint16,
|
||||||
|
BasePoint17,
|
||||||
|
BasePoint18,
|
||||||
|
BasePoint19,
|
||||||
|
BasePoint20,
|
||||||
|
BasePoint21,
|
||||||
|
BasePoint22,
|
||||||
|
BasePoint23,
|
||||||
|
BasePoint24,
|
||||||
|
BasePoint25,
|
||||||
|
BasePoint26,
|
||||||
|
BasePoint27,
|
||||||
|
BasePoint28,
|
||||||
|
BasePoint29,
|
||||||
|
BasePoint30,
|
||||||
|
BasePoint31,
|
||||||
|
End,
|
||||||
|
RadiusMod,
|
||||||
|
MaxTargets,
|
||||||
|
AuraStack
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CombatRating
|
||||||
|
{
|
||||||
|
Amplify = 0,
|
||||||
|
DefenseSkill = 1,
|
||||||
|
Dodge = 2,
|
||||||
|
Parry = 3,
|
||||||
|
Block = 4,
|
||||||
|
HitMelee = 5,
|
||||||
|
HitRanged = 6,
|
||||||
|
HitSpell = 7,
|
||||||
|
CritMelee = 8,
|
||||||
|
CritRanged = 9,
|
||||||
|
CritSpell = 10,
|
||||||
|
Multistrike = 11,
|
||||||
|
Readiness = 12,
|
||||||
|
Speed = 13,
|
||||||
|
ResilienceCritTaken = 14,
|
||||||
|
ResiliencePlayerDamage = 15,
|
||||||
|
Lifesteal = 16,
|
||||||
|
HasteMelee = 17,
|
||||||
|
HasteRanged = 18,
|
||||||
|
HasteSpell = 19,
|
||||||
|
Avoidance = 20,
|
||||||
|
Studiness = 21,
|
||||||
|
Unused7 = 22,
|
||||||
|
Expertise = 23,
|
||||||
|
ArmorPenetration = 24,
|
||||||
|
Mastery = 25,
|
||||||
|
PvpPower = 26,
|
||||||
|
Cleave = 27,
|
||||||
|
VersatilityDamageDone = 28,
|
||||||
|
VersatilityHealingDone = 29,
|
||||||
|
VersatilityDamageTaken = 30,
|
||||||
|
Unused12 = 31,
|
||||||
|
Max = 32
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum DeathState
|
||||||
|
{
|
||||||
|
Alive = 0,
|
||||||
|
JustDied = 1,
|
||||||
|
Corpse = 2,
|
||||||
|
Dead = 3,
|
||||||
|
JustRespawned = 4
|
||||||
|
}
|
||||||
|
public enum UnitState : uint
|
||||||
|
{
|
||||||
|
Died = 0x01, // Player Has Fake Death Aura
|
||||||
|
MeleeAttacking = 0x02, // Player Is Melee Attacking Someone
|
||||||
|
//Melee_Attack_By = 0x04, // Player Is Melee Attack By Someone
|
||||||
|
Stunned = 0x08,
|
||||||
|
Roaming = 0x10,
|
||||||
|
Chase = 0x20,
|
||||||
|
//Searching = 0x40,
|
||||||
|
Fleeing = 0x80,
|
||||||
|
InFlight = 0x100, // Player Is In Flight Mode
|
||||||
|
Follow = 0x200,
|
||||||
|
Root = 0x400,
|
||||||
|
Confused = 0x800,
|
||||||
|
Distracted = 0x1000,
|
||||||
|
Isolated = 0x2000, // Area Auras Do Not Affect Other Players
|
||||||
|
AttackPlayer = 0x4000,
|
||||||
|
Casting = 0x8000,
|
||||||
|
Possessed = 0x10000,
|
||||||
|
Charging = 0x20000,
|
||||||
|
Jumping = 0x40000,
|
||||||
|
//Onvehicle = 0x80000,
|
||||||
|
Move = 0x100000,
|
||||||
|
Rotating = 0x200000,
|
||||||
|
Evade = 0x400000,
|
||||||
|
RoamingMove = 0x800000,
|
||||||
|
ConfusedMove = 0x1000000,
|
||||||
|
FleeingMove = 0x2000000,
|
||||||
|
ChaseMove = 0x4000000,
|
||||||
|
FollowMove = 0x8000000,
|
||||||
|
IgnorePathfinding = 0x10000000,
|
||||||
|
Unattackable = InFlight,
|
||||||
|
// For Real Move Using Movegen Check And Stop (Except Unstoppable Flight)
|
||||||
|
Moving = RoamingMove | ConfusedMove | FleeingMove | ChaseMove | FollowMove,
|
||||||
|
Controlled = (Confused | Stunned | Fleeing),
|
||||||
|
LostControl = (Controlled | Jumping | Charging),
|
||||||
|
Sightless = (LostControl | Evade),
|
||||||
|
CannotAutoattack = (LostControl | Casting),
|
||||||
|
CannotTurn = (LostControl | Rotating),
|
||||||
|
// Stay By Different Reasons
|
||||||
|
NotMove = Root | Stunned | Died | Distracted,
|
||||||
|
AllState = 0xffffffff //(Stopped | Moving | In_Combat | In_Flight)
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum UnitMoveType
|
||||||
|
{
|
||||||
|
Walk = 0,
|
||||||
|
Run = 1,
|
||||||
|
RunBack = 2,
|
||||||
|
Swim = 3,
|
||||||
|
SwimBack = 4,
|
||||||
|
TurnRate = 5,
|
||||||
|
Flight = 6,
|
||||||
|
FlightBack = 7,
|
||||||
|
PitchRate = 8,
|
||||||
|
Max = 9
|
||||||
|
}
|
||||||
|
public enum WeaponAttackType
|
||||||
|
{
|
||||||
|
BaseAttack = 0,
|
||||||
|
OffAttack = 1,
|
||||||
|
RangedAttack = 2,
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum UnitTypeMask
|
||||||
|
{
|
||||||
|
None = 0x0,
|
||||||
|
Summon = 0x01,
|
||||||
|
Minion = 0x02,
|
||||||
|
Guardian = 0x04,
|
||||||
|
Totem = 0x08,
|
||||||
|
Pet = 0x10,
|
||||||
|
Vehicle = 0x20,
|
||||||
|
Puppet = 0x40,
|
||||||
|
HunterPet = 0x80,
|
||||||
|
ControlableGuardian = 0x100,
|
||||||
|
Accessory = 0x200
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CurrentSpellTypes
|
||||||
|
{
|
||||||
|
Melee = 0,
|
||||||
|
Generic = 1,
|
||||||
|
Channeled = 2,
|
||||||
|
AutoRepeat = 3,
|
||||||
|
Max = 4
|
||||||
|
}
|
||||||
|
public enum SheathState
|
||||||
|
{
|
||||||
|
Unarmed = 0, // non prepared weapon
|
||||||
|
Melee = 1, // prepared melee weapon
|
||||||
|
Ranged = 2, // prepared ranged weapon
|
||||||
|
Max = 3
|
||||||
|
}
|
||||||
|
public enum MeleeHitOutcome
|
||||||
|
{
|
||||||
|
Evade,
|
||||||
|
Miss,
|
||||||
|
Dodge,
|
||||||
|
Block,
|
||||||
|
Parry,
|
||||||
|
Glancing,
|
||||||
|
Crit,
|
||||||
|
Crushing,
|
||||||
|
Normal
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum UnitDynFlags
|
||||||
|
{
|
||||||
|
None = 0x00,
|
||||||
|
HideModel = 0x02, // Object model is not shown with this flag
|
||||||
|
Lootable = 0x04,
|
||||||
|
TrackUnit = 0x08,
|
||||||
|
Tapped = 0x10, // Lua_UnitIsTapped
|
||||||
|
SpecialInfo = 0x20,
|
||||||
|
Dead = 0x40,
|
||||||
|
ReferAFriend = 0x80
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,411 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum ObjectFields
|
||||||
|
{
|
||||||
|
Guid = 0x000, // Size: 4, Flags: Public
|
||||||
|
Data = 0x004, // Size: 4, Flags: Public
|
||||||
|
Type = 0x008, // Size: 1, Flags: Public
|
||||||
|
Entry = 0x009, // Size: 1, Flags: Dynamic
|
||||||
|
DynamicFlags = 0x00a, // Size: 1, Flags: Dynamic, Urgent
|
||||||
|
ScaleX = 0x00b, // Size: 1, Flags: Public
|
||||||
|
End = 0x00c,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ItemFields
|
||||||
|
{
|
||||||
|
Owner = ObjectFields.End + 0x000, // Size: 4, Flags: Public
|
||||||
|
Contained = ObjectFields.End + 0x004, // Size: 4, Flags: Public
|
||||||
|
Creator = ObjectFields.End + 0x008, // Size: 4, Flags: Public
|
||||||
|
GiftCreator = ObjectFields.End + 0x00c, // Size: 4, Flags: Public
|
||||||
|
StackCount = ObjectFields.End + 0x010, // Size: 1, Flags: Owner
|
||||||
|
Duration = ObjectFields.End + 0x011, // Size: 1, Flags: Owner
|
||||||
|
SpellCharges = ObjectFields.End + 0x012, // Size: 5, Flags: Owner
|
||||||
|
Flags = ObjectFields.End + 0x017, // Size: 1, Flags: Public
|
||||||
|
Enchantment = ObjectFields.End + 0x018, // Size: 39, Flags: Public
|
||||||
|
PropertySeed = ObjectFields.End + 0x03f, // Size: 1, Flags: Public
|
||||||
|
RandomPropertiesId = ObjectFields.End + 0x040, // Size: 1, Flags: Public
|
||||||
|
Durability = ObjectFields.End + 0x041, // Size: 1, Flags: Owner
|
||||||
|
MaxDurability = ObjectFields.End + 0x042, // Size: 1, Flags: Owner
|
||||||
|
CreatePlayedTime = ObjectFields.End + 0x043, // Size: 1, Flags: Public
|
||||||
|
ModifiersMask = ObjectFields.End + 0x044, // Size: 1, Flags: Owner
|
||||||
|
Context = ObjectFields.End + 0x045, // Size: 1, Flags: Public
|
||||||
|
ArtifactXp = ObjectFields.End + 0x046, // Size: 2, Flags: OWNER
|
||||||
|
AppearanceModId = ObjectFields.End + 0x048, // Size: 1, Flags: OWNER
|
||||||
|
End = ObjectFields.End + 0x049,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ItemDynamicFields
|
||||||
|
{
|
||||||
|
Modifiers = 0x000, // Flags: Owner
|
||||||
|
BonusListIds = 0x001, // Flags: Owner, 0x100
|
||||||
|
ArtifactPowers = 0x002, // Flags: OWNER
|
||||||
|
Gems = 0x003, // Flags: OWNER
|
||||||
|
End = 0x004,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ContainerFields
|
||||||
|
{
|
||||||
|
Slot1 = ItemFields.End + 0x000, // Size: 144, Flags: Public
|
||||||
|
NumSlots = ItemFields.End + 0x090, // Size: 1, Flags: Public
|
||||||
|
End = ItemFields.End + 0x091,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum UnitFields
|
||||||
|
{
|
||||||
|
Charm = ObjectFields.End + 0x000, // Size: 4, Flags: Public
|
||||||
|
Summon = ObjectFields.End + 0x004, // Size: 4, Flags: Public
|
||||||
|
Critter = ObjectFields.End + 0x008, // Size: 4, Flags: Private
|
||||||
|
CharmedBy = ObjectFields.End + 0x00c, // Size: 4, Flags: Public
|
||||||
|
SummonedBy = ObjectFields.End + 0x010, // Size: 4, Flags: Public
|
||||||
|
CreatedBy = ObjectFields.End + 0x014, // Size: 4, Flags: Public
|
||||||
|
DemonCreator = ObjectFields.End + 0x018, // Size: 4, Flags: Public
|
||||||
|
Target = ObjectFields.End + 0x01c, // Size: 4, Flags: Public
|
||||||
|
BattlePetCompanionGuid = ObjectFields.End + 0x020, // Size: 4, Flags: Public
|
||||||
|
BattlePetDbId = ObjectFields.End + 0x024, // Size: 2, Flags: Public
|
||||||
|
ChannelSpell = ObjectFields.End + 0x026, // Size: 1, Flags: Public, Urgent
|
||||||
|
ChannelSpellXSpellVisual = ObjectFields.End + 0x027, // Size: 1, Flags: Public, Urgent
|
||||||
|
SummonedByHomeRealm = ObjectFields.End + 0x028, // Size: 1, Flags: Public
|
||||||
|
Bytes0 = ObjectFields.End + 0x029, // Size: 1, Flags: Public
|
||||||
|
DisplayPower = ObjectFields.End + 0x02a, // Size: 1, Flags: Public
|
||||||
|
OverrideDisplayPowerId = ObjectFields.End + 0x02b, // Size: 1, Flags: Public
|
||||||
|
Health = ObjectFields.End + 0x02c, // Size: 2, Flags: Public
|
||||||
|
Power = ObjectFields.End + 0x02e, // Size: 6, Flags: Public, UrgentSelfOnly
|
||||||
|
MaxHealth = ObjectFields.End + 0x034, // Size: 2, Flags: Public
|
||||||
|
MaxPower = ObjectFields.End + 0x036, // Size: 6, Flags: Public
|
||||||
|
PowerRegenFlatModifier = ObjectFields.End + 0x03c, // Size: 6, Flags: Private, Owner, UnitAll
|
||||||
|
PowerRegenInterruptedFlatModifier = ObjectFields.End + 0x042, // Size: 6, Flags: Private, Owner, UnitAll
|
||||||
|
Level = ObjectFields.End + 0x048, // Size: 1, Flags: Public
|
||||||
|
EffectiveLevel = ObjectFields.End + 0x049, // Size: 1, Flags: Public
|
||||||
|
ScalingLevelMin = ObjectFields.End + 0x04a, // Size: 1, Flags: Public
|
||||||
|
ScalingLevelMax = ObjectFields.End + 0x04b, // Size: 1, Flags: Public
|
||||||
|
ScalingLevelDelta = ObjectFields.End + 0x04c, // Size: 1, Flags: Public
|
||||||
|
FactionTemplate = ObjectFields.End + 0x04d, // Size: 1, Flags: Public
|
||||||
|
VirtualItemSlotId = ObjectFields.End + 0x04e, // Size: 6, Flags: Public
|
||||||
|
Flags = ObjectFields.End + 0x054, // Size: 1, Flags: Public, Urgent
|
||||||
|
Flags2 = ObjectFields.End + 0x055, // Size: 1, Flags: Public, Urgent
|
||||||
|
Flags3 = ObjectFields.End + 0x056, // Size: 1, Flags: Public, Urgent
|
||||||
|
AuraState = ObjectFields.End + 0x057, // Size: 1, Flags: Public
|
||||||
|
BaseAttackTime = ObjectFields.End + 0x058, // Size: 2, Flags: Public
|
||||||
|
RangedAttackTime = ObjectFields.End + 0x05a, // Size: 1, Flags: Private
|
||||||
|
BoundingRadius = ObjectFields.End + 0x05b, // Size: 1, Flags: Public
|
||||||
|
CombatReach = ObjectFields.End + 0x05c, // Size: 1, Flags: Public
|
||||||
|
DisplayId = ObjectFields.End + 0x05d, // Size: 1, Flags: Dynamic, Urgent
|
||||||
|
NativeDisplayId = ObjectFields.End + 0x05e, // Size: 1, Flags: Public, Urgent
|
||||||
|
MountDisplayId = ObjectFields.End + 0x05f, // Size: 1, Flags: Public, Urgent
|
||||||
|
MinDamage = ObjectFields.End + 0x060, // Size: 1, Flags: Private, Owner, SpecialInfo
|
||||||
|
MaxDamage = ObjectFields.End + 0x061, // Size: 1, Flags: Private, Owner, SpecialInfo
|
||||||
|
MinOffHandDamage = ObjectFields.End + 0x062, // Size: 1, Flags: Private, Owner, SpecialInfo
|
||||||
|
MaxOffHandDamage = ObjectFields.End + 0x063, // Size: 1, Flags: Private, Owner, SpecialInfo
|
||||||
|
Bytes1 = ObjectFields.End + 0x064, // Size: 1, Flags: Public
|
||||||
|
PetNumber = ObjectFields.End + 0x065, // Size: 1, Flags: Public
|
||||||
|
PetNameTimestamp = ObjectFields.End + 0x066, // Size: 1, Flags: Public
|
||||||
|
PetExperience = ObjectFields.End + 0x067, // Size: 1, Flags: Owner
|
||||||
|
PetNextLevelExp = ObjectFields.End + 0x068, // Size: 1, Flags: Owner
|
||||||
|
ModCastSpeed = ObjectFields.End + 0x069, // Size: 1, Flags: Public
|
||||||
|
ModCastHaste = ObjectFields.End + 0x06a, // Size: 1, Flags: Public
|
||||||
|
ModHaste = ObjectFields.End + 0x06b, // Size: 1, Flags: Public
|
||||||
|
ModRangedHaste = ObjectFields.End + 0x06c, // Size: 1, Flags: Public
|
||||||
|
ModHasteRegen = ObjectFields.End + 0x06d, // Size: 1, Flags: Public
|
||||||
|
ModTimeRate = ObjectFields.End + 0x06e, // Size: 1, Flags: Public
|
||||||
|
CreatedBySpell = ObjectFields.End + 0x06f, // Size: 1, Flags: Public
|
||||||
|
NpcFlags = ObjectFields.End + 0x070, // Size: 2, Flags: Public, Dynamic
|
||||||
|
NpcEmotestate = ObjectFields.End + 0x072, // Size: 1, Flags: Public
|
||||||
|
Stat = ObjectFields.End + 0x073, // Size: 4, Flags: Private, Owner
|
||||||
|
PosStat = ObjectFields.End + 0x077, // Size: 4, Flags: Private, Owner
|
||||||
|
NegStat = ObjectFields.End + 0x07b, // Size: 4, Flags: Private, Owner
|
||||||
|
Resistances = ObjectFields.End + 0x07f, // Size: 7, Flags: Private, Owner, SpecialInfo
|
||||||
|
ResistanceBuffModsPositive = ObjectFields.End + 0x086, // Size: 7, Flags: Private, Owner
|
||||||
|
ResistanceBuffModsNegative = ObjectFields.End + 0x08d, // Size: 7, Flags: Private, Owner
|
||||||
|
ModBonusArmor = ObjectFields.End + 0x094, // Size: 1, Flags: Private, Owner
|
||||||
|
BaseMana = ObjectFields.End + 0x095, // Size: 1, Flags: Public
|
||||||
|
BaseHealth = ObjectFields.End + 0x096, // Size: 1, Flags: Private, Owner
|
||||||
|
Bytes2 = ObjectFields.End + 0x097, // Size: 1, Flags: Public
|
||||||
|
AttackPower = ObjectFields.End + 0x098, // Size: 1, Flags: Private, Owner
|
||||||
|
AttackPowerModPos = ObjectFields.End + 0x099, // Size: 1, Flags: Private, Owner
|
||||||
|
AttackPowerModNeg = ObjectFields.End + 0x09a, // Size: 1, Flags: Private, Owner
|
||||||
|
AttackPowerMultiplier = ObjectFields.End + 0x09b, // Size: 1, Flags: Private, Owner
|
||||||
|
RangedAttackPower = ObjectFields.End + 0x09c, // Size: 1, Flags: Private, Owner
|
||||||
|
RangedAttackPowerModPos = ObjectFields.End + 0x09d, // Size: 1, Flags: Private, Owner
|
||||||
|
RangedAttackPowerModNeg = ObjectFields.End + 0x09e, // Size: 1, Flags: Private, Owner
|
||||||
|
RangedAttackPowerMultiplier = ObjectFields.End + 0x09f, // Size: 1, Flags: Private, Owner
|
||||||
|
AttackSpeedAura = ObjectFields.End + 0x0a0, // Size: 1, Flags: Private, Owner
|
||||||
|
MinRangedDamage = ObjectFields.End + 0x0a1, // Size: 1, Flags: Private, Owner
|
||||||
|
MaxRangedDamage = ObjectFields.End + 0x0a2, // Size: 1, Flags: Private, Owner
|
||||||
|
PowerCostModifier = ObjectFields.End + 0x0a3, // Size: 7, Flags: Private, Owner
|
||||||
|
PowerCostMultiplier = ObjectFields.End + 0x0aa, // Size: 7, Flags: Private, Owner
|
||||||
|
Maxhealthmodifier = ObjectFields.End + 0x0b1, // Size: 1, Flags: Private, Owner
|
||||||
|
HoverHeight = ObjectFields.End + 0x0b2, // Size: 1, Flags: Public
|
||||||
|
MinItemLevelCutoff = ObjectFields.End + 0x0b3, // Size: 1, Flags: Public
|
||||||
|
MinItemLevel = ObjectFields.End + 0x0b4, // Size: 1, Flags: Public
|
||||||
|
Maxitemlevel = ObjectFields.End + 0x0b5, // Size: 1, Flags: Public
|
||||||
|
WildBattlepetLevel = ObjectFields.End + 0x0b6, // Size: 1, Flags: Public
|
||||||
|
BattlepetCompanionNameTimestamp = ObjectFields.End + 0x0b7, // Size: 1, Flags: Public
|
||||||
|
InteractSpellid = ObjectFields.End + 0x0b8, // Size: 1, Flags: Public
|
||||||
|
StateSpellVisualId = ObjectFields.End + 0x0b9, // Size: 1, Flags: Dynamic, Urgent
|
||||||
|
StateAnimId = ObjectFields.End + 0x0ba, // Size: 1, Flags: Dynamic, Urgent
|
||||||
|
StateAnimKitId = ObjectFields.End + 0x0bb, // Size: 1, Flags: Dynamic, Urgent
|
||||||
|
StateWorldEffectId = ObjectFields.End + 0x0bc, // Size: 4, Flags: Dynamic, Urgent
|
||||||
|
ScaleDuration = ObjectFields.End + 0x0c0, // Size: 1, Flags: Public
|
||||||
|
LooksLikeMountId = ObjectFields.End + 0x0c1, // Size: 1, Flags: Public
|
||||||
|
LooksLikeCreatureId = ObjectFields.End + 0x0c2, // Size: 1, Flags: Public
|
||||||
|
LookAtControllerId = ObjectFields.End + 0x0c3, // Size: 1, Flags: Public
|
||||||
|
LookAtControllerTarget = ObjectFields.End + 0x0c4, // Size: 4, Flags: Public
|
||||||
|
End = ObjectFields.End + 0x0c8,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum UnitDynamicFields
|
||||||
|
{
|
||||||
|
PassiveSpells = 0x000, // Flags: Public, Urgent
|
||||||
|
WorldEffects = 0x001, // Flags: Public, Urgent
|
||||||
|
ChannelObjects = 0x002, // Flags: PUBLIC, URGENT
|
||||||
|
End = 0x003,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PlayerFields
|
||||||
|
{
|
||||||
|
DuelArbiter = UnitFields.End + 0x000, // Size: 4, Flags: Public
|
||||||
|
WowAccount = UnitFields.End + 0x004, // Size: 4, Flags: Public
|
||||||
|
LootTargetGuid = UnitFields.End + 0x008, // Size: 4, Flags: Public
|
||||||
|
Flags = UnitFields.End + 0x00c, // Size: 1, Flags: Public
|
||||||
|
FlagsEx = UnitFields.End + 0x00d, // Size: 1, Flags: Public
|
||||||
|
GuildRank = UnitFields.End + 0x00e, // Size: 1, Flags: Public
|
||||||
|
GuildDeleteDate = UnitFields.End + 0x00f, // Size: 1, Flags: Public
|
||||||
|
GuildLevel = UnitFields.End + 0x010, // Size: 1, Flags: Public
|
||||||
|
Bytes = UnitFields.End + 0x011, // Size: 1, Flags: Public
|
||||||
|
Bytes2 = UnitFields.End + 0x012, // Size: 1, Flags: Public
|
||||||
|
Bytes3 = UnitFields.End + 0x013, // Size: 1, Flags: Public
|
||||||
|
Bytes4 = UnitFields.End + 0x014, // Size: 1, Flags: Public
|
||||||
|
DuelTeam = UnitFields.End + 0x015, // Size: 1, Flags: Public
|
||||||
|
GuildTimestamp = UnitFields.End + 0x016, // Size: 1, Flags: Public
|
||||||
|
QuestLog = UnitFields.End + 0x017, // Size: 800, Flags: PartyMember
|
||||||
|
VisibleItem = UnitFields.End + 0x337, // Size: 38, Flags: Public
|
||||||
|
ChosenTitle = UnitFields.End + 0x35d, // Size: 1, Flags: Public
|
||||||
|
FakeInebriation = UnitFields.End + 0x35e, // Size: 1, Flags: Public
|
||||||
|
VirtualRealm = UnitFields.End + 0x35f, // Size: 1, Flags: Public
|
||||||
|
CurrentSpecId = UnitFields.End + 0x360, // Size: 1, Flags: Public
|
||||||
|
TaxiMountAnimKitId = UnitFields.End + 0x361, // Size: 1, Flags: Public
|
||||||
|
AvgItemLevel = UnitFields.End + 0x362, // Size: 4, Flags: Public
|
||||||
|
CurrentBattlePetBreedQuality = UnitFields.End + 0x366, // Size: 1, Flags: Public
|
||||||
|
Prestige = UnitFields.End + 0x367, // Size: 1, Flags: Public
|
||||||
|
HonorLevel = UnitFields.End + 0x368, // Size: 1, Flags: Public
|
||||||
|
InvSlotHead = UnitFields.End + 0x369, // Size: 748, Flags: Private
|
||||||
|
EndNotSelf = UnitFields.End + 0x369,
|
||||||
|
|
||||||
|
Farsight = UnitFields.End + 0x655, // Size: 4, Flags: Private
|
||||||
|
SummonedBattlePetId = UnitFields.End + 0x659, // Size: 4, Flags: Private
|
||||||
|
KnownTitles = UnitFields.End + 0x65d, // Size: 12, Flags: Private
|
||||||
|
Coinage = UnitFields.End + 0x669, // Size: 2, Flags: Private
|
||||||
|
Xp = UnitFields.End + 0x66b, // Size: 1, Flags: Private
|
||||||
|
NextLevelXp = UnitFields.End + 0x66c, // Size: 1, Flags: Private
|
||||||
|
SkillLineId = UnitFields.End + 0x66d, // Size: 448, Flags: Private
|
||||||
|
SkillLineStep = UnitFields.End + 0x6AD,
|
||||||
|
SkillLineRank = UnitFields.End + 0x6ED,
|
||||||
|
SkillLineSubStartRank = UnitFields.End + 0x72D,
|
||||||
|
SkillLineMaxRank = UnitFields.End + 0x76D,
|
||||||
|
SkillLineTempBonus = UnitFields.End + 0x7AD,
|
||||||
|
SkillLinePermBonus = UnitFields.End + 0x7ED,
|
||||||
|
CharacterPoints = UnitFields.End + 0x82d, // Size: 1, Flags: Private
|
||||||
|
MaxTalentTiers = UnitFields.End + 0x82e, // Size: 1, Flags: Private
|
||||||
|
TrackCreatures = UnitFields.End + 0x82f, // Size: 1, Flags: Private
|
||||||
|
TrackResources = UnitFields.End + 0x830, // Size: 1, Flags: Private
|
||||||
|
Expertise = UnitFields.End + 0x831, // Size: 1, Flags: Private
|
||||||
|
OffhandExpertise = UnitFields.End + 0x832, // Size: 1, Flags: Private
|
||||||
|
RangedExpertise = UnitFields.End + 0x833, // Size: 1, Flags: Private
|
||||||
|
CombatRatingExpertise = UnitFields.End + 0x834, // Size: 1, Flags: Private
|
||||||
|
BlockPercentage = UnitFields.End + 0x835, // Size: 1, Flags: Private
|
||||||
|
DodgePercentage = UnitFields.End + 0x836, // Size: 1, Flags: Private
|
||||||
|
DodgePercentageFromAttribute = UnitFields.End + 0x837, // Size: 1, Flags: Private
|
||||||
|
ParryPercentage = UnitFields.End + 0x838, // Size: 1, Flags: Private
|
||||||
|
ParryPercentageFromAttribute = UnitFields.End + 0x839, // Size: 1, Flags: Private
|
||||||
|
CritPercentage = UnitFields.End + 0x83a, // Size: 1, Flags: Private
|
||||||
|
RangedCritPercentage = UnitFields.End + 0x83b, // Size: 1, Flags: Private
|
||||||
|
OffhandCritPercentage = UnitFields.End + 0x83c, // Size: 1, Flags: Private
|
||||||
|
SpellCritPercentage1 = UnitFields.End + 0x83d, // Size: 1, Flags: Private
|
||||||
|
ShieldBlock = UnitFields.End + 0x83e, // Size: 1, Flags: Private
|
||||||
|
ShieldBlockCritPercentage = UnitFields.End + 0x83f, // Size: 1, Flags: Private
|
||||||
|
Mastery = UnitFields.End + 0x840, // Size: 1, Flags: Private
|
||||||
|
Speed = UnitFields.End + 0x841, // Size: 1, Flags: Private
|
||||||
|
Lifesteal = UnitFields.End + 0x842, // Size: 1, Flags: Private
|
||||||
|
Avoidance = UnitFields.End + 0x843, // Size: 1, Flags: Private
|
||||||
|
Sturdiness = UnitFields.End + 0x844, // Size: 1, Flags: Private
|
||||||
|
Versatility = UnitFields.End + 0x845, // Size: 1, Flags: Private
|
||||||
|
VersatilityBonus = UnitFields.End + 0x846, // Size: 1, Flags: Private
|
||||||
|
FieldPvpPowerDamage = UnitFields.End + 0x847, // Size: 1, Flags: Private
|
||||||
|
FieldPvpPowerHealing = UnitFields.End + 0x848, // Size: 1, Flags: Private
|
||||||
|
ExploredZones1 = UnitFields.End + 0x849, // Size: 256, Flags: Private
|
||||||
|
RestInfo = UnitFields.End + 0x949, // Size: 4, Flags: Private
|
||||||
|
ModDamageDonePos = UnitFields.End + 0x94d, // Size: 7, Flags: Private
|
||||||
|
ModDamageDoneNeg = UnitFields.End + 0x954, // Size: 7, Flags: Private
|
||||||
|
ModDamageDonePct = UnitFields.End + 0x95b, // Size: 7, Flags: Private
|
||||||
|
ModHealingDonePos = UnitFields.End + 0x962, // Size: 1, Flags: Private
|
||||||
|
ModHealingPct = UnitFields.End + 0x963, // Size: 1, Flags: Private
|
||||||
|
ModHealingDonePct = UnitFields.End + 0x964, // Size: 1, Flags: Private
|
||||||
|
ModPeriodicHealingDonePercent = UnitFields.End + 0x965, // Size: 1, Flags: Private
|
||||||
|
WeaponDmgMultipliers = UnitFields.End + 0x966, // Size: 3, Flags: Private
|
||||||
|
WeaponAtkSpeedMultipliers = UnitFields.End + 0x969, // Size: 3, Flags: Private
|
||||||
|
ModSpellPowerPct = UnitFields.End + 0x96c, // Size: 1, Flags: Private
|
||||||
|
ModResiliencePercent = UnitFields.End + 0x96d, // Size: 1, Flags: Private
|
||||||
|
OverrideSpellPowerByApPct = UnitFields.End + 0x96e, // Size: 1, Flags: Private
|
||||||
|
OverrideApBySpellPowerPercent = UnitFields.End + 0x96f, // Size: 1, Flags: Private
|
||||||
|
ModTargetResistance = UnitFields.End + 0x970, // Size: 1, Flags: Private
|
||||||
|
ModTargetPhysicalResistance = UnitFields.End + 0x971, // Size: 1, Flags: Private
|
||||||
|
LocalFlags = UnitFields.End + 0x972, // Size: 1, Flags: Private
|
||||||
|
FieldBytes = UnitFields.End + 0x973, // Size: 1, Flags: Private
|
||||||
|
SelfResSpell = UnitFields.End + 0x974, // Size: 1, Flags: Private
|
||||||
|
PvpMedals = UnitFields.End + 0x975, // Size: 1, Flags: Private
|
||||||
|
BuyBackPrice1 = UnitFields.End + 0x976, // Size: 12, Flags: Private
|
||||||
|
BuyBackTimestamp1 = UnitFields.End + 0x982, // Size: 12, Flags: Private
|
||||||
|
Kills = UnitFields.End + 0x98e, // Size: 1, Flags: Private
|
||||||
|
LifetimeHonorableKills = UnitFields.End + 0x98f, // Size: 1, Flags: Private
|
||||||
|
WatchedFactionIndex = UnitFields.End + 0x990, // Size: 1, Flags: Private
|
||||||
|
CombatRating1 = UnitFields.End + 0x991, // Size: 32, Flags: Private
|
||||||
|
ArenaTeamInfo11 = UnitFields.End + 0x9b1, // Size: 42, Flags: Private
|
||||||
|
MaxLevel = UnitFields.End + 0x9db, // Size: 1, Flags: Private
|
||||||
|
ScalingLevelDelta = UnitFields.End + 0x9dc, // Size: 1, Flags: Private
|
||||||
|
MaxCreatureScalingLevel = UnitFields.End + 0x9dd, // Size: 1, Flags: Private
|
||||||
|
NoReagentCost1 = UnitFields.End + 0x9de, // Size: 4, Flags: Private
|
||||||
|
PetSpellPower = UnitFields.End + 0x9e2, // Size: 1, Flags: Private
|
||||||
|
Researching1 = UnitFields.End + 0x9e3, // Size: 10, Flags: Private
|
||||||
|
ProfessionSkillLine1 = UnitFields.End + 0x9ed, // Size: 2, Flags: Private
|
||||||
|
UiHitModifier = UnitFields.End + 0x9ef, // Size: 1, Flags: Private
|
||||||
|
UiSpellHitModifier = UnitFields.End + 0x9f0, // Size: 1, Flags: Private
|
||||||
|
HomeRealmTimeOffset = UnitFields.End + 0x9f1, // Size: 1, Flags: Private
|
||||||
|
ModPetHaste = UnitFields.End + 0x9f2, // Size: 1, Flags: Private
|
||||||
|
FieldBytes2 = UnitFields.End + 0x9f3, // Size: 1, Flags: Private
|
||||||
|
FieldBytes3 = UnitFields.End + 0x9f4, // Size: 1, Flags: Private, UrgentSelfOnly
|
||||||
|
LfgBonusFactionId = UnitFields.End + 0x9f5, // Size: 1, Flags: Private
|
||||||
|
LootSpecId = UnitFields.End + 0x9f6, // Size: 1, Flags: Private
|
||||||
|
OverrideZonePvpType = UnitFields.End + 0x9f7, // Size: 1, Flags: Private, UrgentSelfOnly
|
||||||
|
BagSlotFlags = UnitFields.End + 0x9f8, // Size: 4, Flags: Private
|
||||||
|
BankBagSlotFlags = UnitFields.End + 0x9fc, // Size: 7, Flags: Private
|
||||||
|
InsertItemsLeftToRight = UnitFields.End + 0xa03, // Size: 1, Flags: Private
|
||||||
|
QuestCompleted = UnitFields.End + 0xa04, // Size: 1750, Flags: Private
|
||||||
|
Honor = UnitFields.End + 0x10DA, // Size: 1, Flags: Private
|
||||||
|
HonorNextLevel = UnitFields.End + 0x10DB, // Size: 1, Flags: Private
|
||||||
|
End = UnitFields.End + 0x10DC,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PlayerDynamicFields
|
||||||
|
{
|
||||||
|
ReserachSite = UnitDynamicFields.End + 0x000, // Flags: Private
|
||||||
|
ResearchSiteProgress = UnitDynamicFields.End + 0x001, // Flags: Private
|
||||||
|
DailyQuests = UnitDynamicFields.End + 0x002, // Flags: Private
|
||||||
|
AvailableQuestLineXQuestId = UnitDynamicFields.End + 0x003, // Flags: Private
|
||||||
|
Heirlooms = UnitDynamicFields.End + 0x004, // Flags: Private
|
||||||
|
HeirloomsFlags = UnitDynamicFields.End + 0x005, // Flags: PRIVATE
|
||||||
|
Toys = UnitDynamicFields.End + 0x006, // Flags: Private
|
||||||
|
Transmog = UnitDynamicFields.End + 0x007, // Flags: PRIVATE
|
||||||
|
ConditionalTransmog = UnitDynamicFields.End + 0x008, // Flags: PRIVATE
|
||||||
|
CharacterRestrictions = UnitDynamicFields.End + 0x009, // Flags: PRIVATE
|
||||||
|
SpellPctModByLabel = UnitDynamicFields.End + 0x00A, // Flags: PRIVATE
|
||||||
|
SpellFlatModByLabel = UnitDynamicFields.End + 0x00B, // Flags: PRIVATE
|
||||||
|
ArenaCooldowns = UnitDynamicFields.End + 0x00C, // Flags: PUBLIC
|
||||||
|
End = UnitDynamicFields.End + 0x00D,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GameObjectFields
|
||||||
|
{
|
||||||
|
CreatedBy = ObjectFields.End + 0x000, // Size: 4, Flags: Public
|
||||||
|
DisplayId = ObjectFields.End + 0x004, // Size: 1, Flags: Dynamic, Urgent
|
||||||
|
Flags = ObjectFields.End + 0x005, // Size: 1, Flags: Public, Urgent
|
||||||
|
ParentRotation = ObjectFields.End + 0x006, // Size: 4, Flags: Public
|
||||||
|
Faction = ObjectFields.End + 0x00a, // Size: 1, Flags: Public
|
||||||
|
Level = ObjectFields.End + 0x00b, // Size: 1, Flags: Public
|
||||||
|
Bytes1 = ObjectFields.End + 0x00c, // Size: 1, Flags: Public, Urgent
|
||||||
|
SpellVisualId = ObjectFields.End + 0x00d, // Size: 1, Flags: Public, Dynamic, Urgent
|
||||||
|
StateSpellVisualId = ObjectFields.End + 0x00e, // Size: 1, Flags: Dynamic, Urgent
|
||||||
|
StateAnumId = ObjectFields.End + 0x00f, // Size: 1, Flags: Dynamic, Urgent
|
||||||
|
StateAnimKitId = ObjectFields.End + 0x010, // Size: 1, Flags: Dynamic, Urgent
|
||||||
|
StateWorldEffectId = ObjectFields.End + 0x011, // Size: 4, Flags: Dynamic, Urgent
|
||||||
|
End = ObjectFields.End + 0x015,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum GameObjectDynamicFields
|
||||||
|
{
|
||||||
|
EnableDoodadSets = 0x000, // Flags: PUBLIC
|
||||||
|
End = 0x001,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum DynamicObjectFields
|
||||||
|
{
|
||||||
|
Caster = ObjectFields.End + 0x000, // Size: 4, Flags: Public
|
||||||
|
Type = ObjectFields.End + 0x004, // Size: 1, Flags: Public
|
||||||
|
SpellXSpellVisualId = ObjectFields.End + 0x005, // Size: 1, Flags: Public
|
||||||
|
SpellId = ObjectFields.End + 0x006, // Size: 1, Flags: Public
|
||||||
|
Radius = ObjectFields.End + 0x007, // Size: 1, Flags: Public
|
||||||
|
CastTime = ObjectFields.End + 0x008, // Size: 1, Flags: Public
|
||||||
|
End = ObjectFields.End + 0x009,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CorpseFields
|
||||||
|
{
|
||||||
|
Owner = ObjectFields.End + 0x000, // Size: 4, Flags: Public
|
||||||
|
Party = ObjectFields.End + 0x004, // Size: 4, Flags: Public
|
||||||
|
DisplayId = ObjectFields.End + 0x008, // Size: 1, Flags: Public
|
||||||
|
Item = ObjectFields.End + 0x009, // Size: 19, Flags: Public
|
||||||
|
Bytes1 = ObjectFields.End + 0x01c, // Size: 1, Flags: Public
|
||||||
|
Bytes2 = ObjectFields.End + 0x01d, // Size: 1, Flags: Public
|
||||||
|
Flags = ObjectFields.End + 0x01e, // Size: 1, Flags: Public
|
||||||
|
DynamicFlags = ObjectFields.End + 0x01f, // Size: 1, Flags: Dynamic
|
||||||
|
FactionTemplate = ObjectFields.End + 0x020, // Size: 1, Flags: Public
|
||||||
|
CustomDisplayOption = ObjectFields.End + 0x021, // Size: 1, Flags: PUBLIC
|
||||||
|
End = ObjectFields.End + 0x022,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum AreaTriggerFields
|
||||||
|
{
|
||||||
|
OverrideScaleCurve = ObjectFields.End + 0x000, // Size: 7, Flags: Public, Urgent
|
||||||
|
ExtraScaleCurve = ObjectFields.End + 0x007, // Size: 7, Flags: Public, Urgent
|
||||||
|
Caster = ObjectFields.End + 0x00e, // Size: 4, Flags: Public
|
||||||
|
Duration = ObjectFields.End + 0x012, // Size: 1, Flags: Public
|
||||||
|
TimeToTarget = ObjectFields.End + 0x013, // Size: 1, Flags: Public, Urgent
|
||||||
|
TimeToTargetScale = ObjectFields.End + 0x014, // Size: 1, Flags: Public, Urgent
|
||||||
|
TimeToTargetExtraScale = ObjectFields.End + 0x015, // Size: 1, Flags: Public, Urgent
|
||||||
|
SpellId = ObjectFields.End + 0x016, // Size: 1, Flags: Public
|
||||||
|
SpellForVisuals = ObjectFields.End + 0x017, // Size: 1, Flags: PUBLIC
|
||||||
|
SpellXSpellVisualId = ObjectFields.End + 0x018, // Size: 1, Flags: Dynamic
|
||||||
|
BoundsRadius2d = ObjectFields.End + 0x019, // Size: 1, Flags: Dynamic, Urgent
|
||||||
|
DecalPropertiesId = ObjectFields.End + 0x01A, // Size: 1, Flags: Public
|
||||||
|
CreatingEffectGuid = ObjectFields.End + 0x01B, // Size: 4, Flags: PUBLIC
|
||||||
|
End = ObjectFields.End + 0x01F,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SceneObjectFields
|
||||||
|
{
|
||||||
|
ScriptPackageId = ObjectFields.End + 0x000, // Size: 1, Flags: Public
|
||||||
|
RndSeedVal = ObjectFields.End + 0x001, // Size: 1, Flags: Public
|
||||||
|
Createdby = ObjectFields.End + 0x002, // Size: 4, Flags: Public
|
||||||
|
SceneType = ObjectFields.End + 0x006, // Size: 1, Flags: Public
|
||||||
|
End = ObjectFields.End + 0x007,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ConversationFields
|
||||||
|
{
|
||||||
|
LastLineEndTime = ObjectFields.End + 0x000, // Size: 1, Flags: DYNAMIC
|
||||||
|
End = ObjectFields.End + 0x001,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ConversationDynamicFields
|
||||||
|
{
|
||||||
|
Actors = 0x000, // Flags: Public
|
||||||
|
Lines = 0x001, // Flags: 0x100
|
||||||
|
End = 0x002,
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
[Flags]
|
||||||
|
public enum UpdateFlag
|
||||||
|
{
|
||||||
|
None = 0x0,
|
||||||
|
Self = 0x1,
|
||||||
|
Transport = 0x2,
|
||||||
|
HasTarget = 0x4,
|
||||||
|
Living = 0x8,
|
||||||
|
StationaryPosition = 0x10,
|
||||||
|
Vehicle = 0x20,
|
||||||
|
TransportPosition = 0x40,
|
||||||
|
Rotation = 0x80,
|
||||||
|
AnimKits = 0x100,
|
||||||
|
Areatrigger = 0x0200,
|
||||||
|
//UPDATEFLAG_GAMEOBJECT = 0x0400,
|
||||||
|
//UPDATEFLAG_REPLACE_ACTIVE = 0x0800,
|
||||||
|
//UPDATEFLAG_NO_BIRTH_ANIM = 0x1000,
|
||||||
|
//UPDATEFLAG_ENABLE_PORTALS = 0x2000,
|
||||||
|
//UPDATEFLAG_PLAY_HOVER_ANIM = 0x4000,
|
||||||
|
//UPDATEFLAG_IS_SUPPRESSING_GREETINGS = 0x8000
|
||||||
|
//UPDATEFLAG_SCENEOBJECT = 0x10000,
|
||||||
|
//UPDATEFLAG_SCENE_PENDING_INSTANCE = 0x20000
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum UpdateType
|
||||||
|
{
|
||||||
|
Values = 0,
|
||||||
|
CreateObject = 1,
|
||||||
|
CreateObject2 = 2,
|
||||||
|
OutOfRangeObjects = 3,
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Constants
|
||||||
|
{
|
||||||
|
public enum VehiclePowerType
|
||||||
|
{
|
||||||
|
Steam = 61,
|
||||||
|
Pyrite = 41,
|
||||||
|
Heat = 101,
|
||||||
|
Ooze = 121,
|
||||||
|
Blood = 141,
|
||||||
|
Wrath = 142,
|
||||||
|
ArcaneEnergy = 143,
|
||||||
|
LifeEnergy = 144,
|
||||||
|
SunEnergy = 145,
|
||||||
|
SwingVelocity = 146,
|
||||||
|
ShadowflameEnergy = 147,
|
||||||
|
BluePower = 148,
|
||||||
|
PurplePower = 149,
|
||||||
|
GreenPower = 150,
|
||||||
|
OrangePower = 151,
|
||||||
|
Energy2 = 153,
|
||||||
|
Arcaneenergy = 161,
|
||||||
|
Wind1 = 162,
|
||||||
|
Wind2 = 163,
|
||||||
|
Wind3 = 164,
|
||||||
|
Fuel = 165,
|
||||||
|
SunPower = 166,
|
||||||
|
TwilightEnergy = 169,
|
||||||
|
Venom = 174,
|
||||||
|
Orange2 = 176,
|
||||||
|
ConsumingFlame = 177,
|
||||||
|
PyroclasticFrenzy = 178,
|
||||||
|
Flashfire = 179,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum VehicleFlags
|
||||||
|
{
|
||||||
|
NoStrafe = 0x01, // Sets Moveflag2NoStrafe
|
||||||
|
NoJumping = 0x02, // Sets Moveflag2NoJumping
|
||||||
|
Fullspeedturning = 0x04, // Sets Moveflag2Fullspeedturning
|
||||||
|
AllowPitching = 0x10, // Sets Moveflag2AllowPitching
|
||||||
|
Fullspeedpitching = 0x20, // Sets Moveflag2Fullspeedpitching
|
||||||
|
CustomPitch = 0x40, // If Set Use Pitchmin And Pitchmax From Dbc, Otherwise Pitchmin = -Pi/2, Pitchmax = Pi/2
|
||||||
|
AdjustAimAngle = 0x400, // LuaIsvehicleaimangleadjustable
|
||||||
|
AdjustAimPower = 0x800, // LuaIsvehicleaimpoweradjustable
|
||||||
|
FixedPosition = 0x200000 // Used for cannons, when they should be rooted
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
|
||||||
|
namespace Framework.Cryptography
|
||||||
|
{
|
||||||
|
public sealed class WorldCrypt : IDisposable
|
||||||
|
{
|
||||||
|
static readonly byte[] ServerEncryptionKey = { 0x08, 0xF1, 0x95, 0x9F, 0x47, 0xE5, 0xD2, 0xDB, 0xA1, 0x3D, 0x77, 0x8F, 0x3F, 0x3E, 0xE7, 0x00 };
|
||||||
|
static readonly byte[] ServerDecryptionKey = { 0x40, 0xAA, 0xD3, 0x92, 0x26, 0x71, 0x43, 0x47, 0x3A, 0x31, 0x08, 0xA6, 0xE7, 0xDC, 0x98, 0x2A };
|
||||||
|
|
||||||
|
public void Initialize(byte[] sessionKey)
|
||||||
|
{
|
||||||
|
if (IsInitialized)
|
||||||
|
throw new InvalidOperationException("PacketCrypt already initialized!");
|
||||||
|
|
||||||
|
SARC4Encrypt = new SARC4();
|
||||||
|
SARC4Decrypt = new SARC4();
|
||||||
|
|
||||||
|
var encryptSHA1 = new HMACSHA1(ServerEncryptionKey);
|
||||||
|
var decryptSHA1 = new HMACSHA1(ServerDecryptionKey);
|
||||||
|
|
||||||
|
SARC4Encrypt.PrepareKey(encryptSHA1.ComputeHash(sessionKey));
|
||||||
|
SARC4Decrypt.PrepareKey(decryptSHA1.ComputeHash(sessionKey));
|
||||||
|
|
||||||
|
var PacketEncryptionDummy = new byte[0x400];
|
||||||
|
var PacketDecryptionDummy = new byte[0x400];
|
||||||
|
|
||||||
|
SARC4Encrypt.ProcessBuffer(PacketEncryptionDummy, PacketEncryptionDummy.Length);
|
||||||
|
SARC4Decrypt.ProcessBuffer(PacketDecryptionDummy, PacketDecryptionDummy.Length);
|
||||||
|
|
||||||
|
IsInitialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Initialize(byte[] sessionKey, byte[] serverSeed, byte[] clientSeed)
|
||||||
|
{
|
||||||
|
IsInitialized = false;
|
||||||
|
|
||||||
|
if (IsInitialized)
|
||||||
|
throw new InvalidOperationException("PacketCrypt already initialized!");
|
||||||
|
|
||||||
|
SARC4Encrypt = new SARC4();
|
||||||
|
SARC4Decrypt = new SARC4();
|
||||||
|
|
||||||
|
var encryptSHA1 = new HMACSHA1(serverSeed);
|
||||||
|
var decryptSHA1 = new HMACSHA1(clientSeed);
|
||||||
|
|
||||||
|
SARC4Encrypt.PrepareKey(encryptSHA1.ComputeHash(sessionKey));
|
||||||
|
SARC4Decrypt.PrepareKey(decryptSHA1.ComputeHash(sessionKey));
|
||||||
|
|
||||||
|
var PacketEncryptionDummy = new byte[0x400];
|
||||||
|
var PacketDecryptionDummy = new byte[0x400];
|
||||||
|
|
||||||
|
SARC4Encrypt.ProcessBuffer(PacketEncryptionDummy, PacketEncryptionDummy.Length);
|
||||||
|
SARC4Decrypt.ProcessBuffer(PacketDecryptionDummy, PacketDecryptionDummy.Length);
|
||||||
|
|
||||||
|
IsInitialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Encrypt(byte[] data, int count)
|
||||||
|
{
|
||||||
|
if (!IsInitialized)
|
||||||
|
throw new InvalidOperationException("PacketCrypt not initialized!");
|
||||||
|
|
||||||
|
SARC4Encrypt.ProcessBuffer(data, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Decrypt(byte[] data, int count)
|
||||||
|
{
|
||||||
|
if (!IsInitialized)
|
||||||
|
throw new InvalidOperationException("PacketCrypt not initialized!");
|
||||||
|
|
||||||
|
SARC4Decrypt.ProcessBuffer(data, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
IsInitialized = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsInitialized { get; set; }
|
||||||
|
SARC4 SARC4Encrypt;
|
||||||
|
SARC4 SARC4Decrypt;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Numerics;
|
||||||
|
|
||||||
|
namespace Framework.Cryptography
|
||||||
|
{
|
||||||
|
public class RsaCrypt : IDisposable
|
||||||
|
{
|
||||||
|
public RsaCrypt()
|
||||||
|
{
|
||||||
|
Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InitializeEncryption<T>(T p, T q, T dp, T dq, T iq, bool isBigEndian = false)
|
||||||
|
{
|
||||||
|
this._p = p.ToBigInteger(isBigEndian);
|
||||||
|
this._q = q.ToBigInteger(isBigEndian);
|
||||||
|
this._dp = dp.ToBigInteger(isBigEndian);
|
||||||
|
this._dq = dq.ToBigInteger(isBigEndian);
|
||||||
|
this._iq = iq.ToBigInteger(isBigEndian);
|
||||||
|
|
||||||
|
if (this._p.IsZero && this._q.IsZero)
|
||||||
|
throw new InvalidOperationException("'0' isn't allowed for p or q");
|
||||||
|
else
|
||||||
|
_isEncryptionInitialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InitializeDecryption<T>(T e, T n, bool reverseBytes = false)
|
||||||
|
{
|
||||||
|
this._e = e.ToBigInteger(reverseBytes);
|
||||||
|
this._n = n.ToBigInteger(reverseBytes);
|
||||||
|
|
||||||
|
_isDecryptionInitialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] Encrypt<T>(T data, bool isBigEndian = false)
|
||||||
|
{
|
||||||
|
if (!_isEncryptionInitialized)
|
||||||
|
throw new InvalidOperationException("Encryption not initialized");
|
||||||
|
|
||||||
|
var bData = data.ToBigInteger(isBigEndian);
|
||||||
|
|
||||||
|
var m1 = BigInteger.ModPow(bData % _p, _dp, _p);
|
||||||
|
var m2 = BigInteger.ModPow(bData % _q, _dq, _q);
|
||||||
|
|
||||||
|
var h = (_iq * (m1 - m2)) % _p;
|
||||||
|
|
||||||
|
// Be sure to use the positive remainder
|
||||||
|
if (h.Sign == -1)
|
||||||
|
h = _p + h;
|
||||||
|
|
||||||
|
var m = m2 + h * _q;
|
||||||
|
|
||||||
|
return m.ToByteArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] Decrypt<T>(T data, bool isBigEndian = false)
|
||||||
|
{
|
||||||
|
if (!_isDecryptionInitialized)
|
||||||
|
throw new InvalidOperationException("Encryption not initialized");
|
||||||
|
|
||||||
|
var c = data.ToBigInteger(isBigEndian);
|
||||||
|
|
||||||
|
return BigInteger.ModPow(c, _e, _n).ToByteArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
this._e = 0;
|
||||||
|
this._n = 0;
|
||||||
|
this._p = 0;
|
||||||
|
this._q = 0;
|
||||||
|
this._dp = 0;
|
||||||
|
this._dq = 0;
|
||||||
|
this._iq = 0;
|
||||||
|
|
||||||
|
_isEncryptionInitialized = false;
|
||||||
|
_isDecryptionInitialized = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
BigInteger _e;
|
||||||
|
BigInteger _n;
|
||||||
|
BigInteger _p;
|
||||||
|
BigInteger _q;
|
||||||
|
BigInteger _dp;
|
||||||
|
BigInteger _dq;
|
||||||
|
BigInteger _iq;
|
||||||
|
bool _isEncryptionInitialized;
|
||||||
|
bool _isDecryptionInitialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RsaStore
|
||||||
|
{
|
||||||
|
public static byte[] DP = { 0xE1, 0xA6, 0x22, 0xAB, 0xFF, 0x57, 0x83, 0x45, 0x3F, 0x93, 0x76, 0xC8, 0xFA, 0xD9, 0x17, 0xE1, 0x49, 0x73, 0xC2, 0x13, 0x28, 0x0B, 0x1F, 0xE2, 0x9A, 0xF4, 0x7F, 0x7C, 0x37, 0x56, 0xA1, 0xDF, 0x51, 0x97, 0x2F, 0x15, 0x10, 0x97, 0xCD, 0x2A, 0x40, 0x09, 0xFC, 0x0A, 0xC3, 0x3F, 0x88, 0x86, 0xA9, 0x51, 0x13, 0xE1, 0x76, 0xCF, 0xA8, 0x37, 0x9A, 0x91, 0x3B, 0xD0, 0x70, 0xA1, 0xD7, 0x03, 0x71, 0x59, 0x6C, 0xB3, 0x41, 0xB8, 0x32, 0x68, 0x56, 0xC8, 0xB8, 0xD1, 0xF9, 0x1D, 0x04, 0xC5, 0x13, 0xB5, 0x8E, 0x57, 0x73, 0x02, 0x97, 0x7B, 0x33, 0x60, 0x68, 0xA9, 0xC2, 0x40, 0x96, 0x3C, 0x57, 0x4E, 0x4F, 0xC0, 0xAB, 0x21, 0x5C, 0xBA, 0x7D, 0x65, 0xAA, 0x1B, 0xD6, 0x43, 0x06, 0xCE, 0x3E, 0x0C, 0xB9, 0xB2, 0x82, 0xB0, 0xC9, 0x54, 0x59, 0x32, 0xC5, 0x88, 0x08, 0x9C, 0x9B, 0xBF };
|
||||||
|
public static byte[] DQ = { 0xE3, 0xB1, 0xED, 0x52, 0xEF, 0xE6, 0x88, 0x40, 0x50, 0x89, 0x4C, 0x99, 0xE5, 0xF7, 0xED, 0x03, 0x1C, 0x54, 0x11, 0x24, 0x2F, 0x9D, 0xE8, 0xE6, 0x39, 0xFA, 0x19, 0xF4, 0x06, 0x55, 0x0B, 0x8B, 0x95, 0xC8, 0xB1, 0xE2, 0x7C, 0x75, 0x3B, 0x2A, 0x40, 0xC3, 0xE7, 0xE0, 0x25, 0x18, 0xBF, 0xB5, 0x03, 0x1B, 0x5A, 0x57, 0x92, 0x3C, 0x85, 0x7D, 0x7F, 0x43, 0x56, 0x1F, 0x1E, 0x80, 0xC3, 0xBA, 0xF0, 0x53, 0xD7, 0x6A, 0xD0, 0xF2, 0xDD, 0x9C, 0xC6, 0x53, 0xE7, 0xB4, 0xD3, 0x9D, 0xAB, 0xBF, 0xE0, 0x97, 0x50, 0x92, 0x23, 0xB9, 0xB7, 0xDC, 0xAA, 0xC4, 0x20, 0x93, 0x5A, 0xF5, 0xDE, 0x76, 0x28, 0x93, 0x91, 0x44, 0x1E, 0x4C, 0x15, 0x2F, 0x7F, 0x45, 0x3C, 0x3B, 0x7D, 0x36, 0x3B, 0x24, 0xC7, 0x8C, 0x65, 0x43, 0xAE, 0x65, 0x84, 0xBC, 0xF9, 0x76, 0x4E, 0x3C, 0x44, 0x05, 0xBC, 0xFA };
|
||||||
|
public static byte[] InverseQ = { 0x63, 0xC1, 0x14, 0x2B, 0x57, 0x0B, 0x8A, 0x3C, 0x27, 0xDB, 0x96, 0x82, 0x27, 0xEB, 0xF6, 0x45, 0x6D, 0x07, 0x50, 0xE8, 0x4A, 0xD4, 0xB6, 0x7A, 0x3C, 0x8B, 0x4D, 0x65, 0xF0, 0x50, 0x70, 0x84, 0x71, 0x2B, 0xC6, 0x6D, 0x28, 0x2D, 0x76, 0x38, 0x73, 0x93, 0xDB, 0x44, 0xD7, 0xC0, 0x7F, 0xD9, 0x57, 0x18, 0x28, 0x57, 0xF1, 0x13, 0x38, 0xA4, 0x91, 0x67, 0x1E, 0x13, 0x73, 0x55, 0xFC, 0x7B, 0xAF, 0x50, 0xFA, 0xFD, 0x16, 0x12, 0x6F, 0xA4, 0x95, 0x15, 0x9C, 0x07, 0x18, 0xA6, 0x46, 0xFD, 0xB3, 0xCF, 0xA5, 0x0E, 0x05, 0x30, 0xEC, 0x2C, 0xCD, 0x62, 0xDD, 0x6F, 0xB1, 0xFE, 0x6C, 0x05, 0x2F, 0x11, 0xA6, 0xA0, 0x98, 0xAC, 0x9B, 0x15, 0xF0, 0x04, 0xC4, 0x7B, 0x79, 0xAA, 0x51, 0x25, 0x2A, 0x84, 0x73, 0xE6, 0x77, 0x47, 0xA3, 0xEB, 0xCF, 0x6D, 0xC8, 0x96, 0x3A, 0x1B, 0x02, 0x52 };
|
||||||
|
public static byte[] P = { 0x7D, 0xBD, 0xB9, 0xE1, 0x2D, 0xAE, 0x42, 0x56, 0x6E, 0x2B, 0xE2, 0x89, 0xD9, 0xBB, 0x0C, 0x1F, 0x67, 0x28, 0xC1, 0x4D, 0x91, 0x3C, 0xAD, 0x5F, 0xF0, 0x43, 0x86, 0x5C, 0x27, 0xDC, 0x58, 0xB3, 0x0E, 0x75, 0x77, 0x78, 0x49, 0x35, 0xE7, 0xE7, 0xDF, 0xFD, 0x74, 0xAB, 0x4E, 0xFE, 0xD3, 0xAB, 0x6B, 0x96, 0xF7, 0x89, 0xB2, 0x5A, 0x6A, 0x25, 0x03, 0x5A, 0x92, 0x1A, 0xF1, 0xFC, 0x05, 0x4E, 0xCE, 0xDD, 0x37, 0xA4, 0x02, 0x53, 0x76, 0xCB, 0xC2, 0xD9, 0x63, 0xCB, 0x51, 0x94, 0xEC, 0x5C, 0x39, 0xCC, 0xB2, 0x17, 0x0C, 0xA3, 0x43, 0x9A, 0xD0, 0x83, 0x27, 0x67, 0x52, 0x64, 0x37, 0x0E, 0x38, 0xB7, 0x9B, 0xF4, 0x2D, 0xB8, 0x0F, 0x30, 0x72, 0xD3, 0x15, 0xF3, 0x2C, 0x39, 0x55, 0x72, 0x2C, 0x55, 0x80, 0x63, 0xA0, 0xA1, 0x6F, 0x28, 0xF3, 0xF3, 0x5A, 0x6F, 0x68, 0x59, 0xB3, 0xF3 };
|
||||||
|
public static byte[] Q = { 0x0B, 0x1A, 0x13, 0x07, 0x12, 0xEF, 0xDD, 0x97, 0x01, 0x9A, 0x21, 0x7D, 0xFA, 0xA3, 0xB7, 0xE2, 0x39, 0x2E, 0x04, 0x92, 0x96, 0x45, 0x2A, 0xEB, 0x57, 0x03, 0xAC, 0xB1, 0x83, 0xCD, 0x25, 0x4F, 0x2C, 0xA9, 0xA1, 0x54, 0x26, 0x54, 0xCF, 0xE6, 0x1B, 0x53, 0x51, 0x3A, 0xC1, 0x15, 0xF4, 0x17, 0xBB, 0x17, 0x1F, 0x37, 0x66, 0x36, 0x1A, 0xD4, 0xB1, 0x5B, 0x49, 0xA8, 0xF1, 0x02, 0xB0, 0x42, 0xA9, 0x66, 0xA0, 0xE2, 0x52, 0x2C, 0x8C, 0x89, 0xA2, 0xDD, 0xA6, 0xF1, 0xA3, 0xDF, 0xB6, 0x80, 0x63, 0xB8, 0x10, 0xDA, 0xDE, 0x84, 0x56, 0xFA, 0xFB, 0x72, 0x65, 0x5E, 0xA3, 0x9C, 0x78, 0x65, 0xD0, 0x73, 0x07, 0x34, 0x1D, 0xE1, 0x4D, 0x77, 0xE8, 0x00, 0x0F, 0x80, 0x1C, 0x5A, 0x21, 0x55, 0x0A, 0x8C, 0xF4, 0x93, 0xF5, 0xF8, 0x40, 0xF2, 0x40, 0xEA, 0x52, 0x12, 0x40, 0xF0, 0xBF, 0xFA };
|
||||||
|
public static byte[] WherePacketHmac = { 0x2C, 0x1F, 0x1D, 0x80, 0xC3, 0x8C, 0x23, 0x64, 0xDA, 0x90, 0xCA, 0x8E, 0x2C, 0xFC, 0x0C, 0xCE, 0x09, 0xD3, 0x62, 0xF9, 0xF3, 0x8B, 0xBE, 0x9F, 0x19, 0xEF, 0x58, 0xA1, 0x1C, 0x34, 0x14, 0x41, 0x3F, 0x23, 0xFD, 0xD3, 0xE8, 0x14, 0xEC, 0x2A, 0xFD, 0x4F, 0x95, 0xBA, 0x30, 0x7E, 0x56, 0x5D, 0x83, 0x95, 0x81, 0x69, 0xB0, 0x5A, 0xB4, 0x9D, 0xA8, 0x55, 0xFF, 0xFC, 0xEE, 0x58, 0x0A, 0x2F };
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2014 Arctium Emulation<http://arctium.org>
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Cryptography
|
||||||
|
{
|
||||||
|
//Thx Fabian over at Arctium.
|
||||||
|
public sealed class SARC4
|
||||||
|
{
|
||||||
|
public SARC4()
|
||||||
|
{
|
||||||
|
_s = new byte[0x100];
|
||||||
|
_tmp = 0;
|
||||||
|
_tmp2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PrepareKey(byte[] key)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 0x100; i++)
|
||||||
|
_s[i] = (byte)i;
|
||||||
|
|
||||||
|
var j = 0;
|
||||||
|
for (int i = 0; i < 0x100; i++)
|
||||||
|
{
|
||||||
|
j = (byte)((j + key[i % key.Length] + _s[i]) & 255);
|
||||||
|
|
||||||
|
var tempS = _s[i];
|
||||||
|
|
||||||
|
_s[i] = _s[j];
|
||||||
|
_s[j] = tempS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ProcessBuffer(byte[] data, int length)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
_tmp = (byte)((_tmp + 1) % 0x100);
|
||||||
|
_tmp2 = (byte)((_tmp2 + _s[_tmp]) % 0x100);
|
||||||
|
|
||||||
|
var sTemp = _s[_tmp];
|
||||||
|
|
||||||
|
_s[_tmp] = _s[_tmp2];
|
||||||
|
_s[_tmp2] = sTemp;
|
||||||
|
|
||||||
|
data[i] = (byte)(_s[(_s[_tmp] + _s[_tmp2]) % 0x100] ^ data[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] _s;
|
||||||
|
byte _tmp;
|
||||||
|
byte _tmp2;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
|
||||||
|
namespace Framework.Cryptography
|
||||||
|
{
|
||||||
|
public class SessionKeyGenerator
|
||||||
|
{
|
||||||
|
public SessionKeyGenerator(byte[] buff, int size)
|
||||||
|
{
|
||||||
|
int halfSize = size / 2;
|
||||||
|
|
||||||
|
sh = SHA256.Create();
|
||||||
|
sh.TransformFinalBlock(buff, 0, halfSize);
|
||||||
|
o1 = sh.Hash;
|
||||||
|
|
||||||
|
sh.Initialize();
|
||||||
|
sh.TransformFinalBlock(buff, halfSize, size - halfSize);
|
||||||
|
o2 = sh.Hash;
|
||||||
|
|
||||||
|
FillUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Generate(byte[] buf, uint sz)
|
||||||
|
{
|
||||||
|
for (uint i = 0; i < sz; ++i)
|
||||||
|
{
|
||||||
|
if (taken == 32)
|
||||||
|
FillUp();
|
||||||
|
|
||||||
|
buf[i] = o0[taken];
|
||||||
|
taken++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FillUp()
|
||||||
|
{
|
||||||
|
sh.Initialize();
|
||||||
|
sh.TransformBlock(o1, 0, 32, o1, 0);
|
||||||
|
sh.TransformBlock(o0, 0, 32, o0, 0);
|
||||||
|
sh.TransformFinalBlock(o2, 0, 32);
|
||||||
|
o0 = sh.Hash;
|
||||||
|
|
||||||
|
taken = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHA256 sh;
|
||||||
|
uint taken;
|
||||||
|
byte[] o0 = new byte[32];
|
||||||
|
byte[] o1 = new byte[32];
|
||||||
|
byte[] o2 = new byte[32];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
* Copyright (C) 2012-2014 Arctium Emulation <http://arctium.org>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Framework.Cryptography
|
||||||
|
{
|
||||||
|
public class Sha256 : SHA256Managed
|
||||||
|
{
|
||||||
|
public byte[] Digest { get; private set; }
|
||||||
|
|
||||||
|
public Sha256()
|
||||||
|
{
|
||||||
|
Initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Process(byte[] data, int length)
|
||||||
|
{
|
||||||
|
TransformBlock(data, 0, length, data, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Process(uint data)
|
||||||
|
{
|
||||||
|
var bytes = BitConverter.GetBytes(data);
|
||||||
|
|
||||||
|
TransformBlock(bytes, 0, 4, bytes, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Process(string data)
|
||||||
|
{
|
||||||
|
var bytes = Encoding.UTF8.GetBytes(data);
|
||||||
|
|
||||||
|
TransformBlock(bytes, 0, bytes.Length, bytes, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Finish(byte[] data, int length)
|
||||||
|
{
|
||||||
|
TransformFinalBlock(data, 0, data.Length);
|
||||||
|
|
||||||
|
Digest = base.Hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Finish(byte[] data, int offset, int length)
|
||||||
|
{
|
||||||
|
TransformFinalBlock(data, offset, length);
|
||||||
|
|
||||||
|
Digest = base.Hash;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class HmacHash : HMACSHA1
|
||||||
|
{
|
||||||
|
public byte[] Digest { get; private set; }
|
||||||
|
|
||||||
|
public HmacHash(byte[] key) : base(key, true)
|
||||||
|
{
|
||||||
|
Initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Process(byte[] data, int length)
|
||||||
|
{
|
||||||
|
TransformBlock(data, 0, length, data, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Process(uint data)
|
||||||
|
{
|
||||||
|
var bytes = BitConverter.GetBytes(data);
|
||||||
|
|
||||||
|
TransformBlock(bytes, 0, bytes.Length, bytes, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Process(string data)
|
||||||
|
{
|
||||||
|
var bytes = Encoding.ASCII.GetBytes(data);
|
||||||
|
|
||||||
|
TransformBlock(bytes, 0, bytes.Length, bytes, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Finish(byte[] data, int length)
|
||||||
|
{
|
||||||
|
TransformFinalBlock(data, 0, length);
|
||||||
|
|
||||||
|
Digest = Hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Finish(string data)
|
||||||
|
{
|
||||||
|
var bytes = Encoding.ASCII.GetBytes(data);
|
||||||
|
|
||||||
|
TransformFinalBlock(bytes, 0, bytes.Length);
|
||||||
|
|
||||||
|
Digest = Hash;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class HmacSha256 : HMACSHA256
|
||||||
|
{
|
||||||
|
public HmacSha256() : base()
|
||||||
|
{
|
||||||
|
Initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public HmacSha256(byte[] key) : base(key)
|
||||||
|
{
|
||||||
|
Initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Process(byte[] data, int length)
|
||||||
|
{
|
||||||
|
TransformBlock(data, 0, length, data, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Process(uint data)
|
||||||
|
{
|
||||||
|
var bytes = BitConverter.GetBytes(data);
|
||||||
|
|
||||||
|
TransformBlock(bytes, 0, bytes.Length, bytes, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Process(string data)
|
||||||
|
{
|
||||||
|
var bytes = Encoding.ASCII.GetBytes(data);
|
||||||
|
|
||||||
|
TransformBlock(bytes, 0, bytes.Length, bytes, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Finish(byte[] data, int length)
|
||||||
|
{
|
||||||
|
TransformFinalBlock(data, 0, length);
|
||||||
|
|
||||||
|
Digest = Hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] Digest { get; private set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Database
|
||||||
|
{
|
||||||
|
public static class DB
|
||||||
|
{
|
||||||
|
public static LoginDatabase Login = new LoginDatabase();
|
||||||
|
public static CharacterDatabase Characters = new CharacterDatabase();
|
||||||
|
public static WorldDatabase World = new WorldDatabase();
|
||||||
|
public static HotfixDatabase Hotfix = new HotfixDatabase();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,181 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Framework.Configuration;
|
||||||
|
using MySql.Data.MySqlClient;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Framework.Database
|
||||||
|
{
|
||||||
|
public class DatabaseLoader
|
||||||
|
{
|
||||||
|
public DatabaseLoader(DatabaseTypeFlags defaultUpdateMask)
|
||||||
|
{
|
||||||
|
_autoSetup = ConfigMgr.GetDefaultValue("Updates.AutoSetup", true);
|
||||||
|
_updateFlags = ConfigMgr.GetDefaultValue("Updates.EnableDatabases", defaultUpdateMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddDatabase<T>(MySqlBase<T> database, string name)
|
||||||
|
{
|
||||||
|
bool updatesEnabled = database.IsAutoUpdateEnabled(_updateFlags);
|
||||||
|
_open.Add(() =>
|
||||||
|
{
|
||||||
|
string dbString = ConfigMgr.GetDefaultValue(name + "DatabaseInfo", "");
|
||||||
|
if (string.IsNullOrEmpty(dbString))
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServerLoading, "Database {0} not specified in configuration file!", name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var error = database.Initialize(dbString);
|
||||||
|
if (error != MySqlErrorCode.None)
|
||||||
|
{
|
||||||
|
// Database does not exist
|
||||||
|
if (error == MySqlErrorCode.UnknownDatabase && updatesEnabled && _autoSetup)
|
||||||
|
{
|
||||||
|
Log.outInfo(LogFilter.ServerLoading, "Database \"{0}\" does not exist, do you want to create it? [yes (default) / no]: ", name);
|
||||||
|
|
||||||
|
string answer = Console.ReadLine();
|
||||||
|
if (string.IsNullOrEmpty(answer) && answer[0] != 'y')
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Log.outInfo(LogFilter.ServerLoading, "Creating database \"{0}\"...", name);
|
||||||
|
string sqlString = string.Format("CREATE DATABASE `{0}` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci", name);
|
||||||
|
// Try to create the database and connect again if auto setup is enabled
|
||||||
|
if (database.Apply(sqlString) && database.Initialize(dbString) == MySqlErrorCode.None)
|
||||||
|
error = MySqlErrorCode.None;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the error wasn't handled quit
|
||||||
|
if (error != MySqlErrorCode.None)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServerLoading, "\nDatabase {0} NOT opened. There were errors opening the MySQL connections. Check your SQLErrors for specific errors.", name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.outInfo(LogFilter.ServerLoading, "Done.");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (updatesEnabled)
|
||||||
|
{
|
||||||
|
// Populate and update only if updates are enabled for this pool
|
||||||
|
_populate.Add(() =>
|
||||||
|
{
|
||||||
|
//Hack used to allow big querys
|
||||||
|
database.Apply("SET GLOBAL max_allowed_packet=1073741824;");
|
||||||
|
if (!database.GetUpdater().Populate())
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServerLoading, "Could not populate the {0} database, see log for details.", name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
_update.Add(() =>
|
||||||
|
{
|
||||||
|
if (!database.GetUpdater().Update())
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.ServerLoading, "Could not update the {0} database, see log for details.", name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_prepare.Add(() =>
|
||||||
|
{
|
||||||
|
database.LoadPreparedStatements();
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Load()
|
||||||
|
{
|
||||||
|
if (_updateFlags == 0)
|
||||||
|
Log.outInfo(LogFilter.SqlUpdates, "Automatic database updates are disabled for all databases!");
|
||||||
|
|
||||||
|
if (!OpenDatabases())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!PopulateDatabases())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!UpdateDatabases())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!PrepareStatements())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OpenDatabases()
|
||||||
|
{
|
||||||
|
return Process(_open);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Processes the elements of the given stack until a predicate returned false.
|
||||||
|
bool Process(List<Func<bool>> list)
|
||||||
|
{
|
||||||
|
while (!list.Empty())
|
||||||
|
{
|
||||||
|
if (!list[0].Invoke())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
list.RemoveAt(0);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PopulateDatabases()
|
||||||
|
{
|
||||||
|
return Process(_populate);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UpdateDatabases()
|
||||||
|
{
|
||||||
|
return Process(_update);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PrepareStatements()
|
||||||
|
{
|
||||||
|
return Process(_prepare);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool _autoSetup;
|
||||||
|
DatabaseTypeFlags _updateFlags;
|
||||||
|
List<Func<bool>> _open = new List<Func<bool>>();
|
||||||
|
List<Func<bool>> _populate = new List<Func<bool>>();
|
||||||
|
List<Func<bool>> _update = new List<Func<bool>>();
|
||||||
|
List<Func<bool>> _prepare = new List<Func<bool>>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum DatabaseTypeFlags
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
|
||||||
|
Login = 1,
|
||||||
|
Character = 2,
|
||||||
|
World = 4,
|
||||||
|
Hotfix = 8,
|
||||||
|
|
||||||
|
All = Login | Character | World | Hotfix
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,466 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Framework.Configuration;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Framework.Database
|
||||||
|
{
|
||||||
|
public class DatabaseUpdater<T>
|
||||||
|
{
|
||||||
|
public DatabaseUpdater(MySqlBase<T> database)
|
||||||
|
{
|
||||||
|
_database = database;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Populate()
|
||||||
|
{
|
||||||
|
SQLResult result = _database.Query("SHOW TABLES");
|
||||||
|
if (!result.IsEmpty() && result.GetRowCount() > 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
Log.outInfo(LogFilter.SqlUpdates, "Database {0} is empty, auto populating it...", _database.GetDatabaseName());
|
||||||
|
|
||||||
|
string path = GetSourceDirectory();
|
||||||
|
string fileName = "Unknown";
|
||||||
|
switch (_database.GetType().Name)
|
||||||
|
{
|
||||||
|
case "LoginDatabase":
|
||||||
|
fileName = @"\sql\base\auth_database.sql";
|
||||||
|
break;
|
||||||
|
case "CharacterDatabase":
|
||||||
|
fileName = @"\sql\base\characters_database.sql";
|
||||||
|
break;
|
||||||
|
case "WorldDatabase":
|
||||||
|
fileName = @"\sql\base\TDB_world_703.00_2016_10_17.sql";
|
||||||
|
break;
|
||||||
|
case "HotfixDatabase":
|
||||||
|
fileName = @"\sql\base\TDB_hotfixes_703.00_2016_10_17.sql";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!File.Exists(path + fileName))
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.SqlUpdates, "File \"{0}\" is missing, download it from \"http://www.trinitycore.org/f/files/category/1-database/\"" +
|
||||||
|
" and place it in your worldserver directory.", fileName);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update database
|
||||||
|
Log.outInfo(LogFilter.SqlUpdates, "Applying \'{0}\'...", fileName);
|
||||||
|
_database.ApplyFile(path + fileName);
|
||||||
|
|
||||||
|
Log.outInfo(LogFilter.SqlUpdates, "Done Applying \'{0}\'", fileName);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Update()
|
||||||
|
{
|
||||||
|
Log.outInfo(LogFilter.SqlUpdates, "Updating {0} database...", _database.GetDatabaseName());
|
||||||
|
|
||||||
|
string sourceDirectory = GetSourceDirectory();
|
||||||
|
|
||||||
|
if (!Directory.Exists(sourceDirectory))
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.SqlUpdates, "DBUpdater: Given source directory {0} does not exist, skipped!", sourceDirectory);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var availableFiles = GetFileList();
|
||||||
|
var appliedFiles = ReceiveAppliedFiles();
|
||||||
|
|
||||||
|
bool redundancyChecks = ConfigMgr.GetDefaultValue("Updates.Redundancy", true);
|
||||||
|
bool archivedRedundancy = ConfigMgr.GetDefaultValue("Updates.Redundancy", true);
|
||||||
|
|
||||||
|
UpdateResult result = new UpdateResult();
|
||||||
|
|
||||||
|
// Count updates
|
||||||
|
foreach (var entry in appliedFiles)
|
||||||
|
{
|
||||||
|
if (entry.Value.State == State.RELEASED)
|
||||||
|
++result.recent;
|
||||||
|
else
|
||||||
|
++result.archived;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var availableQuery in availableFiles)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.SqlUpdates, "Checking update \"{0}\"...", availableQuery.GetFileName());
|
||||||
|
|
||||||
|
var applied = appliedFiles.LookupByKey(availableQuery.GetFileName());
|
||||||
|
if (applied != null)
|
||||||
|
{
|
||||||
|
// If redundancy is disabled skip it since the update is already applied.
|
||||||
|
if (!redundancyChecks)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.SqlUpdates, "Update is already applied, skipping redundancy checks.");
|
||||||
|
appliedFiles.Remove(availableQuery.GetFileName());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the update is in an archived directory and is marked as archived in our database skip redundancy checks (archived updates never change).
|
||||||
|
if (!archivedRedundancy && (applied.State == State.ARCHIVED) && (availableQuery.state == State.ARCHIVED))
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.SqlUpdates, "Update is archived and marked as archived in database, skipping redundancy checks.");
|
||||||
|
appliedFiles.Remove(availableQuery.GetFileName());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate hash
|
||||||
|
string hash = CalculateHash(availableQuery.path);
|
||||||
|
|
||||||
|
UpdateMode mode = UpdateMode.Apply;
|
||||||
|
|
||||||
|
// Update is not in our applied list
|
||||||
|
if (applied == null)
|
||||||
|
{
|
||||||
|
// Catch renames (different filename but same hash)
|
||||||
|
var hashIter = appliedFiles.Values.FirstOrDefault(p => p.Hash == hash);
|
||||||
|
if (hashIter != null)
|
||||||
|
{
|
||||||
|
// Check if the original file was removed if not we've got a problem.
|
||||||
|
var renameFile = availableFiles.Find(p => p.GetFileName() == hashIter.Name);
|
||||||
|
if (renameFile != null)
|
||||||
|
{
|
||||||
|
Log.outWarn(LogFilter.SqlUpdates, "Seems like update \"{0}\" \'{1}\' was renamed, but the old file is still there! " +
|
||||||
|
"Trade it as a new file! (Probably its an unmodified copy of file \"{2}\")",
|
||||||
|
availableQuery.GetFileName(), hash.Substring(0, 7), renameFile.GetFileName());
|
||||||
|
}
|
||||||
|
// Its save to trade the file as renamed here
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.outInfo(LogFilter.SqlUpdates, "Renaming update \"{0}\" to \"{1}\" \'{2}\'.",
|
||||||
|
hashIter.Name, availableQuery.GetFileName(), hash.Substring(0, 7));
|
||||||
|
|
||||||
|
RenameEntry(hashIter.Name, availableQuery.GetFileName());
|
||||||
|
appliedFiles.Remove(hashIter.Name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Apply the update if it was never seen before.
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.outInfo(LogFilter.SqlUpdates, "Applying update \"{0}\" \'{1}\'...", availableQuery.GetFileName(), hash.Substring(0, 7));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Rehash the update entry if it is contained in our database but with an empty hash.
|
||||||
|
else if (ConfigMgr.GetDefaultValue("Updates.AllowRehash", true) && string.IsNullOrEmpty(applied.Hash))
|
||||||
|
{
|
||||||
|
mode = UpdateMode.Rehash;
|
||||||
|
|
||||||
|
Log.outInfo(LogFilter.SqlUpdates, "Re-hashing update \"{0}\" \'{1}\'...", availableQuery.GetFileName(), hash.Substring(0, 7));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If the hash of the files differs from the one stored in our database reapply the update (because it was changed).
|
||||||
|
if (applied.Hash != hash)
|
||||||
|
{
|
||||||
|
Log.outInfo(LogFilter.SqlUpdates, "Reapplying update \"{0}\" \'{1}\' . \'{2}\' (it changed)...", availableQuery.GetFileName(),
|
||||||
|
applied.Hash.Substring(0, 7), hash.Substring(0, 7));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If the file wasn't changed and just moved update its state if necessary.
|
||||||
|
if (applied.State != availableQuery.state)
|
||||||
|
{
|
||||||
|
Log.outDebug(LogFilter.SqlUpdates, "Updating state of \"{0}\" to \'{1}\'...", availableQuery.GetFileName(), availableQuery.state);
|
||||||
|
|
||||||
|
UpdateState(availableQuery.GetFileName(), availableQuery.state);
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.outDebug(LogFilter.SqlUpdates, "Update is already applied and is matching hash \'{0}\'.", hash.Substring(0, 7));
|
||||||
|
|
||||||
|
appliedFiles.Remove(applied.Name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint speed = 0;
|
||||||
|
AppliedFileEntry file = new AppliedFileEntry(availableQuery.GetFileName(), hash, availableQuery.state, 0);
|
||||||
|
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case UpdateMode.Apply:
|
||||||
|
speed = ApplyTimedFile(availableQuery.path);
|
||||||
|
goto case UpdateMode.Rehash;
|
||||||
|
case UpdateMode.Rehash:
|
||||||
|
UpdateEntry(file, speed);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (applied != null)
|
||||||
|
appliedFiles.Remove(applied.Name);
|
||||||
|
|
||||||
|
if (mode == UpdateMode.Apply)
|
||||||
|
++result.updated;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cleanup up orphaned entries if enabled
|
||||||
|
if (!appliedFiles.Empty())
|
||||||
|
{
|
||||||
|
int cleanDeadReferencesMaxCount = ConfigMgr.GetDefaultValue("Updates.CleanDeadRefMaxCount", 3);
|
||||||
|
bool doCleanup = (cleanDeadReferencesMaxCount < 0) || (appliedFiles.Count <= cleanDeadReferencesMaxCount);
|
||||||
|
|
||||||
|
foreach (var entry in appliedFiles)
|
||||||
|
{
|
||||||
|
Log.outWarn(LogFilter.SqlUpdates, "File \'{0}\' was applied to the database but is missing in your update directory now!", entry.Key);
|
||||||
|
|
||||||
|
if (doCleanup)
|
||||||
|
Log.outInfo(LogFilter.SqlUpdates, "Deleting orphaned entry \'{0}\'...", entry.Key);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doCleanup)
|
||||||
|
CleanUp(appliedFiles);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.SqlUpdates, "Cleanup is disabled! There are {0} dirty files that were applied to your database but are now missing in your source directory!", appliedFiles.Count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string info = string.Format("Containing {0} new and {1} archived updates.", result.recent, result.archived);
|
||||||
|
|
||||||
|
if (result.updated == 0)
|
||||||
|
Log.outInfo(LogFilter.SqlUpdates, "{0} database is up-to-date! {1}", _database.GetDatabaseName(), info);
|
||||||
|
else
|
||||||
|
Log.outInfo(LogFilter.SqlUpdates, "Applied {0} {1}. {2}", result.updated, result.updated == 1 ? "query" : "queries", info);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
string GetSourceDirectory()
|
||||||
|
{
|
||||||
|
string entry = ConfigMgr.GetDefaultValue("Updates.SourcePath", Environment.CurrentDirectory);
|
||||||
|
if (!string.IsNullOrEmpty(entry))
|
||||||
|
return entry;
|
||||||
|
else
|
||||||
|
return Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint ApplyTimedFile(string path)
|
||||||
|
{
|
||||||
|
// Benchmark query speed
|
||||||
|
uint oldMSTime = Time.GetMSTime();
|
||||||
|
|
||||||
|
// Update database
|
||||||
|
_database.ApplyFile(path);
|
||||||
|
|
||||||
|
// Return time the query took to apply
|
||||||
|
return Time.GetMSTimeDiffToNow(oldMSTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateEntry(AppliedFileEntry entry, uint speed)
|
||||||
|
{
|
||||||
|
string update = "REPLACE INTO `updates` (`name`, `hash`, `state`, `speed`) VALUES (\"" +
|
||||||
|
entry.Name + "\", \"" + entry.Hash + "\", \'" + entry.State + "\', " + speed + ")";
|
||||||
|
|
||||||
|
// Update database
|
||||||
|
_database.Execute(update);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenameEntry(string from, string to)
|
||||||
|
{
|
||||||
|
// Delete target if it exists
|
||||||
|
{
|
||||||
|
string update = "DELETE FROM `updates` WHERE `name`=\"" + to + "\"";
|
||||||
|
|
||||||
|
// Update database
|
||||||
|
_database.Execute(update);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rename
|
||||||
|
{
|
||||||
|
string update = "UPDATE `updates` SET `name`=\"" + to + "\" WHERE `name`=\"" + from + "\"";
|
||||||
|
|
||||||
|
// Update database
|
||||||
|
_database.Execute(update);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanUp(Dictionary<string, AppliedFileEntry> storage)
|
||||||
|
{
|
||||||
|
if (storage.Empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
int remaining = storage.Count;
|
||||||
|
string update = "DELETE FROM `updates` WHERE `name` IN(";
|
||||||
|
|
||||||
|
foreach (var entry in storage)
|
||||||
|
{
|
||||||
|
update += "\"" + entry.Key + "\"";
|
||||||
|
if ((--remaining) > 0)
|
||||||
|
update += ", ";
|
||||||
|
}
|
||||||
|
|
||||||
|
update += ")";
|
||||||
|
|
||||||
|
// Update database
|
||||||
|
_database.Execute(update);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateState(string name, State state)
|
||||||
|
{
|
||||||
|
string update = "UPDATE `updates` SET `state`=\'" + state + "\' WHERE `name`=\"" + name + "\"";
|
||||||
|
|
||||||
|
// Update database
|
||||||
|
_database.Execute(update);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<FileEntry> GetFileList()
|
||||||
|
{
|
||||||
|
List<FileEntry> fileList = new List<FileEntry>();
|
||||||
|
|
||||||
|
SQLResult result = _database.Query("SELECT `path`, `state` FROM `updates_include`");
|
||||||
|
if (result.IsEmpty())
|
||||||
|
return fileList;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
string path = result.Read<string>(0);
|
||||||
|
if (path[0] == '$')
|
||||||
|
path = GetSourceDirectory() + path.Substring(1);
|
||||||
|
|
||||||
|
if (!Directory.Exists(path))
|
||||||
|
{
|
||||||
|
Log.outWarn(LogFilter.SqlUpdates, "DBUpdater: Given update include directory \"{0}\" isn't existing, skipped!", path);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
State state = result.Read<string>(1).ToEnum<State>();
|
||||||
|
fileList.AddRange(GetFilesFromDirectory(path, state));
|
||||||
|
|
||||||
|
Log.outDebug(LogFilter.SqlUpdates, "Added applied file \"{0}\" from remote.", path);
|
||||||
|
|
||||||
|
} while (result.NextRow());
|
||||||
|
|
||||||
|
return fileList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Dictionary<string, AppliedFileEntry> ReceiveAppliedFiles()
|
||||||
|
{
|
||||||
|
Dictionary<string, AppliedFileEntry> map = new Dictionary<string, AppliedFileEntry>();
|
||||||
|
|
||||||
|
SQLResult result = _database.Query("SELECT `name`, `hash`, `state`, UNIX_TIMESTAMP(`timestamp`) FROM `updates` ORDER BY `name` ASC");
|
||||||
|
if (result.IsEmpty())
|
||||||
|
return map;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
AppliedFileEntry entry = new AppliedFileEntry(result.Read<string>(0), result.Read<string>(1), result.Read<string>(2).ToEnum<State>(), result.Read<ulong>(3));
|
||||||
|
map.Add(entry.Name, entry);
|
||||||
|
}
|
||||||
|
while (result.NextRow());
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerable<FileEntry> GetFilesFromDirectory(string directory, State state)
|
||||||
|
{
|
||||||
|
Queue<string> queue = new Queue<string>();
|
||||||
|
queue.Enqueue(directory);
|
||||||
|
while (queue.Count > 0)
|
||||||
|
{
|
||||||
|
directory = queue.Dequeue();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
foreach (string subDir in Directory.GetDirectories(directory))
|
||||||
|
{
|
||||||
|
queue.Enqueue(subDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
string[] files = Directory.GetFiles(directory, "*.sql");
|
||||||
|
for (int i = 0; i < files.Length; i++)
|
||||||
|
{
|
||||||
|
yield return new FileEntry(files[i], state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string CalculateHash(string fileName)
|
||||||
|
{
|
||||||
|
using (SHA1 sha1 = new SHA1Managed())
|
||||||
|
{
|
||||||
|
string text = File.ReadAllText(fileName).Replace("\r", "");
|
||||||
|
return sha1.ComputeHash(Encoding.UTF8.GetBytes(text)).ToHexString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected MySqlBase<T> _database;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AppliedFileEntry
|
||||||
|
{
|
||||||
|
public AppliedFileEntry(string name, string hash, State state, ulong timestamp)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
Hash = hash;
|
||||||
|
State = state;
|
||||||
|
Timestamp = timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Name;
|
||||||
|
public string Hash;
|
||||||
|
public State State;
|
||||||
|
public ulong Timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class FileEntry
|
||||||
|
{
|
||||||
|
public FileEntry(string _path, State _state)
|
||||||
|
{
|
||||||
|
path = _path;
|
||||||
|
state = _state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetFileName()
|
||||||
|
{
|
||||||
|
return Path.GetFileName(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string path;
|
||||||
|
public State state;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct UpdateResult
|
||||||
|
{
|
||||||
|
public int updated;
|
||||||
|
public int recent;
|
||||||
|
public int archived;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum State
|
||||||
|
{
|
||||||
|
RELEASED,
|
||||||
|
ARCHIVED
|
||||||
|
}
|
||||||
|
|
||||||
|
enum UpdateMode
|
||||||
|
{
|
||||||
|
Apply,
|
||||||
|
Rehash
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,320 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Database
|
||||||
|
{
|
||||||
|
public class LoginDatabase : MySqlBase<LoginStatements>
|
||||||
|
{
|
||||||
|
public override void PreparedStatements()
|
||||||
|
{
|
||||||
|
const string BnetAccountInfo = "ba.id, ba.email, ba.locked, ba.lock_country, ba.last_ip, ba.failed_logins, bab.unbandate > UNIX_TIMESTAMP() OR bab.unbandate = bab.bandate, bab.unbandate = bab.bandate";
|
||||||
|
const string BnetGameAccountInfo = "a.id, a.username, ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, ab.unbandate = ab.bandate, aa.gmlevel";
|
||||||
|
|
||||||
|
PrepareStatement(LoginStatements.SEL_REALMLIST, "SELECT id, name, address, localAddress, localSubnetMask, port, icon, flag, timezone, allowedSecurityLevel, population, gamebuild, Region, Battlegroup FROM realmlist WHERE flag <> 3 ORDER BY name");
|
||||||
|
PrepareStatement(LoginStatements.DEL_EXPIRED_IP_BANS, "DELETE FROM ip_banned WHERE unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()");
|
||||||
|
PrepareStatement(LoginStatements.UPD_EXPIRED_ACCOUNT_BANS, "UPDATE account_banned SET active = 0 WHERE active = 1 AND unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()");
|
||||||
|
PrepareStatement(LoginStatements.SEL_IP_INFO, "(SELECT unbandate > UNIX_TIMESTAMP() OR unbandate = bandate AS banned, NULL as country FROM ip_banned WHERE ip = ?) " +
|
||||||
|
"UNION (SELECT NULL AS banned, country FROM ip2nation WHERE INET_NTOA(ip) = ?)");
|
||||||
|
|
||||||
|
PrepareStatement(LoginStatements.INS_IP_AUTO_BANNED, "INSERT INTO ip_banned (ip, bandate, unbandate, bannedby, banreason) VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Cypher Auth', 'Failed login autoban')");
|
||||||
|
PrepareStatement(LoginStatements.SEL_IP_BANNED_ALL, "SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned WHERE (bandate = unbandate OR unbandate > UNIX_TIMESTAMP()) ORDER BY unbandate");
|
||||||
|
PrepareStatement(LoginStatements.SEL_IP_BANNED_BY_IP, "SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned WHERE (bandate = unbandate OR unbandate > UNIX_TIMESTAMP()) AND ip LIKE CONCAT('%%', ?, '%%') ORDER BY unbandate");
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_BANNED_ALL, "SELECT account.id, username FROM account, account_banned WHERE account.id = account_banned.id AND active = 1 GROUP BY account.id");
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_BANNED_BY_USERNAME, "SELECT account.id, username FROM account, account_banned WHERE account.id = account_banned.id AND active = 1 AND username LIKE CONCAT('%%', ?, '%%') GROUP BY account.id");
|
||||||
|
PrepareStatement(LoginStatements.DEL_ACCOUNT_BANNED, "DELETE FROM account_banned WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_ACCOUNT_INFO_CONTINUED_SESSION, "UPDATE account SET sessionkey = ? WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_INFO_CONTINUED_SESSION, "SELECT username, sessionkey FROM account WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_VS, "UPDATE account SET v = ?, s = ? WHERE username = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_LOGON_COUNTRY, "SELECT country FROM ip2nation WHERE ip < ? ORDER BY ip DESC LIMIT 0,1");
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_ID_BY_NAME, "SELECT id FROM account WHERE username = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_LIST_BY_NAME, "SELECT id, username FROM account WHERE username = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_INFO_BY_NAME, "SELECT a.id, a.sessionkey, ba.last_ip, ba.locked, ba.lock_country, a.expansion, a.mutetime, ba.locale, a.recruiter, a.os, ba.id, aa.gmLevel, " +
|
||||||
|
"bab.unbandate > UNIX_TIMESTAMP() OR bab.unbandate = bab.bandate, ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, r.id " +
|
||||||
|
"FROM account a LEFT JOIN account r ON a.id = r.recruiter LEFT JOIN battlenet_accounts ba ON a.battlenet_account = ba.id " +
|
||||||
|
"LEFT JOIN account_access aa ON a.id = aa.id AND aa.RealmID IN (-1, ?) LEFT JOIN battlenet_account_bans bab ON ba.id = bab.id LEFT JOIN account_banned ab ON a.id = ab.id AND ab.active = 1 " +
|
||||||
|
"WHERE a.username = ? ORDER BY aa.RealmID DESC LIMIT 1");
|
||||||
|
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_LIST_BY_EMAIL, "SELECT id, username FROM account WHERE email = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_BY_IP, "SELECT id, username FROM account WHERE last_ip = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_BY_ID, "SELECT 1 FROM account WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.INS_IP_BANNED, "INSERT INTO ip_banned (ip, bandate, unbandate, bannedby, banreason) VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?)");
|
||||||
|
PrepareStatement(LoginStatements.DEL_IP_NOT_BANNED, "DELETE FROM ip_banned WHERE ip = ?");
|
||||||
|
PrepareStatement(LoginStatements.INS_ACCOUNT_BANNED, "INSERT INTO account_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?, 1)");
|
||||||
|
PrepareStatement(LoginStatements.UPD_ACCOUNT_NOT_BANNED, "UPDATE account_banned SET active = 0 WHERE id = ? AND active != 0");
|
||||||
|
PrepareStatement(LoginStatements.DEL_REALM_CHARACTERS_BY_REALM, "DELETE FROM realmcharacters WHERE acctid = ? AND realmid = ?");
|
||||||
|
PrepareStatement(LoginStatements.DEL_REALM_CHARACTERS, "DELETE FROM realmcharacters WHERE acctid = ?");
|
||||||
|
PrepareStatement(LoginStatements.INS_REALM_CHARACTERS, "INSERT INTO realmcharacters (numchars, acctid, realmid) VALUES (?, ?, ?)");
|
||||||
|
PrepareStatement(LoginStatements.SEL_SUM_REALM_CHARACTERS, "SELECT SUM(numchars) FROM realmcharacters WHERE acctid = ?");
|
||||||
|
PrepareStatement(LoginStatements.INS_ACCOUNT, "INSERT INTO account(username, sha_pass_hash, reg_mail, email, joindate, battlenet_account, battlenet_index) VALUES(?, ?, ?, ?, NOW(), ?, ?)");
|
||||||
|
PrepareStatement(LoginStatements.INS_REALM_CHARACTERS_INIT, "INSERT INTO realmcharacters (realmid, acctid, numchars) SELECT realmlist.id, account.id, 0 FROM realmlist, account LEFT JOIN realmcharacters ON acctid=account.id WHERE acctid IS NULL");
|
||||||
|
PrepareStatement(LoginStatements.UPD_EXPANSION, "UPDATE account SET expansion = ? WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_ACCOUNT_LOCK, "UPDATE account SET locked = ? WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_ACCOUNT_LOCK_CONTRY, "UPDATE account SET lock_country = ? WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.INS_LOG, "INSERT INTO logs (time, realm, type, level, string) VALUES (?, ?, ?, ?, ?)");
|
||||||
|
PrepareStatement(LoginStatements.UPD_USERNAME, "UPDATE account SET v = 0, s = 0, username = ?, sha_pass_hash = ? WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_PASSWORD, "UPDATE account SET v = 0, s = 0, sha_pass_hash = ? WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_EMAIL, "UPDATE account SET email = ? WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_REG_EMAIL, "UPDATE account SET reg_mail = ? WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_MUTE_TIME, "UPDATE account SET mutetime = ? , mutereason = ? , muteby = ? WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_MUTE_TIME_LOGIN, "UPDATE account SET mutetime = ? WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_LAST_IP, "UPDATE account SET last_ip = ? WHERE username = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_LAST_ATTEMPT_IP, "UPDATE account SET last_attempt_ip = ? WHERE username = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_ACCOUNT_ONLINE, "UPDATE account SET online = 1 WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_UPTIME_PLAYERS, "UPDATE uptime SET uptime = ?, maxplayers = ? WHERE realmid = ? AND starttime = ?");
|
||||||
|
PrepareStatement(LoginStatements.DEL_OLD_LOGS, "DELETE FROM logs WHERE (time + ?) < ? AND realm = ?");
|
||||||
|
PrepareStatement(LoginStatements.DEL_ACCOUNT_ACCESS, "DELETE FROM account_access WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.DEL_ACCOUNT_ACCESS_BY_REALM, "DELETE FROM account_access WHERE id = ? AND (RealmID = ? OR RealmID = -1)");
|
||||||
|
PrepareStatement(LoginStatements.INS_ACCOUNT_ACCESS, "INSERT INTO account_access (id,gmlevel,RealmID) VALUES (?, ?, ?)");
|
||||||
|
PrepareStatement(LoginStatements.GET_ACCOUNT_ID_BY_USERNAME, "SELECT id FROM account WHERE username = ?");
|
||||||
|
PrepareStatement(LoginStatements.GET_ACCOUNT_ACCESS_GMLEVEL, "SELECT gmlevel FROM account_access WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.GET_GMLEVEL_BY_REALMID, "SELECT gmlevel FROM account_access WHERE id = ? AND (RealmID = ? OR RealmID = -1)");
|
||||||
|
PrepareStatement(LoginStatements.GET_USERNAME_BY_ID, "SELECT username FROM account WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_CHECK_PASSWORD, "SELECT 1 FROM account WHERE id = ? AND sha_pass_hash = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_CHECK_PASSWORD_BY_NAME, "SELECT 1 FROM account WHERE username = ? AND sha_pass_hash = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_PINFO, "SELECT a.username, aa.gmlevel, a.email, a.reg_mail, a.last_ip, DATE_FORMAT(a.last_login, '%Y-%m-%d %T'), a.mutetime, a.mutereason, a.muteby, a.failed_logins, a.locked, a.OS FROM account a LEFT JOIN account_access aa ON (a.id = aa.id AND (aa.RealmID = ? OR aa.RealmID = -1)) WHERE a.id = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_PINFO_BANS, "SELECT unbandate, bandate = unbandate, bannedby, banreason FROM account_banned WHERE id = ? AND active ORDER BY bandate ASC LIMIT 1");
|
||||||
|
PrepareStatement(LoginStatements.SEL_GM_ACCOUNTS, "SELECT a.username, aa.gmlevel FROM account a, account_access aa WHERE a.id=aa.id AND aa.gmlevel >= ? AND (aa.realmid = -1 OR aa.realmid = ?)");
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_INFO, "SELECT a.username, a.last_ip, aa.gmlevel, a.expansion FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.id = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_ACCESS_GMLEVEL_TEST, "SELECT 1 FROM account_access WHERE id = ? AND gmlevel > ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_ACCESS, "SELECT a.id, aa.gmlevel, aa.RealmID FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_WHOIS, "SELECT username, email, last_ip FROM account WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_LAST_ATTEMPT_IP, "SELECT last_attempt_ip FROM account WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_LAST_IP, "SELECT last_ip FROM account WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_REALMLIST_SECURITY_LEVEL, "SELECT allowedSecurityLevel from realmlist WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.DEL_ACCOUNT, "DELETE FROM account WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_IP2NATION_COUNTRY, "SELECT c.country FROM ip2nationCountries c, ip2nation i WHERE i.ip < ? AND c.code = i.country ORDER BY i.ip DESC LIMIT 0,1");
|
||||||
|
PrepareStatement(LoginStatements.SEL_AUTOBROADCAST, "SELECT id, weight, text FROM autobroadcast WHERE realmid = ? OR realmid = -1");
|
||||||
|
PrepareStatement(LoginStatements.GET_EMAIL_BY_ID, "SELECT email FROM account WHERE id = ?");
|
||||||
|
// 0: uint32, 1: uint32, 2: uint8, 3: uint32, 4: string // Complete name: "Login_Insert_AccountLoginDeLete_IP_Logging"
|
||||||
|
PrepareStatement(LoginStatements.INS_ALDL_IP_LOGGING, "INSERT INTO logs_ip_actions (account_id,character_guid,type,ip,systemnote,unixtime,time) VALUES (?, ?, ?, (SELECT last_ip FROM account WHERE id = ?), ?, unix_timestamp(NOW()), NOW())");
|
||||||
|
// 0: uint32, 1: uint32, 2: uint8, 3: uint32, 4: string // Complete name: "Login_Insert_FailedAccountLogin_IP_Logging"
|
||||||
|
PrepareStatement(LoginStatements.INS_FACL_IP_LOGGING, "INSERT INTO logs_ip_actions (account_id,character_guid,type,ip,systemnote,unixtime,time) VALUES (?, ?, ?, (SELECT last_attempt_ip FROM account WHERE id = ?), ?, unix_timestamp(NOW()), NOW())");
|
||||||
|
// 0: uint32, 1: uint32, 2: uint8, 3: string, 4: string // Complete name: "Login_Insert_CharacterDelete_IP_Logging"
|
||||||
|
PrepareStatement(LoginStatements.INS_CHAR_IP_LOGGING, "INSERT INTO logs_ip_actions (account_id,character_guid,type,ip,systemnote,unixtime,time) VALUES (?, ?, ?, ?, ?, unix_timestamp(NOW()), NOW())");
|
||||||
|
// 0: string, 1: string, 2: string // Complete name: "Login_Insert_Failed_Account_Login_due_password_IP_Logging"
|
||||||
|
PrepareStatement(LoginStatements.INS_FALP_IP_LOGGING, "INSERT INTO logs_ip_actions (account_id,character_guid,type,ip,systemnote,unixtime,time) VALUES (?, 0, 1, ?, ?, unix_timestamp(NOW()), NOW())");
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_ACCESS_BY_ID, "SELECT gmlevel, RealmID FROM account_access WHERE id = ? and (RealmID = ? OR RealmID = -1) ORDER BY gmlevel desc");
|
||||||
|
|
||||||
|
PrepareStatement(LoginStatements.SEL_RBAC_ACCOUNT_PERMISSIONS, "SELECT permissionId, granted FROM rbac_account_permissions WHERE accountId = ? AND (realmId = ? OR realmId = -1) ORDER BY permissionId, realmId");
|
||||||
|
PrepareStatement(LoginStatements.INS_RBAC_ACCOUNT_PERMISSION, "INSERT INTO rbac_account_permissions (accountId, permissionId, granted, realmId) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE granted = VALUES(granted)");
|
||||||
|
PrepareStatement(LoginStatements.DEL_RBAC_ACCOUNT_PERMISSION, "DELETE FROM rbac_account_permissions WHERE accountId = ? AND permissionId = ? AND (realmId = ? OR realmId = -1)");
|
||||||
|
|
||||||
|
PrepareStatement(LoginStatements.INS_ACCOUNT_MUTE, "INSERT INTO account_muted VALUES (?, UNIX_TIMESTAMP(), ?, ?, ?)");
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_MUTE_INFO, "SELECT mutedate, mutetime, mutereason, mutedby FROM account_muted WHERE guid = ? ORDER BY mutedate ASC");
|
||||||
|
PrepareStatement(LoginStatements.DEL_ACCOUNT_MUTED, "DELETE FROM account_muted WHERE guid = ?");
|
||||||
|
|
||||||
|
PrepareStatement(LoginStatements.SEL_BNET_ACCOUNT_INFO, "SELECT " + BnetAccountInfo + ", " + BnetGameAccountInfo + ", ba.sha_pass_hash" +
|
||||||
|
" FROM battlenet_accounts ba LEFT JOIN battlenet_account_bans bab ON ba.id = bab.id LEFT JOIN account a ON ba.id = a.battlenet_account" +
|
||||||
|
" LEFT JOIN account_banned ab ON a.id = ab.id AND ab.active = 1 LEFT JOIN account_access aa ON a.id = aa.id AND aa.RealmID = -1 WHERE ba.email = ? ORDER BY a.id");
|
||||||
|
PrepareStatement(LoginStatements.UPD_BNET_LAST_LOGIN_INFO, "UPDATE battlenet_accounts SET last_ip = ?, last_login = NOW(), locale = ?, failed_logins = 0, os = ? WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_BNET_GAME_ACCOUNT_LOGIN_INFO, "UPDATE account SET sessionkey = ?, last_ip = ?, last_login = NOW(), locale = ?, failed_logins = 0, os = ? WHERE username = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_BNET_CHARACTER_COUNTS_BY_ACCOUNT_ID, "SELECT rc.acctid, rc.numchars, r.id, r.Region, r.Battlegroup FROM realmcharacters rc INNER JOIN realmlist r ON rc.realmid = r.id WHERE rc.acctid = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_BNET_CHARACTER_COUNTS_BY_BNET_ID, "SELECT rc.acctid, rc.numchars, r.id, r.Region, r.Battlegroup FROM realmcharacters rc INNER JOIN realmlist r ON rc.realmid = r.id LEFT JOIN account a ON rc.acctid = a.id WHERE a.battlenet_account = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_BNET_LAST_PLAYER_CHARACTERS, "SELECT lpc.accountId, lpc.region, lpc.battlegroup, lpc.realmId, lpc.characterName, lpc.characterGUID, lpc.lastPlayedTime FROM account_last_played_character lpc LEFT JOIN account a ON lpc.accountId = a.id WHERE a.battlenet_account = ?");
|
||||||
|
PrepareStatement(LoginStatements.DEL_BNET_LAST_PLAYER_CHARACTERS, "DELETE FROM account_last_played_character WHERE accountId = ? AND region = ? AND battlegroup = ?");
|
||||||
|
PrepareStatement(LoginStatements.INS_BNET_LAST_PLAYER_CHARACTERS, "INSERT INTO account_last_played_character (accountId, region, battlegroup, realmId, characterName, characterGUID, lastPlayedTime) VALUES (?,?,?,?,?,?,?)");
|
||||||
|
PrepareStatement(LoginStatements.INS_BNET_ACCOUNT, "INSERT INTO battlenet_accounts (`email`,`sha_pass_hash`) VALUES (?, ?)");
|
||||||
|
PrepareStatement(LoginStatements.SEL_BNET_ACCOUNT_EMAIL_BY_ID, "SELECT email FROM battlenet_accounts WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_BNET_ACCOUNT_ID_BY_EMAIL, "SELECT id FROM battlenet_accounts WHERE email = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_BNET_PASSWORD, "UPDATE battlenet_accounts SET sha_pass_hash = ? WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_BNET_CHECK_PASSWORD, "SELECT 1 FROM battlenet_accounts WHERE id = ? AND sha_pass_hash = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_BNET_ACCOUNT_LOCK, "UPDATE battlenet_accounts SET locked = ? WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_BNET_ACCOUNT_LOCK_CONTRY, "UPDATE battlenet_accounts SET lock_country = ? WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_BNET_ACCOUNT_ID_BY_GAME_ACCOUNT, "SELECT battlenet_account FROM account WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_BNET_GAME_ACCOUNT_LINK, "UPDATE account SET battlenet_account = ?, battlenet_index = ? WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_BNET_MAX_ACCOUNT_INDEX, "SELECT MAX(battlenet_index) FROM account WHERE battlenet_account = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_BNET_GAME_ACCOUNT_LIST, "SELECT a.id, a.username FROM account a LEFT JOIN battlenet_accounts ba ON a.battlenet_account = ba.id WHERE ba.email = ?");
|
||||||
|
|
||||||
|
PrepareStatement(LoginStatements.UPD_BNET_FAILED_LOGINS, "UPDATE battlenet_accounts SET failed_logins = failed_logins + 1 WHERE id = ?");
|
||||||
|
PrepareStatement(LoginStatements.INS_BNET_ACCOUNT_AUTO_BANNED, "INSERT INTO battlenet_account_bans(id, bandate, unbandate, bannedby, banreason) VALUES(?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Trinity Auth', 'Failed login autoban')");
|
||||||
|
PrepareStatement(LoginStatements.DEL_BNET_EXPIRED_ACCOUNT_BANNED, "DELETE FROM battlenet_account_bans WHERE unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()");
|
||||||
|
PrepareStatement(LoginStatements.UPD_BNET_RESET_FAILED_LOGINS, "UPDATE battlenet_accounts SET failed_logins = 0 WHERE id = ?");
|
||||||
|
|
||||||
|
PrepareStatement(LoginStatements.SEL_LAST_CHAR_UNDELETE, "SELECT LastCharacterUndelete FROM battlenet_accounts WHERE Id = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_LAST_CHAR_UNDELETE, "UPDATE battlenet_accounts SET LastCharacterUndelete = UNIX_TIMESTAMP() WHERE Id = ?");
|
||||||
|
|
||||||
|
// Account wide toys
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_TOYS, "SELECT itemId, isFavourite FROM battlenet_account_toys WHERE accountId = ?");
|
||||||
|
PrepareStatement(LoginStatements.REP_ACCOUNT_TOYS, "REPLACE INTO battlenet_account_toys (accountId, itemId, isFavourite) VALUES (?, ?, ?)");
|
||||||
|
|
||||||
|
// Battle Pets
|
||||||
|
PrepareStatement(LoginStatements.SEL_BATTLE_PETS, "SELECT guid, species, breed, level, exp, health, quality, flags, name FROM battle_pets WHERE battlenetAccountId = ?");
|
||||||
|
PrepareStatement(LoginStatements.INS_BATTLE_PETS, "INSERT INTO battle_pets (guid, battlenetAccountId, species, breed, level, exp, health, quality, flags, name) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||||
|
PrepareStatement(LoginStatements.DEL_BATTLE_PETS, "DELETE FROM battle_pets WHERE battlenetAccountId = ? AND guid = ?");
|
||||||
|
PrepareStatement(LoginStatements.UPD_BATTLE_PETS, "UPDATE battle_pets SET level = ?, exp = ?, health = ?, quality = ?, flags = ?, name = ? WHERE battlenetAccountId = ? AND guid = ?");
|
||||||
|
PrepareStatement(LoginStatements.SEL_BATTLE_PET_SLOTS, "SELECT id, battlePetGuid, locked FROM battle_pet_slots WHERE battlenetAccountId = ?");
|
||||||
|
PrepareStatement(LoginStatements.INS_BATTLE_PET_SLOTS, "INSERT INTO battle_pet_slots (id, battlenetAccountId, battlePetGuid, locked) VALUES (?, ?, ?, ?)");
|
||||||
|
PrepareStatement(LoginStatements.DEL_BATTLE_PET_SLOTS, "DELETE FROM battle_pet_slots WHERE battlenetAccountId = ?");
|
||||||
|
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_HEIRLOOMS, "SELECT itemId, flags FROM battlenet_account_heirlooms WHERE accountId = ?");
|
||||||
|
PrepareStatement(LoginStatements.REP_ACCOUNT_HEIRLOOMS, "REPLACE INTO battlenet_account_heirlooms (accountId, itemId, flags) VALUES (?, ?, ?)");
|
||||||
|
|
||||||
|
// Account wide mounts
|
||||||
|
PrepareStatement(LoginStatements.SEL_ACCOUNT_MOUNTS, "SELECT mountSpellId, flags FROM battlenet_account_mounts WHERE battlenetAccountId = ?");
|
||||||
|
PrepareStatement(LoginStatements.REP_ACCOUNT_MOUNTS, "REPLACE INTO battlenet_account_mounts (battlenetAccountId, mountSpellId, flags) VALUES (?, ?, ?)");
|
||||||
|
|
||||||
|
// Transmog collection
|
||||||
|
PrepareStatement(LoginStatements.SEL_BNET_ITEM_APPEARANCES, "SELECT blobIndex, appearanceMask FROM battlenet_item_appearances WHERE battlenetAccountId = ? ORDER BY blobIndex DESC");
|
||||||
|
PrepareStatement(LoginStatements.INS_BNET_ITEM_APPEARANCES, "INSERT INTO battlenet_item_appearances (battlenetAccountId, blobIndex, appearanceMask) VALUES (?, ?, ?) " +
|
||||||
|
"ON DUPLICATE KEY UPDATE appearanceMask = appearanceMask | VALUES(appearanceMask)");
|
||||||
|
PrepareStatement(LoginStatements.SEL_BNET_ITEM_FAVORITE_APPEARANCES, "SELECT itemModifiedAppearanceId FROM battlenet_item_favorite_appearances WHERE battlenetAccountId = ?");
|
||||||
|
PrepareStatement(LoginStatements.INS_BNET_ITEM_FAVORITE_APPEARANCE, "INSERT INTO battlenet_item_favorite_appearances (battlenetAccountId, itemModifiedAppearanceId) VALUES (?, ?)");
|
||||||
|
PrepareStatement(LoginStatements.DEL_BNET_ITEM_FAVORITE_APPEARANCE, "DELETE FROM battlenet_item_favorite_appearances WHERE battlenetAccountId = ? AND itemModifiedAppearanceId = ?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum LoginStatements
|
||||||
|
{
|
||||||
|
SEL_REALMLIST,
|
||||||
|
DEL_EXPIRED_IP_BANS,
|
||||||
|
UPD_EXPIRED_ACCOUNT_BANS,
|
||||||
|
SEL_IP_INFO,
|
||||||
|
INS_IP_AUTO_BANNED,
|
||||||
|
SEL_ACCOUNT_BANNED_ALL,
|
||||||
|
SEL_ACCOUNT_BANNED_BY_USERNAME,
|
||||||
|
DEL_ACCOUNT_BANNED,
|
||||||
|
UPD_ACCOUNT_INFO_CONTINUED_SESSION,
|
||||||
|
SEL_ACCOUNT_INFO_CONTINUED_SESSION,
|
||||||
|
UPD_VS,
|
||||||
|
SEL_LOGON_COUNTRY,
|
||||||
|
SEL_ACCOUNT_ID_BY_NAME,
|
||||||
|
SEL_ACCOUNT_LIST_BY_NAME,
|
||||||
|
SEL_ACCOUNT_INFO_BY_NAME,
|
||||||
|
SEL_ACCOUNT_LIST_BY_EMAIL,
|
||||||
|
SEL_ACCOUNT_BY_IP,
|
||||||
|
INS_IP_BANNED,
|
||||||
|
DEL_IP_NOT_BANNED,
|
||||||
|
SEL_IP_BANNED_ALL,
|
||||||
|
SEL_IP_BANNED_BY_IP,
|
||||||
|
SEL_ACCOUNT_BY_ID,
|
||||||
|
INS_ACCOUNT_BANNED,
|
||||||
|
UPD_ACCOUNT_NOT_BANNED,
|
||||||
|
DEL_REALM_CHARACTERS_BY_REALM,
|
||||||
|
DEL_REALM_CHARACTERS,
|
||||||
|
INS_REALM_CHARACTERS,
|
||||||
|
SEL_SUM_REALM_CHARACTERS,
|
||||||
|
INS_ACCOUNT,
|
||||||
|
INS_REALM_CHARACTERS_INIT,
|
||||||
|
UPD_EXPANSION,
|
||||||
|
UPD_ACCOUNT_LOCK,
|
||||||
|
UPD_ACCOUNT_LOCK_CONTRY,
|
||||||
|
INS_LOG,
|
||||||
|
UPD_USERNAME,
|
||||||
|
UPD_PASSWORD,
|
||||||
|
UPD_EMAIL,
|
||||||
|
UPD_REG_EMAIL,
|
||||||
|
UPD_MUTE_TIME,
|
||||||
|
UPD_MUTE_TIME_LOGIN,
|
||||||
|
UPD_LAST_IP,
|
||||||
|
UPD_LAST_ATTEMPT_IP,
|
||||||
|
UPD_ACCOUNT_ONLINE,
|
||||||
|
UPD_UPTIME_PLAYERS,
|
||||||
|
DEL_OLD_LOGS,
|
||||||
|
DEL_ACCOUNT_ACCESS,
|
||||||
|
DEL_ACCOUNT_ACCESS_BY_REALM,
|
||||||
|
INS_ACCOUNT_ACCESS,
|
||||||
|
GET_ACCOUNT_ID_BY_USERNAME,
|
||||||
|
GET_ACCOUNT_ACCESS_GMLEVEL,
|
||||||
|
GET_GMLEVEL_BY_REALMID,
|
||||||
|
GET_USERNAME_BY_ID,
|
||||||
|
SEL_CHECK_PASSWORD,
|
||||||
|
SEL_CHECK_PASSWORD_BY_NAME,
|
||||||
|
SEL_PINFO,
|
||||||
|
SEL_PINFO_BANS,
|
||||||
|
SEL_GM_ACCOUNTS,
|
||||||
|
SEL_ACCOUNT_INFO,
|
||||||
|
SEL_ACCOUNT_ACCESS_GMLEVEL_TEST,
|
||||||
|
SEL_ACCOUNT_ACCESS,
|
||||||
|
SEL_ACCOUNT_RECRUITER,
|
||||||
|
SEL_BANS,
|
||||||
|
SEL_ACCOUNT_WHOIS,
|
||||||
|
SEL_REALMLIST_SECURITY_LEVEL,
|
||||||
|
DEL_ACCOUNT,
|
||||||
|
SEL_IP2NATION_COUNTRY,
|
||||||
|
SEL_AUTOBROADCAST,
|
||||||
|
SEL_LAST_ATTEMPT_IP,
|
||||||
|
SEL_LAST_IP,
|
||||||
|
GET_EMAIL_BY_ID,
|
||||||
|
INS_ALDL_IP_LOGGING,
|
||||||
|
INS_FACL_IP_LOGGING,
|
||||||
|
INS_CHAR_IP_LOGGING,
|
||||||
|
INS_FALP_IP_LOGGING,
|
||||||
|
|
||||||
|
SEL_ACCOUNT_ACCESS_BY_ID,
|
||||||
|
SEL_RBAC_ACCOUNT_PERMISSIONS,
|
||||||
|
INS_RBAC_ACCOUNT_PERMISSION,
|
||||||
|
DEL_RBAC_ACCOUNT_PERMISSION,
|
||||||
|
|
||||||
|
INS_ACCOUNT_MUTE,
|
||||||
|
SEL_ACCOUNT_MUTE_INFO,
|
||||||
|
DEL_ACCOUNT_MUTED,
|
||||||
|
|
||||||
|
SEL_BNET_ACCOUNT_INFO,
|
||||||
|
UPD_BNET_LAST_LOGIN_INFO,
|
||||||
|
UPD_BNET_GAME_ACCOUNT_LOGIN_INFO,
|
||||||
|
SEL_BNET_CHARACTER_COUNTS_BY_ACCOUNT_ID,
|
||||||
|
SEL_BNET_CHARACTER_COUNTS_BY_BNET_ID,
|
||||||
|
SEL_BNET_LAST_PLAYER_CHARACTERS,
|
||||||
|
DEL_BNET_LAST_PLAYER_CHARACTERS,
|
||||||
|
INS_BNET_LAST_PLAYER_CHARACTERS,
|
||||||
|
INS_BNET_ACCOUNT,
|
||||||
|
SEL_BNET_ACCOUNT_EMAIL_BY_ID,
|
||||||
|
SEL_BNET_ACCOUNT_ID_BY_EMAIL,
|
||||||
|
UPD_BNET_PASSWORD,
|
||||||
|
SEL_BNET_ACCOUNT_SALT_BY_ID,
|
||||||
|
SEL_BNET_CHECK_PASSWORD,
|
||||||
|
UPD_BNET_ACCOUNT_LOCK,
|
||||||
|
UPD_BNET_ACCOUNT_LOCK_CONTRY,
|
||||||
|
SEL_BNET_ACCOUNT_ID_BY_GAME_ACCOUNT,
|
||||||
|
UPD_BNET_GAME_ACCOUNT_LINK,
|
||||||
|
SEL_BNET_MAX_ACCOUNT_INDEX,
|
||||||
|
SEL_BNET_GAME_ACCOUNT_LIST,
|
||||||
|
|
||||||
|
UPD_BNET_FAILED_LOGINS,
|
||||||
|
INS_BNET_ACCOUNT_AUTO_BANNED,
|
||||||
|
DEL_BNET_EXPIRED_ACCOUNT_BANNED,
|
||||||
|
UPD_BNET_RESET_FAILED_LOGINS,
|
||||||
|
|
||||||
|
SEL_LAST_CHAR_UNDELETE,
|
||||||
|
UPD_LAST_CHAR_UNDELETE,
|
||||||
|
|
||||||
|
SEL_ACCOUNT_TOYS,
|
||||||
|
REP_ACCOUNT_TOYS,
|
||||||
|
|
||||||
|
SEL_BATTLE_PETS,
|
||||||
|
INS_BATTLE_PETS,
|
||||||
|
DEL_BATTLE_PETS,
|
||||||
|
UPD_BATTLE_PETS,
|
||||||
|
SEL_BATTLE_PET_SLOTS,
|
||||||
|
INS_BATTLE_PET_SLOTS,
|
||||||
|
DEL_BATTLE_PET_SLOTS,
|
||||||
|
|
||||||
|
SEL_ACCOUNT_HEIRLOOMS,
|
||||||
|
REP_ACCOUNT_HEIRLOOMS,
|
||||||
|
|
||||||
|
SEL_ACCOUNT_MOUNTS,
|
||||||
|
REP_ACCOUNT_MOUNTS,
|
||||||
|
|
||||||
|
SEL_BNET_ITEM_APPEARANCES,
|
||||||
|
INS_BNET_ITEM_APPEARANCES,
|
||||||
|
SEL_BNET_ITEM_FAVORITE_APPEARANCES,
|
||||||
|
INS_BNET_ITEM_FAVORITE_APPEARANCE,
|
||||||
|
DEL_BNET_ITEM_FAVORITE_APPEARANCE,
|
||||||
|
|
||||||
|
MAX_LOGINDATABASE_STATEMENTS
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,171 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Framework.Database
|
||||||
|
{
|
||||||
|
public class WorldDatabase : MySqlBase<WorldStatements>
|
||||||
|
{
|
||||||
|
public override void PreparedStatements()
|
||||||
|
{
|
||||||
|
PrepareStatement(WorldStatements.SEL_QUEST_POOLS, "SELECT entry, pool_entry FROM pool_quest");
|
||||||
|
PrepareStatement(WorldStatements.DEL_CRELINKED_RESPAWN, "DELETE FROM linked_respawn WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.REP_CREATURE_LINKED_RESPAWN, "REPLACE INTO linked_respawn (guid, linkedGuid) VALUES (?, ?)");
|
||||||
|
PrepareStatement(WorldStatements.SEL_CREATURE_TEXT, "SELECT entry, groupid, id, text, type, language, probability, emote, duration, sound, BroadcastTextID, TextRange FROM creature_text");
|
||||||
|
PrepareStatement(WorldStatements.SEL_SMART_SCRIPTS, "SELECT entryorguid, source_type, id, link, event_type, event_phase_mask, event_chance, event_flags, event_param1, event_param2, event_param3, event_param4, event_param_string, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, target_type, target_param1, target_param2, target_param3, target_x, target_y, target_z, target_o FROM smart_scripts ORDER BY entryorguid, source_type, id, link");
|
||||||
|
PrepareStatement(WorldStatements.SEL_SMARTAI_WP, "SELECT entry, pointid, position_x, position_y, position_z FROM waypoints ORDER BY entry, pointid");
|
||||||
|
PrepareStatement(WorldStatements.DEL_GAMEOBJECT, "DELETE FROM gameobject WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.DEL_EVENT_GAMEOBJECT, "DELETE FROM game_event_gameobject WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.INS_GRAVEYARD_ZONE, "INSERT INTO graveyard_zone (ID, GhostZone, faction) VALUES (?, ?, ?)");
|
||||||
|
PrepareStatement(WorldStatements.DEL_GRAVEYARD_ZONE, "DELETE FROM graveyard_zone WHERE ID = ? AND GhostZone = ? AND faction = ?");
|
||||||
|
PrepareStatement(WorldStatements.INS_GAME_TELE, "INSERT INTO game_tele (id, position_x, position_y, position_z, orientation, map, name) VALUES (?, ?, ?, ?, ?, ?, ?)");
|
||||||
|
PrepareStatement(WorldStatements.DEL_GAME_TELE, "DELETE FROM game_tele WHERE name = ?");
|
||||||
|
PrepareStatement(WorldStatements.INS_NPC_VENDOR, "INSERT INTO npc_vendor (entry, item, maxcount, incrtime, extendedcost, type) VALUES(?, ?, ?, ?, ?, ?)");
|
||||||
|
PrepareStatement(WorldStatements.DEL_NPC_VENDOR, "DELETE FROM npc_vendor WHERE entry = ? AND item = ? AND type = ?");
|
||||||
|
PrepareStatement(WorldStatements.SEL_NPC_VENDOR_REF, "SELECT item, maxcount, incrtime, ExtendedCost, type FROM npc_vendor WHERE entry = ? AND type = ? ORDER BY slot ASC");
|
||||||
|
PrepareStatement(WorldStatements.UPD_CREATURE_MOVEMENT_TYPE, "UPDATE creature SET MovementType = ? WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_CREATURE_FACTION, "UPDATE creature_template SET faction = ? WHERE entry = ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_CREATURE_NPCFLAG, "UPDATE creature_template SET npcflag = ? WHERE entry = ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_CREATURE_POSITION, "UPDATE creature SET position_x = ?, position_y = ?, position_z = ?, orientation = ? WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_CREATURE_SPAWN_DISTANCE, "UPDATE creature SET spawndist = ?, MovementType = ? WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_CREATURE_SPAWN_TIME_SECS, "UPDATE creature SET spawntimesecs = ? WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.INS_CREATURE_FORMATION, "INSERT INTO creature_formations (leaderGUID, memberGUID, dist, angle, groupAI) VALUES (?, ?, ?, ?, ?)");
|
||||||
|
PrepareStatement(WorldStatements.INS_WAYPOINT_DATA, "INSERT INTO waypoint_data (id, point, position_x, position_y, position_z) VALUES (?, ?, ?, ?, ?)");
|
||||||
|
PrepareStatement(WorldStatements.DEL_WAYPOINT_DATA, "DELETE FROM waypoint_data WHERE id = ? AND point = ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_WAYPOINT_DATA_POINT, "UPDATE waypoint_data SET point = point - 1 WHERE id = ? AND point > ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_WAYPOINT_DATA_POSITION, "UPDATE waypoint_data SET position_x = ?, position_y = ?, position_z = ? where id = ? AND point = ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_WAYPOINT_DATA_WPGUID, "UPDATE waypoint_data SET wpguid = ? WHERE id = ? and point = ?");
|
||||||
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_DATA_MAX_ID, "SELECT MAX(id) FROM waypoint_data");
|
||||||
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_DATA_MAX_POINT, "SELECT MAX(point) FROM waypoint_data WHERE id = ?");
|
||||||
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_DATA_BY_ID, "SELECT point, position_x, position_y, position_z, orientation, move_type, delay, action, action_chance FROM waypoint_data WHERE id = ? ORDER BY point");
|
||||||
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_DATA_POS_BY_ID, "SELECT point, position_x, position_y, position_z FROM waypoint_data WHERE id = ?");
|
||||||
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_DATA_POS_FIRST_BY_ID, "SELECT position_x, position_y, position_z FROM waypoint_data WHERE point = 1 AND id = ?");
|
||||||
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_DATA_POS_LAST_BY_ID, "SELECT position_x, position_y, position_z, orientation FROM waypoint_data WHERE id = ? ORDER BY point DESC LIMIT 1");
|
||||||
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_DATA_BY_WPGUID, "SELECT id, point FROM waypoint_data WHERE wpguid = ?");
|
||||||
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_DATA_ALL_BY_WPGUID, "SELECT id, point, delay, move_type, action, action_chance FROM waypoint_data WHERE wpguid = ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_WAYPOINT_DATA_ALL_WPGUID, "UPDATE waypoint_data SET wpguid = 0");
|
||||||
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_DATA_BY_POS, "SELECT id, point FROM waypoint_data WHERE (abs(position_x - ?) <= ?) and (abs(position_y - ?) <= ?) and (abs(position_z - ?) <= ?)");
|
||||||
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_DATA_WPGUID_BY_ID, "SELECT wpguid FROM waypoint_data WHERE id = ? and wpguid <> 0");
|
||||||
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_DATA_ACTION, "SELECT DISTINCT action FROM waypoint_data");
|
||||||
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_SCRIPTS_MAX_ID, "SELECT MAX(guid) FROM waypoint_scripts");
|
||||||
|
PrepareStatement(WorldStatements.INS_CREATURE_ADDON, "INSERT INTO creature_addon(guid, path_id) VALUES (?, ?)");
|
||||||
|
PrepareStatement(WorldStatements.UPD_CREATURE_ADDON_PATH, "UPDATE creature_addon SET path_id = ? WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.DEL_CREATURE_ADDON, "DELETE FROM creature_addon WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.SEL_CREATURE_ADDON_BY_GUID, "SELECT guid FROM creature_addon WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.INS_WAYPOINT_SCRIPT, "INSERT INTO waypoint_scripts (guid) VALUES (?)");
|
||||||
|
PrepareStatement(WorldStatements.DEL_WAYPOINT_SCRIPT, "DELETE FROM waypoint_scripts WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_WAYPOINT_SCRIPT_ID, "UPDATE waypoint_scripts SET id = ? WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_WAYPOINT_SCRIPT_X, "UPDATE waypoint_scripts SET x = ? WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_WAYPOINT_SCRIPT_Y, "UPDATE waypoint_scripts SET y = ? WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_WAYPOINT_SCRIPT_Z, "UPDATE waypoint_scripts SET z = ? WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_WAYPOINT_SCRIPT_O, "UPDATE waypoint_scripts SET o = ? WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.DEL_CREATURE, "DELETE FROM creature WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.SEL_COMMANDS, "SELECT name, permission, help FROM command");
|
||||||
|
PrepareStatement(WorldStatements.SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, femaleName, subname, IconName, gossip_menu_id, minlevel, maxlevel, HealthScalingExpansion, RequiredExpansion, VignetteID, faction, npcflag, speed_walk, speed_run, scale, rank, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, unit_flags3, dynamicflags, family, trainer_type, trainer_class, trainer_race, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?");
|
||||||
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?");
|
||||||
|
PrepareStatement(WorldStatements.SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?");
|
||||||
|
PrepareStatement(WorldStatements.SEL_GAMEOBJECT_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM gameobject WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_");
|
||||||
|
PrepareStatement(WorldStatements.SEL_CREATURE_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM creature WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_");
|
||||||
|
PrepareStatement(WorldStatements.INS_CREATURE, "INSERT INTO creature (guid, id , map, spawnMask, PhaseId, PhaseGroup, modelid, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, currentwaypoint, curhealth, curmana, MovementType, npcflag, unit_flags, unit_flags2, unit_flags3, dynamicflags) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||||
|
PrepareStatement(WorldStatements.DEL_GAME_EVENT_CREATURE, "DELETE FROM game_event_creature WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.DEL_GAME_EVENT_MODEL_EQUIP, "DELETE FROM game_event_model_equip WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.INS_GAMEOBJECT, "INSERT INTO gameobject (guid, id, map, spawnMask, position_x, position_y, position_z, orientation, rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||||
|
PrepareStatement(WorldStatements.INS_DISABLES, "INSERT INTO disables (entry, sourceType, flags, comment) VALUES (?, ?, ?, ?)");
|
||||||
|
PrepareStatement(WorldStatements.SEL_DISABLES, "SELECT entry FROM disables WHERE entry = ? AND sourceType = ?");
|
||||||
|
PrepareStatement(WorldStatements.DEL_DISABLES, "DELETE FROM disables WHERE entry = ? AND sourceType = ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_CREATURE_ZONE_AREA_DATA, "UPDATE creature SET zoneId = ?, areaId = ? WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.UPD_GAMEOBJECT_ZONE_AREA_DATA, "UPDATE gameobject SET zoneId = ?, areaId = ? WHERE guid = ?");
|
||||||
|
PrepareStatement(WorldStatements.SEL_GUILD_REWARDS_REQ_ACHIEVEMENTS, "SELECT AchievementRequired FROM guild_rewards_req_achievements WHERE ItemID = ?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum WorldStatements
|
||||||
|
{
|
||||||
|
SEL_QUEST_POOLS,
|
||||||
|
DEL_CRELINKED_RESPAWN,
|
||||||
|
REP_CREATURE_LINKED_RESPAWN,
|
||||||
|
SEL_CREATURE_TEXT,
|
||||||
|
SEL_SMART_SCRIPTS,
|
||||||
|
SEL_SMARTAI_WP,
|
||||||
|
DEL_GAMEOBJECT,
|
||||||
|
DEL_EVENT_GAMEOBJECT,
|
||||||
|
INS_GRAVEYARD_ZONE,
|
||||||
|
DEL_GRAVEYARD_ZONE,
|
||||||
|
INS_GAME_TELE,
|
||||||
|
DEL_GAME_TELE,
|
||||||
|
INS_NPC_VENDOR,
|
||||||
|
DEL_NPC_VENDOR,
|
||||||
|
SEL_NPC_VENDOR_REF,
|
||||||
|
UPD_CREATURE_MOVEMENT_TYPE,
|
||||||
|
UPD_CREATURE_FACTION,
|
||||||
|
UPD_CREATURE_NPCFLAG,
|
||||||
|
UPD_CREATURE_POSITION,
|
||||||
|
UPD_CREATURE_SPAWN_DISTANCE,
|
||||||
|
UPD_CREATURE_SPAWN_TIME_SECS,
|
||||||
|
INS_CREATURE_FORMATION,
|
||||||
|
INS_WAYPOINT_DATA,
|
||||||
|
DEL_WAYPOINT_DATA,
|
||||||
|
UPD_WAYPOINT_DATA_POINT,
|
||||||
|
UPD_WAYPOINT_DATA_POSITION,
|
||||||
|
UPD_WAYPOINT_DATA_WPGUID,
|
||||||
|
UPD_WAYPOINT_DATA_ALL_WPGUID,
|
||||||
|
SEL_WAYPOINT_DATA_MAX_ID,
|
||||||
|
SEL_WAYPOINT_DATA_BY_ID,
|
||||||
|
SEL_WAYPOINT_DATA_POS_BY_ID,
|
||||||
|
SEL_WAYPOINT_DATA_POS_FIRST_BY_ID,
|
||||||
|
SEL_WAYPOINT_DATA_POS_LAST_BY_ID,
|
||||||
|
SEL_WAYPOINT_DATA_BY_WPGUID,
|
||||||
|
SEL_WAYPOINT_DATA_ALL_BY_WPGUID,
|
||||||
|
SEL_WAYPOINT_DATA_MAX_POINT,
|
||||||
|
SEL_WAYPOINT_DATA_BY_POS,
|
||||||
|
SEL_WAYPOINT_DATA_WPGUID_BY_ID,
|
||||||
|
SEL_WAYPOINT_DATA_ACTION,
|
||||||
|
SEL_WAYPOINT_SCRIPTS_MAX_ID,
|
||||||
|
UPD_CREATURE_ADDON_PATH,
|
||||||
|
INS_CREATURE_ADDON,
|
||||||
|
DEL_CREATURE_ADDON,
|
||||||
|
SEL_CREATURE_ADDON_BY_GUID,
|
||||||
|
INS_WAYPOINT_SCRIPT,
|
||||||
|
DEL_WAYPOINT_SCRIPT,
|
||||||
|
UPD_WAYPOINT_SCRIPT_ID,
|
||||||
|
UPD_WAYPOINT_SCRIPT_X,
|
||||||
|
UPD_WAYPOINT_SCRIPT_Y,
|
||||||
|
UPD_WAYPOINT_SCRIPT_Z,
|
||||||
|
UPD_WAYPOINT_SCRIPT_O,
|
||||||
|
SEL_WAYPOINT_SCRIPT_ID_BY_GUID,
|
||||||
|
DEL_CREATURE,
|
||||||
|
SEL_COMMANDS,
|
||||||
|
SEL_CREATURE_TEMPLATE,
|
||||||
|
SEL_WAYPOINT_SCRIPT_BY_ID,
|
||||||
|
SEL_CREATURE_BY_ID,
|
||||||
|
SEL_GAMEOBJECT_NEAREST,
|
||||||
|
SEL_CREATURE_NEAREST,
|
||||||
|
SEL_GAMEOBJECT_TARGET,
|
||||||
|
INS_CREATURE,
|
||||||
|
DEL_GAME_EVENT_CREATURE,
|
||||||
|
DEL_GAME_EVENT_MODEL_EQUIP,
|
||||||
|
INS_GAMEOBJECT,
|
||||||
|
SEL_DISABLES,
|
||||||
|
INS_DISABLES,
|
||||||
|
DEL_DISABLES,
|
||||||
|
UPD_CREATURE_ZONE_AREA_DATA,
|
||||||
|
UPD_GAMEOBJECT_ZONE_AREA_DATA,
|
||||||
|
SEL_GUILD_REWARDS_REQ_ACHIEVEMENTS,
|
||||||
|
|
||||||
|
MAX_WORLDDATABASE_STATEMENTS
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,422 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Framework.Collections;
|
||||||
|
using MySql.Data.MySqlClient;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Transactions;
|
||||||
|
|
||||||
|
namespace Framework.Database
|
||||||
|
{
|
||||||
|
public class MySqlConnectionInfo
|
||||||
|
{
|
||||||
|
public MySqlConnectionInfo(string info, int poolSize = 10)
|
||||||
|
{
|
||||||
|
var lines = new StringArray(info, ';');
|
||||||
|
Host = lines[0];
|
||||||
|
Port = lines[1];
|
||||||
|
Username = lines[2];
|
||||||
|
Password = lines[3];
|
||||||
|
Database = lines[4];
|
||||||
|
Poolsize = poolSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MySqlConnection GetConnection()
|
||||||
|
{
|
||||||
|
return new MySqlConnection(string.Format("Server={0};Port={1};User Id={2};Password={3};Database={4};Allow Zero Datetime=True;Allow User Variables=True;Pooling=true;MaximumPoolSize={5};",
|
||||||
|
Host, Port, Username, Password, Database, Poolsize));
|
||||||
|
}
|
||||||
|
|
||||||
|
public MySqlConnection GetConnectionNoDatabase()
|
||||||
|
{
|
||||||
|
return new MySqlConnection(string.Format("Server={0};Port={1};User Id={2};Password={3};Allow Zero Datetime=True;Allow User Variables=True;Pooling=true;MaximumPoolSize={4};",
|
||||||
|
Host, Port, Username, Password, Poolsize));
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Host;
|
||||||
|
public string Port;
|
||||||
|
public string Username;
|
||||||
|
public string Password;
|
||||||
|
public string Database;
|
||||||
|
public int Poolsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class MySqlBase<T>
|
||||||
|
{
|
||||||
|
public MySqlErrorCode Initialize(string infoString)
|
||||||
|
{
|
||||||
|
_connectionInfo = new MySqlConnectionInfo(infoString);
|
||||||
|
_updater = new DatabaseUpdater<T>(this);
|
||||||
|
|
||||||
|
using (var connection = _connectionInfo.GetConnection())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
connection.Open();
|
||||||
|
Log.outInfo(LogFilter.SqlDriver, "Connected to MySQL(ver: {0}) Database: {1}", connection.ServerVersion, _connectionInfo.Database);
|
||||||
|
return MySqlErrorCode.None;
|
||||||
|
}
|
||||||
|
catch (MySqlException ex)
|
||||||
|
{
|
||||||
|
return (MySqlErrorCode)((MySqlException)ex.InnerException).Number;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Execute(string sql, params object[] args)
|
||||||
|
{
|
||||||
|
Execute(new PreparedStatement(string.Format(sql, args)));
|
||||||
|
}
|
||||||
|
public void Execute(PreparedStatement stmt)
|
||||||
|
{
|
||||||
|
using (var Connection = _connectionInfo.GetConnection())
|
||||||
|
{
|
||||||
|
Connection.Open();
|
||||||
|
using (MySqlCommand cmd = Connection.CreateCommand())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
cmd.CommandText = stmt.CommandText;
|
||||||
|
foreach (var parameter in stmt.Parameters)
|
||||||
|
cmd.Parameters.AddWithValue("@" + parameter.Key, parameter.Value);
|
||||||
|
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
catch (MySqlException ex)
|
||||||
|
{
|
||||||
|
HandleMySQLException(ex, stmt.CommandText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ExecuteOrAppend(SQLTransaction trans, PreparedStatement stmt)
|
||||||
|
{
|
||||||
|
if (trans == null)
|
||||||
|
Execute(stmt);
|
||||||
|
else
|
||||||
|
trans.Append(stmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SQLResult Query(string sql, params object[] args)
|
||||||
|
{
|
||||||
|
return Query(new PreparedStatement(string.Format(sql, args)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public SQLResult Query(PreparedStatement stmt)
|
||||||
|
{
|
||||||
|
List<object[]> rows = new List<object[]>();
|
||||||
|
using (var Connection = _connectionInfo.GetConnection())
|
||||||
|
{
|
||||||
|
Connection.Open();
|
||||||
|
using (MySqlCommand cmd = Connection.CreateCommand())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
cmd.CommandText = stmt.CommandText;
|
||||||
|
foreach (var parameter in stmt.Parameters)
|
||||||
|
cmd.Parameters.AddWithValue("@" + parameter.Key, parameter.Value);
|
||||||
|
|
||||||
|
using (var reader = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
if (reader.Read() && reader.HasRows)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
var row = new object[reader.FieldCount];
|
||||||
|
|
||||||
|
reader.GetValues(row);
|
||||||
|
rows.Add(row);
|
||||||
|
}
|
||||||
|
while (reader.Read());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (MySqlException ex)
|
||||||
|
{
|
||||||
|
HandleMySQLException(ex, stmt.CommandText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new SQLResult(rows);
|
||||||
|
}
|
||||||
|
|
||||||
|
public QueryCallback AsyncQuery(string sql, params object[] args)
|
||||||
|
{
|
||||||
|
return AsyncQuery(new PreparedStatement(string.Format(sql, args)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public QueryCallback AsyncQuery(PreparedStatement stmt)
|
||||||
|
{
|
||||||
|
return new QueryCallback(_AsyncQuery(stmt));
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task<SQLResult> _AsyncQuery(PreparedStatement stmt)
|
||||||
|
{
|
||||||
|
List<object[]> rows = new List<object[]>();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (var Connection = _connectionInfo.GetConnection())
|
||||||
|
{
|
||||||
|
Connection.Open();
|
||||||
|
using (MySqlCommand cmd = Connection.CreateCommand())
|
||||||
|
{
|
||||||
|
cmd.CommandText = stmt.CommandText;
|
||||||
|
foreach (var parameter in stmt.Parameters)
|
||||||
|
cmd.Parameters.AddWithValue("@" + parameter.Key, parameter.Value);
|
||||||
|
|
||||||
|
using (var reader = await cmd.ExecuteReaderAsync())
|
||||||
|
{
|
||||||
|
if (reader.Read() && reader.HasRows)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
var row = new object[reader.FieldCount];
|
||||||
|
|
||||||
|
reader.GetValues(row);
|
||||||
|
rows.Add(row);
|
||||||
|
}
|
||||||
|
while (reader.Read());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (MySqlException ex)
|
||||||
|
{
|
||||||
|
HandleMySQLException(ex, stmt.CommandText);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new SQLResult(rows);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<SQLQueryHolder<R>> DelayQueryHolder<R>(SQLQueryHolder<R> holder)
|
||||||
|
{
|
||||||
|
return await Task.Run(async () =>
|
||||||
|
{
|
||||||
|
string query = "";
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (var Connection = _connectionInfo.GetConnection())
|
||||||
|
{
|
||||||
|
Connection.Open();
|
||||||
|
|
||||||
|
foreach (var pair in holder.m_queries)
|
||||||
|
{
|
||||||
|
List<object[]> rows = new List<object[]>();
|
||||||
|
using (MySqlCommand cmd = Connection.CreateCommand())
|
||||||
|
{
|
||||||
|
cmd.CommandText = pair.Value.stmt.CommandText;
|
||||||
|
foreach (var parameter in pair.Value.stmt.Parameters)
|
||||||
|
cmd.Parameters.AddWithValue("@" + parameter.Key, parameter.Value);
|
||||||
|
|
||||||
|
query = cmd.CommandText;
|
||||||
|
using (var reader = await cmd.ExecuteReaderAsync())
|
||||||
|
{
|
||||||
|
if (reader.Read() && reader.HasRows)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
var row = new object[reader.FieldCount];
|
||||||
|
|
||||||
|
reader.GetValues(row);
|
||||||
|
rows.Add(row);
|
||||||
|
}
|
||||||
|
while (reader.Read());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
holder.SetResult(pair.Key, new SQLResult(rows));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return holder;
|
||||||
|
}
|
||||||
|
catch (MySqlException ex)
|
||||||
|
{
|
||||||
|
HandleMySQLException(ex, query);
|
||||||
|
return holder;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadPreparedStatements()
|
||||||
|
{
|
||||||
|
PreparedStatements();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PrepareStatement(T statement, string sql)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
int index = 0;
|
||||||
|
for (var i = 0; i < sql.Length; i++)
|
||||||
|
{
|
||||||
|
if (sql[i].Equals('?'))
|
||||||
|
sb.Append("@" + index++);
|
||||||
|
else
|
||||||
|
sb.Append(sql[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
_queries[statement] = sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public PreparedStatement GetPreparedStatement(T statement)
|
||||||
|
{
|
||||||
|
return new PreparedStatement(_queries[statement]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Apply(string sql)
|
||||||
|
{
|
||||||
|
using (var Connection = _connectionInfo.GetConnectionNoDatabase())
|
||||||
|
{
|
||||||
|
using (MySqlCommand cmd = Connection.CreateCommand())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Connection.Open();
|
||||||
|
cmd.CommandText = sql;
|
||||||
|
return cmd.ExecuteNonQuery() > 0;
|
||||||
|
}
|
||||||
|
catch (MySqlException ex)
|
||||||
|
{
|
||||||
|
HandleMySQLException(ex, sql);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ApplyFile(string path)
|
||||||
|
{
|
||||||
|
using (var connection = _connectionInfo.GetConnection())
|
||||||
|
{
|
||||||
|
using (MySqlCommand cmd = connection.CreateCommand())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
connection.Open();
|
||||||
|
cmd.CommandText = File.ReadAllText(path);
|
||||||
|
return cmd.ExecuteNonQuery() > 0;
|
||||||
|
}
|
||||||
|
catch (MySqlException ex)
|
||||||
|
{
|
||||||
|
HandleMySQLException(ex, path);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void EscapeString(ref string str)
|
||||||
|
{
|
||||||
|
str = MySqlHelper.EscapeString(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CommitTransaction(SQLTransaction transaction)
|
||||||
|
{
|
||||||
|
using (var Connection = _connectionInfo.GetConnection())
|
||||||
|
{
|
||||||
|
string query = "";
|
||||||
|
Connection.Open();
|
||||||
|
using (MySqlTransaction trans = Connection.BeginTransaction())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (var scope = new TransactionScope())
|
||||||
|
{
|
||||||
|
foreach (var cmd in transaction.commands)
|
||||||
|
{
|
||||||
|
cmd.Transaction = trans;
|
||||||
|
cmd.Connection = Connection;
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
query = cmd.CommandText;
|
||||||
|
}
|
||||||
|
|
||||||
|
trans.Commit();
|
||||||
|
scope.Complete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (MySqlException ex) //error occurred
|
||||||
|
{
|
||||||
|
HandleMySQLException(ex, query);
|
||||||
|
trans.Rollback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HandleMySQLException(MySqlException ex, string query)
|
||||||
|
{
|
||||||
|
int code = ex.Number;
|
||||||
|
if (ex.InnerException != null)
|
||||||
|
code = ((MySqlException)ex.InnerException).Number;
|
||||||
|
|
||||||
|
switch ((MySqlErrorCode)code)
|
||||||
|
{
|
||||||
|
case MySqlErrorCode.BadFieldError:
|
||||||
|
case MySqlErrorCode.NoSuchTable:
|
||||||
|
Log.outError(LogFilter.Sql, "Your database structure is not up to date. Please make sure you've executed all queries in the sql/updates folders.");
|
||||||
|
break;
|
||||||
|
case MySqlErrorCode.ParseError:
|
||||||
|
Log.outError(LogFilter.Sql, "Error while parsing SQL. Core fix required.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.outError(LogFilter.Sql, "SqlException: {0} SqlQuery: {1}", ex.Message, query);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DatabaseUpdater<T> GetUpdater()
|
||||||
|
{
|
||||||
|
return _updater;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsAutoUpdateEnabled(DatabaseTypeFlags updateMask)
|
||||||
|
{
|
||||||
|
switch (GetType().Name)
|
||||||
|
{
|
||||||
|
case "LoginDatabase":
|
||||||
|
return updateMask.HasAnyFlag(DatabaseTypeFlags.Login);
|
||||||
|
case "CharacterDatabase":
|
||||||
|
return updateMask.HasAnyFlag(DatabaseTypeFlags.Character);
|
||||||
|
case "WorldDatabase":
|
||||||
|
return updateMask.HasAnyFlag(DatabaseTypeFlags.World);
|
||||||
|
case "HotfixDatabase":
|
||||||
|
return updateMask.HasAnyFlag(DatabaseTypeFlags.Hotfix);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetDatabaseName()
|
||||||
|
{
|
||||||
|
return _connectionInfo.Database;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void PreparedStatements();
|
||||||
|
|
||||||
|
Dictionary<T, string> _queries = new Dictionary<T, string>();
|
||||||
|
MySqlConnectionInfo _connectionInfo;
|
||||||
|
DatabaseUpdater<T> _updater;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Framework.Database
|
||||||
|
{
|
||||||
|
public class PreparedStatement
|
||||||
|
{
|
||||||
|
public PreparedStatement(string commandText)
|
||||||
|
{
|
||||||
|
CommandText = commandText;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddValue(int index, object value)
|
||||||
|
{
|
||||||
|
Parameters.Add(index, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
Parameters.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public string CommandText;
|
||||||
|
public Dictionary<int, object> Parameters = new Dictionary<int, object>();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics.Contracts;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Framework.Database
|
||||||
|
{
|
||||||
|
public class QueryCallback
|
||||||
|
{
|
||||||
|
public QueryCallback(Task<SQLResult> result)
|
||||||
|
{
|
||||||
|
_result = result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public QueryCallback WithCallback(Action<SQLResult> callback)
|
||||||
|
{
|
||||||
|
return WithChainingCallback((queryCallback, result) => callback(result));
|
||||||
|
}
|
||||||
|
|
||||||
|
public QueryCallback WithCallback<T>(Action<T, SQLResult> callback, T obj)
|
||||||
|
{
|
||||||
|
return WithChainingCallback((queryCallback, result) => callback(obj, result));
|
||||||
|
}
|
||||||
|
|
||||||
|
public QueryCallback WithChainingCallback(Action<QueryCallback, SQLResult> callback)
|
||||||
|
{
|
||||||
|
_callbacks.Add(new QueryCallbackData(callback));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetNextQuery(QueryCallback next)
|
||||||
|
{
|
||||||
|
_result = next._result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public QueryCallbackStatus InvokeIfReady()
|
||||||
|
{
|
||||||
|
QueryCallbackData callback = _callbacks.First();
|
||||||
|
if (_result.IsCompleted)
|
||||||
|
{
|
||||||
|
Task<SQLResult> f = _result;
|
||||||
|
Action<QueryCallback, SQLResult> cb = callback._result;
|
||||||
|
_result = null;
|
||||||
|
callback.Clear();
|
||||||
|
|
||||||
|
cb(this, f.Result);
|
||||||
|
|
||||||
|
_callbacks.RemoveAt(0);
|
||||||
|
bool hasNext = _result != null;
|
||||||
|
if (_callbacks.Empty())
|
||||||
|
{
|
||||||
|
Contract.Assert(!hasNext);
|
||||||
|
return QueryCallbackStatus.Completed;
|
||||||
|
}
|
||||||
|
|
||||||
|
// abort chain
|
||||||
|
if (!hasNext)
|
||||||
|
return QueryCallbackStatus.Completed;
|
||||||
|
|
||||||
|
return QueryCallbackStatus.NextStep;
|
||||||
|
}
|
||||||
|
|
||||||
|
return QueryCallbackStatus.NotReady;
|
||||||
|
}
|
||||||
|
|
||||||
|
Task<SQLResult> _result;
|
||||||
|
List<QueryCallbackData> _callbacks = new List<QueryCallbackData>();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct QueryCallbackData
|
||||||
|
{
|
||||||
|
public QueryCallbackData(Action<QueryCallback, SQLResult> callback)
|
||||||
|
{
|
||||||
|
_result = callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
_result = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action<QueryCallback, SQLResult> _result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum QueryCallbackStatus
|
||||||
|
{
|
||||||
|
NotReady,
|
||||||
|
NextStep,
|
||||||
|
Completed
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
|
||||||
|
*
|
||||||
|
* 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 3 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Framework.Database
|
||||||
|
{
|
||||||
|
public class QueryCallbackProcessor
|
||||||
|
{
|
||||||
|
public void AddQuery(QueryCallback query)
|
||||||
|
{
|
||||||
|
_callbacks.Add(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ProcessReadyQueries()
|
||||||
|
{
|
||||||
|
if (_callbacks.Empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
_callbacks.RemoveAll(callback =>
|
||||||
|
{
|
||||||
|
return callback.InvokeIfReady() == QueryCallbackStatus.Completed;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
List<QueryCallback> _callbacks = new List<QueryCallback>();
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user