View Single Post
  #3  
Old 07-19-2011, 05:14 PM
Criimson
Hill Giant
 
Join Date: Sep 2006
Posts: 172
Default

Use this patch. I had done a rollback when working with the last patch and didnt notice I undid the shrink check. This one is correct.

Sorry about that

Code:
Index: bot.cpp
===================================================================
--- bot.cpp	(revision 1976)
+++ bot.cpp	(working copy)
@@ -3559,7 +3559,7 @@
 		ns->spawn.is_npc = 0;				// 0=no, 1=yes
 		ns->spawn.is_pet = 0;
 		ns->spawn.guildrank = 0;
-		ns->spawn.showhelm = 1;
+		ns->spawn.showhelm = 0;
 		ns->spawn.flymode = 0;
 		ns->spawn.size = 0;
 		ns->spawn.NPC = 0;					// 0=player,1=npc,2=pc corpse,3=npc corpse
@@ -3567,12 +3567,15 @@
 		const Item_Struct* item = 0;
 		const ItemInst* inst = 0;
 
+		uint32 spawnedbotid = 0;
+		spawnedbotid = this->GetBotID();
+
 		inst = GetBotItem(SLOT_HANDS);
 		if(inst) {
 			item = inst->GetItem();
 			if(item) {
 				ns->spawn.equipment[MATERIAL_HANDS]	= item->Material;
-				ns->spawn.colors[MATERIAL_HANDS].color = GetEquipmentColor(MATERIAL_HANDS);
+				ns->spawn.colors[MATERIAL_HANDS].color = Bot::GetEquipmentColor(MATERIAL_HANDS);
 			}
 		}
 
@@ -3581,7 +3584,7 @@
 			item = inst->GetItem();
 			if(item) {
 				ns->spawn.equipment[MATERIAL_HEAD] = item->Material;
-				ns->spawn.colors[MATERIAL_HEAD].color = GetEquipmentColor(MATERIAL_HEAD);
+				ns->spawn.colors[MATERIAL_HEAD].color = Bot::GetEquipmentColor(MATERIAL_HEAD);
 			}
 		}
 
@@ -3590,7 +3593,7 @@
 			item = inst->GetItem();
 			if(item) {
 				ns->spawn.equipment[MATERIAL_ARMS] = item->Material;
-				ns->spawn.colors[MATERIAL_ARMS].color = GetEquipmentColor(MATERIAL_ARMS);
+				ns->spawn.colors[MATERIAL_ARMS].color = Bot::GetEquipmentColor(MATERIAL_ARMS);
 			}
 		}
 
@@ -3599,7 +3602,7 @@
 			item = inst->GetItem();
 			if(item) {
 				ns->spawn.equipment[MATERIAL_BRACER] = item->Material;
-				ns->spawn.colors[MATERIAL_BRACER].color	= GetEquipmentColor(MATERIAL_BRACER);
+				ns->spawn.colors[MATERIAL_BRACER].color	= Bot::GetEquipmentColor(MATERIAL_BRACER);
 			}
 		}
 
@@ -3608,7 +3611,7 @@
 			item = inst->GetItem();
 			if(item) {
 				ns->spawn.equipment[MATERIAL_BRACER] = item->Material;
-				ns->spawn.colors[MATERIAL_BRACER].color	= GetEquipmentColor(MATERIAL_BRACER);
+				ns->spawn.colors[MATERIAL_BRACER].color	= Bot::GetEquipmentColor(MATERIAL_BRACER);
 			}
 		}
 
@@ -3617,7 +3620,7 @@
 			item = inst->GetItem();
 			if(item) {
 				ns->spawn.equipment[MATERIAL_CHEST]	= item->Material;
-				ns->spawn.colors[MATERIAL_CHEST].color = GetEquipmentColor(MATERIAL_CHEST);
+				ns->spawn.colors[MATERIAL_CHEST].color = Bot::GetEquipmentColor(MATERIAL_CHEST);
 			}
 		}
 
