Use clang-tidy to check more code conventions (#4214)
* Create clang-tidy.sh * Add clang-tidy to circle.yml * Fixed some naming violations Fixes #4164
This commit is contained in:
parent
fbf5cf7aa6
commit
b9fdaf8a94
17
.clang-tidy
Normal file
17
.clang-tidy
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
Checks: '-*,readability-identifier-naming'
|
||||||
|
CheckOptions:
|
||||||
|
- key: readability-identifier-naming.PrivateMemberPrefix
|
||||||
|
value: 'm_'
|
||||||
|
- key: readability-identifier-naming.ClassConstantCase
|
||||||
|
value: aNy_CasE
|
||||||
|
# an empty *Prefix needs a *Case to work
|
||||||
|
- key: readability-identifier-naming.ClassConstantPrefix
|
||||||
|
value: ''
|
||||||
|
#- key: readability-identifier-naming.PrivateMemberCase
|
||||||
|
# value: CamelCase
|
||||||
|
#- key: readability-identifier-naming.FunctionCase
|
||||||
|
# value: CamelCase
|
||||||
|
#- key: readability-identifier-naming.EnumCase
|
||||||
|
# value: camelBack
|
||||||
|
WarningsAsErrors: '*'
|
||||||
|
HeaderFilterRegex: '/cuberite/src/\.?[^\.]'
|
5
.gitignore
vendored
5
.gitignore
vendored
@ -111,6 +111,11 @@ Server/cuberite_api.lua
|
|||||||
Server/official_undocumented.lua
|
Server/official_undocumented.lua
|
||||||
Server/NewlyUndocumented.lua
|
Server/NewlyUndocumented.lua
|
||||||
Server/.luacheckrc
|
Server/.luacheckrc
|
||||||
|
compile_commands.json
|
||||||
|
|
||||||
# compile.sh folder
|
# compile.sh folder
|
||||||
build-cuberite
|
build-cuberite
|
||||||
|
|
||||||
|
# clang-tidy
|
||||||
|
tidy-build
|
||||||
|
run-clang-tidy.py
|
||||||
|
10
circle.yml
10
circle.yml
@ -4,9 +4,17 @@
|
|||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
pre:
|
pre:
|
||||||
- sudo apt-get install lua5.1
|
- sudo apt-get update
|
||||||
|
- sudo apt-get install lua5.1 cmake clang-3.9 clang-tidy-3.9
|
||||||
|
- sudo ln -s /usr/bin/clang-tidy-3.9 /usr/bin/clang-tidy
|
||||||
|
- sudo ln -s /usr/bin/clang-apply-replacements-3.9 /usr/bin/clang-apply-replacements
|
||||||
|
- pip install PyYAML
|
||||||
|
|
||||||
test:
|
test:
|
||||||
override:
|
override:
|
||||||
- cd src && find . -name \*.cpp -or -name \*.h > AllFiles.lst && lua CheckBasicStyle.lua
|
- cd src && find . -name \*.cpp -or -name \*.h > AllFiles.lst && lua CheckBasicStyle.lua
|
||||||
- cd src/Bindings && lua CheckBindingsDependencies.lua
|
- cd src/Bindings && lua CheckBindingsDependencies.lua
|
||||||
|
- curl -o "$HOME/bin/run-clang-tidy.py" "https://raw.githubusercontent.com/llvm-mirror/clang-tools-extra/45fb9b20ed7da2f6b95d83e5ef45bb536f49d8ca/clang-tidy/tool/run-clang-tidy.py"
|
||||||
|
- chmod +x "$HOME/bin/run-clang-tidy.py"
|
||||||
|
- git submodule update --init
|
||||||
|
- ./clang-tidy.sh
|
||||||
|
19
clang-tidy.sh
Executable file
19
clang-tidy.sh
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
FIXES_FILE="tidy-fixes.yaml"
|
||||||
|
REGEX="/cuberite/src/\.?[^\.]"
|
||||||
|
# TODO: Add -quiet when Circle CI is updated to 2.0 with a newer version of Ubuntu
|
||||||
|
ARGS="-header-filter $REGEX -export-fixes $FIXES_FILE "$@" $REGEX"
|
||||||
|
|
||||||
|
mkdir -p tidy-build
|
||||||
|
cd tidy-build
|
||||||
|
cmake --target Cuberite -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
|
||||||
|
|
||||||
|
if run-clang-tidy.py $ARGS; then
|
||||||
|
echo "clang-tidy: No violations found"
|
||||||
|
else
|
||||||
|
echo "clang-tidy: Found violations"
|
||||||
|
exit 1
|
||||||
|
fi
|
136
src/IniFile.cpp
136
src/IniFile.cpp
@ -154,7 +154,7 @@ bool cIniFile::ReadFile(const AString & a_FileName, bool a_AllowExampleRedirect)
|
|||||||
case ';':
|
case ';':
|
||||||
case '#':
|
case '#':
|
||||||
{
|
{
|
||||||
if (names.empty())
|
if (m_Names.empty())
|
||||||
{
|
{
|
||||||
AddHeaderComment(line.substr(pLeft + 1));
|
AddHeaderComment(line.substr(pLeft + 1));
|
||||||
}
|
}
|
||||||
@ -168,7 +168,7 @@ bool cIniFile::ReadFile(const AString & a_FileName, bool a_AllowExampleRedirect)
|
|||||||
} // while (getline())
|
} // while (getline())
|
||||||
|
|
||||||
f.close();
|
f.close();
|
||||||
if (keys.empty() && names.empty() && comments.empty())
|
if (m_Keys.empty() && m_Names.empty() && m_Comments.empty())
|
||||||
{
|
{
|
||||||
// File be empty or unreadable, equivalent to nonexistant
|
// File be empty or unreadable, equivalent to nonexistant
|
||||||
return false;
|
return false;
|
||||||
@ -199,10 +199,10 @@ bool cIniFile::WriteFile(const AString & a_FileName) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write header comments.
|
// Write header comments.
|
||||||
size_t NumComments = comments.size();
|
size_t NumComments = m_Comments.size();
|
||||||
for (size_t commentID = 0; commentID < NumComments; ++commentID)
|
for (size_t commentID = 0; commentID < NumComments; ++commentID)
|
||||||
{
|
{
|
||||||
f << ';' << comments[commentID] << iniEOL;
|
f << ';' << m_Comments[commentID] << iniEOL;
|
||||||
}
|
}
|
||||||
if (NumComments > 0)
|
if (NumComments > 0)
|
||||||
{
|
{
|
||||||
@ -210,20 +210,20 @@ bool cIniFile::WriteFile(const AString & a_FileName) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write keys and values.
|
// Write keys and values.
|
||||||
for (size_t keyID = 0; keyID < keys.size(); ++keyID)
|
for (size_t keyID = 0; keyID < m_Keys.size(); ++keyID)
|
||||||
{
|
{
|
||||||
f << '[' << names[keyID] << ']' << iniEOL;
|
f << '[' << m_Names[keyID] << ']' << iniEOL;
|
||||||
|
|
||||||
// Comments.
|
// Comments.
|
||||||
for (size_t commentID = 0; commentID < keys[keyID].comments.size(); ++commentID)
|
for (size_t commentID = 0; commentID < m_Keys[keyID].m_Comments.size(); ++commentID)
|
||||||
{
|
{
|
||||||
f << ';' << keys[keyID].comments[commentID] << iniEOL;
|
f << ';' << m_Keys[keyID].m_Comments[commentID] << iniEOL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Values.
|
// Values.
|
||||||
for (size_t valueID = 0; valueID < keys[keyID].names.size(); ++valueID)
|
for (size_t valueID = 0; valueID < m_Keys[keyID].m_Names.size(); ++valueID)
|
||||||
{
|
{
|
||||||
f << keys[keyID].names[valueID] << '=' << keys[keyID].values[valueID] << iniEOL;
|
f << m_Keys[keyID].m_Names[valueID] << '=' << m_Keys[keyID].m_Values[valueID] << iniEOL;
|
||||||
}
|
}
|
||||||
f << iniEOL;
|
f << iniEOL;
|
||||||
}
|
}
|
||||||
@ -239,9 +239,9 @@ bool cIniFile::WriteFile(const AString & a_FileName) const
|
|||||||
int cIniFile::FindKey(const AString & a_KeyName) const
|
int cIniFile::FindKey(const AString & a_KeyName) const
|
||||||
{
|
{
|
||||||
AString CaseKeyName = CheckCase(a_KeyName);
|
AString CaseKeyName = CheckCase(a_KeyName);
|
||||||
for (size_t keyID = 0; keyID < names.size(); ++keyID)
|
for (size_t keyID = 0; keyID < m_Names.size(); ++keyID)
|
||||||
{
|
{
|
||||||
if (CheckCase(names[keyID]) == CaseKeyName)
|
if (CheckCase(m_Names[keyID]) == CaseKeyName)
|
||||||
{
|
{
|
||||||
return static_cast<int>(keyID);
|
return static_cast<int>(keyID);
|
||||||
}
|
}
|
||||||
@ -255,15 +255,15 @@ int cIniFile::FindKey(const AString & a_KeyName) const
|
|||||||
|
|
||||||
int cIniFile::FindValue(const int keyID, const AString & a_ValueName) const
|
int cIniFile::FindValue(const int keyID, const AString & a_ValueName) const
|
||||||
{
|
{
|
||||||
if (!keys.size() || (keyID >= static_cast<int>(keys.size())))
|
if (!m_Keys.size() || (keyID >= static_cast<int>(m_Keys.size())))
|
||||||
{
|
{
|
||||||
return noID;
|
return noID;
|
||||||
}
|
}
|
||||||
|
|
||||||
AString CaseValueName = CheckCase(a_ValueName);
|
AString CaseValueName = CheckCase(a_ValueName);
|
||||||
for (size_t valueID = 0; valueID < keys[static_cast<size_t>(keyID)].names.size(); ++valueID)
|
for (size_t valueID = 0; valueID < m_Keys[static_cast<size_t>(keyID)].m_Names.size(); ++valueID)
|
||||||
{
|
{
|
||||||
if (CheckCase(keys[static_cast<size_t>(keyID)].names[valueID]) == CaseValueName)
|
if (CheckCase(m_Keys[static_cast<size_t>(keyID)].m_Names[valueID]) == CaseValueName)
|
||||||
{
|
{
|
||||||
return int(valueID);
|
return int(valueID);
|
||||||
}
|
}
|
||||||
@ -277,9 +277,9 @@ int cIniFile::FindValue(const int keyID, const AString & a_ValueName) const
|
|||||||
|
|
||||||
int cIniFile::AddKeyName(const AString & keyname)
|
int cIniFile::AddKeyName(const AString & keyname)
|
||||||
{
|
{
|
||||||
names.resize(names.size() + 1, keyname);
|
m_Names.resize(m_Names.size() + 1, keyname);
|
||||||
keys.resize(keys.size() + 1);
|
m_Keys.resize(m_Keys.size() + 1);
|
||||||
return static_cast<int>(names.size()) - 1;
|
return static_cast<int>(m_Names.size()) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -288,9 +288,9 @@ int cIniFile::AddKeyName(const AString & keyname)
|
|||||||
|
|
||||||
AString cIniFile::GetKeyName(const int keyID) const
|
AString cIniFile::GetKeyName(const int keyID) const
|
||||||
{
|
{
|
||||||
if (keyID < static_cast<int>(names.size()))
|
if (keyID < static_cast<int>(m_Names.size()))
|
||||||
{
|
{
|
||||||
return names[static_cast<size_t>(keyID)];
|
return m_Names[static_cast<size_t>(keyID)];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -304,9 +304,9 @@ AString cIniFile::GetKeyName(const int keyID) const
|
|||||||
|
|
||||||
int cIniFile::GetNumValues(const int keyID) const
|
int cIniFile::GetNumValues(const int keyID) const
|
||||||
{
|
{
|
||||||
if (keyID < static_cast<int>(keys.size()))
|
if (keyID < static_cast<int>(m_Keys.size()))
|
||||||
{
|
{
|
||||||
return static_cast<int>(keys[static_cast<size_t>(keyID)].names.size());
|
return static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Names.size());
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -322,7 +322,7 @@ int cIniFile::GetNumValues(const AString & keyname) const
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return static_cast<int>(keys[static_cast<size_t>(keyID)].names.size());
|
return static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Names.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -331,9 +331,9 @@ int cIniFile::GetNumValues(const AString & keyname) const
|
|||||||
|
|
||||||
AString cIniFile::GetValueName(const int keyID, const int valueID) const
|
AString cIniFile::GetValueName(const int keyID, const int valueID) const
|
||||||
{
|
{
|
||||||
if ((keyID < static_cast<int>(keys.size())) && (valueID < static_cast<int>(keys[static_cast<size_t>(keyID)].names.size())))
|
if ((keyID < static_cast<int>(m_Keys.size())) && (valueID < static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Names.size())))
|
||||||
{
|
{
|
||||||
return keys[static_cast<size_t>(keyID)].names[static_cast<size_t>(valueID)];
|
return m_Keys[static_cast<size_t>(keyID)].m_Names[static_cast<size_t>(valueID)];
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@ -364,8 +364,8 @@ void cIniFile::AddValue(const AString & a_KeyName, const AString & a_ValueName,
|
|||||||
keyID = int(AddKeyName(a_KeyName));
|
keyID = int(AddKeyName(a_KeyName));
|
||||||
}
|
}
|
||||||
|
|
||||||
keys[static_cast<size_t>(keyID)].names.push_back(a_ValueName);
|
m_Keys[static_cast<size_t>(keyID)].m_Names.push_back(a_ValueName);
|
||||||
keys[static_cast<size_t>(keyID)].values.push_back(a_Value);
|
m_Keys[static_cast<size_t>(keyID)].m_Values.push_back(a_Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -392,11 +392,11 @@ void cIniFile::AddValueF(const AString & a_KeyName, const AString & a_ValueName,
|
|||||||
|
|
||||||
bool cIniFile::SetValue(const int keyID, const int valueID, const AString & value)
|
bool cIniFile::SetValue(const int keyID, const int valueID, const AString & value)
|
||||||
{
|
{
|
||||||
if ((static_cast<size_t>(keyID) >= keys.size()) || (static_cast<size_t>(valueID) >= keys[static_cast<size_t>(keyID)].names.size()))
|
if ((static_cast<size_t>(keyID) >= m_Keys.size()) || (static_cast<size_t>(valueID) >= m_Keys[static_cast<size_t>(keyID)].m_Names.size()))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
keys[static_cast<size_t>(keyID)].values[static_cast<size_t>(valueID)] = value;
|
m_Keys[static_cast<size_t>(keyID)].m_Values[static_cast<size_t>(valueID)] = value;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -423,12 +423,12 @@ bool cIniFile::SetValue(const AString & a_KeyName, const AString & a_ValueName,
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
keys[static_cast<size_t>(keyID)].names.push_back(a_ValueName);
|
m_Keys[static_cast<size_t>(keyID)].m_Names.push_back(a_ValueName);
|
||||||
keys[static_cast<size_t>(keyID)].values.push_back(a_Value);
|
m_Keys[static_cast<size_t>(keyID)].m_Values.push_back(a_Value);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
keys[static_cast<size_t>(keyID)].values[static_cast<size_t>(valueID)] = a_Value;
|
m_Keys[static_cast<size_t>(keyID)].m_Values[static_cast<size_t>(valueID)] = a_Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -467,9 +467,9 @@ bool cIniFile::SetValueF(const AString & a_KeyName, const AString & a_ValueName,
|
|||||||
|
|
||||||
AString cIniFile::GetValue(const int keyID, const int valueID, const AString & defValue) const
|
AString cIniFile::GetValue(const int keyID, const int valueID, const AString & defValue) const
|
||||||
{
|
{
|
||||||
if ((keyID < static_cast<int>(keys.size())) && (valueID < static_cast<int>(keys[static_cast<size_t>(keyID)].names.size())))
|
if ((keyID < static_cast<int>(m_Keys.size())) && (valueID < static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Names.size())))
|
||||||
{
|
{
|
||||||
return keys[static_cast<size_t>(keyID)].values[static_cast<size_t>(valueID)];
|
return m_Keys[static_cast<size_t>(keyID)].m_Values[static_cast<size_t>(valueID)];
|
||||||
}
|
}
|
||||||
return defValue;
|
return defValue;
|
||||||
}
|
}
|
||||||
@ -492,7 +492,7 @@ AString cIniFile::GetValue(const AString & keyname, const AString & valuename, c
|
|||||||
return defValue;
|
return defValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return keys[static_cast<size_t>(keyID)].values[static_cast<size_t>(valueID)];
|
return m_Keys[static_cast<size_t>(keyID)].m_Values[static_cast<size_t>(valueID)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -537,7 +537,7 @@ AString cIniFile::GetValueSet(const AString & keyname, const AString & valuename
|
|||||||
return defValue;
|
return defValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return keys[static_cast<size_t>(keyID)].values[static_cast<size_t>(valueID)];
|
return m_Keys[static_cast<size_t>(keyID)].m_Values[static_cast<size_t>(valueID)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -586,13 +586,13 @@ Int64 cIniFile::GetValueSetI(const AString & keyname, const AString & valuename,
|
|||||||
|
|
||||||
bool cIniFile::DeleteValueByID(const int keyID, const int valueID)
|
bool cIniFile::DeleteValueByID(const int keyID, const int valueID)
|
||||||
{
|
{
|
||||||
if ((keyID < static_cast<int>(keys.size())) && (valueID < static_cast<int>(keys[static_cast<size_t>(keyID)].names.size())))
|
if ((keyID < static_cast<int>(m_Keys.size())) && (valueID < static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Names.size())))
|
||||||
{
|
{
|
||||||
// This looks strange, but is neccessary.
|
// This looks strange, but is neccessary.
|
||||||
vector<AString>::iterator npos = keys[static_cast<size_t>(keyID)].names.begin() + valueID;
|
vector<AString>::iterator npos = m_Keys[static_cast<size_t>(keyID)].m_Names.begin() + valueID;
|
||||||
vector<AString>::iterator vpos = keys[static_cast<size_t>(keyID)].values.begin() + valueID;
|
vector<AString>::iterator vpos = m_Keys[static_cast<size_t>(keyID)].m_Values.begin() + valueID;
|
||||||
keys[static_cast<size_t>(keyID)].names.erase(npos, npos + 1);
|
m_Keys[static_cast<size_t>(keyID)].m_Names.erase(npos, npos + 1);
|
||||||
keys[static_cast<size_t>(keyID)].values.erase(vpos, vpos + 1);
|
m_Keys[static_cast<size_t>(keyID)].m_Values.erase(vpos, vpos + 1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -631,10 +631,10 @@ bool cIniFile::DeleteKey(const AString & keyname)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<AString>::iterator npos = names.begin() + keyID;
|
vector<AString>::iterator npos = m_Names.begin() + keyID;
|
||||||
vector<key>::iterator kpos = keys.begin() + keyID;
|
vector<key>::iterator kpos = m_Keys.begin() + keyID;
|
||||||
names.erase(npos, npos + 1);
|
m_Names.erase(npos, npos + 1);
|
||||||
keys.erase(kpos, kpos + 1);
|
m_Keys.erase(kpos, kpos + 1);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -645,9 +645,9 @@ bool cIniFile::DeleteKey(const AString & keyname)
|
|||||||
|
|
||||||
void cIniFile::Clear(void)
|
void cIniFile::Clear(void)
|
||||||
{
|
{
|
||||||
names.clear();
|
m_Names.clear();
|
||||||
keys.clear();
|
m_Keys.clear();
|
||||||
comments.clear();
|
m_Comments.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -674,7 +674,7 @@ bool cIniFile::HasValue(const AString & a_KeyName, const AString & a_ValueName)
|
|||||||
|
|
||||||
void cIniFile::AddHeaderComment(const AString & comment)
|
void cIniFile::AddHeaderComment(const AString & comment)
|
||||||
{
|
{
|
||||||
comments.push_back(comment);
|
m_Comments.push_back(comment);
|
||||||
// comments.resize(comments.size() + 1, comment);
|
// comments.resize(comments.size() + 1, comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -684,9 +684,9 @@ void cIniFile::AddHeaderComment(const AString & comment)
|
|||||||
|
|
||||||
AString cIniFile::GetHeaderComment(const int commentID) const
|
AString cIniFile::GetHeaderComment(const int commentID) const
|
||||||
{
|
{
|
||||||
if (commentID < static_cast<int>(comments.size()))
|
if (commentID < static_cast<int>(m_Comments.size()))
|
||||||
{
|
{
|
||||||
return comments[static_cast<size_t>(commentID)];
|
return m_Comments[static_cast<size_t>(commentID)];
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@ -697,10 +697,10 @@ AString cIniFile::GetHeaderComment(const int commentID) const
|
|||||||
|
|
||||||
bool cIniFile::DeleteHeaderComment(int commentID)
|
bool cIniFile::DeleteHeaderComment(int commentID)
|
||||||
{
|
{
|
||||||
if (commentID < static_cast<int>(comments.size()))
|
if (commentID < static_cast<int>(m_Comments.size()))
|
||||||
{
|
{
|
||||||
vector<AString>::iterator cpos = comments.begin() + commentID;
|
vector<AString>::iterator cpos = m_Comments.begin() + commentID;
|
||||||
comments.erase(cpos, cpos + 1);
|
m_Comments.erase(cpos, cpos + 1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -712,9 +712,9 @@ bool cIniFile::DeleteHeaderComment(int commentID)
|
|||||||
|
|
||||||
int cIniFile::GetNumKeyComments(const int keyID) const
|
int cIniFile::GetNumKeyComments(const int keyID) const
|
||||||
{
|
{
|
||||||
if (keyID < static_cast<int>(keys.size()))
|
if (keyID < static_cast<int>(m_Keys.size()))
|
||||||
{
|
{
|
||||||
return static_cast<int>(keys[static_cast<size_t>(keyID)].comments.size());
|
return static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Comments.size());
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -730,7 +730,7 @@ int cIniFile::GetNumKeyComments(const AString & keyname) const
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return static_cast<int>(keys[static_cast<size_t>(keyID)].comments.size());
|
return static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Comments.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -739,9 +739,9 @@ int cIniFile::GetNumKeyComments(const AString & keyname) const
|
|||||||
|
|
||||||
bool cIniFile::AddKeyComment(const int keyID, const AString & comment)
|
bool cIniFile::AddKeyComment(const int keyID, const AString & comment)
|
||||||
{
|
{
|
||||||
if (keyID < static_cast<int>(keys.size()))
|
if (keyID < static_cast<int>(m_Keys.size()))
|
||||||
{
|
{
|
||||||
keys[static_cast<size_t>(keyID)].comments.resize(keys[static_cast<size_t>(keyID)].comments.size() + 1, comment);
|
m_Keys[static_cast<size_t>(keyID)].m_Comments.resize(m_Keys[static_cast<size_t>(keyID)].m_Comments.size() + 1, comment);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -767,9 +767,9 @@ bool cIniFile::AddKeyComment(const AString & keyname, const AString & comment)
|
|||||||
|
|
||||||
AString cIniFile::GetKeyComment(const int keyID, const int commentID) const
|
AString cIniFile::GetKeyComment(const int keyID, const int commentID) const
|
||||||
{
|
{
|
||||||
if ((keyID < static_cast<int>(keys.size())) && (commentID < static_cast<int>(keys[static_cast<size_t>(keyID)].comments.size())))
|
if ((keyID < static_cast<int>(m_Keys.size())) && (commentID < static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Comments.size())))
|
||||||
{
|
{
|
||||||
return keys[static_cast<size_t>(keyID)].comments[static_cast<size_t>(commentID)];
|
return m_Keys[static_cast<size_t>(keyID)].m_Comments[static_cast<size_t>(commentID)];
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@ -794,10 +794,10 @@ AString cIniFile::GetKeyComment(const AString & keyname, const int commentID) co
|
|||||||
|
|
||||||
bool cIniFile::DeleteKeyComment(const int keyID, const int commentID)
|
bool cIniFile::DeleteKeyComment(const int keyID, const int commentID)
|
||||||
{
|
{
|
||||||
if ((keyID < static_cast<int>(keys.size())) && (commentID < static_cast<int>(keys[static_cast<size_t>(keyID)].comments.size())))
|
if ((keyID < static_cast<int>(m_Keys.size())) && (commentID < static_cast<int>(m_Keys[static_cast<size_t>(keyID)].m_Comments.size())))
|
||||||
{
|
{
|
||||||
vector<AString>::iterator cpos = keys[static_cast<size_t>(keyID)].comments.begin() + commentID;
|
vector<AString>::iterator cpos = m_Keys[static_cast<size_t>(keyID)].m_Comments.begin() + commentID;
|
||||||
keys[static_cast<size_t>(keyID)].comments.erase(cpos, cpos + 1);
|
m_Keys[static_cast<size_t>(keyID)].m_Comments.erase(cpos, cpos + 1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -823,9 +823,9 @@ bool cIniFile::DeleteKeyComment(const AString & keyname, const int commentID)
|
|||||||
|
|
||||||
bool cIniFile::DeleteKeyComments(const int keyID)
|
bool cIniFile::DeleteKeyComments(const int keyID)
|
||||||
{
|
{
|
||||||
if (keyID < static_cast<int>(keys.size()))
|
if (keyID < static_cast<int>(m_Keys.size()))
|
||||||
{
|
{
|
||||||
keys[static_cast<size_t>(keyID)].comments.clear();
|
m_Keys[static_cast<size_t>(keyID)].m_Comments.clear();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -910,9 +910,9 @@ std::vector<std::pair<AString, AString>> cIniFile::GetValues(AString a_keyName)
|
|||||||
{
|
{
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
for (size_t valueID = 0; valueID < keys[static_cast<size_t>(keyID)].names.size(); ++valueID)
|
for (size_t valueID = 0; valueID < m_Keys[static_cast<size_t>(keyID)].m_Names.size(); ++valueID)
|
||||||
{
|
{
|
||||||
ret.emplace_back(keys[static_cast<size_t>(keyID)].names[valueID], keys[static_cast<size_t>(keyID)].values[valueID]);
|
ret.emplace_back(m_Keys[static_cast<size_t>(keyID)].m_Names[valueID], m_Keys[static_cast<size_t>(keyID)].m_Values[valueID]);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -42,14 +42,14 @@ private:
|
|||||||
|
|
||||||
struct key
|
struct key
|
||||||
{
|
{
|
||||||
std::vector<AString> names;
|
std::vector<AString> m_Names;
|
||||||
std::vector<AString> values;
|
std::vector<AString> m_Values;
|
||||||
std::vector<AString> comments;
|
std::vector<AString> m_Comments;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
std::vector<key> keys;
|
std::vector<key> m_Keys;
|
||||||
std::vector<AString> names;
|
std::vector<AString> m_Names;
|
||||||
std::vector<AString> comments;
|
std::vector<AString> m_Comments;
|
||||||
|
|
||||||
/** If the object is case-insensitive, returns s as lowercase; otherwise returns s as-is */
|
/** If the object is case-insensitive, returns s as lowercase; otherwise returns s as-is */
|
||||||
AString CheckCase(const AString & s) const;
|
AString CheckCase(const AString & s) const;
|
||||||
@ -109,7 +109,7 @@ public:
|
|||||||
int FindValue(const int keyID, const AString & valuename) const;
|
int FindValue(const int keyID, const AString & valuename) const;
|
||||||
|
|
||||||
/** Returns number of keys currently in the ini */
|
/** Returns number of keys currently in the ini */
|
||||||
int GetNumKeys(void) const { return static_cast<int>(keys.size()); }
|
int GetNumKeys(void) const { return static_cast<int>(m_Keys.size()); }
|
||||||
|
|
||||||
/** Add a key name */
|
/** Add a key name */
|
||||||
int AddKeyName(const AString & keyname) override;
|
int AddKeyName(const AString & keyname) override;
|
||||||
@ -184,7 +184,7 @@ public:
|
|||||||
// Header comments are those comments before the first key.
|
// Header comments are those comments before the first key.
|
||||||
|
|
||||||
/** Returns the number of header comments */
|
/** Returns the number of header comments */
|
||||||
int GetNumHeaderComments(void) {return static_cast<int>(comments.size());}
|
int GetNumHeaderComments(void) {return static_cast<int>(m_Comments.size());}
|
||||||
|
|
||||||
/** Adds a header comment */
|
/** Adds a header comment */
|
||||||
void AddHeaderComment(const AString & comment);
|
void AddHeaderComment(const AString & comment);
|
||||||
@ -196,7 +196,7 @@ public:
|
|||||||
bool DeleteHeaderComment(int commentID);
|
bool DeleteHeaderComment(int commentID);
|
||||||
|
|
||||||
/** Deletes all header comments */
|
/** Deletes all header comments */
|
||||||
void DeleteHeaderComments(void) {comments.clear();}
|
void DeleteHeaderComments(void) {m_Comments.clear();}
|
||||||
|
|
||||||
|
|
||||||
// Key comment functions.
|
// Key comment functions.
|
||||||
|
@ -75,8 +75,8 @@ protected:
|
|||||||
cEnderman::cEnderman(void) :
|
cEnderman::cEnderman(void) :
|
||||||
super("Enderman", mtEnderman, "entity.endermen.hurt", "entity.endermen.death", 0.5, 2.9),
|
super("Enderman", mtEnderman, "entity.endermen.hurt", "entity.endermen.death", 0.5, 2.9),
|
||||||
m_bIsScreaming(false),
|
m_bIsScreaming(false),
|
||||||
CarriedBlock(E_BLOCK_AIR),
|
m_CarriedBlock(E_BLOCK_AIR),
|
||||||
CarriedMeta(0)
|
m_CarriedMeta(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,8 +24,8 @@ public:
|
|||||||
virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
|
virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
|
||||||
|
|
||||||
bool IsScreaming(void) const {return m_bIsScreaming; }
|
bool IsScreaming(void) const {return m_bIsScreaming; }
|
||||||
BLOCKTYPE GetCarriedBlock(void) const {return CarriedBlock; }
|
BLOCKTYPE GetCarriedBlock(void) const {return m_CarriedBlock; }
|
||||||
NIBBLETYPE GetCarriedMeta(void) const {return CarriedMeta; }
|
NIBBLETYPE GetCarriedMeta(void) const {return m_CarriedMeta; }
|
||||||
|
|
||||||
/** Returns if the current sky light level is sufficient for the enderman to become aggravated */
|
/** Returns if the current sky light level is sufficient for the enderman to become aggravated */
|
||||||
bool CheckLight(void);
|
bool CheckLight(void);
|
||||||
@ -33,7 +33,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
bool m_bIsScreaming;
|
bool m_bIsScreaming;
|
||||||
BLOCKTYPE CarriedBlock;
|
BLOCKTYPE m_CarriedBlock;
|
||||||
NIBBLETYPE CarriedMeta;
|
NIBBLETYPE m_CarriedMeta;
|
||||||
|
|
||||||
} ;
|
} ;
|
||||||
|
@ -9,6 +9,14 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const double cNetherPortalScanner::OutOffset = 2;
|
||||||
|
const double cNetherPortalScanner::AcrossOffset = 0.5;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cNetherPortalScanner::cNetherPortalScanner(cEntity * a_MovingEntity, cWorld * a_DestinationWorld, Vector3d a_DestPosition, int a_MaxY) :
|
cNetherPortalScanner::cNetherPortalScanner(cEntity * a_MovingEntity, cWorld * a_DestinationWorld, Vector3d a_DestPosition, int a_MaxY) :
|
||||||
m_Entity(a_MovingEntity),
|
m_Entity(a_MovingEntity),
|
||||||
m_World(a_DestinationWorld),
|
m_World(a_DestinationWorld),
|
||||||
|
@ -39,8 +39,8 @@ private:
|
|||||||
static const int SearchSolidBaseWidth = 3;
|
static const int SearchSolidBaseWidth = 3;
|
||||||
|
|
||||||
/** Where to place the player out from the face and across the face */
|
/** Where to place the player out from the face and across the face */
|
||||||
const double OutOffset = 2;
|
static const double OutOffset;
|
||||||
const double AcrossOffset = 0.5;
|
static const double AcrossOffset;
|
||||||
|
|
||||||
/** Builds a portal. */
|
/** Builds a portal. */
|
||||||
void BuildNetherPortal(Vector3i a_Location, Direction a_Direction, bool a_IncludePlatform);
|
void BuildNetherPortal(Vector3i a_Location, Direction a_Direction, bool a_IncludePlatform);
|
||||||
|
@ -36,7 +36,6 @@
|
|||||||
#include "LoggerListeners.h"
|
#include "LoggerListeners.h"
|
||||||
#include "BuildInfo.h"
|
#include "BuildInfo.h"
|
||||||
#include "IniFile.h"
|
#include "IniFile.h"
|
||||||
#include "SettingsRepositoryInterface.h"
|
|
||||||
#include "OverridesSettingsRepository.h"
|
#include "OverridesSettingsRepository.h"
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
#include "ClientHandle.h"
|
#include "ClientHandle.h"
|
||||||
|
148
src/Tracer.cpp
148
src/Tracer.cpp
@ -75,78 +75,78 @@ void cTracer::SetValues(const Vector3f & a_Start, const Vector3f & a_Direction)
|
|||||||
ASSERT(a_Direction.HasNonZeroLength());
|
ASSERT(a_Direction.HasNonZeroLength());
|
||||||
|
|
||||||
// calculate the direction of the ray (linear algebra)
|
// calculate the direction of the ray (linear algebra)
|
||||||
dir = a_Direction;
|
m_Dir = a_Direction;
|
||||||
|
|
||||||
// decide which direction to start walking in
|
// decide which direction to start walking in
|
||||||
step.x = SigNum(dir.x);
|
m_Step.x = SigNum(m_Dir.x);
|
||||||
step.y = SigNum(dir.y);
|
m_Step.y = SigNum(m_Dir.y);
|
||||||
step.z = SigNum(dir.z);
|
m_Step.z = SigNum(m_Dir.z);
|
||||||
|
|
||||||
|
|
||||||
// normalize the direction vector
|
// normalize the direction vector
|
||||||
dir.Normalize();
|
m_Dir.Normalize();
|
||||||
|
|
||||||
|
|
||||||
// how far we must move in the ray direction before
|
// how far we must move in the ray direction before
|
||||||
// we encounter a new voxel in x-direction
|
// we encounter a new voxel in x-direction
|
||||||
// same but y-direction
|
// same but y-direction
|
||||||
if (dir.x != 0.f)
|
if (m_Dir.x != 0.f)
|
||||||
{
|
{
|
||||||
tDelta.x = 1 / std::abs(dir.x);
|
m_tDelta.x = 1 / std::abs(m_Dir.x);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tDelta.x = 0;
|
m_tDelta.x = 0;
|
||||||
}
|
}
|
||||||
if (dir.y != 0.f)
|
if (m_Dir.y != 0.f)
|
||||||
{
|
{
|
||||||
tDelta.y = 1 / std::abs(dir.y);
|
m_tDelta.y = 1 / std::abs(m_Dir.y);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tDelta.y = 0;
|
m_tDelta.y = 0;
|
||||||
}
|
}
|
||||||
if (dir.z != 0.f)
|
if (m_Dir.z != 0.f)
|
||||||
{
|
{
|
||||||
tDelta.z = 1 / std::abs(dir.z);
|
m_tDelta.z = 1 / std::abs(m_Dir.z);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tDelta.z = 0;
|
m_tDelta.z = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// start voxel coordinates
|
// start voxel coordinates
|
||||||
pos.x = static_cast<int>(floorf(a_Start.x));
|
m_Pos.x = static_cast<int>(floorf(a_Start.x));
|
||||||
pos.y = static_cast<int>(floorf(a_Start.y));
|
m_Pos.y = static_cast<int>(floorf(a_Start.y));
|
||||||
pos.z = static_cast<int>(floorf(a_Start.z));
|
m_Pos.z = static_cast<int>(floorf(a_Start.z));
|
||||||
|
|
||||||
// calculate distance to first intersection in the voxel we start from
|
// calculate distance to first intersection in the voxel we start from
|
||||||
if (dir.x < 0)
|
if (m_Dir.x < 0)
|
||||||
{
|
{
|
||||||
tMax.x = (static_cast<float>(pos.x) - a_Start.x) / dir.x;
|
m_tMax.x = (static_cast<float>(m_Pos.x) - a_Start.x) / m_Dir.x;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tMax.x = (static_cast<float>(pos.x + 1) - a_Start.x) / dir.x; // TODO: Possible division by zero
|
m_tMax.x = (static_cast<float>(m_Pos.x + 1) - a_Start.x) / m_Dir.x; // TODO: Possible division by zero
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dir.y < 0)
|
if (m_Dir.y < 0)
|
||||||
{
|
{
|
||||||
tMax.y = (static_cast<float>(pos.y) - a_Start.y) / dir.y;
|
m_tMax.y = (static_cast<float>(m_Pos.y) - a_Start.y) / m_Dir.y;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tMax.y = (static_cast<float>(pos.y + 1) - a_Start.y) / dir.y; // TODO: Possible division by zero
|
m_tMax.y = (static_cast<float>(m_Pos.y + 1) - a_Start.y) / m_Dir.y; // TODO: Possible division by zero
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dir.z < 0)
|
if (m_Dir.z < 0)
|
||||||
{
|
{
|
||||||
tMax.z = (static_cast<float>(pos.z) - a_Start.z) / dir.z;
|
m_tMax.z = (static_cast<float>(m_Pos.z) - a_Start.z) / m_Dir.z;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tMax.z = (static_cast<float>(pos.z + 1) - a_Start.z) / dir.z; // TODO: Possible division by zero
|
m_tMax.z = (static_cast<float>(m_Pos.z + 1) - a_Start.z) / m_Dir.z; // TODO: Possible division by zero
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,21 +169,21 @@ bool cTracer::Trace(const Vector3f & a_Start, const Vector3f & a_Direction, int
|
|||||||
|
|
||||||
SetValues(a_Start, a_Direction);
|
SetValues(a_Start, a_Direction);
|
||||||
|
|
||||||
Vector3f End = a_Start + (dir * static_cast<float>(a_Distance));
|
Vector3f End = a_Start + (m_Dir * static_cast<float>(a_Distance));
|
||||||
|
|
||||||
if (End.y < 0)
|
if (End.y < 0)
|
||||||
{
|
{
|
||||||
float dist = -a_Start.y / dir.y; // No division by 0 possible
|
float dist = -a_Start.y / m_Dir.y; // No division by 0 possible
|
||||||
End = a_Start + (dir * dist);
|
End = a_Start + (m_Dir * dist);
|
||||||
}
|
}
|
||||||
|
|
||||||
// end voxel coordinates
|
// end voxel coordinates
|
||||||
end1.x = static_cast<int>(floorf(End.x));
|
m_End1.x = static_cast<int>(floorf(End.x));
|
||||||
end1.y = static_cast<int>(floorf(End.y));
|
m_End1.y = static_cast<int>(floorf(End.y));
|
||||||
end1.z = static_cast<int>(floorf(End.z));
|
m_End1.z = static_cast<int>(floorf(End.z));
|
||||||
|
|
||||||
// check if first is occupied
|
// check if first is occupied
|
||||||
if (pos.Equals(end1))
|
if (m_Pos.Equals(m_End1))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -194,54 +194,54 @@ bool cTracer::Trace(const Vector3f & a_Start, const Vector3f & a_Direction, int
|
|||||||
while (Iterations < a_Distance)
|
while (Iterations < a_Distance)
|
||||||
{
|
{
|
||||||
Iterations++;
|
Iterations++;
|
||||||
if ((tMax.x < tMax.y) && (tMax.x < tMax.z))
|
if ((m_tMax.x < m_tMax.y) && (m_tMax.x < m_tMax.z))
|
||||||
{
|
{
|
||||||
tMax.x += tDelta.x;
|
m_tMax.x += m_tDelta.x;
|
||||||
pos.x += step.x;
|
m_Pos.x += m_Step.x;
|
||||||
}
|
}
|
||||||
else if (tMax.y < tMax.z)
|
else if (m_tMax.y < m_tMax.z)
|
||||||
{
|
{
|
||||||
tMax.y += tDelta.y;
|
m_tMax.y += m_tDelta.y;
|
||||||
pos.y += step.y;
|
m_Pos.y += m_Step.y;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tMax.z += tDelta.z;
|
m_tMax.z += m_tDelta.z;
|
||||||
pos.z += step.z;
|
m_Pos.z += m_Step.z;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (step.x > 0.0f)
|
if (m_Step.x > 0.0f)
|
||||||
{
|
{
|
||||||
if (pos.x >= end1.x)
|
if (m_Pos.x >= m_End1.x)
|
||||||
{
|
{
|
||||||
reachedX = true;
|
reachedX = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (pos.x <= end1.x)
|
else if (m_Pos.x <= m_End1.x)
|
||||||
{
|
{
|
||||||
reachedX = true;
|
reachedX = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (step.y > 0.0f)
|
if (m_Step.y > 0.0f)
|
||||||
{
|
{
|
||||||
if (pos.y >= end1.y)
|
if (m_Pos.y >= m_End1.y)
|
||||||
{
|
{
|
||||||
reachedY = true;
|
reachedY = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (pos.y <= end1.y)
|
else if (m_Pos.y <= m_End1.y)
|
||||||
{
|
{
|
||||||
reachedY = true;
|
reachedY = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (step.z > 0.0f)
|
if (m_Step.z > 0.0f)
|
||||||
{
|
{
|
||||||
if (pos.z >= end1.z)
|
if (m_Pos.z >= m_End1.z)
|
||||||
{
|
{
|
||||||
reachedZ = true;
|
reachedZ = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (pos.z <= end1.z)
|
else if (m_Pos.z <= m_End1.z)
|
||||||
{
|
{
|
||||||
reachedZ = true;
|
reachedZ = true;
|
||||||
}
|
}
|
||||||
@ -251,17 +251,17 @@ bool cTracer::Trace(const Vector3f & a_Start, const Vector3f & a_Direction, int
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((pos.y < 0) || (pos.y >= cChunkDef::Height))
|
if ((m_Pos.y < 0) || (m_Pos.y >= cChunkDef::Height))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
BLOCKTYPE BlockID = m_World->GetBlock(pos.x, pos.y, pos.z);
|
BLOCKTYPE BlockID = m_World->GetBlock(m_Pos);
|
||||||
// Block is counted as a collision if we are not doing a line of sight and it is solid,
|
// Block is counted as a collision if we are not doing a line of sight and it is solid,
|
||||||
// or if the block is not air and not water. That way mobs can still see underwater.
|
// or if the block is not air and not water. That way mobs can still see underwater.
|
||||||
if ((!a_LineOfSight && cBlockInfo::IsSolid(BlockID)) || (a_LineOfSight && (BlockID != E_BLOCK_AIR) && !IsBlockWater(BlockID)))
|
if ((!a_LineOfSight && cBlockInfo::IsSolid(BlockID)) || (a_LineOfSight && (BlockID != E_BLOCK_AIR) && !IsBlockWater(BlockID)))
|
||||||
{
|
{
|
||||||
BlockHitPosition = pos;
|
BlockHitPosition = m_Pos;
|
||||||
int Normal = GetHitNormal(a_Start, End, pos);
|
int Normal = GetHitNormal(a_Start, End, m_Pos);
|
||||||
if (Normal > 0)
|
if (Normal > 0)
|
||||||
{
|
{
|
||||||
HitNormal = m_NormalTable()[static_cast<size_t>(Normal - 1)];
|
HitNormal = m_NormalTable()[static_cast<size_t>(Normal - 1)];
|
||||||
@ -346,7 +346,7 @@ int cTracer::intersect3D_SegmentPlane(const Vector3f & a_Origin, const Vector3f
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cTracer::GetHitNormal(const Vector3f & start, const Vector3f & end, const Vector3i & a_BlockPos)
|
int cTracer::GetHitNormal(const Vector3f & a_Start, const Vector3f & a_End, const Vector3i & a_BlockPos)
|
||||||
{
|
{
|
||||||
Vector3i SmallBlockPos = a_BlockPos;
|
Vector3i SmallBlockPos = a_BlockPos;
|
||||||
BLOCKTYPE BlockID = static_cast<BLOCKTYPE>(m_World->GetBlock(a_BlockPos.x, a_BlockPos.y, a_BlockPos.z));
|
BLOCKTYPE BlockID = static_cast<BLOCKTYPE>(m_World->GetBlock(a_BlockPos.x, a_BlockPos.y, a_BlockPos.z));
|
||||||
@ -359,19 +359,19 @@ int cTracer::GetHitNormal(const Vector3f & start, const Vector3f & end, const Ve
|
|||||||
Vector3f BlockPos;
|
Vector3f BlockPos;
|
||||||
BlockPos = Vector3f(SmallBlockPos);
|
BlockPos = Vector3f(SmallBlockPos);
|
||||||
|
|
||||||
Vector3f Look = (end - start);
|
Vector3f Look = (a_End - a_Start);
|
||||||
Look.Normalize();
|
Look.Normalize();
|
||||||
|
|
||||||
float dot = Look.Dot(Vector3f(-1, 0, 0)); // first face normal is x -1
|
float dot = Look.Dot(Vector3f(-1, 0, 0)); // first face normal is x -1
|
||||||
if (dot < 0)
|
if (dot < 0)
|
||||||
{
|
{
|
||||||
int Lines = LinesCross(start.x, start.y, end.x, end.y, BlockPos.x, BlockPos.y, BlockPos.x, BlockPos.y + 1);
|
int Lines = LinesCross(a_Start.x, a_Start.y, a_End.x, a_End.y, BlockPos.x, BlockPos.y, BlockPos.x, BlockPos.y + 1);
|
||||||
if (Lines == 1)
|
if (Lines == 1)
|
||||||
{
|
{
|
||||||
Lines = LinesCross(start.x, start.z, end.x, end.z, BlockPos.x, BlockPos.z, BlockPos.x, BlockPos.z + 1);
|
Lines = LinesCross(a_Start.x, a_Start.z, a_End.x, a_End.z, BlockPos.x, BlockPos.z, BlockPos.x, BlockPos.z + 1);
|
||||||
if (Lines == 1)
|
if (Lines == 1)
|
||||||
{
|
{
|
||||||
intersect3D_SegmentPlane(start, end, BlockPos, Vector3f(-1, 0, 0));
|
intersect3D_SegmentPlane(a_Start, a_End, BlockPos, Vector3f(-1, 0, 0));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -379,13 +379,13 @@ int cTracer::GetHitNormal(const Vector3f & start, const Vector3f & end, const Ve
|
|||||||
dot = Look.Dot(Vector3f(0, 0, -1)); // second face normal is z -1
|
dot = Look.Dot(Vector3f(0, 0, -1)); // second face normal is z -1
|
||||||
if (dot < 0)
|
if (dot < 0)
|
||||||
{
|
{
|
||||||
int Lines = LinesCross(start.z, start.y, end.z, end.y, BlockPos.z, BlockPos.y, BlockPos.z, BlockPos.y + 1);
|
int Lines = LinesCross(a_Start.z, a_Start.y, a_End.z, a_End.y, BlockPos.z, BlockPos.y, BlockPos.z, BlockPos.y + 1);
|
||||||
if (Lines == 1)
|
if (Lines == 1)
|
||||||
{
|
{
|
||||||
Lines = LinesCross(start.z, start.x, end.z, end.x, BlockPos.z, BlockPos.x, BlockPos.z, BlockPos.x + 1);
|
Lines = LinesCross(a_Start.z, a_Start.x, a_End.z, a_End.x, BlockPos.z, BlockPos.x, BlockPos.z, BlockPos.x + 1);
|
||||||
if (Lines == 1)
|
if (Lines == 1)
|
||||||
{
|
{
|
||||||
intersect3D_SegmentPlane(start, end, BlockPos, Vector3f(0, 0, -1));
|
intersect3D_SegmentPlane(a_Start, a_End, BlockPos, Vector3f(0, 0, -1));
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -393,13 +393,13 @@ int cTracer::GetHitNormal(const Vector3f & start, const Vector3f & end, const Ve
|
|||||||
dot = Look.Dot(Vector3f(1, 0, 0)); // third face normal is x 1
|
dot = Look.Dot(Vector3f(1, 0, 0)); // third face normal is x 1
|
||||||
if (dot < 0)
|
if (dot < 0)
|
||||||
{
|
{
|
||||||
int Lines = LinesCross(start.x, start.y, end.x, end.y, BlockPos.x + 1, BlockPos.y, BlockPos.x + 1, BlockPos.y + 1);
|
int Lines = LinesCross(a_Start.x, a_Start.y, a_End.x, a_End.y, BlockPos.x + 1, BlockPos.y, BlockPos.x + 1, BlockPos.y + 1);
|
||||||
if (Lines == 1)
|
if (Lines == 1)
|
||||||
{
|
{
|
||||||
Lines = LinesCross(start.x, start.z, end.x, end.z, BlockPos.x + 1, BlockPos.z, BlockPos.x + 1, BlockPos.z + 1);
|
Lines = LinesCross(a_Start.x, a_Start.z, a_End.x, a_End.z, BlockPos.x + 1, BlockPos.z, BlockPos.x + 1, BlockPos.z + 1);
|
||||||
if (Lines == 1)
|
if (Lines == 1)
|
||||||
{
|
{
|
||||||
intersect3D_SegmentPlane(start, end, BlockPos + Vector3f(1, 0, 0), Vector3f(1, 0, 0));
|
intersect3D_SegmentPlane(a_Start, a_End, BlockPos + Vector3f(1, 0, 0), Vector3f(1, 0, 0));
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -407,13 +407,13 @@ int cTracer::GetHitNormal(const Vector3f & start, const Vector3f & end, const Ve
|
|||||||
dot = Look.Dot(Vector3f(0, 0, 1)); // fourth face normal is z 1
|
dot = Look.Dot(Vector3f(0, 0, 1)); // fourth face normal is z 1
|
||||||
if (dot < 0)
|
if (dot < 0)
|
||||||
{
|
{
|
||||||
int Lines = LinesCross(start.z, start.y, end.z, end.y, BlockPos.z + 1, BlockPos.y, BlockPos.z + 1, BlockPos.y + 1);
|
int Lines = LinesCross(a_Start.z, a_Start.y, a_End.z, a_End.y, BlockPos.z + 1, BlockPos.y, BlockPos.z + 1, BlockPos.y + 1);
|
||||||
if (Lines == 1)
|
if (Lines == 1)
|
||||||
{
|
{
|
||||||
Lines = LinesCross(start.z, start.x, end.z, end.x, BlockPos.z + 1, BlockPos.x, BlockPos.z + 1, BlockPos.x + 1);
|
Lines = LinesCross(a_Start.z, a_Start.x, a_End.z, a_End.x, BlockPos.z + 1, BlockPos.x, BlockPos.z + 1, BlockPos.x + 1);
|
||||||
if (Lines == 1)
|
if (Lines == 1)
|
||||||
{
|
{
|
||||||
intersect3D_SegmentPlane(start, end, BlockPos + Vector3f(0, 0, 1), Vector3f(0, 0, 1));
|
intersect3D_SegmentPlane(a_Start, a_End, BlockPos + Vector3f(0, 0, 1), Vector3f(0, 0, 1));
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -421,13 +421,13 @@ int cTracer::GetHitNormal(const Vector3f & start, const Vector3f & end, const Ve
|
|||||||
dot = Look.Dot(Vector3f(0, 1, 0)); // fifth face normal is y 1
|
dot = Look.Dot(Vector3f(0, 1, 0)); // fifth face normal is y 1
|
||||||
if (dot < 0)
|
if (dot < 0)
|
||||||
{
|
{
|
||||||
int Lines = LinesCross(start.y, start.x, end.y, end.x, BlockPos.y + 1, BlockPos.x, BlockPos.y + 1, BlockPos.x + 1);
|
int Lines = LinesCross(a_Start.y, a_Start.x, a_End.y, a_End.x, BlockPos.y + 1, BlockPos.x, BlockPos.y + 1, BlockPos.x + 1);
|
||||||
if (Lines == 1)
|
if (Lines == 1)
|
||||||
{
|
{
|
||||||
Lines = LinesCross(start.y, start.z, end.y, end.z, BlockPos.y + 1, BlockPos.z, BlockPos.y + 1, BlockPos.z + 1);
|
Lines = LinesCross(a_Start.y, a_Start.z, a_End.y, a_End.z, BlockPos.y + 1, BlockPos.z, BlockPos.y + 1, BlockPos.z + 1);
|
||||||
if (Lines == 1)
|
if (Lines == 1)
|
||||||
{
|
{
|
||||||
intersect3D_SegmentPlane(start, end, BlockPos + Vector3f(0, 1, 0), Vector3f(0, 1, 0));
|
intersect3D_SegmentPlane(a_Start, a_End, BlockPos + Vector3f(0, 1, 0), Vector3f(0, 1, 0));
|
||||||
return 5;
|
return 5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -435,13 +435,13 @@ int cTracer::GetHitNormal(const Vector3f & start, const Vector3f & end, const Ve
|
|||||||
dot = Look.Dot(Vector3f(0, -1, 0)); // sixth face normal is y -1
|
dot = Look.Dot(Vector3f(0, -1, 0)); // sixth face normal is y -1
|
||||||
if (dot < 0)
|
if (dot < 0)
|
||||||
{
|
{
|
||||||
int Lines = LinesCross(start.y, start.x, end.y, end.x, BlockPos.y, BlockPos.x, BlockPos.y, BlockPos.x + 1);
|
int Lines = LinesCross(a_Start.y, a_Start.x, a_End.y, a_End.x, BlockPos.y, BlockPos.x, BlockPos.y, BlockPos.x + 1);
|
||||||
if (Lines == 1)
|
if (Lines == 1)
|
||||||
{
|
{
|
||||||
Lines = LinesCross(start.y, start.z, end.y, end.z, BlockPos.y, BlockPos.z, BlockPos.y, BlockPos.z + 1);
|
Lines = LinesCross(a_Start.y, a_Start.z, a_End.y, a_End.z, BlockPos.y, BlockPos.z, BlockPos.y, BlockPos.z + 1);
|
||||||
if (Lines == 1)
|
if (Lines == 1)
|
||||||
{
|
{
|
||||||
intersect3D_SegmentPlane(start, end, BlockPos, Vector3f(0, -1, 0));
|
intersect3D_SegmentPlane(a_Start, a_End, BlockPos, Vector3f(0, -1, 0));
|
||||||
return 6;
|
return 6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
14
src/Tracer.h
14
src/Tracer.h
@ -63,7 +63,7 @@ private:
|
|||||||
/** Determines which face on the block a collision occured, if it does occur
|
/** Determines which face on the block a collision occured, if it does occur
|
||||||
Returns 0 if the block is air, water or no collision occured
|
Returns 0 if the block is air, water or no collision occured
|
||||||
Return 1 through 6 for the following block faces, repectively: -x, -z, x, z, y, -y */
|
Return 1 through 6 for the following block faces, repectively: -x, -z, x, z, y, -y */
|
||||||
int GetHitNormal(const Vector3f & start, const Vector3f & end, const Vector3i & a_BlockPos);
|
int GetHitNormal(const Vector3f &a_Start, const Vector3f & a_End, const Vector3i & a_BlockPos);
|
||||||
|
|
||||||
/** Signum function */
|
/** Signum function */
|
||||||
int SigNum(float a_Num);
|
int SigNum(float a_Num);
|
||||||
@ -72,12 +72,12 @@ private:
|
|||||||
|
|
||||||
static const std::array<const Vector3f, 6> & m_NormalTable(void);
|
static const std::array<const Vector3f, 6> & m_NormalTable(void);
|
||||||
|
|
||||||
Vector3f dir;
|
Vector3f m_Dir;
|
||||||
Vector3f tDelta;
|
Vector3f m_tDelta;
|
||||||
Vector3i pos;
|
Vector3i m_Pos;
|
||||||
Vector3i end1;
|
Vector3i m_End1;
|
||||||
Vector3i step;
|
Vector3i m_Step;
|
||||||
Vector3f tMax;
|
Vector3f m_tMax;
|
||||||
};
|
};
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
Loading…
Reference in New Issue
Block a user