internal void AddLoot(Npc npc) { Random rand = new Random(); // Coin if (npc.Loot.MinCash > npc.Loot.MaxCash) _log.ErrorFormat("{0}'s minCash({1}) > maxCash({2}), please fix.", npc.Name, npc.Loot.MinCash, npc.Loot.MaxCash); else if (npc.Loot.MaxCash > 0) { uint cash = 0; if (npc.Loot.MaxCash == npc.Loot.MinCash) cash = npc.Loot.MaxCash; else cash = (uint)rand.Next((int)npc.Loot.MinCash, (int)npc.Loot.MaxCash + 1); if (cash != 0) { this.Platinum = cash / 1000; cash -= this.Platinum * 1000; this.Gold = cash / 100; cash -= this.Gold * 100; this.Silver = cash / 10; cash -= this.Silver * 10; this.Copper = cash; } } // Items int sumProb = 0, roll = 0, probIter = 0; foreach (LootEntry le in npc.Loot.LootEntries) { for (int i = 0; i < le.MaxDrops; i++) { if (rand.Next(0, 100) < le.Probability) { sumProb = le.LootDrops.Sum(ld => ld.Probability); // Get total probability of all loot drops roll = rand.Next(0, sumProb + 1); probIter = 0; foreach (LootDrop ld in le.LootDrops) { probIter += ld.Probability; if (roll < probIter) { InventoryItem invItem = new InventoryItem() { Charges = ld.ItemCharges, Color = ld.Item.Color ?? 0, Item = ld.Item, ItemID = ld.ItemID, SlotID = 0 }; AddItem(invItem, ld.Equipable, false); break; } } } } } }
public NpcMob(int entityId, Npc npcData, int gridId, float x, float y, float z, float heading) : base(entityId, npcData.Name, npcData.SurName, npcData.AC, (short)npcData.Attack, (short)npcData.STR, (short)npcData.STA, (short)npcData.DEX, (short)npcData.AGI, npcData.INT, npcData.WIS, npcData.CHA, npcData.Hp, npcData.Hp, npcData.Gender, (short)npcData.HpRegenRate, (short)npcData.ManaRegenRate, npcData.Race, npcData.NpcClass, npcData.NpcLevel, (BodyType)npcData.BodyType, 0, x, y, z, heading, npcData.Size, npcData.RunSpeed, 0) { _npcDbId = npcData.NpcID; _gridId = gridId; _seeInvis = npcData.SeeInvis; _seeInvisToUndead = npcData.SeeInvisUndead; _seeHide = npcData.SeeHide; _seeImprovedHide = npcData.SeeImprovedHide; _texture = npcData.Texture; _helmTexture = npcData.HelmTexture; _hairColor = (byte)npcData.HairColorLuclin; _beardColor = (byte)npcData.BeardColorLuclin; _eyeColor1 = (byte)npcData.EyeColorLuclin; _eyeColor2 = (byte)npcData.EyeColor2Luclin; _hairStyle = (byte)npcData.HairStyleLuclin; _luclinFace = (byte)npcData.Face; _beard = (byte)npcData.BeardLuclin; _aggroRange = npcData.AggroRadius; _assistRange = npcData.AggroRadius; _findable = npcData.Findable; _trackable = npcData.Trackable; _accuracy = npcData.Accuracy; _attackSpeed = npcData.AttackSpeed; _willAggroNPCs = npcData.NpcAggro; _meleeTexture1 = npcData.MeleeTexture1; _meleeTexture2 = npcData.MeleeTexture2; _minDmg = npcData.MinDamage; _maxDmg = npcData.MaxDamage; // TODO: timers... combat event, swarm, class attack, knight attack, assist, enraged, taunt _globalPositionUpdateTimer = new SimpleTimer(GLOBAL_POS_UPDATE_INTERVAL); // TODO: does this belong in mob? _hpUpdateTimer = new SimpleTimer(HP_UPDATE_INTERVAL); // Mana regen rate adjustments for lazy db updaters _manaRegen = Math.Max(_manaRegen, (short)0); if (GetCasterClass() != CasterClass.None && _manaRegen == 0) _manaRegen = (short)((this.Level / 10) + 4); // TODO: HP regen adjustments (Gives low end mobs no regen if set to 0 in db. Makes low end mobs more killable) _hpRegen = Math.Max(_hpRegen, (short)0); if (_hpRegen == 0) { } // min and max dmg adjustments if (_maxDmg == 0) { int acAdj = 12; if (this.Level >= 66) { if (_minDmg == 0) _minDmg = 200; if (_maxDmg == 0) _maxDmg = ((((99000) * (this.Level - 64)) / 400) * acAdj / 10); } else if (this.Level >= 60 && this.Level <= 65) { if (_minDmg == 0) _minDmg = (this.Level + (this.Level / 3)); if (_maxDmg == 0) _maxDmg = (this.Level * 3) * acAdj / 10; } else if (this.Level >= 51 && this.Level <= 59) { if (_minDmg == 0) _minDmg = (this.Level + (this.Level / 3)); if (_maxDmg == 0) _maxDmg = (this.Level * 3) * acAdj / 10; } else if (this.Level >= 40 && this.Level <= 50) { if (_minDmg == 0) _minDmg = this.Level; if (_maxDmg == 0) _maxDmg = (this.Level * 3) * acAdj / 10; } else if (this.Level >= 28 && this.Level <= 39) { if (_minDmg == 0) _minDmg = this.Level / 2; if (_maxDmg == 0) _maxDmg = ((this.Level * 2) + 2) * acAdj / 10; } else if (this.Level <= 27) { if (_minDmg == 0) _minDmg = 1; if (_maxDmg == 0) _maxDmg = (this.Level * 2) * acAdj / 10; } int clFact = GetClassLevelFactor(); _minDmg = (_minDmg * clFact) / 220; _maxDmg = (_maxDmg * clFact) / 220; } // TODO: calc max mana and then set mana // Adjust resists if needed _mr = npcData.MR < 1 ? (short)((this.Level * 11) / 10) : npcData.MR; _cr = npcData.MR < 1 ? (short)((this.Level * 11) / 10) : npcData.CR; _dr = npcData.MR < 1 ? (short)((this.Level * 11) / 10) : npcData.DR; _fr = npcData.MR < 1 ? (short)((this.Level * 11) / 10) : npcData.FR; _pr = npcData.MR < 1 ? (short)((this.Level * 11) / 10) : npcData.PR; // TODO: faction // TODO: spells // TODO: set guard spot? if (npcData.Loot != null) AddLoot(npcData); // Give npc some loot //_log.DebugFormat("{0} has {1} items - {2} of which are equipped...", npcData.Name, _lootItems.Count, _equipedItems.Count); //foreach (KeyValuePair<uint, LootItem> kvp in _equipedItems) { // _log.DebugFormat("slot {0} has itemId {1}", kvp.Key, kvp.Value.ItemID); //} if (npcData.NpcSpecialAttacks != null) ParseSpecialAttacks(npcData.NpcSpecialAttacks); StartAI(); }
partial void DeleteNpc(Npc instance);
partial void UpdateNpc(Npc instance);
partial void InsertNpc(Npc instance);
private void detach_Npcs(Npc entity) { this.SendPropertyChanging(); entity.Loot = null; }
private void attach_Npcs(Npc entity) { this.SendPropertyChanging(); entity.Loot = this; }