void NPC::GetPetState(SpellBuff_Struct *pet_buffs, uint32 *items, char *name) { //save the pet name strn0cpy(name, GetName(), 64); //save their items, we only care about what they are actually wearing memcpy(items, equipment, sizeof(uint32)*MAX_WORN_INVENTORY); //save their buffs. for (int i=0; i < GetPetMaxTotalSlots(); i++) { if (buffs[i].spellid != SPELL_UNKNOWN) { pet_buffs[i].spellid = buffs[i].spellid; pet_buffs[i].slotid = i+1; pet_buffs[i].duration = buffs[i].ticsremaining; pet_buffs[i].level = buffs[i].casterlevel; pet_buffs[i].effect = 10; pet_buffs[i].counters = buffs[i].counters; } else { pet_buffs[i].spellid = SPELL_UNKNOWN; pet_buffs[i].duration = 0; pet_buffs[i].level = 0; pet_buffs[i].effect = 0; pet_buffs[i].counters = 0; } } }
void NPC::GetPetState(SpellBuff_Struct *pet_buffs, uint32 *items, char *name) { //save the pet name strn0cpy(name, GetName(), 64); //save their items, we only care about what they are actually wearing memcpy(items, equipment, sizeof(uint32) * EQEmu::legacy::EQUIPMENT_SIZE); //save their buffs. for (int i=0; i < GetPetMaxTotalSlots(); i++) { if (buffs[i].spellid != SPELL_UNKNOWN) { pet_buffs[i].spellid = buffs[i].spellid; pet_buffs[i].effect_type = i+1; pet_buffs[i].duration = buffs[i].ticsremaining; pet_buffs[i].level = buffs[i].casterlevel; pet_buffs[i].bard_modifier = 10; pet_buffs[i].counters = buffs[i].counters; pet_buffs[i].bard_modifier = buffs[i].instrument_mod; } else { pet_buffs[i].spellid = SPELL_UNKNOWN; pet_buffs[i].duration = 0; pet_buffs[i].level = 0; pet_buffs[i].bard_modifier = 10; pet_buffs[i].counters = 0; } } }
void NPC::SetPetState(SpellBuff_Struct *pet_buffs, uint32 *items) { //restore their buffs... int i; for (i = 0; i < GetPetMaxTotalSlots(); i++) { for(int z = 0; z < GetPetMaxTotalSlots(); z++) { // check for duplicates if(buffs[z].spellid != SPELL_UNKNOWN && buffs[z].spellid == pet_buffs[i].spellid) { buffs[z].spellid = SPELL_UNKNOWN; pet_buffs[i].spellid = 0xFFFFFFFF; } } if (pet_buffs[i].spellid <= (uint32)SPDAT_RECORDS && pet_buffs[i].spellid != 0 && pet_buffs[i].duration > 0) { if(pet_buffs[i].level == 0 || pet_buffs[i].level > 100) pet_buffs[i].level = 1; buffs[i].spellid = pet_buffs[i].spellid; buffs[i].ticsremaining = pet_buffs[i].duration; buffs[i].casterlevel = pet_buffs[i].level; buffs[i].casterid = 0; buffs[i].counters = pet_buffs[i].counters; buffs[i].numhits = spells[pet_buffs[i].spellid].numhits; } else { buffs[i].spellid = SPELL_UNKNOWN; pet_buffs[i].spellid = 0xFFFFFFFF; pet_buffs[i].slotid = 0; pet_buffs[i].level = 0; pet_buffs[i].duration = 0; pet_buffs[i].effect = 0; } } for (int j1=0; j1 < GetPetMaxTotalSlots(); j1++) { if (buffs[j1].spellid <= (uint32)SPDAT_RECORDS) { for (int x1=0; x1 < EFFECT_COUNT; x1++) { switch (spells[buffs[j1].spellid].effectid[x1]) { case SE_WeaponProc: // We need to reapply buff based procs // We need to do this here so suspended pets also regain their procs. if (spells[buffs[j1].spellid].base2[x1] == 0) { AddProcToWeapon(GetProcID(buffs[j1].spellid,x1), false, 100); } else { AddProcToWeapon(GetProcID(buffs[j1].spellid,x1), false, 100+spells[buffs[j1].spellid].base2[x1]); } break; case SE_Charm: case SE_Rune: case SE_NegateAttacks: case SE_Illusion: buffs[j1].spellid = SPELL_UNKNOWN; pet_buffs[j1].spellid = SPELLBOOK_UNKNOWN; pet_buffs[j1].slotid = 0; pet_buffs[j1].level = 0; pet_buffs[j1].duration = 0; pet_buffs[j1].effect = 0; x1 = EFFECT_COUNT; break; // We can't send appearance packets yet, put down at CompleteConnect } } } } UpdateRuneFlags(); //restore their equipment... for(i = 0; i < MAX_WORN_INVENTORY; i++) { if(items[i] == 0) continue; const Item_Struct* item2 = database.GetItem(items[i]); if (item2 && item2->NoDrop != 0) { //dont bother saving item charges for now, NPCs never use them //and nobody should be able to get them off the corpse..? AddLootDrop(item2, &itemlist, 0, 1, 127, true, true); } } }