Merge pull request #1323 from mc-server/CraftingFixes
Fixed a couple of issues in craftingRecipes.cpp
This commit is contained in:
commit
e931b649ac
@ -119,6 +119,7 @@ local g_ViolationPatterns =
|
|||||||
{"while%(", "Needs a space after \"while\""},
|
{"while%(", "Needs a space after \"while\""},
|
||||||
{"switch%(", "Needs a space after \"switch\""},
|
{"switch%(", "Needs a space after \"switch\""},
|
||||||
{"catch%(", "Needs a space after \"catch\""},
|
{"catch%(", "Needs a space after \"catch\""},
|
||||||
|
{"template<", "Needs a space after \"template\""},
|
||||||
|
|
||||||
-- No space after keyword's parenthesis:
|
-- No space after keyword's parenthesis:
|
||||||
{"[^%a#]if %( ", "Remove the space after \"(\""},
|
{"[^%a#]if %( ", "Remove the space after \"(\""},
|
||||||
|
@ -83,7 +83,7 @@ cItem & cCraftingGrid::GetItem(int x, int y) const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cCraftingGrid::SetItem(int x, int y, ENUM_ITEM_ID a_ItemType, int a_ItemCount, short a_ItemHealth)
|
void cCraftingGrid::SetItem(int x, int y, ENUM_ITEM_ID a_ItemType, char a_ItemCount, short a_ItemHealth)
|
||||||
{
|
{
|
||||||
// Accessible through scripting, must verify parameters:
|
// Accessible through scripting, must verify parameters:
|
||||||
if ((x < 0) || (x >= m_Width) || (y < 0) || (y >= m_Height))
|
if ((x < 0) || (x >= m_Width) || (y < 0) || (y >= m_Height))
|
||||||
@ -228,7 +228,7 @@ void cCraftingRecipe::Clear(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cCraftingRecipe::SetResult(ENUM_ITEM_ID a_ItemType, int a_ItemCount, short a_ItemHealth)
|
void cCraftingRecipe::SetResult(ENUM_ITEM_ID a_ItemType, char a_ItemCount, short a_ItemHealth)
|
||||||
{
|
{
|
||||||
m_Result = cItem(a_ItemType, a_ItemCount, a_ItemHealth);
|
m_Result = cItem(a_ItemType, a_ItemCount, a_ItemHealth);
|
||||||
}
|
}
|
||||||
@ -324,7 +324,11 @@ void cCraftingRecipes::LoadRecipes(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
AString Everything;
|
AString Everything;
|
||||||
f.ReadRestOfFile(Everything);
|
if (!f.ReadRestOfFile(Everything))
|
||||||
|
{
|
||||||
|
LOGWARNING("Cannot read file \"crafting.txt\", no crafting recipes will be available!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
f.Close();
|
f.Close();
|
||||||
|
|
||||||
// Split it into lines, then process each line as a single recipe:
|
// Split it into lines, then process each line as a single recipe:
|
||||||
@ -388,8 +392,7 @@ void cCraftingRecipes::AddRecipeLine(int a_LineNum, const AString & a_RecipeLine
|
|||||||
}
|
}
|
||||||
if (ResultSplit.size() > 1)
|
if (ResultSplit.size() > 1)
|
||||||
{
|
{
|
||||||
Recipe->m_Result.m_ItemCount = atoi(ResultSplit[1].c_str());
|
if (!StringToInteger<char>(ResultSplit[1].c_str(), Recipe->m_Result.m_ItemCount))
|
||||||
if (Recipe->m_Result.m_ItemCount == 0)
|
|
||||||
{
|
{
|
||||||
LOGWARNING("crafting.txt: line %d: Cannot parse result count, ignoring the recipe.", a_LineNum);
|
LOGWARNING("crafting.txt: line %d: Cannot parse result count, ignoring the recipe.", a_LineNum);
|
||||||
LOGINFO("Offending line: \"%s\"", a_RecipeLine.c_str());
|
LOGINFO("Offending line: \"%s\"", a_RecipeLine.c_str());
|
||||||
@ -441,8 +444,7 @@ bool cCraftingRecipes::ParseItem(const AString & a_String, cItem & a_Item)
|
|||||||
if (Split.size() > 1)
|
if (Split.size() > 1)
|
||||||
{
|
{
|
||||||
AString Damage = TrimString(Split[1]);
|
AString Damage = TrimString(Split[1]);
|
||||||
a_Item.m_ItemDamage = atoi(Damage.c_str());
|
if (!StringToInteger<short>(Damage.c_str(), a_Item.m_ItemDamage))
|
||||||
if ((a_Item.m_ItemDamage == 0) && (Damage.compare("0") != 0))
|
|
||||||
{
|
{
|
||||||
// Parsing the number failed
|
// Parsing the number failed
|
||||||
return false;
|
return false;
|
||||||
|
@ -33,7 +33,7 @@ public:
|
|||||||
int GetWidth (void) const {return m_Width; }
|
int GetWidth (void) const {return m_Width; }
|
||||||
int GetHeight(void) const {return m_Height; }
|
int GetHeight(void) const {return m_Height; }
|
||||||
cItem & GetItem (int x, int y) const;
|
cItem & GetItem (int x, int y) const;
|
||||||
void SetItem (int x, int y, ENUM_ITEM_ID a_ItemType, int a_ItemCount, short a_ItemHealth);
|
void SetItem (int x, int y, ENUM_ITEM_ID a_ItemType, char a_ItemCount, short a_ItemHealth);
|
||||||
void SetItem (int x, int y, const cItem & a_Item);
|
void SetItem (int x, int y, const cItem & a_Item);
|
||||||
void Clear (void);
|
void Clear (void);
|
||||||
|
|
||||||
@ -72,13 +72,13 @@ public:
|
|||||||
int GetIngredientsHeight(void) const {return m_Ingredients.GetHeight(); }
|
int GetIngredientsHeight(void) const {return m_Ingredients.GetHeight(); }
|
||||||
cItem & GetIngredient (int x, int y) const {return m_Ingredients.GetItem(x, y); }
|
cItem & GetIngredient (int x, int y) const {return m_Ingredients.GetItem(x, y); }
|
||||||
const cItem & GetResult (void) const {return m_Result; }
|
const cItem & GetResult (void) const {return m_Result; }
|
||||||
void SetResult (ENUM_ITEM_ID a_ItemType, int a_ItemCount, short a_ItemHealth);
|
void SetResult (ENUM_ITEM_ID a_ItemType, char a_ItemCount, short a_ItemHealth);
|
||||||
void SetResult (const cItem & a_Item)
|
void SetResult (const cItem & a_Item)
|
||||||
{
|
{
|
||||||
m_Result = a_Item;
|
m_Result = a_Item;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetIngredient (int x, int y, ENUM_ITEM_ID a_ItemType, int a_ItemCount, short a_ItemHealth)
|
void SetIngredient (int x, int y, ENUM_ITEM_ID a_ItemType, char a_ItemCount, short a_ItemHealth)
|
||||||
{
|
{
|
||||||
m_Ingredients.SetItem(x, y, a_ItemType, a_ItemCount, a_ItemHealth);
|
m_Ingredients.SetItem(x, y, a_ItemType, a_ItemCount, a_ItemHealth);
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -98,6 +99,68 @@ extern int GetBEInt(const char * a_Mem);
|
|||||||
/// Writes four bytes to the specified memory location so that they interpret as BigEndian int
|
/// Writes four bytes to the specified memory location so that they interpret as BigEndian int
|
||||||
extern void SetBEInt(char * a_Mem, Int32 a_Value);
|
extern void SetBEInt(char * a_Mem, Int32 a_Value);
|
||||||
|
|
||||||
|
/// Parses any integer type. Checks bounds and returns errors out of band.
|
||||||
|
template <class T>
|
||||||
|
bool StringToInteger(const AString& a_str, T& a_Num)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
bool positive = true;
|
||||||
|
T result = 0;
|
||||||
|
if (a_str[0] == '+')
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
else if (a_str[0] == '-')
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
positive = false;
|
||||||
|
}
|
||||||
|
if (positive)
|
||||||
|
{
|
||||||
|
for (size_t size = a_str.size(); i < size; i++)
|
||||||
|
{
|
||||||
|
if ((a_str[i] <= '0') || (a_str[i] >= '9'))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (std::numeric_limits<T>::max() / 10 < result)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
result *= 10;
|
||||||
|
T digit = a_str[i] - '0';
|
||||||
|
if (std::numeric_limits<T>::max() - digit < result)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
result += digit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (size_t size = a_str.size(); i < size; i++)
|
||||||
|
{
|
||||||
|
if ((a_str[i] <= '0') || (a_str[i] >= '9'))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (std::numeric_limits<T>::min() / 10 > result)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
result *= 10;
|
||||||
|
T digit = a_str[i] - '0';
|
||||||
|
if (std::numeric_limits<T>::min() + digit > result)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
result -= digit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
a_Num = result;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// If you have any other string helper functions, declare them here
|
// If you have any other string helper functions, declare them here
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user