@@ -3626,7 +3629,7 @@
 			item = inst->GetItem();
 			if(item) {
 				ns->spawn.equipment[MATERIAL_LEGS] = item->Material;
-				ns->spawn.colors[MATERIAL_LEGS].color = GetEquipmentColor(MATERIAL_LEGS);
+				ns->spawn.colors[MATERIAL_LEGS].color = Bot::GetEquipmentColor(MATERIAL_LEGS);
 			}
 		}
 
@@ -3635,7 +3638,7 @@
 			item = inst->GetItem();
 			if(item) {
 				ns->spawn.equipment[MATERIAL_FEET] = item->Material;
-				ns->spawn.colors[MATERIAL_FEET].color = GetEquipmentColor(MATERIAL_FEET);
+				ns->spawn.colors[MATERIAL_FEET].color = Bot::GetEquipmentColor(MATERIAL_FEET);
 			}
 		}
 		
@@ -3645,6 +3648,7 @@
 			if(item) {
 				if(strlen(item->IDFile) > 2)
 					ns->spawn.equipment[MATERIAL_PRIMARY] = atoi(&item->IDFile[2]);
+					ns->spawn.colors[MATERIAL_PRIMARY].color = Bot::GetEquipmentColor(MATERIAL_PRIMARY);
 			}
 		}
 
@@ -3654,6 +3658,7 @@
 			if(item) {
 				if(strlen(item->IDFile) > 2)
 					ns->spawn.equipment[MATERIAL_SECONDARY] = atoi(&item->IDFile[2]);
+					ns->spawn.colors[MATERIAL_SECONDARY].color = Bot::GetEquipmentColor(MATERIAL_SECONDARY);
 			}
 		}
 	}
@@ -10061,7 +10066,7 @@
 		c->Message(0, "#bot levitate - Bot levitation (must have proper class in group)");
 		c->Message(0, "#bot resist - Bot resist buffs (must have proper class in group)");
 		c->Message(0, "#bot runeme - Enchanter Bot cast Rune spell on you");
-		c->Message(0, "#bot shrink - Shaman Bot will shrink you");
+		c->Message(0, "#bot shrink - Shaman or Beastlord will shrink target");
 		c->Message(0, "#bot endureb - Bot enduring breath (must have proper class in group)");
 		c->Message(0, "#bot charm - (must have proper class in group)");
 		c->Message(0, "#bot dire charm - (must have proper class in group)");
@@ -10077,6 +10082,7 @@
 		c->Message(0, "#bot mana [<bot name or target> | all] - Displays a mana report for all your spawned bots.");
 		c->Message(0, "#bot setfollowdistance ### - sets target bots follow distance to ### (ie 30 or 250).");
 		c->Message(0, "#bot [hair|haircolor|beard|beardcolor|face|eyes|heritage|tattoo|details <value>] - Change your BOTs appearance.");
+		c->Message(0, "#bot armorcolor <slot> <value> - #bot help armorcolor for info");
 		// TODO:
 		// c->Message(0, "#bot illusion <bot/client name or target> - Enchanter Bot cast an illusion buff spell on you or your target.");
 		c->Message(0, "#bot pull [<bot name>] [target] - Bot Pulling Target NPC's");
