Browse Source

Should fix issue 407, 408, 409

Devn00b 2 years ago
parent
commit
54a61e0c39

+ 5 - 1
EQ2/source/WorldServer/Bots/Bot.cpp

@@ -306,7 +306,9 @@ Spell* Bot::GetHealSpell() {
 		deque<GroupMemberInfo*>* members = group->GetMembers();
 		for (int8 i = 0; i < members->size(); i++) {
 			Entity* member = members->at(i)->member;
-
+			if(!member)
+				continue;
+			
 			if (!member->Alive())
 				continue;
 
@@ -395,6 +397,8 @@ Spell* Bot::GetHoTWardSpell() {
 	{
 		group->MGroupMembers.readlock(__FUNCTION__, __LINE__);
 		deque<GroupMemberInfo*>* members = group->GetMembers();
+		if(!members)
+			return 0;
 		for (int8 i = 0; i < members->size(); i++) {
 			Entity* member = members->at(i)->member;
 			int8 percent = 0;

+ 14 - 2
EQ2/source/WorldServer/Bots/BotCommands.cpp

@@ -46,6 +46,10 @@ void Commands::Command_Bot(Client* client, Seperator* sep) {
 								group->MGroupMembers.readlock(__FUNCTION__, __LINE__);
 								deque<GroupMemberInfo*>* members = group->GetMembers();
 								deque<GroupMemberInfo*>::iterator itr;
+								
+								if(!members)
+									return;
+								
 								for (itr = members->begin(); itr != members->end(); itr++) {
 									if ((*itr)->member->IsBot() && ((Bot*)(*itr)->member)->GetOwner() == client->GetPlayer()) {
 										((Bot*)(*itr)->member)->SetCombatTarget(target->GetID());
@@ -107,7 +111,11 @@ void Commands::Command_Bot(Client* client, Seperator* sep) {
 			if (group)
 			{
 				group->MGroupMembers.readlock(__FUNCTION__, __LINE__);
-				deque<GroupMemberInfo*>* members = group->GetMembers();
+				deque<GroupMemberInfo*>* members = group->GetMembers(); 
+				
+				if(!members)
+					return;
+				
 				for (int8 i = 0; i < members->size(); i++) {
 					GroupMemberInfo* gmi2 = members->at(i);
 					if (gmi2->member->IsBot() && ((Bot*)gmi2->member)->GetOwner() == client->GetPlayer()) {
@@ -159,7 +167,7 @@ void Commands::Command_Bot(Client* client, Seperator* sep) {
 		else if (strncasecmp("stopfollow", sep->arg[0], 10) == 0) {
 			if (sep->IsSet(1) && sep->IsNumber(1)) {
 				int32 index = atoi(sep->arg[1]);
-
+ 
 				// Check if bot is currently spawned and if so camp it out
 				if (client->GetPlayer()->SpawnedBots.count(index) > 0) {
 					Spawn* bot = client->GetCurrentZone()->GetSpawnByID(client->GetPlayer()->SpawnedBots[index]);
@@ -185,6 +193,10 @@ void Commands::Command_Bot(Client* client, Seperator* sep) {
 						deque<GroupMemberInfo*>* members = group->GetMembers();
 						for (int8 i = 0; i < members->size(); i++) {
 							Entity* member = members->at(i)->member;
+							
+							if(!member)
+								continue;
+							
 							if (member->IsBot() && ((Bot*)member)->GetOwner() == player) {
 								member->appearance.pos.grid_id = player->appearance.pos.grid_id;
 								member->SetX(player->GetX());

+ 2 - 0
EQ2/source/WorldServer/Combat.cpp

@@ -1221,6 +1221,8 @@ void Entity::HandleDeathExperienceDebt(Spawn* killer)
 			{
 				group->MGroupMembers.readlock(__FUNCTION__, __LINE__);
 				deque<GroupMemberInfo*>* members = group->GetMembers();
+				if(!members)
+					return;
 				int32 size = members->size();
 				float xpDebtPerMember = ruleDebt/(float)size;
 				deque<GroupMemberInfo*>::iterator itr;

+ 6 - 1
EQ2/source/WorldServer/Commands/Commands.cpp

@@ -6548,7 +6548,12 @@ void Commands::Command_Inventory(Client* client, Seperator* sep, EQ2_RemoteComma
 			sint32 bag_id = atol(sep->arg[3]);
 			int8 charges = atoi(sep->arg[4]);
 			Item* item = client->GetPlayer()->item_list.GetItemFromIndex(from_index);
-
+			
+			if(!item) {
+				client->SimpleMessage(CHANNEL_COLOR_RED, "You have no item.");
+				return;
+			}
+			
 			if(item->details.item_locked)
 			{
 				client->SimpleMessage(CHANNEL_COLOR_RED, "You cannot move the item in use.");

+ 10 - 1
EQ2/source/WorldServer/SpellProcess.cpp

@@ -2176,8 +2176,13 @@ void SpellProcess::GetSpellTargets(LuaSpell* luaspell)
 							// iterate through list of group members
 							for (itr = members->begin(); itr != members->end(); itr++)
 							{
+
 								// get group member player info
 								Entity* group_member = (*itr)->member;
+								
+								if(!group_member){
+									continue;
+								}
 
 								LogWrite(SPELL__DEBUG, 0, "Player", "%s is group member for spell %s", group_member->GetName(), luaspell->spell->GetName());
 								// if the group member is in the casters zone, and is alive
@@ -2345,7 +2350,8 @@ void SpellProcess::GetSpellTargets(LuaSpell* luaspell)
 						{
 							group->MGroupMembers.readlock(__FUNCTION__, __LINE__);
 							deque<GroupMemberInfo*>* members = group->GetMembers();
-
+							if(!members)
+								return;
 							// iterate through players group members
 							for (itr = members->begin(); itr != members->end(); itr++)
 							{
@@ -2389,10 +2395,13 @@ void SpellProcess::GetSpellTargets(LuaSpell* luaspell)
 
 						deque<GroupMemberInfo*>::iterator itr;
 						PlayerGroup* group = world.GetGroupManager()->GetGroup(((Player*)target)->GetGroupMemberInfo()->group_id);
+						
 						if (group)
 						{
 							group->MGroupMembers.readlock(__FUNCTION__, __LINE__);
 							deque<GroupMemberInfo*>* members = group->GetMembers();
+							if(!members)
+								return;
 							Entity* group_member = 0;
 							for (itr = members->begin(); itr != members->end(); itr++) {
 								group_member = (*itr)->member;

+ 4 - 0
EQ2/source/WorldServer/Tradeskills/TradeskillsPackets.cpp

@@ -406,6 +406,10 @@ void ClientPacketFunctions::SendItemCreationUI(Client* client, Recipe* recipe) {
 	for (itr = spells.begin(); itr != spells.end(); itr++) {
 			size++;
 			Spell* spell = master_spell_list.GetSpell(*itr,1);
+			if(!spell) {
+				
+				return;
+			}
 			if (size > 6) {
 				// only 6 slots for skills on the ui
 				break;

+ 4 - 1
EQ2/source/WorldServer/client.cpp

@@ -5141,6 +5141,8 @@ void Client::CastGroupOrSelf(Entity* source, uint32 spellID, uint32 spellTier, f
 			{
 				group->MGroupMembers.readlock(__FUNCTION__, __LINE__);
 				deque<GroupMemberInfo*>* members = group->GetMembers();
+				if(!members)
+					return;
 				for (int8 i = 0; i < members->size(); i++) {
 					Entity* member = members->at(i)->member;
 
@@ -10668,8 +10670,9 @@ void Client::ConsumeFoodDrink(Item* item, int32 slot)
 			item->save_needed = true;
 		}
 		else {
-			GetPlayer()->GetEquipmentList()->RemoveItem(slot, true);
 			database.DeleteItem(GetPlayer()->GetCharacterID(), item, "EQUIPPED");
+			GetPlayer()->GetEquipmentList()->RemoveItem(slot, true);
+			
 		}
 		GetPlayer()->SetCharSheetChanged(true);
 		QueuePacket(player->GetEquipmentList()->serialize(GetVersion(), player));