Go Back   EQEmulator Home > EQEmulator Forums > Development > Development::Bots

Development::Bots Forum for bots.

 
 
Thread Tools Display Modes
Prev Previous Post   Next Post Next
  #15  
Old 07-18-2011, 05:14 PM
Criimson
Hill Giant
 
Join Date: Sep 2006
Posts: 172
Default

Hello everyone

The code is 99% finished. Apparently uint64 isn't allowed or at least I am not getting it to work. Therefore, even though the color range is ### ### ### # the number defaults to 2billion-ish for every number higher than that. I am currently looking for alternatives. In the meantime though here is the .patch to play around with what I have. There is also an sql as I added a rule_values option for a server allowing primary secondary slots to be dyed (havent tested these yet). I also tweaked mez ai a bit (will continue to until the chanter is where I want it) and also added checks for shrink and setfollowdistance to make sure the bot belongs to the client.

Code:
Index: bot.cpp
===================================================================
--- bot.cpp	(revision 1976)
+++ bot.cpp	(working copy)
@@ -3567,12 +3567,15 @@
 		const Item_Struct* item = 0;
 		const ItemInst* inst = 0;
 
+		uint32 spawnedbotid = 0;
+		spawnedbotid = this->GetBotIDForTint();
+
 		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,83 @@
 		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();
+			c->Message(0, "BotID = %u", botid);
+			std::string errorMessage;
+			char* Query = 0;
+			uint32 setcolor = atoi(sep->arg[3]);
+			int setslot = atoi(sep->arg[2]);
+			c->Message(0, "setcolor = %i", setcolor);
+			c->Message(0, "setslot = %i", setslot);
+
+			if(sep->arg[2][0] == '\0' || sep->arg[3][0] == '\0') {
+				c->Message(0, "Usage: #bot armorcolor [slot] [color ##] - use #bot help armorcolor for info");
+				return;
+			}
+			else if (sep->arg[3][0] >= 9999999999){
+				c->Message(0, "Invalid color selection - color range 0 - 9999999999");
+				c->Message(0, "Usage: #bot armorcolor [slot] [color ##] - 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;
+		int dyedprimary = 0;
+		int dyedsecondary = 0;
+		
+ 	
+		if(database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT rule_value FROM rule_values WHERE rule_name = 'Bots:DyedPrimary'"), 0, &DatasetResult)) {
+			if(mysql_num_rows(DatasetResult) == 1) {
+				DataRow = mysql_fetch_row(DatasetResult);
+				if(DataRow)
+					dyedprimary = atoi(DataRow[0]);
+			}
+			mysql_free_result(DatasetResult);
+			safe_delete_array(Query);
+		}
+		if(database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT rule_value FROM rule_values WHERE rule_name = 'Bots:DyedSecondary'"), 0, &DatasetResult)) {
+			if(mysql_num_rows(DatasetResult) == 1) {
+				DataRow = mysql_fetch_row(DatasetResult);
+				if(DataRow)
+					dyedsecondary = atoi(DataRow[0]);
+			}
+			mysql_free_result(DatasetResult);
+			safe_delete_array(Query);
+		}
+		
+		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, "------------------------------------------------------------------");
+		if (dyedprimary == 1){c->Message(0, "13 (Primary Weapon Slot - Server Allowed");}
+		if (dyedsecondary == 1){c->Message(0, "14 (Secondary Weapon Slot or Shield - Server Allowed");}	
+		c->Message(0, "------------------------------------------------------------------");
+		c->Message(0, "Color: ########## (usage: enter a number from 1 - 10 digits");
+		c->Message(0, "------------------------------------------------------------------");
+		c->Message(0, "Example: #bot armorcolor 17 1644825 would dye the chest black");
+		c->Message(0, "Example: #bot armorcolor 9 4646464646 would dye the wrists purple");
+		return;
+	}
+
 	if(!strcasecmp(sep->arg[1], "augmentitem")) {
 		AugmentItem_Struct* in_augment = new AugmentItem_Struct[sizeof(AugmentItem_Struct)];
 		in_augment->container_slot = 1000;
@@ -11770,8 +11852,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() && !target->IsBot()) || (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 +11879,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 +11890,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 +13820,45 @@
 	return needHealed;
 }
 
+uint32 Bot::GetEquipmentColor(int8 material_slot) const
+{
+	//Bot tints
+	int32 slotid = 0;
+	uint32 returncolor = 0;
+	uint32 botid = this->GetBotIDForTint();
+	
+	//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;
+}
+void Bot::SendWearChange(int8 material_slot)
+{
+	EQApplicationPacket* outapp = new EQApplicationPacket(OP_WearChange, sizeof(WearChange_Struct));
+	WearChange_Struct* wc = (WearChange_Struct*)outapp->pBuffer;
+
+	wc->spawn_id = GetID();
+	wc->material = GetEquipmentMaterial(material_slot);
+	wc->elite_material = IsEliteMaterialItem(material_slot);
+	wc->color.color = GetEquipmentColor(material_slot);
+	wc->wear_slot_id = material_slot;
+
+	entity_list.QueueClients(this, outapp);
+	safe_delete(outapp);
+}
+
 #endif
Index: bot.h
===================================================================
--- bot.h	(revision 1976)
+++ bot.h	(working copy)
@@ -217,6 +217,8 @@
 	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;
+	void Bot::SendWearChange(int8 material_slot);
 
 	// Static Class Methods
 	static void SaveBotGroup(Group* botGroup, std::string botGroupName, std::string* errorMessage);
@@ -297,6 +299,7 @@
 
 	// "GET" Class Methods
 	uint32 GetBotID() { return _botID; }
+	uint32 GetBotIDForTint() 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)
@@ -558,8 +558,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 +591,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);
SQL

Code:
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'Bots:DyedSecondary', '0', 'Allow dying of Secondary Slot (ie shields) 0 - off 1- on');
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'Bots:DyedPrimary', '0', 'Allow dying of Primary Slot (ie weapons) 0 - off 1- on');
Criimson

EDIT: I have gotten purply orange green blue black white so might leave as is - would appreciate feedback on what might be needed or done

As seen here:



Uploaded with ImageShack.us
Reply With Quote
 

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

   

All times are GMT -4. The time now is 11:13 PM.


 

Everquest is a registered trademark of Daybreak Game Company LLC.
EQEmulator is not associated or affiliated in any way with Daybreak Game Company LLC.
Except where otherwise noted, this site is licensed under a Creative Commons License.
       
Powered by vBulletin®, Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Template by Bluepearl Design and vBulletin Templates - Ver3.3