@@ -10121,8 +10127,8 @@
 
 	// added Bot follow distance - SetFollowDistance
 	if(!strcasecmp(sep->arg[1], "setfollowdistance")) {
-		if((c->GetTarget() == NULL) || (c->GetTarget() == c) || (!c->GetTarget()->IsBot()) ) {
-			c->Message(15, "You must target a bot!");
+		if((c->GetTarget() == NULL) || (c->GetTarget() == c) || (!c->GetTarget()->IsBot()) || (c->GetTarget()->CastToBot()->GetBotOwner() != c)) {
+			c->Message(15, "You must target a bot you own!");
 		}
 		else {
 			int32 BotFollowDistance = atoi(sep->arg[2]);
@@ -10133,7 +10139,57 @@
 		return;
 	}
 
-	
+	//bot armor colors
+	if(!strcasecmp(sep->arg[1], "armorcolor")) {
+		if(c->GetTarget() && c->GetTarget()->IsBot() && (c->GetTarget()->CastToBot()->GetBotOwner() == c)) {
+			uint32 botid = c->GetTarget()->CastToBot()->GetBotID();
+			std::string errorMessage;
+			char* Query = 0;
+			//if(sep->argnum < 6) {
+			//	c->Message(0, "Usage: #bot armorcolor [slot] [red] [green] [blue] - use #bot help armorcolor for info");
+			//	return;
+			//}
+
+			int setslot = atoi(sep->arg[2]);
+			uint8 red = atoi(sep->arg[3]);
+			uint8 green = atoi(sep->arg[4]);
+			uint8 blue = atoi(sep->arg[5]);
+			uint32 setcolor = (red << 16) | (green << 8) | blue;
+
+			if(sep->arg[2][0] == '\0' || sep->arg[3][0] == '\0' || sep->arg[4][0] == '\0' || sep->arg[5][0] == '\0') {
+				c->Message(0, "Usage: #bot armorcolor [slot] [red] [green] [blue] - use #bot help armorcolor for info");
+				return;
+			}
+			else{
+				if(database.RunQuery(Query, MakeAnyLenString(&Query, "UPDATE botinventory SET color = %i WHERE slotID = %i AND botID = %u",setcolor, setslot, botid))){
+					int slotmaterial = Inventory::CalcMaterialFromSlot(setslot);
+					c->GetTarget()->CastToBot()->SendWearChange(slotmaterial);
+				}
+			}
+			
+		}
+		else {
+			c->Message(15, "You must target a bot you own to do this.");
+		}
+
+		return;
+	}
+	// Help for coloring bot armor
+		if(!strcasecmp(sep->arg[1], "help") && !strcasecmp(sep->arg[2], "armorcolor") ){
+		//read from db
+		char* Query = 0;
+		MYSQL_RES* DatasetResult;
+		MYSQL_ROW DataRow;
+		
+		c->Message(0, "-----------------#bot armorcolor help-----------------------------");
+		c->Message(0, "Armor:  17(Chest/Robe), 7(Arms), 9(Bracer), 12(Hands), 18(Legs), 19(Boots), 2(Helm)");
+		c->Message(0, "------------------------------------------------------------------");
+		c->Message(0, "Color: [red] [green] [blue]  (enter a number from 0-255 for each");
+		c->Message(0, "------------------------------------------------------------------");
+		c->Message(0, "Example: #bot armorcolor 17 0 255 0 - this would make the chest bright green");
+		return;
+	}
+
 	if(!strcasecmp(sep->arg[1], "augmentitem")) {
 		AugmentItem_Struct* in_augment = new AugmentItem_Struct[sizeof(AugmentItem_Struct)];
 		in_augment->container_slot = 1000;
@@ -11770,8 +11826,8 @@
 		Group *g = c->GetGroup();
 		Mob *target = c->GetTarget();
 
-		if(target == NULL || (!target->IsClient() && !target->IsBot()))
-			c->Message(15, "You must select a player or bot");
+		if(target == NULL || (!target->IsClient() && (c->GetTarget()->CastToBot()->GetBotOwner() != c)))
+			c->Message(15, "You must select a player or bot you own");
 
 		else if(g) {
 			for(int i=0; i<MAX_GROUP_MEMBERS; i++){
@@ -11797,8 +11853,6 @@
 
 					if (c->GetLevel() >= 15) { 
 						Shrinker->Say("Casting Shrink...");
-						//Shrinker->CastToBot()->BotRaidSpell(345);
-						//Shrinker->CastSpell(345, id), 1);
 						Shrinker->CastToBot()->SpellOnTarget(345, target);
 					}
 					else if (c->GetLevel() <= 14) {
@@ -11810,8 +11864,6 @@
 
 					if (c->GetLevel() >= 23) {
 						Shrinker->Say("Casting Shrink...");
-						//Shrinker->CastToBot()->BotRaidSpell(345);
-						//Shrinker->CastSpell(345, id), 1);
 						Shrinker->CastToBot()->SpellOnTarget(345, target);
 					}
 					else if (c->GetLevel() <= 22) {
@@ -13742,4 +13794,31 @@
 	return needHealed;
 }
 
+uint32 Bot::GetEquipmentColor(int8 material_slot) const
+{
+	//Bot tints
+	int32 slotid = 0;
+	uint32 returncolor = 0;
+	uint32 botid = this->GetBotID();
+	
+	//Translate code slot # to DB slot #
+	slotid = Inventory::CalcSlotFromMaterial(material_slot);
+
+	//read from db
+	char* Query = 0;
+	MYSQL_RES* DatasetResult;
+	MYSQL_ROW DataRow;
+	
+	if(database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT color FROM botinventory WHERE BotID = %u AND SlotID = %u", botid, slotid), 0, &DatasetResult)) {
+		if(mysql_num_rows(DatasetResult) == 1) {
+			DataRow = mysql_fetch_row(DatasetResult);
+			if(DataRow)
+				returncolor = atoi(DataRow[0]);
+		}
+		mysql_free_result(DatasetResult);
+		safe_delete_array(Query);
+	}
+	return returncolor;
+}
+
 #endif
Index: bot.h
===================================================================
--- bot.h	(revision 1976)
+++ bot.h	(working copy)
@@ -217,6 +217,7 @@
 	void BotTradeAddItem(uint32 id, const ItemInst* inst, sint16 charges, uint32 equipableSlots, int16 lootSlot, std::string* errorMessage, bool addToDb = true);
 	void EquipBot(std::string* errorMessage);
 	bool CheckLoreConflict(const Item_Struct* item);
+	uint32 Bot::GetEquipmentColor(int8 material_slot) const;
 
 	// Static Class Methods
 	static void SaveBotGroup(Group* botGroup, std::string botGroupName, std::string* errorMessage);
@@ -296,7 +297,7 @@
 	static bool GroupHasPriestClass(Group* group) { return GroupHasClass(group, CLERIC | DRUID | SHAMAN); }
 
 	// "GET" Class Methods
-	uint32 GetBotID() { return _botID; }
+	uint32 GetBotID() const { return _botID; }
 	uint32 GetBotOwnerCharacterID() { return _botOwnerCharacterID; }
 	uint32 GetBotSpellID() { return npc_spells_id; }
 	Mob* GetBotOwner() { return this->_botOwner; }
Index: botspellsai.cpp
===================================================================
--- botspellsai.cpp	(revision 1976)
+++ botspellsai.cpp	(working copy)
@@ -298,6 +298,7 @@
 							break;
 						case ARCHETYPE_MELEE:
 							if(IsEffectInSpell(selectedBotSpell.SpellId, SE_IncreaseSpellHaste) || IsEffectInSpell(selectedBotSpell.SpellId, SE_ManaPool) ||
+								IsEffectInSpell(selectedBotSpell.SpellId, SE_CastingLevel) || IsEffectInSpell(selectedBotSpell.SpellId, SE_ManaRegen_v2) ||
 								IsEffectInSpell(selectedBotSpell.SpellId, SE_CurrentMana))
 							{
 								continue;
@@ -558,8 +559,15 @@
 						GroupHasShaman = true;
 					}
 					else if (botClass == ENCHANTER){
-						botSpell = GetBestBotSpellForMagicBasedSlow(this);
-						GroupHasEnchanter = true;
+						//Checking no adds before slow/debuff
+						Mob* addMob = GetFirstIncomingMobToMez(this, botSpell);
+
+						if(addMob){
+							break;}
+						else {
+ 						botSpell = GetBestBotSpellForMagicBasedSlow(this);
+ 						GroupHasEnchanter = true;
+						}
 					}
 					else if (botClass == BEASTLORD && GroupHasEnchanter == false && GroupHasShaman == false){
 						botSpell = GetBestBotSpellForDiseaseBasedSlow(this);
@@ -584,6 +592,13 @@
 					
 					checked_los = true;
 				}
+				//if enchanter checking if no adds
+				if (botClass == ENCHANTER){
+					Mob* addMob = GetFirstIncomingMobToMez(this, botSpell);
+ 
+					if(addMob){
+						break;}
+				}
 
 				botSpell = GetDebuffBotSpell(this, tar);
Reply With Quote