1
0

Fixed crashes and use std::swap.

This commit is contained in:
Hownaer 2014-08-28 14:58:03 +02:00
parent 0f1fd33123
commit 6c3b80f04c
4 changed files with 43 additions and 26 deletions

View File

@ -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); cItem Item = *Window->m_SlotArea->GetSlot(0, *m_Player);
int BaseEnchantmentLevel = Window->GetPropertyValue(Enchantment); int BaseEnchantmentLevel = Window->GetPropertyValue(a_Enchantment);
if (Item.EnchantByXPLevels(BaseEnchantmentLevel)) if (Item.EnchantByXPLevels(BaseEnchantmentLevel))
{ {

View File

@ -269,7 +269,7 @@ public:
void RemoveFromWorld(void); void RemoveFromWorld(void);
/** Called when the player will enchant a Item */ /** Called when the player will enchant a Item */
void HandleEnchantItem(Byte & WindowID, Byte & Enchantment); void HandleEnchantItem(Byte & a_WindowID, Byte & a_Enchantment);
private: private:

View File

@ -291,73 +291,77 @@ int cItem::GetEnchantability()
bool cItem::EnchantByXPLevels(int a_NumXPLevels) bool cItem::EnchantByXPLevels(int a_NumXPLevels)
{ {
if (!cItem::IsEnchantable(m_ItemType) && (m_ItemType != E_ITEM_BOOK)) if (!cItem::IsEnchantable(m_ItemType))
{ {
return false; return false;
} }
int Enchantability = GetEnchantability(); int Enchantability = GetEnchantability();
if (Enchantability == 0)
{
return false;
}
cFastRandom Random; cFastRandom Random;
int ModifiedEnchantmentLevel = a_NumXPLevels + (int)Random.NextFloat((float)Enchantability / 4) + (int)Random.NextFloat((float)Enchantability / 4) + 1; 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; float RandomBonus = 1.0F + (Random.NextFloat(1) + Random.NextFloat(1) - 1.0F) * 0.15F;
int FinalEnchantmentLevel = (int)(ModifiedEnchantmentLevel * RandomBonus + 0.5F); int FinalEnchantmentLevel = (int)(ModifiedEnchantmentLevel * RandomBonus + 0.5F);
cWeightedEnchantments enchantments; cWeightedEnchantments Enchantments;
cEnchantments::AddItemEnchantmentWeights(enchantments, m_ItemType, FinalEnchantmentLevel); cEnchantments::AddItemEnchantmentWeights(Enchantments, m_ItemType, FinalEnchantmentLevel);
if (m_ItemType == E_ITEM_BOOK) if (m_ItemType == E_ITEM_BOOK)
{ {
m_ItemType = E_ITEM_ENCHANTED_BOOK; m_ItemType = E_ITEM_ENCHANTED_BOOK;
} }
cEnchantments Enchantment1 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); cEnchantments Enchantment1 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments);
m_Enchantments.AddFromString(Enchantment1.ToString()); m_Enchantments.AddFromString(Enchantment1.ToString());
cEnchantments::RemoveEnchantmentWeightFromVector(enchantments, Enchantment1); cEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment1);
// Checking for conflicting enchantments // Checking for conflicting enchantments
cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment1); cEnchantments::CheckEnchantmentConflictsFromVector(Enchantments, Enchantment1);
float NewEnchantmentLevel = (float)a_NumXPLevels; float NewEnchantmentLevel = (float)a_NumXPLevels;
// Next Enchantment (Second) // Next Enchantment (Second)
NewEnchantmentLevel = NewEnchantmentLevel / 2; NewEnchantmentLevel = NewEnchantmentLevel / 2;
float SecondEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; float SecondEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100;
if (enchantments.empty() || (Random.NextFloat(100) > SecondEnchantmentChance)) if (Enchantments.empty() || (Random.NextFloat(100) > SecondEnchantmentChance))
{ {
return true; return true;
} }
cEnchantments Enchantment2 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); cEnchantments Enchantment2 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments);
m_Enchantments.AddFromString(Enchantment2.ToString()); m_Enchantments.AddFromString(Enchantment2.ToString());
cEnchantments::RemoveEnchantmentWeightFromVector(enchantments, Enchantment2); cEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment2);
// Checking for conflicting enchantments // Checking for conflicting enchantments
cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment2); cEnchantments::CheckEnchantmentConflictsFromVector(Enchantments, Enchantment2);
// Next Enchantment (Third) // Next Enchantment (Third)
NewEnchantmentLevel = NewEnchantmentLevel / 2; NewEnchantmentLevel = NewEnchantmentLevel / 2;
float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100;
if (enchantments.empty() || (Random.NextFloat(100) > ThirdEnchantmentChance)) if (Enchantments.empty() || (Random.NextFloat(100) > ThirdEnchantmentChance))
{ {
return true; return true;
} }
cEnchantments Enchantment3 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); cEnchantments Enchantment3 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments);
m_Enchantments.AddFromString(Enchantment3.ToString()); m_Enchantments.AddFromString(Enchantment3.ToString());
cEnchantments::RemoveEnchantmentWeightFromVector(enchantments, Enchantment3); cEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment3);
// Checking for conflicting enchantments // Checking for conflicting enchantments
cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment3); cEnchantments::CheckEnchantmentConflictsFromVector(Enchantments, Enchantment3);
// Next Enchantment (Fourth) // Next Enchantment (Fourth)
NewEnchantmentLevel = NewEnchantmentLevel / 2; NewEnchantmentLevel = NewEnchantmentLevel / 2;
float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100;
if (enchantments.empty() || (Random.NextFloat(100) > FourthEnchantmentChance)) if (Enchantments.empty() || (Random.NextFloat(100) > FourthEnchantmentChance))
{ {
return true; return true;
} }
cEnchantments Enchantment4 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); cEnchantments Enchantment4 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments);
m_Enchantments.AddFromString(Enchantment4.ToString()); m_Enchantments.AddFromString(Enchantment4.ToString());
return true; return true;

View File

@ -1423,7 +1423,7 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio
} }
case caDblClick: case caDblClick:
{ {
// DblClicked(a_Player, a_SlotNum); DblClicked(a_Player, a_SlotNum);
return; return;
} }
case caMiddleClick: case caMiddleClick:
@ -1470,8 +1470,7 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio
{ {
if (!Slot.IsEmpty()) if (!Slot.IsEmpty())
{ {
DraggingItem = Slot; std::swap(DraggingItem, Slot);
Slot.Empty();
} }
} }
else if (Slot.IsEmpty()) 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)) else if ((DraggingItem.m_ItemCount == 1) && !DraggingItem.IsEqual(Slot))
{ {
// Switch contents // Switch contents
cItem tmp(DraggingItem); std::swap(DraggingItem, Slot);
DraggingItem = Slot;
Slot = tmp;
} }
SetSlot(a_SlotNum, a_Player, Slot); SetSlot(a_SlotNum, a_Player, Slot);