Fixed crashes and use std::swap.
This commit is contained in:
parent
0f1fd33123
commit
6c3b80f04c
@ -2857,11 +2857,27 @@ void cClientHandle::SocketClosed(void)
|
||||
|
||||
|
||||
|
||||
void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment)
|
||||
void cClientHandle::HandleEnchantItem(Byte & a_WindowID, Byte & a_Enchantment)
|
||||
{
|
||||
cEnchantingWindow * Window = (cEnchantingWindow*)m_Player->GetWindow();
|
||||
if (a_Enchantment > 2)
|
||||
{
|
||||
LOGWARNING("%s attempt to crash the server with invalid enchanting selection!", GetUsername().c_str());
|
||||
Kick("Invalid enchanting!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
(m_Player->GetWindow() == NULL) ||
|
||||
(m_Player->GetWindow()->GetWindowID() != a_WindowID) ||
|
||||
(m_Player->GetWindow()->GetWindowType() != cWindow::wtEnchantment)
|
||||
)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
cEnchantingWindow * Window = (cEnchantingWindow*) m_Player->GetWindow();
|
||||
cItem Item = *Window->m_SlotArea->GetSlot(0, *m_Player);
|
||||
int BaseEnchantmentLevel = Window->GetPropertyValue(Enchantment);
|
||||
int BaseEnchantmentLevel = Window->GetPropertyValue(a_Enchantment);
|
||||
|
||||
if (Item.EnchantByXPLevels(BaseEnchantmentLevel))
|
||||
{
|
||||
|
@ -269,7 +269,7 @@ public:
|
||||
void RemoveFromWorld(void);
|
||||
|
||||
/** Called when the player will enchant a Item */
|
||||
void HandleEnchantItem(Byte & WindowID, Byte & Enchantment);
|
||||
void HandleEnchantItem(Byte & a_WindowID, Byte & a_Enchantment);
|
||||
|
||||
private:
|
||||
|
||||
|
36
src/Item.cpp
36
src/Item.cpp
@ -291,73 +291,77 @@ int cItem::GetEnchantability()
|
||||
|
||||
bool cItem::EnchantByXPLevels(int a_NumXPLevels)
|
||||
{
|
||||
if (!cItem::IsEnchantable(m_ItemType) && (m_ItemType != E_ITEM_BOOK))
|
||||
if (!cItem::IsEnchantable(m_ItemType))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int Enchantability = GetEnchantability();
|
||||
if (Enchantability == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
cFastRandom Random;
|
||||
int ModifiedEnchantmentLevel = a_NumXPLevels + (int)Random.NextFloat((float)Enchantability / 4) + (int)Random.NextFloat((float)Enchantability / 4) + 1;
|
||||
float RandomBonus = 1.0F + (Random.NextFloat(1) + Random.NextFloat(1) - 1.0F) * 0.15F;
|
||||
int FinalEnchantmentLevel = (int)(ModifiedEnchantmentLevel * RandomBonus + 0.5F);
|
||||
|
||||
cWeightedEnchantments enchantments;
|
||||
cEnchantments::AddItemEnchantmentWeights(enchantments, m_ItemType, FinalEnchantmentLevel);
|
||||
cWeightedEnchantments Enchantments;
|
||||
cEnchantments::AddItemEnchantmentWeights(Enchantments, m_ItemType, FinalEnchantmentLevel);
|
||||
|
||||
if (m_ItemType == E_ITEM_BOOK)
|
||||
{
|
||||
m_ItemType = E_ITEM_ENCHANTED_BOOK;
|
||||
}
|
||||
|
||||
cEnchantments Enchantment1 = cEnchantments::GetRandomEnchantmentFromVector(enchantments);
|
||||
cEnchantments Enchantment1 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments);
|
||||
m_Enchantments.AddFromString(Enchantment1.ToString());
|
||||
cEnchantments::RemoveEnchantmentWeightFromVector(enchantments, Enchantment1);
|
||||
cEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment1);
|
||||
|
||||
// Checking for conflicting enchantments
|
||||
cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment1);
|
||||
cEnchantments::CheckEnchantmentConflictsFromVector(Enchantments, Enchantment1);
|
||||
|
||||
float NewEnchantmentLevel = (float)a_NumXPLevels;
|
||||
|
||||
// Next Enchantment (Second)
|
||||
NewEnchantmentLevel = NewEnchantmentLevel / 2;
|
||||
float SecondEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100;
|
||||
if (enchantments.empty() || (Random.NextFloat(100) > SecondEnchantmentChance))
|
||||
if (Enchantments.empty() || (Random.NextFloat(100) > SecondEnchantmentChance))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
cEnchantments Enchantment2 = cEnchantments::GetRandomEnchantmentFromVector(enchantments);
|
||||
cEnchantments Enchantment2 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments);
|
||||
m_Enchantments.AddFromString(Enchantment2.ToString());
|
||||
cEnchantments::RemoveEnchantmentWeightFromVector(enchantments, Enchantment2);
|
||||
cEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment2);
|
||||
|
||||
// Checking for conflicting enchantments
|
||||
cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment2);
|
||||
cEnchantments::CheckEnchantmentConflictsFromVector(Enchantments, Enchantment2);
|
||||
|
||||
// Next Enchantment (Third)
|
||||
NewEnchantmentLevel = NewEnchantmentLevel / 2;
|
||||
float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100;
|
||||
if (enchantments.empty() || (Random.NextFloat(100) > ThirdEnchantmentChance))
|
||||
if (Enchantments.empty() || (Random.NextFloat(100) > ThirdEnchantmentChance))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
cEnchantments Enchantment3 = cEnchantments::GetRandomEnchantmentFromVector(enchantments);
|
||||
cEnchantments Enchantment3 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments);
|
||||
m_Enchantments.AddFromString(Enchantment3.ToString());
|
||||
cEnchantments::RemoveEnchantmentWeightFromVector(enchantments, Enchantment3);
|
||||
cEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment3);
|
||||
|
||||
// Checking for conflicting enchantments
|
||||
cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment3);
|
||||
cEnchantments::CheckEnchantmentConflictsFromVector(Enchantments, Enchantment3);
|
||||
|
||||
// Next Enchantment (Fourth)
|
||||
NewEnchantmentLevel = NewEnchantmentLevel / 2;
|
||||
float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100;
|
||||
if (enchantments.empty() || (Random.NextFloat(100) > FourthEnchantmentChance))
|
||||
if (Enchantments.empty() || (Random.NextFloat(100) > FourthEnchantmentChance))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
cEnchantments Enchantment4 = cEnchantments::GetRandomEnchantmentFromVector(enchantments);
|
||||
cEnchantments Enchantment4 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments);
|
||||
m_Enchantments.AddFromString(Enchantment4.ToString());
|
||||
|
||||
return true;
|
||||
|
@ -1423,7 +1423,7 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio
|
||||
}
|
||||
case caDblClick:
|
||||
{
|
||||
// DblClicked(a_Player, a_SlotNum);
|
||||
DblClicked(a_Player, a_SlotNum);
|
||||
return;
|
||||
}
|
||||
case caMiddleClick:
|
||||
@ -1470,8 +1470,7 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio
|
||||
{
|
||||
if (!Slot.IsEmpty())
|
||||
{
|
||||
DraggingItem = Slot;
|
||||
Slot.Empty();
|
||||
std::swap(DraggingItem, Slot);
|
||||
}
|
||||
}
|
||||
else if (Slot.IsEmpty())
|
||||
@ -1487,9 +1486,7 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio
|
||||
else if ((DraggingItem.m_ItemCount == 1) && !DraggingItem.IsEqual(Slot))
|
||||
{
|
||||
// Switch contents
|
||||
cItem tmp(DraggingItem);
|
||||
DraggingItem = Slot;
|
||||
Slot = tmp;
|
||||
std::swap(DraggingItem, Slot);
|
||||
}
|
||||
|
||||
SetSlot(a_SlotNum, a_Player, Slot);
|
||||
|
Loading…
Reference in New Issue
Block a user