Yea very happy to add changes.
Color system is now #bot armorcolor <slot> <red> <green> <blue> instead of armorcolor <number from 0 - 2.1billion> way easier
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->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() && !target->IsBot()) || (c->CastToBot()->GetBotOwnerCharacterID() != c->CharacterID()))
+ 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);